SpannableStringBuilderTest.kt revision 3091829d6e5cf1c5e5af33614657bfeb4f2320ab
1/* 2 * Copyright (C) 2017 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 17package androidx.core.text 18 19import android.graphics.Color.RED 20import android.graphics.Color.YELLOW 21import android.graphics.Typeface.BOLD 22import android.graphics.Typeface.ITALIC 23import android.text.SpannedString 24import android.text.style.BackgroundColorSpan 25import android.text.style.BulletSpan 26import android.text.style.ForegroundColorSpan 27import android.text.style.RelativeSizeSpan 28import android.text.style.StrikethroughSpan 29import android.text.style.StyleSpan 30import android.text.style.SubscriptSpan 31import android.text.style.SuperscriptSpan 32import android.text.style.UnderlineSpan 33import org.junit.Assert.assertEquals 34import org.junit.Assert.assertSame 35import org.junit.Test 36 37class SpannableStringBuilderTest { 38 @Test fun builder() { 39 val result: SpannedString = buildSpannedString { 40 append("Hello,") 41 append(" World") 42 } 43 assertEquals("Hello, World", result.toString()) 44 } 45 46 @Test fun builderInSpan() { 47 val bold = StyleSpan(BOLD) 48 val result: SpannedString = buildSpannedString { 49 append("Hello, ") 50 inSpans(bold) { 51 append("World") 52 } 53 } 54 assertEquals("Hello, World", result.toString()) 55 56 val spans = result.getSpans<Any>() 57 assertEquals(1, spans.size) 58 59 val boldSpan = spans.filterIsInstance<StyleSpan>().single() 60 assertSame(bold, boldSpan) 61 assertEquals(7, result.getSpanStart(bold)) 62 assertEquals(12, result.getSpanEnd(bold)) 63 } 64 65 @Test fun builderBold() { 66 val result: SpannedString = buildSpannedString { 67 append("Hello, ") 68 bold { 69 append("World") 70 } 71 } 72 assertEquals("Hello, World", result.toString()) 73 74 val spans = result.getSpans<Any>() 75 assertEquals(1, spans.size) 76 77 val bold = spans.filterIsInstance<StyleSpan>().single() 78 assertEquals(BOLD, bold.style) 79 assertEquals(7, result.getSpanStart(bold)) 80 assertEquals(12, result.getSpanEnd(bold)) 81 } 82 83 @Test fun builderItalic() { 84 val result: SpannedString = buildSpannedString { 85 append("Hello, ") 86 italic { 87 append("World") 88 } 89 } 90 assertEquals("Hello, World", result.toString()) 91 92 val spans = result.getSpans<Any>() 93 assertEquals(1, spans.size) 94 95 val italic = spans.filterIsInstance<StyleSpan>().single() 96 assertEquals(ITALIC, italic.style) 97 assertEquals(7, result.getSpanStart(italic)) 98 assertEquals(12, result.getSpanEnd(italic)) 99 } 100 101 @Test fun builderUnderline() { 102 val result: SpannedString = buildSpannedString { 103 append("Hello, ") 104 underline { 105 append("World") 106 } 107 } 108 assertEquals("Hello, World", result.toString()) 109 110 val spans = result.getSpans<Any>() 111 assertEquals(1, spans.size) 112 113 val underline = spans.filterIsInstance<UnderlineSpan>().single() 114 assertEquals(7, result.getSpanStart(underline)) 115 assertEquals(12, result.getSpanEnd(underline)) 116 } 117 118 @Test fun builderColor() { 119 val result: SpannedString = buildSpannedString { 120 append("Hello, ") 121 color(RED) { 122 append("World") 123 } 124 } 125 assertEquals("Hello, World", result.toString()) 126 127 val spans = result.getSpans<Any>() 128 assertEquals(1, spans.size) 129 130 val color = spans.filterIsInstance<ForegroundColorSpan>().single() 131 assertEquals(RED, color.foregroundColor) 132 assertEquals(7, result.getSpanStart(color)) 133 assertEquals(12, result.getSpanEnd(color)) 134 } 135 136 @Test fun builderBackgroundColor() { 137 val result: SpannedString = buildSpannedString { 138 append("Hello, ") 139 backgroundColor(RED) { 140 append("World") 141 } 142 } 143 assertEquals("Hello, World", result.toString()) 144 145 val spans = result.getSpans<Any>() 146 assertEquals(1, spans.size) 147 148 val color = spans.filterIsInstance<BackgroundColorSpan>().single() 149 assertEquals(RED, color.backgroundColor) 150 assertEquals(7, result.getSpanStart(color)) 151 assertEquals(12, result.getSpanEnd(color)) 152 } 153 154 @Test fun builderStrikeThrough() { 155 val result: SpannedString = buildSpannedString { 156 append("Hello, ") 157 strikeThrough { 158 append("World") 159 } 160 } 161 assertEquals("Hello, World", result.toString()) 162 163 val spans = result.getSpans<Any>() 164 assertEquals(1, spans.size) 165 166 val strikeThrough = spans.filterIsInstance<StrikethroughSpan>().single() 167 assertEquals(7, result.getSpanStart(strikeThrough)) 168 assertEquals(12, result.getSpanEnd(strikeThrough)) 169 } 170 171 @Test fun builderScale() { 172 val result: SpannedString = buildSpannedString { 173 append("Hello, ") 174 scale(2f) { 175 append("World") 176 } 177 } 178 assertEquals("Hello, World", result.toString()) 179 180 val spans = result.getSpans<Any>() 181 assertEquals(1, spans.size) 182 183 val scale = spans.filterIsInstance<RelativeSizeSpan>().single() 184 assertEquals(2f, scale.sizeChange) 185 assertEquals(7, result.getSpanStart(scale)) 186 assertEquals(12, result.getSpanEnd(scale)) 187 } 188 189 @Test fun builderSuperscript() { 190 val result: SpannedString = buildSpannedString { 191 append("Hello, ") 192 superscript { 193 append("World") 194 } 195 } 196 assertEquals("Hello, World", result.toString()) 197 198 val spans = result.getSpans<Any>() 199 assertEquals(1, spans.size) 200 201 val superscript = spans.filterIsInstance<SuperscriptSpan>().single() 202 assertEquals(7, result.getSpanStart(superscript)) 203 assertEquals(12, result.getSpanEnd(superscript)) 204 } 205 206 @Test fun builderSubscript() { 207 val result: SpannedString = buildSpannedString { 208 append("Hello, ") 209 subscript { 210 append("World") 211 } 212 } 213 assertEquals("Hello, World", result.toString()) 214 215 val spans = result.getSpans<Any>() 216 assertEquals(1, spans.size) 217 218 val subscript = spans.filterIsInstance<SubscriptSpan>().single() 219 assertEquals(7, result.getSpanStart(subscript)) 220 assertEquals(12, result.getSpanEnd(subscript)) 221 } 222 223 @Test fun nested() { 224 val result: SpannedString = buildSpannedString { 225 color(RED) { 226 append('H') 227 subscript { 228 append('e') 229 } 230 append('l') 231 superscript { 232 append('l') 233 } 234 append('o') 235 } 236 append(", ") 237 backgroundColor(YELLOW) { 238 append('W') 239 underline { 240 append('o') 241 bold { 242 append('r') 243 } 244 append('l') 245 } 246 append('d') 247 } 248 } 249 assertEquals("Hello, World", result.toString()) 250 251 val spans = result.getSpans<Any>() 252 assertEquals(6, spans.size) 253 254 val color = spans.filterIsInstance<ForegroundColorSpan>().single() 255 assertEquals(RED, color.foregroundColor) 256 assertEquals(0, result.getSpanStart(color)) 257 assertEquals(5, result.getSpanEnd(color)) 258 259 val subscript = spans.filterIsInstance<SubscriptSpan>().single() 260 assertEquals(1, result.getSpanStart(subscript)) 261 assertEquals(2, result.getSpanEnd(subscript)) 262 263 val superscript = spans.filterIsInstance<SuperscriptSpan>().single() 264 assertEquals(3, result.getSpanStart(superscript)) 265 assertEquals(4, result.getSpanEnd(superscript)) 266 267 val backgroundColor = spans.filterIsInstance<BackgroundColorSpan>().single() 268 assertEquals(YELLOW, backgroundColor.backgroundColor) 269 assertEquals(7, result.getSpanStart(backgroundColor)) 270 assertEquals(12, result.getSpanEnd(backgroundColor)) 271 272 val underline = spans.filterIsInstance<UnderlineSpan>().single() 273 assertEquals(8, result.getSpanStart(underline)) 274 assertEquals(11, result.getSpanEnd(underline)) 275 276 val bold = spans.filterIsInstance<StyleSpan>().single() 277 assertEquals(BOLD, bold.style) 278 assertEquals(9, result.getSpanStart(bold)) 279 assertEquals(10, result.getSpanEnd(bold)) 280 } 281 282 @Test fun multipleSpans() { 283 val result: SpannedString = buildSpannedString { 284 append("Hello, ") 285 inSpans(BulletSpan(), UnderlineSpan()) { 286 append("World") 287 } 288 } 289 assertEquals("Hello, World", result.toString()) 290 291 val spans = result.getSpans<Any>() 292 assertEquals(2, spans.size) 293 294 val bullet = spans.filterIsInstance<BulletSpan>().single() 295 assertEquals(7, result.getSpanStart(bullet)) 296 assertEquals(12, result.getSpanEnd(bullet)) 297 val underline = spans.filterIsInstance<UnderlineSpan>().single() 298 assertEquals(7, result.getSpanStart(underline)) 299 assertEquals(12, result.getSpanEnd(underline)) 300 } 301} 302