stdlib: Make toIndex exclusive in sortArrayWith method

This patch makes toIndex parameter exclusive in sortArrayWith method
in order to make this method corresponding to the other ones (e.g.
copyOfRange, Array.sortWith extension etc).
It also improves the external sortBy test in order to use it with
different sort algorithms.
This commit is contained in:
Ilya Matveev
2017-04-12 13:44:49 +07:00
committed by ilmat192
parent 0a01f513be
commit ec64fd0477
3 changed files with 40 additions and 41 deletions
@@ -1,49 +1,39 @@
import kotlin.test.*
fun <T> assertArrayNotSameButEquals(expected: Array<out T>, actual: Array<out T>, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
fun <T: Comparable<T>> assertSorted(array: Array<out T>, message: String = "") = assertSorted(array, message, { it })
inline fun <T, R : Comparable<R>> assertSorted(array: Array<out T>, message: String = "", crossinline selector: (T) -> R) {
if (array.isEmpty() || array.size == 1) {
return
}
var prev = selector(array[0])
for (i in 1..array.lastIndex) {
val cur = selector(array[i])
assertTrue(prev.compareTo(cur) <= 0, message)
prev = cur
}
}
fun assertArrayNotSameButEquals(expected: IntArray, actual: IntArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: LongArray, actual: LongArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: ShortArray, actual: ShortArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: ByteArray, actual: ByteArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: DoubleArray, actual: DoubleArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: FloatArray, actual: FloatArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: CharArray, actual: CharArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
}
fun assertArrayNotSameButEquals(expected: BooleanArray, actual: BooleanArray, message: String = "") {
assertTrue(expected !== actual && expected contentEquals actual, message)
inline fun <T, R : Comparable<R>> assertSortedDescending(array: Array<out T>, message: String = "", crossinline selector: (T) -> R) {
if (array.isEmpty() || array.size == 1) {
return
}
var prev = selector(array[0])
for (i in 1..array.lastIndex) {
val cur = selector(array[i])
assertTrue(prev.compareTo(cur) >= 0, message)
prev = cur
}
}
fun box() {
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)
assertSorted(data) { it.second }
data.sortBy { it.first }
assertArrayNotSameButEquals(arrayOf("aa" to 3, "aa" to 20, "ab" to 3), data)
assertSorted(data) { it.first }
data.sortByDescending { (it.first + it.second).length }
assertArrayNotSameButEquals(arrayOf("aa" to 20, "aa" to 3, "ab" to 3), data)
assertSortedDescending(data) { (it.first + it.second).length }
}