Example #1
0
 def testNoRepeatsIndex(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     tree = wiz.create("(A B C D)")
     indexMap = wiz.index(tree)
     found = self.__simplifyIndexMap(indexMap)
     expecting = { 8:['D'], 6:['B'], 7:['C'], 5:['A'] }
     self.assertEqual(expecting, found)
 def testRepeatsIndex(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     tree = wiz.create("(A B (A C B) B D D)")
     indexMap = wiz.index(tree)
     found = self.__simplifyIndexMap(indexMap)
     expecting = { 8: ['D', 'D'], 6: ['B', 'B', 'B'], 7: ['C'], 5: ['A', 'A'] }
     self.failUnlessEqual(expecting, found)
 def testParseWithText2(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B[T__32] (C (D E[a])))")
     # C pattern has no text arg so despite [bar] in t, no need
     # to match text--check structure only.
     valid = wiz.parse(t, "(A B[foo] C)")
     self.assertEquals("(A T__32 (C (D a)))", t.toStringTree())
 def testParseWithText(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B[foo] C[bar])")
     # C pattern has no text arg so despite [bar] in t, no need
     # to match text--check structure only.
     valid = wiz.parse(t, "(A B[foo] C)")
     self.failUnless(valid)
Example #5
0
 def testFindPattern(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
     subtrees = wiz.find(t, "(A B)")
     found = [str(node) for node in subtrees]
     expecting = ['foo', 'big']
     self.assertEqual(expecting, found)
 def testFindTokenType(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
     subtrees = wiz.find(t, wiz.getTokenType('A'))
     found = [str(node) for node in subtrees]
     expecting = ['A', 'foo', 'big']
     self.failUnlessEqual(expecting, found)
Example #7
0
    def testTreeVisitor(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        found = []

        def pre(t):
            found.append("pre({})".format(t))
            return t

        def post(t):
            found.append("post({})".format(t))
            return t

        visitor = TreeVisitor(adaptor)
        visitor.visit(t, pre, post)

        expecting = [
            "pre(PRINT)", "pre(MULT)", "pre(x)", "post(x)", "pre(VEC)",
            "pre(MULT)", "pre(9)", "post(9)", "pre(1)", "post(1)",
            "post(MULT)", "pre(2)", "post(2)", "pre(3)", "post(3)",
            "post(VEC)", "post(MULT)", "post(PRINT)"
        ]

        self.assertEqual(expecting, found)
Example #8
0
 def testNoRepeatsIndex(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     tree = wiz.create("(A B C D)")
     indexMap = wiz.index(tree)
     found = self.__simplifyIndexMap(indexMap)
     expecting = {8: ['D'], 6: ['B'], 7: ['C'], 5: ['A']}
     self.assertEqual(expecting, found)
Example #9
0
 def testFindPattern(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")
     subtrees = wiz.find(t, "(A B)")
     found = [str(node) for node in subtrees]
     expecting = ['foo', 'big']
     self.assertEqual(expecting, found)
 def testSingleNodeIndex(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     tree = wiz.create("ID")
     indexMap = wiz.index(tree)
     found = self.__simplifyIndexMap(indexMap)
     expecting = { 10: ["ID"] }
     self.failUnlessEqual(expecting, found)
Example #11
0
 def testVerticalList(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A (B C))")
     it = TreeIterator(t)
     expecting = "A DOWN B DOWN C UP UP EOF"
     found = self.toString(it)
     self.assertEquals(expecting, found)
Example #12
0
 def testComplex(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A (B (C D E) F) G)")
     it = TreeIterator(t)
     expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
     found = self.toString(it)
     self.assertEquals(expecting, found)
Example #13
0
 def testVerticalList(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A (B C))")
     it = TreeIterator(t)
     expecting = "A DOWN B DOWN C UP UP EOF"
     found = self.toString(it)
     self.assertEqual(expecting, found)
Example #14
0
 def testFlatAB(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(nil A B)")
     it = TreeIterator(t)
     expecting = "nil DOWN A B UP EOF"
     found = self.toString(it)
     self.assertEqual(expecting, found)
Example #15
0
 def testABC(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A B C)")
     it = TreeIterator(t)
     expecting = "A DOWN B C UP EOF"
     found = self.toString(it)
     self.assertEqual(expecting, found)
 def testParseWithWildcardLabels(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C)")
     labels = {}
     valid = wiz.parse(t, "(A %b:. %c:.)", labels)
     self.failUnless(valid)
     self.failUnlessEqual("B", str(labels["b"]))
     self.failUnlessEqual("C", str(labels["c"]))
Example #17
0
 def testComplex(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A (B (C D E) F) G)")
     it = TreeIterator(t)
     expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
     found = self.toString(it)
     self.assertEqual(expecting, found)
Example #18
0
 def testABC(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(A B C)")
     it = TreeIterator(t)
     expecting = "A DOWN B C UP EOF"
     found = self.toString(it)
     self.assertEquals(expecting, found)
Example #19
0
 def testFlatAB(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("(nil A B)")
     it = TreeIterator(t)
     expecting = "nil DOWN A B UP EOF"
     found = self.toString(it)
     self.assertEquals(expecting, found)
Example #20
0
 def testNode(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("A")
     it = TreeIterator(t)
     expecting = "A EOF"
     found = self.toString(it)
     self.assertEquals(expecting, found)
Example #21
0
 def testNode(self):
     adaptor = CommonTreeAdaptor()
     wiz = TreeWizard(adaptor, self.tokens)
     t = wiz.create("A")
     it = TreeIterator(t)
     expecting = "A EOF"
     found = self.toString(it)
     self.assertEqual(expecting, found)
Example #22
0
 def testParseLabels(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C)")
     labels = {}
     valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels)
     self.assertTrue(valid)
     self.assertEqual("A", str(labels["a"]))
     self.assertEqual("B", str(labels["b"]))
     self.assertEqual("C", str(labels["c"]))
Example #23
0
 def testParseLabels(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B C)")
     labels = {}
     valid = wiz.parse(t, "(%a:A %b:B %c:C)", labels)
     self.assertTrue(valid)
     self.assertEqual("A", str(labels["a"]))
     self.assertEqual("B", str(labels["b"]))
     self.assertEqual("C", str(labels["c"]))
 def testParseLabelsAndTestText(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A B[foo] C)")
     labels = {}
     valid = wiz.parse(t, "(%a:A %b:B[foo] %c:C)", labels)
     self.failUnless(valid)
     self.failUnlessEqual("A", str(labels["a"]))
     self.failUnlessEqual("foo", str(labels["b"]))
     self.failUnlessEqual("C", str(labels["c"]))
    def testGetTokenType(self):
        """TreeWizard.getTokenType()"""

        wiz = TreeWizard(self.adaptor, tokenNames=self.tokens)

        self.failUnlessEqual(wiz.getTokenType('A'), 5)

        self.failUnlessEqual(wiz.getTokenType('VAR'), 11)

        self.failUnlessEqual(wiz.getTokenType('invalid'), INVALID_TOKEN_TYPE)
 def testParseLabelsInNestedTree(self):
     wiz = TreeWizard(self.adaptor, self.tokens)
     t = wiz.create("(A (B C) (D E))")
     labels = {}
     valid = wiz.parse(t, "(%a:A (%b:B %c:C) (%d:D %e:E) )", labels)
     self.failUnless(valid)
     self.failUnlessEqual("A", str(labels["a"]))
     self.failUnlessEqual("B", str(labels["b"]))
     self.failUnlessEqual("C", str(labels["c"]))
     self.failUnlessEqual("D", str(labels["d"]))
     self.failUnlessEqual("E", str(labels["e"]))
    def testRepeatsVisit2(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B (A C B) B D D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(str(node))

        wiz.visit(tree, wiz.getTokenType("A"), visitor)

        expecting = ['A', 'A']
        self.failUnlessEqual(expecting, elements)
Example #28
0
    def testNoRepeatsVisit(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(str(node))

        wiz.visit(tree, wiz.getTokenType("B"), visitor)

        expecting = ['B']
        self.assertEqual(expecting, elements)
    def testRepeatsVisitWithContext(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B (A C B) B D D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append('%s@%s[%d]' % (node, parent, childIndex))

        wiz.visit(tree, wiz.getTokenType("B"), visitor)

        expecting = ['B@A[0]', 'B@A[1]', 'B@A[2]']
        self.failUnlessEqual(expecting, elements)
    def testVisitPattern(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A B) D)")

        elements = []

        def visitor(node, parent, childIndex, labels):
            elements.append(str(node))

        wiz.visit(tree, '(A B)', visitor)

        expecting = ['A']  # shouldn't match overall root, just (A B)
        self.failUnlessEqual(expecting, elements)
Example #31
0
    def testLotsOfWildcards(self):
        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t, "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))", labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = True
        found = TreeParser._inContext(adaptor, self.tokenNames, node, "... PRINT ... VEC ...")
        self.assertEquals(expecting, found)
Example #32
0
    def testVisitPatternMultiple(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A B) (D (A B)))")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                '{}@{}[{}]'.format(node, parent or 'nil', childIndex)
                )

        wiz.visit(tree, '(A B)', visitor)

        expecting = ['A@A[2]', 'A@D[0]']
        self.assertEqual(expecting, elements)
Example #33
0
    def testNoParent(self):
        tree = "(PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t, "(%x:PRINT (MULT ID (VEC INT INT INT)))", labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = False
        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
        self.assertEqual(expecting, found)
Example #34
0
    def testVisitPatternMultiple(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A B) (D (A B)))")

        elements = []

        def visitor(node, parent, childIndex, labels):
            elements.append('{}@{}[{}]'.format(node, parent or 'nil',
                                               childIndex))

        wiz.visit(tree, '(A B)', visitor)

        expecting = ['A@A[2]', 'A@D[0]']
        self.assertEqual(expecting, elements)
    def testVisitPattern(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A B) D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                str(node)
                )

        wiz.visit(tree, '(A B)', visitor)

        expecting = ['A'] # shouldn't match overall root, just (A B)
        self.failUnlessEqual(expecting, elements)
Example #36
0
    def testNotParent(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t, "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))", labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = False
        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
        self.assertEquals(expecting, found)
Example #37
0
    def testRepeatsVisitWithNullParentAndContext(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B (A C B) B D D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                '{}@{}[{}]'.format(
                    node, parent or 'nil', childIndex)
                )

        wiz.visit(tree, wiz.getTokenType("A"), visitor)

        expecting = ['A@nil[0]', 'A@A[1]']
        self.assertEqual(expecting, elements)
    def testRepeatsVisitWithNullParentAndContext(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B (A C B) B D D)")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                '%s@%s[%d]'
                % (node, ['nil', parent][parent is not None], childIndex)
                )

        wiz.visit(tree, wiz.getTokenType("A"), visitor)

        expecting = ['A@nil[0]', 'A@A[1]']
        self.failUnlessEqual(expecting, elements)
    def testVisitPatternMultiple(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A B) (D (A B)))")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                '%s@%s[%d]'
                % (node, ['nil', parent][parent is not None], childIndex)
                )

        wiz.visit(tree, '(A B)', visitor)

        expecting = ['A@A[2]', 'A@D[0]']
        self.failUnlessEqual(expecting, elements)
Example #40
0
    def testDotDot(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t,
                          "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
                          labels)
        self.assertTrue(valid)
        node = labels.get("x")

        self.assertRaisesRegex(ValueError, r'invalid syntax: \.\.',
                               TreeParser._inContext, adaptor, self.tokenNames,
                               node, "PRINT .. VEC")
    def testInit(self):
        """TreeWizard.__init__()"""

        wiz = TreeWizard(self.adaptor, tokenNames=['a', 'b'])

        self.failUnless(wiz.adaptor is self.adaptor)
        self.failUnlessEqual(wiz.tokenNameToTypeMap, {'a': 0, 'b': 1})
Example #42
0
    def testDotDot(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(
            t,
            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
            labels)
        self.assertTrue(valid)
        node = labels.get("x")

        self.assertRaisesRegex(
            ValueError, r'invalid syntax: \.\.',
            TreeParser._inContext, adaptor, self.tokenNames, node, "PRINT .. VEC")
Example #43
0
    def testDeepAndFindRoot(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t,
                          "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
                          labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = True
        found = TreeParser._inContext(adaptor, self.tokenNames, node,
                                      "PRINT ...")
        self.assertEqual(expecting, found)
Example #44
0
    def testWildcardAtStartIgnored(self):
        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(
            t,
            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
            labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = True
        found = TreeParser._inContext(adaptor, self.tokenNames, node, "...VEC")
        self.assertEqual(expecting, found)
Example #45
0
    def testDotDot(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t, "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))", labels)
        self.assertTrue(valid)
        node = labels.get("x")

        try:
            TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT .. VEC")
            self.fail()
        except ValueError, exc:
            expecting = "invalid syntax: .."
            found = str(exc)
            self.assertEquals(expecting, found)
Example #46
0
    def testMismatch(self):
        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
        adaptor = CommonTreeAdaptor()
        wiz = TreeWizard(adaptor, self.tokenNames)
        t = wiz.create(tree)

        labels = {}
        valid = wiz.parse(t,
                          "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
                          labels)
        self.assertTrue(valid)
        node = labels.get("x")

        expecting = False
        ## missing MULT
        found = TreeParser._inContext(adaptor, self.tokenNames, node,
                                      "PRINT VEC MULT")
        self.assertEquals(expecting, found)
class TestToDOT(unittest.TestCase):
    """Test case for the toDOT function."""

    def setUp(self):
        self.adaptor = CommonTreeAdaptor()
        self.tokens = [
            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
            ]
        self.wiz = TreeWizard(self.adaptor, self.tokens)


    def testNone(self):
        """toDOT()"""

        treeST = stringtemplate3.StringTemplate(
            template=(
            "digraph {\n" +
            "  $nodes$\n" +
            "  $edges$\n" +
            "}\n")
            )

        edgeST = stringtemplate3.StringTemplate(
            template="$parent$ -> $child$\n"
            )

        tree = self.wiz.create("(A B (B C C) (B (C D D)))")
        st = toDOT(tree, self.adaptor, treeST, edgeST)

        result = st.toString()
        expected = textwrap.dedent(
            '''\
            digraph {
              n0 [label="A"];
              n1 [label="B"];
              n2 [label="B"];
              n3 [label="C"];
              n4 [label="C"];
              n5 [label="B"];
              n6 [label="C"];
              n7 [label="D"];
              n8 [label="D"];

              n0 -> n1
              n0 -> n2
              n2 -> n3
              n2 -> n4
              n0 -> n5
              n5 -> n6
              n6 -> n7
              n6 -> n8

            }
            '''
            )
        self.assertEqual(result, expected)
class TestToDOT(unittest.TestCase):
    """Test case for the toDOT function."""

    def setUp(self):
        self.adaptor = CommonTreeAdaptor()
        self.tokens = [
            "", "", "", "", "", "A", "B", "C", "D", "E", "ID", "VAR"
            ]
        self.wiz = TreeWizard(self.adaptor, self.tokens)


    def testNone(self):
        """toDOT()"""

        treeST = stringtemplate3.StringTemplate(
            template=(
            "digraph {\n" +
            "  $nodes$\n" +
            "  $edges$\n" +
            "}\n")
            )

        edgeST = stringtemplate3.StringTemplate(
            template="$parent$ -> $child$\n"
            )

        tree = self.wiz.create("(A B (B C C) (B (C D D)))")
        st = toDOT(tree, self.adaptor, treeST, edgeST)

        result = st.toString()
        expected = textwrap.dedent(
            '''\
            digraph {
              n0 [label="A"];
              n1 [label="B"];
              n2 [label="B"];
              n3 [label="C"];
              n4 [label="C"];
              n5 [label="B"];
              n6 [label="C"];
              n7 [label="D"];
              n8 [label="D"];

              n0 -> n1
              n0 -> n2
              n2 -> n3
              n2 -> n4
              n0 -> n5
              n5 -> n6
              n6 -> n7
              n6 -> n8

            }
            '''
            )
        self.assertEqual(result, expected)
Example #49
0
    def testVisitPatternMultipleWithLabels(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")

        elements = []

        def visitor(node, parent, childIndex, labels):
            elements.append('{}@{}[{}]{}&{}'.format(
                node,
                parent or 'nil',
                childIndex,
                labels['a'],
                labels['b'],
            ))

        wiz.visit(tree, '(%a:A %b:B)', visitor)

        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
        self.assertEqual(expecting, elements)
    def testVisitPatternMultipleWithLabels(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")

        elements = []

        def visitor(node, parent, childIndex, labels):
            elements.append('%s@%s[%d]%s&%s' % (
                node,
                ['nil', parent][parent is not None],
                childIndex,
                labels['a'],
                labels['b'],
            ))

        wiz.visit(tree, '(%a:A %b:B)', visitor)

        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
        self.failUnlessEqual(expecting, elements)
    def testVisitPatternMultipleWithLabels(self):
        wiz = TreeWizard(self.adaptor, self.tokens)
        tree = wiz.create("(A B C (A[foo] B[bar]) (D (A[big] B[dog])))")

        elements = []
        def visitor(node, parent, childIndex, labels):
            elements.append(
                '%s@%s[%d]%s&%s'
                % (node,
                   ['nil', parent][parent is not None],
                   childIndex,
                   labels['a'],
                   labels['b'],
                   )
                )

        wiz.visit(tree, '(%a:A %b:B)', visitor)

        expecting = ['foo@A[2]foo&bar', 'big@D[0]big&dog']
        self.failUnlessEqual(expecting, elements)