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