| import antlr3 |
| import testbase |
| import unittest |
| import os |
| import sys |
| from io import StringIO |
| import textwrap |
| |
| class t012lexerXML(testbase.ANTLRTest): |
| def setUp(self): |
| self.compileGrammar('t012lexerXMLLexer.g') |
| |
| |
| def lexerClass(self, base): |
| class TLexer(base): |
| def emitErrorMessage(self, msg): |
| # report errors to /dev/null |
| pass |
| |
| def reportError(self, re): |
| # no error recovery yet, just crash! |
| raise re |
| |
| return TLexer |
| |
| |
| def testValid(self): |
| inputPath = os.path.splitext(__file__)[0] + '.input' |
| with open(inputPath) as f: |
| data = f.read() |
| stream = antlr3.StringStream(data) |
| lexer = self.getLexer(stream) |
| |
| while True: |
| token = lexer.nextToken() |
| if token.type == self.lexerModule.EOF: |
| break |
| |
| |
| output = lexer.outbuf.getvalue() |
| |
| outputPath = os.path.splitext(__file__)[0] + '.output' |
| |
| with open(outputPath) as f: |
| testOutput = f.read() |
| |
| self.assertEqual(output, testOutput) |
| |
| |
| def testMalformedInput1(self): |
| input = textwrap.dedent("""\ |
| <?xml version='1.0'?> |
| <document d> |
| </document> |
| """) |
| |
| stream = antlr3.StringStream(input) |
| lexer = self.getLexer(stream) |
| |
| try: |
| while True: |
| token = lexer.nextToken() |
| # Should raise NoViableAltException before hitting EOF |
| if token.type == antlr3.EOF: |
| self.fail() |
| |
| except antlr3.NoViableAltException as exc: |
| self.assertEqual(exc.unexpectedType, '>') |
| self.assertEqual(exc.charPositionInLine, 11) |
| self.assertEqual(exc.line, 2) |
| |
| |
| def testMalformedInput2(self): |
| input = textwrap.dedent("""\ |
| <?tml version='1.0'?> |
| <document> |
| </document> |
| """) |
| |
| stream = antlr3.StringStream(input) |
| lexer = self.getLexer(stream) |
| |
| try: |
| while True: |
| token = lexer.nextToken() |
| # Should raise NoViableAltException before hitting EOF |
| if token.type == antlr3.EOF: |
| self.fail() |
| |
| except antlr3.MismatchedSetException as exc: |
| self.assertEqual(exc.unexpectedType, 't') |
| self.assertEqual(exc.charPositionInLine, 2) |
| self.assertEqual(exc.line, 1) |
| |
| |
| def testMalformedInput3(self): |
| input = textwrap.dedent("""\ |
| <?xml version='1.0'?> |
| <docu ment attr="foo"> |
| </document> |
| """) |
| |
| stream = antlr3.StringStream(input) |
| lexer = self.getLexer(stream) |
| |
| try: |
| while True: |
| token = lexer.nextToken() |
| # Should raise NoViableAltException before hitting EOF |
| if token.type == antlr3.EOF: |
| self.fail() |
| |
| except antlr3.NoViableAltException as exc: |
| self.assertEqual(exc.unexpectedType, 'a') |
| self.assertEqual(exc.charPositionInLine, 11) |
| self.assertEqual(exc.line, 2) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |