Generate extensions for unsigned arrays and provide tests for them

- contentEquals, contentToString, contentHashCode
- as[Signed]Array, as[Unsigned]Array
- to[Signed]Array, to[Unsigned]Array
- toTypedArray
- copyOf(), copyOf(newSize), copyOfRange(...)
This commit is contained in:
Ilya Gorbunov
2018-08-15 19:43:29 +03:00
parent 6360cc3cb5
commit 4df665bc78
5 changed files with 876 additions and 78 deletions
@@ -64,4 +64,158 @@ class UnsignedArraysTest {
assertEquals(index.toULong(), initArray[index])
}
}
@Test
fun contentHashCode() {
ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) }
uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) }
ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) }
ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).let { assertEquals(it.toList().hashCode(), it.contentHashCode()) }
}
@Test
fun contentToString() {
ulongArrayOf(1uL, ULong.MAX_VALUE, ULong.MIN_VALUE).let { assertEquals(it.toList().toString(), it.contentToString()) }
uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).let { assertEquals(it.toList().toString(), it.contentToString()) }
ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).let { assertEquals(it.toList().toString(), it.contentToString()) }
ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).let { assertEquals(it.toList().toString(), it.contentToString()) }
}
@Test
fun contentEquals() {
uintArrayOf(1u, UInt.MAX_VALUE, UInt.MIN_VALUE).let { arr ->
assertTrue(arr contentEquals UIntArray(arr.size, arr::get))
assertFalse(arr contentEquals UIntArray(arr.size - 1, arr::get))
}
ulongArrayOf(1u, ULong.MAX_VALUE, ULong.MIN_VALUE).let { arr ->
assertTrue(arr contentEquals ULongArray(arr.size, arr::get))
assertFalse(arr contentEquals ULongArray(arr.size - 1, arr::get))
}
ushortArrayOf(1u, UShort.MAX_VALUE, UShort.MIN_VALUE).let { arr ->
assertTrue(arr contentEquals UShortArray(arr.size, arr::get))
assertFalse(arr contentEquals UShortArray(arr.size - 1, arr::get))
}
ubyteArrayOf(1u, UByte.MAX_VALUE, UByte.MIN_VALUE).let { arr ->
assertTrue(arr contentEquals UByteArray(arr.size, arr::get))
assertFalse(arr contentEquals UByteArray(arr.size - 1, arr::get))
}
}
@Test
fun asArray() {
val uintArray = uintArrayOf(1, UInt.MAX_VALUE)
val intArray = uintArray.asIntArray()
assertTrue(intArray contentEquals intArrayOf(1, -1))
intArray.reverse()
val uintArray2 = intArray.asUIntArray()
assertTrue(uintArray contentEquals uintArray2)
assertTrue(uintArray contentEquals uintArrayOf(UInt.MAX_VALUE, 1))
val ulongArray = ulongArrayOf(1, ULong.MAX_VALUE)
val longArray = ulongArray.asLongArray()
assertTrue(longArray contentEquals longArrayOf(1, -1))
longArray.reverse()
val ulongArray2 = longArray.asULongArray()
assertTrue(ulongArray contentEquals ulongArray2)
assertTrue(ulongArray contentEquals ulongArrayOf(ULong.MAX_VALUE, 1))
}
@Test
fun toArray() {
val uintArray = uintArrayOf(UInt.MAX_VALUE)
val intArray = uintArray.toIntArray()
assertTrue(intArray contentEquals intArrayOf(-1))
intArray[0] = 0
val uintArray2 = intArray.toUIntArray()
assertEquals(UInt.MAX_VALUE, uintArray[0])
intArray[0] = 1
assertEquals(0u, uintArray2[0])
val ulongArray = ulongArrayOf(ULong.MAX_VALUE)
val longArray = ulongArray.toLongArray()
assertTrue(longArray contentEquals longArrayOf(-1))
longArray[0] = 0
val ulongArray2 = longArray.toULongArray()
assertEquals(ULong.MAX_VALUE, ulongArray[0])
longArray[0] = 1
assertEquals(0u, ulongArray2[0])
}
@Test
fun toTypedArray() {
uintArrayOf(UInt.MIN_VALUE, UInt.MAX_VALUE).let { assertTrue(it.toTypedArray() contentEquals it.toList().toTypedArray()) }
ulongArrayOf(ULong.MIN_VALUE, ULong.MAX_VALUE).let { assertTrue(it.toTypedArray() contentEquals it.toList().toTypedArray()) }
ushortArrayOf(UShort.MIN_VALUE, UShort.MAX_VALUE).let { assertTrue(it.toTypedArray() contentEquals it.toList().toTypedArray()) }
ubyteArrayOf(UByte.MIN_VALUE, UByte.MAX_VALUE).let { assertTrue(it.toTypedArray() contentEquals it.toList().toTypedArray()) }
}
@Test
fun copyOf() {
uintArrayOf(UInt.MAX_VALUE).let { arr ->
val copy = arr.copyOf()
assertTrue(arr contentEquals copy)
copy[0] = 1u
assertFalse(arr contentEquals copy)
arr[0] = 2u
assertFalse(arr contentEquals copy)
}
ulongArrayOf(ULong.MAX_VALUE).let { arr ->
val copy = arr.copyOf()
assertTrue(arr contentEquals copy)
copy[0] = 1u
assertFalse(arr contentEquals copy)
arr[0] = 2u
assertFalse(arr contentEquals copy)
}
}
@Test
fun copyAndResize() {
assertTrue(uintArrayOf(1, 2) contentEquals uintArrayOf(1, 2, 3).copyOf(2))
assertTrue(uintArrayOf(1, 2, 0) contentEquals uintArrayOf(1, 2).copyOf(3))
assertTrue(ulongArrayOf(1, 2) contentEquals ulongArrayOf(1, 2, 3).copyOf(2))
assertTrue(ulongArrayOf(1, 2, 0) contentEquals ulongArrayOf(1, 2).copyOf(3))
assertTrue(uintArrayOf() contentEquals uintArrayOf(1).copyOf(0))
assertTrue(ulongArrayOf() contentEquals ulongArrayOf(1).copyOf(0))
// RuntimeException is the most specific common of JVM and JS implementations
assertFailsWith<RuntimeException> { uintArrayOf().copyOf(-1) }
assertFailsWith<RuntimeException> { ulongArrayOf().copyOf(-1) }
}
@Test
fun copyOfRange() {
assertTrue(ubyteArrayOf(0, 1, 2) contentEquals ubyteArrayOf(0, 1, 2, 3, 4, 5).copyOfRange(0, 3))
assertTrue(ushortArrayOf(0, 1, 2) contentEquals ushortArrayOf(0, 1, 2, 3, 4, 5).copyOfRange(0, 3))
assertTrue(uintArrayOf(0, 1, 2) contentEquals uintArrayOf(0, 1, 2, 3, 4, 5).copyOfRange(0, 3))
assertTrue(ulongArrayOf(0, 1, 2) contentEquals ulongArrayOf(0, 1, 2, 3, 4, 5).copyOfRange(0, 3))
for (pos in 0..3) {
assertTrue(uintArrayOf() contentEquals uintArrayOf(1, 2, 3).copyOfRange(pos, pos))
assertTrue(ulongArrayOf() contentEquals ULongArray(3) { it.toULong() }.copyOfRange(pos, pos))
}
for ((start, end) in listOf(-1 to 0, 0 to 2, 2 to 2, 1 to 0)) {
val bounds = "start: $start, end: $end"
val exClass = if (start > end) IllegalArgumentException::class else IndexOutOfBoundsException::class
assertFailsWith(exClass, bounds) { uintArrayOf(1).copyOfRange(start, end) }
assertFailsWith(exClass, bounds) { ulongArrayOf(1uL).copyOfRange(start, end) }
}
}
}