You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
4.9 KiB
257 lines
4.9 KiB
package lrucache |
|
|
|
import ( |
|
"container/list" |
|
"testing" |
|
) |
|
|
|
type Elem struct { |
|
key int |
|
value string |
|
} |
|
|
|
func Test_New(t *testing.T) { |
|
lc := New(5) |
|
if lc.Len() != 0 { |
|
t.Error("case 1 failed") |
|
} |
|
} |
|
|
|
func Test_Put(t *testing.T) { |
|
lc := New(0) |
|
lc.Put(1, "1") |
|
if lc.Len() != 0 { |
|
t.Error("case 1.1 failed") |
|
} |
|
|
|
lc = New(5) |
|
lc.Put(1, "1") |
|
lc.Put(2, "2") |
|
lc.Put(1, "3") |
|
if lc.Len() != 2 { |
|
t.Error("case 2.1 failed") |
|
} |
|
|
|
l := list.New() |
|
l.PushBack(&Elem{1, "3"}) |
|
l.PushBack(&Elem{2, "2"}) |
|
|
|
e := l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 2.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 2.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
|
|
lc.Put(3, "4") |
|
lc.Put(4, "5") |
|
lc.Put(5, "6") |
|
lc.Put(2, "7") |
|
if lc.Len() != 5 { |
|
t.Error("case 3.1 failed") |
|
} |
|
|
|
l = list.New() |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{5, "6"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
l.PushBack(&Elem{3, "4"}) |
|
l.PushBack(&Elem{1, "3"}) |
|
|
|
rl := list.New() |
|
rl.PushBack(&Elem{1, "3"}) |
|
rl.PushBack(&Elem{3, "4"}) |
|
rl.PushBack(&Elem{4, "5"}) |
|
rl.PushBack(&Elem{5, "6"}) |
|
rl.PushBack(&Elem{2, "7"}) |
|
|
|
e = l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 3.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 3.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
|
|
e = rl.Front() |
|
for c := lc.Back(); c != nil; c = c.Prev() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 3.4 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 3.5 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
|
|
lc.Put(6, "8") |
|
if lc.Len() != 5 { |
|
t.Error("case 4.1 failed") |
|
} |
|
|
|
l = list.New() |
|
l.PushBack(&Elem{6, "8"}) |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{5, "6"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
l.PushBack(&Elem{3, "4"}) |
|
|
|
e = l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 4.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 4.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
} |
|
|
|
func Test_Get(t *testing.T) { |
|
lc := New(2) |
|
lc.Put(1, "1") |
|
lc.Put(2, "2") |
|
if v, _ := lc.Get(1); v != "1" { |
|
t.Error("case 1.1 failed") |
|
} |
|
lc.Put(3, "3") |
|
if lc.Len() != 2 { |
|
t.Error("case 1.2 failed") |
|
} |
|
|
|
l := list.New() |
|
l.PushBack(&Elem{3, "3"}) |
|
l.PushBack(&Elem{1, "1"}) |
|
|
|
e := l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 1.3 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 1.4 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
} |
|
|
|
func Test_Delete(t *testing.T) { |
|
lc := New(5) |
|
lc.Put(3, "4") |
|
lc.Put(4, "5") |
|
lc.Put(5, "6") |
|
lc.Put(2, "7") |
|
lc.Put(6, "8") |
|
lc.Delete(5) |
|
|
|
l := list.New() |
|
l.PushBack(&Elem{6, "8"}) |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
l.PushBack(&Elem{3, "4"}) |
|
if lc.Len() != 4 { |
|
t.Error("case 1.1 failed") |
|
} |
|
|
|
e := l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 1.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 1.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
|
|
lc.Delete(6) |
|
|
|
l = list.New() |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
l.PushBack(&Elem{3, "4"}) |
|
if lc.Len() != 3 { |
|
t.Error("case 2.1 failed") |
|
} |
|
|
|
e = l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 2.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 2.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
|
|
lc.Delete(3) |
|
|
|
l = list.New() |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
if lc.Len() != 2 { |
|
t.Error("case 3.1 failed") |
|
} |
|
|
|
e = l.Front() |
|
for c := lc.Front(); c != nil; c = c.Next() { |
|
v := e.Value.(*Elem) |
|
if c.Key.(int) != v.key { |
|
t.Error("case 3.2 failed: ", c.Key.(int), v.key) |
|
} |
|
if c.Value.(string) != v.value { |
|
t.Error("case 3.3 failed: ", c.Value.(string), v.value) |
|
} |
|
e = e.Next() |
|
} |
|
} |
|
|
|
func Test_Range(t *testing.T) { |
|
lc := New(5) |
|
lc.Put(3, "4") |
|
lc.Put(4, "5") |
|
lc.Put(5, "6") |
|
lc.Put(2, "7") |
|
lc.Put(6, "8") |
|
|
|
l := list.New() |
|
l.PushBack(&Elem{6, "8"}) |
|
l.PushBack(&Elem{2, "7"}) |
|
l.PushBack(&Elem{5, "6"}) |
|
l.PushBack(&Elem{4, "5"}) |
|
l.PushBack(&Elem{3, "4"}) |
|
|
|
e := l.Front() |
|
lc.Range( |
|
func(key, value interface{}) bool { |
|
v := e.Value.(*Elem) |
|
if key.(int) != v.key { |
|
t.Error("case 1.1 failed: ", key.(int), v.key) |
|
} |
|
if value.(string) != v.value { |
|
t.Error("case 1.2 failed: ", value.(string), v.value) |
|
} |
|
e = e.Next() |
|
return true |
|
}) |
|
|
|
if e != nil { |
|
t.Error("case 1.3 failed: ", e.Value) |
|
} |
|
}
|
|
|