1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# -*- coding: utf-8 -*-
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport os
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom StringIO import StringIO
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.tree import (CommonTreeNodeStream, CommonTree, CommonTreeAdaptor,
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                         TreeParser, TreeVisitor, TreeIterator)
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3 import CommonToken, UP, DOWN, EOF
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.treewizard import TreeWizard
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeNodeStream(unittest.TestCase):
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the TreeNodeStream class."""
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = CommonTreeAdaptor()
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def newStream(self, t):
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Build new stream; let's us override to test other streams."""
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return CommonTreeNodeStream(t)
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNode(self):
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = self.newStream(t)
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101"
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101"
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTwoChildrenOfNilRoot(self):
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class V(CommonTree):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, token=None, ttype=None, x=None):
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if x is not None:
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.x = x
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ttype is not None and token is None:
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.token = CommonToken(type=ttype)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if token is not None:
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.token = token
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __str__(self):
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if self.token is not None:
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    txt = self.token.text
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else:
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    txt = ""
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                txt += "<V>"
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return txt
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root_0 = self.adaptor.nil();
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = V(ttype=101, x=2)
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        u = V(token=CommonToken(type=102, text="102"))
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.addChild(root_0, t)
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.addChild(root_0, u)
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assert_(root_0.parent is None)
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(-1, root_0.childIndex)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(0, t.childIndex)
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(1, u.childIndex)
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test4Nodes(self):
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) 104)
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(102)))
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.getChild(0).addChild(CommonTree(CommonToken(103)))
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(104)))
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = self.newStream(t)
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 102 103 104"
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 2 102 2 103 3 104 3"
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testList(self):
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root = CommonTree(None)
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(102)))
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.getChild(0).addChild(CommonTree(CommonToken(103)))
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(104)))
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        u = CommonTree(CommonToken(105))
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(t)
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(u)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(root)
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 102 103 104 105"
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 2 102 2 103 3 104 3 105"
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFlatList(self):
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root = CommonTree(None)
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(CommonTree(CommonToken(101)))
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(CommonTree(CommonToken(102)))
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(CommonTree(CommonToken(103)))
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(root)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 102 103"
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 102 103"
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testListWithOneNode(self):
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root = CommonTree(None)
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(CommonTree(CommonToken(101)))
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(root)
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101"
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101"
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testAoverB(self):
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(102)))
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = self.newStream(t)
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 102"
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toNodesOnlyString(stream)
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 2 102 3"
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLT(self):
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) 104)
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(102)))
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.getChild(0).addChild(CommonTree(CommonToken(103)))
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(104)))
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = self.newStream(t)
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(101, stream.LT(1).getType())
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(2).getType())
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(3).getType())
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(4).getType())
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(103, stream.LT(5).getType())
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(6).getType())
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(7).getType())
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(8).getType())
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(9).getType())
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check way ahead
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(100).getType())
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMarkRewindEntire(self):
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        m = stream.mark() # MARK
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for _ in range(13): # consume til end
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.LT(1)
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(-1).getType())  #TODO: remove?
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.rewind(m)      # REWIND
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # consume til end again :)
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for _ in range(13): # consume til end
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.LT(1)
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(-1).getType())  #TODO: remove?
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMarkRewindInMiddle(self):
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for _ in range(7): # consume til middle
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            #System.out.println(tream.LT(1).getType())
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        m = stream.mark() # MARK
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 107
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 104
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.rewind(m)      # REWIND
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(1).getType())
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # now we're past rewind position
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(105, stream.LT(1).getType())
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(-1).getType())
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMarkRewindNested(self):
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        m = stream.mark() # MARK at start
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 101
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        m2 = stream.mark() # MARK on 102
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 106
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.rewind(m2)      # REWIND to 102
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(1).getType())
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stop at 103 and rewind to start
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.rewind(m) # REWIND to 101
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(101, stream.LT(1).getType())
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(1).getType())
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume()
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSeek(self):
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 101
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.seek(7)   # seek to 107
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 107
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(1).getType())
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSeekFromStart(self):
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.seek(7)   # seek to 107
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 107
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume UP
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(1).getType())
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReset(self):
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 7 real + 6 nav nodes
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        v1 = self.toNodesOnlyString(stream) # scan all
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.reset()
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        v2 = self.toNodesOnlyString(stream) # scan all
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(v1, v2)
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testIterator(self):
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = [
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            101, DOWN, 102, DOWN, 103, 106, DOWN, 107, UP, UP, 104, 105, UP]
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = [t.type for t in stream]
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEqual(expecting, found)
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def toNodesOnlyString(self, nodes):
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        buf = []
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for i in range(nodes.size()):
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t = nodes.LT(i+1)
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type = nodes.getTreeAdaptor().getType(t)
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if not (type==DOWN or type==UP):
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                buf.append(str(type))
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ' '.join(buf)
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestCommonTreeNodeStream(unittest.TestCase):
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the CommonTreeNodeStream class."""
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testPushPop(self):
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 9 real + 8 nav nodes
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(104))
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(105)))
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r2)
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3 = CommonTree(CommonToken(106))
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3.addChild(CommonTree(CommonToken(107)))
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r3)
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(108)))
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(109)))
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3"
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = str(stream)
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, found)
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Assume we want to hit node 107 and then "call 102" then return
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf102 = 2
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf107 = 12
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for _ in range(indexOf107):# consume til 107 node
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # CALL 102
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.push(indexOf102)
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(1).getType())
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(103, stream.LT(1).getType())
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # RETURN
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.pop()
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNestedPushPop(self):
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 9 real + 8 nav nodes
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(104))
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(105)))
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r2)
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3 = CommonTree(CommonToken(106))
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3.addChild(CommonTree(CommonToken(107)))
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r3)
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(108)))
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(109)))
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Assume we want to hit node 107 and then "call 102", which
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # calls 104, then return
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf102 = 2
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf107 = 12
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for _ in range(indexOf107): # consume til 107 node
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # CALL 102
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.push(indexOf102)
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(1).getType())
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(103, stream.LT(1).getType())
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # CALL 104
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf104 = 6
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.push(indexOf104)
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(1).getType())
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(105, stream.LT(1).getType())
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # RETURN (to UP node in 102 subtree)
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.pop()
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # RETURN (to empty stack)
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.pop()
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(107, stream.LT(1).getType())
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testPushPopFromEOF(self):
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # stream has 9 real + 8 nav nodes
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(104))
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(105)))
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r2)
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3 = CommonTree(CommonToken(106))
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r3.addChild(CommonTree(CommonToken(107)))
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r3)
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(108)))
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(109)))
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream = CommonTreeNodeStream(r0)
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        while stream.LA(1) != EOF:
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream.consume()
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf102 = 2
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        indexOf104 = 6
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # CALL 102
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.push(indexOf102)
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(102, stream.LT(1).getType())
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(103, stream.LT(1).getType())
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # RETURN (to empty stack)
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.pop()
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # CALL 104
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.push(indexOf104)
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(104, stream.LT(1).getType())
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 102
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(DOWN, stream.LT(1).getType())
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume DN
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(105, stream.LT(1).getType())
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.consume() # consume 103
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(UP, stream.LT(1).getType())
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # RETURN (to empty stack)
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        stream.pop()
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(EOF, stream.LT(1).getType())
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestCommonTree(unittest.TestCase):
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test case for the CommonTree class."""
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setUp(self):
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Setup test fixure"""
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = CommonTreeAdaptor()
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSingleNode(self):
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(t.parent is None)
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, t.childIndex)
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def test4Nodes(self):
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103) 104)
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(102)))
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.getChild(0).addChild(CommonTree(CommonToken(103)))
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(r0.parent is None)
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, r0.childIndex)
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testList(self):
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(nil 101 102 103)
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(None)
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c0=CommonTree(CommonToken(101))
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c0)
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c1=CommonTree(CommonToken(102))
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c1)
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c2=CommonTree(CommonToken(103))
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c2)
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(r0.parent is None)
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, r0.childIndex)
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(r0, c0.parent)
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(0, c0.childIndex)
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(r0, c1.parent)
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(1, c1.childIndex)
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(r0, c2.parent)
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(2, c2.childIndex)
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testList2(self):
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Add child ^(nil 101 102 103) to root 5
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # should pull 101 102 103 directly to become 5's child list
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root = CommonTree(CommonToken(5))
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # child tree
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(None)
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c0=CommonTree(CommonToken(101))
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c0)
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c1=CommonTree(CommonToken(102))
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c1)
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c2=CommonTree(CommonToken(103))
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c2)
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(r0)
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(root.parent is None)
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, root.childIndex)
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check children of root all point at root
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(0, c0.childIndex)
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(1, c1.childIndex)
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(2, c2.childIndex)
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testAddListToExistChildren(self):
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Add child ^(nil 101 102 103) to root ^(5 6)
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # should add 101 102 103 to end of 5's child list
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root = CommonTree(CommonToken(5))
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(CommonTree(CommonToken(6)))
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # child tree
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(None)
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c0=CommonTree(CommonToken(101))
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c0)
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c1=CommonTree(CommonToken(102))
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c1)
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c2=CommonTree(CommonToken(103))
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(c2)
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root.addChild(r0)
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(root.parent is None)
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, root.childIndex)
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check children of root all point at root
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(1, c0.childIndex)
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(2, c1.childIndex)
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(root, c0.parent)
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(3, c2.childIndex)
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDupTree(self):
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(101 ^(102 103 ^(106 107) ) 104 105)
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0 = CommonTree(CommonToken(101))
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1 = CommonTree(CommonToken(102))
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(r1)
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(CommonTree(CommonToken(103)))
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2 = CommonTree(CommonToken(106))
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r2.addChild(CommonTree(CommonToken(107)))
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r1.addChild(r2)
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(104)))
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r0.addChild(CommonTree(CommonToken(105)))
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        dup = self.adaptor.dupTree(r0)
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(dup.parent is None)
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(-1, dup.childIndex)
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        dup.sanityCheckParentAndChildIndexes()
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBecomeRoot(self):
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # 5 becomes root of ^(nil 101 102 103)
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot = CommonTree(CommonToken(5))
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot = CommonTree(None)
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(101)))
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(102)))
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(103)))
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.becomeRoot(newRoot, oldRoot)
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.sanityCheckParentAndChildIndexes()
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBecomeRoot2(self):
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # 5 becomes root of ^(101 102 103)
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot = CommonTree(CommonToken(5))
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot = CommonTree(CommonToken(101))
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(102)))
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(103)))
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.becomeRoot(newRoot, oldRoot)
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.sanityCheckParentAndChildIndexes()
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBecomeRoot3(self):
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(nil 5) becomes root of ^(nil 101 102 103)
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot = CommonTree(None)
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.addChild(CommonTree(CommonToken(5)))
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot = CommonTree(None)
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(101)))
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(102)))
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(103)))
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.becomeRoot(newRoot, oldRoot)
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.sanityCheckParentAndChildIndexes()
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBecomeRoot5(self):
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ^(nil 5) becomes root of ^(101 102 103)
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot = CommonTree(None)
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.addChild(CommonTree(CommonToken(5)))
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot = CommonTree(CommonToken(101))
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(102)))
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRoot.addChild(CommonTree(CommonToken(103)))
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.becomeRoot(newRoot, oldRoot)
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newRoot.sanityCheckParentAndChildIndexes()
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBecomeRoot6(self):
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # emulates construction of ^(5 6)
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root_0 = self.adaptor.nil()
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root_1 = self.adaptor.nil()
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root_1 = self.adaptor.becomeRoot(CommonTree(CommonToken(5)), root_1)
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.addChild(root_1, CommonTree(CommonToken(6)))
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.addChild(root_0, root_1)
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        root_0.sanityCheckParentAndChildIndexes()
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # Test replaceChildren
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceWithNoChildren(self):
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(101))
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(5))
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        error = False
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        	t.replaceChildren(0, 0, newChild)
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except IndexError:
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        	error = True
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless(error)
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceWithOneChildren(self):
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # assume token type 99 and use text
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        c0 = CommonTree(CommonToken(99, text="b"))
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(c0)
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="c"))
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 0, newChild)
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a c)"
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceInMiddle(self):
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c"))) # index 1
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(1, 1, newChild)
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a b x d)"
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceAtLeft(self):
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b"))) # index 0
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 0, newChild)
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a x c d)"
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceAtRight(self):
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d"))) # index 2
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(2, 2, newChild)
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a b c x)"
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceOneWithTwoAtLeft(self):
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren = self.adaptor.nil()
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 0, newChildren)
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a x y c d)"
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceOneWithTwoAtRight(self):
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren = self.adaptor.nil()
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(2, 2, newChildren)
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a b c x y)"
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceOneWithTwoInMiddle(self):
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren = self.adaptor.nil()
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(1, 1, newChildren)
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a b x y d)"
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceTwoWithOneAtLeft(self):
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 1, newChild)
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a x d)"
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceTwoWithOneAtRight(self):
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(1, 2, newChild)
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a b x)"
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceAllWithOne(self):
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChild = CommonTree(CommonToken(99, text="x"))
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 2, newChild)
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a x)"
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReplaceAllWithTwo(self):
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = CommonTree(CommonToken(99, text="a"))
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="b")))
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="c")))
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.addChild(CommonTree(CommonToken(99, text="d")))
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren = self.adaptor.nil()
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.replaceChildren(0, 2, newChildren)
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "(a x y)"
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual(expecting, t.toStringTree())
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.sanityCheckParentAndChildIndexes()
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeContext(unittest.TestCase):
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test the TreeParser.inContext() method"""
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokenNames = [
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSimpleParent(self):
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNoParent(self):
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3])))"
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(%x:PRINT (MULT ID (VEC INT INT INT)))",
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = False
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testParentWithWildcard(self):
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardAtStartIgnored(self):
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "...VEC")
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardInBetween(self):
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT...VEC")
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLotsOfWildcards(self):
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "... PRINT ... VEC ...")
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDeep(self):
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDeepAndFindRoot(self):
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ...")
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDeepAndFindRoot2(self):
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ... VEC ...")
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testChain(self):
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = True
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT MULT VEC MULT")
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## TEST INVALID CONTEXTS
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotParent(self):
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = False
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMismatch(self):
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = False
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ## missing MULT
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC MULT")
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMismatch2(self):
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = False
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC ...")
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMismatch3(self):
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = False
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ... VEC MULT")
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDoubleEtc(self):
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ... ... VEC")
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            expecting = "invalid syntax: ... ..."
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            found = str(exc)
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.assertEquals(expecting, found)
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testDotDot(self):
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        labels = {}
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        valid = wiz.parse(
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t,
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            labels)
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertTrue(valid)
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = labels.get("x")
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT .. VEC")
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.fail()
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ValueError, exc:
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            expecting = "invalid syntax: .."
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            found = str(exc)
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.assertEquals(expecting, found)
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeVisitor(unittest.TestCase):
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Test of the TreeVisitor class."""
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokenNames = [
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ]
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTreeVisitor(self):
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokenNames)
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create(tree)
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = []
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def pre(t):
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            found.append("pre(%s)" % t)
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return t
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def post(t):
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            found.append("post(%s)" % t)
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return t
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        visitor = TreeVisitor(adaptor)
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        visitor.visit(t, pre, post)
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = [ "pre(PRINT)", "pre(MULT)", "pre(x)", "post(x)",
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      "pre(VEC)", "pre(MULT)", "pre(9)", "post(9)", "pre(1)",
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      "post(1)", "post(MULT)", "pre(2)", "post(2)", "pre(3)",
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      "post(3)", "post(VEC)", "post(MULT)", "post(PRINT)" ]
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeIterator(unittest.TestCase):
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = [
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "<invalid>", "<EOR>", "<DOWN>", "<UP>",
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "A", "B", "C", "D", "E", "F", "G" ]
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNode(self):
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("A")
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A EOF"
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFlatAB(self):
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(nil A B)")
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "nil DOWN A B UP EOF"
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testAB(self):
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B)")
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B UP EOF"
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testABC(self):
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A B C)")
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B C UP EOF"
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testVerticalList(self):
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A (B C))")
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B DOWN C UP UP EOF"
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testComplex(self):
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A (B (C D E) F) G)")
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReset(self):
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        adaptor = CommonTreeAdaptor()
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        wiz = TreeWizard(adaptor, self.tokens)
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = wiz.create("(A (B (C D E) F) G)")
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it = TreeIterator(t)
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        it.reset()
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.toString(it)
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def toString(self, it):
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        buf = []
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for n in it:
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf.append(str(n))
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ' '.join(buf)
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == "__main__":
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
1352