/* * Copyright (C) 2015 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 android.text.method; import android.test.AndroidTestCase; import java.text.BreakIterator; import java.util.Locale; // TODO(Bug: 24062099): Add more tests for non-ascii text. public class WordIteratorTest extends AndroidTestCase { public void testSetCharSequence() { final String text = "text"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); try { wordIterator.setCharSequence(text, 100, 100); fail("setCharSequence with invalid start and end values should throw " + "IndexOutOfBoundsException."); } catch (IndexOutOfBoundsException e) { } try { wordIterator.setCharSequence(text, -100, -100); fail("setCharSequence with invalid start and end values should throw " + "IndexOutOfBoundsException."); } catch (IndexOutOfBoundsException e) { } wordIterator.setCharSequence(text, 0, text.length()); wordIterator.setCharSequence(text, 0, 0); wordIterator.setCharSequence(text, text.length(), text.length()); } public void testPreceding() { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.preceding(-1); fail("preceding with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.preceding(text.length() + 1); fail("preceding with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a'))); assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c'))); assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d'))); assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e'))); assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g'))); assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h'))); assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j'))); assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l'))); } public void testFollowing() { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.following(-1); fail("following with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.following(text.length() + 1); fail("following with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a'))); assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c'))); assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1)); assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d'))); assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-'))); assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g'))); assertEquals(text.length(), wordIterator.following(text.indexOf('j'))); assertEquals(BreakIterator.DONE, wordIterator.following(text.length())); } public void testIsBoundary() { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.isBoundary(-1); fail("isBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.isBoundary(text.length() + 1); fail("isBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } assertTrue(wordIterator.isBoundary(text.indexOf('a'))); assertFalse(wordIterator.isBoundary(text.indexOf('b'))); assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1)); assertTrue(wordIterator.isBoundary(text.indexOf('d'))); assertTrue(wordIterator.isBoundary(text.indexOf('-'))); assertTrue(wordIterator.isBoundary(text.indexOf('g'))); assertTrue(wordIterator.isBoundary(text.indexOf('.'))); assertTrue(wordIterator.isBoundary(text.indexOf('j'))); assertTrue(wordIterator.isBoundary(text.length())); } public void testNextBoundary() { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.nextBoundary(-1); fail("nextBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.nextBoundary(text.length() + 1); fail("nextBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } int currentOffset = 0; currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('c') + 1, currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('d'), currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('f') + 1, currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('g'), currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('i') + 1, currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('.') + 1, currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.indexOf('j'), currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(text.length(), currentOffset); currentOffset = wordIterator.nextBoundary(currentOffset); assertEquals(BreakIterator.DONE, currentOffset); } public void testPrevBoundary() { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.prevBoundary(-1); fail("prevBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.prevBoundary(text.length() + 1); fail("prevBoundary with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } int currentOffset = text.length(); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('j'), currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('.') + 1, currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('i') + 1, currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('g'), currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('f') + 1, currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('d'), currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('c') + 1, currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(text.indexOf('a'), currentOffset); currentOffset = wordIterator.prevBoundary(currentOffset); assertEquals(BreakIterator.DONE, currentOffset); } public void testGetBeginning() { { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.getBeginning(-1); fail("getBeginning with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getBeginning(text.length() + 1); fail("getBeginning with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1); fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1); fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } } { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a'))); assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c'))); assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1)); assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d'))); assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-'))); assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g'))); assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.'))); assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1)); assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j'))); assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1)); for (int i = 0; i < text.length(); i++) { assertEquals(wordIterator.getBeginning(i), wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i)); } } { // Japanese HIRAGANA letter + KATAKANA letters final String text = "\u3042\u30A2\u30A3\u30A4"; WordIterator wordIterator = new WordIterator(Locale.JAPANESE); wordIterator.setCharSequence(text, 0, text.length()); assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042'))); assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2'))); assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4'))); assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length())); assertEquals(text.indexOf('\u3042'), wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042'))); assertEquals(text.indexOf('\u3042'), wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2'))); assertEquals(text.indexOf('\u30A2'), wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4'))); assertEquals(text.indexOf('\u30A2'), wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length())); } } public void testGetEnd() { { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); try { wordIterator.getEnd(-1); fail("getEnd with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getEnd(text.length() + 1); fail("getEnd with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getNextWordEndOnTwoWordBoundary(-1); fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1); fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } } { final String text = "abc def-ghi. jkl"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a'))); assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c'))); assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1)); assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d'))); assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1)); assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g'))); assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1)); assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1)); assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j'))); assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1)); for (int i = 0; i < text.length(); i++) { assertEquals(wordIterator.getEnd(i), wordIterator.getNextWordEndOnTwoWordBoundary(i)); } } { // Japanese HIRAGANA letter + KATAKANA letters final String text = "\u3042\u30A2\u30A3\u30A4"; WordIterator wordIterator = new WordIterator(Locale.JAPANESE); wordIterator.setCharSequence(text, 0, text.length()); assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042'))); assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2'))); assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4'))); assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4') + 1)); assertEquals(text.indexOf('\u3042') + 1, wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042'))); assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2'))); assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4'))); assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1)); } } public void testGetPunctuationBeginning() { final String text = "abc!? (^^;) def"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); // TODO: Shouldn't this throw an exception? assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(BreakIterator.DONE)); try { wordIterator.getPunctuationBeginning(-2); fail("getPunctuationBeginning with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getPunctuationBeginning(text.length() + 1); fail("getPunctuationBeginning with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a'))); assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c'))); assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!'))); assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('?') + 1)); assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';'))); assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')'))); assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length())); } public void testGetPunctuationEnd() { final String text = "abc!? (^^;) def"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); // TODO: Shouldn't this throw an exception? assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(BreakIterator.DONE)); try { wordIterator.getPunctuationEnd(-2); fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException."); } catch (IllegalArgumentException e) { } try { wordIterator.getPunctuationEnd(text.length() + 1); fail("getPunctuationBeginning with invalid offset should throw " + "IllegalArgumentException."); } catch (IllegalArgumentException e) { } assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a'))); assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1)); assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('('))); assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2)); assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1)); assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d'))); assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length())); } public void testIsAfterPunctuation() { final String text = "abc!? (^^;) def"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a'))); assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!'))); assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?'))); assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1)); assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d'))); assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE)); assertFalse(wordIterator.isAfterPunctuation(text.length() + 1)); } public void testIsOnPunctuation() { final String text = "abc!? (^^;) def"; WordIterator wordIterator = new WordIterator(Locale.ENGLISH); wordIterator.setCharSequence(text, 0, text.length()); assertFalse(wordIterator.isOnPunctuation(text.indexOf('a'))); assertTrue(wordIterator.isOnPunctuation(text.indexOf('!'))); assertTrue(wordIterator.isOnPunctuation(text.indexOf('?'))); assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1)); assertTrue(wordIterator.isOnPunctuation(text.indexOf(')'))); assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1)); assertFalse(wordIterator.isOnPunctuation(text.indexOf('d'))); assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE)); assertFalse(wordIterator.isOnPunctuation(text.length())); assertFalse(wordIterator.isOnPunctuation(text.length() + 1)); } }