aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter_test.go
blob: e523b63e4b6694cf6e0a016b06830aefdf8e8831 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 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))
    })
})