1import antlr3
2import testbase
3import unittest
4
5class t017parser(testbase.ANTLRTest):
6    def setUp(self):
7        self.compileGrammar()
8
9    def parserClass(self, base):
10        class TestParser(base):
11            def __init__(self, *args, **kwargs):
12                base.__init__(self, *args, **kwargs)
13
14                self.reportedErrors = []
15
16
17            def emitErrorMessage(self, msg):
18                self.reportedErrors.append(msg)
19
20        return TestParser
21
22
23    def testValid(self):
24        cStream = antlr3.StringStream("int foo;")
25        lexer = self.getLexer(cStream)
26        tStream = antlr3.CommonTokenStream(lexer)
27        parser = self.getParser(tStream)
28        parser.program()
29
30        assert len(parser.reportedErrors) == 0, parser.reportedErrors
31
32
33    def testMalformedInput1(self):
34        cStream = antlr3.StringStream('int foo() { 1+2 }')
35        lexer = self.getLexer(cStream)
36        tStream = antlr3.CommonTokenStream(lexer)
37        parser = self.getParser(tStream)
38        parser.program()
39
40        # FIXME: currently strings with formatted errors are collected
41        # can't check error locations yet
42        assert len(parser.reportedErrors) == 1, parser.reportedErrors
43
44
45    def testMalformedInput2(self):
46        cStream = antlr3.StringStream('int foo() { 1+; 1+2 }')
47        lexer = self.getLexer(cStream)
48        tStream = antlr3.CommonTokenStream(lexer)
49        parser = self.getParser(tStream)
50        parser.program()
51
52        # FIXME: currently strings with formatted errors are collected
53        # can't check error locations yet
54        assert len(parser.reportedErrors) == 2, parser.reportedErrors
55
56
57if __name__ == '__main__':
58    unittest.main()
59