1package addrset23import (4 "testing"56 "gno.land/p/nt/uassert/v0"7)89func TestReadonlySet(t *testing.T) {10 addr1 := address("addr1")11 addr2 := address("addr2")12 addr3 := address("addr3")1314 var set Set15 set.Add(addr1)16 set.Add(addr2)1718 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))2324 // NewReadonlySet is equivalent to Set.Readonly.25 ro2 := NewReadonlySet(&set)26 uassert.Equal(t, 2, ro2.Size())27 uassert.True(t, ro2.Has(addr1))2829 // 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}3637func TestReadonlySetIterateByOffset(t *testing.T) {38 var set Set39 set.Add(address("addr2"))40 set.Add(address("addr1"))41 set.Add(address("addr3"))42 ro := set.Readonly()4344 var got []address45 stopped := ro.IterateByOffset(0, 10, func(a address) bool {46 got = append(got, a)47 return false48 })49 uassert.False(t, stopped)50 uassert.Equal(t, 3, len(got))51 uassert.Equal(t, address("addr1"), got[0]) // sorted order52 uassert.Equal(t, address("addr2"), got[1])53 uassert.Equal(t, address("addr3"), got[2])5455 // offset/count window.56 got = nil57 ro.IterateByOffset(1, 1, func(a address) bool {58 got = append(got, a)59 return false60 })61 uassert.Equal(t, 1, len(got))62 uassert.Equal(t, address("addr2"), got[0])6364 // Early stop is reported, and iteration actually halts.65 count := 066 stopped = ro.IterateByOffset(0, 10, func(a address) bool {67 count++68 return true69 })70 uassert.True(t, stopped)71 uassert.Equal(t, 1, count)7273 // Empty set: callback never runs, not stopped.74 var empty Set75 stopped = empty.Readonly().IterateByOffset(0, 10, func(a address) bool { return true })76 uassert.False(t, stopped)77}7879func TestReadonlySetReverseIterateByOffset(t *testing.T) {80 var set Set81 set.Add(address("addr1"))82 set.Add(address("addr2"))83 set.Add(address("addr3"))84 ro := set.Readonly()8586 var got []address87 stopped := ro.ReverseIterateByOffset(0, 10, func(a address) bool {88 got = append(got, a)89 return false90 })91 uassert.False(t, stopped)92 uassert.Equal(t, 3, len(got))93 uassert.Equal(t, address("addr3"), got[0]) // descending order94 uassert.Equal(t, address("addr2"), got[1])95 uassert.Equal(t, address("addr1"), got[2])9697 // offset/count window (offset from the end).98 got = nil99 ro.ReverseIterateByOffset(1, 1, func(a address) bool {100 got = append(got, a)101 return false102 })103 uassert.Equal(t, 1, len(got))104 uassert.Equal(t, address("addr2"), got[0])105106 // Early stop is reported, and iteration actually halts.107 count := 0108 stopped = ro.ReverseIterateByOffset(0, 10, func(a address) bool {109 count++110 return true111 })112 uassert.True(t, stopped)113 uassert.Equal(t, 1, count)114}115Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.