183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard/* 283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * Copyright (C) 2012 The Android Open Source Project 383c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean 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 783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * 8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 983c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * 1083c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean 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. 1583c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard */ 1683c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 1783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalardpackage com.android.inputmethod.latin; 1883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 19cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovicimport static android.test.MoreAsserts.assertNotEqual; 20cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 21b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.LargeTest; 2228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalardimport android.text.TextUtils; 23c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardimport android.view.inputmethod.BaseInputConnection; 24b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka 259342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants; 26cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovicimport com.android.inputmethod.latin.define.DecoderSpecificConstants; 27ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaokaimport com.android.inputmethod.latin.settings.Settings; 28ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka 29b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@LargeTest 308592ed408e8e81138172eefe2df28f00807a1e1fJean Chalardpublic class InputLogicTests extends InputTestsBase { 31f717c5685e3299349d5abe1ecc7d13446b9779bcJean Chalard 32cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic private boolean mNextWordPrediction; 33cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 34cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic @Override 35cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic public void setUp() throws Exception { 36cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic super.setUp(); 37cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic mNextWordPrediction = getBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS, true); 38cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic } 39cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 40cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic @Override 41cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic public void tearDown() throws Exception { 42cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic setBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS, mNextWordPrediction, true); 43cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic super.tearDown(); 44cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic } 45cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 4683c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard public void testTypeWord() { 471e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String WORD_TO_TYPE = "abcd"; 481e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(WORD_TO_TYPE); 49d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("type word", WORD_TO_TYPE, mEditText.getText().toString()); 5083c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard } 5183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 5283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard public void testPickSuggestionThenBackspace() { 539159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard final String WORD_TO_TYPE = "this"; 54f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thi"; 551e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(WORD_TO_TYPE); 563fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 577e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(WORD_TO_TYPE.length()); 58240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 599159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard assertEquals("press suggestion then backspace", EXPECTED_RESULT, 60d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 619159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard } 629159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard 63bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testPickAutoCorrectionThenBackspace() { 64bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_TYPE = "tgis"; 65bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_PICK = "this"; 66f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thi"; 67bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(WORD_TO_TYPE); 683fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the auto-correction. For "tgis", the auto-correction should be "this". 693fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_PICK); 707e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(WORD_TO_TYPE.length()); 71bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", WORD_TO_PICK, 72d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 73240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 74bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT, 75d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 76bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 77bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 789159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard public void testPickTypedWordOverAutoCorrectionThenBackspace() { 799159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard final String WORD_TO_TYPE = "tgis"; 80f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "tgi"; 819159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard type(WORD_TO_TYPE); 823fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the typed word. 833fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 847e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(WORD_TO_TYPE.length()); 85bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", WORD_TO_TYPE, 86d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 87240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 889159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT, 89d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 9083c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard } 9183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 92bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testPickDifferentSuggestionThenBackspace() { 93bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_TYPE = "tgis"; 94bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_PICK = "thus"; 95f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thu"; 96bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(WORD_TO_TYPE); 973fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the second suggestion, which should be "thus" when "tgis" is typed. 983fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_PICK); 997e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(WORD_TO_TYPE.length()); 100bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick different suggestion then backspace", WORD_TO_PICK, 101d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 102240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 103bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick different suggestion then backspace", EXPECTED_RESULT, 104d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 105bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 106bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 1071e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard public void testDeleteSelection() { 1081e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String STRING_TO_TYPE = "some text delete me some text"; 1092752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 1101e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final int SELECTION_START = 10; 1111e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final int SELECTION_END = 19; 1121e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String EXPECTED_RESULT = "some text some text"; 1131e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(STRING_TO_TYPE); 1147e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard // Don't use the sendUpdateForCursorMove* family of methods here because they 1157e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard // don't handle selections. 1161e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // Send once to simulate the cursor actually responding to the move caused by typing. 1171e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor 1181e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // move with a move triggered by LatinIME inputting stuff. 1192752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 1201e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard mInputConnection.setSelection(SELECTION_START, SELECTION_END); 1211e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // And now we simulate the user actually selecting some text. 1222752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 1232752287c425b9be87800136bd616ee63940caaacJean Chalard SELECTION_START, SELECTION_END, -1, -1); 124240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 125d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete selection", EXPECTED_RESULT, mEditText.getText().toString()); 126516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard } 127516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard 128516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard public void testDeleteSelectionTwice() { 129516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final String STRING_TO_TYPE = "some text delete me some text"; 130516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int typedLength = STRING_TO_TYPE.length(); 131516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int SELECTION_START = 10; 132516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int SELECTION_END = 19; 133516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final String EXPECTED_RESULT = "some text some text"; 134516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(STRING_TO_TYPE); 1357e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard // Don't use the sendUpdateForCursorMove* family of methods here because they 1367e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard // don't handle selections. 137516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // Send once to simulate the cursor actually responding to the move caused by typing. 138516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor 139516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // move with a move triggered by LatinIME inputting stuff. 140516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 141516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mInputConnection.setSelection(SELECTION_START, SELECTION_END); 142516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // And now we simulate the user actually selecting some text. 143516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 144516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard SELECTION_START, SELECTION_END, -1, -1); 145516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(Constants.CODE_DELETE); 146516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(Constants.CODE_DELETE); 147d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete selection twice", EXPECTED_RESULT, mEditText.getText().toString()); 1481e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard } 1490bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard 1500bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard public void testAutoCorrect() { 1510bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard final String STRING_TO_TYPE = "tgis "; 1520bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard final String EXPECTED_RESULT = "this "; 1530bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard type(STRING_TO_TYPE); 154d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("simple auto-correct", EXPECTED_RESULT, mEditText.getText().toString()); 155bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 156bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 157e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard public void testAutoCorrectWithQuote() { 158e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard final String STRING_TO_TYPE = "didn' "; 159e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard final String EXPECTED_RESULT = "didn't "; 160e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard type(STRING_TO_TYPE); 161e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard assertEquals("auto-correct with quote", EXPECTED_RESULT, mEditText.getText().toString()); 162e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard } 163e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard 164bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testAutoCorrectWithPeriod() { 165bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String STRING_TO_TYPE = "tgis."; 166bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String EXPECTED_RESULT = "this."; 167bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(STRING_TO_TYPE); 168d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("auto-correct with period", EXPECTED_RESULT, mEditText.getText().toString()); 169bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 170bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 171bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testAutoCorrectWithPeriodThenRevert() { 172bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String STRING_TO_TYPE = "tgis."; 173bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String EXPECTED_RESULT = "tgis."; 174bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(STRING_TO_TYPE); 1757e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(STRING_TO_TYPE.length()); 176240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 177bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("auto-correct with period then revert", EXPECTED_RESULT, 178d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 1790bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard } 18060e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard 1810e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard public void testAutoCorrectWithSpaceThenRevert() { 1829586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu // Backspacing to cancel the "tgis"->"this" autocorrection should result in 1839586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu // a "phantom space": if the user presses space immediately after, 1849586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu // only one space will be inserted in total. 1850e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String STRING_TO_TYPE = "tgis "; 1869586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu final String EXPECTED_RESULT = "tgis"; 1870e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard type(STRING_TO_TYPE); 1887e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(STRING_TO_TYPE.length()); 189240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 1900e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard assertEquals("auto-correct with space then revert", EXPECTED_RESULT, 191d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 1929586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu } 1939586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu 1949586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu public void testAutoCorrectWithSpaceThenRevertThenTypeMore() { 1959586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu final String STRING_TO_TYPE_FIRST = "tgis "; 1969586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu final String STRING_TO_TYPE_SECOND = "a"; 1979586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu final String EXPECTED_RESULT = "tgis a"; 1989586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu type(STRING_TO_TYPE_FIRST); 1997e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(STRING_TO_TYPE_FIRST.length()); 2009586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu type(Constants.CODE_DELETE); 2019586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu 2029586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu type(STRING_TO_TYPE_SECOND); 2037e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(STRING_TO_TYPE_FIRST.length() - 1 2047e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard + STRING_TO_TYPE_SECOND.length()); 2059586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu assertEquals("auto-correct with space then revert then type more", EXPECTED_RESULT, 2069586d69bdf90fe24a83c0c6ba22589f28ae6cd03Adrian Velicu mEditText.getText().toString()); 2070e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard } 2080e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard 2090e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard public void testAutoCorrectToSelfDoesNotRevert() { 2100e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String STRING_TO_TYPE = "this "; 2110e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String EXPECTED_RESULT = "this"; 2120e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard type(STRING_TO_TYPE); 2137e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(STRING_TO_TYPE.length()); 214240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 2150e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard assertEquals("auto-correct with space does not revert", EXPECTED_RESULT, 216d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 2170e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard } 2180e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard 21960e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard public void testDoubleSpace() { 2208142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard // U+1F607 is an emoji 2218142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard final String[] STRINGS_TO_TYPE = 2228142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard new String[] { "this ", "a+ ", "\u1F607 ", ".. ", ") ", "( ", "% " }; 2238142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard final String[] EXPECTED_RESULTS = 224eacb2be8feffc49e97ae174607b69e210540111dKen Wakasa new String[] { "this. ", "a+. ", "\u1F607. ", ".. ", "). ", "( ", "%. " }; 225b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic verifyDoubleSpace(STRINGS_TO_TYPE, EXPECTED_RESULTS); 226b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic } 227b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic 228b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic public void testDoubleSpaceHindi() { 229b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic changeLanguage("hi"); 230b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic // U+1F607 is an emoji 231b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic final String[] STRINGS_TO_TYPE = 232b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic new String[] { "this ", "a+ ", "\u1F607 ", "|| ", ") ", "( ", "% " }; 233b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic final String[] EXPECTED_RESULTS = 234b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic new String[] { "this| ", "a+| ", "\u1F607| ", "|| ", ")| ", "( ", "%| " }; 235b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic verifyDoubleSpace(STRINGS_TO_TYPE, EXPECTED_RESULTS); 236b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic } 237b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic 238b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic private void verifyDoubleSpace(String[] stringsToType, String[] expectedResults) { 239b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic // Set default pref just in case 240b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true); 241b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic for (int i = 0; i < stringsToType.length; ++i) { 2428142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard mEditText.setText(""); 243b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic type(stringsToType[i]); 244b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic assertEquals("double space processing", expectedResults[i], 2458142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard mEditText.getText().toString()); 2468142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard } 24760e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard } 24860e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard 249b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic public void testCancelDoubleSpaceEnglish() { 250b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic final String STRING_TO_TYPE = "this "; 251b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic final String EXPECTED_RESULT = "this "; 252b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic type(STRING_TO_TYPE); 253b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic type(Constants.CODE_DELETE); 254b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString()); 255b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic } 256b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic 257b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic public void testCancelDoubleSpaceHindi() { 258b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic changeLanguage("hi"); 259fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard final String STRING_TO_TYPE = "this "; 2607b8b6e4b42710a04dbda19a16b57f44a0c3caca9Jean Chalard final String EXPECTED_RESULT = "this "; 26160e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard type(STRING_TO_TYPE); 262240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 263d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString()); 264a02e703289d2704963f140c44d630dcc0a65e34aJean Chalard } 26541df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard 26628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard private void testDoubleSpacePeriodWithSettings(final boolean expectsPeriod, 26728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final Object... settingsKeysValues) { 26828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final Object[] oldSettings = new Object[settingsKeysValues.length / 2]; 26928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String STRING_WITHOUT_PERIOD = "this "; 27028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String STRING_WITH_PERIOD = "this. "; 27128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String EXPECTED_RESULT = expectsPeriod ? STRING_WITH_PERIOD : STRING_WITHOUT_PERIOD; 27228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard try { 27328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard for (int i = 0; i < settingsKeysValues.length; i += 2) { 27428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard if (settingsKeysValues[i + 1] instanceof String) { 27528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard oldSettings[i / 2] = setStringPreference((String)settingsKeysValues[i], 27628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard (String)settingsKeysValues[i + 1], "0"); 27728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } else { 27828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard oldSettings[i / 2] = setBooleanPreference((String)settingsKeysValues[i], 27928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard (Boolean)settingsKeysValues[i + 1], false); 28028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 28128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 28228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard mLatinIME.loadSettings(); 28328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard mEditText.setText(""); 28428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard type(STRING_WITHOUT_PERIOD); 28528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard assertEquals("double-space-to-period with specific settings " 28628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard + TextUtils.join(" ", settingsKeysValues), 28728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard EXPECTED_RESULT, mEditText.getText().toString()); 28828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } finally { 28928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // Restore old settings 29028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard for (int i = 0; i < settingsKeysValues.length; i += 2) { 29128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard if (null == oldSettings[i / 2]) { 29228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard break; 29328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } if (oldSettings[i / 2] instanceof String) { 29428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setStringPreference((String)settingsKeysValues[i], (String)oldSettings[i / 2], 29528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard ""); 29628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } else { 29728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setBooleanPreference((String)settingsKeysValues[i], (Boolean)oldSettings[i / 2], 29828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard false); 29928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 30028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 30128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 30228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 30328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 30428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard public void testDoubleSpacePeriod() { 30528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // Reset settings to default, else these tests will go flaky. 306ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka setBooleanPreference(Settings.PREF_SHOW_SUGGESTIONS, true, true); 307116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen setBooleanPreference(Settings.PREF_AUTO_CORRECTION, true, true); 30828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true); 309b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic testDoubleSpacePeriodWithSettings(true); 310ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka // "Suggestion visibility" to off 311ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS, false); 312ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka // "Suggestion visibility" to on 313ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS, true); 31428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 31528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Double-space period" to "off" 31628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(false, Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false); 31728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 31828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Auto-correction" to "off" 319116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION, false); 320116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen // "Auto-correction" to "on" 321116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION, true); 32228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 32328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always hide" and "Auto-correction" to "off" 324ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS, false, 325116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen Settings.PREF_AUTO_CORRECTION, false); 32628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always hide" and "Auto-correction" to "off" 327ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka testDoubleSpacePeriodWithSettings(false, Settings.PREF_SHOW_SUGGESTIONS, false, 328116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen Settings.PREF_AUTO_CORRECTION, false, 32928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false); 33028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 33128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 33241df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard public void testBackspaceAtStartAfterAutocorrect() { 33341df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final String STRING_TO_TYPE = "tgis "; 3342752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 33541df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final String EXPECTED_RESULT = "this "; 33641df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final int NEW_CURSOR_POSITION = 0; 33741df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard type(STRING_TO_TYPE); 3387e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(typedLength); 33941df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION); 3407e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION); 341240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 342fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard assertEquals("auto correct then move cursor to start of line then backspace", 343d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka EXPECTED_RESULT, mEditText.getText().toString()); 34460e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard } 3459184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard 3469184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard public void testAutoCorrectThenMoveCursorThenBackspace() { 3479184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final String STRING_TO_TYPE = "and tgis "; 3482752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 3499184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final String EXPECTED_RESULT = "andthis "; 3509184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final int NEW_CURSOR_POSITION = STRING_TO_TYPE.indexOf('t'); 3519184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard type(STRING_TO_TYPE); 3527e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(typedLength); 3539184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION); 3547e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION); 355240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 356fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard assertEquals("auto correct then move cursor then backspace", 357d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka EXPECTED_RESULT, mEditText.getText().toString()); 3589184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard } 359cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 360cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testNoSpaceAfterManualPick() { 361cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD_TO_TYPE = "this"; 362cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = WORD_TO_TYPE; 363cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD_TO_TYPE); 3643fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 365cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard assertEquals("no space after manual pick", EXPECTED_RESULT, 366d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 367cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 368cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 369cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenType() { 370cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 371cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = "is"; 372cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this is"; 373cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 3743fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 375cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 376d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("manual pick then type", EXPECTED_RESULT, mEditText.getText().toString()); 377cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 378cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 379cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenSeparator() { 380cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 381cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = "!"; 382cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this!"; 383cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 3843fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 385cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 386d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("manual pick then separator", EXPECTED_RESULT, mEditText.getText().toString()); 38729c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard } 38829c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard 389bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic // This test matches testClusteringPunctuationForFrench. 390bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic // In some non-English languages, ! and ? are clustering punctuation signs. 39129c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard public void testClusteringPunctuation() { 39229c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String WORD1_TO_TYPE = "test"; 39329c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String WORD2_TO_TYPE = "!!?!:!"; 39429c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String EXPECTED_RESULT = "test!!?!:!"; 39529c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard type(WORD1_TO_TYPE); 3963fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 39729c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard type(WORD2_TO_TYPE); 39829c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard assertEquals("clustering punctuation", EXPECTED_RESULT, mEditText.getText().toString()); 399cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 400cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 401f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard public void testManualPickThenStripperThenPick() { 402f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String WORD_TO_TYPE = "this"; 403f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String STRIPPER = "\n"; 404f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String EXPECTED_RESULT = "this\nthis"; 405f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(WORD_TO_TYPE); 4063fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 407f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(STRIPPER); 408f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(WORD_TO_TYPE); 4093fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 410f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard assertEquals("manual pick then \\n then manual pick", EXPECTED_RESULT, 411d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 412f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard } 413f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard 414cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenSpaceThenType() { 415cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 416cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = " is"; 417cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this is"; 418cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 4193fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 420cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 421845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard assertEquals("manual pick then space then type", EXPECTED_RESULT, 422d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 423845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard } 424845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard 425845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard public void testManualPickThenManualPick() { 426845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String WORD1_TO_TYPE = "this"; 427845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String WORD2_TO_PICK = "is"; 428845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String EXPECTED_RESULT = "this is"; 429845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard type(WORD1_TO_TYPE); 4303fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 4313fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Here we fake picking a word through bigram prediction. 4323fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD2_TO_PICK); 433845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard assertEquals("manual pick then manual pick", EXPECTED_RESULT, 434d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 435845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard } 436845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard 437825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard public void testDeleteWholeComposingWord() { 438825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard final String WORD_TO_TYPE = "this"; 439825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard type(WORD_TO_TYPE); 440825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 441240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 442825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard } 443d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete whole composing word", "", mEditText.getText().toString()); 444825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard } 445c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard 446c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard public void testResumeSuggestionOnBackspace() { 4471e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard final String STRING_TO_TYPE = "and this "; 4481e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard final int typedLength = STRING_TO_TYPE.length(); 4491e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard type(STRING_TO_TYPE); 450c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", -1, 451c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 452c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", -1, 453c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 4547e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(typedLength); 455c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard type(Constants.CODE_DELETE); 456c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", 4, 457c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 458c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", 8, 459c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 460c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard } 461e38097dc2ae31774d49142d619f7d57708369785Jean Chalard 462e38097dc2ae31774d49142d619f7d57708369785Jean Chalard private void helperTestComposing(final String wordToType, final boolean shouldBeComposing) { 463e38097dc2ae31774d49142d619f7d57708369785Jean Chalard mEditText.setText(""); 464e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(wordToType); 465e38097dc2ae31774d49142d619f7d57708369785Jean Chalard assertEquals("start composing inside text", shouldBeComposing ? 0 : -1, 466e38097dc2ae31774d49142d619f7d57708369785Jean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 467e38097dc2ae31774d49142d619f7d57708369785Jean Chalard assertEquals("start composing inside text", shouldBeComposing ? wordToType.length() : -1, 468e38097dc2ae31774d49142d619f7d57708369785Jean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 469e38097dc2ae31774d49142d619f7d57708369785Jean Chalard } 470e38097dc2ae31774d49142d619f7d57708369785Jean Chalard 471e38097dc2ae31774d49142d619f7d57708369785Jean Chalard public void testStartComposing() { 472e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should start composing on a letter 473e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a", true); 474e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); // To reset the composing state 475e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should not start composing on quote 476e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("'", false); 477e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 478e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("'-", false); 479e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 480e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should not start composing on dash 481e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("-", false); 482e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 483e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("-'", false); 484e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 485e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a-", true); 486e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 487e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a'", true); 488e38097dc2ae31774d49142d619f7d57708369785Jean Chalard } 489b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic 4909159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard // TODO: Add some tests for non-BMP characters 4916bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 4924cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi public void testAutoCorrectByUserHistory() { 493b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic type("qpmz"); 4944cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 495b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic 496b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic int startIndex = mEditText.getText().length(); 497b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic type("qpmx"); 4984cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 499b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic int endIndex = mEditText.getText().length(); 5004cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi assertEquals("auto-corrected by user history", 501b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic "qpmz ", mEditText.getText().subSequence(startIndex, endIndex).toString()); 5024cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi } 5034cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi 5046bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard public void testPredictionsAfterSpace() { 5056bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard final String WORD_TO_TYPE = "Barack "; 5066bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard type(WORD_TO_TYPE); 5079ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 5086bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard runMessages(); 5096bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard // Test the first prediction is displayed 51063be066544f19928d6a29c58c028cce7c95fa457Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 5116bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard assertEquals("predictions after space", "Obama", 5126bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 5136bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard } 5146bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 515944923f26660959bfc347c55b66f40de924d3068Jean Chalard public void testPredictionsWithDoubleSpaceToPeriod() { 51652cef1321140190d4fd248b7da26296f89f89659Keisuke Kuroyanagi mLatinIME.clearPersonalizedDictionariesForTest(); 517cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic final String WORD_TO_TYPE = "Barack "; 518944923f26660959bfc347c55b66f40de924d3068Jean Chalard type(WORD_TO_TYPE); 5199ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 520944923f26660959bfc347c55b66f40de924d3068Jean Chalard runMessages(); 521cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 522944923f26660959bfc347c55b66f40de924d3068Jean Chalard type(Constants.CODE_DELETE); 5239ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 524944923f26660959bfc347c55b66f40de924d3068Jean Chalard runMessages(); 525cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 526cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 527944923f26660959bfc347c55b66f40de924d3068Jean Chalard suggestedWords = mLatinIME.getSuggestedWordsForTest(); 528944923f26660959bfc347c55b66f40de924d3068Jean Chalard assertEquals("predictions after cancel double-space-to-period", "Obama", 529cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic mLatinIME.getSuggestedWordsForTest().getWord(0)); 530944923f26660959bfc347c55b66f40de924d3068Jean Chalard } 531944923f26660959bfc347c55b66f40de924d3068Jean Chalard 5326bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard public void testPredictionsAfterManualPick() { 5336bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard final String WORD_TO_TYPE = "Barack"; 5346bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard type(WORD_TO_TYPE); 5353fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the auto-correction. For "Barack", the auto-correction should be "Barack". 5363fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 5379ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 538e4ae5855cb2ed0ee8a40badecd6025945a9c5578Keisuke Kuroyanagi runMessages(); 5396bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard // Test the first prediction is displayed 54063be066544f19928d6a29c58c028cce7c95fa457Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 5416bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard assertEquals("predictions after manual pick", "Obama", 5426bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 5436bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard } 5446bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 5455455179b54eb8230577f518db082796a3055685aDan Zivkovic public void testPredictionsAfterPeriod() { 5465455179b54eb8230577f518db082796a3055685aDan Zivkovic mLatinIME.clearPersonalizedDictionariesForTest(); 5475455179b54eb8230577f518db082796a3055685aDan Zivkovic final String WORD_TO_TYPE = "Barack. "; 5485455179b54eb8230577f518db082796a3055685aDan Zivkovic type(WORD_TO_TYPE); 5495455179b54eb8230577f518db082796a3055685aDan Zivkovic sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 5505455179b54eb8230577f518db082796a3055685aDan Zivkovic runMessages(); 5515455179b54eb8230577f518db082796a3055685aDan Zivkovic 552cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 553cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic assertFalse(mLatinIME.getSuggestedWordsForTest().isEmpty()); 5545455179b54eb8230577f518db082796a3055685aDan Zivkovic } 5555455179b54eb8230577f518db082796a3055685aDan Zivkovic 556fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard public void testPredictionsAfterRecorrection() { 557fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String PREFIX = "A "; 558fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String WORD_TO_TYPE = "Barack"; 559fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String FIRST_NON_TYPED_SUGGESTION = "Barrack"; 560fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfPrefix = PREFIX.length(); 561fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfWord = endOfPrefix + WORD_TO_TYPE.length(); 562fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfSuggestion = endOfPrefix + FIRST_NON_TYPED_SUGGESTION.length(); 563fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int indexForManualCursor = endOfPrefix + 3; // +3 because it's after "Bar" in "Barack" 564fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(PREFIX); 5657e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(endOfPrefix); 566fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(WORD_TO_TYPE); 5673fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(FIRST_NON_TYPED_SUGGESTION); 5687e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(endOfSuggestion); 569fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 570fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(" "); 5717e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveBy(1); 5729ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 573fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 574fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard // Simulate a manual cursor move 575fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mInputConnection.setSelection(indexForManualCursor, indexForManualCursor); 5767e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(indexForManualCursor); 5779ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 578fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 5793fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 5807e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(endOfWord); 5819ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 582fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 583fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard // Test the first prediction is displayed 584fbb8cb5a82a4f760884c2ebca62cc7965c455ed2Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 585fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard assertEquals("predictions after recorrection", "Obama", 586fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 587fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard } 5881079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard 5891079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard public void testComposingMultipleBackspace() { 5901079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final String WORD_TO_TYPE = "radklro"; 5911079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final int TIMES_TO_TYPE = 3; 5921079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final int TIMES_TO_BACKSPACE = 8; 5931079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 5941079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5951079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5961079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5971079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 5981079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5991079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 6001079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 6011079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 6021079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 6031079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 6041079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard assertEquals("composing with multiple backspace", 6051079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard WORD_TO_TYPE.length() * TIMES_TO_TYPE - TIMES_TO_BACKSPACE, 6061079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard mEditText.getText().length()); 6071079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard } 6088e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6098e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testManySingleQuotes() { 6108e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_AUTOCORRECT = "i"; 6118e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_AUTOCORRECTED = "I"; 6128e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String QUOTES = "''''''''''''''''''''"; 6138e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " "; 6148e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " "; 6158e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE); 6168e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("auto-correct with many trailing single quotes", EXPECTED_RESULT, 6178e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 6188e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6198e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6208e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testManySingleQuotesOneByOne() { 6218e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_AUTOCORRECT = "i"; 6228e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_AUTOCORRECTED = "I"; 6238e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String QUOTES = "''''''''''''''''''''"; 6248e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " "; 6258e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " "; 6268e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6278e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 6288e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE.substring(i, i+1)); 6299ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 6308e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard runMessages(); 6318e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6328e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("type many trailing single quotes one by one", EXPECTED_RESULT, 6338e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 6348e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6358e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6368e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testTypingSingleQuotesOneByOne() { 6378e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = "it's "; 6388e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_TO_TYPE; 6398e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 6408e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE.substring(i, i+1)); 6419ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS); 6428e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard runMessages(); 6438e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6448e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("type words letter by letter", EXPECTED_RESULT, 6458e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 6468e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6475ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard 6489ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard public void testBasicGesture() { 6499ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard gesture("this"); 650b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic assertEquals("this", mEditText.getText().toString()); 6519ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard } 6529ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard 6539ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard public void testGestureGesture() { 654b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic gesture("got"); 655b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic gesture("milk"); 656b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic assertEquals("got milk", mEditText.getText().toString()); 6579ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard } 6589ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard 6599ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard public void testGestureBackspaceGestureAgain() { 6609ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard gesture("this"); 6619ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard type(Constants.CODE_DELETE); 6629ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard assertEquals("gesture then backspace", "", mEditText.getText().toString()); 6639ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard gesture("this"); 664cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic if (DecoderSpecificConstants.SHOULD_REMOVE_PREVIOUSLY_REJECTED_SUGGESTION) { 665cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic assertNotEqual("this", mEditText.getText().toString()); 666cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic } else { 667cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic assertEquals("this", mEditText.getText().toString()); 668cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic } 6699ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard } 6707e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard 671d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard private void typeOrGestureWordAndPutCursorInside(final boolean gesture, final String word, 672d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard final int startPos) { 6737e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard final int END_OF_WORD = startPos + word.length(); 6747e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard final int NEW_CURSOR_POSITION = startPos + word.length() / 2; 675d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard if (gesture) { 676d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard gesture(word); 677d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard } else { 678d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard type(word); 679d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard } 6807e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(END_OF_WORD); 6817e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard runMessages(); 6827e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sendUpdateForCursorMoveTo(NEW_CURSOR_POSITION); 6837e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS); 6847e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard runMessages(); 6857e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard } 6867e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard 687d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard private void typeWordAndPutCursorInside(final String word, final int startPos) { 688d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard typeOrGestureWordAndPutCursorInside(false /* gesture */, word, startPos); 689d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard } 690d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard 691d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard private void gestureWordAndPutCursorInside(final String word, final int startPos) { 692d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard typeOrGestureWordAndPutCursorInside(true /* gesture */, word, startPos); 693d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard } 694d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard 6957e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard private void ensureComposingSpanPos(final String message, final int from, final int to) { 6967e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard assertEquals(message, from, BaseInputConnection.getComposingSpanStart(mEditText.getText())); 6977e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard assertEquals(message, to, BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 6987e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard } 6997e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard 7007e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard public void testTypeWithinComposing() { 7017e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard final String WORD_TO_TYPE = "something"; 7027e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard final String EXPECTED_RESULT = "some thing"; 7037e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard typeWordAndPutCursorInside(WORD_TO_TYPE, 0 /* startPos */); 7047e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard type(" "); 7057e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard ensureComposingSpanPos("space while in the middle of a word cancels composition", -1, -1); 7067e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard assertEquals("space in the middle of a composing word", EXPECTED_RESULT, 7077e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard mEditText.getText().toString()); 7087e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard int cursorPos = sendUpdateForCursorMoveToEndOfLine(); 7097e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard runMessages(); 7107e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard type(" "); 711d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard assertEquals("mbo", "some thing ", mEditText.getText().toString()); 712d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard typeWordAndPutCursorInside(WORD_TO_TYPE, cursorPos + 1 /* startPos */); 713d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard type(Constants.CODE_DELETE); 714b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic ensureComposingSpanPos("delete while in the middle of a word cancels composition", -1, -1); 715d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard } 716d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard 717d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard public void testTypeWithinGestureComposing() { 718d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard final String WORD_TO_TYPE = "something"; 719d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard final String EXPECTED_RESULT = "some thing"; 720d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard gestureWordAndPutCursorInside(WORD_TO_TYPE, 0 /* startPos */); 721d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard type(" "); 722d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard ensureComposingSpanPos("space while in the middle of a word cancels composition", -1, -1); 723d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard assertEquals("space in the middle of a composing word", EXPECTED_RESULT, 724d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard mEditText.getText().toString()); 725d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard int cursorPos = sendUpdateForCursorMoveToEndOfLine(); 726d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard runMessages(); 727d17e1d31b69e006af7302903686e3ddb3cb30d27Jean Chalard type(" "); 7287e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard typeWordAndPutCursorInside(WORD_TO_TYPE, cursorPos + 1 /* startPos */); 7297e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard type(Constants.CODE_DELETE); 730ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS); 731b98a0380ffca8586d7f9f4eafd1a0ad7a8844f0bDan Zivkovic ensureComposingSpanPos("delete while in the middle of a word cancels composition", -1, -1); 7327e930bfb3a6b4a36e6e6cde5cecc76640c148fb0Jean Chalard } 733bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic 734bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic public void testManualPickThenSeparatorForFrench() { 735bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String WORD1_TO_TYPE = "test"; 736bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String WORD2_TO_TYPE = "!"; 737bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String EXPECTED_RESULT = "test !"; 738bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic changeLanguage("fr"); 739bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD1_TO_TYPE); 740bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic pickSuggestionManually(WORD1_TO_TYPE); 741bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD2_TO_TYPE); 742bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic assertEquals("manual pick then separator for French", EXPECTED_RESULT, 743bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic mEditText.getText().toString()); 744bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic } 745bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic 746bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic public void testClusteringPunctuationForFrench() { 747bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String WORD1_TO_TYPE = "test"; 748bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String WORD2_TO_TYPE = "!!?!:!"; 749bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic // In English, the expected result would be "test!!?!:!" 750bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String EXPECTED_RESULT = "test !!?! : !"; 751bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic changeLanguage("fr"); 752bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD1_TO_TYPE); 753bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic pickSuggestionManually(WORD1_TO_TYPE); 754bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD2_TO_TYPE); 755bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic assertEquals("clustering punctuation for French", EXPECTED_RESULT, 756bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic mEditText.getText().toString()); 757bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic } 758bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic 759ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic public void testWordThenSpaceThenPunctuationFromStripTwice() { 760cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic setBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS, false, true); 761cab6fa3e1b9f22135825cfdee1fb9df992e63234Dan Zivkovic 762bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String WORD_TO_TYPE = "test "; 763bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final String PUNCTUATION_FROM_STRIP = "!"; 764ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic final String EXPECTED_RESULT = "test!! "; 765bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD_TO_TYPE); 766bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS); 767bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic runMessages(); 768bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic assertTrue("type word then type space should display punctuation strip", 769bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic mLatinIME.getSuggestedWordsForTest().isPunctuationSuggestions()); 770bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic pickSuggestionManually(PUNCTUATION_FROM_STRIP); 771bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic pickSuggestionManually(PUNCTUATION_FROM_STRIP); 772ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic assertEquals(EXPECTED_RESULT, mEditText.getText().toString()); 773bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic } 774bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic 775bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic public void testWordThenSpaceDisplaysPredictions() { 776ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic final String WORD_TO_TYPE = "Barack "; 777ffd808b4462875a2c15d471dea020f263b833a60Dan Zivkovic final String EXPECTED_RESULT = "Obama"; 778bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic type(WORD_TO_TYPE); 779bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic sleep(DELAY_TO_WAIT_FOR_UNDERLINE_MILLIS); 780bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic runMessages(); 781bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 782bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic assertEquals("type word then type space yields predictions for French", 783bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic EXPECTED_RESULT, suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 784bc0384c7ec86e190d018b65cff7f63dea392be0eDan Zivkovic } 78583c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard} 786