/* * Copyright 2010-2023 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 import kotlin.test.* // Native-specific part of stdlib/test/collections/ArraysTest.kt class ArraysNativeTest { @Test fun byteArraySet() { val arr = ByteArray(5) arr[1] = 1 arr[3] = -1 assertEquals(1, arr[1]) assertEquals(-1, arr[3]) } @Test fun shortArraySet() { val arr = ShortArray(5) arr[1] = 1 arr[3] = -1 assertEquals(1, arr[1]) assertEquals(-1, arr[3]) } @Test fun intArraySet() { val arr = IntArray(5) arr[1] = 1 arr[3] = -1 assertEquals(1, arr[1]) assertEquals(-1, arr[3]) } @Test fun longArraySet() { val arr = LongArray(5) arr[1] = 1 arr[3] = -1 assertEquals(1, arr[1]) assertEquals(-1, arr[3]) } @Test fun arrayGetOutOfBounds() { val arr = Array(5) { null } assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun byteArrayGetOutOfBounds() { val arr = ByteArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun shortArrayGetOutOfBounds() { val arr = ShortArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun intArrayGetOutOfBounds() { val arr = IntArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun floatArrayGetOutOfBounds() { val arr = FloatArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun doubleArrayGetOutOfBounds() { val arr = DoubleArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun charArrayGetOutOfBounds() { val arr = CharArray(5) assertFailsWith { arr[arr.size] } assertFailsWith { arr[-1] } assertFailsWith { arr[Int.MAX_VALUE] } assertFailsWith { arr[Int.MIN_VALUE] } } @Test fun arraySetOutOfBounds() { val arr = Array(5) { null } assertFailsWith { arr[arr.size] = Any() } assertFailsWith { arr[-1] = Any() } assertFailsWith { arr[Int.MAX_VALUE] = Any() } assertFailsWith { arr[Int.MIN_VALUE] = Any() } } @Test fun byteArraySetOutOfBounds() { val arr = ByteArray(5) assertFailsWith { arr[arr.size] = 1 } assertFailsWith { arr[-1] = 1 } assertFailsWith { arr[Int.MAX_VALUE] = 1 } assertFailsWith { arr[Int.MIN_VALUE] = 1 } } @Test fun shortArraySetOutOfBounds() { val arr = ShortArray(5) assertFailsWith { arr[arr.size] = 1 } assertFailsWith { arr[-1] = 1 } assertFailsWith { arr[Int.MAX_VALUE] = 1 } assertFailsWith { arr[Int.MIN_VALUE] = 1 } } @Test fun intArraySetOutOfBounds() { val arr = IntArray(5) assertFailsWith { arr[arr.size] = 1 } assertFailsWith { arr[-1] = 1 } assertFailsWith { arr[Int.MAX_VALUE] = 1 } assertFailsWith { arr[Int.MIN_VALUE] = 1 } } @Test fun floatArraySetOutOfBounds() { val arr = FloatArray(5) assertFailsWith { arr[arr.size] = 1.0f } assertFailsWith { arr[-1] = 1.0f } assertFailsWith { arr[Int.MAX_VALUE] = 1.0f } assertFailsWith { arr[Int.MIN_VALUE] = 1.0f } } @Test fun doubleArraySetOutOfBounds() { val arr = DoubleArray(5) assertFailsWith { arr[arr.size] = 1.0 } assertFailsWith { arr[-1] = 1.0 } assertFailsWith { arr[Int.MAX_VALUE] = 1.0 } assertFailsWith { arr[Int.MIN_VALUE] = 1.0 } } @Test fun charArraySetOutOfBounds() { val arr = CharArray(5) assertFailsWith { arr[arr.size] = '1' } assertFailsWith { arr[-1] = '1' } assertFailsWith { arr[Int.MAX_VALUE] = '1' } assertFailsWith { arr[Int.MIN_VALUE] = '1' } } @Test fun largeByteArray() { val arr = ByteArray(1000000) { it.toByte() } var sum = 0 for (b in arr) { sum += b } assertEquals(-497952, sum) } @Test fun largeArray() { val arr = Array(1000000) { it.toByte() } var sum = 0 for (b in arr) { sum += b } assertEquals(-497952, sum) } private fun Array.assertSorted(cmp: Comparator, message: String = "") { for (i in 1 until size) { assertTrue(cmp.compare(this[i - 1], this[i]) <= 0, message) } } private fun Array.assertSorted(message: String = "") { for (i in 1 until size) { assertTrue(this[i - 1] <= this[i], message) } } private class MyComparable (val value: Int, val comparator: Comparator): Comparable { override fun compareTo(other: MyComparable): Int = comparator.compare(value, other.value) } @Test fun sortWith() { listOf>( arrayOf(), arrayOf(1), arrayOf(Int.MIN_VALUE, 0, Int.MAX_VALUE), arrayOf(Int.MAX_VALUE, 0, Int.MIN_VALUE), arrayOf(1, 2, 3), arrayOf(-2, -1, 99, 1, 2), arrayOf(90, 91, 0, 98, 99), arrayOf(2, 1, 99, -1, 2), arrayOf(99, 98, 0, 91, 90), arrayOf(42, 42, 42), arrayOf(99, 42, 0, 42, 50), arrayOf( 100000, 190001, 200002, 200003, 200004, 210005, 220006, 250007, 300008, 310009, 360010, 365011, 380012, 390013, 390014, 399015, 400016, 400017, 400018, 400019, 400020, 400021, 400022, 400023, 400024, 400025, 400026, 450027, 450028, 480029, 480030, 500031, 500032, 500033, 500034, 500035, 500036, 500037, 500038, 500039, 500040, 500041, 500042, 500043, 500044, 500045, 500046, 500047, 500048, 500049, 500050, 500051, 500052, 500053, 505054, 510055, 510056, 510057, 510058, 510059, 510060, 510061, 510062, 510063, 410064, 410065, 511066, 511067, 520068, 520069, 420070, 520071, 530072, 530073, 530074, 430075, 430076, 530077, 540078, 540079, 540080, 540081, 540082, 540083, 540084, 490085, 540086, 540087, 542088, 544089, 546090, 550091, 550092, 550093, 550094, 590095, 590096, 595097, 600098, 600099, 600100, 600101, 600102, 600103, 600104, 550105, 600106, 600107, 600108, 600109, 600110, 610111, 610112, 610113, 620114, 620115, 620116, 620117, 620118, 620119, 640120, 640121, 645122, 645123, 645124, 645125, 645126, 645127, 650128, 700129, 700130 ) ).forEach { array -> data class ComparatorInfo(val name: String, val isCorrect: Boolean, val comparator: Comparator) // Assert that the array is sorted in terms of a comparator only for correct/partially correct cases listOf( ComparatorInfo("Correct increasing", true) { a, b -> when { a > b -> 1 a < b -> -1 else -> 0 } }, ComparatorInfo("Correct decreasing", true) { a, b -> when { a < b -> 1 a > b -> -1 else -> 0 } }, ComparatorInfo("Incorrect increasing", false) { a, b -> if (a > b) 1 else -1 }, ComparatorInfo("Incorrect decreasing", false) { a, b -> if (a < b) 1 else -1 }, ComparatorInfo("Always 1", false) { a, b -> 1 }, ComparatorInfo("Always -1", false) { a, b -> -1 }, ComparatorInfo("Always 0", false) { a, b -> 0 }, ).forEach { (name, isCorrect, comparator) -> // Test with custom comparator val arrayUnderTest = array.copyOf() arrayUnderTest.sortWith(comparator) if (isCorrect) { arrayUnderTest.assertSorted(comparator, """ Assert sorted failed for comparator: "${name}" Array: ${array.joinToString()} Array after sorting: ${arrayUnderTest.joinToString()} """.trimIndent()) } // Test of a custom comparable val comparableArrayUnderTest = Array(array.size) { i -> MyComparable(array[i], comparator) } comparableArrayUnderTest.sort() if (isCorrect) { comparableArrayUnderTest.assertSorted(""" Assert sorted failed for Comparable: "${name}" Array: ${array.joinToString()} Array after sorting: ${comparableArrayUnderTest.joinToString()} """.trimIndent()) } } } } }