<!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>t008lexer</title>

<!-- ANTLR includes -->
<script type="text/javascript" src="../../lib/antlr3-all.js"></script>
<script type="text/javascript" src="t008lexer.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, t008lexer, {
        reportError: function(re) {
            /* don't recover, just crash */
            throw re;
        }
    });

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

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

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

        token = lexer.nextToken();
        assertEquals(token.getType(), lexer.FOO);
        assertEquals(token.getStartIndex(), 3);
        assertEquals(token.getStopIndex(), 3);
        assertEquals(token.getText(), 'f');

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

    function testMalformedInput() {
        var stream = new org.antlr.runtime.ANTLRStringStream('fafb'),
            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.getUnexpectedType(), 'b');
            assertEquals(e.charPositionInLine, 3);
            assertEquals(e.line, 1);
        }
    }
</script>

</head>
<body>
    <h1>t008lexer</h1>
</body>
