Skip to content

Commit 6adfa75

Browse files
committed
add
1 parent b847f32 commit 6adfa75

File tree

1 file changed

+246
-0
lines changed

1 file changed

+246
-0
lines changed
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
package skiplist
2+
3+
import (
4+
"math/rand"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"sort"
9+
)
10+
11+
type intless int
12+
13+
func (il intless) Less(other Lesser) bool {
14+
return il < other.(intless)
15+
}
16+
17+
func TestHeight(t *testing.T) {
18+
mapper := New(1 << 7)
19+
sk := mapper.(*skiplist)
20+
assert.Equal(t, len(sk.header.nexts), 7)
21+
22+
mapper = New(3)
23+
sk = mapper.(*skiplist)
24+
assert.Equal(t, len(sk.header.nexts), 2)
25+
26+
mapper = New(1)
27+
sk = mapper.(*skiplist)
28+
assert.Equal(t, len(sk.header.nexts), 1)
29+
30+
mapper = New(6)
31+
sk = mapper.(*skiplist)
32+
assert.Equal(t, len(sk.header.nexts), 3)
33+
}
34+
35+
func testsort(t *testing.T, testdata []intless) {
36+
sk := New(len(testdata))
37+
38+
_, found := sk.Min()
39+
assert.False(t, found)
40+
_, found = sk.Max()
41+
assert.False(t, found)
42+
43+
nodesMap := make(map[intless]*node)
44+
for i, td := range testdata {
45+
nodesMap[td] = sk.ReplaceOrInsert(intless(td)).(*node)
46+
minp, maxp := findMinMax(testdata[:i+1])
47+
48+
minc, found := sk.Min()
49+
assert.True(t, found)
50+
assert.Equal(t, minp, minc)
51+
52+
maxc, found := sk.Max()
53+
assert.True(t, found)
54+
assert.Equal(t, maxp, maxc)
55+
}
56+
prev := intless(-1)
57+
cnt := 0
58+
sk.Ascend(func(item Lesser) bool {
59+
cur := item.(intless)
60+
assert.Contains(t, nodesMap, cur)
61+
assert.True(t, prev < cur, "%v not less than %v", prev, cur)
62+
prev = cur
63+
cnt++
64+
return true
65+
})
66+
assert.Equal(t, cnt, len(nodesMap))
67+
assert.Equal(t, cnt, sk.Len())
68+
}
69+
70+
func TestSorted1(t *testing.T) {
71+
testsort(t, []intless{20, 10}[:])
72+
}
73+
74+
func TestSorted2(t *testing.T) {
75+
testsort(t, []intless{10, 20}[:])
76+
}
77+
78+
func TestSorted_sort(t *testing.T) {
79+
testsort(t, []intless{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}[:])
80+
}
81+
82+
func TestSorted_reversed(t *testing.T) {
83+
testsort(t, []intless{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}[:])
84+
}
85+
86+
func TestSorted_mixed(t *testing.T) {
87+
testsort(t, []intless{2, 0, 7, 6, 4, 3, 5, 1, 9, 8, 10})
88+
}
89+
90+
func TestSorted_duplicated(t *testing.T) {
91+
testsort(t, []intless{1, 2, 2, 3, 1, 3, 1, 4, 6, 3, 5, 34, 5, 5, 467, 6, 56, 7, 5, 734, 56, 234, 5, 235, 23, 45, 35, 43, 45, 3, 45, 345})
92+
}
93+
94+
func TestSorted_randomdata(t *testing.T) {
95+
size := rand.Intn(1 << 13)
96+
testdata := make([]intless, 0, size)
97+
for i := 0; i < size; i++ {
98+
testdata = append(testdata, intless(rand.Intn(1000)))
99+
}
100+
testsort(t, testdata)
101+
}
102+
103+
func TestSearch(t *testing.T) {
104+
sk := New(1 << 16)
105+
cap := 1 << 16
106+
testdata := make([]intless, 0, cap)
107+
for i := 0; i < cap; i++ {
108+
d := intless(rand.Intn(1000))
109+
testdata = append(testdata, d)
110+
sk.ReplaceOrInsert(d)
111+
}
112+
113+
for i := 0; i < len(testdata); i++ {
114+
nl, found := sk.Search(testdata[i])
115+
assert.True(t, found)
116+
assert.Equal(t, testdata[i], nl)
117+
}
118+
_, found := sk.Search(intless(1001))
119+
assert.False(t, found)
120+
}
121+
122+
func findMinMax(data []intless) (minp intless, maxp intless) {
123+
minp = data[0]
124+
maxp = data[0]
125+
for _, item := range data {
126+
if item.Less(minp) {
127+
minp = item
128+
}
129+
if maxp.Less(item) {
130+
maxp = item
131+
}
132+
}
133+
return
134+
}
135+
136+
func TestDelete(t *testing.T) {
137+
insertP := perm(1000)
138+
sk := New(len(insertP))
139+
140+
keySet := make(map[Lesser]struct{})
141+
for _, item := range insertP {
142+
sk.ReplaceOrInsert(item)
143+
keySet[item] = struct{}{}
144+
}
145+
for i := range keySet {
146+
_, found := sk.Delete(i)
147+
assert.True(t, found)
148+
149+
_, found = sk.Search(i)
150+
assert.False(t, found)
151+
}
152+
153+
_, found := sk.Delete(intless(33333))
154+
assert.False(t, found)
155+
}
156+
157+
func TestAscend(t *testing.T) {
158+
insertP := perm(1000)
159+
cnt := 0
160+
sk := New(len(insertP))
161+
162+
for _, item := range insertP {
163+
sk.ReplaceOrInsert(item)
164+
}
165+
sk.Ascend(func(item Lesser) bool {
166+
if cnt == 456 {
167+
return false
168+
}
169+
cnt++
170+
return true
171+
})
172+
assert.Equal(t, 456, cnt)
173+
}
174+
175+
func TestDeleteMax(t *testing.T) {
176+
insertP := perm(1000)
177+
intP := make([]int, 0, len(insertP))
178+
intMap := make(map[int]struct{})
179+
180+
sk := New(len(insertP))
181+
// _, found := sk.DeleteMax()
182+
// assert.False(t, found)
183+
184+
for _, item := range insertP {
185+
if _, ok := intMap[int(item.(intless))]; !ok {
186+
intP = append(intP, int(item.(intless)))
187+
intMap[int(item.(intless))] = struct{}{}
188+
}
189+
190+
sk.ReplaceOrInsert(item)
191+
}
192+
193+
sort.Ints(intP)
194+
for i := len(intP) - 1; i >= 0; i-- {
195+
less, found := sk.DeleteMax()
196+
assert.True(t, found)
197+
assert.Equal(t, intless(intP[i]), less)
198+
}
199+
_, found := sk.DeleteMax()
200+
assert.False(t, found)
201+
}
202+
203+
func perm(n int) (out []Lesser) {
204+
for _, v := range rand.Perm(n) {
205+
out = append(out, intless(v))
206+
}
207+
return
208+
}
209+
func BenchmarkInsert1(b *testing.B) {
210+
b.StopTimer()
211+
insertP := perm(10000)
212+
b.StartTimer()
213+
214+
i := 0
215+
for i < b.N {
216+
sk := New(10000)
217+
for _, item := range insertP {
218+
sk.ReplaceOrInsert(item)
219+
i++
220+
if i >= b.N {
221+
return
222+
}
223+
}
224+
}
225+
}
226+
227+
func BenchmarkSequenceInsert(b *testing.B) {
228+
shift := uint(16)
229+
size := 1 << shift
230+
sk := New(1 << 30)
231+
//assert.Equal(b, len(sk.header.nexts), int(shift))
232+
for i := 0; i < size; i++ {
233+
sk.ReplaceOrInsert(intless(rand.Intn(10000)))
234+
}
235+
}
236+
237+
func BenchmarkReverseInsert(b *testing.B) {
238+
shift := uint(16)
239+
size := 1 << shift
240+
sk := New(1 << 30)
241+
//assert.Equal(b, len(sk.header.nexts), int(shift))
242+
for i := size - 1; i >= 0; i-- {
243+
sk.ReplaceOrInsert(intless(rand.Intn(10000)))
244+
}
245+
}
246+

0 commit comments

Comments
 (0)