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