1package addrset23import (4 "testing"56 "gno.land/p/nt/uassert/v0"7)89func TestSet(t *testing.T) {10 addr1 := address("addr1")11 addr2 := address("addr2")12 addr3 := address("addr3")1314 tests := []struct {15 name string16 actions func(s *Set)17 size int18 has map[address]bool19 addrs []address // for iteration checks20 }{21 {22 name: "empty set",23 actions: func(s *Set) {},24 size: 0,25 has: map[address]bool{addr1: false},26 },27 {28 name: "single address",29 actions: func(s *Set) {30 s.Add(addr1)31 },32 size: 1,33 has: map[address]bool{34 addr1: true,35 addr2: false,36 },37 addrs: []address{addr1},38 },39 {40 name: "multiple addresses",41 actions: func(s *Set) {42 s.Add(addr1)43 s.Add(addr2)44 s.Add(addr3)45 },46 size: 3,47 has: map[address]bool{48 addr1: true,49 addr2: true,50 addr3: true,51 },52 addrs: []address{addr1, addr2, addr3},53 },54 {55 name: "remove address",56 actions: func(s *Set) {57 s.Add(addr1)58 s.Add(addr2)59 s.Remove(addr1)60 },61 size: 1,62 has: map[address]bool{63 addr1: false,64 addr2: true,65 },66 addrs: []address{addr2},67 },68 {69 name: "duplicate adds",70 actions: func(s *Set) {71 uassert.True(t, s.Add(addr1)) // first add returns true72 uassert.False(t, s.Add(addr1)) // second add returns false73 uassert.True(t, s.Remove(addr1)) // remove existing returns true74 uassert.False(t, s.Remove(addr1)) // remove non-existing returns false75 },76 size: 0,77 has: map[address]bool{78 addr1: false,79 },80 },81 }8283 for _, tt := range tests {84 t.Run(tt.name, func(t *testing.T) {85 var set Set8687 // Execute test actions88 tt.actions(&set)8990 // Check size91 uassert.Equal(t, tt.size, set.Size())9293 // Check existence94 for addr, expected := range tt.has {95 uassert.Equal(t, expected, set.Has(addr))96 }9798 // Check iteration if addresses are specified99 if tt.addrs != nil {100 collected := []address{}101 set.IterateByOffset(0, 10, func(addr address) bool {102 collected = append(collected, addr)103 return false104 })105106 // Check length107 uassert.Equal(t, len(tt.addrs), len(collected))108109 // Check each address110 for i, addr := range tt.addrs {111 uassert.Equal(t, addr, collected[i])112 }113 }114 })115 }116}117118func TestSetIterationLimits(t *testing.T) {119 tests := []struct {120 name string121 addrs []address122 offset int123 limit int124 expected int125 }{126 {127 name: "zero offset full list",128 addrs: []address{"a1", "a2", "a3"},129 offset: 0,130 limit: 10,131 expected: 3,132 },133 {134 name: "offset with limit",135 addrs: []address{"a1", "a2", "a3", "a4"},136 offset: 1,137 limit: 2,138 expected: 2,139 },140 {141 name: "offset beyond size",142 addrs: []address{"a1", "a2"},143 offset: 3,144 limit: 1,145 expected: 0,146 },147 }148149 for _, tt := range tests {150 t.Run(tt.name, func(t *testing.T) {151 var set Set152 for _, addr := range tt.addrs {153 set.Add(addr)154 }155156 // Test forward iteration157 count := 0158 set.IterateByOffset(tt.offset, tt.limit, func(addr address) bool {159 count++160 return false161 })162 uassert.Equal(t, tt.expected, count)163164 // Test reverse iteration165 count = 0166 set.ReverseIterateByOffset(tt.offset, tt.limit, func(addr address) bool {167 count++168 return false169 })170 uassert.Equal(t, tt.expected, count)171 })172 }173}174Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.