<!DOCTYPE HTML>
<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api/#dom-css-registerproperty" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/utils.js"></script>
<style>
div {
    --registered-length-1: 10px;
    --registered-length-2: var(--registered-length-1);
    --registered-length-3: var(--length-1);
    --registered-length-4: calc(var(--length-1) + 40px);
    --registered-length-5: var(--invalid, 70px);
    --registered-length-6: calc(var(--registered-length-3)*4);
    --registered-length-7: var(--123px, 6px);

    --length-1: 20px;
    --length-2: var(--registered-length-1);
    --length-3: calc(var(--123px, 6px) + var(--123px));

    --percentage: 10%;
    --registered-length-invalid: var(--percentage);

    --registered-token-stream-1:var(--invalid);
    --registered-token-stream-2:var(--invalid,fallback);
    --token-stream-1:var(--registered-token-stream-1,moo);

    --registered-length-list-1: 1px, var(--registered-length-1), 2px;
    --registered-length-list-2: 1px, var(--length-1), var(--registered-length-1), 2px;
    --registered-length-list-3: var(--registered-length-list-1), var(--registered-length-list-2);
}
</style>
<div id=element></div>
<script>
test(function() {
    CSS.registerProperty({name: '--123px', syntax: '<length>', initialValue: '123px', inherits: false});

    CSS.registerProperty({name: '--registered-length-1', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-2', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-3', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-4', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-5', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-6', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-7', syntax: '<length>', initialValue: '0px', inherits: false});
    CSS.registerProperty({name: '--registered-length-invalid', syntax: '<length>', initialValue: '15px', inherits: false});

    CSS.registerProperty({name: '--registered-token-stream-1', syntax: '*', inherits: false});
    CSS.registerProperty({name: '--registered-token-stream-2', syntax: '*', inherits: false});

    computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--registered-length-1'), '10px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-2'), '10px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-3'), '20px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-4'), '60px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-5'), '70px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-6'), '80px');
    assert_equals(computedStyle.getPropertyValue('--registered-length-7'), '123px');
    assert_equals(computedStyle.getPropertyValue('--length-1'), ' 20px');
    assert_equals(computedStyle.getPropertyValue('--length-2'), ' 10px');
    assert_equals(computedStyle.getPropertyValue('--length-3'), ' calc(123px + 123px)');
    assert_equals(computedStyle.getPropertyValue('--registered-length-invalid'), '15px');

    assert_equals(computedStyle.getPropertyValue('--registered-token-stream-1'), '');
    assert_equals(computedStyle.getPropertyValue('--registered-token-stream-2'), 'fallback');
    assert_equals(computedStyle.getPropertyValue('--token-stream-1'), 'moo');
}, "var() references work with registered properties");

test(function(){
    CSS.registerProperty({
        name: '--registered-length-list-1',
        syntax: '<length>#',
        initialValue: '0px',
        inherits: false
    });
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--registered-length-list-1'), '1px, 10px, 2px');
}, 'References to registered var()-properties work in registered lists');

test(function(){
    CSS.registerProperty({
        name: '--registered-length-list-2',
        syntax: '<length>#',
        initialValue: '0px',
        inherits: false
    });
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--registered-length-list-2'), '1px, 20px, 10px, 2px');
}, 'References to mixed registered and unregistered var()-properties work in registered lists');

test(function(){
    CSS.registerProperty({
        name: '--registered-length-list-3',
        syntax: '<length>#',
        initialValue: '0px',
        inherits: false
    });
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--registered-length-list-3'), '1px, 10px, 2px, 1px, 20px, 10px, 2px');
}, 'Registered lists may be concatenated');

test(function(){
    CSS.registerProperty({
        name: '--length-em',
        syntax: '<length>',
        initialValue: '0px',
        inherits: false
    });
    element.style = 'font-size: 11px; --length-em: 10em; --unregistered:var(--length-em);';
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--unregistered'), '110px');
    element.style = '';
}, 'Font-relative units are absolutized when substituting');

test(function(){
    CSS.registerProperty({
        name: '--length-calc',
        syntax: '<length>',
        initialValue: '0px',
        inherits: false
    });
    element.style = 'font-size: 11px; --length-calc: calc(10em + 10px); --unregistered:var(--length-calc);';
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--unregistered'), '120px');
    element.style = '';
}, 'Calc expressions are resolved when substituting');

test(function(){
    CSS.registerProperty({
        name: '--length-calc-list',
        syntax: '<length>#',
        initialValue: '0px',
        inherits: false
    });
    element.style = 'font-size: 11px; --length-calc-list: 10em, calc(10em + 10px); --unregistered:var(--length-calc-list);';
    let computedStyle = getComputedStyle(element);
    assert_equals(computedStyle.getPropertyValue('--unregistered'), '110px, 120px');
    element.style = '';
}, 'Lists with relative units are absolutized when substituting');

function test_valid_fallback(syntax, value, fallback) {
    test(function(){
        let name = generate_property(syntax);
        try {
            element.style = `${name}: ${value}; --x:var(${name},${fallback})`;
            let computedStyle = getComputedStyle(element);
            assert_equals(computedStyle.getPropertyValue('--x'), value);
        } finally {
            element.style = '';
        }
    }, `Valid fallback does not invalidate var()-reference [${syntax}, ${fallback}]`);
}

function test_invalid_fallback(syntax, value, fallback) {
    test(function(){
        let name = generate_property(syntax);
        try {
            element.style = `${name}: ${value}; --x:var(${name},${fallback})`;
            let computedStyle = getComputedStyle(element);
            assert_equals(computedStyle.getPropertyValue('--x'), '');
        } finally {
            element.style = '';
        }
    }, `Invalid fallback invalidates var()-reference [${syntax}, ${fallback}]`);
}

test_valid_fallback('<length>', '40px', '10px');
test_valid_fallback('<length> | <color>', '40px', 'red');
test_valid_fallback('<length> | none', '40px', 'none');

test_invalid_fallback('<length>', '40px', 'red');
test_invalid_fallback('<length> | none', '40px', 'nolength');
test_invalid_fallback('<length>', '40px', 'var(--novar)');

</script>
