-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathhelpers_test.go
132 lines (111 loc) · 3.06 KB
/
helpers_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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package orm
import (
"reflect"
"testing"
"github.com/iov-one/weave/errors"
"github.com/iov-one/weave/store"
"github.com/iov-one/weave/weavetest/assert"
)
func TestLimitIterator(t *testing.T) {
db := store.MemStore()
b := NewSerialModelBucket("cnts", &CounterWithID{},
WithIndexSerial("counter", lexographicCountIndex, true))
var expected []*CounterWithID
for i := 0; i < 30; i++ {
c := &CounterWithID{
Count: int64(i * 1000),
}
expected = append(expected, c)
}
for _, e := range expected {
// make sure we point to value in array, so this PrimaryKey gets set
err := b.Save(db, e)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
}
iter, err := b.IndexScan(db, "counter", nil, false)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
var dest CounterWithID
// should return iterator done when received limit lesser than 1
limit := 0
limitedIter := LimitIterator(iter, limit)
err = limitedIter.LoadNext(&dest)
if !errors.ErrIteratorDone.Is(err) {
t.Fatalf("unexpected error: %v", err)
}
limit = -100
limitedIter = LimitIterator(iter, limit)
err = limitedIter.LoadNext(&dest)
if !errors.ErrIteratorDone.Is(err) {
t.Fatalf("unexpected error: %v", err)
}
// limit 1 should work
iter, err = b.IndexScan(db, "counter", nil, false)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
limit = 1
limitedIter = LimitIterator(iter, limit)
err = limitedIter.LoadNext(&dest)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
iter, err = b.IndexScan(db, "counter", nil, false)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
limit = 10
limitedIter = LimitIterator(iter, limit)
err = limitedIter.LoadNext(&dest)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// reset iterator counter
iter, err = b.IndexScan(db, "counter", nil, false)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
limitedIter = LimitIterator(iter, limit)
for i := 0; i < 10; i++ {
if err := limitedIter.LoadNext(&dest); err != nil {
if !errors.ErrIteratorDone.Is(err) {
t.Fatalf("unexpected error: %s", err)
}
}
if !reflect.DeepEqual(expected[i], &dest) {
t.Errorf("values do not match, expected: %+v, got: %+v", expected[i], &dest)
}
}
}
func TestToSlice(t *testing.T) {
db := store.MemStore()
b := NewSerialModelBucket("cnts", &CounterWithID{},
WithIndexSerial("counter", func(Object) ([]byte, error) { return []byte("all"), nil }, false))
var expected []*CounterWithID
for i := 0; i > 30; i++ {
c := &CounterWithID{
Count: int64(i * 1000),
}
expected = append(expected, c)
}
for _, e := range expected {
// make sure we point to value in array, so this PrimaryKey gets set
err := b.Save(db, e)
assert.Nil(t, err)
}
iter, err := b.IndexScan(db, "counter", []byte("all"), false)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
var dest []*CounterWithID
err = ToSlice(iter, &dest)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
if !reflect.DeepEqual(dest, expected) {
t.Errorf("values do not match, expected: %+v, got: %+v", expected, dest)
}
}