1import unittest
2
3from Cython.Compiler import Code, UtilityCode
4
5
6def strip_2tup(tup):
7    return tup[0] and tup[0].strip(), tup[1] and tup[1].strip()
8
9class TestUtilityLoader(unittest.TestCase):
10    """
11    Test loading UtilityCodes
12    """
13
14    expected = "test {{loader}} prototype", "test {{loader}} impl"
15
16    required = "req {{loader}} proto", "req {{loader}} impl"
17
18    context = dict(loader='Loader')
19
20    name = "TestUtilityLoader"
21    filename = "TestUtilityLoader.c"
22    cls = Code.UtilityCode
23
24    def test_load_as_string(self):
25        got = strip_2tup(self.cls.load_as_string(self.name))
26        self.assertEquals(got, self.expected)
27
28        got = strip_2tup(self.cls.load_as_string(self.name, self.filename))
29        self.assertEquals(got, self.expected)
30
31    def test_load(self):
32        utility = self.cls.load(self.name)
33        got = strip_2tup((utility.proto, utility.impl))
34        self.assertEquals(got, self.expected)
35
36        required, = utility.requires
37        got = strip_2tup((required.proto, required.impl))
38        self.assertEquals(got, self.required)
39
40        utility = self.cls.load(self.name, from_file=self.filename)
41        got = strip_2tup((utility.proto, utility.impl))
42        self.assertEquals(got, self.expected)
43
44        utility = self.cls.load_cached(self.name, from_file=self.filename)
45        got = strip_2tup((utility.proto, utility.impl))
46        self.assertEquals(got, self.expected)
47
48
49class TestTempitaUtilityLoader(TestUtilityLoader):
50    """
51    Test loading UtilityCodes with Tempita substitution
52    """
53    expected_tempita = (TestUtilityLoader.expected[0].replace('{{loader}}', 'Loader'),
54                        TestUtilityLoader.expected[1].replace('{{loader}}', 'Loader'))
55
56    required_tempita = (TestUtilityLoader.required[0].replace('{{loader}}', 'Loader'),
57                        TestUtilityLoader.required[1].replace('{{loader}}', 'Loader'))
58
59    cls = Code.TempitaUtilityCode
60
61    def test_load_as_string(self):
62        got = strip_2tup(self.cls.load_as_string(self.name, context=self.context))
63        self.assertEquals(got, self.expected_tempita)
64
65    def test_load(self):
66        utility = self.cls.load(self.name, context=self.context)
67        got = strip_2tup((utility.proto, utility.impl))
68        self.assertEquals(got, self.expected_tempita)
69
70        required, = utility.requires
71        got = strip_2tup((required.proto, required.impl))
72        self.assertEquals(got, self.required_tempita)
73
74        utility = self.cls.load(self.name, from_file=self.filename, context=self.context)
75        got = strip_2tup((utility.proto, utility.impl))
76        self.assertEquals(got, self.expected_tempita)
77
78
79class TestCythonUtilityLoader(TestTempitaUtilityLoader):
80    """
81    Test loading CythonUtilityCodes
82    """
83
84    # Just change the attributes and run the same tests
85    expected = None, "test {{cy_loader}} impl"
86    expected_tempita = None, "test CyLoader impl"
87
88    required = None, "req {{cy_loader}} impl"
89    required_tempita = None, "req CyLoader impl"
90
91    context = dict(cy_loader='CyLoader')
92
93    name = "TestCyUtilityLoader"
94    filename = "TestCyUtilityLoader.pyx"
95    cls = UtilityCode.CythonUtilityCode
96
97    # Small hack to pass our tests above
98    cls.proto = None
99
100    test_load = TestUtilityLoader.test_load
101    test_load_tempita = TestTempitaUtilityLoader.test_load
102