<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<style>
#foo {
    --a: blue;
    --b: green;
}
</style>
<script>
function test() {
    let suite = InspectorTest.createSyncSuite("WI.CSSStyleDeclaration.prototype.resolveVariableValue");

    let computedStyle = null;

    function addTest({name, expression, expected}) {
        suite.addTestCase({
            name,
            test() {
                InspectorTest.expectEqual(computedStyle.resolveVariableValue(expression), expected, `"${expression}" should resolve to ${JSON.stringify(expected)}.`);
            },
        })
    }
    addTest({
        name: "NotVariable",
        expression: "red",
        expected: null,
    });
    addTest({
        name: "EmptyVariable",
        expression: "var()",
        expected: null,
    });
    addTest({
        name: "InvalidVariable",
        expression: "var(invalid)",
        expected: null,
    });
    addTest({
        name: "NonExistentVariable",
        expression: "var(--DNE)",
        expected: null,
    });
    addTest({
        name: "ValidVariable",
        expression: "var(--a)",
        expected: "blue",
    });
    addTest({
        name: "InvalidFallbackValue",
        expression: "var(--DNE, )",
        expected: null,
    });
    addTest({
        name: "ValidFallbackValue",
        expression: "var(--DNE, red)",
        expected: "red",
    });
    addTest({
        name: "InvalidFallbackVariable",
        expression: "var(--DNE, var(--DNE))",
        expected: null,
    });
    addTest({
        name: "ValidFallbackVariable",
        expression: "var(--DNE, var(--b, red))",
        expected: "green",
    });
    addTest({
        name: "ValidVariableWithInvalidFallbackValue",
        expression: "var(--a, )",
        expected: "blue",
    });
    addTest({
        name: "ValidVariableWithValidFallbackValue",
        expression: "var(--a, red)",
        expected: "blue",
    });
    addTest({
        name: "ValidVariableWithInvalidFallbackVariable",
        expression: "var(--a, var(--DNE))",
        expected: "blue",
    });
    addTest({
        name: "ValidVariableWithValidFallbackVariable",
        expression: "var(--a, var(--b))",
        expected: "blue",
    });
    

    WI.domManager.requestDocument((documentNode) => {
        documentNode.querySelector("#foo", (contentNodeId) => {
            if (!contentNodeId) {
                InspectorTest.fail("DOM node not found.");
                InspectorTest.completeTest();
                return;
            }

            let domNode = WI.domManager.nodeForId(contentNodeId);
            nodeStyles = WI.cssManager.stylesForNode(domNode);

            if (nodeStyles.needsRefresh) {
                nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                    computedStyle = nodeStyles.computedStyle;
                    suite.runTestCasesAndFinish();
                });
                return;
            }

            computedStyle = nodeStyles.computedStyle;
            suite.runTestCasesAndFinish();
        });
    });
}
</script>
</head>
<body onload="runTest()">
<p>Test that WI.CSSStyleDeclaration.prototype.resolveVariableValue works as expected.</p>
<div id="foo"></div>
</body>
</html>
