258 lines
4.9 KiB
Go
258 lines
4.9 KiB
Go
|
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)
|
||
|
}
|
||
|
}
|