From 5eabda0ba4c60c41f938cd79f0bfa1910972737f Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 19 Apr 2017 17:02:09 +0700 Subject: [PATCH] tests: Move StringBuilder tests into single file --- backend.native/tests/build.gradle | 10 - .../tests/runtime/text/string_builder0.kt | 224 +++++++++++++++++- .../runtime/text/string_builder_insert.kt | 136 ----------- .../runtime/text/string_builder_reverse.kt | 90 ------- 4 files changed, 220 insertions(+), 240 deletions(-) delete mode 100644 backend.native/tests/runtime/text/string_builder_insert.kt delete mode 100644 backend.native/tests/runtime/text/string_builder_reverse.kt diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index aed54b05377..a1277755093 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -1080,16 +1080,6 @@ task string_builder0(type: RunKonanTest) { source = "runtime/text/string_builder0.kt" } -task string_builder_reverse(type: RunKonanTest) { - goldValue = "OK\n" - source = "runtime/text/string_builder_reverse.kt" -} - -task string_builder_insert(type: RunKonanTest) { - goldValue = "OK\n" - source = "runtime/text/string_builder_insert.kt" -} - task string0(type: RunKonanTest) { goldValue = "true\ntrue\nПРИВЕТ\nпривет\nПока\ntrue\n" source = "runtime/text/string0.kt" diff --git a/backend.native/tests/runtime/text/string_builder0.kt b/backend.native/tests/runtime/text/string_builder0.kt index 5af19eee715..c965fd5edb1 100644 --- a/backend.native/tests/runtime/text/string_builder0.kt +++ b/backend.native/tests/runtime/text/string_builder0.kt @@ -1,23 +1,237 @@ +// Utils ==================================================================================================== fun assertTrue(cond: Boolean) { if (!cond) - println("FAIL") + throw AssertionError("Condition expected to be true") } fun assertFalse(cond: Boolean) { if (cond) - println("FAIL") + throw AssertionError("Condition expected to be false") } fun assertEquals(value1: String, value2: String) { if (value1 != value2) - println("FAIL: '" + value1 + "' != '" + value2 + "'") + throw AssertionError("FAIL: '" + value1 + "' != '" + value2 + "'") } fun assertEquals(value1: Int, value2: Int) { if (value1 != value2) - println("FAIL" + value1.toString() + " != " + value2.toString()) + throw AssertionError("FAIL" + value1.toString() + " != " + value2.toString()) } +fun assertEquals(builder: StringBuilder, content: String) = assertEquals(builder.toString(), content) + +// IndexOutOfBoundsException +fun assertException(body: () -> Unit) { + try { + body() + throw AssertionError ("Test failed: no IndexOutOfBoundsException on wrong indices") + } catch (e: IndexOutOfBoundsException) {} +} + +fun String.toCharArray(): CharArray = CharArray(length) { i -> this[i] } + +// Insert =================================================================================================== +fun testInsertString(initial: String, index: Int, toInsert: String, expected: String) { + assertEquals(StringBuilder(initial).insert(index, toInsert), expected) + assertEquals(StringBuilder(initial).insert(index, toInsert.toCharArray()), expected) + assertEquals(StringBuilder(initial).insert(index, toInsert as CharSequence), expected) +} + +fun testInsertStringException(initial: String, index: Int, toInsert: String) { + assertException { StringBuilder(initial).insert(index, toInsert) } + assertException { StringBuilder(initial).insert(index, toInsert.toCharArray()) } + assertException { StringBuilder(initial).insert(index, toInsert as CharSequence) } +} + +fun testInsertSingle(value: Byte) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Short) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Int) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Long) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Float) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Double) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Any?) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsertSingle(value: Char) { + assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") + assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) + assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") + assertEquals(StringBuilder("").insert(0, value), value.toString()) +} + +fun testInsert() { + // String/CharSequence/CharArray + testInsertString("abcd", 0, "12", "12abcd") + testInsertString("abcd", 4, "12", "abcd12") + testInsertString("abcd", 2, "12", "ab12cd") + testInsertString("", 0, "12", "12") + testInsertStringException("a", -1, "1") + testInsertStringException("a", 2, "1") + + // Subsequence of CharSequence + // Insert in the beginning + assertEquals(StringBuilder("abcd").insert(0, "1234", 0, 0), "abcd") // 0 symbols + assertEquals(StringBuilder("abcd").insert(0, "1234", 0, 1), "1abcd") // 1 symbol + assertEquals(StringBuilder("abcd").insert(0, "1234", 1, 3), "23abcd") // 2 symbols + + // Insert in the end + assertEquals(StringBuilder("abcd").insert(4, "1234", 0, 0), "abcd") + assertEquals(StringBuilder("abcd").insert(4, "1234", 0, 1), "abcd1") + assertEquals(StringBuilder("abcd").insert(4, "1234", 1, 3), "abcd23") + + // Insert in the middle + assertEquals(StringBuilder("abcd").insert(2, "1234", 0, 0), "abcd") + assertEquals(StringBuilder("abcd").insert(2, "1234", 0, 1), "ab1cd") + assertEquals(StringBuilder("abcd").insert(2, "1234", 1, 3), "ab23cd") + + // Incorrect indices + assertException { StringBuilder("a").insert(-1, "1", 0, 0) } + assertException { StringBuilder("a").insert(2, "1", 0, 0) } + assertException { StringBuilder("a").insert(1, "1", -1, 0) } + assertException { StringBuilder("a").insert(1, "1", 0, 2) } + assertException { StringBuilder("a").insert(1, "123", 2, 0) } + + + // Other types + testInsertSingle(true) + testInsertSingle(42.toByte()) + testInsertSingle(42.toShort()) + testInsertSingle(42.toInt()) + testInsertSingle(42.toLong()) + testInsertSingle(42.2.toFloat()) + testInsertSingle(42.2.toDouble()) + testInsertSingle(object { + override fun toString(): String { + return "Object" + } + }) + testInsertSingle('a') + +} + +// Reverse ================================================================================================== +fun testReverse(original: String, reversed: String, reversedBack: String) { + assertEquals(StringBuilder(original).reverse(), reversed) + assertEquals(StringBuilder(reversed).reverse(), reversedBack) +} + +fun testReverse() { + var builder = StringBuilder("123456") + assertTrue(builder === builder.reverse()) + assertEquals(builder, "654321") + + builder.length = 1 + assertEquals(builder, "6") + + builder.length = 0 + assertEquals(builder, "") + + var str: String = "a" + testReverse(str, str, str) + + str = "ab" + testReverse(str, "ba", str) + + str = "abcdef" + testReverse(str, "fedcba", str) + + str = "abcdefg" + testReverse(str, "gfedcba", str) + + str = "\ud800\udc00" + testReverse(str, str, str) + + str = "\udc00\ud800" + testReverse(str, "\ud800\udc00", "\ud800\udc00") + + str = "a\ud800\udc00" + testReverse(str, "\ud800\udc00a", str) + + str = "ab\ud800\udc00" + testReverse(str, "\ud800\udc00ba", str) + + str = "abc\ud800\udc00" + testReverse(str, "\ud800\udc00cba", str) + + str = "\ud800\udc00\udc01\ud801\ud802\udc02" + testReverse(str, "\ud802\udc02\ud801\udc01\ud800\udc00", + "\ud800\udc00\ud801\udc01\ud802\udc02") + + str = "\ud800\udc00\ud801\udc01\ud802\udc02" + testReverse(str, "\ud802\udc02\ud801\udc01\ud800\udc00", str) + + str = "\ud800\udc00\udc01\ud801a" + testReverse(str, "a\ud801\udc01\ud800\udc00", + "\ud800\udc00\ud801\udc01a") + + str = "a\ud800\udc00\ud801\udc01" + testReverse(str, "\ud801\udc01\ud800\udc00a", str) + + str = "\ud800\udc00\udc01\ud801ab" + testReverse(str, "ba\ud801\udc01\ud800\udc00", + "\ud800\udc00\ud801\udc01ab") + + str = "ab\ud800\udc00\ud801\udc01" + testReverse(str, "\ud801\udc01\ud800\udc00ba", str) + + str = "\ud800\udc00\ud801\udc01" + testReverse(str, "\ud801\udc01\ud800\udc00", str) + + str = "a\ud800\udc00z\ud801\udc01" + testReverse(str, "\ud801\udc01z\ud800\udc00a", str) + + str = "a\ud800\udc00bz\ud801\udc01" + testReverse(str, "\ud801\udc01zb\ud800\udc00a", str) + + str = "abc\ud802\udc02\ud801\udc01\ud800\udc00" + testReverse(str, "\ud800\udc00\ud801\udc01\ud802\udc02cba", str) + + str = "abcd\ud802\udc02\ud801\udc01\ud800\udc00" + testReverse(str, "\ud800\udc00\ud801\udc01\ud802\udc02dcba", str) +} + +// Basic ==================================================================================================== fun testBasic() { val sb = StringBuilder() assertEquals(0, sb.length) @@ -42,5 +256,7 @@ fun testBasic() { fun main(args : Array) { testBasic() + testInsert() + testReverse() println("OK") } \ No newline at end of file diff --git a/backend.native/tests/runtime/text/string_builder_insert.kt b/backend.native/tests/runtime/text/string_builder_insert.kt deleted file mode 100644 index d9d1a6e8519..00000000000 --- a/backend.native/tests/runtime/text/string_builder_insert.kt +++ /dev/null @@ -1,136 +0,0 @@ -fun assertEquals(builder: StringBuilder, content: String) { - if (builder.toString() != content) throw AssertionError("Test failed: " + builder.toString() + " != " + content) -} - -fun assertTrue(condition: Boolean) { - if (!condition) throw AssertionError("The condition is false") -} - -// IndexOutOfBoundsException -fun assertException(body: () -> Unit) { - try { - body() - throw AssertionError ("Test failed: no IndexOutOfBoundsException on wrong indices") - } catch (e: IndexOutOfBoundsException) {} -} - -fun String.toCharArray(): CharArray = CharArray(length) { i -> this[i] } - -fun testInsertString(initial: String, index: Int, toInsert: String, expected: String) { - assertEquals(StringBuilder(initial).insert(index, toInsert), expected) - assertEquals(StringBuilder(initial).insert(index, toInsert.toCharArray()), expected) - assertEquals(StringBuilder(initial).insert(index, toInsert as CharSequence), expected) -} - -fun testInsertStringException(initial: String, index: Int, toInsert: String) { - assertException { StringBuilder(initial).insert(index, toInsert) } - assertException { StringBuilder(initial).insert(index, toInsert.toCharArray()) } - assertException { StringBuilder(initial).insert(index, toInsert as CharSequence) } -} - -fun testInsertSingle(value: Byte) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Short) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Int) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Long) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Float) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Double) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Any?) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun testInsertSingle(value: Char) { - assertEquals(StringBuilder("abcd").insert(0, value), value.toString() + "abcd") - assertEquals(StringBuilder("abcd").insert(4, value), "abcd" + value.toString()) - assertEquals(StringBuilder("abcd").insert(2, value), "ab" + value.toString() + "cd") - assertEquals(StringBuilder("").insert(0, value), value.toString()) -} - -fun main(args: Array) { - // String/CharSequence/CharArray - testInsertString("abcd", 0, "12", "12abcd") - testInsertString("abcd", 4, "12", "abcd12") - testInsertString("abcd", 2, "12", "ab12cd") - testInsertString("", 0, "12", "12") - testInsertStringException("a", -1, "1") - testInsertStringException("a", 2, "1") - - // Subsequence of CharSequence - // Insert in the beginning - assertEquals(StringBuilder("abcd").insert(0, "1234", 0, 0), "abcd") // 0 symbols - assertEquals(StringBuilder("abcd").insert(0, "1234", 0, 1), "1abcd") // 1 symbol - assertEquals(StringBuilder("abcd").insert(0, "1234", 1, 3), "23abcd") // 2 symbols - - // Insert in the end - assertEquals(StringBuilder("abcd").insert(4, "1234", 0, 0), "abcd") - assertEquals(StringBuilder("abcd").insert(4, "1234", 0, 1), "abcd1") - assertEquals(StringBuilder("abcd").insert(4, "1234", 1, 3), "abcd23") - - // Insert in the middle - assertEquals(StringBuilder("abcd").insert(2, "1234", 0, 0), "abcd") - assertEquals(StringBuilder("abcd").insert(2, "1234", 0, 1), "ab1cd") - assertEquals(StringBuilder("abcd").insert(2, "1234", 1, 3), "ab23cd") - - // Incorrect indices - assertException { StringBuilder("a").insert(-1, "1", 0, 0) } - assertException { StringBuilder("a").insert(2, "1", 0, 0) } - assertException { StringBuilder("a").insert(1, "1", -1, 0) } - assertException { StringBuilder("a").insert(1, "1", 0, 2) } - assertException { StringBuilder("a").insert(1, "123", 2, 0) } - - - // Other types - testInsertSingle(true) - testInsertSingle(42.toByte()) - testInsertSingle(42.toShort()) - testInsertSingle(42.toInt()) - testInsertSingle(42.toLong()) - testInsertSingle(42.2.toFloat()) - testInsertSingle(42.2.toDouble()) - testInsertSingle(object { - override fun toString(): String { - return "Object" - } - }) - testInsertSingle('a') - - println("OK") -} \ No newline at end of file diff --git a/backend.native/tests/runtime/text/string_builder_reverse.kt b/backend.native/tests/runtime/text/string_builder_reverse.kt deleted file mode 100644 index 75ba238c66f..00000000000 --- a/backend.native/tests/runtime/text/string_builder_reverse.kt +++ /dev/null @@ -1,90 +0,0 @@ -fun assertEquals(builder: StringBuilder, content: String) { - if (builder.toString() != content) throw AssertionError("Test failed: $builder != $content") -} - -fun assertTrue(condition: Boolean) { - if (!condition) throw AssertionError("The condition is false") -} - -fun reverseTest(original: String, reversed: String, reversedBack: String) { - assertEquals(StringBuilder(original).reverse(), reversed) - assertEquals(StringBuilder(reversed).reverse(), reversedBack) -} - - -fun main(args: Array) { - var builder = StringBuilder("123456") - assertTrue(builder === builder.reverse()) - assertEquals(builder, "654321") - - builder.length = 1 - assertEquals(builder, "6") - - builder.length = 0 - assertEquals(builder, "") - - var str: String = "a" - reverseTest(str, str, str) - - str = "ab" - reverseTest(str, "ba", str) - - str = "abcdef" - reverseTest(str, "fedcba", str) - - str = "abcdefg" - reverseTest(str, "gfedcba", str) - - str = "\ud800\udc00" - reverseTest(str, str, str) - - str = "\udc00\ud800" - reverseTest(str, "\ud800\udc00", "\ud800\udc00") - - str = "a\ud800\udc00" - reverseTest(str, "\ud800\udc00a", str) - - str = "ab\ud800\udc00" - reverseTest(str, "\ud800\udc00ba", str) - - str = "abc\ud800\udc00" - reverseTest(str, "\ud800\udc00cba", str) - - str = "\ud800\udc00\udc01\ud801\ud802\udc02" - reverseTest(str, "\ud802\udc02\ud801\udc01\ud800\udc00", - "\ud800\udc00\ud801\udc01\ud802\udc02") - - str = "\ud800\udc00\ud801\udc01\ud802\udc02" - reverseTest(str, "\ud802\udc02\ud801\udc01\ud800\udc00", str) - - str = "\ud800\udc00\udc01\ud801a" - reverseTest(str, "a\ud801\udc01\ud800\udc00", - "\ud800\udc00\ud801\udc01a") - - str = "a\ud800\udc00\ud801\udc01" - reverseTest(str, "\ud801\udc01\ud800\udc00a", str) - - str = "\ud800\udc00\udc01\ud801ab" - reverseTest(str, "ba\ud801\udc01\ud800\udc00", - "\ud800\udc00\ud801\udc01ab") - - str = "ab\ud800\udc00\ud801\udc01" - reverseTest(str, "\ud801\udc01\ud800\udc00ba", str) - - str = "\ud800\udc00\ud801\udc01" - reverseTest(str, "\ud801\udc01\ud800\udc00", str) - - str = "a\ud800\udc00z\ud801\udc01" - reverseTest(str, "\ud801\udc01z\ud800\udc00a", str) - - str = "a\ud800\udc00bz\ud801\udc01" - reverseTest(str, "\ud801\udc01zb\ud800\udc00a", str) - - str = "abc\ud802\udc02\ud801\udc01\ud800\udc00" - reverseTest(str, "\ud800\udc00\ud801\udc01\ud802\udc02cba", str) - - str = "abcd\ud802\udc02\ud801\udc01\ud800\udc00" - reverseTest(str, "\ud800\udc00\ud801\udc01\ud802\udc02dcba", str) - - println("OK") -} \ No newline at end of file