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

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


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

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

    var TParser = function() {
        TParser.superclass.constructor.apply(this, arguments);
    };
    org.antlr.lang.extend(TParser, t046rewriteParser, {
        recover: function(re) {
            /* don't recover, just crash */
            throw re;
        }
    });


    function testValid1() {
        var xinput = [
                        "method foo() {",
                        "  i = 3;",
                        "  k = i;",
                        "  i = k*4;",
                        "}",
                        "",
                        "method bar() {",
                        "  j = i*2;",
                        "}"
                     ].join("\n");
        var xoutput = [
                        "public class Wrapper {",
                        "public void foo() {",
                        "int k;",
                        "int i;",
                        "  i = 3;",
                        "  k = i;",
                        "  i = k*4;",
                        "}",
                        "",
                        "public void bar() {",
                        "int j;",
                        "  j = i*2;",
                        "}",
                        "}",
                        ""
                      ].join("\n");
 
        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
            lexer = new TLexer(cstream),
            tstream = new org.antlr.runtime.TokenRewriteStream(lexer),
            parser = new TParser(tstream);
        parser.program();
        assertEquals(tstream.toString(), xoutput);
    }
</script>

</head>
<body>
    <h1>t046rewrite</h1>
</body>
</html>
