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