1 /* 2 * Copyright (C) 2008 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.cts; 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.support.test.filters.SmallTest; 25 import android.support.test.runner.AndroidJUnit4; 26 import android.text.Layout; 27 import android.text.Selection; 28 import android.text.SpanWatcher; 29 import android.text.Spannable; 30 import android.text.SpannableStringBuilder; 31 import android.text.StaticLayout; 32 import android.text.TextPaint; 33 34 import org.junit.Test; 35 import org.junit.runner.RunWith; 36 37 import java.util.concurrent.CountDownLatch; 38 39 @SmallTest 40 @RunWith(AndroidJUnit4.class) 41 public class SelectionTest { 42 @Test 43 public void testGetSelectionStart() { 44 CharSequence text = "hello, world"; 45 SpannableStringBuilder builder = new SpannableStringBuilder(text); 46 assertEquals(-1, Selection.getSelectionStart(builder)); 47 48 Selection.setSelection(builder, 3, 8); 49 assertEquals(3, Selection.getSelectionStart(builder)); 50 51 Selection.setSelection(builder, 3, 9); 52 assertEquals(3, Selection.getSelectionStart(builder)); 53 54 Selection.setSelection(builder, 5, 7); 55 assertEquals(5, Selection.getSelectionStart(builder)); 56 57 assertEquals(-1, Selection.getSelectionStart(null)); 58 } 59 60 @Test 61 public void testGetSelectionEnd() { 62 CharSequence text = "hello, world"; 63 SpannableStringBuilder builder = new SpannableStringBuilder(text); 64 assertEquals(-1, Selection.getSelectionEnd(builder)); 65 66 Selection.setSelection(builder, 0, 10); 67 assertEquals(10, Selection.getSelectionEnd(builder)); 68 69 Selection.setSelection(builder, 1, 8); 70 assertEquals(8, Selection.getSelectionEnd(builder)); 71 72 Selection.setSelection(builder, 2, 8); 73 assertEquals(8, Selection.getSelectionEnd(builder)); 74 75 assertEquals(-1, Selection.getSelectionStart(null)); 76 } 77 78 @Test 79 public void testSetSelection1() { 80 CharSequence text = "hello, world"; 81 SpannableStringBuilder builder = new SpannableStringBuilder(text); 82 assertEquals(-1, Selection.getSelectionStart(builder)); 83 assertEquals(-1, Selection.getSelectionEnd(builder)); 84 85 Selection.setSelection(builder, 3, 6); 86 assertEquals(3, Selection.getSelectionStart(builder)); 87 assertEquals(6, Selection.getSelectionEnd(builder)); 88 89 Selection.setSelection(builder, 3, 7); 90 assertEquals(3, Selection.getSelectionStart(builder)); 91 assertEquals(7, Selection.getSelectionEnd(builder)); 92 93 Selection.setSelection(builder, 3, 7); 94 assertEquals(3, Selection.getSelectionStart(builder)); 95 assertEquals(7, Selection.getSelectionEnd(builder)); 96 97 Selection.setSelection(builder, 6, 2); 98 assertEquals(6, Selection.getSelectionStart(builder)); 99 assertEquals(2, Selection.getSelectionEnd(builder)); 100 101 try { 102 Selection.setSelection(builder, -1, 100); 103 fail("should throw IndexOutOfBoundsException"); 104 } catch (IndexOutOfBoundsException e) { 105 } 106 } 107 108 @Test 109 public void testSetSelection2() { 110 SpannableStringBuilder builder = new SpannableStringBuilder("hello, world"); 111 assertEquals(-1, Selection.getSelectionStart(builder)); 112 assertEquals(-1, Selection.getSelectionEnd(builder)); 113 114 Selection.setSelection(builder, 1, 4); 115 assertEquals(1, Selection.getSelectionStart(builder)); 116 assertEquals(4, Selection.getSelectionEnd(builder)); 117 118 Selection.setSelection(builder, 3); 119 assertEquals(3, Selection.getSelectionStart(builder)); 120 assertEquals(3, Selection.getSelectionEnd(builder)); 121 122 try { 123 Selection.setSelection(builder, -1); 124 fail("should throw IndexOutOfBoundsException"); 125 } catch (IndexOutOfBoundsException e) { 126 } 127 128 try { 129 Selection.setSelection(builder, 100); 130 fail("should throw IndexOutOfBoundsException"); 131 } catch (IndexOutOfBoundsException e) { 132 } 133 } 134 135 @Test 136 public void testRemoveSelection() { 137 CharSequence text = "hello, world"; 138 SpannableStringBuilder builder = new SpannableStringBuilder(text); 139 assertEquals(-1, Selection.getSelectionStart(builder)); 140 assertEquals(-1, Selection.getSelectionEnd(builder)); 141 142 Selection.removeSelection(builder); 143 assertEquals(-1, Selection.getSelectionStart(builder)); 144 assertEquals(-1, Selection.getSelectionEnd(builder)); 145 146 Selection.setSelection(builder, 1, 6); 147 assertEquals(1, Selection.getSelectionStart(builder)); 148 assertEquals(6, Selection.getSelectionEnd(builder)); 149 150 Selection.removeSelection(builder); 151 assertEquals(-1, Selection.getSelectionStart(builder)); 152 assertEquals(-1, Selection.getSelectionEnd(builder)); 153 } 154 155 @Test 156 public void testSelectAll() { 157 CharSequence text = "hello, world"; 158 SpannableStringBuilder builder = new SpannableStringBuilder(text); 159 assertEquals(-1, Selection.getSelectionStart(builder)); 160 assertEquals(-1, Selection.getSelectionEnd(builder));; 161 162 Selection.selectAll(builder); 163 assertEquals(0, Selection.getSelectionStart(builder)); 164 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 165 166 Selection.setSelection(builder, 4, 5); 167 Selection.selectAll(builder); 168 assertEquals(0, Selection.getSelectionStart(builder)); 169 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 170 171 Selection.setSelection(builder, 8, 4); 172 Selection.selectAll(builder); 173 assertEquals(0, Selection.getSelectionStart(builder)); 174 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 175 176 SpannableStringBuilder empty = new SpannableStringBuilder(); 177 Selection.selectAll(empty); 178 assertEquals(0, Selection.getSelectionStart(empty)); 179 assertEquals(0, Selection.getSelectionEnd(empty)); 180 } 181 182 @Test 183 public void testMoveLeft() { 184 CharSequence text = "hello\nworld"; 185 SpannableStringBuilder builder = new SpannableStringBuilder(text); 186 StaticLayout layout = new StaticLayout(text, new TextPaint(), 50, null, 0, 0, false); 187 assertEquals(-1, Selection.getSelectionStart(builder)); 188 assertEquals(-1, Selection.getSelectionEnd(builder)); 189 190 Selection.setSelection(builder, 6, 8); 191 assertTrue(Selection.moveLeft(builder, layout)); 192 assertEquals(6, Selection.getSelectionStart(builder)); 193 assertEquals(6, Selection.getSelectionEnd(builder)); 194 195 assertTrue(Selection.moveLeft(builder, layout)); 196 assertEquals(5, Selection.getSelectionStart(builder)); 197 assertEquals(5, Selection.getSelectionEnd(builder)); 198 199 Selection.setSelection(builder, 0, 0); 200 assertFalse(Selection.moveLeft(builder, layout)); 201 assertEquals(0, Selection.getSelectionStart(builder)); 202 assertEquals(0, Selection.getSelectionEnd(builder)); 203 204 Selection.selectAll(builder); 205 assertTrue(Selection.moveLeft(builder, layout)); 206 assertEquals(0, Selection.getSelectionStart(builder)); 207 assertEquals(0, Selection.getSelectionEnd(builder)); 208 } 209 210 @Test 211 public void testMoveRight() { 212 CharSequence text = "hello\nworld"; 213 SpannableStringBuilder builder = new SpannableStringBuilder(text); 214 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 215 assertEquals(-1, Selection.getSelectionStart(builder)); 216 assertEquals(-1, Selection.getSelectionEnd(builder)); 217 218 Selection.setSelection(builder,1, 5); 219 assertTrue(Selection.moveRight(builder, layout)); 220 assertEquals(5, Selection.getSelectionStart(builder)); 221 assertEquals(5, Selection.getSelectionEnd(builder)); 222 223 assertTrue(Selection.moveRight(builder, layout)); 224 assertEquals(6, Selection.getSelectionStart(builder)); 225 assertEquals(6, Selection.getSelectionEnd(builder)); 226 227 assertTrue(Selection.moveRight(builder, layout)); 228 assertEquals(7, Selection.getSelectionStart(builder)); 229 assertEquals(7, Selection.getSelectionEnd(builder)); 230 231 Selection.setSelection(builder, text.length(), text.length()); 232 assertFalse(Selection.moveRight(builder, layout)); 233 assertEquals(text.length(), Selection.getSelectionStart(builder)); 234 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 235 236 Selection.selectAll(builder); 237 assertTrue(Selection.moveRight(builder, layout)); 238 assertEquals(text.length(), Selection.getSelectionStart(builder)); 239 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 240 } 241 242 @Test 243 public void testMoveUp() { 244 CharSequence text = "Google\nhello,world"; 245 SpannableStringBuilder builder = new SpannableStringBuilder(text); 246 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 247 assertEquals(-1, Selection.getSelectionStart(builder)); 248 assertEquals(-1, Selection.getSelectionEnd(builder)); 249 250 Selection.moveUp(builder, layout); 251 252 Selection.setSelection(builder, 7, 10); 253 assertTrue(Selection.moveUp(builder, layout)); 254 assertEquals(7, Selection.getSelectionStart(builder)); 255 assertEquals(7, Selection.getSelectionEnd(builder)); 256 257 Selection.setSelection(builder, 0, text.length()); 258 assertFalse(Selection.moveUp(builder, layout)); 259 assertEquals(0, Selection.getSelectionStart(builder)); 260 assertEquals(0, Selection.getSelectionEnd(builder)); 261 262 Selection.setSelection(builder, 14); 263 assertTrue(Selection.moveUp(builder, layout)); 264 assertEquals(4, Selection.getSelectionStart(builder)); 265 assertEquals(4, Selection.getSelectionEnd(builder)); 266 267 // move to beginning of first line (behavior changed in L) 268 assertTrue(Selection.moveUp(builder, layout)); 269 assertEquals(0, Selection.getSelectionStart(builder)); 270 assertEquals(0, Selection.getSelectionEnd(builder)); 271 272 assertFalse(Selection.moveUp(builder, layout)); 273 assertEquals(0, Selection.getSelectionStart(builder)); 274 assertEquals(0, Selection.getSelectionEnd(builder)); 275 276 Selection.setSelection(builder, 5); 277 assertTrue(Selection.moveUp(builder, layout)); 278 assertEquals(0, Selection.getSelectionStart(builder)); 279 assertEquals(0, Selection.getSelectionEnd(builder)); 280 } 281 282 @Test 283 public void testMoveUpAfterTyping() { 284 CharSequence text = "aaa\nmm"; 285 SpannableStringBuilder builder = new SpannableStringBuilder(text); 286 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 287 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 288 assertEquals(-1, Selection.getSelectionStart(builder)); 289 assertEquals(-1, Selection.getSelectionEnd(builder)); 290 291 Selection.setSelection(builder, 1, 1); 292 assertTrue(Selection.moveDown(builder, layout)); 293 assertEquals(5, Selection.getSelectionStart(builder)); 294 assertEquals(5, Selection.getSelectionEnd(builder)); 295 296 builder.insert(5, "mm"); 297 layout = new StaticLayout(builder, new TextPaint(), 200, Layout.Alignment.ALIGN_NORMAL, 298 0, 0, false); 299 assertEquals(7, Selection.getSelectionStart(builder)); 300 assertEquals(7, Selection.getSelectionEnd(builder)); 301 302 assertTrue(Selection.moveUp(builder, layout)); 303 assertEquals(3, Selection.getSelectionStart(builder)); 304 assertEquals(3, Selection.getSelectionEnd(builder)); 305 } 306 307 @Test 308 public void testMoveUpKeepsOriginalMemoryPosition() { 309 CharSequence text = "aa\nm"; 310 SpannableStringBuilder builder = new SpannableStringBuilder(text); 311 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 312 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 313 assertEquals(-1, Selection.getSelectionStart(builder)); 314 assertEquals(-1, Selection.getSelectionEnd(builder)); 315 assertEquals(0, 316 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 317 318 Selection.setSelection(builder, 1, 1); 319 assertTrue(Selection.moveDown(builder, layout)); 320 assertEquals(4, Selection.getSelectionStart(builder)); 321 assertEquals(4, Selection.getSelectionEnd(builder)); 322 assertEquals(1, 323 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 324 325 assertTrue(Selection.moveUp(builder, layout)); 326 assertEquals(1, Selection.getSelectionStart(builder)); 327 assertEquals(1, Selection.getSelectionEnd(builder)); 328 assertEquals(1, 329 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 330 } 331 332 @Test 333 public void testMoveDown() { 334 CharSequence text = "hello,world\nGoogle"; 335 SpannableStringBuilder builder = new SpannableStringBuilder(text); 336 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 337 assertEquals(-1, Selection.getSelectionStart(builder)); 338 assertEquals(-1, Selection.getSelectionEnd(builder)); 339 340 Selection.setSelection(builder, 1, 3); 341 assertTrue(Selection.moveDown(builder, layout)); 342 assertEquals(3, Selection.getSelectionStart(builder)); 343 assertEquals(3, Selection.getSelectionEnd(builder)); 344 345 Selection.setSelection(builder, 0, text.length()); 346 assertFalse(Selection.moveDown(builder, layout)); 347 assertEquals(text.length(), Selection.getSelectionStart(builder)); 348 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 349 350 Selection.setSelection(builder, 5); 351 assertTrue(Selection.moveDown(builder, layout)); 352 assertEquals(14, Selection.getSelectionStart(builder)); 353 assertEquals(14, Selection.getSelectionEnd(builder)); 354 355 // move to end of last line (behavior changed in L) 356 assertTrue(Selection.moveDown(builder, layout)); 357 assertEquals(18, Selection.getSelectionStart(builder)); 358 assertEquals(18, Selection.getSelectionEnd(builder)); 359 360 assertFalse(Selection.moveDown(builder, layout)); 361 assertEquals(18, Selection.getSelectionStart(builder)); 362 assertEquals(18, Selection.getSelectionEnd(builder)); 363 364 Selection.setSelection(builder, 10); 365 Selection.moveDown(builder, layout); 366 assertEquals(18, Selection.getSelectionStart(builder)); 367 assertEquals(18, Selection.getSelectionEnd(builder)); 368 } 369 370 @Test 371 public void testMoveDownAfterTyping() { 372 CharSequence text = "mm\naaa"; 373 SpannableStringBuilder builder = new SpannableStringBuilder(text); 374 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 375 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 376 assertEquals(-1, Selection.getSelectionStart(builder)); 377 assertEquals(-1, Selection.getSelectionEnd(builder)); 378 379 Selection.setSelection(builder, 4, 4); 380 assertTrue(Selection.moveUp(builder, layout)); 381 assertEquals(1, Selection.getSelectionStart(builder)); 382 assertEquals(1, Selection.getSelectionEnd(builder)); 383 384 builder.insert(1, "mm"); 385 layout = new StaticLayout(builder, new TextPaint(), 200, Layout.Alignment.ALIGN_NORMAL, 386 0, 0, false); 387 assertEquals(3, Selection.getSelectionStart(builder)); 388 assertEquals(3, Selection.getSelectionEnd(builder)); 389 390 assertTrue(Selection.moveDown(builder, layout)); 391 assertEquals(8, Selection.getSelectionStart(builder)); 392 assertEquals(8, Selection.getSelectionEnd(builder)); 393 } 394 395 @Test 396 public void testMoveDownKeepsOriginalMemoryPosition() { 397 CharSequence text = "m\naa"; 398 SpannableStringBuilder builder = new SpannableStringBuilder(text); 399 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 400 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 401 assertEquals(-1, Selection.getSelectionStart(builder)); 402 assertEquals(-1, Selection.getSelectionEnd(builder)); 403 assertEquals(0, 404 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 405 406 Selection.setSelection(builder, 3, 3); 407 assertTrue(Selection.moveUp(builder, layout)); 408 assertEquals(1, Selection.getSelectionStart(builder)); 409 assertEquals(1, Selection.getSelectionEnd(builder)); 410 assertEquals(1, 411 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 412 413 assertTrue(Selection.moveDown(builder, layout)); 414 assertEquals(3, Selection.getSelectionStart(builder)); 415 assertEquals(3, Selection.getSelectionEnd(builder)); 416 assertEquals(1, 417 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 418 } 419 420 @Test 421 public void testMemoryPositionResetByHorizontalMovement() { 422 CharSequence text = "m\naa"; 423 SpannableStringBuilder builder = new SpannableStringBuilder(text); 424 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 425 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 426 assertEquals(-1, Selection.getSelectionStart(builder)); 427 assertEquals(-1, Selection.getSelectionEnd(builder)); 428 assertEquals(0, 429 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 430 431 Selection.setSelection(builder, 3, 3); 432 assertTrue(Selection.moveUp(builder, layout)); 433 assertEquals(1, Selection.getSelectionStart(builder)); 434 assertEquals(1, Selection.getSelectionEnd(builder)); 435 assertEquals(1, 436 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 437 438 assertTrue(Selection.moveDown(builder, layout)); 439 assertEquals(3, Selection.getSelectionStart(builder)); 440 assertEquals(3, Selection.getSelectionEnd(builder)); 441 assertEquals(1, 442 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 443 444 assertTrue(Selection.moveRight(builder, layout)); 445 assertEquals(4, Selection.getSelectionStart(builder)); 446 assertEquals(4, Selection.getSelectionEnd(builder)); 447 assertEquals(0, 448 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 449 450 assertTrue(Selection.moveUp(builder, layout)); 451 assertEquals(1, Selection.getSelectionStart(builder)); 452 assertEquals(1, Selection.getSelectionEnd(builder)); 453 assertEquals(1, 454 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 455 456 assertTrue(Selection.moveDown(builder, layout)); 457 assertEquals(4, Selection.getSelectionStart(builder)); 458 assertEquals(4, Selection.getSelectionEnd(builder)); 459 assertEquals(1, 460 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 461 462 assertTrue(Selection.moveLeft(builder, layout)); 463 assertEquals(3, Selection.getSelectionStart(builder)); 464 assertEquals(3, Selection.getSelectionEnd(builder)); 465 assertEquals(0, 466 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 467 468 assertTrue(Selection.moveUp(builder, layout)); 469 assertEquals(1, Selection.getSelectionStart(builder)); 470 assertEquals(1, Selection.getSelectionEnd(builder)); 471 assertEquals(1, 472 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 473 474 Selection.setSelection(builder, 3, 3); 475 assertEquals(0, 476 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 477 } 478 479 @Test 480 public void testMemoryPositionResetByRemoveSelection() { 481 CharSequence text = "m\naa"; 482 SpannableStringBuilder builder = new SpannableStringBuilder(text); 483 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 484 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 485 assertEquals(-1, Selection.getSelectionStart(builder)); 486 assertEquals(-1, Selection.getSelectionEnd(builder)); 487 assertEquals(0, 488 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 489 490 Selection.setSelection(builder, 3, 3); 491 assertTrue(Selection.moveUp(builder, layout)); 492 assertEquals(1, Selection.getSelectionStart(builder)); 493 assertEquals(1, Selection.getSelectionEnd(builder)); 494 assertEquals(1, 495 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 496 497 Selection.removeSelection(builder); 498 assertEquals(-1, Selection.getSelectionStart(builder)); 499 assertEquals(-1, Selection.getSelectionEnd(builder)); 500 assertEquals(0, 501 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 502 } 503 504 @Test 505 public void testMultilineLengthMoveDown() { 506 CharSequence text = "a\n\na"; 507 SpannableStringBuilder builder = new SpannableStringBuilder(text); 508 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 509 assertEquals(-1, Selection.getSelectionStart(builder)); 510 assertEquals(-1, Selection.getSelectionEnd(builder)); 511 512 Selection.setSelection(builder, 1); 513 // Move down to empty line 514 assertTrue(Selection.moveDown(builder, layout)); 515 assertEquals(2, Selection.getSelectionStart(builder)); 516 assertEquals(2, Selection.getSelectionEnd(builder)); 517 518 // Move down to third line 519 assertTrue(Selection.moveDown(builder, layout)); 520 assertEquals(4, Selection.getSelectionStart(builder)); 521 assertEquals(4, Selection.getSelectionEnd(builder)); 522 } 523 524 @Test 525 public void testMultilineLengthExtendDown() { 526 CharSequence text = "Google\n\nhello, world"; 527 SpannableStringBuilder builder = new SpannableStringBuilder(text); 528 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 529 assertEquals(-1, Selection.getSelectionStart(builder)); 530 assertEquals(-1, Selection.getSelectionEnd(builder)); 531 532 Selection.setSelection(builder, 1, 3); 533 assertTrue(Selection.extendDown(builder, layout)); 534 assertEquals(1, Selection.getSelectionStart(builder)); 535 assertEquals(7, Selection.getSelectionEnd(builder)); 536 537 assertTrue(Selection.extendDown(builder, layout)); 538 assertEquals(1, Selection.getSelectionStart(builder)); 539 assertEquals(15, Selection.getSelectionEnd(builder)); 540 541 assertTrue(Selection.extendDown(builder, layout)); 542 assertEquals(1, Selection.getSelectionStart(builder)); 543 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 544 } 545 546 @Test 547 public void testExtendDownKeepsOriginalMemoryPosition() { 548 CharSequence text = "m\naa"; 549 SpannableStringBuilder builder = new SpannableStringBuilder(text); 550 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 551 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 552 assertEquals(-1, Selection.getSelectionStart(builder)); 553 assertEquals(-1, Selection.getSelectionEnd(builder)); 554 assertEquals(0, 555 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 556 557 Selection.setSelection(builder, 3, 3); 558 assertTrue(Selection.extendUp(builder, layout)); 559 assertEquals(3, Selection.getSelectionStart(builder)); 560 assertEquals(1, Selection.getSelectionEnd(builder)); 561 assertEquals(1, 562 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 563 564 assertTrue(Selection.extendDown(builder, layout)); 565 assertEquals(3, Selection.getSelectionStart(builder)); 566 assertEquals(3, Selection.getSelectionEnd(builder)); 567 assertEquals(1, 568 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 569 } 570 571 @Test 572 public void testMultilineLengthMoveUp() { 573 CharSequence text = "a\n\na"; 574 SpannableStringBuilder builder = new SpannableStringBuilder(text); 575 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 576 assertEquals(-1, Selection.getSelectionStart(builder)); 577 assertEquals(-1, Selection.getSelectionEnd(builder)); 578 579 Selection.setSelection(builder, 4); 580 // Move up to empty line 581 assertTrue(Selection.moveUp(builder, layout)); 582 assertEquals(2, Selection.getSelectionStart(builder)); 583 assertEquals(2, Selection.getSelectionEnd(builder)); 584 585 // Move up to first line 586 assertTrue(Selection.moveUp(builder, layout)); 587 assertEquals(1, Selection.getSelectionStart(builder)); 588 assertEquals(1, Selection.getSelectionEnd(builder)); 589 } 590 591 @Test 592 public void testMultilineLengthExtendUp() { 593 CharSequence text = "Google\n\nhello, world"; 594 SpannableStringBuilder builder = new SpannableStringBuilder(text); 595 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 596 assertEquals(-1, Selection.getSelectionStart(builder)); 597 assertEquals(-1, Selection.getSelectionEnd(builder)); 598 599 assertTrue(Selection.extendUp(builder, layout)); 600 assertEquals(-1, Selection.getSelectionStart(builder)); 601 assertEquals(0, Selection.getSelectionEnd(builder)); 602 603 Selection.setSelection(builder, 9, 16); 604 assertTrue(Selection.extendUp(builder, layout)); 605 assertEquals(9, Selection.getSelectionStart(builder)); 606 assertEquals(7, Selection.getSelectionEnd(builder)); 607 608 assertTrue(Selection.extendUp(builder, layout)); 609 assertEquals(9, Selection.getSelectionStart(builder)); 610 assertEquals(4, Selection.getSelectionEnd(builder)); 611 612 assertTrue(Selection.extendUp(builder, layout)); 613 assertEquals(9, Selection.getSelectionStart(builder)); 614 assertEquals(0, Selection.getSelectionEnd(builder)); 615 } 616 617 @Test 618 public void testExtendUpKeepsOriginalMemoryPosition() { 619 CharSequence text = "aa\nm"; 620 SpannableStringBuilder builder = new SpannableStringBuilder(text); 621 StaticLayout layout = new StaticLayout(builder, new TextPaint(), 200, 622 Layout.Alignment.ALIGN_NORMAL, 0, 0, false); 623 assertEquals(-1, Selection.getSelectionStart(builder)); 624 assertEquals(-1, Selection.getSelectionEnd(builder)); 625 assertEquals(0, 626 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 627 628 Selection.setSelection(builder, 1, 1); 629 assertTrue(Selection.extendDown(builder, layout)); 630 assertEquals(1, Selection.getSelectionStart(builder)); 631 assertEquals(4, Selection.getSelectionEnd(builder)); 632 assertEquals(1, 633 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 634 635 assertTrue(Selection.extendUp(builder, layout)); 636 assertEquals(1, Selection.getSelectionStart(builder)); 637 assertEquals(1, Selection.getSelectionEnd(builder)); 638 assertEquals(1, 639 builder.getSpans(0, builder.length(), Selection.MemoryTextWatcher.class).length); 640 } 641 642 @Test 643 public void testMultilineLengthMoveDownAfterSelection() { 644 CharSequence text = "aaaaa\n\naaaaa"; 645 SpannableStringBuilder builder = new SpannableStringBuilder(text); 646 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 647 assertEquals(-1, Selection.getSelectionStart(builder)); 648 assertEquals(-1, Selection.getSelectionEnd(builder)); 649 650 Selection.setSelection(builder, 3); 651 // Move down to empty line 652 assertTrue(Selection.moveDown(builder, layout)); 653 assertEquals(6, Selection.getSelectionStart(builder)); 654 assertEquals(6, Selection.getSelectionEnd(builder)); 655 656 // Move down to third line 657 assertTrue(Selection.moveUp(builder, layout)); 658 assertEquals(3, Selection.getSelectionStart(builder)); 659 assertEquals(3, Selection.getSelectionEnd(builder)); 660 661 Selection.setSelection(builder, 5); 662 // Move down to empty line 663 assertTrue(Selection.moveDown(builder, layout)); 664 assertEquals(6, Selection.getSelectionStart(builder)); 665 assertEquals(6, Selection.getSelectionEnd(builder)); 666 667 // Move down to third line 668 assertTrue(Selection.moveUp(builder, layout)); 669 assertEquals(5, Selection.getSelectionStart(builder)); 670 assertEquals(5, Selection.getSelectionEnd(builder)); 671 } 672 673 @Test 674 public void testMultilineLengthMoveUpAfterSelection() { 675 CharSequence text = "aaaaa\n\naaaaa"; 676 SpannableStringBuilder builder = new SpannableStringBuilder(text); 677 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 678 assertEquals(-1, Selection.getSelectionStart(builder)); 679 assertEquals(-1, Selection.getSelectionEnd(builder)); 680 681 Selection.setSelection(builder, 10); 682 // Move up to empty line 683 assertTrue(Selection.moveUp(builder, layout)); 684 assertEquals(6, Selection.getSelectionStart(builder)); 685 assertEquals(6, Selection.getSelectionEnd(builder)); 686 687 // Move down to third line 688 assertTrue(Selection.moveDown(builder, layout)); 689 assertEquals(10, Selection.getSelectionStart(builder)); 690 assertEquals(10, Selection.getSelectionEnd(builder)); 691 692 Selection.setSelection(builder, 12); 693 // Move up to empty line 694 assertTrue(Selection.moveUp(builder, layout)); 695 assertEquals(6, Selection.getSelectionStart(builder)); 696 assertEquals(6, Selection.getSelectionEnd(builder)); 697 698 // Move down to third line 699 assertTrue(Selection.moveDown(builder, layout)); 700 assertEquals(12, Selection.getSelectionStart(builder)); 701 assertEquals(12, Selection.getSelectionEnd(builder)); 702 } 703 704 @Test 705 public void testExtendSelection() { 706 CharSequence text = "hello, world"; 707 SpannableStringBuilder builder = new SpannableStringBuilder(text); 708 assertEquals(-1, Selection.getSelectionStart(builder)); 709 assertEquals(-1, Selection.getSelectionEnd(builder)); 710 711 Selection.setSelection(builder, 3, 6); 712 Selection.extendSelection(builder, 6); 713 assertEquals(3, Selection.getSelectionStart(builder)); 714 assertEquals(6, Selection.getSelectionEnd(builder)); 715 716 Selection.setSelection(builder, 3, 6); 717 Selection.extendSelection(builder, 8); 718 assertEquals(3, Selection.getSelectionStart(builder)); 719 assertEquals(8, Selection.getSelectionEnd(builder)); 720 721 Selection.setSelection(builder, 3, 6); 722 Selection.extendSelection(builder, 1); 723 assertEquals(3, Selection.getSelectionStart(builder)); 724 assertEquals(1, Selection.getSelectionEnd(builder)); 725 726 try { 727 Selection.extendSelection(builder, -1); 728 fail("should throw IndexOutOfBoundsException"); 729 } catch (IndexOutOfBoundsException e) { 730 } 731 732 try { 733 Selection.extendSelection(builder, 100); 734 fail("should throw IndexOutOfBoundsException"); 735 } catch (IndexOutOfBoundsException e) { 736 } 737 738 try { 739 Selection.extendSelection(null, 3); 740 fail("should throw NullPointerException"); 741 } catch (NullPointerException e) { 742 } 743 744 try { 745 Selection.extendSelection(new SpannableStringBuilder(), 3); 746 fail("should throw IndexOutOfBoundsException"); 747 } catch (IndexOutOfBoundsException e) { 748 } 749 } 750 751 @Test 752 public void testExtendLeft() { 753 CharSequence text = "Google\nhello, world"; 754 SpannableStringBuilder builder = new SpannableStringBuilder(text); 755 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 756 assertEquals(-1, Selection.getSelectionStart(builder)); 757 assertEquals(-1, Selection.getSelectionEnd(builder)); 758 759 Selection.setSelection(builder, 7, 8); 760 assertTrue(Selection.extendLeft(builder, layout)); 761 assertEquals(7, Selection.getSelectionStart(builder)); 762 assertEquals(7, Selection.getSelectionEnd(builder)); 763 764 assertTrue(Selection.extendLeft(builder, layout)); 765 assertEquals(7, Selection.getSelectionStart(builder)); 766 assertEquals(6, Selection.getSelectionEnd(builder)); 767 768 Selection.setSelection(builder, 0, 1); 769 assertTrue(Selection.extendLeft(builder, layout)); 770 assertEquals(0, Selection.getSelectionStart(builder)); 771 assertEquals(0, Selection.getSelectionEnd(builder)); 772 773 assertTrue(Selection.extendLeft(builder, layout)); 774 assertEquals(0, Selection.getSelectionStart(builder)); 775 assertEquals(0, Selection.getSelectionEnd(builder)); 776 } 777 778 @Test 779 public void testExtendRight() { 780 CharSequence text = "Google\nhello, world"; 781 SpannableStringBuilder builder = new SpannableStringBuilder(text); 782 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 783 assertEquals(-1, Selection.getSelectionStart(builder)); 784 assertEquals(-1, Selection.getSelectionEnd(builder)); 785 786 Selection.setSelection(builder, 1, 6); 787 assertTrue(Selection.extendRight(builder, layout)); 788 assertEquals(1, Selection.getSelectionStart(builder)); 789 assertEquals(7, Selection.getSelectionEnd(builder)); 790 791 assertTrue(Selection.extendRight(builder, layout)); 792 assertEquals(1, Selection.getSelectionStart(builder)); 793 assertEquals(8, Selection.getSelectionEnd(builder)); 794 795 Selection.setSelection(builder, 12, text.length()); 796 assertTrue(Selection.extendRight(builder, layout)); 797 assertEquals(12, Selection.getSelectionStart(builder)); 798 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 799 } 800 801 @Test 802 public void testExtendUp() { 803 CharSequence text = "Google\nhello, world"; 804 SpannableStringBuilder builder = new SpannableStringBuilder(text); 805 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 806 assertEquals(-1, Selection.getSelectionStart(builder)); 807 assertEquals(-1, Selection.getSelectionEnd(builder)); 808 809 assertTrue(Selection.extendUp(builder, layout)); 810 assertEquals(-1, Selection.getSelectionStart(builder)); 811 assertEquals(0, Selection.getSelectionEnd(builder)); 812 813 Selection.setSelection(builder, 8, 15); 814 assertTrue(Selection.extendUp(builder, layout)); 815 assertEquals(8, Selection.getSelectionStart(builder)); 816 assertEquals(4, Selection.getSelectionEnd(builder)); 817 818 assertTrue(Selection.extendUp(builder, layout)); 819 assertEquals(8, Selection.getSelectionStart(builder)); 820 assertEquals(0, Selection.getSelectionEnd(builder)); 821 822 assertTrue(Selection.extendUp(builder, layout)); 823 assertEquals(8, Selection.getSelectionStart(builder)); 824 assertEquals(0, Selection.getSelectionEnd(builder)); 825 826 builder = new SpannableStringBuilder(); 827 assertTrue(Selection.extendUp(builder, layout)); 828 assertEquals(-1, Selection.getSelectionStart(builder)); 829 assertEquals(0, Selection.getSelectionEnd(builder)); 830 } 831 832 @Test 833 public void testExtendDown() { 834 CharSequence text = "Google\nhello, world"; 835 SpannableStringBuilder builder = new SpannableStringBuilder(text); 836 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 837 assertEquals(-1, Selection.getSelectionStart(builder)); 838 assertEquals(-1, Selection.getSelectionEnd(builder)); 839 840 Selection.setSelection(builder, 1, 3); 841 assertTrue(Selection.extendDown(builder, layout)); 842 assertEquals(1, Selection.getSelectionStart(builder)); 843 assertEquals(14, Selection.getSelectionEnd(builder)); 844 845 assertTrue(Selection.extendDown(builder, layout)); 846 assertEquals(1, Selection.getSelectionStart(builder)); 847 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 848 849 assertTrue(Selection.extendDown(builder, layout)); 850 assertEquals(1, Selection.getSelectionStart(builder)); 851 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 852 } 853 854 @Test 855 public void testExtendToLeftEdge() { 856 CharSequence text = "hello\nworld"; 857 SpannableStringBuilder builder = new SpannableStringBuilder(text); 858 StaticLayout layout = new StaticLayout(text, new TextPaint(), 50, null, 0, 0, false); 859 assertEquals(-1, Selection.getSelectionStart(builder)); 860 assertEquals(-1, Selection.getSelectionEnd(builder)); 861 862 assertTrue(Selection.extendToLeftEdge(builder, layout)); 863 assertEquals(-1, Selection.getSelectionStart(builder)); 864 assertEquals(0, Selection.getSelectionEnd(builder)); 865 866 Selection.setSelection(builder, 4, 9); 867 assertTrue(Selection.extendToLeftEdge(builder, layout)); 868 assertEquals(4, Selection.getSelectionStart(builder)); 869 assertEquals(6, Selection.getSelectionEnd(builder)); 870 871 Selection.setSelection(builder, 1, 5); 872 assertTrue(Selection.extendToLeftEdge(builder, layout)); 873 assertEquals(1, Selection.getSelectionStart(builder)); 874 assertEquals(0, Selection.getSelectionEnd(builder)); 875 876 Selection.setSelection(builder, 2, 2); 877 assertTrue(Selection.extendToLeftEdge(builder, layout)); 878 assertEquals(2, Selection.getSelectionStart(builder)); 879 assertEquals(0, Selection.getSelectionEnd(builder)); 880 881 builder = new SpannableStringBuilder(); 882 assertEquals(-1, Selection.getSelectionStart(builder)); 883 assertEquals(-1, Selection.getSelectionEnd(builder)); 884 885 assertTrue(Selection.extendToLeftEdge(builder, layout)); 886 assertEquals(-1, Selection.getSelectionStart(builder)); 887 assertEquals(0, Selection.getSelectionEnd(builder)); 888 } 889 890 @Test 891 public void testExtendToRightEdge() { 892 CharSequence text = "hello\nworld"; 893 SpannableStringBuilder builder = new SpannableStringBuilder(text); 894 StaticLayout layout = new StaticLayout(text, new TextPaint(), 50, null, 0, 0, false); 895 assertEquals(-1, Selection.getSelectionStart(builder)); 896 assertEquals(-1, Selection.getSelectionEnd(builder)); 897 898 assertTrue(Selection.extendToRightEdge(builder, layout)); 899 assertEquals(-1, Selection.getSelectionStart(builder)); 900 assertEquals(5, Selection.getSelectionEnd(builder)); 901 902 Selection.setSelection(builder, 1, 3); 903 assertTrue(Selection.extendToRightEdge(builder, layout)); 904 assertEquals(1, Selection.getSelectionStart(builder)); 905 assertEquals(5, Selection.getSelectionEnd(builder)); 906 907 Selection.setSelection(builder, 1, 7); 908 assertTrue(Selection.extendToRightEdge(builder, layout)); 909 assertEquals(1, Selection.getSelectionStart(builder)); 910 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 911 912 assertTrue(Selection.extendToRightEdge(builder, layout)); 913 assertEquals(1, Selection.getSelectionStart(builder)); 914 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 915 } 916 917 @Test 918 public void testMoveToLeftEdge() { 919 CharSequence text = "hello\nworld"; 920 SpannableStringBuilder builder = new SpannableStringBuilder(text); 921 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0, false); 922 assertEquals(-1, Selection.getSelectionStart(builder)); 923 assertEquals(-1, Selection.getSelectionEnd(builder)); 924 925 assertTrue(Selection.moveToLeftEdge(builder, layout)); 926 assertEquals(0, Selection.getSelectionStart(builder)); 927 assertEquals(0, Selection.getSelectionEnd(builder)); 928 929 Selection.setSelection(builder, 1, 10); 930 assertTrue(Selection.moveToLeftEdge(builder, layout)); 931 assertEquals(6, Selection.getSelectionStart(builder)); 932 assertEquals(6, Selection.getSelectionEnd(builder)); 933 934 Selection.setSelection(builder, 1, 3); 935 assertTrue(Selection.moveToLeftEdge(builder, layout)); 936 assertEquals(0, Selection.getSelectionStart(builder)); 937 assertEquals(0, Selection.getSelectionEnd(builder)); 938 939 assertTrue(Selection.moveToLeftEdge(builder, layout)); 940 assertEquals(0, Selection.getSelectionStart(builder)); 941 assertEquals(0, Selection.getSelectionEnd(builder)); 942 943 builder = new SpannableStringBuilder(); 944 assertTrue(Selection.moveToLeftEdge(builder, layout)); 945 assertEquals(0, Selection.getSelectionStart(builder)); 946 assertEquals(0, Selection.getSelectionEnd(builder)); 947 } 948 949 @Test 950 public void testMoveToRightEdge() { 951 CharSequence text = "hello\nworld"; 952 SpannableStringBuilder builder = new SpannableStringBuilder(text); 953 StaticLayout layout = new StaticLayout(text, new TextPaint(), 200, null, 0, 0,false); 954 assertEquals(-1, Selection.getSelectionStart(builder)); 955 assertEquals(-1, Selection.getSelectionEnd(builder)); 956 957 assertTrue(Selection.moveToRightEdge(builder, layout)); 958 assertEquals(5, Selection.getSelectionStart(builder)); 959 assertEquals(5, Selection.getSelectionEnd(builder)); 960 961 Selection.setSelection(builder, 1, 2); 962 assertTrue(Selection.moveToRightEdge(builder, layout)); 963 assertEquals(5, Selection.getSelectionStart(builder)); 964 assertEquals(5, Selection.getSelectionEnd(builder)); 965 966 Selection.setSelection(builder, 1, 7); 967 assertTrue(Selection.moveToRightEdge(builder, layout)); 968 assertEquals(text.length(), Selection.getSelectionStart(builder)); 969 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 970 971 assertTrue(Selection.moveToRightEdge(builder, layout)); 972 assertEquals(text.length(), Selection.getSelectionStart(builder)); 973 assertEquals(text.length(), Selection.getSelectionEnd(builder)); 974 } 975 976 @Test 977 public void testRemoveSelectionOnlyTriggersOneSpanRemoved() { 978 Spannable spannable = new SpannableStringBuilder("abcdef"); 979 Selection.setSelection(spannable, 0, 2); 980 981 final CountDownLatch latch = new CountDownLatch(1); 982 SpanWatcher watcher = new SpanWatcher() { 983 @Override 984 public void onSpanAdded(Spannable text, Object what, int start, int end) {} 985 986 @Override 987 public void onSpanRemoved(Spannable text, Object what, int start, int end) { 988 latch.countDown(); 989 } 990 991 @Override 992 public void onSpanChanged(Spannable text, Object what, int ostart, int oend, int nstart, 993 int nend) {} 994 }; 995 spannable.setSpan(watcher, 0, 2, 0); 996 997 Selection.removeSelection(spannable); 998 assertEquals(0, latch.getCount()); 999 } 1000 } 1001