<!doctype html>
<meta charset=utf-8>
<title>animation-composition test in keyframes</title>
<link rel="help" href="https://drafts.csswg.org/css-animations-2/#animation-composition">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="support/testcommon.js"></script>
<style>
    @keyframes anim {
        from {
            animation-composition: add;
            filter: blur(10px);
            width: 100px;
        }
        50% {
            animation-composition: accumulate;
            filter: blur(15px);
            width: 228px;
        }
        to {
            animation-composition: replace;
            filter: blur(50px);
            width: 1337px;
        }
    }

    .anim-target {
        animation: anim 1s;
        animation-fill-mode: forwards;
        animation-timing-function: linear;
        filter: blur(5px);
        width: 50px;
    }

    .replace {
        animation-composition: replace;
    }

    .add {
        animation-composition: add;
    }

    .accumulate {
        animation-composition: accumulate;
    }
</style>
<div id="log"></div>
<script>
    function run_test_case(element, property, composite_type, timing_value_map) {
        element.classList.add(composite_type);
        const anim = element.getAnimations()[0];
        for (const [time, value] of Object.entries(timing_value_map)) {
            anim.currentTime = time;
            const property_value = getComputedStyle(element).getPropertyValue(property);
            assert_equals(property_value, value, "at time " + time);
        }
        element.classList.remove(composite_type);
    }

    const test_cases = [
        ["filter", {
            "replace": {
                0: "blur(5px) blur(10px)",
                250: "blur(12.5px) blur(5px)",
                500: "blur(20px)",
                1000: "blur(50px)"
            },
            "add": {
                0: "blur(5px) blur(10px)",
                250: "blur(12.5px) blur(5px)",
                500: "blur(20px)",
                1000: "blur(50px)"
            },
            "accumulate": {
                0: "blur(5px) blur(10px)",
                250: "blur(12.5px) blur(5px)",
                500: "blur(20px)",
                1000: "blur(50px)"
            }
        }],
        ["width", {
            "replace": {
                0: "150px",
                250: "214px",
                500: "278px",
                1000: "1337px"
            },
            "add": {
                0: "150px",
                250: "214px",
                500: "278px",
                1000: "1337px"
            },
            "accumulate": {
                0: "150px",
                250: "214px",
                500: "278px",
                1000: "1337px"
            }
        }]
    ]

    for (const test_case of test_cases) {
        const property = test_case[0];
        const test_data = test_case[1];
        for (const [composite_type, expected_values] of Object.entries(test_data)) {
            test(t => {
                let elem = addDiv(t, {"class": "anim-target"});
                run_test_case(elem, property, composite_type, expected_values);
            }, "animation-composition: " + composite_type + " of property " + property);
        }
    }
</script>