Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}