<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function test()
{
    let suite = ProtocolTest.createAsyncSuite("Debugger.scriptParsed.sourceURL-directives");

    // Because InspectorTest output causes scripts to be parsed
    // we cannot check sourceURL per evaluation easily. Instead
    // just run a bunch of tests for valid and invalid directives
    // and check that the output only includes the valid results.

    let expressions = [];
    let sourceURLExpectations = [];
    let sourceMappingURLExpectations = [];

    function addInvalidTestCase(args) {
        let {expression} = args;
        expressions.push(expression);
    }

    function addValidTestCase(args) {
        let {expression, expected} = args;
        expressions.push(expression);
        sourceURLExpectations.push(expected);
        sourceMappingURLExpectations.push(expected);
    }

    suite.addTestCase({
        name: "TestExpressionsForSourceURL",
        test(resolve, reject) {
            for (let expression of expressions)
                ProtocolTest.evaluateInPage(expression);

            InspectorProtocol.eventHandler["Debugger.scriptParsed"] = function(messageObject) {
                // Ignore named inspector internal scripts.
                if (messageObject.params.sourceURL && messageObject.params.sourceURL.startsWith("__InjectedScript_"))
                    return;

                // Has a sourceURL, must be one of the valid ones.
                if (messageObject.params.sourceURL) {
                    let sourceURL = messageObject.params.sourceURL;
                    ProtocolTest.log(`Found Script with sourceURL '${sourceURL}'`);
                    ProtocolTest.assert(sourceURLExpectations[0] === sourceURL, "Did not expect to see sourceURL: " + sourceURL);
                    sourceURLExpectations.shift();
                    if (!sourceURLExpectations.length)
                        resolve();
                }
            }
        }
    });

    suite.addTestCase({
        name: "TestExpressionsForSourceMappingURL",
        test(resolve, reject) {
            // Rewrite the "sourceURL" to "sourceMappingURL" in the original expressions.
            for (let expression of expressions)
                ProtocolTest.evaluateInPage(expression.replace(/sourceURL/g, "sourceMappingURL"));

            InspectorProtocol.eventHandler["Debugger.scriptParsed"] = function(messageObject) {
                // Has a sourceMapURL, must be one of the valid ones.
                if (messageObject.params.sourceMapURL) {
                    let sourceMappingURL = messageObject.params.sourceMapURL;
                    ProtocolTest.log(`Found Script with sourceMappingURL '${sourceMappingURL}'`);
                    ProtocolTest.assert(sourceMappingURLExpectations[0] === sourceMappingURL, "Did not expect to see sourceMappingURL: " + sourceMappingURL);
                    sourceMappingURLExpectations.shift();
                    if (!sourceMappingURLExpectations.length)
                        resolve();
                }
            }
        }
    });

    // ------

    addInvalidTestCase({
        description: "Evaluation without a SourceURL.",
        expression: "eval('1')",
    });

    addInvalidTestCase({
        description: "SourceURL missing '#'.",
        expression: "eval('// sourceURL=invalid.js')",
    });

    addInvalidTestCase({
        description: "SourceURL missing space after '#'.",
        expression: "eval('//#sourceURL=invalid.js')",
    });

    addInvalidTestCase({
        description: "SourceURL with space before '#'.",
        expression: "eval('// #sourceURL=invalid.js')",
    });

    addInvalidTestCase({
        description: "SourceURL with multiple spaces after '#'.",
        expression: "eval('//#  sourceURL=invalid.js')",
    });

    addInvalidTestCase({
        description: "SourceURL with space between name and '='.",
        expression: "eval('//# sourceURL =invalid.js')",
    });

    addInvalidTestCase({
        description: "SourceURL with quotes in value.",
        expression: "eval('//# sourceURL=\\\'invalid.js\\\'')",
    });

    addInvalidTestCase({
        description: "SourceURL value must be a single non-whitespace enclosed value.",
        expression: "eval('//# sourceURL=invalid.js a')",
    });

    addInvalidTestCase({
        description: "Unknown directive.",
        expression: "eval('//# unknown=invalid.js')",
    });

    addInvalidTestCase({
        description: "Missing parts.",
        expression: "eval('//#')",
    });

    addInvalidTestCase({
        description: "Missing parts.",
        expression: "eval('//# ')",
    });

    addInvalidTestCase({
        description: "Missing parts.",
        expression: "eval('//# source')",
    });

    addInvalidTestCase({
        description: "Missing parts.",
        expression: "eval('//# sourceURL=')",
    });

    // ------

    addValidTestCase({
        description: "SourceURL basic form.",
        expression: "eval('//# sourceURL=test1.js')",
        expected: "test1.js",
    });

    addValidTestCase({
        description: "SourceURL extra leading whitespace.",
        expression: "eval('//# sourceURL=   test2.js')",
        expected: "test2.js",
    });

    addValidTestCase({
        description: "SourceURL extra trailing whitespace.",
        expression: "eval('//# sourceURL=test3.js    ')",
        expected: "test3.js",
    });

    addValidTestCase({
        description: "SourceURL extra leading and trailing whitespace.",
        expression: "eval('//# sourceURL=   test4.js   ')",
        expected: "test4.js",
    });

    addValidTestCase({
        description: "SourceURL with tabs.",
        expression: "eval('//#\\tsourceURL=test5.js')",
        expected: "test5.js",
    });

    addValidTestCase({
        description: "SourceURLs not at the start of a line.",
        expression: "eval('1 //# sourceURL=test6.js')",
        expected: "test6.js",
    });

    addValidTestCase({
        description: "SourceURL with deprecated '@' instead of '#'.",
        expression: "eval('//@ sourceURL=test7.js   ')",
        expected: "test7.js",
    });

    addValidTestCase({
        description: "SourceURLs not on the first line.",
        expression: "eval('\\n\\n//# sourceURL=test8.js')",
        expected: "test8.js",
    });

    addValidTestCase({
        description: "Multiple SourceURLs will return the second.",
        expression: "eval('//# sourceURL=first.js\\n//# sourceURL=second.js')",
        expected: "second.js",
    });

    InspectorProtocol.sendCommand("Debugger.enable", {});
    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for the Debugger.scriptParsed sourceURL and sourceMappingURL comment directive parsing.</p>
</body>
</html>
