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