15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import os
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler import CmdLine
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.TestUtils import TransformTest
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.ParseTreeTransforms import *
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler.Nodes import *
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Cython.Compiler import Main, Symtab
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestNormalizeTree(TransformTest):
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_parserbehaviour_is_what_we_coded_for(self):
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.fragment(u"if x: y").root
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertLines(u"""
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(root): StatListNode
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[0]: IfStatNode
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if_clauses[0]: IfClauseNode
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      condition: NameNode
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      body: ExprStatNode
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        expr: NameNode
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""", self.treetypes(t))
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_wrap_singlestat(self):
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([NormalizeTree(None)], u"if x: y")
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertLines(u"""
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(root): StatListNode
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[0]: IfStatNode
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if_clauses[0]: IfClauseNode
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      condition: NameNode
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      body: StatListNode
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        stats[0]: ExprStatNode
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          expr: NameNode
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""", self.treetypes(t))
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_wrap_multistat(self):
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([NormalizeTree(None)], u"""
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if z:
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                x
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                y
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertLines(u"""
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(root): StatListNode
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[0]: IfStatNode
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if_clauses[0]: IfClauseNode
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      condition: NameNode
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      body: StatListNode
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        stats[0]: ExprStatNode
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          expr: NameNode
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        stats[1]: ExprStatNode
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          expr: NameNode
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""", self.treetypes(t))
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_statinexpr(self):
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([NormalizeTree(None)], u"""
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            a, b = x, y
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertLines(u"""
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(root): StatListNode
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[0]: SingleAssignmentNode
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    lhs: TupleNode
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      args[0]: NameNode
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      args[1]: NameNode
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    rhs: TupleNode
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      args[0]: NameNode
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      args[1]: NameNode
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""", self.treetypes(t))
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_wrap_offagain(self):
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([NormalizeTree(None)], u"""
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            x
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            y
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if z:
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                x
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertLines(u"""
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(root): StatListNode
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[0]: ExprStatNode
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expr: NameNode
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[1]: ExprStatNode
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expr: NameNode
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stats[2]: IfStatNode
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if_clauses[0]: IfClauseNode
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      condition: NameNode
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      body: StatListNode
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        stats[0]: ExprStatNode
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          expr: NameNode
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)""", self.treetypes(t))
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_pass_eliminated(self):
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([NormalizeTree(None)], u"pass")
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assert_(len(t.stats) == 0)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestWithTransform(object): # (TransformTest): # Disabled!
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_simplified(self):
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([WithTransform(None)], u"""
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        with x:
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            y = z ** 3
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertCode(u"""
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_0 = x
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_2 = $0_0.__exit__
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_0.__enter__()
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_1 = True
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        try:
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            try:
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $1_0 = None
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                y = z ** 3
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            except:
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $0_1 = False
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                if (not $0_2($1_0)):
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    raise
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        finally:
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if $0_1:
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $0_2(None, None, None)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """, t)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_basic(self):
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        t = self.run_pipeline([WithTransform(None)], u"""
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        with x as y:
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            y = z ** 3
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertCode(u"""
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_0 = x
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_2 = $0_0.__exit__
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_3 = $0_0.__enter__()
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $0_1 = True
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        try:
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            try:
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $1_0 = None
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                y = $0_3
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                y = z ** 3
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            except:
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $0_1 = False
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                if (not $0_2($1_0)):
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    raise
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        finally:
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if $0_1:
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                $0_2(None, None, None)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """, t)
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestInterpretCompilerDirectives(TransformTest):
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    This class tests the parallel directives AST-rewriting and importing.
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Test the parallel directives (c)importing
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    import_code = u"""
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        cimport cython.parallel
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        cimport cython.parallel as par
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        from cython cimport parallel as par2
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        from cython cimport parallel
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        from cython.parallel cimport threadid as tid
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        from cython.parallel cimport threadavailable as tavail
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        from cython.parallel cimport prange
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    """
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    expected_directives_dict = {
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u'cython.parallel': u'cython.parallel',
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u'par': u'cython.parallel',
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u'par2': u'cython.parallel',
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u'parallel': u'cython.parallel',
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u"tid": u"cython.parallel.threadid",
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u"tavail": u"cython.parallel.threadavailable",
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        u"prange": u"cython.parallel.prange",
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def setUp(self):
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        super(TestInterpretCompilerDirectives, self).setUp()
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        compilation_options = Main.CompilationOptions(Main.default_options)
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ctx = compilation_options.create_context()
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        transform = InterpretCompilerDirectives(ctx, ctx.compiler_directives)
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        transform.module_scope = Symtab.ModuleScope('__main__', None, ctx)
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.pipeline = [transform]
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.debug_exception_on_error = DebugFlags.debug_exception_on_error
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def tearDown(self):
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        DebugFlags.debug_exception_on_error = self.debug_exception_on_error
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_parallel_directives_cimports(self):
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.run_pipeline(self.pipeline, self.import_code)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        parallel_directives = self.pipeline[0].parallel_directives
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEqual(parallel_directives, self.expected_directives_dict)
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_parallel_directives_imports(self):
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.run_pipeline(self.pipeline,
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          self.import_code.replace(u'cimport', u'import'))
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        parallel_directives = self.pipeline[0].parallel_directives
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.assertEqual(parallel_directives, self.expected_directives_dict)
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# TODO: Re-enable once they're more robust.
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if sys.version_info[:2] >= (2, 5) and False:
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    from Cython.Debugger import DebugWriter
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    from Cython.Debugger.Tests.TestLibCython import DebuggerTestCase
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)else:
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # skip test, don't let it inherit unittest.TestCase
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DebuggerTestCase = object
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestDebugTransform(DebuggerTestCase):
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def elem_hasattrs(self, elem, attrs):
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        # we shall supporteth python 2.3 !
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return all([attr in elem.attrib for attr in attrs])
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def test_debug_info(self):
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        try:
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert os.path.exists(self.debug_dest)
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            t = DebugWriter.etree.parse(self.debug_dest)
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # the xpath of the standard ElementTree is primitive, don't use
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # anything fancy
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            L = list(t.find('/Module/Globals'))
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # assertTrue is retarded, use the normal assert statement
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert L
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            xml_globals = dict(
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            [(e.attrib['name'], e.attrib['type']) for e in L])
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(len(L), len(xml_globals))
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            L = list(t.find('/Module/Functions'))
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert L
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            xml_funcs = dict([(e.attrib['qualified_name'], e) for e in L])
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(len(L), len(xml_funcs))
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # test globals
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual('CObject', xml_globals.get('c_var'))
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual('PythonObject', xml_globals.get('python_var'))
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # test functions
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            funcnames = ('codefile.spam', 'codefile.ham', 'codefile.eggs',
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         'codefile.closure', 'codefile.inner')
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            required_xml_attrs = 'name', 'cname', 'qualified_name'
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert all([f in xml_funcs for f in funcnames])
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            spam, ham, eggs = [xml_funcs[funcname] for funcname in funcnames]
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(spam.attrib['name'], 'spam')
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertNotEqual('spam', spam.attrib['cname'])
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert self.elem_hasattrs(spam, required_xml_attrs)
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # test locals of functions
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            spam_locals = list(spam.find('Locals'))
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert spam_locals
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            spam_locals.sort(key=lambda e: e.attrib['name'])
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            names = [e.attrib['name'] for e in spam_locals]
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(list('abcd'), names)
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert self.elem_hasattrs(spam_locals[0], required_xml_attrs)
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # test arguments of functions
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            spam_arguments = list(spam.find('Arguments'))
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert spam_arguments
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(1, len(list(spam_arguments)))
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # test step-into functions
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            step_into = spam.find('StepIntoFunctions')
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            spam_stepinto = [x.attrib['name'] for x in step_into]
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert spam_stepinto
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.assertEqual(2, len(spam_stepinto))
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert 'puts' in spam_stepinto
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            assert 'some_c_function' in spam_stepinto
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        except:
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            f = open(self.debug_dest)
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            try:
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                print(f.read())
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            finally:
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                f.close()
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            raise
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if __name__ == "__main__":
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    import unittest
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    unittest.main()
286