<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
let resultNumber = 100;
function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(resultNumber++);
        }, 50);
    });
}

function rejectedEventually() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Rejection");
        }, 50);
    });
}

function causeExceptionImmediately() {
    throw "Thrown exception";
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("RuntimeManager");

    suite.addTestCase({
        name: "RuntimeManager.prototype.evaluateInInspectedWindow.ObjectLiteralConvenience",
        description: "Test evaluating an object literal string conveniently converts wraps it in parenthesis to avoid misinterpretation as a program with a block and labeled statement.",
        test(resolve, reject) {
            function testSource(expression, callback) {
                WI.runtimeManager.evaluateInInspectedWindow(expression, {objectGroup: "test"}, (result, wasThrown) => {
                    InspectorTest.log("Source: " + expression);
                    callback(result, wasThrown);
                });
            }

            function expectObject(result, wasThrown) {
                InspectorTest.expectThat(result.type === "object", "Evaluation should produce an object.");
            }

            function expectException(result, wasThrown) {
                InspectorTest.expectThat(wasThrown, "Evaluation should produce an exception.");
            }

            function expectValue(value) {
                return function(result, wasThrown) {
                    InspectorTest.expectThat(result.value === value, "Evaluation should produce the labeled statement's value.");
                }
            }

            // The convenience will detect these and make them objects.
            testSource("{a:1}", expectObject);
            testSource("{a:1, b:2}", expectObject);
            testSource("   {a:1, b:2}  ", expectObject);

            // The convenience will incorrectly apply to these that would otherwise have been valid programs.
            testSource("{ let a = 1; a += 1; a }", expectException);

            // Test we can run non-convenience cases by not starting / ending with characters other than curly braces.
            testSource(";{a:1}", expectValue(1));
            testSource("{a:1};", expectValue(1));
            testSource(";{a:1, b:2}", expectException);
            testSource(";{ let a = 1; a += 1; a }", expectValue(2));

            InspectorBackend.runAfterPendingDispatches(resolve);
        }
    });

    suite.addTestCase({
        name: "RuntimeManager.prototype.evaluateInInspectedWindow.AwaitConvenience",
        description: "Test evaluating a simple await expression wraps it into an async function and eventually resolves the value.",
        test(resolve, reject) {
            function testSource(expression, callback) {
                WI.runtimeManager.evaluateInInspectedWindow(expression, {objectGroup: "test"}, (result, wasThrown) => {
                    InspectorTest.log("Source: " + expression);
                    callback(result, wasThrown);
                });
            }

            function expectUndefined(result, wasThrown) {
                InspectorTest.expectThat(result.isUndefined(), "Transformed. Should log the value or an exception.");
            }

            function expectException(result, wasThrown) {
                InspectorTest.expectThat(wasThrown, "Exception. Should not get transformed and produce a SyntaxError.");
            }

            // The convenience will detect these and make an async task.
            const expected = 6;
            testSource("await 1", expectUndefined);
            testSource("   await 2   ", expectUndefined);
            testSource("var x = await 3", expectUndefined);
            testSource("await causeExceptionImmediately()", expectUndefined);
            testSource("await Promise.resolve(4)", expectUndefined);
            testSource("await Promise.reject('Promise.reject')", expectUndefined);
            testSource("await rejectedEventually()", expectUndefined);
            testSource("await asyncOperation()", expectUndefined);
            testSource("x = await asyncOperation()", expectUndefined);

            InspectorTest.log("");

            // The convenience will not apply to these expressions.
            testSource("return 10", expectException);
            testSource("await 10; 1", expectException);
            testSource("1; await 10;", expectException);
            testSource("x = y = await 10", expectException);

            // We can resolve after receiving the expected number of console.info messages.
            let seen = 0;
            let listener = WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, (event) => {
                let consoleMessage = event.data.message;
                if (consoleMessage.level !== WI.ConsoleMessage.MessageLevel.Info)
                    return;
                if (++seen !== expected)
                    return;
                WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, listener);
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for RuntimeManager operations.</p>
</body>
</html>
