blob: c0d67957d914568904f04436e4dccaa51b6199cf [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 vector
import "testing"
import "sort"
import "fmt"
func TestZeroLen(t *testing.T) {
var a *Vector;
if a.Len() != 0 { t.Errorf("A) expected 0, got %d", a.Len()); }
a = New(0);
if a.Len() != 0 { t.Errorf("B) expected 0, got %d", a.Len()); }
}
func TestInit(t *testing.T) {
var a Vector;
if a.Init(0).Len() != 0 { t.Error("A") }
if a.Init(1).Len() != 1 { t.Error("B") }
if a.Init(10).Len() != 10 { t.Error("C") }
}
func TestNew(t *testing.T) {
if New(0).Len() != 0 { t.Error("A") }
if New(1).Len() != 1 { t.Error("B") }
if New(10).Len() != 10 { t.Error("C") }
}
func val(i int) int {
return i*991 - 1234
}
func TestAccess(t *testing.T) {
const n = 100;
var a Vector;
a.Init(n);
for i := 0; i < n; i++ {
a.Set(i, val(i));
}
for i := 0; i < n; i++ {
if a.At(i).(int) != val(i) { t.Error(i) }
}
}
func TestInsertDeleteClear(t *testing.T) {
const n = 100;
var a Vector;
for i := 0; i < n; i++ {
if a.Len() != i { t.Errorf("A) wrong len %d (expected %d)", a.Len(), i) }
a.Insert(0, val(i));
if a.Last().(int) != val(0) { t.Error("B") }
}
for i := n-1; i >= 0; i-- {
if a.Last().(int) != val(0) { t.Error("C") }
if a.At(0).(int) != val(i) { t.Error("D") }
a.Delete(0);
if a.Len() != i { t.Errorf("E) wrong len %d (expected %d)", a.Len(), i) }
}
if a.Len() != 0 { t.Errorf("F) wrong len %d (expected 0)", a.Len()) }
for i := 0; i < n; i++ {
a.Push(val(i));
if a.Len() != i+1 { t.Errorf("G) wrong len %d (expected %d)", a.Len(), i+1) }
if a.Last().(int) != val(i) { t.Error("H") }
}
a.Init(0);
if a.Len() != 0 { t.Errorf("I wrong len %d (expected 0)", a.Len()) }
const m = 5;
for j := 0; j < m; j++ {
a.Push(j);
for i := 0; i < n; i++ {
x := val(i);
a.Push(x);
if a.Pop().(int) != x { t.Error("J") }
if a.Len() != j+1 { t.Errorf("K) wrong len %d (expected %d)", a.Len(), j+1) }
}
}
if a.Len() != m { t.Errorf("L) wrong len %d (expected %d)", a.Len(), m) }
}
func verify_slice(t *testing.T, x *Vector, elt, i, j int) {
for k := i; k < j; k++ {
if x.At(k).(int) != elt {
t.Errorf("M) wrong [%d] element %d (expected %d)", k, x.At(k).(int), elt)
}
}
s := x.Slice(i, j);
for k, n := 0, j-i; k < n; k++ {
if s.At(k).(int) != elt {
t.Errorf("N) wrong [%d] element %d (expected %d)", k, x.At(k).(int), elt)
}
}
}
func verify_pattern(t *testing.T, x *Vector, a, b, c int) {
n := a + b + c;
if x.Len() != n {
t.Errorf("O) wrong len %d (expected %d)", x.Len(), n)
}
verify_slice(t, x, 0, 0, a);
verify_slice(t, x, 1, a, a + b);
verify_slice(t, x, 0, a + b, n);
}
func make_vector(elt, len int) *Vector {
x := New(len);
for i := 0; i < len; i++ {
x.Set(i, elt);
}
return x;
}
func TestInsertVector(t *testing.T) {
// 1
a := make_vector(0, 0);
b := make_vector(1, 10);
a.InsertVector(0, b);
verify_pattern(t, a, 0, 10, 0);
// 2
a = make_vector(0, 10);
b = make_vector(1, 0);
a.InsertVector(5, b);
verify_pattern(t, a, 5, 0, 5);
// 3
a = make_vector(0, 10);
b = make_vector(1, 3);
a.InsertVector(3, b);
verify_pattern(t, a, 3, 3, 7);
// 4
a = make_vector(0, 10);
b = make_vector(1, 1000);
a.InsertVector(8, b);
verify_pattern(t, a, 8, 1000, 2);
}
// This also tests IntVector and StringVector
func TestSorting(t *testing.T) {
const n = 100;
a := NewIntVector(n);
for i := n-1; i >= 0; i-- {
a.Set(i, n-1-i);
}
if sort.IsSorted(a) { t.Error("int vector not sorted") }
b := NewStringVector(n);
for i := n-1; i >= 0; i-- {
b.Set(i, fmt.Sprint(n-1-i));
}
if sort.IsSorted(b) { t.Error("string vector not sorted") }
}
func TestDo(t *testing.T) {
const n = 25;
const salt = 17;
a := NewIntVector(n);
for i := 0; i < n; i++ {
a.Set(i, salt * i);
}
count := 0;
a.Do(
func(e Element) {
i := e.(int);
if i != count*salt {
t.Error("value at", count, "should be", count*salt, "not", i)
}
count++;
}
);
if count != n {
t.Error("should visit", n, "values; did visit", count)
}
}
func TestIter(t *testing.T) {
const Len = 100;
x := New(Len);
for i := 0; i < Len; i++ {
x.Set(i, i*i);
}
i := 0;
for v := range x.Iter() {
if v.(int) != i*i {
t.Error("Iter expected", i*i, "got", v.(int))
}
i++;
}
if i != Len {
t.Error("Iter stopped at", i, "not", Len)
}
}