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

function stringify(result) {
    if (result === null || result === undefined || typeof result === "boolean" || typeof result === "string" || typeof result === "number")
        return result;
    if (result instanceof Element)
        return "#" + result.id;
    if (result instanceof HTMLDocument)
        return "<document>";
    if (Array.isArray(result))
        return JSON.stringify(result.map(stringify));
    if (typeof result === "object" && result.constructor === Object) {
        let mapped = {};
        for (let key in result)
            mapped[key] = stringify(result[key]);
        return JSON.stringify(mapped, null, 4);
    }
    return "UNEXPECTED " + result;
}

function test()
{
    let suite = InspectorTest.Audit.createSuite("Audit.run.Accessibility");

    function evaluateStringForTest(func, target, role) {
        if (target) {
            if (role)
                return `WebInspectorAudit.Accessibility.${func}("${role}", document.querySelector("#${target}"))`;
            return `WebInspectorAudit.Accessibility.${func}(document.querySelector("#${target}"))`;
        }

        if (role)
            return `WebInspectorAudit.Accessibility.${func}("${role}")`;
    }

    const tests = [
        { func: "getElementsByComputedRole", role: "FakeRole" },
        { func: "getElementsByComputedRole", role: "FakeRole", target: "parent" },
        { func: "getElementsByComputedRole", role: "tree" },
        { func: "getElementsByComputedRole", role: "tree", target: "parent" },
        { func: "getElementsByComputedRole", role: "button" },
        { func: "getElementsByComputedRole", role: "button", target: "parent" },

        { func: "getActiveDescendant", target: "parent" },
        { func: "getActiveDescendant", target: "child" },

        { func: "getChildNodes", target: "parent" },
        { func: "getChildNodes", target: "child" },

        { func: "getComputedProperties", target: "parent" },
        { func: "getComputedProperties", target: "child" },

        { func: "getControlledNodes", target: "parent" },
        { func: "getControlledNodes", target: "child" },

        { func: "getFlowedNodes", target: "parent" },
        { func: "getFlowedNodes", target: "child" },

        { func: "getMouseEventNode", target: "parent" },
        { func: "getMouseEventNode", target: "child" },

        { func: "getOwnedNodes", target: "parent" },
        { func: "getOwnedNodes", target: "child" },

        { func: "getParentNode", target: "parent" },
        { func: "getParentNode", target: "child" },

        { func: "getSelectedChildNodes", target: "parent" },
        { func: "getSelectedChildNodes", target: "child" },
    ];

    for (let {func, target, role} of tests) {
        suite.addTestCase({
            name: "Audit.run.Accessibility." + func + (role ? "." + role : "") + (target ? "." + target : ""),
            async test() {
                let functionString = evaluateStringForTest(func, target, role);

                await InspectorTest.Audit.setupAudit();

                InspectorTest.log(`Audit run \`${functionString}\`...`);
                let {result, wasThrown} = await AuditAgent.run(`function() { return stringify(${functionString}); }`);
                InspectorTest.assert(!wasThrown, "Should not throw an exception.");
                if (!wasThrown)
                    InspectorTest.log("Result: " + result.value);
                else
                    InspectorTest.log(result.description);

                await InspectorTest.Audit.teardownAudit();
            },
        });
    }

    suite.addTestCase({
        name: "Audit.run.Accessibility.InvalidCopiedFunctionCall",
        description: "Check that WebInspectorAudit.Accessibility functions throw an error when called outside of an audit.",
        async test() {
            let functions = new Map;
            for (let test of tests)
                functions.set(test.func, test);

            await InspectorTest.Audit.setupAudit();
            InspectorTest.log(`Copying WebInspectorAudit to window...`);
            let {wasThrown} = await AuditAgent.run(`function() { window.CopiedWebInspectorAudit = WebInspectorAudit; }`);
            InspectorTest.assert(!wasThrown, "Should not throw an exception.");
            await InspectorTest.Audit.teardownAudit();

            for (let {func, target, role} of functions.values()) {
                InspectorTest.log(`Testing copied ${func}...`);
                await InspectorTest.expectException(async function() {
                    await InspectorTest.evaluateInPage("window.Copied" + evaluateStringForTest(func, target, role));
                });
            }
        },
    });

     suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for the injected WebInspectorAudit.Accessibility functions.</p>
    <ul id="parent" role="tree" aria-activedescendant="child" aria-controls="child" aria-flowto="child" aria-owns="child" onclick="void(0);">
        <li id="child" role="treeitem" aria-selected="true"></li>
    </ul>
    <button id="button"></button>
    <a id="link" role="button"></a>
    <div id="fakeRole" role="fakeRole"></div>
</body>
</html>
