• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 com.android.inputmethod.latin.utils;
18 
19 import android.test.AndroidTestCase;
20 import android.test.suitebuilder.annotation.SmallTest;
21 import android.text.style.SuggestionSpan;
22 import android.text.style.URLSpan;
23 import android.text.SpannableString;
24 import android.text.SpannableStringBuilder;
25 import android.text.Spanned;
26 import android.text.SpannedString;
27 
28 @SmallTest
29 public class SpannableStringUtilsTests extends AndroidTestCase {
testConcatWithSuggestionSpansOnly()30     public void testConcatWithSuggestionSpansOnly() {
31         SpannableStringBuilder s = new SpannableStringBuilder("test string\ntest string\n"
32                 + "test string\ntest string\ntest string\ntest string\ntest string\ntest string\n"
33                 + "test string\ntest string\n");
34         final int N = 10;
35         for (int i = 0; i < N; ++i) {
36             // Put a PARAGRAPH-flagged span that should not be found in the result.
37             s.setSpan(new SuggestionSpan(getContext(),
38                     new String[] {"" + i}, Spanned.SPAN_PARAGRAPH),
39                     i * 12, i * 12 + 12, Spanned.SPAN_PARAGRAPH);
40             // Put a normal suggestion span that should be found in the result.
41             s.setSpan(new SuggestionSpan(getContext(), new String[] {"" + i}, 0), i, i * 2, 0);
42             // Put a URL span than should not be found in the result.
43             s.setSpan(new URLSpan("http://a"), i, i * 2, 0);
44         }
45 
46         final CharSequence a = s.subSequence(0, 15);
47         final CharSequence b = s.subSequence(15, s.length());
48         final Spanned result =
49                 (Spanned)SpannableStringUtils.concatWithNonParagraphSuggestionSpansOnly(a, b);
50 
51         Object[] spans = result.getSpans(0, result.length(), SuggestionSpan.class);
52         for (int i = 0; i < spans.length; i++) {
53             final int flags = result.getSpanFlags(spans[i]);
54             assertEquals("Should not find a span with PARAGRAPH flag",
55                     flags & Spanned.SPAN_PARAGRAPH, 0);
56             assertTrue("Should be a SuggestionSpan", spans[i] instanceof SuggestionSpan);
57         }
58     }
59 
assertSpanCount(final int expectedCount, final CharSequence cs)60     private static void assertSpanCount(final int expectedCount, final CharSequence cs) {
61         final int actualCount;
62         if (cs instanceof Spanned) {
63             final Spanned spanned = (Spanned) cs;
64             actualCount = spanned.getSpans(0, spanned.length(), Object.class).length;
65         } else {
66             actualCount = 0;
67         }
68         assertEquals(expectedCount, actualCount);
69     }
70 
assertSpan(final CharSequence cs, final Object expectedSpan, final int expectedStart, final int expectedEnd, final int expectedFlags)71     private static void assertSpan(final CharSequence cs, final Object expectedSpan,
72             final int expectedStart, final int expectedEnd, final int expectedFlags) {
73         assertTrue(cs instanceof Spanned);
74         final Spanned spanned = (Spanned) cs;
75         final Object[] actualSpans = spanned.getSpans(0, spanned.length(), Object.class);
76         for (Object actualSpan : actualSpans) {
77             if (actualSpan == expectedSpan) {
78                 final int actualStart = spanned.getSpanStart(actualSpan);
79                 final int actualEnd = spanned.getSpanEnd(actualSpan);
80                 final int actualFlags = spanned.getSpanFlags(actualSpan);
81                 assertEquals(expectedStart, actualStart);
82                 assertEquals(expectedEnd, actualEnd);
83                 assertEquals(expectedFlags, actualFlags);
84                 return;
85             }
86         }
87         assertTrue(false);
88     }
89 
testSplitCharSequenceWithSpan()90     public void testSplitCharSequenceWithSpan() {
91         // text:  " a bcd efg hij  "
92         // span1:  ^^^^^^^
93         // span2:  ^^^^^
94         // span3:              ^
95         final SpannableString spannableString = new SpannableString(" a bcd efg hij  ");
96         final Object span1 = new Object();
97         final Object span2 = new Object();
98         final Object span3 = new Object();
99         final int SPAN1_FLAGS = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
100         final int SPAN2_FLAGS = Spanned.SPAN_EXCLUSIVE_INCLUSIVE;
101         final int SPAN3_FLAGS = Spanned.SPAN_INCLUSIVE_INCLUSIVE;
102         spannableString.setSpan(span1, 0, 7, SPAN1_FLAGS);
103         spannableString.setSpan(span2, 0, 5, SPAN2_FLAGS);
104         spannableString.setSpan(span3, 12, 13, SPAN3_FLAGS);
105         final CharSequence[] charSequencesFromSpanned = SpannableStringUtils.split(
106                 spannableString, " ", true /* preserveTrailingEmptySegmengs */);
107         final CharSequence[] charSequencesFromString = SpannableStringUtils.split(
108                 spannableString.toString(), " ", true /* preserveTrailingEmptySegmengs */);
109 
110 
111         assertEquals(7, charSequencesFromString.length);
112         assertEquals(7, charSequencesFromSpanned.length);
113 
114         // text:  ""
115         // span1: ^
116         // span2: ^
117         // span3:
118         assertEquals("", charSequencesFromString[0].toString());
119         assertSpanCount(0, charSequencesFromString[0]);
120         assertEquals("", charSequencesFromSpanned[0].toString());
121         assertSpanCount(2, charSequencesFromSpanned[0]);
122         assertSpan(charSequencesFromSpanned[0], span1, 0, 0, SPAN1_FLAGS);
123         assertSpan(charSequencesFromSpanned[0], span2, 0, 0, SPAN2_FLAGS);
124 
125         // text:  "a"
126         // span1:  ^
127         // span2:  ^
128         // span3:
129         assertEquals("a", charSequencesFromString[1].toString());
130         assertSpanCount(0, charSequencesFromString[1]);
131         assertEquals("a", charSequencesFromSpanned[1].toString());
132         assertSpanCount(2, charSequencesFromSpanned[1]);
133         assertSpan(charSequencesFromSpanned[1], span1, 0, 1, SPAN1_FLAGS);
134         assertSpan(charSequencesFromSpanned[1], span2, 0, 1, SPAN2_FLAGS);
135 
136         // text:  "bcd"
137         // span1:  ^^^
138         // span2:  ^^
139         // span3:
140         assertEquals("bcd", charSequencesFromString[2].toString());
141         assertSpanCount(0, charSequencesFromString[2]);
142         assertEquals("bcd", charSequencesFromSpanned[2].toString());
143         assertSpanCount(2, charSequencesFromSpanned[2]);
144         assertSpan(charSequencesFromSpanned[2], span1, 0, 3, SPAN1_FLAGS);
145         assertSpan(charSequencesFromSpanned[2], span2, 0, 2, SPAN2_FLAGS);
146 
147         // text:  "efg"
148         // span1:
149         // span2:
150         // span3:
151         assertEquals("efg", charSequencesFromString[3].toString());
152         assertSpanCount(0, charSequencesFromString[3]);
153         assertEquals("efg", charSequencesFromSpanned[3].toString());
154         assertSpanCount(0, charSequencesFromSpanned[3]);
155 
156         // text:  "hij"
157         // span1:
158         // span2:
159         // span3:   ^
160         assertEquals("hij", charSequencesFromString[4].toString());
161         assertSpanCount(0, charSequencesFromString[4]);
162         assertEquals("hij", charSequencesFromSpanned[4].toString());
163         assertSpanCount(1, charSequencesFromSpanned[4]);
164         assertSpan(charSequencesFromSpanned[4], span3, 1, 2, SPAN3_FLAGS);
165 
166         // text:  ""
167         // span1:
168         // span2:
169         // span3:
170         assertEquals("", charSequencesFromString[5].toString());
171         assertSpanCount(0, charSequencesFromString[5]);
172         assertEquals("", charSequencesFromSpanned[5].toString());
173         assertSpanCount(0, charSequencesFromSpanned[5]);
174 
175         // text:  ""
176         // span1:
177         // span2:
178         // span3:
179         assertEquals("", charSequencesFromString[6].toString());
180         assertSpanCount(0, charSequencesFromString[6]);
181         assertEquals("", charSequencesFromSpanned[6].toString());
182         assertSpanCount(0, charSequencesFromSpanned[6]);
183     }
184 
testSplitCharSequencePreserveTrailingEmptySegmengs()185     public void testSplitCharSequencePreserveTrailingEmptySegmengs() {
186         assertEquals(1, SpannableStringUtils.split("", " ",
187                 false /* preserveTrailingEmptySegmengs */).length);
188         assertEquals(1, SpannableStringUtils.split(new SpannedString(""), " ",
189                 false /* preserveTrailingEmptySegmengs */).length);
190 
191         assertEquals(1, SpannableStringUtils.split("", " ",
192                 true /* preserveTrailingEmptySegmengs */).length);
193         assertEquals(1, SpannableStringUtils.split(new SpannedString(""), " ",
194                 true /* preserveTrailingEmptySegmengs */).length);
195 
196         assertEquals(0, SpannableStringUtils.split(" ", " ",
197                 false /* preserveTrailingEmptySegmengs */).length);
198         assertEquals(0, SpannableStringUtils.split(new SpannedString(" "), " ",
199                 false /* preserveTrailingEmptySegmengs */).length);
200 
201         assertEquals(2, SpannableStringUtils.split(" ", " ",
202                 true /* preserveTrailingEmptySegmengs */).length);
203         assertEquals(2, SpannableStringUtils.split(new SpannedString(" "), " ",
204                 true /* preserveTrailingEmptySegmengs */).length);
205 
206         assertEquals(3, SpannableStringUtils.split("a b c  ", " ",
207                 false /* preserveTrailingEmptySegmengs */).length);
208         assertEquals(3, SpannableStringUtils.split(new SpannedString("a b c  "), " ",
209                 false /* preserveTrailingEmptySegmengs */).length);
210 
211         assertEquals(5, SpannableStringUtils.split("a b c  ", " ",
212                 true /* preserveTrailingEmptySegmengs */).length);
213         assertEquals(5, SpannableStringUtils.split(new SpannedString("a b c  "), " ",
214                 true /* preserveTrailingEmptySegmengs */).length);
215 
216         assertEquals(6, SpannableStringUtils.split("a     b ", " ",
217                 false /* preserveTrailingEmptySegmengs */).length);
218         assertEquals(6, SpannableStringUtils.split(new SpannedString("a     b "), " ",
219                 false /* preserveTrailingEmptySegmengs */).length);
220 
221         assertEquals(7, SpannableStringUtils.split("a     b ", " ",
222                 true /* preserveTrailingEmptySegmengs */).length);
223         assertEquals(7, SpannableStringUtils.split(new SpannedString("a     b "), " ",
224                 true /* preserveTrailingEmptySegmengs */).length);
225     }
226 }
227