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

function test()
{
    let suite = InspectorTest.createSyncSuite("CSSProperty.findVariableNames");

    function addTestCase({name, expression, expected, checkUsedCSSVariableNames})
    {
        suite.addTestCase({
            name,
            test() {
                let variables = WI.CSSProperty.findVariableNames(expression);
                InspectorTest.expectShallowEqual(variables, expected, `"${expression}" should contain these CSS variable names: ${JSON.stringify(expected)}.`);
            },
        });
    }

    addTestCase({
        name: "CSSProperty.findVariableNames.Empty",
        expression: "",
        expected: [],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.EmptyFunction",
        expression: "var()",
        expected: [],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.EmptyNoFunction",
        expression: "--one",
        expected: [],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Basic",
        expression: "var(--one)",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.BasicWithFallback",
        expression: "var(--one, red)",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.BasicWithVariableFallback",
        expression: "var(--one, var(--two, red))",
        expected: ["--one", "--two"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Whitespace",
        expression: "var(    --one    )",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Newline",
        expression: "var(\n--one\n)",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Tab",
        expression: "var(\t--one\t)",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Nested",
        expression: "var(--one, var(--two, var(--three)))",
        expected: ["--one", "--two", "--three"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Content",
        expression: "content: \"var(--one)\"",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.Dashed",
        expression: "var(----o--n--e)",
        expected: ["----o--n--e"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.NaiveWhitespace",
        expression: "var(--one --two --three)",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.NaiveDataURI",
        expression: "data:text/plain;base64,xxxvar(--one)xxx",
        expected: ["--one"],
    });

    addTestCase({
        name: "CSSProperty.findVariableNames.NaiveMalformed",
        expression: "var(--var(one))",
        expected: ["--var(one"],
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest();">
<p>Test naive parsing of CSS variable names with CSSProperty.findVariableNames</p>
</body>
</html>