From de1d15aa9a72b789cf0ca33df3129e8e09841d1e Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 25 Dec 2018 23:17:10 +0300 Subject: [PATCH] Improve test coverage for contentEquals and minOf/maxOf --- libraries/stdlib/test/OrderingTest.kt | 4 ++ .../stdlib/test/collections/ArraysTest.kt | 39 ++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/libraries/stdlib/test/OrderingTest.kt b/libraries/stdlib/test/OrderingTest.kt index bf0769c6565..3e61c96c26e 100644 --- a/libraries/stdlib/test/OrderingTest.kt +++ b/libraries/stdlib/test/OrderingTest.kt @@ -160,6 +160,8 @@ class OrderingTest { assertEquals(Double.POSITIVE_INFINITY, maxOf(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY)) assertEquals(Double.POSITIVE_INFINITY, maxOf(Double.POSITIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE)) + assertEquals(0.0, maxOf(0.0, -0.0)) + assertEquals(0.0, maxOf(-0.0, 0.0)) } @Test @@ -180,6 +182,8 @@ class OrderingTest { assertEquals(Double.NEGATIVE_INFINITY, minOf(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY)) assertEquals(Double.MIN_VALUE, minOf(Double.POSITIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE)) + assertEquals(-0.0, minOf(0.0, -0.0)) + assertEquals(-0.0, minOf(-0.0, 0.0)) } @Test diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt index 8574ddc2fcf..faec62ab9c3 100644 --- a/libraries/stdlib/test/collections/ArraysTest.kt +++ b/libraries/stdlib/test/collections/ArraysTest.kt @@ -199,11 +199,26 @@ class ArraysTest { } @Test fun contentEquals() { - val arr1 = arrayOf("a", 1, null) - val arr2 = arrayOf(*arr1) - assertTrue(arr1 contentEquals arr2) - val arr3 = arr2.reversedArray() - assertFalse(arr1 contentEquals arr3) + fun checkArray(array: T, copy: T.() -> T, toList: T.() -> List<*>, check: (T, T) -> Boolean, modify: T.() -> Unit) { + val list = toList(array) + val array2 = copy(array) + val list2 = toList(array2) + assertEquals(list, list2) + assertNotSame(array, array2) + assertTrue(check(array, array2), "Copy of array should have the same content: original $list, modified $list2") + + modify(array2) + val list2m = toList(array2) + assertNotEquals(list, list2m) + assertFalse(check(array, array2), "Modified array should be different: original $list, modified $list2m") + } + + checkArray(arrayOf("a", 1, null), { copyOf() }, { toList() }, { a1, a2 -> a1 contentEquals a2 }, { reverse() }) + checkArray(byteArrayOf(1, 2, 3), { copyOf() }, { toList() }, { a1, a2 -> a1 contentEquals a2 }, { reverse() }) + checkArray(intArrayOf(1, 2, 3), { copyOf() }, { toList() }, { a1, a2 -> a1 contentEquals a2 }, { reverse() }) + checkArray(longArrayOf(1, 2, 3), { copyOf() }, { toList() }, { a1, a2 -> a1 contentEquals a2 }, { reverse() }) + checkArray(doubleArrayOf(Double.NaN, -0.0, 0.0, Double.POSITIVE_INFINITY, 1.0), + { copyOf() }, { toList() }, { a1, a2 -> a1 contentEquals a2 }, { this[1] = 0.0 }) } @Test fun contentDeepEquals() { @@ -222,6 +237,13 @@ class ArraysTest { arr4[2] = arr3 assertFalse(arr3 contentDeepEquals arr4) + + val arr5 = arrayOf(doubleArrayOf(-0.0, Double.NaN)) + val arr6 = arrayOf(doubleArrayOf(0.0, Double.NaN)) + assertFalse(arr5 contentDeepEquals arr6) + + arr5[0][0] = 0.0 + assertTrue(arr5 contentDeepEquals arr6) } @Test fun contentToString() { @@ -265,6 +287,8 @@ class ArraysTest { intArrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) } byteArrayOf(1, Byte.MAX_VALUE, Byte.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) } charArrayOf('a', Char.MAX_VALUE, Char.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) } + doubleArrayOf(1.0, -0.0, 0.0, Double.NaN, Double.POSITIVE_INFINITY).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) } + floatArrayOf(1.0f, -0.0f, 0.0f, Float.NaN, Float.POSITIVE_INFINITY).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) } } @Test fun contentDeepHashCode() { @@ -276,6 +300,11 @@ class ArraysTest { assertEquals(intList2.hashCode(), intArray2.contentDeepHashCode()) + val doubleArray2 = arrayOf(doubleArrayOf(1.0, Double.NaN), doubleArrayOf(-0.0, 0.0)) + val doubleList2 = listOf(listOf(1.0, Double.NaN), listOf(-0.0, 0.0)) + + assertEquals(doubleList2.hashCode(), doubleArray2.contentDeepHashCode()) + val uintArray2 = arrayOf(uintArrayOf(1u, 2u), uintArrayOf(3u, 4u)) val uintList2 = listOf(listOf(1u, 2u), listOf(3u, 4u))