| Index: third_party/cython/src/Cython/Compiler/Tests/TestTreePath.py
|
| diff --git a/third_party/cython/src/Cython/Compiler/Tests/TestTreePath.py b/third_party/cython/src/Cython/Compiler/Tests/TestTreePath.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9b8ca38bce4a51dbf9c052e6537391397cfd0ed7
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Cython/Compiler/Tests/TestTreePath.py
|
| @@ -0,0 +1,94 @@
|
| +import unittest
|
| +from Cython.Compiler.Visitor import PrintTree
|
| +from Cython.TestUtils import TransformTest
|
| +from Cython.Compiler.TreePath import find_first, find_all
|
| +from Cython.Compiler import Nodes, ExprNodes
|
| +
|
| +class TestTreePath(TransformTest):
|
| + _tree = None
|
| +
|
| + def _build_tree(self):
|
| + if self._tree is None:
|
| + self._tree = self.run_pipeline([], u"""
|
| + def decorator(fun): # DefNode
|
| + return fun # ReturnStatNode, NameNode
|
| + @decorator # NameNode
|
| + def decorated(): # DefNode
|
| + pass
|
| + """)
|
| + return self._tree
|
| +
|
| + def test_node_path(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(2, len(find_all(t, "//DefNode")))
|
| + self.assertEquals(2, len(find_all(t, "//NameNode")))
|
| + self.assertEquals(1, len(find_all(t, "//ReturnStatNode")))
|
| + self.assertEquals(1, len(find_all(t, "//DefNode//ReturnStatNode")))
|
| +
|
| + def test_node_path_star(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(10, len(find_all(t, "//*")))
|
| + self.assertEquals(8, len(find_all(t, "//DefNode//*")))
|
| + self.assertEquals(0, len(find_all(t, "//NameNode//*")))
|
| +
|
| + def test_node_path_attribute(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(2, len(find_all(t, "//NameNode/@name")))
|
| + self.assertEquals(['fun', 'decorator'], find_all(t, "//NameNode/@name"))
|
| +
|
| + def test_node_path_attribute_dotted(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(1, len(find_all(t, "//ReturnStatNode/@value.name")))
|
| + self.assertEquals(['fun'], find_all(t, "//ReturnStatNode/@value.name"))
|
| +
|
| + def test_node_path_child(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(1, len(find_all(t, "//DefNode/ReturnStatNode/NameNode")))
|
| + self.assertEquals(1, len(find_all(t, "//ReturnStatNode/NameNode")))
|
| +
|
| + def test_node_path_node_predicate(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(0, len(find_all(t, "//DefNode[.//ForInStatNode]")))
|
| + self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode]")))
|
| + self.assertEquals(1, len(find_all(t, "//ReturnStatNode[./NameNode]")))
|
| + self.assertEquals(Nodes.ReturnStatNode,
|
| + type(find_first(t, "//ReturnStatNode[./NameNode]")))
|
| +
|
| + def test_node_path_node_predicate_step(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode]")))
|
| + self.assertEquals(8, len(find_all(t, "//DefNode[.//NameNode]//*")))
|
| + self.assertEquals(1, len(find_all(t, "//DefNode[.//NameNode]//ReturnStatNode")))
|
| + self.assertEquals(Nodes.ReturnStatNode,
|
| + type(find_first(t, "//DefNode[.//NameNode]//ReturnStatNode")))
|
| +
|
| + def test_node_path_attribute_exists(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(2, len(find_all(t, "//NameNode[@name]")))
|
| + self.assertEquals(ExprNodes.NameNode,
|
| + type(find_first(t, "//NameNode[@name]")))
|
| +
|
| + def test_node_path_attribute_exists_not(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(0, len(find_all(t, "//NameNode[not(@name)]")))
|
| + self.assertEquals(2, len(find_all(t, "//NameNode[not(@honking)]")))
|
| +
|
| + def test_node_path_and(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(1, len(find_all(t, "//DefNode[.//ReturnStatNode and .//NameNode]")))
|
| + self.assertEquals(0, len(find_all(t, "//NameNode[@honking and @name]")))
|
| + self.assertEquals(0, len(find_all(t, "//NameNode[@name and @honking]")))
|
| + self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode[@name] and @name]")))
|
| +
|
| + def test_node_path_attribute_string_predicate(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(1, len(find_all(t, "//NameNode[@name = 'decorator']")))
|
| +
|
| + def test_node_path_recursive_predicate(self):
|
| + t = self._build_tree()
|
| + self.assertEquals(2, len(find_all(t, "//DefNode[.//NameNode[@name]]")))
|
| + self.assertEquals(1, len(find_all(t, "//DefNode[.//NameNode[@name = 'decorator']]")))
|
| + self.assertEquals(1, len(find_all(t, "//DefNode[.//ReturnStatNode[./NameNode[@name = 'fun']]/NameNode]")))
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|