10d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard/*
20d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard * Copyright (C) 2012 The Android Open Source Project
30d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard *
4ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
5ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * you may not use this file except in compliance with the License.
6ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * You may obtain a copy of the License at
70d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard *
8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
90d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard *
100d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard * Unless required by applicable law or agreed to in writing, software
11ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
12ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * See the License for the specific language governing permissions and
14ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * limitations under the License.
150d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard */
160d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
170d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalardpackage com.android.inputmethod.latin;
180d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
19b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.LargeTest;
20f83a6821bbf3863415378ea39d3b705954318e41Jean Chalardimport android.text.style.SuggestionSpan;
21f83a6821bbf3863415378ea39d3b705954318e41Jean Chalardimport android.text.style.UnderlineSpan;
22f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard
239342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants;
249342484e8d573a40f470b6a593df31c602fa4076Ken Wakasa
25b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@LargeTest
260d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalardpublic class BlueUnderlineTests extends InputTestsBase {
270d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
280d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    public void testBlueUnderline() {
290d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final String STRING_TO_TYPE = "tgis";
300d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final int EXPECTED_SPAN_START = 0;
310d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final int EXPECTED_SPAN_END = 4;
320d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        type(STRING_TO_TYPE);
339ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
340d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
35d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter span = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
360d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertEquals("show blue underline, span start", EXPECTED_SPAN_START, span.mStart);
370d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertEquals("show blue underline, span end", EXPECTED_SPAN_END, span.mEnd);
380d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertEquals("show blue underline, span color", true, span.isAutoCorrectionIndicator());
390d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    }
400d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
410d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    public void testBlueUnderlineDisappears() {
4262596b61c5c8c2ce85981713ed5cd47c97f20c93Mohammadinamul Sheik        final String STRING_1_TO_TYPE = "tqis";
4362596b61c5c8c2ce85981713ed5cd47c97f20c93Mohammadinamul Sheik        final String STRING_2_TO_TYPE = "g";
440d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final int EXPECTED_SPAN_START = 0;
450d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final int EXPECTED_SPAN_END = 5;
460d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        type(STRING_1_TO_TYPE);
479ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
480d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
490d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        type(STRING_2_TO_TYPE);
500d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // We haven't have time to look into the dictionary yet, so the line should still be
510d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // blue to avoid any flicker.
52d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter spanBefore = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
530d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertEquals("extend blue underline, span start", EXPECTED_SPAN_START, spanBefore.mStart);
540d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertEquals("extend blue underline, span end", EXPECTED_SPAN_END, spanBefore.mEnd);
552d68f4b392ebd90aec471b845a1e9a0cd2078755Jean Chalard        assertTrue("extend blue underline, span color", spanBefore.isAutoCorrectionIndicator());
569ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
570d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
580d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // Now we have been able to re-evaluate the word, there shouldn't be an auto-correction span
59d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter spanAfter = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
600d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        assertNull("hide blue underline", spanAfter.mSpan);
610d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    }
620d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
630d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    public void testBlueUnderlineOnBackspace() {
640d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final String STRING_TO_TYPE = "tgis";
651e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard        final int typedLength = STRING_TO_TYPE.length();
66f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        final int EXPECTED_UNDERLINE_SPAN_START = 0;
679586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu        final int EXPECTED_UNDERLINE_SPAN_END = 3;
680d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        type(STRING_TO_TYPE);
699ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
700d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
71240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_SPACE);
721e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard        // typedLength + 1 because we also typed a space
731e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength + 1, typedLength + 1, -1, -1);
749ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
750d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
76240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
779ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
780d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
79240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
809ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
810d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
82d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter suggestionSpan = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
832d68f4b392ebd90aec471b845a1e9a0cd2078755Jean Chalard        assertFalse("show no blue underline after backspace, span should not be the auto-"
842d68f4b392ebd90aec471b845a1e9a0cd2078755Jean Chalard                + "correction indicator", suggestionSpan.isAutoCorrectionIndicator());
85d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter underlineSpan = new SpanGetter(mEditText.getText(), UnderlineSpan.class);
86f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        assertEquals("should be composing, so should have an underline span",
87f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard                EXPECTED_UNDERLINE_SPAN_START, underlineSpan.mStart);
88f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        assertEquals("should be composing, so should have an underline span",
89f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard                EXPECTED_UNDERLINE_SPAN_END, underlineSpan.mEnd);
900d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    }
910d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard
920d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    public void testBlueUnderlineDisappearsWhenCursorMoved() {
930d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final String STRING_TO_TYPE = "tgis";
942752287c425b9be87800136bd616ee63940caaacJean Chalard        final int typedLength = STRING_TO_TYPE.length();
950d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        final int NEW_CURSOR_POSITION = 0;
960d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        type(STRING_TO_TYPE);
979ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
980d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // Simulate the onUpdateSelection() event
992752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
1000d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
1010d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // Here the blue underline has been set. testBlueUnderline() is testing for this already,
1020d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // so let's not test it here again.
1030d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        // Now simulate the user moving the cursor.
1040d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
1052752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
1062752287c425b9be87800136bd616ee63940caaacJean Chalard                NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
1079ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
1080d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard        runMessages();
109d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        final SpanGetter span = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
1102d68f4b392ebd90aec471b845a1e9a0cd2078755Jean Chalard        assertFalse("blue underline removed when cursor is moved",
1112d68f4b392ebd90aec471b845a1e9a0cd2078755Jean Chalard                span.isAutoCorrectionIndicator());
1120d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard    }
113c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard
114c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard    public void testComposingStopsOnSpace() {
115c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        final String STRING_TO_TYPE = "this ";
116c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        type(STRING_TO_TYPE);
1179ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS);
118c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        // Simulate the onUpdateSelection() event
119c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
120c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        runMessages();
121c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        // Here the blue underline has been set. testBlueUnderline() is testing for this already,
122c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        // so let's not test it here again.
123c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        // Now simulate the user moving the cursor.
124d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka        SpanGetter span = new SpanGetter(mEditText.getText(), UnderlineSpan.class);
125c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard        assertNull("should not be composing, so should not have an underline span", span.mSpan);
126c5653daf72aefde36321de8567ede6a3c60b5621Jean Chalard    }
1270d708b0cf5eb4334995dc67ba4ad38b18467faebJean Chalard}
128