1*16467b97STreehugger Robot"""Testsuite for TokenRewriteStream class.""" 2*16467b97STreehugger Robot 3*16467b97STreehugger Robot# don't care about docstrings 4*16467b97STreehugger Robot# pylint: disable-msg=C0111 5*16467b97STreehugger Robot 6*16467b97STreehugger Robotimport unittest 7*16467b97STreehugger Robotimport antlr3 8*16467b97STreehugger Robotimport testbase 9*16467b97STreehugger Robot 10*16467b97STreehugger Robotclass T1(testbase.ANTLRTest): 11*16467b97STreehugger Robot def setUp(self): 12*16467b97STreehugger Robot self.compileGrammar() 13*16467b97STreehugger Robot 14*16467b97STreehugger Robot 15*16467b97STreehugger Robot def _parse(self, input): 16*16467b97STreehugger Robot cStream = antlr3.StringStream(input) 17*16467b97STreehugger Robot lexer = self.getLexer(cStream) 18*16467b97STreehugger Robot tStream = antlr3.TokenRewriteStream(lexer) 19*16467b97STreehugger Robot tStream.fillBuffer() 20*16467b97STreehugger Robot 21*16467b97STreehugger Robot return tStream 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot 24*16467b97STreehugger Robot def testInsertBeforeIndex0(self): 25*16467b97STreehugger Robot tokens = self._parse("abc") 26*16467b97STreehugger Robot tokens.insertBefore(0, "0") 27*16467b97STreehugger Robot 28*16467b97STreehugger Robot result = tokens.toString() 29*16467b97STreehugger Robot expecting = "0abc" 30*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 31*16467b97STreehugger Robot 32*16467b97STreehugger Robot 33*16467b97STreehugger Robot def testInsertAfterLastIndex(self): 34*16467b97STreehugger Robot tokens = self._parse("abc") 35*16467b97STreehugger Robot tokens.insertAfter(2, "x") 36*16467b97STreehugger Robot 37*16467b97STreehugger Robot result = tokens.toString() 38*16467b97STreehugger Robot expecting = "abcx" 39*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 40*16467b97STreehugger Robot 41*16467b97STreehugger Robot 42*16467b97STreehugger Robot def test2InsertBeforeAfterMiddleIndex(self): 43*16467b97STreehugger Robot tokens = self._parse("abc") 44*16467b97STreehugger Robot tokens.insertBefore(1, "x") 45*16467b97STreehugger Robot tokens.insertAfter(1, "x") 46*16467b97STreehugger Robot 47*16467b97STreehugger Robot result = tokens.toString() 48*16467b97STreehugger Robot expecting = "axbxc" 49*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 50*16467b97STreehugger Robot 51*16467b97STreehugger Robot 52*16467b97STreehugger Robot def testReplaceIndex0(self): 53*16467b97STreehugger Robot tokens = self._parse("abc") 54*16467b97STreehugger Robot tokens.replace(0, "x") 55*16467b97STreehugger Robot 56*16467b97STreehugger Robot result = tokens.toString() 57*16467b97STreehugger Robot expecting = "xbc" 58*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 59*16467b97STreehugger Robot 60*16467b97STreehugger Robot 61*16467b97STreehugger Robot def testReplaceLastIndex(self): 62*16467b97STreehugger Robot tokens = self._parse("abc") 63*16467b97STreehugger Robot tokens.replace(2, "x") 64*16467b97STreehugger Robot 65*16467b97STreehugger Robot result = tokens.toString() 66*16467b97STreehugger Robot expecting = "abx" 67*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 68*16467b97STreehugger Robot 69*16467b97STreehugger Robot 70*16467b97STreehugger Robot def testReplaceMiddleIndex(self): 71*16467b97STreehugger Robot tokens = self._parse("abc") 72*16467b97STreehugger Robot tokens.replace(1, "x") 73*16467b97STreehugger Robot 74*16467b97STreehugger Robot result = tokens.toString() 75*16467b97STreehugger Robot expecting = "axc" 76*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 77*16467b97STreehugger Robot 78*16467b97STreehugger Robot 79*16467b97STreehugger Robot def test2ReplaceMiddleIndex(self): 80*16467b97STreehugger Robot tokens = self._parse("abc") 81*16467b97STreehugger Robot tokens.replace(1, "x") 82*16467b97STreehugger Robot tokens.replace(1, "y") 83*16467b97STreehugger Robot 84*16467b97STreehugger Robot result = tokens.toString() 85*16467b97STreehugger Robot expecting = "ayc" 86*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 87*16467b97STreehugger Robot 88*16467b97STreehugger Robot 89*16467b97STreehugger Robot def test2ReplaceMiddleIndex1InsertBefore(self): 90*16467b97STreehugger Robot tokens = self._parse("abc") 91*16467b97STreehugger Robot tokens.insertBefore(0, "_") 92*16467b97STreehugger Robot tokens.replace(1, "x") 93*16467b97STreehugger Robot tokens.replace(1, "y") 94*16467b97STreehugger Robot 95*16467b97STreehugger Robot result = tokens.toString() 96*16467b97STreehugger Robot expecting = "_ayc" 97*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 98*16467b97STreehugger Robot 99*16467b97STreehugger Robot 100*16467b97STreehugger Robot def testReplaceThenDeleteMiddleIndex(self): 101*16467b97STreehugger Robot tokens = self._parse("abc") 102*16467b97STreehugger Robot tokens.replace(1, "x") 103*16467b97STreehugger Robot tokens.delete(1) 104*16467b97STreehugger Robot 105*16467b97STreehugger Robot result = tokens.toString() 106*16467b97STreehugger Robot expecting = "ac" 107*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 108*16467b97STreehugger Robot 109*16467b97STreehugger Robot 110*16467b97STreehugger Robot def testInsertInPriorReplace(self): 111*16467b97STreehugger Robot tokens = self._parse("abc") 112*16467b97STreehugger Robot tokens.replace(0, 2, "x") 113*16467b97STreehugger Robot tokens.insertBefore(1, "0") 114*16467b97STreehugger Robot try: 115*16467b97STreehugger Robot tokens.toString() 116*16467b97STreehugger Robot self.fail() 117*16467b97STreehugger Robot except ValueError, exc: 118*16467b97STreehugger Robot self.failUnlessEqual( 119*16467b97STreehugger Robot str(exc), 120*16467b97STreehugger Robot "insert op <InsertBeforeOp@1:\"0\"> within boundaries of " 121*16467b97STreehugger Robot "previous <[email protected]:\"x\">" 122*16467b97STreehugger Robot ) 123*16467b97STreehugger Robot 124*16467b97STreehugger Robot def testInsertThenReplaceSameIndex(self): 125*16467b97STreehugger Robot tokens = self._parse("abc") 126*16467b97STreehugger Robot tokens.insertBefore(0, "0") 127*16467b97STreehugger Robot tokens.replace(0, "x") # supercedes insert at 0 128*16467b97STreehugger Robot 129*16467b97STreehugger Robot result = tokens.toString() 130*16467b97STreehugger Robot expecting = "0xbc" 131*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 132*16467b97STreehugger Robot 133*16467b97STreehugger Robot 134*16467b97STreehugger Robot def test2InsertMiddleIndex(self): 135*16467b97STreehugger Robot tokens = self._parse("abc") 136*16467b97STreehugger Robot tokens.insertBefore(1, "x") 137*16467b97STreehugger Robot tokens.insertBefore(1, "y") 138*16467b97STreehugger Robot 139*16467b97STreehugger Robot result = tokens.toString() 140*16467b97STreehugger Robot expecting = "ayxbc" 141*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 142*16467b97STreehugger Robot 143*16467b97STreehugger Robot 144*16467b97STreehugger Robot def test2InsertThenReplaceIndex0(self): 145*16467b97STreehugger Robot tokens = self._parse("abc") 146*16467b97STreehugger Robot tokens.insertBefore(0, "x") 147*16467b97STreehugger Robot tokens.insertBefore(0, "y") 148*16467b97STreehugger Robot tokens.replace(0, "z") 149*16467b97STreehugger Robot 150*16467b97STreehugger Robot result = tokens.toString() 151*16467b97STreehugger Robot expecting = "yxzbc" 152*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 153*16467b97STreehugger Robot 154*16467b97STreehugger Robot 155*16467b97STreehugger Robot def testReplaceThenInsertBeforeLastIndex(self): 156*16467b97STreehugger Robot tokens = self._parse("abc") 157*16467b97STreehugger Robot tokens.replace(2, "x") 158*16467b97STreehugger Robot tokens.insertBefore(2, "y") 159*16467b97STreehugger Robot 160*16467b97STreehugger Robot result = tokens.toString() 161*16467b97STreehugger Robot expecting = "abyx" 162*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 163*16467b97STreehugger Robot 164*16467b97STreehugger Robot 165*16467b97STreehugger Robot def testInsertThenReplaceLastIndex(self): 166*16467b97STreehugger Robot tokens = self._parse("abc") 167*16467b97STreehugger Robot tokens.insertBefore(2, "y") 168*16467b97STreehugger Robot tokens.replace(2, "x") 169*16467b97STreehugger Robot 170*16467b97STreehugger Robot result = tokens.toString() 171*16467b97STreehugger Robot expecting = "abyx" 172*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 173*16467b97STreehugger Robot 174*16467b97STreehugger Robot 175*16467b97STreehugger Robot def testReplaceThenInsertAfterLastIndex(self): 176*16467b97STreehugger Robot tokens = self._parse("abc") 177*16467b97STreehugger Robot tokens.replace(2, "x") 178*16467b97STreehugger Robot tokens.insertAfter(2, "y") 179*16467b97STreehugger Robot 180*16467b97STreehugger Robot result = tokens.toString() 181*16467b97STreehugger Robot expecting = "abxy" 182*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 183*16467b97STreehugger Robot 184*16467b97STreehugger Robot 185*16467b97STreehugger Robot def testReplaceRangeThenInsertAtLeftEdge(self): 186*16467b97STreehugger Robot tokens = self._parse("abcccba") 187*16467b97STreehugger Robot tokens.replace(2, 4, "x") 188*16467b97STreehugger Robot tokens.insertBefore(2, "y") 189*16467b97STreehugger Robot 190*16467b97STreehugger Robot result = tokens.toString() 191*16467b97STreehugger Robot expecting = "abyxba" 192*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 193*16467b97STreehugger Robot 194*16467b97STreehugger Robot 195*16467b97STreehugger Robot def testReplaceRangeThenInsertAtRightEdge(self): 196*16467b97STreehugger Robot tokens = self._parse("abcccba") 197*16467b97STreehugger Robot tokens.replace(2, 4, "x") 198*16467b97STreehugger Robot tokens.insertBefore(4, "y") # no effect; within range of a replace 199*16467b97STreehugger Robot 200*16467b97STreehugger Robot try: 201*16467b97STreehugger Robot tokens.toString() 202*16467b97STreehugger Robot self.fail() 203*16467b97STreehugger Robot except ValueError, exc: 204*16467b97STreehugger Robot self.failUnlessEqual( 205*16467b97STreehugger Robot str(exc), 206*16467b97STreehugger Robot "insert op <InsertBeforeOp@4:\"y\"> within boundaries of " 207*16467b97STreehugger Robot "previous <[email protected]:\"x\">") 208*16467b97STreehugger Robot 209*16467b97STreehugger Robot 210*16467b97STreehugger Robot def testReplaceRangeThenInsertAfterRightEdge(self): 211*16467b97STreehugger Robot tokens = self._parse("abcccba") 212*16467b97STreehugger Robot tokens.replace(2, 4, "x") 213*16467b97STreehugger Robot tokens.insertAfter(4, "y") 214*16467b97STreehugger Robot 215*16467b97STreehugger Robot result = tokens.toString() 216*16467b97STreehugger Robot expecting = "abxyba" 217*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 218*16467b97STreehugger Robot 219*16467b97STreehugger Robot 220*16467b97STreehugger Robot def testReplaceAll(self): 221*16467b97STreehugger Robot tokens = self._parse("abcccba") 222*16467b97STreehugger Robot tokens.replace(0, 6, "x") 223*16467b97STreehugger Robot 224*16467b97STreehugger Robot result = tokens.toString() 225*16467b97STreehugger Robot expecting = "x" 226*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 227*16467b97STreehugger Robot 228*16467b97STreehugger Robot 229*16467b97STreehugger Robot def testReplaceSubsetThenFetch(self): 230*16467b97STreehugger Robot tokens = self._parse("abcccba") 231*16467b97STreehugger Robot tokens.replace(2, 4, "xyz") 232*16467b97STreehugger Robot 233*16467b97STreehugger Robot result = tokens.toString(0, 6) 234*16467b97STreehugger Robot expecting = "abxyzba" 235*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 236*16467b97STreehugger Robot 237*16467b97STreehugger Robot 238*16467b97STreehugger Robot def testReplaceThenReplaceSuperset(self): 239*16467b97STreehugger Robot tokens = self._parse("abcccba") 240*16467b97STreehugger Robot tokens.replace(2, 4, "xyz") 241*16467b97STreehugger Robot tokens.replace(3, 5, "foo") # overlaps, error 242*16467b97STreehugger Robot 243*16467b97STreehugger Robot try: 244*16467b97STreehugger Robot tokens.toString() 245*16467b97STreehugger Robot self.fail() 246*16467b97STreehugger Robot except ValueError, exc: 247*16467b97STreehugger Robot self.failUnlessEqual( 248*16467b97STreehugger Robot str(exc), 249*16467b97STreehugger Robot "replace op boundaries of <[email protected]:\"foo\"> overlap " 250*16467b97STreehugger Robot "with previous <[email protected]:\"xyz\">") 251*16467b97STreehugger Robot 252*16467b97STreehugger Robot 253*16467b97STreehugger Robot def testReplaceThenReplaceLowerIndexedSuperset(self): 254*16467b97STreehugger Robot tokens = self._parse("abcccba") 255*16467b97STreehugger Robot tokens.replace(2, 4, "xyz") 256*16467b97STreehugger Robot tokens.replace(1, 3, "foo") # overlap, error 257*16467b97STreehugger Robot 258*16467b97STreehugger Robot try: 259*16467b97STreehugger Robot tokens.toString() 260*16467b97STreehugger Robot self.fail() 261*16467b97STreehugger Robot except ValueError, exc: 262*16467b97STreehugger Robot self.failUnlessEqual( 263*16467b97STreehugger Robot str(exc), 264*16467b97STreehugger Robot "replace op boundaries of <[email protected]:\"foo\"> overlap " 265*16467b97STreehugger Robot "with previous <[email protected]:\"xyz\">") 266*16467b97STreehugger Robot 267*16467b97STreehugger Robot 268*16467b97STreehugger Robot def testReplaceSingleMiddleThenOverlappingSuperset(self): 269*16467b97STreehugger Robot tokens = self._parse("abcba") 270*16467b97STreehugger Robot tokens.replace(2, 2, "xyz") 271*16467b97STreehugger Robot tokens.replace(0, 3, "foo") 272*16467b97STreehugger Robot 273*16467b97STreehugger Robot result = tokens.toString() 274*16467b97STreehugger Robot expecting = "fooa" 275*16467b97STreehugger Robot self.failUnlessEqual(result, expecting) 276*16467b97STreehugger Robot 277*16467b97STreehugger Robot 278*16467b97STreehugger Robot def testCombineInserts(self): 279*16467b97STreehugger Robot tokens = self._parse("abc") 280*16467b97STreehugger Robot tokens.insertBefore(0, "x") 281*16467b97STreehugger Robot tokens.insertBefore(0, "y") 282*16467b97STreehugger Robot result = tokens.toString() 283*16467b97STreehugger Robot expecting = "yxabc" 284*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 285*16467b97STreehugger Robot 286*16467b97STreehugger Robot 287*16467b97STreehugger Robot def testCombine3Inserts(self): 288*16467b97STreehugger Robot tokens = self._parse("abc") 289*16467b97STreehugger Robot tokens.insertBefore(1, "x") 290*16467b97STreehugger Robot tokens.insertBefore(0, "y") 291*16467b97STreehugger Robot tokens.insertBefore(1, "z") 292*16467b97STreehugger Robot result = tokens.toString() 293*16467b97STreehugger Robot expecting = "yazxbc" 294*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 295*16467b97STreehugger Robot 296*16467b97STreehugger Robot 297*16467b97STreehugger Robot def testCombineInsertOnLeftWithReplace(self): 298*16467b97STreehugger Robot tokens = self._parse("abc") 299*16467b97STreehugger Robot tokens.replace(0, 2, "foo") 300*16467b97STreehugger Robot tokens.insertBefore(0, "z") # combine with left edge of rewrite 301*16467b97STreehugger Robot result = tokens.toString() 302*16467b97STreehugger Robot expecting = "zfoo" 303*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 304*16467b97STreehugger Robot 305*16467b97STreehugger Robot 306*16467b97STreehugger Robot def testCombineInsertOnLeftWithDelete(self): 307*16467b97STreehugger Robot tokens = self._parse("abc") 308*16467b97STreehugger Robot tokens.delete(0, 2) 309*16467b97STreehugger Robot tokens.insertBefore(0, "z") # combine with left edge of rewrite 310*16467b97STreehugger Robot result = tokens.toString() 311*16467b97STreehugger Robot expecting = "z" # make sure combo is not znull 312*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 313*16467b97STreehugger Robot 314*16467b97STreehugger Robot 315*16467b97STreehugger Robot def testDisjointInserts(self): 316*16467b97STreehugger Robot tokens = self._parse("abc") 317*16467b97STreehugger Robot tokens.insertBefore(1, "x") 318*16467b97STreehugger Robot tokens.insertBefore(2, "y") 319*16467b97STreehugger Robot tokens.insertBefore(0, "z") 320*16467b97STreehugger Robot result = tokens.toString() 321*16467b97STreehugger Robot expecting = "zaxbyc" 322*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 323*16467b97STreehugger Robot 324*16467b97STreehugger Robot 325*16467b97STreehugger Robot def testOverlappingReplace(self): 326*16467b97STreehugger Robot tokens = self._parse("abcc") 327*16467b97STreehugger Robot tokens.replace(1, 2, "foo") 328*16467b97STreehugger Robot tokens.replace(0, 3, "bar") # wipes prior nested replace 329*16467b97STreehugger Robot result = tokens.toString() 330*16467b97STreehugger Robot expecting = "bar" 331*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 332*16467b97STreehugger Robot 333*16467b97STreehugger Robot 334*16467b97STreehugger Robot def testOverlappingReplace2(self): 335*16467b97STreehugger Robot tokens = self._parse("abcc") 336*16467b97STreehugger Robot tokens.replace(0, 3, "bar") 337*16467b97STreehugger Robot tokens.replace(1, 2, "foo") # cannot split earlier replace 338*16467b97STreehugger Robot 339*16467b97STreehugger Robot try: 340*16467b97STreehugger Robot tokens.toString() 341*16467b97STreehugger Robot self.fail() 342*16467b97STreehugger Robot except ValueError, exc: 343*16467b97STreehugger Robot self.failUnlessEqual( 344*16467b97STreehugger Robot str(exc), 345*16467b97STreehugger Robot "replace op boundaries of <[email protected]:\"foo\"> overlap " 346*16467b97STreehugger Robot "with previous <[email protected]:\"bar\">") 347*16467b97STreehugger Robot 348*16467b97STreehugger Robot 349*16467b97STreehugger Robot def testOverlappingReplace3(self): 350*16467b97STreehugger Robot tokens = self._parse("abcc") 351*16467b97STreehugger Robot tokens.replace(1, 2, "foo") 352*16467b97STreehugger Robot tokens.replace(0, 2, "bar") # wipes prior nested replace 353*16467b97STreehugger Robot result = tokens.toString() 354*16467b97STreehugger Robot expecting = "barc" 355*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 356*16467b97STreehugger Robot 357*16467b97STreehugger Robot 358*16467b97STreehugger Robot def testOverlappingReplace4(self): 359*16467b97STreehugger Robot tokens = self._parse("abcc") 360*16467b97STreehugger Robot tokens.replace(1, 2, "foo") 361*16467b97STreehugger Robot tokens.replace(1, 3, "bar") # wipes prior nested replace 362*16467b97STreehugger Robot result = tokens.toString() 363*16467b97STreehugger Robot expecting = "abar" 364*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 365*16467b97STreehugger Robot 366*16467b97STreehugger Robot 367*16467b97STreehugger Robot def testDropIdenticalReplace(self): 368*16467b97STreehugger Robot tokens = self._parse("abcc") 369*16467b97STreehugger Robot tokens.replace(1, 2, "foo") 370*16467b97STreehugger Robot tokens.replace(1, 2, "foo") # drop previous, identical 371*16467b97STreehugger Robot result = tokens.toString() 372*16467b97STreehugger Robot expecting = "afooc" 373*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 374*16467b97STreehugger Robot 375*16467b97STreehugger Robot 376*16467b97STreehugger Robot def testDropPrevCoveredInsert(self): 377*16467b97STreehugger Robot tokens = self._parse("abc") 378*16467b97STreehugger Robot tokens.insertBefore(1, "foo") 379*16467b97STreehugger Robot tokens.replace(1, 2, "foo") # kill prev insert 380*16467b97STreehugger Robot result = tokens.toString() 381*16467b97STreehugger Robot expecting = "afoofoo" 382*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 383*16467b97STreehugger Robot 384*16467b97STreehugger Robot 385*16467b97STreehugger Robot def testLeaveAloneDisjointInsert(self): 386*16467b97STreehugger Robot tokens = self._parse("abcc") 387*16467b97STreehugger Robot tokens.insertBefore(1, "x") 388*16467b97STreehugger Robot tokens.replace(2, 3, "foo") 389*16467b97STreehugger Robot result = tokens.toString() 390*16467b97STreehugger Robot expecting = "axbfoo" 391*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 392*16467b97STreehugger Robot 393*16467b97STreehugger Robot 394*16467b97STreehugger Robot def testLeaveAloneDisjointInsert2(self): 395*16467b97STreehugger Robot tokens = self._parse("abcc") 396*16467b97STreehugger Robot tokens.replace(2, 3, "foo") 397*16467b97STreehugger Robot tokens.insertBefore(1, "x") 398*16467b97STreehugger Robot result = tokens.toString() 399*16467b97STreehugger Robot expecting = "axbfoo" 400*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 401*16467b97STreehugger Robot 402*16467b97STreehugger Robot 403*16467b97STreehugger Robot def testInsertBeforeTokenThenDeleteThatToken(self): 404*16467b97STreehugger Robot tokens = self._parse("abc") 405*16467b97STreehugger Robot tokens.insertBefore(2, "y") 406*16467b97STreehugger Robot tokens.delete(2) 407*16467b97STreehugger Robot result = tokens.toString() 408*16467b97STreehugger Robot expecting = "aby" 409*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 410*16467b97STreehugger Robot 411*16467b97STreehugger Robot 412*16467b97STreehugger Robotclass T2(testbase.ANTLRTest): 413*16467b97STreehugger Robot def setUp(self): 414*16467b97STreehugger Robot self.compileGrammar('t048rewrite2.g') 415*16467b97STreehugger Robot 416*16467b97STreehugger Robot 417*16467b97STreehugger Robot def _parse(self, input): 418*16467b97STreehugger Robot cStream = antlr3.StringStream(input) 419*16467b97STreehugger Robot lexer = self.getLexer(cStream) 420*16467b97STreehugger Robot tStream = antlr3.TokenRewriteStream(lexer) 421*16467b97STreehugger Robot tStream.fillBuffer() 422*16467b97STreehugger Robot 423*16467b97STreehugger Robot return tStream 424*16467b97STreehugger Robot 425*16467b97STreehugger Robot 426*16467b97STreehugger Robot def testToStringStartStop(self): 427*16467b97STreehugger Robot # Tokens: 0123456789 428*16467b97STreehugger Robot # Input: x = 3 * 0 429*16467b97STreehugger Robot tokens = self._parse("x = 3 * 0;") 430*16467b97STreehugger Robot tokens.replace(4, 8, "0") # replace 3 * 0 with 0 431*16467b97STreehugger Robot 432*16467b97STreehugger Robot result = tokens.toOriginalString() 433*16467b97STreehugger Robot expecting = "x = 3 * 0;" 434*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 435*16467b97STreehugger Robot 436*16467b97STreehugger Robot result = tokens.toString() 437*16467b97STreehugger Robot expecting = "x = 0;" 438*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 439*16467b97STreehugger Robot 440*16467b97STreehugger Robot result = tokens.toString(0, 9) 441*16467b97STreehugger Robot expecting = "x = 0;" 442*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 443*16467b97STreehugger Robot 444*16467b97STreehugger Robot result = tokens.toString(4, 8) 445*16467b97STreehugger Robot expecting = "0" 446*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 447*16467b97STreehugger Robot 448*16467b97STreehugger Robot 449*16467b97STreehugger Robot def testToStringStartStop2(self): 450*16467b97STreehugger Robot # Tokens: 012345678901234567 451*16467b97STreehugger Robot # Input: x = 3 * 0 + 2 * 0 452*16467b97STreehugger Robot tokens = self._parse("x = 3 * 0 + 2 * 0;") 453*16467b97STreehugger Robot 454*16467b97STreehugger Robot result = tokens.toOriginalString() 455*16467b97STreehugger Robot expecting = "x = 3 * 0 + 2 * 0;" 456*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 457*16467b97STreehugger Robot 458*16467b97STreehugger Robot tokens.replace(4, 8, "0") # replace 3 * 0 with 0 459*16467b97STreehugger Robot result = tokens.toString() 460*16467b97STreehugger Robot expecting = "x = 0 + 2 * 0;" 461*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 462*16467b97STreehugger Robot 463*16467b97STreehugger Robot result = tokens.toString(0, 17) 464*16467b97STreehugger Robot expecting = "x = 0 + 2 * 0;" 465*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 466*16467b97STreehugger Robot 467*16467b97STreehugger Robot result = tokens.toString(4, 8) 468*16467b97STreehugger Robot expecting = "0" 469*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 470*16467b97STreehugger Robot 471*16467b97STreehugger Robot result = tokens.toString(0, 8) 472*16467b97STreehugger Robot expecting = "x = 0" 473*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 474*16467b97STreehugger Robot 475*16467b97STreehugger Robot result = tokens.toString(12, 16) 476*16467b97STreehugger Robot expecting = "2 * 0" 477*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 478*16467b97STreehugger Robot 479*16467b97STreehugger Robot tokens.insertAfter(17, "// comment") 480*16467b97STreehugger Robot result = tokens.toString(12, 18) 481*16467b97STreehugger Robot expecting = "2 * 0;// comment" 482*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 483*16467b97STreehugger Robot 484*16467b97STreehugger Robot result = tokens.toString(0, 8) # try again after insert at end 485*16467b97STreehugger Robot expecting = "x = 0" 486*16467b97STreehugger Robot self.failUnlessEqual(expecting, result) 487*16467b97STreehugger Robot 488*16467b97STreehugger Robot 489*16467b97STreehugger Robotif __name__ == '__main__': 490*16467b97STreehugger Robot unittest.main() 491