summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-animations/interfaces/AnimationEffectTiming/easing.html
blob: cedd7e68b1dbc0729929f563555b4f81f5573a58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<!DOCTYPE html>
<meta charset=utf-8>
<title>easing tests</title>
<link rel="help" href="https://w3c.github.io/web-animations/#dom-animationeffecttiming-easing">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<script src="../../resources/effect-easing-tests.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';

function assert_progress(animation, currentTime, easingFunction) {
  animation.currentTime = currentTime;
  var portion = currentTime / animation.effect.timing.duration;
  assert_approx_equals(animation.effect.getComputedTiming().progress,
                       easingFunction(portion),
                       0.01,
                       'The progress of the animation should be approximately ' +
                       easingFunction(portion) + ' at ' + currentTime + 'ms');
}

gEffectEasingTests.forEach(function(options) {
  test(function(t) {
    var target = createDiv(t);
    var anim = target.animate([ { opacity: 0 }, { opacity: 1 } ],
                              { duration: 1000 * MS_PER_SEC,
                                fill: 'forwards' });
    anim.effect.timing.easing = options.easing;
    assert_equals(anim.effect.timing.easing,
                  options.serialization || options.easing);

    var easing = options.easingFunction;
    assert_progress(anim, 0, easing);
    assert_progress(anim, 250 * MS_PER_SEC, easing);
    assert_progress(anim, 500 * MS_PER_SEC, easing);
    assert_progress(anim, 750 * MS_PER_SEC, easing);
    assert_progress(anim, 1000 * MS_PER_SEC, easing);
  }, options.desc);
});

gInvalidEasingTests.forEach(function(options) {
  test(function(t) {
    var div = createDiv(t);
    var anim = div.animate({ opacity: [ 0, 1 ] }, 100 * MS_PER_SEC);
    assert_throws({ name: 'TypeError' },
                  function() {
                    anim.effect.timing.easing = options.easing;
                  });
  }, 'Invalid effect easing value test: \'' + options.easing + '\'');
});

test(function(t) {
  var delay = 1000 * MS_PER_SEC;

  var target = createDiv(t);
  var anim = target.animate([ { opacity: 0 }, { opacity: 1 } ],
                            { duration: 1000 * MS_PER_SEC,
                              fill: 'both',
                              delay: delay,
                              easing: 'steps(2, start)' });

  anim.effect.timing.easing = 'steps(2, end)';
  assert_equals(anim.effect.getComputedTiming().progress, 0,
                'easing replace to steps(2, end) at before phase');

  anim.currentTime = delay + 750 * MS_PER_SEC;
  assert_equals(anim.effect.getComputedTiming().progress, 0.5,
                'change currentTime to active phase');

  anim.effect.timing.easing = 'steps(2, start)';
  assert_equals(anim.effect.getComputedTiming().progress, 1,
                'easing replace to steps(2, start) at active phase');

  anim.currentTime = delay + 1500 * MS_PER_SEC;
  anim.effect.timing.easing = 'steps(2, end)';
  assert_equals(anim.effect.getComputedTiming().progress, 1,
                'easing replace to steps(2, end) again at after phase');
}, 'Change the easing while the animation is running');

</script>
</body>