Skip to content

Commit 7dc11c6

Browse files
committed
added more test and fixed some logix for lru cache
1 parent f9cb08b commit 7dc11c6

File tree

2 files changed

+85
-3
lines changed

2 files changed

+85
-3
lines changed

lru/lru.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ func (c *Cache[K, V]) Get(key K) (zero V, _ bool) {
4848
func (c *Cache[K, V]) Set(key K, val V) {
4949
c.mu.Lock()
5050
defer c.mu.Unlock()
51+
5152
if e, ok := c.items[key]; ok {
5253
// updates cache order
5354
c.list.MoveToFront(e)
54-
e.Value = val
55+
e.Value.(*item[K, V]).Value = val
5556
return
5657
}
5758

@@ -70,7 +71,6 @@ func (c *Cache[K, V]) Set(key K, val V) {
7071
func (c *Cache[K, V]) Keys() []K {
7172
c.mu.RLock()
7273
defer c.mu.RUnlock()
73-
7474
keys := make([]K, 0, len(c.items))
7575
for ent := c.list.Back(); ent != nil; ent = ent.Prev() {
7676
keys = append(keys, ent.Value.(*item[K, V]).Key)
@@ -81,7 +81,7 @@ func (c *Cache[K, V]) Keys() []K {
8181
// Len returns the number of items in the cache.
8282
func (c *Cache[K, V]) Len() int {
8383
c.mu.RLock()
84-
defer c.mu.RLock()
84+
defer c.mu.RUnlock()
8585
return c.list.Len()
8686
}
8787

lru/lru_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package lru_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/Code-Hex/go-generics-cache/lru"
7+
)
8+
9+
func TestSet(t *testing.T) {
10+
// set capacity is 1
11+
cache := lru.NewCap[string, int](1)
12+
cache.Set("foo", 1)
13+
if got := cache.Len(); got != 1 {
14+
t.Fatalf("invalid length: %d", got)
15+
}
16+
if got, ok := cache.Get("foo"); got != 1 || !ok {
17+
t.Fatalf("invalid value got %d, cachehit %v", got, ok)
18+
}
19+
20+
// if over the cap
21+
cache.Set("bar", 2)
22+
if got := cache.Len(); got != 1 {
23+
t.Fatalf("invalid length: %d", got)
24+
}
25+
bar, ok := cache.Get("bar")
26+
if bar != 2 || !ok {
27+
t.Fatalf("invalid value bar %d, cachehit %v", bar, ok)
28+
}
29+
30+
// checks deleted oldest
31+
if _, ok := cache.Get("foo"); ok {
32+
t.Fatalf("invalid delete oldest value foo %v", ok)
33+
}
34+
35+
// valid: if over the cap but same key
36+
cache.Set("bar", 100)
37+
if got := cache.Len(); got != 1 {
38+
t.Fatalf("invalid length: %d", got)
39+
}
40+
bar, ok = cache.Get("bar")
41+
if bar != 100 || !ok {
42+
t.Fatalf("invalid replacing value bar %d, cachehit %v", bar, ok)
43+
}
44+
}
45+
46+
func TestContains(t *testing.T) {
47+
cache := lru.New[string, int]()
48+
cache.Set("foo", 1)
49+
cache.Set("bar", 2)
50+
cache.Set("baz", 3)
51+
for _, key := range []string{
52+
"foo",
53+
"bar",
54+
"baz",
55+
} {
56+
if !cache.Contains(key) {
57+
t.Errorf("not found: %s", key)
58+
}
59+
}
60+
}
61+
62+
func TestDelete(t *testing.T) {
63+
cache := lru.NewCap[string, int](1)
64+
cache.Set("foo", 1)
65+
if got := cache.Len(); got != 1 {
66+
t.Fatalf("invalid length: %d", got)
67+
}
68+
69+
cache.Delete("foo2")
70+
if got := cache.Len(); got != 1 {
71+
t.Fatalf("invalid length after deleted does not exist key: %d", got)
72+
}
73+
74+
cache.Delete("foo")
75+
if got := cache.Len(); got != 0 {
76+
t.Fatalf("invalid length after deleted: %d", got)
77+
}
78+
if _, ok := cache.Get("foo"); ok {
79+
t.Fatalf("invalid get after deleted %v", ok)
80+
}
81+
82+
}

0 commit comments

Comments
 (0)