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