1f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa/*
2f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * Copyright (C) 2013 The Android Open Source Project
3f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa *
4f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * Licensed under the Apache License, Version 2.0 (the "License");
5f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * you may not use this file except in compliance with the License.
6f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * You may obtain a copy of the License at
7f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa *
8f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa *      http://www.apache.org/licenses/LICENSE-2.0
9f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa *
10f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * Unless required by applicable law or agreed to in writing, software
11f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * distributed under the License is distributed on an "AS IS" BASIS,
12f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * See the License for the specific language governing permissions and
14f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa * limitations under the License.
15f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa */
16f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa
17f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasapackage com.android.inputmethod.latin.utils;
18f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa
19f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.test.AndroidTestCase;
20f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.test.suitebuilder.annotation.SmallTest;
21f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.text.style.SuggestionSpan;
22f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.text.style.URLSpan;
23cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaokaimport android.text.SpannableString;
24f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.text.SpannableStringBuilder;
25f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasaimport android.text.Spanned;
26cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaokaimport android.text.SpannedString;
27f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa
28f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa@SmallTest
29f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasapublic class SpannableStringUtilsTests extends AndroidTestCase {
30f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa    public void testConcatWithSuggestionSpansOnly() {
31f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        SpannableStringBuilder s = new SpannableStringBuilder("test string\ntest string\n"
32f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa                + "test string\ntest string\ntest string\ntest string\ntest string\ntest string\n"
33f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa                + "test string\ntest string\n");
34f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        final int N = 10;
35f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        for (int i = 0; i < N; ++i) {
36f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            // Put a PARAGRAPH-flagged span that should not be found in the result.
37f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            s.setSpan(new SuggestionSpan(getContext(),
385f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka                    new String[] {"" + i}, Spanned.SPAN_PARAGRAPH),
395f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka                    i * 12, i * 12 + 12, Spanned.SPAN_PARAGRAPH);
40f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            // Put a normal suggestion span that should be found in the result.
41f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            s.setSpan(new SuggestionSpan(getContext(), new String[] {"" + i}, 0), i, i * 2, 0);
42f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            // Put a URL span than should not be found in the result.
43f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            s.setSpan(new URLSpan("http://a"), i, i * 2, 0);
44f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        }
45f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa
46f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        final CharSequence a = s.subSequence(0, 15);
47f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        final CharSequence b = s.subSequence(15, s.length());
48f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        final Spanned result =
49f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa                (Spanned)SpannableStringUtils.concatWithNonParagraphSuggestionSpansOnly(a, b);
50f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa
51f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        Object[] spans = result.getSpans(0, result.length(), SuggestionSpan.class);
52f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        for (int i = 0; i < spans.length; i++) {
53f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            final int flags = result.getSpanFlags(spans[i]);
54f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            assertEquals("Should not find a span with PARAGRAPH flag",
555f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka                    flags & Spanned.SPAN_PARAGRAPH, 0);
56f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa            assertTrue("Should be a SuggestionSpan", spans[i] instanceof SuggestionSpan);
57f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa        }
58f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa    }
59cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
60cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static void assertSpanCount(final int expectedCount, final CharSequence cs) {
61cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int actualCount;
62cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        if (cs instanceof Spanned) {
63cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            final Spanned spanned = (Spanned) cs;
64cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            actualCount = spanned.getSpans(0, spanned.length(), Object.class).length;
65cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        } else {
66cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            actualCount = 0;
67cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
68cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(expectedCount, actualCount);
69cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
70cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
71cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    private static void assertSpan(final CharSequence cs, final Object expectedSpan,
72cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            final int expectedStart, final int expectedEnd, final int expectedFlags) {
73cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(cs instanceof Spanned);
74cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final Spanned spanned = (Spanned) cs;
75cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final Object[] actualSpans = spanned.getSpans(0, spanned.length(), Object.class);
76cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        for (Object actualSpan : actualSpans) {
77cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            if (actualSpan == expectedSpan) {
78cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                final int actualStart = spanned.getSpanStart(actualSpan);
79cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                final int actualEnd = spanned.getSpanEnd(actualSpan);
80cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                final int actualFlags = spanned.getSpanFlags(actualSpan);
81cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                assertEquals(expectedStart, actualStart);
82cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                assertEquals(expectedEnd, actualEnd);
83cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                assertEquals(expectedFlags, actualFlags);
84cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                return;
85cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka            }
86cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        }
87cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertTrue(false);
88cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
89cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
90cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testSplitCharSequenceWithSpan() {
91cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  " a bcd efg hij  "
92cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:  ^^^^^^^
93cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:  ^^^^^
94cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:              ^
95cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final SpannableString spannableString = new SpannableString(" a bcd efg hij  ");
96cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final Object span1 = new Object();
97cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final Object span2 = new Object();
98cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final Object span3 = new Object();
99cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int SPAN1_FLAGS = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
100cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int SPAN2_FLAGS = Spanned.SPAN_EXCLUSIVE_INCLUSIVE;
101cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final int SPAN3_FLAGS = Spanned.SPAN_INCLUSIVE_INCLUSIVE;
102cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        spannableString.setSpan(span1, 0, 7, SPAN1_FLAGS);
103cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        spannableString.setSpan(span2, 0, 5, SPAN2_FLAGS);
104cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        spannableString.setSpan(span3, 12, 13, SPAN3_FLAGS);
105cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final CharSequence[] charSequencesFromSpanned = SpannableStringUtils.split(
106cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                spannableString, " ", true /* preserveTrailingEmptySegmengs */);
107cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        final CharSequence[] charSequencesFromString = SpannableStringUtils.split(
108cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                spannableString.toString(), " ", true /* preserveTrailingEmptySegmengs */);
109cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
110cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
111cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(7, charSequencesFromString.length);
112cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(7, charSequencesFromSpanned.length);
113cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
114cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  ""
115cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1: ^
116cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2: ^
117cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
118cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromString[0].toString());
119cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[0]);
120cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromSpanned[0].toString());
121cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(2, charSequencesFromSpanned[0]);
122cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[0], span1, 0, 0, SPAN1_FLAGS);
123cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[0], span2, 0, 0, SPAN2_FLAGS);
124cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
125cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  "a"
126cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:  ^
127cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:  ^
128cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
129cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("a", charSequencesFromString[1].toString());
130cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[1]);
131cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("a", charSequencesFromSpanned[1].toString());
132cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(2, charSequencesFromSpanned[1]);
133cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[1], span1, 0, 1, SPAN1_FLAGS);
134cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[1], span2, 0, 1, SPAN2_FLAGS);
135cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
136cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  "bcd"
137cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:  ^^^
138cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:  ^^
139cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
140cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("bcd", charSequencesFromString[2].toString());
141cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[2]);
142cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("bcd", charSequencesFromSpanned[2].toString());
143cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(2, charSequencesFromSpanned[2]);
144cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[2], span1, 0, 3, SPAN1_FLAGS);
145cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[2], span2, 0, 2, SPAN2_FLAGS);
146cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
147cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  "efg"
148cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:
149cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:
150cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
151cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("efg", charSequencesFromString[3].toString());
152cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[3]);
153cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("efg", charSequencesFromSpanned[3].toString());
154cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromSpanned[3]);
155cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
156cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  "hij"
157cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:
158cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:
159cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:   ^
160cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("hij", charSequencesFromString[4].toString());
161cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[4]);
162cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("hij", charSequencesFromSpanned[4].toString());
163cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(1, charSequencesFromSpanned[4]);
164cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpan(charSequencesFromSpanned[4], span3, 1, 2, SPAN3_FLAGS);
165cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
166cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  ""
167cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:
168cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:
169cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
170cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromString[5].toString());
171cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[5]);
172cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromSpanned[5].toString());
173cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromSpanned[5]);
174cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
175cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // text:  ""
176cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span1:
177cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span2:
178cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        // span3:
179cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromString[6].toString());
180cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromString[6]);
181cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals("", charSequencesFromSpanned[6].toString());
182cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertSpanCount(0, charSequencesFromSpanned[6]);
183cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
184cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
185cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    public void testSplitCharSequencePreserveTrailingEmptySegmengs() {
186cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, SpannableStringUtils.split("", " ",
187cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
188cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, SpannableStringUtils.split(new SpannedString(""), " ",
189cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
190cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
191cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, SpannableStringUtils.split("", " ",
192cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
193cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(1, SpannableStringUtils.split(new SpannedString(""), " ",
194cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
195cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
196cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, SpannableStringUtils.split(" ", " ",
197cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
198cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(0, SpannableStringUtils.split(new SpannedString(" "), " ",
199cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
200cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
201cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(2, SpannableStringUtils.split(" ", " ",
202cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
203cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(2, SpannableStringUtils.split(new SpannedString(" "), " ",
204cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
205cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
206cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(3, SpannableStringUtils.split("a b c  ", " ",
207cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
208cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(3, SpannableStringUtils.split(new SpannedString("a b c  "), " ",
209cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
210cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
211cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(5, SpannableStringUtils.split("a b c  ", " ",
212cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
213cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(5, SpannableStringUtils.split(new SpannedString("a b c  "), " ",
214cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
215cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
216cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(6, SpannableStringUtils.split("a     b ", " ",
217cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
218cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(6, SpannableStringUtils.split(new SpannedString("a     b "), " ",
219cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                false /* preserveTrailingEmptySegmengs */).length);
220cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka
221cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(7, SpannableStringUtils.split("a     b ", " ",
222cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
223cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka        assertEquals(7, SpannableStringUtils.split(new SpannedString("a     b "), " ",
224cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka                true /* preserveTrailingEmptySegmengs */).length);
225cae324c561738c946be98e7a2fb4178e1ae08f9eTadashi G. Takaoka    }
226f56b82f80961a511765df206eee36229cbee6ed8Ken Wakasa}
227