Home | History | Annotate | Download | only in Tests
      1 import unittest
      2 from Cython.Compiler.Visitor import PrintTree
      3 from Cython.TestUtils import TransformTest
      4 from Cython.Compiler.TreePath import find_first, find_all
      5 from Cython.Compiler import Nodes, ExprNodes
      6 
      7 class TestTreePath(TransformTest):
      8     _tree = None
      9 
     10     def _build_tree(self):
     11         if self._tree is None:
     12             self._tree = self.run_pipeline([], u"""
     13             def decorator(fun):  # DefNode
     14                 return fun       # ReturnStatNode, NameNode
     15             @decorator           # NameNode
     16             def decorated():     # DefNode
     17                 pass
     18             """)
     19         return self._tree
     20 
     21     def test_node_path(self):
     22         t = self._build_tree()
     23         self.assertEquals(2, len(find_all(t, "//DefNode")))
     24         self.assertEquals(2, len(find_all(t, "//NameNode")))
     25         self.assertEquals(1, len(find_all(t, "//ReturnStatNode")))
     26         self.assertEquals(1, len(find_all(t, "//DefNode//ReturnStatNode")))
     27 
     28     def test_node_path_star(self):
     29         t = self._build_tree()
     30         self.assertEquals(10, len(find_all(t, "//*")))
     31         self.assertEquals(8, len(find_all(t, "//DefNode//*")))
     32         self.assertEquals(0, len(find_all(t, "//NameNode//*")))
     33 
     34     def test_node_path_attribute(self):
     35         t = self._build_tree()
     36         self.assertEquals(2, len(find_all(t, "//NameNode/@name")))
     37         self.assertEquals(['fun', 'decorator'], find_all(t, "//NameNode/@name"))
     38 
     39     def test_node_path_attribute_dotted(self):
     40         t = self._build_tree()
     41         self.assertEquals(1, len(find_all(t, "//ReturnStatNode/@value.name")))
     42         self.assertEquals(['fun'], find_all(t, "//ReturnStatNode/@value.name"))
     43 
     44     def test_node_path_child(self):
     45         t = self._build_tree()
     46         self.assertEquals(1, len(find_all(t, "//DefNode/ReturnStatNode/NameNode")))
     47         self.assertEquals(1, len(find_all(t, "//ReturnStatNode/NameNode")))
     48 
     49     def test_node_path_node_predicate(self):
     50         t = self._build_tree()
     51         self.assertEquals(0, len(find_all(t, "//DefNode[.//ForInStatNode]")))
     52         self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode]")))
     53         self.assertEquals(1, len(find_all(t, "//ReturnStatNode[./NameNode]")))
     54         self.assertEquals(Nodes.ReturnStatNode,
     55                           type(find_first(t, "//ReturnStatNode[./NameNode]")))
     56 
     57     def test_node_path_node_predicate_step(self):
     58         t = self._build_tree()
     59         self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode]")))
     60         self.assertEquals(8, len(find_all(t, "//DefNode[.//NameNode]//*")))
     61         self.assertEquals(1, len(find_all(t, "//DefNode[.//NameNode]//ReturnStatNode")))
     62         self.assertEquals(Nodes.ReturnStatNode,
     63                           type(find_first(t, "//DefNode[.//NameNode]//ReturnStatNode")))
     64 
     65     def test_node_path_attribute_exists(self):
     66         t = self._build_tree()
     67         self.assertEquals(2, len(find_all(t, "//NameNode[@name]")))
     68         self.assertEquals(ExprNodes.NameNode,
     69                           type(find_first(t, "//NameNode[@name]")))
     70 
     71     def test_node_path_attribute_exists_not(self):
     72         t = self._build_tree()
     73         self.assertEquals(0, len(find_all(t, "//NameNode[not(@name)]")))
     74         self.assertEquals(2, len(find_all(t, "//NameNode[not(@honking)]")))
     75 
     76     def test_node_path_and(self):
     77         t = self._build_tree()
     78         self.assertEquals(1, len(find_all(t, "//DefNode[.//ReturnStatNode and .//NameNode]")))
     79         self.assertEquals(0, len(find_all(t, "//NameNode[@honking and @name]")))
     80         self.assertEquals(0, len(find_all(t, "//NameNode[@name and @honking]")))
     81         self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode[@name] and @name]")))
     82 
     83     def test_node_path_attribute_string_predicate(self):
     84         t = self._build_tree()
     85         self.assertEquals(1, len(find_all(t, "//NameNode[@name = 'decorator']")))
     86 
     87     def test_node_path_recursive_predicate(self):
     88         t = self._build_tree()
     89         self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode[@name]]")))
     90         self.assertEquals(1, len(find_all(t, "//DefNode[.//NameNode[@name = 'decorator']]")))
     91         self.assertEquals(1, len(find_all(t, "//DefNode[.//ReturnStatNode[./NameNode[@name = 'fun']]/NameNode]")))
     92 
     93 if __name__ == '__main__':
     94     unittest.main()
     95