xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t018llstar.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotimport antlr3
2*16467b97STreehugger Robotimport testbase
3*16467b97STreehugger Robotimport unittest
4*16467b97STreehugger Robotimport os
5*16467b97STreehugger Robotimport sys
6*16467b97STreehugger Robotfrom cStringIO import StringIO
7*16467b97STreehugger Robotimport difflib
8*16467b97STreehugger Robot
9*16467b97STreehugger Robotclass t018llstar(testbase.ANTLRTest):
10*16467b97STreehugger Robot    def setUp(self):
11*16467b97STreehugger Robot        self.compileGrammar()
12*16467b97STreehugger Robot
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot    def testValid(self):
15*16467b97STreehugger Robot        inputPath = os.path.splitext(__file__)[0] + '.input'
16*16467b97STreehugger Robot        cStream = antlr3.StringStream(open(inputPath).read())
17*16467b97STreehugger Robot        lexer = self.getLexer(cStream)
18*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
19*16467b97STreehugger Robot        parser = self.getParser(tStream)
20*16467b97STreehugger Robot        parser.program()
21*16467b97STreehugger Robot
22*16467b97STreehugger Robot        output = parser.output.getvalue()
23*16467b97STreehugger Robot
24*16467b97STreehugger Robot        outputPath = os.path.splitext(__file__)[0] + '.output'
25*16467b97STreehugger Robot        testOutput = open(outputPath).read()
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot        success = (output == testOutput)
28*16467b97STreehugger Robot        if not success:
29*16467b97STreehugger Robot            d = difflib.Differ()
30*16467b97STreehugger Robot            r = d.compare(output.splitlines(1), testOutput.splitlines(1))
31*16467b97STreehugger Robot            self.fail(
32*16467b97STreehugger Robot                ''.join([l.encode('ascii', 'backslashreplace') for l in r])
33*16467b97STreehugger Robot                )
34*16467b97STreehugger Robot
35*16467b97STreehugger Robotif __name__ == '__main__':
36*16467b97STreehugger Robot    unittest.main()
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot## # run an infinite loop with randomly mangled input
41*16467b97STreehugger Robot## while True:
42*16467b97STreehugger Robot##     print "ping"
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot##     input = open(inputPath).read()
45*16467b97STreehugger Robot
46*16467b97STreehugger Robot##     import random
47*16467b97STreehugger Robot##     input = list(input) # make it mutable
48*16467b97STreehugger Robot##     for _ in range(3):
49*16467b97STreehugger Robot##         p1 = random.randrange(len(input))
50*16467b97STreehugger Robot##         p2 = random.randrange(len(input))
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot##         c1 = input[p1]
53*16467b97STreehugger Robot##         input[p1] = input[p2]
54*16467b97STreehugger Robot##         input[p2] = c1
55*16467b97STreehugger Robot##     input = ''.join(input) # back to string
56*16467b97STreehugger Robot
57*16467b97STreehugger Robot
58*16467b97STreehugger Robot##     try:
59*16467b97STreehugger Robot##         cStream = antlr3.StringStream(input)
60*16467b97STreehugger Robot##         lexer = Lexer(cStream)
61*16467b97STreehugger Robot##         tStream = antlr3.CommonTokenStream(lexer)
62*16467b97STreehugger Robot##         parser = TestParser(tStream)
63*16467b97STreehugger Robot##         parser.program()
64*16467b97STreehugger Robot
65*16467b97STreehugger Robot##     except antlr3.RecognitionException, exc:
66*16467b97STreehugger Robot##         print exc
67*16467b97STreehugger Robot##         for l in input.splitlines()[0:exc.line]:
68*16467b97STreehugger Robot##             print l
69*16467b97STreehugger Robot##         print ' '*exc.charPositionInLine + '^'
70*16467b97STreehugger Robot
71*16467b97STreehugger Robot##     except BaseException, exc:
72*16467b97STreehugger Robot##         print '\n'.join(['%02d: %s' % (idx+1, l) for idx, l in enumerate(input.splitlines())])
73*16467b97STreehugger Robot##         print "%s at %d:%d" % (exc, cStream.line, cStream.charPositionInLine)
74*16467b97STreehugger Robot##         print
75*16467b97STreehugger Robot
76*16467b97STreehugger Robot##         raise
77