1// NOTE(edvardt): 2// This file is a slimmed down wrapper for the old SVGAnimationTestCase.js, 3// it has some convenience functions and should not be used for new tests. 4// New tests should not build on this API as it's just meant to keep things 5// working. 6 7// Helper functions 8const xlinkNS = "http://www.w3.org/1999/xlink" 9 10function expectFillColor(element, red, green, blue, message) { 11 let color = window.getComputedStyle(element, null).fill; 12 var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)"); 13 rgb = re.exec(color); 14 15 assert_approx_equals(Number(rgb[1]), red, 2.0, message); 16 assert_approx_equals(Number(rgb[2]), green, 2.0, message); 17 assert_approx_equals(Number(rgb[3]), blue, 2.0, message); 18} 19 20function expectColor(element, red, green, blue, property) { 21 if (typeof property != "string") 22 color = getComputedStyle(element).getPropertyValue("color"); 23 else 24 color = getComputedStyle(element).getPropertyValue(property); 25 var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)"); 26 rgb = re.exec(color); 27 assert_approx_equals(Number(rgb[1]), red, 2.0); 28 assert_approx_equals(Number(rgb[2]), green, 2.0); 29 assert_approx_equals(Number(rgb[3]), blue, 2.0); 30} 31 32function createSVGElement(type) { 33 return document.createElementNS("http://www.w3.org/2000/svg", type); 34} 35 36// Inspired by Layoutests/animations/animation-test-helpers.js 37function moveAnimationTimelineAndSample(index) { 38 var animationId = expectedResults[index][0]; 39 var time = expectedResults[index][1]; 40 var sampleCallback = expectedResults[index][2]; 41 var animation = rootSVGElement.ownerDocument.getElementById(animationId); 42 43 // If we want to sample the animation end, add a small delta, to reliable point past the end of the animation. 44 newTime = time; 45 46 // The sample time is relative to the start time of the animation, take that into account. 47 rootSVGElement.setCurrentTime(newTime); 48 49 // NOTE(edvardt): 50 // This is a dumb hack, some of the old tests sampled before the animation start, this 51 // isn't technically part of the animation tests and is "impossible" to translate since 52 // tests start automatically. Thus I solved it by skipping it. 53 if (time != 0.0) 54 sampleCallback(); 55} 56 57var currentTest = 0; 58var expectedResults; 59 60function sampleAnimation(t) { 61 if (currentTest == expectedResults.length) { 62 t.done(); 63 return; 64 } 65 66 moveAnimationTimelineAndSample(currentTest); 67 ++currentTest; 68 69 step_timeout(t.step_func(function () { sampleAnimation(t); }), 0); 70} 71 72function runAnimationTest(t, expected) { 73 if (!expected) 74 throw("Expected results are missing!"); 75 if (currentTest > 0) 76 throw("Not allowed to call runAnimationTest() twice"); 77 78 expectedResults = expected; 79 testCount = expectedResults.length; 80 currentTest = 0; 81 82 step_timeout(t.step_func(function () { sampleAnimation(this); }), 50); 83} 84 85function smil_async_test(func) { 86 async_test(t => { 87 window.onload = t.step_func(function () { 88 // Pause animations, we'll drive them manually. 89 // This also ensures that the timeline is paused before 90 // it starts. This should make the instance time of the below 91 // 'click' (for instance) 0, and hence minimize rounding 92 // errors for the addition in moveAnimationTimelineAndSample. 93 rootSVGElement.pauseAnimations(); 94 95 // If eg. an animation is running with begin="0s", and 96 // we want to sample the first time, before the animation 97 // starts, then we can't delay the testing by using an 98 // onclick event, as the animation would be past start time. 99 func(t); 100 }); 101 }); 102} 103