| // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com> |
| // All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package iterator_test |
| |
| import ( |
| . "github.com/onsi/ginkgo" |
| . "github.com/onsi/gomega" |
| |
| "github.com/syndtr/goleveldb/leveldb/comparer" |
| . "github.com/syndtr/goleveldb/leveldb/iterator" |
| "github.com/syndtr/goleveldb/leveldb/testutil" |
| ) |
| |
| var _ = testutil.Defer(func() { |
| Describe("Merged iterator", func() { |
| Test := func(filled int, empty int) func() { |
| return func() { |
| It("Should iterates and seeks correctly", func(done Done) { |
| rnd := testutil.NewRand() |
| |
| // Build key/value. |
| filledKV := make([]testutil.KeyValue, filled) |
| kv := testutil.KeyValue_Generate(nil, 100, 1, 10, 4, 4) |
| kv.Iterate(func(i int, key, value []byte) { |
| filledKV[rnd.Intn(filled)].Put(key, value) |
| }) |
| |
| // Create itearators. |
| iters := make([]Iterator, filled+empty) |
| for i := range iters { |
| if empty == 0 || (rnd.Int()%2 == 0 && filled > 0) { |
| filled-- |
| Expect(filledKV[filled].Len()).ShouldNot(BeZero()) |
| iters[i] = NewArrayIterator(filledKV[filled]) |
| } else { |
| empty-- |
| iters[i] = NewEmptyIterator(nil) |
| } |
| } |
| |
| // Test the iterator. |
| t := testutil.IteratorTesting{ |
| KeyValue: kv.Clone(), |
| Iter: NewMergedIterator(iters, comparer.DefaultComparer, true), |
| } |
| testutil.DoIteratorTesting(&t) |
| done <- true |
| }, 1.5) |
| } |
| } |
| |
| Describe("with three, all filled iterators", Test(3, 0)) |
| Describe("with one filled, one empty iterators", Test(1, 1)) |
| Describe("with one filled, two empty iterators", Test(1, 2)) |
| }) |
| }) |