summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-animations/resources/keyframe-utils.js
blob: 60fb9781a0c080791829abb0bad9e4a084fe2ba6 (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
'use strict';

// =======================================
//
// Utility functions for testing keyframes
//
// =======================================


// ------------------------------
//  Helper functions
// ------------------------------

/**
 * Test equality between two lists of computed keyframes
 * @param {Array.<ComputedKeyframe>} a - actual computed keyframes
 * @param {Array.<ComputedKeyframe>} b - expected computed keyframes
 */
function assert_frame_lists_equal(a, b, message) {
  assert_equals(a.length, b.length, `number of frames: ${(message || '')}`);
  for (let i = 0; i < Math.min(a.length, b.length); i++) {
    assert_frames_equal(a[i], b[i],
                        `ComputedKeyframe #${i}: ${(message || '')}`);
  }
}

/** Helper for assert_frame_lists_equal */
function assert_frames_equal(a, b, name) {
  assert_equals(Object.keys(a).sort().toString(),
                Object.keys(b).sort().toString(),
                `properties on ${name} should match`);
  // Iterates sorted keys to ensure stable failures.
  for (const p of Object.keys(a).sort()) {
    if (typeof b[p] == 'number')
      assert_approx_equals(a[p], b[p], 1e-6, `value for '${p}' on ${name}`);
    else if (typeof b[p] == 'object') {
      for (const key in b[p]) {
        if (typeof b[p][key] == 'number') {
          assert_approx_equals(a[p][key], b[p][key], 1e-6,
                               `value for '${p}.${key}' on ${name}`);
        } else {
          assert_equals((a[p][key] || 'undefined').toString(),
                         b[p][key].toString(),
                        `value for '${p}.${key}' on ${name}`);
        }
      }
    }
    else
      assert_equals(a[p], b[p], `value for '${p}' on ${name}`);
  }
}