-
Notifications
You must be signed in to change notification settings - Fork 36
/
iter_test.go
144 lines (126 loc) · 4.67 KB
/
iter_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
133
134
135
136
137
138
139
140
141
142
143
144
package offheap_test
import (
"testing"
"github.com/glycerine/offheap"
cv "github.com/glycerine/goconvey/convey"
)
func TestIterator(t *testing.T) {
cv.Convey("Given a table with 0,1,2 in it, the Iterator should give all three values back", t, func() {
h := offheap.NewHashTable(8)
cv.So(h.Population, cv.ShouldEqual, 0)
for i := 0; i < 3; i++ {
_, ok := h.Insert(uint64(i))
cv.So(ok, cv.ShouldEqual, true)
if i == 0 {
// iterator should start with the zero value
it := h.NewIterator()
cv.So(it.Cur.UnHashedKey, cv.ShouldEqual, 0)
}
}
cv.So(h.Population, cv.ShouldEqual, 3)
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 3)
cv.So(found, cv.ShouldContain, 0)
cv.So(found, cv.ShouldContain, 1)
cv.So(found, cv.ShouldContain, 2)
})
cv.Convey("Given a table with 1,2,3 in it, the Iterator should give all three values back", t, func() {
h := offheap.NewHashTable(8)
cv.So(h.Population, cv.ShouldEqual, 0)
for i := 1; i < 4; i++ {
_, ok := h.Insert(uint64(i))
cv.So(ok, cv.ShouldEqual, true)
if i == 0 {
// iterator should not start with the zero value, not inserted.
it := h.NewIterator()
cv.So(it.Cur.UnHashedKey, cv.ShouldEqual, 1)
}
}
cv.So(h.Population, cv.ShouldEqual, 3)
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 3)
cv.So(found, cv.ShouldContain, 3)
cv.So(found, cv.ShouldContain, 1)
cv.So(found, cv.ShouldContain, 2)
})
cv.Convey("Given a table with the regular 0-th slot and the special zero-location spot occupied, then the the Iterator should still give all the values back", t, func() {
h := offheap.NewHashTable(4)
cv.So(h.Population, cv.ShouldEqual, 0)
for i := 0; i < 2; i++ {
_, ok := h.Insert(uint64(i))
cv.So(ok, cv.ShouldEqual, true)
if i == 0 {
// iterator should start with the zero value
it := h.NewIterator()
cv.So(it.Cur.UnHashedKey, cv.ShouldEqual, 0)
}
}
cv.So(h.Population, cv.ShouldEqual, 2)
cv.So(h.CellAt(0).UnHashedKey, cv.ShouldEqual, 1) // important for this test that the regular 0-th (first) cell slot be occupied.
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 2)
cv.So(found, cv.ShouldContain, 0)
cv.So(found, cv.ShouldContain, 1)
})
cv.Convey("Given a table with the regular 0-th slot *empty* and the special zero-location spot occupied, then the the Iterator should still give all the values back", t, func() {
h := offheap.NewHashTable(8)
cv.So(h.Population, cv.ShouldEqual, 0)
for i := 0; i < 2; i++ {
_, ok := h.Insert(uint64(i))
cv.So(ok, cv.ShouldEqual, true)
if i == 0 {
// iterator should start with the zero value
it := h.NewIterator()
cv.So(it.Cur.UnHashedKey, cv.ShouldEqual, 0)
cv.So(it.Pos, cv.ShouldEqual, -1)
}
}
cv.So(h.Population, cv.ShouldEqual, 2)
cv.So(h.CellAt(0).UnHashedKey, cv.ShouldEqual, 0) // important for this test that the regular 0-th (first) cell slot be *empty*.
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 2)
cv.So(found, cv.ShouldContain, 0)
cv.So(found, cv.ShouldContain, 1)
})
cv.Convey("Given a table with the regular 0-th slot *filled* and the special zero-location spot *empty*, then the the Iterator should still give the one value back", t, func() {
// size 4 just happens to generate an occupation at h.Cells[0]
h := offheap.NewHashTable(4)
cv.So(h.Population, cv.ShouldEqual, 0)
i := 1
_, ok := h.Insert(uint64(i))
cv.So(ok, cv.ShouldEqual, true)
// iterator should start with the zero value
it := h.NewIterator()
cv.So(it.Cur.UnHashedKey, cv.ShouldEqual, 1)
cv.So(it.Pos, cv.ShouldEqual, 0)
cv.So(h.Population, cv.ShouldEqual, 1)
cv.So(h.CellAt(0).UnHashedKey, cv.ShouldEqual, 1) // important for this test that the regular 0-th (first) cell slot be *filled*.
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 1)
cv.So(found, cv.ShouldContain, 1)
})
cv.Convey("Given an empty table, an Iterator should still work fine, without crashing", t, func() {
h := offheap.NewHashTable(4)
cv.So(h.Population, cv.ShouldEqual, 0)
found := []uint64{}
for it := h.NewIterator(); it.Cur != nil; it.Next() {
found = append(found, it.Cur.UnHashedKey)
}
cv.So(len(found), cv.ShouldEqual, 0)
})
}