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