<!DOCTYPE html>
<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api/#calculation-of-computed-values" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/utils.js"></script>

<style>
#divWithFontSizeSet, #parentDiv {
    font-size: 10px;
}
</style>

<div id=divWithFontSizeSet></div>
<div id=parentDiv>
    <div id=divWithFontSizeInherited></div>
</div>
<div id="ref"></div>

<script>

for (let element of [divWithFontSizeSet, divWithFontSizeInherited]) {
    let id = element.id;

    // Generate a property and temporarily set its value. Then call 'fn' with
    // the name of the generated property.
    function with_custom_property(reg, value, fn) {
        let name = generate_property(reg);

        // Because we want to include the parsing step, insert a stylesheet
        // node with textContent.
        let node = document.createElement('style');
        node.textContent = `#${id} { ${name}: ${value}; }`;
        document.body.append(node);

        try {
            fn(name);
        } finally {
            node.remove();
        }
    }

    function assert_computed_value(syntax, value, expected) {
        with_custom_property(syntax, value, (name) => {
            let actual = getComputedStyle(element).getPropertyValue(name);
            assert_equals(actual, expected);
        });
    }

    // Computes an absolute reference value for some length.
    //
    // E.g. to figure out how many pixels '10vh' is, do length_ref('10vh').
    function length_ref(value, refnode = ref) {
        try {
            // The reference property 'min-height' is chosen arbitrarily, but
            // avoid properties with "resolved value is used value"-behavior
            // [1], as it may affect rounding, and custom properties do not
            // have this behavior.
            //
            // [1] https://drafts.csswg.org/cssom/#resolved-values
            const ref_property = 'min-height';
            refnode.style = `${ref_property}: ${value}`;
            return getComputedStyle(refnode).getPropertyValue(ref_property);
        } finally {
            refnode.style = '';
        }
    }

    test(function() {
        assert_computed_value('<length>', '12px', '12px');
        assert_computed_value('<length>', '13vw', length_ref('13vw'));
        assert_computed_value('<length>', '14em', '140px');
        assert_computed_value('<length>', '15vmin', length_ref('15vmin'));
        assert_computed_value('<length>', 'calc(16px - 7em + 10vh)', length_ref('calc(10vh - 54px)'));
        with_custom_property('<length>', '14em', (name) => {
            assert_computed_value('<length>', `var(${name})`, '140px');
        });
    }, "<length> values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<length-percentage>', '17em', '170px');
        assert_computed_value('<length-percentage>', '18%', '18%');
        assert_computed_value('<length-percentage>', 'calc(19em - 2%)', 'calc(190px + -2%)');
    }, "<length-percentage> values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<length>#', '10px, 3em', '10px, 30px');
        assert_computed_value('<length>#', '10px, 3em', '10px, 30px');
        assert_computed_value('<length>#', '4em ,9px', '40px, 9px');
        assert_computed_value('<length>#', '8em', '80px');
    }, "<length># values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<length-percentage>#', '3% , 10vmax  , 22px', ['3%', length_ref('10vmax'), '22px'].join(', '));
        assert_computed_value('<length-percentage>#', 'calc(50% + 1em), 4px', 'calc(10px + 50%), 4px');
        assert_computed_value('<length-percentage>#', 'calc(13% + 37px)', 'calc(37px + 13%)');
    }, "<length-percentage># values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<length>+', '10px 3em', '10px 30px');
        assert_computed_value('<length>+', '4em 9px', '40px 9px');
    }, "<length>+ values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<length-percentage>+', '3% 10vmax 22px', ['3%', length_ref('10vmax'), '22px'].join(' '));
        assert_computed_value('<length-percentage>+', 'calc(50% + 1em) 4px', 'calc(10px + 50%) 4px');
    }, "<length-percentage>+ values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<transform-function>', 'translateX(2px)', 'translateX(2px)');
        assert_computed_value('<transform-function>', 'translateX(10em)', 'translateX(100px)');
        assert_computed_value('<transform-function>', 'translateX(calc(11em + 10%))', 'translateX(calc(110px + 10%))');
        assert_computed_value('<transform-function>+', 'translateX(10%) scale(2)', 'translateX(10%) scale(2)');
    }, "<transform-function> values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<integer>', '15', '15');
        assert_computed_value('<integer>', 'calc(15 + 15)', '30');
        assert_computed_value('<integer>', 'calc(2.4)', '2');
        assert_computed_value('<integer>', 'calc(2.6)', '3');
        assert_computed_value('<integer>', 'calc(2.6 + 3.1)', '6');
    }, "<integer> values are computed correctly for " + id);

    test(function() {
        assert_computed_value('<integer>+', '15 calc(2.4) calc(2.6)', '15 2 3');
    }, "<integer>+ values are computed correctly for " + id);
}
</script>
