|
1 | 1 | import unittest |
2 | 2 | import random |
3 | 3 | import string |
| 4 | +import uuid |
| 5 | +import sys |
| 6 | +import gc |
4 | 7 | from datetime import datetime, timedelta |
5 | 8 |
|
6 | 9 | import ctools |
@@ -46,23 +49,67 @@ def test_strhash(self): |
46 | 49 | for i in range(1024): |
47 | 50 | self.assertEqual(ctools.strhash(s), a) |
48 | 51 |
|
49 | | - def test_lfu(self): |
| 52 | + |
| 53 | +class LFUTest(unittest.TestCase): |
| 54 | + def test_get_set(self): |
50 | 55 | d = ctools.LFUCache(2) |
51 | 56 | d['a'] = 1 |
52 | 57 | d['c'] = 2 |
53 | 58 | d['e'] = 3 |
54 | 59 | self.assertEqual(len(d), 2) |
55 | 60 |
|
56 | | - for i in range(1024): |
| 61 | + for i in range(10): |
57 | 62 | self.assertEqual(d['c'], 2) |
58 | 63 |
|
59 | 64 | self.assertEqual(d.lfu(), "e") |
60 | 65 |
|
61 | | - d.set_capacity(1024) |
62 | | - for i in range(2048): |
63 | | - d[random.random()] = random.random() |
| 66 | + def test_len(self): |
| 67 | + for m in range(254, 1024): |
| 68 | + d = ctools.LFUCache(m) |
| 69 | + for i in range(m+1): |
| 70 | + d[str(i)] = str(i) |
| 71 | + |
| 72 | + self.assertEqual(len(d), m) |
| 73 | + |
| 74 | + def assert_ref_equal(self, lfu_cache, lkey, d, dkey): |
| 75 | + ltmp = lfu_cache[lkey] |
| 76 | + dtmp = d[dkey] |
| 77 | + self.assertEqual(sys.getrefcount(ltmp), sys.getrefcount(dtmp)) |
| 78 | + |
| 79 | + del lfu_cache[lkey] |
| 80 | + del d[dkey] |
| 81 | + self.assertEqual(sys.getrefcount(ltmp), sys.getrefcount(dtmp)) |
| 82 | + |
| 83 | + del d |
| 84 | + del lfu_cache |
| 85 | + self.assertEqual(sys.getrefcount(ltmp), sys.getrefcount(dtmp)) |
| 86 | + |
| 87 | + def set_random(self, dlike): |
| 88 | + key = str(uuid.uuid1()) |
| 89 | + val = str(uuid.uuid1()) |
| 90 | + dlike[key] = val |
| 91 | + return key |
| 92 | + |
| 93 | + def test_one_ref_eq(self): |
| 94 | + lfu_cache = ctools.LFUCache(10) |
| 95 | + d = {} |
| 96 | + |
| 97 | + lkey = self.set_random(lfu_cache) |
| 98 | + dkey = self.set_random(d) |
| 99 | + |
| 100 | + self.assert_ref_equal(lfu_cache, lkey, d, dkey) |
| 101 | + |
| 102 | + def test_many_ref_eq(self): |
| 103 | + lfu_cache = ctools.LFUCache(257) |
| 104 | + d = {} |
| 105 | + for i in range(1024): |
| 106 | + self.set_random(lfu_cache) |
| 107 | + self.set_random(d) |
64 | 108 |
|
65 | | - self.assertEqual(len(d), 1024) |
| 109 | + for i in range(len(lfu_cache)): |
| 110 | + lkey = list(lfu_cache.keys())[i] |
| 111 | + dkey = list(d.keys())[i] |
| 112 | + self.assert_ref_equal(lfu_cache, lkey, d, dkey) |
66 | 113 |
|
67 | 114 |
|
68 | 115 | if __name__ == '__main__': |
|
0 commit comments