/* Test Infrastructure */

function loadFile(fileName, encoding) {
    var f = new java.io.File(fileName),
        size = f.length(),
        isr,
        fis = new java.io.FileInputStream(f);
    if (encoding) {
        isr = new java.io.InputStreamReader(fis, encoding);
    } else {
        isr = new java.io.InputStreamReader(fis);
    }

    /* Should use the ternary version of isr.read here, but can't figure
     * out how to create a Java char array from JS. . .
     * @todo
     */
    var charCode, data=[];
    while ((charCode = isr.read()) >= 0) {
        data.push(String.fromCharCode(charCode));
    }
    return data.join("");
}

eval(loadFile("../../lib/antlr3-all.js"));
eval(loadFile("../../lib/antlr3-cli.js"));
eval(loadFile("PythonLexer.js"));
eval(loadFile("PythonParser.js"));
eval(loadFile("rhino-python.extensions"));

/* Parser Extensions */

var output = [];
function xlog(msg) {
    output.push(msg);
}

function MyLexer() {
    MyLexer.superclass.constructor.apply(this, arguments);
}
ANTLR.lang.extend(MyLexer, PythonLexer, {
    nextToken: function() {
        // keep track of this token's position in line because Python is
        // whitespace sensitive
        this.startPos = this.getCharPositionInLine();
        return MyLexer.superclass.nextToken.call(this);
    }
});
MyLexer.prototype.emitErrorMessage = function(msg) {xlog(msg);}
PythonParser.prototype.emitErrorMessage = function(msg) {xlog(msg);}

/* Test */

function parse(text) {        
    try {    
        var input = new ANTLR.runtime.ANTLRStringStream(text);
        var lexer = new MyLexer(input);              
        var tokens = new ANTLR.runtime.CommonTokenStream(lexer);
        tokens.discardOffChannelTokens=true;
        var indentedSource = new PythonTokenSource(tokens);
        tokens = new ANTLR.runtime.CommonTokenStream(indentedSource);
        var parser = new PythonParser(tokens);
        parser.file_input();
    } catch (e) {
        xlog(e.toString());
    } finally {
    }
}

var input = loadFile("rhino-python.input");
var expected = loadFile("rhino-python.output");
parse(input);
var actual = output.join("\n")+"\n";
if (actual==expected) {
    print("Test Passed!");
} else {
    print("Test Failed!");
    print(actual);
    print(expected);
}
