From 5cbf9f4a14bc18292cc2ca38e4e7f3090e90c8c7 Mon Sep 17 00:00:00 2001 From: Yuriy Davygora Date: Wed, 13 May 2026 09:38:06 +0200 Subject: [PATCH] Adding MatrixStorageTest --- .../davygora/matrix/storage/BooleanStorage.kt | 2 +- .../davygora/matrix/storage/ByteStorage.kt | 2 +- .../davygora/matrix/storage/CharStorage.kt | 2 +- .../davygora/matrix/storage/DoubleStorage.kt | 2 +- .../davygora/matrix/storage/FloatStorage.kt | 2 +- .../davygora/matrix/storage/IntStorage.kt | 2 +- .../davygora/matrix/storage/LongStorage.kt | 2 +- .../davygora/matrix/storage/MatrixStorage.kt | 17 ++++++- .../davygora/matrix/storage/ObjectStorage.kt | 2 +- .../davygora/matrix/storage/ShortStorage.kt | 2 +- .../matrix/storage/MatrixStorageTest.kt | 50 +++++++++++++++++++ 11 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 src/test/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorageTest.kt diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt index 2fcd4e9..24d9779 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/BooleanStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class BooleanStorage( - val data: BooleanArray, + override val data: BooleanArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt index 45488b4..d9734f6 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ByteStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class ByteStorage( - val data: ByteArray, + override val data: ByteArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt index 2390306..ce75597 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/CharStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class CharStorage( - val data: CharArray, + override val data: CharArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt index 613c044..f4e1d72 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/DoubleStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class DoubleStorage( - val data: DoubleArray, + override val data: DoubleArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt index 6cd73e2..c886995 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/FloatStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class FloatStorage( - val data: FloatArray, + override val data: FloatArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt index 1f3c81b..60fcb56 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/IntStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class IntStorage( - val data: IntArray, + override val data: IntArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt index 10fee68..033645b 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/LongStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class LongStorage( - val data: LongArray, + override val data: LongArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt index 2f1fd45..207b2e0 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorage.kt @@ -1,6 +1,8 @@ package org.duckdns.davygora.matrix.storage sealed interface MatrixStorage { + val data: Any + val size: Int operator fun get(index: Int): T @@ -12,8 +14,18 @@ sealed interface MatrixStorage { } @Suppress("UNCHECKED_CAST") -inline fun List.toMatrixStorage() = - when (T::class) { +inline fun List.toMatrixStorage(): MatrixStorage { + firstNotNullOfOrNull { it } + + val elementClass = + firstOrNull() + ?.let { first -> first::class } + ?.takeIf { clazz -> + all { it == null || it::class == clazz } + } + ?: T::class + + return when (elementClass) { Boolean::class -> (this as List).toBooleanArray().toMatrixStorage() Byte::class -> (this as List).toByteArray().toMatrixStorage() Char::class -> (this as List).toCharArray().toMatrixStorage() @@ -24,3 +36,4 @@ inline fun List.toMatrixStorage() = Short::class -> (this as List).toShortArray().toMatrixStorage() else -> this.toTypedArray().toMatrixStorage() } as MatrixStorage +} diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt index 3b7b66b..80066e3 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ObjectStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class ObjectStorage( - val data: Array, + override val data: Array, ) : MatrixStorage { override val size get() = data.size diff --git a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt index a3b0b1b..c9deb80 100644 --- a/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt +++ b/src/main/kotlin/org/duckdns/davygora/matrix/storage/ShortStorage.kt @@ -2,7 +2,7 @@ package org.duckdns.davygora.matrix.storage @JvmInline value class ShortStorage( - val data: ShortArray, + override val data: ShortArray, ) : MatrixStorage { override val size get() = data.size diff --git a/src/test/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorageTest.kt b/src/test/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorageTest.kt new file mode 100644 index 0000000..f1e9add --- /dev/null +++ b/src/test/kotlin/org/duckdns/davygora/matrix/storage/MatrixStorageTest.kt @@ -0,0 +1,50 @@ +package org.duckdns.davygora.matrix.storage + +import io.kotest.core.spec.style.FunSpec +import io.kotest.datatest.withData +import io.kotest.matchers.shouldBe +import kotlin.reflect.KClass + +class MatrixStorageTest : + FunSpec({ + val testCases: Map, KClass<*>, KClass<*>>> = + mapOf( + "boolean" to Triple(listOf(true, false), BooleanStorage::class, BooleanArray::class), + "byte" to Triple((0..100).map { it.toByte() }, ByteStorage::class, ByteArray::class), + "char" to Triple(('a'..'z') + ('A'..'Z') + ('0'..'9'), CharStorage::class, CharArray::class), + "double" to Triple((0..100).map { it.toDouble() }, DoubleStorage::class, DoubleArray::class), + "float" to Triple((0..100).map { it.toFloat() }, FloatStorage::class, FloatArray::class), + "int" to Triple((0..100).map { it }, IntStorage::class, IntArray::class), + "long" to Triple((0..100).map { it.toLong() }, LongStorage::class, LongArray::class), + "short" to Triple((0..100).map { it.toShort() }, ShortStorage::class, ShortArray::class), + "object" to Triple((0..100).map { first -> Pair(first, (0..100).random()) }, ObjectStorage::class, Array::class), + ) + + context("list of elements of a given type should produce corresponding storage, size, get and set should work") { + withData( + testCases, + ) { (allowedValues, storageClass, dataClass) -> + + // Arrange + + val size = (10..1000).random() + val list = List(size) { allowedValues.random() } + val newList = List(size) { allowedValues.random() } + + // Act + + val storage = list.toMatrixStorage() + + // Assert + + storage::class shouldBe storageClass + storage.data::class shouldBe dataClass + + storage.size shouldBe size + list.forEachIndexed { index, value -> storage[index] shouldBe value } + + newList.forEachIndexed { index, value -> storage[index] = value } + newList.forEachIndexed { index, value -> storage[index] shouldBe value } + } + } + })