14968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi/*
24968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * Copyright (C) 2015 The Android Open Source Project
34968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi *
44968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
54968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
64968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * You may obtain a copy of the License at
74968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi *
84968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
94968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi *
104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * See the License for the specific language governing permissions and
144968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi * limitations under the License.
154968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi */
164968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
174968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagipackage android.text.method;
184968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
19bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport static org.junit.Assert.assertEquals;
20bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport static org.junit.Assert.assertFalse;
21bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport static org.junit.Assert.assertTrue;
22bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport static org.junit.Assert.fail;
23bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu
24bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport android.support.test.filters.SmallTest;
2502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournaderimport android.support.test.runner.AndroidJUnit4;
264968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
27bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport org.junit.Test;
28bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanuimport org.junit.runner.RunWith;
294968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournaderimport java.text.BreakIterator;
3102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournaderimport java.util.Locale;
3202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi// TODO(Bug: 24062099): Add more tests for non-ascii text.
34bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu@SmallTest
35bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu@RunWith(AndroidJUnit4.class)
36bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanupublic class WordIteratorTest {
374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    private WordIterator mWordIterator = new WordIterator();
3902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
4002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    private void verifyIsWordWithSurrogate(int beginning, int end, int surrogateIndex) {
4102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        for (int i = beginning; i <= end; i++) {
4202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader            if (i == surrogateIndex) continue;
4302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader            assertEquals(beginning, mWordIterator.getBeginning(i));
4402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader            assertEquals(end, mWordIterator.getEnd(i));
4502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        }
4602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
4702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
4802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    private void setCharSequence(String string) {
4902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        mWordIterator.setCharSequence(string, 0, string.length());
5002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
5102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
5202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    private void verifyIsWord(int beginning, int end) {
5302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWordWithSurrogate(beginning, end, -1);
5402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
5502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
5602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    private void verifyIsNotWord(int beginning, int end) {
5702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        for (int i = beginning; i <= end; i++) {
5802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader            assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(i));
5902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader            assertEquals(BreakIterator.DONE, mWordIterator.getEnd(i));
6002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        }
6102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
6202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
6302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    @Test
6402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    public void testEmptyString() {
6502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("");
6602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        assertEquals(BreakIterator.DONE, mWordIterator.following(0));
6702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        assertEquals(BreakIterator.DONE, mWordIterator.preceding(0));
6802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
6902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(0));
7002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        assertEquals(BreakIterator.DONE, mWordIterator.getEnd(0));
7102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
7202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
7302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    @Test
7402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    public void testOneWord() {
7502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("I");
7602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 1);
7702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
7802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("am");
7902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 2);
8002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
8102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("zen");
8202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 3);
8302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
8402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
8502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    @Test
8602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    public void testSpacesOnly() {
8702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence(" ");
8802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(0, 1);
8902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
9002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence(", ");
9102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(0, 2);
9202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
9302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence(":-)");
9402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(0, 3);
9502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
9602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
9702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    @Test
9802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    public void testBeginningEnd() {
9902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("Well hello,   there! ");
10002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  0123456789012345678901
10102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 4);
10202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(5, 10);
10302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(11, 13);
10402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(14, 19);
10502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(20, 21);
10602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
10702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("  Another - sentence");
10802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  012345678901234567890
10902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(0, 1);
11002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(2, 9);
11102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsNotWord(10, 11);
11202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(12, 20);
11302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
11402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("This is \u0644\u0627 tested"); // Lama-aleph
11502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  012345678     9     01234567
11602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 4);
11702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(5, 7);
11802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(8, 10);
11902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(11, 17);
12002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
12102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
12202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    @Test
12302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    public void testSurrogate() {
12402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        final String gothicBairkan = "\uD800\uDF31";
12502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
12602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("one we" + gothicBairkan + "ird word");
12702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  012345    67         890123456
12802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
12902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 3);
13002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        // Skip index 7 (there is no point in starting between the two surrogate characters)
13102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWordWithSurrogate(4, 11, 7);
13202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(12, 16);
13302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
13402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("one " + gothicBairkan + "xxx word");
13502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  0123    45         678901234
13602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
13702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 3);
13802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWordWithSurrogate(4, 9, 5);
13902f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(10, 14);
14002f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
14102f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        setCharSequence("one xxx" + gothicBairkan + " word");
14202f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        //                  0123456    78         901234
14302f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
14402f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(0, 3);
14502f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWordWithSurrogate(4, 9, 8);
14602f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader        verifyIsWord(10, 14);
14702f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader    }
14802f167c35ad81fce82c0ebc14a15892fb6981866Roozbeh Pournader
149bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
1504968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testSetCharSequence() {
1514968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "text";
1524968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
1534968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
1544968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
1554968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 100, 100);
1564968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("setCharSequence with invalid start and end values should throw "
1574968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    + "IndexOutOfBoundsException.");
1584968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1594968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
1604968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
1614968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, -100, -100);
1624968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("setCharSequence with invalid start and end values should throw "
1634968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    + "IndexOutOfBoundsException.");
1644968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IndexOutOfBoundsException e) {
1654968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
1664968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
1674968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
1684968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, 0);
1694968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, text.length(), text.length());
1704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
1714968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
172bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
173b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader    public void testWindowWidth() {
174b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        final String text = "aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn";
175b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
176b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
177b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        // The first 'n' is more than 50 characters into the string.
178b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        wordIterator.setCharSequence(text, text.indexOf('n'), text.length());
179b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        final int expectedWindowStart = text.indexOf('n') - 50;
180b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(expectedWindowStart, wordIterator.preceding(expectedWindowStart + 1));
181b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(BreakIterator.DONE, wordIterator.preceding(expectedWindowStart));
182b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
183b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        wordIterator.setCharSequence(text, 0, 1);
184b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        final int expectedWindowEnd = 1 + 50;
185b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(expectedWindowEnd, wordIterator.following(expectedWindowEnd - 1));
186b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(BreakIterator.DONE, wordIterator.following(expectedWindowEnd));
187b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader    }
188b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
189bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
1904968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testPreceding() {
1914968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc def-ghi. jkl";
1924968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
1934968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
1944968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
1954968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
1964968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.preceding(-1);
1974968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("preceding with invalid offset should throw IllegalArgumentException.");
1984968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
1994968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2004968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
2014968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.preceding(text.length() + 1);
2024968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("preceding with invalid offset should throw IllegalArgumentException.");
2034968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
2044968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2054968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
2064968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a')));
2074968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c')));
2084968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d')));
2094968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e')));
2104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g')));
2114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h')));
2124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j')));
2134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
214b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
215b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        // The results should be the same even if we set an smaller window, since WordIterator
216b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        // enlargens the window by 50 code units on each side anyway.
217b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e'));
218b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
219b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a')));
220b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c')));
221b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d')));
222b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e')));
223b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g')));
224b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h')));
225b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j')));
226b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l')));
2274968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
2284968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
229bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
2304968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testFollowing() {
2314968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc def-ghi. jkl";
2324968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
2334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
2344968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
2354968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
2364968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.following(-1);
2374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("following with invalid offset should throw IllegalArgumentException.");
2384968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
2394968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2404968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
2414968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.following(text.length() + 1);
2424968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("following with invalid offset should throw IllegalArgumentException.");
2434968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
2444968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2454968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
2464968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a')));
2474968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c')));
248b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1));
249b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d')));
250b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-')));
251b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g')));
252b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.length(), wordIterator.following(text.indexOf('j')));
253b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
254b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
255b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        // The results should be the same even if we set an smaller window, since WordIterator
256b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        // enlargens the window by 50 code units on each side anyway.
257b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e'));
258b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader
259b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a')));
260b08a07165fdc9ee6df40bbce94676755461ff3e0Roozbeh Pournader        assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c')));
2614968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1));
2624968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d')));
2634968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-')));
2644968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g')));
2654968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.length(), wordIterator.following(text.indexOf('j')));
2664968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.following(text.length()));
2674968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
2684968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
269bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
2704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testIsBoundary() {
2714968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc def-ghi. jkl";
2724968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
2734968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
2744968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
2754968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
2764968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.isBoundary(-1);
2774968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("isBoundary with invalid offset should throw IllegalArgumentException.");
2784968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
2794968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2804968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
2814968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.isBoundary(text.length() + 1);
2824968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("isBoundary with invalid offset should throw IllegalArgumentException.");
2834968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
2844968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
2854968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
2864968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('a')));
2874968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isBoundary(text.indexOf('b')));
2884968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1));
2894968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('d')));
2904968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('-')));
2914968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('g')));
2924968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('.')));
2934968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.indexOf('j')));
2944968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isBoundary(text.length()));
2954968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
2964968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
297bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
2984968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testNextBoundary() {
2994968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc def-ghi. jkl";
3004968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
3014968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
3024968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3034968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
3044968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.nextBoundary(-1);
3054968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
3064968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
3074968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
3084968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
3094968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.nextBoundary(text.length() + 1);
3104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("nextBoundary with invalid offset should throw IllegalArgumentException.");
3114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
3124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
3134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3144968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3154968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        int currentOffset = 0;
3164968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3174968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('c') + 1, currentOffset);
3184968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3194968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3204968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('d'), currentOffset);
3214968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3224968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3234968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('f') + 1, currentOffset);
3244968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3254968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3264968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('g'), currentOffset);
3274968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3284968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3294968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('i') + 1, currentOffset);
3304968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3314968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3324968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('.') + 1, currentOffset);
3334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3344968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3354968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('j'), currentOffset);
3364968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3384968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.length(), currentOffset);
3394968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3404968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.nextBoundary(currentOffset);
3414968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, currentOffset);
3424968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
3434968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
344bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
3454968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testPrevBoundary() {
3464968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc def-ghi. jkl";
3474968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
3484968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
3494968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3504968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
3514968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.prevBoundary(-1);
3524968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
3534968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
3544968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
3554968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
3564968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.prevBoundary(text.length() + 1);
3574968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("prevBoundary with invalid offset should throw IllegalArgumentException.");
3584968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
3594968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
3604968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3614968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        int currentOffset = text.length();
3624968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3634968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('j'), currentOffset);
3644968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3654968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3664968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('.') + 1, currentOffset);
3674968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3684968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3694968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('i') + 1, currentOffset);
3704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3714968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3724968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('g'), currentOffset);
3734968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3744968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3754968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('f') + 1, currentOffset);
3764968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3774968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3784968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('d'), currentOffset);
3794968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3804968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3814968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('c') + 1, currentOffset);
3824968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3834968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3844968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('a'), currentOffset);
3854968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
3864968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        currentOffset = wordIterator.prevBoundary(currentOffset);
3874968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, currentOffset);
3884968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
3894968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
390bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
3914968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testGetBeginning() {
3924968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
3934968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "abc def-ghi. jkl";
3944968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
3954968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
3964968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
3974968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getBeginning(-1);
3984968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getBeginning with invalid offset should throw IllegalArgumentException.");
3994968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4004968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4014968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4024968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getBeginning(text.length() + 1);
4034968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getBeginning with invalid offset should throw IllegalArgumentException.");
4044968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4054968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4064968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4074968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1);
4084968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
4094968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        + "IllegalArgumentException.");
4104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1);
4144968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw "
4154968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        + "IllegalArgumentException.");
4164968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4174968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4184968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
4194968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4204968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
4214968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "abc def-ghi. jkl";
4224968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
4234968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
4244968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4254968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a')));
4264968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c')));
4274968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1));
4284968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d')));
4294968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-')));
4304968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g')));
4314968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.')));
4324968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1));
4334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j')));
4344968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1));
4354968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4364968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            for (int i = 0; i < text.length(); i++) {
4374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                assertEquals(wordIterator.getBeginning(i),
4384968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i));
4394968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4404968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
4414968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4424968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
4434968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            // Japanese HIRAGANA letter + KATAKANA letters
4444968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "\u3042\u30A2\u30A3\u30A4";
4454968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
4464968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
4474968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4484968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042')));
4494968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2')));
4504968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4')));
4514968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length()));
4524968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4534968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042'),
4544968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042')));
4554968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042'),
4564968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2')));
4574968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A2'),
4584968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4')));
4594968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A2'),
4604968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length()));
4614968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
4624968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
4634968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
464bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
4654968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testGetEnd() {
4664968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
4674968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "abc def-ghi. jkl";
4684968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
4694968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
4704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4714968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getEnd(-1);
4724968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getEnd with invalid offset should throw IllegalArgumentException.");
4734968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4744968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4754968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4764968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getEnd(text.length() + 1);
4774968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getEnd with invalid offset should throw IllegalArgumentException.");
4784968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4794968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4804968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4814968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getNextWordEndOnTwoWordBoundary(-1);
4824968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
4834968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        + "IllegalArgumentException.");
4844968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4854968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4864968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            try {
4874968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1);
4884968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw "
4894968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        + "IllegalArgumentException.");
4904968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            } catch (IllegalArgumentException e) {
4914968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
4924968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
4934968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4944968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
4954968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "abc def-ghi. jkl";
4964968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
4974968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
4984968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
4994968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a')));
5004968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c')));
5014968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1));
5024968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d')));
5034968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1));
5044968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g')));
5054968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1));
5064968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1));
5074968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j')));
5084968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1));
5094968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            for (int i = 0; i < text.length(); i++) {
5114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                assertEquals(wordIterator.getEnd(i),
5124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                        wordIterator.getNextWordEndOnTwoWordBoundary(i));
5134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            }
5144968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5154968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5164968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        {
5174968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            // Japanese HIRAGANA letter + KATAKANA letters
5184968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            final String text = "\u3042\u30A2\u30A3\u30A4";
5194968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            WordIterator wordIterator = new WordIterator(Locale.JAPANESE);
5204968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.setCharSequence(text, 0, text.length());
5214968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5224968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042')));
5234968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2')));
5244968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4')));
5254968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A4') + 1,
5264968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getEnd(text.indexOf('\u30A4') + 1));
5274968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5284968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u3042') + 1,
5294968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042')));
5304968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A4') + 1,
5314968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2')));
5324968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A4') + 1,
5334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4')));
5344968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            assertEquals(text.indexOf('\u30A4') + 1,
5354968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1));
5364968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
5384968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
539bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
5404968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testGetPunctuationBeginning() {
5414968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc!? (^^;) def";
5424968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
5434968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
5444968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5459dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        try {
5469dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader            wordIterator.getPunctuationBeginning(BreakIterator.DONE);
5479dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader            fail("getPunctuationBeginning with invalid offset should throw "
5489dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader                    + "IllegalArgumentException.");
5499dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        } catch (IllegalArgumentException e) {
5509dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        }
5514968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
5524968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.getPunctuationBeginning(-2);
5534968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("getPunctuationBeginning with invalid offset should throw "
5544968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    + "IllegalArgumentException.");
5554968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
5564968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5574968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
5584968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.getPunctuationBeginning(text.length() + 1);
5594968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("getPunctuationBeginning with invalid offset should throw "
5604968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    + "IllegalArgumentException.");
5614968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
5624968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5634968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5644968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a')));
5654968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c')));
5664968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!')));
5674968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('!'),
5684968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                wordIterator.getPunctuationBeginning(text.indexOf('?') + 1));
5694968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';')));
5704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')')));
5714968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length()));
5724968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
5734968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
574bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
5754968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testGetPunctuationEnd() {
5764968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc!? (^^;) def";
5774968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
5784968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
5794968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5809dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        try {
5819dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader            wordIterator.getPunctuationEnd(BreakIterator.DONE);
5829dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader            fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException.");
5839dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        } catch (IllegalArgumentException e) {
5849dad5811d7232c85c07761dddd9ebd035524f955Roozbeh Pournader        }
5854968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
5864968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.getPunctuationEnd(-2);
5874968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException.");
5884968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
5894968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5904968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        try {
5914968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            wordIterator.getPunctuationEnd(text.length() + 1);
5924968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi            fail("getPunctuationBeginning with invalid offset should throw "
5934968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi                    + "IllegalArgumentException.");
5944968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        } catch (IllegalArgumentException e) {
5954968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        }
5964968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
5974968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a')));
5984968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1));
5994968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('(')));
6004968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2));
6014968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1));
6024968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d')));
6034968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length()));
6044968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
6054968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
606bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
6074968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testIsAfterPunctuation() {
6084968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc!? (^^;) def";
6094968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
6104968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
6114968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
6124968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a')));
6134968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!')));
6144968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?')));
6154968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1));
6164968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d')));
6174968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
6184968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE));
6194968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isAfterPunctuation(text.length() + 1));
6204968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
6214968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
622bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
6234968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    public void testIsOnPunctuation() {
6244968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        final String text = "abc!? (^^;) def";
6254968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
6264968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        wordIterator.setCharSequence(text, 0, text.length());
6274968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
6284968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.indexOf('a')));
6294968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isOnPunctuation(text.indexOf('!')));
6304968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isOnPunctuation(text.indexOf('?')));
6314968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1));
6324968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertTrue(wordIterator.isOnPunctuation(text.indexOf(')')));
6334968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1));
6344968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.indexOf('d')));
6354968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi
6364968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE));
6374968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.length()));
6384968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi        assertFalse(wordIterator.isOnPunctuation(text.length() + 1));
6394968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi    }
6401f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader
641bbe51f8290af05b4071c7ed44fcbaa98e2f85e13Andrei Stingaceanu    @Test
6421f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader    public void testApostropheMiddleOfWord() {
6431f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        // These tests confirm that the word "isn't" is treated like one word.
6441f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        final String text = "isn't he";
6451f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        WordIterator wordIterator = new WordIterator(Locale.ENGLISH);
6461f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        wordIterator.setCharSequence(text, 0, text.length());
6471f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader
6481f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.preceding(text.indexOf('h')));
6491f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('t') + 1, wordIterator.following(text.indexOf('i')));
6501f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader
6511f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertTrue(wordIterator.isBoundary(text.indexOf('i')));
6521f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertFalse(wordIterator.isBoundary(text.indexOf('\'')));
6531f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertFalse(wordIterator.isBoundary(text.indexOf('t')));
6541f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertTrue(wordIterator.isBoundary(text.indexOf('t') + 1));
6551f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertTrue(wordIterator.isBoundary(text.indexOf('h')));
6561f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader
6571f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('i')));
6581f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('n')));
6591f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('\'')));
6601f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t')));
6611f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t') + 1));
6621f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('h'), wordIterator.getBeginning(text.indexOf('h')));
6631f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader
6641f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('i')));
6651f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('n')));
6661f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('\'')));
6671f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('t')));
6681f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader        assertEquals(text.indexOf('e') + 1, wordIterator.getEnd(text.indexOf('h')));
6691f7ab84b0ebd38c0054d7f840f9a649555e21591Roozbeh Pournader    }
6704968a219bf091df2e76ada29d39531bdde647c88Keisuke Kuroyanagi}
671