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

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

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}