<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>t006lexer</title>

<!-- ANTLR includes -->
<script type="text/javascript" src="../../lib/antlr3-all.js"></script>
<script type="text/javascript" src="t006lexer.js"></script>

<!-- JsUnit include -->
<script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script>

<!-- Test Code -->
<script type="text/javascript">
    function TLexer() {
        TLexer.superclass.constructor.apply(this, arguments);
    }
    org.antlr.lang.extend(TLexer, t006lexer, {
        reportError: function(re) {
            /* don't recover, just crash */
            throw re;
        }
    });

    function testValid() {
        var stream = new org.antlr.runtime.ANTLRStringStream("fofaaooa"),
            lexer = new TLexer(stream),
            token;

        token = lexer.nextToken();
        assertEquals(token.getType(), lexer.FOO);
        assertEquals(token.getStartIndex(), 0);
        assertEquals(token.getStopIndex(), 1);
        assertEquals(token.getText(), "fo");

        token = lexer.nextToken();
        assertEquals(token.getType(), lexer.FOO);
        assertEquals(token.getStartIndex(), 2);
        assertEquals(token.getStopIndex(), 7);
        assertEquals(token.getText(), 'faaooa');

        token = lexer.nextToken();
        assertEquals(token.getType(), lexer.EOF);
    }

    function testMalformedInput() {
        var stream = new org.antlr.runtime.ANTLRStringStream('fofoaooaoa2'),
            lexer = new TLexer(stream),
            token;

        lexer.nextToken();
        lexer.nextToken();
        try {
            token = lexer.nextToken();
            fail("nextToken should have thrown error on invalid input");
        } catch (e) {
            assertEquals(e.expecting, 'f');
            assertEquals(e.getUnexpectedType(), '2');
            assertEquals(e.charPositionInLine, 10);
            assertEquals(e.line, 1);
        }
    }
</script>

</head>
<body>
    <h1>t006lexer</h1>
</body>
