Home | History | Annotate | Download | only in shadows
      1 package com.xtremelabs.robolectric.shadows;
      2 
      3 import static org.hamcrest.CoreMatchers.equalTo;
      4 import static org.hamcrest.CoreMatchers.notNullValue;
      5 import static org.hamcrest.CoreMatchers.sameInstance;
      6 import static org.junit.Assert.assertThat;
      7 
      8 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
      9 
     10 import org.junit.Before;
     11 import org.junit.Test;
     12 import org.junit.runner.RunWith;
     13 
     14 import android.text.SpannableString;
     15 import android.text.style.URLSpan;
     16 import android.text.style.UnderlineSpan;
     17 
     18 @RunWith(WithTestDefaultsRunner.class)
     19 public class SpannableStringTest {
     20 
     21     private SpannableString spanStr;
     22 
     23     private static final String TEST_STRING =
     24             "Visit us at http://www.foobar.com for more selections";
     25 
     26     @Before
     27     public void setUp() throws Exception {
     28         spanStr = new SpannableString(TEST_STRING);
     29     }
     30 
     31     @Test
     32     public void testToString() {
     33         assertThat(spanStr.toString(), sameInstance(TEST_STRING));
     34     }
     35 
     36     @Test
     37     public void testSetSpan() {
     38         URLSpan s1 = new URLSpan("http://www.foobar.com");
     39         UnderlineSpan s2 = new UnderlineSpan();
     40         spanStr.setSpan(s1, 12, 33, 0);
     41         spanStr.setSpan(s2, 1, 10, 0);
     42 
     43         assertBothSpans(s1, s2);
     44     }
     45 
     46     @Test
     47     public void testRemoveSpan() {
     48         URLSpan s1 = new URLSpan("http://www.foobar.com");
     49         UnderlineSpan s2 = new UnderlineSpan();
     50         spanStr.setSpan(s1, 12, 33, 0);
     51         spanStr.setSpan(s2, 1, 10, 0);
     52         spanStr.removeSpan(s1);
     53 
     54         Object[] spans = spanStr.getSpans(0, TEST_STRING.length(), Object.class);
     55         assertThat(spans, notNullValue());
     56         assertThat(spans.length, equalTo(1));
     57         assertThat((UnderlineSpan) spans[0], sameInstance(s2));
     58     }
     59 
     60     @Test
     61     public void testGetSpans() {
     62         URLSpan s1 = new URLSpan("http://www.foobar.com");
     63         UnderlineSpan s2 = new UnderlineSpan();
     64         spanStr.setSpan(s1, 1, 10, 0);
     65         spanStr.setSpan(s2, 20, 30, 0);
     66 
     67         Object[] spans = spanStr.getSpans(0, TEST_STRING.length(), Object.class);
     68         assertThat(spans, notNullValue());
     69         assertThat(spans.length, equalTo(2));
     70         assertBothSpans(s1, s2);
     71 
     72         spans = spanStr.getSpans(0, TEST_STRING.length(), URLSpan.class);
     73         assertThat(spans, notNullValue());
     74         assertThat(spans.length, equalTo(1));
     75         assertThat((URLSpan) spans[0], sameInstance(s1));
     76 
     77         spans = spanStr.getSpans(11, 35, Object.class);
     78         assertThat(spans, notNullValue());
     79         assertThat(spans.length, equalTo(1));
     80         assertThat((UnderlineSpan) spans[0], sameInstance(s2));
     81 
     82         spans = spanStr.getSpans(21, 35, Object.class);
     83         assertThat(spans, notNullValue());
     84         assertThat(spans.length, equalTo(1));
     85         assertThat((UnderlineSpan) spans[0], sameInstance(s2));
     86 
     87         spans = spanStr.getSpans(5, 15, Object.class);
     88         assertThat(spans, notNullValue());
     89         assertThat(spans.length, equalTo(1));
     90         assertThat((URLSpan) spans[0], sameInstance(s1));
     91     }
     92 
     93     @Test
     94     public void testGetSpanStart() {
     95         URLSpan s1 = new URLSpan("http://www.foobar.com");
     96         UnderlineSpan s2 = new UnderlineSpan();
     97 
     98         assertThat(spanStr.getSpanStart(s1), equalTo(-1));
     99         assertThat(spanStr.getSpanStart(s2), equalTo(-1));
    100 
    101         spanStr.setSpan(s1, 0, 4, 0);
    102         assertThat(spanStr.getSpanStart(s1), equalTo(0));
    103 
    104         spanStr.setSpan(s2, 2, TEST_STRING.length(), 0);
    105         assertThat(spanStr.getSpanStart(s2), equalTo(2));
    106     }
    107 
    108     @Test
    109     public void testGetSpanEnd() {
    110         URLSpan s1 = new URLSpan("http://www.foobar.com");
    111         UnderlineSpan s2 = new UnderlineSpan();
    112 
    113         assertThat(spanStr.getSpanEnd(s1), equalTo(-1));
    114         assertThat(spanStr.getSpanEnd(s2), equalTo(-1));
    115 
    116         spanStr.setSpan(s1, 0, 4, 0);
    117         assertThat(spanStr.getSpanEnd(s1), equalTo(4));
    118 
    119         spanStr.setSpan(s2, 2, TEST_STRING.length(), 0);
    120         assertThat(spanStr.getSpanEnd(s2), equalTo(TEST_STRING.length()));
    121     }
    122 
    123     private void assertBothSpans(URLSpan s1, UnderlineSpan s2) {
    124         Object[] spans = spanStr.getSpans(0, TEST_STRING.length(), Object.class);
    125         if (spans[0] instanceof URLSpan) {
    126             assertThat((URLSpan) spans[0], sameInstance(s1));
    127         } else {
    128             assertThat((UnderlineSpan) spans[0], sameInstance(s2));
    129         }
    130         if (spans[1] instanceof UnderlineSpan) {
    131             assertThat((UnderlineSpan) spans[1], sameInstance(s2));
    132         } else {
    133             assertThat((URLSpan) spans[1], sameInstance(s1));
    134         }
    135     }
    136 }
    137