<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test for SMIL timing</title> <script src="/tests/SimpleTest/SimpleTest.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> </head> <body> <p id="display"></p> <div id="content"> <svg id="svg" xmlns="http://www.w3.org/2000/svg" width="120px" height="120px" onload="this.pauseAnimations()"> <circle cx="-100" cy="20" r="15" fill="blue" id="circle"/> </svg> </div> <pre id="test"> <script class="testbody" type="text/javascript"> <![CDATA[ /** Test for SMIL timing **/ /* Global Variables */ const svgns = "http://www.w3.org/2000/svg"; var gSvg = document.getElementById("svg"); var gCircle = document.getElementById('circle'); SimpleTest.waitForExplicitFinish(); function main() { ok(gSvg.animationsPaused(), "should be paused by <svg> load handler"); is(gSvg.getCurrentTime(), 0, "should be paused at 0 in <svg> load handler"); var testCases = Array(); const secPerMin = 60; const secPerHour = secPerMin * 60; // In the following tests that compare start times, getStartTime will round // the start time to three decimal places since we expect our implementation // to be millisecond accurate. // Offset syntax // -- Basic tests, sign and whitespace testCases.push(StartTimeTest('3s', 3)); testCases.push(StartTimeTest('0s', 0)); testCases.push(StartTimeTest('+2s', 2)); testCases.push(StartTimeTest('-1s\t\r', -1)); testCases.push(StartTimeTest('- 1s', -1)); testCases.push(StartTimeTest(' -1s', -1)); testCases.push(StartTimeTest(' - 1s', -1)); testCases.push(StartTimeTest(' \t\n\r-1s', -1)); testCases.push(StartTimeTest('+\n5s', 5)); testCases.push(StartTimeTest('-\n5s', -5)); testCases.push(StartTimeTest('\t 5s', 5)); // -- These tests are from SMILANIM 3.6.7 testCases.push(StartTimeTest('02:30:03', 2*secPerHour + 30*secPerMin + 3)); testCases.push(StartTimeTest('50:00:10.25', 50*secPerHour + 10.25)); testCases.push(StartTimeTest('02:33', 2*secPerMin + 33)); testCases.push(StartTimeTest('00:10.5', 10.5)); testCases.push(StartTimeTest('3.2h', 3.2*secPerHour)); testCases.push(StartTimeTest('45min', 45*secPerMin)); testCases.push(StartTimeTest('30s', 30)); testCases.push(StartTimeTest('5ms', 0.005)); testCases.push(StartTimeTest('12.467', 12.467)); testCases.push(StartTimeTest('00.5s', 0.5)); testCases.push(StartTimeTest('00:00.005', 0.005)); // -- Additional tests testCases.push(StartTimeTest('61:59:59', 61*secPerHour + 59*secPerMin + 59)); testCases.push(StartTimeTest('02:59.999999999999999999999', 3*secPerMin)); testCases.push(StartTimeTest('1234:23:45', 1234*secPerHour + 23*secPerMin + 45)); testCases.push(StartTimeTest('61min', 61*secPerMin)); testCases.push(StartTimeTest('0:30:03', 30*secPerMin + 3)); // -- Fractional precision testCases.push(StartTimeTest('25.4567', 25.457)); testCases.push(StartTimeTest('0.123456789', 0.123)); testCases.push(StartTimeTest('0.00000000000000000000001', 0)); testCases.push(StartTimeTest('-0.00000000000000000000001', 0)); testCases.push(StartTimeTest('0.0009', 0.001)); testCases.push(StartTimeTest('0.99999999999999999999999999999999999999', 1)); testCases.push(StartTimeTest('23.4567ms', 0.023)); testCases.push(StartTimeTest('23.7ms', 0.024)); // -- Test errors testCases.push(StartTimeTest(' + +3s', 'none')); testCases.push(StartTimeTest(' +-3s', 'none')); testCases.push(StartTimeTest('1:12:12:12', 'none')); testCases.push(StartTimeTest('4:50:60', 'none')); testCases.push(StartTimeTest('4:60:0', 'none')); testCases.push(StartTimeTest('4:60', 'none')); testCases.push(StartTimeTest('4:-1:00', 'none')); testCases.push(StartTimeTest('4 5m', 'none')); testCases.push(StartTimeTest('4 5ms', 'none')); testCases.push(StartTimeTest('02:3:03', 'none')); testCases.push(StartTimeTest('45.7 s', 'none')); testCases.push(StartTimeTest(' 3 h ', 'none')); testCases.push(StartTimeTest('2:33 ', 'none')); testCases.push(StartTimeTest('02:33 2', 'none')); testCases.push(StartTimeTest('\u000B 02:33', 'none')); testCases.push(StartTimeTest('h', 'none')); testCases.push(StartTimeTest('23.s', 'none')); testCases.push(StartTimeTest('23.', 'none')); testCases.push(StartTimeTest('23.54.2s', 'none')); testCases.push(StartTimeTest('23sec', 'none')); testCases.push(StartTimeTest('five', 'none')); testCases.push(StartTimeTest('', 'none')); testCases.push(StartTimeTest('02:33s', 'none')); testCases.push(StartTimeTest('02:33 s', 'none')); testCases.push(StartTimeTest('2.54e6', 'none')); testCases.push(StartTimeTest('02.5:33', 'none')); testCases.push(StartTimeTest('2:-45:33', 'none')); testCases.push(StartTimeTest('2:4.5:33', 'none')); testCases.push(StartTimeTest('45m', 'none')); testCases.push(StartTimeTest(':20:30', 'none')); testCases.push(StartTimeTest('1.5:30', 'none')); testCases.push(StartTimeTest('15:-30', 'none')); testCases.push(StartTimeTest('::30', 'none')); testCases.push(StartTimeTest('15:30s', 'none')); testCases.push(StartTimeTest('2:1.:30', 'none')); testCases.push(StartTimeTest('2:.1:30', 'none')); testCases.push(StartTimeTest('2.0:15:30', 'none')); testCases.push(StartTimeTest('2.:15:30', 'none')); testCases.push(StartTimeTest('.2:15:30', 'none')); testCases.push(StartTimeTest('70:15', 'none')); testCases.push(StartTimeTest('media', 'none')); testCases.push(StartTimeTest('5mi', 'none')); testCases.push(StartTimeTest('5hours', 'none')); testCases.push(StartTimeTest('h05:30', 'none')); testCases.push(StartTimeTest('05:40\x9A', 'none')); testCases.push(StartTimeTest('05:40\u30D5', 'none')); testCases.push(StartTimeTest('05:40β', 'none')); // List syntax testCases.push(StartTimeTest('3', 3)); testCases.push(StartTimeTest('3;', 3)); testCases.push(StartTimeTest('3; ', 3)); testCases.push(StartTimeTest('3 ; ', 3)); testCases.push(StartTimeTest('3;;', 3)); testCases.push(StartTimeTest('3;; ', 3)); testCases.push(StartTimeTest(';3', 3)); testCases.push(StartTimeTest(' ;3', 3)); testCases.push(StartTimeTest('3;4', 3)); testCases.push(StartTimeTest(' 3 ; 4 ', 3)); // List syntax on end times testCases.push({ 'attr' : { 'begin': '0s', 'end': '1s; 2s' }, 'times': [ [ 0, 0 ], [ 1, -100 ] ] }); testCases.push({ 'attr' : { 'begin': '0s', 'end': '1s; 2s; ' }, 'times': [ [ 0, 0 ], [ 1, -100 ] ] }); testCases.push({ 'attr' : { 'begin': '0s', 'end': '3s; 2s' }, 'times': [ [ 0, 0 ], [ 1, 10 ], [ 2, -100 ] ] }); // Simple case testCases.push({ 'attr' : { 'begin': '3s' }, 'times': [ [ 0, -100 ], [ 4, 10 ] ] }); // Multiple begins testCases.push({ 'attr' : { 'begin': '2s; 6s', 'dur': '2s' }, 'times': [ [ 0, -100 ], [ 3, 50 ], [ 4, -100 ], [ 7, 50 ], [ 8, -100 ] ] }); // Negative begins testCases.push({ 'attr' : { 'begin': '-3s; 1s ; 4s', 'dur': '2s ', 'fill': 'freeze' }, 'times': [ [ 0, -100 ], [ 0.5, -100 ], [ 1, 0 ], [ 2, 50 ], [ 3, 100 ], [ 5, 50 ] ] }); // Sorting testCases.push({ 'attr' : { 'begin': '-3s; 110s; 1s; 4s; -5s; -10s', 'end': '111s; -5s; -15s; 6s; -5s; 1.2s', 'dur': '2s ', 'fill': 'freeze' }, 'times': [ [ 0, -100 ], [ 1, 0 ], [ 2, 10 ], [ 4, 0 ], [ 5, 50 ], [ 109, 100 ], [ 110, 0 ], [ 112, 50 ] ] }); for (var i = 0; i < testCases.length; i++) { gSvg.setCurrentTime(0); var test = testCases[i]; // Generate string version of params for output messages var params = ""; for (var name in test.attr) { params += name + '="' + test.attr[name] + '" '; } params = params.trim(); // Create animation elements var anim = createAnim(test.attr); // Run samples if ('times' in test) { for (var j = 0; j < test.times.length; j++) { var curSample = test.times[j]; checkSample(curSample[0], curSample[1], params); } } // Check start time if ('startTime' in test) { is(getStartTime(anim), test.startTime, "Got unexpected start time for " + params); } anim.remove(); } SimpleTest.finish(); } function createAnim(attr) { var anim = document.createElementNS(svgns,'animate'); anim.setAttribute('attributeName','cx'); anim.setAttribute('from','0'); anim.setAttribute('to','100'); anim.setAttribute('dur','10s'); anim.setAttribute('begin','indefinite'); for (name in attr) { anim.setAttribute(name, attr[name]); } return gCircle.appendChild(anim); } function checkSample(time, expectedValue, params) { gSvg.setCurrentTime(time); var msg = "Unexpected sample value for " + params + " at t=" + time + ": "; is(gCircle.cx.animVal.value, expectedValue); } function getStartTime(anim) { var startTime; try { startTime = anim.getStartTime(); // We round start times to 3 decimal places to make comparisons simpler startTime = parseFloat(startTime.toFixed(3)); } catch(e) { if (e.name == "InvalidStateError" && e.code == DOMException.INVALID_STATE_ERR) { startTime = 'none'; } else { ok(false, "Unexpected exception: " + e); } } return startTime; } function StartTimeTest(beginSpec, expectedStartTime) { return { 'attr' : { 'begin': beginSpec }, 'startTime': expectedStartTime }; } window.addEventListener("load", main); ]]> </script> </pre> </body> </html>