WordIteratorTest.java revision 4968a219bf091df2e76ada29d39531bdde647c88
1/*
2 * Copyright (C) 2015 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;
18
19import android.test.AndroidTestCase;
20
21import java.text.BreakIterator;
22import java.util.Locale;
23
24// TODO(Bug: 24062099): Add more tests for non-ascii text.
25public class WordIteratorTest  extends AndroidTestCase {
26
27    public void testSetCharSequence() {
28        final String text = "text";
29        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
30
31        try {
32            wordIterator.setCharSequence(text, 100, 100);
33            fail("setCharSequence with invalid start and end values should throw "
34                    + "IndexOutOfBoundsException.");
35        } catch (IndexOutOfBoundsException e) {
36        }
37        try {
38            wordIterator.setCharSequence(text, -100, -100);
39            fail("setCharSequence with invalid start and end values should throw "
40                    + "IndexOutOfBoundsException.");
41        } catch (IndexOutOfBoundsException e) {
42        }
43
44        wordIterator.setCharSequence(text, 0, text.length());
45        wordIterator.setCharSequence(text, 0, 0);
46        wordIterator.setCharSequence(text, text.length(), text.length());
47    }
48
49    public void testPreceding() {
50        final String text = "abc def-ghi. jkl";
51        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
52        wordIterator.setCharSequence(text, 0, text.length());
53
54        try {
55            wordIterator.preceding(-1);
56            fail("preceding with invalid offset should throw IllegalArgumentException.");
57        } catch (IllegalArgumentException e) {
58        }
59        try {
60            wordIterator.preceding(text.length() + 1);
61            fail("preceding with invalid offset should throw IllegalArgumentException.");
62        } catch (IllegalArgumentException e) {
63        }
64
65        assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a')));
66        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c')));
67        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d')));
68        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e')));
69        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g')));
70        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h')));
71        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j')));
72        assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
73    }
74
75    public void testFollowing() {
76        final String text = "abc def-ghi. jkl";
77        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
78        wordIterator.setCharSequence(text, 0, text.length());
79
80        try {
81            wordIterator.following(-1);
82            fail("following with invalid offset should throw IllegalArgumentException.");
83        } catch (IllegalArgumentException e) {
84        }
85        try {
86            wordIterator.following(text.length() + 1);
87            fail("following with invalid offset should throw IllegalArgumentException.");
88        } catch (IllegalArgumentException e) {
89        }
90
91        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a')));
92        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c')));
93        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1));
94        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d')));
95        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-')));
96        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g')));
97        assertEquals(text.length(), wordIterator.following(text.indexOf('j')));
98        assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
99    }
100
101    public void testIsBoundary() {
102        final String text = "abc def-ghi. jkl";
103        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
104        wordIterator.setCharSequence(text, 0, text.length());
105
106        try {
107            wordIterator.isBoundary(-1);
108            fail("isBoundary with invalid offset should throw IllegalArgumentException.");
109        } catch (IllegalArgumentException e) {
110        }
111        try {
112            wordIterator.isBoundary(text.length() + 1);
113            fail("isBoundary with invalid offset should throw IllegalArgumentException.");
114        } catch (IllegalArgumentException e) {
115        }
116
117        assertTrue(wordIterator.isBoundary(text.indexOf('a')));
118        assertFalse(wordIterator.isBoundary(text.indexOf('b')));
119        assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1));
120        assertTrue(wordIterator.isBoundary(text.indexOf('d')));
121        assertTrue(wordIterator.isBoundary(text.indexOf('-')));
122        assertTrue(wordIterator.isBoundary(text.indexOf('g')));
123        assertTrue(wordIterator.isBoundary(text.indexOf('.')));
124        assertTrue(wordIterator.isBoundary(text.indexOf('j')));
125        assertTrue(wordIterator.isBoundary(text.length()));
126    }
127
128    public void testNextBoundary() {
129        final String text = "abc def-ghi. jkl";
130        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
131        wordIterator.setCharSequence(text, 0, text.length());
132
133        try {
134            wordIterator.nextBoundary(-1);
135            fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
136        } catch (IllegalArgumentException e) {
137        }
138        try {
139            wordIterator.nextBoundary(text.length() + 1);
140            fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
141        } catch (IllegalArgumentException e) {
142        }
143
144
145        int currentOffset = 0;
146        currentOffset = wordIterator.nextBoundary(currentOffset);
147        assertEquals(text.indexOf('c') + 1, currentOffset);
148
149        currentOffset = wordIterator.nextBoundary(currentOffset);
150        assertEquals(text.indexOf('d'), currentOffset);
151
152        currentOffset = wordIterator.nextBoundary(currentOffset);
153        assertEquals(text.indexOf('f') + 1, currentOffset);
154
155        currentOffset = wordIterator.nextBoundary(currentOffset);
156        assertEquals(text.indexOf('g'), currentOffset);
157
158        currentOffset = wordIterator.nextBoundary(currentOffset);
159        assertEquals(text.indexOf('i') + 1, currentOffset);
160
161        currentOffset = wordIterator.nextBoundary(currentOffset);
162        assertEquals(text.indexOf('.') + 1, currentOffset);
163
164        currentOffset = wordIterator.nextBoundary(currentOffset);
165        assertEquals(text.indexOf('j'), currentOffset);
166
167        currentOffset = wordIterator.nextBoundary(currentOffset);
168        assertEquals(text.length(), currentOffset);
169
170        currentOffset = wordIterator.nextBoundary(currentOffset);
171        assertEquals(BreakIterator.DONE, currentOffset);
172    }
173
174    public void testPrevBoundary() {
175        final String text = "abc def-ghi. jkl";
176        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
177        wordIterator.setCharSequence(text, 0, text.length());
178
179        try {
180            wordIterator.prevBoundary(-1);
181            fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
182        } catch (IllegalArgumentException e) {
183        }
184        try {
185            wordIterator.prevBoundary(text.length() + 1);
186            fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
187        } catch (IllegalArgumentException e) {
188        }
189
190        int currentOffset = text.length();
191        currentOffset = wordIterator.prevBoundary(currentOffset);
192        assertEquals(text.indexOf('j'), currentOffset);
193
194        currentOffset = wordIterator.prevBoundary(currentOffset);
195        assertEquals(text.indexOf('.') + 1, currentOffset);
196
197        currentOffset = wordIterator.prevBoundary(currentOffset);
198        assertEquals(text.indexOf('i') + 1, currentOffset);
199
200        currentOffset = wordIterator.prevBoundary(currentOffset);
201        assertEquals(text.indexOf('g'), currentOffset);
202
203        currentOffset = wordIterator.prevBoundary(currentOffset);
204        assertEquals(text.indexOf('f') + 1, currentOffset);
205
206        currentOffset = wordIterator.prevBoundary(currentOffset);
207        assertEquals(text.indexOf('d'), currentOffset);
208
209        currentOffset = wordIterator.prevBoundary(currentOffset);
210        assertEquals(text.indexOf('c') + 1, currentOffset);
211
212        currentOffset = wordIterator.prevBoundary(currentOffset);
213        assertEquals(text.indexOf('a'), currentOffset);
214
215        currentOffset = wordIterator.prevBoundary(currentOffset);
216        assertEquals(BreakIterator.DONE, currentOffset);
217    }
218
219    public void testGetBeginning() {
220        {
221            final String text = "abc def-ghi. jkl";
222            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
223            wordIterator.setCharSequence(text, 0, text.length());
224            try {
225                wordIterator.getBeginning(-1);
226                fail("getBeginning with invalid offset should throw IllegalArgumentException.");
227            } catch (IllegalArgumentException e) {
228            }
229            try {
230                wordIterator.getBeginning(text.length() + 1);
231                fail("getBeginning with invalid offset should throw IllegalArgumentException.");
232            } catch (IllegalArgumentException e) {
233            }
234            try {
235                wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1);
236                fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
237                        + "IllegalArgumentException.");
238            } catch (IllegalArgumentException e) {
239            }
240            try {
241                wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1);
242                fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
243                        + "IllegalArgumentException.");
244            } catch (IllegalArgumentException e) {
245            }
246        }
247
248        {
249            final String text = "abc def-ghi. jkl";
250            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
251            wordIterator.setCharSequence(text, 0, text.length());
252
253            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a')));
254            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c')));
255            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1));
256            assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d')));
257            assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-')));
258            assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g')));
259            assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.')));
260            assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1));
261            assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j')));
262            assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1));
263
264            for (int i = 0; i < text.length(); i++) {
265                assertEquals(wordIterator.getBeginning(i),
266                        wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i));
267            }
268        }
269
270        {
271            // Japanese HIRAGANA letter + KATAKANA letters
272            final String text = "\u3042\u30A2\u30A3\u30A4";
273            WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
274            wordIterator.setCharSequence(text, 0, text.length());
275
276            assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042')));
277            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2')));
278            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4')));
279            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length()));
280
281            assertEquals(text.indexOf('\u3042'),
282                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042')));
283            assertEquals(text.indexOf('\u3042'),
284                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2')));
285            assertEquals(text.indexOf('\u30A2'),
286                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4')));
287            assertEquals(text.indexOf('\u30A2'),
288                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length()));
289        }
290    }
291
292    public void testGetEnd() {
293        {
294            final String text = "abc def-ghi. jkl";
295            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
296            wordIterator.setCharSequence(text, 0, text.length());
297            try {
298                wordIterator.getEnd(-1);
299                fail("getEnd with invalid offset should throw IllegalArgumentException.");
300            } catch (IllegalArgumentException e) {
301            }
302            try {
303                wordIterator.getEnd(text.length() + 1);
304                fail("getEnd with invalid offset should throw IllegalArgumentException.");
305            } catch (IllegalArgumentException e) {
306            }
307            try {
308                wordIterator.getNextWordEndOnTwoWordBoundary(-1);
309                fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
310                        + "IllegalArgumentException.");
311            } catch (IllegalArgumentException e) {
312            }
313            try {
314                wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1);
315                fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
316                        + "IllegalArgumentException.");
317            } catch (IllegalArgumentException e) {
318            }
319        }
320
321        {
322            final String text = "abc def-ghi. jkl";
323            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
324            wordIterator.setCharSequence(text, 0, text.length());
325
326            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a')));
327            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c')));
328            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1));
329            assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d')));
330            assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1));
331            assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g')));
332            assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1));
333            assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1));
334            assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j')));
335            assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1));
336
337            for (int i = 0; i < text.length(); i++) {
338                assertEquals(wordIterator.getEnd(i),
339                        wordIterator.getNextWordEndOnTwoWordBoundary(i));
340            }
341        }
342
343        {
344            // Japanese HIRAGANA letter + KATAKANA letters
345            final String text = "\u3042\u30A2\u30A3\u30A4";
346            WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
347            wordIterator.setCharSequence(text, 0, text.length());
348
349            assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042')));
350            assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2')));
351            assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4')));
352            assertEquals(text.indexOf('\u30A4') + 1,
353                    wordIterator.getEnd(text.indexOf('\u30A4') + 1));
354
355            assertEquals(text.indexOf('\u3042') + 1,
356                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042')));
357            assertEquals(text.indexOf('\u30A4') + 1,
358                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2')));
359            assertEquals(text.indexOf('\u30A4') + 1,
360                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4')));
361            assertEquals(text.indexOf('\u30A4') + 1,
362                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1));
363        }
364    }
365
366    public void testGetPunctuationBeginning() {
367        final String text = "abc!? (^^;) def";
368        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
369        wordIterator.setCharSequence(text, 0, text.length());
370
371        // TODO: Shouldn't this throw an exception?
372        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(BreakIterator.DONE));
373
374        try {
375            wordIterator.getPunctuationBeginning(-2);
376            fail("getPunctuationBeginning with invalid offset should throw "
377                    + "IllegalArgumentException.");
378        } catch (IllegalArgumentException e) {
379        }
380        try {
381            wordIterator.getPunctuationBeginning(text.length() + 1);
382            fail("getPunctuationBeginning with invalid offset should throw "
383                    + "IllegalArgumentException.");
384        } catch (IllegalArgumentException e) {
385        }
386
387        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a')));
388        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c')));
389        assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!')));
390        assertEquals(text.indexOf('!'),
391                wordIterator.getPunctuationBeginning(text.indexOf('?') + 1));
392        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';')));
393        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')')));
394        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length()));
395    }
396
397    public void testGetPunctuationEnd() {
398        final String text = "abc!? (^^;) def";
399        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
400        wordIterator.setCharSequence(text, 0, text.length());
401
402        // TODO: Shouldn't this throw an exception?
403        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(BreakIterator.DONE));
404
405        try {
406            wordIterator.getPunctuationEnd(-2);
407            fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException.");
408        } catch (IllegalArgumentException e) {
409        }
410        try {
411            wordIterator.getPunctuationEnd(text.length() + 1);
412            fail("getPunctuationBeginning with invalid offset should throw "
413                    + "IllegalArgumentException.");
414        } catch (IllegalArgumentException e) {
415        }
416
417        assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a')));
418        assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1));
419        assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('(')));
420        assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2));
421        assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1));
422        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d')));
423        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length()));
424    }
425
426    public void testIsAfterPunctuation() {
427        final String text = "abc!? (^^;) def";
428        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
429        wordIterator.setCharSequence(text, 0, text.length());
430
431        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a')));
432        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!')));
433        assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?')));
434        assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1));
435        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d')));
436
437        assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE));
438        assertFalse(wordIterator.isAfterPunctuation(text.length() + 1));
439    }
440
441    public void testIsOnPunctuation() {
442        final String text = "abc!? (^^;) def";
443        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
444        wordIterator.setCharSequence(text, 0, text.length());
445
446        assertFalse(wordIterator.isOnPunctuation(text.indexOf('a')));
447        assertTrue(wordIterator.isOnPunctuation(text.indexOf('!')));
448        assertTrue(wordIterator.isOnPunctuation(text.indexOf('?')));
449        assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1));
450        assertTrue(wordIterator.isOnPunctuation(text.indexOf(')')));
451        assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1));
452        assertFalse(wordIterator.isOnPunctuation(text.indexOf('d')));
453
454        assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE));
455        assertFalse(wordIterator.isOnPunctuation(text.length()));
456        assertFalse(wordIterator.isOnPunctuation(text.length() + 1));
457    }
458}
459