blob: dc13201cd352eda9ccc36af2f27b9b05c3885b85 [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package heap
import (
"testing";
"container/vector";
)
type myHeap struct {
// A vector.Vector implements sort.Interface except for Less,
// and it implements Push and Pop as required for heap.Interface.
vector.Vector;
}
func (h *myHeap) Less(i, j int) bool { return h.At(i).(int) < h.At(j).(int) }
func (h *myHeap) verify(t *testing.T, i int) {
n := h.Len();
j1 := 2*i + 1;
j2 := 2*i + 2;
if j1 < n {
if h.Less(j1, i) {
t.Errorf("heap invariant invalidated [%d] = %d > [%d] = %d", i, h.At(i), j1, h.At(j1));
return;
}
h.verify(t, j1);
}
if j2 < n {
if h.Less(j2, i) {
t.Errorf("heap invariant invalidated [%d] = %d > [%d] = %d", i, h.At(i), j1, h.At(j2));
return;
}
h.verify(t, j2);
}
}
func TestInit0(t *testing.T) {
h := new(myHeap);
for i := 20; i > 0; i-- {
h.Push(0) // all elements are the same
}
Init(h);
h.verify(t, 0);
for i := 1; h.Len() > 0; i++ {
x := Pop(h).(int);
h.verify(t, 0);
if x != 0 {
t.Errorf("%d.th pop got %d; want %d", i, x, 0)
}
}
}
func TestInit1(t *testing.T) {
h := new(myHeap);
for i := 20; i > 0; i-- {
h.Push(i) // all elements are different
}
Init(h);
h.verify(t, 0);
for i := 1; h.Len() > 0; i++ {
x := Pop(h).(int);
h.verify(t, 0);
if x != i {
t.Errorf("%d.th pop got %d; want %d", i, x, i)
}
}
}
func Test(t *testing.T) {
h := new(myHeap);
h.verify(t, 0);
for i := 20; i > 10; i-- {
h.Push(i)
}
Init(h);
h.verify(t, 0);
for i := 10; i > 0; i-- {
Push(h, i);
h.verify(t, 0);
}
for i := 1; h.Len() > 0; i++ {
x := Pop(h).(int);
if i < 20 {
Push(h, 20+i)
}
h.verify(t, 0);
if x != i {
t.Errorf("%d.th pop got %d; want %d", i, x, i)
}
}
}
func TestRemove0(t *testing.T) {
h := new(myHeap);
for i := 0; i < 10; i++ {
h.Push(i)
}
h.verify(t, 0);
for h.Len() > 0 {
i := h.Len() - 1;
x := Remove(h, i).(int);
if x != i {
t.Errorf("Remove(%d) got %d; want %d", i, x, i)
}
h.verify(t, 0);
}
}
func TestRemove1(t *testing.T) {
h := new(myHeap);
for i := 0; i < 10; i++ {
h.Push(i)
}
h.verify(t, 0);
for i := 0; h.Len() > 0; i++ {
x := Remove(h, 0).(int);
if x != i {
t.Errorf("Remove(0) got %d; want %d", x, i)
}
h.verify(t, 0);
}
}
func TestRemove2(t *testing.T) {
N := 10;
h := new(myHeap);
for i := 0; i < N; i++ {
h.Push(i)
}
h.verify(t, 0);
m := make(map[int]int);
for h.Len() > 0 {
m[Remove(h, (h.Len()-1)/2).(int)] = 1;
h.verify(t, 0);
}
if len(m) != N {
t.Errorf("len(m) = %d; want %d", len(m), N)
}
for i := 0; i < len(m); i++ {
if _, exists := m[i]; !exists {
t.Errorf("m[%d] doesn't exist", i)
}
}
}