Home | History | Annotate | Download | only in method
      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 
     17 package android.text.method;
     18 
     19 import static org.junit.Assert.assertEquals;
     20 import static org.junit.Assert.assertFalse;
     21 import static org.junit.Assert.assertTrue;
     22 import static org.junit.Assert.fail;
     23 
     24 import android.platform.test.annotations.Presubmit;
     25 import android.support.test.filters.SmallTest;
     26 import android.support.test.runner.AndroidJUnit4;
     27 
     28 import org.junit.Test;
     29 import org.junit.runner.RunWith;
     30 
     31 import java.text.BreakIterator;
     32 import java.util.Locale;
     33 
     34 // TODO(Bug: 24062099): Add more tests for non-ascii text.
     35 @Presubmit
     36 @SmallTest
     37 @RunWith(AndroidJUnit4.class)
     38 public class WordIteratorTest {
     39 
     40     private WordIterator mWordIterator = new WordIterator();
     41 
     42     private void verifyIsWordWithSurrogate(int beginning, int end, int surrogateIndex) {
     43         for (int i = beginning; i <= end; i++) {
     44             if (i == surrogateIndex) continue;
     45             assertEquals(beginning, mWordIterator.getBeginning(i));
     46             assertEquals(end, mWordIterator.getEnd(i));
     47         }
     48     }
     49 
     50     private void setCharSequence(String string) {
     51         mWordIterator.setCharSequence(string, 0, string.length());
     52     }
     53 
     54     private void verifyIsWord(int beginning, int end) {
     55         verifyIsWordWithSurrogate(beginning, end, -1);
     56     }
     57 
     58     private void verifyIsNotWord(int beginning, int end) {
     59         for (int i = beginning; i <= end; i++) {
     60             assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(i));
     61             assertEquals(BreakIterator.DONE, mWordIterator.getEnd(i));
     62         }
     63     }
     64 
     65     @Test
     66     public void testEmptyString() {
     67         setCharSequence("");
     68         assertEquals(BreakIterator.DONE, mWordIterator.following(0));
     69         assertEquals(BreakIterator.DONE, mWordIterator.preceding(0));
     70 
     71         assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(0));
     72         assertEquals(BreakIterator.DONE, mWordIterator.getEnd(0));
     73     }
     74 
     75     @Test
     76     public void testOneWord() {
     77         setCharSequence("I");
     78         verifyIsWord(0, 1);
     79 
     80         setCharSequence("am");
     81         verifyIsWord(0, 2);
     82 
     83         setCharSequence("zen");
     84         verifyIsWord(0, 3);
     85     }
     86 
     87     @Test
     88     public void testSpacesOnly() {
     89         setCharSequence(" ");
     90         verifyIsNotWord(0, 1);
     91 
     92         setCharSequence(", ");
     93         verifyIsNotWord(0, 2);
     94 
     95         setCharSequence(":-)");
     96         verifyIsNotWord(0, 3);
     97     }
     98 
     99     @Test
    100     public void testBeginningEnd() {
    101         setCharSequence("Well hello,   there! ");
    102         //                  0123456789012345678901
    103         verifyIsWord(0, 4);
    104         verifyIsWord(5, 10);
    105         verifyIsNotWord(11, 13);
    106         verifyIsWord(14, 19);
    107         verifyIsNotWord(20, 21);
    108 
    109         setCharSequence("  Another - sentence");
    110         //                  012345678901234567890
    111         verifyIsNotWord(0, 1);
    112         verifyIsWord(2, 9);
    113         verifyIsNotWord(10, 11);
    114         verifyIsWord(12, 20);
    115 
    116         setCharSequence("This is \u0644\u0627 tested"); // Lama-aleph
    117         //                  012345678     9     01234567
    118         verifyIsWord(0, 4);
    119         verifyIsWord(5, 7);
    120         verifyIsWord(8, 10);
    121         verifyIsWord(11, 17);
    122     }
    123 
    124     @Test
    125     public void testSurrogate() {
    126         final String gothicBairkan = "\uD800\uDF31";
    127 
    128         setCharSequence("one we" + gothicBairkan + "ird word");
    129         //                  012345    67         890123456
    130 
    131         verifyIsWord(0, 3);
    132         // Skip index 7 (there is no point in starting between the two surrogate characters)
    133         verifyIsWordWithSurrogate(4, 11, 7);
    134         verifyIsWord(12, 16);
    135 
    136         setCharSequence("one " + gothicBairkan + "xxx word");
    137         //                  0123    45         678901234
    138 
    139         verifyIsWord(0, 3);
    140         verifyIsWordWithSurrogate(4, 9, 5);
    141         verifyIsWord(10, 14);
    142 
    143         setCharSequence("one xxx" + gothicBairkan + " word");
    144         //                  0123456    78         901234
    145 
    146         verifyIsWord(0, 3);
    147         verifyIsWordWithSurrogate(4, 9, 8);
    148         verifyIsWord(10, 14);
    149     }
    150 
    151     @Test
    152     public void testSetCharSequence() {
    153         final String text = "text";
    154         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    155 
    156         try {
    157             wordIterator.setCharSequence(text, 100, 100);
    158             fail("setCharSequence with invalid start and end values should throw "
    159                     + "IndexOutOfBoundsException.");
    160         } catch (IndexOutOfBoundsException e) {
    161         }
    162         try {
    163             wordIterator.setCharSequence(text, -100, -100);
    164             fail("setCharSequence with invalid start and end values should throw "
    165                     + "IndexOutOfBoundsException.");
    166         } catch (IndexOutOfBoundsException e) {
    167         }
    168 
    169         wordIterator.setCharSequence(text, 0, text.length());
    170         wordIterator.setCharSequence(text, 0, 0);
    171         wordIterator.setCharSequence(text, text.length(), text.length());
    172     }
    173 
    174     @Test
    175     public void testWindowWidth() {
    176         final String text = "aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn";
    177         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    178 
    179         // The first 'n' is more than 50 characters into the string.
    180         wordIterator.setCharSequence(text, text.indexOf('n'), text.length());
    181         final int expectedWindowStart = text.indexOf('n') - 50;
    182         assertEquals(expectedWindowStart, wordIterator.preceding(expectedWindowStart + 1));
    183         assertEquals(BreakIterator.DONE, wordIterator.preceding(expectedWindowStart));
    184 
    185         wordIterator.setCharSequence(text, 0, 1);
    186         final int expectedWindowEnd = 1 + 50;
    187         assertEquals(expectedWindowEnd, wordIterator.following(expectedWindowEnd - 1));
    188         assertEquals(BreakIterator.DONE, wordIterator.following(expectedWindowEnd));
    189     }
    190 
    191     @Test
    192     public void testPreceding() {
    193         final String text = "abc def-ghi. jkl";
    194         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    195         wordIterator.setCharSequence(text, 0, text.length());
    196 
    197         try {
    198             wordIterator.preceding(-1);
    199             fail("preceding with invalid offset should throw IllegalArgumentException.");
    200         } catch (IllegalArgumentException e) {
    201         }
    202         try {
    203             wordIterator.preceding(text.length() + 1);
    204             fail("preceding with invalid offset should throw IllegalArgumentException.");
    205         } catch (IllegalArgumentException e) {
    206         }
    207 
    208         assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a')));
    209         assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c')));
    210         assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d')));
    211         assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e')));
    212         assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g')));
    213         assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h')));
    214         assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j')));
    215         assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
    216 
    217         // The results should be the same even if we set an smaller window, since WordIterator
    218         // enlargens the window by 50 code units on each side anyway.
    219         wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e'));
    220 
    221         assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a')));
    222         assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c')));
    223         assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d')));
    224         assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e')));
    225         assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g')));
    226         assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h')));
    227         assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j')));
    228         assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
    229     }
    230 
    231     @Test
    232     public void testFollowing() {
    233         final String text = "abc def-ghi. jkl";
    234         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    235         wordIterator.setCharSequence(text, 0, text.length());
    236 
    237         try {
    238             wordIterator.following(-1);
    239             fail("following with invalid offset should throw IllegalArgumentException.");
    240         } catch (IllegalArgumentException e) {
    241         }
    242         try {
    243             wordIterator.following(text.length() + 1);
    244             fail("following with invalid offset should throw IllegalArgumentException.");
    245         } catch (IllegalArgumentException e) {
    246         }
    247 
    248         assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a')));
    249         assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c')));
    250         assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1));
    251         assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d')));
    252         assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-')));
    253         assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g')));
    254         assertEquals(text.length(), wordIterator.following(text.indexOf('j')));
    255         assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
    256 
    257         // The results should be the same even if we set an smaller window, since WordIterator
    258         // enlargens the window by 50 code units on each side anyway.
    259         wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e'));
    260 
    261         assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a')));
    262         assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c')));
    263         assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1));
    264         assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d')));
    265         assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-')));
    266         assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g')));
    267         assertEquals(text.length(), wordIterator.following(text.indexOf('j')));
    268         assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
    269     }
    270 
    271     @Test
    272     public void testIsBoundary() {
    273         final String text = "abc def-ghi. jkl";
    274         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    275         wordIterator.setCharSequence(text, 0, text.length());
    276 
    277         try {
    278             wordIterator.isBoundary(-1);
    279             fail("isBoundary with invalid offset should throw IllegalArgumentException.");
    280         } catch (IllegalArgumentException e) {
    281         }
    282         try {
    283             wordIterator.isBoundary(text.length() + 1);
    284             fail("isBoundary with invalid offset should throw IllegalArgumentException.");
    285         } catch (IllegalArgumentException e) {
    286         }
    287 
    288         assertTrue(wordIterator.isBoundary(text.indexOf('a')));
    289         assertFalse(wordIterator.isBoundary(text.indexOf('b')));
    290         assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1));
    291         assertTrue(wordIterator.isBoundary(text.indexOf('d')));
    292         assertTrue(wordIterator.isBoundary(text.indexOf('-')));
    293         assertTrue(wordIterator.isBoundary(text.indexOf('g')));
    294         assertTrue(wordIterator.isBoundary(text.indexOf('.')));
    295         assertTrue(wordIterator.isBoundary(text.indexOf('j')));
    296         assertTrue(wordIterator.isBoundary(text.length()));
    297     }
    298 
    299     @Test
    300     public void testNextBoundary() {
    301         final String text = "abc def-ghi. jkl";
    302         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    303         wordIterator.setCharSequence(text, 0, text.length());
    304 
    305         try {
    306             wordIterator.nextBoundary(-1);
    307             fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
    308         } catch (IllegalArgumentException e) {
    309         }
    310         try {
    311             wordIterator.nextBoundary(text.length() + 1);
    312             fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
    313         } catch (IllegalArgumentException e) {
    314         }
    315 
    316 
    317         int currentOffset = 0;
    318         currentOffset = wordIterator.nextBoundary(currentOffset);
    319         assertEquals(text.indexOf('c') + 1, currentOffset);
    320 
    321         currentOffset = wordIterator.nextBoundary(currentOffset);
    322         assertEquals(text.indexOf('d'), currentOffset);
    323 
    324         currentOffset = wordIterator.nextBoundary(currentOffset);
    325         assertEquals(text.indexOf('f') + 1, currentOffset);
    326 
    327         currentOffset = wordIterator.nextBoundary(currentOffset);
    328         assertEquals(text.indexOf('g'), currentOffset);
    329 
    330         currentOffset = wordIterator.nextBoundary(currentOffset);
    331         assertEquals(text.indexOf('i') + 1, currentOffset);
    332 
    333         currentOffset = wordIterator.nextBoundary(currentOffset);
    334         assertEquals(text.indexOf('.') + 1, currentOffset);
    335 
    336         currentOffset = wordIterator.nextBoundary(currentOffset);
    337         assertEquals(text.indexOf('j'), currentOffset);
    338 
    339         currentOffset = wordIterator.nextBoundary(currentOffset);
    340         assertEquals(text.length(), currentOffset);
    341 
    342         currentOffset = wordIterator.nextBoundary(currentOffset);
    343         assertEquals(BreakIterator.DONE, currentOffset);
    344     }
    345 
    346     @Test
    347     public void testPrevBoundary() {
    348         final String text = "abc def-ghi. jkl";
    349         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    350         wordIterator.setCharSequence(text, 0, text.length());
    351 
    352         try {
    353             wordIterator.prevBoundary(-1);
    354             fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
    355         } catch (IllegalArgumentException e) {
    356         }
    357         try {
    358             wordIterator.prevBoundary(text.length() + 1);
    359             fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
    360         } catch (IllegalArgumentException e) {
    361         }
    362 
    363         int currentOffset = text.length();
    364         currentOffset = wordIterator.prevBoundary(currentOffset);
    365         assertEquals(text.indexOf('j'), currentOffset);
    366 
    367         currentOffset = wordIterator.prevBoundary(currentOffset);
    368         assertEquals(text.indexOf('.') + 1, currentOffset);
    369 
    370         currentOffset = wordIterator.prevBoundary(currentOffset);
    371         assertEquals(text.indexOf('i') + 1, currentOffset);
    372 
    373         currentOffset = wordIterator.prevBoundary(currentOffset);
    374         assertEquals(text.indexOf('g'), currentOffset);
    375 
    376         currentOffset = wordIterator.prevBoundary(currentOffset);
    377         assertEquals(text.indexOf('f') + 1, currentOffset);
    378 
    379         currentOffset = wordIterator.prevBoundary(currentOffset);
    380         assertEquals(text.indexOf('d'), currentOffset);
    381 
    382         currentOffset = wordIterator.prevBoundary(currentOffset);
    383         assertEquals(text.indexOf('c') + 1, currentOffset);
    384 
    385         currentOffset = wordIterator.prevBoundary(currentOffset);
    386         assertEquals(text.indexOf('a'), currentOffset);
    387 
    388         currentOffset = wordIterator.prevBoundary(currentOffset);
    389         assertEquals(BreakIterator.DONE, currentOffset);
    390     }
    391 
    392     @Test
    393     public void testGetBeginning() {
    394         {
    395             final String text = "abc def-ghi. jkl";
    396             WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    397             wordIterator.setCharSequence(text, 0, text.length());
    398             try {
    399                 wordIterator.getBeginning(-1);
    400                 fail("getBeginning with invalid offset should throw IllegalArgumentException.");
    401             } catch (IllegalArgumentException e) {
    402             }
    403             try {
    404                 wordIterator.getBeginning(text.length() + 1);
    405                 fail("getBeginning with invalid offset should throw IllegalArgumentException.");
    406             } catch (IllegalArgumentException e) {
    407             }
    408             try {
    409                 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1);
    410                 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
    411                         + "IllegalArgumentException.");
    412             } catch (IllegalArgumentException e) {
    413             }
    414             try {
    415                 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1);
    416                 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
    417                         + "IllegalArgumentException.");
    418             } catch (IllegalArgumentException e) {
    419             }
    420         }
    421 
    422         {
    423             final String text = "abc def-ghi. jkl";
    424             WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    425             wordIterator.setCharSequence(text, 0, text.length());
    426 
    427             assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a')));
    428             assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c')));
    429             assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1));
    430             assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d')));
    431             assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-')));
    432             assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g')));
    433             assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.')));
    434             assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1));
    435             assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j')));
    436             assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1));
    437 
    438             for (int i = 0; i < text.length(); i++) {
    439                 assertEquals(wordIterator.getBeginning(i),
    440                         wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i));
    441             }
    442         }
    443 
    444         {
    445             // Japanese HIRAGANA letter + KATAKANA letters
    446             final String text = "\u3042\u30A2\u30A3\u30A4";
    447             WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
    448             wordIterator.setCharSequence(text, 0, text.length());
    449 
    450             assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042')));
    451             assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2')));
    452             assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4')));
    453             assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length()));
    454 
    455             assertEquals(text.indexOf('\u3042'),
    456                     wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042')));
    457             assertEquals(text.indexOf('\u3042'),
    458                     wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2')));
    459             assertEquals(text.indexOf('\u30A2'),
    460                     wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4')));
    461             assertEquals(text.indexOf('\u30A2'),
    462                     wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length()));
    463         }
    464     }
    465 
    466     @Test
    467     public void testGetEnd() {
    468         {
    469             final String text = "abc def-ghi. jkl";
    470             WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    471             wordIterator.setCharSequence(text, 0, text.length());
    472             try {
    473                 wordIterator.getEnd(-1);
    474                 fail("getEnd with invalid offset should throw IllegalArgumentException.");
    475             } catch (IllegalArgumentException e) {
    476             }
    477             try {
    478                 wordIterator.getEnd(text.length() + 1);
    479                 fail("getEnd with invalid offset should throw IllegalArgumentException.");
    480             } catch (IllegalArgumentException e) {
    481             }
    482             try {
    483                 wordIterator.getNextWordEndOnTwoWordBoundary(-1);
    484                 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
    485                         + "IllegalArgumentException.");
    486             } catch (IllegalArgumentException e) {
    487             }
    488             try {
    489                 wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1);
    490                 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
    491                         + "IllegalArgumentException.");
    492             } catch (IllegalArgumentException e) {
    493             }
    494         }
    495 
    496         {
    497             final String text = "abc def-ghi. jkl";
    498             WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    499             wordIterator.setCharSequence(text, 0, text.length());
    500 
    501             assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a')));
    502             assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c')));
    503             assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1));
    504             assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d')));
    505             assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1));
    506             assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g')));
    507             assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1));
    508             assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1));
    509             assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j')));
    510             assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1));
    511 
    512             for (int i = 0; i < text.length(); i++) {
    513                 assertEquals(wordIterator.getEnd(i),
    514                         wordIterator.getNextWordEndOnTwoWordBoundary(i));
    515             }
    516         }
    517 
    518         {
    519             // Japanese HIRAGANA letter + KATAKANA letters
    520             final String text = "\u3042\u30A2\u30A3\u30A4";
    521             WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
    522             wordIterator.setCharSequence(text, 0, text.length());
    523 
    524             assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042')));
    525             assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2')));
    526             assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4')));
    527             assertEquals(text.indexOf('\u30A4') + 1,
    528                     wordIterator.getEnd(text.indexOf('\u30A4') + 1));
    529 
    530             assertEquals(text.indexOf('\u3042') + 1,
    531                     wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042')));
    532             assertEquals(text.indexOf('\u30A4') + 1,
    533                     wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2')));
    534             assertEquals(text.indexOf('\u30A4') + 1,
    535                     wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4')));
    536             assertEquals(text.indexOf('\u30A4') + 1,
    537                     wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1));
    538         }
    539     }
    540 
    541     @Test
    542     public void testGetPunctuationBeginning() {
    543         final String text = "abc!? (^^;) def";
    544         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    545         wordIterator.setCharSequence(text, 0, text.length());
    546 
    547         try {
    548             wordIterator.getPunctuationBeginning(BreakIterator.DONE);
    549             fail("getPunctuationBeginning with invalid offset should throw "
    550                     + "IllegalArgumentException.");
    551         } catch (IllegalArgumentException e) {
    552         }
    553         try {
    554             wordIterator.getPunctuationBeginning(-2);
    555             fail("getPunctuationBeginning with invalid offset should throw "
    556                     + "IllegalArgumentException.");
    557         } catch (IllegalArgumentException e) {
    558         }
    559         try {
    560             wordIterator.getPunctuationBeginning(text.length() + 1);
    561             fail("getPunctuationBeginning with invalid offset should throw "
    562                     + "IllegalArgumentException.");
    563         } catch (IllegalArgumentException e) {
    564         }
    565 
    566         assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a')));
    567         assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c')));
    568         assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!')));
    569         assertEquals(text.indexOf('!'),
    570                 wordIterator.getPunctuationBeginning(text.indexOf('?') + 1));
    571         assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';')));
    572         assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')')));
    573         assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length()));
    574     }
    575 
    576     @Test
    577     public void testGetPunctuationEnd() {
    578         final String text = "abc!? (^^;) def";
    579         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    580         wordIterator.setCharSequence(text, 0, text.length());
    581 
    582         try {
    583             wordIterator.getPunctuationEnd(BreakIterator.DONE);
    584             fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException.");
    585         } catch (IllegalArgumentException e) {
    586         }
    587         try {
    588             wordIterator.getPunctuationEnd(-2);
    589             fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException.");
    590         } catch (IllegalArgumentException e) {
    591         }
    592         try {
    593             wordIterator.getPunctuationEnd(text.length() + 1);
    594             fail("getPunctuationBeginning with invalid offset should throw "
    595                     + "IllegalArgumentException.");
    596         } catch (IllegalArgumentException e) {
    597         }
    598 
    599         assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a')));
    600         assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1));
    601         assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('(')));
    602         assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2));
    603         assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1));
    604         assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d')));
    605         assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length()));
    606     }
    607 
    608     @Test
    609     public void testIsAfterPunctuation() {
    610         final String text = "abc!? (^^;) def";
    611         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    612         wordIterator.setCharSequence(text, 0, text.length());
    613 
    614         assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a')));
    615         assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!')));
    616         assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?')));
    617         assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1));
    618         assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d')));
    619 
    620         assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE));
    621         assertFalse(wordIterator.isAfterPunctuation(text.length() + 1));
    622     }
    623 
    624     @Test
    625     public void testIsOnPunctuation() {
    626         final String text = "abc!? (^^;) def";
    627         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    628         wordIterator.setCharSequence(text, 0, text.length());
    629 
    630         assertFalse(wordIterator.isOnPunctuation(text.indexOf('a')));
    631         assertTrue(wordIterator.isOnPunctuation(text.indexOf('!')));
    632         assertTrue(wordIterator.isOnPunctuation(text.indexOf('?')));
    633         assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1));
    634         assertTrue(wordIterator.isOnPunctuation(text.indexOf(')')));
    635         assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1));
    636         assertFalse(wordIterator.isOnPunctuation(text.indexOf('d')));
    637 
    638         assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE));
    639         assertFalse(wordIterator.isOnPunctuation(text.length()));
    640         assertFalse(wordIterator.isOnPunctuation(text.length() + 1));
    641     }
    642 
    643     @Test
    644     public void testApostropheMiddleOfWord() {
    645         // These tests confirm that the word "isn't" is treated like one word.
    646         final String text = "isn't he";
    647         WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
    648         wordIterator.setCharSequence(text, 0, text.length());
    649 
    650         assertEquals(text.indexOf('i'), wordIterator.preceding(text.indexOf('h')));
    651         assertEquals(text.indexOf('t') + 1, wordIterator.following(text.indexOf('i')));
    652 
    653         assertTrue(wordIterator.isBoundary(text.indexOf('i')));
    654         assertFalse(wordIterator.isBoundary(text.indexOf('\'')));
    655         assertFalse(wordIterator.isBoundary(text.indexOf('t')));
    656         assertTrue(wordIterator.isBoundary(text.indexOf('t') + 1));
    657         assertTrue(wordIterator.isBoundary(text.indexOf('h')));
    658 
    659         assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('i')));
    660         assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('n')));
    661         assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('\'')));
    662         assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t')));
    663         assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t') + 1));
    664         assertEquals(text.indexOf('h'), wordIterator.getBeginning(text.indexOf('h')));
    665 
    666         assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('i')));
    667         assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('n')));
    668         assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('\'')));
    669         assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('t')));
    670         assertEquals(text.indexOf('e') + 1, wordIterator.getEnd(text.indexOf('h')));
    671     }
    672 }
    673