1import unittest
2
3from ..type_registry import LazyRegistry
4
5from .dummies import A, B, C, D, Mixed, Abstract, Concrete, ConcreteSubclass
6
7
8class TestLazyRegistry(unittest.TestCase):
9    def setUp(self):
10        self.registry = LazyRegistry()
11        # Bodge in a different importer.
12        self.registry._import_object = 'Imported {0}'.format
13
14    def test_deferred_push(self):
15        self.registry.push('dummies:A', 'foo:A')
16        self.registry.push('dummies:C', 'foo:C')
17        self.assertEqual(self.registry.lookup_by_type(A), 'Imported foo:A')
18        self.assertEqual(self.registry.lookup_by_type(B), 'Imported foo:A')
19        self.assertEqual(self.registry.lookup_by_type(C), 'Imported foo:C')
20        self.assertRaises(KeyError, self.registry.lookup_by_type, D)
21
22    def test_greedy_push(self):
23        self.registry.push(A, 'foo:A')
24        self.registry.push(C, 'foo:C')
25        self.assertEqual(self.registry.lookup_by_type(A), 'Imported foo:A')
26        self.assertEqual(self.registry.lookup_by_type(B), 'Imported foo:A')
27        self.assertEqual(self.registry.lookup_by_type(C), 'Imported foo:C')
28        self.assertRaises(KeyError, self.registry.lookup_by_type, D)
29
30    def test_mro(self):
31        self.registry.push('dummies:A', 'foo:A')
32        self.registry.push('dummies:D', 'foo:D')
33        self.assertEqual(self.registry.lookup_by_type(Mixed), 'Imported foo:A')
34
35    def test_lookup_instance(self):
36        self.registry.push(A, 'foo:A')
37        self.registry.push(C, 'foo:C')
38        self.assertEqual(self.registry.lookup(A()), 'Imported foo:A')
39        self.assertEqual(self.registry.lookup(B()), 'Imported foo:A')
40        self.assertEqual(self.registry.lookup(C()), 'Imported foo:C')
41        self.assertRaises(KeyError, self.registry.lookup, D())
42
43    def test_abc(self):
44        self.registry.push_abc(Abstract, 'foo:Abstract')
45        self.assertEqual(self.registry.lookup_by_type(Concrete),
46            'Imported foo:Abstract')
47        self.assertEqual(self.registry.lookup_by_type(ConcreteSubclass),
48            'Imported foo:Abstract')
49