-
Notifications
You must be signed in to change notification settings - Fork 0
/
heapmap_test.go
151 lines (129 loc) · 4.57 KB
/
heapmap_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
145
146
147
148
149
150
151
package heapmap
import (
"testing"
)
type person struct {
id uint
name string
address string
age int
}
var (
john = person{1, "John", "123 Main St", 42}
jane = person{2, "Jane", "456 Main St", 43}
joe = person{3, "Joe", "789 Main St", 44}
)
func TestContents(t *testing.T) {
testLen := func(hm HeapMap[uint, person, int], expected int, details string) {
t.Run("Len", func(t *testing.T) {
if hm.Len() != expected {
t.Errorf("Len() = %d, want %d (%s)", hm.Len(), expected, details)
}
})
}
testEmpty := func(hm HeapMap[uint, person, int], expected bool, details string) {
t.Run("Empty", func(t *testing.T) {
if hm.Empty() != expected {
t.Errorf("Empty() = %t, want %t (%s)", hm.Empty(), expected, details)
}
})
}
testPeek := func(hm HeapMap[uint, person, int], expected person, expectedOk bool, details string) {
t.Run("Peek", func(t *testing.T) {
e, ok := hm.Peek()
if ok != expectedOk {
t.Errorf("Peek() = %v, %t, want %v, %t (%s)", e, ok, expected, expectedOk, details)
}
if ok && e.Value != expected {
t.Errorf("Peek() = %v, %t, want %v, %t (%s)", e, ok, expected, expectedOk, details)
}
})
}
testPop := func(hm HeapMap[uint, person, int], expected person, expectedOk bool, details string) {
t.Run("Pop", func(t *testing.T) {
e, ok := hm.Pop()
if ok != expectedOk {
t.Errorf("Pop() = %v, %t, want %v, %t (%s)", e, ok, expected, expectedOk, details)
}
if ok && e.Value != expected {
t.Errorf("Pop() = %v, %t, want %v, %t (%s)", e, ok, expected, expectedOk, details)
}
})
}
testContains := func(hm HeapMap[uint, person, int], key uint, expectedOk bool, details string) {
t.Run("Contains", func(t *testing.T) {
ok := hm.Contains(key)
if ok != expectedOk {
t.Errorf("Contains(%d) = %t, want %t (%s)", key, ok, expectedOk, details)
}
})
}
testGet := func(hm HeapMap[uint, person, int], key uint, expected person, expectedOk bool, details string) {
t.Run("Get", func(t *testing.T) {
e, ok := hm.Get(key)
if ok != expectedOk {
t.Errorf("Get(%d) = %v, %t, want %v, %t (%s)", key, e, ok, expected, expectedOk, details)
}
if ok && e.Value != expected {
t.Errorf("Get(%d) = %v, %t, want %v, %t (%s)", key, e, ok, expected, expectedOk, details)
}
})
}
hm := NewMin[uint, person, int]()
testLen(hm, 0, "after NewMin")
testEmpty(hm, true, "after NewMin")
testContains(hm, john.id, false, "after NewMin")
testGet(hm, john.id, person{}, false, "after NewMin")
testPeek(hm, person{}, false, "after NewMin")
testPop(hm, person{}, false, "after NewMin")
hm.Set(john.id, john, john.age)
hm.Set(jane.id, jane, jane.age)
hm.Set(joe.id, joe, joe.age)
testLen(hm, 3, "after Set")
testEmpty(hm, false, "after Set")
testContains(hm, john.id, true, "after Set")
testGet(hm, john.id, john, true, "after Set")
testPeek(hm, john, true, "after Set")
testPop(hm, john, true, "after Set")
testContains(hm, john.id, false, "after Set")
testGet(hm, john.id, person{}, false, "after Set")
testContains(hm, jane.id, true, "before Remove")
testGet(hm, jane.id, jane, true, "before Remove")
hm.Remove(jane.id)
testContains(hm, jane.id, false, "after Remove")
testGet(hm, jane.id, person{}, false, "after Remove")
testContains(hm, joe.id, true, "before Clear")
testGet(hm, joe.id, joe, true, "before Clear")
hm.Clear()
testContains(hm, joe.id, false, "after Clear")
testGet(hm, joe.id, person{}, false, "after Clear")
testLen(hm, 0, "after Clear")
testEmpty(hm, true, "after Clear")
}
func TestMinVsMax(t *testing.T) {
hmMin := NewMin[uint, person, int]()
hmMin.Set(john.id, john, john.age)
hmMin.Set(jane.id, jane, jane.age)
hmMin.Set(joe.id, joe, joe.age)
hmMax := NewMax[uint, person, int]()
hmMax.Set(john.id, john, john.age)
hmMax.Set(jane.id, jane, jane.age)
hmMax.Set(joe.id, joe, joe.age)
if e, ok := hmMin.Peek(); !ok || e.Value != john {
t.Errorf("hmMin.Peek() = %v, %t, want %v, %t", e, ok, john, true)
}
if e, ok := hmMax.Peek(); !ok || e.Value != joe {
t.Errorf("hmMax.Peek() = %v, %t, want %v, %t", e, ok, joe, true)
}
}
func TestSetOverride(t *testing.T) {
hm := NewMin[uint, person, int]()
hm.Set(john.id, john, john.age)
if e, ok := hm.Get(john.id); !ok || e.Value != john {
t.Errorf("hm.Get(%d) = %v, %t, want %v, %t", john.id, e, ok, john, true)
}
hm.Set(john.id, jane, jane.age)
if e, ok := hm.Get(john.id); !ok || e.Value != jane {
t.Errorf("hm.Get(%d) = %v, %t, want %v, %t", john.id, e, ok, jane, true)
}
}