[go: nahoru, domu]

blob: e0cfd354dec95aad9c4c1be66c20e81da03f04b0 [file] [log] [blame]
Louis Pullen-Freilichab194752020-07-21 22:21:22 +01001package androidx.compose.ui.text.platform
Haoyu Zhang10fc6502018-11-09 15:50:11 -08002
Haoyu Zhang10fc6502018-11-09 15:50:11 -08003import android.graphics.Paint
Haoyu Zhang10fc6502018-11-09 15:50:11 -08004import android.text.TextPaint
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -08005import android.text.style.AbsoluteSizeSpan
Haoyu Zhang0c4fd022019-01-02 13:53:10 -08006import android.text.style.BackgroundColorSpan
Haoyu Zhang47f57a22018-12-12 13:16:40 -08007import android.text.style.ForegroundColorSpan
Haoyu Zhang7fc59172019-03-01 17:03:31 -08008import android.text.style.LeadingMarginSpan
Haoyu Zhang4b201d22018-12-18 14:27:38 -08009import android.text.style.LocaleSpan
Haoyu Zhang24eb32f2019-05-21 16:16:37 -070010import android.text.style.RelativeSizeSpan
Haoyu Zhang15750922019-02-19 13:44:17 -080011import android.text.style.ScaleXSpan
Haoyu Zhangb5677202018-12-19 14:22:18 -080012import android.text.style.StrikethroughSpan
13import android.text.style.UnderlineSpan
Haoyu Zhang10fc6502018-11-09 15:50:11 -080014import androidx.test.filters.SmallTest
15import androidx.test.platform.app.InstrumentationRegistry
George Mount842c8c12020-01-08 16:03:42 -080016import androidx.ui.geometry.Offset
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -070017import androidx.ui.graphics.Color
Nader Jawadad983532019-08-29 16:27:37 -070018import androidx.ui.graphics.Shadow
Siyamed Sinir63789c92019-09-25 10:44:11 -070019import androidx.ui.graphics.toArgb
Louis Pullen-Freilichab194752020-07-21 22:21:22 +010020import androidx.compose.ui.text.intl.LocaleList
21import androidx.compose.ui.text.AnnotatedString
22import androidx.compose.ui.text.FontTestData.Companion.BASIC_MEASURE_FONT
23import androidx.compose.ui.text.ParagraphConstraints
24import androidx.compose.ui.text.SpanStyle
25import androidx.compose.ui.text.TestFontResourceLoader
26import androidx.compose.ui.text.TextStyle
27import androidx.compose.ui.text.android.InternalPlatformTextApi
28import androidx.compose.ui.text.android.TextLayout
29import androidx.compose.ui.text.font.FontFamily
30import androidx.compose.ui.text.font.FontStyle
31import androidx.compose.ui.text.font.FontSynthesis
32import androidx.compose.ui.text.font.FontWeight
33import androidx.compose.ui.text.font.asFontFamily
34import androidx.compose.ui.text.matchers.assertThat
Louis Pullen-Freilicha2be36b2020-07-21 21:35:11 +010035import androidx.compose.ui.text.android.style.BaselineShiftSpan
36import androidx.compose.ui.text.android.style.FontFeatureSpan
37import androidx.compose.ui.text.android.style.FontSpan
38import androidx.compose.ui.text.android.style.LetterSpacingSpanEm
39import androidx.compose.ui.text.android.style.LetterSpacingSpanPx
40import androidx.compose.ui.text.android.style.ShadowSpan
41import androidx.compose.ui.text.android.style.SkewXSpan
Louis Pullen-Freilichab194752020-07-21 22:21:22 +010042import androidx.compose.ui.text.style.BaselineShift
43import androidx.compose.ui.text.style.TextAlign
44import androidx.compose.ui.text.style.TextDecoration
45import androidx.compose.ui.text.style.TextGeometricTransform
46import androidx.compose.ui.text.style.TextIndent
George Mount842c8c12020-01-08 16:03:42 -080047import androidx.ui.unit.Density
48import androidx.ui.unit.em
George Mount842c8c12020-01-08 16:03:42 -080049import androidx.ui.unit.sp
Siyamed Sinir63789c92019-09-25 10:44:11 -070050import com.google.common.truth.Truth.assertThat
Siyamed Sinirf18dcca2018-12-20 18:25:10 -080051import com.nhaarman.mockitokotlin2.any
haoyue8f35592020-05-08 16:12:23 -070052import com.nhaarman.mockitokotlin2.atLeastOnce
Siyamed Sinirf18dcca2018-12-20 18:25:10 -080053import com.nhaarman.mockitokotlin2.eq
54import com.nhaarman.mockitokotlin2.mock
55import com.nhaarman.mockitokotlin2.never
56import com.nhaarman.mockitokotlin2.spy
57import com.nhaarman.mockitokotlin2.times
58import com.nhaarman.mockitokotlin2.verify
Haoyu Zhang10fc6502018-11-09 15:50:11 -080059import org.junit.Test
60import org.junit.runner.RunWith
61import org.junit.runners.JUnit4
Haoyu Zhang10fc6502018-11-09 15:50:11 -080062import kotlin.math.ceil
63
Siyamed Sinir21f73482020-06-17 11:36:22 -070064@OptIn(InternalPlatformTextApi::class)
Haoyu Zhang10fc6502018-11-09 15:50:11 -080065@RunWith(JUnit4::class)
66@SmallTest
Siyamed Sinire75976f2019-07-03 09:24:30 -070067class AndroidParagraphTest {
Siyamed Sinir472ed132019-07-03 15:43:43 -070068 // This sample font provides the following features:
69 // 1. The width of most of visible characters equals to font size.
70 // 2. The LTR/RTL characters are rendered as â–¶/â—€.
71 // 3. The fontMetrics passed to TextPaint has descend - ascend equal to 1.2 * fontSize.
Seigo Nonaka23fcd672019-12-09 14:46:23 -080072 private val basicFontFamily = BASIC_MEASURE_FONT.asFontFamily()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -070073 private val defaultDensity = Density(density = 1f)
Siyamed Sinir472ed132019-07-03 15:43:43 -070074 private val context = InstrumentationRegistry.getInstrumentation().context
Haoyu Zhang10fc6502018-11-09 15:50:11 -080075
76 @Test
77 fun draw_with_newline_and_line_break_default_values() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +000078 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -070079 val fontSize = 50.sp
80 for (text in arrayOf("abc\ndef", "\u05D0\u05D1\u05D2\n\u05D3\u05D4\u05D5")) {
81 val paragraphAndroid = simpleParagraph(
82 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -080083 style = TextStyle(
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -070084 fontSize = fontSize,
Seigo Nonaka23fcd672019-12-09 14:46:23 -080085 fontFamily = basicFontFamily
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -070086 ),
87 // 2 chars width
Nader Jawadfeb99f82020-05-21 13:07:36 -070088 constraints = ParagraphConstraints(width = 2 * fontSize.toPx())
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -070089 )
Haoyu Zhang10fc6502018-11-09 15:50:11 -080090
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -070091 val textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG)
Nader Jawadfeb99f82020-05-21 13:07:36 -070092 textPaint.textSize = fontSize.toPx()
Seigo Nonaka23fcd672019-12-09 14:46:23 -080093 textPaint.typeface = TypefaceAdapter().create(basicFontFamily)
Haoyu Zhang10fc6502018-11-09 15:50:11 -080094
Siyamed Sinir97d0ccf2019-11-02 02:51:24 -070095 val layout = TextLayout(
96 charSequence = text,
97 width = ceil(paragraphAndroid.width),
98 textPaint = textPaint
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -070099 )
Siyamed Sinir97d0ccf2019-11-02 02:51:24 -0700100
101 assertThat(paragraphAndroid.bitmap()).isEqualToBitmap(layout.bitmap())
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700102 }
Haoyu Zhang10fc6502018-11-09 15:50:11 -0800103 }
104 }
105
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800106 @Test
haoyua8e48a52019-06-25 12:23:27 -0700107 fun testAnnotatedString_setColorOnWholeText() {
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800108 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800109 val spanStyle = SpanStyle(color = Color(0xFF0000FF))
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800110
111 val paragraph = simpleParagraph(
112 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700113 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700114 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800115 )
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800116
Siyamed Sinir63789c92019-09-25 10:44:11 -0700117 assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, text.length)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800118 }
119
120 @Test
haoyua8e48a52019-06-25 12:23:27 -0700121 fun testAnnotatedString_setColorOnPartOfText() {
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800122 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800123 val spanStyle = SpanStyle(color = Color(0xFF0000FF))
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800124
125 val paragraph = simpleParagraph(
126 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700127 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700128 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800129 )
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800130
Siyamed Sinir63789c92019-09-25 10:44:11 -0700131 assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, "abc".length)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800132 }
133
134 @Test
haoyua8e48a52019-06-25 12:23:27 -0700135 fun testAnnotatedString_setColorTwice_lastOneOverwrite() {
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800136 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800137 val spanStyle = SpanStyle(color = Color(0xFF0000FF))
138 val spanStyleOverwrite = SpanStyle(color = Color(0xFF00FF00))
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800139
140 val paragraph = simpleParagraph(
141 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800142 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700143 AnnotatedString.Range(spanStyle, 0, text.length),
144 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700145 ),
146 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800147 )
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800148
Siyamed Sinir63789c92019-09-25 10:44:11 -0700149 assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, text.length)
150 assertThat(paragraph.charSequence).hasSpan(ForegroundColorSpan::class, 0, "abc".length)
151 assertThat(paragraph.charSequence).hasSpanOnTop(ForegroundColorSpan::class, 0, "abc".length)
Haoyu Zhang47f57a22018-12-12 13:16:40 -0800152 }
153
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800154 @Test
Haoyu Zhangb5677202018-12-19 14:22:18 -0800155 fun testStyle_setTextDecorationOnWholeText_withLineThrough() {
156 val text = "abcde"
Siyamed Sinir32fd1062019-12-10 10:54:47 -0800157 val spanStyle = SpanStyle(textDecoration = TextDecoration.LineThrough)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800158
159 val paragraph = simpleParagraph(
160 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700161 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700162 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800163 )
Haoyu Zhangb5677202018-12-19 14:22:18 -0800164
Siyamed Sinir63789c92019-09-25 10:44:11 -0700165 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
166 assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, text.length)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800167 }
168
169 @Test
170 fun testStyle_setTextDecorationOnWholeText_withUnderline() {
171 val text = "abcde"
Siyamed Sinir32fd1062019-12-10 10:54:47 -0800172 val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800173
174 val paragraph = simpleParagraph(
175 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700176 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700177 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800178 )
Haoyu Zhangb5677202018-12-19 14:22:18 -0800179
Siyamed Sinir63789c92019-09-25 10:44:11 -0700180 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
181 assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, text.length)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800182 }
183
184 @Test
185 fun testStyle_setTextDecorationOnPartText_withLineThrough() {
186 val text = "abcde"
Siyamed Sinir32fd1062019-12-10 10:54:47 -0800187 val spanStyle = SpanStyle(textDecoration = TextDecoration.LineThrough)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800188
189 val paragraph = simpleParagraph(
190 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700191 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700192 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800193 )
Haoyu Zhangb5677202018-12-19 14:22:18 -0800194
Siyamed Sinir63789c92019-09-25 10:44:11 -0700195 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
196 assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, "abc".length)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800197 }
198
199 @Test
200 fun testStyle_setTextDecorationOnPartText_withUnderline() {
201 val text = "abcde"
Siyamed Sinir32fd1062019-12-10 10:54:47 -0800202 val spanStyle = SpanStyle(textDecoration = TextDecoration.Underline)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800203
204 val paragraph = simpleParagraph(
205 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700206 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700207 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800208 )
Haoyu Zhangb5677202018-12-19 14:22:18 -0800209
Siyamed Sinir63789c92019-09-25 10:44:11 -0700210 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
211 assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, "abc".length)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800212 }
213
214 @Test
215 fun testStyle_setTextDecoration_withLineThroughAndUnderline() {
216 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800217 val spanStyle = SpanStyle(
Siyamed Sinirb649fdd2020-07-13 23:20:30 -0700218 textDecoration = TextDecoration.LineThrough + TextDecoration.Underline
Haoyu Zhangb5677202018-12-19 14:22:18 -0800219 )
220
221 val paragraph = simpleParagraph(
222 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700223 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700224 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800225 )
Haoyu Zhangb5677202018-12-19 14:22:18 -0800226
Siyamed Sinir63789c92019-09-25 10:44:11 -0700227 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
228 assertThat(paragraph.charSequence).hasSpan(UnderlineSpan::class, 0, "abc".length)
229 assertThat(paragraph.charSequence).hasSpan(StrikethroughSpan::class, 0, "abc".length)
Haoyu Zhangb5677202018-12-19 14:22:18 -0800230 }
231
232 @Test
haoyua8e48a52019-06-25 12:23:27 -0700233 fun testAnnotatedString_setFontSizeOnWholeText() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000234 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700235 val text = "abcde"
236 val fontSize = 20.sp
Nader Jawadfeb99f82020-05-21 13:07:36 -0700237 val paragraphWidth = text.length * fontSize.toPx()
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800238 val spanStyle = SpanStyle(fontSize = fontSize)
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800239
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700240 val paragraph = simpleParagraph(
241 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700242 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700243 constraints = ParagraphConstraints(width = paragraphWidth)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700244 )
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800245
Siyamed Sinir63789c92019-09-25 10:44:11 -0700246 assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700247 }
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800248 }
249
250 @Test
haoyua8e48a52019-06-25 12:23:27 -0700251 fun testAnnotatedString_setFontSizeOnPartText() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000252 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700253 val text = "abcde"
254 val fontSize = 20.sp
Nader Jawadfeb99f82020-05-21 13:07:36 -0700255 val paragraphWidth = text.length * fontSize.toPx()
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800256 val spanStyle = SpanStyle(fontSize = fontSize)
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800257
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700258 val paragraph = simpleParagraph(
259 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700260 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700261 constraints = ParagraphConstraints(width = paragraphWidth)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700262 )
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800263
Siyamed Sinir63789c92019-09-25 10:44:11 -0700264 assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, "abc".length)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700265 }
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800266 }
267
268 @Test
haoyua8e48a52019-06-25 12:23:27 -0700269 fun testAnnotatedString_setFontSizeTwice_lastOneOverwrite() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000270 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700271 val text = "abcde"
272 val fontSize = 20.sp
273 val fontSizeOverwrite = 30.sp
Nader Jawadfeb99f82020-05-21 13:07:36 -0700274 val paragraphWidth = text.length * fontSizeOverwrite.toPx()
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800275 val spanStyle = SpanStyle(fontSize = fontSize)
276 val spanStyleOverwrite = SpanStyle(fontSize = fontSizeOverwrite)
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800277
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700278 val paragraph = simpleParagraph(
279 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800280 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700281 AnnotatedString.Range(spanStyle, 0, text.length),
282 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700283 ),
284 constraints = ParagraphConstraints(width = paragraphWidth)
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800285 )
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800286
Siyamed Sinir63789c92019-09-25 10:44:11 -0700287 assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, text.length)
288 assertThat(paragraph.charSequence).hasSpan(AbsoluteSizeSpan::class, 0, "abc".length)
289 assertThat(paragraph.charSequence)
290 .hasSpanOnTop(AbsoluteSizeSpan::class, 0, "abc".length)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700291 }
Haoyu Zhangbb51ccf2018-12-17 15:07:43 -0800292 }
293
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800294 @Test
haoyua8e48a52019-06-25 12:23:27 -0700295 fun testAnnotatedString_setFontSizeScaleOnWholeText() {
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700296 val text = "abcde"
Seigo Nonakad9638202019-11-19 16:37:07 -0800297 val fontSizeScale = 2.0.em
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800298 val spanStyle = SpanStyle(fontSize = fontSizeScale)
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700299
300 val paragraph = simpleParagraph(
301 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700302 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700303 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700304 )
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700305
Siyamed Sinir63789c92019-09-25 10:44:11 -0700306 assertThat(paragraph.charSequence).hasSpan(RelativeSizeSpan::class, 0, text.length) {
Seigo Nonakad9638202019-11-19 16:37:07 -0800307 it.sizeChange == fontSizeScale.value
Siyamed Sinir63789c92019-09-25 10:44:11 -0700308 }
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700309 }
310
311 @Test
haoyua8e48a52019-06-25 12:23:27 -0700312 fun testAnnotatedString_setFontSizeScaleOnPartText() {
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700313 val text = "abcde"
Seigo Nonakad9638202019-11-19 16:37:07 -0800314 val fontSizeScale = 2.0f.em
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800315 val spanStyle = SpanStyle(fontSize = fontSizeScale)
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700316
317 val paragraph = simpleParagraph(
318 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700319 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700320 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700321 )
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700322
Siyamed Sinir63789c92019-09-25 10:44:11 -0700323 assertThat(paragraph.charSequence).hasSpan(RelativeSizeSpan::class, 0, "abc".length) {
Seigo Nonakad9638202019-11-19 16:37:07 -0800324 it.sizeChange == fontSizeScale.value
Siyamed Sinir63789c92019-09-25 10:44:11 -0700325 }
Haoyu Zhang24eb32f2019-05-21 16:16:37 -0700326 }
327
328 @Test
haoyua8e48a52019-06-25 12:23:27 -0700329 fun testAnnotatedString_setLetterSpacingOnWholeText() {
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800330 val text = "abcde"
George Mountb1cdd862018-12-21 10:54:42 -0800331 val letterSpacing = 2.0f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800332 val spanStyle = SpanStyle(letterSpacing = letterSpacing.em)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800333
334 val paragraph = simpleParagraph(
335 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700336 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700337 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800338 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700339
Siyamed Sinir63789c92019-09-25 10:44:11 -0700340 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
Haoyu Zhangd1513022019-12-06 13:55:58 -0800341 assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, text.length)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800342 }
343
344 @Test
haoyua8e48a52019-06-25 12:23:27 -0700345 fun testAnnotatedString_setLetterSpacingOnPartText() {
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800346 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800347 val spanStyle = SpanStyle(letterSpacing = 2.em)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800348
349 val paragraph = simpleParagraph(
350 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700351 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700352 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800353 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700354
Siyamed Sinir63789c92019-09-25 10:44:11 -0700355 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
Haoyu Zhangd1513022019-12-06 13:55:58 -0800356 assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, "abc".length)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800357 }
358
359 @Test
haoyua8e48a52019-06-25 12:23:27 -0700360 fun testAnnotatedString_setLetterSpacingTwice_lastOneOverwrite() {
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800361 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800362 val spanStyle = SpanStyle(letterSpacing = 2.em)
363 val spanStyleOverwrite = SpanStyle(letterSpacing = 3.em)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800364
365 val paragraph = simpleParagraph(
366 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800367 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700368 AnnotatedString.Range(spanStyle, 0, text.length),
369 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700370 ),
371 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800372 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700373
Siyamed Sinir63789c92019-09-25 10:44:11 -0700374 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
Haoyu Zhangd1513022019-12-06 13:55:58 -0800375 assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, text.length)
376 assertThat(paragraph.charSequence).hasSpan(LetterSpacingSpanEm::class, 0, "abc".length)
377 assertThat(paragraph.charSequence).hasSpanOnTop(LetterSpacingSpanEm::class, 0, "abc".length)
Haoyu Zhang1588ba0f2018-12-19 16:47:10 -0800378 }
379
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800380 @Test
haoyua8e48a52019-06-25 12:23:27 -0700381 fun testAnnotatedString_setBackgroundOnWholeText() {
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800382 val text = "abcde"
George Mountaa12c482019-08-14 14:51:38 -0700383 val color = Color(0xFF0000FF)
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800384 val spanStyle = SpanStyle(background = color)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800385
386 val paragraph = simpleParagraph(
387 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700388 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700389 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800390 )
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800391
Siyamed Sinir63789c92019-09-25 10:44:11 -0700392 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
393 assertThat(paragraph.charSequence)
394 .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
George Mounta3145782019-05-02 10:08:03 -0700395 span.backgroundColor == color.toArgb()
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800396 }
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800397 }
398
399 @Test
haoyua8e48a52019-06-25 12:23:27 -0700400 fun testAnnotatedString_setBackgroundOnPartText() {
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800401 val text = "abcde"
George Mountaa12c482019-08-14 14:51:38 -0700402 val color = Color(0xFF0000FF)
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800403 val spanStyle = SpanStyle(background = color)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800404
405 val paragraph = simpleParagraph(
406 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700407 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700408 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800409 )
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800410
Siyamed Sinir63789c92019-09-25 10:44:11 -0700411 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
412 assertThat(paragraph.charSequence)
413 .hasSpan(BackgroundColorSpan::class, 0, "abc".length) { span ->
George Mounta3145782019-05-02 10:08:03 -0700414 span.backgroundColor == color.toArgb()
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800415 }
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800416 }
417
418 @Test
haoyua8e48a52019-06-25 12:23:27 -0700419 fun testAnnotatedString_setBackgroundTwice_lastOneOverwrite() {
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800420 val text = "abcde"
George Mountaa12c482019-08-14 14:51:38 -0700421 val color = Color(0xFF0000FF)
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800422 val spanStyle = SpanStyle(background = color)
George Mountaa12c482019-08-14 14:51:38 -0700423 val colorOverwrite = Color(0xFF00FF00)
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800424 val spanStyleOverwrite = SpanStyle(background = colorOverwrite)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800425
426 val paragraph = simpleParagraph(
427 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800428 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700429 AnnotatedString.Range(spanStyle, 0, text.length),
430 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700431 ),
432 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800433 )
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800434
Siyamed Sinir63789c92019-09-25 10:44:11 -0700435 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
436 assertThat(paragraph.charSequence)
437 .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
George Mounta3145782019-05-02 10:08:03 -0700438 span.backgroundColor == color.toArgb()
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800439 }
Siyamed Sinir63789c92019-09-25 10:44:11 -0700440 assertThat(paragraph.charSequence)
441 .hasSpan(BackgroundColorSpan::class, 0, "abc".length) { span ->
George Mounta3145782019-05-02 10:08:03 -0700442 span.backgroundColor == colorOverwrite.toArgb()
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800443 }
Siyamed Sinir63789c92019-09-25 10:44:11 -0700444 assertThat(paragraph.charSequence)
445 .hasSpanOnTop(BackgroundColorSpan::class, 0, "abc".length) { span ->
George Mounta3145782019-05-02 10:08:03 -0700446 span.backgroundColor == colorOverwrite.toArgb()
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800447 }
Haoyu Zhang0c4fd022019-01-02 13:53:10 -0800448 }
449
450 @Test
haoyua8e48a52019-06-25 12:23:27 -0700451 fun testAnnotatedString_setLocaleOnWholeText() {
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800452 val text = "abcde"
Seigo Nonaka8de69792019-09-04 14:55:15 -0700453 val localeList = LocaleList("en-US")
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800454 val spanStyle = SpanStyle(localeList = localeList)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800455
456 val paragraph = simpleParagraph(
457 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700458 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700459 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800460 )
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800461
Siyamed Sinir63789c92019-09-25 10:44:11 -0700462 assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, text.length)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800463 }
464
465 @Test
haoyua8e48a52019-06-25 12:23:27 -0700466 fun testAnnotatedString_setLocaleOnPartText() {
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800467 val text = "abcde"
Seigo Nonaka8de69792019-09-04 14:55:15 -0700468 val localeList = LocaleList("en-US")
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800469 val spanStyle = SpanStyle(localeList = localeList)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800470
471 val paragraph = simpleParagraph(
472 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700473 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700474 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800475 )
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800476
Siyamed Sinir63789c92019-09-25 10:44:11 -0700477 assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, "abc".length)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800478 }
479
480 @Test
haoyua8e48a52019-06-25 12:23:27 -0700481 fun testAnnotatedString_setLocaleTwice_lastOneOverwrite() {
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800482 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800483 val spanStyle = SpanStyle(localeList = LocaleList("en-US"))
484 val spanStyleOverwrite = SpanStyle(localeList = LocaleList("ja-JP"))
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800485
486 val paragraph = simpleParagraph(
487 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800488 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700489 AnnotatedString.Range(spanStyle, 0, text.length),
490 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700491 ),
492 constraints = ParagraphConstraints(width = 100.0f)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800493 )
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800494
Siyamed Sinir63789c92019-09-25 10:44:11 -0700495 assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, text.length)
496 assertThat(paragraph.charSequence).hasSpan(LocaleSpan::class, 0, "abc".length)
497 assertThat(paragraph.charSequence).hasSpanOnTop(LocaleSpan::class, 0, "abc".length)
Haoyu Zhang4b201d22018-12-18 14:27:38 -0800498 }
499
500 @Test
haoyua8e48a52019-06-25 12:23:27 -0700501 fun testAnnotatedString_setBaselineShiftOnWholeText() {
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800502 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800503 val spanStyle = SpanStyle(baselineShift = BaselineShift.Subscript)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800504
505 val paragraph = simpleParagraph(
506 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700507 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700508 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800509 )
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800510
Siyamed Sinir63789c92019-09-25 10:44:11 -0700511 assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, text.length)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800512 }
513
514 @Test
haoyua8e48a52019-06-25 12:23:27 -0700515 fun testAnnotatedString_setBaselineShiftOnPartText() {
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800516 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800517 val spanStyle = SpanStyle(baselineShift = BaselineShift.Superscript)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800518
519 val paragraph = simpleParagraph(
520 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700521 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700522 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800523 )
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800524
Siyamed Sinir63789c92019-09-25 10:44:11 -0700525 assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, "abc".length)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800526 }
527
528 @Test
haoyua8e48a52019-06-25 12:23:27 -0700529 fun testAnnotatedString_setBaselineShiftTwice_LastOneOnTop() {
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800530 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800531 val spanStyle = SpanStyle(baselineShift = BaselineShift.Subscript)
532 val spanStyleOverwrite =
533 SpanStyle(baselineShift = BaselineShift.Superscript)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800534
535 val paragraph = simpleParagraph(
536 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800537 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700538 AnnotatedString.Range(spanStyle, 0, text.length),
539 AnnotatedString.Range(spanStyleOverwrite, 0, "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700540 ),
541 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800542 )
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800543
Siyamed Sinir63789c92019-09-25 10:44:11 -0700544 assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, text.length)
545 assertThat(paragraph.charSequence).hasSpan(BaselineShiftSpan::class, 0, "abc".length)
546 assertThat(paragraph.charSequence).hasSpanOnTop(BaselineShiftSpan::class, 0, "abc".length)
Haoyu Zhang40ce6bf2019-01-28 15:58:20 -0800547 }
548
549 @Test
haoyua8e48a52019-06-25 12:23:27 -0700550 fun testAnnotatedString_setTextGeometricTransformWithNull_noSpanSet() {
Haoyu Zhang15750922019-02-19 13:44:17 -0800551 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800552 val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform())
Haoyu Zhang15750922019-02-19 13:44:17 -0800553
554 val paragraph = simpleParagraph(
555 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700556 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700557 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang15750922019-02-19 13:44:17 -0800558 )
Haoyu Zhang15750922019-02-19 13:44:17 -0800559
Siyamed Sinir63789c92019-09-25 10:44:11 -0700560 assertThat(paragraph.charSequence).spans(ScaleXSpan::class).isEmpty()
561 assertThat(paragraph.charSequence).spans(SkewXSpan::class).isEmpty()
Haoyu Zhang15750922019-02-19 13:44:17 -0800562 }
563
564 @Test
haoyua8e48a52019-06-25 12:23:27 -0700565 fun testAnnotatedString_setTextGeometricTransformWithScaleX() {
Haoyu Zhang15750922019-02-19 13:44:17 -0800566 val text = "abcde"
567 val scaleX = 0.5f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800568 val spanStyle = SpanStyle(
Siyamed Sinirff51df92019-07-02 15:35:20 -0700569 textGeometricTransform = TextGeometricTransform(
Seigo Nonaka9b62cc92019-12-03 14:32:17 -0800570 scaleX = scaleX
Siyamed Sinirff51df92019-07-02 15:35:20 -0700571 )
572 )
Haoyu Zhang15750922019-02-19 13:44:17 -0800573
574 val paragraph = simpleParagraph(
575 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700576 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700577 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang15750922019-02-19 13:44:17 -0800578 )
Haoyu Zhang15750922019-02-19 13:44:17 -0800579
Siyamed Sinir63789c92019-09-25 10:44:11 -0700580 assertThat(paragraph.charSequence).hasSpan(ScaleXSpan::class, 0, text.length) {
581 it.scaleX == scaleX
582 }
583 assertThat(paragraph.charSequence).spans(SkewXSpan::class).isEmpty()
Haoyu Zhang15750922019-02-19 13:44:17 -0800584 }
585
586 @Test
haoyua8e48a52019-06-25 12:23:27 -0700587 fun testAnnotatedString_setTextGeometricTransformWithSkewX() {
Haoyu Zhang15750922019-02-19 13:44:17 -0800588 val text = "aa"
589 val skewX = 1f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800590 val spanStyle = SpanStyle(textGeometricTransform = TextGeometricTransform(skewX = skewX))
Haoyu Zhang15750922019-02-19 13:44:17 -0800591
592 val paragraph = simpleParagraph(
593 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700594 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, text.length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700595 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang15750922019-02-19 13:44:17 -0800596 )
Haoyu Zhang15750922019-02-19 13:44:17 -0800597
Siyamed Sinir63789c92019-09-25 10:44:11 -0700598 assertThat(paragraph.charSequence).hasSpan(SkewXSpan::class, 0, text.length) {
599 it.skewX == skewX
600 }
601 assertThat(paragraph.charSequence).spans(ScaleXSpan::class).isEmpty()
Haoyu Zhang15750922019-02-19 13:44:17 -0800602 }
603
604 @Test
Siyamed Sinir2690d532019-06-21 13:16:00 -0700605 fun textIndent_onWholeParagraph() {
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800606 val text = "abc\ndef"
607 val firstLine = 40
608 val restLine = 20
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800609
610 val paragraph = simpleParagraph(
611 text = text,
Haoyu Zhangb0e43c12019-10-15 16:37:51 -0700612 textIndent = TextIndent(firstLine.sp, restLine.sp),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700613 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800614 )
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800615
Siyamed Sinir63789c92019-09-25 10:44:11 -0700616 assertThat(paragraph.charSequence)
617 .hasSpan(LeadingMarginSpan.Standard::class, 0, text.length) {
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800618 it.getLeadingMargin(true) == firstLine && it.getLeadingMargin(false) == restLine
619 }
Haoyu Zhang7fc59172019-03-01 17:03:31 -0800620 }
621
622 @Test
haoyua8e48a52019-06-25 12:23:27 -0700623 fun testAnnotatedString_setShadow() {
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800624 val text = "abcde"
George Mountaa12c482019-08-14 14:51:38 -0700625 val color = Color(0xFF00FF00)
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800626 val offset = Offset(1f, 2f)
Nader Jawad22de7912020-05-15 14:31:13 -0700627 val radius = 3.0f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800628 val spanStyle = SpanStyle(shadow = Shadow(color, offset, radius))
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800629
630 val paragraph = simpleParagraph(
631 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800632 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700633 AnnotatedString.Range(spanStyle, start = 0, end = text.length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700634 ),
635 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800636 )
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800637
Siyamed Sinir63789c92019-09-25 10:44:11 -0700638 assertThat(paragraph.charSequence)
639 .hasSpan(ShadowSpan::class, start = 0, end = text.length) {
George Mounta3145782019-05-02 10:08:03 -0700640 return@hasSpan it.color == color.toArgb() &&
Nader Jawad6df06122020-06-03 15:27:08 -0700641 it.offsetX == offset.x &&
642 it.offsetY == offset.y &&
Nader Jawad22de7912020-05-15 14:31:13 -0700643 it.radius == radius
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800644 }
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800645 }
646
647 @Test
haoyua8e48a52019-06-25 12:23:27 -0700648 fun testAnnotatedString_setShadowTwice_lastOnTop() {
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800649 val text = "abcde"
George Mountaa12c482019-08-14 14:51:38 -0700650 val color = Color(0xFF00FF00)
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800651 val offset = Offset(1f, 2f)
Nader Jawad22de7912020-05-15 14:31:13 -0700652 val radius = 3.0f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800653 val spanStyle = SpanStyle(shadow = Shadow(color, offset, radius))
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800654
George Mountaa12c482019-08-14 14:51:38 -0700655 val colorOverwrite = Color(0xFF0000FF)
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800656 val offsetOverwrite = Offset(3f, 2f)
Nader Jawad22de7912020-05-15 14:31:13 -0700657 val radiusOverwrite = 1.0f
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800658 val spanStyleOverwrite = SpanStyle(
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800659 shadow = Shadow(colorOverwrite, offsetOverwrite, radiusOverwrite)
660 )
661
662 val paragraph = simpleParagraph(
663 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800664 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700665 AnnotatedString.Range(spanStyle, start = 0, end = text.length),
666 AnnotatedString.Range(spanStyleOverwrite, start = 0, end = "abc".length)
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700667 ),
668 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800669 )
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800670
Siyamed Sinir63789c92019-09-25 10:44:11 -0700671 assertThat(paragraph.charSequence)
672 .hasSpan(ShadowSpan::class, start = 0, end = text.length) {
George Mounta3145782019-05-02 10:08:03 -0700673 return@hasSpan it.color == color.toArgb() &&
Nader Jawad6df06122020-06-03 15:27:08 -0700674 it.offsetX == offset.x &&
675 it.offsetY == offset.y &&
Nader Jawad22de7912020-05-15 14:31:13 -0700676 it.radius == radius
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800677 }
Siyamed Sinir63789c92019-09-25 10:44:11 -0700678 assertThat(paragraph.charSequence)
679 .hasSpanOnTop(ShadowSpan::class, start = 0, end = "abc".length) {
George Mounta3145782019-05-02 10:08:03 -0700680 return@hasSpanOnTop it.color == colorOverwrite.toArgb() &&
Nader Jawad6df06122020-06-03 15:27:08 -0700681 it.offsetX == offsetOverwrite.x &&
682 it.offsetY == offsetOverwrite.y &&
Nader Jawad22de7912020-05-15 14:31:13 -0700683 it.radius == radiusOverwrite
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800684 }
Haoyu Zhang2a036c832019-03-08 11:57:13 -0800685 }
686
687 @Test
haoyua8e48a52019-06-25 12:23:27 -0700688 fun testAnnotatedString_fontFamily_addsTypefaceSpanWithCorrectTypeface() {
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800689 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800690 val spanStyle = SpanStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800691 fontFamily = basicFontFamily,
Siyamed Siniradf982d2019-05-20 17:35:13 -0700692 fontStyle = FontStyle.Italic,
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700693 fontWeight = FontWeight.Bold
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800694 )
695 val expectedTypeface = TypefaceAdapter().create(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800696 fontFamily = basicFontFamily,
Siyamed Siniradf982d2019-05-20 17:35:13 -0700697 fontStyle = FontStyle.Italic,
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700698 fontWeight = FontWeight.Bold
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800699 )
Siyamed Sinir37298412018-12-27 19:47:15 -0800700 val expectedStart = 0
701 val expectedEnd = "abc".length
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800702
703 val paragraph = simpleParagraph(
704 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800705 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700706 AnnotatedString.Range(
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800707 spanStyle,
Siyamed Sinir37298412018-12-27 19:47:15 -0800708 expectedStart,
709 expectedEnd
710 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700711 ),
712 constraints = ParagraphConstraints(width = 100.0f)
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800713 )
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800714
Siyamed Sinir63789c92019-09-25 10:44:11 -0700715 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
716 assertThat(paragraph.charSequence)
haoyue8f35592020-05-08 16:12:23 -0700717 .hasSpan(FontSpan::class, expectedStart, expectedEnd) { span ->
718 span.getTypeface(FontWeight.Bold.weight, true) == expectedTypeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700719 }
Siyamed Sinir37298412018-12-27 19:47:15 -0800720 }
721
722 @Test
haoyua8e48a52019-06-25 12:23:27 -0700723 fun testAnnotatedString_fontFamily_whenFontSynthesizeTurnedOff() {
Siyamed Sinir37298412018-12-27 19:47:15 -0800724 val text = "abcde"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800725 val spanStyle = SpanStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800726 fontFamily = basicFontFamily,
Siyamed Siniradf982d2019-05-20 17:35:13 -0700727 fontStyle = FontStyle.Italic,
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700728 fontWeight = FontWeight.Bold,
Siyamed Sinir934a3442019-06-18 12:57:13 -0700729 fontSynthesis = FontSynthesis.None
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800730 )
Siyamed Sinir37298412018-12-27 19:47:15 -0800731 val expectedTypeface = TypefaceAdapter().create(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800732 fontFamily = basicFontFamily,
Siyamed Siniradf982d2019-05-20 17:35:13 -0700733 fontStyle = FontStyle.Italic,
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700734 fontWeight = FontWeight.Bold,
Siyamed Sinir934a3442019-06-18 12:57:13 -0700735 fontSynthesis = FontSynthesis.None
Siyamed Sinir37298412018-12-27 19:47:15 -0800736 )
737 val expectedStart = 0
738 val expectedEnd = "abc".length
739
740 val paragraph = simpleParagraph(
741 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800742 spanStyles = listOf(
haoyu60b7f192020-05-07 00:22:31 -0700743 AnnotatedString.Range(
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800744 spanStyle,
Siyamed Sinir37298412018-12-27 19:47:15 -0800745 expectedStart,
746 expectedEnd
747 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700748 ),
749 constraints = ParagraphConstraints(width = 100.0f)
Siyamed Sinir37298412018-12-27 19:47:15 -0800750 )
Siyamed Sinir37298412018-12-27 19:47:15 -0800751
Siyamed Sinir63789c92019-09-25 10:44:11 -0700752 assertThat(paragraph.charSequence.toString()).isEqualTo(text)
753 assertThat(paragraph.charSequence)
haoyue8f35592020-05-08 16:12:23 -0700754 .hasSpan(FontSpan::class, expectedStart, expectedEnd) { span ->
755 span.getTypeface(FontWeight.Bold.weight, true) == expectedTypeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700756 }
Siyamed Sinir70f336a2018-12-27 10:37:09 -0800757 }
758
759 @Test
haoyua8e48a52019-06-25 12:23:27 -0700760 fun testAnnotatedString_fontFeatureSetting_setSpanOnText() {
Haoyu Zhang588aaef2019-02-20 14:47:39 -0800761 val text = "abc"
762 val fontFeatureSettings = "\"kern\" 0"
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -0800763 val spanStyle = SpanStyle(fontFeatureSettings = fontFeatureSettings)
Haoyu Zhang588aaef2019-02-20 14:47:39 -0800764
765 val paragraph = simpleParagraph(
766 text = text,
haoyu60b7f192020-05-07 00:22:31 -0700767 spanStyles = listOf(AnnotatedString.Range(spanStyle, 0, "abc".length)),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700768 constraints = ParagraphConstraints(width = 100.0f) // width is not important
Haoyu Zhang588aaef2019-02-20 14:47:39 -0800769 )
Haoyu Zhang588aaef2019-02-20 14:47:39 -0800770
Siyamed Sinir63789c92019-09-25 10:44:11 -0700771 assertThat(paragraph.charSequence).hasSpan(FontFeatureSpan::class, 0, "abc".length) {
772 it.fontFeatureSettings == fontFeatureSettings
773 }
Haoyu Zhang588aaef2019-02-20 14:47:39 -0800774 }
775
776 @Test
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800777 fun testEmptyFontFamily() {
778 val typefaceAdapter = mock<TypefaceAdapter>()
779 val paragraph = simpleParagraph(
780 text = "abc",
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700781 typefaceAdapter = typefaceAdapter,
782 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800783 )
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800784
785 verify(typefaceAdapter, never()).create(
786 fontFamily = any(),
787 fontWeight = any(),
Siyamed Sinir21796012018-12-26 13:51:17 -0800788 fontStyle = any(),
789 fontSynthesis = any()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800790 )
Siyamed Sinir63789c92019-09-25 10:44:11 -0700791 assertThat(paragraph.textPaint.typeface).isNull()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800792 }
793
794 @Test
795 fun testEmptyFontFamily_withBoldFontWeightSelection() {
796 val typefaceAdapter = spy(TypefaceAdapter())
797
798 val paragraph = simpleParagraph(
799 text = "abc",
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800800 style = TextStyle(
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700801 fontFamily = null,
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700802 fontWeight = FontWeight.Bold
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700803 ),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700804 typefaceAdapter = typefaceAdapter,
805 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800806 )
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800807
808 verify(typefaceAdapter, times(1)).create(
809 fontFamily = eq(null),
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700810 fontWeight = eq(FontWeight.Bold),
Siyamed Siniradf982d2019-05-20 17:35:13 -0700811 fontStyle = eq(FontStyle.Normal),
Siyamed Sinir934a3442019-06-18 12:57:13 -0700812 fontSynthesis = eq(FontSynthesis.All)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800813 )
814
815 val typeface = paragraph.textPaint.typeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700816 assertThat(typeface).isNotNull()
817 assertThat(typeface.isBold).isTrue()
818 assertThat(typeface.isItalic).isFalse()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800819 }
820
821 @Test
822 fun testEmptyFontFamily_withFontStyleSelection() {
823 val typefaceAdapter = spy(TypefaceAdapter())
824 val paragraph = simpleParagraph(
825 text = "abc",
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800826 style = TextStyle(
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700827 fontFamily = null,
828 fontStyle = FontStyle.Italic
829 ),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700830 typefaceAdapter = typefaceAdapter,
831 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800832 )
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800833
834 verify(typefaceAdapter, times(1)).create(
835 fontFamily = eq(null),
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700836 fontWeight = eq(FontWeight.Normal),
Siyamed Siniradf982d2019-05-20 17:35:13 -0700837 fontStyle = eq(FontStyle.Italic),
Siyamed Sinir934a3442019-06-18 12:57:13 -0700838 fontSynthesis = eq(FontSynthesis.All)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800839 )
840
841 val typeface = paragraph.textPaint.typeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700842 assertThat(typeface).isNotNull()
843 assertThat(typeface.isBold).isFalse()
844 assertThat(typeface.isItalic).isTrue()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800845 }
846
847 @Test
848 fun testFontFamily_withGenericFamilyName() {
849 val typefaceAdapter = spy(TypefaceAdapter())
Seigo Nonaka5df56b82020-01-30 14:15:25 -0800850 val fontFamily = FontFamily.SansSerif
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800851
852 val paragraph = simpleParagraph(
853 text = "abc",
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800854 style = TextStyle(
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700855 fontFamily = fontFamily
856 ),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700857 typefaceAdapter = typefaceAdapter,
858 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800859 )
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800860
861 verify(typefaceAdapter, times(1)).create(
862 fontFamily = eq(fontFamily),
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700863 fontWeight = eq(FontWeight.Normal),
Siyamed Siniradf982d2019-05-20 17:35:13 -0700864 fontStyle = eq(FontStyle.Normal),
Siyamed Sinir934a3442019-06-18 12:57:13 -0700865 fontSynthesis = eq(FontSynthesis.All)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800866 )
867
868 val typeface = paragraph.textPaint.typeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700869 assertThat(typeface).isNotNull()
870 assertThat(typeface.isBold).isFalse()
871 assertThat(typeface.isItalic).isFalse()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800872 }
873
874 @Test
875 fun testFontFamily_withCustomFont() {
876 val typefaceAdapter = spy(TypefaceAdapter())
877 val paragraph = simpleParagraph(
878 text = "abc",
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800879 style = TextStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800880 fontFamily = basicFontFamily
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700881 ),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700882 typefaceAdapter = typefaceAdapter,
883 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800884 )
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800885
haoyue8f35592020-05-08 16:12:23 -0700886 verify(typefaceAdapter, atLeastOnce()).create(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800887 fontFamily = eq(basicFontFamily),
Siyamed Sinirdc8f5742019-10-04 21:03:28 -0700888 fontWeight = eq(FontWeight.Normal),
Siyamed Siniradf982d2019-05-20 17:35:13 -0700889 fontStyle = eq(FontStyle.Normal),
Siyamed Sinir934a3442019-06-18 12:57:13 -0700890 fontSynthesis = eq(FontSynthesis.All)
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800891 )
892 val typeface = paragraph.textPaint.typeface
Siyamed Sinir63789c92019-09-25 10:44:11 -0700893 assertThat(typeface.isBold).isFalse()
894 assertThat(typeface.isItalic).isFalse()
Siyamed Sinirf18dcca2018-12-20 18:25:10 -0800895 }
896
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800897 @Test
haoyue8f35592020-05-08 16:12:23 -0700898 fun testFontFamily_appliedAsSpan() {
899 val text = "abc"
900 val typefaceAdapter = spy(TypefaceAdapter())
901 val paragraph = simpleParagraph(
902 text = text,
903 style = TextStyle(
904 fontFamily = basicFontFamily
905 ),
906 typefaceAdapter = typefaceAdapter,
907 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
908 )
909
910 val charSequence = paragraph.charSequence
911 assertThat(charSequence).hasSpan(FontSpan::class, 0, text.length)
912 }
913
914 @Test
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800915 fun testEllipsis_withMaxLineEqualsNull_doesNotEllipsis() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000916 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700917 val text = "abc"
918 val fontSize = 20.sp
Nader Jawadfeb99f82020-05-21 13:07:36 -0700919 val paragraphWidth = (text.length - 1) * fontSize.toPx()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700920 val paragraph = simpleParagraph(
921 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800922 style = TextStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800923 fontFamily = basicFontFamily,
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700924 fontSize = fontSize
925 ),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700926 ellipsis = true,
927 constraints = ParagraphConstraints(width = paragraphWidth)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700928 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700929
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700930 for (i in 0 until paragraph.lineCount) {
Siyamed Sinir63789c92019-09-25 10:44:11 -0700931 assertThat(paragraph.isEllipsisApplied(i)).isFalse()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700932 }
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800933 }
934 }
935
936 @Test
937 fun testEllipsis_withMaxLinesLessThanTextLines_doesEllipsis() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000938 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700939 val text = "abcde"
940 val fontSize = 100.sp
941 // Note that on API 21, if the next line only contains 1 character, ellipsis won't work
Nader Jawadfeb99f82020-05-21 13:07:36 -0700942 val paragraphWidth = (text.length - 1.5f) * fontSize.toPx()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700943 val paragraph = simpleParagraph(
944 text = text,
945 ellipsis = true,
946 maxLines = 1,
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800947 style = TextStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800948 fontFamily = basicFontFamily,
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700949 fontSize = fontSize
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700950 ),
951 constraints = ParagraphConstraints(width = paragraphWidth)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700952 )
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800953
Siyamed Sinir63789c92019-09-25 10:44:11 -0700954 assertThat(paragraph.isEllipsisApplied(0)).isTrue()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700955 }
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800956 }
957
958 @Test
959 fun testEllipsis_withMaxLinesMoreThanTextLines_doesNotEllipsis() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000960 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700961 val text = "abc"
962 val fontSize = 100.sp
Nader Jawadfeb99f82020-05-21 13:07:36 -0700963 val paragraphWidth = (text.length - 1) * fontSize.toPx()
964 val maxLines = ceil(text.length * fontSize.toPx() / paragraphWidth).toInt()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700965 val paragraph = simpleParagraph(
966 text = text,
967 ellipsis = true,
968 maxLines = maxLines,
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800969 style = TextStyle(
Seigo Nonaka23fcd672019-12-09 14:46:23 -0800970 fontFamily = basicFontFamily,
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700971 fontSize = fontSize
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700972 ),
973 constraints = ParagraphConstraints(width = paragraphWidth)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700974 )
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800975
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700976 for (i in 0 until paragraph.lineCount) {
Siyamed Sinir63789c92019-09-25 10:44:11 -0700977 assertThat(paragraph.isEllipsisApplied(i)).isFalse()
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700978 }
Haoyu Zhangc11ef5a2019-01-14 16:35:05 -0800979 }
980 }
981
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700982 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -0800983 fun testSpanStyle_fontSize_appliedOnTextPaint() {
Andrey Kulikov47f0e1a2020-01-28 13:52:46 +0000984 with(defaultDensity) {
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700985 val fontSize = 100.sp
986 val paragraph = simpleParagraph(
987 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -0800988 style = TextStyle(fontSize = fontSize),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -0700989 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700990 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700991
Nader Jawadfeb99f82020-05-21 13:07:36 -0700992 assertThat(paragraph.textPaint.textSize).isEqualTo(fontSize.toPx())
Siyamed Sinir7d4c98f2019-06-27 16:23:31 -0700993 }
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -0700994 }
995
996 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -0800997 fun testSpanStyle_locale_appliedOnTextPaint() {
Seigo Nonaka8de69792019-09-04 14:55:15 -0700998 val platformLocale = java.util.Locale.JAPANESE
999 val localeList = LocaleList(platformLocale.toLanguageTag())
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001000
1001 val paragraph = simpleParagraph(
1002 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001003 style = TextStyle(localeList = localeList),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001004 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001005 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001006
Siyamed Sinir63789c92019-09-25 10:44:11 -07001007 assertThat(paragraph.textPaint.textLocale.language).isEqualTo(platformLocale.language)
1008 assertThat(paragraph.textPaint.textLocale.country).isEqualTo(platformLocale.country)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001009 }
1010
1011 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001012 fun testSpanStyle_color_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001013 val color = Color(0x12345678)
1014 val paragraph = simpleParagraph(
1015 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001016 style = TextStyle(color = color),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001017 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001018 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001019
Siyamed Sinir63789c92019-09-25 10:44:11 -07001020 assertThat(paragraph.textPaint.color).isEqualTo(color.toArgb())
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001021 }
1022
1023 @Test
Haoyu Zhangc38bed12019-12-05 14:38:45 -08001024 fun testTextStyle_letterSpacingInEm_appliedOnTextPaint() {
Haoyu Zhangf2e9e032019-10-16 15:23:39 -07001025 val letterSpacing = 2
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001026 val paragraph = simpleParagraph(
1027 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001028 style = TextStyle(letterSpacing = letterSpacing.em),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001029 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001030 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001031
Siyamed Sinir63789c92019-09-25 10:44:11 -07001032 assertThat(paragraph.textPaint.letterSpacing).isEqualTo((letterSpacing))
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001033 }
1034
1035 @Test
Haoyu Zhangc38bed12019-12-05 14:38:45 -08001036 fun testTextStyle_letterSpacingInSp_appliedAsSpan() {
1037 val letterSpacing = 5f
1038 val text = "abc"
1039 val paragraph = simpleParagraph(
1040 text = text,
1041 style = TextStyle(letterSpacing = letterSpacing.sp),
1042 constraints = ParagraphConstraints(width = 0.0f)
1043 )
1044
1045 assertThat(paragraph.charSequence)
1046 .hasSpan(LetterSpacingSpanPx::class, 0, text.length) {
1047 it.letterSpacing == letterSpacing
1048 }
1049 }
1050
1051 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001052 fun testSpanStyle_fontFeatureSettings_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001053 val fontFeatureSettings = "\"kern\" 0"
1054 val paragraph = simpleParagraph(
1055 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001056 style = TextStyle(fontFeatureSettings = fontFeatureSettings),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001057 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001058 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001059
Siyamed Sinir63789c92019-09-25 10:44:11 -07001060 assertThat(paragraph.textPaint.fontFeatureSettings).isEqualTo(fontFeatureSettings)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001061 }
1062
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001063 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001064 fun testSpanStyle_scaleX_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001065 val scaleX = 0.5f
1066 val paragraph = simpleParagraph(
1067 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001068 style = TextStyle(
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001069 textGeometricTransform = TextGeometricTransform(
1070 scaleX = scaleX
1071 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001072 ),
1073 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001074 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001075
Siyamed Sinir63789c92019-09-25 10:44:11 -07001076 assertThat(paragraph.textPaint.textScaleX).isEqualTo(scaleX)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001077 }
1078
1079 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001080 fun testSpanStyle_skewX_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001081 val skewX = 0.5f
1082 val paragraph = simpleParagraph(
1083 text = "",
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001084 style = TextStyle(
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001085 textGeometricTransform = TextGeometricTransform(
1086 skewX = skewX
1087 )
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001088 ),
1089 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001090 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001091
Siyamed Sinir63789c92019-09-25 10:44:11 -07001092 assertThat(paragraph.textPaint.textSkewX).isEqualTo(skewX)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001093 }
1094
1095 @Test
Siyamed Sinir32fd1062019-12-10 10:54:47 -08001096 fun testSpanStyle_textDecoration_underline_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001097 val paragraph = simpleParagraph(
1098 text = "",
Siyamed Sinir32fd1062019-12-10 10:54:47 -08001099 style = TextStyle(textDecoration = TextDecoration.Underline),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001100 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001101 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001102
Siyamed Sinir18914522019-09-25 15:41:44 -07001103 assertThat(paragraph.textPaint.isUnderlineText).isTrue()
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001104 }
1105
1106 @Test
Siyamed Sinir32fd1062019-12-10 10:54:47 -08001107 fun testSpanStyle_textDecoration_lineThrough_appliedOnTextPaint() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001108 val paragraph = simpleParagraph(
1109 text = "",
Siyamed Sinir32fd1062019-12-10 10:54:47 -08001110 style = TextStyle(textDecoration = TextDecoration.LineThrough),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001111 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001112 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001113
Siyamed Sinir18914522019-09-25 15:41:44 -07001114 assertThat(paragraph.textPaint.isStrikeThruText).isTrue()
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001115 }
1116
1117 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001118 fun testSpanStyle_background_appliedAsSpan() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001119 // bgColor is reset in the Android Layout constructor.
1120 // therefore we cannot apply them on paint, have to use spans.
1121 val text = "abc"
1122 val color = Color(0x12345678)
1123 val paragraph = simpleParagraph(
1124 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001125 style = TextStyle(background = color),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001126 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001127 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001128
Siyamed Sinir63789c92019-09-25 10:44:11 -07001129 assertThat(paragraph.charSequence)
1130 .hasSpan(BackgroundColorSpan::class, 0, text.length) { span ->
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001131 span.backgroundColor == color.toArgb()
1132 }
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001133 }
1134
1135 @Test
Siyamed Sinir0b691752019-12-05 11:27:58 -08001136 fun testSpanStyle_baselineShift_appliedAsSpan() {
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001137 // baselineShift is reset in the Android Layout constructor.
1138 // therefore we cannot apply them on paint, have to use spans.
1139 val text = "abc"
1140 val baselineShift = BaselineShift.Subscript
1141 val paragraph = simpleParagraph(
1142 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001143 style = TextStyle(baselineShift = baselineShift),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001144 constraints = ParagraphConstraints(width = 0.0f)
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001145 )
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001146
Siyamed Sinir63789c92019-09-25 10:44:11 -07001147 assertThat(paragraph.charSequence)
1148 .hasSpan(BaselineShiftSpan::class, 0, text.length) { span ->
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001149 span.multiplier == BaselineShift.Subscript.multiplier
1150 }
Siyamed Sinirbf9f3ba2019-06-25 22:40:56 -07001151 }
1152
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001153 @Test
1154 fun locale_isDefaultLocaleIfNotProvided() {
1155 val text = "abc"
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001156 val paragraph = simpleParagraph(
1157 text = text,
1158 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
1159 )
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001160
Siyamed Sinir63789c92019-09-25 10:44:11 -07001161 assertThat(paragraph.textLocale.toLanguageTag())
1162 .isEqualTo(java.util.Locale.getDefault().toLanguageTag())
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001163 }
1164
1165 @Test
1166 fun locale_isSetOnParagraphImpl_enUS() {
Seigo Nonaka8de69792019-09-04 14:55:15 -07001167 val localeList = LocaleList("en-US")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001168 val text = "abc"
1169 val paragraph = simpleParagraph(
1170 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001171 style = TextStyle(localeList = localeList),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001172 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001173 )
1174
Siyamed Sinir63789c92019-09-25 10:44:11 -07001175 assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("en-US")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001176 }
1177
1178 @Test
1179 fun locale_isSetOnParagraphImpl_jpJP() {
Seigo Nonaka8de69792019-09-04 14:55:15 -07001180 val localeList = LocaleList("ja-JP")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001181 val text = "abc"
1182 val paragraph = simpleParagraph(
1183 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001184 style = TextStyle(localeList = localeList),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001185 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001186 )
1187
Siyamed Sinir63789c92019-09-25 10:44:11 -07001188 assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("ja-JP")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001189 }
1190
1191 @Test
1192 fun locale_noCountryCode_isSetOnParagraphImpl() {
Seigo Nonaka8de69792019-09-04 14:55:15 -07001193 val localeList = LocaleList("ja")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001194 val text = "abc"
1195 val paragraph = simpleParagraph(
1196 text = text,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001197 style = TextStyle(localeList = localeList),
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001198 constraints = ParagraphConstraints(width = Float.MAX_VALUE)
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001199 )
1200
Siyamed Sinir63789c92019-09-25 10:44:11 -07001201 assertThat(paragraph.textLocale.toLanguageTag()).isEqualTo("ja")
Siyamed Sinir031e5bf2019-07-02 11:49:05 -07001202 }
1203
Seigo Nonakac4f136a2019-08-16 16:48:44 -07001204 @Test
Seigo Nonakaad4a3772019-08-26 12:06:58 -07001205 fun floatingWidth() {
1206 val floatWidth = 1.3f
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001207 val paragraph = simpleParagraph(
1208 text = "Hello, World",
1209 constraints = ParagraphConstraints(floatWidth)
1210 )
1211
Siyamed Sinir63789c92019-09-25 10:44:11 -07001212 assertThat(floatWidth).isEqualTo(paragraph.width)
Seigo Nonakaad4a3772019-08-26 12:06:58 -07001213 }
1214
Haoyu Zhang10fc6502018-11-09 15:50:11 -08001215 private fun simpleParagraph(
Haoyu Zhang27429892019-06-11 13:19:57 -07001216 text: String = "",
haoyu60b7f192020-05-07 00:22:31 -07001217 spanStyles: List<AnnotatedString.Range<SpanStyle>> = listOf(),
Siyamed Sinir2690d532019-06-21 13:16:00 -07001218 textIndent: TextIndent? = null,
Haoyu Zhang10fc6502018-11-09 15:50:11 -08001219 textAlign: TextAlign? = null,
Seigo Nonaka51664792019-12-04 10:59:29 -08001220 ellipsis: Boolean = false,
1221 maxLines: Int = Int.MAX_VALUE,
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001222 constraints: ParagraphConstraints,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001223 style: TextStyle? = null,
Siyamed Sinirf18dcca2018-12-20 18:25:10 -08001224 typefaceAdapter: TypefaceAdapter = TypefaceAdapter()
Siyamed Sinire75976f2019-07-03 09:24:30 -07001225 ): AndroidParagraph {
1226 return AndroidParagraph(
Haoyu Zhang27429892019-06-11 13:19:57 -07001227 text = text,
Siyamed Sinirfaa4ac42019-12-04 09:02:31 -08001228 spanStyles = spanStyles,
Haoyu Zhang01f57fc2020-02-06 14:53:46 -08001229 placeholders = listOf(),
Siyamed Sinirf18dcca2018-12-20 18:25:10 -08001230 typefaceAdapter = typefaceAdapter,
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001231 style = TextStyle(
Siyamed Sinir883e0232019-06-25 12:38:12 -07001232 textAlign = textAlign,
Siyamed Sinir4dd082e2020-07-13 18:18:53 -07001233 textIndent = textIndent
Siyamed Sinir01f7b522019-12-06 00:14:02 -08001234 ).merge(style),
Siyamed Sinir6a1f0362019-07-08 15:58:32 -07001235 maxLines = maxLines,
1236 ellipsis = ellipsis,
Siyamed Sinir3f44b9a2019-09-21 13:13:38 -07001237 constraints = constraints,
Siyamed Sinir504d5b02019-09-24 13:39:43 -07001238 density = Density(density = 1f)
Haoyu Zhang10fc6502018-11-09 15:50:11 -08001239 )
1240 }
Siyamed Sinir472ed132019-07-03 15:43:43 -07001241
1242 private fun TypefaceAdapter() = TypefaceAdapter(
Siyamed Sinirc4c308e2019-07-03 16:14:22 -07001243 resourceLoader = TestFontResourceLoader(context)
Siyamed Sinir472ed132019-07-03 15:43:43 -07001244 )
Siyamed Sinir2690d532019-06-21 13:16:00 -07001245}