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

import "array"
import "testing"
import "sort"


func TestInit(t *testing.T) {
	var a array.Array;
	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 array.New(0).Len() != 0 { t.Error("A") }
	if array.New(1).Len() != 1 { t.Error("B") }
	if array.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 array.Array;
	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 TestInsertRemoveClear(t *testing.T) {
	const n = 100;
	a := array.New(0);

	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.Remove(0).(int) != Val(i) { t.Error("D") }
		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) }
}


/* currently doesn't compile due to linker bug
func TestSorting(t *testing.T) {
	const n = 100;
	a := array.NewIntArray(n);
	for i := n-1; i >= 0; i-- {
		a.Set(i, n-1-i);
	}
	if sort.IsSorted(a) { t.Error("not sorted") }
}
*/
