Skip to content

Commit ea543e7

Browse files
committed
test(keys): add AccountMeta ordering, factory, and dedup tests
1 parent cd98a71 commit ea543e7

1 file changed

Lines changed: 226 additions & 0 deletions

File tree

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
package com.getcode.solana.keys
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
import kotlin.test.assertFalse
6+
import kotlin.test.assertTrue
7+
8+
class AccountMetaTest {
9+
10+
private fun key(byte: Int) = PublicKey(ByteArray(32) { byte.toByte() }.toList())
11+
12+
// --- Factory methods ---
13+
14+
@Test
15+
fun payerIsSigner() {
16+
val meta = AccountMeta.payer(key(1))
17+
assertTrue(meta.isSigner)
18+
}
19+
20+
@Test
21+
fun payerIsWritable() {
22+
val meta = AccountMeta.payer(key(1))
23+
assertTrue(meta.isWritable)
24+
}
25+
26+
@Test
27+
fun payerIsPayer() {
28+
val meta = AccountMeta.payer(key(1))
29+
assertTrue(meta.isPayer)
30+
}
31+
32+
@Test
33+
fun payerIsNotProgram() {
34+
val meta = AccountMeta.payer(key(1))
35+
assertFalse(meta.isProgram)
36+
}
37+
38+
@Test
39+
fun writableIsWritable() {
40+
val meta = AccountMeta.writable(key(2))
41+
assertTrue(meta.isWritable)
42+
assertFalse(meta.isSigner)
43+
}
44+
45+
@Test
46+
fun writableWithSignerIsSigner() {
47+
val meta = AccountMeta.writable(key(2), signer = true)
48+
assertTrue(meta.isWritable)
49+
assertTrue(meta.isSigner)
50+
}
51+
52+
@Test
53+
fun readonlyIsNotWritable() {
54+
val meta = AccountMeta.readonly(key(3))
55+
assertFalse(meta.isWritable)
56+
assertFalse(meta.isSigner)
57+
}
58+
59+
@Test
60+
fun readonlyWithSignerIsSigner() {
61+
val meta = AccountMeta.readonly(key(3), signer = true)
62+
assertFalse(meta.isWritable)
63+
assertTrue(meta.isSigner)
64+
}
65+
66+
@Test
67+
fun programIsProgram() {
68+
val meta = AccountMeta.program(key(4))
69+
assertTrue(meta.isProgram)
70+
assertFalse(meta.isSigner)
71+
assertFalse(meta.isWritable)
72+
assertFalse(meta.isPayer)
73+
}
74+
75+
// --- Ordering (compareTo) ---
76+
77+
@Test
78+
fun payerSortsBeforeNonPayer() {
79+
val payer = AccountMeta.payer(key(2))
80+
val writable = AccountMeta.writable(key(1))
81+
assertTrue(payer < writable)
82+
}
83+
84+
@Test
85+
fun nonProgramSortsBeforeProgram() {
86+
val writable = AccountMeta.writable(key(2))
87+
val program = AccountMeta.program(key(1))
88+
assertTrue(writable < program)
89+
}
90+
91+
@Test
92+
fun signerSortsBeforeNonSigner() {
93+
val signer = AccountMeta.writable(key(2), signer = true)
94+
val nonSigner = AccountMeta.writable(key(1))
95+
assertTrue(signer < nonSigner)
96+
}
97+
98+
@Test
99+
fun writableSortsBeforeReadonly() {
100+
val writable = AccountMeta.writable(key(2))
101+
val readonly = AccountMeta.readonly(key(1))
102+
assertTrue(writable < readonly)
103+
}
104+
105+
@Test
106+
fun equalFlagsSortByLexicographicKey() {
107+
val lower = AccountMeta.writable(key(1))
108+
val higher = AccountMeta.writable(key(2))
109+
assertTrue(lower < higher)
110+
}
111+
112+
@Test
113+
fun sortedListProducesExpectedOrder() {
114+
val payer = AccountMeta.payer(key(1))
115+
val signer = AccountMeta.writable(key(2), signer = true)
116+
val writable = AccountMeta.writable(key(3))
117+
val readonly = AccountMeta.readonly(key(4))
118+
val program = AccountMeta.program(key(5))
119+
120+
val sorted = listOf(program, readonly, writable, signer, payer).sorted()
121+
assertEquals(listOf(payer, signer, writable, readonly, program), sorted)
122+
}
123+
124+
// --- compareLexicographically ---
125+
126+
@Test
127+
fun compareLexicographicallyEqualArraysReturnZero() {
128+
val a = byteArrayOf(1, 2, 3)
129+
assertEquals(0, AccountMeta.compareLexicographically(a, a.copyOf()))
130+
}
131+
132+
@Test
133+
fun compareLexicographicallyFirstByteDeterminesOrder() {
134+
val a = byteArrayOf(1, 0)
135+
val b = byteArrayOf(2, 0)
136+
assertTrue(AccountMeta.compareLexicographically(a, b) < 0)
137+
assertTrue(AccountMeta.compareLexicographically(b, a) > 0)
138+
}
139+
140+
@Test
141+
fun compareLexicographicallyTreatsAsUnsigned() {
142+
val low = byteArrayOf(0x00)
143+
val high = byteArrayOf(0xFF.toByte())
144+
assertTrue(AccountMeta.compareLexicographically(low, high) < 0)
145+
}
146+
147+
@Test
148+
fun compareLexicographicallyShorterIsSmaller() {
149+
val short = byteArrayOf(1, 2)
150+
val long = byteArrayOf(1, 2, 3)
151+
assertTrue(AccountMeta.compareLexicographically(short, long) < 0)
152+
}
153+
154+
// --- filterUniqueAccounts ---
155+
156+
@Test
157+
fun filterUniqueAccountsDeduplicatesByPublicKey() {
158+
val list = listOf(
159+
AccountMeta.readonly(key(1)),
160+
AccountMeta.readonly(key(1)),
161+
)
162+
assertEquals(1, list.filterUniqueAccounts().size)
163+
}
164+
165+
@Test
166+
fun filterUniqueAccountsPromotesToWritable() {
167+
val list = listOf(
168+
AccountMeta.readonly(key(1)),
169+
AccountMeta.writable(key(1)),
170+
)
171+
val unique = list.filterUniqueAccounts()
172+
assertEquals(1, unique.size)
173+
assertTrue(unique[0].isWritable)
174+
}
175+
176+
@Test
177+
fun filterUniqueAccountsPromotesToSigner() {
178+
val list = listOf(
179+
AccountMeta.writable(key(1)),
180+
AccountMeta.writable(key(1), signer = true),
181+
)
182+
val unique = list.filterUniqueAccounts()
183+
assertEquals(1, unique.size)
184+
assertTrue(unique[0].isSigner)
185+
}
186+
187+
@Test
188+
fun filterUniqueAccountsPromotesToPayer() {
189+
val list = listOf(
190+
AccountMeta.readonly(key(1)),
191+
AccountMeta.payer(key(1)),
192+
)
193+
val unique = list.filterUniqueAccounts()
194+
assertEquals(1, unique.size)
195+
assertTrue(unique[0].isPayer)
196+
}
197+
198+
@Test
199+
fun filterUniqueAccountsPreservesDistinctKeys() {
200+
val list = listOf(
201+
AccountMeta.readonly(key(1)),
202+
AccountMeta.writable(key(2)),
203+
AccountMeta.program(key(3)),
204+
)
205+
assertEquals(3, list.filterUniqueAccounts().size)
206+
}
207+
208+
@Test
209+
fun filterUniqueAccountsEmptyList() {
210+
assertEquals(0, emptyList<AccountMeta>().filterUniqueAccounts().size)
211+
}
212+
213+
// --- description ---
214+
215+
@Test
216+
fun descriptionShowsPayerFlags() {
217+
val meta = AccountMeta.payer(key(0))
218+
assertTrue(meta.description.startsWith("[ps"))
219+
}
220+
221+
@Test
222+
fun descriptionShowsProgramFlags() {
223+
val meta = AccountMeta.program(key(0))
224+
assertTrue(meta.description.startsWith("[--"))
225+
}
226+
}

0 commit comments

Comments
 (0)