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