tree_test.gno
4.67 Kb · 212 lines
1package avl
2
3import "testing"
4
5func TestNewTree(t *testing.T) {
6 tree := NewTree()
7 if tree.node != nil {
8 t.Error("Expected tree.node to be nil")
9 }
10}
11
12func TestTreeSize(t *testing.T) {
13 tree := NewTree()
14 if tree.Size() != 0 {
15 t.Error("Expected empty tree size to be 0")
16 }
17
18 tree.Set("key1", "value1")
19 tree.Set("key2", "value2")
20 if tree.Size() != 2 {
21 t.Error("Expected tree size to be 2")
22 }
23}
24
25func TestTreeHas(t *testing.T) {
26 tree := NewTree()
27 tree.Set("key1", "value1")
28
29 if !tree.Has("key1") {
30 t.Error("Expected tree to have key1")
31 }
32
33 if tree.Has("key2") {
34 t.Error("Expected tree to not have key2")
35 }
36}
37
38func TestTreeGet(t *testing.T) {
39 tree := NewTree()
40 tree.Set("key1", "value1")
41
42 value, exists := tree.Get("key1")
43 if !exists || value != "value1" {
44 t.Error("Expected Get to return value1 and true")
45 }
46
47 _, exists = tree.Get("key2")
48 if exists {
49 t.Error("Expected Get to return false for non-existent key")
50 }
51}
52
53func TestTreeGetByIndex(t *testing.T) {
54 tree := NewTree()
55 tree.Set("key1", "value1")
56 tree.Set("key2", "value2")
57
58 key, value := tree.GetByIndex(0)
59 if key != "key1" || value != "value1" {
60 t.Error("Expected GetByIndex(0) to return key1 and value1")
61 }
62
63 key, value = tree.GetByIndex(1)
64 if key != "key2" || value != "value2" {
65 t.Error("Expected GetByIndex(1) to return key2 and value2")
66 }
67
68 defer func() {
69 if r := recover(); r == nil {
70 t.Error("Expected GetByIndex to panic for out-of-range index")
71 }
72 }()
73 tree.GetByIndex(2)
74}
75
76func TestTreeRemove(t *testing.T) {
77 tree := NewTree()
78 tree.Set("key1", "value1")
79
80 value, removed := tree.Remove("key1")
81 if !removed || value != "value1" || tree.Size() != 0 {
82 t.Error("Expected Remove to remove key-value pair")
83 }
84
85 _, removed = tree.Remove("key2")
86 if removed {
87 t.Error("Expected Remove to return false for non-existent key")
88 }
89}
90
91func TestTreeIterate(t *testing.T) {
92 tree := NewTree()
93 tree.Set("key1", "value1")
94 tree.Set("key2", "value2")
95 tree.Set("key3", "value3")
96
97 var keys []string
98 tree.Iterate("", "", func(key string, value any) bool {
99 keys = append(keys, key)
100 return false
101 })
102
103 expectedKeys := []string{"key1", "key2", "key3"}
104 if !slicesEqual(keys, expectedKeys) {
105 t.Errorf("Expected keys %v, got %v", expectedKeys, keys)
106 }
107}
108
109func TestTreeReverseIterate(t *testing.T) {
110 tree := NewTree()
111 tree.Set("key1", "value1")
112 tree.Set("key2", "value2")
113 tree.Set("key3", "value3")
114
115 var keys []string
116 tree.ReverseIterate("", "", func(key string, value any) bool {
117 keys = append(keys, key)
118 return false
119 })
120
121 expectedKeys := []string{"key3", "key2", "key1"}
122 if !slicesEqual(keys, expectedKeys) {
123 t.Errorf("Expected keys %v, got %v", expectedKeys, keys)
124 }
125}
126
127func TestTreeIterateByOffset(t *testing.T) {
128 tree := NewTree()
129 tree.Set("key1", "value1")
130 tree.Set("key2", "value2")
131 tree.Set("key3", "value3")
132
133 var keys []string
134 tree.IterateByOffset(1, 2, func(key string, value any) bool {
135 keys = append(keys, key)
136 return false
137 })
138
139 expectedKeys := []string{"key2", "key3"}
140 if !slicesEqual(keys, expectedKeys) {
141 t.Errorf("Expected keys %v, got %v", expectedKeys, keys)
142 }
143}
144
145func TestTreeReverseIterateByOffset(t *testing.T) {
146 tree := NewTree()
147 tree.Set("key1", "value1")
148 tree.Set("key2", "value2")
149 tree.Set("key3", "value3")
150
151 var keys []string
152 tree.ReverseIterateByOffset(1, 2, func(key string, value any) bool {
153 keys = append(keys, key)
154 return false
155 })
156
157 expectedKeys := []string{"key2", "key1"}
158 if !slicesEqual(keys, expectedKeys) {
159 t.Errorf("Expected keys %v, got %v", expectedKeys, keys)
160 }
161}
162
163func TestTreeReverseIterateByOffsetVaried(t *testing.T) {
164 tree := NewTree()
165 tree.Set("a", 1)
166 tree.Set("b", 2)
167 tree.Set("c", 3)
168 tree.Set("d", 4)
169 tree.Set("e", 5)
170
171 // All keys in reverse: e d c b a
172 cases := []struct {
173 offset int
174 limit int
175 want []string
176 }{
177 {0, 5, []string{"e", "d", "c", "b", "a"}},
178 {0, 1, []string{"e"}},
179 {0, 3, []string{"e", "d", "c"}},
180 {1, 2, []string{"d", "c"}},
181 {2, 2, []string{"c", "b"}},
182 {3, 5, []string{"b", "a"}},
183 {4, 1, []string{"a"}},
184 {4, 10, []string{"a"}},
185 {5, 1, nil},
186 {0, 0, nil},
187 {10, 1, nil},
188 }
189
190 for _, tc := range cases {
191 var got []string
192 tree.ReverseIterateByOffset(tc.offset, tc.limit, func(key string, value any) bool {
193 got = append(got, key)
194 return false
195 })
196 if !slicesEqual(got, tc.want) {
197 t.Errorf("ReverseIterateByOffset(%d, %d): got %v, want %v",
198 tc.offset, tc.limit, got, tc.want)
199 }
200 }
201
202 // Early termination: stop after 2 items from offset 1.
203 var got []string
204 tree.ReverseIterateByOffset(1, 5, func(key string, value any) bool {
205 got = append(got, key)
206 return len(got) >= 2
207 })
208 want := []string{"d", "c"}
209 if !slicesEqual(got, want) {
210 t.Errorf("ReverseIterateByOffset early stop: got %v, want %v", got, want)
211 }
212}