Generate some tests
diff --git a/libraries/stdlib/test/OrderingTest.kt b/libraries/stdlib/test/OrderingTest.kt
index c32fa1e..3278d34 100644
--- a/libraries/stdlib/test/OrderingTest.kt
+++ b/libraries/stdlib/test/OrderingTest.kt
@@ -152,24 +152,6 @@
     }
 
     @Test
-    fun maxOf() {
-        assertEquals(Int.MAX_VALUE, maxOf(Int.MAX_VALUE, Int.MIN_VALUE))
-        assertEquals(Int.MAX_VALUE, maxOf(Int.MAX_VALUE, Int.MIN_VALUE, 0))
-        assertEquals(Int.MAX_VALUE, maxOf(Int.MAX_VALUE, Int.MIN_VALUE, 0, -1))
-
-        assertEquals(Long.MAX_VALUE, maxOf(Long.MAX_VALUE, Long.MIN_VALUE))
-        assertEquals(Long.MAX_VALUE, maxOf(Long.MAX_VALUE, Long.MIN_VALUE, 0))
-        assertEquals(Long.MAX_VALUE, maxOf(Long.MAX_VALUE, Long.MIN_VALUE, 0, -1))
-
-        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(Double.POSITIVE_INFINITY, maxOf(Double.NEGATIVE_INFINITY, 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))
-        assertEquals(0.0, maxOf(-0.0, 0.0, 0.0, -0.0))
-    }
-
-    @Test
     fun maxOfWith() {
         assertEquals(v1, maxOf(v1, v2, compareBy { it.name }))
         assertEquals(v1, maxOf(v3, v2, v1, compareBy { it.name }))
@@ -180,24 +162,6 @@
     }
 
     @Test
-    fun minOf() {
-        assertEquals(Int.MIN_VALUE, minOf(Int.MAX_VALUE, Int.MIN_VALUE))
-        assertEquals(Int.MIN_VALUE, minOf(Int.MAX_VALUE, Int.MIN_VALUE, 0))
-        assertEquals(Int.MIN_VALUE, minOf(Int.MAX_VALUE, Int.MIN_VALUE, 0, -1))
-
-        assertEquals(Long.MIN_VALUE, minOf(Long.MAX_VALUE, Long.MIN_VALUE))
-        assertEquals(Long.MIN_VALUE, minOf(Long.MAX_VALUE, Long.MIN_VALUE, 0))
-        assertEquals(Long.MIN_VALUE, minOf(Long.MAX_VALUE, Long.MIN_VALUE, 0, -1))
-
-        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(Double.NEGATIVE_INFINITY, minOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE))
-        assertEquals(-0.0, minOf(0.0, -0.0))
-        assertEquals(-0.0, minOf(-0.0, 0.0))
-        assertEquals(-0.0, minOf(-0.0, 0.0, 0.0, -0.0))
-    }
-
-    @Test
     fun minOfWith() {
         assertEquals(v2, minOf(v1, v2, compareBy { it.name }))
         assertEquals(v3, minOf(v3, v2, v1, compareBy { it.name }))
diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt
index 8e5ce86..faa0b95 100644
--- a/libraries/stdlib/test/collections/ArraysTest.kt
+++ b/libraries/stdlib/test/collections/ArraysTest.kt
@@ -8,7 +8,6 @@
 package test.collections
 
 import test.assertStaticTypeIs
-import test.assertTypeEquals
 import test.collections.behaviors.*
 import test.comparisons.STRING_CASE_INSENSITIVE_ORDER
 import test.text.isAsciiLetter
@@ -389,66 +388,6 @@
         expect('b', { charArrayOf('a', 'b').maxOrNull() })
     }
 
-    @Test fun minWithOrNull() {
-        assertEquals(null, arrayOf<Int>().minWithOrNull(naturalOrder()))
-        assertEquals("a", arrayOf("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
-    }
-
-    @Test fun minWithOrNullInPrimitiveArrays() {
-        expect(null, { intArrayOf().minWithOrNull(naturalOrder()) })
-        expect(1, { intArrayOf(1).minWithOrNull(naturalOrder()) })
-        expect(4, { intArrayOf(2, 3, 4).minWithOrNull(compareBy { it % 4 }) })
-    }
-
-    @Test fun maxWithOrNull() {
-        assertEquals(null, arrayOf<Int>().maxWithOrNull(naturalOrder()))
-        assertEquals("B", arrayOf("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
-    }
-
-    @Test fun maxWithOrNullInPrimitiveArrays() {
-        expect(null, { intArrayOf().maxWithOrNull(naturalOrder()) })
-        expect(1, { intArrayOf(1).maxWithOrNull(naturalOrder()) })
-        expect(-4, { intArrayOf(2, 3, -4).maxWithOrNull(compareBy { it * it }) })
-    }
-
-    @Test fun minByOrNull() {
-        expect(null, { arrayOf<Int>().minByOrNull { it } })
-        expect(1, { arrayOf(1).minByOrNull { it } })
-        expect(3, { arrayOf(2, 3).minByOrNull { -it } })
-        expect('a', { arrayOf('a', 'b').minByOrNull { "x$it" } })
-        expect("b", { arrayOf("b", "abc").minByOrNull { it.length } })
-    }
-
-    @Test fun minByOrNullInPrimitiveArrays() {
-        expect(null, { intArrayOf().minByOrNull { it } })
-        expect(1, { intArrayOf(1).minByOrNull { it } })
-        expect(3, { intArrayOf(2, 3).minByOrNull { -it } })
-        expect(2000000000000, { longArrayOf(3000000000000, 2000000000000).minByOrNull { it + 1 } })
-        expect(1, { byteArrayOf(1, 3, 2).minByOrNull { it * it } })
-        expect(3, { shortArrayOf(3, 2).minByOrNull { "a" } })
-        expect(2.0F, { floatArrayOf(3.0F, 2.0F).minByOrNull { it.toString() } })
-        expect(2.0, { doubleArrayOf(2.0, 3.0).minByOrNull { it * it } })
-    }
-
-    @Test fun maxByOrNull() {
-        expect(null, { arrayOf<Int>().maxByOrNull { it } })
-        expect(1, { arrayOf(1).maxByOrNull { it } })
-        expect(2, { arrayOf(2, 3).maxByOrNull { -it } })
-        expect('b', { arrayOf('a', 'b').maxByOrNull { "x$it" } })
-        expect("abc", { arrayOf("b", "abc").maxByOrNull { it.length } })
-    }
-
-    @Test fun maxByOrNullInPrimitiveArrays() {
-        expect(null, { intArrayOf().maxByOrNull { it } })
-        expect(1, { intArrayOf(1).maxByOrNull { it } })
-        expect(2, { intArrayOf(2, 3).maxByOrNull { -it } })
-        expect(3000000000000, { longArrayOf(3000000000000, 2000000000000).maxByOrNull { it + 1 } })
-        expect(3, { byteArrayOf(1, 3, 2).maxByOrNull { it * it } })
-        expect(3, { shortArrayOf(3, 2).maxByOrNull { "a" } })
-        expect(3.0F, { floatArrayOf(3.0F, 2.0F).maxByOrNull { it.toString() } })
-        expect(3.0, { doubleArrayOf(2.0, 3.0).maxByOrNull { it * it } })
-    }
-
     @Test fun minIndex() {
         val a = intArrayOf(1, 7, 9, -42, 54, 93)
         expect(3, { a.indices.minByOrNull { a[it] } })
@@ -502,66 +441,6 @@
         // for each arr with size > 0  arr.average() = arr.sum().toDouble() / arr.size()
     }
 
-    @Suppress("DEPRECATION")
-    @Test fun indexOfInPrimitiveArrays() {
-        expect(-1) { byteArrayOf(1, 2, 3).indexOf(0) }
-        expect(0) { byteArrayOf(1, 2, 3).indexOf(1) }
-        expect(1) { byteArrayOf(1, 2, 3).indexOf(2) }
-        expect(2) { byteArrayOf(1, 2, 3).indexOf(3) }
-
-        expect(-1) { shortArrayOf(1, 2, 3).indexOf(0) }
-        expect(0) { shortArrayOf(1, 2, 3).indexOf(1) }
-        expect(1) { shortArrayOf(1, 2, 3).indexOf(2) }
-        expect(2) { shortArrayOf(1, 2, 3).indexOf(3) }
-
-        expect(-1) { intArrayOf(1, 2, 3).indexOf(0) }
-        expect(0) { intArrayOf(1, 2, 3).indexOf(1) }
-        expect(1) { intArrayOf(1, 2, 3).indexOf(2) }
-        expect(2) { intArrayOf(1, 2, 3).indexOf(3) }
-
-        expect(-1) { longArrayOf(1, 2, 3).indexOf(0) }
-        expect(0) { longArrayOf(1, 2, 3).indexOf(1) }
-        expect(1) { longArrayOf(1, 2, 3).indexOf(2) }
-        expect(2) { longArrayOf(1, 2, 3).indexOf(3) }
-
-        expect(-1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(0f) }
-        expect(0) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(1.0f) }
-        expect(1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(2.0f) }
-        expect(2) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(3.0f) }
-
-        expect(-1) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(0.0) }
-        expect(0) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(1.0) }
-        expect(1) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(2.0) }
-        expect(2) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(3.0) }
-
-        expect(-1) { charArrayOf('a', 'b', 'c').indexOf('z') }
-        expect(0) { charArrayOf('a', 'b', 'c').indexOf('a') }
-        expect(1) { charArrayOf('a', 'b', 'c').indexOf('b') }
-        expect(2) { charArrayOf('a', 'b', 'c').indexOf('c') }
-
-        expect(0) { booleanArrayOf(true, false).indexOf(true) }
-        expect(1) { booleanArrayOf(true, false).indexOf(false) }
-        expect(-1) { booleanArrayOf(true).indexOf(false) }
-    }
-
-    @Test fun indexOf() {
-        expect(-1) { arrayOf("cat", "dog", "bird").indexOf("mouse") }
-        expect(0) { arrayOf("cat", "dog", "bird").indexOf("cat") }
-        expect(1) { arrayOf("cat", "dog", "bird").indexOf("dog") }
-        expect(2) { arrayOf("cat", "dog", "bird").indexOf("bird") }
-        expect(0) { arrayOf(null, "dog", null).indexOf(null as String?)}
-
-        expect(-1) { arrayOf("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
-        expect(0) { arrayOf("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
-        expect(1) { arrayOf("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
-        expect(2) { arrayOf("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
-
-        expect(-1) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
-        expect(0) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
-        expect(1) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
-        expect(2) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
-    }
-
     @Test fun lastIndexOf() {
         expect(-1) { arrayOf("cat", "dog", "bird").lastIndexOf("mouse") }
         expect(0) { arrayOf("cat", "dog", "bird").lastIndexOf("cat") }
@@ -927,84 +806,6 @@
         }
     }
 
-
-    @Test fun copyRangeInto() {
-        fun <T> doTest(
-            copyInto: T.(T, Int, Int, Int) -> T,
-            assertTEquals: (T, T, String) -> Unit,
-            toStringT: T.() -> String,
-            dest: T, newValues: T,
-            result1: T, result2: T, result3: T
-        ) {
-            newValues.copyInto(dest, 0, 1, 3)
-            assertTypeEquals(result1, dest)
-            assertTEquals(result1, dest, "Copying from newValues: ${result1.toStringT()}, ${dest.toStringT()}")
-
-            dest.copyInto(dest, 0, 1, 3)
-            assertTEquals(result2, dest, "Overlapping backward copy: ${result2.toStringT()}, ${dest.toStringT()}")
-
-            dest.copyInto(dest, 1, 0, 2)
-            assertTEquals(result3, dest, "Overlapping forward copy: ${result2.toStringT()}, ${dest.toStringT()}")
-
-            for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
-                val bounds = "start: $start, end: $end"
-                val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
-                assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
-            }
-            for (destIndex in listOf(-1, 2, 4)) {
-                assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
-            }
-        }
-
-        doTest(
-            Array<String>::copyInto, { e, a, msg -> assertArrayNotSameButEquals(e, a, msg) }, Array<*>::contentToString,
-            arrayOf("a", "b", "c"), arrayOf("e", "f", "g"),
-            arrayOf("f", "g", "c"), arrayOf("g", "c", "c"), arrayOf("g", "g", "c")
-        )
-
-        doTest(
-            IntArray::copyInto, ::assertArrayNotSameButEquals, IntArray::contentToString,
-            intArrayOf(1, 2, 3), intArrayOf(4, 5, 6),
-            intArrayOf(5, 6, 3), intArrayOf(6, 3, 3), intArrayOf(6, 6, 3)
-        )
-
-        doTest(
-            LongArray::copyInto, ::assertArrayNotSameButEquals, LongArray::contentToString,
-            longArrayOf(1, 2, 3), longArrayOf(4, 5, 6),
-            longArrayOf(5, 6, 3), longArrayOf(6, 3, 3), longArrayOf(6, 6, 3)
-        )
-
-        doTest(
-            ByteArray::copyInto, ::assertArrayNotSameButEquals, ByteArray::contentToString,
-            byteArrayOf(1, 2, 3), byteArrayOf(4, 5, 6),
-            byteArrayOf(5, 6, 3), byteArrayOf(6, 3, 3), byteArrayOf(6, 6, 3)
-        )
-
-        doTest(
-            CharArray::copyInto, ::assertArrayNotSameButEquals, CharArray::contentToString,
-            charArrayOf('a', 'b', 'c'), charArrayOf('e', 'f', 'g'),
-            charArrayOf('f', 'g', 'c'), charArrayOf('g', 'c', 'c'), charArrayOf('g', 'g', 'c')
-        )
-
-        doTest(
-            UIntArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, UIntArray::contentToString,
-            uintArrayOf(1, 2, 3), uintArrayOf(4, 5, 6),
-            uintArrayOf(5, 6, 3), uintArrayOf(6, 3, 3), uintArrayOf(6, 6, 3)
-        )
-
-        doTest(
-            ULongArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, ULongArray::contentToString,
-            ulongArrayOf(1, 2, 3), ulongArrayOf(4, 5, 6),
-            ulongArrayOf(5, 6, 3), ulongArrayOf(6, 3, 3), ulongArrayOf(6, 6, 3)
-        )
-
-        doTest(
-            UByteArray::copyInto, { e, a, msg -> assertTrue(e contentEquals a, msg) }, UByteArray::contentToString,
-            ubyteArrayOf(1, 2, 3), ubyteArrayOf(4, 5, 6),
-            ubyteArrayOf(5, 6, 3), ubyteArrayOf(6, 3, 3), ubyteArrayOf(6, 6, 3)
-        )
-    }
-
     @Test fun copyRangeIntoVarianceTest() {
         val sourceArr: Array<out Int> = arrayOf(1, 2, 3)
         val targetAnyArr: Array<Any?> = arrayOfNulls<Any?>(3)
@@ -1449,101 +1250,6 @@
         )
     }
 
-    @Test fun reverseInPlace() {
-
-        fun <TArray, T> doTest(build: Iterable<Int>.() -> TArray, reverse: TArray.() -> Unit, snapshot: TArray.() -> List<T>) {
-            val arrays = (0..4).map { n -> (1..n).build() }
-            for (array in arrays) {
-                val original = array.snapshot()
-                array.reverse()
-                val reversed = array.snapshot()
-                assertEquals(original.asReversed(), reversed)
-            }
-        }
-
-        doTest(build = { map {it}.toIntArray() },               reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toLong()}.toLongArray() },     reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toByte()}.toByteArray() },     reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toShort()}.toShortArray() },   reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toFloat()}.toFloatArray() },   reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toDouble()}.toDoubleArray() }, reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {'a' + it}.toCharArray() },        reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it % 2 == 0}.toBooleanArray() },  reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toString()}.toTypedArray() },  reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toString()}.toTypedArray() as Array<out String> },  reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toUInt()}.toUIntArray() },     reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toULong()}.toULongArray() },   reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toUByte()}.toUByteArray() },   reverse = { reverse() }, snapshot = { toList() })
-        doTest(build = { map {it.toUShort()}.toUShortArray() }, reverse = { reverse() }, snapshot = { toList() })
-    }
-
-    @Test
-    fun reverseRangeInPlace() {
-
-        fun <TArray, T> doTest(
-            build: Iterable<Int>.() -> TArray,
-            reverse: TArray.(fromIndex: Int, toIndex: Int) -> Unit,
-            snapshot: TArray.() -> List<T>
-        ) {
-            val arrays = (0..7).map { n -> n to (0 until n).build() }
-            for ((size, array) in arrays) {
-                for (fromIndex in 0 until size) {
-                    for (toIndex in fromIndex..size) {
-                        val original = array.snapshot().toMutableList()
-                        array.reverse(fromIndex, toIndex)
-                        val reversed = array.snapshot()
-                        assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
-                    }
-                }
-
-                assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
-                assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
-                assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
-            }
-        }
-
-        doTest(build = { map {it.toString()}.toTypedArray() },  reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toString()}.toTypedArray() as Array<out String> },  reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-
-        doTest(build = { map {it}.toIntArray() },               reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toLong()}.toLongArray() },     reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toByte()}.toByteArray() },     reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toShort()}.toShortArray() },   reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toFloat()}.toFloatArray() },   reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toDouble()}.toDoubleArray() }, reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {'a' + it}.toCharArray() },        reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it % 2 == 0}.toBooleanArray() },  reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toUInt()}.toUIntArray() },     reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toULong()}.toULongArray() },   reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toUByte()}.toUByteArray() },   reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-        doTest(build = { map {it.toUShort()}.toUShortArray() }, reverse = { from, to -> reverse(from, to) }, snapshot = { toList() })
-    }
-
-
-    @Test fun reversed() {
-        expect(listOf(3, 2, 1)) { intArrayOf(1, 2, 3).reversed() }
-        expect(listOf<Byte>(3, 2, 1)) { byteArrayOf(1, 2, 3).reversed() }
-        expect(listOf<Short>(3, 2, 1)) { shortArrayOf(1, 2, 3).reversed() }
-        expect(listOf<Long>(3, 2, 1)) { longArrayOf(1, 2, 3).reversed() }
-        expect(listOf(3F, 2F, 1F)) { floatArrayOf(1F, 2F, 3F).reversed() }
-        expect(listOf(3.0, 2.0, 1.0)) { doubleArrayOf(1.0, 2.0, 3.0).reversed() }
-        expect(listOf('3', '2', '1')) { charArrayOf('1', '2', '3').reversed() }
-        expect(listOf(false, false, true)) { booleanArrayOf(true, false, false).reversed() }
-        expect(listOf("3", "2", "1")) { arrayOf("1", "2", "3").reversed() }
-    }
-
-    @Test fun reversedArray() {
-        assertArrayNotSameButEquals(intArrayOf(3, 2, 1), intArrayOf(1, 2, 3).reversedArray())
-        assertArrayNotSameButEquals(byteArrayOf(3, 2, 1), byteArrayOf(1, 2, 3).reversedArray())
-        assertArrayNotSameButEquals(shortArrayOf(3, 2, 1), shortArrayOf(1, 2, 3).reversedArray())
-        assertArrayNotSameButEquals(longArrayOf(3, 2, 1), longArrayOf(1, 2, 3).reversedArray())
-        assertArrayNotSameButEquals(floatArrayOf(3F, 2F, 1F), floatArrayOf(1F, 2F, 3F).reversedArray())
-        assertArrayNotSameButEquals(doubleArrayOf(3.0, 2.0, 1.0), doubleArrayOf(1.0, 2.0, 3.0).reversedArray())
-        assertArrayNotSameButEquals(charArrayOf('3', '2', '1'), charArrayOf('1', '2', '3').reversedArray())
-        assertArrayNotSameButEquals(booleanArrayOf(false, false, true), booleanArrayOf(true, false, false).reversedArray())
-        assertArrayNotSameButEquals(arrayOf("3", "2", "1"), arrayOf("1", "2", "3").reversedArray())
-        assertArrayNotSameButEquals(arrayOf("3", "2", "1"), (arrayOf("1", "2", "3") as Array<out String>).reversedArray())
-    }
 
     @Test fun onEach() {
         var count = 0
@@ -1865,33 +1571,6 @@
         assertEquals(Array(0, { "" }).asList(), emptyList<String>())
     }
 
-    @Test fun sort() {
-        val intArr = intArrayOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
-        intArr.sort()
-        assertArrayNotSameButEquals(intArrayOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE), intArr)
-        intArr.sortDescending()
-        assertArrayNotSameButEquals(intArrayOf(Int.MAX_VALUE, 80, 9, 5, 2, 1, Int.MIN_VALUE), intArr)
-
-        val longArr = longArrayOf(200, 2, 1, 4, 3, Long.MIN_VALUE, Long.MAX_VALUE)
-        longArr.sort()
-        assertArrayNotSameButEquals(longArrayOf(Long.MIN_VALUE, 1, 2, 3, 4, 200, Long.MAX_VALUE), longArr)
-        longArr.sortDescending()
-        assertArrayNotSameButEquals(longArrayOf(Long.MAX_VALUE, 200, 4, 3, 2, 1, Long.MIN_VALUE), longArr)
-
-        val charArr = charArrayOf('d', 'c', 'E', 'a', '\u0000', '\uFFFF')
-        charArr.sort()
-        assertArrayNotSameButEquals(charArrayOf('\u0000', 'E', 'a', 'c', 'd', '\uFFFF'), charArr)
-        charArr.sortDescending()
-        assertArrayNotSameButEquals(charArrayOf('\uFFFF', 'd', 'c', 'a', 'E', '\u0000'), charArr)
-
-
-        val strArr = arrayOf("9", "80", "all", "Foo")
-        strArr.sort()
-        assertArrayNotSameButEquals(arrayOf("80", "9", "Foo", "all"), strArr)
-        strArr.sortDescending()
-        assertArrayNotSameButEquals(arrayOf("all", "Foo", "9", "80"), strArr)
-    }
-
     @Test fun sortRange() {
 
         fun <TArray, T : Comparable<T>> doTest(
@@ -1977,50 +1656,6 @@
         doTest(build = { map {it.toUShort()}.toUShortArray() }, sortDescending = { from, to -> sortDescending(from, to) }, snapshot = { toList() })
     }
 
-    @Test fun sortedTests() {
-        assertTrue(arrayOf<Long>().sorted().none())
-        assertEquals(listOf(1), arrayOf(1).sorted())
-
-        fun <A, T: Comparable<T>> arrayData(vararg values: T, toArray: Array<out T>.() -> A) = ArraySortedChecker<A, T>(values.toArray(), naturalOrder())
-
-        with (arrayData("ac", "aD", "aba") { toList().toTypedArray() }) {
-            checkSorted<List<String>>({ sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<Array<String>>({ sortedArray() }, { sortedArrayDescending()}, { iterator() } )
-        }
-
-        with (arrayData("ac", "aD", "aba") { toList().toTypedArray() as Array<out String> }) {
-            checkSorted<List<String>>({ sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<Array<out String>>({ sortedArray() }, { sortedArrayDescending()}, { iterator() } )
-        }
-
-        with (arrayData(3, 7, 1) { toIntArray() }) {
-            checkSorted<List<Int>>( { sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<IntArray>( { sortedArray() }, { sortedArrayDescending() }, { iterator() })
-        }
-
-
-        with (arrayData(1L, Long.MIN_VALUE, Long.MAX_VALUE) { toLongArray() }) {
-            checkSorted<List<Long>>( { sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<LongArray>( { sortedArray() }, { sortedArrayDescending() }, { iterator() })
-        }
-
-        with (arrayData('a', 'D', 'c') { toCharArray() }) {
-            checkSorted<List<Char>>( { sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<CharArray>( { sortedArray() }, { sortedArrayDescending() }, { iterator() })
-        }
-
-        with (arrayData(1.toByte(), Byte.MAX_VALUE, Byte.MIN_VALUE) { toByteArray() }) {
-            checkSorted<List<Byte>>( { sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<ByteArray>( { sortedArray() }, { sortedArrayDescending() }, { iterator() })
-        }
-
-        with(arrayData(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, -Double.MAX_VALUE,
-                       1.0, -1.0, Double.MIN_VALUE, -Double.MIN_VALUE, 0.0, -0.0, Double.NaN) { toDoubleArray() }) {
-            checkSorted<List<Double>>( { sorted() }, { sortedDescending() }, { iterator() })
-            checkSorted<DoubleArray>( { sortedArray() }, { sortedArrayDescending() }, { iterator() })
-        }
-    }
-
     @Test fun sortStable() {
         val keyRange = 'A'..'D'
         for (size in listOf(10, 100, 2000)) {
@@ -2036,25 +1671,6 @@
         }
     }
 
-    @Test fun sortByInPlace() {
-        val data = arrayOf("aa" to 20, "ab" to 3, "aa" to 3)
-        data.sortBy { it.second }
-        assertArrayNotSameButEquals(arrayOf("ab" to 3, "aa" to 3, "aa" to 20), data)
-
-        data.sortBy { it.first }
-        assertArrayNotSameButEquals(arrayOf("aa" to 3, "aa" to 20, "ab" to 3), data)
-
-        data.sortByDescending { (it.first + it.second).length }
-        assertArrayNotSameButEquals(arrayOf("aa" to 20, "aa" to 3, "ab" to 3), data)
-    }
-
-    @Test fun sortedBy() {
-        val values = arrayOf("ac", "aD", "aba")
-        val indices = values.indices.toList().toIntArray()
-
-        assertEquals(listOf(1, 2, 0), indices.sortedBy { values[it] })
-    }
-
     @Test fun sortByStable() {
         val keyRange = 'A'..'D'
         for (size in listOf(10, 100, 2000)) {
@@ -2082,13 +1698,6 @@
 
     @Test fun sortedWith() {
         val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
-        fun <A, T> arrayData(array: A, comparator: Comparator<T>) = ArraySortedChecker<A, T>(array, comparator)
-
-        arrayData(intArrayOf(0, 1, 2, 3, 4, 5), comparator)
-                .checkSorted<List<Int>>( { sortedWith(comparator) }, { sortedWith(comparator.reversed()) }, { iterator() })
-
-        arrayData(arrayOf(0, 1, 2, 3, 4, 5), comparator)
-                .checkSorted<Array<out Int>>( { sortedArrayWith(comparator) }, { sortedArrayWith(comparator.reversed()) }, { iterator() })
 
         // in-place
         val array = Array(6) { it }
@@ -2151,64 +1760,6 @@
         }
     }
 
-    private inline fun <T> testShuffle(array: T, shuffle: T.() -> Unit, toList: T.() -> List<*>) {
-        val original = array.toList()
-        array.shuffle()
-        val shuffled = array.toList()
-        assertNotEquals(original, shuffled)
-        assertEquals(original.groupBy { it }, shuffled.groupBy { it })
-    }
-
-    @Test
-    fun shuffle() {
-        val numbers = List(100) { it }
-        testShuffle(numbers.map(Int::toInt).toIntArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toLong).toLongArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toByte).toByteArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toShort).toShortArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toFloat).toFloatArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toDouble).toDoubleArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toChar).toCharArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map { it % 2 == 0 }.toBooleanArray(), { shuffle() }, { toList() })
-
-        testShuffle(numbers.map(Int::toUInt).toUIntArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toULong).toULongArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toUByte).toUByteArray(), { shuffle() }, { toList() })
-        testShuffle(numbers.map(Int::toUShort).toUShortArray(), { shuffle() }, { toList() })
-
-        testShuffle(arrayOf(1, "x", null, Any(), 'a', 2u, 5.0), { shuffle() }, { toList() })
-    }
-
-    private inline fun <T> testShuffleR(array: T, shuffle: T.(Random) -> Unit, toList: T.() -> List<*>) {
-        val seed = Random.nextInt()
-        val original = array.toList()
-        val originalShuffled = original.shuffled(Random(seed))
-        array.shuffle(Random(seed))
-        val shuffled = array.toList()
-        assertNotEquals(original, shuffled)
-        assertEquals(originalShuffled, shuffled)
-    }
-
-    @Test
-    fun shufflePredictably() {
-        val numbers = List(16) { it }
-        testShuffleR(numbers.map(Int::toInt).toIntArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toLong).toLongArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toByte).toByteArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toShort).toShortArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toFloat).toFloatArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toDouble).toDoubleArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toChar).toCharArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map { it % 2 == 0 }.toBooleanArray(), { r -> shuffle(r) }, { toList() })
-
-        testShuffleR(numbers.map(Int::toUInt).toUIntArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toULong).toULongArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toUByte).toUByteArray(), { r -> shuffle(r) }, { toList() })
-        testShuffleR(numbers.map(Int::toUShort).toUShortArray(), { r -> shuffle(r) }, { toList() })
-
-        testShuffleR(arrayOf(1, "x", null, Any(), 'a', 2u, 5.0), { r -> shuffle(r) }, { toList() })
-    }
-
     @Test
     fun elementAt() {
         expect(0) { byteArrayOf(0, 1, 2).elementAt(0) }
@@ -2299,7 +1850,7 @@
 fun <K : Comparable<K>> Array<out Sortable<K>>.assertStableSorted(descending: Boolean = false) =
     iterator().assertStableSorted(descending = descending)
 
-private class ArraySortedChecker<A, T>(val array: A, val comparator: Comparator<in T>) {
+internal class ArraySortedChecker<A, T>(val array: A, val comparator: Comparator<in T>) {
     public fun <R> checkSorted(sorted: A.() -> R, sortedDescending: A.() -> R, iterator: R.() -> Iterator<T>) {
         array.sorted().iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
         array.sortedDescending().iterator().assertSorted { a, b -> comparator.compare(a, b) >= 0 }
diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt
index 3467bcf..29bd499 100644
--- a/libraries/stdlib/test/collections/CollectionTest.kt
+++ b/libraries/stdlib/test/collections/CollectionTest.kt
@@ -152,23 +152,6 @@
         assertEquals(0, charValues.size)
     }
 
-    @Test fun foldIndexed() {
-        expect(42) {
-            val numbers = listOf(1, 2, 3, 4)
-            numbers.foldIndexed(0) { index, a, b -> index * (a + b) }
-        }
-
-        expect(0) {
-            val numbers = arrayListOf<Int>()
-            numbers.foldIndexed(0) { index, a, b -> index * (a + b) }
-        }
-
-        expect("11234") {
-            val numbers = listOf(1, 2, 3, 4)
-            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
-        }
-    }
-
     @Test fun foldIndexedWithDifferentTypes() {
         expect(10) {
             val numbers = listOf("a", "ab", "abc")
@@ -188,13 +171,6 @@
         }
     }
 
-    @Test fun foldRightIndexed() {
-        expect("12343210") {
-            val numbers = listOf(1, 2, 3, 4)
-            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
-        }
-    }
-
     @Test fun foldRightIndexedWithDifferentTypes() {
         expect("12343210") {
             val numbers = listOf(1, 2, 3, 4)
@@ -851,40 +827,6 @@
         assertIsPositiveZero(listOf(0.0F, -0.0F).shuffled().maxOrNull()!!.toDouble())
     }
 
-    @Test fun minWithOrNull() {
-        expect(null, { listOf<Int>().minWithOrNull(naturalOrder()) })
-        expect(1, { listOf(1).minWithOrNull(naturalOrder()) })
-        expect("a", { listOf("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER) })
-        expect("a", { listOf("a", "B").asSequence().minWithOrNull(STRING_CASE_INSENSITIVE_ORDER) })
-    }
-
-    @Test fun maxWithOrNull() {
-        expect(null, { listOf<Int>().maxWithOrNull(naturalOrder()) })
-        expect(1, { listOf(1).maxWithOrNull(naturalOrder()) })
-        expect("B", { listOf("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER) })
-        expect("B", { listOf("a", "B").asSequence().maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER) })
-    }
-
-    @Test fun minByOrNull() {
-        expect(null, { listOf<Int>().minByOrNull { it } })
-        expect(1, { listOf(1).minByOrNull { it } })
-        expect(3, { listOf(2, 3).minByOrNull { -it } })
-        expect('a', { listOf('a', 'b').minByOrNull { "x$it" } })
-        expect("b", { listOf("b", "abc").minByOrNull { it.length } })
-        expect(null, { listOf<Int>().asSequence().minByOrNull { it } })
-        expect(3, { listOf(2, 3).asSequence().minByOrNull { -it } })
-    }
-
-    @Test fun maxByOrNull() {
-        expect(null, { listOf<Int>().maxByOrNull { it } })
-        expect(1, { listOf(1).maxByOrNull { it } })
-        expect(2, { listOf(2, 3).maxByOrNull { -it } })
-        expect('b', { listOf('a', 'b').maxByOrNull { "x$it" } })
-        expect("abc", { listOf("b", "abc").maxByOrNull { it.length } })
-        expect(null, { listOf<Int>().asSequence().maxByOrNull { it } })
-        expect(2, { listOf(2, 3).asSequence().maxByOrNull { -it } })
-    }
-
     @Test fun minByOrNullEvaluateOnce() {
         var c = 0
         expect(1, { listOf(5, 4, 3, 2, 1).minByOrNull { c++; it * it } })
@@ -1037,18 +979,6 @@
                             -0.0, -Double.MIN_VALUE, -1.0, -Double.MAX_VALUE, Double.NEGATIVE_INFINITY), dataDouble.sortedDescending())
     }
 
-    @Test fun sortByInPlace() {
-        val data = arrayListOf("aa" to 20, "ab" to 3, "aa" to 3)
-        data.sortBy { it.second }
-        assertEquals(listOf("ab" to 3, "aa" to 3, "aa" to 20), data)
-
-        data.sortBy { it.first }
-        assertEquals(listOf("aa" to 3, "aa" to 20, "ab" to 3), data)
-
-        data.sortByDescending { (it.first + it.second).length }
-        assertEquals(listOf("aa" to 20, "aa" to 3, "ab" to 3), data)
-    }
-
     @Test fun sortStable() {
         val keyRange = 'A'..'D'
         for (size in listOf(10, 100, 2000)) {
@@ -1064,12 +994,6 @@
         }
     }
 
-    @Test fun sortedBy() {
-        assertEquals(listOf("two" to 3, "three" to 20), listOf("three" to 20, "two" to 3).sortedBy { it.second })
-        assertEquals(listOf("three" to 20, "two" to 3), listOf("three" to 20, "two" to 3).sortedBy { it.first })
-        assertEquals(listOf("three", "two"), listOf("two", "three").sortedByDescending { it.length })
-    }
-
     @Test fun sortedNullableBy() {
         fun String.nullIfEmpty() = if (isEmpty()) null else this
         listOf(null, "", "a").let {
@@ -1088,15 +1012,6 @@
         }
     }
 
-    @Test fun sortedWith() {
-        val comparator = compareBy<String> { it.toUpperCase().reversed() }
-        val data = listOf("cat", "dad", "BAD")
-
-        expect(listOf("BAD", "dad", "cat")) { data.sortedWith(comparator) }
-        expect(listOf("cat", "dad", "BAD")) { data.sortedWith(comparator.reversed()) }
-        expect(listOf("BAD", "dad", "cat")) { data.sortedWith(comparator.reversed().reversed()) }
-    }
-
     @Test fun sortByStable() {
         val keyRange = 'A'..'D'
         for (size in listOf(10, 100, 2000)) {
diff --git a/libraries/stdlib/test/collections/UnsignedArraysTest.kt b/libraries/stdlib/test/collections/UnsignedArraysTest.kt
index e8d8216..792b54f 100644
--- a/libraries/stdlib/test/collections/UnsignedArraysTest.kt
+++ b/libraries/stdlib/test/collections/UnsignedArraysTest.kt
@@ -248,22 +248,6 @@
     }
 
     @Test
-    fun indexOf() {
-        expect(-1) { ubyteArrayOf(1, 2, 3).indexOf(0) }
-        expect(0) { ushortArrayOf(1, 2, 3).indexOf(1) }
-        expect(1) { uintArrayOf(1, 2, 3).indexOf(2) }
-        expect(2) { ulongArrayOf(1, 2, 3).indexOf(3) }
-    }
-
-    @Test
-    fun indexOfFirst() {
-        expect(-1) { ubyteArrayOf(1, 2, 3).indexOfFirst { it == 5.toUByte() } }
-        expect(0) { ushortArrayOf(1, 2, 3).indexOfFirst { it % 2u == 1u } }
-        expect(1) { uintArrayOf(1, 2, 3).indexOfFirst { it % 2u == 0u } }
-        expect(2) { ulongArrayOf(1, 2, 3).indexOfFirst { it == 3.toULong() } }
-    }
-
-    @Test
     fun lastIndexOf() {
         expect(-1) { ubyteArrayOf(1, 2, 3).lastIndexOf(0) }
         expect(0) { ushortArrayOf(1, 2, 3).lastIndexOf(1) }
diff --git a/libraries/stdlib/test/generated/_ArraysTest.kt b/libraries/stdlib/test/generated/_ArraysTest.kt
new file mode 100644
index 0000000..203e394
--- /dev/null
+++ b/libraries/stdlib/test/generated/_ArraysTest.kt
@@ -0,0 +1,1947 @@
+/*
+ * Copyright 2010-2020 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.collections
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import test.comparisons.STRING_CASE_INSENSITIVE_ORDER
+import kotlin.random.*
+import test.assertArrayContentEquals
+import kotlin.test.*
+
+class _ArraysTest {
+    @Test
+    fun foldIndexed_Array() {
+        expect(8) { arrayOf<Int>(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toInt() * e } }
+        expect(10) { arrayOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { arrayOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toInt() + e) } }
+        expect(" 0-1 1-2 2-3") { arrayOf<Int>(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = arrayOf<Int>(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect(0) {
+            val numbers = arrayOf<Int>()
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = arrayOf<Int>(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_ByteArray() {
+        expect(8) { byteArrayOf(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toByte() * e } }
+        expect(10) { byteArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { byteArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toByte() + e) } }
+        expect(" 0-1 1-2 2-3") { byteArrayOf(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = byteArrayOf(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toByte() * (a + b) }
+        }
+        expect(0) {
+            val numbers = byteArrayOf()
+            numbers.foldIndexed(0) { index, a, b -> index.toByte() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = byteArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_ShortArray() {
+        expect(8) { shortArrayOf(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toShort() * e } }
+        expect(10) { shortArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { shortArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toShort() + e) } }
+        expect(" 0-1 1-2 2-3") { shortArrayOf(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = shortArrayOf(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toShort() * (a + b) }
+        }
+        expect(0) {
+            val numbers = shortArrayOf()
+            numbers.foldIndexed(0) { index, a, b -> index.toShort() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = shortArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_IntArray() {
+        expect(8) { intArrayOf(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toInt() * e } }
+        expect(10) { intArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { intArrayOf(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toInt() + e) } }
+        expect(" 0-1 1-2 2-3") { intArrayOf(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = intArrayOf(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect(0) {
+            val numbers = intArrayOf()
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = intArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_LongArray() {
+        expect(8L) { longArrayOf(1L, 2L, 3L).foldIndexed(0L) { i, acc, e -> acc + i.toLong() * e } }
+        expect(10) { longArrayOf(1L, 2L, 3L).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15L) { longArrayOf(1L, 2L, 3L).foldIndexed(1L) { i, acc, e -> acc * (i.toLong() + e) } }
+        expect(" 0-1 1-2 2-3") { longArrayOf(1L, 2L, 3L).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42L) {
+            val numbers = longArrayOf(1L, 2L, 3L, 4L)
+            numbers.foldIndexed(0L) { index, a, b -> index.toLong() * (a + b) }
+        }
+        expect(0L) {
+            val numbers = longArrayOf()
+            numbers.foldIndexed(0L) { index, a, b -> index.toLong() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = longArrayOf(1L, 2L, 3L, 4L)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_FloatArray() {
+        expect(8.0f) { floatArrayOf(1.0f, 2.0f, 3.0f).foldIndexed(0.0f) { i, acc, e -> acc + i.toFloat() * e } }
+        expect(10) { floatArrayOf(1.0f, 2.0f, 3.0f).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15.0f) { floatArrayOf(1.0f, 2.0f, 3.0f).foldIndexed(1.0f) { i, acc, e -> acc * (i.toFloat() + e) } }
+        expect(" 0-1.0 1-2.0 2-3.0") { floatArrayOf(1.0f, 2.0f, 3.0f).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42.0f) {
+            val numbers = floatArrayOf(1.0f, 2.0f, 3.0f, 4.0f)
+            numbers.foldIndexed(0.0f) { index, a, b -> index.toFloat() * (a + b) }
+        }
+        expect(0.0f) {
+            val numbers = floatArrayOf()
+            numbers.foldIndexed(0.0f) { index, a, b -> index.toFloat() * (a + b) }
+        }
+        expect("1.01.02.03.04.0") {
+            val numbers = floatArrayOf(1.0f, 2.0f, 3.0f, 4.0f)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_DoubleArray() {
+        expect(8.0) { doubleArrayOf(1.0, 2.0, 3.0).foldIndexed(0.0) { i, acc, e -> acc + i.toDouble() * e } }
+        expect(10) { doubleArrayOf(1.0, 2.0, 3.0).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15.0) { doubleArrayOf(1.0, 2.0, 3.0).foldIndexed(1.0) { i, acc, e -> acc * (i.toDouble() + e) } }
+        expect(" 0-1.0 1-2.0 2-3.0") { doubleArrayOf(1.0, 2.0, 3.0).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42.0) {
+            val numbers = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
+            numbers.foldIndexed(0.0) { index, a, b -> index.toDouble() * (a + b) }
+        }
+        expect(0.0) {
+            val numbers = doubleArrayOf()
+            numbers.foldIndexed(0.0) { index, a, b -> index.toDouble() * (a + b) }
+        }
+        expect("1.01.02.03.04.0") {
+            val numbers = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_Array() {
+        expect(8) { arrayOf<Int>(1, 2, 3).foldRightIndexed(0) { i, e, acc -> acc + i.toInt() * e } }
+        expect(10) { arrayOf<Int>(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15) { arrayOf<Int>(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc * (i.toInt() + e) } }
+        expect(" 2-3 1-2 0-1") { arrayOf<Int>(1, 2, 3).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = arrayOf<Int>(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_ByteArray() {
+        expect(8) { byteArrayOf(1, 2, 3).foldRightIndexed(0) { i, e, acc -> acc + i.toByte() * e } }
+        expect(10) { byteArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15) { byteArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc * (i.toByte() + e) } }
+        expect(" 2-3 1-2 0-1") { byteArrayOf(1, 2, 3).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = byteArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_ShortArray() {
+        expect(8) { shortArrayOf(1, 2, 3).foldRightIndexed(0) { i, e, acc -> acc + i.toShort() * e } }
+        expect(10) { shortArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15) { shortArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc * (i.toShort() + e) } }
+        expect(" 2-3 1-2 0-1") { shortArrayOf(1, 2, 3).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = shortArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_IntArray() {
+        expect(8) { intArrayOf(1, 2, 3).foldRightIndexed(0) { i, e, acc -> acc + i.toInt() * e } }
+        expect(10) { intArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15) { intArrayOf(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc * (i.toInt() + e) } }
+        expect(" 2-3 1-2 0-1") { intArrayOf(1, 2, 3).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = intArrayOf(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_LongArray() {
+        expect(8L) { longArrayOf(1L, 2L, 3L).foldRightIndexed(0L) { i, e, acc -> acc + i.toLong() * e } }
+        expect(10) { longArrayOf(1L, 2L, 3L).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15L) { longArrayOf(1L, 2L, 3L).foldRightIndexed(1L) { i, e, acc -> acc * (i.toLong() + e) } }
+        expect(" 2-3 1-2 0-1") { longArrayOf(1L, 2L, 3L).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = longArrayOf(1L, 2L, 3L, 4L)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_FloatArray() {
+        expect(8.0f) { floatArrayOf(1.0f, 2.0f, 3.0f).foldRightIndexed(0.0f) { i, e, acc -> acc + i.toFloat() * e } }
+        expect(10) { floatArrayOf(1.0f, 2.0f, 3.0f).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15.0f) { floatArrayOf(1.0f, 2.0f, 3.0f).foldRightIndexed(1.0f) { i, e, acc -> acc * (i.toFloat() + e) } }
+        expect(" 2-3.0 1-2.0 0-1.0") { floatArrayOf(1.0f, 2.0f, 3.0f).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("1.02.03.04.03210") {
+            val numbers = floatArrayOf(1.0f, 2.0f, 3.0f, 4.0f)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_DoubleArray() {
+        expect(8.0) { doubleArrayOf(1.0, 2.0, 3.0).foldRightIndexed(0.0) { i, e, acc -> acc + i.toDouble() * e } }
+        expect(10) { doubleArrayOf(1.0, 2.0, 3.0).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15.0) { doubleArrayOf(1.0, 2.0, 3.0).foldRightIndexed(1.0) { i, e, acc -> acc * (i.toDouble() + e) } }
+        expect(" 2-3.0 1-2.0 0-1.0") { doubleArrayOf(1.0, 2.0, 3.0).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("1.02.03.04.03210") {
+            val numbers = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun maxByOrNull_Array() {
+        assertEquals(null, arrayOf<Int>().maxByOrNull { it })
+        assertEquals(1, arrayOf<Int>(1).maxByOrNull { it })
+        assertEquals(3, arrayOf<Int>(3, 2).maxByOrNull { it * it })
+        assertEquals(3, arrayOf<Int>(3, 2).maxByOrNull { "a" })
+        assertEquals(3, arrayOf<Int>(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, arrayOf<Int>(2, 3).maxByOrNull { -it })
+        assertEquals('b', arrayOf('a', 'b').maxByOrNull { "x$it" })
+        assertEquals("abc", arrayOf("b", "abc").maxByOrNull { it.length })
+    }
+
+    @Test
+    fun maxByOrNull_ByteArray() {
+        assertEquals(null, byteArrayOf().maxByOrNull { it })
+        assertEquals(1, byteArrayOf(1).maxByOrNull { it })
+        assertEquals(3, byteArrayOf(3, 2).maxByOrNull { it * it })
+        assertEquals(3, byteArrayOf(3, 2).maxByOrNull { "a" })
+        assertEquals(3, byteArrayOf(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, byteArrayOf(2, 3).maxByOrNull { -it })
+    }
+
+    @Test
+    fun maxByOrNull_ShortArray() {
+        assertEquals(null, shortArrayOf().maxByOrNull { it })
+        assertEquals(1, shortArrayOf(1).maxByOrNull { it })
+        assertEquals(3, shortArrayOf(3, 2).maxByOrNull { it * it })
+        assertEquals(3, shortArrayOf(3, 2).maxByOrNull { "a" })
+        assertEquals(3, shortArrayOf(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, shortArrayOf(2, 3).maxByOrNull { -it })
+    }
+
+    @Test
+    fun maxByOrNull_IntArray() {
+        assertEquals(null, intArrayOf().maxByOrNull { it })
+        assertEquals(1, intArrayOf(1).maxByOrNull { it })
+        assertEquals(3, intArrayOf(3, 2).maxByOrNull { it * it })
+        assertEquals(3, intArrayOf(3, 2).maxByOrNull { "a" })
+        assertEquals(3, intArrayOf(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, intArrayOf(2, 3).maxByOrNull { -it })
+    }
+
+    @Test
+    fun maxByOrNull_LongArray() {
+        assertEquals(null, longArrayOf().maxByOrNull { it })
+        assertEquals(1L, longArrayOf(1L).maxByOrNull { it })
+        assertEquals(3L, longArrayOf(3L, 2L).maxByOrNull { it * it })
+        assertEquals(3L, longArrayOf(3L, 2L).maxByOrNull { "a" })
+        assertEquals(3L, longArrayOf(3L, 2L).maxByOrNull { it.toString() })
+        assertEquals(2L, longArrayOf(2L, 3L).maxByOrNull { -it })
+        assertEquals(3000000000000, longArrayOf(3000000000000, 2000000000000).maxByOrNull { it + 1 })
+    }
+
+    @Test
+    fun maxByOrNull_FloatArray() {
+        assertEquals(null, floatArrayOf().maxByOrNull { it })
+        assertEquals(1.0f, floatArrayOf(1.0f).maxByOrNull { it })
+        assertEquals(3.0f, floatArrayOf(3.0f, 2.0f).maxByOrNull { it * it })
+        assertEquals(3.0f, floatArrayOf(3.0f, 2.0f).maxByOrNull { "a" })
+        assertEquals(3.0f, floatArrayOf(3.0f, 2.0f).maxByOrNull { it.toString() })
+        assertEquals(2.0f, floatArrayOf(2.0f, 3.0f).maxByOrNull { -it })
+    }
+
+    @Test
+    fun maxByOrNull_DoubleArray() {
+        assertEquals(null, doubleArrayOf().maxByOrNull { it })
+        assertEquals(1.0, doubleArrayOf(1.0).maxByOrNull { it })
+        assertEquals(3.0, doubleArrayOf(3.0, 2.0).maxByOrNull { it * it })
+        assertEquals(3.0, doubleArrayOf(3.0, 2.0).maxByOrNull { "a" })
+        assertEquals(3.0, doubleArrayOf(3.0, 2.0).maxByOrNull { it.toString() })
+        assertEquals(2.0, doubleArrayOf(2.0, 3.0).maxByOrNull { -it })
+    }
+
+    @Test
+    fun maxByOrNull_BooleanArray() {
+        assertEquals(true, booleanArrayOf(true, false).maxByOrNull { it.toString() })
+        assertEquals(false, booleanArrayOf(true, false).maxByOrNull { it.toString().length })
+    }
+
+    @Test
+    fun maxByOrNull_CharArray() {
+        assertEquals('b', charArrayOf('a', 'b').maxByOrNull { "x$it" })
+        assertEquals('b', charArrayOf('b', 'a').maxByOrNull { "$it".length })
+    }
+
+    @Test
+    fun maxWithOrNull_Array() {
+        assertEquals(null, arrayOf<Int>().maxWithOrNull(naturalOrder()))
+        assertEquals(1, arrayOf<Int>(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, arrayOf<Int>(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+        assertEquals("B", arrayOf("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun maxWithOrNull_ByteArray() {
+        assertEquals(null, byteArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1, byteArrayOf(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, byteArrayOf(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun maxWithOrNull_ShortArray() {
+        assertEquals(null, shortArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1, shortArrayOf(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, shortArrayOf(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun maxWithOrNull_IntArray() {
+        assertEquals(null, intArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1, intArrayOf(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, intArrayOf(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun maxWithOrNull_LongArray() {
+        assertEquals(null, longArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1L, longArrayOf(1L).maxWithOrNull(naturalOrder()))
+        assertEquals(3L, longArrayOf(2L, 3L, 4L).maxWithOrNull(compareBy { it % 4L }))
+    }
+
+    @Test
+    fun maxWithOrNull_FloatArray() {
+        assertEquals(null, floatArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1.0f, floatArrayOf(1.0f).maxWithOrNull(naturalOrder()))
+        assertEquals(3.0f, floatArrayOf(2.0f, 3.0f, 4.0f).maxWithOrNull(compareBy { it % 4.0f }))
+    }
+
+    @Test
+    fun maxWithOrNull_DoubleArray() {
+        assertEquals(null, doubleArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1.0, doubleArrayOf(1.0).maxWithOrNull(naturalOrder()))
+        assertEquals(3.0, doubleArrayOf(2.0, 3.0, 4.0).maxWithOrNull(compareBy { it % 4.0 }))
+    }
+
+    @Test
+    fun minByOrNull_Array() {
+        assertEquals(null, arrayOf<Int>().minByOrNull { it })
+        assertEquals(1, arrayOf<Int>(1).minByOrNull { it })
+        assertEquals(2, arrayOf<Int>(3, 2).minByOrNull { it * it })
+        assertEquals(3, arrayOf<Int>(3, 2).minByOrNull { "a" })
+        assertEquals(2, arrayOf<Int>(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, arrayOf<Int>(2, 3).minByOrNull { -it })
+        assertEquals('a', arrayOf('a', 'b').minByOrNull { "x$it" })
+        assertEquals("b", arrayOf("b", "abc").minByOrNull { it.length })
+    }
+
+    @Test
+    fun minByOrNull_ByteArray() {
+        assertEquals(null, byteArrayOf().minByOrNull { it })
+        assertEquals(1, byteArrayOf(1).minByOrNull { it })
+        assertEquals(2, byteArrayOf(3, 2).minByOrNull { it * it })
+        assertEquals(3, byteArrayOf(3, 2).minByOrNull { "a" })
+        assertEquals(2, byteArrayOf(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, byteArrayOf(2, 3).minByOrNull { -it })
+    }
+
+    @Test
+    fun minByOrNull_ShortArray() {
+        assertEquals(null, shortArrayOf().minByOrNull { it })
+        assertEquals(1, shortArrayOf(1).minByOrNull { it })
+        assertEquals(2, shortArrayOf(3, 2).minByOrNull { it * it })
+        assertEquals(3, shortArrayOf(3, 2).minByOrNull { "a" })
+        assertEquals(2, shortArrayOf(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, shortArrayOf(2, 3).minByOrNull { -it })
+    }
+
+    @Test
+    fun minByOrNull_IntArray() {
+        assertEquals(null, intArrayOf().minByOrNull { it })
+        assertEquals(1, intArrayOf(1).minByOrNull { it })
+        assertEquals(2, intArrayOf(3, 2).minByOrNull { it * it })
+        assertEquals(3, intArrayOf(3, 2).minByOrNull { "a" })
+        assertEquals(2, intArrayOf(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, intArrayOf(2, 3).minByOrNull { -it })
+    }
+
+    @Test
+    fun minByOrNull_LongArray() {
+        assertEquals(null, longArrayOf().minByOrNull { it })
+        assertEquals(1L, longArrayOf(1L).minByOrNull { it })
+        assertEquals(2L, longArrayOf(3L, 2L).minByOrNull { it * it })
+        assertEquals(3L, longArrayOf(3L, 2L).minByOrNull { "a" })
+        assertEquals(2L, longArrayOf(3L, 2L).minByOrNull { it.toString() })
+        assertEquals(3L, longArrayOf(2L, 3L).minByOrNull { -it })
+        assertEquals(2000000000000, longArrayOf(3000000000000, 2000000000000).minByOrNull { it + 1 })
+    }
+
+    @Test
+    fun minByOrNull_FloatArray() {
+        assertEquals(null, floatArrayOf().minByOrNull { it })
+        assertEquals(1.0f, floatArrayOf(1.0f).minByOrNull { it })
+        assertEquals(2.0f, floatArrayOf(3.0f, 2.0f).minByOrNull { it * it })
+        assertEquals(3.0f, floatArrayOf(3.0f, 2.0f).minByOrNull { "a" })
+        assertEquals(2.0f, floatArrayOf(3.0f, 2.0f).minByOrNull { it.toString() })
+        assertEquals(3.0f, floatArrayOf(2.0f, 3.0f).minByOrNull { -it })
+    }
+
+    @Test
+    fun minByOrNull_DoubleArray() {
+        assertEquals(null, doubleArrayOf().minByOrNull { it })
+        assertEquals(1.0, doubleArrayOf(1.0).minByOrNull { it })
+        assertEquals(2.0, doubleArrayOf(3.0, 2.0).minByOrNull { it * it })
+        assertEquals(3.0, doubleArrayOf(3.0, 2.0).minByOrNull { "a" })
+        assertEquals(2.0, doubleArrayOf(3.0, 2.0).minByOrNull { it.toString() })
+        assertEquals(3.0, doubleArrayOf(2.0, 3.0).minByOrNull { -it })
+    }
+
+    @Test
+    fun minByOrNull_BooleanArray() {
+        assertEquals(false, booleanArrayOf(true, false).minByOrNull { it.toString() })
+        assertEquals(true, booleanArrayOf(true, false).minByOrNull { it.toString().length })
+    }
+
+    @Test
+    fun minByOrNull_CharArray() {
+        assertEquals('a', charArrayOf('a', 'b').minByOrNull { "x$it" })
+        assertEquals('b', charArrayOf('b', 'a').minByOrNull { "$it".length })
+    }
+
+    @Test
+    fun minWithOrNull_Array() {
+        assertEquals(null, arrayOf<Int>().minWithOrNull(naturalOrder()))
+        assertEquals(1, arrayOf<Int>(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, arrayOf<Int>(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+        assertEquals("a", arrayOf("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun minWithOrNull_ByteArray() {
+        assertEquals(null, byteArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1, byteArrayOf(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, byteArrayOf(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun minWithOrNull_ShortArray() {
+        assertEquals(null, shortArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1, shortArrayOf(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, shortArrayOf(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun minWithOrNull_IntArray() {
+        assertEquals(null, intArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1, intArrayOf(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, intArrayOf(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+    }
+
+    @Test
+    fun minWithOrNull_LongArray() {
+        assertEquals(null, longArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1L, longArrayOf(1L).minWithOrNull(naturalOrder()))
+        assertEquals(4L, longArrayOf(2L, 3L, 4L).minWithOrNull(compareBy { it % 4L }))
+    }
+
+    @Test
+    fun minWithOrNull_FloatArray() {
+        assertEquals(null, floatArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1.0f, floatArrayOf(1.0f).minWithOrNull(naturalOrder()))
+        assertEquals(4.0f, floatArrayOf(2.0f, 3.0f, 4.0f).minWithOrNull(compareBy { it % 4.0f }))
+    }
+
+    @Test
+    fun minWithOrNull_DoubleArray() {
+        assertEquals(null, doubleArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1.0, doubleArrayOf(1.0).minWithOrNull(naturalOrder()))
+        assertEquals(4.0, doubleArrayOf(2.0, 3.0, 4.0).minWithOrNull(compareBy { it % 4.0 }))
+    }
+
+    @Test
+    fun indexOf_Array() {
+        expect(-1) { arrayOf<Int>(1, 2, 3).indexOf(0) }
+        expect(0) { arrayOf<Int>(1, 2, 3).indexOf(1) }
+        expect(1) { arrayOf<Int>(1, 2, 3).indexOf(2) }
+        expect(2) { arrayOf<Int>(1, 2, 3).indexOf(3) } 
+        expect(-1) { arrayOf("cat", "dog", "bird").indexOf("mouse") }
+        expect(0) { arrayOf("cat", "dog", "bird").indexOf("cat") }
+        expect(1) { arrayOf("cat", "dog", "bird").indexOf("dog") }
+        expect(2) { arrayOf("cat", "dog", "bird").indexOf("bird") }
+        expect(0) { arrayOf(null, "dog", null).indexOf(null as String?)}
+    }
+
+    @Test
+    fun indexOf_ByteArray() {
+        expect(-1) { byteArrayOf(1, 2, 3).indexOf(0) }
+        expect(0) { byteArrayOf(1, 2, 3).indexOf(1) }
+        expect(1) { byteArrayOf(1, 2, 3).indexOf(2) }
+        expect(2) { byteArrayOf(1, 2, 3).indexOf(3) } 
+    }
+
+    @Test
+    fun indexOf_ShortArray() {
+        expect(-1) { shortArrayOf(1, 2, 3).indexOf(0) }
+        expect(0) { shortArrayOf(1, 2, 3).indexOf(1) }
+        expect(1) { shortArrayOf(1, 2, 3).indexOf(2) }
+        expect(2) { shortArrayOf(1, 2, 3).indexOf(3) } 
+    }
+
+    @Test
+    fun indexOf_IntArray() {
+        expect(-1) { intArrayOf(1, 2, 3).indexOf(0) }
+        expect(0) { intArrayOf(1, 2, 3).indexOf(1) }
+        expect(1) { intArrayOf(1, 2, 3).indexOf(2) }
+        expect(2) { intArrayOf(1, 2, 3).indexOf(3) } 
+    }
+
+    @Test
+    fun indexOf_LongArray() {
+        expect(-1) { longArrayOf(1L, 2L, 3L).indexOf(0L) }
+        expect(0) { longArrayOf(1L, 2L, 3L).indexOf(1L) }
+        expect(1) { longArrayOf(1L, 2L, 3L).indexOf(2L) }
+        expect(2) { longArrayOf(1L, 2L, 3L).indexOf(3L) } 
+    }
+
+    @Suppress("DEPRECATION")
+    @Test
+    fun indexOf_FloatArray() {
+        expect(-1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(0.0f) }
+        expect(0) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(1.0f) }
+        expect(1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(2.0f) }
+        expect(2) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOf(3.0f) } 
+    }
+
+    @Suppress("DEPRECATION")
+    @Test
+    fun indexOf_DoubleArray() {
+        expect(-1) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(0.0) }
+        expect(0) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(1.0) }
+        expect(1) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(2.0) }
+        expect(2) { doubleArrayOf(1.0, 2.0, 3.0).indexOf(3.0) } 
+    }
+
+    @Test
+    fun indexOf_BooleanArray() {
+        expect(0) { booleanArrayOf(true, false).indexOf(true) }
+        expect(1) { booleanArrayOf(true, false).indexOf(false) }
+        expect(-1) { booleanArrayOf(true).indexOf(false) } 
+    }
+
+    @Test
+    fun indexOf_CharArray() {
+        expect(-1) { charArrayOf('a', 'b', 'c').indexOf('z') }
+        expect(0) { charArrayOf('a', 'b', 'c').indexOf('a') }
+        expect(1) { charArrayOf('a', 'b', 'c').indexOf('b') }
+        expect(2) { charArrayOf('a', 'b', 'c').indexOf('c') } 
+    }
+
+    @Test
+    fun indexOfFirst_Array() {
+        expect(-1) { arrayOf<Int>(1, 2, 3).indexOfFirst { it == 0 } }
+        expect(0) { arrayOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { arrayOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { arrayOf<Int>(1, 2, 3).indexOfFirst { it == 3 } }
+        expect(-1) { arrayOf("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
+        expect(0) { arrayOf("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
+        expect(1) { arrayOf("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
+        expect(2) { arrayOf("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
+    }
+
+    @Test
+    fun indexOfFirst_ByteArray() {
+        expect(-1) { byteArrayOf(1, 2, 3).indexOfFirst { it == 0.toByte() } }
+        expect(0) { byteArrayOf(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { byteArrayOf(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { byteArrayOf(1, 2, 3).indexOfFirst { it == 3.toByte() } }
+    }
+
+    @Test
+    fun indexOfFirst_ShortArray() {
+        expect(-1) { shortArrayOf(1, 2, 3).indexOfFirst { it == 0.toShort() } }
+        expect(0) { shortArrayOf(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { shortArrayOf(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { shortArrayOf(1, 2, 3).indexOfFirst { it == 3.toShort() } }
+    }
+
+    @Test
+    fun indexOfFirst_IntArray() {
+        expect(-1) { intArrayOf(1, 2, 3).indexOfFirst { it == 0 } }
+        expect(0) { intArrayOf(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { intArrayOf(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { intArrayOf(1, 2, 3).indexOfFirst { it == 3 } }
+    }
+
+    @Test
+    fun indexOfFirst_LongArray() {
+        expect(-1) { longArrayOf(1L, 2L, 3L).indexOfFirst { it == 0L } }
+        expect(0) { longArrayOf(1L, 2L, 3L).indexOfFirst { it % 2L == 1L } }
+        expect(1) { longArrayOf(1L, 2L, 3L).indexOfFirst { it % 2L == 0L } }
+        expect(2) { longArrayOf(1L, 2L, 3L).indexOfFirst { it == 3L } }
+    }
+
+    @Test
+    fun indexOfFirst_FloatArray() {
+        expect(-1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOfFirst { it == 0.0f } }
+        expect(0) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOfFirst { it % 2.0f == 1.0f } }
+        expect(1) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOfFirst { it % 2.0f == 0.0f } }
+        expect(2) { floatArrayOf(1.0f, 2.0f, 3.0f).indexOfFirst { it == 3.0f } }
+    }
+
+    @Test
+    fun indexOfFirst_DoubleArray() {
+        expect(-1) { doubleArrayOf(1.0, 2.0, 3.0).indexOfFirst { it == 0.0 } }
+        expect(0) { doubleArrayOf(1.0, 2.0, 3.0).indexOfFirst { it % 2.0 == 1.0 } }
+        expect(1) { doubleArrayOf(1.0, 2.0, 3.0).indexOfFirst { it % 2.0 == 0.0 } }
+        expect(2) { doubleArrayOf(1.0, 2.0, 3.0).indexOfFirst { it == 3.0 } }
+    }
+
+    @Test
+    fun indexOfFirst_BooleanArray() {
+        expect(0) { booleanArrayOf(true, false, false, true).indexOfFirst { it } }
+        expect(1) { booleanArrayOf(true, false, false, true).indexOfFirst { !it } }
+        expect(-1) { booleanArrayOf(true, true).indexOfFirst { !it } } 
+    }
+
+    @Test
+    fun indexOfFirst_CharArray() {
+        expect(-1) { charArrayOf('a', 'b', 'c').indexOfFirst { it == 'z' } }
+        expect(0) { charArrayOf('a', 'b', 'c').indexOfFirst { it < 'c' } }
+        expect(1) { charArrayOf('a', 'b', 'c').indexOfFirst { it > 'a' } }
+        expect(2) { charArrayOf('a', 'b', 'c').indexOfFirst { it != 'a' && it != 'b' } } 
+    }
+
+    @Test
+    fun copyInto_Array() {
+        val dest = arrayOf("a", "b", "c")
+        val newValues = arrayOf("e", "f", "g")
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = arrayOf("f", "g", "c")
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = arrayOf("g", "c", "c")
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = arrayOf("g", "g", "c")
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_ByteArray() {
+        val dest = byteArrayOf(1, 2, 3)
+        val newValues = byteArrayOf(4, 5, 6)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = byteArrayOf(5, 6, 3)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = byteArrayOf(6, 3, 3)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = byteArrayOf(6, 6, 3)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_ShortArray() {
+        val dest = shortArrayOf(1, 2, 3)
+        val newValues = shortArrayOf(4, 5, 6)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = shortArrayOf(5, 6, 3)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = shortArrayOf(6, 3, 3)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = shortArrayOf(6, 6, 3)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_IntArray() {
+        val dest = intArrayOf(1, 2, 3)
+        val newValues = intArrayOf(4, 5, 6)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = intArrayOf(5, 6, 3)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = intArrayOf(6, 3, 3)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = intArrayOf(6, 6, 3)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_LongArray() {
+        val dest = longArrayOf(1L, 2L, 3L)
+        val newValues = longArrayOf(4L, 5L, 6L)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = longArrayOf(5L, 6L, 3L)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = longArrayOf(6L, 3L, 3L)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = longArrayOf(6L, 6L, 3L)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_FloatArray() {
+        val dest = floatArrayOf(1.0f, 2.0f, 3.0f)
+        val newValues = floatArrayOf(4.0f, 5.0f, 6.0f)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = floatArrayOf(5.0f, 6.0f, 3.0f)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = floatArrayOf(6.0f, 3.0f, 3.0f)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = floatArrayOf(6.0f, 6.0f, 3.0f)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_DoubleArray() {
+        val dest = doubleArrayOf(1.0, 2.0, 3.0)
+        val newValues = doubleArrayOf(4.0, 5.0, 6.0)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = doubleArrayOf(5.0, 6.0, 3.0)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = doubleArrayOf(6.0, 3.0, 3.0)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = doubleArrayOf(6.0, 6.0, 3.0)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_CharArray() {
+        val dest = charArrayOf('a', 'b', 'c')
+        val newValues = charArrayOf('e', 'f', 'g')
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = charArrayOf('f', 'g', 'c')
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = charArrayOf('g', 'c', 'c')
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = charArrayOf('g', 'g', 'c')
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}") 
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun reverse_Array() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toString() }.toTypedArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_ByteArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toByte() }.toByteArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_ShortArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toShort() }.toShortArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_IntArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toInt() }.toIntArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_LongArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toLong() }.toLongArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_FloatArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toFloat() }.toFloatArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_DoubleArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toDouble() }.toDoubleArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_BooleanArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it % 2 == 0 }.toBooleanArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_CharArray() {
+        val arrays = (0..4).map { n -> (1..n).map { 'a' + it }.toCharArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverseRange_Array() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toString() }.toTypedArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_ByteArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toByte() }.toByteArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_ShortArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toShort() }.toShortArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_IntArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toInt() }.toIntArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_LongArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toLong() }.toLongArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_FloatArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toFloat() }.toFloatArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_DoubleArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toDouble() }.toDoubleArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_BooleanArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it % 2 == 0 }.toBooleanArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_CharArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { 'a' + it }.toCharArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reversed_Array() {
+        assertEquals(listOf<Int>(3, 2, 1), arrayOf<Int>(1, 2, 3).reversed())
+        assertEquals(listOf("3", "2", "1"), arrayOf("1", "2", "3").reversed())
+    }
+
+    @Test
+    fun reversed_ByteArray() {
+        assertEquals(listOf<Byte>(3, 2, 1), byteArrayOf(1, 2, 3).reversed())
+    }
+
+    @Test
+    fun reversed_ShortArray() {
+        assertEquals(listOf<Short>(3, 2, 1), shortArrayOf(1, 2, 3).reversed())
+    }
+
+    @Test
+    fun reversed_IntArray() {
+        assertEquals(listOf<Int>(3, 2, 1), intArrayOf(1, 2, 3).reversed())
+    }
+
+    @Test
+    fun reversed_LongArray() {
+        assertEquals(listOf<Long>(3L, 2L, 1L), longArrayOf(1L, 2L, 3L).reversed())
+    }
+
+    @Test
+    fun reversed_FloatArray() {
+        assertEquals(listOf<Float>(3.0f, 2.0f, 1.0f), floatArrayOf(1.0f, 2.0f, 3.0f).reversed())
+    }
+
+    @Test
+    fun reversed_DoubleArray() {
+        assertEquals(listOf<Double>(3.0, 2.0, 1.0), doubleArrayOf(1.0, 2.0, 3.0).reversed())
+    }
+
+    @Test
+    fun reversed_BooleanArray() {
+        assertEquals(listOf(false, false, true), booleanArrayOf(true, false, false).reversed())
+    }
+
+    @Test
+    fun reversed_CharArray() {
+        assertEquals(listOf('3', '2', '1'), charArrayOf('1', '2', '3').reversed())
+    }
+
+    @Test
+    fun reversedArray_Array() {
+        assertArrayContentEquals(arrayOf<Int>(3, 2, 1), arrayOf<Int>(1, 2, 3).reversedArray())
+        assertArrayContentEquals(arrayOf("3", "2", "1"), arrayOf("1", "2", "3").reversedArray())
+    }
+
+    @Test
+    fun reversedArray_ByteArray() {
+        assertArrayContentEquals(byteArrayOf(3, 2, 1), byteArrayOf(1, 2, 3).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_ShortArray() {
+        assertArrayContentEquals(shortArrayOf(3, 2, 1), shortArrayOf(1, 2, 3).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_IntArray() {
+        assertArrayContentEquals(intArrayOf(3, 2, 1), intArrayOf(1, 2, 3).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_LongArray() {
+        assertArrayContentEquals(longArrayOf(3L, 2L, 1L), longArrayOf(1L, 2L, 3L).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_FloatArray() {
+        assertArrayContentEquals(floatArrayOf(3.0f, 2.0f, 1.0f), floatArrayOf(1.0f, 2.0f, 3.0f).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_DoubleArray() {
+        assertArrayContentEquals(doubleArrayOf(3.0, 2.0, 1.0), doubleArrayOf(1.0, 2.0, 3.0).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_BooleanArray() {
+        assertArrayContentEquals(booleanArrayOf(false, false, true), booleanArrayOf(true, false, false).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_CharArray() {
+        assertArrayContentEquals(charArrayOf('3', '2', '1'), charArrayOf('1', '2', '3').reversedArray())
+    }
+
+    @Test
+    fun shuffle_Array() {
+        fun test(data: Array<*>) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(Array(100) { it.toInt() })
+        test(arrayOf(1, "x", null, Any(), 'a', 2u, 5.0))
+    }
+
+    @Test
+    fun shuffle_ByteArray() {
+        fun test(data: ByteArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(ByteArray(100) { it.toByte() })
+    }
+
+    @Test
+    fun shuffle_ShortArray() {
+        fun test(data: ShortArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(ShortArray(100) { it.toShort() })
+    }
+
+    @Test
+    fun shuffle_IntArray() {
+        fun test(data: IntArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(IntArray(100) { it.toInt() })
+    }
+
+    @Test
+    fun shuffle_LongArray() {
+        fun test(data: LongArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(LongArray(100) { it.toLong() })
+    }
+
+    @Test
+    fun shuffle_FloatArray() {
+        fun test(data: FloatArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(FloatArray(100) { it.toFloat() })
+    }
+
+    @Test
+    fun shuffle_DoubleArray() {
+        fun test(data: DoubleArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(DoubleArray(100) { it.toDouble() })
+    }
+
+    @Test
+    fun shuffle_BooleanArray() {
+        fun test(data: BooleanArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(BooleanArray(100) { it % 2 == 0 })
+    }
+
+    @Test
+    fun shuffle_CharArray() {
+        fun test(data: CharArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(CharArray(100) { it.toChar() })
+    }
+
+    @Test
+    fun shuffleRandom_Array() {
+        fun test(data: Array<*>) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(Array(16) { it.toInt() })
+        test(arrayOf(1, "x", null, Any(), 'a', 2u, 5.0))
+    }
+
+    @Test
+    fun shuffleRandom_ByteArray() {
+        fun test(data: ByteArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(ByteArray(16) { it.toByte() })
+    }
+
+    @Test
+    fun shuffleRandom_ShortArray() {
+        fun test(data: ShortArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(ShortArray(16) { it.toShort() })
+    }
+
+    @Test
+    fun shuffleRandom_IntArray() {
+        fun test(data: IntArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(IntArray(16) { it.toInt() })
+    }
+
+    @Test
+    fun shuffleRandom_LongArray() {
+        fun test(data: LongArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(LongArray(16) { it.toLong() })
+    }
+
+    @Test
+    fun shuffleRandom_FloatArray() {
+        fun test(data: FloatArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(FloatArray(16) { it.toFloat() })
+    }
+
+    @Test
+    fun shuffleRandom_DoubleArray() {
+        fun test(data: DoubleArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(DoubleArray(16) { it.toDouble() })
+    }
+
+    @Test
+    fun shuffleRandom_BooleanArray() {
+        fun test(data: BooleanArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(BooleanArray(16) { it % 2 == 0 })
+    }
+
+    @Test
+    fun shuffleRandom_CharArray() {
+        fun test(data: CharArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(CharArray(16) { it.toChar() })
+    }
+
+    @Test
+    fun sort_Array() {
+        val data = arrayOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(arrayOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE), data)
+        val strings = arrayOf("9", "80", "all", "Foo")
+        strings.sort()
+        assertArrayContentEquals(arrayOf("80", "9", "Foo", "all"), strings) 
+    }
+
+    @Test
+    fun sort_ByteArray() {
+        val data = byteArrayOf(5, 2, 1, 9, 80, Byte.MIN_VALUE, Byte.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(byteArrayOf(Byte.MIN_VALUE, 1, 2, 5, 9, 80, Byte.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_ShortArray() {
+        val data = shortArrayOf(5, 2, 1, 9, 80, Short.MIN_VALUE, Short.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(shortArrayOf(Short.MIN_VALUE, 1, 2, 5, 9, 80, Short.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_IntArray() {
+        val data = intArrayOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(intArrayOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_LongArray() {
+        val data = longArrayOf(5L, 2L, 1L, 9L, 80L, Long.MIN_VALUE, Long.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(longArrayOf(Long.MIN_VALUE, 1L, 2L, 5L, 9L, 80L, Long.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_FloatArray() {
+        val data = floatArrayOf(5.0f, 2.0f, 1.0f, 9.0f, 80.0f, Float.MIN_VALUE, Float.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(floatArrayOf(Float.MIN_VALUE, 1.0f, 2.0f, 5.0f, 9.0f, 80.0f, Float.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_DoubleArray() {
+        val data = doubleArrayOf(5.0, 2.0, 1.0, 9.0, 80.0, Double.MIN_VALUE, Double.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(doubleArrayOf(Double.MIN_VALUE, 1.0, 2.0, 5.0, 9.0, 80.0, Double.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_CharArray() {
+        val data = charArrayOf('d', 'c', 'E', 'a', '\u0000', '\uFFFF')
+        data.sort()
+        assertArrayContentEquals(charArrayOf('\u0000', 'E', 'a', 'c', 'd', '\uFFFF'), data)
+    }
+
+    @Test
+    fun sortBy_Array() {
+        val data = arrayOf("aa" to 20, "ab" to 3, "aa" to 3)
+        data.sortBy { it.second }
+        assertArrayContentEquals(arrayOf("ab" to 3, "aa" to 3, "aa" to 20), data)
+        data.sortBy { it.first }
+        assertArrayContentEquals(arrayOf("aa" to 3, "aa" to 20, "ab" to 3), data)
+        data.sortBy { (it.first + it.second).length }
+        assertArrayContentEquals(arrayOf("aa" to 3, "ab" to 3, "aa" to 20), data)
+    }
+
+    @Test
+    fun sortByDescending_Array() {
+        val data = arrayOf("aa" to 20, "ab" to 3, "aa" to 3)
+        data.sortByDescending { it.second }
+        assertArrayContentEquals(arrayOf("aa" to 20, "ab" to 3, "aa" to 3), data)
+        data.sortByDescending { it.first }
+        assertArrayContentEquals(arrayOf("ab" to 3, "aa" to 20, "aa" to 3), data)
+        data.sortByDescending { (it.first + it.second).length }
+        assertArrayContentEquals(arrayOf("aa" to 20, "ab" to 3, "aa" to 3), data)
+    }
+
+    @Test
+    fun sortDescending_Array() {
+        val data = arrayOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(arrayOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE).reversedArray(), data)
+        val strings = arrayOf("9", "80", "all", "Foo")
+        strings.sortDescending()
+        assertArrayContentEquals(arrayOf("80", "9", "Foo", "all").reversedArray(), strings) 
+    }
+
+    @Test
+    fun sortDescending_ByteArray() {
+        val data = byteArrayOf(5, 2, 1, 9, 80, Byte.MIN_VALUE, Byte.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(byteArrayOf(Byte.MIN_VALUE, 1, 2, 5, 9, 80, Byte.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_ShortArray() {
+        val data = shortArrayOf(5, 2, 1, 9, 80, Short.MIN_VALUE, Short.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(shortArrayOf(Short.MIN_VALUE, 1, 2, 5, 9, 80, Short.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_IntArray() {
+        val data = intArrayOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(intArrayOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_LongArray() {
+        val data = longArrayOf(5L, 2L, 1L, 9L, 80L, Long.MIN_VALUE, Long.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(longArrayOf(Long.MIN_VALUE, 1L, 2L, 5L, 9L, 80L, Long.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_FloatArray() {
+        val data = floatArrayOf(5.0f, 2.0f, 1.0f, 9.0f, 80.0f, Float.MIN_VALUE, Float.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(floatArrayOf(Float.MIN_VALUE, 1.0f, 2.0f, 5.0f, 9.0f, 80.0f, Float.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_DoubleArray() {
+        val data = doubleArrayOf(5.0, 2.0, 1.0, 9.0, 80.0, Double.MIN_VALUE, Double.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(doubleArrayOf(Double.MIN_VALUE, 1.0, 2.0, 5.0, 9.0, 80.0, Double.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_CharArray() {
+        val data = charArrayOf('d', 'c', 'E', 'a', '\u0000', '\uFFFF')
+        data.sortDescending()
+        assertArrayContentEquals(charArrayOf('\u0000', 'E', 'a', 'c', 'd', '\uFFFF').reversedArray(), data)
+    }
+
+    @Test
+    fun sorted_Array() {
+        arrayOf<Int>(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        arrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        arrayOf("ac", "aD", "aba").sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_ByteArray() {
+        byteArrayOf(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        byteArrayOf(1, Byte.MAX_VALUE, Byte.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_ShortArray() {
+        shortArrayOf(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        shortArrayOf(1, Short.MAX_VALUE, Short.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_IntArray() {
+        intArrayOf(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        intArrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_LongArray() {
+        longArrayOf(3L, 7L, 1L).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        longArrayOf(1L, Long.MAX_VALUE, Long.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_FloatArray() {
+        floatArrayOf(3.0f, 7.0f, 1.0f).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        floatArrayOf(1.0f, Float.MAX_VALUE, Float.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        floatArrayOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, -Float.MAX_VALUE, 1.0f, -1.0f, 
+                        Float.MIN_VALUE, -Float.MIN_VALUE, 0.0f, -0.0f, Float.NaN).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_DoubleArray() {
+        doubleArrayOf(3.0, 7.0, 1.0).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        doubleArrayOf(1.0, Double.MAX_VALUE, Double.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        doubleArrayOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, -Double.MAX_VALUE, 1.0, -1.0, 
+                        Double.MIN_VALUE, -Double.MIN_VALUE, 0.0, -0.0, Double.NaN).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_CharArray() {
+        charArrayOf('a', 'D', 'c').sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_Array() {
+        arrayOf<Int>(3, 7, 1).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        arrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        arrayOf("ac", "aD", "aba").sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_ByteArray() {
+        byteArrayOf(3, 7, 1).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        byteArrayOf(1, Byte.MAX_VALUE, Byte.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_ShortArray() {
+        shortArrayOf(3, 7, 1).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        shortArrayOf(1, Short.MAX_VALUE, Short.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_IntArray() {
+        intArrayOf(3, 7, 1).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        intArrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_LongArray() {
+        longArrayOf(3L, 7L, 1L).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        longArrayOf(1L, Long.MAX_VALUE, Long.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_FloatArray() {
+        floatArrayOf(3.0f, 7.0f, 1.0f).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        floatArrayOf(1.0f, Float.MAX_VALUE, Float.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        floatArrayOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, -Float.MAX_VALUE, 1.0f, -1.0f, 
+                        Float.MIN_VALUE, -Float.MIN_VALUE, 0.0f, -0.0f, Float.NaN).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_DoubleArray() {
+        doubleArrayOf(3.0, 7.0, 1.0).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        doubleArrayOf(1.0, Double.MAX_VALUE, Double.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        doubleArrayOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, -Double.MAX_VALUE, 1.0, -1.0, 
+                        Double.MIN_VALUE, -Double.MIN_VALUE, 0.0, -0.0, Double.NaN).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_CharArray() {
+        charArrayOf('a', 'D', 'c').sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_Array() {
+        arrayOf<Int>(3, 7, 1).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        arrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        arrayOf("ac", "aD", "aba").sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_ByteArray() {
+        byteArrayOf(3, 7, 1).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        byteArrayOf(1, Byte.MAX_VALUE, Byte.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_ShortArray() {
+        shortArrayOf(3, 7, 1).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        shortArrayOf(1, Short.MAX_VALUE, Short.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_IntArray() {
+        intArrayOf(3, 7, 1).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        intArrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_LongArray() {
+        longArrayOf(3L, 7L, 1L).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        longArrayOf(1L, Long.MAX_VALUE, Long.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_FloatArray() {
+        floatArrayOf(3.0f, 7.0f, 1.0f).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        floatArrayOf(1.0f, Float.MAX_VALUE, Float.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        floatArrayOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, -Float.MAX_VALUE, 1.0f, -1.0f, 
+                        Float.MIN_VALUE, -Float.MIN_VALUE, 0.0f, -0.0f, Float.NaN).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_DoubleArray() {
+        doubleArrayOf(3.0, 7.0, 1.0).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        doubleArrayOf(1.0, Double.MAX_VALUE, Double.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        doubleArrayOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, -Double.MAX_VALUE, 1.0, -1.0, 
+                        Double.MIN_VALUE, -Double.MIN_VALUE, 0.0, -0.0, Double.NaN).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_CharArray() {
+        charArrayOf('a', 'D', 'c').sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayWith_Array() {
+        val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
+        arrayOf<Int>(0, 1, 2, 3, 4, 5).sortedArrayWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+        val comparator1 = compareBy<String> { it.toUpperCase().reversed() }
+        val data = arrayOf("cat", "dad", "BAD")
+        assertArrayContentEquals(arrayOf("BAD", "dad", "cat"), data.sortedArrayWith(comparator1))
+        assertArrayContentEquals(arrayOf("cat", "dad", "BAD"), data.sortedArrayWith(comparator1.reversed()))
+        assertArrayContentEquals(arrayOf("BAD", "dad", "cat"), data.sortedArrayWith(comparator1.reversed().reversed()))
+    }
+
+    @Test
+    fun sortedBy_Array() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = arrayOf<Int>(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0), indices.sortedBy { values[it.toInt()] }) 
+        assertEquals(listOf("two" to 3, "three" to 20), arrayOf("three" to 20, "two" to 3).sortedBy { it.second })
+        assertEquals(listOf("three" to 20, "two" to 3), arrayOf("three" to 20, "two" to 3).sortedBy { it.first })
+    }
+
+    @Test
+    fun sortedBy_ByteArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = byteArrayOf(0, 1, 2)
+        assertEquals(listOf<Byte>(1, 2, 0), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedBy_ShortArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = shortArrayOf(0, 1, 2)
+        assertEquals(listOf<Short>(1, 2, 0), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedBy_IntArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = intArrayOf(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedBy_LongArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = longArrayOf(0L, 1L, 2L)
+        assertEquals(listOf<Long>(1L, 2L, 0L), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedBy_FloatArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = floatArrayOf(0.0f, 1.0f, 2.0f)
+        assertEquals(listOf<Float>(1.0f, 2.0f, 0.0f), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedBy_DoubleArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = doubleArrayOf(0.0, 1.0, 2.0)
+        assertEquals(listOf<Double>(1.0, 2.0, 0.0), indices.sortedBy { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_Array() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = arrayOf<Int>(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+        assertEquals(listOf("two" to 3, "three" to 20).reversed(), arrayOf("three" to 20, "two" to 3).sortedByDescending { it.second })
+        assertEquals(listOf("three" to 20, "two" to 3).reversed(), arrayOf("three" to 20, "two" to 3).sortedByDescending { it.first })
+    }
+
+    @Test
+    fun sortedByDescending_ByteArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = byteArrayOf(0, 1, 2)
+        assertEquals(listOf<Byte>(1, 2, 0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_ShortArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = shortArrayOf(0, 1, 2)
+        assertEquals(listOf<Short>(1, 2, 0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_IntArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = intArrayOf(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_LongArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = longArrayOf(0L, 1L, 2L)
+        assertEquals(listOf<Long>(1L, 2L, 0L).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_FloatArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = floatArrayOf(0.0f, 1.0f, 2.0f)
+        assertEquals(listOf<Float>(1.0f, 2.0f, 0.0f).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedByDescending_DoubleArray() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = doubleArrayOf(0.0, 1.0, 2.0)
+        assertEquals(listOf<Double>(1.0, 2.0, 0.0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+    }
+
+    @Test
+    fun sortedDescending_Array() {
+        arrayOf<Int>(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        arrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        arrayOf("ac", "aD", "aba").sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_ByteArray() {
+        byteArrayOf(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        byteArrayOf(1, Byte.MAX_VALUE, Byte.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_ShortArray() {
+        shortArrayOf(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        shortArrayOf(1, Short.MAX_VALUE, Short.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_IntArray() {
+        intArrayOf(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        intArrayOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_LongArray() {
+        longArrayOf(3L, 7L, 1L).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        longArrayOf(1L, Long.MAX_VALUE, Long.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_FloatArray() {
+        floatArrayOf(3.0f, 7.0f, 1.0f).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        floatArrayOf(1.0f, Float.MAX_VALUE, Float.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        floatArrayOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, -Float.MAX_VALUE, 1.0f, -1.0f, 
+                        Float.MIN_VALUE, -Float.MIN_VALUE, 0.0f, -0.0f, Float.NaN).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_DoubleArray() {
+        doubleArrayOf(3.0, 7.0, 1.0).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        doubleArrayOf(1.0, Double.MAX_VALUE, Double.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        doubleArrayOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, -Double.MAX_VALUE, 1.0, -1.0, 
+                        Double.MIN_VALUE, -Double.MIN_VALUE, 0.0, -0.0, Double.NaN).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_CharArray() {
+        charArrayOf('a', 'D', 'c').sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedWith_Array() {
+        val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
+        arrayOf<Int>(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+        val comparator1 = compareBy<String> { it.toUpperCase().reversed() }
+        val data = arrayOf("cat", "dad", "BAD")
+        assertEquals(listOf("BAD", "dad", "cat"), data.sortedWith(comparator1))
+        assertEquals(listOf("cat", "dad", "BAD"), data.sortedWith(comparator1.reversed()))
+        assertEquals(listOf("BAD", "dad", "cat"), data.sortedWith(comparator1.reversed().reversed()))
+    }
+
+    @Test
+    fun sortedWith_ByteArray() {
+        val comparator = compareBy { it: Byte -> it % 3 }.thenByDescending { it }
+        byteArrayOf(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+    @Test
+    fun sortedWith_ShortArray() {
+        val comparator = compareBy { it: Short -> it % 3 }.thenByDescending { it }
+        shortArrayOf(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+    @Test
+    fun sortedWith_IntArray() {
+        val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
+        intArrayOf(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+    @Test
+    fun sortedWith_LongArray() {
+        val comparator = compareBy { it: Long -> it % 3L }.thenByDescending { it }
+        longArrayOf(0L, 1L, 2L, 3L, 4L, 5L).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+    @Test
+    fun sortedWith_FloatArray() {
+        val comparator = compareBy { it: Float -> it % 3.0f }.thenByDescending { it }
+        floatArrayOf(0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+    @Test
+    fun sortedWith_DoubleArray() {
+        val comparator = compareBy { it: Double -> it % 3.0 }.thenByDescending { it }
+        doubleArrayOf(0.0, 1.0, 2.0, 3.0, 4.0, 5.0).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_CollectionsTest.kt b/libraries/stdlib/test/generated/_CollectionsTest.kt
new file mode 100644
index 0000000..f59c2ce
--- /dev/null
+++ b/libraries/stdlib/test/generated/_CollectionsTest.kt
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2010-2020 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.collections
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import test.comparisons.STRING_CASE_INSENSITIVE_ORDER
+import kotlin.random.*
+import kotlin.test.*
+
+class _CollectionsTest {
+    @Test
+    fun foldIndexed_Iterable() {
+        expect(8) { listOf<Int>(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toInt() * e } }
+        expect(10) { listOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { listOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toInt() + e) } }
+        expect(" 0-1 1-2 2-3") { listOf<Int>(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = listOf<Int>(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect(0) {
+            val numbers = listOf<Int>()
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = listOf<Int>(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_List() {
+        expect(8) { listOf<Int>(1, 2, 3).foldRightIndexed(0) { i, e, acc -> acc + i.toInt() * e } }
+        expect(10) { listOf<Int>(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15) { listOf<Int>(1, 2, 3).foldRightIndexed(1) { i, e, acc -> acc * (i.toInt() + e) } }
+        expect(" 2-3 1-2 0-1") { listOf<Int>(1, 2, 3).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = listOf<Int>(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun maxByOrNull_Iterable() {
+        assertEquals(null, listOf<Int>().maxByOrNull { it })
+        assertEquals(1, listOf<Int>(1).maxByOrNull { it })
+        assertEquals(3, listOf<Int>(3, 2).maxByOrNull { it * it })
+        assertEquals(3, listOf<Int>(3, 2).maxByOrNull { "a" })
+        assertEquals(3, listOf<Int>(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, listOf<Int>(2, 3).maxByOrNull { -it })
+        assertEquals('b', listOf('a', 'b').maxByOrNull { "x$it" })
+        assertEquals("abc", listOf("b", "abc").maxByOrNull { it.length })
+    }
+
+    @Test
+    fun maxWithOrNull_Iterable() {
+        assertEquals(null, listOf<Int>().maxWithOrNull(naturalOrder()))
+        assertEquals(1, listOf<Int>(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, listOf<Int>(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+        assertEquals("B", listOf("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun minByOrNull_Iterable() {
+        assertEquals(null, listOf<Int>().minByOrNull { it })
+        assertEquals(1, listOf<Int>(1).minByOrNull { it })
+        assertEquals(2, listOf<Int>(3, 2).minByOrNull { it * it })
+        assertEquals(3, listOf<Int>(3, 2).minByOrNull { "a" })
+        assertEquals(2, listOf<Int>(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, listOf<Int>(2, 3).minByOrNull { -it })
+        assertEquals('a', listOf('a', 'b').minByOrNull { "x$it" })
+        assertEquals("b", listOf("b", "abc").minByOrNull { it.length })
+    }
+
+    @Test
+    fun minWithOrNull_Iterable() {
+        assertEquals(null, listOf<Int>().minWithOrNull(naturalOrder()))
+        assertEquals(1, listOf<Int>(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, listOf<Int>(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+        assertEquals("a", listOf("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun indexOf_List() {
+        expect(-1) { listOf<Int>(1, 2, 3).indexOf(0) }
+        expect(0) { listOf<Int>(1, 2, 3).indexOf(1) }
+        expect(1) { listOf<Int>(1, 2, 3).indexOf(2) }
+        expect(2) { listOf<Int>(1, 2, 3).indexOf(3) } 
+        expect(-1) { listOf("cat", "dog", "bird").indexOf("mouse") }
+        expect(0) { listOf("cat", "dog", "bird").indexOf("cat") }
+        expect(1) { listOf("cat", "dog", "bird").indexOf("dog") }
+        expect(2) { listOf("cat", "dog", "bird").indexOf("bird") }
+        expect(0) { listOf(null, "dog", null).indexOf(null as String?)}
+    }
+
+    @Test
+    fun indexOfFirst_List() {
+        expect(-1) { listOf<Int>(1, 2, 3).indexOfFirst { it == 0 } }
+        expect(0) { listOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { listOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { listOf<Int>(1, 2, 3).indexOfFirst { it == 3 } }
+        expect(-1) { listOf("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
+        expect(0) { listOf("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
+        expect(1) { listOf("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
+        expect(2) { listOf("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
+    }
+
+    @Test
+    fun reversed_Iterable() {
+        assertEquals(listOf<Int>(3, 2, 1), listOf<Int>(1, 2, 3).reversed())
+        assertEquals(listOf("3", "2", "1"), listOf("1", "2", "3").reversed())
+    }
+
+    @Test
+    fun shuffle_List() {
+        fun test(data: MutableList<*>) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(MutableList(100) { it.toInt() })
+        test(mutableListOf(1, "x", null, Any(), 'a', 2u, 5.0))
+    }
+
+    @Test
+    fun shuffleRandom_List() {
+        fun test(data: MutableList<*>) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(MutableList(16) { it.toInt() })
+        test(mutableListOf(1, "x", null, Any(), 'a', 2u, 5.0))
+    }
+
+    @Test
+    fun sort_List() {
+        val data = mutableListOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sort()
+        assertEquals(listOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE), data)
+        val strings = mutableListOf("9", "80", "all", "Foo")
+        strings.sort()
+        assertEquals(listOf("80", "9", "Foo", "all"), strings) 
+    }
+
+    @Test
+    fun sortBy_List() {
+        val data = mutableListOf("aa" to 20, "ab" to 3, "aa" to 3)
+        data.sortBy { it.second }
+        assertEquals(listOf("ab" to 3, "aa" to 3, "aa" to 20), data)
+        data.sortBy { it.first }
+        assertEquals(listOf("aa" to 3, "aa" to 20, "ab" to 3), data)
+        data.sortBy { (it.first + it.second).length }
+        assertEquals(listOf("aa" to 3, "ab" to 3, "aa" to 20), data)
+    }
+
+    @Test
+    fun sortByDescending_List() {
+        val data = mutableListOf("aa" to 20, "ab" to 3, "aa" to 3)
+        data.sortByDescending { it.second }
+        assertEquals(listOf("aa" to 20, "ab" to 3, "aa" to 3), data)
+        data.sortByDescending { it.first }
+        assertEquals(listOf("ab" to 3, "aa" to 20, "aa" to 3), data)
+        data.sortByDescending { (it.first + it.second).length }
+        assertEquals(listOf("aa" to 20, "ab" to 3, "aa" to 3), data)
+    }
+
+    @Test
+    fun sortDescending_List() {
+        val data = mutableListOf(5, 2, 1, 9, 80, Int.MIN_VALUE, Int.MAX_VALUE)
+        data.sortDescending()
+        assertEquals(listOf(Int.MIN_VALUE, 1, 2, 5, 9, 80, Int.MAX_VALUE).reversed(), data)
+        val strings = mutableListOf("9", "80", "all", "Foo")
+        strings.sortDescending()
+        assertEquals(listOf("80", "9", "Foo", "all").reversed(), strings) 
+    }
+
+    @Test
+    fun sorted_Iterable() {
+        listOf<Int>(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        listOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        listOf("ac", "aD", "aba").sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedBy_List() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = listOf<Int>(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0), indices.sortedBy { values[it.toInt()] }) 
+        assertEquals(listOf("two" to 3, "three" to 20), listOf("three" to 20, "two" to 3).sortedBy { it.second })
+        assertEquals(listOf("three" to 20, "two" to 3), listOf("three" to 20, "two" to 3).sortedBy { it.first })
+    }
+
+    @Test
+    fun sortedByDescending_List() {
+        val values = arrayOf("ac", "aD", "aba")
+        val indices = listOf<Int>(0, 1, 2)
+        assertEquals(listOf<Int>(1, 2, 0).reversed(), indices.sortedByDescending { values[it.toInt()] }) 
+        assertEquals(listOf("two" to 3, "three" to 20).reversed(), listOf("three" to 20, "two" to 3).sortedByDescending { it.second })
+        assertEquals(listOf("three" to 20, "two" to 3).reversed(), listOf("three" to 20, "two" to 3).sortedByDescending { it.first })
+    }
+
+    @Test
+    fun sortedDescending_Iterable() {
+        listOf<Int>(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        listOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        listOf("ac", "aD", "aba").sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedWith_Iterable() {
+        val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
+        listOf<Int>(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+        val comparator1 = compareBy<String> { it.toUpperCase().reversed() }
+        val data = listOf("cat", "dad", "BAD")
+        assertEquals(listOf("BAD", "dad", "cat"), data.sortedWith(comparator1))
+        assertEquals(listOf("cat", "dad", "BAD"), data.sortedWith(comparator1.reversed()))
+        assertEquals(listOf("BAD", "dad", "cat"), data.sortedWith(comparator1.reversed().reversed()))
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_ComparisonsTest.kt b/libraries/stdlib/test/generated/_ComparisonsTest.kt
new file mode 100644
index 0000000..4815097
--- /dev/null
+++ b/libraries/stdlib/test/generated/_ComparisonsTest.kt
@@ -0,0 +1,463 @@
+/*
+ * Copyright 2010-2020 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.comparisons
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import kotlin.random.*
+import kotlin.test.*
+
+class _ComparisonsTest {
+    @Test
+    fun maxOf_2_Generic() {
+        expect(2) { maxOf<Int>(2, 1) }
+        expect(126) { maxOf<Int>(58, 126) }
+        expect(23) { maxOf<Int>(Random.nextInt(Int.MIN_VALUE, 23), 23) }
+        expect(Int.MAX_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE) }
+        expect(Int.MIN_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_Int() {
+        expect(2) { maxOf(2, 1) }
+        expect(126) { maxOf(58, 126) }
+        expect(23) { maxOf(Random.nextInt(Int.MIN_VALUE, 23), 23) }
+        expect(Int.MAX_VALUE) { maxOf(Int.MIN_VALUE, Int.MAX_VALUE) }
+        expect(Int.MIN_VALUE) { maxOf(Int.MIN_VALUE, Int.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_Long() {
+        expect(2L) { maxOf(2L, 1L) }
+        expect(126L) { maxOf(58L, 126L) }
+        expect(23L) { maxOf(Random.nextLong(Long.MIN_VALUE, 23L), 23L) }
+        expect(Long.MAX_VALUE) { maxOf(Long.MIN_VALUE, Long.MAX_VALUE) }
+        expect(Long.MIN_VALUE) { maxOf(Long.MIN_VALUE, Long.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_Byte() {
+        expect(2.toByte()) { maxOf(2.toByte(), 1.toByte()) }
+        expect(126.toByte()) { maxOf(58.toByte(), 126.toByte()) }
+        expect(23.toByte()) { maxOf(Random.nextInt(Byte.MIN_VALUE.toInt(), 23).toByte(), 23.toByte()) }
+        expect(Byte.MAX_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MAX_VALUE) }
+        expect(Byte.MIN_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_Short() {
+        expect(2.toShort()) { maxOf(2.toShort(), 1.toShort()) }
+        expect(126.toShort()) { maxOf(58.toShort(), 126.toShort()) }
+        expect(23.toShort()) { maxOf(Random.nextInt(Short.MIN_VALUE.toInt(), 23).toShort(), 23.toShort()) }
+        expect(Short.MAX_VALUE) { maxOf(Short.MIN_VALUE, Short.MAX_VALUE) }
+        expect(Short.MIN_VALUE) { maxOf(Short.MIN_VALUE, Short.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_Double() {
+        expect(2.0) { maxOf(2.0, 1.0) }
+        expect(126.0) { maxOf(58.0, 126.0) }
+        expect(23.0) { maxOf(Random.nextDouble(Double.MIN_VALUE, 23.0), 23.0) }
+        expect(Double.MAX_VALUE) { maxOf(Double.MIN_VALUE, Double.MAX_VALUE) }
+        expect(Double.MIN_VALUE) { maxOf(Double.MIN_VALUE, Double.MIN_VALUE) }
+            assertEquals(0.0, maxOf(0.0, -0.0))
+            assertEquals(0.0, maxOf(-0.0, 0.0))
+            assertEquals(Double.POSITIVE_INFINITY, maxOf(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY))
+            
+    }
+
+    @Test
+    fun maxOf_2_Float() {
+        expect(2.0f) { maxOf(2.0f, 1.0f) }
+        expect(126.0f) { maxOf(58.0f, 126.0f) }
+        expect(23.0f) { maxOf(Random.nextDouble(Float.MIN_VALUE.toDouble(), 23.0).toFloat(), 23.0f) }
+        expect(Float.MAX_VALUE) { maxOf(Float.MIN_VALUE, Float.MAX_VALUE) }
+        expect(Float.MIN_VALUE) { maxOf(Float.MIN_VALUE, Float.MIN_VALUE) }
+            assertEquals(0.0f, maxOf(0.0f, -0.0f))
+            assertEquals(0.0f, maxOf(-0.0f, 0.0f))
+            assertEquals(Float.POSITIVE_INFINITY, maxOf(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY))
+            
+    }
+
+    @Test
+    fun maxOf_3_Generic() {
+        expect(3) { maxOf<Int>(2, 1, 3) }
+        expect(126) { maxOf<Int>(58, 126, 55) }
+        expect(23) { maxOf<Int>(Random.nextInt(Int.MIN_VALUE, 23), 23, Random.nextInt(Int.MIN_VALUE, 23)) }
+        expect(Int.MIN_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE) }
+            expect(Int.MAX_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun maxOf_3_Int() {
+        expect(3) { maxOf(2, 1, 3) }
+        expect(126) { maxOf(58, 126, 55) }
+        expect(23) { maxOf(Random.nextInt(Int.MIN_VALUE, 23), 23, Random.nextInt(Int.MIN_VALUE, 23)) }
+        expect(Int.MIN_VALUE) { maxOf(Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE) }
+            expect(Int.MAX_VALUE) { maxOf(Int.MIN_VALUE, Int.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun maxOf_3_Long() {
+        expect(3L) { maxOf(2L, 1L, 3L) }
+        expect(126L) { maxOf(58L, 126L, 55L) }
+        expect(23L) { maxOf(Random.nextLong(Long.MIN_VALUE, 23L), 23L, Random.nextLong(Long.MIN_VALUE, 23L)) }
+        expect(Long.MIN_VALUE) { maxOf(Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE) }
+            expect(Long.MAX_VALUE) { maxOf(Long.MIN_VALUE, Long.MAX_VALUE, 0L) }
+            
+    }
+
+    @Test
+    fun maxOf_3_Byte() {
+        expect(3.toByte()) { maxOf(2.toByte(), 1.toByte(), 3.toByte()) }
+        expect(126.toByte()) { maxOf(58.toByte(), 126.toByte(), 55.toByte()) }
+        expect(23.toByte()) { maxOf(Random.nextInt(Byte.MIN_VALUE.toInt(), 23).toByte(), 23.toByte(), Random.nextInt(Byte.MIN_VALUE.toInt(), 23).toByte()) }
+        expect(Byte.MIN_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MIN_VALUE, Byte.MIN_VALUE) }
+            expect(Byte.MAX_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MAX_VALUE, 0.toByte()) }
+            
+    }
+
+    @Test
+    fun maxOf_3_Short() {
+        expect(3.toShort()) { maxOf(2.toShort(), 1.toShort(), 3.toShort()) }
+        expect(126.toShort()) { maxOf(58.toShort(), 126.toShort(), 55.toShort()) }
+        expect(23.toShort()) { maxOf(Random.nextInt(Short.MIN_VALUE.toInt(), 23).toShort(), 23.toShort(), Random.nextInt(Short.MIN_VALUE.toInt(), 23).toShort()) }
+        expect(Short.MIN_VALUE) { maxOf(Short.MIN_VALUE, Short.MIN_VALUE, Short.MIN_VALUE) }
+            expect(Short.MAX_VALUE) { maxOf(Short.MIN_VALUE, Short.MAX_VALUE, 0.toShort()) }
+            
+    }
+
+    @Test
+    fun maxOf_3_Double() {
+        expect(3.0) { maxOf(2.0, 1.0, 3.0) }
+        expect(126.0) { maxOf(58.0, 126.0, 55.0) }
+        expect(23.0) { maxOf(Random.nextDouble(Double.MIN_VALUE, 23.0), 23.0, Random.nextDouble(Double.MIN_VALUE, 23.0)) }
+        expect(Double.MIN_VALUE) { maxOf(Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE) }
+            expect(Double.MAX_VALUE) { maxOf(Double.MIN_VALUE, Double.MAX_VALUE, 0.0) }
+            assertEquals(0.0, maxOf(0.0, -0.0, -0.0))
+            assertEquals(0.0, maxOf(-0.0, 0.0, 0.0))
+            assertEquals(Double.POSITIVE_INFINITY, maxOf(Double.POSITIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun maxOf_3_Float() {
+        expect(3.0f) { maxOf(2.0f, 1.0f, 3.0f) }
+        expect(126.0f) { maxOf(58.0f, 126.0f, 55.0f) }
+        expect(23.0f) { maxOf(Random.nextDouble(Float.MIN_VALUE.toDouble(), 23.0).toFloat(), 23.0f, Random.nextDouble(Float.MIN_VALUE.toDouble(), 23.0).toFloat()) }
+        expect(Float.MIN_VALUE) { maxOf(Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE) }
+            expect(Float.MAX_VALUE) { maxOf(Float.MIN_VALUE, Float.MAX_VALUE, 0.0f) }
+            assertEquals(0.0f, maxOf(0.0f, -0.0f, -0.0f))
+            assertEquals(0.0f, maxOf(-0.0f, 0.0f, 0.0f))
+            assertEquals(Float.POSITIVE_INFINITY, maxOf(Float.POSITIVE_INFINITY, Float.MAX_VALUE, Float.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Generic() {
+        expect(10) { maxOf<Int>(2, 1, 3, 10) }
+        expect(126) { maxOf<Int>(58, 126, 55, 87) }
+        expect(23) { maxOf<Int>(Random.nextInt(Int.MIN_VALUE, 23), 23, Random.nextInt(Int.MIN_VALUE, 23), 21) }
+        expect(Int.MIN_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE) }
+            expect(Int.MAX_VALUE) { maxOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE, 0, 1) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Int() {
+        expect(10) { maxOf(2, 1, 3, 10) }
+        expect(126) { maxOf(58, 126, 55, 87) }
+        expect(23) { maxOf(Random.nextInt(Int.MIN_VALUE, 23), 23, Random.nextInt(Int.MIN_VALUE, 23), 21) }
+        expect(Int.MIN_VALUE) { maxOf(Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE) }
+            expect(Int.MAX_VALUE) { maxOf(Int.MIN_VALUE, Int.MAX_VALUE, 0, 1) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Long() {
+        expect(10L) { maxOf(2L, 1L, 3L, 10L) }
+        expect(126L) { maxOf(58L, 126L, 55L, 87L) }
+        expect(23L) { maxOf(Random.nextLong(Long.MIN_VALUE, 23L), 23L, Random.nextLong(Long.MIN_VALUE, 23L), 21L) }
+        expect(Long.MIN_VALUE) { maxOf(Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE) }
+            expect(Long.MAX_VALUE) { maxOf(Long.MIN_VALUE, Long.MAX_VALUE, 0L, 1L) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Byte() {
+        expect(10.toByte()) { maxOf(2.toByte(), 1.toByte(), 3.toByte(), 10.toByte()) }
+        expect(126.toByte()) { maxOf(58.toByte(), 126.toByte(), 55.toByte(), 87.toByte()) }
+        expect(23.toByte()) { maxOf(Random.nextInt(Byte.MIN_VALUE.toInt(), 23).toByte(), 23.toByte(), Random.nextInt(Byte.MIN_VALUE.toInt(), 23).toByte(), 21.toByte()) }
+        expect(Byte.MIN_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MIN_VALUE, Byte.MIN_VALUE, Byte.MIN_VALUE) }
+            expect(Byte.MAX_VALUE) { maxOf(Byte.MIN_VALUE, Byte.MAX_VALUE, 0.toByte(), 1.toByte()) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Short() {
+        expect(10.toShort()) { maxOf(2.toShort(), 1.toShort(), 3.toShort(), 10.toShort()) }
+        expect(126.toShort()) { maxOf(58.toShort(), 126.toShort(), 55.toShort(), 87.toShort()) }
+        expect(23.toShort()) { maxOf(Random.nextInt(Short.MIN_VALUE.toInt(), 23).toShort(), 23.toShort(), Random.nextInt(Short.MIN_VALUE.toInt(), 23).toShort(), 21.toShort()) }
+        expect(Short.MIN_VALUE) { maxOf(Short.MIN_VALUE, Short.MIN_VALUE, Short.MIN_VALUE, Short.MIN_VALUE) }
+            expect(Short.MAX_VALUE) { maxOf(Short.MIN_VALUE, Short.MAX_VALUE, 0.toShort(), 1.toShort()) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Double() {
+        expect(10.0) { maxOf(2.0, 1.0, 3.0, 10.0) }
+        expect(126.0) { maxOf(58.0, 126.0, 55.0, 87.0) }
+        expect(23.0) { maxOf(Random.nextDouble(Double.MIN_VALUE, 23.0), 23.0, Random.nextDouble(Double.MIN_VALUE, 23.0), 21.0) }
+        expect(Double.MIN_VALUE) { maxOf(Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE) }
+            expect(Double.MAX_VALUE) { maxOf(Double.MIN_VALUE, Double.MAX_VALUE, 0.0, 1.0) }
+            assertEquals(0.0, maxOf(0.0, -0.0, -0.0, 0.0))
+            assertEquals(0.0, maxOf(-0.0, 0.0, 0.0, -0.0))
+            assertEquals(Double.POSITIVE_INFINITY, maxOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun maxOf_vararg_Float() {
+        expect(10.0f) { maxOf(2.0f, 1.0f, 3.0f, 10.0f) }
+        expect(126.0f) { maxOf(58.0f, 126.0f, 55.0f, 87.0f) }
+        expect(23.0f) { maxOf(Random.nextDouble(Float.MIN_VALUE.toDouble(), 23.0).toFloat(), 23.0f, Random.nextDouble(Float.MIN_VALUE.toDouble(), 23.0).toFloat(), 21.0f) }
+        expect(Float.MIN_VALUE) { maxOf(Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE) }
+            expect(Float.MAX_VALUE) { maxOf(Float.MIN_VALUE, Float.MAX_VALUE, 0.0f, 1.0f) }
+            assertEquals(0.0f, maxOf(0.0f, -0.0f, -0.0f, 0.0f))
+            assertEquals(0.0f, maxOf(-0.0f, 0.0f, 0.0f, -0.0f))
+            assertEquals(Float.POSITIVE_INFINITY, maxOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, Float.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun minOf_2_Generic() {
+        expect(1) { minOf<Int>(2, 1) }
+        expect(58) { minOf<Int>(58, 126) }
+        expect(23) { minOf<Int>(Random.nextInt(23..Int.MAX_VALUE), 23) }
+        expect(Int.MIN_VALUE) { minOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE) }
+        expect(Int.MAX_VALUE) { minOf<Int>(Int.MAX_VALUE, Int.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_Int() {
+        expect(1) { minOf(2, 1) }
+        expect(58) { minOf(58, 126) }
+        expect(23) { minOf(Random.nextInt(23..Int.MAX_VALUE), 23) }
+        expect(Int.MIN_VALUE) { minOf(Int.MIN_VALUE, Int.MAX_VALUE) }
+        expect(Int.MAX_VALUE) { minOf(Int.MAX_VALUE, Int.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_Long() {
+        expect(1L) { minOf(2L, 1L) }
+        expect(58L) { minOf(58L, 126L) }
+        expect(23L) { minOf(Random.nextLong(23L..Long.MAX_VALUE), 23L) }
+        expect(Long.MIN_VALUE) { minOf(Long.MIN_VALUE, Long.MAX_VALUE) }
+        expect(Long.MAX_VALUE) { minOf(Long.MAX_VALUE, Long.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_Byte() {
+        expect(1.toByte()) { minOf(2.toByte(), 1.toByte()) }
+        expect(58.toByte()) { minOf(58.toByte(), 126.toByte()) }
+        expect(23.toByte()) { minOf(Random.nextInt(23..Byte.MAX_VALUE.toInt()).toByte(), 23.toByte()) }
+        expect(Byte.MIN_VALUE) { minOf(Byte.MIN_VALUE, Byte.MAX_VALUE) }
+        expect(Byte.MAX_VALUE) { minOf(Byte.MAX_VALUE, Byte.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_Short() {
+        expect(1.toShort()) { minOf(2.toShort(), 1.toShort()) }
+        expect(58.toShort()) { minOf(58.toShort(), 126.toShort()) }
+        expect(23.toShort()) { minOf(Random.nextInt(23..Short.MAX_VALUE.toInt()).toShort(), 23.toShort()) }
+        expect(Short.MIN_VALUE) { minOf(Short.MIN_VALUE, Short.MAX_VALUE) }
+        expect(Short.MAX_VALUE) { minOf(Short.MAX_VALUE, Short.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_Double() {
+        expect(1.0) { minOf(2.0, 1.0) }
+        expect(58.0) { minOf(58.0, 126.0) }
+        expect(23.0) { minOf(Random.nextDouble(23.0, Double.MAX_VALUE), 23.0) }
+        expect(Double.MIN_VALUE) { minOf(Double.MIN_VALUE, Double.MAX_VALUE) }
+        expect(Double.MAX_VALUE) { minOf(Double.MAX_VALUE, Double.MAX_VALUE) }
+            assertEquals(-0.0, minOf(0.0, -0.0))
+            assertEquals(-0.0, minOf(-0.0, 0.0))
+            assertEquals(Double.NEGATIVE_INFINITY, minOf(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY))
+            
+    }
+
+    @Test
+    fun minOf_2_Float() {
+        expect(1.0f) { minOf(2.0f, 1.0f) }
+        expect(58.0f) { minOf(58.0f, 126.0f) }
+        expect(23.0f) { minOf(Random.nextDouble(23.0, Float.MAX_VALUE.toDouble()).toFloat(), 23.0f) }
+        expect(Float.MIN_VALUE) { minOf(Float.MIN_VALUE, Float.MAX_VALUE) }
+        expect(Float.MAX_VALUE) { minOf(Float.MAX_VALUE, Float.MAX_VALUE) }
+            assertEquals(-0.0f, minOf(0.0f, -0.0f))
+            assertEquals(-0.0f, minOf(-0.0f, 0.0f))
+            assertEquals(Float.NEGATIVE_INFINITY, minOf(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY))
+            
+    }
+
+    @Test
+    fun minOf_3_Generic() {
+        expect(1) { minOf<Int>(2, 1, 3) }
+        expect(55) { minOf<Int>(58, 126, 55) }
+        expect(23) { minOf<Int>(Random.nextInt(23..Int.MAX_VALUE), 23, Random.nextInt(23..Int.MAX_VALUE)) }
+        expect(Int.MAX_VALUE) { minOf<Int>(Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE) }
+            expect(Int.MIN_VALUE) { minOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun minOf_3_Int() {
+        expect(1) { minOf(2, 1, 3) }
+        expect(55) { minOf(58, 126, 55) }
+        expect(23) { minOf(Random.nextInt(23..Int.MAX_VALUE), 23, Random.nextInt(23..Int.MAX_VALUE)) }
+        expect(Int.MAX_VALUE) { minOf(Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE) }
+            expect(Int.MIN_VALUE) { minOf(Int.MIN_VALUE, Int.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun minOf_3_Long() {
+        expect(1L) { minOf(2L, 1L, 3L) }
+        expect(55L) { minOf(58L, 126L, 55L) }
+        expect(23L) { minOf(Random.nextLong(23L..Long.MAX_VALUE), 23L, Random.nextLong(23L..Long.MAX_VALUE)) }
+        expect(Long.MAX_VALUE) { minOf(Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE) }
+            expect(Long.MIN_VALUE) { minOf(Long.MIN_VALUE, Long.MAX_VALUE, 0L) }
+            
+    }
+
+    @Test
+    fun minOf_3_Byte() {
+        expect(1.toByte()) { minOf(2.toByte(), 1.toByte(), 3.toByte()) }
+        expect(55.toByte()) { minOf(58.toByte(), 126.toByte(), 55.toByte()) }
+        expect(23.toByte()) { minOf(Random.nextInt(23..Byte.MAX_VALUE.toInt()).toByte(), 23.toByte(), Random.nextInt(23..Byte.MAX_VALUE.toInt()).toByte()) }
+        expect(Byte.MAX_VALUE) { minOf(Byte.MAX_VALUE, Byte.MAX_VALUE, Byte.MAX_VALUE) }
+            expect(Byte.MIN_VALUE) { minOf(Byte.MIN_VALUE, Byte.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun minOf_3_Short() {
+        expect(1.toShort()) { minOf(2.toShort(), 1.toShort(), 3.toShort()) }
+        expect(55.toShort()) { minOf(58.toShort(), 126.toShort(), 55.toShort()) }
+        expect(23.toShort()) { minOf(Random.nextInt(23..Short.MAX_VALUE.toInt()).toShort(), 23.toShort(), Random.nextInt(23..Short.MAX_VALUE.toInt()).toShort()) }
+        expect(Short.MAX_VALUE) { minOf(Short.MAX_VALUE, Short.MAX_VALUE, Short.MAX_VALUE) }
+            expect(Short.MIN_VALUE) { minOf(Short.MIN_VALUE, Short.MAX_VALUE, 0) }
+            
+    }
+
+    @Test
+    fun minOf_3_Double() {
+        expect(1.0) { minOf(2.0, 1.0, 3.0) }
+        expect(55.0) { minOf(58.0, 126.0, 55.0) }
+        expect(23.0) { minOf(Random.nextDouble(23.0, Double.MAX_VALUE), 23.0, Random.nextDouble(23.0, Double.MAX_VALUE)) }
+        expect(Double.MAX_VALUE) { minOf(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE) }
+            expect(0.0) { minOf(Double.MIN_VALUE, Double.MAX_VALUE, 0.0) }
+            assertEquals(-0.0, minOf(0.0, -0.0, -0.0))
+            assertEquals(-0.0, minOf(-0.0, 0.0, 0.0))
+            assertEquals(Double.MIN_VALUE, minOf(Double.POSITIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun minOf_3_Float() {
+        expect(1.0f) { minOf(2.0f, 1.0f, 3.0f) }
+        expect(55.0f) { minOf(58.0f, 126.0f, 55.0f) }
+        expect(23.0f) { minOf(Random.nextDouble(23.0, Float.MAX_VALUE.toDouble()).toFloat(), 23.0f, Random.nextDouble(23.0, Float.MAX_VALUE.toDouble()).toFloat()) }
+        expect(Float.MAX_VALUE) { minOf(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE) }
+            expect(0.0f) { minOf(Float.MIN_VALUE, Float.MAX_VALUE, 0.0f) }
+            assertEquals(-0.0f, minOf(0.0f, -0.0f, -0.0f))
+            assertEquals(-0.0f, minOf(-0.0f, 0.0f, 0.0f))
+            assertEquals(Float.MIN_VALUE, minOf(Float.POSITIVE_INFINITY, Float.MAX_VALUE, Float.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Generic() {
+        expect(1) { minOf<Int>(2, 1, 3, 10) }
+        expect(55) { minOf<Int>(58, 126, 55, 87) }
+        expect(21) { minOf<Int>(Random.nextInt(23..Int.MAX_VALUE), 23, Random.nextInt(23..Int.MAX_VALUE), 21) }
+        expect(Int.MAX_VALUE) { minOf<Int>(Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE) }
+            assertEquals(Int.MIN_VALUE, minOf<Int>(Int.MIN_VALUE, Int.MAX_VALUE, 0, 1))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Int() {
+        expect(1) { minOf(2, 1, 3, 10) }
+        expect(55) { minOf(58, 126, 55, 87) }
+        expect(21) { minOf(Random.nextInt(23..Int.MAX_VALUE), 23, Random.nextInt(23..Int.MAX_VALUE), 21) }
+        expect(Int.MAX_VALUE) { minOf(Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE, Int.MAX_VALUE) }
+            assertEquals(Int.MIN_VALUE, minOf(Int.MIN_VALUE, Int.MAX_VALUE, 0, 1))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Long() {
+        expect(1L) { minOf(2L, 1L, 3L, 10L) }
+        expect(55L) { minOf(58L, 126L, 55L, 87L) }
+        expect(21L) { minOf(Random.nextLong(23L..Long.MAX_VALUE), 23L, Random.nextLong(23L..Long.MAX_VALUE), 21L) }
+        expect(Long.MAX_VALUE) { minOf(Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE) }
+            assertEquals(Long.MIN_VALUE, minOf(Long.MIN_VALUE, Long.MAX_VALUE, 0L, 1L))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Byte() {
+        expect(1.toByte()) { minOf(2.toByte(), 1.toByte(), 3.toByte(), 10.toByte()) }
+        expect(55.toByte()) { minOf(58.toByte(), 126.toByte(), 55.toByte(), 87.toByte()) }
+        expect(21.toByte()) { minOf(Random.nextInt(23..Byte.MAX_VALUE.toInt()).toByte(), 23.toByte(), Random.nextInt(23..Byte.MAX_VALUE.toInt()).toByte(), 21.toByte()) }
+        expect(Byte.MAX_VALUE) { minOf(Byte.MAX_VALUE, Byte.MAX_VALUE, Byte.MAX_VALUE, Byte.MAX_VALUE) }
+            assertEquals(Byte.MIN_VALUE, minOf(Byte.MIN_VALUE, Byte.MAX_VALUE, 0.toByte(), 1.toByte()))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Short() {
+        expect(1.toShort()) { minOf(2.toShort(), 1.toShort(), 3.toShort(), 10.toShort()) }
+        expect(55.toShort()) { minOf(58.toShort(), 126.toShort(), 55.toShort(), 87.toShort()) }
+        expect(21.toShort()) { minOf(Random.nextInt(23..Short.MAX_VALUE.toInt()).toShort(), 23.toShort(), Random.nextInt(23..Short.MAX_VALUE.toInt()).toShort(), 21.toShort()) }
+        expect(Short.MAX_VALUE) { minOf(Short.MAX_VALUE, Short.MAX_VALUE, Short.MAX_VALUE, Short.MAX_VALUE) }
+            assertEquals(Short.MIN_VALUE, minOf(Short.MIN_VALUE, Short.MAX_VALUE, 0.toShort(), 1.toShort()))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Double() {
+        expect(1.0) { minOf(2.0, 1.0, 3.0, 10.0) }
+        expect(55.0) { minOf(58.0, 126.0, 55.0, 87.0) }
+        expect(21.0) { minOf(Random.nextDouble(23.0, Double.MAX_VALUE), 23.0, Random.nextDouble(23.0, Double.MAX_VALUE), 21.0) }
+        expect(Double.MAX_VALUE) { minOf(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE) }
+            assertEquals(0.0, minOf(Double.MIN_VALUE, Double.MAX_VALUE, 0.0, 1.0))
+            assertEquals(-0.0, minOf(0.0, -0.0, -0.0, 0.0))
+            assertEquals(-0.0, minOf(-0.0, 0.0, 0.0, -0.0))
+            assertEquals(Double.NEGATIVE_INFINITY, minOf(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.MAX_VALUE, Double.MIN_VALUE))
+            
+    }
+
+    @Test
+    fun minOf_vararg_Float() {
+        expect(1.0f) { minOf(2.0f, 1.0f, 3.0f, 10.0f) }
+        expect(55.0f) { minOf(58.0f, 126.0f, 55.0f, 87.0f) }
+        expect(21.0f) { minOf(Random.nextDouble(23.0, Float.MAX_VALUE.toDouble()).toFloat(), 23.0f, Random.nextDouble(23.0, Float.MAX_VALUE.toDouble()).toFloat(), 21.0f) }
+        expect(Float.MAX_VALUE) { minOf(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE) }
+            assertEquals(0.0f, minOf(Float.MIN_VALUE, Float.MAX_VALUE, 0.0f, 1.0f))
+            assertEquals(-0.0f, minOf(0.0f, -0.0f, -0.0f, 0.0f))
+            assertEquals(-0.0f, minOf(-0.0f, 0.0f, 0.0f, -0.0f))
+            assertEquals(Float.NEGATIVE_INFINITY, minOf(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.MAX_VALUE, Float.MIN_VALUE))
+            
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_PrimitivesTest.kt b/libraries/stdlib/test/generated/_PrimitivesTest.kt
new file mode 100644
index 0000000..7da6827
--- /dev/null
+++ b/libraries/stdlib/test/generated/_PrimitivesTest.kt
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2010-2020 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.numbers
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import kotlin.random.*
+import kotlin.test.*
+
+class _PrimitivesTest {
+    @Test
+    fun bits_Byte() {
+        fun test(value: Byte, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < Byte.SIZE_BITS) 1.shl(Byte.SIZE_BITS - leadingZeroes - 1).toByte() else 0
+            val lowestBit = if (trailingZeroes < Byte.SIZE_BITS) 1.shl(trailingZeroes).toByte() else 0
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0, 0, 8, 8)
+        test(1, 1, 7, 0)
+        test(2, 1, 6, 1)
+        test(0x44, 2, 1, 2)
+        test(0x80.toByte(), 1, 0, 7)
+        test(0xF0.toByte(), 4, 0, 4)
+    }
+
+    @Test
+    fun bits_Short() {
+        fun test(value: Short, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < Short.SIZE_BITS) 1.shl(Short.SIZE_BITS - leadingZeroes - 1).toShort() else 0
+            val lowestBit = if (trailingZeroes < Short.SIZE_BITS) 1.shl(trailingZeroes).toShort() else 0
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0, 0, 16, 16)
+        test(1, 1, 15, 0)
+        test(2, 1, 14, 1)
+        test(0xF2, 5, 8, 1)
+        test(0x8000.toShort(), 1, 0, 15)
+        test(0xF200.toShort(), 5, 0, 9)
+    }
+
+    @Test
+    fun bits_Int() {
+        fun test(value: Int, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < Int.SIZE_BITS) 1.shl(Int.SIZE_BITS - leadingZeroes - 1).toInt() else 0
+            val lowestBit = if (trailingZeroes < Int.SIZE_BITS) 1.shl(trailingZeroes).toInt() else 0
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0, 0, 32, 32)
+        test(1, 1, 31, 0)
+        test(2, 1, 30, 1)
+        test(0xF002, 5, 16, 1)
+        test(0xF00F0000.toInt(), 8, 0, 16)
+    }
+
+    @Test
+    fun bits_Long() {
+        fun test(value: Long, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < Long.SIZE_BITS) 1L.shl(Long.SIZE_BITS - leadingZeroes - 1).toLong() else 0L
+            val lowestBit = if (trailingZeroes < Long.SIZE_BITS) 1L.shl(trailingZeroes).toLong() else 0L
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0L, 0, 64, 64)
+        test(1L, 1, 63, 0)
+        test(2L, 1, 62, 1)
+        test(0xF002, 5, 48, 1)
+        test(0xF00F0000L, 8, 32, 16)
+        test(0x1111_3333_EEEE_0000L, 4 + 8 + 12, 3, 17)
+    }
+
+    @Test
+    fun rotate_Byte() {
+        fun test(value: Byte, n: Int, expected: Byte) {
+            assertEquals(expected, value.rotateLeft(n))
+            assertEquals(expected, value.rotateRight(-n))
+        }
+        fun testCyclic(value: Byte) {
+            for (n in -2 * Byte.SIZE_BITS..2 * Byte.SIZE_BITS) {
+                val rl = value.rotateLeft(n)
+                val rr = value.rotateRight(-n)
+                assertEquals(rl, rr)
+                assertEquals(rl, value.rotateLeft(n % Byte.SIZE_BITS))
+                assertEquals(rr, value.rotateRight((-n) % Byte.SIZE_BITS))
+                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                assertEquals(value, value.rotateRight(n).rotateRight(-n))
+            }
+        }
+        test(0x73, 4, 0x37)
+        test(0x73, -3, 0x6E)
+        test(0x73, 1, 0xE6.toByte())
+        test(0xE6.toByte(), 1, 0xCD.toByte())
+        repeat(100) {
+            testCyclic(Random.nextInt().toByte())
+        }
+    }
+
+    @Test
+    fun rotate_Short() {
+        fun test(value: Short, n: Int, expected: Short) {
+            assertEquals(expected, value.rotateLeft(n))
+            assertEquals(expected, value.rotateRight(-n))
+        }
+        fun testCyclic(value: Short) {
+            for (n in -2 * Short.SIZE_BITS..2 * Short.SIZE_BITS) {
+                val rl = value.rotateLeft(n)
+                val rr = value.rotateRight(-n)
+                assertEquals(rl, rr)
+                assertEquals(rl, value.rotateLeft(n % Short.SIZE_BITS))
+                assertEquals(rr, value.rotateRight((-n) % Short.SIZE_BITS))
+                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                assertEquals(value, value.rotateRight(n).rotateRight(-n))
+            }
+        }
+        test(0x7361, 4, 0x3617)
+        test(0x7361, -3, 0b001_0111_0011_0110_0)
+        test(0x7361, 1,  0b111_0011_0110_0001_0.toShort())
+        test(0xE6C2.toShort(), 1, 0b11_0011_0110_0001_01.toShort())
+        repeat(100) {
+            testCyclic(Random.nextInt().toShort())
+        }
+    }
+
+    @Test
+    fun rotate_Int() {
+        fun test(value: Int, n: Int, expected: Int) {
+            assertEquals(expected, value.rotateLeft(n))
+            assertEquals(expected, value.rotateRight(-n))
+        }
+        fun testCyclic(value: Int) {
+            for (n in -2 * Int.SIZE_BITS..2 * Int.SIZE_BITS) {
+                val rl = value.rotateLeft(n)
+                val rr = value.rotateRight(-n)
+                assertEquals(rl, rr)
+                assertEquals(rl, value.rotateLeft(n % Int.SIZE_BITS))
+                assertEquals(rr, value.rotateRight((-n) % Int.SIZE_BITS))
+                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                assertEquals(value, value.rotateRight(n).rotateRight(-n))
+            }
+        }
+        test(0x7_3422345, 4, 0x3422345_7)
+        test(0x7342234_5, -4, 0x5_7342234)
+        test(0x73422345, 1, 0xE684468A.toInt())
+        repeat(100) {
+            testCyclic(Random.nextInt())
+        }
+    }
+
+    @Test
+    fun rotate_Long() {
+        fun test(value: Long, n: Int, expected: Long) {
+            assertEquals(expected, value.rotateLeft(n))
+            assertEquals(expected, value.rotateRight(-n))
+        }
+        fun testCyclic(value: Long) {
+            for (n in -2 * Long.SIZE_BITS..2 * Long.SIZE_BITS) {
+                val rl = value.rotateLeft(n)
+                val rr = value.rotateRight(-n)
+                assertEquals(rl, rr)
+                assertEquals(rl, value.rotateLeft(n % Long.SIZE_BITS))
+                assertEquals(rr, value.rotateRight((-n) % Long.SIZE_BITS))
+                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                assertEquals(value, value.rotateRight(n).rotateRight(-n))
+            }
+        }
+        test(0x7372ABAC_DEEF0123, 4, 0x372ABAC_DEEF01237)
+        test(0x88888888_44444444U.toLong(), -3, 0x91111111_08888888u.toLong())
+        test(0x88888888_44444444U.toLong(),  1, 0x11111110_88888889)
+        repeat(100) {
+            testCyclic(Random.nextLong())
+        }
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_SequencesTest.kt b/libraries/stdlib/test/generated/_SequencesTest.kt
new file mode 100644
index 0000000..bd93b32
--- /dev/null
+++ b/libraries/stdlib/test/generated/_SequencesTest.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2010-2020 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.sequences
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import test.comparisons.STRING_CASE_INSENSITIVE_ORDER
+import test.collections.assertSorted
+import kotlin.test.*
+
+class _SequencesTest {
+    @Test
+    fun foldIndexed_Sequence() {
+        expect(8) { sequenceOf<Int>(1, 2, 3).foldIndexed(0) { i, acc, e -> acc + i.toInt() * e } }
+        expect(10) { sequenceOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15) { sequenceOf<Int>(1, 2, 3).foldIndexed(1) { i, acc, e -> acc * (i.toInt() + e) } }
+        expect(" 0-1 1-2 2-3") { sequenceOf<Int>(1, 2, 3).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42) {
+            val numbers = sequenceOf<Int>(1, 2, 3, 4)
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect(0) {
+            val numbers = sequenceOf<Int>()
+            numbers.foldIndexed(0) { index, a, b -> index.toInt() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = sequenceOf<Int>(1, 2, 3, 4)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun maxByOrNull_Sequence() {
+        assertEquals(null, sequenceOf<Int>().maxByOrNull { it })
+        assertEquals(1, sequenceOf<Int>(1).maxByOrNull { it })
+        assertEquals(3, sequenceOf<Int>(3, 2).maxByOrNull { it * it })
+        assertEquals(3, sequenceOf<Int>(3, 2).maxByOrNull { "a" })
+        assertEquals(3, sequenceOf<Int>(3, 2).maxByOrNull { it.toString() })
+        assertEquals(2, sequenceOf<Int>(2, 3).maxByOrNull { -it })
+        assertEquals('b', sequenceOf('a', 'b').maxByOrNull { "x$it" })
+        assertEquals("abc", sequenceOf("b", "abc").maxByOrNull { it.length })
+    }
+
+    @Test
+    fun maxWithOrNull_Sequence() {
+        assertEquals(null, sequenceOf<Int>().maxWithOrNull(naturalOrder()))
+        assertEquals(1, sequenceOf<Int>(1).maxWithOrNull(naturalOrder()))
+        assertEquals(3, sequenceOf<Int>(2, 3, 4).maxWithOrNull(compareBy { it % 4 }))
+        assertEquals("B", sequenceOf("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun minByOrNull_Sequence() {
+        assertEquals(null, sequenceOf<Int>().minByOrNull { it })
+        assertEquals(1, sequenceOf<Int>(1).minByOrNull { it })
+        assertEquals(2, sequenceOf<Int>(3, 2).minByOrNull { it * it })
+        assertEquals(3, sequenceOf<Int>(3, 2).minByOrNull { "a" })
+        assertEquals(2, sequenceOf<Int>(3, 2).minByOrNull { it.toString() })
+        assertEquals(3, sequenceOf<Int>(2, 3).minByOrNull { -it })
+        assertEquals('a', sequenceOf('a', 'b').minByOrNull { "x$it" })
+        assertEquals("b", sequenceOf("b", "abc").minByOrNull { it.length })
+    }
+
+    @Test
+    fun minWithOrNull_Sequence() {
+        assertEquals(null, sequenceOf<Int>().minWithOrNull(naturalOrder()))
+        assertEquals(1, sequenceOf<Int>(1).minWithOrNull(naturalOrder()))
+        assertEquals(4, sequenceOf<Int>(2, 3, 4).minWithOrNull(compareBy { it % 4 }))
+        assertEquals("a", sequenceOf("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+    }
+
+    @Test
+    fun indexOf_Sequence() {
+        expect(-1) { sequenceOf<Int>(1, 2, 3).indexOf(0) }
+        expect(0) { sequenceOf<Int>(1, 2, 3).indexOf(1) }
+        expect(1) { sequenceOf<Int>(1, 2, 3).indexOf(2) }
+        expect(2) { sequenceOf<Int>(1, 2, 3).indexOf(3) } 
+        expect(-1) { sequenceOf("cat", "dog", "bird").indexOf("mouse") }
+        expect(0) { sequenceOf("cat", "dog", "bird").indexOf("cat") }
+        expect(1) { sequenceOf("cat", "dog", "bird").indexOf("dog") }
+        expect(2) { sequenceOf("cat", "dog", "bird").indexOf("bird") }
+        expect(0) { sequenceOf(null, "dog", null).indexOf(null as String?)}
+    }
+
+    @Test
+    fun indexOfFirst_Sequence() {
+        expect(-1) { sequenceOf<Int>(1, 2, 3).indexOfFirst { it == 0 } }
+        expect(0) { sequenceOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 1 } }
+        expect(1) { sequenceOf<Int>(1, 2, 3).indexOfFirst { it % 2 == 0 } }
+        expect(2) { sequenceOf<Int>(1, 2, 3).indexOfFirst { it == 3 } }
+        expect(-1) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
+        expect(0) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
+        expect(1) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
+        expect(2) { sequenceOf("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
+    }
+
+    @Test
+    fun sorted_Sequence() {
+        sequenceOf<Int>(3, 7, 1).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        sequenceOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        sequenceOf("ac", "aD", "aba").sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedDescending_Sequence() {
+        sequenceOf<Int>(3, 7, 1).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        sequenceOf(1, Int.MAX_VALUE, Int.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        sequenceOf("ac", "aD", "aba").sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedWith_Sequence() {
+        val comparator = compareBy { it: Int -> it % 3 }.thenByDescending { it }
+        sequenceOf<Int>(0, 1, 2, 3, 4, 5).sortedWith(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_UArraysTest.kt b/libraries/stdlib/test/generated/_UArraysTest.kt
new file mode 100644
index 0000000..d95c415
--- /dev/null
+++ b/libraries/stdlib/test/generated/_UArraysTest.kt
@@ -0,0 +1,842 @@
+/*
+ * Copyright 2010-2020 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.collections
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import kotlin.random.*
+import test.assertArrayContentEquals
+import kotlin.test.*
+
+class _UArraysTest {
+    @Test
+    fun foldIndexed_UIntArray() {
+        expect(8u) { uintArrayOf(1u, 2u, 3u).foldIndexed(0u) { i, acc, e -> acc + i.toUInt() * e } }
+        expect(10) { uintArrayOf(1u, 2u, 3u).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15u) { uintArrayOf(1u, 2u, 3u).foldIndexed(1u) { i, acc, e -> acc * (i.toUInt() + e) } }
+        expect(" 0-1 1-2 2-3") { uintArrayOf(1u, 2u, 3u).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42u) {
+            val numbers = uintArrayOf(1u, 2u, 3u, 4u)
+            numbers.foldIndexed(0u) { index, a, b -> index.toUInt() * (a + b) }
+        }
+        expect(0u) {
+            val numbers = uintArrayOf()
+            numbers.foldIndexed(0u) { index, a, b -> index.toUInt() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = uintArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_ULongArray() {
+        expect(8uL) { ulongArrayOf(1uL, 2uL, 3uL).foldIndexed(0uL) { i, acc, e -> acc + i.toULong() * e } }
+        expect(10) { ulongArrayOf(1uL, 2uL, 3uL).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15uL) { ulongArrayOf(1uL, 2uL, 3uL).foldIndexed(1uL) { i, acc, e -> acc * (i.toULong() + e) } }
+        expect(" 0-1 1-2 2-3") { ulongArrayOf(1uL, 2uL, 3uL).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42uL) {
+            val numbers = ulongArrayOf(1uL, 2uL, 3uL, 4uL)
+            numbers.foldIndexed(0uL) { index, a, b -> index.toULong() * (a + b) }
+        }
+        expect(0uL) {
+            val numbers = ulongArrayOf()
+            numbers.foldIndexed(0uL) { index, a, b -> index.toULong() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = ulongArrayOf(1uL, 2uL, 3uL, 4uL)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_UByteArray() {
+        expect(8u) { ubyteArrayOf(1u, 2u, 3u).foldIndexed(0u) { i, acc, e -> acc + i.toUByte() * e } }
+        expect(10) { ubyteArrayOf(1u, 2u, 3u).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15u) { ubyteArrayOf(1u, 2u, 3u).foldIndexed(1u) { i, acc, e -> acc * (i.toUByte() + e) } }
+        expect(" 0-1 1-2 2-3") { ubyteArrayOf(1u, 2u, 3u).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42u) {
+            val numbers = ubyteArrayOf(1u, 2u, 3u, 4u)
+            numbers.foldIndexed(0u) { index, a, b -> index.toUByte() * (a + b) }
+        }
+        expect(0u) {
+            val numbers = ubyteArrayOf()
+            numbers.foldIndexed(0u) { index, a, b -> index.toUByte() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = ubyteArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldIndexed_UShortArray() {
+        expect(8u) { ushortArrayOf(1u, 2u, 3u).foldIndexed(0u) { i, acc, e -> acc + i.toUShort() * e } }
+        expect(10) { ushortArrayOf(1u, 2u, 3u).foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+        expect(15u) { ushortArrayOf(1u, 2u, 3u).foldIndexed(1u) { i, acc, e -> acc * (i.toUShort() + e) } }
+        expect(" 0-1 1-2 2-3") { ushortArrayOf(1u, 2u, 3u).foldIndexed("") { i, acc, e -> "$acc $i-$e" } }
+        expect(42u) {
+            val numbers = ushortArrayOf(1u, 2u, 3u, 4u)
+            numbers.foldIndexed(0u) { index, a, b -> index.toUShort() * (a + b) }
+        }
+        expect(0u) {
+            val numbers = ushortArrayOf()
+            numbers.foldIndexed(0u) { index, a, b -> index.toUShort() * (a + b) }
+        }
+        expect("11234") {
+            val numbers = ushortArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_UIntArray() {
+        expect(8u) { uintArrayOf(1u, 2u, 3u).foldRightIndexed(0u) { i, e, acc -> acc + i.toUInt() * e } }
+        expect(10) { uintArrayOf(1u, 2u, 3u).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15u) { uintArrayOf(1u, 2u, 3u).foldRightIndexed(1u) { i, e, acc -> acc * (i.toUInt() + e) } }
+        expect(" 2-3 1-2 0-1") { uintArrayOf(1u, 2u, 3u).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = uintArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_ULongArray() {
+        expect(8uL) { ulongArrayOf(1uL, 2uL, 3uL).foldRightIndexed(0uL) { i, e, acc -> acc + i.toULong() * e } }
+        expect(10) { ulongArrayOf(1uL, 2uL, 3uL).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15uL) { ulongArrayOf(1uL, 2uL, 3uL).foldRightIndexed(1uL) { i, e, acc -> acc * (i.toULong() + e) } }
+        expect(" 2-3 1-2 0-1") { ulongArrayOf(1uL, 2uL, 3uL).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = ulongArrayOf(1uL, 2uL, 3uL, 4uL)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_UByteArray() {
+        expect(8u) { ubyteArrayOf(1u, 2u, 3u).foldRightIndexed(0u) { i, e, acc -> acc + i.toUByte() * e } }
+        expect(10) { ubyteArrayOf(1u, 2u, 3u).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15u) { ubyteArrayOf(1u, 2u, 3u).foldRightIndexed(1u) { i, e, acc -> acc * (i.toUByte() + e) } }
+        expect(" 2-3 1-2 0-1") { ubyteArrayOf(1u, 2u, 3u).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = ubyteArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun foldRightIndexed_UShortArray() {
+        expect(8u) { ushortArrayOf(1u, 2u, 3u).foldRightIndexed(0u) { i, e, acc -> acc + i.toUShort() * e } }
+        expect(10) { ushortArrayOf(1u, 2u, 3u).foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+        expect(15u) { ushortArrayOf(1u, 2u, 3u).foldRightIndexed(1u) { i, e, acc -> acc * (i.toUShort() + e) } }
+        expect(" 2-3 1-2 0-1") { ushortArrayOf(1u, 2u, 3u).foldRightIndexed("") { i, e, acc -> "$acc $i-$e" } }
+        expect("12343210") {
+            val numbers = ushortArrayOf(1u, 2u, 3u, 4u)
+            numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+        }
+    }
+
+    @Test
+    fun maxByOrNull_UIntArray() {
+        assertEquals(null, uintArrayOf().maxByOrNull { it })
+        assertEquals(1u, uintArrayOf(1u).maxByOrNull { it })
+        assertEquals(3u, uintArrayOf(3u, 2u).maxByOrNull { it * it })
+        assertEquals(3u, uintArrayOf(3u, 2u).maxByOrNull { "a" })
+        assertEquals(3u, uintArrayOf(3u, 2u).maxByOrNull { it.toString() })
+    }
+
+    @Test
+    fun maxByOrNull_ULongArray() {
+        assertEquals(null, ulongArrayOf().maxByOrNull { it })
+        assertEquals(1uL, ulongArrayOf(1uL).maxByOrNull { it })
+        assertEquals(3uL, ulongArrayOf(3uL, 2uL).maxByOrNull { it * it })
+        assertEquals(3uL, ulongArrayOf(3uL, 2uL).maxByOrNull { "a" })
+        assertEquals(3uL, ulongArrayOf(3uL, 2uL).maxByOrNull { it.toString() })
+    }
+
+    @Test
+    fun maxByOrNull_UByteArray() {
+        assertEquals(null, ubyteArrayOf().maxByOrNull { it })
+        assertEquals(1u, ubyteArrayOf(1u).maxByOrNull { it })
+        assertEquals(3u, ubyteArrayOf(3u, 2u).maxByOrNull { it * it })
+        assertEquals(3u, ubyteArrayOf(3u, 2u).maxByOrNull { "a" })
+        assertEquals(3u, ubyteArrayOf(3u, 2u).maxByOrNull { it.toString() })
+    }
+
+    @Test
+    fun maxByOrNull_UShortArray() {
+        assertEquals(null, ushortArrayOf().maxByOrNull { it })
+        assertEquals(1u, ushortArrayOf(1u).maxByOrNull { it })
+        assertEquals(3u, ushortArrayOf(3u, 2u).maxByOrNull { it * it })
+        assertEquals(3u, ushortArrayOf(3u, 2u).maxByOrNull { "a" })
+        assertEquals(3u, ushortArrayOf(3u, 2u).maxByOrNull { it.toString() })
+    }
+
+    @Test
+    fun maxWithOrNull_UIntArray() {
+        assertEquals(null, uintArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1u, uintArrayOf(1u).maxWithOrNull(naturalOrder()))
+        assertEquals(3u, uintArrayOf(2u, 3u, 4u).maxWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun maxWithOrNull_ULongArray() {
+        assertEquals(null, ulongArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1uL, ulongArrayOf(1uL).maxWithOrNull(naturalOrder()))
+        assertEquals(3uL, ulongArrayOf(2uL, 3uL, 4uL).maxWithOrNull(compareBy { it % 4uL }))
+    }
+
+    @Test
+    fun maxWithOrNull_UByteArray() {
+        assertEquals(null, ubyteArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1u, ubyteArrayOf(1u).maxWithOrNull(naturalOrder()))
+        assertEquals(3u, ubyteArrayOf(2u, 3u, 4u).maxWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun maxWithOrNull_UShortArray() {
+        assertEquals(null, ushortArrayOf().maxWithOrNull(naturalOrder()))
+        assertEquals(1u, ushortArrayOf(1u).maxWithOrNull(naturalOrder()))
+        assertEquals(3u, ushortArrayOf(2u, 3u, 4u).maxWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun minByOrNull_UIntArray() {
+        assertEquals(null, uintArrayOf().minByOrNull { it })
+        assertEquals(1u, uintArrayOf(1u).minByOrNull { it })
+        assertEquals(2u, uintArrayOf(3u, 2u).minByOrNull { it * it })
+        assertEquals(3u, uintArrayOf(3u, 2u).minByOrNull { "a" })
+        assertEquals(2u, uintArrayOf(3u, 2u).minByOrNull { it.toString() })
+    }
+
+    @Test
+    fun minByOrNull_ULongArray() {
+        assertEquals(null, ulongArrayOf().minByOrNull { it })
+        assertEquals(1uL, ulongArrayOf(1uL).minByOrNull { it })
+        assertEquals(2uL, ulongArrayOf(3uL, 2uL).minByOrNull { it * it })
+        assertEquals(3uL, ulongArrayOf(3uL, 2uL).minByOrNull { "a" })
+        assertEquals(2uL, ulongArrayOf(3uL, 2uL).minByOrNull { it.toString() })
+    }
+
+    @Test
+    fun minByOrNull_UByteArray() {
+        assertEquals(null, ubyteArrayOf().minByOrNull { it })
+        assertEquals(1u, ubyteArrayOf(1u).minByOrNull { it })
+        assertEquals(2u, ubyteArrayOf(3u, 2u).minByOrNull { it * it })
+        assertEquals(3u, ubyteArrayOf(3u, 2u).minByOrNull { "a" })
+        assertEquals(2u, ubyteArrayOf(3u, 2u).minByOrNull { it.toString() })
+    }
+
+    @Test
+    fun minByOrNull_UShortArray() {
+        assertEquals(null, ushortArrayOf().minByOrNull { it })
+        assertEquals(1u, ushortArrayOf(1u).minByOrNull { it })
+        assertEquals(2u, ushortArrayOf(3u, 2u).minByOrNull { it * it })
+        assertEquals(3u, ushortArrayOf(3u, 2u).minByOrNull { "a" })
+        assertEquals(2u, ushortArrayOf(3u, 2u).minByOrNull { it.toString() })
+    }
+
+    @Test
+    fun minWithOrNull_UIntArray() {
+        assertEquals(null, uintArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1u, uintArrayOf(1u).minWithOrNull(naturalOrder()))
+        assertEquals(4u, uintArrayOf(2u, 3u, 4u).minWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun minWithOrNull_ULongArray() {
+        assertEquals(null, ulongArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1uL, ulongArrayOf(1uL).minWithOrNull(naturalOrder()))
+        assertEquals(4uL, ulongArrayOf(2uL, 3uL, 4uL).minWithOrNull(compareBy { it % 4uL }))
+    }
+
+    @Test
+    fun minWithOrNull_UByteArray() {
+        assertEquals(null, ubyteArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1u, ubyteArrayOf(1u).minWithOrNull(naturalOrder()))
+        assertEquals(4u, ubyteArrayOf(2u, 3u, 4u).minWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun minWithOrNull_UShortArray() {
+        assertEquals(null, ushortArrayOf().minWithOrNull(naturalOrder()))
+        assertEquals(1u, ushortArrayOf(1u).minWithOrNull(naturalOrder()))
+        assertEquals(4u, ushortArrayOf(2u, 3u, 4u).minWithOrNull(compareBy { it % 4u }))
+    }
+
+    @Test
+    fun indexOf_UIntArray() {
+        expect(-1) { uintArrayOf(1u, 2u, 3u).indexOf(0u) }
+        expect(0) { uintArrayOf(1u, 2u, 3u).indexOf(1u) }
+        expect(1) { uintArrayOf(1u, 2u, 3u).indexOf(2u) }
+        expect(2) { uintArrayOf(1u, 2u, 3u).indexOf(3u) } 
+    }
+
+    @Test
+    fun indexOf_ULongArray() {
+        expect(-1) { ulongArrayOf(1uL, 2uL, 3uL).indexOf(0uL) }
+        expect(0) { ulongArrayOf(1uL, 2uL, 3uL).indexOf(1uL) }
+        expect(1) { ulongArrayOf(1uL, 2uL, 3uL).indexOf(2uL) }
+        expect(2) { ulongArrayOf(1uL, 2uL, 3uL).indexOf(3uL) } 
+    }
+
+    @Test
+    fun indexOf_UByteArray() {
+        expect(-1) { ubyteArrayOf(1u, 2u, 3u).indexOf(0u) }
+        expect(0) { ubyteArrayOf(1u, 2u, 3u).indexOf(1u) }
+        expect(1) { ubyteArrayOf(1u, 2u, 3u).indexOf(2u) }
+        expect(2) { ubyteArrayOf(1u, 2u, 3u).indexOf(3u) } 
+    }
+
+    @Test
+    fun indexOf_UShortArray() {
+        expect(-1) { ushortArrayOf(1u, 2u, 3u).indexOf(0u) }
+        expect(0) { ushortArrayOf(1u, 2u, 3u).indexOf(1u) }
+        expect(1) { ushortArrayOf(1u, 2u, 3u).indexOf(2u) }
+        expect(2) { ushortArrayOf(1u, 2u, 3u).indexOf(3u) } 
+    }
+
+    @Test
+    fun indexOfFirst_UIntArray() {
+        expect(-1) { uintArrayOf(1u, 2u, 3u).indexOfFirst { it == 0u } }
+        expect(0) { uintArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 1u } }
+        expect(1) { uintArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 0u } }
+        expect(2) { uintArrayOf(1u, 2u, 3u).indexOfFirst { it == 3u } }
+    }
+
+    @Test
+    fun indexOfFirst_ULongArray() {
+        expect(-1) { ulongArrayOf(1uL, 2uL, 3uL).indexOfFirst { it == 0uL } }
+        expect(0) { ulongArrayOf(1uL, 2uL, 3uL).indexOfFirst { it % 2uL == 1uL } }
+        expect(1) { ulongArrayOf(1uL, 2uL, 3uL).indexOfFirst { it % 2uL == 0uL } }
+        expect(2) { ulongArrayOf(1uL, 2uL, 3uL).indexOfFirst { it == 3uL } }
+    }
+
+    @Test
+    fun indexOfFirst_UByteArray() {
+        expect(-1) { ubyteArrayOf(1u, 2u, 3u).indexOfFirst { it == 0.toUByte() } }
+        expect(0) { ubyteArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 1u } }
+        expect(1) { ubyteArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 0u } }
+        expect(2) { ubyteArrayOf(1u, 2u, 3u).indexOfFirst { it == 3.toUByte() } }
+    }
+
+    @Test
+    fun indexOfFirst_UShortArray() {
+        expect(-1) { ushortArrayOf(1u, 2u, 3u).indexOfFirst { it == 0.toUShort() } }
+        expect(0) { ushortArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 1u } }
+        expect(1) { ushortArrayOf(1u, 2u, 3u).indexOfFirst { it % 2u == 0u } }
+        expect(2) { ushortArrayOf(1u, 2u, 3u).indexOfFirst { it == 3.toUShort() } }
+    }
+
+    @Test
+    fun copyInto_UIntArray() {
+        val dest = uintArrayOf(1u, 2u, 3u)
+        val newValues = uintArrayOf(4u, 5u, 6u)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = uintArrayOf(5u, 6u, 3u)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = uintArrayOf(6u, 3u, 3u)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = uintArrayOf(6u, 6u, 3u)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_ULongArray() {
+        val dest = ulongArrayOf(1uL, 2uL, 3uL)
+        val newValues = ulongArrayOf(4uL, 5uL, 6uL)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = ulongArrayOf(5uL, 6uL, 3uL)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = ulongArrayOf(6uL, 3uL, 3uL)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = ulongArrayOf(6uL, 6uL, 3uL)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_UByteArray() {
+        val dest = ubyteArrayOf(1u, 2u, 3u)
+        val newValues = ubyteArrayOf(4u, 5u, 6u)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = ubyteArrayOf(5u, 6u, 3u)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = ubyteArrayOf(6u, 3u, 3u)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = ubyteArrayOf(6u, 6u, 3u)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun copyInto_UShortArray() {
+        val dest = ushortArrayOf(1u, 2u, 3u)
+        val newValues = ushortArrayOf(4u, 5u, 6u)
+        newValues.copyInto(dest, 0, 1, 3)
+        val result1 = ushortArrayOf(5u, 6u, 3u)
+        assertTrue(result1 contentEquals dest, "Copying from newValues: ${result1.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 0, 1, 3)
+        val result2 = ushortArrayOf(6u, 3u, 3u)
+        assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        dest.copyInto(dest, 1, 0, 2)
+        val result3 = ushortArrayOf(6u, 6u, 3u)
+        assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${result2.contentToString()}, ${dest.contentToString()}")
+        for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+            val bounds = "start: $start, end: $end"
+            val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+            assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: $ex")
+        }
+        for (destIndex in listOf(-1, 2, 4)) {
+            assertFailsWith<IndexOutOfBoundsException>("index: $destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+        } 
+    }
+
+    @Test
+    fun reverse_UIntArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toUInt() }.toUIntArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_ULongArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toULong() }.toULongArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_UByteArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toUByte() }.toUByteArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverse_UShortArray() {
+        val arrays = (0..4).map { n -> (1..n).map { it.toUShort() }.toUShortArray() }
+        for (array in arrays) {
+            val original = array.toList()
+            array.reverse()
+            val reversed = array.toList()
+            assertEquals(original.asReversed(), reversed)
+        }
+    }
+
+    @Test
+    fun reverseRange_UIntArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toUInt() }.toUIntArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_ULongArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toULong() }.toULongArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_UByteArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toUByte() }.toUByteArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reverseRange_UShortArray() {
+        val arrays = (0..7).map { n -> n to (0 until n).map { it.toUShort() }.toUShortArray() }
+        for ((size, array) in arrays) {
+            for (fromIndex in 0 until size) {
+                for (toIndex in fromIndex..size) {
+                    val original = array.toMutableList()
+                    array.reverse(fromIndex, toIndex)
+                    val reversed = array.toMutableList()
+                    assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                }
+            }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+            assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+            assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+        }
+    }
+
+    @Test
+    fun reversed_UIntArray() {
+        assertEquals(listOf<UInt>(3u, 2u, 1u), uintArrayOf(1u, 2u, 3u).reversed())
+    }
+
+    @Test
+    fun reversed_ULongArray() {
+        assertEquals(listOf<ULong>(3uL, 2uL, 1uL), ulongArrayOf(1uL, 2uL, 3uL).reversed())
+    }
+
+    @Test
+    fun reversed_UByteArray() {
+        assertEquals(listOf<UByte>(3u, 2u, 1u), ubyteArrayOf(1u, 2u, 3u).reversed())
+    }
+
+    @Test
+    fun reversed_UShortArray() {
+        assertEquals(listOf<UShort>(3u, 2u, 1u), ushortArrayOf(1u, 2u, 3u).reversed())
+    }
+
+    @Test
+    fun reversedArray_UIntArray() {
+        assertArrayContentEquals(uintArrayOf(3u, 2u, 1u), uintArrayOf(1u, 2u, 3u).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_ULongArray() {
+        assertArrayContentEquals(ulongArrayOf(3uL, 2uL, 1uL), ulongArrayOf(1uL, 2uL, 3uL).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_UByteArray() {
+        assertArrayContentEquals(ubyteArrayOf(3u, 2u, 1u), ubyteArrayOf(1u, 2u, 3u).reversedArray())
+    }
+
+    @Test
+    fun reversedArray_UShortArray() {
+        assertArrayContentEquals(ushortArrayOf(3u, 2u, 1u), ushortArrayOf(1u, 2u, 3u).reversedArray())
+    }
+
+    @Test
+    fun shuffle_UIntArray() {
+        fun test(data: UIntArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(UIntArray(100) { it.toUInt() })
+    }
+
+    @Test
+    fun shuffle_ULongArray() {
+        fun test(data: ULongArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(ULongArray(100) { it.toULong() })
+    }
+
+    @Test
+    fun shuffle_UByteArray() {
+        fun test(data: UByteArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(UByteArray(100) { it.toUByte() })
+    }
+
+    @Test
+    fun shuffle_UShortArray() {
+        fun test(data: UShortArray) {
+            val original = data.toMutableList()
+            data.shuffle()
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+        }
+        test(UShortArray(100) { it.toUShort() })
+    }
+
+    @Test
+    fun shuffleRandom_UIntArray() {
+        fun test(data: UIntArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(UIntArray(16) { it.toUInt() })
+    }
+
+    @Test
+    fun shuffleRandom_ULongArray() {
+        fun test(data: ULongArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(ULongArray(16) { it.toULong() })
+    }
+
+    @Test
+    fun shuffleRandom_UByteArray() {
+        fun test(data: UByteArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(UByteArray(16) { it.toUByte() })
+    }
+
+    @Test
+    fun shuffleRandom_UShortArray() {
+        fun test(data: UShortArray) {
+            val seed = Random.nextInt()
+            val original = data.toMutableList()
+            val originalShuffled = original.shuffled(Random(seed))
+            data.shuffle(Random(seed))
+            val shuffled = data.toMutableList()
+            assertNotEquals(original, shuffled)
+            assertEquals(originalShuffled, shuffled)
+        }
+        test(UShortArray(16) { it.toUShort() })
+    }
+
+    @Test
+    fun sort_UIntArray() {
+        val data = uintArrayOf(5u, 2u, 1u, 9u, 80u, UInt.MIN_VALUE, UInt.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(uintArrayOf(UInt.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UInt.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_ULongArray() {
+        val data = ulongArrayOf(5uL, 2uL, 1uL, 9uL, 80uL, ULong.MIN_VALUE, ULong.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(ulongArrayOf(ULong.MIN_VALUE, 1uL, 2uL, 5uL, 9uL, 80uL, ULong.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_UByteArray() {
+        val data = ubyteArrayOf(5u, 2u, 1u, 9u, 80u, UByte.MIN_VALUE, UByte.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(ubyteArrayOf(UByte.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UByte.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sort_UShortArray() {
+        val data = ushortArrayOf(5u, 2u, 1u, 9u, 80u, UShort.MIN_VALUE, UShort.MAX_VALUE)
+        data.sort()
+        assertArrayContentEquals(ushortArrayOf(UShort.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UShort.MAX_VALUE), data)
+    }
+
+    @Test
+    fun sortDescending_UIntArray() {
+        val data = uintArrayOf(5u, 2u, 1u, 9u, 80u, UInt.MIN_VALUE, UInt.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(uintArrayOf(UInt.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UInt.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_ULongArray() {
+        val data = ulongArrayOf(5uL, 2uL, 1uL, 9uL, 80uL, ULong.MIN_VALUE, ULong.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(ulongArrayOf(ULong.MIN_VALUE, 1uL, 2uL, 5uL, 9uL, 80uL, ULong.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_UByteArray() {
+        val data = ubyteArrayOf(5u, 2u, 1u, 9u, 80u, UByte.MIN_VALUE, UByte.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(ubyteArrayOf(UByte.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UByte.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sortDescending_UShortArray() {
+        val data = ushortArrayOf(5u, 2u, 1u, 9u, 80u, UShort.MIN_VALUE, UShort.MAX_VALUE)
+        data.sortDescending()
+        assertArrayContentEquals(ushortArrayOf(UShort.MIN_VALUE, 1u, 2u, 5u, 9u, 80u, UShort.MAX_VALUE).reversedArray(), data)
+    }
+
+    @Test
+    fun sorted_UIntArray() {
+        uintArrayOf(3u, 7u, 1u).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_ULongArray() {
+        ulongArrayOf(3uL, 7uL, 1uL).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_UByteArray() {
+        ubyteArrayOf(3u, 7u, 1u).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sorted_UShortArray() {
+        ushortArrayOf(3u, 7u, 1u).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).sorted().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_UIntArray() {
+        uintArrayOf(3u, 7u, 1u).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_ULongArray() {
+        ulongArrayOf(3uL, 7uL, 1uL).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_UByteArray() {
+        ubyteArrayOf(3u, 7u, 1u).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArray_UShortArray() {
+        ushortArrayOf(3u, 7u, 1u).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+        ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).sortedArray().iterator().assertSorted { a, b -> a.compareTo(b) <= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_UIntArray() {
+        uintArrayOf(3u, 7u, 1u).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_ULongArray() {
+        ulongArrayOf(3uL, 7uL, 1uL).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_UByteArray() {
+        ubyteArrayOf(3u, 7u, 1u).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedArrayDescending_UShortArray() {
+        ushortArrayOf(3u, 7u, 1u).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).sortedArrayDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_UIntArray() {
+        uintArrayOf(3u, 7u, 1u).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_ULongArray() {
+        ulongArrayOf(3uL, 7uL, 1uL).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_UByteArray() {
+        ubyteArrayOf(3u, 7u, 1u).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+    @Test
+    fun sortedDescending_UShortArray() {
+        ushortArrayOf(3u, 7u, 1u).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+        ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).sortedDescending().iterator().assertSorted { a, b -> a.compareTo(b) >= 0 }
+    }
+
+}
diff --git a/libraries/stdlib/test/generated/_UComparisonsTest.kt b/libraries/stdlib/test/generated/_UComparisonsTest.kt
new file mode 100644
index 0000000..f749741
--- /dev/null
+++ b/libraries/stdlib/test/generated/_UComparisonsTest.kt
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2010-2020 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.unsigned
+
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
+import kotlin.random.*
+import kotlin.test.*
+
+class _UComparisonsTest {
+    @Test
+    fun maxOf_2_UInt() {
+        expect(2u) { maxOf(2u, 1u) }
+        expect(126u) { maxOf(58u, 126u) }
+        expect(23u) { maxOf(Random.nextUInt(UInt.MIN_VALUE, 23u), 23u) }
+        expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE) }
+        expect(UInt.MIN_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_ULong() {
+        expect(2uL) { maxOf(2uL, 1uL) }
+        expect(126uL) { maxOf(58uL, 126uL) }
+        expect(23uL) { maxOf(Random.nextULong(ULong.MIN_VALUE, 23uL), 23uL) }
+        expect(ULong.MAX_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MAX_VALUE) }
+        expect(ULong.MIN_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_UByte() {
+        expect(2.toUByte()) { maxOf(2.toUByte(), 1.toUByte()) }
+        expect(126.toUByte()) { maxOf(58.toUByte(), 126.toUByte()) }
+        expect(23.toUByte()) { maxOf(Random.nextInt(UByte.MIN_VALUE.toInt(), 23).toUByte(), 23.toUByte()) }
+        expect(UByte.MAX_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MAX_VALUE) }
+        expect(UByte.MIN_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_2_UShort() {
+        expect(2.toUShort()) { maxOf(2.toUShort(), 1.toUShort()) }
+        expect(126.toUShort()) { maxOf(58.toUShort(), 126.toUShort()) }
+        expect(23.toUShort()) { maxOf(Random.nextInt(UShort.MIN_VALUE.toInt(), 23).toUShort(), 23.toUShort()) }
+        expect(UShort.MAX_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MAX_VALUE) }
+        expect(UShort.MIN_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MIN_VALUE) }
+    }
+
+    @Test
+    fun maxOf_3_UInt() {
+        expect(3u) { maxOf(2u, 1u, 3u) }
+        expect(126u) { maxOf(58u, 126u, 55u) }
+        expect(23u) { maxOf(Random.nextUInt(UInt.MIN_VALUE, 23u), 23u, Random.nextUInt(UInt.MIN_VALUE, 23u)) }
+        expect(UInt.MIN_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MIN_VALUE, UInt.MIN_VALUE) }
+            expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) }
+            
+    }
+
+    @Test
+    fun maxOf_3_ULong() {
+        expect(3uL) { maxOf(2uL, 1uL, 3uL) }
+        expect(126uL) { maxOf(58uL, 126uL, 55uL) }
+        expect(23uL) { maxOf(Random.nextULong(ULong.MIN_VALUE, 23uL), 23uL, Random.nextULong(ULong.MIN_VALUE, 23uL)) }
+        expect(ULong.MIN_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MIN_VALUE, ULong.MIN_VALUE) }
+            expect(ULong.MAX_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MAX_VALUE, 0uL) }
+            
+    }
+
+    @Test
+    fun maxOf_3_UByte() {
+        expect(3.toUByte()) { maxOf(2.toUByte(), 1.toUByte(), 3.toUByte()) }
+        expect(126.toUByte()) { maxOf(58.toUByte(), 126.toUByte(), 55.toUByte()) }
+        expect(23.toUByte()) { maxOf(Random.nextInt(UByte.MIN_VALUE.toInt(), 23).toUByte(), 23.toUByte(), Random.nextInt(UByte.MIN_VALUE.toInt(), 23).toUByte()) }
+        expect(UByte.MIN_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MIN_VALUE, UByte.MIN_VALUE) }
+            expect(UByte.MAX_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MAX_VALUE, 0.toUByte()) }
+            
+    }
+
+    @Test
+    fun maxOf_3_UShort() {
+        expect(3.toUShort()) { maxOf(2.toUShort(), 1.toUShort(), 3.toUShort()) }
+        expect(126.toUShort()) { maxOf(58.toUShort(), 126.toUShort(), 55.toUShort()) }
+        expect(23.toUShort()) { maxOf(Random.nextInt(UShort.MIN_VALUE.toInt(), 23).toUShort(), 23.toUShort(), Random.nextInt(UShort.MIN_VALUE.toInt(), 23).toUShort()) }
+        expect(UShort.MIN_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MIN_VALUE, UShort.MIN_VALUE) }
+            expect(UShort.MAX_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MAX_VALUE, 0.toUShort()) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_UInt() {
+        expect(10u) { maxOf(2u, 1u, 3u, 10u) }
+        expect(126u) { maxOf(58u, 126u, 55u, 87u) }
+        expect(23u) { maxOf(Random.nextUInt(UInt.MIN_VALUE, 23u), 23u, Random.nextUInt(UInt.MIN_VALUE, 23u), 21u) }
+        expect(UInt.MIN_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MIN_VALUE, UInt.MIN_VALUE, UInt.MIN_VALUE) }
+            expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u, 1u) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_ULong() {
+        expect(10uL) { maxOf(2uL, 1uL, 3uL, 10uL) }
+        expect(126uL) { maxOf(58uL, 126uL, 55uL, 87uL) }
+        expect(23uL) { maxOf(Random.nextULong(ULong.MIN_VALUE, 23uL), 23uL, Random.nextULong(ULong.MIN_VALUE, 23uL), 21uL) }
+        expect(ULong.MIN_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MIN_VALUE, ULong.MIN_VALUE, ULong.MIN_VALUE) }
+            expect(ULong.MAX_VALUE) { maxOf(ULong.MIN_VALUE, ULong.MAX_VALUE, 0uL, 1uL) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_UByte() {
+        expect(10.toUByte()) { maxOf(2.toUByte(), 1.toUByte(), 3.toUByte(), 10.toUByte()) }
+        expect(126.toUByte()) { maxOf(58.toUByte(), 126.toUByte(), 55.toUByte(), 87.toUByte()) }
+        expect(23.toUByte()) { maxOf(Random.nextInt(UByte.MIN_VALUE.toInt(), 23).toUByte(), 23.toUByte(), Random.nextInt(UByte.MIN_VALUE.toInt(), 23).toUByte(), 21.toUByte()) }
+        expect(UByte.MIN_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MIN_VALUE, UByte.MIN_VALUE, UByte.MIN_VALUE) }
+            expect(UByte.MAX_VALUE) { maxOf(UByte.MIN_VALUE, UByte.MAX_VALUE, 0.toUByte(), 1.toUByte()) }
+            
+    }
+
+    @Test
+    fun maxOf_vararg_UShort() {
+        expect(10.toUShort()) { maxOf(2.toUShort(), 1.toUShort(), 3.toUShort(), 10.toUShort()) }
+        expect(126.toUShort()) { maxOf(58.toUShort(), 126.toUShort(), 55.toUShort(), 87.toUShort()) }
+        expect(23.toUShort()) { maxOf(Random.nextInt(UShort.MIN_VALUE.toInt(), 23).toUShort(), 23.toUShort(), Random.nextInt(UShort.MIN_VALUE.toInt(), 23).toUShort(), 21.toUShort()) }
+        expect(UShort.MIN_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MIN_VALUE, UShort.MIN_VALUE, UShort.MIN_VALUE) }
+            expect(UShort.MAX_VALUE) { maxOf(UShort.MIN_VALUE, UShort.MAX_VALUE, 0.toUShort(), 1.toUShort()) }
+            
+    }
+
+    @Test
+    fun minOf_2_UInt() {
+        expect(1u) { minOf(2u, 1u) }
+        expect(58u) { minOf(58u, 126u) }
+        expect(23u) { minOf(Random.nextUInt(23u..UInt.MAX_VALUE), 23u) }
+        expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE) }
+        expect(UInt.MAX_VALUE) { minOf(UInt.MAX_VALUE, UInt.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_ULong() {
+        expect(1uL) { minOf(2uL, 1uL) }
+        expect(58uL) { minOf(58uL, 126uL) }
+        expect(23uL) { minOf(Random.nextULong(23uL..ULong.MAX_VALUE), 23uL) }
+        expect(ULong.MIN_VALUE) { minOf(ULong.MIN_VALUE, ULong.MAX_VALUE) }
+        expect(ULong.MAX_VALUE) { minOf(ULong.MAX_VALUE, ULong.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_UByte() {
+        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte()) }
+        expect(58.toUByte()) { minOf(58.toUByte(), 126.toUByte()) }
+        expect(23.toUByte()) { minOf(Random.nextInt(23..UByte.MAX_VALUE.toInt()).toUByte(), 23.toUByte()) }
+        expect(UByte.MIN_VALUE) { minOf(UByte.MIN_VALUE, UByte.MAX_VALUE) }
+        expect(UByte.MAX_VALUE) { minOf(UByte.MAX_VALUE, UByte.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_2_UShort() {
+        expect(1.toUShort()) { minOf(2.toUShort(), 1.toUShort()) }
+        expect(58.toUShort()) { minOf(58.toUShort(), 126.toUShort()) }
+        expect(23.toUShort()) { minOf(Random.nextInt(23..UShort.MAX_VALUE.toInt()).toUShort(), 23.toUShort()) }
+        expect(UShort.MIN_VALUE) { minOf(UShort.MIN_VALUE, UShort.MAX_VALUE) }
+        expect(UShort.MAX_VALUE) { minOf(UShort.MAX_VALUE, UShort.MAX_VALUE) }
+    }
+
+    @Test
+    fun minOf_3_UInt() {
+        expect(1u) { minOf(2u, 1u, 3u) }
+        expect(55u) { minOf(58u, 126u, 55u) }
+        expect(23u) { minOf(Random.nextUInt(23u..UInt.MAX_VALUE), 23u, Random.nextUInt(23u..UInt.MAX_VALUE)) }
+        expect(UInt.MAX_VALUE) { minOf(UInt.MAX_VALUE, UInt.MAX_VALUE, UInt.MAX_VALUE) }
+            expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) }
+            
+    }
+
+    @Test
+    fun minOf_3_ULong() {
+        expect(1uL) { minOf(2uL, 1uL, 3uL) }
+        expect(55uL) { minOf(58uL, 126uL, 55uL) }
+        expect(23uL) { minOf(Random.nextULong(23uL..ULong.MAX_VALUE), 23uL, Random.nextULong(23uL..ULong.MAX_VALUE)) }
+        expect(ULong.MAX_VALUE) { minOf(ULong.MAX_VALUE, ULong.MAX_VALUE, ULong.MAX_VALUE) }
+            expect(ULong.MIN_VALUE) { minOf(ULong.MIN_VALUE, ULong.MAX_VALUE, 0uL) }
+            
+    }
+
+    @Test
+    fun minOf_3_UByte() {
+        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte(), 3.toUByte()) }
+        expect(55.toUByte()) { minOf(58.toUByte(), 126.toUByte(), 55.toUByte()) }
+        expect(23.toUByte()) { minOf(Random.nextInt(23..UByte.MAX_VALUE.toInt()).toUByte(), 23.toUByte(), Random.nextInt(23..UByte.MAX_VALUE.toInt()).toUByte()) }
+        expect(UByte.MAX_VALUE) { minOf(UByte.MAX_VALUE, UByte.MAX_VALUE, UByte.MAX_VALUE) }
+            expect(UByte.MIN_VALUE) { minOf(UByte.MIN_VALUE, UByte.MAX_VALUE, 0u) }
+            
+    }
+
+    @Test
+    fun minOf_3_UShort() {
+        expect(1.toUShort()) { minOf(2.toUShort(), 1.toUShort(), 3.toUShort()) }
+        expect(55.toUShort()) { minOf(58.toUShort(), 126.toUShort(), 55.toUShort()) }
+        expect(23.toUShort()) { minOf(Random.nextInt(23..UShort.MAX_VALUE.toInt()).toUShort(), 23.toUShort(), Random.nextInt(23..UShort.MAX_VALUE.toInt()).toUShort()) }
+        expect(UShort.MAX_VALUE) { minOf(UShort.MAX_VALUE, UShort.MAX_VALUE, UShort.MAX_VALUE) }
+            expect(UShort.MIN_VALUE) { minOf(UShort.MIN_VALUE, UShort.MAX_VALUE, 0u) }
+            
+    }
+
+    @Test
+    fun minOf_vararg_UInt() {
+        expect(1u) { minOf(2u, 1u, 3u, 10u) }
+        expect(55u) { minOf(58u, 126u, 55u, 87u) }
+        expect(21u) { minOf(Random.nextUInt(23u..UInt.MAX_VALUE), 23u, Random.nextUInt(23u..UInt.MAX_VALUE), 21u) }
+        expect(UInt.MAX_VALUE) { minOf(UInt.MAX_VALUE, UInt.MAX_VALUE, UInt.MAX_VALUE, UInt.MAX_VALUE) }
+            assertEquals(UInt.MIN_VALUE, minOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u, 1u))
+            
+    }
+
+    @Test
+    fun minOf_vararg_ULong() {
+        expect(1uL) { minOf(2uL, 1uL, 3uL, 10uL) }
+        expect(55uL) { minOf(58uL, 126uL, 55uL, 87uL) }
+        expect(21uL) { minOf(Random.nextULong(23uL..ULong.MAX_VALUE), 23uL, Random.nextULong(23uL..ULong.MAX_VALUE), 21uL) }
+        expect(ULong.MAX_VALUE) { minOf(ULong.MAX_VALUE, ULong.MAX_VALUE, ULong.MAX_VALUE, ULong.MAX_VALUE) }
+            assertEquals(ULong.MIN_VALUE, minOf(ULong.MIN_VALUE, ULong.MAX_VALUE, 0uL, 1uL))
+            
+    }
+
+    @Test
+    fun minOf_vararg_UByte() {
+        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte(), 3.toUByte(), 10.toUByte()) }
+        expect(55.toUByte()) { minOf(58.toUByte(), 126.toUByte(), 55.toUByte(), 87.toUByte()) }
+        expect(21.toUByte()) { minOf(Random.nextInt(23..UByte.MAX_VALUE.toInt()).toUByte(), 23.toUByte(), Random.nextInt(23..UByte.MAX_VALUE.toInt()).toUByte(), 21.toUByte()) }
+        expect(UByte.MAX_VALUE) { minOf(UByte.MAX_VALUE, UByte.MAX_VALUE, UByte.MAX_VALUE, UByte.MAX_VALUE) }
+            assertEquals(UByte.MIN_VALUE, minOf(UByte.MIN_VALUE, UByte.MAX_VALUE, 0.toUByte(), 1.toUByte()))
+            
+    }
+
+    @Test
+    fun minOf_vararg_UShort() {
+        expect(1.toUShort()) { minOf(2.toUShort(), 1.toUShort(), 3.toUShort(), 10.toUShort()) }
+        expect(55.toUShort()) { minOf(58.toUShort(), 126.toUShort(), 55.toUShort(), 87.toUShort()) }
+        expect(21.toUShort()) { minOf(Random.nextInt(23..UShort.MAX_VALUE.toInt()).toUShort(), 23.toUShort(), Random.nextInt(23..UShort.MAX_VALUE.toInt()).toUShort(), 21.toUShort()) }
+        expect(UShort.MAX_VALUE) { minOf(UShort.MAX_VALUE, UShort.MAX_VALUE, UShort.MAX_VALUE, UShort.MAX_VALUE) }
+            assertEquals(UShort.MIN_VALUE, minOf(UShort.MIN_VALUE, UShort.MAX_VALUE, 0.toUShort(), 1.toUShort()))
+            
+    }
+
+}
diff --git a/libraries/stdlib/test/unsigned/UNumbersTest.kt b/libraries/stdlib/test/generated/_UnsignedTest.kt
similarity index 92%
rename from libraries/stdlib/test/unsigned/UNumbersTest.kt
rename to libraries/stdlib/test/generated/_UnsignedTest.kt
index 82baa83..d37900e 100644
--- a/libraries/stdlib/test/unsigned/UNumbersTest.kt
+++ b/libraries/stdlib/test/generated/_UnsignedTest.kt
@@ -1,18 +1,58 @@
 /*
- * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Copyright 2010-2020 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.unsigned
 
+//
+// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLibTests.kt
+// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
+//
+
 import kotlin.random.*
 import kotlin.test.*
 
-
-class NumbersTest {
+class _UnsignedTest {
+    @Test
+    fun bits_UInt() {
+        fun test(value: UInt, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < UInt.SIZE_BITS) 1u.shl(UInt.SIZE_BITS - leadingZeroes - 1).toUInt() else 0u
+            val lowestBit = if (trailingZeroes < UInt.SIZE_BITS) 1u.shl(trailingZeroes).toUInt() else 0u
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0u, 0, 32, 32)
+        test(1u, 1, 31, 0)
+        test(2u, 1, 30, 1)
+        test(0xF002u, 5, 16, 1)
+        test(0xF00F0000u, 8, 0, 16)
+    }
 
     @Test
-    fun ubyteBits() {
+    fun bits_ULong() {
+        fun test(value: ULong, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+            assertEquals(oneBits, value.countOneBits())
+            assertEquals(leadingZeroes, value.countLeadingZeroBits())
+            assertEquals(trailingZeroes, value.countTrailingZeroBits())
+            val highestBit = if (leadingZeroes < ULong.SIZE_BITS) 1uL.shl(ULong.SIZE_BITS - leadingZeroes - 1).toULong() else 0uL
+            val lowestBit = if (trailingZeroes < ULong.SIZE_BITS) 1uL.shl(trailingZeroes).toULong() else 0uL
+            assertEquals(highestBit, value.takeHighestOneBit())
+            assertEquals(lowestBit, value.takeLowestOneBit())
+        }
+        test(0uL, 0, 64, 64)
+        test(1uL, 1, 63, 0)
+        test(2uL, 1, 62, 1)
+        test(0xF002uL, 5, 48, 1)
+        test(0xF00F0000uL, 8, 32, 16)
+        test(0x1111_3333_EEEE_0000uL, 4 + 8 + 12, 3, 17)
+    }
+
+    @Test
+    fun bits_UByte() {
         fun test(value: UByte, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
             assertEquals(oneBits, value.countOneBits())
             assertEquals(leadingZeroes, value.countLeadingZeroBits())
@@ -22,7 +62,6 @@
             assertEquals(highestBit, value.takeHighestOneBit())
             assertEquals(lowestBit, value.takeLowestOneBit())
         }
-
         test(0u, 0, 8, 8)
         test(1u, 1, 7, 0)
         test(2u, 1, 6, 1)
@@ -32,7 +71,7 @@
     }
 
     @Test
-    fun ushortBits() {
+    fun bits_UShort() {
         fun test(value: UShort, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
             assertEquals(oneBits, value.countOneBits())
             assertEquals(leadingZeroes, value.countLeadingZeroBits())
@@ -42,7 +81,6 @@
             assertEquals(highestBit, value.takeHighestOneBit())
             assertEquals(lowestBit, value.takeLowestOneBit())
         }
-
         test(0u, 0, 16, 16)
         test(1u, 1, 15, 0)
         test(2u, 1, 14, 1)
@@ -52,52 +90,11 @@
     }
 
     @Test
-    fun uintBits() {
-        fun test(value: UInt, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < UInt.SIZE_BITS) 1u.shl(UInt.SIZE_BITS - leadingZeroes - 1) else 0u
-            val lowestBit = if (trailingZeroes < UInt.SIZE_BITS) 1u.shl(trailingZeroes) else 0u
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0u, 0, 32, 32)
-        test(1u, 1, 31, 0)
-        test(2u, 1, 30, 1)
-        test(0xF002u, 5, 16, 1)
-        test(0xF00F0000u, 8, 0, 16)
-    }
-
-    @Test
-    fun ulongBits() {
-        fun test(value: ULong, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < ULong.SIZE_BITS) 1uL.shl(ULong.SIZE_BITS - leadingZeroes - 1).toULong() else 0u
-            val lowestBit = if (trailingZeroes < ULong.SIZE_BITS) 1uL.shl(trailingZeroes).toULong() else 0u
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0uL, 0, 64, 64)
-        test(1uL, 1, 63, 0)
-        test(2uL, 1, 62, 1)
-        test(0xF002uL, 5, 48, 1)
-        test(0xF00F0000uL, 8, 32, 16)
-        test(0x1111_3333_EEEE_0000uL, 4 + 8 + 12, 3, 17)
-    }
-
-
-    @Test
-    fun uintRotate() {
+    fun rotate_UInt() {
         fun test(value: UInt, n: Int, expected: UInt) {
             assertEquals(expected, value.rotateLeft(n))
             assertEquals(expected, value.rotateRight(-n))
         }
-
         fun testCyclic(value: UInt) {
             for (n in -2 * UInt.SIZE_BITS..2 * UInt.SIZE_BITS) {
                 val rl = value.rotateLeft(n)
@@ -109,7 +106,6 @@
                 assertEquals(value, value.rotateRight(n).rotateRight(-n))
             }
         }
-
         test(0x7_3422345u, 4, 0x3422345_7u)
         test(0x7342234_5u, -4, 0x5_7342234u)
         test(0x73422345u, 1, 0xE684468Au)
@@ -119,40 +115,11 @@
     }
 
     @Test
-    fun ubyteRotate() {
-        fun test(value: UByte, n: Int, expected: UByte) {
-            assertEquals(expected, value.rotateLeft(n))
-            assertEquals(expected, value.rotateRight(-n))
-        }
-
-        fun testCyclic(value: UByte) {
-            for (n in -2 * UByte.SIZE_BITS..2 * UByte.SIZE_BITS) {
-                val rl = value.rotateLeft(n)
-                val rr = value.rotateRight(-n)
-                assertEquals(rl, rr)
-                assertEquals(rl, value.rotateLeft(n % UByte.SIZE_BITS))
-                assertEquals(rr, value.rotateRight((-n) % UByte.SIZE_BITS))
-                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
-                assertEquals(value, value.rotateRight(n).rotateRight(-n))
-            }
-        }
-
-        test(0x73u, 4, 0x37u)
-        test(0x73u, -3, 0x6Eu)
-        test(0x73u, 1, 0xE6u)
-        test(0xE6u, 1, 0xCDu)
-        repeat(100) {
-            testCyclic(Random.nextInt().toUByte())
-        }
-    }
-
-    @Test
-    fun ulongRotate() {
+    fun rotate_ULong() {
         fun test(value: ULong, n: Int, expected: ULong) {
             assertEquals(expected, value.rotateLeft(n))
             assertEquals(expected, value.rotateRight(-n))
         }
-
         fun testCyclic(value: ULong) {
             for (n in -2 * ULong.SIZE_BITS..2 * ULong.SIZE_BITS) {
                 val rl = value.rotateLeft(n)
@@ -164,7 +131,6 @@
                 assertEquals(value, value.rotateRight(n).rotateRight(-n))
             }
         }
-
         test(0x7372ABAC_DEEF0123uL, 4, 0x372ABAC_DEEF01237uL)
         test(0x88888888_44444444uL, -3, 0x91111111_08888888uL)
         test(0x88888888_44444444uL,  1, 0x11111110_88888889uL)
@@ -174,12 +140,37 @@
     }
 
     @Test
-    fun ushortRotate() {
+    fun rotate_UByte() {
+        fun test(value: UByte, n: Int, expected: UByte) {
+            assertEquals(expected, value.rotateLeft(n))
+            assertEquals(expected, value.rotateRight(-n))
+        }
+        fun testCyclic(value: UByte) {
+            for (n in -2 * UByte.SIZE_BITS..2 * UByte.SIZE_BITS) {
+                val rl = value.rotateLeft(n)
+                val rr = value.rotateRight(-n)
+                assertEquals(rl, rr)
+                assertEquals(rl, value.rotateLeft(n % UByte.SIZE_BITS))
+                assertEquals(rr, value.rotateRight((-n) % UByte.SIZE_BITS))
+                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                assertEquals(value, value.rotateRight(n).rotateRight(-n))
+            }
+        }
+        test(0x73u, 4, 0x37u)
+        test(0x73u, -3, 0x6Eu)
+        test(0x73u, 1, 0xE6u)
+        test(0xE6u, 1, 0xCDu)
+        repeat(100) {
+            testCyclic(Random.nextInt().toUByte())
+        }
+    }
+
+    @Test
+    fun rotate_UShort() {
         fun test(value: UShort, n: Int, expected: UShort) {
             assertEquals(expected, value.rotateLeft(n))
             assertEquals(expected, value.rotateRight(-n))
         }
-
         fun testCyclic(value: UShort) {
             for (n in -2 * UShort.SIZE_BITS..2 * UShort.SIZE_BITS) {
                 val rl = value.rotateLeft(n)
@@ -191,7 +182,6 @@
                 assertEquals(value, value.rotateRight(n).rotateRight(-n))
             }
         }
-
         test(0x7361u, 4, 0x3617u)
         test(0x7361u, -3, 0b001_0111_0011_0110_0u)
         test(0x7361u, 1,  0b111_0011_0110_0001_0u)
@@ -201,4 +191,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/libraries/stdlib/test/numbers/NumbersTest.kt b/libraries/stdlib/test/numbers/NumbersTest.kt
index 990899e..cdf6a96 100644
--- a/libraries/stdlib/test/numbers/NumbersTest.kt
+++ b/libraries/stdlib/test/numbers/NumbersTest.kt
@@ -6,7 +6,6 @@
 package test.numbers
 
 import test.isFloat32RangeEnforced
-import kotlin.random.Random
 import kotlin.test.*
 
 object NumbersTestConstants {
@@ -252,194 +251,4 @@
         testSizes(ULong, ULong.SIZE_BYTES, ULong.SIZE_BITS, 8)
     }
 
-    @Test
-    fun byteBits() {
-        fun test(value: Byte, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < Byte.SIZE_BITS) 1.shl(Byte.SIZE_BITS - leadingZeroes - 1).toByte() else 0
-            val lowestBit = if (trailingZeroes < Byte.SIZE_BITS) 1.shl(trailingZeroes).toByte() else 0
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0, 0, 8, 8)
-        test(1, 1, 7, 0)
-        test(2, 1, 6, 1)
-        test(0x44, 2, 1, 2)
-        test(0x80.toByte(), 1, 0, 7)
-        test(0xF0.toByte(), 4, 0, 4)
-    }
-
-    @Test
-    fun shortBits() {
-        fun test(value: Short, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < Short.SIZE_BITS) 1.shl(Short.SIZE_BITS - leadingZeroes - 1).toShort() else 0
-            val lowestBit = if (trailingZeroes < Short.SIZE_BITS) 1.shl(trailingZeroes).toShort() else 0
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0, 0, 16, 16)
-        test(1, 1, 15, 0)
-        test(2, 1, 14, 1)
-        test(0xF2, 5, 8, 1)
-        test(0x8000.toShort(), 1, 0, 15)
-        test(0xF200.toShort(), 5, 0, 9)
-    }
-
-    @Test
-    fun intBits() {
-        fun test(value: Int, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < Int.SIZE_BITS) 1.shl(Int.SIZE_BITS - leadingZeroes - 1) else 0
-            val lowestBit = if (trailingZeroes < Int.SIZE_BITS) 1.shl(trailingZeroes) else 0
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0, 0, 32, 32)
-        test(1, 1, 31, 0)
-        test(2, 1, 30, 1)
-        test(0xF002, 5, 16, 1)
-        test(0xF00F0000.toInt(), 8, 0, 16)
-    }
-
-    @Test
-    fun longBits() {
-        fun test(value: Long, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
-            assertEquals(oneBits, value.countOneBits())
-            assertEquals(leadingZeroes, value.countLeadingZeroBits())
-            assertEquals(trailingZeroes, value.countTrailingZeroBits())
-            val highestBit = if (leadingZeroes < Long.SIZE_BITS) 1L.shl(Long.SIZE_BITS - leadingZeroes - 1).toLong() else 0
-            val lowestBit = if (trailingZeroes < Long.SIZE_BITS) 1L.shl(trailingZeroes).toLong() else 0
-            assertEquals(highestBit, value.takeHighestOneBit())
-            assertEquals(lowestBit, value.takeLowestOneBit())
-        }
-
-        test(0, 0, 64, 64)
-        test(1, 1, 63, 0)
-        test(2, 1, 62, 1)
-        test(0xF002, 5, 48, 1)
-        test(0xF00F0000L, 8, 32, 16)
-        test(0x1111_3333_EEEE_0000L, 4 + 8 + 12, 3, 17)
-    }
-
-
-    @Test
-    fun intRotate() {
-        fun test(value: Int, n: Int, expected: Int) {
-            assertEquals(expected, value.rotateLeft(n))
-            assertEquals(expected, value.rotateRight(-n))
-        }
-
-        fun testCyclic(value: Int) {
-            for (n in -2 * Int.SIZE_BITS..2 * Int.SIZE_BITS) {
-                val rl = value.rotateLeft(n)
-                val rr = value.rotateRight(-n)
-                assertEquals(rl, rr)
-                assertEquals(rl, value.rotateLeft(n % Int.SIZE_BITS))
-                assertEquals(rr, value.rotateRight((-n) % Int.SIZE_BITS))
-                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
-                assertEquals(value, value.rotateRight(n).rotateRight(-n))
-            }
-        }
-
-        test(0x7_3422345, 4, 0x3422345_7)
-        test(0x7342234_5, -4, 0x5_7342234)
-        test(0x73422345, 1, 0xE684468A.toInt())
-        repeat(100) {
-            testCyclic(Random.nextInt())
-        }
-    }
-
-    @Test
-    fun byteRotate() {
-        fun test(value: Byte, n: Int, expected: Byte) {
-            assertEquals(expected, value.rotateLeft(n))
-            assertEquals(expected, value.rotateRight(-n))
-        }
-
-        fun testCyclic(value: Byte) {
-            for (n in -2 * Byte.SIZE_BITS..2 * Byte.SIZE_BITS) {
-                val rl = value.rotateLeft(n)
-                val rr = value.rotateRight(-n)
-                assertEquals(rl, rr)
-                assertEquals(rl, value.rotateLeft(n % Byte.SIZE_BITS))
-                assertEquals(rr, value.rotateRight((-n) % Byte.SIZE_BITS))
-                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
-                assertEquals(value, value.rotateRight(n).rotateRight(-n))
-            }
-        }
-
-        test(0x73, 4, 0x37)
-        test(0x73, -3, 0x6E)
-        test(0x73, 1, 0xE6.toByte())
-        test(0xE6.toByte(), 1, 0xCD.toByte())
-        repeat(100) {
-            testCyclic(Random.nextInt().toByte())
-        }
-    }
-
-    @Test
-    fun longRotate() {
-        fun test(value: Long, n: Int, expected: Long) {
-            assertEquals(expected, value.rotateLeft(n))
-            assertEquals(expected, value.rotateRight(-n))
-        }
-
-        fun testCyclic(value: Long) {
-            for (n in -2 * Long.SIZE_BITS..2 * Long.SIZE_BITS) {
-                val rl = value.rotateLeft(n)
-                val rr = value.rotateRight(-n)
-                assertEquals(rl, rr)
-                assertEquals(rl, value.rotateLeft(n % Long.SIZE_BITS))
-                assertEquals(rr, value.rotateRight((-n) % Long.SIZE_BITS))
-                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
-                assertEquals(value, value.rotateRight(n).rotateRight(-n))
-            }
-        }
-
-        test(0x7372ABAC_DEEF0123, 4, 0x372ABAC_DEEF01237)
-        test(0x88888888_44444444U.toLong(), -3, 0x91111111_08888888u.toLong())
-        test(0x88888888_44444444U.toLong(),  1, 0x11111110_88888889)
-        repeat(100) {
-            testCyclic(Random.nextLong())
-        }
-    }
-
-    @Test
-    fun shortRotate() {
-        fun test(value: Short, n: Int, expected: Short) {
-            assertEquals(expected, value.rotateLeft(n))
-            assertEquals(expected, value.rotateRight(-n))
-        }
-
-        fun testCyclic(value: Short) {
-            for (n in -2 * Short.SIZE_BITS..2 * Short.SIZE_BITS) {
-                val rl = value.rotateLeft(n)
-                val rr = value.rotateRight(-n)
-                assertEquals(rl, rr)
-                assertEquals(rl, value.rotateLeft(n % Short.SIZE_BITS))
-                assertEquals(rr, value.rotateRight((-n) % Short.SIZE_BITS))
-                assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
-                assertEquals(value, value.rotateRight(n).rotateRight(-n))
-            }
-        }
-
-        test(0x7361, 4, 0x3617)
-        test(0x7361, -3, 0b001_0111_0011_0110_0)
-        test(0x7361, 1,  0b111_0011_0110_0001_0.toShort())
-        test(0xE6C2.toShort(), 1, 0b11_0011_0110_0001_01.toShort())
-        repeat(100) {
-            testCyclic(Random.nextInt().toShort())
-        }
-    }
-
 }
\ No newline at end of file
diff --git a/libraries/stdlib/test/testUtils.kt b/libraries/stdlib/test/testUtils.kt
index 8b16cf2..2ea0a9f 100644
--- a/libraries/stdlib/test/testUtils.kt
+++ b/libraries/stdlib/test/testUtils.kt
@@ -23,8 +23,16 @@
 }
 
 
-fun assertArrayContentEquals(expected: ByteArray, actual: ByteArray, message: String? = null)     = assertTrue(expected contentEquals actual, message)
-fun assertArrayContentEquals(expected: CharArray, actual: CharArray, message: String? = null)     = assertTrue(expected contentEquals actual, message)
+fun <T> assertArrayContentEquals(expected: Array<out T>, actual: Array<out T>, message: String? = null) = assertTrue(expected contentEquals actual, message)
+
+fun assertArrayContentEquals(expected: ByteArray, actual: ByteArray, message: String? = null)       = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: ShortArray, actual: ShortArray, message: String? = null)     = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: IntArray, actual: IntArray, message: String? = null)         = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: LongArray, actual: LongArray, message: String? = null)       = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: FloatArray, actual: FloatArray, message: String? = null)     = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: DoubleArray, actual: DoubleArray, message: String? = null)   = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: BooleanArray, actual: BooleanArray, message: String? = null) = assertTrue(expected contentEquals actual, message)
+fun assertArrayContentEquals(expected: CharArray, actual: CharArray, message: String? = null)       = assertTrue(expected contentEquals actual, message)
 
 fun assertArrayContentEquals(expected: UIntArray, actual: UIntArray, message: String? = null)     = assertTrue(expected contentEquals actual, message)
 fun assertArrayContentEquals(expected: ULongArray, actual: ULongArray, message: String? = null)   = assertTrue(expected contentEquals actual, message)
diff --git a/libraries/stdlib/test/unsigned/UComparisonsTest.kt b/libraries/stdlib/test/unsigned/UComparisonsTest.kt
deleted file mode 100644
index a8fc24b..0000000
--- a/libraries/stdlib/test/unsigned/UComparisonsTest.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2010-2019 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 unsigned
-
-import kotlin.test.Test
-import kotlin.test.expect
-
-class UComparisonsTest {
-
-    @Test
-    fun minOf_2() {
-        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte()) }
-        expect(58.toUShort()) { minOf(58.toUShort(), 32768.toUShort()) }
-        expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE) }
-        expect(42312uL) { minOf(42312uL, 42312uL) }
-    }
-
-    @Test
-    fun minOf_3() {
-        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte(), 3.toUByte()) }
-        expect(55.toUShort()) { minOf(58.toUShort(), 32768.toUShort(), 55.toUShort()) }
-        expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) }
-        expect(42312uL) { minOf(42312uL, 42312uL, 42312uL) }
-    }
-
-    @Test
-    fun minOf_vararg() {
-        expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte(), 3.toUByte(), 2.toUByte(), 10.toUByte()) }
-        expect(55.toUShort()) { minOf(58.toUShort(), 32768.toUShort(), 55.toUShort(), 2423.toUShort()) }
-        expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u, 1000u, (-1).toUInt(), Int.MAX_VALUE.toUInt()) }
-        expect(42312uL) { minOf(42312uL, 42312uL, 42312uL, 42312uL) }
-    }
-
-    @Test
-    fun maxOf_2() {
-        expect(2.toUByte()) { maxOf(2.toUByte(), 1.toUByte()) }
-        expect(32768.toUShort()) { maxOf(58.toUShort(), 32768.toUShort()) }
-        expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE) }
-        expect(42312uL) { maxOf(42312uL, 42312uL) }
-    }
-
-    @Test
-    fun maxOf_3() {
-        expect(3.toUByte()) { maxOf(2.toUByte(), 1.toUByte(), 3.toUByte()) }
-        expect(32768.toUShort()) { maxOf(58.toUShort(), 32768.toUShort(), 55.toUShort()) }
-        expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) }
-        expect(42312uL) { maxOf(42312uL, 42312uL, 42312uL) }
-    }
-
-    @Test
-    fun maxOf_vararg() {
-        expect(10.toUByte()) { maxOf(2.toUByte(), 1.toUByte(), 3.toUByte(), 2.toUByte(), 10.toUByte()) }
-        expect(32768.toUShort()) { maxOf(58.toUShort(), 32768.toUShort(), 55.toUShort(), 2423.toUShort()) }
-        expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u, 1000u, (-1).toUInt(), Int.MAX_VALUE.toUInt()) }
-        expect(42312uL) { maxOf(42312uL, 42312uL, 42312uL, 42312uL) }
-    }
-}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/AggregatesTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/AggregatesTest.kt
new file mode 100644
index 0000000..991b8c9
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/AggregatesTest.kt
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object AggregatesTest : TestTemplateGroupBase() {
+
+    val f_minByOrNull = test("minByOrNull()") {
+        includeDefault()
+        include(ArraysOfUnsigned)
+    } builder {
+
+        body {
+            """
+            assertEquals(null, ${of()}.minByOrNull { it })
+            assertEquals(ONE, ${of(1)}.minByOrNull { it })
+            assertEquals(TWO, ${of(3, 2)}.minByOrNull { it * it })
+            assertEquals(THREE, ${of(3, 2)}.minByOrNull { "a" })
+            assertEquals(TWO, ${of(3, 2)}.minByOrNull { it.toString() })
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects, ArraysOfPrimitives) {
+            """
+            assertEquals(THREE, ${of(2, 3)}.minByOrNull { -it })
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects) {
+            """
+            assertEquals('a', $of('a', 'b').minByOrNull { "x${"$"}it" })
+            assertEquals("b", $of("b", "abc").minByOrNull { it.length })
+            """
+        }
+
+        bodyAppend(PrimitiveType.Long) {
+            """
+            assertEquals(2000000000000, longArrayOf(3000000000000, 2000000000000).minByOrNull { it + 1 })
+            """
+        }
+        body(PrimitiveType.Boolean) {
+            """
+            assertEquals(false, booleanArrayOf(true, false).minByOrNull { it.toString() })
+            assertEquals(true, booleanArrayOf(true, false).minByOrNull { it.toString().length })
+            """
+        }
+        body(PrimitiveType.Char) {
+            """
+            assertEquals('a', charArrayOf('a', 'b').minByOrNull { "x${"$"}it" })
+            assertEquals('b', charArrayOf('b', 'a').minByOrNull { "${"$"}it".length })
+            """
+        }
+    }
+
+    val f_maxByOrNull = test("maxByOrNull()") {
+        includeDefault()
+        include(ArraysOfUnsigned)
+    } builder {
+
+        body {
+            """
+            assertEquals(null, ${of()}.maxByOrNull { it })
+            assertEquals(ONE, ${of(1)}.maxByOrNull { it })
+            assertEquals(THREE, ${of(3, 2)}.maxByOrNull { it * it })
+            assertEquals(THREE, ${of(3, 2)}.maxByOrNull { "a" })
+            assertEquals(THREE, ${of(3, 2)}.maxByOrNull { it.toString() })
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects, ArraysOfPrimitives) {
+            """
+            assertEquals(TWO, ${of(2, 3)}.maxByOrNull { -it })
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects) {
+            """
+            assertEquals('b', $of('a', 'b').maxByOrNull { "x${"$"}it" })
+            assertEquals("abc", $of("b", "abc").maxByOrNull { it.length })
+            """
+        }
+
+        bodyAppend(PrimitiveType.Long) {
+            """
+            assertEquals(3000000000000, longArrayOf(3000000000000, 2000000000000).maxByOrNull { it + 1 })
+            """
+        }
+        body(PrimitiveType.Boolean) {
+            """
+            assertEquals(true, booleanArrayOf(true, false).maxByOrNull { it.toString() })
+            assertEquals(false, booleanArrayOf(true, false).maxByOrNull { it.toString().length })
+            """
+        }
+        body(PrimitiveType.Char) {
+            """
+            assertEquals('b', charArrayOf('a', 'b').maxByOrNull { "x${"$"}it" })
+            assertEquals('b', charArrayOf('b', 'a').maxByOrNull { "${"$"}it".length })
+            """
+        }
+    }
+
+    val f_minWithOrNull = test("minWithOrNull()") {
+        includeDefault()
+        include(ArraysOfUnsigned)
+        exclude(PrimitiveType.Boolean, PrimitiveType.Char)
+    } builder {
+
+        body {
+            """
+            assertEquals(null, ${of()}.minWithOrNull(naturalOrder()))
+            assertEquals(ONE, ${of(1)}.minWithOrNull(naturalOrder()))
+            assertEquals(${literal(4)}, ${of(2, 3, 4)}.minWithOrNull(compareBy { it % ${literal(4)} }))
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects) {
+            """
+            assertEquals("a", $of("a", "B").minWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+            """
+        }
+    }
+
+    val f_maxWithOrNull = test("maxWithOrNull()") {
+        includeDefault()
+        include(ArraysOfUnsigned)
+        exclude(PrimitiveType.Boolean, PrimitiveType.Char)
+    } builder {
+
+        body {
+            """
+            assertEquals(null, ${of()}.maxWithOrNull(naturalOrder()))
+            assertEquals(ONE, ${of(1)}.maxWithOrNull(naturalOrder()))
+            assertEquals(${literal(3)}, ${of(2, 3, 4)}.maxWithOrNull(compareBy { it % ${literal(4)} }))
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects) {
+            """
+            assertEquals("B", $of("a", "B").maxWithOrNull(STRING_CASE_INSENSITIVE_ORDER))
+            """
+        }
+    }
+
+    val f_foldIndexed = test("foldIndexed()") {
+        includeDefault()
+        include(ArraysOfUnsigned)
+        exclude(PrimitiveType.Boolean, PrimitiveType.Char)
+    } builder {
+
+        body {
+            """
+            expect(${literal(8)}) { ${of(1, 2, 3)}.foldIndexed(ZERO) { i, acc, e -> acc + i.to$P() * e } }
+            expect(10) { ${of(1, 2, 3)}.foldIndexed(1) { i, acc, e -> acc + i + e.toInt() } }
+            expect(${literal(15)}) { ${of(1, 2, 3)}.foldIndexed(ONE) { i, acc, e -> acc * (i.to$P() + e) } }
+            expect(" 0-${toString(1)} 1-${toString(2)} 2-${toString(3)}") { ${of(1, 2, 3)}.foldIndexed("") { i, acc, e -> "${"$"}acc ${"$"}i-${"$"}e" } }
+            
+            expect(${literal(42)}) {
+                val numbers = ${of(1, 2, 3, 4)}
+                numbers.foldIndexed(ZERO) { index, a, b -> index.to$P() * (a + b) }
+            }
+    
+            expect(ZERO) {
+                val numbers = ${of()}
+                numbers.foldIndexed(ZERO) { index, a, b -> index.to$P() * (a + b) }
+            }
+    
+            expect("${toString(1)}${toString(1)}${toString(2)}${toString(3)}${toString(4)}") {
+                val numbers = ${of(1, 2, 3, 4)}
+                numbers.map { it.toString() }.foldIndexed("") { index, a, b -> if (index == 0) a + b + b else a + b }
+            }
+            """
+        }
+    }
+
+    val f_foldRightIndexed = test("foldRightIndexed()") {
+        include(Lists, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+        exclude(PrimitiveType.Boolean, PrimitiveType.Char)
+    } builder {
+
+        body {
+            """
+            expect(${literal(8)}) { ${of(1, 2, 3)}.foldRightIndexed(ZERO) { i, e, acc -> acc + i.to$P() * e } }
+            expect(10) { ${of(1, 2, 3)}.foldRightIndexed(1) { i, e, acc -> acc + i + e.toInt() } }
+            expect(${literal(15)}) { ${of(1, 2, 3)}.foldRightIndexed(ONE) { i, e, acc -> acc * (i.to$P() + e) } }
+            expect(" 2-${toString(3)} 1-${toString(2)} 0-${toString(1)}") { ${of(1, 2, 3)}.foldRightIndexed("") { i, e, acc -> "${"$"}acc ${"$"}i-${"$"}e" } }
+            
+            expect("${toString(1)}${toString(2)}${toString(3)}${toString(4)}3210") {
+                val numbers = ${of(1, 2, 3, 4)}
+                numbers.map { it.toString() }.foldRightIndexed("") { index, a, b -> a + b + index }
+            }
+            """
+        }
+    }
+}
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/ArraysTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ArraysTest.kt
new file mode 100644
index 0000000..e14d404
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ArraysTest.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object ArraysTest : TestTemplateGroupBase() {
+
+    val f_copyInto = test("copyInto()") {
+        include(ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+        exclude(PrimitiveType.Boolean)
+    } builder {
+        body {
+            """
+            val dest = ${of(1, 2, 3)}
+            val newValues = ${of(4, 5, 6)}
+            
+            newValues.copyInto(dest, 0, 1, 3)
+            val result1 = ${of(5, 6, 3)}
+            assertTrue(result1 contentEquals dest, "Copying from newValues: ${"$"}{result1.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 0, 1, 3)
+            val result2 = ${of(6, 3, 3)}
+            assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 1, 0, 2)
+            val result3 = ${of(6, 6, 3)}
+            assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}")
+            """
+        }
+        body(PrimitiveType.Char) {
+            """
+            val dest = $of('a', 'b', 'c')
+            val newValues = $of('e', 'f', 'g')
+            newValues.copyInto(dest, 0, 1, 3)
+            
+            val result1 = $of('f', 'g', 'c')
+            assertTrue(result1 contentEquals dest, "Copying from newValues: ${"$"}{result1.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 0, 1, 3)
+            val result2 = $of('g', 'c', 'c')
+            assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 1, 0, 2)
+            val result3 = $of('g', 'g', 'c')
+            assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}") 
+            """
+        }
+        body(ArraysOfObjects) {
+            """
+            val dest = arrayOf("a", "b", "c")
+            val newValues = arrayOf("e", "f", "g")
+            newValues.copyInto(dest, 0, 1, 3)
+            
+            val result1 = arrayOf("f", "g", "c")
+            assertTrue(result1 contentEquals dest, "Copying from newValues: ${"$"}{result1.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 0, 1, 3)
+            val result2 = arrayOf("g", "c", "c")
+            assertTrue(result2 contentEquals dest, "Overlapping backward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}")
+
+            dest.copyInto(dest, 1, 0, 2)
+            val result3 = arrayOf("g", "g", "c")
+            assertTrue(result3 contentEquals dest, "Overlapping forward copy: ${"$"}{result2.contentToString()}, ${"$"}{dest.contentToString()}")
+            """
+        }
+        bodyAppend {
+            """
+            for ((start, end) in listOf(-1 to 0, 0 to 4, 4 to 4, 1 to 0, 0 to -1)) {
+                val bounds = "start: ${"$"}start, end: ${"$"}end"
+                val ex = assertFails(bounds) { newValues.copyInto(dest, 0, start, end) }
+                assertTrue(ex is IllegalArgumentException || ex is IndexOutOfBoundsException, "Unexpected exception type: ${"$"}ex")
+            }
+            for (destIndex in listOf(-1, 2, 4)) {
+                assertFailsWith<IndexOutOfBoundsException>("index: ${"$"}destIndex") { newValues.copyInto(dest, destIndex, 0, 2) }
+            } 
+            """
+        }
+    }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/ComparablesTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ComparablesTest.kt
new file mode 100644
index 0000000..c1fa557
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ComparablesTest.kt
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object ComparablesTest : TestTemplateGroupBase() {
+
+    private val Family.sourceFileComparisons: SourceFile
+        get() = when (this) {
+            Generic, Primitives -> SourceFile.Comparisons
+            Unsigned -> SourceFile.UComparisons
+            else -> error(this)
+        }
+
+
+    val f_minOf_2 = test("minOf_2()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val minOf = if (f == Generic) "minOf<${p.name}>" else "minOf"
+        body {
+            """
+            expect(${toP(1)}) { $minOf(${toP(2)}, ${toP(1)}) }
+            expect(${toP(58)}) { $minOf(${toP(58)}, ${toP(126)}) }
+            expect(${toP(23)}) { $minOf(${p.randomNextFrom(23)}, ${toP(23)}) }
+            expect(MIN_VALUE) { $minOf(MIN_VALUE, MAX_VALUE) }
+            expect(MAX_VALUE) { $minOf(MAX_VALUE, MAX_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                assertEquals(-ZERO, $minOf(ZERO, -ZERO))
+                assertEquals(-ZERO, $minOf(-ZERO, ZERO))
+                assertEquals(NEGATIVE_INFINITY, $minOf(NEGATIVE_INFINITY, POSITIVE_INFINITY))
+                """
+            }
+        }
+    }
+
+    val f_minOf_3 = test("minOf_3()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val minOf = if (f == Generic) "minOf<${p.name}>" else "minOf"
+        body {
+            """
+            expect(${toP(1)}) { $minOf(${toP(2)}, ${toP(1)}, ${toP(3)}) }
+            expect(${toP(55)}) { $minOf(${toP(58)}, ${toP(126)}, ${toP(55)}) }
+            expect(${toP(23)}) { $minOf(${p.randomNextFrom(23)}, ${toP(23)}, ${p.randomNextFrom(23)}) }
+            expect(MAX_VALUE) { $minOf(MAX_VALUE, MAX_VALUE, MAX_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                expect(ZERO) { $minOf(MIN_VALUE, MAX_VALUE, ZERO) }
+                assertEquals(-ZERO, $minOf(ZERO, -ZERO, -ZERO))
+                assertEquals(-ZERO, $minOf(-ZERO, ZERO, ZERO))
+                assertEquals(MIN_VALUE, $minOf(POSITIVE_INFINITY, MAX_VALUE, MIN_VALUE))
+                """
+            }
+        } else {
+            bodyAppend {
+                """
+                expect(MIN_VALUE) { $minOf(MIN_VALUE, MAX_VALUE, ZERO) }
+                """
+            }
+        }
+    }
+
+    val f_minOf_vararg = test("minOf_vararg()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val minOf = if (f == Generic) "minOf<${p.name}>" else "minOf"
+        body {
+            """
+            expect(${toP(1)}) { $minOf(${toP(2)}, ${toP(1)}, ${toP(3)}, ${toP(10)}) }
+            expect(${toP(55)}) { $minOf(${toP(58)}, ${toP(126)}, ${toP(55)}, ${toP(87)}) }
+            expect(${toP(21)}) { $minOf(${p.randomNextFrom(23)}, ${toP(23)}, ${p.randomNextFrom(23)}, ${toP(21)}) }
+            expect(MAX_VALUE) { $minOf(MAX_VALUE, MAX_VALUE, MAX_VALUE, MAX_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                assertEquals(ZERO, $minOf(MIN_VALUE, MAX_VALUE, ${toP(0)}, ${toP(1)}))
+                assertEquals(-ZERO, $minOf(ZERO, -ZERO, -ZERO, ZERO))
+                assertEquals(-ZERO, $minOf(-ZERO, ZERO, ZERO, -ZERO))
+                assertEquals(NEGATIVE_INFINITY, $minOf(POSITIVE_INFINITY, NEGATIVE_INFINITY, MAX_VALUE, MIN_VALUE))
+                """
+            }
+        } else {
+            bodyAppend {
+                """
+                assertEquals(MIN_VALUE, $minOf(MIN_VALUE, MAX_VALUE, ${toP(0)}, ${toP(1)}))
+                """
+            }
+        }
+    }
+
+    val f_maxOf_2 = test("maxOf_2()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val maxOf = if (f == Generic) "maxOf<${p.name}>" else "maxOf"
+        body {
+            """
+            expect(${toP(2)}) { $maxOf(${toP(2)}, ${toP(1)}) }
+            expect(${toP(126)}) { $maxOf(${toP(58)}, ${toP(126)}) }
+            expect(${toP(23)}) { $maxOf(${p.randomNextUntil(23)}, ${toP(23)}) }
+            expect(MAX_VALUE) { $maxOf(MIN_VALUE, MAX_VALUE) }
+            expect(MIN_VALUE) { $maxOf(MIN_VALUE, MIN_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                assertEquals(ZERO, $maxOf(ZERO, -ZERO))
+                assertEquals(ZERO, $maxOf(-ZERO, ZERO))
+                assertEquals(POSITIVE_INFINITY, $maxOf(NEGATIVE_INFINITY, POSITIVE_INFINITY))
+                """
+            }
+        }
+    }
+
+    val f_maxOf_3 = test("maxOf_3()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val maxOf = if (f == Generic) "maxOf<${p.name}>" else "maxOf"
+        body {
+            """
+            expect(${toP(3)}) { $maxOf(${toP(2)}, ${toP(1)}, ${toP(3)}) }
+            expect(${toP(126)}) { $maxOf(${toP(58)}, ${toP(126)}, ${toP(55)}) }
+            expect(${toP(23)}) { $maxOf(${p.randomNextUntil(23)}, ${toP(23)}, ${p.randomNextUntil(23)}) }
+            expect(MIN_VALUE) { $maxOf(MIN_VALUE, MIN_VALUE, MIN_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                expect(MAX_VALUE) { $maxOf(MIN_VALUE, MAX_VALUE, ${toP(0)}) }
+                assertEquals(ZERO, $maxOf(ZERO, -ZERO, -ZERO))
+                assertEquals(ZERO, $maxOf(-ZERO, ZERO, ZERO))
+                assertEquals(POSITIVE_INFINITY, $maxOf(POSITIVE_INFINITY, MAX_VALUE, MIN_VALUE))
+                """
+            }
+        } else {
+            bodyAppend {
+                """
+                expect(MAX_VALUE) { $maxOf(MIN_VALUE, MAX_VALUE, ${toP(0)}) }
+                """
+            }
+        }
+    }
+
+    val f_maxOf_vararg = test("maxOf_vararg()") {
+        include(Generic)
+        include(Primitives, PrimitiveType.numericPrimitives)
+        include(Unsigned)
+    } builder {
+        sourceFile(f.sourceFileComparisons)
+
+        val p = primitive ?: PrimitiveType.Int
+        val maxOf = if (f == Generic) "maxOf<${p.name}>" else "maxOf"
+        body {
+            """
+            expect(${toP(10)}) { $maxOf(${toP(2)}, ${toP(1)}, ${toP(3)}, ${toP(10)}) }
+            expect(${toP(126)}) { $maxOf(${toP(58)}, ${toP(126)}, ${toP(55)}, ${toP(87)}) }
+            expect(${toP(23)}) { $maxOf(${p.randomNextUntil(23)}, ${toP(23)}, ${p.randomNextUntil(23)}, ${toP(21)}) }
+            expect(MIN_VALUE) { $maxOf(MIN_VALUE, MIN_VALUE, MIN_VALUE, MIN_VALUE) }
+            """
+        }
+        if (p.isFloatingPoint()) {
+            bodyAppend {
+                """
+                expect(MAX_VALUE) { $maxOf(MIN_VALUE, MAX_VALUE, ${toP(0)}, ${toP(1)}) }
+                assertEquals(ZERO, $maxOf(ZERO, -ZERO, -ZERO, ZERO))
+                assertEquals(ZERO, $maxOf(-ZERO, ZERO, ZERO, -ZERO))
+                assertEquals(POSITIVE_INFINITY, $maxOf(POSITIVE_INFINITY, NEGATIVE_INFINITY, MAX_VALUE, MIN_VALUE))
+                """
+            }
+        } else {
+            bodyAppend {
+                """
+                expect(MAX_VALUE) { $maxOf(MIN_VALUE, MAX_VALUE, ${toP(0)}, ${toP(1)}) }
+                """
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/ElementsTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ElementsTest.kt
new file mode 100644
index 0000000..8ddfd4c
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/ElementsTest.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object ElementsTest : TestTemplateGroupBase() {
+
+    val f_indexOf = test("indexOf()") {
+        include(Lists, Sequences, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        specialFor(ArraysOfPrimitives) {
+            if (primitive!!.isFloatingPoint()) annotation("""@Suppress("DEPRECATION")""")
+        }
+        body {
+            """
+            expect(-1) { ${of(1, 2, 3)}.indexOf(ZERO) }
+            expect(0) { ${of(1, 2, 3)}.indexOf(ONE) }
+            expect(1) { ${of(1, 2, 3)}.indexOf(TWO) }
+            expect(2) { ${of(1, 2, 3)}.indexOf(THREE) } 
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects, Lists) {
+            """
+            expect(-1) { $of("cat", "dog", "bird").indexOf("mouse") }
+            expect(0) { $of("cat", "dog", "bird").indexOf("cat") }
+            expect(1) { $of("cat", "dog", "bird").indexOf("dog") }
+            expect(2) { $of("cat", "dog", "bird").indexOf("bird") }
+            expect(0) { $of(null, "dog", null).indexOf(null as String?)}
+            """
+        }
+        body(PrimitiveType.Char) {
+            """
+            expect(-1) { charArrayOf('a', 'b', 'c').indexOf('z') }
+            expect(0) { charArrayOf('a', 'b', 'c').indexOf('a') }
+            expect(1) { charArrayOf('a', 'b', 'c').indexOf('b') }
+            expect(2) { charArrayOf('a', 'b', 'c').indexOf('c') } 
+            """
+        }
+        body(PrimitiveType.Boolean) {
+            """
+            expect(0) { booleanArrayOf(true, false).indexOf(true) }
+            expect(1) { booleanArrayOf(true, false).indexOf(false) }
+            expect(-1) { booleanArrayOf(true).indexOf(false) } 
+            """
+        }
+    }
+
+    val f_indexOfFirst = test("indexOfFirst()") {
+        include(Lists, Sequences, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        body {
+            """
+            expect(-1) { ${of(1, 2, 3)}.indexOfFirst { it == ${toP(0)} } }
+            expect(0) { ${of(1, 2, 3)}.indexOfFirst { it % TWO == ONE } }
+            expect(1) { ${of(1, 2, 3)}.indexOfFirst { it % TWO == ZERO } }
+            expect(2) { ${of(1, 2, 3)}.indexOfFirst { it == ${toP(3)} } }
+            """
+        }
+        bodyAppend(Iterables, Sequences, ArraysOfObjects, Lists) {
+            """
+            expect(-1) { $of("cat", "dog", "bird").indexOfFirst { it.contains("p") } }
+            expect(0) { $of("cat", "dog", "bird").indexOfFirst { it.startsWith('c') } }
+            expect(1) { $of("cat", "dog", "bird").indexOfFirst { it.startsWith('d') } }
+            expect(2) { $of("cat", "dog", "bird").indexOfFirst { it.endsWith('d') } }
+            """
+        }
+        body(PrimitiveType.Char) {
+            """
+            expect(-1) { charArrayOf('a', 'b', 'c').indexOfFirst { it == 'z' } }
+            expect(0) { charArrayOf('a', 'b', 'c').indexOfFirst { it < 'c' } }
+            expect(1) { charArrayOf('a', 'b', 'c').indexOfFirst { it > 'a' } }
+            expect(2) { charArrayOf('a', 'b', 'c').indexOfFirst { it != 'a' && it != 'b' } } 
+            """
+        }
+        body(PrimitiveType.Boolean) {
+            """
+            expect(0) { booleanArrayOf(true, false, false, true).indexOfFirst { it } }
+            expect(1) { booleanArrayOf(true, false, false, true).indexOfFirst { !it } }
+            expect(-1) { booleanArrayOf(true, true).indexOfFirst { !it } } 
+            """
+        }
+    }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/NumbersTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/NumbersTest.kt
new file mode 100644
index 0000000..2342841
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/NumbersTest.kt
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object NumbersTest : TestTemplateGroupBase() {
+    val f_rotate = test("rotate()") {
+        include(Primitives, setOf(PrimitiveType.Byte, PrimitiveType.Short, PrimitiveType.Int, PrimitiveType.Long))
+        include(Unsigned)
+    } builder {
+        body {
+            """
+            fun test(value: $P, n: Int, expected: $P) {
+                assertEquals(expected, value.rotateLeft(n))
+                assertEquals(expected, value.rotateRight(-n))
+            }
+    
+            fun testCyclic(value: $P) {
+                for (n in -2 * $P.SIZE_BITS..2 * $P.SIZE_BITS) {
+                    val rl = value.rotateLeft(n)
+                    val rr = value.rotateRight(-n)
+                    assertEquals(rl, rr)
+                    assertEquals(rl, value.rotateLeft(n % $P.SIZE_BITS))
+                    assertEquals(rr, value.rotateRight((-n) % $P.SIZE_BITS))
+                    assertEquals(value, value.rotateLeft(n).rotateLeft(-n))
+                    assertEquals(value, value.rotateRight(n).rotateRight(-n))
+                }
+            }
+            """
+        }
+        bodyAppend(PrimitiveType.Byte) {
+            """
+            test(0x73, 4, 0x37)
+            test(0x73, -3, 0x6E)
+            test(0x73, 1, 0xE6.toByte())
+            test(0xE6.toByte(), 1, 0xCD.toByte())
+            """
+        }
+        bodyAppend(PrimitiveType.Short) {
+            """
+            test(0x7361, 4, 0x3617)
+            test(0x7361, -3, 0b001_0111_0011_0110_0)
+            test(0x7361, 1,  0b111_0011_0110_0001_0.toShort())
+            test(0xE6C2.toShort(), 1, 0b11_0011_0110_0001_01.toShort())
+            """
+        }
+        bodyAppend(PrimitiveType.Int) {
+            """
+            test(0x7_3422345, 4, 0x3422345_7)
+            test(0x7342234_5, -4, 0x5_7342234)
+            test(0x73422345, 1, 0xE684468A.toInt())
+            """
+        }
+        bodyAppend(PrimitiveType.Long) {
+            """
+            test(0x7372ABAC_DEEF0123, 4, 0x372ABAC_DEEF01237)
+            test(0x88888888_44444444U.toLong(), -3, 0x91111111_08888888u.toLong())
+            test(0x88888888_44444444U.toLong(),  1, 0x11111110_88888889)
+            """
+        }
+        bodyAppend(PrimitiveType.UByte) {
+            """
+            test(0x73u, 4, 0x37u)
+            test(0x73u, -3, 0x6Eu)
+            test(0x73u, 1, 0xE6u)
+            test(0xE6u, 1, 0xCDu)
+            """
+        }
+        bodyAppend(PrimitiveType.UShort) {
+            """
+            test(0x7361u, 4, 0x3617u)
+            test(0x7361u, -3, 0b001_0111_0011_0110_0u)
+            test(0x7361u, 1,  0b111_0011_0110_0001_0u)
+            test(0xE6C2u, 1,  0b11_0011_0110_0001_01u)
+            """
+        }
+        bodyAppend(PrimitiveType.UInt) {
+            """
+            test(0x7_3422345u, 4, 0x3422345_7u)
+            test(0x7342234_5u, -4, 0x5_7342234u)
+            test(0x73422345u, 1, 0xE684468Au)
+            """
+        }
+        bodyAppend(PrimitiveType.ULong) {
+            """
+            test(0x7372ABAC_DEEF0123uL, 4, 0x372ABAC_DEEF01237uL)
+            test(0x88888888_44444444uL, -3, 0x91111111_08888888uL)
+            test(0x88888888_44444444uL,  1, 0x11111110_88888889uL)
+            """
+        }
+        bodyAppend {
+            """
+            repeat(100) {
+                testCyclic(${primitive!!.randomNext()})
+            }
+            """
+        }
+    }
+
+    val f_bits = test("bits()") {
+        include(Primitives, setOf(PrimitiveType.Byte, PrimitiveType.Short, PrimitiveType.Int, PrimitiveType.Long))
+        include(Unsigned)
+    } builder {
+        body {
+            val sizeBits = primitive!!.SIZE_BITS
+            """
+            fun test(value: $P, oneBits: Int, leadingZeroes: Int, trailingZeroes: Int) {
+                assertEquals(oneBits, value.countOneBits())
+                assertEquals(leadingZeroes, value.countLeadingZeroBits())
+                assertEquals(trailingZeroes, value.countTrailingZeroBits())
+                val highestBit = if (leadingZeroes < $P.SIZE_BITS) ONE.shl($P.SIZE_BITS - leadingZeroes - 1).to$P() else ZERO
+                val lowestBit = if (trailingZeroes < $P.SIZE_BITS) ONE.shl(trailingZeroes).to$P() else ZERO
+                assertEquals(highestBit, value.takeHighestOneBit())
+                assertEquals(lowestBit, value.takeLowestOneBit())
+            }
+            
+            test(ZERO, 0, $sizeBits, $sizeBits)
+            test(ONE, 1, ${sizeBits - 1}, 0)
+            test(TWO, 1, ${sizeBits - 2}, 1)
+            """
+        }
+        bodyAppend(PrimitiveType.Byte) {
+            """
+            test(0x44, 2, 1, 2)
+            test(0x80.toByte(), 1, 0, 7)
+            test(0xF0.toByte(), 4, 0, 4)
+            """
+        }
+        bodyAppend(PrimitiveType.Short) {
+            """
+            test(0xF2, 5, 8, 1)
+            test(0x8000.toShort(), 1, 0, 15)
+            test(0xF200.toShort(), 5, 0, 9)
+            """
+        }
+        bodyAppend(PrimitiveType.Int) {
+            """
+            test(0xF002, 5, 16, 1)
+            test(0xF00F0000.toInt(), 8, 0, 16)
+            """
+        }
+        bodyAppend(PrimitiveType.Long) {
+            """
+            test(0xF002, 5, 48, 1)
+            test(0xF00F0000L, 8, 32, 16)
+            test(0x1111_3333_EEEE_0000L, 4 + 8 + 12, 3, 17)
+            """
+        }
+        bodyAppend(PrimitiveType.UByte) {
+            """
+            test(0x44u, 2, 1, 2)
+            test(0x80u, 1, 0, 7)
+            test(0xF0u, 4, 0, 4)
+            """
+        }
+        bodyAppend(PrimitiveType.UShort) {
+            """
+            test(0xF2u, 5, 8, 1)
+            test(0x8000u, 1, 0, 15)
+            test(0xF200u, 5, 0, 9)
+            """
+        }
+        bodyAppend(PrimitiveType.UInt) {
+            """
+            test(0xF002u, 5, 16, 1)
+            test(0xF00F0000u, 8, 0, 16)
+            """
+        }
+        bodyAppend(PrimitiveType.ULong) {
+            """
+            test(0xF002uL, 5, 48, 1)
+            test(0xF00F0000uL, 8, 32, 16)
+            test(0x1111_3333_EEEE_0000uL, 4 + 8 + 12, 3, 17)
+            """
+        }
+    }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/test/OrderingTest.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/test/OrderingTest.kt
new file mode 100644
index 0000000..6cf97fc
--- /dev/null
+++ b/libraries/tools/kotlin-stdlib-gen/src/templates/test/OrderingTest.kt
@@ -0,0 +1,302 @@
+/*
+ * Copyright 2010-2020 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 templates.test
+
+import templates.*
+import templates.Family.*
+
+object OrderingTest : TestTemplateGroupBase() {
+
+    private val TestBuilder.elementConversion: String
+        get() = when (primitive) {
+            null -> "it.toString()"
+            PrimitiveType.Char -> "'a' + it"
+            PrimitiveType.Boolean -> "it % 2 == 0"
+            else -> "it.to${test.P}()"
+        }
+
+    private val TestBuilder.arrayConversion: String
+        get() = when (family) {
+            ArraysOfPrimitives, ArraysOfUnsigned -> "to${test.P}Array()"
+            else -> "toTypedArray()"
+        }
+
+    val f_reverse = test("reverse()") {
+        include(ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        body {
+            """
+            val arrays = (0..4).map { n -> (1..n).map { $elementConversion }.$arrayConversion }
+            for (array in arrays) {
+                val original = array.toList()
+                array.reverse()
+                val reversed = array.toList()
+                assertEquals(original.asReversed(), reversed)
+            }
+            """
+        }
+    }
+
+    val f_reverse_range = test("reverseRange()") {
+        include(ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        body {
+            """
+            val arrays = (0..7).map { n -> n to (0 until n).map { $elementConversion }.$arrayConversion }
+            for ((size, array) in arrays) {
+                for (fromIndex in 0 until size) {
+                    for (toIndex in fromIndex..size) {
+                        val original = array.toMutableList()
+                        array.reverse(fromIndex, toIndex)
+                        val reversed = array.toMutableList()
+                        assertEquals(original.apply { subList(fromIndex, toIndex).reverse() }, reversed)
+                    }
+                }
+
+                assertFailsWith<IndexOutOfBoundsException> { array.reverse(-1, size) }
+                assertFailsWith<IndexOutOfBoundsException> { array.reverse(0, size + 1) }
+                assertFailsWith<IllegalArgumentException> { array.reverse(0, -1) }
+            }
+            """
+        }
+    }
+
+    val f_reversed = listOf("reversed", "reversedArray").map { op ->
+        val isReversedArray = op == "reversedArray"
+        test("$op()") {
+            include(Iterables, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+            filter { family, _ -> (isReversedArray && !family.isArray()).not() }
+        } builder {
+            val resultF = if (isReversedArray) f else Lists
+            body {
+                "${resultF.assertEquals}(${resultF.of(3, 2, 1)}, ${of(1, 2, 3)}.$op())"
+            }
+            bodyAppend(Iterables, ArraysOfObjects) {
+                """${resultF.assertEquals}(${resultF.of}("3", "2", "1"), $of("1", "2", "3").$op())"""
+            }
+            body(PrimitiveType.Char) {
+                "${resultF.assertEquals}(${resultF.of}('3', '2', '1'), charArrayOf('1', '2', '3').$op())"
+            }
+            body(PrimitiveType.Boolean) {
+                "${resultF.assertEquals}(${resultF.of}(false, false, true), booleanArrayOf(true, false, false).$op())"
+            }
+        }
+    }
+
+    val f_sorted = listOf("sorted", "sortedArray", "sortedDescending", "sortedArrayDescending").map { op ->
+        val isSortedArray = op.startsWith("sortedArray")
+        test("$op()") {
+            includeDefault()
+            include(ArraysOfUnsigned)
+            exclude(PrimitiveType.Boolean)
+            filter { family, _ -> (isSortedArray && !family.isArray()).not() }
+        } builder {
+            val cmp = if (op.endsWith("Descending")) ">=" else "<="
+            val sortAndCheck = "$op().iterator().assertSorted { a, b -> a.compareTo(b) $cmp 0 }"
+            body {
+                """
+                ${of(3, 7, 1)}.$sortAndCheck
+                $of(ONE, MAX_VALUE, MIN_VALUE).$sortAndCheck
+                """
+            }
+            bodyAppend(Iterables, Sequences, ArraysOfObjects) {
+                """
+                $of("ac", "aD", "aba").$sortAndCheck
+                """
+            }
+            bodyAppend(PrimitiveType.Float, PrimitiveType.Double) {
+                """
+                $of(POSITIVE_INFINITY, NEGATIVE_INFINITY, MAX_VALUE, -MAX_VALUE, ONE, -ONE, 
+                                MIN_VALUE, -MIN_VALUE, ZERO, -ZERO, $P.NaN).$sortAndCheck
+                """
+            }
+            body(PrimitiveType.Char) {
+                """
+                $of('a', 'D', 'c').$sortAndCheck
+                """
+            }
+        }
+    }
+
+    val f_sort = listOf("sort", "sortDescending").map { op ->
+        val isDescending = op.endsWith("Descending")
+        test("$op()") {
+            include(Lists, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+            exclude(PrimitiveType.Boolean)
+        } builder {
+            val reversed = (if (f.isArray()) ".reversedArray()" else ".reversed()").takeIf { isDescending } ?: ""
+            body {
+                val (five, nine, eighty) = listOf(5, 9, 80).map { literal(it) }
+                """
+                val data = $mutableOf($five, TWO, ONE, $nine, $eighty, MIN_VALUE, MAX_VALUE)
+                data.$op()
+                $assertEquals($of(MIN_VALUE, ONE, TWO, $five, $nine, $eighty, MAX_VALUE)$reversed, data)
+                """
+            }
+            bodyAppend(Lists, ArraysOfObjects) {
+                """
+                val strings = $mutableOf("9", "80", "all", "Foo")
+                strings.$op()
+                $assertEquals($of("80", "9", "Foo", "all")$reversed, strings) 
+                """
+            }
+            body(PrimitiveType.Char) {
+                """
+                val data = charArrayOf('d', 'c', 'E', 'a', '\u0000', '\uFFFF')
+                data.$op()
+                $assertEquals($of('\u0000', 'E', 'a', 'c', 'd', '\uFFFF')$reversed, data)
+                """
+            }
+        }
+    }
+
+    val f_sortedWith = listOf("sortedWith", "sortedArrayWith").map { op ->
+        val isSortedArray = op.contains("Array")
+        test("$op()") {
+            includeDefault()
+            filter { family, _ -> !isSortedArray || family == ArraysOfObjects }
+            exclude(PrimitiveType.Char, PrimitiveType.Boolean)
+        } builder {
+            body {
+                val sortAndCheck = "$op(comparator).iterator().assertSorted { a, b -> comparator.compare(a, b) <= 0 }"
+                """
+                val comparator = compareBy { it: $P -> it % THREE }.thenByDescending { it }
+                ${of(0, 1, 2, 3, 4, 5)}.$sortAndCheck
+                """
+            }
+            bodyAppend(Iterables/*, Sequences*/, ArraysOfObjects) { // `.asSequence()` and `object : Sequence {  }` are not equal
+                val resultF = if (isSortedArray || f == Sequences) f else Lists
+                """
+                val comparator1 = compareBy<String> { it.toUpperCase().reversed() }
+                val data = $of("cat", "dad", "BAD")
+        
+                ${resultF.assertEquals}(${resultF.of}("BAD", "dad", "cat"), data.$op(comparator1))
+                ${resultF.assertEquals}(${resultF.of}("cat", "dad", "BAD"), data.$op(comparator1.reversed()))
+                ${resultF.assertEquals}(${resultF.of}("BAD", "dad", "cat"), data.$op(comparator1.reversed().reversed()))
+                """
+            }
+        }
+    }
+
+    val f_sortBy = listOf("sortBy", "sortByDescending").map { op ->
+        val isDescending = op.contains("Descending")
+        test("$op()") {
+            include(Lists, ArraysOfObjects)
+        } builder {
+            body {
+                val (bySecond, byFirst, byLength) = if (!isDescending) {
+                    listOf(
+                        """"ab" to 3, "aa" to 3, "aa" to 20""",
+                        """"aa" to 3, "aa" to 20, "ab" to 3""",
+                        """"aa" to 3, "ab" to 3, "aa" to 20"""
+                    )
+                } else {
+                    listOf(
+                        """"aa" to 20, "ab" to 3, "aa" to 3""",
+                        """"ab" to 3, "aa" to 20, "aa" to 3""",
+                        """"aa" to 20, "ab" to 3, "aa" to 3"""
+                    )
+                }
+
+                """
+                val data = $mutableOf("aa" to 20, "ab" to 3, "aa" to 3)
+                data.$op { it.second }
+                $assertEquals($of($bySecond), data)
+        
+                data.$op { it.first }
+                $assertEquals($of($byFirst), data)
+                
+                data.$op { (it.first + it.second).length }
+                $assertEquals($of($byLength), data)
+                """
+            }
+        }
+    }
+
+    val f_sortedBy = listOf("sortedBy", "sortedByDescending").map { op ->
+        val isDescending = op.contains("Descending")
+        test("$op()") {
+            include(Lists, ArraysOfObjects, ArraysOfPrimitives)
+            exclude(PrimitiveType.Boolean, PrimitiveType.Char)
+        } builder {
+            val resultF = if (f == Sequences) f else Lists
+            val reversed = if (isDescending) ".reversed()" else ""
+            body {
+                """
+                val values = arrayOf("ac", "aD", "aba")
+                val indices = ${of(0, 1, 2)}
+        
+                assertEquals(${resultF.of(1, 2, 0)}$reversed, indices.$op { values[it.toInt()] }) 
+                """
+            }
+            bodyAppend(ArraysOfUnsigned) {
+                """
+                val array = $of(5, 2, 1, 9, 80, 0, MAX_VALUE, MAX_VALUE - 100)
+                assertEquals(listOf<$P>(MAX_VALUE - 100, MAX_VALUE, 0, 1, 2, 5, 9, 80)$reversed, array.$op { it.to${P.drop(1)}() })
+                """
+            }
+            bodyAppend(Lists, ArraysOfObjects) {
+                """
+                assertEquals(${resultF.of}("two" to 3, "three" to 20)$reversed, $of("three" to 20, "two" to 3).$op { it.second })
+                assertEquals(${resultF.of}("three" to 20, "two" to 3)$reversed, $of("three" to 20, "two" to 3).$op { it.first })
+                """
+            }
+        }
+    }
+
+
+    val f_shuffle = test("shuffle()") {
+        include(Lists, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        val type = if (f == Lists) "MutableList" else (primitive?.name ?: "") + "Array"
+        val typeParam = if (primitive == null) "<*>" else ""
+        val conversion = if (primitive == PrimitiveType.Boolean) "it % 2 == 0" else "it.to${test.P}()"
+        body {
+            """
+            fun test(data: $type$typeParam) {
+                val original = data.toMutableList()
+                data.shuffle()
+                val shuffled = data.toMutableList()
+                assertNotEquals(original, shuffled)
+                assertEquals(original.groupBy { it }, shuffled.groupBy { it })
+            }
+            test($type(100) { $conversion })
+            """
+        }
+        bodyAppend(Lists, ArraysOfObjects) {
+            """
+            test($mutableOf(1, "x", null, Any(), 'a', 2u, 5.0))
+            """
+        }
+    }
+
+    val f_shuffleRandom = test("shuffleRandom()") {
+        include(Lists, ArraysOfObjects, ArraysOfPrimitives, ArraysOfUnsigned)
+    } builder {
+        val type = if (f == Lists) "MutableList" else (primitive?.name ?: "") + "Array"
+        val typeParam = if (primitive == null) "<*>" else ""
+        val conversion = if (primitive == PrimitiveType.Boolean) "it % 2 == 0" else "it.to${test.P}()"
+        body {
+            """
+            fun test(data: $type$typeParam) {
+                val seed = Random.nextInt()
+                val original = data.toMutableList()
+                val originalShuffled = original.shuffled(Random(seed))
+                data.shuffle(Random(seed))
+                val shuffled = data.toMutableList()
+                assertNotEquals(original, shuffled)
+                assertEquals(originalShuffled, shuffled)
+            }
+            test($type(16) { $conversion })
+            """
+        }
+        bodyAppend(Lists, ArraysOfObjects) {
+            """
+            test($mutableOf(1, "x", null, Any(), 'a', 2u, 5.0))
+            """
+        }
+    }
+}