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