@@ -3,6 +3,7 @@ package index
33import (
44 "bytes"
55 "fmt"
6+ "github.com/stretchr/testify/assert"
67 "testing"
78
89 "github.com/rosedblabs/wal"
@@ -193,3 +194,93 @@ func TestMemoryBTree_AscendGreaterOrEqual_DescendLessOrEqual(t *testing.T) {
193194 return true , nil
194195 })
195196}
197+
198+ func TestMemoryBTree_Iterator (t * testing.T ) {
199+ mt := newBTree ()
200+ // Test iterator for empty tree
201+ it1 := mt .Iterator (false )
202+ assert .Equal (t , false , it1 .Valid ())
203+
204+ // Build test data
205+ testData := map [string ]* wal.ChunkPosition {
206+ "acee" : {SegmentId : 1 , BlockNumber : 2 , ChunkOffset : 3 , ChunkSize : 100 },
207+ "bbcd" : {SegmentId : 2 , BlockNumber : 3 , ChunkOffset : 4 , ChunkSize : 200 },
208+ "code" : {SegmentId : 3 , BlockNumber : 4 , ChunkOffset : 5 , ChunkSize : 300 },
209+ "eede" : {SegmentId : 4 , BlockNumber : 5 , ChunkOffset : 6 , ChunkSize : 400 },
210+ }
211+
212+ // Insert test data
213+ for k , v := range testData {
214+ mt .Put ([]byte (k ), v )
215+ }
216+
217+ // Test ascending iteration
218+ iter := mt .Iterator (false )
219+ var prevKey string
220+ count := 0
221+ for iter .Rewind (); iter .Valid (); iter .Next () {
222+ currKey := string (iter .Key ())
223+ pos := iter .Value ()
224+
225+ // Verify key order
226+ if prevKey != "" {
227+ assert .True (t , currKey > prevKey )
228+ }
229+
230+ // Verify value correctness
231+ expectedPos := testData [currKey ]
232+ assert .Equal (t , expectedPos , pos )
233+
234+ prevKey = currKey
235+ count ++
236+ }
237+ assert .Equal (t , len (testData ), count )
238+
239+ // Test descending iteration
240+ iter = mt .Iterator (true )
241+ prevKey = ""
242+ count = 0
243+ for iter .Rewind (); iter .Valid (); iter .Next () {
244+ currKey := string (iter .Key ())
245+ pos := iter .Value ()
246+
247+ // Verify key order
248+ if prevKey != "" {
249+ assert .True (t , currKey < prevKey )
250+ }
251+
252+ // Verify value correctness
253+ expectedPos := testData [currKey ]
254+ assert .Equal (t , expectedPos , pos )
255+
256+ prevKey = currKey
257+ count ++
258+ }
259+ assert .Equal (t , len (testData ), count )
260+
261+ // Test Seek operation
262+ testCases := []struct {
263+ seekKey string
264+ expectKey string
265+ shouldFind bool
266+ }{
267+ {"b" , "bbcd" , true }, // Should find bbcd
268+ {"cc" , "code" , true }, // Should find code
269+ {"d" , "eede" , true }, // Should find eede
270+ {"f" , "" , false }, // Should not find any element
271+ {"aaa" , "acee" , true }, // Should find acee
272+ }
273+
274+ for _ , tc := range testCases {
275+ iter = mt .Iterator (false )
276+ iter .Seek ([]byte (tc .seekKey ))
277+
278+ if tc .shouldFind {
279+ assert .True (t , iter .Valid ())
280+ assert .Equal (t , tc .expectKey , string (iter .Key ()))
281+ assert .Equal (t , testData [tc .expectKey ], iter .Value ())
282+ } else {
283+ assert .False (t , iter .Valid ())
284+ }
285+ }
286+ }
0 commit comments