import antlr3
import testbase
import unittest
import os
import sys
from cStringIO import StringIO
import difflib

class t018llstar(testbase.ANTLRTest):
    def setUp(self):
        self.compileGrammar()
        

    def testValid(self):
        inputPath = os.path.splitext(__file__)[0] + '.input'
        cStream = antlr3.StringStream(open(inputPath).read())
        lexer = self.getLexer(cStream)
        tStream = antlr3.CommonTokenStream(lexer)
        parser = self.getParser(tStream)
        parser.program()

        output = parser.output.getvalue()

        outputPath = os.path.splitext(__file__)[0] + '.output'
        testOutput = open(outputPath).read()

        success = (output == testOutput)
        if not success:
            d = difflib.Differ()
            r = d.compare(output.splitlines(1), testOutput.splitlines(1))
            self.fail(
                ''.join([l.encode('ascii', 'backslashreplace') for l in r])
                )

if __name__ == '__main__':
    unittest.main()


    
## # run an infinite loop with randomly mangled input
## while True:
##     print "ping"

##     input = open(inputPath).read()

##     import random
##     input = list(input) # make it mutable
##     for _ in range(3):
##         p1 = random.randrange(len(input))
##         p2 = random.randrange(len(input))

##         c1 = input[p1]
##         input[p1] = input[p2]
##         input[p2] = c1
##     input = ''.join(input) # back to string

        
##     try:
##         cStream = antlr3.StringStream(input)
##         lexer = Lexer(cStream)
##         tStream = antlr3.CommonTokenStream(lexer)
##         parser = TestParser(tStream)
##         parser.program()

##     except antlr3.RecognitionException, exc:
##         print exc
##         for l in input.splitlines()[0:exc.line]:
##             print l
##         print ' '*exc.charPositionInLine + '^'

##     except BaseException, exc:
##         print '\n'.join(['%02d: %s' % (idx+1, l) for idx, l in enumerate(input.splitlines())])
##         print "%s at %d:%d" % (exc, cStream.line, cStream.charPositionInLine)
##         print
        
##         raise