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

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

    function testValid() {
        var xinput = [
                "<?xml version='1.0'?>",
                "<!DOCTYPE component [",
                "<!ELEMENT component (PCDATA|sub)*>",
                "<!ATTLIST component",
                "          attr CDATA #IMPLIED",
                "          attr2 CDATA #IMPLIED",
                ">",
                "<!ELMENT sub EMPTY>",
                "",
                "]>",
                "<component attr=\"val'ue\" attr2='val\"ue'>",
                "<!-- This is a comment -->",
                "Text",
                "<![CDATA[huhu]]>",
                "öäüß",
                "&amp;",
                "&lt;",
                "<?xtal cursor='11'?>",
                "<sub/>",
                "<sub></sub>",
                "</component>"
            ].join("\n"),
            xoutput = [
                "XML declaration",
                "Attr: version='1.0'",
                "ROOTELEMENT: component",
                "INTERNAL DTD: [",
                "<!ELEMENT component (PCDATA|sub)*>",
                "<!ATTLIST component",
                "          attr CDATA #IMPLIED",
                "          attr2 CDATA #IMPLIED",
                ">",
                "<!ELMENT sub EMPTY>",
                "",
                "]",
                "Start Tag: component",
                "Attr: attr=\"val'ue\"",
                "Attr: attr2='val\"ue'",
                "PCDATA: \"",
                "\"",
                "Comment: \"<!-- This is a comment -->\"",
                "PCDATA: \"",
                "Text",
                "\"",
                "CDATA: \"<![CDATA[huhu]]>\"",
                "PCDATA: \"",
                "öäüß",
                "&amp;",
                "&lt;",
                "\"",
                "PI: xtal",
                "Attr: cursor='11'",
                "PCDATA: \"",
                "\"",
                "Empty Element: sub",
                "PCDATA: \"",
                "\"",
                "Start Tag: sub",
                "End Tag: sub",
                "PCDATA: \"",
                "\"",
                "End Tag: component"
            ].join("\n"),
            stream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new TLexer(stream),
            token;

        while (true) {
            token = lexer.nextToken();
            if (token.type == org.antlr.runtime.Token.EOF) {
                break;
            }
        }

        assertEquals(xoutput, lexer.lout.join("\n"));
    }

    function testMalformedInput1() {
        var input = [
            "<?xml version='1.0'?>",
            "<document d>",
            "</document>"
        ].join("\n"),
        stream = new org.antlr.runtime.ANTLRStringStream(input),
        lexer = new TLexer(stream),
        token;

        try {
            while (true) {
                token = lexer.nextToken();
                if (token.type == org.antlr.runtime.Token.EOF) {
                    break;
                }
            }
            fail("block should have thrown an nvae");
        } catch(exc) {
            assert(exc instanceof org.antlr.runtime.NoViableAltException);
            assertEquals(exc.getUnexpectedType(), ">");
            assertEquals(exc.charPositionInLine, 11);
            assertEquals(exc.line, 2);
        }
    }

    function testMalformedInput2() {
        var input = [
            "<?tml version='1.0'?>",
            "<document>",
            "</document>"
        ].join("\n"),
        stream = new org.antlr.runtime.ANTLRStringStream(input),
        lexer = new TLexer(stream),
        token;

        try {
            while (true) {
                token = lexer.nextToken();
                if (token.type == org.antlr.runtime.Token.EOF) {
                    break;
                }
            }
            fail("block should have thrown an nvae");
        } catch(exc) {
            assert(exc instanceof org.antlr.runtime.MismatchedSetException);
            assertEquals(exc.getUnexpectedType(), "t");
            assertEquals(exc.charPositionInLine, 2);
            assertEquals(exc.line, 1);
        }
    }

    function testMalformedInput3() {
        var input = [
        "<?xml version='1.0'?>",
        "<docu ment attr=\"foo\">",
        "</document>"
        ].join("\n"),
        stream = new org.antlr.runtime.ANTLRStringStream(input),
        lexer = new TLexer(stream),
        token;

        try {
            while (true) {
                token = lexer.nextToken();
                if (token.type == org.antlr.runtime.Token.EOF) {
                    break;
                }
            }
            fail("block should have thrown an nvae");
        } catch(exc) {
            assert(exc instanceof org.antlr.runtime.NoViableAltException);
            assertEquals(exc.getUnexpectedType(), "a");
            assertEquals(exc.charPositionInLine, 11);
            assertEquals(exc.line, 2);
        }
    }
</script>
</head>
<body>
    <h1>t012lexerXML</h1>
</body>
</html>