InputLogicTests.java revision 3fb5a541a44bc9a82663895fd09c342299f45b56
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 1928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalardimport com.android.inputmethod.latin.settings.Settings; 2028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 21b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.LargeTest; 2228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalardimport android.text.TextUtils; 23c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardimport android.view.inputmethod.BaseInputConnection; 24b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka 25b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@LargeTest 268592ed408e8e81138172eefe2df28f00807a1e1fJean Chalardpublic class InputLogicTests extends InputTestsBase { 27f717c5685e3299349d5abe1ecc7d13446b9779bcJean Chalard 2883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard public void testTypeWord() { 291e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String WORD_TO_TYPE = "abcd"; 301e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(WORD_TO_TYPE); 31d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("type word", WORD_TO_TYPE, mEditText.getText().toString()); 3283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard } 3383c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 3483c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard public void testPickSuggestionThenBackspace() { 359159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard final String WORD_TO_TYPE = "this"; 36f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thi"; 371e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(WORD_TO_TYPE); 383fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 399159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1); 40240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 419159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard assertEquals("press suggestion then backspace", EXPECTED_RESULT, 42d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 439159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard } 449159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard 45bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testPickAutoCorrectionThenBackspace() { 46bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_TYPE = "tgis"; 47bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_PICK = "this"; 48f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thi"; 49bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(WORD_TO_TYPE); 503fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the auto-correction. For "tgis", the auto-correction should be "this". 513fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_PICK); 52bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1); 53bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", WORD_TO_PICK, 54d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 55240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 56bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT, 57d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 58bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 59bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 609159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard public void testPickTypedWordOverAutoCorrectionThenBackspace() { 619159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard final String WORD_TO_TYPE = "tgis"; 62f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "tgi"; 639159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard type(WORD_TO_TYPE); 643fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the typed word. 653fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 669159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1); 67bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick typed word over auto-correction then backspace", WORD_TO_TYPE, 68d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 69240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 709159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT, 71d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 7283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard } 7383c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard 74bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testPickDifferentSuggestionThenBackspace() { 75bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_TYPE = "tgis"; 76bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String WORD_TO_PICK = "thus"; 77f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard final String EXPECTED_RESULT = "thu"; 78bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(WORD_TO_TYPE); 793fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the second suggestion, which should be "thus" when "tgis" is typed. 803fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_PICK); 81bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1); 82bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick different suggestion then backspace", WORD_TO_PICK, 83d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 84240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 85bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("pick different suggestion then backspace", EXPECTED_RESULT, 86d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 87bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 88bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 891e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard public void testDeleteSelection() { 901e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String STRING_TO_TYPE = "some text delete me some text"; 912752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 921e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final int SELECTION_START = 10; 931e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final int SELECTION_END = 19; 941e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard final String EXPECTED_RESULT = "some text some text"; 951e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard type(STRING_TO_TYPE); 961e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // There is no IMF to call onUpdateSelection for us so we must do it by hand. 971e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // Send once to simulate the cursor actually responding to the move caused by typing. 981e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor 991e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // move with a move triggered by LatinIME inputting stuff. 1002752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 1011e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard mInputConnection.setSelection(SELECTION_START, SELECTION_END); 1021e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard // And now we simulate the user actually selecting some text. 1032752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 1042752287c425b9be87800136bd616ee63940caaacJean Chalard SELECTION_START, SELECTION_END, -1, -1); 105240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 106d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete selection", EXPECTED_RESULT, mEditText.getText().toString()); 107516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard } 108516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard 109516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard public void testDeleteSelectionTwice() { 110516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final String STRING_TO_TYPE = "some text delete me some text"; 111516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int typedLength = STRING_TO_TYPE.length(); 112516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int SELECTION_START = 10; 113516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final int SELECTION_END = 19; 114516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard final String EXPECTED_RESULT = "some text some text"; 115516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(STRING_TO_TYPE); 116516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // There is no IMF to call onUpdateSelection for us so we must do it by hand. 117516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // Send once to simulate the cursor actually responding to the move caused by typing. 118516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor 119516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // move with a move triggered by LatinIME inputting stuff. 120516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 121516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mInputConnection.setSelection(SELECTION_START, SELECTION_END); 122516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard // And now we simulate the user actually selecting some text. 123516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 124516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard SELECTION_START, SELECTION_END, -1, -1); 125516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(Constants.CODE_DELETE); 126516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard type(Constants.CODE_DELETE); 127d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete selection twice", EXPECTED_RESULT, mEditText.getText().toString()); 1281e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard } 1290bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard 1300bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard public void testAutoCorrect() { 1310bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard final String STRING_TO_TYPE = "tgis "; 1320bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard final String EXPECTED_RESULT = "this "; 1330bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard type(STRING_TO_TYPE); 134d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("simple auto-correct", EXPECTED_RESULT, mEditText.getText().toString()); 135bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 136bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 137e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard public void testAutoCorrectWithQuote() { 138e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard final String STRING_TO_TYPE = "didn' "; 139e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard final String EXPECTED_RESULT = "didn't "; 140e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard type(STRING_TO_TYPE); 141e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard assertEquals("auto-correct with quote", EXPECTED_RESULT, mEditText.getText().toString()); 142e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard } 143e8f717943f7063444cd1c777e8dd03dc738f3c4aJean Chalard 144bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testAutoCorrectWithPeriod() { 145bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String STRING_TO_TYPE = "tgis."; 146bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String EXPECTED_RESULT = "this."; 147bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(STRING_TO_TYPE); 148d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("auto-correct with period", EXPECTED_RESULT, mEditText.getText().toString()); 149bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard } 150bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard 151bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard public void testAutoCorrectWithPeriodThenRevert() { 152bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String STRING_TO_TYPE = "tgis."; 153bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard final String EXPECTED_RESULT = "tgis."; 154bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard type(STRING_TO_TYPE); 155bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1); 156240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 157bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard assertEquals("auto-correct with period then revert", EXPECTED_RESULT, 158d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 1590bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard } 16060e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard 1610e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard public void testAutoCorrectWithSpaceThenRevert() { 1620e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String STRING_TO_TYPE = "tgis "; 1630e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String EXPECTED_RESULT = "tgis "; 1640e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard type(STRING_TO_TYPE); 1650e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1); 166240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 1670e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard assertEquals("auto-correct with space then revert", EXPECTED_RESULT, 168d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 1690e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard } 1700e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard 1710e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard public void testAutoCorrectToSelfDoesNotRevert() { 1720e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String STRING_TO_TYPE = "this "; 1730e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard final String EXPECTED_RESULT = "this"; 1740e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard type(STRING_TO_TYPE); 1750e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1); 176240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 1770e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard assertEquals("auto-correct with space does not revert", EXPECTED_RESULT, 178d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 1790e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard } 1800e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard 18160e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard public void testDoubleSpace() { 18228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // Set default pref just in case 18328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true); 1848142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard // U+1F607 is an emoji 1858142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard final String[] STRINGS_TO_TYPE = 1868142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard new String[] { "this ", "a+ ", "\u1F607 ", ".. ", ") ", "( ", "% " }; 1878142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard final String[] EXPECTED_RESULTS = 188eacb2be8feffc49e97ae174607b69e210540111dKen Wakasa new String[] { "this. ", "a+. ", "\u1F607. ", ".. ", "). ", "( ", "%. " }; 1898142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard for (int i = 0; i < STRINGS_TO_TYPE.length; ++i) { 1908142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard mEditText.setText(""); 1918142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard type(STRINGS_TO_TYPE[i]); 1928142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard assertEquals("double space processing", EXPECTED_RESULTS[i], 1938142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard mEditText.getText().toString()); 1948142fd83a6ed8dd6741579f724ebda9e2b70dd01Jean Chalard } 19560e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard } 19660e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard 19760e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard public void testCancelDoubleSpace() { 198fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard final String STRING_TO_TYPE = "this "; 1997b8b6e4b42710a04dbda19a16b57f44a0c3caca9Jean Chalard final String EXPECTED_RESULT = "this "; 20060e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard type(STRING_TO_TYPE); 201240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 202d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString()); 203a02e703289d2704963f140c44d630dcc0a65e34aJean Chalard } 20441df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard 20528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard private void testDoubleSpacePeriodWithSettings(final boolean expectsPeriod, 20628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final Object... settingsKeysValues) { 20728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final Object[] oldSettings = new Object[settingsKeysValues.length / 2]; 20828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String STRING_WITHOUT_PERIOD = "this "; 20928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String STRING_WITH_PERIOD = "this. "; 21028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard final String EXPECTED_RESULT = expectsPeriod ? STRING_WITH_PERIOD : STRING_WITHOUT_PERIOD; 21128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard try { 21228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard for (int i = 0; i < settingsKeysValues.length; i += 2) { 21328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard if (settingsKeysValues[i + 1] instanceof String) { 21428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard oldSettings[i / 2] = setStringPreference((String)settingsKeysValues[i], 21528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard (String)settingsKeysValues[i + 1], "0"); 21628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } else { 21728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard oldSettings[i / 2] = setBooleanPreference((String)settingsKeysValues[i], 21828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard (Boolean)settingsKeysValues[i + 1], false); 21928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 22028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 22128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard mLatinIME.loadSettings(); 22228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard mEditText.setText(""); 22328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard type(STRING_WITHOUT_PERIOD); 22428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard assertEquals("double-space-to-period with specific settings " 22528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard + TextUtils.join(" ", settingsKeysValues), 22628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard EXPECTED_RESULT, mEditText.getText().toString()); 22728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } finally { 22828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // Restore old settings 22928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard for (int i = 0; i < settingsKeysValues.length; i += 2) { 23028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard if (null == oldSettings[i / 2]) { 23128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard break; 23228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } if (oldSettings[i / 2] instanceof String) { 23328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setStringPreference((String)settingsKeysValues[i], (String)oldSettings[i / 2], 23428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard ""); 23528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } else { 23628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setBooleanPreference((String)settingsKeysValues[i], (Boolean)oldSettings[i / 2], 23728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard false); 23828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 23928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 24028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 24128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 24228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 24328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard public void testDoubleSpacePeriod() { 24428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // Reset settings to default, else these tests will go flaky. 24528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setStringPreference(Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0", "0"); 24628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD, "1", "1"); 24728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true); 24828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true /* expectsPeriod */); 24928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always hide" 25028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "2"); 25128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "portrait only" 25228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "1"); 25328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always show" 25428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0"); 25528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 25628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Double-space period" to "off" 25728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(false, Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false); 25828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 25928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Auto-correction" to "off" 26028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0"); 26128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Auto-correction" to "modest" 26228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "1"); 26328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Auto-correction" to "very aggressive" 26428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "3"); 26528a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 26628a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always hide" and "Auto-correction" to "off" 26728a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0", 26828a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0"); 26928a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard // "Suggestion visibility" to "always hide" and "Auto-correction" to "off" 27028a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard testDoubleSpacePeriodWithSettings(false, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0", 27128a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0", 27228a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false); 27328a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard } 27428a59dd049bafa45de628e2cafda47bf46d9e22aJean Chalard 27541df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard public void testBackspaceAtStartAfterAutocorrect() { 27641df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final String STRING_TO_TYPE = "tgis "; 2772752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 27841df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final String EXPECTED_RESULT = "this "; 27941df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard final int NEW_CURSOR_POSITION = 0; 28041df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard type(STRING_TO_TYPE); 2812752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 28241df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION); 2832752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 2842752287c425b9be87800136bd616ee63940caaacJean Chalard NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1); 285240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 286fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard assertEquals("auto correct then move cursor to start of line then backspace", 287d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka EXPECTED_RESULT, mEditText.getText().toString()); 28860e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard } 2899184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard 2909184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard public void testAutoCorrectThenMoveCursorThenBackspace() { 2919184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final String STRING_TO_TYPE = "and tgis "; 2922752287c425b9be87800136bd616ee63940caaacJean Chalard final int typedLength = STRING_TO_TYPE.length(); 2939184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final String EXPECTED_RESULT = "andthis "; 2949184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard final int NEW_CURSOR_POSITION = STRING_TO_TYPE.indexOf('t'); 2959184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard type(STRING_TO_TYPE); 2962752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 2979184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION); 2982752287c425b9be87800136bd616ee63940caaacJean Chalard mLatinIME.onUpdateSelection(typedLength, typedLength, 2992752287c425b9be87800136bd616ee63940caaacJean Chalard NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1); 300240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 301fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard assertEquals("auto correct then move cursor then backspace", 302d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka EXPECTED_RESULT, mEditText.getText().toString()); 3039184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard } 304cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 305cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testNoSpaceAfterManualPick() { 306cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD_TO_TYPE = "this"; 307cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = WORD_TO_TYPE; 308cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD_TO_TYPE); 3093fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 310cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard assertEquals("no space after manual pick", EXPECTED_RESULT, 311d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 312cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 313cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 314cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenType() { 315cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 316cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = "is"; 317cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this is"; 318cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 3193fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 320cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 321d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("manual pick then type", EXPECTED_RESULT, mEditText.getText().toString()); 322cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 323cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 324cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenSeparator() { 325cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 326cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = "!"; 327cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this!"; 328cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 3293fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 330cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 331d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("manual pick then separator", EXPECTED_RESULT, mEditText.getText().toString()); 33229c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard } 33329c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard 33429c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard // This test matches the one in InputLogicTestsNonEnglish. In some non-English languages, 33529c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard // ! and ? are clustering punctuation signs. 33629c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard public void testClusteringPunctuation() { 33729c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String WORD1_TO_TYPE = "test"; 33829c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String WORD2_TO_TYPE = "!!?!:!"; 33929c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard final String EXPECTED_RESULT = "test!!?!:!"; 34029c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard type(WORD1_TO_TYPE); 3413fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 34229c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard type(WORD2_TO_TYPE); 34329c00ff53822658268d91a0c42afb7db540c15f9Jean Chalard assertEquals("clustering punctuation", EXPECTED_RESULT, mEditText.getText().toString()); 344cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard } 345cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard 346f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard public void testManualPickThenStripperThenPick() { 347f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String WORD_TO_TYPE = "this"; 348f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String STRIPPER = "\n"; 349f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard final String EXPECTED_RESULT = "this\nthis"; 350f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(WORD_TO_TYPE); 3513fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 352f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(STRIPPER); 353f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard type(WORD_TO_TYPE); 3543fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 355f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard assertEquals("manual pick then \\n then manual pick", EXPECTED_RESULT, 356d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 357f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard } 358f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard 359cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard public void testManualPickThenSpaceThenType() { 360cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD1_TO_TYPE = "this"; 361cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String WORD2_TO_TYPE = " is"; 362cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard final String EXPECTED_RESULT = "this is"; 363cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD1_TO_TYPE); 3643fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 365cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard type(WORD2_TO_TYPE); 366845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard assertEquals("manual pick then space then type", EXPECTED_RESULT, 367d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 368845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard } 369845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard 370845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard public void testManualPickThenManualPick() { 371845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String WORD1_TO_TYPE = "this"; 372845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String WORD2_TO_PICK = "is"; 373845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard final String EXPECTED_RESULT = "this is"; 374845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard type(WORD1_TO_TYPE); 3753fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD1_TO_TYPE); 3763fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Here we fake picking a word through bigram prediction. 3773fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD2_TO_PICK); 378845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard assertEquals("manual pick then manual pick", EXPECTED_RESULT, 379d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka mEditText.getText().toString()); 380845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard } 381845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard 382825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard public void testDeleteWholeComposingWord() { 383825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard final String WORD_TO_TYPE = "this"; 384825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard type(WORD_TO_TYPE); 385825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 386240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka type(Constants.CODE_DELETE); 387825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard } 388d5781eef628c2cd4ac38029040746daa4679d637Satoshi Kataoka assertEquals("delete whole composing word", "", mEditText.getText().toString()); 389825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard } 390c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard 391c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard public void testResumeSuggestionOnBackspace() { 3921e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard final String STRING_TO_TYPE = "and this "; 3931e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard final int typedLength = STRING_TO_TYPE.length(); 3941e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard type(STRING_TO_TYPE); 395c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", -1, 396c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 397c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", -1, 398c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 3991e50c681af56dd77d97a1e6d463f1e3023c1a69bJean Chalard mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1); 400c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard type(Constants.CODE_DELETE); 401c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", 4, 402c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 403c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard assertEquals("resume suggestion on backspace", 8, 404c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 405c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard } 406e38097dc2ae31774d49142d619f7d57708369785Jean Chalard 407e38097dc2ae31774d49142d619f7d57708369785Jean Chalard private void helperTestComposing(final String wordToType, final boolean shouldBeComposing) { 408e38097dc2ae31774d49142d619f7d57708369785Jean Chalard mEditText.setText(""); 409e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(wordToType); 410e38097dc2ae31774d49142d619f7d57708369785Jean Chalard assertEquals("start composing inside text", shouldBeComposing ? 0 : -1, 411e38097dc2ae31774d49142d619f7d57708369785Jean Chalard BaseInputConnection.getComposingSpanStart(mEditText.getText())); 412e38097dc2ae31774d49142d619f7d57708369785Jean Chalard assertEquals("start composing inside text", shouldBeComposing ? wordToType.length() : -1, 413e38097dc2ae31774d49142d619f7d57708369785Jean Chalard BaseInputConnection.getComposingSpanEnd(mEditText.getText())); 414e38097dc2ae31774d49142d619f7d57708369785Jean Chalard } 415e38097dc2ae31774d49142d619f7d57708369785Jean Chalard 416e38097dc2ae31774d49142d619f7d57708369785Jean Chalard public void testStartComposing() { 417e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should start composing on a letter 418e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a", true); 419e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); // To reset the composing state 420e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should not start composing on quote 421e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("'", false); 422e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 423e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("'-", false); 424e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 425e38097dc2ae31774d49142d619f7d57708369785Jean Chalard // Should not start composing on dash 426e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("-", false); 427e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 428e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("-'", false); 429e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 430e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a-", true); 431e38097dc2ae31774d49142d619f7d57708369785Jean Chalard type(" "); 432e38097dc2ae31774d49142d619f7d57708369785Jean Chalard helperTestComposing("a'", true); 433e38097dc2ae31774d49142d619f7d57708369785Jean Chalard } 4349159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard // TODO: Add some tests for non-BMP characters 4356bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 4364cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi public void testAutoCorrectByUserHistory() { 4374cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi final String WORD_TO_BE_CORRECTED = "qpmx"; 4384cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi final String NOT_CORRECTED_RESULT = "qpmx "; 4394cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi final String DESIRED_WORD = "qpmz"; 4404cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi final String CORRECTED_RESULT = "qpmz "; 44173a2426d455e6e83dd9402913889f80a0071f0acKeisuke Kuroyanagi final int typeCountNotToAutocorrect = 1; 4424cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi final int typeCountToAutoCorrect = 16; 4434cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi int startIndex = 0; 4444cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi int endIndex = 0; 4454cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi 4464cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi for (int i = 0; i < typeCountNotToAutocorrect; i++) { 4474cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(DESIRED_WORD); 4484cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 4494cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi } 4504cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi startIndex = mEditText.getText().length(); 4514cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(WORD_TO_BE_CORRECTED); 4524cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 4534cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi endIndex = mEditText.getText().length(); 4544cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi assertEquals("not auto-corrected by user history", NOT_CORRECTED_RESULT, 4554cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi mEditText.getText().subSequence(startIndex, endIndex).toString()); 4564cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi for (int i = typeCountNotToAutocorrect; i < typeCountToAutoCorrect; i++) { 4574cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(DESIRED_WORD); 4584cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 4594cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi } 4604cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi startIndex = mEditText.getText().length(); 4614cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(WORD_TO_BE_CORRECTED); 4624cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi type(Constants.CODE_SPACE); 4634cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi endIndex = mEditText.getText().length(); 4644cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi assertEquals("auto-corrected by user history", 4654cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi CORRECTED_RESULT, mEditText.getText().subSequence(startIndex, endIndex).toString()); 4664cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi } 4674cc582f3ba128b71426c3522fa0c324709870a67Keisuke Kuroyanagi 4686bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard public void testPredictionsAfterSpace() { 4696bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard final String WORD_TO_TYPE = "Barack "; 4706bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard type(WORD_TO_TYPE); 4716bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 4726bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard runMessages(); 4736bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard // Test the first prediction is displayed 47463be066544f19928d6a29c58c028cce7c95fa457Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 4756bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard assertEquals("predictions after space", "Obama", 4766bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 4776bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard } 4786bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 479944923f26660959bfc347c55b66f40de924d3068Jean Chalard public void testPredictionsWithDoubleSpaceToPeriod() { 48052cef1321140190d4fd248b7da26296f89f89659Keisuke Kuroyanagi mLatinIME.clearPersonalizedDictionariesForTest(); 481944923f26660959bfc347c55b66f40de924d3068Jean Chalard final String WORD_TO_TYPE = "Barack "; 482944923f26660959bfc347c55b66f40de924d3068Jean Chalard type(WORD_TO_TYPE); 483944923f26660959bfc347c55b66f40de924d3068Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 484944923f26660959bfc347c55b66f40de924d3068Jean Chalard runMessages(); 485944923f26660959bfc347c55b66f40de924d3068Jean Chalard // No need to test here, testPredictionsAfterSpace is testing it already 486944923f26660959bfc347c55b66f40de924d3068Jean Chalard type(" "); 487944923f26660959bfc347c55b66f40de924d3068Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 488944923f26660959bfc347c55b66f40de924d3068Jean Chalard runMessages(); 489944923f26660959bfc347c55b66f40de924d3068Jean Chalard // Test the predictions have been cleared 490944923f26660959bfc347c55b66f40de924d3068Jean Chalard SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 491944923f26660959bfc347c55b66f40de924d3068Jean Chalard assertEquals("predictions cleared after double-space-to-period", suggestedWords.size(), 0); 492944923f26660959bfc347c55b66f40de924d3068Jean Chalard type(Constants.CODE_DELETE); 493944923f26660959bfc347c55b66f40de924d3068Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 494944923f26660959bfc347c55b66f40de924d3068Jean Chalard runMessages(); 495944923f26660959bfc347c55b66f40de924d3068Jean Chalard // Test the first prediction is displayed 496944923f26660959bfc347c55b66f40de924d3068Jean Chalard suggestedWords = mLatinIME.getSuggestedWordsForTest(); 497944923f26660959bfc347c55b66f40de924d3068Jean Chalard assertEquals("predictions after cancel double-space-to-period", "Obama", 498944923f26660959bfc347c55b66f40de924d3068Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 499944923f26660959bfc347c55b66f40de924d3068Jean Chalard } 500944923f26660959bfc347c55b66f40de924d3068Jean Chalard 5016bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard public void testPredictionsAfterManualPick() { 5026bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard final String WORD_TO_TYPE = "Barack"; 5036bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard type(WORD_TO_TYPE); 5043fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard // Choose the auto-correction. For "Barack", the auto-correction should be "Barack". 5053fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 5066bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 507e4ae5855cb2ed0ee8a40badecd6025945a9c5578Keisuke Kuroyanagi runMessages(); 5086bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard // Test the first prediction is displayed 50963be066544f19928d6a29c58c028cce7c95fa457Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 5106bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard assertEquals("predictions after manual pick", "Obama", 5116bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 5126bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard } 5136bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard 5140aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi public void testPredictionsAfterPeriod() { 51552cef1321140190d4fd248b7da26296f89f89659Keisuke Kuroyanagi mLatinIME.clearPersonalizedDictionariesForTest(); 5166bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard final String WORD_TO_TYPE = "Barack. "; 5176bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard type(WORD_TO_TYPE); 5186bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 5196bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard runMessages(); 5200aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 5210aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi assertEquals("No prediction after period after inputting once.", 0, suggestedWords.size()); 5220aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi 5230aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi type(WORD_TO_TYPE); 5240aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 5250aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi runMessages(); 5260aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi suggestedWords = mLatinIME.getSuggestedWordsForTest(); 5270aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi assertEquals("Beginning-of-Sentence prediction after inputting 2 times.", "Barack", 5280aef59746c6dd32ea3e3ed0d25b5fbc33e4605d8Keisuke Kuroyanagi suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 5296bca9ac43d0db9a83b02577783cc609ecf13e3f4Jean Chalard } 530fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard 531fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard public void testPredictionsAfterRecorrection() { 532fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String PREFIX = "A "; 533fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String WORD_TO_TYPE = "Barack"; 534fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final String FIRST_NON_TYPED_SUGGESTION = "Barrack"; 535fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfPrefix = PREFIX.length(); 536fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfWord = endOfPrefix + WORD_TO_TYPE.length(); 537fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int endOfSuggestion = endOfPrefix + FIRST_NON_TYPED_SUGGESTION.length(); 538fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard final int indexForManualCursor = endOfPrefix + 3; // +3 because it's after "Bar" in "Barack" 539fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(PREFIX); 540fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mLatinIME.onUpdateSelection(0, 0, endOfPrefix, endOfPrefix, -1, -1); 541fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(WORD_TO_TYPE); 5423fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(FIRST_NON_TYPED_SUGGESTION); 543fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mLatinIME.onUpdateSelection(endOfPrefix, endOfPrefix, endOfSuggestion, endOfSuggestion, 544fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard -1, -1); 545fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 546fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard type(" "); 547fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mLatinIME.onUpdateSelection(endOfSuggestion, endOfSuggestion, 548fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard endOfSuggestion + 1, endOfSuggestion + 1, -1, -1); 549fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 550fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 551fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard // Simulate a manual cursor move 552fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mInputConnection.setSelection(indexForManualCursor, indexForManualCursor); 553fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mLatinIME.onUpdateSelection(endOfSuggestion + 1, endOfSuggestion + 1, 554fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard indexForManualCursor, indexForManualCursor, -1, -1); 555fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 556fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 5573fb5a541a44bc9a82663895fd09c342299f45b56Jean Chalard pickSuggestionManually(WORD_TO_TYPE); 558fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard mLatinIME.onUpdateSelection(indexForManualCursor, indexForManualCursor, 559fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard endOfWord, endOfWord, -1, -1); 560fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 561fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard runMessages(); 562fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard // Test the first prediction is displayed 563fbb8cb5a82a4f760884c2ebca62cc7965c455ed2Jean Chalard final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest(); 564fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard assertEquals("predictions after recorrection", "Obama", 565fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null); 566fe92c174ea08f9f593432f0ab20961700de9e027Jean Chalard } 5671079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard 5681079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard public void testComposingMultipleBackspace() { 5691079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final String WORD_TO_TYPE = "radklro"; 5701079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final int TIMES_TO_TYPE = 3; 5711079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard final int TIMES_TO_BACKSPACE = 8; 5721079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 5731079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5741079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5751079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5761079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 5771079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5781079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5791079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(WORD_TO_TYPE); 5801079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5811079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5821079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard type(Constants.CODE_DELETE); 5831079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard assertEquals("composing with multiple backspace", 5841079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard WORD_TO_TYPE.length() * TIMES_TO_TYPE - TIMES_TO_BACKSPACE, 5851079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard mEditText.getText().length()); 5861079665c3c017ee024a2ffdaf3488cc8c37f087aJean Chalard } 5878e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 5888e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testManySingleQuotes() { 5898e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_AUTOCORRECT = "i"; 5908e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_AUTOCORRECTED = "I"; 5918e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String QUOTES = "''''''''''''''''''''"; 5928e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " "; 5938e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " "; 5948e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE); 5958e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("auto-correct with many trailing single quotes", EXPECTED_RESULT, 5968e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 5978e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 5988e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 5998e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testManySingleQuotesOneByOne() { 6008e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_AUTOCORRECT = "i"; 6018e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_AUTOCORRECTED = "I"; 6028e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String QUOTES = "''''''''''''''''''''"; 6038e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " "; 6048e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " "; 6058e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6068e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 6078e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE.substring(i, i+1)); 6088e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 6098e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard runMessages(); 6108e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6118e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("type many trailing single quotes one by one", EXPECTED_RESULT, 6128e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 6138e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6148e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard 6158e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard public void testTypingSingleQuotesOneByOne() { 6168e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String WORD_TO_TYPE = "it's "; 6178e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard final String EXPECTED_RESULT = WORD_TO_TYPE; 6188e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard for (int i = 0; i < WORD_TO_TYPE.length(); ++i) { 6198e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard type(WORD_TO_TYPE.substring(i, i+1)); 6208e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard sleep(DELAY_TO_WAIT_FOR_PREDICTIONS); 6218e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard runMessages(); 6228e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6238e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard assertEquals("type words letter by letter", EXPECTED_RESULT, 6248e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard mEditText.getText().toString()); 6258e829c37dff9fb5eec62390bf0e2c6f12fd6781bJean Chalard } 6265ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard 6275ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard public void testSwitchLanguages() { 6285ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard final String WORD_TO_TYPE_FIRST_PART = "com"; 6295ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard final String WORD_TO_TYPE_SECOND_PART = "md "; 6305ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard final String EXPECTED_RESULT = "comme "; 6315ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard changeLanguage("en"); 6325ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard type(WORD_TO_TYPE_FIRST_PART); 6335ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard changeLanguage("fr"); 6345ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard type(WORD_TO_TYPE_SECOND_PART); 6355ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard assertEquals("Composing continues after switching languages", EXPECTED_RESULT, 6365ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard mEditText.getText().toString()); 6375ce39dfa782031fd53af167c0fd9a9bc63d21149Jean Chalard } 63883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard} 639