this repo has no description
at trunk 132 lines 4.5 kB view raw
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()