46
46
self.failUnless('foo' in cache)
47
47
self.failIf('bar' in cache)
49
def test_map_None(self):
50
# Make sure that we can properly map None as a key.
51
cache = lru_cache.LRUCache(max_cache=10)
52
self.failIf(None in cache)
54
self.assertEqual(1, cache[None])
56
self.assertEqual(2, cache[None])
57
# Test the various code paths of __getitem__, to make sure that we can
58
# handle when None is the key for the LRU and the MRU
64
self.assertEqual([None, 1], [n.key for n in cache._walk_lru()])
66
def test_add__null_key(self):
67
cache = lru_cache.LRUCache(max_cache=10)
68
self.assertRaises(ValueError, cache.add, lru_cache._null_key, 1)
70
49
def test_overflow(self):
71
50
"""Adding extra entries will pop out old ones."""
72
51
cache = lru_cache.LRUCache(max_cache=1, after_cleanup_count=1)
133
112
self.assertEqual([(2, 20), (2, 25)], cleanup_called)
135
def test_cleanup_error_maintains_linked_list(self):
137
def cleanup_func(key, val):
138
cleanup_called.append((key, val))
139
raise ValueError('failure during cleanup')
141
cache = lru_cache.LRUCache(max_cache=10)
143
cache.add(i, i, cleanup=cleanup_func)
144
for i in xrange(10, 20):
145
self.assertRaises(ValueError,
146
cache.add, i, i, cleanup=cleanup_func)
148
self.assertEqual([(i, i) for i in xrange(10)], cleanup_called)
150
self.assertEqual(range(19, 9, -1), [n.key for n in cache._walk_lru()])
152
def test_cleanup_during_replace_still_replaces(self):
154
def cleanup_func(key, val):
155
cleanup_called.append((key, val))
156
raise ValueError('failure during cleanup')
158
cache = lru_cache.LRUCache(max_cache=10)
160
cache.add(i, i, cleanup=cleanup_func)
161
self.assertRaises(ValueError,
162
cache.add, 1, 20, cleanup=cleanup_func)
163
# We also still update the recent access to this node
164
self.assertEqual([1, 9, 8, 7, 6, 5, 4, 3, 2, 0],
165
[n.key for n in cache._walk_lru()])
166
self.assertEqual(20, cache[1])
168
self.assertEqual([(1, 1)], cleanup_called)
169
self.assertEqual([1, 9, 8, 7, 6, 5, 4, 3, 2, 0],
170
[n.key for n in cache._walk_lru()])
172
114
def test_len(self):
173
115
cache = lru_cache.LRUCache(max_cache=10, after_cleanup_count=10)
283
225
self.assertEqual([2, 3, 4, 5, 6], sorted(cache.keys()))
227
def test_after_cleanup_size_deprecated(self):
228
obj = self.callDeprecated([
229
'LRUCache.__init__(after_cleanup_size) was deprecated in 1.11.'
230
' Use after_cleanup_count instead.'],
231
lru_cache.LRUCache, 50, after_cleanup_size=25)
232
self.assertEqual(obj._after_cleanup_count, 25)
285
234
def test_resize_smaller(self):
286
235
cache = lru_cache.LRUCache(max_cache=5, after_cleanup_count=4)
330
279
self.assertEqual(int(cache._max_size*0.8), cache._after_cleanup_size)
331
280
self.assertEqual(0, cache._value_size)
333
def test_add__null_key(self):
334
cache = lru_cache.LRUSizeCache()
335
self.assertRaises(ValueError, cache.add, lru_cache._null_key, 1)
337
282
def test_add_tracks_size(self):
338
283
cache = lru_cache.LRUSizeCache()
339
284
self.assertEqual(0, cache._value_size)