|
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> |