blob: 685bf8634520c1d6a54dbee60e5909459daca5aa [file] [log] [blame]
"""Testsuite for TokenRewriteStream class."""
# don't care about docstrings
# pylint: disable-msg=C0111
import unittest
import antlr3
import testbase
class T1(testbase.ANTLRTest):
def setUp(self):
self.compileGrammar()
def _parse(self, input):
cStream = antlr3.StringStream(input)
lexer = self.getLexer(cStream)
tStream = antlr3.TokenRewriteStream(lexer)
tStream.fillBuffer()
return tStream
def testInsertBeforeIndex0(self):
tokens = self._parse("abc")
tokens.insertBefore(0, "0")
result = tokens.toString()
expecting = "0abc"
self.failUnlessEqual(result, expecting)
def testInsertAfterLastIndex(self):
tokens = self._parse("abc")
tokens.insertAfter(2, "x")
result = tokens.toString()
expecting = "abcx"
self.failUnlessEqual(result, expecting)
def test2InsertBeforeAfterMiddleIndex(self):
tokens = self._parse("abc")
tokens.insertBefore(1, "x")
tokens.insertAfter(1, "x")
result = tokens.toString()
expecting = "axbxc"
self.failUnlessEqual(result, expecting)
def testReplaceIndex0(self):
tokens = self._parse("abc")
tokens.replace(0, "x")
result = tokens.toString()
expecting = "xbc"
self.failUnlessEqual(result, expecting)
def testReplaceLastIndex(self):
tokens = self._parse("abc")
tokens.replace(2, "x")
result = tokens.toString()
expecting = "abx"
self.failUnlessEqual(result, expecting)
def testReplaceMiddleIndex(self):
tokens = self._parse("abc")
tokens.replace(1, "x")
result = tokens.toString()
expecting = "axc"
self.failUnlessEqual(result, expecting)
def test2ReplaceMiddleIndex(self):
tokens = self._parse("abc")
tokens.replace(1, "x")
tokens.replace(1, "y")
result = tokens.toString()
expecting = "ayc"
self.failUnlessEqual(result, expecting)
def test2ReplaceMiddleIndex1InsertBefore(self):
tokens = self._parse("abc")
tokens.insertBefore(0, "_")
tokens.replace(1, "x")
tokens.replace(1, "y")
result = tokens.toString()
expecting = "_ayc"
self.failUnlessEqual(expecting, result)
def testReplaceThenDeleteMiddleIndex(self):
tokens = self._parse("abc")
tokens.replace(1, "x")
tokens.delete(1)
result = tokens.toString()
expecting = "ac"
self.failUnlessEqual(result, expecting)
def testInsertInPriorReplace(self):
tokens = self._parse("abc")
tokens.replace(0, 2, "x")
tokens.insertBefore(1, "0")
try:
tokens.toString()
self.fail()
except ValueError, exc:
self.failUnlessEqual(
str(exc),
"insert op <InsertBeforeOp@1:\"0\"> within boundaries of "
"previous <ReplaceOp@0..2:\"x\">"
)
def testInsertThenReplaceSameIndex(self):
tokens = self._parse("abc")
tokens.insertBefore(0, "0")
tokens.replace(0, "x") # supercedes insert at 0
result = tokens.toString()
expecting = "0xbc"
self.failUnlessEqual(result, expecting)
def test2InsertMiddleIndex(self):
tokens = self._parse("abc")
tokens.insertBefore(1, "x")
tokens.insertBefore(1, "y")
result = tokens.toString()
expecting = "ayxbc"
self.failUnlessEqual(result, expecting)
def test2InsertThenReplaceIndex0(self):
tokens = self._parse("abc")
tokens.insertBefore(0, "x")
tokens.insertBefore(0, "y")
tokens.replace(0, "z")
result = tokens.toString()
expecting = "yxzbc"
self.failUnlessEqual(result, expecting)
def testReplaceThenInsertBeforeLastIndex(self):
tokens = self._parse("abc")
tokens.replace(2, "x")
tokens.insertBefore(2, "y")
result = tokens.toString()
expecting = "abyx"
self.failUnlessEqual(result, expecting)
def testInsertThenReplaceLastIndex(self):
tokens = self._parse("abc")
tokens.insertBefore(2, "y")
tokens.replace(2, "x")
result = tokens.toString()
expecting = "abyx"
self.failUnlessEqual(result, expecting)
def testReplaceThenInsertAfterLastIndex(self):
tokens = self._parse("abc")
tokens.replace(2, "x")
tokens.insertAfter(2, "y")
result = tokens.toString()
expecting = "abxy"
self.failUnlessEqual(result, expecting)
def testReplaceRangeThenInsertAtLeftEdge(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "x")
tokens.insertBefore(2, "y")
result = tokens.toString()
expecting = "abyxba"
self.failUnlessEqual(result, expecting)
def testReplaceRangeThenInsertAtRightEdge(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "x")
tokens.insertBefore(4, "y") # no effect; within range of a replace
try:
tokens.toString()
self.fail()
except ValueError, exc:
self.failUnlessEqual(
str(exc),
"insert op <InsertBeforeOp@4:\"y\"> within boundaries of "
"previous <ReplaceOp@2..4:\"x\">")
def testReplaceRangeThenInsertAfterRightEdge(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "x")
tokens.insertAfter(4, "y")
result = tokens.toString()
expecting = "abxyba"
self.failUnlessEqual(result, expecting)
def testReplaceAll(self):
tokens = self._parse("abcccba")
tokens.replace(0, 6, "x")
result = tokens.toString()
expecting = "x"
self.failUnlessEqual(result, expecting)
def testReplaceSubsetThenFetch(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "xyz")
result = tokens.toString(0, 6)
expecting = "abxyzba"
self.failUnlessEqual(result, expecting)
def testReplaceThenReplaceSuperset(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "xyz")
tokens.replace(3, 5, "foo") # overlaps, error
try:
tokens.toString()
self.fail()
except ValueError, exc:
self.failUnlessEqual(
str(exc),
"replace op boundaries of <ReplaceOp@3..5:\"foo\"> overlap "
"with previous <ReplaceOp@2..4:\"xyz\">")
def testReplaceThenReplaceLowerIndexedSuperset(self):
tokens = self._parse("abcccba")
tokens.replace(2, 4, "xyz")
tokens.replace(1, 3, "foo") # overlap, error
try:
tokens.toString()
self.fail()
except ValueError, exc:
self.failUnlessEqual(
str(exc),
"replace op boundaries of <ReplaceOp@1..3:\"foo\"> overlap "
"with previous <ReplaceOp@2..4:\"xyz\">")
def testReplaceSingleMiddleThenOverlappingSuperset(self):
tokens = self._parse("abcba")
tokens.replace(2, 2, "xyz")
tokens.replace(0, 3, "foo")
result = tokens.toString()
expecting = "fooa"
self.failUnlessEqual(result, expecting)
def testCombineInserts(self):
tokens = self._parse("abc")
tokens.insertBefore(0, "x")
tokens.insertBefore(0, "y")
result = tokens.toString()
expecting = "yxabc"
self.failUnlessEqual(expecting, result)
def testCombine3Inserts(self):
tokens = self._parse("abc")
tokens.insertBefore(1, "x")
tokens.insertBefore(0, "y")
tokens.insertBefore(1, "z")
result = tokens.toString()
expecting = "yazxbc"
self.failUnlessEqual(expecting, result)
def testCombineInsertOnLeftWithReplace(self):
tokens = self._parse("abc")
tokens.replace(0, 2, "foo")
tokens.insertBefore(0, "z") # combine with left edge of rewrite
result = tokens.toString()
expecting = "zfoo"
self.failUnlessEqual(expecting, result)
def testCombineInsertOnLeftWithDelete(self):
tokens = self._parse("abc")
tokens.delete(0, 2)
tokens.insertBefore(0, "z") # combine with left edge of rewrite
result = tokens.toString()
expecting = "z" # make sure combo is not znull
self.failUnlessEqual(expecting, result)
def testDisjointInserts(self):
tokens = self._parse("abc")
tokens.insertBefore(1, "x")
tokens.insertBefore(2, "y")
tokens.insertBefore(0, "z")
result = tokens.toString()
expecting = "zaxbyc"
self.failUnlessEqual(expecting, result)
def testOverlappingReplace(self):
tokens = self._parse("abcc")
tokens.replace(1, 2, "foo")
tokens.replace(0, 3, "bar") # wipes prior nested replace
result = tokens.toString()
expecting = "bar"
self.failUnlessEqual(expecting, result)
def testOverlappingReplace2(self):
tokens = self._parse("abcc")
tokens.replace(0, 3, "bar")
tokens.replace(1, 2, "foo") # cannot split earlier replace
try:
tokens.toString()
self.fail()
except ValueError, exc:
self.failUnlessEqual(
str(exc),
"replace op boundaries of <ReplaceOp@1..2:\"foo\"> overlap "
"with previous <ReplaceOp@0..3:\"bar\">")
def testOverlappingReplace3(self):
tokens = self._parse("abcc")
tokens.replace(1, 2, "foo")
tokens.replace(0, 2, "bar") # wipes prior nested replace
result = tokens.toString()
expecting = "barc"
self.failUnlessEqual(expecting, result)
def testOverlappingReplace4(self):
tokens = self._parse("abcc")
tokens.replace(1, 2, "foo")
tokens.replace(1, 3, "bar") # wipes prior nested replace
result = tokens.toString()
expecting = "abar"
self.failUnlessEqual(expecting, result)
def testDropIdenticalReplace(self):
tokens = self._parse("abcc")
tokens.replace(1, 2, "foo")
tokens.replace(1, 2, "foo") # drop previous, identical
result = tokens.toString()
expecting = "afooc"
self.failUnlessEqual(expecting, result)
def testDropPrevCoveredInsert(self):
tokens = self._parse("abc")
tokens.insertBefore(1, "foo")
tokens.replace(1, 2, "foo") # kill prev insert
result = tokens.toString()
expecting = "afoofoo"
self.failUnlessEqual(expecting, result)
def testLeaveAloneDisjointInsert(self):
tokens = self._parse("abcc")
tokens.insertBefore(1, "x")
tokens.replace(2, 3, "foo")
result = tokens.toString()
expecting = "axbfoo"
self.failUnlessEqual(expecting, result)
def testLeaveAloneDisjointInsert2(self):
tokens = self._parse("abcc")
tokens.replace(2, 3, "foo")
tokens.insertBefore(1, "x")
result = tokens.toString()
expecting = "axbfoo"
self.failUnlessEqual(expecting, result)
def testInsertBeforeTokenThenDeleteThatToken(self):
tokens = self._parse("abc")
tokens.insertBefore(2, "y")
tokens.delete(2)
result = tokens.toString()
expecting = "aby"
self.failUnlessEqual(expecting, result)
class T2(testbase.ANTLRTest):
def setUp(self):
self.compileGrammar('t048rewrite2.g')
def _parse(self, input):
cStream = antlr3.StringStream(input)
lexer = self.getLexer(cStream)
tStream = antlr3.TokenRewriteStream(lexer)
tStream.fillBuffer()
return tStream
def testToStringStartStop(self):
# Tokens: 0123456789
# Input: x = 3 * 0
tokens = self._parse("x = 3 * 0;")
tokens.replace(4, 8, "0") # replace 3 * 0 with 0
result = tokens.toOriginalString()
expecting = "x = 3 * 0;"
self.failUnlessEqual(expecting, result)
result = tokens.toString()
expecting = "x = 0;"
self.failUnlessEqual(expecting, result)
result = tokens.toString(0, 9)
expecting = "x = 0;"
self.failUnlessEqual(expecting, result)
result = tokens.toString(4, 8)
expecting = "0"
self.failUnlessEqual(expecting, result)
def testToStringStartStop2(self):
# Tokens: 012345678901234567
# Input: x = 3 * 0 + 2 * 0
tokens = self._parse("x = 3 * 0 + 2 * 0;")
result = tokens.toOriginalString()
expecting = "x = 3 * 0 + 2 * 0;"
self.failUnlessEqual(expecting, result)
tokens.replace(4, 8, "0") # replace 3 * 0 with 0
result = tokens.toString()
expecting = "x = 0 + 2 * 0;"
self.failUnlessEqual(expecting, result)
result = tokens.toString(0, 17)
expecting = "x = 0 + 2 * 0;"
self.failUnlessEqual(expecting, result)
result = tokens.toString(4, 8)
expecting = "0"
self.failUnlessEqual(expecting, result)
result = tokens.toString(0, 8)
expecting = "x = 0"
self.failUnlessEqual(expecting, result)
result = tokens.toString(12, 16)
expecting = "2 * 0"
self.failUnlessEqual(expecting, result)
tokens.insertAfter(17, "// comment")
result = tokens.toString(12, 18)
expecting = "2 * 0;// comment"
self.failUnlessEqual(expecting, result)
result = tokens.toString(0, 8) # try again after insert at end
expecting = "x = 0"
self.failUnlessEqual(expecting, result)
if __name__ == '__main__':
unittest.main()