xref: /aosp_15_r20/external/antlr/runtime/Python/unittests/testtree.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot# -*- coding: utf-8 -*-
2*16467b97STreehugger Robot
3*16467b97STreehugger Robotimport os
4*16467b97STreehugger Robotimport unittest
5*16467b97STreehugger Robotfrom StringIO import StringIO
6*16467b97STreehugger Robot
7*16467b97STreehugger Robotfrom antlr3.tree import (CommonTreeNodeStream, CommonTree, CommonTreeAdaptor,
8*16467b97STreehugger Robot                         TreeParser, TreeVisitor, TreeIterator)
9*16467b97STreehugger Robotfrom antlr3 import CommonToken, UP, DOWN, EOF
10*16467b97STreehugger Robotfrom antlr3.treewizard import TreeWizard
11*16467b97STreehugger Robot
12*16467b97STreehugger Robotclass TestTreeNodeStream(unittest.TestCase):
13*16467b97STreehugger Robot    """Test case for the TreeNodeStream class."""
14*16467b97STreehugger Robot
15*16467b97STreehugger Robot    def setUp(self):
16*16467b97STreehugger Robot        self.adaptor = CommonTreeAdaptor()
17*16467b97STreehugger Robot
18*16467b97STreehugger Robot
19*16467b97STreehugger Robot    def newStream(self, t):
20*16467b97STreehugger Robot        """Build new stream; let's us override to test other streams."""
21*16467b97STreehugger Robot        return CommonTreeNodeStream(t)
22*16467b97STreehugger Robot
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot    def testSingleNode(self):
25*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot        stream = self.newStream(t)
28*16467b97STreehugger Robot        expecting = "101"
29*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
30*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot        expecting = "101"
33*16467b97STreehugger Robot        found = str(stream)
34*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot
37*16467b97STreehugger Robot    def testTwoChildrenOfNilRoot(self):
38*16467b97STreehugger Robot        class V(CommonTree):
39*16467b97STreehugger Robot            def __init__(self, token=None, ttype=None, x=None):
40*16467b97STreehugger Robot                if x is not None:
41*16467b97STreehugger Robot                    self.x = x
42*16467b97STreehugger Robot
43*16467b97STreehugger Robot                if ttype is not None and token is None:
44*16467b97STreehugger Robot                    self.token = CommonToken(type=ttype)
45*16467b97STreehugger Robot
46*16467b97STreehugger Robot                if token is not None:
47*16467b97STreehugger Robot                    self.token = token
48*16467b97STreehugger Robot
49*16467b97STreehugger Robot            def __str__(self):
50*16467b97STreehugger Robot                if self.token is not None:
51*16467b97STreehugger Robot                    txt = self.token.text
52*16467b97STreehugger Robot                else:
53*16467b97STreehugger Robot                    txt = ""
54*16467b97STreehugger Robot
55*16467b97STreehugger Robot                txt += "<V>"
56*16467b97STreehugger Robot                return txt
57*16467b97STreehugger Robot
58*16467b97STreehugger Robot        root_0 = self.adaptor.nil();
59*16467b97STreehugger Robot        t = V(ttype=101, x=2)
60*16467b97STreehugger Robot        u = V(token=CommonToken(type=102, text="102"))
61*16467b97STreehugger Robot        self.adaptor.addChild(root_0, t)
62*16467b97STreehugger Robot        self.adaptor.addChild(root_0, u)
63*16467b97STreehugger Robot        self.assert_(root_0.parent is None)
64*16467b97STreehugger Robot        self.assertEquals(-1, root_0.childIndex)
65*16467b97STreehugger Robot        self.assertEquals(0, t.childIndex)
66*16467b97STreehugger Robot        self.assertEquals(1, u.childIndex)
67*16467b97STreehugger Robot
68*16467b97STreehugger Robot
69*16467b97STreehugger Robot    def test4Nodes(self):
70*16467b97STreehugger Robot        # ^(101 ^(102 103) 104)
71*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
72*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(102)))
73*16467b97STreehugger Robot        t.getChild(0).addChild(CommonTree(CommonToken(103)))
74*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(104)))
75*16467b97STreehugger Robot
76*16467b97STreehugger Robot        stream = self.newStream(t)
77*16467b97STreehugger Robot        expecting = "101 102 103 104"
78*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
79*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
80*16467b97STreehugger Robot
81*16467b97STreehugger Robot        expecting = "101 2 102 2 103 3 104 3"
82*16467b97STreehugger Robot        found = str(stream)
83*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
84*16467b97STreehugger Robot
85*16467b97STreehugger Robot
86*16467b97STreehugger Robot    def testList(self):
87*16467b97STreehugger Robot        root = CommonTree(None)
88*16467b97STreehugger Robot
89*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
90*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(102)))
91*16467b97STreehugger Robot        t.getChild(0).addChild(CommonTree(CommonToken(103)))
92*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(104)))
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot        u = CommonTree(CommonToken(105))
95*16467b97STreehugger Robot
96*16467b97STreehugger Robot        root.addChild(t)
97*16467b97STreehugger Robot        root.addChild(u)
98*16467b97STreehugger Robot
99*16467b97STreehugger Robot        stream = CommonTreeNodeStream(root)
100*16467b97STreehugger Robot        expecting = "101 102 103 104 105"
101*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
102*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
103*16467b97STreehugger Robot
104*16467b97STreehugger Robot        expecting = "101 2 102 2 103 3 104 3 105"
105*16467b97STreehugger Robot        found = str(stream)
106*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
107*16467b97STreehugger Robot
108*16467b97STreehugger Robot
109*16467b97STreehugger Robot    def testFlatList(self):
110*16467b97STreehugger Robot        root = CommonTree(None)
111*16467b97STreehugger Robot
112*16467b97STreehugger Robot        root.addChild(CommonTree(CommonToken(101)))
113*16467b97STreehugger Robot        root.addChild(CommonTree(CommonToken(102)))
114*16467b97STreehugger Robot        root.addChild(CommonTree(CommonToken(103)))
115*16467b97STreehugger Robot
116*16467b97STreehugger Robot        stream = CommonTreeNodeStream(root)
117*16467b97STreehugger Robot        expecting = "101 102 103"
118*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
119*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
120*16467b97STreehugger Robot
121*16467b97STreehugger Robot        expecting = "101 102 103"
122*16467b97STreehugger Robot        found = str(stream)
123*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
124*16467b97STreehugger Robot
125*16467b97STreehugger Robot
126*16467b97STreehugger Robot    def testListWithOneNode(self):
127*16467b97STreehugger Robot        root = CommonTree(None)
128*16467b97STreehugger Robot
129*16467b97STreehugger Robot        root.addChild(CommonTree(CommonToken(101)))
130*16467b97STreehugger Robot
131*16467b97STreehugger Robot        stream = CommonTreeNodeStream(root)
132*16467b97STreehugger Robot        expecting = "101"
133*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
134*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
135*16467b97STreehugger Robot
136*16467b97STreehugger Robot        expecting = "101"
137*16467b97STreehugger Robot        found = str(stream)
138*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
139*16467b97STreehugger Robot
140*16467b97STreehugger Robot
141*16467b97STreehugger Robot    def testAoverB(self):
142*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
143*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(102)))
144*16467b97STreehugger Robot
145*16467b97STreehugger Robot        stream = self.newStream(t)
146*16467b97STreehugger Robot        expecting = "101 102"
147*16467b97STreehugger Robot        found = self.toNodesOnlyString(stream)
148*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
149*16467b97STreehugger Robot
150*16467b97STreehugger Robot        expecting = "101 2 102 3"
151*16467b97STreehugger Robot        found = str(stream)
152*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
153*16467b97STreehugger Robot
154*16467b97STreehugger Robot
155*16467b97STreehugger Robot    def testLT(self):
156*16467b97STreehugger Robot        # ^(101 ^(102 103) 104)
157*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
158*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(102)))
159*16467b97STreehugger Robot        t.getChild(0).addChild(CommonTree(CommonToken(103)))
160*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(104)))
161*16467b97STreehugger Robot
162*16467b97STreehugger Robot        stream = self.newStream(t)
163*16467b97STreehugger Robot        self.failUnlessEqual(101, stream.LT(1).getType())
164*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(2).getType())
165*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(3).getType())
166*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(4).getType())
167*16467b97STreehugger Robot        self.failUnlessEqual(103, stream.LT(5).getType())
168*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(6).getType())
169*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(7).getType())
170*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(8).getType())
171*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(9).getType())
172*16467b97STreehugger Robot        # check way ahead
173*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(100).getType())
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot
176*16467b97STreehugger Robot    def testMarkRewindEntire(self):
177*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
178*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
179*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
180*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
181*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
182*16467b97STreehugger Robot        r0.addChild(r1)
183*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
184*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
185*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
186*16467b97STreehugger Robot        r1.addChild(r2)
187*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
188*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
189*16467b97STreehugger Robot
190*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
191*16467b97STreehugger Robot        m = stream.mark() # MARK
192*16467b97STreehugger Robot        for _ in range(13): # consume til end
193*16467b97STreehugger Robot            stream.LT(1)
194*16467b97STreehugger Robot            stream.consume()
195*16467b97STreehugger Robot
196*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
197*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(-1).getType())  #TODO: remove?
198*16467b97STreehugger Robot        stream.rewind(m)      # REWIND
199*16467b97STreehugger Robot
200*16467b97STreehugger Robot        # consume til end again :)
201*16467b97STreehugger Robot        for _ in range(13): # consume til end
202*16467b97STreehugger Robot            stream.LT(1)
203*16467b97STreehugger Robot            stream.consume()
204*16467b97STreehugger Robot
205*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
206*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(-1).getType())  #TODO: remove?
207*16467b97STreehugger Robot
208*16467b97STreehugger Robot
209*16467b97STreehugger Robot    def testMarkRewindInMiddle(self):
210*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
211*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
212*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
213*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
214*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
215*16467b97STreehugger Robot        r0.addChild(r1)
216*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
217*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
218*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
219*16467b97STreehugger Robot        r1.addChild(r2)
220*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
221*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
222*16467b97STreehugger Robot
223*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
224*16467b97STreehugger Robot        for _ in range(7): # consume til middle
225*16467b97STreehugger Robot            #System.out.println(tream.LT(1).getType())
226*16467b97STreehugger Robot            stream.consume()
227*16467b97STreehugger Robot
228*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
229*16467b97STreehugger Robot        m = stream.mark() # MARK
230*16467b97STreehugger Robot        stream.consume() # consume 107
231*16467b97STreehugger Robot        stream.consume() # consume UP
232*16467b97STreehugger Robot        stream.consume() # consume UP
233*16467b97STreehugger Robot        stream.consume() # consume 104
234*16467b97STreehugger Robot        stream.rewind(m)      # REWIND
235*16467b97STreehugger Robot
236*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
237*16467b97STreehugger Robot        stream.consume()
238*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
239*16467b97STreehugger Robot        stream.consume()
240*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
241*16467b97STreehugger Robot        stream.consume()
242*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(1).getType())
243*16467b97STreehugger Robot        stream.consume()
244*16467b97STreehugger Robot        # now we're past rewind position
245*16467b97STreehugger Robot        self.failUnlessEqual(105, stream.LT(1).getType())
246*16467b97STreehugger Robot        stream.consume()
247*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
248*16467b97STreehugger Robot        stream.consume()
249*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
250*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(-1).getType())
251*16467b97STreehugger Robot
252*16467b97STreehugger Robot
253*16467b97STreehugger Robot    def testMarkRewindNested(self):
254*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
255*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
256*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
257*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
258*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
259*16467b97STreehugger Robot        r0.addChild(r1)
260*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
261*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
262*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
263*16467b97STreehugger Robot        r1.addChild(r2)
264*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
265*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
268*16467b97STreehugger Robot        m = stream.mark() # MARK at start
269*16467b97STreehugger Robot        stream.consume() # consume 101
270*16467b97STreehugger Robot        stream.consume() # consume DN
271*16467b97STreehugger Robot        m2 = stream.mark() # MARK on 102
272*16467b97STreehugger Robot        stream.consume() # consume 102
273*16467b97STreehugger Robot        stream.consume() # consume DN
274*16467b97STreehugger Robot        stream.consume() # consume 103
275*16467b97STreehugger Robot        stream.consume() # consume 106
276*16467b97STreehugger Robot        stream.rewind(m2)      # REWIND to 102
277*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(1).getType())
278*16467b97STreehugger Robot        stream.consume()
279*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
280*16467b97STreehugger Robot        stream.consume()
281*16467b97STreehugger Robot        # stop at 103 and rewind to start
282*16467b97STreehugger Robot        stream.rewind(m) # REWIND to 101
283*16467b97STreehugger Robot        self.failUnlessEqual(101, stream.LT(1).getType())
284*16467b97STreehugger Robot        stream.consume()
285*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
286*16467b97STreehugger Robot        stream.consume()
287*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(1).getType())
288*16467b97STreehugger Robot        stream.consume()
289*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
290*16467b97STreehugger Robot
291*16467b97STreehugger Robot
292*16467b97STreehugger Robot    def testSeek(self):
293*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
294*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
295*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
296*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
297*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
298*16467b97STreehugger Robot        r0.addChild(r1)
299*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
300*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
301*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
302*16467b97STreehugger Robot        r1.addChild(r2)
303*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
304*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
305*16467b97STreehugger Robot
306*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
307*16467b97STreehugger Robot        stream.consume() # consume 101
308*16467b97STreehugger Robot        stream.consume() # consume DN
309*16467b97STreehugger Robot        stream.consume() # consume 102
310*16467b97STreehugger Robot        stream.seek(7)   # seek to 107
311*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
312*16467b97STreehugger Robot        stream.consume() # consume 107
313*16467b97STreehugger Robot        stream.consume() # consume UP
314*16467b97STreehugger Robot        stream.consume() # consume UP
315*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(1).getType())
316*16467b97STreehugger Robot
317*16467b97STreehugger Robot
318*16467b97STreehugger Robot    def testSeekFromStart(self):
319*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
320*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
321*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
322*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
323*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
324*16467b97STreehugger Robot        r0.addChild(r1)
325*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
326*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
327*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
328*16467b97STreehugger Robot        r1.addChild(r2)
329*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
330*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
331*16467b97STreehugger Robot
332*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
333*16467b97STreehugger Robot        stream.seek(7)   # seek to 107
334*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
335*16467b97STreehugger Robot        stream.consume() # consume 107
336*16467b97STreehugger Robot        stream.consume() # consume UP
337*16467b97STreehugger Robot        stream.consume() # consume UP
338*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(1).getType())
339*16467b97STreehugger Robot
340*16467b97STreehugger Robot
341*16467b97STreehugger Robot    def testReset(self):
342*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
343*16467b97STreehugger Robot        # stream has 7 real + 6 nav nodes
344*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 106 DN 107 UP UP 104 105 UP EOF
345*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
346*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
347*16467b97STreehugger Robot        r0.addChild(r1)
348*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
349*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
350*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
351*16467b97STreehugger Robot        r1.addChild(r2)
352*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
353*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
354*16467b97STreehugger Robot
355*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
356*16467b97STreehugger Robot        v1 = self.toNodesOnlyString(stream) # scan all
357*16467b97STreehugger Robot        stream.reset()
358*16467b97STreehugger Robot        v2 = self.toNodesOnlyString(stream) # scan all
359*16467b97STreehugger Robot        self.assertEquals(v1, v2)
360*16467b97STreehugger Robot
361*16467b97STreehugger Robot
362*16467b97STreehugger Robot    def testIterator(self):
363*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
364*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
365*16467b97STreehugger Robot        r0.addChild(r1)
366*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
367*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
368*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
369*16467b97STreehugger Robot        r1.addChild(r2)
370*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
371*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
372*16467b97STreehugger Robot
373*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
374*16467b97STreehugger Robot
375*16467b97STreehugger Robot        expecting = [
376*16467b97STreehugger Robot            101, DOWN, 102, DOWN, 103, 106, DOWN, 107, UP, UP, 104, 105, UP]
377*16467b97STreehugger Robot        found = [t.type for t in stream]
378*16467b97STreehugger Robot        self.assertEqual(expecting, found)
379*16467b97STreehugger Robot
380*16467b97STreehugger Robot
381*16467b97STreehugger Robot    def toNodesOnlyString(self, nodes):
382*16467b97STreehugger Robot        buf = []
383*16467b97STreehugger Robot        for i in range(nodes.size()):
384*16467b97STreehugger Robot            t = nodes.LT(i+1)
385*16467b97STreehugger Robot            type = nodes.getTreeAdaptor().getType(t)
386*16467b97STreehugger Robot            if not (type==DOWN or type==UP):
387*16467b97STreehugger Robot                buf.append(str(type))
388*16467b97STreehugger Robot
389*16467b97STreehugger Robot        return ' '.join(buf)
390*16467b97STreehugger Robot
391*16467b97STreehugger Robot
392*16467b97STreehugger Robotclass TestCommonTreeNodeStream(unittest.TestCase):
393*16467b97STreehugger Robot    """Test case for the CommonTreeNodeStream class."""
394*16467b97STreehugger Robot
395*16467b97STreehugger Robot    def testPushPop(self):
396*16467b97STreehugger Robot        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
397*16467b97STreehugger Robot        # stream has 9 real + 8 nav nodes
398*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
399*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
400*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
401*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
402*16467b97STreehugger Robot        r0.addChild(r1)
403*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(104))
404*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(105)))
405*16467b97STreehugger Robot        r0.addChild(r2)
406*16467b97STreehugger Robot        r3 = CommonTree(CommonToken(106))
407*16467b97STreehugger Robot        r3.addChild(CommonTree(CommonToken(107)))
408*16467b97STreehugger Robot        r0.addChild(r3)
409*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(108)))
410*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(109)))
411*16467b97STreehugger Robot
412*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
413*16467b97STreehugger Robot        expecting = "101 2 102 2 103 3 104 2 105 3 106 2 107 3 108 109 3"
414*16467b97STreehugger Robot        found = str(stream)
415*16467b97STreehugger Robot        self.failUnlessEqual(expecting, found)
416*16467b97STreehugger Robot
417*16467b97STreehugger Robot        # Assume we want to hit node 107 and then "call 102" then return
418*16467b97STreehugger Robot
419*16467b97STreehugger Robot        indexOf102 = 2
420*16467b97STreehugger Robot        indexOf107 = 12
421*16467b97STreehugger Robot        for _ in range(indexOf107):# consume til 107 node
422*16467b97STreehugger Robot            stream.consume()
423*16467b97STreehugger Robot
424*16467b97STreehugger Robot        # CALL 102
425*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
426*16467b97STreehugger Robot        stream.push(indexOf102)
427*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(1).getType())
428*16467b97STreehugger Robot        stream.consume() # consume 102
429*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
430*16467b97STreehugger Robot        stream.consume() # consume DN
431*16467b97STreehugger Robot        self.failUnlessEqual(103, stream.LT(1).getType())
432*16467b97STreehugger Robot        stream.consume() # consume 103
433*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
434*16467b97STreehugger Robot        # RETURN
435*16467b97STreehugger Robot        stream.pop()
436*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
437*16467b97STreehugger Robot
438*16467b97STreehugger Robot
439*16467b97STreehugger Robot    def testNestedPushPop(self):
440*16467b97STreehugger Robot        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
441*16467b97STreehugger Robot        # stream has 9 real + 8 nav nodes
442*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
443*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
444*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
445*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
446*16467b97STreehugger Robot        r0.addChild(r1)
447*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(104))
448*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(105)))
449*16467b97STreehugger Robot        r0.addChild(r2)
450*16467b97STreehugger Robot        r3 = CommonTree(CommonToken(106))
451*16467b97STreehugger Robot        r3.addChild(CommonTree(CommonToken(107)))
452*16467b97STreehugger Robot        r0.addChild(r3)
453*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(108)))
454*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(109)))
455*16467b97STreehugger Robot
456*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
457*16467b97STreehugger Robot
458*16467b97STreehugger Robot        # Assume we want to hit node 107 and then "call 102", which
459*16467b97STreehugger Robot        # calls 104, then return
460*16467b97STreehugger Robot
461*16467b97STreehugger Robot        indexOf102 = 2
462*16467b97STreehugger Robot        indexOf107 = 12
463*16467b97STreehugger Robot        for _ in range(indexOf107): # consume til 107 node
464*16467b97STreehugger Robot            stream.consume()
465*16467b97STreehugger Robot
466*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
467*16467b97STreehugger Robot        # CALL 102
468*16467b97STreehugger Robot        stream.push(indexOf102)
469*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(1).getType())
470*16467b97STreehugger Robot        stream.consume() # consume 102
471*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
472*16467b97STreehugger Robot        stream.consume() # consume DN
473*16467b97STreehugger Robot        self.failUnlessEqual(103, stream.LT(1).getType())
474*16467b97STreehugger Robot        stream.consume() # consume 103
475*16467b97STreehugger Robot
476*16467b97STreehugger Robot        # CALL 104
477*16467b97STreehugger Robot        indexOf104 = 6
478*16467b97STreehugger Robot        stream.push(indexOf104)
479*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(1).getType())
480*16467b97STreehugger Robot        stream.consume() # consume 102
481*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
482*16467b97STreehugger Robot        stream.consume() # consume DN
483*16467b97STreehugger Robot        self.failUnlessEqual(105, stream.LT(1).getType())
484*16467b97STreehugger Robot        stream.consume() # consume 103
485*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
486*16467b97STreehugger Robot        # RETURN (to UP node in 102 subtree)
487*16467b97STreehugger Robot        stream.pop()
488*16467b97STreehugger Robot
489*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
490*16467b97STreehugger Robot        # RETURN (to empty stack)
491*16467b97STreehugger Robot        stream.pop()
492*16467b97STreehugger Robot        self.failUnlessEqual(107, stream.LT(1).getType())
493*16467b97STreehugger Robot
494*16467b97STreehugger Robot
495*16467b97STreehugger Robot    def testPushPopFromEOF(self):
496*16467b97STreehugger Robot        # ^(101 ^(102 103) ^(104 105) ^(106 107) 108 109)
497*16467b97STreehugger Robot        # stream has 9 real + 8 nav nodes
498*16467b97STreehugger Robot        # Sequence of types: 101 DN 102 DN 103 UP 104 DN 105 UP 106 DN 107 UP 108 109 UP
499*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
500*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
501*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
502*16467b97STreehugger Robot        r0.addChild(r1)
503*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(104))
504*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(105)))
505*16467b97STreehugger Robot        r0.addChild(r2)
506*16467b97STreehugger Robot        r3 = CommonTree(CommonToken(106))
507*16467b97STreehugger Robot        r3.addChild(CommonTree(CommonToken(107)))
508*16467b97STreehugger Robot        r0.addChild(r3)
509*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(108)))
510*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(109)))
511*16467b97STreehugger Robot
512*16467b97STreehugger Robot        stream = CommonTreeNodeStream(r0)
513*16467b97STreehugger Robot
514*16467b97STreehugger Robot        while stream.LA(1) != EOF:
515*16467b97STreehugger Robot            stream.consume()
516*16467b97STreehugger Robot
517*16467b97STreehugger Robot        indexOf102 = 2
518*16467b97STreehugger Robot        indexOf104 = 6
519*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
520*16467b97STreehugger Robot
521*16467b97STreehugger Robot        # CALL 102
522*16467b97STreehugger Robot        stream.push(indexOf102)
523*16467b97STreehugger Robot        self.failUnlessEqual(102, stream.LT(1).getType())
524*16467b97STreehugger Robot        stream.consume() # consume 102
525*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
526*16467b97STreehugger Robot        stream.consume() # consume DN
527*16467b97STreehugger Robot        self.failUnlessEqual(103, stream.LT(1).getType())
528*16467b97STreehugger Robot        stream.consume() # consume 103
529*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
530*16467b97STreehugger Robot        # RETURN (to empty stack)
531*16467b97STreehugger Robot        stream.pop()
532*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
533*16467b97STreehugger Robot
534*16467b97STreehugger Robot        # CALL 104
535*16467b97STreehugger Robot        stream.push(indexOf104)
536*16467b97STreehugger Robot        self.failUnlessEqual(104, stream.LT(1).getType())
537*16467b97STreehugger Robot        stream.consume() # consume 102
538*16467b97STreehugger Robot        self.failUnlessEqual(DOWN, stream.LT(1).getType())
539*16467b97STreehugger Robot        stream.consume() # consume DN
540*16467b97STreehugger Robot        self.failUnlessEqual(105, stream.LT(1).getType())
541*16467b97STreehugger Robot        stream.consume() # consume 103
542*16467b97STreehugger Robot        self.failUnlessEqual(UP, stream.LT(1).getType())
543*16467b97STreehugger Robot        # RETURN (to empty stack)
544*16467b97STreehugger Robot        stream.pop()
545*16467b97STreehugger Robot        self.failUnlessEqual(EOF, stream.LT(1).getType())
546*16467b97STreehugger Robot
547*16467b97STreehugger Robot
548*16467b97STreehugger Robotclass TestCommonTree(unittest.TestCase):
549*16467b97STreehugger Robot    """Test case for the CommonTree class."""
550*16467b97STreehugger Robot
551*16467b97STreehugger Robot    def setUp(self):
552*16467b97STreehugger Robot        """Setup test fixure"""
553*16467b97STreehugger Robot
554*16467b97STreehugger Robot        self.adaptor = CommonTreeAdaptor()
555*16467b97STreehugger Robot
556*16467b97STreehugger Robot
557*16467b97STreehugger Robot    def testSingleNode(self):
558*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
559*16467b97STreehugger Robot        self.failUnless(t.parent is None)
560*16467b97STreehugger Robot        self.failUnlessEqual(-1, t.childIndex)
561*16467b97STreehugger Robot
562*16467b97STreehugger Robot
563*16467b97STreehugger Robot    def test4Nodes(self):
564*16467b97STreehugger Robot        # ^(101 ^(102 103) 104)
565*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
566*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(102)))
567*16467b97STreehugger Robot        r0.getChild(0).addChild(CommonTree(CommonToken(103)))
568*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
569*16467b97STreehugger Robot
570*16467b97STreehugger Robot        self.failUnless(r0.parent is None)
571*16467b97STreehugger Robot        self.failUnlessEqual(-1, r0.childIndex)
572*16467b97STreehugger Robot
573*16467b97STreehugger Robot
574*16467b97STreehugger Robot    def testList(self):
575*16467b97STreehugger Robot        # ^(nil 101 102 103)
576*16467b97STreehugger Robot        r0 = CommonTree(None)
577*16467b97STreehugger Robot        c0=CommonTree(CommonToken(101))
578*16467b97STreehugger Robot        r0.addChild(c0)
579*16467b97STreehugger Robot        c1=CommonTree(CommonToken(102))
580*16467b97STreehugger Robot        r0.addChild(c1)
581*16467b97STreehugger Robot        c2=CommonTree(CommonToken(103))
582*16467b97STreehugger Robot        r0.addChild(c2)
583*16467b97STreehugger Robot
584*16467b97STreehugger Robot        self.failUnless(r0.parent is None)
585*16467b97STreehugger Robot        self.failUnlessEqual(-1, r0.childIndex)
586*16467b97STreehugger Robot        self.failUnlessEqual(r0, c0.parent)
587*16467b97STreehugger Robot        self.failUnlessEqual(0, c0.childIndex)
588*16467b97STreehugger Robot        self.failUnlessEqual(r0, c1.parent)
589*16467b97STreehugger Robot        self.failUnlessEqual(1, c1.childIndex)
590*16467b97STreehugger Robot        self.failUnlessEqual(r0, c2.parent)
591*16467b97STreehugger Robot        self.failUnlessEqual(2, c2.childIndex)
592*16467b97STreehugger Robot
593*16467b97STreehugger Robot
594*16467b97STreehugger Robot    def testList2(self):
595*16467b97STreehugger Robot        # Add child ^(nil 101 102 103) to root 5
596*16467b97STreehugger Robot        # should pull 101 102 103 directly to become 5's child list
597*16467b97STreehugger Robot        root = CommonTree(CommonToken(5))
598*16467b97STreehugger Robot
599*16467b97STreehugger Robot        # child tree
600*16467b97STreehugger Robot        r0 = CommonTree(None)
601*16467b97STreehugger Robot        c0=CommonTree(CommonToken(101))
602*16467b97STreehugger Robot        r0.addChild(c0)
603*16467b97STreehugger Robot        c1=CommonTree(CommonToken(102))
604*16467b97STreehugger Robot        r0.addChild(c1)
605*16467b97STreehugger Robot        c2=CommonTree(CommonToken(103))
606*16467b97STreehugger Robot        r0.addChild(c2)
607*16467b97STreehugger Robot
608*16467b97STreehugger Robot        root.addChild(r0)
609*16467b97STreehugger Robot
610*16467b97STreehugger Robot        self.failUnless(root.parent is None)
611*16467b97STreehugger Robot        self.failUnlessEqual(-1, root.childIndex)
612*16467b97STreehugger Robot        # check children of root all point at root
613*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
614*16467b97STreehugger Robot        self.failUnlessEqual(0, c0.childIndex)
615*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
616*16467b97STreehugger Robot        self.failUnlessEqual(1, c1.childIndex)
617*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
618*16467b97STreehugger Robot        self.failUnlessEqual(2, c2.childIndex)
619*16467b97STreehugger Robot
620*16467b97STreehugger Robot
621*16467b97STreehugger Robot    def testAddListToExistChildren(self):
622*16467b97STreehugger Robot        # Add child ^(nil 101 102 103) to root ^(5 6)
623*16467b97STreehugger Robot        # should add 101 102 103 to end of 5's child list
624*16467b97STreehugger Robot        root = CommonTree(CommonToken(5))
625*16467b97STreehugger Robot        root.addChild(CommonTree(CommonToken(6)))
626*16467b97STreehugger Robot
627*16467b97STreehugger Robot        # child tree
628*16467b97STreehugger Robot        r0 = CommonTree(None)
629*16467b97STreehugger Robot        c0=CommonTree(CommonToken(101))
630*16467b97STreehugger Robot        r0.addChild(c0)
631*16467b97STreehugger Robot        c1=CommonTree(CommonToken(102))
632*16467b97STreehugger Robot        r0.addChild(c1)
633*16467b97STreehugger Robot        c2=CommonTree(CommonToken(103))
634*16467b97STreehugger Robot        r0.addChild(c2)
635*16467b97STreehugger Robot
636*16467b97STreehugger Robot        root.addChild(r0)
637*16467b97STreehugger Robot
638*16467b97STreehugger Robot        self.failUnless(root.parent is None)
639*16467b97STreehugger Robot        self.failUnlessEqual(-1, root.childIndex)
640*16467b97STreehugger Robot        # check children of root all point at root
641*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
642*16467b97STreehugger Robot        self.failUnlessEqual(1, c0.childIndex)
643*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
644*16467b97STreehugger Robot        self.failUnlessEqual(2, c1.childIndex)
645*16467b97STreehugger Robot        self.failUnlessEqual(root, c0.parent)
646*16467b97STreehugger Robot        self.failUnlessEqual(3, c2.childIndex)
647*16467b97STreehugger Robot
648*16467b97STreehugger Robot
649*16467b97STreehugger Robot    def testDupTree(self):
650*16467b97STreehugger Robot        # ^(101 ^(102 103 ^(106 107) ) 104 105)
651*16467b97STreehugger Robot        r0 = CommonTree(CommonToken(101))
652*16467b97STreehugger Robot        r1 = CommonTree(CommonToken(102))
653*16467b97STreehugger Robot        r0.addChild(r1)
654*16467b97STreehugger Robot        r1.addChild(CommonTree(CommonToken(103)))
655*16467b97STreehugger Robot        r2 = CommonTree(CommonToken(106))
656*16467b97STreehugger Robot        r2.addChild(CommonTree(CommonToken(107)))
657*16467b97STreehugger Robot        r1.addChild(r2)
658*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(104)))
659*16467b97STreehugger Robot        r0.addChild(CommonTree(CommonToken(105)))
660*16467b97STreehugger Robot
661*16467b97STreehugger Robot        dup = self.adaptor.dupTree(r0)
662*16467b97STreehugger Robot
663*16467b97STreehugger Robot        self.failUnless(dup.parent is None)
664*16467b97STreehugger Robot        self.failUnlessEqual(-1, dup.childIndex)
665*16467b97STreehugger Robot        dup.sanityCheckParentAndChildIndexes()
666*16467b97STreehugger Robot
667*16467b97STreehugger Robot
668*16467b97STreehugger Robot    def testBecomeRoot(self):
669*16467b97STreehugger Robot        # 5 becomes root of ^(nil 101 102 103)
670*16467b97STreehugger Robot        newRoot = CommonTree(CommonToken(5))
671*16467b97STreehugger Robot
672*16467b97STreehugger Robot        oldRoot = CommonTree(None)
673*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(101)))
674*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(102)))
675*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(103)))
676*16467b97STreehugger Robot
677*16467b97STreehugger Robot        self.adaptor.becomeRoot(newRoot, oldRoot)
678*16467b97STreehugger Robot        newRoot.sanityCheckParentAndChildIndexes()
679*16467b97STreehugger Robot
680*16467b97STreehugger Robot
681*16467b97STreehugger Robot    def testBecomeRoot2(self):
682*16467b97STreehugger Robot        # 5 becomes root of ^(101 102 103)
683*16467b97STreehugger Robot        newRoot = CommonTree(CommonToken(5))
684*16467b97STreehugger Robot
685*16467b97STreehugger Robot        oldRoot = CommonTree(CommonToken(101))
686*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(102)))
687*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(103)))
688*16467b97STreehugger Robot
689*16467b97STreehugger Robot        self.adaptor.becomeRoot(newRoot, oldRoot)
690*16467b97STreehugger Robot        newRoot.sanityCheckParentAndChildIndexes()
691*16467b97STreehugger Robot
692*16467b97STreehugger Robot
693*16467b97STreehugger Robot    def testBecomeRoot3(self):
694*16467b97STreehugger Robot        # ^(nil 5) becomes root of ^(nil 101 102 103)
695*16467b97STreehugger Robot        newRoot = CommonTree(None)
696*16467b97STreehugger Robot        newRoot.addChild(CommonTree(CommonToken(5)))
697*16467b97STreehugger Robot
698*16467b97STreehugger Robot        oldRoot = CommonTree(None)
699*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(101)))
700*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(102)))
701*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(103)))
702*16467b97STreehugger Robot
703*16467b97STreehugger Robot        self.adaptor.becomeRoot(newRoot, oldRoot)
704*16467b97STreehugger Robot        newRoot.sanityCheckParentAndChildIndexes()
705*16467b97STreehugger Robot
706*16467b97STreehugger Robot
707*16467b97STreehugger Robot    def testBecomeRoot5(self):
708*16467b97STreehugger Robot        # ^(nil 5) becomes root of ^(101 102 103)
709*16467b97STreehugger Robot        newRoot = CommonTree(None)
710*16467b97STreehugger Robot        newRoot.addChild(CommonTree(CommonToken(5)))
711*16467b97STreehugger Robot
712*16467b97STreehugger Robot        oldRoot = CommonTree(CommonToken(101))
713*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(102)))
714*16467b97STreehugger Robot        oldRoot.addChild(CommonTree(CommonToken(103)))
715*16467b97STreehugger Robot
716*16467b97STreehugger Robot        self.adaptor.becomeRoot(newRoot, oldRoot)
717*16467b97STreehugger Robot        newRoot.sanityCheckParentAndChildIndexes()
718*16467b97STreehugger Robot
719*16467b97STreehugger Robot
720*16467b97STreehugger Robot    def testBecomeRoot6(self):
721*16467b97STreehugger Robot        # emulates construction of ^(5 6)
722*16467b97STreehugger Robot        root_0 = self.adaptor.nil()
723*16467b97STreehugger Robot        root_1 = self.adaptor.nil()
724*16467b97STreehugger Robot        root_1 = self.adaptor.becomeRoot(CommonTree(CommonToken(5)), root_1)
725*16467b97STreehugger Robot
726*16467b97STreehugger Robot        self.adaptor.addChild(root_1, CommonTree(CommonToken(6)))
727*16467b97STreehugger Robot
728*16467b97STreehugger Robot        self.adaptor.addChild(root_0, root_1)
729*16467b97STreehugger Robot
730*16467b97STreehugger Robot        root_0.sanityCheckParentAndChildIndexes()
731*16467b97STreehugger Robot
732*16467b97STreehugger Robot
733*16467b97STreehugger Robot    # Test replaceChildren
734*16467b97STreehugger Robot
735*16467b97STreehugger Robot    def testReplaceWithNoChildren(self):
736*16467b97STreehugger Robot        t = CommonTree(CommonToken(101))
737*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(5))
738*16467b97STreehugger Robot        error = False
739*16467b97STreehugger Robot        try:
740*16467b97STreehugger Robot        	t.replaceChildren(0, 0, newChild)
741*16467b97STreehugger Robot
742*16467b97STreehugger Robot        except IndexError:
743*16467b97STreehugger Robot        	error = True
744*16467b97STreehugger Robot
745*16467b97STreehugger Robot        self.failUnless(error)
746*16467b97STreehugger Robot
747*16467b97STreehugger Robot
748*16467b97STreehugger Robot    def testReplaceWithOneChildren(self):
749*16467b97STreehugger Robot        # assume token type 99 and use text
750*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
751*16467b97STreehugger Robot        c0 = CommonTree(CommonToken(99, text="b"))
752*16467b97STreehugger Robot        t.addChild(c0)
753*16467b97STreehugger Robot
754*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="c"))
755*16467b97STreehugger Robot        t.replaceChildren(0, 0, newChild)
756*16467b97STreehugger Robot        expecting = "(a c)"
757*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
758*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
759*16467b97STreehugger Robot
760*16467b97STreehugger Robot
761*16467b97STreehugger Robot    def testReplaceInMiddle(self):
762*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
763*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
764*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c"))) # index 1
765*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
766*16467b97STreehugger Robot
767*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
768*16467b97STreehugger Robot        t.replaceChildren(1, 1, newChild)
769*16467b97STreehugger Robot        expecting = "(a b x d)"
770*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
771*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
772*16467b97STreehugger Robot
773*16467b97STreehugger Robot
774*16467b97STreehugger Robot    def testReplaceAtLeft(self):
775*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
776*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b"))) # index 0
777*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
778*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
779*16467b97STreehugger Robot
780*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
781*16467b97STreehugger Robot        t.replaceChildren(0, 0, newChild)
782*16467b97STreehugger Robot        expecting = "(a x c d)"
783*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
784*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
785*16467b97STreehugger Robot
786*16467b97STreehugger Robot
787*16467b97STreehugger Robot    def testReplaceAtRight(self):
788*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
789*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
790*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
791*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d"))) # index 2
792*16467b97STreehugger Robot
793*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
794*16467b97STreehugger Robot        t.replaceChildren(2, 2, newChild)
795*16467b97STreehugger Robot        expecting = "(a b c x)"
796*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
797*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
798*16467b97STreehugger Robot
799*16467b97STreehugger Robot
800*16467b97STreehugger Robot    def testReplaceOneWithTwoAtLeft(self):
801*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
802*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
803*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
804*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
805*16467b97STreehugger Robot
806*16467b97STreehugger Robot        newChildren = self.adaptor.nil()
807*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
808*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
809*16467b97STreehugger Robot
810*16467b97STreehugger Robot        t.replaceChildren(0, 0, newChildren)
811*16467b97STreehugger Robot        expecting = "(a x y c d)"
812*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
813*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
814*16467b97STreehugger Robot
815*16467b97STreehugger Robot
816*16467b97STreehugger Robot    def testReplaceOneWithTwoAtRight(self):
817*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
818*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
819*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
820*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
821*16467b97STreehugger Robot
822*16467b97STreehugger Robot        newChildren = self.adaptor.nil()
823*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
824*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
825*16467b97STreehugger Robot
826*16467b97STreehugger Robot        t.replaceChildren(2, 2, newChildren)
827*16467b97STreehugger Robot        expecting = "(a b c x y)"
828*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
829*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
830*16467b97STreehugger Robot
831*16467b97STreehugger Robot
832*16467b97STreehugger Robot    def testReplaceOneWithTwoInMiddle(self):
833*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
834*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
835*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
836*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
837*16467b97STreehugger Robot
838*16467b97STreehugger Robot        newChildren = self.adaptor.nil()
839*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
840*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
841*16467b97STreehugger Robot
842*16467b97STreehugger Robot        t.replaceChildren(1, 1, newChildren)
843*16467b97STreehugger Robot        expecting = "(a b x y d)"
844*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
845*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
846*16467b97STreehugger Robot
847*16467b97STreehugger Robot
848*16467b97STreehugger Robot    def testReplaceTwoWithOneAtLeft(self):
849*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
850*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
851*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
852*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
853*16467b97STreehugger Robot
854*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
855*16467b97STreehugger Robot
856*16467b97STreehugger Robot        t.replaceChildren(0, 1, newChild)
857*16467b97STreehugger Robot        expecting = "(a x d)"
858*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
859*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
860*16467b97STreehugger Robot
861*16467b97STreehugger Robot
862*16467b97STreehugger Robot    def testReplaceTwoWithOneAtRight(self):
863*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
864*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
865*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
866*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
867*16467b97STreehugger Robot
868*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
869*16467b97STreehugger Robot
870*16467b97STreehugger Robot        t.replaceChildren(1, 2, newChild)
871*16467b97STreehugger Robot        expecting = "(a b x)"
872*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
873*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
874*16467b97STreehugger Robot
875*16467b97STreehugger Robot
876*16467b97STreehugger Robot    def testReplaceAllWithOne(self):
877*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
878*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
879*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
880*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
881*16467b97STreehugger Robot
882*16467b97STreehugger Robot        newChild = CommonTree(CommonToken(99, text="x"))
883*16467b97STreehugger Robot
884*16467b97STreehugger Robot        t.replaceChildren(0, 2, newChild)
885*16467b97STreehugger Robot        expecting = "(a x)"
886*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
887*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
888*16467b97STreehugger Robot
889*16467b97STreehugger Robot
890*16467b97STreehugger Robot    def testReplaceAllWithTwo(self):
891*16467b97STreehugger Robot        t = CommonTree(CommonToken(99, text="a"))
892*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="b")))
893*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="c")))
894*16467b97STreehugger Robot        t.addChild(CommonTree(CommonToken(99, text="d")))
895*16467b97STreehugger Robot
896*16467b97STreehugger Robot        newChildren = self.adaptor.nil()
897*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="x")))
898*16467b97STreehugger Robot        newChildren.addChild(CommonTree(CommonToken(99, text="y")))
899*16467b97STreehugger Robot
900*16467b97STreehugger Robot        t.replaceChildren(0, 2, newChildren)
901*16467b97STreehugger Robot        expecting = "(a x y)"
902*16467b97STreehugger Robot        self.failUnlessEqual(expecting, t.toStringTree())
903*16467b97STreehugger Robot        t.sanityCheckParentAndChildIndexes()
904*16467b97STreehugger Robot
905*16467b97STreehugger Robot
906*16467b97STreehugger Robotclass TestTreeContext(unittest.TestCase):
907*16467b97STreehugger Robot    """Test the TreeParser.inContext() method"""
908*16467b97STreehugger Robot
909*16467b97STreehugger Robot    tokenNames = [
910*16467b97STreehugger Robot        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
911*16467b97STreehugger Robot        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
912*16467b97STreehugger Robot        ]
913*16467b97STreehugger Robot
914*16467b97STreehugger Robot    def testSimpleParent(self):
915*16467b97STreehugger Robot        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
916*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
917*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
918*16467b97STreehugger Robot        t = wiz.create(tree)
919*16467b97STreehugger Robot
920*16467b97STreehugger Robot        labels = {}
921*16467b97STreehugger Robot        valid = wiz.parse(
922*16467b97STreehugger Robot            t,
923*16467b97STreehugger Robot            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
924*16467b97STreehugger Robot            labels)
925*16467b97STreehugger Robot        self.assertTrue(valid)
926*16467b97STreehugger Robot        node = labels.get("x")
927*16467b97STreehugger Robot
928*16467b97STreehugger Robot        expecting = True
929*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
930*16467b97STreehugger Robot        self.assertEquals(expecting, found)
931*16467b97STreehugger Robot
932*16467b97STreehugger Robot
933*16467b97STreehugger Robot    def testNoParent(self):
934*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3])))"
935*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
936*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
937*16467b97STreehugger Robot        t = wiz.create(tree)
938*16467b97STreehugger Robot
939*16467b97STreehugger Robot        labels = {}
940*16467b97STreehugger Robot        valid = wiz.parse(
941*16467b97STreehugger Robot            t,
942*16467b97STreehugger Robot            "(%x:PRINT (MULT ID (VEC INT INT INT)))",
943*16467b97STreehugger Robot            labels)
944*16467b97STreehugger Robot        self.assertTrue(valid)
945*16467b97STreehugger Robot        node = labels.get("x")
946*16467b97STreehugger Robot
947*16467b97STreehugger Robot        expecting = False
948*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
949*16467b97STreehugger Robot        self.assertEquals(expecting, found)
950*16467b97STreehugger Robot
951*16467b97STreehugger Robot
952*16467b97STreehugger Robot    def testParentWithWildcard(self):
953*16467b97STreehugger Robot        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
954*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
955*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
956*16467b97STreehugger Robot        t = wiz.create(tree)
957*16467b97STreehugger Robot
958*16467b97STreehugger Robot        labels = {}
959*16467b97STreehugger Robot        valid = wiz.parse(
960*16467b97STreehugger Robot            t,
961*16467b97STreehugger Robot            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
962*16467b97STreehugger Robot            labels)
963*16467b97STreehugger Robot        self.assertTrue(valid)
964*16467b97STreehugger Robot        node = labels.get("x")
965*16467b97STreehugger Robot
966*16467b97STreehugger Robot        expecting = True
967*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
968*16467b97STreehugger Robot        self.assertEquals(expecting, found)
969*16467b97STreehugger Robot
970*16467b97STreehugger Robot
971*16467b97STreehugger Robot    def testWildcardAtStartIgnored(self):
972*16467b97STreehugger Robot        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
973*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
974*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
975*16467b97STreehugger Robot        t = wiz.create(tree)
976*16467b97STreehugger Robot
977*16467b97STreehugger Robot        labels = {}
978*16467b97STreehugger Robot        valid = wiz.parse(
979*16467b97STreehugger Robot            t,
980*16467b97STreehugger Robot            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
981*16467b97STreehugger Robot            labels)
982*16467b97STreehugger Robot        self.assertTrue(valid)
983*16467b97STreehugger Robot        node = labels.get("x")
984*16467b97STreehugger Robot
985*16467b97STreehugger Robot        expecting = True
986*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "...VEC")
987*16467b97STreehugger Robot        self.assertEquals(expecting, found)
988*16467b97STreehugger Robot
989*16467b97STreehugger Robot
990*16467b97STreehugger Robot    def testWildcardInBetween(self):
991*16467b97STreehugger Robot        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
992*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
993*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
994*16467b97STreehugger Robot        t = wiz.create(tree)
995*16467b97STreehugger Robot
996*16467b97STreehugger Robot        labels = {}
997*16467b97STreehugger Robot        valid = wiz.parse(
998*16467b97STreehugger Robot            t,
999*16467b97STreehugger Robot            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
1000*16467b97STreehugger Robot            labels)
1001*16467b97STreehugger Robot        self.assertTrue(valid)
1002*16467b97STreehugger Robot        node = labels.get("x")
1003*16467b97STreehugger Robot
1004*16467b97STreehugger Robot        expecting = True
1005*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT...VEC")
1006*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1007*16467b97STreehugger Robot
1008*16467b97STreehugger Robot
1009*16467b97STreehugger Robot    def testLotsOfWildcards(self):
1010*16467b97STreehugger Robot        tree = "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID[x] (VEC INT[1] INT[2] INT[3]))))"
1011*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1012*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1013*16467b97STreehugger Robot        t = wiz.create(tree)
1014*16467b97STreehugger Robot
1015*16467b97STreehugger Robot        labels = {}
1016*16467b97STreehugger Robot        valid = wiz.parse(
1017*16467b97STreehugger Robot            t,
1018*16467b97STreehugger Robot            "(nil (ASSIGN ID[x] INT[3]) (PRINT (MULT ID (VEC INT %x:INT INT))))",
1019*16467b97STreehugger Robot            labels)
1020*16467b97STreehugger Robot        self.assertTrue(valid)
1021*16467b97STreehugger Robot        node = labels.get("x")
1022*16467b97STreehugger Robot
1023*16467b97STreehugger Robot        expecting = True
1024*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "... PRINT ... VEC ...")
1025*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1026*16467b97STreehugger Robot
1027*16467b97STreehugger Robot
1028*16467b97STreehugger Robot    def testDeep(self):
1029*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1030*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1031*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1032*16467b97STreehugger Robot        t = wiz.create(tree)
1033*16467b97STreehugger Robot
1034*16467b97STreehugger Robot        labels = {}
1035*16467b97STreehugger Robot        valid = wiz.parse(
1036*16467b97STreehugger Robot            t,
1037*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1038*16467b97STreehugger Robot            labels)
1039*16467b97STreehugger Robot        self.assertTrue(valid)
1040*16467b97STreehugger Robot        node = labels.get("x")
1041*16467b97STreehugger Robot
1042*16467b97STreehugger Robot        expecting = True
1043*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ...")
1044*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1045*16467b97STreehugger Robot
1046*16467b97STreehugger Robot
1047*16467b97STreehugger Robot    def testDeepAndFindRoot(self):
1048*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1049*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1050*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1051*16467b97STreehugger Robot        t = wiz.create(tree)
1052*16467b97STreehugger Robot
1053*16467b97STreehugger Robot        labels = {}
1054*16467b97STreehugger Robot        valid = wiz.parse(
1055*16467b97STreehugger Robot            t,
1056*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1057*16467b97STreehugger Robot            labels)
1058*16467b97STreehugger Robot        self.assertTrue(valid)
1059*16467b97STreehugger Robot        node = labels.get("x")
1060*16467b97STreehugger Robot
1061*16467b97STreehugger Robot        expecting = True
1062*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ...")
1063*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1064*16467b97STreehugger Robot
1065*16467b97STreehugger Robot
1066*16467b97STreehugger Robot    def testDeepAndFindRoot2(self):
1067*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1068*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1069*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1070*16467b97STreehugger Robot        t = wiz.create(tree)
1071*16467b97STreehugger Robot
1072*16467b97STreehugger Robot        labels = {}
1073*16467b97STreehugger Robot        valid = wiz.parse(
1074*16467b97STreehugger Robot            t,
1075*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1076*16467b97STreehugger Robot            labels)
1077*16467b97STreehugger Robot        self.assertTrue(valid)
1078*16467b97STreehugger Robot        node = labels.get("x")
1079*16467b97STreehugger Robot
1080*16467b97STreehugger Robot        expecting = True
1081*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ... VEC ...")
1082*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1083*16467b97STreehugger Robot
1084*16467b97STreehugger Robot
1085*16467b97STreehugger Robot    def testChain(self):
1086*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1087*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1088*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1089*16467b97STreehugger Robot        t = wiz.create(tree)
1090*16467b97STreehugger Robot
1091*16467b97STreehugger Robot        labels = {}
1092*16467b97STreehugger Robot        valid = wiz.parse(
1093*16467b97STreehugger Robot            t,
1094*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1095*16467b97STreehugger Robot            labels)
1096*16467b97STreehugger Robot        self.assertTrue(valid)
1097*16467b97STreehugger Robot        node = labels.get("x")
1098*16467b97STreehugger Robot
1099*16467b97STreehugger Robot        expecting = True
1100*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT MULT VEC MULT")
1101*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1102*16467b97STreehugger Robot
1103*16467b97STreehugger Robot
1104*16467b97STreehugger Robot    ## TEST INVALID CONTEXTS
1105*16467b97STreehugger Robot
1106*16467b97STreehugger Robot    def testNotParent(self):
1107*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1108*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1109*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1110*16467b97STreehugger Robot        t = wiz.create(tree)
1111*16467b97STreehugger Robot
1112*16467b97STreehugger Robot        labels = {}
1113*16467b97STreehugger Robot        valid = wiz.parse(
1114*16467b97STreehugger Robot            t,
1115*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1116*16467b97STreehugger Robot            labels)
1117*16467b97STreehugger Robot        self.assertTrue(valid)
1118*16467b97STreehugger Robot        node = labels.get("x")
1119*16467b97STreehugger Robot
1120*16467b97STreehugger Robot        expecting = False
1121*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC")
1122*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1123*16467b97STreehugger Robot
1124*16467b97STreehugger Robot
1125*16467b97STreehugger Robot    def testMismatch(self):
1126*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1127*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1128*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1129*16467b97STreehugger Robot        t = wiz.create(tree)
1130*16467b97STreehugger Robot
1131*16467b97STreehugger Robot        labels = {}
1132*16467b97STreehugger Robot        valid = wiz.parse(
1133*16467b97STreehugger Robot            t,
1134*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1135*16467b97STreehugger Robot            labels)
1136*16467b97STreehugger Robot        self.assertTrue(valid)
1137*16467b97STreehugger Robot        node = labels.get("x")
1138*16467b97STreehugger Robot
1139*16467b97STreehugger Robot        expecting = False
1140*16467b97STreehugger Robot        ## missing MULT
1141*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC MULT")
1142*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1143*16467b97STreehugger Robot
1144*16467b97STreehugger Robot
1145*16467b97STreehugger Robot    def testMismatch2(self):
1146*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1147*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1148*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1149*16467b97STreehugger Robot        t = wiz.create(tree)
1150*16467b97STreehugger Robot
1151*16467b97STreehugger Robot        labels = {}
1152*16467b97STreehugger Robot        valid = wiz.parse(
1153*16467b97STreehugger Robot            t,
1154*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1155*16467b97STreehugger Robot            labels)
1156*16467b97STreehugger Robot        self.assertTrue(valid)
1157*16467b97STreehugger Robot        node = labels.get("x")
1158*16467b97STreehugger Robot
1159*16467b97STreehugger Robot        expecting = False
1160*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT VEC ...")
1161*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1162*16467b97STreehugger Robot
1163*16467b97STreehugger Robot
1164*16467b97STreehugger Robot    def testMismatch3(self):
1165*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1166*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1167*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1168*16467b97STreehugger Robot        t = wiz.create(tree)
1169*16467b97STreehugger Robot
1170*16467b97STreehugger Robot        labels = {}
1171*16467b97STreehugger Robot        valid = wiz.parse(
1172*16467b97STreehugger Robot            t,
1173*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1174*16467b97STreehugger Robot            labels)
1175*16467b97STreehugger Robot        self.assertTrue(valid)
1176*16467b97STreehugger Robot        node = labels.get("x")
1177*16467b97STreehugger Robot
1178*16467b97STreehugger Robot        expecting = False
1179*16467b97STreehugger Robot        found = TreeParser._inContext(adaptor, self.tokenNames, node, "VEC ... VEC MULT")
1180*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1181*16467b97STreehugger Robot
1182*16467b97STreehugger Robot
1183*16467b97STreehugger Robot    def testDoubleEtc(self):
1184*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1185*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1186*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1187*16467b97STreehugger Robot        t = wiz.create(tree)
1188*16467b97STreehugger Robot
1189*16467b97STreehugger Robot        labels = {}
1190*16467b97STreehugger Robot        valid = wiz.parse(
1191*16467b97STreehugger Robot            t,
1192*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1193*16467b97STreehugger Robot            labels)
1194*16467b97STreehugger Robot        self.assertTrue(valid)
1195*16467b97STreehugger Robot        node = labels.get("x")
1196*16467b97STreehugger Robot
1197*16467b97STreehugger Robot        try:
1198*16467b97STreehugger Robot            TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT ... ... VEC")
1199*16467b97STreehugger Robot            self.fail()
1200*16467b97STreehugger Robot        except ValueError, exc:
1201*16467b97STreehugger Robot            expecting = "invalid syntax: ... ..."
1202*16467b97STreehugger Robot            found = str(exc)
1203*16467b97STreehugger Robot            self.assertEquals(expecting, found)
1204*16467b97STreehugger Robot
1205*16467b97STreehugger Robot
1206*16467b97STreehugger Robot    def testDotDot(self):
1207*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1208*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1209*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1210*16467b97STreehugger Robot        t = wiz.create(tree)
1211*16467b97STreehugger Robot
1212*16467b97STreehugger Robot        labels = {}
1213*16467b97STreehugger Robot        valid = wiz.parse(
1214*16467b97STreehugger Robot            t,
1215*16467b97STreehugger Robot            "(PRINT (MULT ID (VEC (MULT INT %x:INT) INT INT)))",
1216*16467b97STreehugger Robot            labels)
1217*16467b97STreehugger Robot        self.assertTrue(valid)
1218*16467b97STreehugger Robot        node = labels.get("x")
1219*16467b97STreehugger Robot
1220*16467b97STreehugger Robot        try:
1221*16467b97STreehugger Robot            TreeParser._inContext(adaptor, self.tokenNames, node, "PRINT .. VEC")
1222*16467b97STreehugger Robot            self.fail()
1223*16467b97STreehugger Robot        except ValueError, exc:
1224*16467b97STreehugger Robot            expecting = "invalid syntax: .."
1225*16467b97STreehugger Robot            found = str(exc)
1226*16467b97STreehugger Robot            self.assertEquals(expecting, found)
1227*16467b97STreehugger Robot
1228*16467b97STreehugger Robot
1229*16467b97STreehugger Robotclass TestTreeVisitor(unittest.TestCase):
1230*16467b97STreehugger Robot    """Test of the TreeVisitor class."""
1231*16467b97STreehugger Robot
1232*16467b97STreehugger Robot    tokenNames = [
1233*16467b97STreehugger Robot        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VEC", "ASSIGN", "PRINT",
1234*16467b97STreehugger Robot        "PLUS", "MULT", "DOT", "ID", "INT", "WS", "'['", "','", "']'"
1235*16467b97STreehugger Robot        ]
1236*16467b97STreehugger Robot
1237*16467b97STreehugger Robot    def testTreeVisitor(self):
1238*16467b97STreehugger Robot        tree = "(PRINT (MULT ID[x] (VEC (MULT INT[9] INT[1]) INT[2] INT[3])))"
1239*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1240*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokenNames)
1241*16467b97STreehugger Robot        t = wiz.create(tree)
1242*16467b97STreehugger Robot
1243*16467b97STreehugger Robot        found = []
1244*16467b97STreehugger Robot        def pre(t):
1245*16467b97STreehugger Robot            found.append("pre(%s)" % t)
1246*16467b97STreehugger Robot            return t
1247*16467b97STreehugger Robot        def post(t):
1248*16467b97STreehugger Robot            found.append("post(%s)" % t)
1249*16467b97STreehugger Robot            return t
1250*16467b97STreehugger Robot
1251*16467b97STreehugger Robot        visitor = TreeVisitor(adaptor)
1252*16467b97STreehugger Robot        visitor.visit(t, pre, post)
1253*16467b97STreehugger Robot
1254*16467b97STreehugger Robot        expecting = [ "pre(PRINT)", "pre(MULT)", "pre(x)", "post(x)",
1255*16467b97STreehugger Robot                      "pre(VEC)", "pre(MULT)", "pre(9)", "post(9)", "pre(1)",
1256*16467b97STreehugger Robot                      "post(1)", "post(MULT)", "pre(2)", "post(2)", "pre(3)",
1257*16467b97STreehugger Robot                      "post(3)", "post(VEC)", "post(MULT)", "post(PRINT)" ]
1258*16467b97STreehugger Robot
1259*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1260*16467b97STreehugger Robot
1261*16467b97STreehugger Robot
1262*16467b97STreehugger Robotclass TestTreeIterator(unittest.TestCase):
1263*16467b97STreehugger Robot    tokens = [
1264*16467b97STreehugger Robot        "<invalid>", "<EOR>", "<DOWN>", "<UP>",
1265*16467b97STreehugger Robot        "A", "B", "C", "D", "E", "F", "G" ]
1266*16467b97STreehugger Robot
1267*16467b97STreehugger Robot    def testNode(self):
1268*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1269*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1270*16467b97STreehugger Robot        t = wiz.create("A")
1271*16467b97STreehugger Robot        it = TreeIterator(t)
1272*16467b97STreehugger Robot        expecting = "A EOF"
1273*16467b97STreehugger Robot        found = self.toString(it)
1274*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1275*16467b97STreehugger Robot
1276*16467b97STreehugger Robot
1277*16467b97STreehugger Robot    def testFlatAB(self):
1278*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1279*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1280*16467b97STreehugger Robot        t = wiz.create("(nil A B)")
1281*16467b97STreehugger Robot        it = TreeIterator(t)
1282*16467b97STreehugger Robot        expecting = "nil DOWN A B UP EOF"
1283*16467b97STreehugger Robot        found = self.toString(it)
1284*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1285*16467b97STreehugger Robot
1286*16467b97STreehugger Robot
1287*16467b97STreehugger Robot    def testAB(self):
1288*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1289*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1290*16467b97STreehugger Robot        t = wiz.create("(A B)")
1291*16467b97STreehugger Robot        it = TreeIterator(t)
1292*16467b97STreehugger Robot        expecting = "A DOWN B UP EOF"
1293*16467b97STreehugger Robot        found = self.toString(it)
1294*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1295*16467b97STreehugger Robot
1296*16467b97STreehugger Robot
1297*16467b97STreehugger Robot    def testABC(self):
1298*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1299*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1300*16467b97STreehugger Robot        t = wiz.create("(A B C)")
1301*16467b97STreehugger Robot        it = TreeIterator(t)
1302*16467b97STreehugger Robot        expecting = "A DOWN B C UP EOF"
1303*16467b97STreehugger Robot        found = self.toString(it)
1304*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1305*16467b97STreehugger Robot
1306*16467b97STreehugger Robot
1307*16467b97STreehugger Robot    def testVerticalList(self):
1308*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1309*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1310*16467b97STreehugger Robot        t = wiz.create("(A (B C))")
1311*16467b97STreehugger Robot        it = TreeIterator(t)
1312*16467b97STreehugger Robot        expecting = "A DOWN B DOWN C UP UP EOF"
1313*16467b97STreehugger Robot        found = self.toString(it)
1314*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1315*16467b97STreehugger Robot
1316*16467b97STreehugger Robot
1317*16467b97STreehugger Robot    def testComplex(self):
1318*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1319*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1320*16467b97STreehugger Robot        t = wiz.create("(A (B (C D E) F) G)")
1321*16467b97STreehugger Robot        it = TreeIterator(t)
1322*16467b97STreehugger Robot        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1323*16467b97STreehugger Robot        found = self.toString(it)
1324*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1325*16467b97STreehugger Robot
1326*16467b97STreehugger Robot
1327*16467b97STreehugger Robot    def testReset(self):
1328*16467b97STreehugger Robot        adaptor = CommonTreeAdaptor()
1329*16467b97STreehugger Robot        wiz = TreeWizard(adaptor, self.tokens)
1330*16467b97STreehugger Robot        t = wiz.create("(A (B (C D E) F) G)")
1331*16467b97STreehugger Robot        it = TreeIterator(t)
1332*16467b97STreehugger Robot        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1333*16467b97STreehugger Robot        found = self.toString(it)
1334*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1335*16467b97STreehugger Robot
1336*16467b97STreehugger Robot        it.reset()
1337*16467b97STreehugger Robot        expecting = "A DOWN B DOWN C DOWN D E UP F UP G UP EOF"
1338*16467b97STreehugger Robot        found = self.toString(it)
1339*16467b97STreehugger Robot        self.assertEquals(expecting, found)
1340*16467b97STreehugger Robot
1341*16467b97STreehugger Robot
1342*16467b97STreehugger Robot    def toString(self, it):
1343*16467b97STreehugger Robot        buf = []
1344*16467b97STreehugger Robot        for n in it:
1345*16467b97STreehugger Robot            buf.append(str(n))
1346*16467b97STreehugger Robot
1347*16467b97STreehugger Robot        return ' '.join(buf)
1348*16467b97STreehugger Robot
1349*16467b97STreehugger Robot
1350*16467b97STreehugger Robotif __name__ == "__main__":
1351*16467b97STreehugger Robot    unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))
1352