diff --git a/lib/src/commonMain/kotlin/xyz/mcxross/kaptos/serialize/MoveVectorSerializer.kt b/lib/src/commonMain/kotlin/xyz/mcxross/kaptos/serialize/MoveVectorSerializer.kt index 98870e2d..37015f81 100644 --- a/lib/src/commonMain/kotlin/xyz/mcxross/kaptos/serialize/MoveVectorSerializer.kt +++ b/lib/src/commonMain/kotlin/xyz/mcxross/kaptos/serialize/MoveVectorSerializer.kt @@ -21,6 +21,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.listSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.encoding.decodeStructure import kotlinx.serialization.encoding.encodeCollection import xyz.mcxross.kaptos.model.EntryFunctionArgument import xyz.mcxross.kaptos.model.MoveVector @@ -40,6 +41,13 @@ class MoveVectorSerializer( } override fun deserialize(decoder: Decoder): MoveVector { - return MoveVector(listOf()) + return MoveVector( + decoder.decodeStructure(descriptor) { + val size = decodeCollectionSize(descriptor) + List(size) { i -> + decodeSerializableElement(descriptor, i, elementSerializer) + } + } + ) } } diff --git a/lib/src/commonTest/kotlin/xyz/mcxross/kaptos/unit/serialize/MoveVectorSerializerTest.kt b/lib/src/commonTest/kotlin/xyz/mcxross/kaptos/unit/serialize/MoveVectorSerializerTest.kt index 58e6ab0e..9348f71a 100644 --- a/lib/src/commonTest/kotlin/xyz/mcxross/kaptos/unit/serialize/MoveVectorSerializerTest.kt +++ b/lib/src/commonTest/kotlin/xyz/mcxross/kaptos/unit/serialize/MoveVectorSerializerTest.kt @@ -3,7 +3,10 @@ package xyz.mcxross.kaptos.unit.serialize import xyz.mcxross.bcs.Bcs import kotlin.test.Test import xyz.mcxross.kaptos.model.MoveVector +import xyz.mcxross.kaptos.model.U8 +import kotlin.test.Ignore import kotlin.test.assertContentEquals +import kotlin.test.assertFailsWith class MoveVectorSerializerTest { @Test() @@ -39,4 +42,46 @@ class MoveVectorSerializerTest { assertContentEquals(expected, encoded) } -} \ No newline at end of file + + @Test + fun `can deserialize a vector with less than 128 items`() { + val encoded = listOf(3.toByte(), 1.toByte(), 2.toByte(), 3.toByte()).toByteArray() + + val decoded: MoveVector = Bcs.decodeFromByteArray(encoded) + val expected = MoveVector.u8(listOf(1.toByte(), 2.toByte(), 3.toByte()).toByteArray()) + + assertContentEquals(expected.values, decoded.values) + } + + @Test + fun `can deserialize an empty vector`() { + val encoded = listOf(0.toByte()).toByteArray() + + val decoded: MoveVector = Bcs.decodeFromByteArray(encoded) + val expected = MoveVector.u8(emptyList().toByteArray()) + + assertContentEquals(expected.values, decoded.values) + } + + @Test // Fails due to incorrect size check in bcs lib, will circle back after fixing bcs + @Ignore + fun `can deserialize a vector with 128 items`() { + val base = ByteArray(128) { it.toByte() } + val expectedLengthTag = listOf(0x80.toByte(), 0x01.toByte()).toByteArray() + val encoded = expectedLengthTag + base + + val decoded: MoveVector = Bcs.decodeFromByteArray(encoded) + val expected = MoveVector.u8(base) + + assertContentEquals(expected.values, decoded.values) + } + + @Test + fun `should throw error when deserializing empty byte array`() { + val emptyInput = byteArrayOf() + + assertFailsWith { + Bcs.decodeFromByteArray>(emptyInput) + } + } +}