this repo has no description
1#!/usr/bin/env python3
2# Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
3import _functools
4import functools
5import unittest
6from collections import namedtuple
7
8_CacheInfo = functools._CacheInfo
9
10
11class FunctoolsLRUCacheWrapperTests(unittest.TestCase):
12 def test_uncached_lru_wrapper(self):
13 wrapper = _functools._lru_cache_wrapper(pow, 0, False, _CacheInfo)
14
15 self.assertEqual(wrapper(2, 3), 8)
16 self.assertEqual(wrapper(2, 4), 16)
17 self.assertEqual(wrapper(2, 3), 8)
18 self.assertEqual(wrapper(2, 4), 16)
19
20 info = wrapper.cache_info()
21 self.assertEqual(info.hits, 0)
22 self.assertEqual(info.misses, 4)
23 self.assertEqual(info.currsize, 0)
24
25 def test_infinite_lru_wrapper(self):
26 wrapper = _functools._lru_cache_wrapper(pow, None, False, _CacheInfo)
27
28 self.assertEqual(wrapper(2, 3), 8)
29 self.assertEqual(wrapper(2, 4), 16)
30 self.assertEqual(wrapper(2, 3), 8)
31 self.assertEqual(wrapper(2, 4), 16)
32
33 info = wrapper.cache_info()
34 self.assertEqual(info.hits, 2)
35 self.assertEqual(info.misses, 2)
36 self.assertEqual(info.currsize, 2)
37
38 def test_bounded_lru_wrapper(self):
39 wrapper = _functools._lru_cache_wrapper(pow, 2, False, _CacheInfo)
40
41 self.assertEqual(wrapper(2, 3), 8)
42 self.assertEqual(wrapper(2, 4), 16)
43 self.assertEqual(wrapper(2, 3), 8)
44 self.assertEqual(wrapper(2, 4), 16)
45 self.assertEqual(wrapper(2, 5), 32)
46
47 info = wrapper.cache_info()
48 self.assertEqual(info.hits, 2)
49 self.assertEqual(info.misses, 3)
50 self.assertEqual(info.currsize, 2)
51
52 def test_lru_cache_in_class_binds_self(self):
53 def func(*args, **kwargs):
54 return (args, kwargs)
55
56 class C:
57 foo = _functools._lru_cache_wrapper(func, 10, False, _CacheInfo)
58
59 c = C()
60 result = c.foo(1, "two", bar="baz")
61 self.assertEqual(result, ((c, 1, "two"), {"bar": "baz"}))
62
63 def test_lru_cache_unbounded_in_class_binds_self(self):
64 def func(*args, **kwargs):
65 return (args, kwargs)
66
67 class C:
68 foo = _functools._lru_cache_wrapper(func, None, False, _CacheInfo)
69
70 c = C()
71 result = c.foo(1, "two", bar="baz")
72 self.assertEqual(result, ((c, 1, "two"), {"bar": "baz"}))
73
74 def test_cache_clean_with_uncached_cleans_cache(self):
75 wrapper = _functools._lru_cache_wrapper(pow, 0, False, _CacheInfo)
76
77 info = wrapper.cache_info()
78 self.assertEqual(info.hits, 0)
79 self.assertEqual(info.misses, 0)
80 self.assertEqual(info.currsize, 0)
81 wrapper(1, 2)
82 info = wrapper.cache_info()
83 self.assertEqual(info.hits, 0)
84 self.assertEqual(info.misses, 1)
85 self.assertEqual(info.currsize, 0)
86 wrapper.cache_clear()
87 info = wrapper.cache_info()
88 self.assertEqual(info.hits, 0)
89 self.assertEqual(info.misses, 0)
90 self.assertEqual(info.currsize, 0)
91
92 def test_cache_clean_with_infinite_cleans_cache(self):
93 wrapper = _functools._lru_cache_wrapper(pow, None, False, _CacheInfo)
94
95 info = wrapper.cache_info()
96 self.assertEqual(info.hits, 0)
97 self.assertEqual(info.misses, 0)
98 self.assertEqual(info.currsize, 0)
99 wrapper(1, 2)
100 wrapper(1, 2)
101 info = wrapper.cache_info()
102 self.assertEqual(info.hits, 1)
103 self.assertEqual(info.misses, 1)
104 self.assertEqual(info.currsize, 1)
105 wrapper.cache_clear()
106 info = wrapper.cache_info()
107 self.assertEqual(info.hits, 0)
108 self.assertEqual(info.misses, 0)
109 self.assertEqual(info.currsize, 0)
110
111 def test_cache_clean_with_bounded_cleans_cache(self):
112 wrapper = _functools._lru_cache_wrapper(pow, 2, False, _CacheInfo)
113
114 info = wrapper.cache_info()
115 self.assertEqual(info.hits, 0)
116 self.assertEqual(info.misses, 0)
117 self.assertEqual(info.currsize, 0)
118 wrapper(1, 2)
119 wrapper(1, 2)
120 info = wrapper.cache_info()
121 self.assertEqual(info.hits, 1)
122 self.assertEqual(info.misses, 1)
123 self.assertEqual(info.currsize, 1)
124 wrapper.cache_clear()
125 info = wrapper.cache_info()
126 self.assertEqual(info.hits, 0)
127 self.assertEqual(info.misses, 0)
128 self.assertEqual(info.currsize, 0)
129
130
131if __name__ == "__main__":
132 unittest.main()