@@ -133,3 +133,82 @@ func TestIavlTree(t *testing.T) {
133
133
// close the db
134
134
require .NoError (t , tree .Close ())
135
135
}
136
+
137
+ func TestIavlTreeIterator (t * testing.T ) {
138
+ // generate a new tree
139
+ tree := generateTree ()
140
+ require .NotNil (t , tree )
141
+
142
+ // write a batch of version 1
143
+ require .NoError (t , tree .Set ([]byte ("key1" ), []byte ("value1" )))
144
+ require .NoError (t , tree .Set ([]byte ("key2" ), []byte ("value2" )))
145
+ require .NoError (t , tree .Set ([]byte ("key3" ), []byte ("value3" )))
146
+
147
+ // commit the batch
148
+ _ , _ , err := tree .Commit ()
149
+ require .NoError (t , err )
150
+
151
+ // write a batch of version 2
152
+ require .NoError (t , tree .Set ([]byte ("key4" ), []byte ("value4" )))
153
+ require .NoError (t , tree .Set ([]byte ("key5" ), []byte ("value5" )))
154
+ require .NoError (t , tree .Set ([]byte ("key6" ), []byte ("value6" )))
155
+ require .NoError (t , tree .Remove ([]byte ("key1" ))) // delete key1
156
+ _ , _ , err = tree .Commit ()
157
+ require .NoError (t , err )
158
+
159
+ // write a batch of version 3
160
+ require .NoError (t , tree .Set ([]byte ("key7" ), []byte ("value7" )))
161
+ require .NoError (t , tree .Set ([]byte ("key8" ), []byte ("value8" )))
162
+ _ , _ , err = tree .Commit ()
163
+ require .NoError (t , err )
164
+
165
+ // iterate over all keys
166
+ iter , err := tree .Iterator (3 , nil , nil , true )
167
+ require .NoError (t , err )
168
+ // expect all keys to be iterated over
169
+ expectedKeys := []string {"key2" , "key3" , "key4" , "key5" , "key6" , "key7" , "key8" }
170
+ count := 0
171
+ for i := 0 ; iter .Valid (); i ++ {
172
+ require .Equal (t , expectedKeys [i ], string (iter .Key ()))
173
+ iter .Next ()
174
+ count ++
175
+ }
176
+ require .Equal (t , len (expectedKeys ), count )
177
+ require .NoError (t , iter .Close ())
178
+
179
+ // iterate over all keys in reverse
180
+ iter , err = tree .Iterator (3 , nil , nil , false )
181
+ require .NoError (t , err )
182
+ expectedKeys = []string {"key8" , "key7" , "key6" , "key5" , "key4" , "key3" , "key2" }
183
+ for i := 0 ; iter .Valid (); i ++ {
184
+ require .Equal (t , expectedKeys [i ], string (iter .Key ()))
185
+ iter .Next ()
186
+ }
187
+ require .NoError (t , iter .Close ())
188
+
189
+ // iterate over keys with version 1
190
+ iter , err = tree .Iterator (1 , nil , nil , true )
191
+ require .NoError (t , err )
192
+ expectedKeys = []string {"key1" , "key2" , "key3" }
193
+ count = 0
194
+ for i := 0 ; iter .Valid (); i ++ {
195
+ require .Equal (t , expectedKeys [i ], string (iter .Key ()))
196
+ iter .Next ()
197
+ count ++
198
+ }
199
+ require .Equal (t , len (expectedKeys ), count )
200
+ require .NoError (t , iter .Close ())
201
+
202
+ // iterate over keys with version 2
203
+ iter , err = tree .Iterator (2 , nil , nil , false )
204
+ require .NoError (t , err )
205
+ expectedKeys = []string {"key6" , "key5" , "key4" , "key3" , "key2" }
206
+ count = 0
207
+ for i := 0 ; iter .Valid (); i ++ {
208
+ require .Equal (t , expectedKeys [i ], string (iter .Key ()))
209
+ iter .Next ()
210
+ count ++
211
+ }
212
+ require .Equal (t , len (expectedKeys ), count )
213
+ require .NoError (t , iter .Close ())
214
+ }
0 commit comments