From a369496acad11bf6cba98b4085e3baa9c5bdadd1 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Wed, 13 Mar 2019 22:00:01 +0300 Subject: [PATCH] Throw IOOB on invalid index in JS StringBuilder.get to adhere contract --- libraries/stdlib/js/src/kotlin/text.kt | 3 ++- libraries/stdlib/test/text/StringBuilderTest.kt | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/libraries/stdlib/js/src/kotlin/text.kt b/libraries/stdlib/js/src/kotlin/text.kt index 856f2d721f2..acbfd87e56a 100644 --- a/libraries/stdlib/js/src/kotlin/text.kt +++ b/libraries/stdlib/js/src/kotlin/text.kt @@ -24,7 +24,8 @@ public actual class StringBuilder(content: String = "") : Appendable, CharSequen actual override val length: Int get() = string.asDynamic().length - actual override fun get(index: Int): Char = string[index] + actual override fun get(index: Int): Char = + string.getOrElse(index) { throw IndexOutOfBoundsException("index: $index, length: $length}") } actual override fun subSequence(startIndex: Int, endIndex: Int): CharSequence = string.substring(startIndex, endIndex) diff --git a/libraries/stdlib/test/text/StringBuilderTest.kt b/libraries/stdlib/test/text/StringBuilderTest.kt index 67ee8016336..e6b75f0abbb 100644 --- a/libraries/stdlib/test/text/StringBuilderTest.kt +++ b/libraries/stdlib/test/text/StringBuilderTest.kt @@ -75,4 +75,16 @@ class StringBuilderTest { assertTrue(sb.isEmpty()) assertEquals("test", s) } + + @Test fun get() { + val sb = StringBuilder() + sb.append("test") + assertEquals('t', sb[0]) + assertEquals('e', sb[1]) + assertEquals('s', sb[2]) + assertEquals('t', sb[3]) + + assertFailsWith { assertEquals('t', sb[-1]) } + assertFailsWith { assertEquals('t', sb[4]) } + } }