// 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); }); }); }