Files

94 lines
3.1 KiB
Kotlin

/*
* 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.kotlinx.cinterop
import kotlin.test.*
import kotlinx.cinterop.Vector128
import kotlinx.cinterop.vectorOf
class VectorTest {
@Test
fun box() {
class Box(val value: Vector128)
val v = vectorOf(1f, 3.162f, 10f, 31f)
val box = Box(v)
assertEquals(v, box.value)
}
@Test
fun boxWithExtraFields() {
class Box(v: Vector128) {
val extraField: Int = 1
var value: Vector128 = v
}
val box = Box(vectorOf(0, 1, 2, 3))
assertEquals(vectorOf(0, 1, 2, 3), box.value)
box.value = vectorOf(0.1f, 1.1f, 2.1f, 3.1f)
assertEquals(vectorOf(0.1f, 1.1f, 2.1f, 3.1f), box.value)
}
@Test
fun getIntAt() {
val a = arrayOf(0, 1, 2, 3)
val v = vectorOf(a[0], a[1], a[2], a[3])
(0 until 4).forEach { assertEquals(a[it], v.getIntAt(it)) }
assertFailsWith<IndexOutOfBoundsException> { v.getIntAt(-1) }
assertFailsWith<IndexOutOfBoundsException> { v.getIntAt(4) }
}
@Test
fun getFloatAt() {
val a = arrayOf(1f, 3.162f, 10f, 31f)
val v = vectorOf(a[0], a[1], a[2], a[3])
(0 until 4).forEach { assertEquals(a[it], v.getFloatAt(it)) }
assertFailsWith<IndexOutOfBoundsException> { v.getFloatAt(-1) }
assertFailsWith<IndexOutOfBoundsException> { v.getFloatAt(4) }
}
@Test
fun getByteAt() {
val a = arrayOf(0, 1, 2, 3)
val v = vectorOf(a[0], a[1], a[2], a[3])
(0 until 4).forEach {
assertEquals(if (Platform.isLittleEndian) a[it].toByte() else 0, v.getByteAt(it * 4))
assertEquals(0, v.getByteAt(it * 4 + 1))
assertEquals(0, v.getByteAt(it * 4 + 2))
assertEquals(if (!Platform.isLittleEndian) a[it].toByte() else 0, v.getByteAt(it * 4 + 3))
}
assertFailsWith<IndexOutOfBoundsException> { v.getByteAt(-1) }
assertFailsWith<IndexOutOfBoundsException> { v.getByteAt(16) }
}
@Test
fun updateVector() {
var v = vectorOf(0, 1, 2, 3)
val a = arrayOf(1f, 3.162f, 10f, 31f)
// Used to be vector of ints, now a vector of floats.
v = vectorOf(a[0], a[1], a[2], a[3])
(0 until 4).forEach { assertEquals(a[it], v.getFloatAt(it)) }
}
@Test
fun testToString() {
val v = vectorOf(100, 1024, Int.MAX_VALUE, Int.MIN_VALUE)
assertEquals("(0x64, 0x400, 0x7fffffff, 0x80000000)", v.toString())
}
@Test
fun testEquals() {
assertNotEquals(vectorOf(-1f, 0f, 0f, -7f), vectorOf(1f, 4f, 3f, 7f))
assertNotEquals(vectorOf(-1f, 0f, 0f, -7f), Any())
assertEquals(vectorOf(-1f, 0f, 0f, -7f), vectorOf(-1f, 0f, 0f, -7f))
}
@Test
fun testHashCode() {
assertNotEquals(vectorOf(1f, 4f, 3f, 7f).hashCode(), vectorOf(3f, 7f, 1f, 4f).hashCode())
assertEquals(vectorOf(1f, 4f, 3f, 7f).hashCode(), vectorOf(1f, 4f, 3f, 7f).hashCode())
}
}