Plan 9 from Bell Labs’s /usr/web/sources/contrib/ericvh/go-plan9/src/pkg/container/heap/heap_test.go

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


// 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)
		}
	}
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.