Files
kotlin-fork/kotlin-native/runtime/test/text/StringBuilderNativeTest.kt
T
2023-11-01 13:56:10 +00:00

218 lines
8.7 KiB
Kotlin

/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package test.text
import kotlin.test.*
// Native-specific part of stdlib/test/text/StringBuilderTest.kt
class StringBuilderNativeTest {
@Test
fun insertCharSequence() {
StringBuilder("my insert CharSequence test").let { sb ->
sb.insert(0, null as CharSequence?)
assertEquals("nullmy insert CharSequence test", sb.toString())
sb.insert(2, null as CharSequence?)
assertEquals("nunullllmy insert CharSequence test", sb.toString())
sb.insert(sb.length, null as CharSequence?)
assertEquals("nunullllmy insert CharSequence testnull", sb.toString())
sb.insert(2, "12" as CharSequence)
assertEquals("nu12nullllmy insert CharSequence testnull", sb.toString())
sb.insert(sb.length, "12" as CharSequence)
assertEquals("nu12nullllmy insert CharSequence testnull12", sb.toString())
}
}
@Test
fun insertString() {
StringBuilder("my insert String test").let { sb ->
sb.insertRange(0, "1234", 0, 0)
assertEquals("my insert String test", sb.toString())
sb.insertRange(0, "1234", 0, 1)
assertEquals("1my insert String test", sb.toString())
sb.insertRange(0, "1234", 1, 3)
assertEquals("231my insert String test", sb.toString())
sb.insertRange(2, "1234", 0, 0)
assertEquals("231my insert String test", sb.toString())
sb.insertRange(2, "1234", 0, 1)
assertEquals("2311my insert String test", sb.toString())
sb.insertRange(2, "1234", 1, 3)
assertEquals("232311my insert String test", sb.toString())
sb.insertRange(sb.length, "1234", 0, 0)
assertEquals("232311my insert String test", sb.toString())
sb.insertRange(sb.length, "1234", 0, 1)
assertEquals("232311my insert String test1", sb.toString())
sb.insertRange(sb.length, "1234", 1, 3)
assertEquals("232311my insert String test123", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, "_") }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, "_") }
assertFails { sb.insertRange(0, "null", -1, 0) }
assertFails { sb.insertRange(0, "null", 0, 5) }
assertFails { sb.insertRange(0, "null", 2, 1) }
}
}
@Test
fun insertByte() {
StringBuilder().let { sb ->
sb.insert(0, 42.toByte())
assertEquals("42", sb.toString())
sb.insert(0, 13.toByte())
assertEquals("1342", sb.toString())
sb.insert(3, -1.toByte())
assertEquals("134-12", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.toByte()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.toByte()) }
}
}
@Test
fun insertShort() {
StringBuilder().let { sb ->
sb.insert(0, 42.toShort())
assertEquals("42", sb.toString())
sb.insert(0, 13.toShort())
assertEquals("1342", sb.toString())
sb.insert(3, -1.toShort())
assertEquals("134-12", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.toShort()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.toShort()) }
}
}
@Test
fun insertInt() {
StringBuilder().let { sb ->
sb.insert(0, 42.toInt())
assertEquals("42", sb.toString())
sb.insert(0, 13.toInt())
assertEquals("1342", sb.toString())
sb.insert(3, -1.toInt())
assertEquals("134-12", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.toInt()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.toInt()) }
}
}
@Test
fun insertLong() {
StringBuilder().let { sb ->
sb.insert(0, 42.toLong())
assertEquals("42", sb.toString())
sb.insert(0, 13.toLong())
assertEquals("1342", sb.toString())
sb.insert(3, -1.toLong())
assertEquals("134-12", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.toLong()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.toLong()) }
}
}
@Test
fun insertFloat() {
StringBuilder().let { sb ->
sb.insert(0, 42.2.toFloat())
assertEquals("42.2", sb.toString())
sb.insert(0, 13.1.toFloat())
assertEquals("13.142.2", sb.toString())
sb.insert(3, -1.toFloat())
assertEquals("13.-1.0142.2", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.2.toFloat()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.2.toFloat()) }
}
}
@Test
fun insertDouble() {
StringBuilder().let { sb ->
sb.insert(0, 42.2.toDouble())
assertEquals("42.2", sb.toString())
sb.insert(0, 13.1.toDouble())
assertEquals("13.142.2", sb.toString())
sb.insert(3, -1.toDouble())
assertEquals("13.-1.0142.2", sb.toString())
assertFailsWith<IndexOutOfBoundsException> { sb.insert(-1, 42.2.toDouble()) }
assertFailsWith<IndexOutOfBoundsException> { sb.insert(sb.length + 1, 42.2.toDouble()) }
}
}
@Test
fun testReverse() {
val sb = StringBuilder("123456")
assertTrue(sb === sb.reverse())
assertEquals("654321", sb.toString())
sb.setLength(1)
assertEquals("6", sb.toString())
sb.setLength(0)
assertEquals("", sb.toString())
}
@Test
fun testDoubleReverse() {
fun assertReversed(original: String, reversed: String, reversedBack: String = original) {
assertEquals(reversed, StringBuilder(original).reverse().toString())
assertEquals(reversedBack, StringBuilder(reversed).reverse().toString())
}
assertReversed("a", "a")
assertReversed("ab", "ba")
assertReversed("abcdef", "fedcba")
assertReversed("abcdefg", "gfedcba")
assertReversed("\ud800\udc00", "\ud800\udc00")
assertReversed("\udc00\ud800", "\ud800\udc00", "\ud800\udc00")
assertReversed("a\ud800\udc00", "\ud800\udc00a")
assertReversed("ab\ud800\udc00", "\ud800\udc00ba")
assertReversed("abc\ud800\udc00", "\ud800\udc00cba")
assertReversed("\ud800\udc00\udc01\ud801\ud802\udc02", "\ud802\udc02\ud801\udc01\ud800\udc00", "\ud800\udc00\ud801\udc01\ud802\udc02")
assertReversed("\ud800\udc00\ud801\udc01\ud802\udc02", "\ud802\udc02\ud801\udc01\ud800\udc00")
assertReversed("\ud800\udc00\udc01\ud801a", "a\ud801\udc01\ud800\udc00", "\ud800\udc00\ud801\udc01a")
assertReversed("a\ud800\udc00\ud801\udc01", "\ud801\udc01\ud800\udc00a")
assertReversed("\ud800\udc00\udc01\ud801ab", "ba\ud801\udc01\ud800\udc00", "\ud800\udc00\ud801\udc01ab")
assertReversed("ab\ud800\udc00\ud801\udc01", "\ud801\udc01\ud800\udc00ba")
assertReversed("\ud800\udc00\ud801\udc01", "\ud801\udc01\ud800\udc00")
assertReversed("a\ud800\udc00z\ud801\udc01", "\ud801\udc01z\ud800\udc00a")
assertReversed("a\ud800\udc00bz\ud801\udc01", "\ud801\udc01zb\ud800\udc00a")
assertReversed("abc\ud802\udc02\ud801\udc01\ud800\udc00", "\ud800\udc00\ud801\udc01\ud802\udc02cba")
assertReversed("abcd\ud802\udc02\ud801\udc01\ud800\udc00", "\ud800\udc00\ud801\udc01\ud802\udc02dcba")
}
@Test
fun appendLong() {
val times = 100
val expected = (12345678L until (12345678L + times)).fold("") { res, idx -> res + idx }
val sb = StringBuilder()
repeat(times) { sb.append(12345678L + it) }
assertEquals(expected, sb.toString())
val cornerCase = listOf(0L, -1L, Long.MIN_VALUE, Long.MAX_VALUE)
val expectedCornerCase = cornerCase.fold("") { res, e -> res + e }
for (v in cornerCase) sb.append(v)
assertEquals(expected + expectedCornerCase, sb.toString())
}
@Test
fun appendNullCharSequence() {
val sb = StringBuilder()
sb.append(null as CharSequence?)
assertEquals("null", sb.toString())
}
@Test
fun appendLine() {
val sb = StringBuilder()
sb.appendLine("abc").appendLine(42).appendLine(0.1)
assertEquals("abc\n42\n0.1\n", sb.toString())
}
}