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