<!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(Math.max(range.endOffset - range.startOffset - 1, 0));
        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>
