dom/smil/test/test_smilTiming.xhtml

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:0aa8245f1aca
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head>
3 <title>Test for SMIL timing</title>
4 <script type="text/javascript" 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" style="display: none">
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;;', 'none'));
136 testCases.push(StartTimeTest('3;; ', 'none'));
137 testCases.push(StartTimeTest(';3', 'none'));
138 testCases.push(StartTimeTest(' ;3', 'none'));
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.parentNode.removeChild(anim);
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, false);
287 ]]>
288 </script>
289 </pre>
290 </body>
291 </html>

mercurial