Home | History | Annotate | Download | only in cts
      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