2009-08-04 19:39:04 -07:00
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
|
|
<head>
|
|
|
|
<title>Test for SMIL timing</title>
|
|
|
|
<script type="text/javascript" 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" style="display: none">
|
2010-03-10 12:33:37 -08:00
|
|
|
<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="120px" height="120px"
|
|
|
|
onload="this.pauseAnimations()">
|
2009-08-04 19:39:04 -07:00
|
|
|
<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 */
|
2012-02-23 16:45:40 -08:00
|
|
|
const svgns = "http://www.w3.org/2000/svg";
|
|
|
|
var gSvg = document.getElementById("svg");
|
|
|
|
var gCircle = document.getElementById('circle');
|
2009-08-04 19:39:04 -07:00
|
|
|
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
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();
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
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'));
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
// 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;;', 'none'));
|
|
|
|
testCases.push(StartTimeTest('3;; ', 'none'));
|
|
|
|
testCases.push(StartTimeTest(';3', 'none'));
|
|
|
|
testCases.push(StartTimeTest(' ;3', 'none'));
|
|
|
|
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.parentNode.removeChild(anim);
|
|
|
|
}
|
|
|
|
|
|
|
|
SimpleTest.finish();
|
|
|
|
}
|
|
|
|
|
|
|
|
function createAnim(attr) {
|
2009-08-04 19:39:04 -07:00
|
|
|
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');
|
2012-02-23 16:45:40 -08:00
|
|
|
for (name in attr) {
|
|
|
|
anim.setAttribute(name, attr[name]);
|
2009-08-04 19:39:04 -07:00
|
|
|
}
|
2012-02-23 16:45:40 -08:00
|
|
|
return gCircle.appendChild(anim);
|
2009-08-04 19:39:04 -07:00
|
|
|
}
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
function checkSample(time, expectedValue, params) {
|
|
|
|
gSvg.setCurrentTime(time);
|
|
|
|
var msg = "Unexpected sample value for " + params +
|
|
|
|
" at t=" + time + ": ";
|
|
|
|
is(gCircle.cx.animVal.value, expectedValue);
|
2009-08-04 19:39:04 -07:00
|
|
|
}
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
function getStartTime(anim) {
|
|
|
|
var startTime;
|
|
|
|
try {
|
|
|
|
startTime = anim.getStartTime();
|
2012-02-23 16:45:40 -08:00
|
|
|
// We round start times to 3 decimal places to make comparisons simpler
|
|
|
|
startTime = parseFloat(startTime.toFixed(3));
|
2012-02-23 16:45:40 -08:00
|
|
|
} catch(e) {
|
2012-04-26 09:42:26 -07:00
|
|
|
if (e.name == "InvalidStateError" &&
|
|
|
|
e.code == DOMException.INVALID_STATE_ERR) {
|
2012-02-23 16:45:40 -08:00
|
|
|
startTime = 'none';
|
|
|
|
} else {
|
|
|
|
ok(false, "Unexpected exception: " + e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return startTime;
|
|
|
|
}
|
|
|
|
|
2012-02-23 16:45:40 -08:00
|
|
|
function StartTimeTest(beginSpec, expectedStartTime) {
|
|
|
|
return { 'attr' : { 'begin': beginSpec },
|
|
|
|
'startTime': expectedStartTime };
|
2009-08-04 19:39:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
window.addEventListener("load", main, false);
|
|
|
|
]]>
|
|
|
|
</script>
|
|
|
|
</pre>
|
|
|
|
</body>
|
|
|
|
</html>
|