1b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne/*
2b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * Copyright (C) 2010 The Android Open Source Project
3b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne *
4b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * Licensed under the Apache License, Version 2.0 (the "License");
5b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * you may not use this file except in compliance with the License.
6b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * You may obtain a copy of the License at
7b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne *
8b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne *      http://www.apache.org/licenses/LICENSE-2.0
9b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne *
10b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * Unless required by applicable law or agreed to in writing, software
11b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * distributed under the License is distributed on an "AS IS" BASIS,
12b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * See the License for the specific language governing permissions and
14b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne * limitations under the License.
15b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne */
16b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
17b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunnepackage libcore.java.text;
18b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
19b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunneimport java.text.BreakIterator;
20eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughesimport java.util.ArrayList;
21b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunneimport java.util.Locale;
22b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
23b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunnepublic class BreakIteratorTest extends junit.framework.TestCase {
24b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    BreakIterator iterator;
25b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
26b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    @Override
27b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    protected void setUp() throws Exception {
28b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        super.setUp();
29b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        iterator = BreakIterator.getCharacterInstance(Locale.US);
30b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
31b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
32b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    public void testGetAvailableLocales() {
33b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        Locale[] locales = BreakIterator.getAvailableLocales();
34b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue("Array available locales is null", locales != null);
35b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue("Array available locales is 0-length",
36b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne                (locales != null && locales.length != 0));
37b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        boolean found = false;
38b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        for (Locale l : locales) {
39b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            if (l.equals(Locale.US)) {
40b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne                // expected
41b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne                found = true;
42b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            }
43b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
44b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue("At least locale " + Locale.US + " must be presented", found);
45b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
46b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
47b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    public void testGetWordInstanceLocale() {
48b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        BreakIterator it1 = BreakIterator.getWordInstance(Locale.CANADA_FRENCH);
49b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue("Incorrect BreakIterator", it1 != BreakIterator.getWordInstance());
50b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        BreakIterator it2 = BreakIterator.getWordInstance(new Locale("bad locale"));
51b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue("Incorrect BreakIterator", it2 != BreakIterator.getWordInstance());
52b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
53b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
54015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes    // http://b/7307154 - we used to pin an unbounded number of char[]s, relying on finalization.
55015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes    public void testStress() throws Exception {
56015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes        char[] cs = { 'a' };
57015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes        for (int i = 0; i < 4096; ++i) {
58015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes            BreakIterator it = BreakIterator.getWordInstance(Locale.US);
59015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes            it.setText(new String(cs));
60015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes        }
61015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes    }
62015843683630bd8e8f060c052ecd2e5a804a8396Elliott Hughes
6352dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes    public void testWordBoundaries() {
6452dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        StringBuilder sb = new StringBuilder();
6552dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        for (int i = 0; i < 1024; ++i) {
6652dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            if (i > 0) {
6752dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes                sb.append(' ');
6852dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            }
6952dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            sb.append("12345");
7052dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        }
7152dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        String s = sb.toString();
7252dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
7352dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        BreakIterator it = BreakIterator.getWordInstance(Locale.US);
7452dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        it.setText(s);
7552dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
7652dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        // Check we're not leaking global references. 2048 would bust the VM's hard-coded limit.
7752dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        for (int i = 0; i < 2048; ++i) {
7852dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            it.setText(s);
7952dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        }
8052dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
8152dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        BreakIterator clone = (BreakIterator) it.clone();
8252dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
8352dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        assertExpectedWordBoundaries(it, s);
8452dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        assertExpectedWordBoundaries(clone, s);
8552dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes    }
8652dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
8752dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes    private void assertExpectedWordBoundaries(BreakIterator it, String s) {
8852dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        int expectedPos = 0;
8952dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        int pos = it.first();
9052dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        assertEquals(expectedPos, pos);
9152dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        while (pos != BreakIterator.DONE) {
9252dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            expectedPos += 5; // The five characters until the end of this word.
9352dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            pos = it.next();
9452dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            assertEquals(expectedPos, pos);
9552dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
9652dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            expectedPos += 1; // The space before the start of the next word...
9752dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            if (expectedPos > s.length()) {
9852dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes                expectedPos = BreakIterator.DONE; // ...unless we're done.
9952dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            }
10052dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            pos = it.next();
10152dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes            assertEquals(expectedPos, pos);
10252dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes        }
10352dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes    }
10452dfb928ffdae183b91805bb6983f6e6aa87c9afElliott Hughes
105b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    public void testIsBoundary() {
106b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        BreakIterator it = BreakIterator.getCharacterInstance(Locale.US);
107b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        it.setText("hello");
108b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
109b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
110b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.isBoundary(-1);
111b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
112b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
113b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Note that this exception is not listed in the Java API documentation
114b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
115b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
116b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue(it.isBoundary(0));
117b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue(it.isBoundary(1));
118b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue(it.isBoundary(4));
119b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertTrue(it.isBoundary(5));
120b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
121b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
122b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.isBoundary(6);
123b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
124b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
125b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Note that this exception is not listed in the Java API documentation
126b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
127b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
128b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
129b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    public void testFollowing() {
130b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        BreakIterator it = BreakIterator.getCharacterInstance(Locale.US);
131b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        it.setText("hello");
132b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
133b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
134b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.following(-1);
135b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
136b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
137b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Expected exception
138b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
139b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
140b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(1, it.following(0));
141b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(2, it.following(1));
142b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(5, it.following(4));
143b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(BreakIterator.DONE, it.following(5));
144b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
145b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
146b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.following(6);
147b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
148b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
149b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Expected exception
150b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
151b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
152b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
153b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    public void testPreceding() {
154b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        BreakIterator it = BreakIterator.getCharacterInstance(Locale.US);
155b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        it.setText("hello");
156b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
157b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
158b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.preceding(-1);
159b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
160b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
161b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Expected exception
162b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
163b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
164b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(BreakIterator.DONE, it.preceding(0));
165b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(0, it.preceding(1));
166b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        assertEquals(4, it.preceding(5));
167b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne
168b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        try {
169b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            it.preceding(6);
170b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            fail();
171b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        } catch (IllegalArgumentException expected) {
172b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne            // Expected exception
173b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne        }
174b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne    }
175b78750f753a3496a694753127c3cc3d2cd80566fGilles Debunne}
176