Skip to content

Commit 9721154

Browse files
committed
test(opencode): add ShortVec, UInt16, Maps, Long, and ByteArray tests
- ShortVecTest: encode/decode roundtrips, boundary values, encodeList - UInt16Test: little-endian encoding for 0, 255, 256, 65535 - MapsTest: getOrPutIfNonNull conditional insertion - LongTest: floored millisecond-to-second truncation - ByteArrayExtensionsTest: toPublicKey, toMint, toSignature, toHash
1 parent 040727a commit 9721154

5 files changed

Lines changed: 307 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.getcode.opencode.internal.extensions
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class ByteArrayExtensionsTest {
7+
8+
@Test
9+
fun toPublicKeyPreservesBytes() {
10+
val bytes = ByteArray(32) { (it + 1).toByte() }
11+
val key = bytes.toPublicKey()
12+
assertEquals(bytes.toList(), key.bytes)
13+
}
14+
15+
@Test
16+
fun toMintPreservesBytes() {
17+
val bytes = ByteArray(32) { it.toByte() }
18+
val mint = bytes.toMint()
19+
assertEquals(bytes.toList(), mint.bytes)
20+
}
21+
22+
@Test
23+
fun toSignaturePreservesBytes() {
24+
val bytes = ByteArray(64) { it.toByte() }
25+
val signature = bytes.toSignature()
26+
assertEquals(bytes.toList(), signature.bytes)
27+
}
28+
29+
@Test
30+
fun toHashPreservesBytes() {
31+
val bytes = ByteArray(32) { (it * 2).toByte() }
32+
val hash = bytes.toHash()
33+
assertEquals(bytes.toList(), hash.bytes)
34+
}
35+
36+
@Test
37+
fun ubyteArrayToPublicKey() {
38+
val ubytes = UByteArray(32) { (it + 1).toUByte() }
39+
val key = ubytes.toPublicKey()
40+
assertEquals(32, key.bytes.size)
41+
}
42+
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package com.getcode.opencode.internal.solana
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class ShortVecTest {
7+
8+
// --- encodeLen / decodeLen roundtrip ---
9+
10+
@Test
11+
fun encodeLenZero() {
12+
val encoded = ShortVec.encodeLen(0)
13+
assertEquals(listOf<Byte>(0), encoded)
14+
}
15+
16+
@Test
17+
fun encodeLenSmallValue() {
18+
val encoded = ShortVec.encodeLen(5)
19+
assertEquals(listOf<Byte>(5), encoded)
20+
}
21+
22+
@Test
23+
fun encodeLenMaxSingleByte() {
24+
val encoded = ShortVec.encodeLen(0x7f)
25+
assertEquals(1, encoded.size)
26+
assertEquals(0x7f.toByte(), encoded[0])
27+
}
28+
29+
@Test
30+
fun encodeLenTwoBytes() {
31+
val encoded = ShortVec.encodeLen(0x80)
32+
assertEquals(2, encoded.size)
33+
}
34+
35+
@Test
36+
fun encodeLenLargerValue() {
37+
val encoded = ShortVec.encodeLen(0x3FFF)
38+
assertEquals(2, encoded.size)
39+
}
40+
41+
@Test
42+
fun encodeLenThreeBytes() {
43+
val encoded = ShortVec.encodeLen(0x4000)
44+
assertEquals(3, encoded.size)
45+
}
46+
47+
@Test
48+
fun roundtripZero() {
49+
val encoded = ShortVec.encodeLen(0)
50+
val (decoded, _) = ShortVec.decodeLen(encoded)
51+
assertEquals(0, decoded)
52+
}
53+
54+
@Test
55+
fun roundtripSmall() {
56+
val encoded = ShortVec.encodeLen(42)
57+
val (decoded, _) = ShortVec.decodeLen(encoded)
58+
assertEquals(42, decoded)
59+
}
60+
61+
@Test
62+
fun roundtripBoundary127() {
63+
val encoded = ShortVec.encodeLen(127)
64+
val (decoded, _) = ShortVec.decodeLen(encoded)
65+
assertEquals(127, decoded)
66+
}
67+
68+
@Test
69+
fun roundtripBoundary128() {
70+
val encoded = ShortVec.encodeLen(128)
71+
val (decoded, _) = ShortVec.decodeLen(encoded)
72+
assertEquals(128, decoded)
73+
}
74+
75+
@Test
76+
fun roundtripBoundary16383() {
77+
val encoded = ShortVec.encodeLen(16383)
78+
val (decoded, _) = ShortVec.decodeLen(encoded)
79+
assertEquals(16383, decoded)
80+
}
81+
82+
@Test
83+
fun roundtripBoundary16384() {
84+
val encoded = ShortVec.encodeLen(16384)
85+
val (decoded, _) = ShortVec.decodeLen(encoded)
86+
assertEquals(16384, decoded)
87+
}
88+
89+
@Test
90+
fun decodeLenReturnsTailBytes() {
91+
val encoded = ShortVec.encodeLen(5)
92+
val extra = listOf<Byte>(0xA, 0xB, 0xC)
93+
val input = encoded + extra
94+
val (value, remaining) = ShortVec.decodeLen(input)
95+
assertEquals(5, value)
96+
assertEquals(extra, remaining)
97+
}
98+
99+
// --- encode / encodeList ---
100+
101+
@Test
102+
fun encodePrependsLength() {
103+
val data = listOf<Byte>(1, 2, 3)
104+
val encoded = ShortVec.encode(data)
105+
assertEquals(listOf<Byte>(3, 1, 2, 3), encoded)
106+
}
107+
108+
@Test
109+
fun encodeEmptyList() {
110+
val encoded = ShortVec.encode(emptyList())
111+
assertEquals(listOf<Byte>(0), encoded)
112+
}
113+
114+
@Test
115+
fun encodeListMultipleItems() {
116+
val items = listOf(
117+
listOf<Byte>(1, 2),
118+
listOf<Byte>(3, 4, 5)
119+
)
120+
val encoded = ShortVec.encodeList(items)
121+
// 2 items, then [1,2], then [3,4,5]
122+
assertEquals(listOf<Byte>(2, 1, 2, 3, 4, 5), encoded)
123+
}
124+
125+
@Test
126+
fun encodeListEmpty() {
127+
val encoded = ShortVec.encodeList(emptyList())
128+
assertEquals(listOf<Byte>(0), encoded)
129+
}
130+
131+
@Test
132+
fun encodeListSingleItem() {
133+
val items = listOf(listOf<Byte>(0xA, 0xB))
134+
val encoded = ShortVec.encodeList(items)
135+
assertEquals(listOf<Byte>(1, 0xA, 0xB), encoded)
136+
}
137+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.getcode.opencode.internal.solana.extensions
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class UInt16Test {
7+
8+
@Test
9+
fun zeroEncodesCorrectly() {
10+
assertEquals(listOf<Byte>(0, 0), 0.toU16Bytes())
11+
}
12+
13+
@Test
14+
fun oneEncodesCorrectly() {
15+
assertEquals(listOf<Byte>(1, 0), 1.toU16Bytes())
16+
}
17+
18+
@Test
19+
fun maxSingleByteValue() {
20+
assertEquals(listOf<Byte>(0xFF.toByte(), 0), 255.toU16Bytes())
21+
}
22+
23+
@Test
24+
fun value256EncodesLittleEndian() {
25+
assertEquals(listOf<Byte>(0, 1), 256.toU16Bytes())
26+
}
27+
28+
@Test
29+
fun value257() {
30+
assertEquals(listOf<Byte>(1, 1), 257.toU16Bytes())
31+
}
32+
33+
@Test
34+
fun maxUInt16() {
35+
assertEquals(listOf<Byte>(0xFF.toByte(), 0xFF.toByte()), 65535.toU16Bytes())
36+
}
37+
38+
@Test
39+
fun arbitraryValue() {
40+
// 0x1234 = 4660 → little-endian: [0x34, 0x12]
41+
assertEquals(listOf<Byte>(0x34, 0x12), 0x1234.toU16Bytes())
42+
}
43+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.getcode.opencode.utils
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class LongTest {
7+
8+
@Test
9+
fun flooredZero() {
10+
assertEquals(0L, 0L.floored)
11+
}
12+
13+
@Test
14+
fun flooredExactSecond() {
15+
assertEquals(1000L, 1000L.floored)
16+
}
17+
18+
@Test
19+
fun flooredRoundsDown() {
20+
assertEquals(1000L, 1500L.floored)
21+
}
22+
23+
@Test
24+
fun flooredSubSecond() {
25+
assertEquals(0L, 500L.floored)
26+
}
27+
28+
@Test
29+
fun flooredExactMultipleSeconds() {
30+
assertEquals(5000L, 5000L.floored)
31+
}
32+
33+
@Test
34+
fun flooredLargeValue() {
35+
assertEquals(1710504000000L, 1710504000999L.floored)
36+
}
37+
38+
@Test
39+
fun flooredJustBelowSecond() {
40+
assertEquals(0L, 999L.floored)
41+
}
42+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.getcode.opencode.utils
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
import kotlin.test.assertNull
6+
7+
class MapsTest {
8+
9+
@Test
10+
fun getOrPutIfNonNullReturnsExistingValue() {
11+
val map = mutableMapOf("a" to 1)
12+
val result = map.getOrPutIfNonNull("a") { 99 }
13+
assertEquals(1, result)
14+
assertEquals(1, map["a"])
15+
}
16+
17+
@Test
18+
fun getOrPutIfNonNullInsertsNewValue() {
19+
val map = mutableMapOf<String, Int>()
20+
val result = map.getOrPutIfNonNull("a") { 42 }
21+
assertEquals(42, result)
22+
assertEquals(42, map["a"])
23+
}
24+
25+
@Test
26+
fun getOrPutIfNonNullSkipsNullDefault() {
27+
val map = mutableMapOf<String, Int>()
28+
val result = map.getOrPutIfNonNull("a") { null }
29+
assertNull(result)
30+
assertNull(map["a"])
31+
}
32+
33+
@Test
34+
fun getOrPutIfNonNullDoesNotCallDefaultWhenKeyExists() {
35+
val map = mutableMapOf("a" to 1)
36+
var called = false
37+
map.getOrPutIfNonNull("a") {
38+
called = true
39+
99
40+
}
41+
assertEquals(false, called)
42+
}
43+
}

0 commit comments

Comments
 (0)