1/*
2 * Copyright (C) 2008 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
17package android.text.method.cts;
18
19import com.android.cts.stub.R;
20
21
22import android.app.Activity;
23import android.app.Instrumentation;
24import android.test.ActivityInstrumentationTestCase2;
25import android.text.InputType;
26import android.text.Selection;
27import android.text.Spannable;
28import android.text.SpannableStringBuilder;
29import android.text.method.QwertyKeyListener;
30import android.text.method.TextKeyListener;
31import android.text.method.TextKeyListener.Capitalize;
32import android.view.KeyEvent;
33import android.widget.TextView;
34import android.widget.TextView.BufferType;
35
36public class QwertyKeyListenerTest extends
37        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
38    private Activity mActivity;
39    private Instrumentation mInstrumentation;
40    private TextView mTextView;
41
42    public QwertyKeyListenerTest() {
43        super("com.android.cts.stub", KeyListenerStubActivity.class);
44    }
45
46    @Override
47    protected void setUp() throws Exception {
48        super.setUp();
49        mActivity = getActivity();
50        mInstrumentation = getInstrumentation();
51        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
52    }
53
54    public void testConstructor() {
55        new QwertyKeyListener(Capitalize.NONE, false);
56
57        new QwertyKeyListener(Capitalize.WORDS, true);
58
59        new QwertyKeyListener(null, true);
60    }
61
62    public void testOnKeyDown_capitalizeNone() {
63        QwertyKeyListener keyListener = QwertyKeyListener.getInstance(false, Capitalize.NONE);
64
65        prepareEmptyTextView();
66
67        callOnKeyDown(keyListener, KeyEvent.KEYCODE_H);
68        assertEquals("h", mTextView.getText().toString());
69
70        callOnKeyDown(keyListener, KeyEvent.KEYCODE_E);
71        assertEquals("he", mTextView.getText().toString());
72
73        callOnKeyDown(keyListener, KeyEvent.KEYCODE_L);
74        assertEquals("hel", mTextView.getText().toString());
75
76        callOnKeyDown(keyListener, KeyEvent.KEYCODE_L);
77        assertEquals("hell", mTextView.getText().toString());
78
79        callOnKeyDown(keyListener, KeyEvent.KEYCODE_O);
80        assertEquals("hello", mTextView.getText().toString());
81    }
82
83    public void testOnKeyDown_capitalizeCharacters() {
84        QwertyKeyListener keyListener = QwertyKeyListener.getInstance(false,
85                Capitalize.CHARACTERS);
86
87        prepareEmptyTextView();
88
89        callOnKeyDown(keyListener, KeyEvent.KEYCODE_H);
90        assertEquals("H", mTextView.getText().toString());
91
92        callOnKeyDown(keyListener, KeyEvent.KEYCODE_E);
93        assertEquals("HE", mTextView.getText().toString());
94
95        callOnKeyDown(keyListener, KeyEvent.KEYCODE_L);
96        assertEquals("HEL", mTextView.getText().toString());
97
98        callOnKeyDown(keyListener, KeyEvent.KEYCODE_L);
99        assertEquals("HELL", mTextView.getText().toString());
100
101        callOnKeyDown(keyListener, KeyEvent.KEYCODE_O);
102        assertEquals("HELLO", mTextView.getText().toString());
103    }
104
105    public void testOnKeyDown_capitalizeSentences() {
106        QwertyKeyListener keyListener = QwertyKeyListener.getInstance(false,
107                Capitalize.SENTENCES);
108
109        prepareEmptyTextView();
110
111        callOnKeyDown(keyListener, KeyEvent.KEYCODE_H);
112        assertEquals("H", mTextView.getText().toString());
113
114        callOnKeyDown(keyListener, KeyEvent.KEYCODE_I);
115        assertEquals("Hi", mTextView.getText().toString());
116
117        callOnKeyDown(keyListener, KeyEvent.KEYCODE_PERIOD);
118        assertEquals("Hi.", mTextView.getText().toString());
119
120        callOnKeyDown(keyListener, KeyEvent.KEYCODE_SPACE);
121        assertEquals("Hi. ", mTextView.getText().toString());
122
123        callOnKeyDown(keyListener, KeyEvent.KEYCODE_B);
124        assertEquals("Hi. B", mTextView.getText().toString());
125
126        callOnKeyDown(keyListener, KeyEvent.KEYCODE_Y);
127        assertEquals("Hi. By", mTextView.getText().toString());
128
129        callOnKeyDown(keyListener, KeyEvent.KEYCODE_E);
130        assertEquals("Hi. Bye", mTextView.getText().toString());
131    }
132
133    public void testOnKeyDown_capitalizeWords() {
134        QwertyKeyListener keyListener = QwertyKeyListener.getInstance(false,
135                Capitalize.WORDS);
136
137        prepareEmptyTextView();
138
139        callOnKeyDown(keyListener, KeyEvent.KEYCODE_H);
140        assertEquals("H", mTextView.getText().toString());
141
142        callOnKeyDown(keyListener, KeyEvent.KEYCODE_I);
143        assertEquals("Hi", mTextView.getText().toString());
144
145        callOnKeyDown(keyListener, KeyEvent.KEYCODE_SPACE);
146        assertEquals("Hi ", mTextView.getText().toString());
147
148        callOnKeyDown(keyListener, KeyEvent.KEYCODE_B);
149        assertEquals("Hi B", mTextView.getText().toString());
150
151        callOnKeyDown(keyListener, KeyEvent.KEYCODE_Y);
152        assertEquals("Hi By", mTextView.getText().toString());
153
154        callOnKeyDown(keyListener, KeyEvent.KEYCODE_E);
155        assertEquals("Hi Bye", mTextView.getText().toString());
156    }
157
158    private void prepareEmptyTextView() {
159        mActivity.runOnUiThread(new Runnable() {
160            public void run() {
161                mTextView.setText("", BufferType.EDITABLE);
162                Selection.setSelection(mTextView.getEditableText(), 0, 0);
163            }
164        });
165        mInstrumentation.waitForIdleSync();
166        assertEquals("", mTextView.getText().toString());
167    }
168
169    private void callOnKeyDown(final QwertyKeyListener keyListener, final int keyCode) {
170        mActivity.runOnUiThread(new Runnable() {
171            public void run() {
172                keyListener.onKeyDown(mTextView, mTextView.getEditableText(), keyCode,
173                        new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
174            }
175        });
176        mInstrumentation.waitForIdleSync();
177    }
178
179    public void testGetInstance() {
180        QwertyKeyListener listener1 = QwertyKeyListener.getInstance(true, Capitalize.WORDS);
181        QwertyKeyListener listener2 = QwertyKeyListener.getInstance(true, Capitalize.WORDS);
182        QwertyKeyListener listener3 = QwertyKeyListener.getInstance(false, Capitalize.WORDS);
183        QwertyKeyListener listener4 = QwertyKeyListener.getInstance(true, Capitalize.SENTENCES);
184
185        assertNotNull(listener1);
186        assertNotNull(listener2);
187        assertSame(listener1, listener2);
188
189        assertNotSame(listener1, listener3);
190        assertNotSame(listener1, listener4);
191        assertNotSame(listener4, listener3);
192    }
193
194    public void testMarkAsReplaced() {
195        SpannableStringBuilder content = new SpannableStringBuilder("123456");
196
197        Object[] repl = content.getSpans(0, content.length(), Object.class);
198        assertEquals(0, repl.length);
199
200        QwertyKeyListener.markAsReplaced(content, 0, content.length(), "abcd");
201        repl = content.getSpans(0, content.length(), Object.class);
202        assertEquals(1, repl.length);
203        assertEquals(0, content.getSpanStart(repl[0]));
204        assertEquals(content.length(), content.getSpanEnd(repl[0]));
205        assertEquals(Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, content.getSpanFlags(repl[0]));
206
207        QwertyKeyListener.markAsReplaced(content, 1, 2, "abcd");
208        repl = content.getSpans(0, content.length(), Object.class);
209        assertEquals(1, repl.length);
210        assertEquals(1, content.getSpanStart(repl[0]));
211        assertEquals(2, content.getSpanEnd(repl[0]));
212        assertEquals(Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, content.getSpanFlags(repl[0]));
213
214        try {
215            QwertyKeyListener.markAsReplaced(null, 1, 2, "abcd");
216            fail("should throw NullPointerException.");
217        } catch (NullPointerException e) {
218        }
219
220        try {
221            QwertyKeyListener.markAsReplaced(content, 1, 2, null);
222            fail("should throw NullPointerException.");
223        } catch (NullPointerException e) {
224        }
225    }
226
227    public void testGetInputType() {
228        QwertyKeyListener listener = QwertyKeyListener.getInstance(false, Capitalize.NONE);
229        int expected = InputType.TYPE_CLASS_TEXT;
230        assertEquals(expected, listener.getInputType());
231
232        listener = QwertyKeyListener.getInstance(false, Capitalize.CHARACTERS);
233        expected = InputType.TYPE_CLASS_TEXT
234                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
235        assertEquals(expected, listener.getInputType());
236    }
237}
238