/* * 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 { v.getIntAt(-1) } assertFailsWith { 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 { v.getFloatAt(-1) } assertFailsWith { 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 { v.getByteAt(-1) } assertFailsWith { 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()) } }