# -*- coding: utf-8 -*-
import os
import unittest
from StringIO import StringIO
import antlr3
class TestStringStream(unittest.TestCase):
"""Test case for the StringStream class."""
def testSize(self):
"""StringStream.size()"""
stream = antlr3.StringStream('foo')
self.failUnlessEqual(stream.size(), 3)
def testIndex(self):
"""StringStream.index()"""
stream = antlr3.StringStream('foo')
self.failUnlessEqual(stream.index(), 0)
def testConsume(self):
"""StringStream.consume()"""
stream = antlr3.StringStream('foo\nbar')
stream.consume() # f
self.failUnlessEqual(stream.index(), 1)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.line, 1)
stream.consume() # o
self.failUnlessEqual(stream.index(), 2)
self.failUnlessEqual(stream.charPositionInLine, 2)
self.failUnlessEqual(stream.line, 1)
stream.consume() # o
self.failUnlessEqual(stream.index(), 3)
self.failUnlessEqual(stream.charPositionInLine, 3)
self.failUnlessEqual(stream.line, 1)
stream.consume() # \n
self.failUnlessEqual(stream.index(), 4)
self.failUnlessEqual(stream.charPositionInLine, 0)
self.failUnlessEqual(stream.line, 2)
stream.consume() # b
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.line, 2)
stream.consume() # a
self.failUnlessEqual(stream.index(), 6)
self.failUnlessEqual(stream.charPositionInLine, 2)
self.failUnlessEqual(stream.line, 2)
stream.consume() # r
self.failUnlessEqual(stream.index(), 7)
self.failUnlessEqual(stream.charPositionInLine, 3)
self.failUnlessEqual(stream.line, 2)
stream.consume() # EOF
self.failUnlessEqual(stream.index(), 7)
self.failUnlessEqual(stream.charPositionInLine, 3)
self.failUnlessEqual(stream.line, 2)
stream.consume() # EOF
self.failUnlessEqual(stream.index(), 7)
self.failUnlessEqual(stream.charPositionInLine, 3)
self.failUnlessEqual(stream.line, 2)
def testReset(self):
"""StringStream.reset()"""
stream = antlr3.StringStream('foo')
stream.consume()
stream.consume()
stream.reset()
self.failUnlessEqual(stream.index(), 0)
self.failUnlessEqual(stream.line, 1)
self.failUnlessEqual(stream.charPositionInLine, 0)
self.failUnlessEqual(stream.LT(1), 'f')
def testLA(self):
"""StringStream.LA()"""
stream = antlr3.StringStream('foo')
self.failUnlessEqual(stream.LT(1), 'f')
self.failUnlessEqual(stream.LT(2), 'o')
self.failUnlessEqual(stream.LT(3), 'o')
stream.consume()
stream.consume()
self.failUnlessEqual(stream.LT(1), 'o')
self.failUnlessEqual(stream.LT(2), antlr3.EOF)
self.failUnlessEqual(stream.LT(3), antlr3.EOF)
def testSubstring(self):
"""StringStream.substring()"""
stream = antlr3.StringStream('foobar')
self.failUnlessEqual(stream.substring(0, 0), 'f')
self.failUnlessEqual(stream.substring(0, 1), 'fo')
self.failUnlessEqual(stream.substring(0, 5), 'foobar')
self.failUnlessEqual(stream.substring(3, 5), 'bar')
def testSeekForward(self):
"""StringStream.seek(): forward"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
self.failUnlessEqual(stream.index(), 4)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 0)
self.failUnlessEqual(stream.LT(1), 'b')
## # not yet implemented
## def testSeekBackward(self):
## """StringStream.seek(): backward"""
## stream = antlr3.StringStream('foo\nbar')
## stream.seek(4)
## stream.seek(1)
## self.failUnlessEqual(stream.index(), 1)
## self.failUnlessEqual(stream.line, 1)
## self.failUnlessEqual(stream.charPositionInLine, 1)
## self.failUnlessEqual(stream.LA(1), 'o')
def testMark(self):
"""StringStream.mark()"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
marker = stream.mark()
self.failUnlessEqual(marker, 1)
self.failUnlessEqual(stream.markDepth, 1)
stream.consume()
marker = stream.mark()
self.failUnlessEqual(marker, 2)
self.failUnlessEqual(stream.markDepth, 2)
def testReleaseLast(self):
"""StringStream.release(): last marker"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.release()
self.failUnlessEqual(stream.markDepth, 1)
# release same marker again, nothing has changed
stream.release()
self.failUnlessEqual(stream.markDepth, 1)
def testReleaseNested(self):
"""StringStream.release(): nested"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.release(marker2)
self.failUnlessEqual(stream.markDepth, 1)
def testRewindLast(self):
"""StringStream.rewind(): last marker"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
marker = stream.mark()
stream.consume()
stream.consume()
stream.rewind()
self.failUnlessEqual(stream.markDepth, 0)
self.failUnlessEqual(stream.index(), 4)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 0)
self.failUnlessEqual(stream.LT(1), 'b')
def testRewindNested(self):
"""StringStream.rewind(): nested"""
stream = antlr3.StringStream('foo\nbar')
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.rewind(marker2)
self.failUnlessEqual(stream.markDepth, 1)
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.LT(1), 'a')
class TestFileStream(unittest.TestCase):
"""Test case for the FileStream class."""
def testNoEncoding(self):
path = os.path.join(os.path.dirname(__file__), 'teststreams.input1')
stream = antlr3.FileStream(path)
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.rewind(marker2)
self.failUnlessEqual(stream.markDepth, 1)
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.LT(1), 'a')
self.failUnlessEqual(stream.LA(1), ord('a'))
def testEncoded(self):
path = os.path.join(os.path.dirname(__file__), 'teststreams.input2')
stream = antlr3.FileStream(path, 'utf-8')
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.rewind(marker2)
self.failUnlessEqual(stream.markDepth, 1)
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.LT(1), u'ä')
self.failUnlessEqual(stream.LA(1), ord(u'ä'))
class TestInputStream(unittest.TestCase):
"""Test case for the InputStream class."""
def testNoEncoding(self):
file = StringIO('foo\nbar')
stream = antlr3.InputStream(file)
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.rewind(marker2)
self.failUnlessEqual(stream.markDepth, 1)
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.LT(1), 'a')
self.failUnlessEqual(stream.LA(1), ord('a'))
def testEncoded(self):
file = StringIO(u'foo\nbär'.encode('utf-8'))
stream = antlr3.InputStream(file, 'utf-8')
stream.seek(4)
marker1 = stream.mark()
stream.consume()
marker2 = stream.mark()
stream.consume()
marker3 = stream.mark()
stream.rewind(marker2)
self.failUnlessEqual(stream.markDepth, 1)
self.failUnlessEqual(stream.index(), 5)
self.failUnlessEqual(stream.line, 2)
self.failUnlessEqual(stream.charPositionInLine, 1)
self.failUnlessEqual(stream.LT(1), u'ä')
self.failUnlessEqual(stream.LA(1), ord(u'ä'))
class TestCommonTokenStream(unittest.TestCase):
"""Test case for the StringStream class."""
def setUp(self):
"""Setup test fixure
The constructor of CommonTokenStream needs a token source. This
is a simple mock class providing just the nextToken() method.
"""
class MockSource(object):
def __init__(self):
self.tokens = []
def makeEOFToken(self):
return antlr3.CommonToken(type=antlr3.EOF)
def nextToken(self):
try:
return self.tokens.pop(0)
except IndexError:
return None
self.source = MockSource()
def testInit(self):
"""CommonTokenStream.__init__()"""
stream = antlr3.CommonTokenStream(self.source)
self.failUnlessEqual(stream.index(), -1)
def testSetTokenSource(self):
"""CommonTokenStream.setTokenSource()"""
stream = antlr3.CommonTokenStream(None)
stream.setTokenSource(self.source)
self.failUnlessEqual(stream.index(), -1)
self.failUnlessEqual(stream.channel, antlr3.DEFAULT_CHANNEL)
def testLTEmptySource(self):
"""CommonTokenStream.LT(): EOF (empty source)"""
stream = antlr3.CommonTokenStream(self.source)
lt1 = stream.LT(1)
self.failUnlessEqual(lt1.type, antlr3.EOF)
def testLT1(self):
"""CommonTokenStream.LT(1)"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
stream = antlr3.CommonTokenStream(self.source)
lt1 = stream.LT(1)
self.failUnlessEqual(lt1.type, 12)
def testLT1WithHidden(self):
"""CommonTokenStream.LT(1): with hidden tokens"""
self.source.tokens.append(
antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
stream = antlr3.CommonTokenStream(self.source)
lt1 = stream.LT(1)
self.failUnlessEqual(lt1.type, 13)
def testLT2BeyondEnd(self):
"""CommonTokenStream.LT(2): beyond end"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13, channel=antlr3.HIDDEN_CHANNEL)
)
stream = antlr3.CommonTokenStream(self.source)
lt1 = stream.LT(2)
self.failUnlessEqual(lt1.type, antlr3.EOF)
# not yet implemented
def testLTNegative(self):
"""CommonTokenStream.LT(-1): look back"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
stream = antlr3.CommonTokenStream(self.source)
stream.fillBuffer()
stream.consume()
lt1 = stream.LT(-1)
self.failUnlessEqual(lt1.type, 12)
def testLB1(self):
"""CommonTokenStream.LB(1)"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
stream = antlr3.CommonTokenStream(self.source)
stream.fillBuffer()
stream.consume()
self.failUnlessEqual(stream.LB(1).type, 12)
def testLTZero(self):
"""CommonTokenStream.LT(0)"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
stream = antlr3.CommonTokenStream(self.source)
lt1 = stream.LT(0)
self.failUnless(lt1 is None)
def testLBBeyondBegin(self):
"""CommonTokenStream.LB(-1): beyond begin"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
)
self.source.tokens.append(
antlr3.CommonToken(type=12, channel=antlr3.HIDDEN_CHANNEL)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
stream = antlr3.CommonTokenStream(self.source)
self.failUnless(stream.LB(1) is None)
stream.consume()
stream.consume()
self.failUnless(stream.LB(3) is None)
def testFillBuffer(self):
"""CommonTokenStream.fillBuffer()"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
self.source.tokens.append(
antlr3.CommonToken(type=14)
)
self.source.tokens.append(
antlr3.CommonToken(type=antlr3.EOF)
)
stream = antlr3.CommonTokenStream(self.source)
stream.fillBuffer()
self.failUnlessEqual(len(stream.tokens), 3)
self.failUnlessEqual(stream.tokens[0].type, 12)
self.failUnlessEqual(stream.tokens[1].type, 13)
self.failUnlessEqual(stream.tokens[2].type, 14)
def testConsume(self):
"""CommonTokenStream.consume()"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
self.source.tokens.append(
antlr3.CommonToken(type=antlr3.EOF)
)
stream = antlr3.CommonTokenStream(self.source)
self.failUnlessEqual(stream.LA(1), 12)
stream.consume()
self.failUnlessEqual(stream.LA(1), 13)
stream.consume()
self.failUnlessEqual(stream.LA(1), antlr3.EOF)
stream.consume()
self.failUnlessEqual(stream.LA(1), antlr3.EOF)
def testSeek(self):
"""CommonTokenStream.seek()"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
self.source.tokens.append(
antlr3.CommonToken(type=antlr3.EOF)
)
stream = antlr3.CommonTokenStream(self.source)
self.failUnlessEqual(stream.LA(1), 12)
stream.seek(2)
self.failUnlessEqual(stream.LA(1), antlr3.EOF)
stream.seek(0)
self.failUnlessEqual(stream.LA(1), 12)
def testMarkRewind(self):
"""CommonTokenStream.mark()/rewind()"""
self.source.tokens.append(
antlr3.CommonToken(type=12)
)
self.source.tokens.append(
antlr3.CommonToken(type=13)
)
self.source.tokens.append(
antlr3.CommonToken(type=antlr3.EOF)
)
stream = antlr3.CommonTokenStream(self.source)
stream.fillBuffer()
stream.consume()
marker = stream.mark()
stream.consume()
stream.rewind(marker)
self.failUnlessEqual(stream.LA(1), 13)
def testToString(self):
"""CommonTokenStream.toString()"""
self.source.tokens.append(
antlr3.CommonToken(type=12, text="foo")
)
self.source.tokens.append(
antlr3.CommonToken(type=13, text="bar")
)
self.source.tokens.append(
antlr3.CommonToken(type=14, text="gnurz")
)
self.source.tokens.append(
antlr3.CommonToken(type=15, text="blarz")
)
stream = antlr3.CommonTokenStream(self.source)
assert stream.toString() == "foobargnurzblarz"
assert stream.toString(1, 2) == "bargnurz"
assert stream.toString(stream.tokens[1], stream.tokens[-2]) == "bargnurz"
if __name__ == "__main__":
unittest.main(testRunner=unittest.TextTestRunner(verbosity=2))