diff options
Diffstat (limited to 'devtools/client/animationinspector/test/unit')
7 files changed, 449 insertions, 0 deletions
diff --git a/devtools/client/animationinspector/test/unit/.eslintrc.js b/devtools/client/animationinspector/test/unit/.eslintrc.js new file mode 100644 index 000000000..59adf410a --- /dev/null +++ b/devtools/client/animationinspector/test/unit/.eslintrc.js @@ -0,0 +1,6 @@ +"use strict"; + +module.exports = { + // Extend from the common devtools xpcshell eslintrc config. + "extends": "../../../../.eslintrc.xpcshell.js" +}; diff --git a/devtools/client/animationinspector/test/unit/test_findOptimalTimeInterval.js b/devtools/client/animationinspector/test/unit/test_findOptimalTimeInterval.js new file mode 100644 index 000000000..64451bfdf --- /dev/null +++ b/devtools/client/animationinspector/test/unit/test_findOptimalTimeInterval.js @@ -0,0 +1,81 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +/* eslint no-eval:0 */ + +"use strict"; + +var Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const {findOptimalTimeInterval} = require("devtools/client/animationinspector/utils"); + +// This test array contains objects that are used to test the +// findOptimalTimeInterval function. Each object should have the following +// properties: +// - desc: an optional string that will be printed out +// - minTimeInterval: a number that represents the minimum time in ms +// that should be displayed in one interval +// - expectedInterval: a number that you expect the findOptimalTimeInterval +// function to return as a result. +// Optionally you can pass a string where `interval` is the calculated +// interval, this string will be eval'd and tested to be truthy. +const TEST_DATA = [{ + desc: "With no minTimeInterval, expect the interval to be 0", + minTimeInterval: null, + expectedInterval: 0 +}, { + desc: "With a minTimeInterval of 0 ms, expect the interval to be 0", + minTimeInterval: 0, + expectedInterval: 0 +}, { + desc: "With a minInterval of 1ms, expect the interval to be the 1ms too", + minTimeInterval: 1, + expectedInterval: 1 +}, { + desc: "With a very small minTimeInterval, expect the interval to be 1ms", + minTimeInterval: 1e-31, + expectedInterval: 1 +}, { + desc: "With a minInterval of 2.5ms, expect the interval to be 2.5ms too", + minTimeInterval: 2.5, + expectedInterval: 2.5 +}, { + desc: "With a minInterval of 5ms, expect the interval to be 5ms too", + minTimeInterval: 5, + expectedInterval: 5 +}, { + desc: "With a minInterval of 7ms, expect the interval to be the next " + + "multiple of 5", + minTimeInterval: 7, + expectedInterval: 10 +}, { + minTimeInterval: 20, + expectedInterval: 25 +}, { + minTimeInterval: 33, + expectedInterval: 50 +}, { + minTimeInterval: 987, + expectedInterval: 1000 +}, { + minTimeInterval: 1234, + expectedInterval: 2500 +}, { + minTimeInterval: 9800, + expectedInterval: 10000 +}]; + +function run_test() { + for (let {minTimeInterval, desc, expectedInterval} of TEST_DATA) { + do_print(`Testing minTimeInterval: ${minTimeInterval}. + Expecting ${expectedInterval}.`); + + let interval = findOptimalTimeInterval(minTimeInterval); + if (typeof expectedInterval == "string") { + ok(eval(expectedInterval), desc); + } else { + equal(interval, expectedInterval, desc); + } + } +} diff --git a/devtools/client/animationinspector/test/unit/test_formatStopwatchTime.js b/devtools/client/animationinspector/test/unit/test_formatStopwatchTime.js new file mode 100644 index 000000000..12584a2a4 --- /dev/null +++ b/devtools/client/animationinspector/test/unit/test_formatStopwatchTime.js @@ -0,0 +1,62 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +var Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const {formatStopwatchTime} = require("devtools/client/animationinspector/utils"); + +const TEST_DATA = [{ + desc: "Formatting 0", + time: 0, + expected: "00:00.000" +}, { + desc: "Formatting null", + time: null, + expected: "00:00.000" +}, { + desc: "Formatting undefined", + time: undefined, + expected: "00:00.000" +}, { + desc: "Formatting a small number of ms", + time: 13, + expected: "00:00.013" +}, { + desc: "Formatting a slightly larger number of ms", + time: 500, + expected: "00:00.500" +}, { + desc: "Formatting 1 second", + time: 1000, + expected: "00:01.000" +}, { + desc: "Formatting a number of seconds", + time: 1532, + expected: "00:01.532" +}, { + desc: "Formatting a big number of seconds", + time: 58450, + expected: "00:58.450" +}, { + desc: "Formatting 1 minute", + time: 60000, + expected: "01:00.000" +}, { + desc: "Formatting a number of minutes", + time: 263567, + expected: "04:23.567" +}, { + desc: "Formatting a large number of minutes", + time: 1000 * 60 * 60 * 3, + expected: "180:00.000" +}]; + +function run_test() { + for (let {desc, time, expected} of TEST_DATA) { + equal(formatStopwatchTime(time), expected, desc); + } +} diff --git a/devtools/client/animationinspector/test/unit/test_getCssPropertyName.js b/devtools/client/animationinspector/test/unit/test_getCssPropertyName.js new file mode 100644 index 000000000..21470d5fb --- /dev/null +++ b/devtools/client/animationinspector/test/unit/test_getCssPropertyName.js @@ -0,0 +1,27 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +var Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const {getCssPropertyName} = require("devtools/client/animationinspector/components/animation-details"); + +const TEST_DATA = [{ + jsName: "alllowercase", + cssName: "alllowercase" +}, { + jsName: "borderWidth", + cssName: "border-width" +}, { + jsName: "borderTopRightRadius", + cssName: "border-top-right-radius" +}]; + +function run_test() { + for (let {jsName, cssName} of TEST_DATA) { + equal(getCssPropertyName(jsName), cssName); + } +} diff --git a/devtools/client/animationinspector/test/unit/test_timeScale.js b/devtools/client/animationinspector/test/unit/test_timeScale.js new file mode 100644 index 000000000..9ee4b8a59 --- /dev/null +++ b/devtools/client/animationinspector/test/unit/test_timeScale.js @@ -0,0 +1,207 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +var Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const {TimeScale} = require("devtools/client/animationinspector/utils"); +const TEST_ANIMATIONS = [{ + desc: "Testing a few standard animations", + animations: [{ + previousStartTime: 500, + delay: 0, + duration: 1000, + iterationCount: 1, + playbackRate: 1 + }, { + previousStartTime: 400, + delay: 100, + duration: 10, + iterationCount: 100, + playbackRate: 1 + }, { + previousStartTime: 50, + delay: 1000, + duration: 100, + iterationCount: 20, + playbackRate: 1 + }], + expectedMinStart: 50, + expectedMaxEnd: 3050 +}, { + desc: "Testing a single negative-delay animation", + animations: [{ + previousStartTime: 100, + delay: -100, + duration: 100, + iterationCount: 1, + playbackRate: 1 + }], + expectedMinStart: 0, + expectedMaxEnd: 100 +}, { + desc: "Testing a single negative-delay animation with a different rate", + animations: [{ + previousStartTime: 3500, + delay: -1000, + duration: 10000, + iterationCount: 2, + playbackRate: 2 + }], + expectedMinStart: 3000, + expectedMaxEnd: 13000 +}]; + +const TEST_STARTTIME_TO_DISTANCE = [{ + time: 50, + expectedDistance: 0 +}, { + time: 50, + expectedDistance: 0 +}, { + time: 3050, + expectedDistance: 100 +}, { + time: 1550, + expectedDistance: 50 +}]; + +const TEST_DURATION_TO_DISTANCE = [{ + time: 3000, + expectedDistance: 100 +}, { + time: 0, + expectedDistance: 0 +}]; + +const TEST_DISTANCE_TO_TIME = [{ + distance: 100, + expectedTime: 3050 +}, { + distance: 0, + expectedTime: 50 +}, { + distance: 25, + expectedTime: 800 +}]; + +const TEST_DISTANCE_TO_RELATIVE_TIME = [{ + distance: 100, + expectedTime: 3000 +}, { + distance: 0, + expectedTime: 0 +}, { + distance: 25, + expectedTime: 750 +}]; + +const TEST_FORMAT_TIME_MS = [{ + time: 0, + expectedFormattedTime: "0ms" +}, { + time: 3540.341, + expectedFormattedTime: "3540ms" +}, { + time: 1.99, + expectedFormattedTime: "2ms" +}, { + time: 4000, + expectedFormattedTime: "4000ms" +}]; + +const TEST_FORMAT_TIME_S = [{ + time: 0, + expectedFormattedTime: "0.0s" +}, { + time: 3540.341, + expectedFormattedTime: "3.5s" +}, { + time: 1.99, + expectedFormattedTime: "0.0s" +}, { + time: 4000, + expectedFormattedTime: "4.0s" +}, { + time: 102540, + expectedFormattedTime: "102.5s" +}, { + time: 102940, + expectedFormattedTime: "102.9s" +}]; + +function run_test() { + do_print("Check the default min/max range values"); + equal(TimeScale.minStartTime, Infinity); + equal(TimeScale.maxEndTime, 0); + + for (let {desc, animations, expectedMinStart, expectedMaxEnd} of + TEST_ANIMATIONS) { + do_print("Test adding a few animations: " + desc); + for (let state of animations) { + TimeScale.addAnimation(state); + } + + do_print("Checking the time scale range"); + equal(TimeScale.minStartTime, expectedMinStart); + equal(TimeScale.maxEndTime, expectedMaxEnd); + + do_print("Test reseting the animations"); + TimeScale.reset(); + equal(TimeScale.minStartTime, Infinity); + equal(TimeScale.maxEndTime, 0); + } + + do_print("Add a set of animations again"); + for (let state of TEST_ANIMATIONS[0].animations) { + TimeScale.addAnimation(state); + } + + do_print("Test converting start times to distances"); + for (let {time, expectedDistance} of TEST_STARTTIME_TO_DISTANCE) { + let distance = TimeScale.startTimeToDistance(time); + equal(distance, expectedDistance); + } + + do_print("Test converting durations to distances"); + for (let {time, expectedDistance} of TEST_DURATION_TO_DISTANCE) { + let distance = TimeScale.durationToDistance(time); + equal(distance, expectedDistance); + } + + do_print("Test converting distances to times"); + for (let {distance, expectedTime} of TEST_DISTANCE_TO_TIME) { + let time = TimeScale.distanceToTime(distance); + equal(time, expectedTime); + } + + do_print("Test converting distances to relative times"); + for (let {distance, expectedTime} of TEST_DISTANCE_TO_RELATIVE_TIME) { + let time = TimeScale.distanceToRelativeTime(distance); + equal(time, expectedTime); + } + + do_print("Test formatting times (millis)"); + for (let {time, expectedFormattedTime} of TEST_FORMAT_TIME_MS) { + let formattedTime = TimeScale.formatTime(time); + equal(formattedTime, expectedFormattedTime); + } + + // Add 1 more animation to increase the range and test more time formatting + // cases. + TimeScale.addAnimation({ + startTime: 3000, + duration: 5000, + delay: 0, + iterationCount: 1 + }); + + do_print("Test formatting times (seconds)"); + for (let {time, expectedFormattedTime} of TEST_FORMAT_TIME_S) { + let formattedTime = TimeScale.formatTime(time); + equal(formattedTime, expectedFormattedTime); + } +} diff --git a/devtools/client/animationinspector/test/unit/test_timeScale_dimensions.js b/devtools/client/animationinspector/test/unit/test_timeScale_dimensions.js new file mode 100644 index 000000000..f6d80e60b --- /dev/null +++ b/devtools/client/animationinspector/test/unit/test_timeScale_dimensions.js @@ -0,0 +1,54 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const Cu = Components.utils; +const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const {TimeScale} = require("devtools/client/animationinspector/utils"); + +const TEST_ENDDELAY_X = [{ + desc: "Testing positive-endDelay animations", + animations: [{ + previousStartTime: 0, + duration: 500, + playbackRate: 1, + iterationCount: 3, + delay: 500, + endDelay: 500 + }], + expectedEndDelayX: 80 +}, { + desc: "Testing negative-endDelay animations", + animations: [{ + previousStartTime: 0, + duration: 500, + playbackRate: 1, + iterationCount: 9, + delay: 500, + endDelay: -500 + }], + expectedEndDelayX: 90 +}]; + +function run_test() { + do_print("Test calculating endDelayX"); + + // Be independent of possible prior tests + TimeScale.reset(); + + for (let {desc, animations, expectedEndDelayX} of TEST_ENDDELAY_X) { + do_print(`Adding animations: ${desc}`); + + for (let state of animations) { + TimeScale.addAnimation(state); + + let {endDelayX} = TimeScale.getAnimationDimensions({state}); + equal(endDelayX, expectedEndDelayX); + + TimeScale.reset(); + } + } +} diff --git a/devtools/client/animationinspector/test/unit/xpcshell.ini b/devtools/client/animationinspector/test/unit/xpcshell.ini new file mode 100644 index 000000000..c88e01cf9 --- /dev/null +++ b/devtools/client/animationinspector/test/unit/xpcshell.ini @@ -0,0 +1,12 @@ +[DEFAULT] +tags = devtools +head = +tail = +firefox-appdir = browser +skip-if = toolkit == 'android' + +[test_findOptimalTimeInterval.js] +[test_formatStopwatchTime.js] +[test_getCssPropertyName.js] +[test_timeScale.js] +[test_timeScale_dimensions.js] |