OSDN Git Service

DO NOT MERGE. Grant MMS Uri permissions as the calling UID.
[android-x86/frameworks-base.git] / core / tests / coretests / src / android / text / method / BackspaceTest.java
1 /*
2  * Copyright (C) 2016 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 android.text.method;
18
19 import android.app.Activity;
20 import android.test.suitebuilder.annotation.SmallTest;
21 import android.test.suitebuilder.annotation.Suppress;
22 import android.text.InputType;
23 import android.text.method.BaseKeyListener;
24 import android.text.method.KeyListenerTestCase;
25 import android.view.KeyEvent;
26 import android.widget.EditText;
27 import android.widget.TextView.BufferType;
28
29 /**
30  * Test backspace key handling of {@link android.text.method.BaseKeyListner}.
31  *
32  * Only contains edge cases. For normal cases, see {@see android.text.method.cts.BackspaceTest}.
33  * TODO: introduce test cases for surrogate pairs and replacement span.
34  */
35 public class BackspaceTest extends KeyListenerTestCase {
36     private static final BaseKeyListener mKeyListener = new BaseKeyListener() {
37         public int getInputType() {
38             return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
39         }
40     };
41
42     // Sync the state to the TextView and call onKeyDown with KEYCODE_DEL key event.
43     // Then update the state to the result of TextView.
44     private void backspace(final EditorState state, int modifiers) {
45         mActivity.runOnUiThread(new Runnable() {
46             public void run() {
47                 mTextView.setText(state.mText, BufferType.EDITABLE);
48                 mTextView.setKeyListener(mKeyListener);
49                 mTextView.setSelection(state.mSelectionStart, state.mSelectionEnd);
50             }
51         });
52         mInstrumentation.waitForIdleSync();
53         assertTrue(mTextView.hasWindowFocus());
54
55         final KeyEvent keyEvent = getKey(KeyEvent.KEYCODE_DEL, modifiers);
56         mActivity.runOnUiThread(new Runnable() {
57             public void run() {
58                 mTextView.onKeyDown(keyEvent.getKeyCode(), keyEvent);
59             }
60         });
61         mInstrumentation.waitForIdleSync();
62
63         state.mText = mTextView.getText();
64         state.mSelectionStart = mTextView.getSelectionStart();
65         state.mSelectionEnd = mTextView.getSelectionEnd();
66     }
67
68     @SmallTest
69     public void testCombiningEnclosingKeycaps() {
70         EditorState state = new EditorState();
71
72         state.setByString("'1' U+E0101 U+20E3 |");
73         backspace(state, 0);
74         state.assertEquals("|");
75
76         // multiple COMBINING ENCLOSING KEYCAP
77         state.setByString("'1' U+20E3 U+20E3 |");
78         backspace(state, 0);
79         state.assertEquals("'1' U+20E3 |");
80         backspace(state, 0);
81         state.assertEquals("|");
82
83         // Isolated COMBINING ENCLOSING KEYCAP
84         state.setByString("U+20E3 |");
85         backspace(state, 0);
86         state.assertEquals("|");
87
88         // Isolated multiple COMBINING ENCLOSING KEYCAP
89         state.setByString("U+20E3 U+20E3 |");
90         backspace(state, 0);
91         state.assertEquals("U+20E3 |");
92         backspace(state, 0);
93         state.assertEquals("|");
94     }
95
96     @SmallTest
97     public void testVariationSelector() {
98         EditorState state = new EditorState();
99
100         // Isolated variation selector
101         state.setByString("U+FE0F |");
102         backspace(state, 0);
103         state.assertEquals("|");
104
105         state.setByString("U+E0100 |");
106         backspace(state, 0);
107         state.assertEquals("|");
108
109         // Isolated multiple variation selectors
110         state.setByString("U+FE0F U+FE0F |");
111         backspace(state, 0);
112         state.assertEquals("U+FE0F |");
113         backspace(state, 0);
114         state.assertEquals("|");
115
116         state.setByString("U+FE0F U+E0100 |");
117         backspace(state, 0);
118         state.assertEquals("U+FE0F |");
119         backspace(state, 0);
120         state.assertEquals("|");
121
122         state.setByString("U+E0100 U+FE0F |");
123         backspace(state, 0);
124         state.assertEquals("U+E0100 |");
125         backspace(state, 0);
126         state.assertEquals("|");
127
128         state.setByString("U+E0100 U+E0100 |");
129         backspace(state, 0);
130         state.assertEquals("U+E0100 |");
131         backspace(state, 0);
132         state.assertEquals("|");
133
134         // Multiple variation selectors
135         state.setByString("'#' U+FE0F U+FE0F |");
136         backspace(state, 0);
137         state.assertEquals("'#' U+FE0F |");
138         backspace(state, 0);
139         state.assertEquals("|");
140
141         state.setByString("'#' U+FE0F U+E0100 |");
142         backspace(state, 0);
143         state.assertEquals("'#' U+FE0F |");
144         backspace(state, 0);
145         state.assertEquals("|");
146
147         state.setByString("U+845B U+E0100 U+FE0F |");
148         backspace(state, 0);
149         state.assertEquals("U+845B U+E0100 |");
150         backspace(state, 0);
151         state.assertEquals("|");
152
153         state.setByString("U+845B U+E0100 U+E0100 |");
154         backspace(state, 0);
155         state.assertEquals("U+845B U+E0100 |");
156         backspace(state, 0);
157         state.assertEquals("|");
158     }
159
160     @SmallTest
161     public void testEmojiZWJSequence() {
162         EditorState state = new EditorState();
163
164         // U+200D is ZERO WIDTH JOINER.
165         state.setByString("U+1F441 U+200D U+1F5E8 |");
166         backspace(state, 0);
167         state.assertEquals("|");
168
169         state.setByString("U+1F441 U+200D U+1F5E8 U+FE0E |");
170         backspace(state, 0);
171         state.assertEquals("|");
172
173         state.setByString("U+1F469 U+200D U+1F373 |");
174         backspace(state, 0);
175         state.assertEquals("|");
176
177         state.setByString("U+1F487 U+200D U+2640 |");
178         backspace(state, 0);
179         state.assertEquals("|");
180
181         state.setByString("U+1F487 U+200D U+2640 U+FE0F |");
182         backspace(state, 0);
183         state.assertEquals("|");
184
185         state.setByString("U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468 |");
186         backspace(state, 0);
187         state.assertEquals("|");
188
189         // Emoji modifier can be appended to the first emoji.
190         state.setByString("U+1F469 U+1F3FB U+200D U+1F4BC |");
191         backspace(state, 0);
192         state.assertEquals("|");
193
194         // End with ZERO WIDTH JOINER
195         state.setByString("U+1F441 U+200D |");
196         backspace(state, 0);
197         state.assertEquals("U+1F441 |");
198         backspace(state, 0);
199         state.assertEquals("|");
200
201         // Start with ZERO WIDTH JOINER
202         state.setByString("U+200D U+1F5E8 |");
203         backspace(state, 0);
204         state.assertEquals("U+200D |");
205         backspace(state, 0);
206         state.assertEquals("|");
207
208         state.setByString("U+FE0E U+200D U+1F5E8 |");
209         backspace(state, 0);
210         state.assertEquals("U+FE0E U+200D |");
211         backspace(state, 0);
212         state.assertEquals("U+FE0E |");
213         backspace(state, 0);
214         state.assertEquals("|");
215
216         // Multiple ZERO WIDTH JOINER
217         state.setByString("U+1F441 U+200D U+200D U+1F5E8 |");
218         backspace(state, 0);
219         state.assertEquals("U+1F441 U+200D U+200D |");
220         backspace(state, 0);
221         state.assertEquals("U+1F441 U+200D |");
222         backspace(state, 0);
223         state.assertEquals("U+1F441 |");
224         backspace(state, 0);
225         state.assertEquals("|");
226
227         // Isolated ZERO WIDTH JOINER
228         state.setByString("U+200D |");
229         backspace(state, 0);
230         state.assertEquals("|");
231
232         // Isolated multiple ZERO WIDTH JOINER
233         state.setByString("U+200D U+200D |");
234         backspace(state, 0);
235         state.assertEquals("U+200D |");
236         backspace(state, 0);
237         state.assertEquals("|");
238     }
239
240     @SmallTest
241     public void testFlags() {
242         EditorState state = new EditorState();
243
244         // Isolated regional indicator symbol
245         state.setByString("U+1F1FA |");
246         backspace(state, 0);
247         state.assertEquals("|");
248
249         // Odd numbered regional indicator symbols
250         state.setByString("U+1F1FA U+1F1F8 U+1F1FA |");
251         backspace(state, 0);
252         state.assertEquals("U+1F1FA U+1F1F8 |");
253         backspace(state, 0);
254         state.assertEquals("|");
255     }
256
257     @SmallTest
258     public void testEmojiModifier() {
259         EditorState state = new EditorState();
260
261         // U+1F3FB is EMOJI MODIFIER FITZPATRICK TYPE-1-2.
262         state.setByString("U+1F466 U+1F3FB |");
263         backspace(state, 0);
264         state.assertEquals("|");
265
266         // Isolated emoji modifier
267         state.setByString("U+1F3FB |");
268         backspace(state, 0);
269         state.assertEquals("|");
270
271         // Isolated multiple emoji modifier
272         state.setByString("U+1F3FB U+1F3FB |");
273         backspace(state, 0);
274         state.assertEquals("U+1F3FB |");
275         backspace(state, 0);
276         state.assertEquals("|");
277
278         // Multiple emoji modifiers
279         state.setByString("U+1F466 U+1F3FB U+1F3FB |");
280         backspace(state, 0);
281         state.assertEquals("U+1F466 U+1F3FB |");
282         backspace(state, 0);
283         state.assertEquals("|");
284     }
285
286     @SmallTest
287     public void testMixedEdgeCases() {
288         EditorState state = new EditorState();
289
290         // COMBINING ENCLOSING KEYCAP + variation selector
291         state.setByString("'1' U+20E3 U+FE0F |");
292         backspace(state, 0);
293         state.assertEquals("'1' |");
294         backspace(state, 0);
295         state.assertEquals("|");
296
297         // Variation selector + COMBINING ENCLOSING KEYCAP
298         state.setByString("U+2665 U+FE0F U+20E3 |");
299         backspace(state, 0);
300         state.assertEquals("U+2665 U+FE0F |");
301         backspace(state, 0);
302         state.assertEquals("|");
303
304         // COMBINING ENCLOSING KEYCAP + ending with ZERO WIDTH JOINER
305         state.setByString("'1' U+20E3 U+200D |");
306         backspace(state, 0);
307         state.assertEquals("'1' U+20E3 |");
308         backspace(state, 0);
309         state.assertEquals("|");
310
311         // COMBINING ENCLOSING KEYCAP + ZERO WIDTH JOINER
312         state.setByString("'1' U+20E3 U+200D U+1F5E8 |");
313         backspace(state, 0);
314         state.assertEquals("'1' U+20E3 U+200D |");
315         backspace(state, 0);
316         state.assertEquals("'1' U+20E3 |");
317         backspace(state, 0);
318         state.assertEquals("|");
319
320         // Start with ZERO WIDTH JOINER + COMBINING ENCLOSING KEYCAP
321         state.setByString("U+200D U+20E3 |");
322         backspace(state, 0);
323         state.assertEquals("U+200D |");
324         backspace(state, 0);
325         state.assertEquals("|");
326
327         // ZERO WIDTH JOINER + COMBINING ENCLOSING KEYCAP
328         state.setByString("U+1F441 U+200D U+20E3 |");
329         backspace(state, 0);
330         state.assertEquals("U+1F441 U+200D |");
331         backspace(state, 0);
332         state.assertEquals("U+1F441 |");
333         backspace(state, 0);
334         state.assertEquals("|");
335
336         // COMBINING ENCLOSING KEYCAP + regional indicator symbol
337         state.setByString("'1' U+20E3 U+1F1FA |");
338         backspace(state, 0);
339         state.assertEquals("'1' U+20E3 |");
340         backspace(state, 0);
341         state.assertEquals("|");
342
343         // Regional indicator symbol + COMBINING ENCLOSING KEYCAP
344         state.setByString("U+1F1FA U+20E3 |");
345         backspace(state, 0);
346         state.assertEquals("U+1F1FA |");
347         backspace(state, 0);
348         state.assertEquals("|");
349
350         // COMBINING ENCLOSING KEYCAP + emoji modifier
351         state.setByString("'1' U+20E3 U+1F3FB |");
352         backspace(state, 0);
353         state.assertEquals("'1' U+20E3 |");
354         backspace(state, 0);
355         state.assertEquals("|");
356
357         // Emoji modifier + COMBINING ENCLOSING KEYCAP
358         state.setByString("U+1F466 U+1F3FB U+20E3 |");
359         backspace(state, 0);
360         state.assertEquals("U+1f466 U+1F3FB |");
361         backspace(state, 0);
362         state.assertEquals("|");
363
364         // Variation selector + end with ZERO WIDTH JOINER
365         state.setByString("U+2665 U+FE0F U+200D |");
366         backspace(state, 0);
367         state.assertEquals("U+2665 U+FE0F |");
368         backspace(state, 0);
369         state.assertEquals("|");
370
371         // Variation selector + ZERO WIDTH JOINER
372         state.setByString("U+1F469 U+200D U+2764 U+FE0F U+200D U+1F469 |");
373         backspace(state, 0);
374         state.assertEquals("|");
375
376         // Start with ZERO WIDTH JOINER + variation selector
377         state.setByString("U+200D U+FE0F |");
378         backspace(state, 0);
379         state.assertEquals("|");
380
381         // ZERO WIDTH JOINER + variation selector
382         state.setByString("U+1F469 U+200D U+FE0F |");
383         backspace(state, 0);
384         state.assertEquals("U+1F469 |");
385         backspace(state, 0);
386         state.assertEquals("|");
387
388         // Variation selector + regional indicator symbol
389         state.setByString("U+2665 U+FE0F U+1F1FA |");
390         backspace(state, 0);
391         state.assertEquals("U+2665 U+FE0F |");
392         backspace(state, 0);
393         state.assertEquals("|");
394
395         // Regional indicator symbol + variation selector
396         state.setByString("U+1F1FA U+FE0F |");
397         backspace(state, 0);
398         state.assertEquals("|");
399
400         // Variation selector + emoji modifier
401         state.setByString("U+2665 U+FE0F U+1F3FB |");
402         backspace(state, 0);
403         state.assertEquals("U+2665 U+FE0F |");
404         backspace(state, 0);
405         state.assertEquals("|");
406
407         // Emoji modifier + variation selector
408         state.setByString("U+1F466 U+1F3FB U+FE0F |");
409         backspace(state, 0);
410         state.assertEquals("U+1F466 |");
411         backspace(state, 0);
412         state.assertEquals("|");
413
414         // Start withj ZERO WIDTH JOINER + regional indicator symbol
415         state.setByString("U+200D U+1F1FA |");
416         backspace(state, 0);
417         state.assertEquals("U+200D |");
418         backspace(state, 0);
419         state.assertEquals("|");
420
421         // ZERO WIDTH JOINER + Regional indicator symbol
422         state.setByString("U+1F469 U+200D U+1F1FA |");
423         backspace(state, 0);
424         state.assertEquals("U+1F469 U+200D |");
425         backspace(state, 0);
426         state.assertEquals("U+1F469 |");
427         backspace(state, 0);
428         state.assertEquals("|");
429
430         // Regional indicator symbol + end with ZERO WIDTH JOINER
431         state.setByString("U+1F1FA U+200D |");
432         backspace(state, 0);
433         state.assertEquals("U+1F1FA |");
434         backspace(state, 0);
435         state.assertEquals("|");
436
437         // Regional indicator symbol + ZERO WIDTH JOINER
438         state.setByString("U+1F1FA U+200D U+1F469 |");
439         backspace(state, 0);
440         state.assertEquals("|");
441
442         // Start with ZERO WIDTH JOINER + emoji modifier
443         state.setByString("U+200D U+1F3FB |");
444         backspace(state, 0);
445         state.assertEquals("U+200D |");
446         backspace(state, 0);
447         state.assertEquals("|");
448
449         // ZERO WIDTH JOINER + emoji modifier
450         state.setByString("U+1F469 U+200D U+1F3FB |");
451         backspace(state, 0);
452         state.assertEquals("U+1F469 U+200D |");
453         backspace(state, 0);
454         state.assertEquals("U+1F469 |");
455         backspace(state, 0);
456         state.assertEquals("|");
457
458         // Emoji modifier + end with ZERO WIDTH JOINER
459         state.setByString("U+1F466 U+1F3FB U+200D |");
460         backspace(state, 0);
461         state.assertEquals("U+1F466 U+1F3FB |");
462         backspace(state, 0);
463         state.assertEquals("|");
464
465         // Regional indicator symbol + Emoji modifier
466         state.setByString("U+1F1FA U+1F3FB |");
467         backspace(state, 0);
468         state.assertEquals("U+1F1FA |");
469         backspace(state, 0);
470         state.assertEquals("|");
471
472         // Emoji modifier + regional indicator symbol
473         state.setByString("U+1F466 U+1F3FB U+1F1FA |");
474         backspace(state, 0);
475         state.assertEquals("U+1F466 U+1F3FB |");
476         backspace(state, 0);
477         state.assertEquals("|");
478     }
479 }