| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>AnimationEffect.getComputedTiming</title> |
| <link rel="help" href="https://drafts.csswg.org/web-animations/#dom-animationeffect-getcomputedtiming"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="../../testcommon.js"></script> |
| <body> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| test(t => { |
| const effect = new KeyframeEffect(null, null); |
| |
| const ct = effect.getComputedTiming(); |
| assert_equals(ct.delay, 0, 'computed delay'); |
| assert_equals(ct.endDelay, 0, 'computed endDelay'); |
| assert_equals(ct.fill, 'none', 'computed fill'); |
| assert_equals(ct.iterationStart, 0.0, 'computed iterationStart'); |
| assert_equals(ct.iterations, 1.0, 'computed iterations'); |
| assert_equals(ct.duration, 0, 'computed duration'); |
| assert_equals(ct.direction, 'normal', 'computed direction'); |
| assert_equals(ct.easing, 'linear', 'computed easing'); |
| }, 'values of getComputedTiming() when a KeyframeEffect is ' + |
| 'constructed without any KeyframeEffectOptions object'); |
| |
| const gGetComputedTimingTests = [ |
| { desc: 'an empty KeyframeEffectOptions object', |
| input: { }, |
| expected: { } }, |
| { desc: 'a normal KeyframeEffectOptions object', |
| input: { delay: 1000, |
| endDelay: 2000, |
| fill: 'auto', |
| iterationStart: 0.5, |
| iterations: 5.5, |
| duration: 'auto', |
| direction: 'alternate', |
| easing: 'steps(2)' }, |
| expected: { delay: 1000, |
| endDelay: 2000, |
| fill: 'none', |
| iterationStart: 0.5, |
| iterations: 5.5, |
| duration: 0, |
| direction: 'alternate', |
| easing: 'steps(2)' } }, |
| { desc: 'a double value', |
| input: 3000, |
| timing: { duration: 3000 }, |
| expected: { delay: 0, |
| fill: 'none', |
| iterations: 1, |
| duration: 3000, |
| direction: 'normal' } }, |
| { desc: '+Infinity', |
| input: Infinity, |
| expected: { duration: Infinity } }, |
| { desc: 'an Infinity duration', |
| input: { duration: Infinity }, |
| expected: { duration: Infinity } }, |
| { desc: 'an auto duration', |
| input: { duration: 'auto' }, |
| expected: { duration: 0 } }, |
| { desc: 'an Infinity iterations', |
| input: { iterations: Infinity }, |
| expected: { iterations: Infinity } }, |
| { desc: 'an auto fill', |
| input: { fill: 'auto' }, |
| expected: { fill: 'none' } }, |
| { desc: 'a forwards fill', |
| input: { fill: 'forwards' }, |
| expected: { fill: 'forwards' } } |
| ]; |
| |
| for (const stest of gGetComputedTimingTests) { |
| test(t => { |
| const effect = new KeyframeEffect(null, null, stest.input); |
| |
| // Helper function to provide default expected values when the test does |
| // not supply them. |
| const expected = (field, defaultValue) => { |
| return field in stest.expected ? stest.expected[field] : defaultValue; |
| }; |
| |
| const ct = effect.getComputedTiming(); |
| assert_equals(ct.delay, expected('delay', 0), |
| 'computed delay'); |
| assert_equals(ct.endDelay, expected('endDelay', 0), |
| 'computed endDelay'); |
| assert_equals(ct.fill, expected('fill', 'none'), |
| 'computed fill'); |
| assert_equals(ct.iterationStart, expected('iterationStart', 0), |
| 'computed iterations'); |
| assert_equals(ct.iterations, expected('iterations', 1), |
| 'computed iterations'); |
| assert_equals(ct.duration, expected('duration', 0), |
| 'computed duration'); |
| assert_equals(ct.direction, expected('direction', 'normal'), |
| 'computed direction'); |
| assert_equals(ct.easing, expected('easing', 'linear'), |
| 'computed easing'); |
| |
| }, 'values of getComputedTiming() when a KeyframeEffect is' |
| + ` constructed by ${stest.desc}`); |
| } |
| |
| const gActiveDurationTests = [ |
| { desc: 'an empty KeyframeEffectOptions object', |
| input: { }, |
| expected: 0 }, |
| { desc: 'a non-zero duration and default iteration count', |
| input: { duration: 1000 }, |
| expected: 1000 }, |
| { desc: 'a non-zero duration and integral iteration count', |
| input: { duration: 1000, iterations: 7 }, |
| expected: 7000 }, |
| { desc: 'a non-zero duration and fractional iteration count', |
| input: { duration: 1000, iterations: 2.5 }, |
| expected: 2500 }, |
| { desc: 'an non-zero duration and infinite iteration count', |
| input: { duration: 1000, iterations: Infinity }, |
| expected: Infinity }, |
| { desc: 'an non-zero duration and zero iteration count', |
| input: { duration: 1000, iterations: 0 }, |
| expected: 0 }, |
| { desc: 'a zero duration and default iteration count', |
| input: { duration: 0 }, |
| expected: 0 }, |
| { desc: 'a zero duration and fractional iteration count', |
| input: { duration: 0, iterations: 2.5 }, |
| expected: 0 }, |
| { desc: 'a zero duration and infinite iteration count', |
| input: { duration: 0, iterations: Infinity }, |
| expected: 0 }, |
| { desc: 'a zero duration and zero iteration count', |
| input: { duration: 0, iterations: 0 }, |
| expected: 0 }, |
| { desc: 'an infinite duration and default iteration count', |
| input: { duration: Infinity }, |
| expected: Infinity }, |
| { desc: 'an infinite duration and zero iteration count', |
| input: { duration: Infinity, iterations: 0 }, |
| expected: 0 }, |
| { desc: 'an infinite duration and fractional iteration count', |
| input: { duration: Infinity, iterations: 2.5 }, |
| expected: Infinity }, |
| { desc: 'an infinite duration and infinite iteration count', |
| input: { duration: Infinity, iterations: Infinity }, |
| expected: Infinity }, |
| ]; |
| |
| for (const stest of gActiveDurationTests) { |
| test(t => { |
| const effect = new KeyframeEffect(null, null, stest.input); |
| |
| assert_equals(effect.getComputedTiming().activeDuration, |
| stest.expected); |
| |
| }, `getComputedTiming().activeDuration for ${stest.desc}`); |
| } |
| |
| const gEndTimeTests = [ |
| { desc: 'an empty KeyframeEffectOptions object', |
| input: { }, |
| expected: 0 }, |
| { desc: 'a non-zero duration and default iteration count', |
| input: { duration: 1000 }, |
| expected: 1000 }, |
| { desc: 'a non-zero duration and non-default iteration count', |
| input: { duration: 1000, iterations: 2.5 }, |
| expected: 2500 }, |
| { desc: 'a non-zero duration and non-zero delay', |
| input: { duration: 1000, delay: 1500 }, |
| expected: 2500 }, |
| { desc: 'a non-zero duration, non-zero delay and non-default iteration', |
| input: { duration: 1000, delay: 1500, iterations: 2 }, |
| expected: 3500 }, |
| { desc: 'an infinite iteration count', |
| input: { duration: 1000, iterations: Infinity }, |
| expected: Infinity }, |
| { desc: 'an infinite duration', |
| input: { duration: Infinity, iterations: 10 }, |
| expected: Infinity }, |
| { desc: 'an infinite duration and delay', |
| input: { duration: Infinity, iterations: 10, delay: 1000 }, |
| expected: Infinity }, |
| { desc: 'an infinite duration and negative delay', |
| input: { duration: Infinity, iterations: 10, delay: -1000 }, |
| expected: Infinity }, |
| { desc: 'an non-zero duration and negative delay', |
| input: { duration: 1000, iterations: 2, delay: -1000 }, |
| expected: 1000 }, |
| { desc: 'an non-zero duration and negative delay greater than active ' + |
| 'duration', |
| input: { duration: 1000, iterations: 2, delay: -3000 }, |
| expected: 0 }, |
| { desc: 'a zero duration and negative delay', |
| input: { duration: 0, iterations: 2, delay: -1000 }, |
| expected: 0 } |
| ]; |
| |
| for (const stest of gEndTimeTests) { |
| test(t => { |
| const effect = new KeyframeEffect(null, null, stest.input); |
| |
| assert_equals(effect.getComputedTiming().endTime, |
| stest.expected); |
| |
| }, `getComputedTiming().endTime for ${stest.desc}`); |
| } |
| </script> |
| </body> |