forked from FeatureBaseDB/featurebase
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterator_internal_test.go
86 lines (75 loc) · 2.33 KB
/
iterator_internal_test.go
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2017 Pilosa Corp.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package pilosa
import (
"reflect"
"testing"
)
// Ensure slice iterator and iterate over a set of pairs.
func TestSliceIterator(t *testing.T) {
// Initialize iterator.
itr := newSliceIterator(
[]uint64{0, 0, 2, 4},
[]uint64{0, 1, 0, 10},
)
// Iterate over all pairs.
var pairs [][2]uint64
for pid, bid, eof := itr.Next(); !eof; pid, bid, eof = itr.Next() {
pairs = append(pairs, [2]uint64{pid, bid})
}
// Verify pairs output correctly.
if !reflect.DeepEqual(pairs, [][2]uint64{
{0, 0},
{0, 1},
{2, 0},
{4, 10},
}) {
t.Fatalf("unexpected pairs: %+v", pairs)
}
}
// Ensure buffered iterator can unread values on to the buffer.
func TestBufIterator(t *testing.T) {
itr := newBufIterator(newSliceIterator(
[]uint64{0, 0, 1, 2},
[]uint64{1, 3, 0, 100},
))
itr.Seek(0, 2)
if pid, bid, eof := itr.Next(); pid != 0 || bid != 3 || eof {
t.Fatalf("unexpected seek: (%d, %d, %v)", pid, bid, eof)
} else if pid, bid, eof := itr.Next(); pid != 1 || bid != 0 || eof {
t.Fatalf("unexpected next: (%d, %d, %v)", pid, bid, eof)
}
itr.Unread()
if pid, bid, eof := itr.Next(); pid != 1 || bid != 0 || eof {
t.Fatalf("unexpected next(buffered): (%d, %d, %v)", pid, bid, eof)
}
if pid, bid, eof := itr.Next(); pid != 2 || bid != 100 || eof {
t.Fatalf("unexpected next: (%d, %d, %v)", pid, bid, eof)
} else if _, _, eof := itr.Next(); !eof {
t.Fatal("expected eof")
}
}
// Ensure buffered iterator will panic if unreading onto a full buffer.
func TestBufIterator_DoubleFillPanic(t *testing.T) {
var v interface{}
func() {
defer func() { v = recover() }()
itr := newBufIterator(newSliceIterator(nil, nil))
itr.Unread()
itr.Unread()
}()
if !reflect.DeepEqual(v, "pilosa.BufIterator: buffer full") {
t.Fatalf("unexpected panic value: %#v", v)
}
}