focus/list/array_list/array_list_test.go

296 lines
4.5 KiB
Go

package arraylist
import (
"testing"
"github.com/davecgh/go-spew/spew"
)
func TestIterator(t *testing.T) {
l := New()
for i := 0; i < 5; i++ {
l.Push(i)
}
iter := l.Iterator()
var result []int
for iter.Next() {
result = append(result, iter.Value().(int))
}
if spew.Sprint(result) != "[0 1 2 3 4]" {
t.Error(result)
}
iter = l.Iterator()
result = nil
for iter.Prev() {
result = append(result, iter.Value().(int))
}
if spew.Sprint(result) != "[4 3 2 1 0]" {
t.Error(result)
}
citer := l.CircularIterator()
result = nil
for i := 0; i < 11; i++ {
if citer.Next() {
result = append(result, citer.Value().(int))
}
}
if len(result) != 11 {
t.Error("len(result) != 11, is ", len(result))
}
if spew.Sprint(result) != "[0 1 2 3 4 0 1 2 3 4 0]" {
t.Error(result)
}
citer = l.CircularIterator()
result = nil
for i := 0; i < 11; i++ {
if citer.Prev() {
result = append(result, citer.Value().(int))
}
}
if len(result) != 11 {
t.Error("len(result) != 11, is ", len(result))
}
if spew.Sprint(result) != "[4 3 2 1 0 4 3 2 1 0 4]" {
t.Error(result)
}
}
func TestPush(t *testing.T) {
l := New()
for i := 0; i < 2; i++ {
l.PushFront(1)
}
var result string
result = spew.Sprint(l.Values())
if result != "[1 1]" {
t.Error(result)
}
for i := 0; i < 2; i++ {
l.PushBack(2)
}
result = spew.Sprint(l.Values())
if result != "[1 1 2 2]" {
t.Error(result)
}
l.Push(3)
result = spew.Sprint(l.Values())
if result != "[1 1 2 2 3]" {
t.Error(result)
}
}
func TestGrowth(t *testing.T) {
l := New()
for i := 0; i < 5; i++ {
l.PushFront(1)
}
var result string
result = spew.Sprint(l.Values())
if result != "[1 1 1 1 1]" {
t.Error(result)
}
l = New()
for i := 0; i < 7; i++ {
l.PushBack(1)
}
result = spew.Sprint(l.Values())
if result != "[1 1 1 1 1 1 1]" {
t.Error(result)
}
// for i := 0; i < 2; i++ {
// l.PushBack(2)
// }
// result = spew.Sprint(l.Values())
// if result != "[1 1 2 2]" {
// t.Error(result)
// }
}
func TestPop(t *testing.T) {
l := New()
for i := 0; i < 5; i++ {
l.PushFront(i)
}
for i := 4; i >= 0; i-- {
if v, ok := l.PopFront(); ok {
if v != i {
t.Error("should be ", v)
}
} else {
t.Error("should be ok, value is", v)
}
}
if v, ok := l.PopFront(); ok {
t.Error("should not be ok, v = ", v)
}
for i := 0; i < 5; i++ {
l.PushFront(i)
}
for i := 0; i < 5; i++ {
if v, ok := l.PopBack(); ok {
if v != i {
t.Error("should be ", v)
}
} else {
t.Error("should be ok, value is", v)
}
}
if v, ok := l.PopBack(); ok {
t.Error("should not be ok, v = ", v)
}
}
func TestRemove(t *testing.T) {
l := New()
for i := 0; i < 5; i++ {
l.PushFront(uint(i))
}
var result string
for _, selval := range []uint{4, 3} {
last, _ := l.Index((int)(selval))
if v, isfound := l.Remove((int)(selval)); isfound {
if v != last {
t.Error(v, " != ", last)
}
} else {
t.Error("should be found")
}
}
result = spew.Sprint(l.Values())
if result != "[4 3 2]" {
t.Error("should be [4 3 2], value =", result)
}
v, _ := l.Remove(1)
if v != uint(3) {
t.Error(v)
}
v, _ = l.Remove(1)
if v != uint(2) {
t.Error(v)
}
v, _ = l.Remove(1)
if v != nil && l.Size() != 1 {
t.Error(v)
}
v, _ = l.Remove(0)
if v != uint(4) && l.Size() != 0 {
t.Error(v, "size = ", l.Size())
}
}
func TestTraversal(t *testing.T) {
l := New()
for i := 0; i < 5; i++ {
l.PushFront(uint(i))
}
var result []interface{}
l.Traversal(func(v interface{}) bool {
result = append(result, v)
return true
})
if spew.Sprint(result) != "[4 3 2 1 0]" {
t.Error(result)
}
l.PushBack(7, 8)
result = nil
l.Traversal(func(v interface{}) bool {
result = append(result, v)
return true
})
if spew.Sprint(result) != "[4 3 2 1 0 7 8]" {
t.Error(result)
}
}
func TestRemain(t *testing.T) {
l := New()
for i := 0; i < 10; i++ {
l.Push(i)
if !l.Contains(i) {
t.Error("Contains", i)
}
}
if l.String() != "[0 1 2 3 4 5 6 7 8 9]" {
t.Error(l.String())
}
for i := 10; i < 100; i++ {
l.Push(i)
}
for !l.Empty() {
l.PopBack()
}
for i := 10; i < 100; i++ {
l.Push(i)
}
l.Clear()
if l.Size() != 0 {
t.Error("Size != 0")
}
}
// func loadTestData() []int {
// data, err := ioutil.ReadFile("../../l.log")
// if err != nil {
// log.Println(err)
// }
// var l []int
// decoder := gob.NewDecoder(bytes.NewReader(data))
// decoder.Decode(&l)
// return l
// }
// func BenchmarkPush(b *testing.B) {
// l := loadTestData()
// b.N = len(l)
// arr := New()
// for i := 0; i < b.N; i++ {
// arr.PushBack(l[i])
// }
// }