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