InputLogicTests.java revision 516b63db2866f144a00ec7e1e6c29cb0865f5ff3
183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard/*
283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * Copyright (C) 2012 The Android Open Source Project
383c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard *
483c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * Licensed under the Apache License, Version 2.0 (the "License"); you may not
583c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * use this file except in compliance with the License. You may obtain a copy of
683c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * the License at
783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard *
883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * http://www.apache.org/licenses/LICENSE-2.0
983c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard *
1083c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * Unless required by applicable law or agreed to in writing, software
1183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1283c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1383c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * License for the specific language governing permissions and limitations under
1483c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard * the License.
1583c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard */
1683c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard
1783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalardpackage com.android.inputmethod.latin;
1883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard
198592ed408e8e81138172eefe2df28f00807a1e1fJean Chalardpublic class InputLogicTests extends InputTestsBase {
20f717c5685e3299349d5abe1ecc7d13446b9779bcJean Chalard
2183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard    public void testTypeWord() {
221e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        final String WORD_TO_TYPE = "abcd";
231e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        type(WORD_TO_TYPE);
241e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        assertEquals("type word", WORD_TO_TYPE, mTextView.getText().toString());
2583c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard    }
2683c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard
2783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard    public void testPickSuggestionThenBackspace() {
289159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        final String WORD_TO_TYPE = "this";
29f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        final String EXPECTED_RESULT = "thi";
301e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        type(WORD_TO_TYPE);
319bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD_TO_TYPE);
329159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
33240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
349159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        assertEquals("press suggestion then backspace", EXPECTED_RESULT,
359159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard                mTextView.getText().toString());
369159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard    }
379159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard
38bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    public void testPickAutoCorrectionThenBackspace() {
39bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String WORD_TO_TYPE = "tgis";
40bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String WORD_TO_PICK = "this";
41f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        final String EXPECTED_RESULT = "thi";
42bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        type(WORD_TO_TYPE);
43bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        // Choose the auto-correction, which is always in position 0. For "tgis", the
44bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        // auto-correction should be "this".
459bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD_TO_PICK);
46bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
47bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("pick typed word over auto-correction then backspace", WORD_TO_PICK,
48bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
49240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
50bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT,
51bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
52bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    }
53bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard
549159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard    public void testPickTypedWordOverAutoCorrectionThenBackspace() {
559159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        final String WORD_TO_TYPE = "tgis";
56f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        final String EXPECTED_RESULT = "tgi";
579159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        type(WORD_TO_TYPE);
589159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        // Choose the typed word, which should be in position 1 (because position 0 should
599159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        // be occupied by the "this" auto-correction, as checked by testAutoCorrect())
609bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(1, WORD_TO_TYPE);
619159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
62bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("pick typed word over auto-correction then backspace", WORD_TO_TYPE,
63bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
64240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
659159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard        assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT,
661e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard                mTextView.getText().toString());
6783c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard    }
6883c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard
69bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    public void testPickDifferentSuggestionThenBackspace() {
70bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String WORD_TO_TYPE = "tgis";
71bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String WORD_TO_PICK = "thus";
72f83a6821bbf3863415378ea39d3b705954318e41Jean Chalard        final String EXPECTED_RESULT = "thu";
73bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        type(WORD_TO_TYPE);
74bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        // Choose the second suggestion, which should be in position 2 and should be "thus"
75bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        // when "tgis is typed.
769bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(2, WORD_TO_PICK);
77bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
78bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("pick different suggestion then backspace", WORD_TO_PICK,
79bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
80240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
81bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("pick different suggestion then backspace", EXPECTED_RESULT,
82bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
83bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    }
84bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard
851e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard    public void testDeleteSelection() {
861e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        final String STRING_TO_TYPE = "some text delete me some text";
872752287c425b9be87800136bd616ee63940caaacJean Chalard        final int typedLength = STRING_TO_TYPE.length();
881e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        final int SELECTION_START = 10;
891e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        final int SELECTION_END = 19;
901e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        final String EXPECTED_RESULT = "some text  some text";
911e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        type(STRING_TO_TYPE);
921e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        // There is no IMF to call onUpdateSelection for us so we must do it by hand.
931e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        // Send once to simulate the cursor actually responding to the move caused by typing.
941e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
951e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        // move with a move triggered by LatinIME inputting stuff.
962752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
971e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        mInputConnection.setSelection(SELECTION_START, SELECTION_END);
981e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        // And now we simulate the user actually selecting some text.
992752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
1002752287c425b9be87800136bd616ee63940caaacJean Chalard                SELECTION_START, SELECTION_END, -1, -1);
101240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
1021e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard        assertEquals("delete selection", EXPECTED_RESULT, mTextView.getText().toString());
103516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard    }
104516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard
105516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard    public void testDeleteSelectionTwice() {
106516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        final String STRING_TO_TYPE = "some text delete me some text";
107516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        final int typedLength = STRING_TO_TYPE.length();
108516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        final int SELECTION_START = 10;
109516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        final int SELECTION_END = 19;
110516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        final String EXPECTED_RESULT = "some text some text";
111516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        type(STRING_TO_TYPE);
112516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        // There is no IMF to call onUpdateSelection for us so we must do it by hand.
113516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        // Send once to simulate the cursor actually responding to the move caused by typing.
114516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
115516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        // move with a move triggered by LatinIME inputting stuff.
116516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
117516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        mInputConnection.setSelection(SELECTION_START, SELECTION_END);
118516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        // And now we simulate the user actually selecting some text.
119516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
120516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard                SELECTION_START, SELECTION_END, -1, -1);
121516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        type(Constants.CODE_DELETE);
122516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        type(Constants.CODE_DELETE);
123516b63db2866f144a00ec7e1e6c29cb0865f5ff3Jean Chalard        assertEquals("delete selection twice", EXPECTED_RESULT, mTextView.getText().toString());
1241e4684ad24914cde713980bb4174810bbf8bae10Jean Chalard    }
1250bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard
1260bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard    public void testAutoCorrect() {
1270bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard        final String STRING_TO_TYPE = "tgis ";
1280bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard        final String EXPECTED_RESULT = "this ";
1290bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard        type(STRING_TO_TYPE);
1300bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard        assertEquals("simple auto-correct", EXPECTED_RESULT, mTextView.getText().toString());
131bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    }
132bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard
133bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    public void testAutoCorrectWithPeriod() {
134bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String STRING_TO_TYPE = "tgis.";
135bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String EXPECTED_RESULT = "this.";
136bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        type(STRING_TO_TYPE);
137bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("auto-correct with period", EXPECTED_RESULT, mTextView.getText().toString());
138bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    }
139bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard
140bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard    public void testAutoCorrectWithPeriodThenRevert() {
141bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String STRING_TO_TYPE = "tgis.";
142bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        final String EXPECTED_RESULT = "tgis.";
143bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        type(STRING_TO_TYPE);
144bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
145240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
146bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard        assertEquals("auto-correct with period then revert", EXPECTED_RESULT,
147bb15f92d4f80677587fae87fa2dd7a29ec465b4cJean Chalard                mTextView.getText().toString());
1480bfe359ee42af9c4487ce56acf42c74a2510980dJean Chalard    }
14960e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard
1500e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard    public void testAutoCorrectWithSpaceThenRevert() {
1510e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        final String STRING_TO_TYPE = "tgis ";
1520e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        final String EXPECTED_RESULT = "tgis ";
1530e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        type(STRING_TO_TYPE);
1540e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
155240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
1560e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        assertEquals("auto-correct with space then revert", EXPECTED_RESULT,
1570e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard                mTextView.getText().toString());
1580e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard    }
1590e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard
1600e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard    public void testAutoCorrectToSelfDoesNotRevert() {
1610e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        final String STRING_TO_TYPE = "this ";
1620e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        final String EXPECTED_RESULT = "this";
1630e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        type(STRING_TO_TYPE);
1640e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
165240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
1660e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard        assertEquals("auto-correct with space does not revert", EXPECTED_RESULT,
1670e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard                mTextView.getText().toString());
1680e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard    }
1690e9e7e337defe97d4ede8c59d0e925f5401f9292Jean Chalard
17060e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard    public void testDoubleSpace() {
17160e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        final String STRING_TO_TYPE = "this  ";
17260e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        final String EXPECTED_RESULT = "this. ";
17360e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        type(STRING_TO_TYPE);
17460e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        assertEquals("double space make a period", EXPECTED_RESULT, mTextView.getText().toString());
17560e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard    }
17660e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard
17760e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard    public void testCancelDoubleSpace() {
178fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard        final String STRING_TO_TYPE = "this  ";
17960e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        final String EXPECTED_RESULT = "this  ";
18060e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        type(STRING_TO_TYPE);
181240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
18260e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard        assertEquals("double space make a period", EXPECTED_RESULT, mTextView.getText().toString());
183a02e703289d2704963f140c44d630dcc0a65e34aJean Chalard    }
18441df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard
18541df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard    public void testBackspaceAtStartAfterAutocorrect() {
18641df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard        final String STRING_TO_TYPE = "tgis ";
1872752287c425b9be87800136bd616ee63940caaacJean Chalard        final int typedLength = STRING_TO_TYPE.length();
18841df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard        final String EXPECTED_RESULT = "this ";
18941df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard        final int NEW_CURSOR_POSITION = 0;
19041df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard        type(STRING_TO_TYPE);
1912752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
19241df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard        mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
1932752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
1942752287c425b9be87800136bd616ee63940caaacJean Chalard                NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
195240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
196fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard        assertEquals("auto correct then move cursor to start of line then backspace",
19741df8a98fd0b89de87c7531903262c75dc7e505bJean Chalard                EXPECTED_RESULT, mTextView.getText().toString());
19860e7718462a8c7b025ac8375b585c1da3db1e1feJean Chalard    }
1999184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard
2009184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard    public void testAutoCorrectThenMoveCursorThenBackspace() {
2019184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard        final String STRING_TO_TYPE = "and tgis ";
2022752287c425b9be87800136bd616ee63940caaacJean Chalard        final int typedLength = STRING_TO_TYPE.length();
2039184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard        final String EXPECTED_RESULT = "andthis ";
2049184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard        final int NEW_CURSOR_POSITION = STRING_TO_TYPE.indexOf('t');
2059184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard        type(STRING_TO_TYPE);
2062752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
2079184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard        mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
2082752287c425b9be87800136bd616ee63940caaacJean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
2092752287c425b9be87800136bd616ee63940caaacJean Chalard                NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
210240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        type(Constants.CODE_DELETE);
211fb684cebe8f5dac1bdb6cfa7085a07ddc66acedeJean Chalard        assertEquals("auto correct then move cursor then backspace",
2129184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard                EXPECTED_RESULT, mTextView.getText().toString());
2139184d8b2352e11a25026ea9eed7f404836a7d476Jean Chalard    }
214cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard
215cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    public void testNoSpaceAfterManualPick() {
216cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD_TO_TYPE = "this";
217cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String EXPECTED_RESULT = WORD_TO_TYPE;
218cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD_TO_TYPE);
2199bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD_TO_TYPE);
220cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        assertEquals("no space after manual pick", EXPECTED_RESULT,
221cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard                mTextView.getText().toString());
222cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    }
223cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard
224cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    public void testManualPickThenType() {
225cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD1_TO_TYPE = "this";
226cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD2_TO_TYPE = "is";
227cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String EXPECTED_RESULT = "this is";
228cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD1_TO_TYPE);
2299bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD1_TO_TYPE);
230cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD2_TO_TYPE);
231cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        assertEquals("manual pick then type", EXPECTED_RESULT, mTextView.getText().toString());
232cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    }
233cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard
234cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    public void testManualPickThenSeparator() {
235cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD1_TO_TYPE = "this";
236cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD2_TO_TYPE = "!";
237cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String EXPECTED_RESULT = "this!";
238cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD1_TO_TYPE);
2399bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD1_TO_TYPE);
240cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD2_TO_TYPE);
241cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        assertEquals("manual pick then separator", EXPECTED_RESULT, mTextView.getText().toString());
242cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    }
243cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard
244f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard    public void testManualPickThenStripperThenPick() {
245f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        final String WORD_TO_TYPE = "this";
246f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        final String STRIPPER = "\n";
247f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        final String EXPECTED_RESULT = "this\nthis";
248f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        type(WORD_TO_TYPE);
249f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        pickSuggestionManually(0, WORD_TO_TYPE);
250f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        type(STRIPPER);
251f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        type(WORD_TO_TYPE);
252f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        pickSuggestionManually(0, WORD_TO_TYPE);
253f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard        assertEquals("manual pick then \\n then manual pick", EXPECTED_RESULT,
254f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard                mTextView.getText().toString());
255f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard    }
256f68fe7a9c9262a3591eeba61f34a91855a34c930Jean Chalard
257cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard    public void testManualPickThenSpaceThenType() {
258cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD1_TO_TYPE = "this";
259cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String WORD2_TO_TYPE = " is";
260cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        final String EXPECTED_RESULT = "this is";
261cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD1_TO_TYPE);
2629bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD1_TO_TYPE);
263cca2183f5a9174b94e39e68fab9bc749c86743efJean Chalard        type(WORD2_TO_TYPE);
264845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        assertEquals("manual pick then space then type", EXPECTED_RESULT,
265845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard                mTextView.getText().toString());
266845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard    }
267845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard
268845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard    public void testManualPickThenManualPick() {
269845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        final String WORD1_TO_TYPE = "this";
270845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        final String WORD2_TO_PICK = "is";
271845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        final String EXPECTED_RESULT = "this is";
272845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        type(WORD1_TO_TYPE);
2739bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(0, WORD1_TO_TYPE);
274845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        // Here we fake picking a word through bigram prediction. This test is taking
275845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        // advantage of the fact that Latin IME blindly trusts the caller of #pickSuggestionManually
276845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        // to actually pass the right string.
2779bfb6202154e06d7156f2f374dd9359f1be4eb68Kurt Partridge        pickSuggestionManually(1, WORD2_TO_PICK);
278845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard        assertEquals("manual pick then manual pick", EXPECTED_RESULT,
279845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard                mTextView.getText().toString());
280845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard    }
281845b24d9d31072b98958c557366617ad1c34f1b7Jean Chalard
282825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard    public void testDeleteWholeComposingWord() {
283825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard        final String WORD_TO_TYPE = "this";
284825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard        type(WORD_TO_TYPE);
285825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard        for (int i = 0; i < WORD_TO_TYPE.length(); ++i) {
286240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka            type(Constants.CODE_DELETE);
287825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard        }
288825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard        assertEquals("delete whole composing word", "", mTextView.getText().toString());
289825e2bbd910cce3055a4ca808d3744bc0b2ceddaJean Chalard    }
2909159b9953d857de83ae2f90a121fcd259f5ee01dJean Chalard    // TODO: Add some tests for non-BMP characters
29183c72d1dae7e91ba8ae50d79b11b1c0dd67451c2Jean Chalard}
292