fifo_test.gno
5.77 Kb ยท 294 lines
1package fifo
2
3import (
4 "testing"
5
6 "gno.land/p/demo/uassert"
7)
8
9func TestNew(t *testing.T) {
10 l := New(5)
11 uassert.Equal(t, 5, l.MaxSize())
12 uassert.Equal(t, 0, l.Size())
13}
14
15func TestAppend(t *testing.T) {
16 l := New(3)
17
18 // Test adding within capacity
19 l.Append(1)
20 l.Append(2)
21 uassert.Equal(t, 2, l.Size())
22 uassert.Equal(t, 1, l.Get(0))
23 uassert.Equal(t, 2, l.Get(1))
24
25 // Test overflow behavior
26 l.Append(3)
27 l.Append(4)
28 uassert.Equal(t, 3, l.Size())
29 uassert.Equal(t, 2, l.Get(0))
30 uassert.Equal(t, 3, l.Get(1))
31 uassert.Equal(t, 4, l.Get(2))
32}
33
34func TestPrepend(t *testing.T) {
35 l := New(3)
36
37 // Test adding within capacity
38 l.Prepend(1)
39 l.Prepend(2)
40 uassert.Equal(t, 2, l.Size())
41 uassert.Equal(t, 2, l.Get(0))
42 uassert.Equal(t, 1, l.Get(1))
43
44 // Test overflow behavior
45 l.Prepend(3)
46 l.Prepend(4)
47 uassert.Equal(t, 3, l.Size())
48 uassert.Equal(t, 4, l.Get(0))
49 uassert.Equal(t, 3, l.Get(1))
50 uassert.Equal(t, 2, l.Get(2))
51}
52
53func TestGet(t *testing.T) {
54 l := New(3)
55 l.Append(1)
56 l.Append(2)
57 l.Append(3)
58
59 // Test valid indices
60 uassert.Equal(t, 1, l.Get(0))
61 uassert.Equal(t, 2, l.Get(1))
62 uassert.Equal(t, 3, l.Get(2))
63
64 // Test invalid indices
65 uassert.True(t, l.Get(-1) == nil)
66 uassert.True(t, l.Get(3) == nil)
67}
68
69func TestEntries(t *testing.T) {
70 l := New(3)
71 l.Append(1)
72 l.Append(2)
73 l.Append(3)
74
75 entries := l.Entries()
76 uassert.Equal(t, 3, len(entries))
77 uassert.Equal(t, 1, entries[0])
78 uassert.Equal(t, 2, entries[1])
79 uassert.Equal(t, 3, entries[2])
80}
81
82func TestLatest(t *testing.T) {
83 l := New(5)
84
85 // Test empty list
86 uassert.True(t, l.Latest() == nil)
87
88 // Test single entry
89 l.Append(1)
90 uassert.Equal(t, 1, l.Latest())
91
92 // Test multiple entries
93 l.Append(2)
94 l.Append(3)
95 uassert.Equal(t, 3, l.Latest())
96
97 // Test after overflow
98 l.Append(4)
99 l.Append(5)
100 l.Append(6)
101 uassert.Equal(t, 6, l.Latest())
102}
103
104func TestIterator(t *testing.T) {
105 l := New(3)
106 l.Append(1)
107 l.Append(2)
108 l.Append(3)
109
110 iter := l.Iterator()
111 uassert.Equal(t, 1, iter())
112 uassert.Equal(t, 2, iter())
113 uassert.Equal(t, 3, iter())
114 uassert.True(t, iter() == nil)
115}
116
117func TestMixedOperations(t *testing.T) {
118 l := New(3)
119
120 // Mix of append and prepend operations
121 l.Append(1) // [1]
122 l.Prepend(2) // [2,1]
123 l.Append(3) // [2,1,3]
124 l.Prepend(4) // [4,2,1]
125
126 entries := l.Entries()
127 uassert.Equal(t, 3, len(entries))
128 uassert.Equal(t, 4, entries[0])
129 uassert.Equal(t, 2, entries[1])
130 uassert.Equal(t, 1, entries[2])
131}
132
133func TestEmptyList(t *testing.T) {
134 l := New(3)
135
136 // Test operations on empty list
137 uassert.Equal(t, 0, l.Size())
138 uassert.True(t, l.Get(0) == nil)
139 uassert.Equal(t, 0, len(l.Entries()))
140 uassert.True(t, l.Latest() == nil)
141
142 iter := l.Iterator()
143 uassert.True(t, iter() == nil)
144}
145
146func TestEdgeCases(t *testing.T) {
147 // Test zero-size list
148 l := New(0)
149 uassert.Equal(t, 0, l.MaxSize())
150 l.Append(1) // Should be no-op
151 uassert.Equal(t, 0, l.Size())
152
153 // Test single-element list
154 l = New(1)
155 l.Append(1)
156 l.Append(2) // Should replace 1
157 uassert.Equal(t, 1, l.Size())
158 uassert.Equal(t, 2, l.Latest())
159
160 // Test rapid append/prepend alternation
161 l = New(3)
162 l.Append(1) // [1]
163 l.Prepend(2) // [2,1]
164 l.Append(3) // [2,1,3]
165 l.Prepend(4) // [4,2,1]
166 l.Append(5) // [2,1,5]
167 uassert.Equal(t, 3, l.Size())
168 entries := l.Entries()
169 uassert.Equal(t, 2, entries[0])
170 uassert.Equal(t, 1, entries[1])
171 uassert.Equal(t, 5, entries[2])
172
173 // Test nil values
174 l = New(2)
175 l.Append(nil)
176 l.Prepend(nil)
177 uassert.Equal(t, 2, l.Size())
178 uassert.True(t, l.Get(0) == nil)
179 uassert.True(t, l.Get(1) == nil)
180
181 // Test index bounds
182 l = New(3)
183 l.Append(1)
184 uassert.True(t, l.Get(-1) == nil)
185 uassert.True(t, l.Get(1) == nil)
186
187 // Test iterator exhaustion
188 l = New(2)
189 l.Append(1)
190 l.Append(2)
191 iter := l.Iterator()
192 uassert.Equal(t, 1, iter())
193 uassert.Equal(t, 2, iter())
194 uassert.True(t, iter() == nil)
195 uassert.True(t, iter() == nil)
196
197 // Test prepend on full list
198 l = New(2)
199 l.Append(1)
200 l.Append(2) // [1,2]
201 l.Prepend(3) // [3,1]
202 uassert.Equal(t, 2, l.Size())
203 entries = l.Entries()
204 uassert.Equal(t, 3, entries[0])
205 uassert.Equal(t, 1, entries[1])
206}
207
208func TestSetMaxSize(t *testing.T) {
209 l := New(5)
210
211 // Fill the list
212 l.Append(1)
213 l.Append(2)
214 l.Append(3)
215 l.Append(4)
216 l.Append(5)
217
218 // Test increasing maxSize
219 l.SetMaxSize(7)
220 uassert.Equal(t, 7, l.MaxSize())
221 uassert.Equal(t, 5, l.Size())
222
223 // Test reducing maxSize
224 l.SetMaxSize(3)
225 uassert.Equal(t, 3, l.Size())
226 entries := l.Entries()
227 uassert.Equal(t, 3, entries[0])
228 uassert.Equal(t, 4, entries[1])
229 uassert.Equal(t, 5, entries[2])
230
231 // Test setting to zero
232 l.SetMaxSize(0)
233 uassert.Equal(t, 0, l.Size())
234 uassert.True(t, l.head == nil)
235 uassert.True(t, l.tail == nil)
236
237 // Test negative maxSize
238 l.SetMaxSize(-1)
239 uassert.Equal(t, 0, l.MaxSize())
240
241 // Test setting back to positive
242 l.SetMaxSize(2)
243 l.Append(1)
244 l.Append(2)
245 l.Append(3)
246 uassert.Equal(t, 2, l.Size())
247 entries = l.Entries()
248 uassert.Equal(t, 2, entries[0])
249 uassert.Equal(t, 3, entries[1])
250}
251
252func TestDelete(t *testing.T) {
253 l := New(5)
254
255 // Test delete on empty list
256 uassert.False(t, l.Delete(0))
257 uassert.False(t, l.Delete(-1))
258
259 // Fill list
260 l.Append(1)
261 l.Append(2)
262 l.Append(3)
263 l.Append(4)
264
265 // Test invalid indices
266 uassert.False(t, l.Delete(-1))
267 uassert.False(t, l.Delete(4))
268
269 // Test deleting from middle
270 uassert.True(t, l.Delete(1))
271 uassert.Equal(t, 3, l.Size())
272 entries := l.Entries()
273 uassert.Equal(t, 1, entries[0])
274 uassert.Equal(t, 3, entries[1])
275 uassert.Equal(t, 4, entries[2])
276
277 // Test deleting from head
278 uassert.True(t, l.Delete(0))
279 uassert.Equal(t, 2, l.Size())
280 entries = l.Entries()
281 uassert.Equal(t, 3, entries[0])
282 uassert.Equal(t, 4, entries[1])
283
284 // Test deleting from tail
285 uassert.True(t, l.Delete(1))
286 uassert.Equal(t, 1, l.Size())
287 uassert.Equal(t, 3, l.Latest())
288
289 // Test deleting last element
290 uassert.True(t, l.Delete(0))
291 uassert.Equal(t, 0, l.Size())
292 uassert.True(t, l.head == nil)
293 uassert.True(t, l.tail == nil)
294}