cache_test.go (4056B)
1 package cache 2 3 import ( 4 "testing" 5 "slices" 6 ) 7 8 func TestNewCache(t *testing.T) { 9 ca := NewCache() 10 if ca.CacheSize != 0 { 11 t.Errorf("cache size not 0") 12 } 13 ca = ca.WithCacheSize(102525) 14 if ca.CacheSize != 102525 { 15 t.Errorf("cache size not 102525") 16 } 17 } 18 19 func TestCacheUse(t *testing.T) { 20 ca := NewCache() 21 ca = ca.WithCacheSize(10) 22 ca.Push() 23 err := ca.Add("bar", "baz", 0) 24 if err != nil { 25 t.Error(err) 26 } 27 err = ca.Add("inky", "pinky", 0) 28 if err != nil { 29 t.Error(err) 30 } 31 err = ca.Add("blinky", "clyde", 0) 32 if err == nil { 33 t.Errorf("expected capacity error") 34 } 35 v := ca.Check("inky") 36 if v { 37 t.Fatal("expected true") 38 } 39 v = ca.Check("blinky") 40 if !v { 41 t.Fatal("expected false") 42 } 43 } 44 45 func TestCacheUpdate(t *testing.T) { 46 ca := NewCache() 47 ca = ca.WithCacheSize(10) 48 ca.Add("foo", "bar", 0) 49 err := ca.Add("foo", "barbarbar", 0) 50 if err != ErrDup { 51 t.Error(err) 52 } 53 v, err := ca.Get("foo") 54 if err != nil { 55 t.Error(err) 56 } 57 if v != "bar" { 58 t.Fatalf("expected 'bar', got '%s'", v) 59 } 60 err = ca.Update("foo", "barbarbar") 61 v, err = ca.Get("foo") 62 if err != nil { 63 t.Error(err) 64 } 65 if v != "barbarbar" { 66 t.Fatalf("expected 'barbarbar', got '%s'", v) 67 } 68 err = ca.Update("foo", "barbarbarbar") 69 if err == nil { 70 t.Fatalf("expect error") 71 } 72 } 73 74 func TestCacheLimits(t *testing.T) { 75 ca := NewCache() 76 ca = ca.WithCacheSize(8) 77 err := ca.Add("foo", "bar", 2) 78 if err == nil { 79 t.Fatal("expected error") 80 } 81 err = ca.Add("foo", "barbarbar", 0) 82 if err == nil { 83 t.Fatal("expected error") 84 } 85 err = ca.Add("foo", "bar", 0) 86 if err != nil { 87 t.Fatal(err) 88 } 89 err = ca.Add("baz", "barbar", 0) 90 if err == nil { 91 t.Fatal("expected error") 92 } 93 ca.Reset() 94 err = ca.Add("baz", "barbar", 0) 95 if err == nil { 96 t.Fatal("expected error") 97 } 98 ca.Pop() 99 err = ca.Add("baz", "barbar", 0) 100 if err != nil { 101 t.Fatal(err) 102 } 103 } 104 105 func TestStateDownUp(t *testing.T) { 106 ca := NewCache() 107 err := ca.Push() 108 if err != nil { 109 t.Error(err) 110 } 111 err = ca.Add("foo", "bar", 0) 112 if err != nil { 113 t.Error(err) 114 } 115 err = ca.Add("baz", "xyzzy", 0) 116 if err != nil { 117 t.Error(err) 118 } 119 if ca.CacheUseSize != 8 { 120 t.Errorf("expected cache use size 8 got %v", ca.CacheUseSize) 121 } 122 err = ca.Pop() 123 if err != nil { 124 t.Error(err) 125 } 126 l := len(ca.Cache) 127 if l != 1 { 128 t.Fatalf("expected cache length 1, got %d", l) 129 } 130 err = ca.Pop() 131 if err != nil { 132 t.Error(err) 133 } 134 l = len(ca.Cache) 135 if l != 1 { 136 t.Fatalf("expected cache length 1, got %d", l) 137 } 138 err = ca.Pop() 139 if err != nil { 140 t.Errorf("unexpected out of top frame error") 141 } 142 l = len(ca.Cache) 143 if l != 1 { 144 t.Fatalf("expected cache length 1, got %d", l) 145 } 146 } 147 148 func TestCacheReset(t *testing.T) { 149 ca := NewCache() 150 err := ca.Add("foo", "bar", 0) 151 if err != nil { 152 t.Error(err) 153 } 154 ca.Push() 155 err = ca.Add("baz", "xyzzy", 0) 156 if err != nil { 157 t.Error(err) 158 } 159 ca.Reset() 160 if ca.CacheUseSize != 3 { 161 t.Errorf("expected cache use size 0, got %v", ca.CacheUseSize) 162 } 163 } 164 165 func TestCacheLoadDup(t *testing.T) { 166 ca := NewCache() 167 err := ca.Push() 168 if err != nil { 169 t.Error(err) 170 } 171 err = ca.Add("foo", "xyzzy", 0) 172 if err != nil { 173 t.Error(err) 174 } 175 err = ca.Push() 176 if err != nil { 177 t.Error(err) 178 } 179 err = ca.Add("foo", "baz", 0) 180 if err == nil { 181 t.Errorf("expect duplicate key in different frame") 182 } 183 ca.Pop() 184 err = ca.Add("foo", "baz", 0) 185 if err != ErrDup { 186 t.Error(err) 187 } 188 } 189 190 func TestCacheLast(t *testing.T) { 191 ca := NewCache() 192 v := ca.Last() 193 if v != "" { 194 t.Fatal("expected empty") 195 } 196 err := ca.Add("foo", "bar", 0) 197 if err != nil { 198 t.Error(err) 199 } 200 ca.Push() 201 err = ca.Add("baz", "xyzzy", 0) 202 if err != nil { 203 t.Error(err) 204 } 205 v = ca.Last() 206 if v != "xyzzy" { 207 t.Fatalf("expected 'xyzzy', got: '%s'", v) 208 } 209 } 210 211 func TestCacheKeys(t *testing.T) { 212 ca := NewCache() 213 ca.Add("inky", "tinkywinky", 0) 214 ca.Push() 215 ca.Add("pinky", "dipsy", 0) 216 ca.Push() 217 ca.Push() 218 ca.Add("blinky", "lala", 0) 219 ca.Add("clyde", "pu", 0) 220 ks := ca.Keys(3) 221 if !slices.Contains(ks, "blinky") { 222 t.Fatalf("Missing 'blinky'") 223 } 224 if !slices.Contains(ks, "clyde") { 225 t.Fatalf("Missing 'clyde'") 226 } 227 }