dom/smil/test/test_smilTiming.xhtml

changeset 0
6474c204b198
     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>

mercurial