1c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard/*
2c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * Copyright (C) 2013 The Android Open Source Project
3c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard *
4c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * Licensed under the Apache License, Version 2.0 (the "License");
5c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * you may not use this file except in compliance with the License.
6c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * You may obtain a copy of the License at
7c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard *
8c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard *      http://www.apache.org/licenses/LICENSE-2.0
9c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard *
10c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * Unless required by applicable law or agreed to in writing, software
11c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * distributed under the License is distributed on an "AS IS" BASIS,
12c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * See the License for the specific language governing permissions and
14c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard * limitations under the License.
15c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard */
16c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
17c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardpackage com.android.inputmethod.latin;
18c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
19c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardimport android.test.suitebuilder.annotation.LargeTest;
20c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardimport android.view.inputmethod.BaseInputConnection;
21c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
229342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants;
239342484e8d573a40f470b6a593df31c602fa4076Ken Wakasa
24c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard@LargeTest
25c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalardpublic class InputLogicTestsLanguageWithoutSpaces extends InputTestsBase {
26c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    public void testAutoCorrectForLanguageWithoutSpaces() {
27c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String STRING_TO_TYPE = "tgis is";
28c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String EXPECTED_RESULT = "thisis";
29c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
30c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(STRING_TO_TYPE);
31c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("simple auto-correct for language without spaces", EXPECTED_RESULT,
32c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                mEditText.getText().toString());
33c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    }
34c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
35c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    public void testRevertAutoCorrectForLanguageWithoutSpaces() {
36c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String STRING_TO_TYPE = "tgis ";
37c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String EXPECTED_INTERMEDIATE_RESULT = "this";
38c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String EXPECTED_FINAL_RESULT = "tgis";
39c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
40c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(STRING_TO_TYPE);
41c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("simple auto-correct for language without spaces",
42c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                EXPECTED_INTERMEDIATE_RESULT, mEditText.getText().toString());
43c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(Constants.CODE_DELETE);
44c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("simple auto-correct for language without spaces",
45c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                EXPECTED_FINAL_RESULT, mEditText.getText().toString());
46c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        // Check we are back to composing the word
47c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", 0,
48c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
49c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", 4,
50c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
51c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    }
52c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
53c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    public void testDontResumeSuggestionOnBackspace() {
54c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String WORD_TO_TYPE = "and this ";
55c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
56c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(WORD_TO_TYPE);
57c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", -1,
58c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
59c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", -1,
60c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
61c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(" ");
62c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(Constants.CODE_DELETE);
63c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", -1,
64c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
65c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("don't resume suggestion on backspace", -1,
66c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
67c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    }
68c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
69c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    public void testStartComposingInsideText() {
70c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String WORD_TO_TYPE = "abcdefgh ";
71c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final int typedLength = WORD_TO_TYPE.length() - 1; // -1 because space gets eaten
72c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final int CURSOR_POS = 4;
73c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
74c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(WORD_TO_TYPE);
75c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
76c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        mInputConnection.setSelection(CURSOR_POS, CURSOR_POS);
77c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
78c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                CURSOR_POS, CURSOR_POS, -1, -1);
799ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
80c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        runMessages();
81c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("start composing inside text", -1,
82c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
83c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("start composing inside text", -1,
84c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
85c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type("xxxx");
86c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("start composing inside text", 4,
87c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
88c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("start composing inside text", 8,
89c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
90c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    }
91c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard
928e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard    public void testMovingCursorInsideWordAndType() {
938e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        final String WORD_TO_TYPE = "abcdefgh";
948e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        final int typedLength = WORD_TO_TYPE.length();
958e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        final int CURSOR_POS = 4;
968e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
978e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        type(WORD_TO_TYPE);
988e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, 0, typedLength);
998e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
1008e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        runMessages();
1018e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        mInputConnection.setSelection(CURSOR_POS, CURSOR_POS);
1028e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        mLatinIME.onUpdateSelection(typedLength, typedLength,
1038e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard                CURSOR_POS, CURSOR_POS, 0, typedLength);
1048e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
1058e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        runMessages();
1068e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        assertEquals("move cursor inside text", 0,
1078e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
1088e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        assertEquals("move cursor inside text", typedLength,
1098e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
1108e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        type("x");
1118e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
1128e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
1138e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        runMessages();
1148e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        assertEquals("start typing while cursor inside composition", CURSOR_POS,
1158e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard                BaseInputConnection.getComposingSpanStart(mEditText.getText()));
1168e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard        assertEquals("start typing while cursor inside composition", CURSOR_POS + 1,
1178e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard                BaseInputConnection.getComposingSpanEnd(mEditText.getText()));
1188e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard    }
1198e235191dd3501fc3562fe0654d41501ec9760d0Jean Chalard
120c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    public void testPredictions() {
121c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        final String WORD_TO_TYPE = "Barack ";
122c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        changeKeyboardLocaleAndDictLocale("th", "en_US");
123c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        type(WORD_TO_TYPE);
1249ddbee8570af667b5b325ae4136853aaea85c5b9Jean Chalard        sleep(DELAY_TO_WAIT_FOR_PREDICTIONS_MILLIS);
125c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        runMessages();
126c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        // Make sure there is no space
127c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("predictions in lang without spaces", "Barack",
128c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard                mEditText.getText().toString());
129c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        // Test the first prediction is displayed
13063be066544f19928d6a29c58c028cce7c95fa457Jean Chalard        final SuggestedWords suggestedWords = mLatinIME.getSuggestedWordsForTest();
131c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard        assertEquals("predictions in lang without spaces", "Obama",
132dfbe2bfe089b301819039e9b3a7d2c307e6beac7Jean Chalard                suggestedWords.size() > 0 ? suggestedWords.getWord(0) : null);
133c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard    }
134c239a34262358e51aedb15f2e315bbe9bcd57c4bJean Chalard}
135