85 lines
1.7 KiB
Go
85 lines
1.7 KiB
Go
|
package binheap_test
|
||
|
|
||
|
import (
|
||
|
"math/rand"
|
||
|
"testing"
|
||
|
|
||
|
"gogs.humancabbage.net/sam/priorityq/binheap"
|
||
|
)
|
||
|
|
||
|
func TestSmoke(t *testing.T) {
|
||
|
h := binheap.Make[int, int](10)
|
||
|
if h.Capacity() != 10 {
|
||
|
t.Errorf("expected heap capacity to be 10")
|
||
|
}
|
||
|
h.Insert(1, 1)
|
||
|
h.Insert(2, 2)
|
||
|
h.Insert(3, 3)
|
||
|
h.Insert(4, 4)
|
||
|
if h.Len() != 4 {
|
||
|
t.Errorf("expected heap length to be 4")
|
||
|
}
|
||
|
checkExtract := func(n int) {
|
||
|
_, extracted := h.Extract()
|
||
|
if extracted != n {
|
||
|
t.Errorf("expected to extract %d, got %d", n, extracted)
|
||
|
}
|
||
|
}
|
||
|
checkExtract(4)
|
||
|
checkExtract(3)
|
||
|
checkExtract(2)
|
||
|
checkExtract(1)
|
||
|
}
|
||
|
|
||
|
func TestInsertFullPanic(t *testing.T) {
|
||
|
h := binheap.Make[int, int](4)
|
||
|
h.Insert(1, 1)
|
||
|
h.Insert(2, 2)
|
||
|
h.Insert(3, 3)
|
||
|
h.Insert(4, 4)
|
||
|
defer func() {
|
||
|
if r := recover(); r == nil {
|
||
|
t.Errorf("expected final insert to panic")
|
||
|
}
|
||
|
}()
|
||
|
h.Insert(5, 5)
|
||
|
}
|
||
|
|
||
|
func TestExtractEmptyPanic(t *testing.T) {
|
||
|
h := binheap.Make[int, int](4)
|
||
|
defer func() {
|
||
|
if r := recover(); r == nil {
|
||
|
t.Errorf("expected extract to panic")
|
||
|
}
|
||
|
}()
|
||
|
h.Extract()
|
||
|
}
|
||
|
|
||
|
func TestRandomized(t *testing.T) {
|
||
|
h := binheap.Make[int, int](8192)
|
||
|
rs := rand.NewSource(0)
|
||
|
r := rand.New(rs)
|
||
|
// insert a bunch of random integers
|
||
|
for i := 0; i < h.Capacity(); i++ {
|
||
|
n := r.Int()
|
||
|
h.Insert(n, n)
|
||
|
}
|
||
|
// ensure that each extracted integer is <= the last extracted integer
|
||
|
var extracted []int
|
||
|
for h.CanExtract() {
|
||
|
id, item := h.Extract()
|
||
|
if id != item {
|
||
|
t.Errorf("id / item mismatch: %d %d", id, item)
|
||
|
}
|
||
|
lastIdx := len(extracted) - 1
|
||
|
extracted = append(extracted, item)
|
||
|
if lastIdx < 0 {
|
||
|
continue
|
||
|
}
|
||
|
if item > extracted[lastIdx] {
|
||
|
t.Errorf("newly extracted %d is greater than %d",
|
||
|
item, extracted[lastIdx])
|
||
|
}
|
||
|
}
|
||
|
}
|