15414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian/*
25414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * Copyright (C) 2018 The Android Open Source Project
35414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian *
45414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * Licensed under the Apache License, Version 2.0 (the "License");
55414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * you may not use this file except in compliance with the License.
65414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * You may obtain a copy of the License at
75414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian *
85414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian *       http://www.apache.org/licenses/LICENSE-2.0
95414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian *
105414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * Unless required by applicable law or agreed to in writing, software
115414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * distributed under the License is distributed on an "AS IS" BASIS,
125414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * See the License for the specific language governing permissions and
145414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian * limitations under the License.
155414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian */
165414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
179c80550cbbe357a89e2abeeb9c7769fcaefc3a65Jake Whartonpackage androidx.core.text
185414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
195414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport android.graphics.Typeface.BOLD
205414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport android.text.SpannableString
215414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport android.text.style.StyleSpan
225414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport android.text.style.UnderlineSpan
23d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Whartonimport org.junit.Assert.assertEquals
245414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport org.junit.Assert.assertTrue
255414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianimport org.junit.Test
265414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
275414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrianclass SpannableStringTest {
285414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
295414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    @Test fun toSpannableString() = assertTrue("Hello, World".toSpannable() is SpannableString)
305414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
315414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    @Test fun plusAssign() {
325414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        val s = "Hello, World".toSpannable()
333ddfb6dbbd5effc081a88b588e941f5823e97b46Jake Wharton
343ddfb6dbbd5effc081a88b588e941f5823e97b46Jake Wharton        val bold = StyleSpan(BOLD)
353ddfb6dbbd5effc081a88b588e941f5823e97b46Jake Wharton        s += bold
363ddfb6dbbd5effc081a88b588e941f5823e97b46Jake Wharton        assertEquals(0, s.getSpanStart(bold))
373ddfb6dbbd5effc081a88b588e941f5823e97b46Jake Wharton        assertEquals(s.length, s.getSpanEnd(bold))
385414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    }
395414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
405414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    @Test fun minusAssign() {
415414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        val s = "Hello, World".toSpannable()
425414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        val bold = StyleSpan(BOLD)
435414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        s += bold
445414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        assertTrue(s.getSpans<Any>().isNotEmpty())
455414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        s -= bold
465414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        assertTrue(s.getSpans<Any>().isEmpty())
475414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    }
485414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian
495414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    @Test fun clearSpans() {
505414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        val s = "Hello, World".toSpannable()
515414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        s += StyleSpan(BOLD)
525414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        s += UnderlineSpan()
535414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        assertTrue(s.getSpans<Any>().isNotEmpty())
545414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        s.clearSpans()
555414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian        assertTrue(s.getSpans<Any>().isEmpty())
565414238bd40e7deebeabf0e41a59eaaa05f4cdfeHendra Anggrian    }
57d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
58d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton    @Test fun setIndices() {
59d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val s = "Hello, World".toSpannable()
60d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        s[0, 5] = StyleSpan(BOLD)
61d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        s[7, 12] = UnderlineSpan()
62d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
63d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val spans = s.getSpans<Any>()
64d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
65d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val bold = spans.filterIsInstance<StyleSpan>().single()
66d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(0, s.getSpanStart(bold))
67d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(5, s.getSpanEnd(bold))
68d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
69d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val underline = spans.filterIsInstance<UnderlineSpan>().single()
70d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(7, s.getSpanStart(underline))
71d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(12, s.getSpanEnd(underline))
72d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton    }
73d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
74d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton    @Test fun setRange() {
75d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val s = "Hello, World".toSpannable()
76d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        s[0..5] = StyleSpan(BOLD)
77d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        s[7..12] = UnderlineSpan()
78d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
79d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val spans = s.getSpans<Any>()
80d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
81d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val bold = spans.filterIsInstance<StyleSpan>().single()
82d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(0, s.getSpanStart(bold))
83d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(5, s.getSpanEnd(bold))
84d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton
85d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        val underline = spans.filterIsInstance<UnderlineSpan>().single()
86d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(7, s.getSpanStart(underline))
87d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton        assertEquals(12, s.getSpanEnd(underline))
88d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton    }
89d8fad98b94940d1a1657bb44366f3305bbcc7203Jake Wharton}
90