| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package libcore.java.text; |
| |
| import java.text.BreakIterator; |
| import java.util.ArrayList; |
| import java.util.Locale; |
| |
| public class BreakIteratorTest extends junit.framework.TestCase { |
| BreakIterator iterator; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| iterator = BreakIterator.getCharacterInstance(Locale.US); |
| } |
| |
| public void testGetAvailableLocales() { |
| Locale[] locales = BreakIterator.getAvailableLocales(); |
| assertTrue("Array available locales is null", locales != null); |
| assertTrue("Array available locales is 0-length", |
| (locales != null && locales.length != 0)); |
| boolean found = false; |
| for (Locale l : locales) { |
| if (l.equals(Locale.US)) { |
| // expected |
| found = true; |
| } |
| } |
| assertTrue("At least locale " + Locale.US + " must be presented", found); |
| } |
| |
| public void testGetWordInstanceLocale() { |
| BreakIterator it1 = BreakIterator.getWordInstance(Locale.CANADA_FRENCH); |
| assertTrue("Incorrect BreakIterator", it1 != BreakIterator.getWordInstance()); |
| BreakIterator it2 = BreakIterator.getWordInstance(new Locale("bad locale")); |
| assertTrue("Incorrect BreakIterator", it2 != BreakIterator.getWordInstance()); |
| } |
| |
| // http://b/7307154 - we used to pin an unbounded number of char[]s, relying on finalization. |
| public void testStress() throws Exception { |
| char[] cs = { 'a' }; |
| for (int i = 0; i < 4096; ++i) { |
| BreakIterator it = BreakIterator.getWordInstance(Locale.US); |
| it.setText(new String(cs)); |
| } |
| } |
| |
| public void testWordBoundaries() { |
| StringBuilder sb = new StringBuilder(); |
| for (int i = 0; i < 1024; ++i) { |
| if (i > 0) { |
| sb.append(' '); |
| } |
| sb.append("12345"); |
| } |
| String s = sb.toString(); |
| |
| BreakIterator it = BreakIterator.getWordInstance(Locale.US); |
| it.setText(s); |
| |
| // Check we're not leaking global references. 2048 would bust the VM's hard-coded limit. |
| for (int i = 0; i < 2048; ++i) { |
| it.setText(s); |
| } |
| |
| BreakIterator clone = (BreakIterator) it.clone(); |
| |
| assertExpectedWordBoundaries(it, s); |
| assertExpectedWordBoundaries(clone, s); |
| } |
| |
| private void assertExpectedWordBoundaries(BreakIterator it, String s) { |
| int expectedPos = 0; |
| int pos = it.first(); |
| assertEquals(expectedPos, pos); |
| while (pos != BreakIterator.DONE) { |
| expectedPos += 5; // The five characters until the end of this word. |
| pos = it.next(); |
| assertEquals(expectedPos, pos); |
| |
| expectedPos += 1; // The space before the start of the next word... |
| if (expectedPos > s.length()) { |
| expectedPos = BreakIterator.DONE; // ...unless we're done. |
| } |
| pos = it.next(); |
| assertEquals(expectedPos, pos); |
| } |
| } |
| |
| public void testIsBoundary() { |
| BreakIterator it = BreakIterator.getCharacterInstance(Locale.US); |
| it.setText("hello"); |
| |
| try { |
| it.isBoundary(-1); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Note that this exception is not listed in the Java API documentation |
| } |
| |
| assertTrue(it.isBoundary(0)); |
| assertTrue(it.isBoundary(1)); |
| assertTrue(it.isBoundary(4)); |
| assertTrue(it.isBoundary(5)); |
| |
| try { |
| it.isBoundary(6); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Note that this exception is not listed in the Java API documentation |
| } |
| } |
| |
| public void testFollowing() { |
| BreakIterator it = BreakIterator.getCharacterInstance(Locale.US); |
| it.setText("hello"); |
| |
| try { |
| it.following(-1); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Expected exception |
| } |
| |
| assertEquals(1, it.following(0)); |
| assertEquals(2, it.following(1)); |
| assertEquals(5, it.following(4)); |
| assertEquals(BreakIterator.DONE, it.following(5)); |
| |
| try { |
| it.following(6); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Expected exception |
| } |
| } |
| |
| public void testPreceding() { |
| BreakIterator it = BreakIterator.getCharacterInstance(Locale.US); |
| it.setText("hello"); |
| |
| try { |
| it.preceding(-1); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Expected exception |
| } |
| |
| assertEquals(BreakIterator.DONE, it.preceding(0)); |
| assertEquals(0, it.preceding(1)); |
| assertEquals(4, it.preceding(5)); |
| |
| try { |
| it.preceding(6); |
| fail(); |
| } catch (IllegalArgumentException expected) { |
| // Expected exception |
| } |
| } |
| |
| // http://code.google.com/p/android/issues/detail?id=41143 |
| // This code is inherently unsafe and crazy; |
| // we're just trying to provoke native crashes! |
| public void testConcurrentBreakIteratorAccess() throws Exception { |
| final BreakIterator it = BreakIterator.getCharacterInstance(); |
| |
| ArrayList<Thread> threads = new ArrayList<Thread>(); |
| for (int i = 0; i < 10; ++i) { |
| Thread t = new Thread(new Runnable() { |
| public void run() { |
| for (int i = 0; i < 4096; ++i) { |
| it.setText("some example text"); |
| for (int index = it.first(); index != BreakIterator.DONE; index = it.next()) { |
| } |
| } |
| } |
| }); |
| threads.add(t); |
| } |
| |
| for (Thread t : threads) { |
| t.start(); |
| } |
| for (Thread t : threads) { |
| t.join(); |
| } |
| } |
| } |