Clobbering window.console is not cool because it makes debugging tests
[WebKit-https.git] / LayoutTests / media / video-test.js
1
2 var video = null;
3 var mediaElement = document; // If not set, an event from any element will trigger a waitForEvent() callback.
4 var consoleElement = null;
5 var printFullTestDetails = true; // This is optionaly switched of by test whose tested values can differ. (see disableFullTestDetailsPrinting())
6 var Failed = false;
7
8 var track = null; // Current TextTrack being tested.
9 var cues = null; // Current TextTrackCueList being tested.
10 var numberOfTrackTests = 0;
11 var numberOfTracksLoaded = 0;
12
13 findMediaElement();
14 logConsole();
15
16 if (window.testRunner) {
17     // Some track element rendering tests require text pixel dump.
18     if (typeof requirePixelDump == "undefined")
19         testRunner.dumpAsText();
20
21     testRunner.waitUntilDone();
22 }
23
24 function disableFullTestDetailsPrinting()
25 {
26     printFullTestDetails = false;
27 }
28
29 function enableFullTestDetailsPrinting()
30 {
31     printFullTestDetails = true;
32 }
33
34 function logConsole()
35 {
36     if (!consoleElement && document.body) {
37         consoleElement = document.createElement('div');
38         document.body.appendChild(consoleElement);
39     }
40     return consoleElement;
41 }
42
43 function findMediaElement()
44 {
45     try {
46         video = document.getElementsByTagName('video')[0];
47         if (video)
48             mediaElement = video;
49     } catch (ex) { }
50 }
51
52 function testAndEnd(testFuncString)
53 {
54     test(testFuncString, true);
55 }
56
57 function test(testFuncString, endit)
58 {
59     logResult(eval(testFuncString), "TEST(" + testFuncString + ")");
60     if (endit)
61         endTest();
62 }
63
64 function testExpected(testFuncString, expected, comparison)
65 {
66     try {
67         var observed = eval(testFuncString);
68     } catch (ex) {
69         consoleWrite(ex);
70         return;
71     }
72
73     if (comparison === undefined)
74         comparison = '==';
75
76     var success = false;
77     switch (comparison)
78     {
79         case '<':   success = observed <  expected; break;
80         case '<=': success = observed <= expected; break;
81         case '>':   success = observed >  expected; break;
82         case '>=': success = observed >= expected; break;
83         case '!=':  success = observed != expected; break;
84         case '==': success = observed == expected; break;
85         case '===': success = observed === expected; break;
86     }
87
88     reportExpected(success, testFuncString, comparison, expected, observed)
89 }
90
91 function testArraysEqual(testFuncString, expected)
92 {
93     var observed;
94     try {
95         observed = eval(testFuncString);
96     } catch (ex) {
97         consoleWrite(ex);
98         return;
99     }
100
101     testExpected(testFuncString + ".length", expected.length);
102
103     for (var i = 0; i < observed.length; i++) {
104         testExpected(testFuncString + "[" + i + "]", expected[i]);
105     }
106 }
107
108 var testNumber = 0;
109
110 function reportExpected(success, testFuncString, comparison, expected, observed)
111 {
112     testNumber++;
113
114     var msg = "Test " + testNumber;
115
116     if (printFullTestDetails || !success)
117         msg = "EXPECTED (<em>" + testFuncString + " </em>" + comparison + " '<em>" + expected + "</em>')";
118
119     if (!success)
120         msg +=  ", OBSERVED '<em>" + observed + "</em>'";
121
122     logResult(success, msg);
123 }
124
125 function runSilently(testFuncString)
126 {
127     if (printFullTestDetails)
128         consoleWrite("RUN(" + testFuncString + ")");
129     try {
130         eval(testFuncString);
131     } catch (ex) {
132         if (!printFullTestDetails) {
133             // No details were printed previous, give some now.
134             // This will be helpful in case of error.
135             logResult(Failed, "Error in RUN(" + testFuncString + "):");
136         }
137         logResult(Failed, "<span style='color:red'>"+ex+"</span>");
138     }
139 }
140
141 function run(testFuncString)
142 {
143     consoleWrite("RUN(" + testFuncString + ")");
144     try {
145         eval(testFuncString);
146     } catch (ex) {
147         consoleWrite(ex);
148     }
149 }
150
151 function waitForEventOnce(eventName, func, endit)
152 {
153     waitForEvent(eventName, func, endit, true)
154 }
155
156 function waitForEventAndEnd(eventName, funcString)
157 {
158     waitForEvent(eventName, funcString, true)
159 }
160
161 function waitForEvent(eventName, func, endit, oneTimeOnly, element)
162 {
163     if (!element)
164         element = mediaElement;
165
166     function _eventCallback(event)
167     {
168         if (oneTimeOnly)
169             element.removeEventListener(eventName, _eventCallback, true);
170
171         consoleWrite("EVENT(" + eventName + ")");
172
173         if (func)
174             func(event);
175
176         if (endit)
177             endTest();
178     }
179
180     element.addEventListener(eventName, _eventCallback, true);
181 }
182
183 function waitForEventTestAndEnd(eventName, testFuncString)
184 {
185     waitForEventAndTest(eventName, testFuncString, true);
186 }
187
188 function waitForEventAndFail(eventName)
189 {
190     waitForEventAndTest(eventName, "false", true);
191 }
192
193 function waitForEventAndTest(eventName, testFuncString, endit)
194 {
195     function _eventCallback(event)
196     {
197         logResult(eval(testFuncString), "EVENT(" + eventName + ") TEST(" + testFuncString + ")");
198         if (endit)
199             endTest();
200     }
201
202     mediaElement.addEventListener(eventName, _eventCallback, true);
203 }
204
205 function testDOMException(testString, exceptionString)
206 {
207     try {
208         eval(testString);
209     } catch (ex) {
210         var exception = ex;
211     }
212     logResult(exception instanceof DOMException && exception.code === eval(exceptionString),
213         "TEST(" + testString + ") THROWS(" + exceptionString + ")");
214 }
215
216 function testException(testString, exceptionString) {
217     try {
218         eval(testString);
219     } catch (ex) {
220         var exception = ex;
221     }
222     logResult(exception !== undefined && exception == eval(exceptionString),
223         "TEST(" + testString + ") THROWS(" + exceptionString + ")");
224 }
225
226 var testEnded = false;
227
228 function endTest()
229 {
230     consoleWrite("END OF TEST");
231     testEnded = true;
232     if (window.testRunner)
233         testRunner.notifyDone();
234 }
235
236 function endTestLater()
237 {
238     setTimeout(endTest, 250);
239 }
240
241 function failTestIn(ms)
242 {
243     setTimeout(function () {
244         consoleWrite("FAIL: did not end fast enough");
245         endTest();
246     }, ms);
247 }
248
249 function failTest(text)
250 {
251     logResult(Failed, text);
252     endTest();
253 }
254
255
256 function logResult(success, text)
257 {
258     if (success)
259         consoleWrite(text + " <span style='color:green'>OK</span>");
260     else
261         consoleWrite(text + " <span style='color:red'>FAIL</span>");
262 }
263
264 function consoleWrite(text)
265 {
266     if (testEnded)
267         return;
268     logConsole().innerHTML += text + "<br>";
269 }
270
271 function relativeURL(url)
272 {
273     return url.substr(url.lastIndexOf('/media/')+7);
274 }
275
276
277 function isInTimeRanges(ranges, time)
278 {
279     var i = 0;
280     for (i = 0; i < ranges.length; ++i) {
281         if (time >= ranges.start(i) && time <= ranges.end(i)) {
282           return true;
283         }
284     }
285     return false;
286 }
287
288 function testTracks(expected)
289 {
290     tracks = video.textTracks;
291     testExpected("tracks.length", expected.length);
292
293     for (var i = 0; i < tracks.length; i++) {
294         consoleWrite("<br>*** Testing text track " + i);
295
296         track = tracks[i];
297         for (j = 0; j < expected.tests.length; j++) {
298             var test = expected.tests[j];
299             testExpected("track." + test.property, test.values[i]);
300         }
301     }
302 }
303
304 function testCues(index, expected)
305 {
306     consoleWrite("<br>*** Testing text track " + index);
307
308     cues = video.textTracks[index].cues;
309     testExpected("cues.length", expected.length);
310     for (var i = 0; i < cues.length; i++) {
311         for (j = 0; j < expected.tests.length; j++) {
312             var test = expected.tests[j];
313             testExpected("cues[" + i + "]." + test.property, test.values[i]);
314         }
315     }
316 }
317
318 function allTestsEnded()
319 {
320     numberOfTrackTests--;
321     if (numberOfTrackTests == 0)
322         endTest();
323 }
324
325 function enableAllTextTracks()
326 {
327     findMediaElement();
328     for (var i = 0; i < video.textTracks.length; i++) {
329         if (video.textTracks[i].mode == "disabled")
330             video.textTracks[i].mode = "hidden";
331     }
332 }
333
334 var requiredEvents = [];
335
336 function waitForEventsAndCall(eventList, func)
337 {
338     function _eventCallback(event)
339     {
340         if (!requiredEvents.length)
341             return;
342
343         var index = requiredEvents.indexOf(event.type);
344         if (index < 0)
345             return;
346
347         requiredEvents.splice(index, 1);
348         if (requiredEvents.length)
349             return;
350
351         func();
352     }
353
354     requiredEvents = [];
355     for (var i = 0; i < eventList.length; i++) {
356         requiredEvents[i] = eventList[i][1];
357         eventList[i][0].addEventListener(requiredEvents[i], _eventCallback, true);
358     }
359 }