Home | History | Annotate | Download | only in latin
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.latin;
     18 
     19 import android.test.suitebuilder.annotation.LargeTest;
     20 
     21 @LargeTest
     22 public class InputLogicTests extends InputTestsBase {
     23 
     24     public void testTypeWord() {
     25         final String WORD_TO_TYPE = "abcd";
     26         type(WORD_TO_TYPE);
     27         assertEquals("type word", WORD_TO_TYPE, mEditText.getText().toString());
     28     }
     29 
     30     public void testPickSuggestionThenBackspace() {
     31         final String WORD_TO_TYPE = "this";
     32         final String EXPECTED_RESULT = "thi";
     33         type(WORD_TO_TYPE);
     34         pickSuggestionManually(0, WORD_TO_TYPE);
     35         mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
     36         type(Constants.CODE_DELETE);
     37         assertEquals("press suggestion then backspace", EXPECTED_RESULT,
     38                 mEditText.getText().toString());
     39     }
     40 
     41     public void testPickAutoCorrectionThenBackspace() {
     42         final String WORD_TO_TYPE = "tgis";
     43         final String WORD_TO_PICK = "this";
     44         final String EXPECTED_RESULT = "thi";
     45         type(WORD_TO_TYPE);
     46         // Choose the auto-correction, which is always in position 0. For "tgis", the
     47         // auto-correction should be "this".
     48         pickSuggestionManually(0, WORD_TO_PICK);
     49         mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
     50         assertEquals("pick typed word over auto-correction then backspace", WORD_TO_PICK,
     51                 mEditText.getText().toString());
     52         type(Constants.CODE_DELETE);
     53         assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT,
     54                 mEditText.getText().toString());
     55     }
     56 
     57     public void testPickTypedWordOverAutoCorrectionThenBackspace() {
     58         final String WORD_TO_TYPE = "tgis";
     59         final String EXPECTED_RESULT = "tgi";
     60         type(WORD_TO_TYPE);
     61         // Choose the typed word, which should be in position 1 (because position 0 should
     62         // be occupied by the "this" auto-correction, as checked by testAutoCorrect())
     63         pickSuggestionManually(1, WORD_TO_TYPE);
     64         mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
     65         assertEquals("pick typed word over auto-correction then backspace", WORD_TO_TYPE,
     66                 mEditText.getText().toString());
     67         type(Constants.CODE_DELETE);
     68         assertEquals("pick typed word over auto-correction then backspace", EXPECTED_RESULT,
     69                 mEditText.getText().toString());
     70     }
     71 
     72     public void testPickDifferentSuggestionThenBackspace() {
     73         final String WORD_TO_TYPE = "tgis";
     74         final String WORD_TO_PICK = "thus";
     75         final String EXPECTED_RESULT = "thu";
     76         type(WORD_TO_TYPE);
     77         // Choose the second suggestion, which should be in position 2 and should be "thus"
     78         // when "tgis is typed.
     79         pickSuggestionManually(2, WORD_TO_PICK);
     80         mLatinIME.onUpdateSelection(0, 0, WORD_TO_TYPE.length(), WORD_TO_TYPE.length(), -1, -1);
     81         assertEquals("pick different suggestion then backspace", WORD_TO_PICK,
     82                 mEditText.getText().toString());
     83         type(Constants.CODE_DELETE);
     84         assertEquals("pick different suggestion then backspace", EXPECTED_RESULT,
     85                 mEditText.getText().toString());
     86     }
     87 
     88     public void testDeleteSelection() {
     89         final String STRING_TO_TYPE = "some text delete me some text";
     90         final int typedLength = STRING_TO_TYPE.length();
     91         final int SELECTION_START = 10;
     92         final int SELECTION_END = 19;
     93         final String EXPECTED_RESULT = "some text  some text";
     94         type(STRING_TO_TYPE);
     95         // There is no IMF to call onUpdateSelection for us so we must do it by hand.
     96         // Send once to simulate the cursor actually responding to the move caused by typing.
     97         // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
     98         // move with a move triggered by LatinIME inputting stuff.
     99         mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
    100         mInputConnection.setSelection(SELECTION_START, SELECTION_END);
    101         // And now we simulate the user actually selecting some text.
    102         mLatinIME.onUpdateSelection(typedLength, typedLength,
    103                 SELECTION_START, SELECTION_END, -1, -1);
    104         type(Constants.CODE_DELETE);
    105         assertEquals("delete selection", EXPECTED_RESULT, mEditText.getText().toString());
    106     }
    107 
    108     public void testDeleteSelectionTwice() {
    109         final String STRING_TO_TYPE = "some text delete me some text";
    110         final int typedLength = STRING_TO_TYPE.length();
    111         final int SELECTION_START = 10;
    112         final int SELECTION_END = 19;
    113         final String EXPECTED_RESULT = "some text some text";
    114         type(STRING_TO_TYPE);
    115         // There is no IMF to call onUpdateSelection for us so we must do it by hand.
    116         // Send once to simulate the cursor actually responding to the move caused by typing.
    117         // This is necessary because LatinIME is bookkeeping to avoid confusing a real cursor
    118         // move with a move triggered by LatinIME inputting stuff.
    119         mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
    120         mInputConnection.setSelection(SELECTION_START, SELECTION_END);
    121         // And now we simulate the user actually selecting some text.
    122         mLatinIME.onUpdateSelection(typedLength, typedLength,
    123                 SELECTION_START, SELECTION_END, -1, -1);
    124         type(Constants.CODE_DELETE);
    125         type(Constants.CODE_DELETE);
    126         assertEquals("delete selection twice", EXPECTED_RESULT, mEditText.getText().toString());
    127     }
    128 
    129     public void testAutoCorrect() {
    130         final String STRING_TO_TYPE = "tgis ";
    131         final String EXPECTED_RESULT = "this ";
    132         type(STRING_TO_TYPE);
    133         assertEquals("simple auto-correct", EXPECTED_RESULT, mEditText.getText().toString());
    134     }
    135 
    136     public void testAutoCorrectWithPeriod() {
    137         final String STRING_TO_TYPE = "tgis.";
    138         final String EXPECTED_RESULT = "this.";
    139         type(STRING_TO_TYPE);
    140         assertEquals("auto-correct with period", EXPECTED_RESULT, mEditText.getText().toString());
    141     }
    142 
    143     public void testAutoCorrectWithPeriodThenRevert() {
    144         final String STRING_TO_TYPE = "tgis.";
    145         final String EXPECTED_RESULT = "tgis.";
    146         type(STRING_TO_TYPE);
    147         mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
    148         type(Constants.CODE_DELETE);
    149         assertEquals("auto-correct with period then revert", EXPECTED_RESULT,
    150                 mEditText.getText().toString());
    151     }
    152 
    153     public void testAutoCorrectWithSpaceThenRevert() {
    154         final String STRING_TO_TYPE = "tgis ";
    155         final String EXPECTED_RESULT = "tgis ";
    156         type(STRING_TO_TYPE);
    157         mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
    158         type(Constants.CODE_DELETE);
    159         assertEquals("auto-correct with space then revert", EXPECTED_RESULT,
    160                 mEditText.getText().toString());
    161     }
    162 
    163     public void testAutoCorrectToSelfDoesNotRevert() {
    164         final String STRING_TO_TYPE = "this ";
    165         final String EXPECTED_RESULT = "this";
    166         type(STRING_TO_TYPE);
    167         mLatinIME.onUpdateSelection(0, 0, STRING_TO_TYPE.length(), STRING_TO_TYPE.length(), -1, -1);
    168         type(Constants.CODE_DELETE);
    169         assertEquals("auto-correct with space does not revert", EXPECTED_RESULT,
    170                 mEditText.getText().toString());
    171     }
    172 
    173     public void testDoubleSpace() {
    174         final String STRING_TO_TYPE = "this  ";
    175         final String EXPECTED_RESULT = "this. ";
    176         type(STRING_TO_TYPE);
    177         assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString());
    178     }
    179 
    180     public void testCancelDoubleSpace() {
    181         final String STRING_TO_TYPE = "this  ";
    182         final String EXPECTED_RESULT = "this  ";
    183         type(STRING_TO_TYPE);
    184         type(Constants.CODE_DELETE);
    185         assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString());
    186     }
    187 
    188     public void testBackspaceAtStartAfterAutocorrect() {
    189         final String STRING_TO_TYPE = "tgis ";
    190         final int typedLength = STRING_TO_TYPE.length();
    191         final String EXPECTED_RESULT = "this ";
    192         final int NEW_CURSOR_POSITION = 0;
    193         type(STRING_TO_TYPE);
    194         mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
    195         mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
    196         mLatinIME.onUpdateSelection(typedLength, typedLength,
    197                 NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
    198         type(Constants.CODE_DELETE);
    199         assertEquals("auto correct then move cursor to start of line then backspace",
    200                 EXPECTED_RESULT, mEditText.getText().toString());
    201     }
    202 
    203     public void testAutoCorrectThenMoveCursorThenBackspace() {
    204         final String STRING_TO_TYPE = "and tgis ";
    205         final int typedLength = STRING_TO_TYPE.length();
    206         final String EXPECTED_RESULT = "andthis ";
    207         final int NEW_CURSOR_POSITION = STRING_TO_TYPE.indexOf('t');
    208         type(STRING_TO_TYPE);
    209         mLatinIME.onUpdateSelection(0, 0, typedLength, typedLength, -1, -1);
    210         mInputConnection.setSelection(NEW_CURSOR_POSITION, NEW_CURSOR_POSITION);
    211         mLatinIME.onUpdateSelection(typedLength, typedLength,
    212                 NEW_CURSOR_POSITION, NEW_CURSOR_POSITION, -1, -1);
    213         type(Constants.CODE_DELETE);
    214         assertEquals("auto correct then move cursor then backspace",
    215                 EXPECTED_RESULT, mEditText.getText().toString());
    216     }
    217 
    218     public void testNoSpaceAfterManualPick() {
    219         final String WORD_TO_TYPE = "this";
    220         final String EXPECTED_RESULT = WORD_TO_TYPE;
    221         type(WORD_TO_TYPE);
    222         pickSuggestionManually(0, WORD_TO_TYPE);
    223         assertEquals("no space after manual pick", EXPECTED_RESULT,
    224                 mEditText.getText().toString());
    225     }
    226 
    227     public void testManualPickThenType() {
    228         final String WORD1_TO_TYPE = "this";
    229         final String WORD2_TO_TYPE = "is";
    230         final String EXPECTED_RESULT = "this is";
    231         type(WORD1_TO_TYPE);
    232         pickSuggestionManually(0, WORD1_TO_TYPE);
    233         type(WORD2_TO_TYPE);
    234         assertEquals("manual pick then type", EXPECTED_RESULT, mEditText.getText().toString());
    235     }
    236 
    237     public void testManualPickThenSeparator() {
    238         final String WORD1_TO_TYPE = "this";
    239         final String WORD2_TO_TYPE = "!";
    240         final String EXPECTED_RESULT = "this!";
    241         type(WORD1_TO_TYPE);
    242         pickSuggestionManually(0, WORD1_TO_TYPE);
    243         type(WORD2_TO_TYPE);
    244         assertEquals("manual pick then separator", EXPECTED_RESULT, mEditText.getText().toString());
    245     }
    246 
    247     public void testManualPickThenStripperThenPick() {
    248         final String WORD_TO_TYPE = "this";
    249         final String STRIPPER = "\n";
    250         final String EXPECTED_RESULT = "this\nthis";
    251         type(WORD_TO_TYPE);
    252         pickSuggestionManually(0, WORD_TO_TYPE);
    253         type(STRIPPER);
    254         type(WORD_TO_TYPE);
    255         pickSuggestionManually(0, WORD_TO_TYPE);
    256         assertEquals("manual pick then \\n then manual pick", EXPECTED_RESULT,
    257                 mEditText.getText().toString());
    258     }
    259 
    260     public void testManualPickThenSpaceThenType() {
    261         final String WORD1_TO_TYPE = "this";
    262         final String WORD2_TO_TYPE = " is";
    263         final String EXPECTED_RESULT = "this is";
    264         type(WORD1_TO_TYPE);
    265         pickSuggestionManually(0, WORD1_TO_TYPE);
    266         type(WORD2_TO_TYPE);
    267         assertEquals("manual pick then space then type", EXPECTED_RESULT,
    268                 mEditText.getText().toString());
    269     }
    270 
    271     public void testManualPickThenManualPick() {
    272         final String WORD1_TO_TYPE = "this";
    273         final String WORD2_TO_PICK = "is";
    274         final String EXPECTED_RESULT = "this is";
    275         type(WORD1_TO_TYPE);
    276         pickSuggestionManually(0, WORD1_TO_TYPE);
    277         // Here we fake picking a word through bigram prediction. This test is taking
    278         // advantage of the fact that Latin IME blindly trusts the caller of #pickSuggestionManually
    279         // to actually pass the right string.
    280         pickSuggestionManually(1, WORD2_TO_PICK);
    281         assertEquals("manual pick then manual pick", EXPECTED_RESULT,
    282                 mEditText.getText().toString());
    283     }
    284 
    285     public void testDeleteWholeComposingWord() {
    286         final String WORD_TO_TYPE = "this";
    287         type(WORD_TO_TYPE);
    288         for (int i = 0; i < WORD_TO_TYPE.length(); ++i) {
    289             type(Constants.CODE_DELETE);
    290         }
    291         assertEquals("delete whole composing word", "", mEditText.getText().toString());
    292     }
    293     // TODO: Add some tests for non-BMP characters
    294 }
    295