WordIteratorTest.java revision 4968a219bf091df2e76ada29d39531bdde647c88
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.text.method; 18 19import android.test.AndroidTestCase; 20 21import java.text.BreakIterator; 22import java.util.Locale; 23 24// TODO(Bug: 24062099): Add more tests for non-ascii text. 25public class WordIteratorTest extends AndroidTestCase { 26 27 public void testSetCharSequence() { 28 final String text = "text"; 29 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 30 31 try { 32 wordIterator.setCharSequence(text, 100, 100); 33 fail("setCharSequence with invalid start and end values should throw " 34 + "IndexOutOfBoundsException."); 35 } catch (IndexOutOfBoundsException e) { 36 } 37 try { 38 wordIterator.setCharSequence(text, -100, -100); 39 fail("setCharSequence with invalid start and end values should throw " 40 + "IndexOutOfBoundsException."); 41 } catch (IndexOutOfBoundsException e) { 42 } 43 44 wordIterator.setCharSequence(text, 0, text.length()); 45 wordIterator.setCharSequence(text, 0, 0); 46 wordIterator.setCharSequence(text, text.length(), text.length()); 47 } 48 49 public void testPreceding() { 50 final String text = "abc def-ghi. jkl"; 51 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 52 wordIterator.setCharSequence(text, 0, text.length()); 53 54 try { 55 wordIterator.preceding(-1); 56 fail("preceding with invalid offset should throw IllegalArgumentException."); 57 } catch (IllegalArgumentException e) { 58 } 59 try { 60 wordIterator.preceding(text.length() + 1); 61 fail("preceding with invalid offset should throw IllegalArgumentException."); 62 } catch (IllegalArgumentException e) { 63 } 64 65 assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a'))); 66 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c'))); 67 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d'))); 68 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e'))); 69 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g'))); 70 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h'))); 71 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j'))); 72 assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l'))); 73 } 74 75 public void testFollowing() { 76 final String text = "abc def-ghi. jkl"; 77 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 78 wordIterator.setCharSequence(text, 0, text.length()); 79 80 try { 81 wordIterator.following(-1); 82 fail("following with invalid offset should throw IllegalArgumentException."); 83 } catch (IllegalArgumentException e) { 84 } 85 try { 86 wordIterator.following(text.length() + 1); 87 fail("following with invalid offset should throw IllegalArgumentException."); 88 } catch (IllegalArgumentException e) { 89 } 90 91 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a'))); 92 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c'))); 93 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1)); 94 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d'))); 95 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-'))); 96 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g'))); 97 assertEquals(text.length(), wordIterator.following(text.indexOf('j'))); 98 assertEquals(BreakIterator.DONE, wordIterator.following(text.length())); 99 } 100 101 public void testIsBoundary() { 102 final String text = "abc def-ghi. jkl"; 103 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 104 wordIterator.setCharSequence(text, 0, text.length()); 105 106 try { 107 wordIterator.isBoundary(-1); 108 fail("isBoundary with invalid offset should throw IllegalArgumentException."); 109 } catch (IllegalArgumentException e) { 110 } 111 try { 112 wordIterator.isBoundary(text.length() + 1); 113 fail("isBoundary with invalid offset should throw IllegalArgumentException."); 114 } catch (IllegalArgumentException e) { 115 } 116 117 assertTrue(wordIterator.isBoundary(text.indexOf('a'))); 118 assertFalse(wordIterator.isBoundary(text.indexOf('b'))); 119 assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1)); 120 assertTrue(wordIterator.isBoundary(text.indexOf('d'))); 121 assertTrue(wordIterator.isBoundary(text.indexOf('-'))); 122 assertTrue(wordIterator.isBoundary(text.indexOf('g'))); 123 assertTrue(wordIterator.isBoundary(text.indexOf('.'))); 124 assertTrue(wordIterator.isBoundary(text.indexOf('j'))); 125 assertTrue(wordIterator.isBoundary(text.length())); 126 } 127 128 public void testNextBoundary() { 129 final String text = "abc def-ghi. jkl"; 130 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 131 wordIterator.setCharSequence(text, 0, text.length()); 132 133 try { 134 wordIterator.nextBoundary(-1); 135 fail("nextBoundary with invalid offset should throw IllegalArgumentException."); 136 } catch (IllegalArgumentException e) { 137 } 138 try { 139 wordIterator.nextBoundary(text.length() + 1); 140 fail("nextBoundary with invalid offset should throw IllegalArgumentException."); 141 } catch (IllegalArgumentException e) { 142 } 143 144 145 int currentOffset = 0; 146 currentOffset = wordIterator.nextBoundary(currentOffset); 147 assertEquals(text.indexOf('c') + 1, currentOffset); 148 149 currentOffset = wordIterator.nextBoundary(currentOffset); 150 assertEquals(text.indexOf('d'), currentOffset); 151 152 currentOffset = wordIterator.nextBoundary(currentOffset); 153 assertEquals(text.indexOf('f') + 1, currentOffset); 154 155 currentOffset = wordIterator.nextBoundary(currentOffset); 156 assertEquals(text.indexOf('g'), currentOffset); 157 158 currentOffset = wordIterator.nextBoundary(currentOffset); 159 assertEquals(text.indexOf('i') + 1, currentOffset); 160 161 currentOffset = wordIterator.nextBoundary(currentOffset); 162 assertEquals(text.indexOf('.') + 1, currentOffset); 163 164 currentOffset = wordIterator.nextBoundary(currentOffset); 165 assertEquals(text.indexOf('j'), currentOffset); 166 167 currentOffset = wordIterator.nextBoundary(currentOffset); 168 assertEquals(text.length(), currentOffset); 169 170 currentOffset = wordIterator.nextBoundary(currentOffset); 171 assertEquals(BreakIterator.DONE, currentOffset); 172 } 173 174 public void testPrevBoundary() { 175 final String text = "abc def-ghi. jkl"; 176 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 177 wordIterator.setCharSequence(text, 0, text.length()); 178 179 try { 180 wordIterator.prevBoundary(-1); 181 fail("prevBoundary with invalid offset should throw IllegalArgumentException."); 182 } catch (IllegalArgumentException e) { 183 } 184 try { 185 wordIterator.prevBoundary(text.length() + 1); 186 fail("prevBoundary with invalid offset should throw IllegalArgumentException."); 187 } catch (IllegalArgumentException e) { 188 } 189 190 int currentOffset = text.length(); 191 currentOffset = wordIterator.prevBoundary(currentOffset); 192 assertEquals(text.indexOf('j'), currentOffset); 193 194 currentOffset = wordIterator.prevBoundary(currentOffset); 195 assertEquals(text.indexOf('.') + 1, currentOffset); 196 197 currentOffset = wordIterator.prevBoundary(currentOffset); 198 assertEquals(text.indexOf('i') + 1, currentOffset); 199 200 currentOffset = wordIterator.prevBoundary(currentOffset); 201 assertEquals(text.indexOf('g'), currentOffset); 202 203 currentOffset = wordIterator.prevBoundary(currentOffset); 204 assertEquals(text.indexOf('f') + 1, currentOffset); 205 206 currentOffset = wordIterator.prevBoundary(currentOffset); 207 assertEquals(text.indexOf('d'), currentOffset); 208 209 currentOffset = wordIterator.prevBoundary(currentOffset); 210 assertEquals(text.indexOf('c') + 1, currentOffset); 211 212 currentOffset = wordIterator.prevBoundary(currentOffset); 213 assertEquals(text.indexOf('a'), currentOffset); 214 215 currentOffset = wordIterator.prevBoundary(currentOffset); 216 assertEquals(BreakIterator.DONE, currentOffset); 217 } 218 219 public void testGetBeginning() { 220 { 221 final String text = "abc def-ghi. jkl"; 222 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 223 wordIterator.setCharSequence(text, 0, text.length()); 224 try { 225 wordIterator.getBeginning(-1); 226 fail("getBeginning with invalid offset should throw IllegalArgumentException."); 227 } catch (IllegalArgumentException e) { 228 } 229 try { 230 wordIterator.getBeginning(text.length() + 1); 231 fail("getBeginning with invalid offset should throw IllegalArgumentException."); 232 } catch (IllegalArgumentException e) { 233 } 234 try { 235 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1); 236 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " 237 + "IllegalArgumentException."); 238 } catch (IllegalArgumentException e) { 239 } 240 try { 241 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1); 242 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " 243 + "IllegalArgumentException."); 244 } catch (IllegalArgumentException e) { 245 } 246 } 247 248 { 249 final String text = "abc def-ghi. jkl"; 250 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 251 wordIterator.setCharSequence(text, 0, text.length()); 252 253 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a'))); 254 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c'))); 255 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1)); 256 assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d'))); 257 assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-'))); 258 assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g'))); 259 assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.'))); 260 assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1)); 261 assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j'))); 262 assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1)); 263 264 for (int i = 0; i < text.length(); i++) { 265 assertEquals(wordIterator.getBeginning(i), 266 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i)); 267 } 268 } 269 270 { 271 // Japanese HIRAGANA letter + KATAKANA letters 272 final String text = "\u3042\u30A2\u30A3\u30A4"; 273 WordIterator wordIterator = new WordIterator(Locale.JAPANESE); 274 wordIterator.setCharSequence(text, 0, text.length()); 275 276 assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042'))); 277 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2'))); 278 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4'))); 279 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length())); 280 281 assertEquals(text.indexOf('\u3042'), 282 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042'))); 283 assertEquals(text.indexOf('\u3042'), 284 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2'))); 285 assertEquals(text.indexOf('\u30A2'), 286 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4'))); 287 assertEquals(text.indexOf('\u30A2'), 288 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length())); 289 } 290 } 291 292 public void testGetEnd() { 293 { 294 final String text = "abc def-ghi. jkl"; 295 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 296 wordIterator.setCharSequence(text, 0, text.length()); 297 try { 298 wordIterator.getEnd(-1); 299 fail("getEnd with invalid offset should throw IllegalArgumentException."); 300 } catch (IllegalArgumentException e) { 301 } 302 try { 303 wordIterator.getEnd(text.length() + 1); 304 fail("getEnd with invalid offset should throw IllegalArgumentException."); 305 } catch (IllegalArgumentException e) { 306 } 307 try { 308 wordIterator.getNextWordEndOnTwoWordBoundary(-1); 309 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " 310 + "IllegalArgumentException."); 311 } catch (IllegalArgumentException e) { 312 } 313 try { 314 wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1); 315 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " 316 + "IllegalArgumentException."); 317 } catch (IllegalArgumentException e) { 318 } 319 } 320 321 { 322 final String text = "abc def-ghi. jkl"; 323 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 324 wordIterator.setCharSequence(text, 0, text.length()); 325 326 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a'))); 327 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c'))); 328 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1)); 329 assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d'))); 330 assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1)); 331 assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g'))); 332 assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1)); 333 assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1)); 334 assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j'))); 335 assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1)); 336 337 for (int i = 0; i < text.length(); i++) { 338 assertEquals(wordIterator.getEnd(i), 339 wordIterator.getNextWordEndOnTwoWordBoundary(i)); 340 } 341 } 342 343 { 344 // Japanese HIRAGANA letter + KATAKANA letters 345 final String text = "\u3042\u30A2\u30A3\u30A4"; 346 WordIterator wordIterator = new WordIterator(Locale.JAPANESE); 347 wordIterator.setCharSequence(text, 0, text.length()); 348 349 assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042'))); 350 assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2'))); 351 assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4'))); 352 assertEquals(text.indexOf('\u30A4') + 1, 353 wordIterator.getEnd(text.indexOf('\u30A4') + 1)); 354 355 assertEquals(text.indexOf('\u3042') + 1, 356 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042'))); 357 assertEquals(text.indexOf('\u30A4') + 1, 358 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2'))); 359 assertEquals(text.indexOf('\u30A4') + 1, 360 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4'))); 361 assertEquals(text.indexOf('\u30A4') + 1, 362 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1)); 363 } 364 } 365 366 public void testGetPunctuationBeginning() { 367 final String text = "abc!? (^^;) def"; 368 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 369 wordIterator.setCharSequence(text, 0, text.length()); 370 371 // TODO: Shouldn't this throw an exception? 372 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(BreakIterator.DONE)); 373 374 try { 375 wordIterator.getPunctuationBeginning(-2); 376 fail("getPunctuationBeginning with invalid offset should throw " 377 + "IllegalArgumentException."); 378 } catch (IllegalArgumentException e) { 379 } 380 try { 381 wordIterator.getPunctuationBeginning(text.length() + 1); 382 fail("getPunctuationBeginning with invalid offset should throw " 383 + "IllegalArgumentException."); 384 } catch (IllegalArgumentException e) { 385 } 386 387 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a'))); 388 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c'))); 389 assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!'))); 390 assertEquals(text.indexOf('!'), 391 wordIterator.getPunctuationBeginning(text.indexOf('?') + 1)); 392 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';'))); 393 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')'))); 394 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length())); 395 } 396 397 public void testGetPunctuationEnd() { 398 final String text = "abc!? (^^;) def"; 399 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 400 wordIterator.setCharSequence(text, 0, text.length()); 401 402 // TODO: Shouldn't this throw an exception? 403 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(BreakIterator.DONE)); 404 405 try { 406 wordIterator.getPunctuationEnd(-2); 407 fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException."); 408 } catch (IllegalArgumentException e) { 409 } 410 try { 411 wordIterator.getPunctuationEnd(text.length() + 1); 412 fail("getPunctuationBeginning with invalid offset should throw " 413 + "IllegalArgumentException."); 414 } catch (IllegalArgumentException e) { 415 } 416 417 assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a'))); 418 assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1)); 419 assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('('))); 420 assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2)); 421 assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1)); 422 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d'))); 423 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length())); 424 } 425 426 public void testIsAfterPunctuation() { 427 final String text = "abc!? (^^;) def"; 428 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 429 wordIterator.setCharSequence(text, 0, text.length()); 430 431 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a'))); 432 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!'))); 433 assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?'))); 434 assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1)); 435 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d'))); 436 437 assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE)); 438 assertFalse(wordIterator.isAfterPunctuation(text.length() + 1)); 439 } 440 441 public void testIsOnPunctuation() { 442 final String text = "abc!? (^^;) def"; 443 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 444 wordIterator.setCharSequence(text, 0, text.length()); 445 446 assertFalse(wordIterator.isOnPunctuation(text.indexOf('a'))); 447 assertTrue(wordIterator.isOnPunctuation(text.indexOf('!'))); 448 assertTrue(wordIterator.isOnPunctuation(text.indexOf('?'))); 449 assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1)); 450 assertTrue(wordIterator.isOnPunctuation(text.indexOf(')'))); 451 assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1)); 452 assertFalse(wordIterator.isOnPunctuation(text.indexOf('d'))); 453 454 assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE)); 455 assertFalse(wordIterator.isOnPunctuation(text.length())); 456 assertFalse(wordIterator.isOnPunctuation(text.length() + 1)); 457 } 458} 459