<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    function outputErrorSourceRange(range) {
        var str = " ".repeat("Source: ".length);
        str += " ".repeat(range.startOffset);
        str += "^";
        str += "~".repeat(range.endOffset - range.startOffset - 1);
        InspectorTest.log(str);
    }

    let suite = InspectorTest.createAsyncSuite("Runtime.parse");

    suite.addTestCase({
        name: "SyntaxErrorType.None",
        description: "Test source without an issue.",
        test(resolve, reject) {
            function testSource(source) {
                RuntimeAgent.parse(source, (error, result, message, range) => {
                    InspectorTest.assert(!error, "Should not be a protocol error.");
                    InspectorTest.expectThat(result === RuntimeAgent.SyntaxErrorType.None, "Should be SyntaxErrorType None.");
                    InspectorTest.log("Source: " + source);
                    InspectorTest.assert(!message);
                    InspectorTest.assert(!range);
                    InspectorTest.log("");
                });
            }

            // Complete programs without syntax errors (could have runtime errors).
            testSource("");
            testSource(";");
            testSource("myVariable");
            testSource("var x = 1; x");
            testSource("[1,2,3]");
            testSource("({})");
            testSource("({prop:true}).x.x.x");
            testSource("if(1)1");
            InspectorBackend.runAfterPendingDispatches(resolve);
        }
    });

    suite.addTestCase({
        name: "SyntaxErrorType.UnterminatedLiteral",
        description: "Test source with an unterminated literal.",
        test(resolve, reject) {
            function testSource(source) {
                RuntimeAgent.parse(source, (error, result, message, range) => {
                    InspectorTest.assert(!error, "Should not be a protocol error.");
                    InspectorTest.expectThat(result === RuntimeAgent.SyntaxErrorType.UnterminatedLiteral, "Should be SyntaxErrorType UnterminatedLiteral.");
                    InspectorTest.log("Source: " + source);
                    outputErrorSourceRange(range);
                    InspectorTest.log("Error Message: " + message);
                    InspectorTest.log("Range: " + JSON.stringify(range));
                    InspectorTest.log("");
                });
            }

            // A literal that is not yet complete, but would be a single token.
            testSource("0b"); // binary
            testSource("0o"); // octal
            testSource("0x"); // hex
            testSource("1e"); // scientific notation number
            testSource("'");  // string
            testSource("\""); // string
            testSource("var \\u007"); // identifier unicode escape
            // testSource("/r"); // regexp - Not detected by JavaScriptCore.
            InspectorBackend.runAfterPendingDispatches(resolve);
        }
    });

    suite.addTestCase({
        name: "SyntaxErrorType.Recoverable",
        description: "Test source with a recoverable error.",
        test(resolve, reject) {
            function testSource(source) {
                RuntimeAgent.parse(source, (error, result, message, range) => {
                    InspectorTest.assert(!error, "Should not be a protocol error.");
                    InspectorTest.expectThat(result === RuntimeAgent.SyntaxErrorType.Recoverable, "Should be SyntaxErrorType Recoverable.");
                    InspectorTest.log("Source: " + source);
                    outputErrorSourceRange(range);
                    InspectorTest.log("Error Message: " + message);
                    InspectorTest.log("Error Range: " + JSON.stringify(range));
                    InspectorTest.log("");
                });
            }

            // Not yet a syntax error, just an incomplete program.
            testSource("(");
            testSource("{");
            testSource("!");
            testSource("-"); // unary
            testSource("+"); // unary
            testSource("~"); // unary
            testSource("1,");
            testSource("var");
            testSource("'use strict'; let"); // When not in strict mode, let is treated as the start of an identifier, not a keyword!
            testSource("const");
            testSource("var {x"); // destructuring
            testSource("var [x"); // destructuring
            testSource("var x,");
            testSource("if(1)");
            testSource("if(1){");
            testSource("if(1){}else");
            testSource("if(1){}else{");
            testSource("while(1)");
            testSource("while(1){");
            testSource("for(;;)");
            testSource("for(;;){");
            testSource("()=>");  // arrow function
            testSource("()=>{"); // arrow function
            testSource("/*");    // comment
            testSource("`");     // template string
            testSource("`${1}"); // template string
            testSource("`${");   // template string
            testSource("function");
            testSource("function foo");
            testSource("function foo(");
            testSource("function foo(){");
            testSource("(function() {");
            testSource("(function() {}");
            testSource("(function() {})(");
            testSource("switch(x)");
            testSource("switch(x){");
            testSource("switch(x){case");
            testSource("switch(x){case 1");
            testSource("switch(x){case 1:");
            testSource("class");
            testSource("class Klass");
            testSource("class Klass {");
            testSource("var x = {");
            testSource("var x = {prop");
            testSource("var x = {prop:");
            testSource("var x = {prop:123");
            testSource("var x = {prop:123 ");
            testSource("var x = {prop:123,");
            testSource("var x = {prop:123, ");
            testSource("var x = {prop:123, 'prop2'");
            testSource("var x = {prop:123, [12");
            testSource("var x = {prop:123, [12]");
            testSource("var x = {prop:123, [12]:");
            testSource("var x = {prop:123, [12]:567");
            testSource("var x = [");
            testSource("var x = [1");
            testSource("var x = [1,");
            testSource("var x = [1,[]");
            testSource("var x = [1,{}");
            InspectorBackend.runAfterPendingDispatches(resolve);
        }
    });

    suite.addTestCase({
        name: "SyntaxErrorType.Irrecoverable",
        description: "Test source with an irrecoverable issue.",
        test(resolve, reject) {
            function testSource(source) {
                RuntimeAgent.parse(source, (error, result, message, range) => {
                    InspectorTest.assert(!error, "Should not be a protocol error.");
                    InspectorTest.expectThat(result === RuntimeAgent.SyntaxErrorType.Irrecoverable, "Should be SyntaxErrorType Irrecoverable.");
                    InspectorTest.log("Source: " + source);
                    outputErrorSourceRange(range);
                    InspectorTest.log("Error Message: " + message);
                    InspectorTest.log("Error Range: " + JSON.stringify(range));
                    InspectorTest.log("");
                });
            }

            // SyntaxErrors. Any typing after the syntax error is detected does not matter.
            testSource("1$");
            testSource("var x = {}}");
            testSource("({}))");
            testSource("var x = =");
            testSource("const x;");
            testSource("let x = 1; let x = 2;");
            testSource("if x(1)");
            InspectorBackend.runAfterPendingDispatches(resolve);
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for the Runtime.parse command.</p>
</body>
</html>
