diff --git a/libraries/stdlib/test/text/StringTest.kt b/libraries/stdlib/test/text/StringTest.kt index 5725bf23eee..679b309f777 100644 --- a/libraries/stdlib/test/text/StringTest.kt +++ b/libraries/stdlib/test/text/StringTest.kt @@ -9,6 +9,7 @@ import kotlin.test.* import test.* import test.collections.behaviors.iteratorBehavior import test.collections.compare +import kotlin.math.sign fun createString(content: String): CharSequence = content @@ -755,6 +756,53 @@ class StringTest { assertTrue(null.equals(null, ignoreCase = false)) } + @Test fun compareToIgnoreCase() { + + fun assertCompareResult(expectedResult: Int, v1: String, v2: String, ignoreCase: Boolean) { + val result = v1.compareTo(v2, ignoreCase = ignoreCase).sign + assertEquals(expectedResult, result, "Comparing '$v1' with '$v2', ignoreCase = $ignoreCase") + if (expectedResult == 0) + assertTrue(v1.equals(v2, ignoreCase = ignoreCase)) + if (!ignoreCase) + assertEquals(v1.compareTo(v2).sign, result) + } + + fun assertCompareResult(expectedResult: Int, expectedResultIgnoreCase: Int, v1: String, v2: String) { + assertCompareResult(expectedResult, v1, v2, false) + assertCompareResult(expectedResultIgnoreCase, v1, v2, true) + } + + val (EQ, LT, GT) = listOf(0, -1, 1) + + assertCompareResult(EQ, EQ, "ABC", "ABC") + assertCompareResult(LT, EQ, "ABC", "ABc") + assertCompareResult(GT, EQ, "ABc", "ABC") + + assertCompareResult(LT, LT, "ABC", "ABx") + assertCompareResult(LT, GT, "ABX", "ABc") + + assertCompareResult(LT, LT, "[", "aa") + assertCompareResult(GT, LT, "[", "AA") + assertCompareResult(EQ, EQ, "", "") + assertCompareResult(LT, LT, "", "A") + assertCompareResult(GT, GT, "A", "") + + run { + val a32 = "A".repeat(32) + assertCompareResult(LT, EQ, a32 + "B", a32 + "b") + assertCompareResult(LT, GT, a32 + "BB", a32 + "b") + assertCompareResult(LT, GT, a32 + "C", a32 + "b") + + } + + val equalIgnoringCase = listOf("ABC", "ABc", "aBC", "AbC", "abc") + for (item1 in equalIgnoringCase) { + for (item2 in equalIgnoringCase) { + assertCompareResult(EQ, item1, item2, ignoreCase = true) + } + } + } + @Test fun replace() { val input = "abbAb" @@ -1336,29 +1384,4 @@ ${" "} assertEquals(" ABC\n \n 123", "ABC\n \n123".prependIndent(" ")) assertEquals(" ", "".prependIndent(" ")) } - - @Test fun testCompareToIgnoreCase() { - assertTrue("ABC".compareTo("ABC", ignoreCase = false) == 0) - assertTrue("ABC".compareTo("ABc", ignoreCase = false) < 0) - assertTrue("ABc".compareTo("ABC", ignoreCase = false) > 0) - assertTrue("ABC".compareTo("ABx", ignoreCase = false) < 0) - assertTrue("ABx".compareTo("ABC", ignoreCase = false) > 0) - assertTrue("[".compareTo("aa", ignoreCase = false) < 0) - assertTrue("".compareTo("", ignoreCase = false) == 0) - assertTrue("".compareTo("A", ignoreCase = false) < 0) - assertTrue("A".compareTo("", ignoreCase = false) > 0) - assertTrue(("A".repeat(16) + "B").compareTo("A".repeat(16) + "b", ignoreCase = false) < 0) - - assertTrue("ABC".compareTo("ABC", ignoreCase = true) == 0) - assertTrue("ABC".compareTo("ABc", ignoreCase = true) == 0) - assertTrue("ABc".compareTo("ABC", ignoreCase = true) == 0) - assertTrue("ABC".compareTo("ABx", ignoreCase = true) < 0) - assertTrue("ABx".compareTo("ABC", ignoreCase = true) > 0) - assertTrue("[".compareTo("aa", ignoreCase = true) < 0) - assertTrue("".compareTo("", ignoreCase = false) == 0) - assertTrue("".compareTo("A", ignoreCase = false) < 0) - assertTrue("A".compareTo("", ignoreCase = false) > 0) - assertTrue(("A".repeat(16) + "B").compareTo("A".repeat(16) + "b", ignoreCase = false) < 0) - } - }