Skip to content

Commit f5df7fd

Browse files
committed
test: add test cases for PackedFormat optimizations and custom properties in EncodedFormat
1 parent f5c2df9 commit f5df7fd

3 files changed

Lines changed: 72 additions & 0 deletions

File tree

src/test/kotlin/com/eignex/kencode/EncodedFormatTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,26 @@ class EncodedFormatTest {
4545
formatWithChecksum.decodeFromString(Payload.serializer(), tampered)
4646
}
4747
}
48+
49+
@Test
50+
fun `builder configures custom properties successfully`() {
51+
val value = Payload(99, "builder validation")
52+
53+
val customFormat = EncodedFormat {
54+
codec = Base85
55+
checksum = Crc32
56+
binaryFormat = PackedFormat.Default
57+
}
58+
59+
val encoded = customFormat.encodeToString(Payload.serializer(), value)
60+
61+
assertTrue(encoded.isNotEmpty())
62+
val decoded = customFormat.decodeFromString(Payload.serializer(), encoded)
63+
assertEquals(value, decoded)
64+
65+
val tampered = encoded.dropLast(1) + if (encoded.last() == 'u') "t" else "u"
66+
assertFailsWith<IllegalArgumentException> {
67+
customFormat.decodeFromString(Payload.serializer(), tampered)
68+
}
69+
}
4870
}

src/test/kotlin/com/eignex/kencode/PackedFormatTest.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,51 @@ class PackedFormatTest {
233233
decoder.decodeSerializableValue(Char.serializer())
234234
}
235235
}
236+
237+
@Test
238+
fun `builder defaultVarInt reduces size for positive integers`() {
239+
val payload = UnannotatedPayload(5, 10L)
240+
241+
val standardFormat = PackedFormat.Default
242+
val optimizedFormat = PackedFormat { defaultVarInt = true }
243+
244+
val standardBytes = standardFormat.encodeToByteArray(UnannotatedPayload.serializer(), payload)
245+
val optimizedBytes = optimizedFormat.encodeToByteArray(UnannotatedPayload.serializer(), payload)
246+
247+
// Standard size: 4 bytes (Int) + 8 bytes (Long) = 12 bytes
248+
assertEquals(12, standardBytes.size)
249+
250+
// Optimized size: 1 byte (VarInt 5) + 1 byte (VarLong 10) = 2 bytes
251+
assertEquals(2, optimizedBytes.size)
252+
assertTrue(optimizedBytes.size < standardBytes.size)
253+
254+
// Validate roundtrip
255+
val decoded = optimizedFormat.decodeFromByteArray(UnannotatedPayload.serializer(), optimizedBytes)
256+
assertEquals(payload, decoded)
257+
}
258+
259+
@Test
260+
fun `builder defaultZigZag reduces size for negative integers`() {
261+
// -1 without ZigZag takes 5 bytes for Int and 10 bytes for Long in standard VarInt encoding
262+
val payload = UnannotatedPayload(-1, -1L)
263+
264+
val standardFormat = PackedFormat.Default
265+
val varIntFormat = PackedFormat { defaultVarInt = true }
266+
val zigZagFormat = PackedFormat { defaultZigZag = true }
267+
268+
val standardBytes = standardFormat.encodeToByteArray(UnannotatedPayload.serializer(), payload)
269+
val varIntBytes = varIntFormat.encodeToByteArray(UnannotatedPayload.serializer(), payload)
270+
val zigZagBytes = zigZagFormat.encodeToByteArray(UnannotatedPayload.serializer(), payload)
271+
272+
// Standard: 12 bytes
273+
assertEquals(12, standardBytes.size)
274+
// Basic VarInt of negative numbers uses max bytes: 5 + 10 = 15 bytes
275+
assertEquals(15, varIntBytes.size)
276+
// ZigZag folds -1 into 1, which takes 1 byte each: 1 + 1 = 2 bytes
277+
assertEquals(2, zigZagBytes.size)
278+
279+
// Validate roundtrip
280+
val decoded = zigZagFormat.decodeFromByteArray(UnannotatedPayload.serializer(), zigZagBytes)
281+
assertEquals(payload, decoded)
282+
}
236283
}

src/test/kotlin/com/eignex/kencode/TestClasses.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,6 @@ data class PolymorphicContainer(
245245
val main: PolymorphicBase,
246246
val history: List<PolymorphicBase>
247247
)
248+
249+
@Serializable
250+
data class UnannotatedPayload(val x: Int, val y: Long)

0 commit comments

Comments
 (0)