<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>

function test()
{
    const auditTestString = (function() {
    return {
        level: "pass",
        test: WebInspectorAudit.test,
    };
}).toString();

    async function wrapTest(audit, expected, {getResultCallback} = {}) {
        WI.auditManager._addTest(audit);

        let [result] = await WI.auditManager.start([audit]);
        if (getResultCallback)
            result = getResultCallback(result);

        InspectorTest.assert(result.didPass, "The test should pass.");
        InspectorTest.assert(!result.data.errors, "There should be no errors.");
        if (result.data.errors)
            InspectorTest.json(result.data.errors);

        InspectorTest.expectEqual(result.data.test, expected, `The setup function should have set test to ${expected}.`);

        WI.auditManager.removeTest(audit);
    }

    let suite = InspectorTest.createAsyncSuite("AuditManager.prototype.start");

    suite.addTestCase({
        name: "AuditManager.prototype.start.SyncSetup",
        description: "Check that the setup of an audit is actually run.",
        async test() {
            const setup = (function() {
                WebInspectorAudit.test = 42;
            }).toString();

            let audit = new WI.AuditTestCase("AuditManager.prototype.start.SyncSetup", auditTestString, {setup});

            await wrapTest(audit, 42);
        },
    });

    suite.addTestCase({
        name: "AuditManager.prototype.start.AsyncSetup",
        description: "Check that the setup of an audit can be asynchronous.",
        async test() {
            const setup = (async function() {
                await new Promise((resolve, reject) => {
                    setTimeout(resolve, 10);
                });

                WebInspectorAudit.test = 42;
            }).toString();

            let audit = new WI.AuditTestCase("AuditManager.prototype.start.AsyncSetup", auditTestString, {setup});

            await wrapTest(audit, 42);
        },
    });

    suite.addTestCase({
        name: "AuditManager.prototype.start.SubLevelSetup",
        description: "Check that the setup of a non-top-level audit is not run.",
        async test() {
            const setup = (function() {
                WebInspectorAudit.test = 42;
            }).toString();

            let audit = new WI.AuditTestGroup("AuditManager.prototype.start.SubLevelSetup.Group", [
                new WI.AuditTestCase("AuditManager.prototype.start.SubLevelSetup.Test", auditTestString, {setup}),
            ]);

            await wrapTest(audit, undefined, {
                getResultCallback(result) {
                    return result.results[0];
                },
            });
        },
    });

    suite.addTestCase({
        name: "AuditManager.prototype.start.OverriddenSetup",
        description: "Check that only the setup of top-level audits is run.",
        async test() {
            const setupA = (function() {
                if (!WebInspectorAudit.test)
                    WebInspectorAudit.test = "";
                WebInspectorAudit.test += "A";
            }).toString();

            const setupB = (function() {
                if (!WebInspectorAudit.test)
                    WebInspectorAudit.test = "";
                WebInspectorAudit.test += "B";
            }).toString();

            let audit = new WI.AuditTestGroup("AuditManager.prototype.start.OverriddenLevelSetup.Group", [
                new WI.AuditTestCase("AuditManager.prototype.start.OverriddenLevelSetup.Test", auditTestString, {setup: setupA}),
            ], {setup: setupB});

            await wrapTest(audit, "B", {
                getResultCallback(result) {
                    return result.results[0];
                },
            });
        },
    });

    suite.addTestCase({
        name: "AuditManager.prototype.start.MultipleTopLevel",
        description: "Test that a new WebInspectorAudit object is created for each setup call.",
        async test() {
            const setupA = (function() {
                if (!WebInspectorAudit.test)
                    WebInspectorAudit.test = "";
                WebInspectorAudit.test += "A";
            }).toString();

            let auditA = new WI.AuditTestCase("AuditManager.prototype.start.MultipleTopLevel.A", auditTestString, {setup: setupA});

            await wrapTest(auditA, "A");

            const setupB = (function() {
                if (!WebInspectorAudit.test)
                    WebInspectorAudit.test = "";
                WebInspectorAudit.test += "B";
            }).toString();

            let auditB = new WI.AuditTestCase("AuditManager.prototype.start.MultipleTopLevel.B", auditTestString, {setup: setupB});

            await wrapTest(auditB, "B");
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for the AuditManager.prototype.start functionality.</p>
</body>
</html>
