xref: /aosp_15_r20/external/antlr/runtime/Python3/tests/t015calc.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotimport antlr3
2*16467b97STreehugger Robotimport testbase
3*16467b97STreehugger Robotimport unittest
4*16467b97STreehugger Robot
5*16467b97STreehugger Robotclass t015calc(testbase.ANTLRTest):
6*16467b97STreehugger Robot    def setUp(self):
7*16467b97STreehugger Robot        self.compileGrammar()
8*16467b97STreehugger Robot
9*16467b97STreehugger Robot
10*16467b97STreehugger Robot    def _evaluate(self, expr, expected, errors=[]):
11*16467b97STreehugger Robot        cStream = antlr3.StringStream(expr)
12*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
13*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
14*16467b97STreehugger Robot        parser = self.getParser(tStream)
15*16467b97STreehugger Robot        result = parser.evaluate()
16*16467b97STreehugger Robot        self.assertEqual(result, expected)
17*16467b97STreehugger Robot        self.assertEqual(len(parser.reportedErrors), len(errors),
18*16467b97STreehugger Robot                         parser.reportedErrors)
19*16467b97STreehugger Robot
20*16467b97STreehugger Robot
21*16467b97STreehugger Robot    def testValid01(self):
22*16467b97STreehugger Robot        self._evaluate("1 + 2", 3)
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot
25*16467b97STreehugger Robot    def testValid02(self):
26*16467b97STreehugger Robot        self._evaluate("1 + 2 * 3", 7)
27*16467b97STreehugger Robot
28*16467b97STreehugger Robot
29*16467b97STreehugger Robot    def testValid03(self):
30*16467b97STreehugger Robot        self._evaluate("10 / 2", 5)
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot
33*16467b97STreehugger Robot    def testValid04(self):
34*16467b97STreehugger Robot        self._evaluate("6 + 2*(3+1) - 4", 10)
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot
37*16467b97STreehugger Robot    def testMalformedInput(self):
38*16467b97STreehugger Robot        self._evaluate("6 - (2*1", 4, ["mismatched token at pos 8"])
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot    # FIXME: most parse errors result in TypeErrors in action code, because
41*16467b97STreehugger Robot    # rules return None, which is then added/multiplied... to integers.
42*16467b97STreehugger Robot    # evaluate("6 - foo 2", 4, ["some error"])
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot
45*16467b97STreehugger Robotif __name__ == '__main__':
46*16467b97STreehugger Robot    unittest.main()
47*16467b97STreehugger Robot
48