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
|
from unittest import TestCase
from class_registry.cache import ClassRegistryInstanceCache
from class_registry.registry import ClassRegistry
from test import Bulbasaur, Charmander, Charmeleon, Squirtle, Wartortle
class ClassRegistryInstanceCacheTestCase(TestCase):
def setUp(self):
super(ClassRegistryInstanceCacheTestCase, self).setUp()
self.registry = ClassRegistry(attr_name='element')
self.cache = ClassRegistryInstanceCache(self.registry)
def test_get(self):
"""
When an instance is returned from
:py:meth:`ClassRegistryInstanceCache.get`, future invocations return
the same instance.
"""
# Register a few classes with the ClassRegistry.
self.registry.register(Bulbasaur)
self.registry.register(Charmander)
self.registry.register(Squirtle)
poke_1 = self.cache['grass']
self.assertIsInstance(poke_1, Bulbasaur)
# Same key = exact same instance.
poke_2 = self.cache['grass']
self.assertIs(poke_2, poke_1)
poke_3 = self.cache['water']
self.assertIsInstance(poke_3, Squirtle)
# If we pull a class directly from the wrapped registry, we get
# a new instance.
poke_4 = self.registry['water']
self.assertIsInstance(poke_4, Squirtle)
self.assertIsNot(poke_3, poke_4)
def test_template_args(self):
"""
Extra params passed to the cache constructor are passed to the template
function when creating new instances.
"""
self.registry.register(Charmeleon)
self.registry.register(Wartortle)
# Add an extra init param to the cache.
cache = ClassRegistryInstanceCache(self.registry, name='Bruce')
# The cache parameters are automatically applied to the class'
# initializer.
poke_1 = cache['fire']
self.assertIsInstance(poke_1, Charmeleon)
self.assertEqual(poke_1.name, 'Bruce')
poke_2 = cache['water']
self.assertIsInstance(poke_2, Wartortle)
self.assertEqual(poke_2.name, 'Bruce')
def test_iterator(self):
"""
Creating an iterator using :py:func:`iter`.
"""
self.registry.register(Bulbasaur)
self.registry.register(Charmander)
self.registry.register(Squirtle)
# The cache's iterator only operates over cached instances.
self.assertListEqual(list(iter(self.cache)), [])
poke_1 = self.cache['water']
poke_2 = self.cache['grass']
poke_3 = self.cache['fire']
# The order that values are yielded depends on the ordering of
# the wrapped registry.
self.assertListEqual(
list(iter(self.cache)),
[poke_2, poke_3, poke_1],
)
|