1 /*
2  * Copyright (C) 2014 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.os.Build;
20 import android.test.suitebuilder.annotation.LargeTest;
21 import android.text.TextUtils;
22 import android.view.inputmethod.EditorInfo;
23 
24 import com.android.inputmethod.latin.Constants;
25 import com.android.inputmethod.latin.WordComposer;
26 
27 @LargeTest
28 public class ShiftModeTests extends InputTestsBase {
29 
30     @Override
enrichEditorInfo(final EditorInfo ei)31     protected EditorInfo enrichEditorInfo(final EditorInfo ei) {
32         ei.inputType |= TextUtils.CAP_MODE_SENTENCES;
33         ei.initialCapsMode = TextUtils.CAP_MODE_SENTENCES;
34         return ei;
35     }
36 
isCapsModeAutoShifted()37     private boolean isCapsModeAutoShifted() {
38         return mLatinIME.mKeyboardSwitcher.getKeyboardShiftMode()
39                 == WordComposer.CAPS_MODE_AUTO_SHIFTED;
40     }
41 
testTypicalSentence()42     public void testTypicalSentence() {
43         assertTrue("Initial auto caps state", isCapsModeAutoShifted());
44         type("Test");
45         assertFalse("Caps after letter", isCapsModeAutoShifted());
46         type(" ");
47         assertFalse("Caps after space", isCapsModeAutoShifted());
48         type("some,");
49         assertFalse("Caps after comma", isCapsModeAutoShifted());
50         type(" ");
51         assertFalse("Caps after comma space", isCapsModeAutoShifted());
52         type("words.");
53         assertFalse("Caps directly after period", isCapsModeAutoShifted());
54         type(" ");
55         assertTrue("Caps after period space", isCapsModeAutoShifted());
56     }
57 
testBackspace()58     public void testBackspace() {
59         assertTrue("Initial auto caps state", isCapsModeAutoShifted());
60         type("A");
61         assertFalse("Caps state after one letter", isCapsModeAutoShifted());
62         type(Constants.CODE_DELETE);
63         assertTrue("Auto caps state at start after delete", isCapsModeAutoShifted());
64     }
65 
testRepeatingBackspace()66     public void testRepeatingBackspace() {
67         final String SENTENCE_TO_TYPE = "Test sentence. Another.";
68         final int BACKSPACE_COUNT =
69                 SENTENCE_TO_TYPE.length() - SENTENCE_TO_TYPE.lastIndexOf(' ') - 1;
70 
71         type(SENTENCE_TO_TYPE);
72         assertFalse("Caps after typing \"" + SENTENCE_TO_TYPE + "\"", isCapsModeAutoShifted());
73         type(Constants.CODE_DELETE);
74         for (int i = 1; i < BACKSPACE_COUNT; ++i) {
75             repeatKey(Constants.CODE_DELETE);
76         }
77         assertFalse("Caps immediately after repeating Backspace a lot", isCapsModeAutoShifted());
78         sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
79         runMessages();
80         assertTrue("Caps after a while after repeating Backspace a lot", isCapsModeAutoShifted());
81     }
82 
testAutoCapsAfterDigitsPeriod()83     public void testAutoCapsAfterDigitsPeriod() {
84         changeLanguage("en");
85         type("On 22.11.");
86         assertFalse("(English) Auto caps after digits-period", isCapsModeAutoShifted());
87         type(" ");
88         assertTrue("(English) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
89         mEditText.setText("");
90         changeLanguage("fr");
91         type("Le 22.");
92         assertFalse("(French) Auto caps after digits-period", isCapsModeAutoShifted());
93         type(" ");
94         assertTrue("(French) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
95         mEditText.setText("");
96         changeLanguage("de");
97         type("Am 22.");
98         assertFalse("(German) Auto caps after digits-period", isCapsModeAutoShifted());
99         type(" ");
100         // For German, no auto-caps in this case
101         assertFalse("(German) Auto caps after digits-period-whitespace", isCapsModeAutoShifted());
102     }
103 
testAutoCapsAfterInvertedMarks()104     public void testAutoCapsAfterInvertedMarks() {
105         changeLanguage("es");
106         assertTrue("(Spanish) Auto caps at start", isCapsModeAutoShifted());
107         type("Hey. ¿");
108         assertTrue("(Spanish) Auto caps after inverted what", isCapsModeAutoShifted());
109         mEditText.setText("");
110         type("¡");
111         assertTrue("(Spanish) Auto caps after inverted bang", isCapsModeAutoShifted());
112     }
113 
testOtherSentenceSeparators()114     public void testOtherSentenceSeparators() {
115         changeLanguage("hy_AM");
116         assertTrue("(Armenian) Auto caps at start", isCapsModeAutoShifted());
117         type("Hey. ");
118         assertFalse("(Armenian) No auto-caps after latin period", isCapsModeAutoShifted());
119         type("Hey\u0589");
120         assertFalse("(Armenian) No auto-caps directly after armenian period",
121                 isCapsModeAutoShifted());
122         type(" ");
123         assertTrue("(Armenian) Auto-caps after armenian period-whitespace",
124                 isCapsModeAutoShifted());
125     }
126 }
127