15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import unittest
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler import Code, UtilityCode
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def strip_2tup(tup):
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return tup[0] and tup[0].strip(), tup[1] and tup[1].strip()
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestUtilityLoader(unittest.TestCase):
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Test loading UtilityCodes
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected = "test {{loader}} prototype", "test {{loader}} impl"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    required = "req {{loader}} proto", "req {{loader}} impl"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    context = dict(loader='Loader')
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    name = "TestUtilityLoader"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    filename = "TestUtilityLoader.c"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cls = Code.UtilityCode
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_load_as_string(self):
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup(self.cls.load_as_string(self.name))
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup(self.cls.load_as_string(self.name, self.filename))
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_load(self):
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = self.cls.load(self.name)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((utility.proto, utility.impl))
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        required, = utility.requires
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((required.proto, required.impl))
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.required)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = self.cls.load(self.name, from_file=self.filename)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((utility.proto, utility.impl))
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = self.cls.load_cached(self.name, from_file=self.filename)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((utility.proto, utility.impl))
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestTempitaUtilityLoader(TestUtilityLoader):
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Test loading UtilityCodes with Tempita substitution
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_tempita = (TestUtilityLoader.expected[0].replace('{{loader}}', 'Loader'),
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        TestUtilityLoader.expected[1].replace('{{loader}}', 'Loader'))
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    required_tempita = (TestUtilityLoader.required[0].replace('{{loader}}', 'Loader'),
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        TestUtilityLoader.required[1].replace('{{loader}}', 'Loader'))
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cls = Code.TempitaUtilityCode
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_load_as_string(self):
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup(self.cls.load_as_string(self.name, context=self.context))
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected_tempita)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_load(self):
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = self.cls.load(self.name, context=self.context)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((utility.proto, utility.impl))
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected_tempita)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        required, = utility.requires
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((required.proto, required.impl))
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.required_tempita)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = self.cls.load(self.name, from_file=self.filename, context=self.context)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        got = strip_2tup((utility.proto, utility.impl))
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEquals(got, self.expected_tempita)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestCythonUtilityLoader(TestTempitaUtilityLoader):
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Test loading CythonUtilityCodes
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Just change the attributes and run the same tests
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected = None, "test {{cy_loader}} impl"
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_tempita = None, "test CyLoader impl"
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    required = None, "req {{cy_loader}} impl"
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    required_tempita = None, "req CyLoader impl"
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    context = dict(cy_loader='CyLoader')
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    name = "TestCyUtilityLoader"
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    filename = "TestCyUtilityLoader.pyx"
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cls = UtilityCode.CythonUtilityCode
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Small hack to pass our tests above
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cls.proto = None
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    test_load = TestUtilityLoader.test_load
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    test_load_tempita = TestTempitaUtilityLoader.test_load
102