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 17 package android.text.method; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertTrue; 22 import static org.junit.Assert.fail; 23 24 import android.platform.test.annotations.Presubmit; 25 import android.support.test.filters.SmallTest; 26 import android.support.test.runner.AndroidJUnit4; 27 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 31 import java.text.BreakIterator; 32 import java.util.Locale; 33 34 // TODO(Bug: 24062099): Add more tests for non-ascii text. 35 @Presubmit 36 @SmallTest 37 @RunWith(AndroidJUnit4.class) 38 public class WordIteratorTest { 39 40 private WordIterator mWordIterator = new WordIterator(); 41 42 private void verifyIsWordWithSurrogate(int beginning, int end, int surrogateIndex) { 43 for (int i = beginning; i <= end; i++) { 44 if (i == surrogateIndex) continue; 45 assertEquals(beginning, mWordIterator.getBeginning(i)); 46 assertEquals(end, mWordIterator.getEnd(i)); 47 } 48 } 49 50 private void setCharSequence(String string) { 51 mWordIterator.setCharSequence(string, 0, string.length()); 52 } 53 54 private void verifyIsWord(int beginning, int end) { 55 verifyIsWordWithSurrogate(beginning, end, -1); 56 } 57 58 private void verifyIsNotWord(int beginning, int end) { 59 for (int i = beginning; i <= end; i++) { 60 assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(i)); 61 assertEquals(BreakIterator.DONE, mWordIterator.getEnd(i)); 62 } 63 } 64 65 @Test 66 public void testEmptyString() { 67 setCharSequence(""); 68 assertEquals(BreakIterator.DONE, mWordIterator.following(0)); 69 assertEquals(BreakIterator.DONE, mWordIterator.preceding(0)); 70 71 assertEquals(BreakIterator.DONE, mWordIterator.getBeginning(0)); 72 assertEquals(BreakIterator.DONE, mWordIterator.getEnd(0)); 73 } 74 75 @Test 76 public void testOneWord() { 77 setCharSequence("I"); 78 verifyIsWord(0, 1); 79 80 setCharSequence("am"); 81 verifyIsWord(0, 2); 82 83 setCharSequence("zen"); 84 verifyIsWord(0, 3); 85 } 86 87 @Test 88 public void testSpacesOnly() { 89 setCharSequence(" "); 90 verifyIsNotWord(0, 1); 91 92 setCharSequence(", "); 93 verifyIsNotWord(0, 2); 94 95 setCharSequence(":-)"); 96 verifyIsNotWord(0, 3); 97 } 98 99 @Test 100 public void testBeginningEnd() { 101 setCharSequence("Well hello, there! "); 102 // 0123456789012345678901 103 verifyIsWord(0, 4); 104 verifyIsWord(5, 10); 105 verifyIsNotWord(11, 13); 106 verifyIsWord(14, 19); 107 verifyIsNotWord(20, 21); 108 109 setCharSequence(" Another - sentence"); 110 // 012345678901234567890 111 verifyIsNotWord(0, 1); 112 verifyIsWord(2, 9); 113 verifyIsNotWord(10, 11); 114 verifyIsWord(12, 20); 115 116 setCharSequence("This is \u0644\u0627 tested"); // Lama-aleph 117 // 012345678 9 01234567 118 verifyIsWord(0, 4); 119 verifyIsWord(5, 7); 120 verifyIsWord(8, 10); 121 verifyIsWord(11, 17); 122 } 123 124 @Test 125 public void testSurrogate() { 126 final String gothicBairkan = "\uD800\uDF31"; 127 128 setCharSequence("one we" + gothicBairkan + "ird word"); 129 // 012345 67 890123456 130 131 verifyIsWord(0, 3); 132 // Skip index 7 (there is no point in starting between the two surrogate characters) 133 verifyIsWordWithSurrogate(4, 11, 7); 134 verifyIsWord(12, 16); 135 136 setCharSequence("one " + gothicBairkan + "xxx word"); 137 // 0123 45 678901234 138 139 verifyIsWord(0, 3); 140 verifyIsWordWithSurrogate(4, 9, 5); 141 verifyIsWord(10, 14); 142 143 setCharSequence("one xxx" + gothicBairkan + " word"); 144 // 0123456 78 901234 145 146 verifyIsWord(0, 3); 147 verifyIsWordWithSurrogate(4, 9, 8); 148 verifyIsWord(10, 14); 149 } 150 151 @Test 152 public void testSetCharSequence() { 153 final String text = "text"; 154 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 155 156 try { 157 wordIterator.setCharSequence(text, 100, 100); 158 fail("setCharSequence with invalid start and end values should throw " 159 + "IndexOutOfBoundsException."); 160 } catch (IndexOutOfBoundsException e) { 161 } 162 try { 163 wordIterator.setCharSequence(text, -100, -100); 164 fail("setCharSequence with invalid start and end values should throw " 165 + "IndexOutOfBoundsException."); 166 } catch (IndexOutOfBoundsException e) { 167 } 168 169 wordIterator.setCharSequence(text, 0, text.length()); 170 wordIterator.setCharSequence(text, 0, 0); 171 wordIterator.setCharSequence(text, text.length(), text.length()); 172 } 173 174 @Test 175 public void testWindowWidth() { 176 final String text = "aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk llll mmmm nnnn"; 177 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 178 179 // The first 'n' is more than 50 characters into the string. 180 wordIterator.setCharSequence(text, text.indexOf('n'), text.length()); 181 final int expectedWindowStart = text.indexOf('n') - 50; 182 assertEquals(expectedWindowStart, wordIterator.preceding(expectedWindowStart + 1)); 183 assertEquals(BreakIterator.DONE, wordIterator.preceding(expectedWindowStart)); 184 185 wordIterator.setCharSequence(text, 0, 1); 186 final int expectedWindowEnd = 1 + 50; 187 assertEquals(expectedWindowEnd, wordIterator.following(expectedWindowEnd - 1)); 188 assertEquals(BreakIterator.DONE, wordIterator.following(expectedWindowEnd)); 189 } 190 191 @Test 192 public void testPreceding() { 193 final String text = "abc def-ghi. jkl"; 194 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 195 wordIterator.setCharSequence(text, 0, text.length()); 196 197 try { 198 wordIterator.preceding(-1); 199 fail("preceding with invalid offset should throw IllegalArgumentException."); 200 } catch (IllegalArgumentException e) { 201 } 202 try { 203 wordIterator.preceding(text.length() + 1); 204 fail("preceding with invalid offset should throw IllegalArgumentException."); 205 } catch (IllegalArgumentException e) { 206 } 207 208 assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a'))); 209 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c'))); 210 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d'))); 211 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e'))); 212 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g'))); 213 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h'))); 214 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j'))); 215 assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l'))); 216 217 // The results should be the same even if we set an smaller window, since WordIterator 218 // enlargens the window by 50 code units on each side anyway. 219 wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e')); 220 221 assertEquals(BreakIterator.DONE, wordIterator.preceding(text.indexOf('a'))); 222 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('c'))); 223 assertEquals(text.indexOf('a'), wordIterator.preceding(text.indexOf('d'))); 224 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('e'))); 225 assertEquals(text.indexOf('d'), wordIterator.preceding(text.indexOf('g'))); 226 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('h'))); 227 assertEquals(text.indexOf('g'), wordIterator.preceding(text.indexOf('j'))); 228 assertEquals(text.indexOf('j'), wordIterator.preceding(text.indexOf('l'))); 229 } 230 231 @Test 232 public void testFollowing() { 233 final String text = "abc def-ghi. jkl"; 234 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 235 wordIterator.setCharSequence(text, 0, text.length()); 236 237 try { 238 wordIterator.following(-1); 239 fail("following with invalid offset should throw IllegalArgumentException."); 240 } catch (IllegalArgumentException e) { 241 } 242 try { 243 wordIterator.following(text.length() + 1); 244 fail("following with invalid offset should throw IllegalArgumentException."); 245 } catch (IllegalArgumentException e) { 246 } 247 248 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a'))); 249 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c'))); 250 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1)); 251 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d'))); 252 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-'))); 253 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g'))); 254 assertEquals(text.length(), wordIterator.following(text.indexOf('j'))); 255 assertEquals(BreakIterator.DONE, wordIterator.following(text.length())); 256 257 // The results should be the same even if we set an smaller window, since WordIterator 258 // enlargens the window by 50 code units on each side anyway. 259 wordIterator.setCharSequence(text, text.indexOf('d'), text.indexOf('e')); 260 261 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('a'))); 262 assertEquals(text.indexOf('c') + 1, wordIterator.following(text.indexOf('c'))); 263 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('c') + 1)); 264 assertEquals(text.indexOf('f') + 1, wordIterator.following(text.indexOf('d'))); 265 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('-'))); 266 assertEquals(text.indexOf('i') + 1, wordIterator.following(text.indexOf('g'))); 267 assertEquals(text.length(), wordIterator.following(text.indexOf('j'))); 268 assertEquals(BreakIterator.DONE, wordIterator.following(text.length())); 269 } 270 271 @Test 272 public void testIsBoundary() { 273 final String text = "abc def-ghi. jkl"; 274 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 275 wordIterator.setCharSequence(text, 0, text.length()); 276 277 try { 278 wordIterator.isBoundary(-1); 279 fail("isBoundary with invalid offset should throw IllegalArgumentException."); 280 } catch (IllegalArgumentException e) { 281 } 282 try { 283 wordIterator.isBoundary(text.length() + 1); 284 fail("isBoundary with invalid offset should throw IllegalArgumentException."); 285 } catch (IllegalArgumentException e) { 286 } 287 288 assertTrue(wordIterator.isBoundary(text.indexOf('a'))); 289 assertFalse(wordIterator.isBoundary(text.indexOf('b'))); 290 assertTrue(wordIterator.isBoundary(text.indexOf('c') + 1)); 291 assertTrue(wordIterator.isBoundary(text.indexOf('d'))); 292 assertTrue(wordIterator.isBoundary(text.indexOf('-'))); 293 assertTrue(wordIterator.isBoundary(text.indexOf('g'))); 294 assertTrue(wordIterator.isBoundary(text.indexOf('.'))); 295 assertTrue(wordIterator.isBoundary(text.indexOf('j'))); 296 assertTrue(wordIterator.isBoundary(text.length())); 297 } 298 299 @Test 300 public void testNextBoundary() { 301 final String text = "abc def-ghi. jkl"; 302 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 303 wordIterator.setCharSequence(text, 0, text.length()); 304 305 try { 306 wordIterator.nextBoundary(-1); 307 fail("nextBoundary with invalid offset should throw IllegalArgumentException."); 308 } catch (IllegalArgumentException e) { 309 } 310 try { 311 wordIterator.nextBoundary(text.length() + 1); 312 fail("nextBoundary with invalid offset should throw IllegalArgumentException."); 313 } catch (IllegalArgumentException e) { 314 } 315 316 317 int currentOffset = 0; 318 currentOffset = wordIterator.nextBoundary(currentOffset); 319 assertEquals(text.indexOf('c') + 1, currentOffset); 320 321 currentOffset = wordIterator.nextBoundary(currentOffset); 322 assertEquals(text.indexOf('d'), currentOffset); 323 324 currentOffset = wordIterator.nextBoundary(currentOffset); 325 assertEquals(text.indexOf('f') + 1, currentOffset); 326 327 currentOffset = wordIterator.nextBoundary(currentOffset); 328 assertEquals(text.indexOf('g'), currentOffset); 329 330 currentOffset = wordIterator.nextBoundary(currentOffset); 331 assertEquals(text.indexOf('i') + 1, currentOffset); 332 333 currentOffset = wordIterator.nextBoundary(currentOffset); 334 assertEquals(text.indexOf('.') + 1, currentOffset); 335 336 currentOffset = wordIterator.nextBoundary(currentOffset); 337 assertEquals(text.indexOf('j'), currentOffset); 338 339 currentOffset = wordIterator.nextBoundary(currentOffset); 340 assertEquals(text.length(), currentOffset); 341 342 currentOffset = wordIterator.nextBoundary(currentOffset); 343 assertEquals(BreakIterator.DONE, currentOffset); 344 } 345 346 @Test 347 public void testPrevBoundary() { 348 final String text = "abc def-ghi. jkl"; 349 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 350 wordIterator.setCharSequence(text, 0, text.length()); 351 352 try { 353 wordIterator.prevBoundary(-1); 354 fail("prevBoundary with invalid offset should throw IllegalArgumentException."); 355 } catch (IllegalArgumentException e) { 356 } 357 try { 358 wordIterator.prevBoundary(text.length() + 1); 359 fail("prevBoundary with invalid offset should throw IllegalArgumentException."); 360 } catch (IllegalArgumentException e) { 361 } 362 363 int currentOffset = text.length(); 364 currentOffset = wordIterator.prevBoundary(currentOffset); 365 assertEquals(text.indexOf('j'), currentOffset); 366 367 currentOffset = wordIterator.prevBoundary(currentOffset); 368 assertEquals(text.indexOf('.') + 1, currentOffset); 369 370 currentOffset = wordIterator.prevBoundary(currentOffset); 371 assertEquals(text.indexOf('i') + 1, currentOffset); 372 373 currentOffset = wordIterator.prevBoundary(currentOffset); 374 assertEquals(text.indexOf('g'), currentOffset); 375 376 currentOffset = wordIterator.prevBoundary(currentOffset); 377 assertEquals(text.indexOf('f') + 1, currentOffset); 378 379 currentOffset = wordIterator.prevBoundary(currentOffset); 380 assertEquals(text.indexOf('d'), currentOffset); 381 382 currentOffset = wordIterator.prevBoundary(currentOffset); 383 assertEquals(text.indexOf('c') + 1, currentOffset); 384 385 currentOffset = wordIterator.prevBoundary(currentOffset); 386 assertEquals(text.indexOf('a'), currentOffset); 387 388 currentOffset = wordIterator.prevBoundary(currentOffset); 389 assertEquals(BreakIterator.DONE, currentOffset); 390 } 391 392 @Test 393 public void testGetBeginning() { 394 { 395 final String text = "abc def-ghi. jkl"; 396 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 397 wordIterator.setCharSequence(text, 0, text.length()); 398 try { 399 wordIterator.getBeginning(-1); 400 fail("getBeginning with invalid offset should throw IllegalArgumentException."); 401 } catch (IllegalArgumentException e) { 402 } 403 try { 404 wordIterator.getBeginning(text.length() + 1); 405 fail("getBeginning with invalid offset should throw IllegalArgumentException."); 406 } catch (IllegalArgumentException e) { 407 } 408 try { 409 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(-1); 410 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " 411 + "IllegalArgumentException."); 412 } catch (IllegalArgumentException e) { 413 } 414 try { 415 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length() + 1); 416 fail("getPrevWordBeginningOnTwoWordsBoundary with invalid offset should throw " 417 + "IllegalArgumentException."); 418 } catch (IllegalArgumentException e) { 419 } 420 } 421 422 { 423 final String text = "abc def-ghi. jkl"; 424 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 425 wordIterator.setCharSequence(text, 0, text.length()); 426 427 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('a'))); 428 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c'))); 429 assertEquals(text.indexOf('a'), wordIterator.getBeginning(text.indexOf('c') + 1)); 430 assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('d'))); 431 assertEquals(text.indexOf('d'), wordIterator.getBeginning(text.indexOf('-'))); 432 assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('g'))); 433 assertEquals(text.indexOf('g'), wordIterator.getBeginning(text.indexOf('.'))); 434 assertEquals(BreakIterator.DONE, wordIterator.getBeginning(text.indexOf('.') + 1)); 435 assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('j'))); 436 assertEquals(text.indexOf('j'), wordIterator.getBeginning(text.indexOf('l') + 1)); 437 438 for (int i = 0; i < text.length(); i++) { 439 assertEquals(wordIterator.getBeginning(i), 440 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(i)); 441 } 442 } 443 444 { 445 // Japanese HIRAGANA letter + KATAKANA letters 446 final String text = "\u3042\u30A2\u30A3\u30A4"; 447 WordIterator wordIterator = new WordIterator(Locale.JAPANESE); 448 wordIterator.setCharSequence(text, 0, text.length()); 449 450 assertEquals(text.indexOf('\u3042'), wordIterator.getBeginning(text.indexOf('\u3042'))); 451 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A2'))); 452 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.indexOf('\u30A4'))); 453 assertEquals(text.indexOf('\u30A2'), wordIterator.getBeginning(text.length())); 454 455 assertEquals(text.indexOf('\u3042'), 456 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u3042'))); 457 assertEquals(text.indexOf('\u3042'), 458 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A2'))); 459 assertEquals(text.indexOf('\u30A2'), 460 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.indexOf('\u30A4'))); 461 assertEquals(text.indexOf('\u30A2'), 462 wordIterator.getPrevWordBeginningOnTwoWordsBoundary(text.length())); 463 } 464 } 465 466 @Test 467 public void testGetEnd() { 468 { 469 final String text = "abc def-ghi. jkl"; 470 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 471 wordIterator.setCharSequence(text, 0, text.length()); 472 try { 473 wordIterator.getEnd(-1); 474 fail("getEnd with invalid offset should throw IllegalArgumentException."); 475 } catch (IllegalArgumentException e) { 476 } 477 try { 478 wordIterator.getEnd(text.length() + 1); 479 fail("getEnd with invalid offset should throw IllegalArgumentException."); 480 } catch (IllegalArgumentException e) { 481 } 482 try { 483 wordIterator.getNextWordEndOnTwoWordBoundary(-1); 484 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " 485 + "IllegalArgumentException."); 486 } catch (IllegalArgumentException e) { 487 } 488 try { 489 wordIterator.getNextWordEndOnTwoWordBoundary(text.length() + 1); 490 fail("getNextWordEndOnTwoWordBoundary with invalid offset should throw " 491 + "IllegalArgumentException."); 492 } catch (IllegalArgumentException e) { 493 } 494 } 495 496 { 497 final String text = "abc def-ghi. jkl"; 498 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 499 wordIterator.setCharSequence(text, 0, text.length()); 500 501 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('a'))); 502 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c'))); 503 assertEquals(text.indexOf('c') + 1, wordIterator.getEnd(text.indexOf('c') + 1)); 504 assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('d'))); 505 assertEquals(text.indexOf('f') + 1, wordIterator.getEnd(text.indexOf('f') + 1)); 506 assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('g'))); 507 assertEquals(text.indexOf('i') + 1, wordIterator.getEnd(text.indexOf('i') + 1)); 508 assertEquals(BreakIterator.DONE, wordIterator.getEnd(text.indexOf('.') + 1)); 509 assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('j'))); 510 assertEquals(text.indexOf('l') + 1, wordIterator.getEnd(text.indexOf('l') + 1)); 511 512 for (int i = 0; i < text.length(); i++) { 513 assertEquals(wordIterator.getEnd(i), 514 wordIterator.getNextWordEndOnTwoWordBoundary(i)); 515 } 516 } 517 518 { 519 // Japanese HIRAGANA letter + KATAKANA letters 520 final String text = "\u3042\u30A2\u30A3\u30A4"; 521 WordIterator wordIterator = new WordIterator(Locale.JAPANESE); 522 wordIterator.setCharSequence(text, 0, text.length()); 523 524 assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u3042'))); 525 assertEquals(text.indexOf('\u3042') + 1, wordIterator.getEnd(text.indexOf('\u30A2'))); 526 assertEquals(text.indexOf('\u30A4') + 1, wordIterator.getEnd(text.indexOf('\u30A4'))); 527 assertEquals(text.indexOf('\u30A4') + 1, 528 wordIterator.getEnd(text.indexOf('\u30A4') + 1)); 529 530 assertEquals(text.indexOf('\u3042') + 1, 531 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u3042'))); 532 assertEquals(text.indexOf('\u30A4') + 1, 533 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A2'))); 534 assertEquals(text.indexOf('\u30A4') + 1, 535 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4'))); 536 assertEquals(text.indexOf('\u30A4') + 1, 537 wordIterator.getNextWordEndOnTwoWordBoundary(text.indexOf('\u30A4') + 1)); 538 } 539 } 540 541 @Test 542 public void testGetPunctuationBeginning() { 543 final String text = "abc!? (^^;) def"; 544 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 545 wordIterator.setCharSequence(text, 0, text.length()); 546 547 try { 548 wordIterator.getPunctuationBeginning(BreakIterator.DONE); 549 fail("getPunctuationBeginning with invalid offset should throw " 550 + "IllegalArgumentException."); 551 } catch (IllegalArgumentException e) { 552 } 553 try { 554 wordIterator.getPunctuationBeginning(-2); 555 fail("getPunctuationBeginning with invalid offset should throw " 556 + "IllegalArgumentException."); 557 } catch (IllegalArgumentException e) { 558 } 559 try { 560 wordIterator.getPunctuationBeginning(text.length() + 1); 561 fail("getPunctuationBeginning with invalid offset should throw " 562 + "IllegalArgumentException."); 563 } catch (IllegalArgumentException e) { 564 } 565 566 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('a'))); 567 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationBeginning(text.indexOf('c'))); 568 assertEquals(text.indexOf('!'), wordIterator.getPunctuationBeginning(text.indexOf('!'))); 569 assertEquals(text.indexOf('!'), 570 wordIterator.getPunctuationBeginning(text.indexOf('?') + 1)); 571 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(';'))); 572 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.indexOf(')'))); 573 assertEquals(text.indexOf(';'), wordIterator.getPunctuationBeginning(text.length())); 574 } 575 576 @Test 577 public void testGetPunctuationEnd() { 578 final String text = "abc!? (^^;) def"; 579 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 580 wordIterator.setCharSequence(text, 0, text.length()); 581 582 try { 583 wordIterator.getPunctuationEnd(BreakIterator.DONE); 584 fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException."); 585 } catch (IllegalArgumentException e) { 586 } 587 try { 588 wordIterator.getPunctuationEnd(-2); 589 fail("getPunctuationEnd with invalid offset should throw IllegalArgumentException."); 590 } catch (IllegalArgumentException e) { 591 } 592 try { 593 wordIterator.getPunctuationEnd(text.length() + 1); 594 fail("getPunctuationBeginning with invalid offset should throw " 595 + "IllegalArgumentException."); 596 } catch (IllegalArgumentException e) { 597 } 598 599 assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('a'))); 600 assertEquals(text.indexOf('?') + 1, wordIterator.getPunctuationEnd(text.indexOf('?') + 1)); 601 assertEquals(text.indexOf('(') + 1, wordIterator.getPunctuationEnd(text.indexOf('('))); 602 assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf('(') + 2)); 603 assertEquals(text.indexOf(')') + 1, wordIterator.getPunctuationEnd(text.indexOf(')') + 1)); 604 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.indexOf('d'))); 605 assertEquals(BreakIterator.DONE, wordIterator.getPunctuationEnd(text.length())); 606 } 607 608 @Test 609 public void testIsAfterPunctuation() { 610 final String text = "abc!? (^^;) def"; 611 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 612 wordIterator.setCharSequence(text, 0, text.length()); 613 614 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('a'))); 615 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('!'))); 616 assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?'))); 617 assertTrue(wordIterator.isAfterPunctuation(text.indexOf('?') + 1)); 618 assertFalse(wordIterator.isAfterPunctuation(text.indexOf('d'))); 619 620 assertFalse(wordIterator.isAfterPunctuation(BreakIterator.DONE)); 621 assertFalse(wordIterator.isAfterPunctuation(text.length() + 1)); 622 } 623 624 @Test 625 public void testIsOnPunctuation() { 626 final String text = "abc!? (^^;) def"; 627 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 628 wordIterator.setCharSequence(text, 0, text.length()); 629 630 assertFalse(wordIterator.isOnPunctuation(text.indexOf('a'))); 631 assertTrue(wordIterator.isOnPunctuation(text.indexOf('!'))); 632 assertTrue(wordIterator.isOnPunctuation(text.indexOf('?'))); 633 assertFalse(wordIterator.isOnPunctuation(text.indexOf('?') + 1)); 634 assertTrue(wordIterator.isOnPunctuation(text.indexOf(')'))); 635 assertFalse(wordIterator.isOnPunctuation(text.indexOf(')') + 1)); 636 assertFalse(wordIterator.isOnPunctuation(text.indexOf('d'))); 637 638 assertFalse(wordIterator.isOnPunctuation(BreakIterator.DONE)); 639 assertFalse(wordIterator.isOnPunctuation(text.length())); 640 assertFalse(wordIterator.isOnPunctuation(text.length() + 1)); 641 } 642 643 @Test 644 public void testApostropheMiddleOfWord() { 645 // These tests confirm that the word "isn't" is treated like one word. 646 final String text = "isn't he"; 647 WordIterator wordIterator = new WordIterator(Locale.ENGLISH); 648 wordIterator.setCharSequence(text, 0, text.length()); 649 650 assertEquals(text.indexOf('i'), wordIterator.preceding(text.indexOf('h'))); 651 assertEquals(text.indexOf('t') + 1, wordIterator.following(text.indexOf('i'))); 652 653 assertTrue(wordIterator.isBoundary(text.indexOf('i'))); 654 assertFalse(wordIterator.isBoundary(text.indexOf('\''))); 655 assertFalse(wordIterator.isBoundary(text.indexOf('t'))); 656 assertTrue(wordIterator.isBoundary(text.indexOf('t') + 1)); 657 assertTrue(wordIterator.isBoundary(text.indexOf('h'))); 658 659 assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('i'))); 660 assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('n'))); 661 assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('\''))); 662 assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t'))); 663 assertEquals(text.indexOf('i'), wordIterator.getBeginning(text.indexOf('t') + 1)); 664 assertEquals(text.indexOf('h'), wordIterator.getBeginning(text.indexOf('h'))); 665 666 assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('i'))); 667 assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('n'))); 668 assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('\''))); 669 assertEquals(text.indexOf('t') + 1, wordIterator.getEnd(text.indexOf('t'))); 670 assertEquals(text.indexOf('e') + 1, wordIterator.getEnd(text.indexOf('h'))); 671 } 672 } 673