1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/smil/test/test_smilTiming.xhtml Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,291 @@ 1.4 +<html xmlns="http://www.w3.org/1999/xhtml"> 1.5 +<head> 1.6 + <title>Test for SMIL timing</title> 1.7 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.8 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 1.9 +</head> 1.10 +<body> 1.11 +<p id="display"></p> 1.12 +<div id="content" style="display: none"> 1.13 +<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="120px" height="120px" 1.14 + onload="this.pauseAnimations()"> 1.15 + <circle cx="-100" cy="20" r="15" fill="blue" id="circle"/> 1.16 +</svg> 1.17 +</div> 1.18 +<pre id="test"> 1.19 +<script class="testbody" type="text/javascript"> 1.20 +<![CDATA[ 1.21 +/** Test for SMIL timing **/ 1.22 + 1.23 +/* Global Variables */ 1.24 +const svgns = "http://www.w3.org/2000/svg"; 1.25 +var gSvg = document.getElementById("svg"); 1.26 +var gCircle = document.getElementById('circle'); 1.27 + 1.28 +SimpleTest.waitForExplicitFinish(); 1.29 + 1.30 +function main() { 1.31 + ok(gSvg.animationsPaused(), "should be paused by <svg> load handler"); 1.32 + is(gSvg.getCurrentTime(), 0, "should be paused at 0 in <svg> load handler"); 1.33 + 1.34 + var testCases = Array(); 1.35 + 1.36 + const secPerMin = 60; 1.37 + const secPerHour = secPerMin * 60; 1.38 + 1.39 + // In the following tests that compare start times, getStartTime will round 1.40 + // the start time to three decimal places since we expect our implementation 1.41 + // to be millisecond accurate. 1.42 + 1.43 + // Offset syntax 1.44 + // -- Basic tests, sign and whitespace 1.45 + testCases.push(StartTimeTest('3s', 3)); 1.46 + testCases.push(StartTimeTest('0s', 0)); 1.47 + testCases.push(StartTimeTest('+2s', 2)); 1.48 + testCases.push(StartTimeTest('-1s\t\r', -1)); 1.49 + testCases.push(StartTimeTest('- 1s', -1)); 1.50 + testCases.push(StartTimeTest(' -1s', -1)); 1.51 + testCases.push(StartTimeTest(' - 1s', -1)); 1.52 + testCases.push(StartTimeTest(' \t\n\r-1s', -1)); 1.53 + testCases.push(StartTimeTest('+\n5s', 5)); 1.54 + testCases.push(StartTimeTest('-\n5s', -5)); 1.55 + testCases.push(StartTimeTest('\t 5s', 5)); 1.56 + // -- These tests are from SMILANIM 3.6.7 1.57 + testCases.push(StartTimeTest('02:30:03', 2*secPerHour + 30*secPerMin + 3)); 1.58 + testCases.push(StartTimeTest('50:00:10.25', 50*secPerHour + 10.25)); 1.59 + testCases.push(StartTimeTest('02:33', 2*secPerMin + 33)); 1.60 + testCases.push(StartTimeTest('00:10.5', 10.5)); 1.61 + testCases.push(StartTimeTest('3.2h', 3.2*secPerHour)); 1.62 + testCases.push(StartTimeTest('45min', 45*secPerMin)); 1.63 + testCases.push(StartTimeTest('30s', 30)); 1.64 + testCases.push(StartTimeTest('5ms', 0.005)); 1.65 + testCases.push(StartTimeTest('12.467', 12.467)); 1.66 + testCases.push(StartTimeTest('00.5s', 0.5)); 1.67 + testCases.push(StartTimeTest('00:00.005', 0.005)); 1.68 + // -- Additional tests 1.69 + testCases.push(StartTimeTest('61:59:59', 61*secPerHour + 59*secPerMin + 59)); 1.70 + testCases.push(StartTimeTest('02:59.999999999999999999999', 3*secPerMin)); 1.71 + testCases.push(StartTimeTest('1234:23:45', 1.72 + 1234*secPerHour + 23*secPerMin + 45)); 1.73 + testCases.push(StartTimeTest('61min', 61*secPerMin)); 1.74 + testCases.push(StartTimeTest('0:30:03', 30*secPerMin + 3)); 1.75 + // -- Fractional precision 1.76 + testCases.push(StartTimeTest('25.4567', 25.457)); 1.77 + testCases.push(StartTimeTest('0.123456789', 0.123)); 1.78 + testCases.push(StartTimeTest('0.00000000000000000000001', 0)); 1.79 + testCases.push(StartTimeTest('-0.00000000000000000000001', 0)); 1.80 + testCases.push(StartTimeTest('0.0009', 0.001)); 1.81 + testCases.push(StartTimeTest('0.99999999999999999999999999999999999999', 1)); 1.82 + testCases.push(StartTimeTest('23.4567ms', 0.023)); 1.83 + testCases.push(StartTimeTest('23.7ms', 0.024)); 1.84 + // -- Test errors 1.85 + testCases.push(StartTimeTest(' + +3s', 'none')); 1.86 + testCases.push(StartTimeTest(' +-3s', 'none')); 1.87 + testCases.push(StartTimeTest('1:12:12:12', 'none')); 1.88 + testCases.push(StartTimeTest('4:50:60', 'none')); 1.89 + testCases.push(StartTimeTest('4:60:0', 'none')); 1.90 + testCases.push(StartTimeTest('4:60', 'none')); 1.91 + testCases.push(StartTimeTest('4:-1:00', 'none')); 1.92 + testCases.push(StartTimeTest('4 5m', 'none')); 1.93 + testCases.push(StartTimeTest('4 5ms', 'none')); 1.94 + testCases.push(StartTimeTest('02:3:03', 'none')); 1.95 + testCases.push(StartTimeTest('45.7 s', 'none')); 1.96 + testCases.push(StartTimeTest(' 3 h ', 'none')); 1.97 + testCases.push(StartTimeTest('2:33 ', 'none')); 1.98 + testCases.push(StartTimeTest('02:33 2', 'none')); 1.99 + testCases.push(StartTimeTest('\u000B 02:33', 'none')); 1.100 + testCases.push(StartTimeTest('h', 'none')); 1.101 + testCases.push(StartTimeTest('23.s', 'none')); 1.102 + testCases.push(StartTimeTest('23.', 'none')); 1.103 + testCases.push(StartTimeTest('23.54.2s', 'none')); 1.104 + testCases.push(StartTimeTest('23sec', 'none')); 1.105 + testCases.push(StartTimeTest('five', 'none')); 1.106 + testCases.push(StartTimeTest('', 'none')); 1.107 + testCases.push(StartTimeTest('02:33s', 'none')); 1.108 + testCases.push(StartTimeTest('02:33 s', 'none')); 1.109 + testCases.push(StartTimeTest('2.54e6', 'none')); 1.110 + testCases.push(StartTimeTest('02.5:33', 'none')); 1.111 + testCases.push(StartTimeTest('2:-45:33', 'none')); 1.112 + testCases.push(StartTimeTest('2:4.5:33', 'none')); 1.113 + testCases.push(StartTimeTest('45m', 'none')); 1.114 + testCases.push(StartTimeTest(':20:30', 'none')); 1.115 + testCases.push(StartTimeTest('1.5:30', 'none')); 1.116 + testCases.push(StartTimeTest('15:-30', 'none')); 1.117 + testCases.push(StartTimeTest('::30', 'none')); 1.118 + testCases.push(StartTimeTest('15:30s', 'none')); 1.119 + testCases.push(StartTimeTest('2:1.:30', 'none')); 1.120 + testCases.push(StartTimeTest('2:.1:30', 'none')); 1.121 + testCases.push(StartTimeTest('2.0:15:30', 'none')); 1.122 + testCases.push(StartTimeTest('2.:15:30', 'none')); 1.123 + testCases.push(StartTimeTest('.2:15:30', 'none')); 1.124 + testCases.push(StartTimeTest('70:15', 'none')); 1.125 + testCases.push(StartTimeTest('media', 'none')); 1.126 + testCases.push(StartTimeTest('5mi', 'none')); 1.127 + testCases.push(StartTimeTest('5hours', 'none')); 1.128 + testCases.push(StartTimeTest('h05:30', 'none')); 1.129 + testCases.push(StartTimeTest('05:40\x9A', 'none')); 1.130 + testCases.push(StartTimeTest('05:40\u30D5', 'none')); 1.131 + testCases.push(StartTimeTest('05:40β', 'none')); 1.132 + 1.133 + // List syntax 1.134 + testCases.push(StartTimeTest('3', 3)); 1.135 + testCases.push(StartTimeTest('3;', 3)); 1.136 + testCases.push(StartTimeTest('3; ', 3)); 1.137 + testCases.push(StartTimeTest('3 ; ', 3)); 1.138 + testCases.push(StartTimeTest('3;;', 'none')); 1.139 + testCases.push(StartTimeTest('3;; ', 'none')); 1.140 + testCases.push(StartTimeTest(';3', 'none')); 1.141 + testCases.push(StartTimeTest(' ;3', 'none')); 1.142 + testCases.push(StartTimeTest('3;4', 3)); 1.143 + testCases.push(StartTimeTest(' 3 ; 4 ', 3)); 1.144 + 1.145 + // List syntax on end times 1.146 + testCases.push({ 1.147 + 'attr' : { 'begin': '0s', 1.148 + 'end': '1s; 2s' }, 1.149 + 'times': [ [ 0, 0 ], 1.150 + [ 1, -100 ] ] 1.151 + }); 1.152 + testCases.push({ 1.153 + 'attr' : { 'begin': '0s', 1.154 + 'end': '1s; 2s; ' }, 1.155 + 'times': [ [ 0, 0 ], 1.156 + [ 1, -100 ] ] 1.157 + }); 1.158 + testCases.push({ 1.159 + 'attr' : { 'begin': '0s', 1.160 + 'end': '3s; 2s' }, 1.161 + 'times': [ [ 0, 0 ], 1.162 + [ 1, 10 ], 1.163 + [ 2, -100 ] ] 1.164 + }); 1.165 + 1.166 + // Simple case 1.167 + testCases.push({ 1.168 + 'attr' : { 'begin': '3s' }, 1.169 + 'times': [ [ 0, -100 ], 1.170 + [ 4, 10 ] ] 1.171 + }); 1.172 + 1.173 + // Multiple begins 1.174 + testCases.push({ 1.175 + 'attr' : { 'begin': '2s; 6s', 1.176 + 'dur': '2s' }, 1.177 + 'times': [ [ 0, -100 ], 1.178 + [ 3, 50 ], 1.179 + [ 4, -100 ], 1.180 + [ 7, 50 ], 1.181 + [ 8, -100 ] ] 1.182 + }); 1.183 + 1.184 + // Negative begins 1.185 + testCases.push({ 1.186 + 'attr' : { 'begin': '-3s; 1s ; 4s', 1.187 + 'dur': '2s ', 1.188 + 'fill': 'freeze' }, 1.189 + 'times': [ [ 0, -100 ], 1.190 + [ 0.5, -100 ], 1.191 + [ 1, 0 ], 1.192 + [ 2, 50 ], 1.193 + [ 3, 100 ], 1.194 + [ 5, 50 ] ] 1.195 + }); 1.196 + 1.197 + // Sorting 1.198 + testCases.push({ 1.199 + 'attr' : { 'begin': '-3s; 110s; 1s; 4s; -5s; -10s', 1.200 + 'end': '111s; -5s; -15s; 6s; -5s; 1.2s', 1.201 + 'dur': '2s ', 1.202 + 'fill': 'freeze' }, 1.203 + 'times': [ [ 0, -100 ], 1.204 + [ 1, 0 ], 1.205 + [ 2, 10 ], 1.206 + [ 4, 0 ], 1.207 + [ 5, 50 ], 1.208 + [ 109, 100 ], 1.209 + [ 110, 0 ], 1.210 + [ 112, 50 ] ] 1.211 + }); 1.212 + 1.213 + for (var i = 0; i < testCases.length; i++) { 1.214 + gSvg.setCurrentTime(0); 1.215 + var test = testCases[i]; 1.216 + 1.217 + // Generate string version of params for output messages 1.218 + var params = ""; 1.219 + for (var name in test.attr) { 1.220 + params += name + '="' + test.attr[name] + '" '; 1.221 + } 1.222 + params = params.trim(); 1.223 + 1.224 + // Create animation elements 1.225 + var anim = createAnim(test.attr); 1.226 + 1.227 + // Run samples 1.228 + if ('times' in test) { 1.229 + for (var j = 0; j < test.times.length; j++) { 1.230 + var curSample = test.times[j]; 1.231 + checkSample(curSample[0], curSample[1], params); 1.232 + } 1.233 + } 1.234 + 1.235 + // Check start time 1.236 + if ('startTime' in test) { 1.237 + is(getStartTime(anim), test.startTime, 1.238 + "Got unexpected start time for " + params); 1.239 + } 1.240 + 1.241 + anim.parentNode.removeChild(anim); 1.242 + } 1.243 + 1.244 + SimpleTest.finish(); 1.245 +} 1.246 + 1.247 +function createAnim(attr) { 1.248 + var anim = document.createElementNS(svgns,'animate'); 1.249 + anim.setAttribute('attributeName','cx'); 1.250 + anim.setAttribute('from','0'); 1.251 + anim.setAttribute('to','100'); 1.252 + anim.setAttribute('dur','10s'); 1.253 + anim.setAttribute('begin','indefinite'); 1.254 + for (name in attr) { 1.255 + anim.setAttribute(name, attr[name]); 1.256 + } 1.257 + return gCircle.appendChild(anim); 1.258 +} 1.259 + 1.260 +function checkSample(time, expectedValue, params) { 1.261 + gSvg.setCurrentTime(time); 1.262 + var msg = "Unexpected sample value for " + params + 1.263 + " at t=" + time + ": "; 1.264 + is(gCircle.cx.animVal.value, expectedValue); 1.265 +} 1.266 + 1.267 +function getStartTime(anim) { 1.268 + var startTime; 1.269 + try { 1.270 + startTime = anim.getStartTime(); 1.271 + // We round start times to 3 decimal places to make comparisons simpler 1.272 + startTime = parseFloat(startTime.toFixed(3)); 1.273 + } catch(e) { 1.274 + if (e.name == "InvalidStateError" && 1.275 + e.code == DOMException.INVALID_STATE_ERR) { 1.276 + startTime = 'none'; 1.277 + } else { 1.278 + ok(false, "Unexpected exception: " + e); 1.279 + } 1.280 + } 1.281 + return startTime; 1.282 +} 1.283 + 1.284 +function StartTimeTest(beginSpec, expectedStartTime) { 1.285 + return { 'attr' : { 'begin': beginSpec }, 1.286 + 'startTime': expectedStartTime }; 1.287 +} 1.288 + 1.289 +window.addEventListener("load", main, false); 1.290 +]]> 1.291 +</script> 1.292 +</pre> 1.293 +</body> 1.294 +</html>