addrset_test.gno

3.38 Kb ยท 174 lines
  1package addrset
  2
  3import (
  4	"std"
  5	"testing"
  6
  7	"gno.land/p/demo/uassert"
  8)
  9
 10func TestSet(t *testing.T) {
 11	addr1 := std.Address("addr1")
 12	addr2 := std.Address("addr2")
 13	addr3 := std.Address("addr3")
 14
 15	tests := []struct {
 16		name    string
 17		actions func(s *Set)
 18		size    int
 19		has     map[std.Address]bool
 20		addrs   []std.Address // for iteration checks
 21	}{
 22		{
 23			name:    "empty set",
 24			actions: func(s *Set) {},
 25			size:    0,
 26			has:     map[std.Address]bool{addr1: false},
 27		},
 28		{
 29			name: "single address",
 30			actions: func(s *Set) {
 31				s.Add(addr1)
 32			},
 33			size: 1,
 34			has: map[std.Address]bool{
 35				addr1: true,
 36				addr2: false,
 37			},
 38			addrs: []std.Address{addr1},
 39		},
 40		{
 41			name: "multiple addresses",
 42			actions: func(s *Set) {
 43				s.Add(addr1)
 44				s.Add(addr2)
 45				s.Add(addr3)
 46			},
 47			size: 3,
 48			has: map[std.Address]bool{
 49				addr1: true,
 50				addr2: true,
 51				addr3: true,
 52			},
 53			addrs: []std.Address{addr1, addr2, addr3},
 54		},
 55		{
 56			name: "remove address",
 57			actions: func(s *Set) {
 58				s.Add(addr1)
 59				s.Add(addr2)
 60				s.Remove(addr1)
 61			},
 62			size: 1,
 63			has: map[std.Address]bool{
 64				addr1: false,
 65				addr2: true,
 66			},
 67			addrs: []std.Address{addr2},
 68		},
 69		{
 70			name: "duplicate adds",
 71			actions: func(s *Set) {
 72				uassert.True(t, s.Add(addr1))     // first add returns true
 73				uassert.False(t, s.Add(addr1))    // second add returns false
 74				uassert.True(t, s.Remove(addr1))  // remove existing returns true
 75				uassert.False(t, s.Remove(addr1)) // remove non-existing returns false
 76			},
 77			size: 0,
 78			has: map[std.Address]bool{
 79				addr1: false,
 80			},
 81		},
 82	}
 83
 84	for _, tt := range tests {
 85		t.Run(tt.name, func(t *testing.T) {
 86			var set Set
 87
 88			// Execute test actions
 89			tt.actions(&set)
 90
 91			// Check size
 92			uassert.Equal(t, tt.size, set.Size())
 93
 94			// Check existence
 95			for addr, expected := range tt.has {
 96				uassert.Equal(t, expected, set.Has(addr))
 97			}
 98
 99			// Check iteration if addresses are specified
100			if tt.addrs != nil {
101				collected := []std.Address{}
102				set.IterateByOffset(0, 10, func(addr std.Address) bool {
103					collected = append(collected, addr)
104					return false
105				})
106
107				// Check length
108				uassert.Equal(t, len(tt.addrs), len(collected))
109
110				// Check each address
111				for i, addr := range tt.addrs {
112					uassert.Equal(t, addr, collected[i])
113				}
114			}
115		})
116	}
117}
118
119func TestSetIterationLimits(t *testing.T) {
120	tests := []struct {
121		name     string
122		addrs    []std.Address
123		offset   int
124		limit    int
125		expected int
126	}{
127		{
128			name:     "zero offset full list",
129			addrs:    []std.Address{"a1", "a2", "a3"},
130			offset:   0,
131			limit:    10,
132			expected: 3,
133		},
134		{
135			name:     "offset with limit",
136			addrs:    []std.Address{"a1", "a2", "a3", "a4"},
137			offset:   1,
138			limit:    2,
139			expected: 2,
140		},
141		{
142			name:     "offset beyond size",
143			addrs:    []std.Address{"a1", "a2"},
144			offset:   3,
145			limit:    1,
146			expected: 0,
147		},
148	}
149
150	for _, tt := range tests {
151		t.Run(tt.name, func(t *testing.T) {
152			var set Set
153			for _, addr := range tt.addrs {
154				set.Add(addr)
155			}
156
157			// Test forward iteration
158			count := 0
159			set.IterateByOffset(tt.offset, tt.limit, func(addr std.Address) bool {
160				count++
161				return false
162			})
163			uassert.Equal(t, tt.expected, count)
164
165			// Test reverse iteration
166			count = 0
167			set.ReverseIterateByOffset(tt.offset, tt.limit, func(addr std.Address) bool {
168				count++
169				return false
170			})
171			uassert.Equal(t, tt.expected, count)
172		})
173	}
174}