summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_functools.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2010-07-31 10:11:39 (GMT)
committerRaymond Hettinger <python@rcn.com>2010-07-31 10:11:39 (GMT)
commit9e46ef819c38ec76273d7ffb35bcd14a558d35d4 (patch)
treed18a0bf2fdcf650f268b97945d058effbc357d40 /Lib/test/test_functools.py
parent17e3d698b512025d525c1ecb6b0531b575ad5518 (diff)
downloadcpython-9e46ef819c38ec76273d7ffb35bcd14a558d35d4.zip
cpython-9e46ef819c38ec76273d7ffb35bcd14a558d35d4.tar.gz
cpython-9e46ef819c38ec76273d7ffb35bcd14a558d35d4.tar.bz2
Add functools.lfu_cache() and functools.lru_cache().
Diffstat (limited to 'Lib/test/test_functools.py')
-rw-r--r--Lib/test/test_functools.py48
1 files changed, 47 insertions, 1 deletions
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index f6ccc87..a02d37c 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -4,6 +4,7 @@ import unittest
from test import support
from weakref import proxy
import pickle
+from random import choice
@staticmethod
def PythonPartial(func, *args, **keywords):
@@ -454,6 +455,50 @@ class TestTotalOrdering(unittest.TestCase):
class A:
pass
+class TestLRU(unittest.TestCase):
+
+ def test_lru(self):
+ def orig(x, y):
+ return 3*x+y
+ f = functools.lru_cache(maxsize=20)(orig)
+
+ domain = range(5)
+ for i in range(1000):
+ x, y = choice(domain), choice(domain)
+ actual = f(x, y)
+ expected = orig(x, y)
+ self.assertEquals(actual, expected)
+ self.assert_(f.hits > f.misses)
+ self.assertEquals(f.hits + f.misses, 1000)
+
+ f.clear() # test clearing
+ self.assertEqual(f.hits, 0)
+ self.assertEqual(f.misses, 0)
+ f(x, y)
+ self.assertEqual(f.hits, 0)
+ self.assertEqual(f.misses, 1)
+
+ def test_lfu(self):
+ def orig(x, y):
+ return 3*x+y
+ f = functools.lfu_cache(maxsize=20)(orig)
+
+ domain = range(5)
+ for i in range(1000):
+ x, y = choice(domain), choice(domain)
+ actual = f(x, y)
+ expected = orig(x, y)
+ self.assertEquals(actual, expected)
+ self.assert_(f.hits > f.misses)
+ self.assertEquals(f.hits + f.misses, 1000)
+
+ f.clear() # test clearing
+ self.assertEqual(f.hits, 0)
+ self.assertEqual(f.misses, 0)
+ f(x, y)
+ self.assertEqual(f.hits, 0)
+ self.assertEqual(f.misses, 1)
+
def test_main(verbose=None):
test_classes = (
TestPartial,
@@ -461,7 +506,8 @@ def test_main(verbose=None):
TestPythonPartial,
TestUpdateWrapper,
TestWraps,
- TestReduce
+ TestReduce,
+ TestLRU,
)
support.run_unittest(*test_classes)