blob: 5737571651018962983ac8fdd7d5d780473a7a54 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
Neal Nguyen1a44d5d2010-01-13 10:42:43 -080017package android.text;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010019import static org.junit.Assert.assertEquals;
20
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import android.graphics.Typeface;
22import android.os.Parcel;
Siyamed Sinira6b12de2017-12-11 15:29:18 -080023import android.platform.test.annotations.Presubmit;
Siyamed Sinir68089c82016-06-29 16:55:35 -070024import android.support.test.filters.SmallTest;
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010025import android.support.test.runner.AndroidJUnit4;
Siyamed Sinir68089c82016-06-29 16:55:35 -070026import android.text.style.CharacterStyle;
27import android.text.style.StyleSpan;
28import android.text.style.TextAppearanceSpan;
29import android.text.style.TypefaceSpan;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080030
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010031import org.junit.Test;
32import org.junit.runner.RunWith;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080033
34/**
35 * SpannedTest tests some features of Spanned
36 */
Siyamed Sinira6b12de2017-12-11 15:29:18 -080037@Presubmit
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010038@SmallTest
39@RunWith(AndroidJUnit4.class)
40public class SpannedTest {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041 private int mExpect;
42
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010043 @Test
44 public void testSpannableString() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080045 checkPriority(new SpannableString("the quick brown fox"));
46 }
47
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010048 @Test
49 public void testSpannableStringBuilder() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080050 checkPriority2(new SpannableStringBuilder("the quick brown fox"));
51 }
52
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010053 @Test
54 public void testAppend() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080055 Object o = new Object();
56 SpannableString ss = new SpannableString("Test");
57 ss.setSpan(o, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
58
59 SpannableStringBuilder ssb = new SpannableStringBuilder();
60 ssb.append(ss);
61 assertEquals(0, ssb.getSpanStart(o));
62 assertEquals(4, ssb.getSpanEnd(o));
63 assertEquals(1, ssb.getSpans(0, 4, Object.class).length);
64
65 ssb.insert(0, ss);
66 assertEquals(4, ssb.getSpanStart(o));
67 assertEquals(8, ssb.getSpanEnd(o));
68 assertEquals(0, ssb.getSpans(0, 4, Object.class).length);
69 assertEquals(1, ssb.getSpans(4, 8, Object.class).length);
70 }
71
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +010072 @Test
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080073 public void testWrapParcel() {
74 SpannableString s = new SpannableString("Hello there world");
75 CharacterStyle mark = new StyleSpan(Typeface.BOLD);
76 s.setSpan(mark, 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
77 s.setSpan(CharacterStyle.wrap(mark), 3, 7,
78 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
79 s.setSpan(new TextAppearanceSpan("mono", 0, -1, null, null), 7, 8,
80 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
81 s.setSpan(CharacterStyle.wrap(new TypefaceSpan("mono")), 8, 9,
82 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
83
84 Parcel p = Parcel.obtain();
85 TextUtils.writeToParcel(s, p, 0);
86 p.setDataPosition(0);
87
88 Spanned s2 = (Spanned) TextUtils.CHAR_SEQUENCE_CREATOR.
89 createFromParcel(p);
90 StyleSpan[] style;
91
92 style = s2.getSpans(1, 2, StyleSpan.class);
93 assertEquals(1, style.length);
94 assertEquals(1, s2.getSpanStart(style[0]));
95 assertEquals(2, s2.getSpanEnd(style[0]));
96
97 style = s2.getSpans(3, 7, StyleSpan.class);
98 assertEquals(1, style.length);
99 assertEquals(3, s2.getSpanStart(style[0]));
100 assertEquals(7, s2.getSpanEnd(style[0]));
101
102 TextAppearanceSpan[] appearance = s2.getSpans(7, 8,
103 TextAppearanceSpan.class);
104 assertEquals(1, appearance.length);
105 assertEquals(7, s2.getSpanStart(appearance[0]));
106 assertEquals(8, s2.getSpanEnd(appearance[0]));
107
108 TypefaceSpan[] tf = s2.getSpans(8, 9, TypefaceSpan.class);
109 assertEquals(1, tf.length);
110 assertEquals(8, s2.getSpanStart(tf[0]));
111 assertEquals(9, s2.getSpanEnd(tf[0]));
112 }
113
114 private void checkPriority(Spannable s) {
115 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
116 (5 << Spannable.SPAN_PRIORITY_SHIFT));
117 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
118 (10 << Spannable.SPAN_PRIORITY_SHIFT));
119 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
120 (0 << Spannable.SPAN_PRIORITY_SHIFT));
121 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
122 (15 << Spannable.SPAN_PRIORITY_SHIFT));
123 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
124 (3 << Spannable.SPAN_PRIORITY_SHIFT));
125 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
126 (6 << Spannable.SPAN_PRIORITY_SHIFT));
127 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE |
128 (0 << Spannable.SPAN_PRIORITY_SHIFT));
129
130 Object[] spans = s.getSpans(0, s.length(), Object.class);
131
132 for (int i = 0; i < spans.length - 1; i++) {
133 assertEquals((s.getSpanFlags(spans[i]) & Spanned.SPAN_PRIORITY) >=
134 (s.getSpanFlags(spans[i + 1]) & Spanned.SPAN_PRIORITY),
135 true);
136 }
137
138 mExpect = 0;
139
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100140 s.setSpan(new Watcher(2), 0, s.length(),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800141 Spannable.SPAN_INCLUSIVE_INCLUSIVE |
142 (2 << Spannable.SPAN_PRIORITY_SHIFT));
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100143 s.setSpan(new Watcher(4), 0, s.length(),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800144 Spannable.SPAN_INCLUSIVE_INCLUSIVE |
145 (4 << Spannable.SPAN_PRIORITY_SHIFT));
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100146 s.setSpan(new Watcher(1), 0, s.length(),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800147 Spannable.SPAN_INCLUSIVE_INCLUSIVE |
148 (1 << Spannable.SPAN_PRIORITY_SHIFT));
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100149 s.setSpan(new Watcher(3), 0, s.length(),
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800150 Spannable.SPAN_INCLUSIVE_INCLUSIVE |
151 (3 << Spannable.SPAN_PRIORITY_SHIFT));
152
153 mExpect = 4;
154 s.setSpan(new Object(), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
155 assertEquals(mExpect, 0);
156 }
157
158 private void checkPriority2(SpannableStringBuilder ssb) {
159 checkPriority(ssb);
160
161 mExpect = 4;
162 ssb.insert(3, "something");
163 assertEquals(mExpect, 0);
164 }
165
166 private class Watcher implements SpanWatcher, TextWatcher {
167 private int mSequence;
168
169 public Watcher(int sequence) {
170 mSequence = sequence;
171 }
172
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100173 @Override
174 public void onSpanChanged(Spannable b, Object o, int s, int e, int st, int en) { }
175
176 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 public void onSpanRemoved(Spannable b, Object o, int s, int e) { }
178
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100179 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800180 public void onSpanAdded(Spannable b, Object o, int s, int e) {
181 if (mExpect != 0) {
182 assertEquals(mSequence, mExpect);
183 mExpect = mSequence - 1;
184 }
185 }
186
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100187 @Override
188 public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
189
190 @Override
191 public void onTextChanged(CharSequence s, int start, int before, int count) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 if (mExpect != 0) {
193 assertEquals(mSequence, mExpect);
194 mExpect = mSequence - 1;
195 }
196 }
197
Andrei Stingaceanue1a7d0d2017-04-24 16:53:17 +0100198 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800199 public void afterTextChanged(Editable s) { }
200 }
201}