github.com/andy2046/gopie@v0.7.0/pkg/lru/lru_test.go (about) 1 package lru 2 3 import ( 4 "fmt" 5 "testing" 6 ) 7 8 type simpleStruct struct { 9 int 10 string 11 } 12 13 type complexStruct struct { 14 int 15 simpleStruct 16 } 17 18 var getTests = []struct { 19 name string 20 keyToAdd interface{} 21 keyToGet interface{} 22 expectedOk bool 23 }{ 24 {"string_hit", "myKey", "myKey", true}, 25 {"string_miss", "myKey", "nonsense", false}, 26 {"simple_struct_hit", simpleStruct{1, "two"}, simpleStruct{1, "two"}, true}, 27 {"simeple_struct_miss", simpleStruct{1, "two"}, simpleStruct{0, "noway"}, false}, 28 {"complex_struct_hit", complexStruct{1, simpleStruct{2, "three"}}, 29 complexStruct{1, simpleStruct{2, "three"}}, true}, 30 } 31 32 func TestGet(t *testing.T) { 33 for _, tt := range getTests { 34 lru := New(0) 35 lru.Add(tt.keyToAdd, 1234) 36 val, ok := lru.Get(tt.keyToGet) 37 if ok != tt.expectedOk { 38 t.Fatalf("%s: cache hit = %v; want %v", tt.name, ok, !ok) 39 } else if ok && val != 1234 { 40 t.Fatalf("%s expected get to return 1234 but got %v", tt.name, val) 41 } 42 } 43 } 44 45 func TestRemove(t *testing.T) { 46 lru := New(0) 47 lru.Add("myKey", 1234) 48 if val, ok := lru.Get("myKey"); !ok { 49 t.Fatal("TestRemove returned no match") 50 } else if val != 1234 { 51 t.Fatalf("TestRemove failed. Expected %d, got %v", 1234, val) 52 } 53 54 lru.Remove("myKey") 55 if _, ok := lru.Get("myKey"); ok { 56 t.Fatal("TestRemove returned a removed entry") 57 } 58 } 59 60 func TestPurge(t *testing.T) { 61 purgedKeys := make([]interface{}, 0) 62 onPurgedFun := func(key interface{}, value interface{}) { 63 purgedKeys = append(purgedKeys, key) 64 } 65 66 lru := New(20) 67 lru.OnPurged = onPurgedFun 68 for i := 0; i < 22; i++ { 69 lru.Add(fmt.Sprintf("myKey%d", i), 1234) 70 } 71 72 if len(purgedKeys) != 2 { 73 t.Fatalf("got %d evicted keys; want 2", len(purgedKeys)) 74 } 75 if purgedKeys[0] != interface{}("myKey0") { 76 t.Fatalf("got %v in first evicted key; want %s", purgedKeys[0], "myKey0") 77 } 78 if purgedKeys[1] != interface{}("myKey1") { 79 t.Fatalf("got %v in second evicted key; want %s", purgedKeys[1], "myKey1") 80 } 81 } 82 83 func BenchmarkLRU(b *testing.B) { 84 purgedKeys := make([]interface{}, 0) 85 onPurgedFun := func(key interface{}, value interface{}) { 86 purgedKeys = append(purgedKeys, key) 87 } 88 n, m := 20, 40 89 lru := New(n) 90 lru.OnPurged = onPurgedFun 91 b.ResetTimer() 92 for i := 0; i < b.N; i++ { 93 lru.Add(fmt.Sprintf("myKey%d", i%m), 1234) 94 } 95 }