readonly_test.gno
2.71 Kb · 114 lines
1package addrset
2
3import (
4 "testing"
5
6 "gno.land/p/nt/uassert/v0"
7)
8
9func TestReadonlySet(t *testing.T) {
10 addr1 := address("addr1")
11 addr2 := address("addr2")
12 addr3 := address("addr3")
13
14 var set Set
15 set.Add(addr1)
16 set.Add(addr2)
17
18 ro := set.Readonly()
19 uassert.Equal(t, 2, ro.Size())
20 uassert.True(t, ro.Has(addr1))
21 uassert.True(t, ro.Has(addr2))
22 uassert.False(t, ro.Has(addr3))
23
24 // NewReadonlySet is equivalent to Set.Readonly.
25 ro2 := NewReadonlySet(&set)
26 uassert.Equal(t, 2, ro2.Size())
27 uassert.True(t, ro2.Has(addr1))
28
29 // The view is a live handle, not a snapshot.
30 set.Add(addr3)
31 uassert.Equal(t, 3, ro.Size())
32 uassert.True(t, ro.Has(addr3))
33 set.Remove(addr1)
34 uassert.False(t, ro.Has(addr1))
35}
36
37func TestReadonlySetIterateByOffset(t *testing.T) {
38 var set Set
39 set.Add(address("addr2"))
40 set.Add(address("addr1"))
41 set.Add(address("addr3"))
42 ro := set.Readonly()
43
44 var got []address
45 stopped := ro.IterateByOffset(0, 10, func(a address) bool {
46 got = append(got, a)
47 return false
48 })
49 uassert.False(t, stopped)
50 uassert.Equal(t, 3, len(got))
51 uassert.Equal(t, address("addr1"), got[0]) // sorted order
52 uassert.Equal(t, address("addr2"), got[1])
53 uassert.Equal(t, address("addr3"), got[2])
54
55 // offset/count window.
56 got = nil
57 ro.IterateByOffset(1, 1, func(a address) bool {
58 got = append(got, a)
59 return false
60 })
61 uassert.Equal(t, 1, len(got))
62 uassert.Equal(t, address("addr2"), got[0])
63
64 // Early stop is reported, and iteration actually halts.
65 count := 0
66 stopped = ro.IterateByOffset(0, 10, func(a address) bool {
67 count++
68 return true
69 })
70 uassert.True(t, stopped)
71 uassert.Equal(t, 1, count)
72
73 // Empty set: callback never runs, not stopped.
74 var empty Set
75 stopped = empty.Readonly().IterateByOffset(0, 10, func(a address) bool { return true })
76 uassert.False(t, stopped)
77}
78
79func TestReadonlySetReverseIterateByOffset(t *testing.T) {
80 var set Set
81 set.Add(address("addr1"))
82 set.Add(address("addr2"))
83 set.Add(address("addr3"))
84 ro := set.Readonly()
85
86 var got []address
87 stopped := ro.ReverseIterateByOffset(0, 10, func(a address) bool {
88 got = append(got, a)
89 return false
90 })
91 uassert.False(t, stopped)
92 uassert.Equal(t, 3, len(got))
93 uassert.Equal(t, address("addr3"), got[0]) // descending order
94 uassert.Equal(t, address("addr2"), got[1])
95 uassert.Equal(t, address("addr1"), got[2])
96
97 // offset/count window (offset from the end).
98 got = nil
99 ro.ReverseIterateByOffset(1, 1, func(a address) bool {
100 got = append(got, a)
101 return false
102 })
103 uassert.Equal(t, 1, len(got))
104 uassert.Equal(t, address("addr2"), got[0])
105
106 // Early stop is reported, and iteration actually halts.
107 count := 0
108 stopped = ro.ReverseIterateByOffset(0, 10, func(a address) bool {
109 count++
110 return true
111 })
112 uassert.True(t, stopped)
113 uassert.Equal(t, 1, count)
114}