aboutsummaryrefslogtreecommitdiff
path: root/tests/test_func.py
blob: 236a5d73ab25720d52351a6931fea26a378b1f29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import unittest
import warnings

import cachetools.func


class DecoratorTestMixin(object):

    def decorator(self, maxsize, typed=False, lock=None):
        raise NotImplementedError

    def test_decorator(self):
        cached = self.decorator(maxsize=2)(lambda n: n)

        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (1, 1, 2, 1))
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(cached.cache_info(), (2, 1, 2, 1))

    def test_decorator_clear(self):
        cached = self.decorator(maxsize=2)(lambda n: n)

        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))
        cached.cache_clear()
        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))

    def test_decorator_nosize(self):
        cached = self.decorator(maxsize=0)(lambda n: n)

        self.assertEqual(cached.cache_info(), (0, 0, 0, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 0, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 2, 0, 0))
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(cached.cache_info(), (0, 3, 0, 0))

    def test_decorator_typed(self):
        cached = self.decorator(maxsize=2, typed=True)(lambda n: n)

        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (1, 1, 2, 1))
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(cached.cache_info(), (1, 2, 2, 2))
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(cached.cache_info(), (2, 2, 2, 2))

    def test_decorator_lock(self):
        class Lock(object):
            count = 0

            def __enter__(self):
                Lock.count += 1

            def __exit__(self, *exc):
                pass

        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter('always')
            cached = self.decorator(maxsize=2, lock=Lock)(lambda n: n)
        self.assertEqual(len(w), 1)
        self.assertIs(w[0].category, DeprecationWarning)

        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(Lock.count, 1)
        self.assertEqual(cached(1), 1)
        self.assertEqual(Lock.count, 3)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))
        self.assertEqual(Lock.count, 4)
        self.assertEqual(cached(1), 1)
        self.assertEqual(Lock.count, 5)
        self.assertEqual(cached.cache_info(), (1, 1, 2, 1))
        self.assertEqual(Lock.count, 6)
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(Lock.count, 7)
        self.assertEqual(cached.cache_info(), (2, 1, 2, 1))
        self.assertEqual(Lock.count, 8)

    def test_decorator_nolock(self):
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter('always')
            cached = self.decorator(maxsize=2, lock=None)(lambda n: n)
        self.assertEqual(len(w), 1)
        self.assertIs(w[0].category, DeprecationWarning)

        self.assertEqual(cached.cache_info(), (0, 0, 2, 0))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (0, 1, 2, 1))
        self.assertEqual(cached(1), 1)
        self.assertEqual(cached.cache_info(), (1, 1, 2, 1))
        self.assertEqual(cached(1.0), 1.0)
        self.assertEqual(cached.cache_info(), (2, 1, 2, 1))


class LFUDecoratorTest(unittest.TestCase, DecoratorTestMixin):

    def decorator(self, maxsize, **kwargs):
        return cachetools.func.lfu_cache(maxsize, **kwargs)


class LRUDecoratorTest(unittest.TestCase, DecoratorTestMixin):

    def decorator(self, maxsize, **kwargs):
        return cachetools.func.lru_cache(maxsize, **kwargs)


class RRDecoratorTest(unittest.TestCase, DecoratorTestMixin):

    def decorator(self, maxsize, **kwargs):
        return cachetools.func.rr_cache(maxsize, **kwargs)


class TTLDecoratorTest(unittest.TestCase, DecoratorTestMixin):

    def decorator(self, maxsize, **kwargs):
        return cachetools.func.ttl_cache(maxsize, **kwargs)