| // 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 { |
| vector.IntVector; |
| } |
| |
| |
| func newHeap() *myHeap { |
| var h myHeap; |
| h.IntVector.Init(0); |
| return &h; |
| } |
| |
| |
| 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 (h *myHeap) Push(x interface{}) { h.IntVector.Push(x.(int)) } |
| |
| |
| func (h *myHeap) Pop() interface{} { return h.IntVector.Pop() } |
| |
| |
| func TestInit(t *testing.T) { |
| h := newHeap(); |
| for i := 20; i > 0; i-- { |
| h.Push(i) |
| } |
| 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 := newHeap(); |
| 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) |
| } |
| } |
| } |