2019-05-09 10:29:09 +00:00
|
|
|
package arraylist
|
2019-05-08 02:42:51 +00:00
|
|
|
|
|
|
|
import (
|
2019-07-04 17:10:23 +00:00
|
|
|
"bytes"
|
|
|
|
"encoding/gob"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
2019-05-08 02:42:51 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestPush(t *testing.T) {
|
|
|
|
l := New()
|
2019-07-04 17:10:23 +00:00
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
for i := 0; i < 2; i++ {
|
|
|
|
l.PushFront(1)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
var result string
|
|
|
|
result = spew.Sprint(l.Values())
|
2019-05-22 09:52:50 +00:00
|
|
|
if result != "[1 1]" {
|
2019-05-08 02:42:51 +00:00
|
|
|
t.Error(result)
|
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
for i := 0; i < 2; i++ {
|
|
|
|
l.PushBack(2)
|
|
|
|
}
|
2019-05-08 02:42:51 +00:00
|
|
|
result = spew.Sprint(l.Values())
|
2019-05-22 09:52:50 +00:00
|
|
|
if result != "[1 1 2 2]" {
|
2019-05-08 02:42:51 +00:00
|
|
|
t.Error(result)
|
|
|
|
}
|
2019-07-04 17:10:23 +00:00
|
|
|
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
func TestGrowth(t *testing.T) {
|
2019-05-08 02:42:51 +00:00
|
|
|
l := New()
|
|
|
|
for i := 0; i < 5; i++ {
|
2019-05-22 09:52:50 +00:00
|
|
|
l.PushFront(1)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var result string
|
|
|
|
result = spew.Sprint(l.Values())
|
2019-06-04 10:27:43 +00:00
|
|
|
if result != "[1 1 1 1 1]" {
|
2019-05-08 02:42:51 +00:00
|
|
|
t.Error(result)
|
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
l = New()
|
|
|
|
for i := 0; i < 7; i++ {
|
|
|
|
l.PushBack(1)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
result = spew.Sprint(l.Values())
|
2019-06-04 10:27:43 +00:00
|
|
|
if result != "[1 1 1 1 1 1 1]" {
|
2019-05-08 02:42:51 +00:00
|
|
|
t.Error(result)
|
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
// for i := 0; i < 2; i++ {
|
|
|
|
// l.PushBack(2)
|
|
|
|
// }
|
|
|
|
// result = spew.Sprint(l.Values())
|
|
|
|
// if result != "[1 1 2 2]" {
|
|
|
|
// t.Error(result)
|
|
|
|
// }
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
func TestPop(t *testing.T) {
|
2019-05-08 02:42:51 +00:00
|
|
|
l := New()
|
|
|
|
for i := 0; i < 5; i++ {
|
2019-05-22 09:52:50 +00:00
|
|
|
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)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < 5; i++ {
|
2019-05-22 09:52:50 +00:00
|
|
|
if v, ok := l.PopBack(); ok {
|
|
|
|
if v != i {
|
|
|
|
t.Error("should be ", v)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
} else {
|
2019-05-22 09:52:50 +00:00
|
|
|
t.Error("should be ok, value is", v)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-22 09:52:50 +00:00
|
|
|
if v, ok := l.PopBack(); ok {
|
|
|
|
t.Error("should not be ok, v = ", v)
|
2019-05-08 02:42:51 +00:00
|
|
|
}
|
|
|
|
}
|
2019-06-05 18:17:35 +00:00
|
|
|
|
|
|
|
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(selval)
|
|
|
|
if v, isfound := l.Remove(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())
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2019-07-04 17:10:23 +00:00
|
|
|
|
|
|
|
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])
|
|
|
|
}
|
|
|
|
}
|