102 lines
3.6 KiB
JavaScript
102 lines
3.6 KiB
JavaScript
// NOTE(edvardt):
|
|
// This file is a slimmed down wrapper for the old SVGAnimationTestCase.js,
|
|
// it has some convenience functions and should not be used for new tests.
|
|
// New tests should not build on this API as it's just meant to keep things
|
|
// working.
|
|
|
|
// Helper functions
|
|
const xlinkNS = "http://www.w3.org/1999/xlink"
|
|
|
|
function expectFillColor(element, red, green, blue, message) {
|
|
let color = window.getComputedStyle(element, null).fill;
|
|
var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
|
|
rgb = re.exec(color);
|
|
|
|
assert_approx_equals(Number(rgb[1]), red, 2.0, message);
|
|
assert_approx_equals(Number(rgb[2]), green, 2.0, message);
|
|
assert_approx_equals(Number(rgb[3]), blue, 2.0, message);
|
|
}
|
|
|
|
function expectColor(element, red, green, blue, property) {
|
|
if (typeof property != "string")
|
|
color = getComputedStyle(element).getPropertyValue("color");
|
|
else
|
|
color = getComputedStyle(element).getPropertyValue(property);
|
|
var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
|
|
rgb = re.exec(color);
|
|
assert_approx_equals(Number(rgb[1]), red, 2.0);
|
|
assert_approx_equals(Number(rgb[2]), green, 2.0);
|
|
assert_approx_equals(Number(rgb[3]), blue, 2.0);
|
|
}
|
|
|
|
function createSVGElement(type) {
|
|
return document.createElementNS("http://www.w3.org/2000/svg", type);
|
|
}
|
|
|
|
// Inspired by Layoutests/animations/animation-test-helpers.js
|
|
function moveAnimationTimelineAndSample(index) {
|
|
var animationId = expectedResults[index][0];
|
|
var time = expectedResults[index][1];
|
|
var sampleCallback = expectedResults[index][2];
|
|
var animation = rootSVGElement.ownerDocument.getElementById(animationId);
|
|
|
|
// If we want to sample the animation end, add a small delta, to reliable point past the end of the animation.
|
|
newTime = time;
|
|
|
|
// The sample time is relative to the start time of the animation, take that into account.
|
|
rootSVGElement.setCurrentTime(newTime);
|
|
|
|
// NOTE(edvardt):
|
|
// This is a dumb hack, some of the old tests sampled before the animation start, this
|
|
// isn't technically part of the animation tests and is "impossible" to translate since
|
|
// tests start automatically. Thus I solved it by skipping it.
|
|
if (time != 0.0)
|
|
sampleCallback();
|
|
}
|
|
|
|
var currentTest = 0;
|
|
var expectedResults;
|
|
|
|
function sampleAnimation(t) {
|
|
if (currentTest == expectedResults.length) {
|
|
t.done();
|
|
return;
|
|
}
|
|
|
|
moveAnimationTimelineAndSample(currentTest);
|
|
++currentTest;
|
|
|
|
step_timeout(t.step_func(function () { sampleAnimation(t); }), 0);
|
|
}
|
|
|
|
function runAnimationTest(t, expected) {
|
|
if (!expected)
|
|
throw("Expected results are missing!");
|
|
if (currentTest > 0)
|
|
throw("Not allowed to call runAnimationTest() twice");
|
|
|
|
expectedResults = expected;
|
|
testCount = expectedResults.length;
|
|
currentTest = 0;
|
|
|
|
step_timeout(t.step_func(function () { sampleAnimation(this); }), 50);
|
|
}
|
|
|
|
function smil_async_test(func) {
|
|
async_test(t => {
|
|
window.onload = t.step_func(function () {
|
|
// Pause animations, we'll drive them manually.
|
|
// This also ensures that the timeline is paused before
|
|
// it starts. This should make the instance time of the below
|
|
// 'click' (for instance) 0, and hence minimize rounding
|
|
// errors for the addition in moveAnimationTimelineAndSample.
|
|
rootSVGElement.pauseAnimations();
|
|
|
|
// If eg. an animation is running with begin="0s", and
|
|
// we want to sample the first time, before the animation
|
|
// starts, then we can't delay the testing by using an
|
|
// onclick event, as the animation would be past start time.
|
|
func(t);
|
|
});
|
|
});
|
|
}
|