1import unittest 2 3import cachetools.keys 4 5 6class CacheKeysTest(unittest.TestCase): 7 def test_hashkey(self, key=cachetools.keys.hashkey): 8 self.assertEqual(key(), key()) 9 self.assertEqual(hash(key()), hash(key())) 10 self.assertEqual(key(1, 2, 3), key(1, 2, 3)) 11 self.assertEqual(hash(key(1, 2, 3)), hash(key(1, 2, 3))) 12 self.assertEqual(key(1, 2, 3, x=0), key(1, 2, 3, x=0)) 13 self.assertEqual(hash(key(1, 2, 3, x=0)), hash(key(1, 2, 3, x=0))) 14 self.assertNotEqual(key(1, 2, 3), key(3, 2, 1)) 15 self.assertNotEqual(key(1, 2, 3), key(1, 2, 3, x=None)) 16 self.assertNotEqual(key(1, 2, 3, x=0), key(1, 2, 3, x=None)) 17 self.assertNotEqual(key(1, 2, 3, x=0), key(1, 2, 3, y=0)) 18 with self.assertRaises(TypeError): 19 hash(key({})) 20 # untyped keys compare equal 21 self.assertEqual(key(1, 2, 3), key(1.0, 2.0, 3.0)) 22 self.assertEqual(hash(key(1, 2, 3)), hash(key(1.0, 2.0, 3.0))) 23 24 def test_typedkey(self, key=cachetools.keys.typedkey): 25 self.assertEqual(key(), key()) 26 self.assertEqual(hash(key()), hash(key())) 27 self.assertEqual(key(1, 2, 3), key(1, 2, 3)) 28 self.assertEqual(hash(key(1, 2, 3)), hash(key(1, 2, 3))) 29 self.assertEqual(key(1, 2, 3, x=0), key(1, 2, 3, x=0)) 30 self.assertEqual(hash(key(1, 2, 3, x=0)), hash(key(1, 2, 3, x=0))) 31 self.assertNotEqual(key(1, 2, 3), key(3, 2, 1)) 32 self.assertNotEqual(key(1, 2, 3), key(1, 2, 3, x=None)) 33 self.assertNotEqual(key(1, 2, 3, x=0), key(1, 2, 3, x=None)) 34 self.assertNotEqual(key(1, 2, 3, x=0), key(1, 2, 3, y=0)) 35 with self.assertRaises(TypeError): 36 hash(key({})) 37 # typed keys compare unequal 38 self.assertNotEqual(key(1, 2, 3), key(1.0, 2.0, 3.0)) 39 40 def test_addkeys(self, key=cachetools.keys.hashkey): 41 self.assertIsInstance(key(), tuple) 42 self.assertIsInstance(key(1, 2, 3) + key(4, 5, 6), type(key())) 43 self.assertIsInstance(key(1, 2, 3) + (4, 5, 6), type(key())) 44 self.assertIsInstance((1, 2, 3) + key(4, 5, 6), type(key())) 45 46 def test_pickle(self, key=cachetools.keys.hashkey): 47 import pickle 48 49 for k in [key(), key("abc"), key("abc", 123), key("abc", q="abc")]: 50 # white-box test: assert cached hash value is not pickled 51 self.assertEqual(len(k.__dict__), 0) 52 h = hash(k) 53 self.assertEqual(len(k.__dict__), 1) 54 pickled = pickle.loads(pickle.dumps(k)) 55 self.assertEqual(len(pickled.__dict__), 0) 56 self.assertEqual(k, pickled) 57 self.assertEqual(h, hash(pickled)) 58