<!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>
