addrset_test.gno

3.29 Kb ยท 173 lines
  1package addrset
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/nt/uassert"
  7)
  8
  9func TestSet(t *testing.T) {
 10	addr1 := address("addr1")
 11	addr2 := address("addr2")
 12	addr3 := address("addr3")
 13
 14	tests := []struct {
 15		name    string
 16		actions func(s *Set)
 17		size    int
 18		has     map[address]bool
 19		addrs   []address // for iteration checks
 20	}{
 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 true
 72				uassert.False(t, s.Add(addr1))    // second add returns false
 73				uassert.True(t, s.Remove(addr1))  // remove existing returns true
 74				uassert.False(t, s.Remove(addr1)) // remove non-existing returns false
 75			},
 76			size: 0,
 77			has: map[address]bool{
 78				addr1: false,
 79			},
 80		},
 81	}
 82
 83	for _, tt := range tests {
 84		t.Run(tt.name, func(t *testing.T) {
 85			var set Set
 86
 87			// Execute test actions
 88			tt.actions(&set)
 89
 90			// Check size
 91			uassert.Equal(t, tt.size, set.Size())
 92
 93			// Check existence
 94			for addr, expected := range tt.has {
 95				uassert.Equal(t, expected, set.Has(addr))
 96			}
 97
 98			// Check iteration if addresses are specified
 99			if tt.addrs != nil {
100				collected := []address{}
101				set.IterateByOffset(0, 10, func(addr address) bool {
102					collected = append(collected, addr)
103					return false
104				})
105
106				// Check length
107				uassert.Equal(t, len(tt.addrs), len(collected))
108
109				// Check each address
110				for i, addr := range tt.addrs {
111					uassert.Equal(t, addr, collected[i])
112				}
113			}
114		})
115	}
116}
117
118func TestSetIterationLimits(t *testing.T) {
119	tests := []struct {
120		name     string
121		addrs    []address
122		offset   int
123		limit    int
124		expected int
125	}{
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	}
148
149	for _, tt := range tests {
150		t.Run(tt.name, func(t *testing.T) {
151			var set Set
152			for _, addr := range tt.addrs {
153				set.Add(addr)
154			}
155
156			// Test forward iteration
157			count := 0
158			set.IterateByOffset(tt.offset, tt.limit, func(addr address) bool {
159				count++
160				return false
161			})
162			uassert.Equal(t, tt.expected, count)
163
164			// Test reverse iteration
165			count = 0
166			set.ReverseIterateByOffset(tt.offset, tt.limit, func(addr address) bool {
167				count++
168				return false
169			})
170			uassert.Equal(t, tt.expected, count)
171		})
172	}
173}