summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-10-25 12:36:56 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-10-25 12:36:56 (GMT)
commit1faf9025b5d599d66acac0f33d1500a2ff386368 (patch)
tree908ef4fcedd4efaa26bd16219d1b4e6fde604e48 /Lib
parentecb90182f59c4929a395759896d1abea4e408f39 (diff)
parent4832580596e36805a2a2c206a3ce919260b16867 (diff)
downloadcpython-1faf9025b5d599d66acac0f33d1500a2ff386368.zip
cpython-1faf9025b5d599d66acac0f33d1500a2ff386368.tar.gz
cpython-1faf9025b5d599d66acac0f33d1500a2ff386368.tar.bz2
Issue #27275: Fixed implementation of pop() and popitem() methods in
subclasses of accelerated OrderedDict.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_ordered_dict.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py
index a35ed12..582ff56 100644
--- a/Lib/test/test_ordered_dict.py
+++ b/Lib/test/test_ordered_dict.py
@@ -775,5 +775,64 @@ class CPythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol):
self.assertRaises(KeyError, d.popitem)
+class SimpleLRUCache:
+
+ def __init__(self, size):
+ super().__init__()
+ self.size = size
+
+ def __getitem__(self, item):
+ value = super().__getitem__(item)
+ self.move_to_end(item)
+ return value
+
+ def __setitem__(self, key, value):
+ while key not in self and len(self) >= self.size:
+ self.popitem(last=False)
+ super().__setitem__(key, value)
+ self.move_to_end(key)
+
+
+class SimpleLRUCacheTests:
+
+ def test_add_after_full(self):
+ c = self.type2test(2)
+ c['t1'] = 1
+ c['t2'] = 2
+ c['t3'] = 3
+ self.assertEqual(list(c), ['t2', 't3'])
+
+ def test_popitem(self):
+ c = self.type2test(3)
+ for i in range(1, 4):
+ c[i] = i
+ self.assertEqual(c.popitem(last=False), (1, 1))
+ self.assertEqual(c.popitem(last=True), (3, 3))
+
+ def test_change_order_on_get(self):
+ c = self.type2test(3)
+ for i in range(1, 4):
+ c[i] = i
+ self.assertEqual(list(c), list(range(1, 4)))
+ self.assertEqual(c[2], 2)
+ self.assertEqual(list(c), [1, 3, 2])
+
+
+class PySimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase):
+
+ class type2test(SimpleLRUCache, py_coll.OrderedDict):
+ pass
+
+
+@unittest.skipUnless(c_coll, 'requires the C version of the collections module')
+class CSimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ class type2test(SimpleLRUCache, c_coll.OrderedDict):
+ pass
+ cls.type2test = type2test
+
+
if __name__ == "__main__":
unittest.main()