summaryrefslogtreecommitdiff
path: root/test/test_cache.py
diff options
context:
space:
mode:
authorLaurent Peuch <cortex@worlddomination.be>2020-03-20 14:18:08 +0100
committerLaurent Peuch <cortex@worlddomination.be>2020-03-20 14:18:08 +0100
commit2f92ba46d9801839063d940dfcf1f0d46c576b9d (patch)
tree171f7e33b04c3a60392d5279de175db3ef6243e4 /test/test_cache.py
parentdb91eae86a35dabbfd5986a1b1a10696ae3749ed (diff)
downloadlogilab-common-2f92ba46d9801839063d940dfcf1f0d46c576b9d.tar.gz
[tox] move to pytest
Diffstat (limited to 'test/test_cache.py')
-rw-r--r--test/test_cache.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/test/test_cache.py b/test/test_cache.py
new file mode 100644
index 0000000..459f172
--- /dev/null
+++ b/test/test_cache.py
@@ -0,0 +1,129 @@
+# unit tests for the cache module
+# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of logilab-common.
+#
+# logilab-common is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option) any
+# later version.
+#
+# logilab-common is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with logilab-common. If not, see <http://www.gnu.org/licenses/>.
+
+from logilab.common.testlib import TestCase, unittest_main, TestSuite
+from logilab.common.cache import Cache
+
+class CacheTestCase(TestCase):
+
+ def setUp(self):
+ self.cache = Cache(5)
+ self.testdict = {}
+
+ def test_setitem1(self):
+ """Checks that the setitem method works"""
+ self.cache[1] = 'foo'
+ self.assertEqual(self.cache[1], 'foo', "1:foo is not in cache")
+ self.assertEqual(len(self.cache._usage), 1)
+ self.assertEqual(self.cache._usage[-1], 1,
+ '1 is not the most recently used key')
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys(),
+ "usage list and data keys are different")
+
+ def test_setitem2(self):
+ """Checks that the setitem method works for multiple items"""
+ self.cache[1] = 'foo'
+ self.cache[2] = 'bar'
+ self.assertEqual(self.cache[2], 'bar',
+ "2 : 'bar' is not in cache.data")
+ self.assertEqual(len(self.cache._usage), 2,
+ "lenght of usage list is not 2")
+ self.assertEqual(self.cache._usage[-1], 2,
+ '1 is not the most recently used key')
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys())# usage list and data keys are different
+
+ def test_setitem3(self):
+ """Checks that the setitem method works when replacing an element in the cache"""
+ self.cache[1] = 'foo'
+ self.cache[1] = 'bar'
+ self.assertEqual(self.cache[1], 'bar', "1 : 'bar' is not in cache.data")
+ self.assertEqual(len(self.cache._usage), 1, "lenght of usage list is not 1")
+ self.assertEqual(self.cache._usage[-1], 1, '1 is not the most recently used key')
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys())# usage list and data keys are different
+
+ def test_recycling1(self):
+ """Checks the removal of old elements"""
+ self.cache[1] = 'foo'
+ self.cache[2] = 'bar'
+ self.cache[3] = 'baz'
+ self.cache[4] = 'foz'
+ self.cache[5] = 'fuz'
+ self.cache[6] = 'spam'
+ self.assertTrue(1 not in self.cache,
+ 'key 1 has not been suppressed from the cache dictionnary')
+ self.assertTrue(1 not in self.cache._usage,
+ 'key 1 has not been suppressed from the cache LRU list')
+ self.assertEqual(len(self.cache._usage), 5, "lenght of usage list is not 5")
+ self.assertEqual(self.cache._usage[-1], 6, '6 is not the most recently used key')
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys())# usage list and data keys are different
+
+ def test_recycling2(self):
+ """Checks that accessed elements get in the front of the list"""
+ self.cache[1] = 'foo'
+ self.cache[2] = 'bar'
+ self.cache[3] = 'baz'
+ self.cache[4] = 'foz'
+ a = self.cache[1]
+ self.assertEqual(a, 'foo')
+ self.assertEqual(self.cache._usage[-1], 1, '1 is not the most recently used key')
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys())# usage list and data keys are different
+
+ def test_delitem(self):
+ """Checks that elements are removed from both element dict and element
+ list.
+ """
+ self.cache['foo'] = 'bar'
+ del self.cache['foo']
+ self.assertTrue('foo' not in self.cache.keys(), "Element 'foo' was not removed cache dictionnary")
+ self.assertTrue('foo' not in self.cache._usage, "Element 'foo' was not removed usage list")
+ self.assertCountEqual(self.cache._usage,
+ self.cache.keys())# usage list and data keys are different
+
+
+ def test_nullsize(self):
+ """Checks that a 'NULL' size cache doesn't store anything
+ """
+ null_cache = Cache(0)
+ null_cache['foo'] = 'bar'
+ self.assertEqual(null_cache.size, 0, 'Cache size should be O, not %d' % \
+ null_cache.size)
+ self.assertEqual(len(null_cache), 0, 'Cache should be empty !')
+ # Assert null_cache['foo'] raises a KeyError
+ self.assertRaises(KeyError, null_cache.__getitem__, 'foo')
+ # Deleting element raises a KeyError
+ self.assertRaises(KeyError, null_cache.__delitem__, 'foo')
+
+ def test_getitem(self):
+ """ Checks that getitem doest not modify the _usage attribute
+ """
+ try:
+ self.cache['toto']
+ except KeyError:
+ self.assertTrue('toto' not in self.cache._usage)
+ else:
+ self.fail('excepted KeyError')
+
+
+if __name__ == "__main__":
+ unittest_main()