// 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.

// CAUTION: If this file is not vector_test.go, it was generated
// automatically from vector_test.go - DO NOT EDIT in that case!

package vector

import "testing"


func TestIntZeroLen(t *testing.T) {
	a := new(IntVector)
	if a.Len() != 0 {
		t.Errorf("%T: B1) expected 0, got %d", a, a.Len())
	}
	if len(*a) != 0 {
		t.Errorf("%T: B2) expected 0, got %d", a, len(*a))
	}
	var b IntVector
	if b.Len() != 0 {
		t.Errorf("%T: B3) expected 0, got %d", b, b.Len())
	}
	if len(b) != 0 {
		t.Errorf("%T: B4) expected 0, got %d", b, len(b))
	}
}


func TestIntResize(t *testing.T) {
	var a IntVector
	checkSize(t, &a, 0, 0)
	checkSize(t, a.Resize(0, 5), 0, 5)
	checkSize(t, a.Resize(1, 0), 1, 5)
	checkSize(t, a.Resize(10, 0), 10, 10)
	checkSize(t, a.Resize(5, 0), 5, 10)
	checkSize(t, a.Resize(3, 8), 3, 10)
	checkSize(t, a.Resize(0, 100), 0, 100)
	checkSize(t, a.Resize(11, 100), 11, 100)
}


func TestIntResize2(t *testing.T) {
	var a IntVector
	checkSize(t, &a, 0, 0)
	a.Push(int2IntValue(1))
	a.Push(int2IntValue(2))
	a.Push(int2IntValue(3))
	a.Push(int2IntValue(4))
	checkSize(t, &a, 4, 4)
	checkSize(t, a.Resize(10, 0), 10, 10)
	for i := 4; i < a.Len(); i++ {
		if a.At(i) != intzero {
			t.Errorf("%T: expected a.At(%d) == %v; found %v!", a, i, intzero, a.At(i))
		}
	}
	for i := 4; i < len(a); i++ {
		if a[i] != intzero {
			t.Errorf("%T: expected a[%d] == %v; found %v", a, i, intzero, a[i])
		}
	}
}


func checkIntZero(t *testing.T, a *IntVector, i int) {
	for j := 0; j < i; j++ {
		if a.At(j) == intzero {
			t.Errorf("%T: 1 expected a.At(%d) == %d; found %v", a, j, j, a.At(j))
		}
		if (*a)[j] == intzero {
			t.Errorf("%T: 2 expected (*a)[%d] == %d; found %v", a, j, j, (*a)[j])
		}
	}
	for ; i < a.Len(); i++ {
		if a.At(i) != intzero {
			t.Errorf("%T: 3 expected a.At(%d) == %v; found %v", a, i, intzero, a.At(i))
		}
		if (*a)[i] != intzero {
			t.Errorf("%T: 4 expected (*a)[%d] == %v; found %v", a, i, intzero, (*a)[i])
		}
	}
}


func TestIntTrailingElements(t *testing.T) {
	var a IntVector
	for i := 0; i < 10; i++ {
		a.Push(int2IntValue(i + 1))
	}
	checkIntZero(t, &a, 10)
	checkSize(t, &a, 10, 16)
	checkSize(t, a.Resize(5, 0), 5, 16)
	checkSize(t, a.Resize(10, 0), 10, 16)
	checkIntZero(t, &a, 5)
}


func TestIntAccess(t *testing.T) {
	const n = 100
	var a IntVector
	a.Resize(n, 0)
	for i := 0; i < n; i++ {
		a.Set(i, int2IntValue(val(i)))
	}
	for i := 0; i < n; i++ {
		if elem2IntValue(a.At(i)) != int2IntValue(val(i)) {
			t.Error(i)
		}
	}
	var b IntVector
	b.Resize(n, 0)
	for i := 0; i < n; i++ {
		b[i] = int2IntValue(val(i))
	}
	for i := 0; i < n; i++ {
		if elem2IntValue(b[i]) != int2IntValue(val(i)) {
			t.Error(i)
		}
	}
}


func TestIntInsertDeleteClear(t *testing.T) {
	const n = 100
	var a IntVector

	for i := 0; i < n; i++ {
		if a.Len() != i {
			t.Errorf("T%: A) wrong Len() %d (expected %d)", a, a.Len(), i)
		}
		if len(a) != i {
			t.Errorf("T%: A) wrong len() %d (expected %d)", a, len(a), i)
		}
		a.Insert(0, int2IntValue(val(i)))
		if elem2IntValue(a.Last()) != int2IntValue(val(0)) {
			t.Error("T%: B", a)
		}
	}
	for i := n - 1; i >= 0; i-- {
		if elem2IntValue(a.Last()) != int2IntValue(val(0)) {
			t.Error("T%: C", a)
		}
		if elem2IntValue(a.At(0)) != int2IntValue(val(i)) {
			t.Error("T%: D", a)
		}
		if elem2IntValue(a[0]) != int2IntValue(val(i)) {
			t.Error("T%: D2", a)
		}
		a.Delete(0)
		if a.Len() != i {
			t.Errorf("T%: E) wrong Len() %d (expected %d)", a, a.Len(), i)
		}
		if len(a) != i {
			t.Errorf("T%: E) wrong len() %d (expected %d)", a, len(a), i)
		}
	}

	if a.Len() != 0 {
		t.Errorf("T%: F) wrong Len() %d (expected 0)", a, a.Len())
	}
	if len(a) != 0 {
		t.Errorf("T%: F) wrong len() %d (expected 0)", a, len(a))
	}
	for i := 0; i < n; i++ {
		a.Push(int2IntValue(val(i)))
		if a.Len() != i+1 {
			t.Errorf("T%: G) wrong Len() %d (expected %d)", a, a.Len(), i+1)
		}
		if len(a) != i+1 {
			t.Errorf("T%: G) wrong len() %d (expected %d)", a, len(a), i+1)
		}
		if elem2IntValue(a.Last()) != int2IntValue(val(i)) {
			t.Error("T%: H", a)
		}
	}
	a.Resize(0, 0)
	if a.Len() != 0 {
		t.Errorf("T%: I wrong Len() %d (expected 0)", a, a.Len())
	}
	if len(a) != 0 {
		t.Errorf("T%: I wrong len() %d (expected 0)", a, len(a))
	}

	const m = 5
	for j := 0; j < m; j++ {
		a.Push(int2IntValue(j))
		for i := 0; i < n; i++ {
			x := val(i)
			a.Push(int2IntValue(x))
			if elem2IntValue(a.Pop()) != int2IntValue(x) {
				t.Error("T%: J", a)
			}
			if a.Len() != j+1 {
				t.Errorf("T%: K) wrong Len() %d (expected %d)", a, a.Len(), j+1)
			}
			if len(a) != j+1 {
				t.Errorf("T%: K) wrong len() %d (expected %d)", a, len(a), j+1)
			}
		}
	}
	if a.Len() != m {
		t.Errorf("T%: L) wrong Len() %d (expected %d)", a, a.Len(), m)
	}
	if len(a) != m {
		t.Errorf("T%: L) wrong len() %d (expected %d)", a, len(a), m)
	}
}


func verify_sliceInt(t *testing.T, x *IntVector, elt, i, j int) {
	for k := i; k < j; k++ {
		if elem2IntValue(x.At(k)) != int2IntValue(elt) {
			t.Errorf("T%: M) wrong [%d] element %v (expected %v)", x, k, elem2IntValue(x.At(k)), int2IntValue(elt))
		}
	}

	s := x.Slice(i, j)
	for k, n := 0, j-i; k < n; k++ {
		if elem2IntValue(s.At(k)) != int2IntValue(elt) {
			t.Errorf("T%: N) wrong [%d] element %v (expected %v)", x, k, elem2IntValue(x.At(k)), int2IntValue(elt))
		}
	}
}


func verify_patternInt(t *testing.T, x *IntVector, a, b, c int) {
	n := a + b + c
	if x.Len() != n {
		t.Errorf("T%: O) wrong Len() %d (expected %d)", x, x.Len(), n)
	}
	if len(*x) != n {
		t.Errorf("T%: O) wrong len() %d (expected %d)", x, len(*x), n)
	}
	verify_sliceInt(t, x, 0, 0, a)
	verify_sliceInt(t, x, 1, a, a+b)
	verify_sliceInt(t, x, 0, a+b, n)
}


func make_vectorInt(elt, len int) *IntVector {
	x := new(IntVector).Resize(len, 0)
	for i := 0; i < len; i++ {
		x.Set(i, int2IntValue(elt))
	}
	return x
}


func TestIntInsertVector(t *testing.T) {
	// 1
	a := make_vectorInt(0, 0)
	b := make_vectorInt(1, 10)
	a.InsertVector(0, b)
	verify_patternInt(t, a, 0, 10, 0)
	// 2
	a = make_vectorInt(0, 10)
	b = make_vectorInt(1, 0)
	a.InsertVector(5, b)
	verify_patternInt(t, a, 5, 0, 5)
	// 3
	a = make_vectorInt(0, 10)
	b = make_vectorInt(1, 3)
	a.InsertVector(3, b)
	verify_patternInt(t, a, 3, 3, 7)
	// 4
	a = make_vectorInt(0, 10)
	b = make_vectorInt(1, 1000)
	a.InsertVector(8, b)
	verify_patternInt(t, a, 8, 1000, 2)
}


func TestIntDo(t *testing.T) {
	const n = 25
	const salt = 17
	a := new(IntVector).Resize(n, 0)
	for i := 0; i < n; i++ {
		a.Set(i, int2IntValue(salt*i))
	}
	count := 0
	a.Do(func(e int) {
		i := intf2IntValue(e)
		if i != int2IntValue(count*salt) {
			t.Error(tname(a), "value at", count, "should be", count*salt, "not", i)
		}
		count++
	})
	if count != n {
		t.Error(tname(a), "should visit", n, "values; did visit", count)
	}

	b := new(IntVector).Resize(n, 0)
	for i := 0; i < n; i++ {
		(*b)[i] = int2IntValue(salt * i)
	}
	count = 0
	b.Do(func(e int) {
		i := intf2IntValue(e)
		if i != int2IntValue(count*salt) {
			t.Error(tname(b), "b) value at", count, "should be", count*salt, "not", i)
		}
		count++
	})
	if count != n {
		t.Error(tname(b), "b) should visit", n, "values; did visit", count)
	}

	var c IntVector
	c.Resize(n, 0)
	for i := 0; i < n; i++ {
		c[i] = int2IntValue(salt * i)
	}
	count = 0
	c.Do(func(e int) {
		i := intf2IntValue(e)
		if i != int2IntValue(count*salt) {
			t.Error(tname(c), "c) value at", count, "should be", count*salt, "not", i)
		}
		count++
	})
	if count != n {
		t.Error(tname(c), "c) should visit", n, "values; did visit", count)
	}

}


func TestIntVectorCopy(t *testing.T) {
	// verify Copy() returns a copy, not simply a slice of the original vector
	const Len = 10
	var src IntVector
	for i := 0; i < Len; i++ {
		src.Push(int2IntValue(i * i))
	}
	dest := src.Copy()
	for i := 0; i < Len; i++ {
		src[i] = int2IntValue(-1)
		v := elem2IntValue(dest[i])
		if v != int2IntValue(i*i) {
			t.Error(tname(src), "expected", i*i, "got", v)
		}
	}
}
