4 local function expect_kv(key, value, actual_key, actual_value)
5 assert_equal(key, actual_key, "key incorrect");
6 assert_equal(value, actual_value, "value incorrect");
9 expect_kv(nil, nil, c:head());
10 expect_kv(nil, nil, c:tail());
12 assert_equal(c:count(), 0);
15 assert_equal(c:count(), 1);
16 expect_kv("one", 1, c:head());
17 expect_kv("one", 1, c:tail());
20 expect_kv("two", 2, c:head());
21 expect_kv("one", 1, c:tail());
24 expect_kv("three", 3, c:head());
25 expect_kv("one", 1, c:tail());
29 assert_equal(c:count(), 5);
30 expect_kv("five", 5, c:head());
31 expect_kv("one", 1, c:tail());
34 assert_equal(c:count(), 5);
35 expect_kv("five", 5, c:head());
36 expect_kv("one", 1, c:tail());
38 assert_equal(c:get("one"), 1);
39 expect_kv("five", 5, c:head());
40 expect_kv("one", 1, c:tail());
42 assert_equal(c:get("two"), 2);
43 assert_equal(c:get("three"), 3);
44 assert_equal(c:get("four"), 4);
45 assert_equal(c:get("five"), 5);
47 assert_equal(c:get("foo"), nil);
48 assert_equal(c:get("bar"), nil);
51 assert_equal(c:count(), 5);
52 expect_kv("six", 6, c:head());
53 expect_kv("two", 2, c:tail());
55 assert_equal(c:get("one"), nil);
56 assert_equal(c:get("two"), 2);
57 assert_equal(c:get("three"), 3);
58 assert_equal(c:get("four"), 4);
59 assert_equal(c:get("five"), 5);
60 assert_equal(c:get("six"), 6);
63 assert_equal(c:count(), 4);
65 assert_equal(c:get("one"), nil);
66 assert_equal(c:get("two"), 2);
67 assert_equal(c:get("three"), nil);
68 assert_equal(c:get("four"), 4);
69 assert_equal(c:get("five"), 5);
70 assert_equal(c:get("six"), 6);
73 assert_equal(c:count(), 5);
75 assert_equal(c:get("one"), nil);
76 assert_equal(c:get("two"), 2);
77 assert_equal(c:get("three"), nil);
78 assert_equal(c:get("four"), 4);
79 assert_equal(c:get("five"), 5);
80 assert_equal(c:get("six"), 6);
81 assert_equal(c:get("seven"), 7);
84 assert_equal(c:count(), 5);
86 assert_equal(c:get("one"), nil);
87 assert_equal(c:get("two"), nil);
88 assert_equal(c:get("three"), nil);
89 assert_equal(c:get("four"), 4);
90 assert_equal(c:get("five"), 5);
91 assert_equal(c:get("six"), 6);
92 assert_equal(c:get("seven"), 7);
93 assert_equal(c:get("eight"), 8);
96 assert_equal(c:count(), 5);
98 assert_equal(c:get("one"), nil);
99 assert_equal(c:get("two"), nil);
100 assert_equal(c:get("three"), nil);
101 assert_equal(c:get("four"), 4);
102 assert_equal(c:get("five"), 5);
103 assert_equal(c:get("six"), 6);
104 assert_equal(c:get("seven"), 7);
105 assert_equal(c:get("eight"), 8);
108 assert_equal(c:count(), 5);
110 assert_equal(c:get("one"), nil);
111 assert_equal(c:get("two"), nil);
112 assert_equal(c:get("three"), nil);
113 assert_equal(c:get("four"), 4);
114 assert_equal(c:get("five"), nil);
115 assert_equal(c:get("six"), 6);
116 assert_equal(c:get("seven"), 7);
117 assert_equal(c:get("eight"), 8);
118 assert_equal(c:get("nine"), 9);
120 local keys = { "nine", "four", "eight", "seven", "six" };
121 local values = { 9, 4, 8, 7, 6 };
123 for k, v in c:items() do
125 assert_equal(k, keys[i]);
126 assert_equal(v, values[i]);
130 c:set("four", "2+2");
131 assert_equal(c:count(), 5);
133 assert_equal(c:get("one"), nil);
134 assert_equal(c:get("two"), nil);
135 assert_equal(c:get("three"), nil);
136 assert_equal(c:get("four"), "2+2");
137 assert_equal(c:get("five"), nil);
138 assert_equal(c:get("six"), 6);
139 assert_equal(c:get("seven"), 7);
140 assert_equal(c:get("eight"), 8);
141 assert_equal(c:get("nine"), 9);
143 local keys = { "four", "nine", "eight", "seven", "six" };
144 local values = { "2+2", 9, 8, 7, 6 };
146 for k, v in c:items() do
148 assert_equal(k, keys[i]);
149 assert_equal(v, values[i]);
154 assert_equal(c:count(), 5);
156 assert_equal(c:get("one"), nil);
157 assert_equal(c:get("two"), nil);
158 assert_equal(c:get("three"), nil);
159 assert_equal(c:get("four"), "2+2");
160 assert_equal(c:get("five"), nil);
161 assert_equal(c:get("six"), 6);
162 assert_equal(c:get("seven"), 7);
163 assert_equal(c:get("eight"), 8);
164 assert_equal(c:get("nine"), 9);
166 local keys = { "four", "nine", "eight", "seven", "six" };
167 local values = { "2+2", 9, 8, 7, 6 };
169 for k, v in c:items() do
171 assert_equal(k, keys[i]);
172 assert_equal(v, values[i]);
178 assert_equal(c:get("one"), nil);
179 assert_equal(c:get("two"), nil);
180 assert_equal(c:get("three"), nil);
181 assert_equal(c:get("four"), nil);
182 assert_equal(c:get("five"), nil);
183 assert_equal(c:get("six"), 6);
184 assert_equal(c:get("seven"), 7);
185 assert_equal(c:get("eight"), 8);
186 assert_equal(c:get("nine"), 9);
188 local keys = { "nine", "eight", "seven", "six" };
189 local values = { 9, 8, 7, 6 };
191 for k, v in c:items() do
193 assert_equal(k, keys[i]);
194 assert_equal(v, values[i]);
198 local evicted_key, evicted_value;
199 local c = new(3, function (_key, _value)
200 evicted_key, evicted_value = _key, _value;
202 local function set(k, v, should_evict_key, should_evict_value)
203 evicted_key, evicted_value = nil, nil;
205 assert_equal(evicted_key, should_evict_key);
206 assert_equal(evicted_value, should_evict_value);
221 local evicted_key, evicted_value;
222 local c3 = new(1, function (_key, _value, c3)
223 evicted_key, evicted_value = _key, _value;
225 -- Sanity check for what we're evicting
226 assert_equal(_key, "a");
227 assert_equal(_value, 1);
228 -- We're going to block eviction of this key/value, so set to nil...
229 evicted_key, evicted_value = nil, nil;
230 -- Returning false to block eviction
234 local function set(k, v, should_evict_key, should_evict_value)
235 evicted_key, evicted_value = nil, nil;
236 local ret = c3:set(k, v);
237 assert_equal(evicted_key, should_evict_key);
238 assert_equal(evicted_value, should_evict_value);
247 -- Our on_evict prevents "a" from being evicted, causing this to fail...
248 assert_equal(set("b", 2), false, "Failed to prevent eviction, or signal result");
250 expect_kv("a", 1, c3:head());
251 expect_kv("a", 1, c3:tail());
253 -- Check the final state is what we expect
254 assert_equal(c3:get("a"), 1);
255 assert_equal(c3:get("b"), nil);
256 assert_equal(c3:count(), 1);
259 local c4 = new(3, false);
261 assert_equal(c4:set("a", 1), true);
262 assert_equal(c4:set("a", 1), true);
263 assert_equal(c4:set("a", 1), true);
264 assert_equal(c4:set("a", 1), true);
265 assert_equal(c4:set("b", 2), true);
266 assert_equal(c4:set("c", 3), true);
267 assert_equal(c4:set("d", 4), false);
268 assert_equal(c4:set("d", 4), false);
269 assert_equal(c4:set("d", 4), false);
271 expect_kv("c", 3, c4:head());
272 expect_kv("a", 1, c4:tail());
274 local c5 = new(3, function (k, v)
283 assert_equal(c5:set("a", 1), true);
284 assert_equal(c5:set("a", 1), true);
285 assert_equal(c5:set("a", 1), true);
286 assert_equal(c5:set("a", 1), true);
287 assert_equal(c5:set("b", 2), true);
288 assert_equal(c5:set("c", 3), true);
289 assert_equal(c5:set("d", 4), true); -- "a" evicted (cb returned nil)
290 assert_equal(c5:set("d", 4), true); -- nop
291 assert_equal(c5:set("d", 4), true); -- nop
292 assert_equal(c5:set("e", 5), true); -- "b" evicted (cb returned true)
293 assert_equal(c5:set("f", 6), false); -- "c" won't evict (cb returned false)
295 expect_kv("e", 5, c5:head());
296 expect_kv("c", 3, c5:tail());