TestTreePath.py 4.14 KB
Newer Older
1 2 3 4
import unittest
from Cython.Compiler.Visitor import PrintTree
from Cython.TestUtils import TransformTest
from Cython.Compiler.TreePath import find_first, find_all
5
from Cython.Compiler import Nodes, ExprNodes
6 7

class TestTreePath(TransformTest):
Stefan Behnel's avatar
Stefan Behnel committed
8 9 10 11 12 13 14 15 16 17 18 19
    _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
20 21

    def test_node_path(self):
Stefan Behnel's avatar
Stefan Behnel committed
22
        t = self._build_tree()
23 24 25 26
        self.assertEqual(2, len(find_all(t, "//DefNode")))
        self.assertEqual(2, len(find_all(t, "//NameNode")))
        self.assertEqual(1, len(find_all(t, "//ReturnStatNode")))
        self.assertEqual(1, len(find_all(t, "//DefNode//ReturnStatNode")))
27

28 29
    def test_node_path_star(self):
        t = self._build_tree()
30 31 32
        self.assertEqual(10, len(find_all(t, "//*")))
        self.assertEqual(8, len(find_all(t, "//DefNode//*")))
        self.assertEqual(0, len(find_all(t, "//NameNode//*")))
33

34 35
    def test_node_path_attribute(self):
        t = self._build_tree()
36 37
        self.assertEqual(2, len(find_all(t, "//NameNode/@name")))
        self.assertEqual(['fun', 'decorator'], find_all(t, "//NameNode/@name"))
38

39 40
    def test_node_path_attribute_dotted(self):
        t = self._build_tree()
41 42
        self.assertEqual(1, len(find_all(t, "//ReturnStatNode/@value.name")))
        self.assertEqual(['fun'], find_all(t, "//ReturnStatNode/@value.name"))
43

44
    def test_node_path_child(self):
Stefan Behnel's avatar
Stefan Behnel committed
45
        t = self._build_tree()
46 47
        self.assertEqual(1, len(find_all(t, "//DefNode/ReturnStatNode/NameNode")))
        self.assertEqual(1, len(find_all(t, "//ReturnStatNode/NameNode")))
48

49 50
    def test_node_path_node_predicate(self):
        t = self._build_tree()
51 52 53 54 55
        self.assertEqual(0, len(find_all(t, "//DefNode[.//ForInStatNode]")))
        self.assertEqual(2, len(find_all(t, "//DefNode[.//NameNode]")))
        self.assertEqual(1, len(find_all(t, "//ReturnStatNode[./NameNode]")))
        self.assertEqual(Nodes.ReturnStatNode,
                         type(find_first(t, "//ReturnStatNode[./NameNode]")))
56 57 58

    def test_node_path_node_predicate_step(self):
        t = self._build_tree()
59 60 61 62 63
        self.assertEqual(2, len(find_all(t, "//DefNode[.//NameNode]")))
        self.assertEqual(8, len(find_all(t, "//DefNode[.//NameNode]//*")))
        self.assertEqual(1, len(find_all(t, "//DefNode[.//NameNode]//ReturnStatNode")))
        self.assertEqual(Nodes.ReturnStatNode,
                         type(find_first(t, "//DefNode[.//NameNode]//ReturnStatNode")))
64

65
    def test_node_path_attribute_exists(self):
Stefan Behnel's avatar
Stefan Behnel committed
66
        t = self._build_tree()
67 68 69
        self.assertEqual(2, len(find_all(t, "//NameNode[@name]")))
        self.assertEqual(ExprNodes.NameNode,
                         type(find_first(t, "//NameNode[@name]")))
70

71 72
    def test_node_path_attribute_exists_not(self):
        t = self._build_tree()
73 74
        self.assertEqual(0, len(find_all(t, "//NameNode[not(@name)]")))
        self.assertEqual(2, len(find_all(t, "//NameNode[not(@honking)]")))
75

76 77
    def test_node_path_and(self):
        t = self._build_tree()
78 79 80 81
        self.assertEqual(1, len(find_all(t, "//DefNode[.//ReturnStatNode and .//NameNode]")))
        self.assertEqual(0, len(find_all(t, "//NameNode[@honking and @name]")))
        self.assertEqual(0, len(find_all(t, "//NameNode[@name and @honking]")))
        self.assertEqual(2, len(find_all(t, "//DefNode[.//NameNode[@name] and @name]")))
82

83
    def test_node_path_attribute_string_predicate(self):
Stefan Behnel's avatar
Stefan Behnel committed
84
        t = self._build_tree()
85
        self.assertEqual(1, len(find_all(t, "//NameNode[@name = 'decorator']")))
86

87 88
    def test_node_path_recursive_predicate(self):
        t = self._build_tree()
89 90 91
        self.assertEqual(2, len(find_all(t, "//DefNode[.//NameNode[@name]]")))
        self.assertEqual(1, len(find_all(t, "//DefNode[.//NameNode[@name = 'decorator']]")))
        self.assertEqual(1, len(find_all(t, "//DefNode[.//ReturnStatNode[./NameNode[@name = 'fun']]/NameNode]")))
92

93 94
if __name__ == '__main__':
    unittest.main()