blob: 9297877668b00f4c264383a835186cd3c341d408 [file] [log] [blame] [edit]
import threading
import unittest
import warnings
from cachetools import LRUCache, cachedmethod, keys
class Cached:
cache = LRUCache(2)
count = 0
lock = threading.Lock()
cond = threading.Condition()
@classmethod
@cachedmethod(lambda cls: cls.cache)
def get(cls, value):
cls.count += 1
return cls.count
@classmethod
@cachedmethod(lambda cls: cls.cache, key=keys.typedmethodkey)
def get_typed(cls, value):
cls.count += 1
return cls.count
@classmethod
@cachedmethod(lambda cls: cls.cache, lock=lambda cls: cls.lock)
def get_locked(cls, value):
cls.count += 1
return cls.count
@classmethod
@cachedmethod(lambda cls: cls.cache, condition=lambda cls: cls.cond)
def get_condition(cls, value):
cls.count += 1
return cls.count
class CachedClassMethodTest(unittest.TestCase):
def test(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
self.assertEqual(cached.get(0), 1)
self.assertEqual(Cached.get(0), 1)
self.assertEqual(len(w), 2)
self.assertIs(w[0].category, DeprecationWarning)
self.assertIs(w[1].category, DeprecationWarning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(cached.get(1), 2)
self.assertEqual(Cached.get(1), 2)
self.assertEqual(cached.get(1), 2)
self.assertEqual(Cached.get(1), 2)
self.assertEqual(cached.get(1.0), 2)
self.assertEqual(Cached.get(1.0), 2)
self.assertEqual(cached.get(1.1), 3)
self.assertEqual(Cached.get(1.1), 3)
Cached.cache.clear()
self.assertEqual(Cached.get(1), 4)
def test_typed(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
self.assertEqual(cached.get_typed(0), 1)
self.assertEqual(Cached.get_typed(0), 1)
self.assertEqual(len(w), 2)
self.assertIs(w[0].category, DeprecationWarning)
self.assertIs(w[1].category, DeprecationWarning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(cached.get_typed(1), 2)
self.assertEqual(Cached.get_typed(1), 2)
self.assertEqual(cached.get_typed(1.0), 3)
self.assertEqual(Cached.get_typed(1.0), 3)
self.assertEqual(cached.get_typed(0.0), 4)
self.assertEqual(Cached.get_typed(0.0), 4)
self.assertEqual(cached.get_typed(0), 5)
self.assertEqual(Cached.get_typed(0), 5)
def test_locked(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
self.assertEqual(cached.get_locked(0), 1)
self.assertEqual(Cached.get_locked(0), 1)
self.assertEqual(len(w), 2)
self.assertIs(w[0].category, DeprecationWarning)
self.assertIs(w[1].category, DeprecationWarning)
def test_condition(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
self.assertEqual(cached.get_condition(0), 1)
self.assertEqual(Cached.get_condition(0), 1)
self.assertEqual(len(w), 2)
self.assertIs(w[0].category, DeprecationWarning)
self.assertIs(w[1].category, DeprecationWarning)
def test_clear(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(cached.get(0), 1)
self.assertEqual(len(Cached.cache), 1)
Cached.get.cache_clear(cached)
self.assertEqual(len(Cached.cache), 0)
def test_clear_locked(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(cached.get_locked(0), 1)
self.assertEqual(len(Cached.cache), 1)
Cached.get_locked.cache_clear(cached)
self.assertEqual(len(Cached.cache), 0)
def test_clear_condition(self):
Cached.cache = LRUCache(2)
Cached.count = 0
cached = Cached()
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self.assertEqual(cached.get_condition(0), 1)
self.assertEqual(len(Cached.cache), 1)
Cached.get_condition.cache_clear(cached)
self.assertEqual(len(Cached.cache), 0)