-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslabmap_test.go
107 lines (90 loc) · 2.51 KB
/
slabmap_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
package slabmap_test
import (
"testing"
"github.com/pourplusquoi/slabmap"
"github.com/stretchr/testify/assert"
)
func TestSlabMap_Basics(t *testing.T) {
slab := slabmap.NewSlabMap[string]()
assert.Equal(t, 0, slab.Len())
assert.Equal(t, 0, slab.Capacity())
slab.Reserve(1)
assert.Equal(t, 0, slab.Len())
assert.Equal(t, 1, slab.Capacity())
key1 := slab.Insert("aaa")
key2 := slab.Insert("bbb")
assert.Equal(t, 2, slab.Len())
assert.Equal(t, 2, slab.Capacity())
value1, exists1 := slab.Get(key1)
value2, exists2 := slab.Get(key2)
value3, exists3 := slab.Get(999)
assert.Equal(t, true, exists1)
assert.Equal(t, true, exists2)
assert.Equal(t, false, exists3)
assert.Equal(t, "aaa", value1)
assert.Equal(t, "bbb", value2)
assert.Equal(t, "", value3)
assert.Equal(t, true, slab.Contains(key1))
assert.Equal(t, true, slab.Contains(key2))
assert.Equal(t, false, slab.Contains(999))
values := make([]string, 0)
slab.Range(func(_ int, value string) bool {
values = append(values, value)
return true
})
assert.Equal(t, 2, len(values))
assert.Equal(t, "aaa", values[0])
assert.Equal(t, "bbb", values[1])
value1, removed1 := slab.Remove(key1)
value2, removed2 := slab.Remove(key1)
value3, removed3 := slab.Remove(999)
assert.Equal(t, 1, slab.Len())
assert.Equal(t, true, removed1)
assert.Equal(t, false, removed2)
assert.Equal(t, false, removed3)
assert.Equal(t, "aaa", value1)
assert.Equal(t, "", value2)
assert.Equal(t, "", value3)
assert.Equal(t, false, slab.Contains(key1))
assert.Equal(t, true, slab.Contains(key2))
assert.Equal(t, false, slab.Contains(999))
slab.Clear()
assert.Equal(t, 0, slab.Len())
assert.Equal(t, 2, slab.Capacity())
}
func TestSlabMap_Compaction(t *testing.T) {
slab := slabmap.NewSlabMap[int]()
keys := make([]int, 0)
for i := 0; i < 100; i++ {
keys = append(keys, slab.Insert(i))
}
slab.Optimize()
for i := 0; i < 50; i++ {
value, exists := slab.Remove(keys[i])
assert.Equal(t, true, exists)
assert.Equal(t, i, value)
}
slab.Reserve(1024)
slab.Optimize()
assert.Equal(t, 50, slab.Len())
assert.Greater(t, slab.Capacity(), 1024)
count := 0
slab.Range(func(int, int) bool {
count++
return true
})
assert.Equal(t, 50, count)
for i := 0; i < 100; i++ {
keys = append(keys, slab.Insert(i))
}
slab.Optimize()
for i := 50; i < 100; i++ {
value, exists := slab.Remove(keys[i])
assert.Equal(t, true, exists)
assert.Equal(t, i, value)
}
slab.Reserve(2048)
slab.Optimize()
assert.Equal(t, 100, slab.Len())
assert.Greater(t, slab.Capacity(), 2048)
}