test_smilTiming.xhtml (9903B)
1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <head> 3 <title>Test for SMIL timing</title> 4 <script src="/tests/SimpleTest/SimpleTest.js"></script> 5 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 6 </head> 7 <body> 8 <p id="display"></p> 9 <div id="content"> 10 <svg id="svg" xmlns="http://www.w3.org/2000/svg" width="120px" height="120px" 11 onload="this.pauseAnimations()"> 12 <circle cx="-100" cy="20" r="15" fill="blue" id="circle"/> 13 </svg> 14 </div> 15 <pre id="test"> 16 <script class="testbody" type="text/javascript"> 17 <![CDATA[ 18 /** Test for SMIL timing */ 19 20 /* Global Variables */ 21 const svgns = "http://www.w3.org/2000/svg"; 22 var gSvg = document.getElementById("svg"); 23 var gCircle = document.getElementById('circle'); 24 25 SimpleTest.waitForExplicitFinish(); 26 27 function main() { 28 ok(gSvg.animationsPaused(), "should be paused by <svg> load handler"); 29 is(gSvg.getCurrentTime(), 0, "should be paused at 0 in <svg> load handler"); 30 31 var testCases = Array(); 32 33 const secPerMin = 60; 34 const secPerHour = secPerMin * 60; 35 36 // In the following tests that compare start times, getStartTime will round 37 // the start time to three decimal places since we expect our implementation 38 // to be millisecond accurate. 39 40 // Offset syntax 41 // -- Basic tests, sign and whitespace 42 testCases.push(StartTimeTest('3s', 3)); 43 testCases.push(StartTimeTest('0s', 0)); 44 testCases.push(StartTimeTest('+2s', 2)); 45 testCases.push(StartTimeTest('-1s\t\r', -1)); 46 testCases.push(StartTimeTest('- 1s', -1)); 47 testCases.push(StartTimeTest(' -1s', -1)); 48 testCases.push(StartTimeTest(' - 1s', -1)); 49 testCases.push(StartTimeTest(' \t\n\r-1s', -1)); 50 testCases.push(StartTimeTest('+\n5s', 5)); 51 testCases.push(StartTimeTest('-\n5s', -5)); 52 testCases.push(StartTimeTest('\t 5s', 5)); 53 // -- These tests are from SMILANIM 3.6.7 54 testCases.push(StartTimeTest('02:30:03', 2*secPerHour + 30*secPerMin + 3)); 55 testCases.push(StartTimeTest('50:00:10.25', 50*secPerHour + 10.25)); 56 testCases.push(StartTimeTest('02:33', 2*secPerMin + 33)); 57 testCases.push(StartTimeTest('00:10.5', 10.5)); 58 testCases.push(StartTimeTest('3.2h', 3.2*secPerHour)); 59 testCases.push(StartTimeTest('45min', 45*secPerMin)); 60 testCases.push(StartTimeTest('30s', 30)); 61 testCases.push(StartTimeTest('5ms', 0.005)); 62 testCases.push(StartTimeTest('12.467', 12.467)); 63 testCases.push(StartTimeTest('00.5s', 0.5)); 64 testCases.push(StartTimeTest('00:00.005', 0.005)); 65 // -- Additional tests 66 testCases.push(StartTimeTest('61:59:59', 61*secPerHour + 59*secPerMin + 59)); 67 testCases.push(StartTimeTest('02:59.999999999999999999999', 3*secPerMin)); 68 testCases.push(StartTimeTest('1234:23:45', 69 1234*secPerHour + 23*secPerMin + 45)); 70 testCases.push(StartTimeTest('61min', 61*secPerMin)); 71 testCases.push(StartTimeTest('0:30:03', 30*secPerMin + 3)); 72 // -- Fractional precision 73 testCases.push(StartTimeTest('25.4567', 25.457)); 74 testCases.push(StartTimeTest('0.123456789', 0.123)); 75 testCases.push(StartTimeTest('0.00000000000000000000001', 0)); 76 testCases.push(StartTimeTest('-0.00000000000000000000001', 0)); 77 testCases.push(StartTimeTest('0.0009', 0.001)); 78 testCases.push(StartTimeTest('0.99999999999999999999999999999999999999', 1)); 79 testCases.push(StartTimeTest('23.4567ms', 0.023)); 80 testCases.push(StartTimeTest('23.7ms', 0.024)); 81 // -- Test errors 82 testCases.push(StartTimeTest(' + +3s', 'none')); 83 testCases.push(StartTimeTest(' +-3s', 'none')); 84 testCases.push(StartTimeTest('1:12:12:12', 'none')); 85 testCases.push(StartTimeTest('4:50:60', 'none')); 86 testCases.push(StartTimeTest('4:60:0', 'none')); 87 testCases.push(StartTimeTest('4:60', 'none')); 88 testCases.push(StartTimeTest('4:-1:00', 'none')); 89 testCases.push(StartTimeTest('4 5m', 'none')); 90 testCases.push(StartTimeTest('4 5ms', 'none')); 91 testCases.push(StartTimeTest('02:3:03', 'none')); 92 testCases.push(StartTimeTest('45.7 s', 'none')); 93 testCases.push(StartTimeTest(' 3 h ', 'none')); 94 testCases.push(StartTimeTest('2:33 ', 'none')); 95 testCases.push(StartTimeTest('02:33 2', 'none')); 96 testCases.push(StartTimeTest('\u000B 02:33', 'none')); 97 testCases.push(StartTimeTest('h', 'none')); 98 testCases.push(StartTimeTest('23.s', 'none')); 99 testCases.push(StartTimeTest('23.', 'none')); 100 testCases.push(StartTimeTest('23.54.2s', 'none')); 101 testCases.push(StartTimeTest('23sec', 'none')); 102 testCases.push(StartTimeTest('five', 'none')); 103 testCases.push(StartTimeTest('', 'none')); 104 testCases.push(StartTimeTest('02:33s', 'none')); 105 testCases.push(StartTimeTest('02:33 s', 'none')); 106 testCases.push(StartTimeTest('2.54e6', 'none')); 107 testCases.push(StartTimeTest('02.5:33', 'none')); 108 testCases.push(StartTimeTest('2:-45:33', 'none')); 109 testCases.push(StartTimeTest('2:4.5:33', 'none')); 110 testCases.push(StartTimeTest('45m', 'none')); 111 testCases.push(StartTimeTest(':20:30', 'none')); 112 testCases.push(StartTimeTest('1.5:30', 'none')); 113 testCases.push(StartTimeTest('15:-30', 'none')); 114 testCases.push(StartTimeTest('::30', 'none')); 115 testCases.push(StartTimeTest('15:30s', 'none')); 116 testCases.push(StartTimeTest('2:1.:30', 'none')); 117 testCases.push(StartTimeTest('2:.1:30', 'none')); 118 testCases.push(StartTimeTest('2.0:15:30', 'none')); 119 testCases.push(StartTimeTest('2.:15:30', 'none')); 120 testCases.push(StartTimeTest('.2:15:30', 'none')); 121 testCases.push(StartTimeTest('70:15', 'none')); 122 testCases.push(StartTimeTest('media', 'none')); 123 testCases.push(StartTimeTest('5mi', 'none')); 124 testCases.push(StartTimeTest('5hours', 'none')); 125 testCases.push(StartTimeTest('h05:30', 'none')); 126 testCases.push(StartTimeTest('05:40\x9A', 'none')); 127 testCases.push(StartTimeTest('05:40\u30D5', 'none')); 128 testCases.push(StartTimeTest('05:40β', 'none')); 129 130 // List syntax 131 testCases.push(StartTimeTest('3', 3)); 132 testCases.push(StartTimeTest('3;', 3)); 133 testCases.push(StartTimeTest('3; ', 3)); 134 testCases.push(StartTimeTest('3 ; ', 3)); 135 testCases.push(StartTimeTest('3;;', 3)); 136 testCases.push(StartTimeTest('3;; ', 3)); 137 testCases.push(StartTimeTest(';3', 3)); 138 testCases.push(StartTimeTest(' ;3', 3)); 139 testCases.push(StartTimeTest('3;4', 3)); 140 testCases.push(StartTimeTest(' 3 ; 4 ', 3)); 141 142 // List syntax on end times 143 testCases.push({ 144 'attr' : { 'begin': '0s', 145 'end': '1s; 2s' }, 146 'times': [ [ 0, 0 ], 147 [ 1, -100 ] ] 148 }); 149 testCases.push({ 150 'attr' : { 'begin': '0s', 151 'end': '1s; 2s; ' }, 152 'times': [ [ 0, 0 ], 153 [ 1, -100 ] ] 154 }); 155 testCases.push({ 156 'attr' : { 'begin': '0s', 157 'end': '3s; 2s' }, 158 'times': [ [ 0, 0 ], 159 [ 1, 10 ], 160 [ 2, -100 ] ] 161 }); 162 163 // Simple case 164 testCases.push({ 165 'attr' : { 'begin': '3s' }, 166 'times': [ [ 0, -100 ], 167 [ 4, 10 ] ] 168 }); 169 170 // Multiple begins 171 testCases.push({ 172 'attr' : { 'begin': '2s; 6s', 173 'dur': '2s' }, 174 'times': [ [ 0, -100 ], 175 [ 3, 50 ], 176 [ 4, -100 ], 177 [ 7, 50 ], 178 [ 8, -100 ] ] 179 }); 180 181 // Negative begins 182 testCases.push({ 183 'attr' : { 'begin': '-3s; 1s ; 4s', 184 'dur': '2s ', 185 'fill': 'freeze' }, 186 'times': [ [ 0, -100 ], 187 [ 0.5, -100 ], 188 [ 1, 0 ], 189 [ 2, 50 ], 190 [ 3, 100 ], 191 [ 5, 50 ] ] 192 }); 193 194 // Sorting 195 testCases.push({ 196 'attr' : { 'begin': '-3s; 110s; 1s; 4s; -5s; -10s', 197 'end': '111s; -5s; -15s; 6s; -5s; 1.2s', 198 'dur': '2s ', 199 'fill': 'freeze' }, 200 'times': [ [ 0, -100 ], 201 [ 1, 0 ], 202 [ 2, 10 ], 203 [ 4, 0 ], 204 [ 5, 50 ], 205 [ 109, 100 ], 206 [ 110, 0 ], 207 [ 112, 50 ] ] 208 }); 209 210 for (var i = 0; i < testCases.length; i++) { 211 gSvg.setCurrentTime(0); 212 var test = testCases[i]; 213 214 // Generate string version of params for output messages 215 var params = ""; 216 for (var name in test.attr) { 217 params += name + '="' + test.attr[name] + '" '; 218 } 219 params = params.trim(); 220 221 // Create animation elements 222 var anim = createAnim(test.attr); 223 224 // Run samples 225 if ('times' in test) { 226 for (var j = 0; j < test.times.length; j++) { 227 var curSample = test.times[j]; 228 checkSample(curSample[0], curSample[1], params); 229 } 230 } 231 232 // Check start time 233 if ('startTime' in test) { 234 is(getStartTime(anim), test.startTime, 235 "Got unexpected start time for " + params); 236 } 237 238 anim.remove(); 239 } 240 241 SimpleTest.finish(); 242 } 243 244 function createAnim(attr) { 245 var anim = document.createElementNS(svgns,'animate'); 246 anim.setAttribute('attributeName','cx'); 247 anim.setAttribute('from','0'); 248 anim.setAttribute('to','100'); 249 anim.setAttribute('dur','10s'); 250 anim.setAttribute('begin','indefinite'); 251 for (name in attr) { 252 anim.setAttribute(name, attr[name]); 253 } 254 return gCircle.appendChild(anim); 255 } 256 257 function checkSample(time, expectedValue, params) { 258 gSvg.setCurrentTime(time); 259 var msg = "Unexpected sample value for " + params + 260 " at t=" + time + ": "; 261 is(gCircle.cx.animVal.value, expectedValue); 262 } 263 264 function getStartTime(anim) { 265 var startTime; 266 try { 267 startTime = anim.getStartTime(); 268 // We round start times to 3 decimal places to make comparisons simpler 269 startTime = parseFloat(startTime.toFixed(3)); 270 } catch(e) { 271 if (e.name == "InvalidStateError" && 272 e.code == DOMException.INVALID_STATE_ERR) { 273 startTime = 'none'; 274 } else { 275 ok(false, "Unexpected exception: " + e); 276 } 277 } 278 return startTime; 279 } 280 281 function StartTimeTest(beginSpec, expectedStartTime) { 282 return { 'attr' : { 'begin': beginSpec }, 283 'startTime': expectedStartTime }; 284 } 285 286 window.addEventListener("load", main); 287 ]]> 288 </script> 289 </pre> 290 </body> 291 </html>