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