annotate src/main/webapp/imageServer/resources/js/jquery-ui-1.10.4/external/qunit.js @ 7:764f47286679

(none)
author jurzua
date Wed, 29 Oct 2014 14:28:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
jurzua
parents:
diff changeset
1 /**
jurzua
parents:
diff changeset
2 * QUnit v1.11.0 - A JavaScript Unit Testing Framework
jurzua
parents:
diff changeset
3 *
jurzua
parents:
diff changeset
4 * http://qunitjs.com
jurzua
parents:
diff changeset
5 *
jurzua
parents:
diff changeset
6 * Copyright 2012 jQuery Foundation and other contributors
jurzua
parents:
diff changeset
7 * Released under the MIT license.
jurzua
parents:
diff changeset
8 * http://jquery.org/license
jurzua
parents:
diff changeset
9 */
jurzua
parents:
diff changeset
10
jurzua
parents:
diff changeset
11 (function( window ) {
jurzua
parents:
diff changeset
12
jurzua
parents:
diff changeset
13 var QUnit,
jurzua
parents:
diff changeset
14 assert,
jurzua
parents:
diff changeset
15 config,
jurzua
parents:
diff changeset
16 onErrorFnPrev,
jurzua
parents:
diff changeset
17 testId = 0,
jurzua
parents:
diff changeset
18 fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
jurzua
parents:
diff changeset
19 toString = Object.prototype.toString,
jurzua
parents:
diff changeset
20 hasOwn = Object.prototype.hasOwnProperty,
jurzua
parents:
diff changeset
21 // Keep a local reference to Date (GH-283)
jurzua
parents:
diff changeset
22 Date = window.Date,
jurzua
parents:
diff changeset
23 defined = {
jurzua
parents:
diff changeset
24 setTimeout: typeof window.setTimeout !== "undefined",
jurzua
parents:
diff changeset
25 sessionStorage: (function() {
jurzua
parents:
diff changeset
26 var x = "qunit-test-string";
jurzua
parents:
diff changeset
27 try {
jurzua
parents:
diff changeset
28 sessionStorage.setItem( x, x );
jurzua
parents:
diff changeset
29 sessionStorage.removeItem( x );
jurzua
parents:
diff changeset
30 return true;
jurzua
parents:
diff changeset
31 } catch( e ) {
jurzua
parents:
diff changeset
32 return false;
jurzua
parents:
diff changeset
33 }
jurzua
parents:
diff changeset
34 }())
jurzua
parents:
diff changeset
35 },
jurzua
parents:
diff changeset
36 /**
jurzua
parents:
diff changeset
37 * Provides a normalized error string, correcting an issue
jurzua
parents:
diff changeset
38 * with IE 7 (and prior) where Error.prototype.toString is
jurzua
parents:
diff changeset
39 * not properly implemented
jurzua
parents:
diff changeset
40 *
jurzua
parents:
diff changeset
41 * Based on http://es5.github.com/#x15.11.4.4
jurzua
parents:
diff changeset
42 *
jurzua
parents:
diff changeset
43 * @param {String|Error} error
jurzua
parents:
diff changeset
44 * @return {String} error message
jurzua
parents:
diff changeset
45 */
jurzua
parents:
diff changeset
46 errorString = function( error ) {
jurzua
parents:
diff changeset
47 var name, message,
jurzua
parents:
diff changeset
48 errorString = error.toString();
jurzua
parents:
diff changeset
49 if ( errorString.substring( 0, 7 ) === "[object" ) {
jurzua
parents:
diff changeset
50 name = error.name ? error.name.toString() : "Error";
jurzua
parents:
diff changeset
51 message = error.message ? error.message.toString() : "";
jurzua
parents:
diff changeset
52 if ( name && message ) {
jurzua
parents:
diff changeset
53 return name + ": " + message;
jurzua
parents:
diff changeset
54 } else if ( name ) {
jurzua
parents:
diff changeset
55 return name;
jurzua
parents:
diff changeset
56 } else if ( message ) {
jurzua
parents:
diff changeset
57 return message;
jurzua
parents:
diff changeset
58 } else {
jurzua
parents:
diff changeset
59 return "Error";
jurzua
parents:
diff changeset
60 }
jurzua
parents:
diff changeset
61 } else {
jurzua
parents:
diff changeset
62 return errorString;
jurzua
parents:
diff changeset
63 }
jurzua
parents:
diff changeset
64 },
jurzua
parents:
diff changeset
65 /**
jurzua
parents:
diff changeset
66 * Makes a clone of an object using only Array or Object as base,
jurzua
parents:
diff changeset
67 * and copies over the own enumerable properties.
jurzua
parents:
diff changeset
68 *
jurzua
parents:
diff changeset
69 * @param {Object} obj
jurzua
parents:
diff changeset
70 * @return {Object} New object with only the own properties (recursively).
jurzua
parents:
diff changeset
71 */
jurzua
parents:
diff changeset
72 objectValues = function( obj ) {
jurzua
parents:
diff changeset
73 // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
jurzua
parents:
diff changeset
74 /*jshint newcap: false */
jurzua
parents:
diff changeset
75 var key, val,
jurzua
parents:
diff changeset
76 vals = QUnit.is( "array", obj ) ? [] : {};
jurzua
parents:
diff changeset
77 for ( key in obj ) {
jurzua
parents:
diff changeset
78 if ( hasOwn.call( obj, key ) ) {
jurzua
parents:
diff changeset
79 val = obj[key];
jurzua
parents:
diff changeset
80 vals[key] = val === Object(val) ? objectValues(val) : val;
jurzua
parents:
diff changeset
81 }
jurzua
parents:
diff changeset
82 }
jurzua
parents:
diff changeset
83 return vals;
jurzua
parents:
diff changeset
84 };
jurzua
parents:
diff changeset
85
jurzua
parents:
diff changeset
86 function Test( settings ) {
jurzua
parents:
diff changeset
87 extend( this, settings );
jurzua
parents:
diff changeset
88 this.assertions = [];
jurzua
parents:
diff changeset
89 this.testNumber = ++Test.count;
jurzua
parents:
diff changeset
90 }
jurzua
parents:
diff changeset
91
jurzua
parents:
diff changeset
92 Test.count = 0;
jurzua
parents:
diff changeset
93
jurzua
parents:
diff changeset
94 Test.prototype = {
jurzua
parents:
diff changeset
95 init: function() {
jurzua
parents:
diff changeset
96 var a, b, li,
jurzua
parents:
diff changeset
97 tests = id( "qunit-tests" );
jurzua
parents:
diff changeset
98
jurzua
parents:
diff changeset
99 if ( tests ) {
jurzua
parents:
diff changeset
100 b = document.createElement( "strong" );
jurzua
parents:
diff changeset
101 b.innerHTML = this.nameHtml;
jurzua
parents:
diff changeset
102
jurzua
parents:
diff changeset
103 // `a` initialized at top of scope
jurzua
parents:
diff changeset
104 a = document.createElement( "a" );
jurzua
parents:
diff changeset
105 a.innerHTML = "Rerun";
jurzua
parents:
diff changeset
106 a.href = QUnit.url({ testNumber: this.testNumber });
jurzua
parents:
diff changeset
107
jurzua
parents:
diff changeset
108 li = document.createElement( "li" );
jurzua
parents:
diff changeset
109 li.appendChild( b );
jurzua
parents:
diff changeset
110 li.appendChild( a );
jurzua
parents:
diff changeset
111 li.className = "running";
jurzua
parents:
diff changeset
112 li.id = this.id = "qunit-test-output" + testId++;
jurzua
parents:
diff changeset
113
jurzua
parents:
diff changeset
114 tests.appendChild( li );
jurzua
parents:
diff changeset
115 }
jurzua
parents:
diff changeset
116 },
jurzua
parents:
diff changeset
117 setup: function() {
jurzua
parents:
diff changeset
118 if ( this.module !== config.previousModule ) {
jurzua
parents:
diff changeset
119 if ( config.previousModule ) {
jurzua
parents:
diff changeset
120 runLoggingCallbacks( "moduleDone", QUnit, {
jurzua
parents:
diff changeset
121 name: config.previousModule,
jurzua
parents:
diff changeset
122 failed: config.moduleStats.bad,
jurzua
parents:
diff changeset
123 passed: config.moduleStats.all - config.moduleStats.bad,
jurzua
parents:
diff changeset
124 total: config.moduleStats.all
jurzua
parents:
diff changeset
125 });
jurzua
parents:
diff changeset
126 }
jurzua
parents:
diff changeset
127 config.previousModule = this.module;
jurzua
parents:
diff changeset
128 config.moduleStats = { all: 0, bad: 0 };
jurzua
parents:
diff changeset
129 runLoggingCallbacks( "moduleStart", QUnit, {
jurzua
parents:
diff changeset
130 name: this.module
jurzua
parents:
diff changeset
131 });
jurzua
parents:
diff changeset
132 } else if ( config.autorun ) {
jurzua
parents:
diff changeset
133 runLoggingCallbacks( "moduleStart", QUnit, {
jurzua
parents:
diff changeset
134 name: this.module
jurzua
parents:
diff changeset
135 });
jurzua
parents:
diff changeset
136 }
jurzua
parents:
diff changeset
137
jurzua
parents:
diff changeset
138 config.current = this;
jurzua
parents:
diff changeset
139
jurzua
parents:
diff changeset
140 this.testEnvironment = extend({
jurzua
parents:
diff changeset
141 setup: function() {},
jurzua
parents:
diff changeset
142 teardown: function() {}
jurzua
parents:
diff changeset
143 }, this.moduleTestEnvironment );
jurzua
parents:
diff changeset
144
jurzua
parents:
diff changeset
145 this.started = +new Date();
jurzua
parents:
diff changeset
146 runLoggingCallbacks( "testStart", QUnit, {
jurzua
parents:
diff changeset
147 name: this.testName,
jurzua
parents:
diff changeset
148 module: this.module
jurzua
parents:
diff changeset
149 });
jurzua
parents:
diff changeset
150
jurzua
parents:
diff changeset
151 // allow utility functions to access the current test environment
jurzua
parents:
diff changeset
152 // TODO why??
jurzua
parents:
diff changeset
153 QUnit.current_testEnvironment = this.testEnvironment;
jurzua
parents:
diff changeset
154
jurzua
parents:
diff changeset
155 if ( !config.pollution ) {
jurzua
parents:
diff changeset
156 saveGlobal();
jurzua
parents:
diff changeset
157 }
jurzua
parents:
diff changeset
158 if ( config.notrycatch ) {
jurzua
parents:
diff changeset
159 this.testEnvironment.setup.call( this.testEnvironment );
jurzua
parents:
diff changeset
160 return;
jurzua
parents:
diff changeset
161 }
jurzua
parents:
diff changeset
162 try {
jurzua
parents:
diff changeset
163 this.testEnvironment.setup.call( this.testEnvironment );
jurzua
parents:
diff changeset
164 } catch( e ) {
jurzua
parents:
diff changeset
165 QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
jurzua
parents:
diff changeset
166 }
jurzua
parents:
diff changeset
167 },
jurzua
parents:
diff changeset
168 run: function() {
jurzua
parents:
diff changeset
169 config.current = this;
jurzua
parents:
diff changeset
170
jurzua
parents:
diff changeset
171 var running = id( "qunit-testresult" );
jurzua
parents:
diff changeset
172
jurzua
parents:
diff changeset
173 if ( running ) {
jurzua
parents:
diff changeset
174 running.innerHTML = "Running: <br/>" + this.nameHtml;
jurzua
parents:
diff changeset
175 }
jurzua
parents:
diff changeset
176
jurzua
parents:
diff changeset
177 if ( this.async ) {
jurzua
parents:
diff changeset
178 QUnit.stop();
jurzua
parents:
diff changeset
179 }
jurzua
parents:
diff changeset
180
jurzua
parents:
diff changeset
181 this.callbackStarted = +new Date();
jurzua
parents:
diff changeset
182
jurzua
parents:
diff changeset
183 if ( config.notrycatch ) {
jurzua
parents:
diff changeset
184 this.callback.call( this.testEnvironment, QUnit.assert );
jurzua
parents:
diff changeset
185 this.callbackRuntime = +new Date() - this.callbackStarted;
jurzua
parents:
diff changeset
186 return;
jurzua
parents:
diff changeset
187 }
jurzua
parents:
diff changeset
188
jurzua
parents:
diff changeset
189 try {
jurzua
parents:
diff changeset
190 this.callback.call( this.testEnvironment, QUnit.assert );
jurzua
parents:
diff changeset
191 this.callbackRuntime = +new Date() - this.callbackStarted;
jurzua
parents:
diff changeset
192 } catch( e ) {
jurzua
parents:
diff changeset
193 this.callbackRuntime = +new Date() - this.callbackStarted;
jurzua
parents:
diff changeset
194
jurzua
parents:
diff changeset
195 QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
jurzua
parents:
diff changeset
196 // else next test will carry the responsibility
jurzua
parents:
diff changeset
197 saveGlobal();
jurzua
parents:
diff changeset
198
jurzua
parents:
diff changeset
199 // Restart the tests if they're blocking
jurzua
parents:
diff changeset
200 if ( config.blocking ) {
jurzua
parents:
diff changeset
201 QUnit.start();
jurzua
parents:
diff changeset
202 }
jurzua
parents:
diff changeset
203 }
jurzua
parents:
diff changeset
204 },
jurzua
parents:
diff changeset
205 teardown: function() {
jurzua
parents:
diff changeset
206 config.current = this;
jurzua
parents:
diff changeset
207 if ( config.notrycatch ) {
jurzua
parents:
diff changeset
208 if ( typeof this.callbackRuntime === "undefined" ) {
jurzua
parents:
diff changeset
209 this.callbackRuntime = +new Date() - this.callbackStarted;
jurzua
parents:
diff changeset
210 }
jurzua
parents:
diff changeset
211 this.testEnvironment.teardown.call( this.testEnvironment );
jurzua
parents:
diff changeset
212 return;
jurzua
parents:
diff changeset
213 } else {
jurzua
parents:
diff changeset
214 try {
jurzua
parents:
diff changeset
215 this.testEnvironment.teardown.call( this.testEnvironment );
jurzua
parents:
diff changeset
216 } catch( e ) {
jurzua
parents:
diff changeset
217 QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
jurzua
parents:
diff changeset
218 }
jurzua
parents:
diff changeset
219 }
jurzua
parents:
diff changeset
220 checkPollution();
jurzua
parents:
diff changeset
221 },
jurzua
parents:
diff changeset
222 finish: function() {
jurzua
parents:
diff changeset
223 config.current = this;
jurzua
parents:
diff changeset
224 if ( config.requireExpects && this.expected === null ) {
jurzua
parents:
diff changeset
225 QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
jurzua
parents:
diff changeset
226 } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
jurzua
parents:
diff changeset
227 QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
jurzua
parents:
diff changeset
228 } else if ( this.expected === null && !this.assertions.length ) {
jurzua
parents:
diff changeset
229 QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
jurzua
parents:
diff changeset
230 }
jurzua
parents:
diff changeset
231
jurzua
parents:
diff changeset
232 var i, assertion, a, b, time, li, ol,
jurzua
parents:
diff changeset
233 test = this,
jurzua
parents:
diff changeset
234 good = 0,
jurzua
parents:
diff changeset
235 bad = 0,
jurzua
parents:
diff changeset
236 tests = id( "qunit-tests" );
jurzua
parents:
diff changeset
237
jurzua
parents:
diff changeset
238 this.runtime = +new Date() - this.started;
jurzua
parents:
diff changeset
239 config.stats.all += this.assertions.length;
jurzua
parents:
diff changeset
240 config.moduleStats.all += this.assertions.length;
jurzua
parents:
diff changeset
241
jurzua
parents:
diff changeset
242 if ( tests ) {
jurzua
parents:
diff changeset
243 ol = document.createElement( "ol" );
jurzua
parents:
diff changeset
244 ol.className = "qunit-assert-list";
jurzua
parents:
diff changeset
245
jurzua
parents:
diff changeset
246 for ( i = 0; i < this.assertions.length; i++ ) {
jurzua
parents:
diff changeset
247 assertion = this.assertions[i];
jurzua
parents:
diff changeset
248
jurzua
parents:
diff changeset
249 li = document.createElement( "li" );
jurzua
parents:
diff changeset
250 li.className = assertion.result ? "pass" : "fail";
jurzua
parents:
diff changeset
251 li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
jurzua
parents:
diff changeset
252 ol.appendChild( li );
jurzua
parents:
diff changeset
253
jurzua
parents:
diff changeset
254 if ( assertion.result ) {
jurzua
parents:
diff changeset
255 good++;
jurzua
parents:
diff changeset
256 } else {
jurzua
parents:
diff changeset
257 bad++;
jurzua
parents:
diff changeset
258 config.stats.bad++;
jurzua
parents:
diff changeset
259 config.moduleStats.bad++;
jurzua
parents:
diff changeset
260 }
jurzua
parents:
diff changeset
261 }
jurzua
parents:
diff changeset
262
jurzua
parents:
diff changeset
263 // store result when possible
jurzua
parents:
diff changeset
264 if ( QUnit.config.reorder && defined.sessionStorage ) {
jurzua
parents:
diff changeset
265 if ( bad ) {
jurzua
parents:
diff changeset
266 sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
jurzua
parents:
diff changeset
267 } else {
jurzua
parents:
diff changeset
268 sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
jurzua
parents:
diff changeset
269 }
jurzua
parents:
diff changeset
270 }
jurzua
parents:
diff changeset
271
jurzua
parents:
diff changeset
272 if ( bad === 0 ) {
jurzua
parents:
diff changeset
273 addClass( ol, "qunit-collapsed" );
jurzua
parents:
diff changeset
274 }
jurzua
parents:
diff changeset
275
jurzua
parents:
diff changeset
276 // `b` initialized at top of scope
jurzua
parents:
diff changeset
277 b = document.createElement( "strong" );
jurzua
parents:
diff changeset
278 b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
jurzua
parents:
diff changeset
279
jurzua
parents:
diff changeset
280 addEvent(b, "click", function() {
jurzua
parents:
diff changeset
281 var next = b.parentNode.lastChild,
jurzua
parents:
diff changeset
282 collapsed = hasClass( next, "qunit-collapsed" );
jurzua
parents:
diff changeset
283 ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
jurzua
parents:
diff changeset
284 });
jurzua
parents:
diff changeset
285
jurzua
parents:
diff changeset
286 addEvent(b, "dblclick", function( e ) {
jurzua
parents:
diff changeset
287 var target = e && e.target ? e.target : window.event.srcElement;
jurzua
parents:
diff changeset
288 if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
jurzua
parents:
diff changeset
289 target = target.parentNode;
jurzua
parents:
diff changeset
290 }
jurzua
parents:
diff changeset
291 if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
jurzua
parents:
diff changeset
292 window.location = QUnit.url({ testNumber: test.testNumber });
jurzua
parents:
diff changeset
293 }
jurzua
parents:
diff changeset
294 });
jurzua
parents:
diff changeset
295
jurzua
parents:
diff changeset
296 // `time` initialized at top of scope
jurzua
parents:
diff changeset
297 time = document.createElement( "span" );
jurzua
parents:
diff changeset
298 time.className = "runtime";
jurzua
parents:
diff changeset
299 time.innerHTML = this.runtime + " ms";
jurzua
parents:
diff changeset
300
jurzua
parents:
diff changeset
301 // `li` initialized at top of scope
jurzua
parents:
diff changeset
302 li = id( this.id );
jurzua
parents:
diff changeset
303 li.className = bad ? "fail" : "pass";
jurzua
parents:
diff changeset
304 li.removeChild( li.firstChild );
jurzua
parents:
diff changeset
305 a = li.firstChild;
jurzua
parents:
diff changeset
306 li.appendChild( b );
jurzua
parents:
diff changeset
307 li.appendChild( a );
jurzua
parents:
diff changeset
308 li.appendChild( time );
jurzua
parents:
diff changeset
309 li.appendChild( ol );
jurzua
parents:
diff changeset
310
jurzua
parents:
diff changeset
311 } else {
jurzua
parents:
diff changeset
312 for ( i = 0; i < this.assertions.length; i++ ) {
jurzua
parents:
diff changeset
313 if ( !this.assertions[i].result ) {
jurzua
parents:
diff changeset
314 bad++;
jurzua
parents:
diff changeset
315 config.stats.bad++;
jurzua
parents:
diff changeset
316 config.moduleStats.bad++;
jurzua
parents:
diff changeset
317 }
jurzua
parents:
diff changeset
318 }
jurzua
parents:
diff changeset
319 }
jurzua
parents:
diff changeset
320
jurzua
parents:
diff changeset
321 runLoggingCallbacks( "testDone", QUnit, {
jurzua
parents:
diff changeset
322 name: this.testName,
jurzua
parents:
diff changeset
323 module: this.module,
jurzua
parents:
diff changeset
324 failed: bad,
jurzua
parents:
diff changeset
325 passed: this.assertions.length - bad,
jurzua
parents:
diff changeset
326 total: this.assertions.length,
jurzua
parents:
diff changeset
327 duration: this.runtime
jurzua
parents:
diff changeset
328 });
jurzua
parents:
diff changeset
329
jurzua
parents:
diff changeset
330 QUnit.reset();
jurzua
parents:
diff changeset
331
jurzua
parents:
diff changeset
332 config.current = undefined;
jurzua
parents:
diff changeset
333 },
jurzua
parents:
diff changeset
334
jurzua
parents:
diff changeset
335 queue: function() {
jurzua
parents:
diff changeset
336 var bad,
jurzua
parents:
diff changeset
337 test = this;
jurzua
parents:
diff changeset
338
jurzua
parents:
diff changeset
339 synchronize(function() {
jurzua
parents:
diff changeset
340 test.init();
jurzua
parents:
diff changeset
341 });
jurzua
parents:
diff changeset
342 function run() {
jurzua
parents:
diff changeset
343 // each of these can by async
jurzua
parents:
diff changeset
344 synchronize(function() {
jurzua
parents:
diff changeset
345 test.setup();
jurzua
parents:
diff changeset
346 });
jurzua
parents:
diff changeset
347 synchronize(function() {
jurzua
parents:
diff changeset
348 test.run();
jurzua
parents:
diff changeset
349 });
jurzua
parents:
diff changeset
350 synchronize(function() {
jurzua
parents:
diff changeset
351 test.teardown();
jurzua
parents:
diff changeset
352 });
jurzua
parents:
diff changeset
353 synchronize(function() {
jurzua
parents:
diff changeset
354 test.finish();
jurzua
parents:
diff changeset
355 });
jurzua
parents:
diff changeset
356 }
jurzua
parents:
diff changeset
357
jurzua
parents:
diff changeset
358 // `bad` initialized at top of scope
jurzua
parents:
diff changeset
359 // defer when previous test run passed, if storage is available
jurzua
parents:
diff changeset
360 bad = QUnit.config.reorder && defined.sessionStorage &&
jurzua
parents:
diff changeset
361 +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
jurzua
parents:
diff changeset
362
jurzua
parents:
diff changeset
363 if ( bad ) {
jurzua
parents:
diff changeset
364 run();
jurzua
parents:
diff changeset
365 } else {
jurzua
parents:
diff changeset
366 synchronize( run, true );
jurzua
parents:
diff changeset
367 }
jurzua
parents:
diff changeset
368 }
jurzua
parents:
diff changeset
369 };
jurzua
parents:
diff changeset
370
jurzua
parents:
diff changeset
371 // Root QUnit object.
jurzua
parents:
diff changeset
372 // `QUnit` initialized at top of scope
jurzua
parents:
diff changeset
373 QUnit = {
jurzua
parents:
diff changeset
374
jurzua
parents:
diff changeset
375 // call on start of module test to prepend name to all tests
jurzua
parents:
diff changeset
376 module: function( name, testEnvironment ) {
jurzua
parents:
diff changeset
377 config.currentModule = name;
jurzua
parents:
diff changeset
378 config.currentModuleTestEnvironment = testEnvironment;
jurzua
parents:
diff changeset
379 config.modules[name] = true;
jurzua
parents:
diff changeset
380 },
jurzua
parents:
diff changeset
381
jurzua
parents:
diff changeset
382 asyncTest: function( testName, expected, callback ) {
jurzua
parents:
diff changeset
383 if ( arguments.length === 2 ) {
jurzua
parents:
diff changeset
384 callback = expected;
jurzua
parents:
diff changeset
385 expected = null;
jurzua
parents:
diff changeset
386 }
jurzua
parents:
diff changeset
387
jurzua
parents:
diff changeset
388 QUnit.test( testName, expected, callback, true );
jurzua
parents:
diff changeset
389 },
jurzua
parents:
diff changeset
390
jurzua
parents:
diff changeset
391 test: function( testName, expected, callback, async ) {
jurzua
parents:
diff changeset
392 var test,
jurzua
parents:
diff changeset
393 nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
jurzua
parents:
diff changeset
394
jurzua
parents:
diff changeset
395 if ( arguments.length === 2 ) {
jurzua
parents:
diff changeset
396 callback = expected;
jurzua
parents:
diff changeset
397 expected = null;
jurzua
parents:
diff changeset
398 }
jurzua
parents:
diff changeset
399
jurzua
parents:
diff changeset
400 if ( config.currentModule ) {
jurzua
parents:
diff changeset
401 nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
jurzua
parents:
diff changeset
402 }
jurzua
parents:
diff changeset
403
jurzua
parents:
diff changeset
404 test = new Test({
jurzua
parents:
diff changeset
405 nameHtml: nameHtml,
jurzua
parents:
diff changeset
406 testName: testName,
jurzua
parents:
diff changeset
407 expected: expected,
jurzua
parents:
diff changeset
408 async: async,
jurzua
parents:
diff changeset
409 callback: callback,
jurzua
parents:
diff changeset
410 module: config.currentModule,
jurzua
parents:
diff changeset
411 moduleTestEnvironment: config.currentModuleTestEnvironment,
jurzua
parents:
diff changeset
412 stack: sourceFromStacktrace( 2 )
jurzua
parents:
diff changeset
413 });
jurzua
parents:
diff changeset
414
jurzua
parents:
diff changeset
415 if ( !validTest( test ) ) {
jurzua
parents:
diff changeset
416 return;
jurzua
parents:
diff changeset
417 }
jurzua
parents:
diff changeset
418
jurzua
parents:
diff changeset
419 test.queue();
jurzua
parents:
diff changeset
420 },
jurzua
parents:
diff changeset
421
jurzua
parents:
diff changeset
422 // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
jurzua
parents:
diff changeset
423 expect: function( asserts ) {
jurzua
parents:
diff changeset
424 if (arguments.length === 1) {
jurzua
parents:
diff changeset
425 config.current.expected = asserts;
jurzua
parents:
diff changeset
426 } else {
jurzua
parents:
diff changeset
427 return config.current.expected;
jurzua
parents:
diff changeset
428 }
jurzua
parents:
diff changeset
429 },
jurzua
parents:
diff changeset
430
jurzua
parents:
diff changeset
431 start: function( count ) {
jurzua
parents:
diff changeset
432 // QUnit hasn't been initialized yet.
jurzua
parents:
diff changeset
433 // Note: RequireJS (et al) may delay onLoad
jurzua
parents:
diff changeset
434 if ( config.semaphore === undefined ) {
jurzua
parents:
diff changeset
435 QUnit.begin(function() {
jurzua
parents:
diff changeset
436 // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
jurzua
parents:
diff changeset
437 setTimeout(function() {
jurzua
parents:
diff changeset
438 QUnit.start( count );
jurzua
parents:
diff changeset
439 });
jurzua
parents:
diff changeset
440 });
jurzua
parents:
diff changeset
441 return;
jurzua
parents:
diff changeset
442 }
jurzua
parents:
diff changeset
443
jurzua
parents:
diff changeset
444 config.semaphore -= count || 1;
jurzua
parents:
diff changeset
445 // don't start until equal number of stop-calls
jurzua
parents:
diff changeset
446 if ( config.semaphore > 0 ) {
jurzua
parents:
diff changeset
447 return;
jurzua
parents:
diff changeset
448 }
jurzua
parents:
diff changeset
449 // ignore if start is called more often then stop
jurzua
parents:
diff changeset
450 if ( config.semaphore < 0 ) {
jurzua
parents:
diff changeset
451 config.semaphore = 0;
jurzua
parents:
diff changeset
452 QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
jurzua
parents:
diff changeset
453 return;
jurzua
parents:
diff changeset
454 }
jurzua
parents:
diff changeset
455 // A slight delay, to avoid any current callbacks
jurzua
parents:
diff changeset
456 if ( defined.setTimeout ) {
jurzua
parents:
diff changeset
457 window.setTimeout(function() {
jurzua
parents:
diff changeset
458 if ( config.semaphore > 0 ) {
jurzua
parents:
diff changeset
459 return;
jurzua
parents:
diff changeset
460 }
jurzua
parents:
diff changeset
461 if ( config.timeout ) {
jurzua
parents:
diff changeset
462 clearTimeout( config.timeout );
jurzua
parents:
diff changeset
463 }
jurzua
parents:
diff changeset
464
jurzua
parents:
diff changeset
465 config.blocking = false;
jurzua
parents:
diff changeset
466 process( true );
jurzua
parents:
diff changeset
467 }, 13);
jurzua
parents:
diff changeset
468 } else {
jurzua
parents:
diff changeset
469 config.blocking = false;
jurzua
parents:
diff changeset
470 process( true );
jurzua
parents:
diff changeset
471 }
jurzua
parents:
diff changeset
472 },
jurzua
parents:
diff changeset
473
jurzua
parents:
diff changeset
474 stop: function( count ) {
jurzua
parents:
diff changeset
475 config.semaphore += count || 1;
jurzua
parents:
diff changeset
476 config.blocking = true;
jurzua
parents:
diff changeset
477
jurzua
parents:
diff changeset
478 if ( config.testTimeout && defined.setTimeout ) {
jurzua
parents:
diff changeset
479 clearTimeout( config.timeout );
jurzua
parents:
diff changeset
480 config.timeout = window.setTimeout(function() {
jurzua
parents:
diff changeset
481 QUnit.ok( false, "Test timed out" );
jurzua
parents:
diff changeset
482 config.semaphore = 1;
jurzua
parents:
diff changeset
483 QUnit.start();
jurzua
parents:
diff changeset
484 }, config.testTimeout );
jurzua
parents:
diff changeset
485 }
jurzua
parents:
diff changeset
486 }
jurzua
parents:
diff changeset
487 };
jurzua
parents:
diff changeset
488
jurzua
parents:
diff changeset
489 // `assert` initialized at top of scope
jurzua
parents:
diff changeset
490 // Asssert helpers
jurzua
parents:
diff changeset
491 // All of these must either call QUnit.push() or manually do:
jurzua
parents:
diff changeset
492 // - runLoggingCallbacks( "log", .. );
jurzua
parents:
diff changeset
493 // - config.current.assertions.push({ .. });
jurzua
parents:
diff changeset
494 // We attach it to the QUnit object *after* we expose the public API,
jurzua
parents:
diff changeset
495 // otherwise `assert` will become a global variable in browsers (#341).
jurzua
parents:
diff changeset
496 assert = {
jurzua
parents:
diff changeset
497 /**
jurzua
parents:
diff changeset
498 * Asserts rough true-ish result.
jurzua
parents:
diff changeset
499 * @name ok
jurzua
parents:
diff changeset
500 * @function
jurzua
parents:
diff changeset
501 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
jurzua
parents:
diff changeset
502 */
jurzua
parents:
diff changeset
503 ok: function( result, msg ) {
jurzua
parents:
diff changeset
504 if ( !config.current ) {
jurzua
parents:
diff changeset
505 throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
jurzua
parents:
diff changeset
506 }
jurzua
parents:
diff changeset
507 result = !!result;
jurzua
parents:
diff changeset
508
jurzua
parents:
diff changeset
509 var source,
jurzua
parents:
diff changeset
510 details = {
jurzua
parents:
diff changeset
511 module: config.current.module,
jurzua
parents:
diff changeset
512 name: config.current.testName,
jurzua
parents:
diff changeset
513 result: result,
jurzua
parents:
diff changeset
514 message: msg
jurzua
parents:
diff changeset
515 };
jurzua
parents:
diff changeset
516
jurzua
parents:
diff changeset
517 msg = escapeText( msg || (result ? "okay" : "failed" ) );
jurzua
parents:
diff changeset
518 msg = "<span class='test-message'>" + msg + "</span>";
jurzua
parents:
diff changeset
519
jurzua
parents:
diff changeset
520 if ( !result ) {
jurzua
parents:
diff changeset
521 source = sourceFromStacktrace( 2 );
jurzua
parents:
diff changeset
522 if ( source ) {
jurzua
parents:
diff changeset
523 details.source = source;
jurzua
parents:
diff changeset
524 msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
jurzua
parents:
diff changeset
525 }
jurzua
parents:
diff changeset
526 }
jurzua
parents:
diff changeset
527 runLoggingCallbacks( "log", QUnit, details );
jurzua
parents:
diff changeset
528 config.current.assertions.push({
jurzua
parents:
diff changeset
529 result: result,
jurzua
parents:
diff changeset
530 message: msg
jurzua
parents:
diff changeset
531 });
jurzua
parents:
diff changeset
532 },
jurzua
parents:
diff changeset
533
jurzua
parents:
diff changeset
534 /**
jurzua
parents:
diff changeset
535 * Assert that the first two arguments are equal, with an optional message.
jurzua
parents:
diff changeset
536 * Prints out both actual and expected values.
jurzua
parents:
diff changeset
537 * @name equal
jurzua
parents:
diff changeset
538 * @function
jurzua
parents:
diff changeset
539 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
jurzua
parents:
diff changeset
540 */
jurzua
parents:
diff changeset
541 equal: function( actual, expected, message ) {
jurzua
parents:
diff changeset
542 /*jshint eqeqeq:false */
jurzua
parents:
diff changeset
543 QUnit.push( expected == actual, actual, expected, message );
jurzua
parents:
diff changeset
544 },
jurzua
parents:
diff changeset
545
jurzua
parents:
diff changeset
546 /**
jurzua
parents:
diff changeset
547 * @name notEqual
jurzua
parents:
diff changeset
548 * @function
jurzua
parents:
diff changeset
549 */
jurzua
parents:
diff changeset
550 notEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
551 /*jshint eqeqeq:false */
jurzua
parents:
diff changeset
552 QUnit.push( expected != actual, actual, expected, message );
jurzua
parents:
diff changeset
553 },
jurzua
parents:
diff changeset
554
jurzua
parents:
diff changeset
555 /**
jurzua
parents:
diff changeset
556 * @name propEqual
jurzua
parents:
diff changeset
557 * @function
jurzua
parents:
diff changeset
558 */
jurzua
parents:
diff changeset
559 propEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
560 actual = objectValues(actual);
jurzua
parents:
diff changeset
561 expected = objectValues(expected);
jurzua
parents:
diff changeset
562 QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
jurzua
parents:
diff changeset
563 },
jurzua
parents:
diff changeset
564
jurzua
parents:
diff changeset
565 /**
jurzua
parents:
diff changeset
566 * @name notPropEqual
jurzua
parents:
diff changeset
567 * @function
jurzua
parents:
diff changeset
568 */
jurzua
parents:
diff changeset
569 notPropEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
570 actual = objectValues(actual);
jurzua
parents:
diff changeset
571 expected = objectValues(expected);
jurzua
parents:
diff changeset
572 QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
jurzua
parents:
diff changeset
573 },
jurzua
parents:
diff changeset
574
jurzua
parents:
diff changeset
575 /**
jurzua
parents:
diff changeset
576 * @name deepEqual
jurzua
parents:
diff changeset
577 * @function
jurzua
parents:
diff changeset
578 */
jurzua
parents:
diff changeset
579 deepEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
580 QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
jurzua
parents:
diff changeset
581 },
jurzua
parents:
diff changeset
582
jurzua
parents:
diff changeset
583 /**
jurzua
parents:
diff changeset
584 * @name notDeepEqual
jurzua
parents:
diff changeset
585 * @function
jurzua
parents:
diff changeset
586 */
jurzua
parents:
diff changeset
587 notDeepEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
588 QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
jurzua
parents:
diff changeset
589 },
jurzua
parents:
diff changeset
590
jurzua
parents:
diff changeset
591 /**
jurzua
parents:
diff changeset
592 * @name strictEqual
jurzua
parents:
diff changeset
593 * @function
jurzua
parents:
diff changeset
594 */
jurzua
parents:
diff changeset
595 strictEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
596 QUnit.push( expected === actual, actual, expected, message );
jurzua
parents:
diff changeset
597 },
jurzua
parents:
diff changeset
598
jurzua
parents:
diff changeset
599 /**
jurzua
parents:
diff changeset
600 * @name notStrictEqual
jurzua
parents:
diff changeset
601 * @function
jurzua
parents:
diff changeset
602 */
jurzua
parents:
diff changeset
603 notStrictEqual: function( actual, expected, message ) {
jurzua
parents:
diff changeset
604 QUnit.push( expected !== actual, actual, expected, message );
jurzua
parents:
diff changeset
605 },
jurzua
parents:
diff changeset
606
jurzua
parents:
diff changeset
607 "throws": function( block, expected, message ) {
jurzua
parents:
diff changeset
608 var actual,
jurzua
parents:
diff changeset
609 expectedOutput = expected,
jurzua
parents:
diff changeset
610 ok = false;
jurzua
parents:
diff changeset
611
jurzua
parents:
diff changeset
612 // 'expected' is optional
jurzua
parents:
diff changeset
613 if ( typeof expected === "string" ) {
jurzua
parents:
diff changeset
614 message = expected;
jurzua
parents:
diff changeset
615 expected = null;
jurzua
parents:
diff changeset
616 }
jurzua
parents:
diff changeset
617
jurzua
parents:
diff changeset
618 config.current.ignoreGlobalErrors = true;
jurzua
parents:
diff changeset
619 try {
jurzua
parents:
diff changeset
620 block.call( config.current.testEnvironment );
jurzua
parents:
diff changeset
621 } catch (e) {
jurzua
parents:
diff changeset
622 actual = e;
jurzua
parents:
diff changeset
623 }
jurzua
parents:
diff changeset
624 config.current.ignoreGlobalErrors = false;
jurzua
parents:
diff changeset
625
jurzua
parents:
diff changeset
626 if ( actual ) {
jurzua
parents:
diff changeset
627 // we don't want to validate thrown error
jurzua
parents:
diff changeset
628 if ( !expected ) {
jurzua
parents:
diff changeset
629 ok = true;
jurzua
parents:
diff changeset
630 expectedOutput = null;
jurzua
parents:
diff changeset
631 // expected is a regexp
jurzua
parents:
diff changeset
632 } else if ( QUnit.objectType( expected ) === "regexp" ) {
jurzua
parents:
diff changeset
633 ok = expected.test( errorString( actual ) );
jurzua
parents:
diff changeset
634 // expected is a constructor
jurzua
parents:
diff changeset
635 } else if ( actual instanceof expected ) {
jurzua
parents:
diff changeset
636 ok = true;
jurzua
parents:
diff changeset
637 // expected is a validation function which returns true is validation passed
jurzua
parents:
diff changeset
638 } else if ( expected.call( {}, actual ) === true ) {
jurzua
parents:
diff changeset
639 expectedOutput = null;
jurzua
parents:
diff changeset
640 ok = true;
jurzua
parents:
diff changeset
641 }
jurzua
parents:
diff changeset
642
jurzua
parents:
diff changeset
643 QUnit.push( ok, actual, expectedOutput, message );
jurzua
parents:
diff changeset
644 } else {
jurzua
parents:
diff changeset
645 QUnit.pushFailure( message, null, 'No exception was thrown.' );
jurzua
parents:
diff changeset
646 }
jurzua
parents:
diff changeset
647 }
jurzua
parents:
diff changeset
648 };
jurzua
parents:
diff changeset
649
jurzua
parents:
diff changeset
650 /**
jurzua
parents:
diff changeset
651 * @deprecate since 1.8.0
jurzua
parents:
diff changeset
652 * Kept assertion helpers in root for backwards compatibility.
jurzua
parents:
diff changeset
653 */
jurzua
parents:
diff changeset
654 extend( QUnit, assert );
jurzua
parents:
diff changeset
655
jurzua
parents:
diff changeset
656 /**
jurzua
parents:
diff changeset
657 * @deprecated since 1.9.0
jurzua
parents:
diff changeset
658 * Kept root "raises()" for backwards compatibility.
jurzua
parents:
diff changeset
659 * (Note that we don't introduce assert.raises).
jurzua
parents:
diff changeset
660 */
jurzua
parents:
diff changeset
661 QUnit.raises = assert[ "throws" ];
jurzua
parents:
diff changeset
662
jurzua
parents:
diff changeset
663 /**
jurzua
parents:
diff changeset
664 * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
jurzua
parents:
diff changeset
665 * Kept to avoid TypeErrors for undefined methods.
jurzua
parents:
diff changeset
666 */
jurzua
parents:
diff changeset
667 QUnit.equals = function() {
jurzua
parents:
diff changeset
668 QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
jurzua
parents:
diff changeset
669 };
jurzua
parents:
diff changeset
670 QUnit.same = function() {
jurzua
parents:
diff changeset
671 QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
jurzua
parents:
diff changeset
672 };
jurzua
parents:
diff changeset
673
jurzua
parents:
diff changeset
674 // We want access to the constructor's prototype
jurzua
parents:
diff changeset
675 (function() {
jurzua
parents:
diff changeset
676 function F() {}
jurzua
parents:
diff changeset
677 F.prototype = QUnit;
jurzua
parents:
diff changeset
678 QUnit = new F();
jurzua
parents:
diff changeset
679 // Make F QUnit's constructor so that we can add to the prototype later
jurzua
parents:
diff changeset
680 QUnit.constructor = F;
jurzua
parents:
diff changeset
681 }());
jurzua
parents:
diff changeset
682
jurzua
parents:
diff changeset
683 /**
jurzua
parents:
diff changeset
684 * Config object: Maintain internal state
jurzua
parents:
diff changeset
685 * Later exposed as QUnit.config
jurzua
parents:
diff changeset
686 * `config` initialized at top of scope
jurzua
parents:
diff changeset
687 */
jurzua
parents:
diff changeset
688 config = {
jurzua
parents:
diff changeset
689 // The queue of tests to run
jurzua
parents:
diff changeset
690 queue: [],
jurzua
parents:
diff changeset
691
jurzua
parents:
diff changeset
692 // block until document ready
jurzua
parents:
diff changeset
693 blocking: true,
jurzua
parents:
diff changeset
694
jurzua
parents:
diff changeset
695 // when enabled, show only failing tests
jurzua
parents:
diff changeset
696 // gets persisted through sessionStorage and can be changed in UI via checkbox
jurzua
parents:
diff changeset
697 hidepassed: false,
jurzua
parents:
diff changeset
698
jurzua
parents:
diff changeset
699 // by default, run previously failed tests first
jurzua
parents:
diff changeset
700 // very useful in combination with "Hide passed tests" checked
jurzua
parents:
diff changeset
701 reorder: true,
jurzua
parents:
diff changeset
702
jurzua
parents:
diff changeset
703 // by default, modify document.title when suite is done
jurzua
parents:
diff changeset
704 altertitle: true,
jurzua
parents:
diff changeset
705
jurzua
parents:
diff changeset
706 // when enabled, all tests must call expect()
jurzua
parents:
diff changeset
707 requireExpects: false,
jurzua
parents:
diff changeset
708
jurzua
parents:
diff changeset
709 // add checkboxes that are persisted in the query-string
jurzua
parents:
diff changeset
710 // when enabled, the id is set to `true` as a `QUnit.config` property
jurzua
parents:
diff changeset
711 urlConfig: [
jurzua
parents:
diff changeset
712 {
jurzua
parents:
diff changeset
713 id: "noglobals",
jurzua
parents:
diff changeset
714 label: "Check for Globals",
jurzua
parents:
diff changeset
715 tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
jurzua
parents:
diff changeset
716 },
jurzua
parents:
diff changeset
717 {
jurzua
parents:
diff changeset
718 id: "notrycatch",
jurzua
parents:
diff changeset
719 label: "No try-catch",
jurzua
parents:
diff changeset
720 tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
jurzua
parents:
diff changeset
721 }
jurzua
parents:
diff changeset
722 ],
jurzua
parents:
diff changeset
723
jurzua
parents:
diff changeset
724 // Set of all modules.
jurzua
parents:
diff changeset
725 modules: {},
jurzua
parents:
diff changeset
726
jurzua
parents:
diff changeset
727 // logging callback queues
jurzua
parents:
diff changeset
728 begin: [],
jurzua
parents:
diff changeset
729 done: [],
jurzua
parents:
diff changeset
730 log: [],
jurzua
parents:
diff changeset
731 testStart: [],
jurzua
parents:
diff changeset
732 testDone: [],
jurzua
parents:
diff changeset
733 moduleStart: [],
jurzua
parents:
diff changeset
734 moduleDone: []
jurzua
parents:
diff changeset
735 };
jurzua
parents:
diff changeset
736
jurzua
parents:
diff changeset
737 // Export global variables, unless an 'exports' object exists,
jurzua
parents:
diff changeset
738 // in that case we assume we're in CommonJS (dealt with on the bottom of the script)
jurzua
parents:
diff changeset
739 if ( typeof exports === "undefined" ) {
jurzua
parents:
diff changeset
740 extend( window, QUnit );
jurzua
parents:
diff changeset
741
jurzua
parents:
diff changeset
742 // Expose QUnit object
jurzua
parents:
diff changeset
743 window.QUnit = QUnit;
jurzua
parents:
diff changeset
744 }
jurzua
parents:
diff changeset
745
jurzua
parents:
diff changeset
746 // Initialize more QUnit.config and QUnit.urlParams
jurzua
parents:
diff changeset
747 (function() {
jurzua
parents:
diff changeset
748 var i,
jurzua
parents:
diff changeset
749 location = window.location || { search: "", protocol: "file:" },
jurzua
parents:
diff changeset
750 params = location.search.slice( 1 ).split( "&" ),
jurzua
parents:
diff changeset
751 length = params.length,
jurzua
parents:
diff changeset
752 urlParams = {},
jurzua
parents:
diff changeset
753 current;
jurzua
parents:
diff changeset
754
jurzua
parents:
diff changeset
755 if ( params[ 0 ] ) {
jurzua
parents:
diff changeset
756 for ( i = 0; i < length; i++ ) {
jurzua
parents:
diff changeset
757 current = params[ i ].split( "=" );
jurzua
parents:
diff changeset
758 current[ 0 ] = decodeURIComponent( current[ 0 ] );
jurzua
parents:
diff changeset
759 // allow just a key to turn on a flag, e.g., test.html?noglobals
jurzua
parents:
diff changeset
760 current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
jurzua
parents:
diff changeset
761 urlParams[ current[ 0 ] ] = current[ 1 ];
jurzua
parents:
diff changeset
762 }
jurzua
parents:
diff changeset
763 }
jurzua
parents:
diff changeset
764
jurzua
parents:
diff changeset
765 QUnit.urlParams = urlParams;
jurzua
parents:
diff changeset
766
jurzua
parents:
diff changeset
767 // String search anywhere in moduleName+testName
jurzua
parents:
diff changeset
768 config.filter = urlParams.filter;
jurzua
parents:
diff changeset
769
jurzua
parents:
diff changeset
770 // Exact match of the module name
jurzua
parents:
diff changeset
771 config.module = urlParams.module;
jurzua
parents:
diff changeset
772
jurzua
parents:
diff changeset
773 config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
jurzua
parents:
diff changeset
774
jurzua
parents:
diff changeset
775 // Figure out if we're running the tests from a server or not
jurzua
parents:
diff changeset
776 QUnit.isLocal = location.protocol === "file:";
jurzua
parents:
diff changeset
777 }());
jurzua
parents:
diff changeset
778
jurzua
parents:
diff changeset
779 // Extend QUnit object,
jurzua
parents:
diff changeset
780 // these after set here because they should not be exposed as global functions
jurzua
parents:
diff changeset
781 extend( QUnit, {
jurzua
parents:
diff changeset
782 assert: assert,
jurzua
parents:
diff changeset
783
jurzua
parents:
diff changeset
784 config: config,
jurzua
parents:
diff changeset
785
jurzua
parents:
diff changeset
786 // Initialize the configuration options
jurzua
parents:
diff changeset
787 init: function() {
jurzua
parents:
diff changeset
788 extend( config, {
jurzua
parents:
diff changeset
789 stats: { all: 0, bad: 0 },
jurzua
parents:
diff changeset
790 moduleStats: { all: 0, bad: 0 },
jurzua
parents:
diff changeset
791 started: +new Date(),
jurzua
parents:
diff changeset
792 updateRate: 1000,
jurzua
parents:
diff changeset
793 blocking: false,
jurzua
parents:
diff changeset
794 autostart: true,
jurzua
parents:
diff changeset
795 autorun: false,
jurzua
parents:
diff changeset
796 filter: "",
jurzua
parents:
diff changeset
797 queue: [],
jurzua
parents:
diff changeset
798 semaphore: 1
jurzua
parents:
diff changeset
799 });
jurzua
parents:
diff changeset
800
jurzua
parents:
diff changeset
801 var tests, banner, result,
jurzua
parents:
diff changeset
802 qunit = id( "qunit" );
jurzua
parents:
diff changeset
803
jurzua
parents:
diff changeset
804 if ( qunit ) {
jurzua
parents:
diff changeset
805 qunit.innerHTML =
jurzua
parents:
diff changeset
806 "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
jurzua
parents:
diff changeset
807 "<h2 id='qunit-banner'></h2>" +
jurzua
parents:
diff changeset
808 "<div id='qunit-testrunner-toolbar'></div>" +
jurzua
parents:
diff changeset
809 "<h2 id='qunit-userAgent'></h2>" +
jurzua
parents:
diff changeset
810 "<ol id='qunit-tests'></ol>";
jurzua
parents:
diff changeset
811 }
jurzua
parents:
diff changeset
812
jurzua
parents:
diff changeset
813 tests = id( "qunit-tests" );
jurzua
parents:
diff changeset
814 banner = id( "qunit-banner" );
jurzua
parents:
diff changeset
815 result = id( "qunit-testresult" );
jurzua
parents:
diff changeset
816
jurzua
parents:
diff changeset
817 if ( tests ) {
jurzua
parents:
diff changeset
818 tests.innerHTML = "";
jurzua
parents:
diff changeset
819 }
jurzua
parents:
diff changeset
820
jurzua
parents:
diff changeset
821 if ( banner ) {
jurzua
parents:
diff changeset
822 banner.className = "";
jurzua
parents:
diff changeset
823 }
jurzua
parents:
diff changeset
824
jurzua
parents:
diff changeset
825 if ( result ) {
jurzua
parents:
diff changeset
826 result.parentNode.removeChild( result );
jurzua
parents:
diff changeset
827 }
jurzua
parents:
diff changeset
828
jurzua
parents:
diff changeset
829 if ( tests ) {
jurzua
parents:
diff changeset
830 result = document.createElement( "p" );
jurzua
parents:
diff changeset
831 result.id = "qunit-testresult";
jurzua
parents:
diff changeset
832 result.className = "result";
jurzua
parents:
diff changeset
833 tests.parentNode.insertBefore( result, tests );
jurzua
parents:
diff changeset
834 result.innerHTML = "Running...<br/>&nbsp;";
jurzua
parents:
diff changeset
835 }
jurzua
parents:
diff changeset
836 },
jurzua
parents:
diff changeset
837
jurzua
parents:
diff changeset
838 // Resets the test setup. Useful for tests that modify the DOM.
jurzua
parents:
diff changeset
839 reset: function() {
jurzua
parents:
diff changeset
840 var fixture = id( "qunit-fixture" );
jurzua
parents:
diff changeset
841 if ( fixture ) {
jurzua
parents:
diff changeset
842 fixture.innerHTML = config.fixture;
jurzua
parents:
diff changeset
843 }
jurzua
parents:
diff changeset
844 },
jurzua
parents:
diff changeset
845
jurzua
parents:
diff changeset
846 // Trigger an event on an element.
jurzua
parents:
diff changeset
847 // @example triggerEvent( document.body, "click" );
jurzua
parents:
diff changeset
848 triggerEvent: function( elem, type, event ) {
jurzua
parents:
diff changeset
849 if ( document.createEvent ) {
jurzua
parents:
diff changeset
850 event = document.createEvent( "MouseEvents" );
jurzua
parents:
diff changeset
851 event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
jurzua
parents:
diff changeset
852 0, 0, 0, 0, 0, false, false, false, false, 0, null);
jurzua
parents:
diff changeset
853
jurzua
parents:
diff changeset
854 elem.dispatchEvent( event );
jurzua
parents:
diff changeset
855 } else if ( elem.fireEvent ) {
jurzua
parents:
diff changeset
856 elem.fireEvent( "on" + type );
jurzua
parents:
diff changeset
857 }
jurzua
parents:
diff changeset
858 },
jurzua
parents:
diff changeset
859
jurzua
parents:
diff changeset
860 // Safe object type checking
jurzua
parents:
diff changeset
861 is: function( type, obj ) {
jurzua
parents:
diff changeset
862 return QUnit.objectType( obj ) === type;
jurzua
parents:
diff changeset
863 },
jurzua
parents:
diff changeset
864
jurzua
parents:
diff changeset
865 objectType: function( obj ) {
jurzua
parents:
diff changeset
866 if ( typeof obj === "undefined" ) {
jurzua
parents:
diff changeset
867 return "undefined";
jurzua
parents:
diff changeset
868 // consider: typeof null === object
jurzua
parents:
diff changeset
869 }
jurzua
parents:
diff changeset
870 if ( obj === null ) {
jurzua
parents:
diff changeset
871 return "null";
jurzua
parents:
diff changeset
872 }
jurzua
parents:
diff changeset
873
jurzua
parents:
diff changeset
874 var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
jurzua
parents:
diff changeset
875 type = match && match[1] || "";
jurzua
parents:
diff changeset
876
jurzua
parents:
diff changeset
877 switch ( type ) {
jurzua
parents:
diff changeset
878 case "Number":
jurzua
parents:
diff changeset
879 if ( isNaN(obj) ) {
jurzua
parents:
diff changeset
880 return "nan";
jurzua
parents:
diff changeset
881 }
jurzua
parents:
diff changeset
882 return "number";
jurzua
parents:
diff changeset
883 case "String":
jurzua
parents:
diff changeset
884 case "Boolean":
jurzua
parents:
diff changeset
885 case "Array":
jurzua
parents:
diff changeset
886 case "Date":
jurzua
parents:
diff changeset
887 case "RegExp":
jurzua
parents:
diff changeset
888 case "Function":
jurzua
parents:
diff changeset
889 return type.toLowerCase();
jurzua
parents:
diff changeset
890 }
jurzua
parents:
diff changeset
891 if ( typeof obj === "object" ) {
jurzua
parents:
diff changeset
892 return "object";
jurzua
parents:
diff changeset
893 }
jurzua
parents:
diff changeset
894 return undefined;
jurzua
parents:
diff changeset
895 },
jurzua
parents:
diff changeset
896
jurzua
parents:
diff changeset
897 push: function( result, actual, expected, message ) {
jurzua
parents:
diff changeset
898 if ( !config.current ) {
jurzua
parents:
diff changeset
899 throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
jurzua
parents:
diff changeset
900 }
jurzua
parents:
diff changeset
901
jurzua
parents:
diff changeset
902 var output, source,
jurzua
parents:
diff changeset
903 details = {
jurzua
parents:
diff changeset
904 module: config.current.module,
jurzua
parents:
diff changeset
905 name: config.current.testName,
jurzua
parents:
diff changeset
906 result: result,
jurzua
parents:
diff changeset
907 message: message,
jurzua
parents:
diff changeset
908 actual: actual,
jurzua
parents:
diff changeset
909 expected: expected
jurzua
parents:
diff changeset
910 };
jurzua
parents:
diff changeset
911
jurzua
parents:
diff changeset
912 message = escapeText( message ) || ( result ? "okay" : "failed" );
jurzua
parents:
diff changeset
913 message = "<span class='test-message'>" + message + "</span>";
jurzua
parents:
diff changeset
914 output = message;
jurzua
parents:
diff changeset
915
jurzua
parents:
diff changeset
916 if ( !result ) {
jurzua
parents:
diff changeset
917 expected = escapeText( QUnit.jsDump.parse(expected) );
jurzua
parents:
diff changeset
918 actual = escapeText( QUnit.jsDump.parse(actual) );
jurzua
parents:
diff changeset
919 output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
jurzua
parents:
diff changeset
920
jurzua
parents:
diff changeset
921 if ( actual !== expected ) {
jurzua
parents:
diff changeset
922 output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
jurzua
parents:
diff changeset
923 output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
jurzua
parents:
diff changeset
924 }
jurzua
parents:
diff changeset
925
jurzua
parents:
diff changeset
926 source = sourceFromStacktrace();
jurzua
parents:
diff changeset
927
jurzua
parents:
diff changeset
928 if ( source ) {
jurzua
parents:
diff changeset
929 details.source = source;
jurzua
parents:
diff changeset
930 output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
jurzua
parents:
diff changeset
931 }
jurzua
parents:
diff changeset
932
jurzua
parents:
diff changeset
933 output += "</table>";
jurzua
parents:
diff changeset
934 }
jurzua
parents:
diff changeset
935
jurzua
parents:
diff changeset
936 runLoggingCallbacks( "log", QUnit, details );
jurzua
parents:
diff changeset
937
jurzua
parents:
diff changeset
938 config.current.assertions.push({
jurzua
parents:
diff changeset
939 result: !!result,
jurzua
parents:
diff changeset
940 message: output
jurzua
parents:
diff changeset
941 });
jurzua
parents:
diff changeset
942 },
jurzua
parents:
diff changeset
943
jurzua
parents:
diff changeset
944 pushFailure: function( message, source, actual ) {
jurzua
parents:
diff changeset
945 if ( !config.current ) {
jurzua
parents:
diff changeset
946 throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
jurzua
parents:
diff changeset
947 }
jurzua
parents:
diff changeset
948
jurzua
parents:
diff changeset
949 var output,
jurzua
parents:
diff changeset
950 details = {
jurzua
parents:
diff changeset
951 module: config.current.module,
jurzua
parents:
diff changeset
952 name: config.current.testName,
jurzua
parents:
diff changeset
953 result: false,
jurzua
parents:
diff changeset
954 message: message
jurzua
parents:
diff changeset
955 };
jurzua
parents:
diff changeset
956
jurzua
parents:
diff changeset
957 message = escapeText( message ) || "error";
jurzua
parents:
diff changeset
958 message = "<span class='test-message'>" + message + "</span>";
jurzua
parents:
diff changeset
959 output = message;
jurzua
parents:
diff changeset
960
jurzua
parents:
diff changeset
961 output += "<table>";
jurzua
parents:
diff changeset
962
jurzua
parents:
diff changeset
963 if ( actual ) {
jurzua
parents:
diff changeset
964 output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
jurzua
parents:
diff changeset
965 }
jurzua
parents:
diff changeset
966
jurzua
parents:
diff changeset
967 if ( source ) {
jurzua
parents:
diff changeset
968 details.source = source;
jurzua
parents:
diff changeset
969 output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
jurzua
parents:
diff changeset
970 }
jurzua
parents:
diff changeset
971
jurzua
parents:
diff changeset
972 output += "</table>";
jurzua
parents:
diff changeset
973
jurzua
parents:
diff changeset
974 runLoggingCallbacks( "log", QUnit, details );
jurzua
parents:
diff changeset
975
jurzua
parents:
diff changeset
976 config.current.assertions.push({
jurzua
parents:
diff changeset
977 result: false,
jurzua
parents:
diff changeset
978 message: output
jurzua
parents:
diff changeset
979 });
jurzua
parents:
diff changeset
980 },
jurzua
parents:
diff changeset
981
jurzua
parents:
diff changeset
982 url: function( params ) {
jurzua
parents:
diff changeset
983 params = extend( extend( {}, QUnit.urlParams ), params );
jurzua
parents:
diff changeset
984 var key,
jurzua
parents:
diff changeset
985 querystring = "?";
jurzua
parents:
diff changeset
986
jurzua
parents:
diff changeset
987 for ( key in params ) {
jurzua
parents:
diff changeset
988 if ( !hasOwn.call( params, key ) ) {
jurzua
parents:
diff changeset
989 continue;
jurzua
parents:
diff changeset
990 }
jurzua
parents:
diff changeset
991 querystring += encodeURIComponent( key ) + "=" +
jurzua
parents:
diff changeset
992 encodeURIComponent( params[ key ] ) + "&";
jurzua
parents:
diff changeset
993 }
jurzua
parents:
diff changeset
994 return window.location.protocol + "//" + window.location.host +
jurzua
parents:
diff changeset
995 window.location.pathname + querystring.slice( 0, -1 );
jurzua
parents:
diff changeset
996 },
jurzua
parents:
diff changeset
997
jurzua
parents:
diff changeset
998 extend: extend,
jurzua
parents:
diff changeset
999 id: id,
jurzua
parents:
diff changeset
1000 addEvent: addEvent
jurzua
parents:
diff changeset
1001 // load, equiv, jsDump, diff: Attached later
jurzua
parents:
diff changeset
1002 });
jurzua
parents:
diff changeset
1003
jurzua
parents:
diff changeset
1004 /**
jurzua
parents:
diff changeset
1005 * @deprecated: Created for backwards compatibility with test runner that set the hook function
jurzua
parents:
diff changeset
1006 * into QUnit.{hook}, instead of invoking it and passing the hook function.
jurzua
parents:
diff changeset
1007 * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
jurzua
parents:
diff changeset
1008 * Doing this allows us to tell if the following methods have been overwritten on the actual
jurzua
parents:
diff changeset
1009 * QUnit object.
jurzua
parents:
diff changeset
1010 */
jurzua
parents:
diff changeset
1011 extend( QUnit.constructor.prototype, {
jurzua
parents:
diff changeset
1012
jurzua
parents:
diff changeset
1013 // Logging callbacks; all receive a single argument with the listed properties
jurzua
parents:
diff changeset
1014 // run test/logs.html for any related changes
jurzua
parents:
diff changeset
1015 begin: registerLoggingCallback( "begin" ),
jurzua
parents:
diff changeset
1016
jurzua
parents:
diff changeset
1017 // done: { failed, passed, total, runtime }
jurzua
parents:
diff changeset
1018 done: registerLoggingCallback( "done" ),
jurzua
parents:
diff changeset
1019
jurzua
parents:
diff changeset
1020 // log: { result, actual, expected, message }
jurzua
parents:
diff changeset
1021 log: registerLoggingCallback( "log" ),
jurzua
parents:
diff changeset
1022
jurzua
parents:
diff changeset
1023 // testStart: { name }
jurzua
parents:
diff changeset
1024 testStart: registerLoggingCallback( "testStart" ),
jurzua
parents:
diff changeset
1025
jurzua
parents:
diff changeset
1026 // testDone: { name, failed, passed, total, duration }
jurzua
parents:
diff changeset
1027 testDone: registerLoggingCallback( "testDone" ),
jurzua
parents:
diff changeset
1028
jurzua
parents:
diff changeset
1029 // moduleStart: { name }
jurzua
parents:
diff changeset
1030 moduleStart: registerLoggingCallback( "moduleStart" ),
jurzua
parents:
diff changeset
1031
jurzua
parents:
diff changeset
1032 // moduleDone: { name, failed, passed, total }
jurzua
parents:
diff changeset
1033 moduleDone: registerLoggingCallback( "moduleDone" )
jurzua
parents:
diff changeset
1034 });
jurzua
parents:
diff changeset
1035
jurzua
parents:
diff changeset
1036 if ( typeof document === "undefined" || document.readyState === "complete" ) {
jurzua
parents:
diff changeset
1037 config.autorun = true;
jurzua
parents:
diff changeset
1038 }
jurzua
parents:
diff changeset
1039
jurzua
parents:
diff changeset
1040 QUnit.load = function() {
jurzua
parents:
diff changeset
1041 runLoggingCallbacks( "begin", QUnit, {} );
jurzua
parents:
diff changeset
1042
jurzua
parents:
diff changeset
1043 // Initialize the config, saving the execution queue
jurzua
parents:
diff changeset
1044 var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
jurzua
parents:
diff changeset
1045 urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
jurzua
parents:
diff changeset
1046 numModules = 0,
jurzua
parents:
diff changeset
1047 moduleFilterHtml = "",
jurzua
parents:
diff changeset
1048 urlConfigHtml = "",
jurzua
parents:
diff changeset
1049 oldconfig = extend( {}, config );
jurzua
parents:
diff changeset
1050
jurzua
parents:
diff changeset
1051 QUnit.init();
jurzua
parents:
diff changeset
1052 extend(config, oldconfig);
jurzua
parents:
diff changeset
1053
jurzua
parents:
diff changeset
1054 config.blocking = false;
jurzua
parents:
diff changeset
1055
jurzua
parents:
diff changeset
1056 len = config.urlConfig.length;
jurzua
parents:
diff changeset
1057
jurzua
parents:
diff changeset
1058 for ( i = 0; i < len; i++ ) {
jurzua
parents:
diff changeset
1059 val = config.urlConfig[i];
jurzua
parents:
diff changeset
1060 if ( typeof val === "string" ) {
jurzua
parents:
diff changeset
1061 val = {
jurzua
parents:
diff changeset
1062 id: val,
jurzua
parents:
diff changeset
1063 label: val,
jurzua
parents:
diff changeset
1064 tooltip: "[no tooltip available]"
jurzua
parents:
diff changeset
1065 };
jurzua
parents:
diff changeset
1066 }
jurzua
parents:
diff changeset
1067 config[ val.id ] = QUnit.urlParams[ val.id ];
jurzua
parents:
diff changeset
1068 urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
jurzua
parents:
diff changeset
1069 "' name='" + escapeText( val.id ) +
jurzua
parents:
diff changeset
1070 "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
jurzua
parents:
diff changeset
1071 " title='" + escapeText( val.tooltip ) +
jurzua
parents:
diff changeset
1072 "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
jurzua
parents:
diff changeset
1073 "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
jurzua
parents:
diff changeset
1074 }
jurzua
parents:
diff changeset
1075
jurzua
parents:
diff changeset
1076 moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
jurzua
parents:
diff changeset
1077 ( config.module === undefined ? "selected='selected'" : "" ) +
jurzua
parents:
diff changeset
1078 ">< All Modules ></option>";
jurzua
parents:
diff changeset
1079
jurzua
parents:
diff changeset
1080 for ( i in config.modules ) {
jurzua
parents:
diff changeset
1081 if ( config.modules.hasOwnProperty( i ) ) {
jurzua
parents:
diff changeset
1082 numModules += 1;
jurzua
parents:
diff changeset
1083 moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
jurzua
parents:
diff changeset
1084 ( config.module === i ? "selected='selected'" : "" ) +
jurzua
parents:
diff changeset
1085 ">" + escapeText(i) + "</option>";
jurzua
parents:
diff changeset
1086 }
jurzua
parents:
diff changeset
1087 }
jurzua
parents:
diff changeset
1088 moduleFilterHtml += "</select>";
jurzua
parents:
diff changeset
1089
jurzua
parents:
diff changeset
1090 // `userAgent` initialized at top of scope
jurzua
parents:
diff changeset
1091 userAgent = id( "qunit-userAgent" );
jurzua
parents:
diff changeset
1092 if ( userAgent ) {
jurzua
parents:
diff changeset
1093 userAgent.innerHTML = navigator.userAgent;
jurzua
parents:
diff changeset
1094 }
jurzua
parents:
diff changeset
1095
jurzua
parents:
diff changeset
1096 // `banner` initialized at top of scope
jurzua
parents:
diff changeset
1097 banner = id( "qunit-header" );
jurzua
parents:
diff changeset
1098 if ( banner ) {
jurzua
parents:
diff changeset
1099 banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
jurzua
parents:
diff changeset
1100 }
jurzua
parents:
diff changeset
1101
jurzua
parents:
diff changeset
1102 // `toolbar` initialized at top of scope
jurzua
parents:
diff changeset
1103 toolbar = id( "qunit-testrunner-toolbar" );
jurzua
parents:
diff changeset
1104 if ( toolbar ) {
jurzua
parents:
diff changeset
1105 // `filter` initialized at top of scope
jurzua
parents:
diff changeset
1106 filter = document.createElement( "input" );
jurzua
parents:
diff changeset
1107 filter.type = "checkbox";
jurzua
parents:
diff changeset
1108 filter.id = "qunit-filter-pass";
jurzua
parents:
diff changeset
1109
jurzua
parents:
diff changeset
1110 addEvent( filter, "click", function() {
jurzua
parents:
diff changeset
1111 var tmp,
jurzua
parents:
diff changeset
1112 ol = document.getElementById( "qunit-tests" );
jurzua
parents:
diff changeset
1113
jurzua
parents:
diff changeset
1114 if ( filter.checked ) {
jurzua
parents:
diff changeset
1115 ol.className = ol.className + " hidepass";
jurzua
parents:
diff changeset
1116 } else {
jurzua
parents:
diff changeset
1117 tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
jurzua
parents:
diff changeset
1118 ol.className = tmp.replace( / hidepass /, " " );
jurzua
parents:
diff changeset
1119 }
jurzua
parents:
diff changeset
1120 if ( defined.sessionStorage ) {
jurzua
parents:
diff changeset
1121 if (filter.checked) {
jurzua
parents:
diff changeset
1122 sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
jurzua
parents:
diff changeset
1123 } else {
jurzua
parents:
diff changeset
1124 sessionStorage.removeItem( "qunit-filter-passed-tests" );
jurzua
parents:
diff changeset
1125 }
jurzua
parents:
diff changeset
1126 }
jurzua
parents:
diff changeset
1127 });
jurzua
parents:
diff changeset
1128
jurzua
parents:
diff changeset
1129 if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
jurzua
parents:
diff changeset
1130 filter.checked = true;
jurzua
parents:
diff changeset
1131 // `ol` initialized at top of scope
jurzua
parents:
diff changeset
1132 ol = document.getElementById( "qunit-tests" );
jurzua
parents:
diff changeset
1133 ol.className = ol.className + " hidepass";
jurzua
parents:
diff changeset
1134 }
jurzua
parents:
diff changeset
1135 toolbar.appendChild( filter );
jurzua
parents:
diff changeset
1136
jurzua
parents:
diff changeset
1137 // `label` initialized at top of scope
jurzua
parents:
diff changeset
1138 label = document.createElement( "label" );
jurzua
parents:
diff changeset
1139 label.setAttribute( "for", "qunit-filter-pass" );
jurzua
parents:
diff changeset
1140 label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
jurzua
parents:
diff changeset
1141 label.innerHTML = "Hide passed tests";
jurzua
parents:
diff changeset
1142 toolbar.appendChild( label );
jurzua
parents:
diff changeset
1143
jurzua
parents:
diff changeset
1144 urlConfigCheckboxesContainer = document.createElement("span");
jurzua
parents:
diff changeset
1145 urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
jurzua
parents:
diff changeset
1146 urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
jurzua
parents:
diff changeset
1147 // For oldIE support:
jurzua
parents:
diff changeset
1148 // * Add handlers to the individual elements instead of the container
jurzua
parents:
diff changeset
1149 // * Use "click" instead of "change"
jurzua
parents:
diff changeset
1150 // * Fallback from event.target to event.srcElement
jurzua
parents:
diff changeset
1151 addEvents( urlConfigCheckboxes, "click", function( event ) {
jurzua
parents:
diff changeset
1152 var params = {},
jurzua
parents:
diff changeset
1153 target = event.target || event.srcElement;
jurzua
parents:
diff changeset
1154 params[ target.name ] = target.checked ? true : undefined;
jurzua
parents:
diff changeset
1155 window.location = QUnit.url( params );
jurzua
parents:
diff changeset
1156 });
jurzua
parents:
diff changeset
1157 toolbar.appendChild( urlConfigCheckboxesContainer );
jurzua
parents:
diff changeset
1158
jurzua
parents:
diff changeset
1159 if (numModules > 1) {
jurzua
parents:
diff changeset
1160 moduleFilter = document.createElement( 'span' );
jurzua
parents:
diff changeset
1161 moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
jurzua
parents:
diff changeset
1162 moduleFilter.innerHTML = moduleFilterHtml;
jurzua
parents:
diff changeset
1163 addEvent( moduleFilter.lastChild, "change", function() {
jurzua
parents:
diff changeset
1164 var selectBox = moduleFilter.getElementsByTagName("select")[0],
jurzua
parents:
diff changeset
1165 selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
jurzua
parents:
diff changeset
1166
jurzua
parents:
diff changeset
1167 window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
jurzua
parents:
diff changeset
1168 });
jurzua
parents:
diff changeset
1169 toolbar.appendChild(moduleFilter);
jurzua
parents:
diff changeset
1170 }
jurzua
parents:
diff changeset
1171 }
jurzua
parents:
diff changeset
1172
jurzua
parents:
diff changeset
1173 // `main` initialized at top of scope
jurzua
parents:
diff changeset
1174 main = id( "qunit-fixture" );
jurzua
parents:
diff changeset
1175 if ( main ) {
jurzua
parents:
diff changeset
1176 config.fixture = main.innerHTML;
jurzua
parents:
diff changeset
1177 }
jurzua
parents:
diff changeset
1178
jurzua
parents:
diff changeset
1179 if ( config.autostart ) {
jurzua
parents:
diff changeset
1180 QUnit.start();
jurzua
parents:
diff changeset
1181 }
jurzua
parents:
diff changeset
1182 };
jurzua
parents:
diff changeset
1183
jurzua
parents:
diff changeset
1184 addEvent( window, "load", QUnit.load );
jurzua
parents:
diff changeset
1185
jurzua
parents:
diff changeset
1186 // `onErrorFnPrev` initialized at top of scope
jurzua
parents:
diff changeset
1187 // Preserve other handlers
jurzua
parents:
diff changeset
1188 onErrorFnPrev = window.onerror;
jurzua
parents:
diff changeset
1189
jurzua
parents:
diff changeset
1190 // Cover uncaught exceptions
jurzua
parents:
diff changeset
1191 // Returning true will surpress the default browser handler,
jurzua
parents:
diff changeset
1192 // returning false will let it run.
jurzua
parents:
diff changeset
1193 window.onerror = function ( error, filePath, linerNr ) {
jurzua
parents:
diff changeset
1194 var ret = false;
jurzua
parents:
diff changeset
1195 if ( onErrorFnPrev ) {
jurzua
parents:
diff changeset
1196 ret = onErrorFnPrev( error, filePath, linerNr );
jurzua
parents:
diff changeset
1197 }
jurzua
parents:
diff changeset
1198
jurzua
parents:
diff changeset
1199 // Treat return value as window.onerror itself does,
jurzua
parents:
diff changeset
1200 // Only do our handling if not surpressed.
jurzua
parents:
diff changeset
1201 if ( ret !== true ) {
jurzua
parents:
diff changeset
1202 if ( QUnit.config.current ) {
jurzua
parents:
diff changeset
1203 if ( QUnit.config.current.ignoreGlobalErrors ) {
jurzua
parents:
diff changeset
1204 return true;
jurzua
parents:
diff changeset
1205 }
jurzua
parents:
diff changeset
1206 QUnit.pushFailure( error, filePath + ":" + linerNr );
jurzua
parents:
diff changeset
1207 } else {
jurzua
parents:
diff changeset
1208 QUnit.test( "global failure", extend( function() {
jurzua
parents:
diff changeset
1209 QUnit.pushFailure( error, filePath + ":" + linerNr );
jurzua
parents:
diff changeset
1210 }, { validTest: validTest } ) );
jurzua
parents:
diff changeset
1211 }
jurzua
parents:
diff changeset
1212 return false;
jurzua
parents:
diff changeset
1213 }
jurzua
parents:
diff changeset
1214
jurzua
parents:
diff changeset
1215 return ret;
jurzua
parents:
diff changeset
1216 };
jurzua
parents:
diff changeset
1217
jurzua
parents:
diff changeset
1218 function done() {
jurzua
parents:
diff changeset
1219 config.autorun = true;
jurzua
parents:
diff changeset
1220
jurzua
parents:
diff changeset
1221 // Log the last module results
jurzua
parents:
diff changeset
1222 if ( config.currentModule ) {
jurzua
parents:
diff changeset
1223 runLoggingCallbacks( "moduleDone", QUnit, {
jurzua
parents:
diff changeset
1224 name: config.currentModule,
jurzua
parents:
diff changeset
1225 failed: config.moduleStats.bad,
jurzua
parents:
diff changeset
1226 passed: config.moduleStats.all - config.moduleStats.bad,
jurzua
parents:
diff changeset
1227 total: config.moduleStats.all
jurzua
parents:
diff changeset
1228 });
jurzua
parents:
diff changeset
1229 }
jurzua
parents:
diff changeset
1230
jurzua
parents:
diff changeset
1231 var i, key,
jurzua
parents:
diff changeset
1232 banner = id( "qunit-banner" ),
jurzua
parents:
diff changeset
1233 tests = id( "qunit-tests" ),
jurzua
parents:
diff changeset
1234 runtime = +new Date() - config.started,
jurzua
parents:
diff changeset
1235 passed = config.stats.all - config.stats.bad,
jurzua
parents:
diff changeset
1236 html = [
jurzua
parents:
diff changeset
1237 "Tests completed in ",
jurzua
parents:
diff changeset
1238 runtime,
jurzua
parents:
diff changeset
1239 " milliseconds.<br/>",
jurzua
parents:
diff changeset
1240 "<span class='passed'>",
jurzua
parents:
diff changeset
1241 passed,
jurzua
parents:
diff changeset
1242 "</span> assertions of <span class='total'>",
jurzua
parents:
diff changeset
1243 config.stats.all,
jurzua
parents:
diff changeset
1244 "</span> passed, <span class='failed'>",
jurzua
parents:
diff changeset
1245 config.stats.bad,
jurzua
parents:
diff changeset
1246 "</span> failed."
jurzua
parents:
diff changeset
1247 ].join( "" );
jurzua
parents:
diff changeset
1248
jurzua
parents:
diff changeset
1249 if ( banner ) {
jurzua
parents:
diff changeset
1250 banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
jurzua
parents:
diff changeset
1251 }
jurzua
parents:
diff changeset
1252
jurzua
parents:
diff changeset
1253 if ( tests ) {
jurzua
parents:
diff changeset
1254 id( "qunit-testresult" ).innerHTML = html;
jurzua
parents:
diff changeset
1255 }
jurzua
parents:
diff changeset
1256
jurzua
parents:
diff changeset
1257 if ( config.altertitle && typeof document !== "undefined" && document.title ) {
jurzua
parents:
diff changeset
1258 // show ✖ for good, ✔ for bad suite result in title
jurzua
parents:
diff changeset
1259 // use escape sequences in case file gets loaded with non-utf-8-charset
jurzua
parents:
diff changeset
1260 document.title = [
jurzua
parents:
diff changeset
1261 ( config.stats.bad ? "\u2716" : "\u2714" ),
jurzua
parents:
diff changeset
1262 document.title.replace( /^[\u2714\u2716] /i, "" )
jurzua
parents:
diff changeset
1263 ].join( " " );
jurzua
parents:
diff changeset
1264 }
jurzua
parents:
diff changeset
1265
jurzua
parents:
diff changeset
1266 // clear own sessionStorage items if all tests passed
jurzua
parents:
diff changeset
1267 if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
jurzua
parents:
diff changeset
1268 // `key` & `i` initialized at top of scope
jurzua
parents:
diff changeset
1269 for ( i = 0; i < sessionStorage.length; i++ ) {
jurzua
parents:
diff changeset
1270 key = sessionStorage.key( i++ );
jurzua
parents:
diff changeset
1271 if ( key.indexOf( "qunit-test-" ) === 0 ) {
jurzua
parents:
diff changeset
1272 sessionStorage.removeItem( key );
jurzua
parents:
diff changeset
1273 }
jurzua
parents:
diff changeset
1274 }
jurzua
parents:
diff changeset
1275 }
jurzua
parents:
diff changeset
1276
jurzua
parents:
diff changeset
1277 // scroll back to top to show results
jurzua
parents:
diff changeset
1278 if ( window.scrollTo ) {
jurzua
parents:
diff changeset
1279 window.scrollTo(0, 0);
jurzua
parents:
diff changeset
1280 }
jurzua
parents:
diff changeset
1281
jurzua
parents:
diff changeset
1282 runLoggingCallbacks( "done", QUnit, {
jurzua
parents:
diff changeset
1283 failed: config.stats.bad,
jurzua
parents:
diff changeset
1284 passed: passed,
jurzua
parents:
diff changeset
1285 total: config.stats.all,
jurzua
parents:
diff changeset
1286 runtime: runtime
jurzua
parents:
diff changeset
1287 });
jurzua
parents:
diff changeset
1288 }
jurzua
parents:
diff changeset
1289
jurzua
parents:
diff changeset
1290 /** @return Boolean: true if this test should be ran */
jurzua
parents:
diff changeset
1291 function validTest( test ) {
jurzua
parents:
diff changeset
1292 var include,
jurzua
parents:
diff changeset
1293 filter = config.filter && config.filter.toLowerCase(),
jurzua
parents:
diff changeset
1294 module = config.module && config.module.toLowerCase(),
jurzua
parents:
diff changeset
1295 fullName = (test.module + ": " + test.testName).toLowerCase();
jurzua
parents:
diff changeset
1296
jurzua
parents:
diff changeset
1297 // Internally-generated tests are always valid
jurzua
parents:
diff changeset
1298 if ( test.callback && test.callback.validTest === validTest ) {
jurzua
parents:
diff changeset
1299 delete test.callback.validTest;
jurzua
parents:
diff changeset
1300 return true;
jurzua
parents:
diff changeset
1301 }
jurzua
parents:
diff changeset
1302
jurzua
parents:
diff changeset
1303 if ( config.testNumber ) {
jurzua
parents:
diff changeset
1304 return test.testNumber === config.testNumber;
jurzua
parents:
diff changeset
1305 }
jurzua
parents:
diff changeset
1306
jurzua
parents:
diff changeset
1307 if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
jurzua
parents:
diff changeset
1308 return false;
jurzua
parents:
diff changeset
1309 }
jurzua
parents:
diff changeset
1310
jurzua
parents:
diff changeset
1311 if ( !filter ) {
jurzua
parents:
diff changeset
1312 return true;
jurzua
parents:
diff changeset
1313 }
jurzua
parents:
diff changeset
1314
jurzua
parents:
diff changeset
1315 include = filter.charAt( 0 ) !== "!";
jurzua
parents:
diff changeset
1316 if ( !include ) {
jurzua
parents:
diff changeset
1317 filter = filter.slice( 1 );
jurzua
parents:
diff changeset
1318 }
jurzua
parents:
diff changeset
1319
jurzua
parents:
diff changeset
1320 // If the filter matches, we need to honour include
jurzua
parents:
diff changeset
1321 if ( fullName.indexOf( filter ) !== -1 ) {
jurzua
parents:
diff changeset
1322 return include;
jurzua
parents:
diff changeset
1323 }
jurzua
parents:
diff changeset
1324
jurzua
parents:
diff changeset
1325 // Otherwise, do the opposite
jurzua
parents:
diff changeset
1326 return !include;
jurzua
parents:
diff changeset
1327 }
jurzua
parents:
diff changeset
1328
jurzua
parents:
diff changeset
1329 // so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
jurzua
parents:
diff changeset
1330 // Later Safari and IE10 are supposed to support error.stack as well
jurzua
parents:
diff changeset
1331 // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
jurzua
parents:
diff changeset
1332 function extractStacktrace( e, offset ) {
jurzua
parents:
diff changeset
1333 offset = offset === undefined ? 3 : offset;
jurzua
parents:
diff changeset
1334
jurzua
parents:
diff changeset
1335 var stack, include, i;
jurzua
parents:
diff changeset
1336
jurzua
parents:
diff changeset
1337 if ( e.stacktrace ) {
jurzua
parents:
diff changeset
1338 // Opera
jurzua
parents:
diff changeset
1339 return e.stacktrace.split( "\n" )[ offset + 3 ];
jurzua
parents:
diff changeset
1340 } else if ( e.stack ) {
jurzua
parents:
diff changeset
1341 // Firefox, Chrome
jurzua
parents:
diff changeset
1342 stack = e.stack.split( "\n" );
jurzua
parents:
diff changeset
1343 if (/^error$/i.test( stack[0] ) ) {
jurzua
parents:
diff changeset
1344 stack.shift();
jurzua
parents:
diff changeset
1345 }
jurzua
parents:
diff changeset
1346 if ( fileName ) {
jurzua
parents:
diff changeset
1347 include = [];
jurzua
parents:
diff changeset
1348 for ( i = offset; i < stack.length; i++ ) {
jurzua
parents:
diff changeset
1349 if ( stack[ i ].indexOf( fileName ) !== -1 ) {
jurzua
parents:
diff changeset
1350 break;
jurzua
parents:
diff changeset
1351 }
jurzua
parents:
diff changeset
1352 include.push( stack[ i ] );
jurzua
parents:
diff changeset
1353 }
jurzua
parents:
diff changeset
1354 if ( include.length ) {
jurzua
parents:
diff changeset
1355 return include.join( "\n" );
jurzua
parents:
diff changeset
1356 }
jurzua
parents:
diff changeset
1357 }
jurzua
parents:
diff changeset
1358 return stack[ offset ];
jurzua
parents:
diff changeset
1359 } else if ( e.sourceURL ) {
jurzua
parents:
diff changeset
1360 // Safari, PhantomJS
jurzua
parents:
diff changeset
1361 // hopefully one day Safari provides actual stacktraces
jurzua
parents:
diff changeset
1362 // exclude useless self-reference for generated Error objects
jurzua
parents:
diff changeset
1363 if ( /qunit.js$/.test( e.sourceURL ) ) {
jurzua
parents:
diff changeset
1364 return;
jurzua
parents:
diff changeset
1365 }
jurzua
parents:
diff changeset
1366 // for actual exceptions, this is useful
jurzua
parents:
diff changeset
1367 return e.sourceURL + ":" + e.line;
jurzua
parents:
diff changeset
1368 }
jurzua
parents:
diff changeset
1369 }
jurzua
parents:
diff changeset
1370 function sourceFromStacktrace( offset ) {
jurzua
parents:
diff changeset
1371 try {
jurzua
parents:
diff changeset
1372 throw new Error();
jurzua
parents:
diff changeset
1373 } catch ( e ) {
jurzua
parents:
diff changeset
1374 return extractStacktrace( e, offset );
jurzua
parents:
diff changeset
1375 }
jurzua
parents:
diff changeset
1376 }
jurzua
parents:
diff changeset
1377
jurzua
parents:
diff changeset
1378 /**
jurzua
parents:
diff changeset
1379 * Escape text for attribute or text content.
jurzua
parents:
diff changeset
1380 */
jurzua
parents:
diff changeset
1381 function escapeText( s ) {
jurzua
parents:
diff changeset
1382 if ( !s ) {
jurzua
parents:
diff changeset
1383 return "";
jurzua
parents:
diff changeset
1384 }
jurzua
parents:
diff changeset
1385 s = s + "";
jurzua
parents:
diff changeset
1386 // Both single quotes and double quotes (for attributes)
jurzua
parents:
diff changeset
1387 return s.replace( /['"<>&]/g, function( s ) {
jurzua
parents:
diff changeset
1388 switch( s ) {
jurzua
parents:
diff changeset
1389 case '\'':
jurzua
parents:
diff changeset
1390 return '&#039;';
jurzua
parents:
diff changeset
1391 case '"':
jurzua
parents:
diff changeset
1392 return '&quot;';
jurzua
parents:
diff changeset
1393 case '<':
jurzua
parents:
diff changeset
1394 return '&lt;';
jurzua
parents:
diff changeset
1395 case '>':
jurzua
parents:
diff changeset
1396 return '&gt;';
jurzua
parents:
diff changeset
1397 case '&':
jurzua
parents:
diff changeset
1398 return '&amp;';
jurzua
parents:
diff changeset
1399 }
jurzua
parents:
diff changeset
1400 });
jurzua
parents:
diff changeset
1401 }
jurzua
parents:
diff changeset
1402
jurzua
parents:
diff changeset
1403 function synchronize( callback, last ) {
jurzua
parents:
diff changeset
1404 config.queue.push( callback );
jurzua
parents:
diff changeset
1405
jurzua
parents:
diff changeset
1406 if ( config.autorun && !config.blocking ) {
jurzua
parents:
diff changeset
1407 process( last );
jurzua
parents:
diff changeset
1408 }
jurzua
parents:
diff changeset
1409 }
jurzua
parents:
diff changeset
1410
jurzua
parents:
diff changeset
1411 function process( last ) {
jurzua
parents:
diff changeset
1412 function next() {
jurzua
parents:
diff changeset
1413 process( last );
jurzua
parents:
diff changeset
1414 }
jurzua
parents:
diff changeset
1415 var start = new Date().getTime();
jurzua
parents:
diff changeset
1416 config.depth = config.depth ? config.depth + 1 : 1;
jurzua
parents:
diff changeset
1417
jurzua
parents:
diff changeset
1418 while ( config.queue.length && !config.blocking ) {
jurzua
parents:
diff changeset
1419 if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
jurzua
parents:
diff changeset
1420 config.queue.shift()();
jurzua
parents:
diff changeset
1421 } else {
jurzua
parents:
diff changeset
1422 window.setTimeout( next, 13 );
jurzua
parents:
diff changeset
1423 break;
jurzua
parents:
diff changeset
1424 }
jurzua
parents:
diff changeset
1425 }
jurzua
parents:
diff changeset
1426 config.depth--;
jurzua
parents:
diff changeset
1427 if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
jurzua
parents:
diff changeset
1428 done();
jurzua
parents:
diff changeset
1429 }
jurzua
parents:
diff changeset
1430 }
jurzua
parents:
diff changeset
1431
jurzua
parents:
diff changeset
1432 function saveGlobal() {
jurzua
parents:
diff changeset
1433 config.pollution = [];
jurzua
parents:
diff changeset
1434
jurzua
parents:
diff changeset
1435 if ( config.noglobals ) {
jurzua
parents:
diff changeset
1436 for ( var key in window ) {
jurzua
parents:
diff changeset
1437 // in Opera sometimes DOM element ids show up here, ignore them
jurzua
parents:
diff changeset
1438 if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {
jurzua
parents:
diff changeset
1439 continue;
jurzua
parents:
diff changeset
1440 }
jurzua
parents:
diff changeset
1441 config.pollution.push( key );
jurzua
parents:
diff changeset
1442 }
jurzua
parents:
diff changeset
1443 }
jurzua
parents:
diff changeset
1444 }
jurzua
parents:
diff changeset
1445
jurzua
parents:
diff changeset
1446 function checkPollution() {
jurzua
parents:
diff changeset
1447 var newGlobals,
jurzua
parents:
diff changeset
1448 deletedGlobals,
jurzua
parents:
diff changeset
1449 old = config.pollution;
jurzua
parents:
diff changeset
1450
jurzua
parents:
diff changeset
1451 saveGlobal();
jurzua
parents:
diff changeset
1452
jurzua
parents:
diff changeset
1453 newGlobals = diff( config.pollution, old );
jurzua
parents:
diff changeset
1454 if ( newGlobals.length > 0 ) {
jurzua
parents:
diff changeset
1455 QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
jurzua
parents:
diff changeset
1456 }
jurzua
parents:
diff changeset
1457
jurzua
parents:
diff changeset
1458 deletedGlobals = diff( old, config.pollution );
jurzua
parents:
diff changeset
1459 if ( deletedGlobals.length > 0 ) {
jurzua
parents:
diff changeset
1460 QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
jurzua
parents:
diff changeset
1461 }
jurzua
parents:
diff changeset
1462 }
jurzua
parents:
diff changeset
1463
jurzua
parents:
diff changeset
1464 // returns a new Array with the elements that are in a but not in b
jurzua
parents:
diff changeset
1465 function diff( a, b ) {
jurzua
parents:
diff changeset
1466 var i, j,
jurzua
parents:
diff changeset
1467 result = a.slice();
jurzua
parents:
diff changeset
1468
jurzua
parents:
diff changeset
1469 for ( i = 0; i < result.length; i++ ) {
jurzua
parents:
diff changeset
1470 for ( j = 0; j < b.length; j++ ) {
jurzua
parents:
diff changeset
1471 if ( result[i] === b[j] ) {
jurzua
parents:
diff changeset
1472 result.splice( i, 1 );
jurzua
parents:
diff changeset
1473 i--;
jurzua
parents:
diff changeset
1474 break;
jurzua
parents:
diff changeset
1475 }
jurzua
parents:
diff changeset
1476 }
jurzua
parents:
diff changeset
1477 }
jurzua
parents:
diff changeset
1478 return result;
jurzua
parents:
diff changeset
1479 }
jurzua
parents:
diff changeset
1480
jurzua
parents:
diff changeset
1481 function extend( a, b ) {
jurzua
parents:
diff changeset
1482 for ( var prop in b ) {
jurzua
parents:
diff changeset
1483 if ( b[ prop ] === undefined ) {
jurzua
parents:
diff changeset
1484 delete a[ prop ];
jurzua
parents:
diff changeset
1485
jurzua
parents:
diff changeset
1486 // Avoid "Member not found" error in IE8 caused by setting window.constructor
jurzua
parents:
diff changeset
1487 } else if ( prop !== "constructor" || a !== window ) {
jurzua
parents:
diff changeset
1488 a[ prop ] = b[ prop ];
jurzua
parents:
diff changeset
1489 }
jurzua
parents:
diff changeset
1490 }
jurzua
parents:
diff changeset
1491
jurzua
parents:
diff changeset
1492 return a;
jurzua
parents:
diff changeset
1493 }
jurzua
parents:
diff changeset
1494
jurzua
parents:
diff changeset
1495 /**
jurzua
parents:
diff changeset
1496 * @param {HTMLElement} elem
jurzua
parents:
diff changeset
1497 * @param {string} type
jurzua
parents:
diff changeset
1498 * @param {Function} fn
jurzua
parents:
diff changeset
1499 */
jurzua
parents:
diff changeset
1500 function addEvent( elem, type, fn ) {
jurzua
parents:
diff changeset
1501 // Standards-based browsers
jurzua
parents:
diff changeset
1502 if ( elem.addEventListener ) {
jurzua
parents:
diff changeset
1503 elem.addEventListener( type, fn, false );
jurzua
parents:
diff changeset
1504 // IE
jurzua
parents:
diff changeset
1505 } else {
jurzua
parents:
diff changeset
1506 elem.attachEvent( "on" + type, fn );
jurzua
parents:
diff changeset
1507 }
jurzua
parents:
diff changeset
1508 }
jurzua
parents:
diff changeset
1509
jurzua
parents:
diff changeset
1510 /**
jurzua
parents:
diff changeset
1511 * @param {Array|NodeList} elems
jurzua
parents:
diff changeset
1512 * @param {string} type
jurzua
parents:
diff changeset
1513 * @param {Function} fn
jurzua
parents:
diff changeset
1514 */
jurzua
parents:
diff changeset
1515 function addEvents( elems, type, fn ) {
jurzua
parents:
diff changeset
1516 var i = elems.length;
jurzua
parents:
diff changeset
1517 while ( i-- ) {
jurzua
parents:
diff changeset
1518 addEvent( elems[i], type, fn );
jurzua
parents:
diff changeset
1519 }
jurzua
parents:
diff changeset
1520 }
jurzua
parents:
diff changeset
1521
jurzua
parents:
diff changeset
1522 function hasClass( elem, name ) {
jurzua
parents:
diff changeset
1523 return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
jurzua
parents:
diff changeset
1524 }
jurzua
parents:
diff changeset
1525
jurzua
parents:
diff changeset
1526 function addClass( elem, name ) {
jurzua
parents:
diff changeset
1527 if ( !hasClass( elem, name ) ) {
jurzua
parents:
diff changeset
1528 elem.className += (elem.className ? " " : "") + name;
jurzua
parents:
diff changeset
1529 }
jurzua
parents:
diff changeset
1530 }
jurzua
parents:
diff changeset
1531
jurzua
parents:
diff changeset
1532 function removeClass( elem, name ) {
jurzua
parents:
diff changeset
1533 var set = " " + elem.className + " ";
jurzua
parents:
diff changeset
1534 // Class name may appear multiple times
jurzua
parents:
diff changeset
1535 while ( set.indexOf(" " + name + " ") > -1 ) {
jurzua
parents:
diff changeset
1536 set = set.replace(" " + name + " " , " ");
jurzua
parents:
diff changeset
1537 }
jurzua
parents:
diff changeset
1538 // If possible, trim it for prettiness, but not neccecarily
jurzua
parents:
diff changeset
1539 elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
jurzua
parents:
diff changeset
1540 }
jurzua
parents:
diff changeset
1541
jurzua
parents:
diff changeset
1542 function id( name ) {
jurzua
parents:
diff changeset
1543 return !!( typeof document !== "undefined" && document && document.getElementById ) &&
jurzua
parents:
diff changeset
1544 document.getElementById( name );
jurzua
parents:
diff changeset
1545 }
jurzua
parents:
diff changeset
1546
jurzua
parents:
diff changeset
1547 function registerLoggingCallback( key ) {
jurzua
parents:
diff changeset
1548 return function( callback ) {
jurzua
parents:
diff changeset
1549 config[key].push( callback );
jurzua
parents:
diff changeset
1550 };
jurzua
parents:
diff changeset
1551 }
jurzua
parents:
diff changeset
1552
jurzua
parents:
diff changeset
1553 // Supports deprecated method of completely overwriting logging callbacks
jurzua
parents:
diff changeset
1554 function runLoggingCallbacks( key, scope, args ) {
jurzua
parents:
diff changeset
1555 var i, callbacks;
jurzua
parents:
diff changeset
1556 if ( QUnit.hasOwnProperty( key ) ) {
jurzua
parents:
diff changeset
1557 QUnit[ key ].call(scope, args );
jurzua
parents:
diff changeset
1558 } else {
jurzua
parents:
diff changeset
1559 callbacks = config[ key ];
jurzua
parents:
diff changeset
1560 for ( i = 0; i < callbacks.length; i++ ) {
jurzua
parents:
diff changeset
1561 callbacks[ i ].call( scope, args );
jurzua
parents:
diff changeset
1562 }
jurzua
parents:
diff changeset
1563 }
jurzua
parents:
diff changeset
1564 }
jurzua
parents:
diff changeset
1565
jurzua
parents:
diff changeset
1566 // Test for equality any JavaScript type.
jurzua
parents:
diff changeset
1567 // Author: Philippe Rathé <prathe@gmail.com>
jurzua
parents:
diff changeset
1568 QUnit.equiv = (function() {
jurzua
parents:
diff changeset
1569
jurzua
parents:
diff changeset
1570 // Call the o related callback with the given arguments.
jurzua
parents:
diff changeset
1571 function bindCallbacks( o, callbacks, args ) {
jurzua
parents:
diff changeset
1572 var prop = QUnit.objectType( o );
jurzua
parents:
diff changeset
1573 if ( prop ) {
jurzua
parents:
diff changeset
1574 if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
jurzua
parents:
diff changeset
1575 return callbacks[ prop ].apply( callbacks, args );
jurzua
parents:
diff changeset
1576 } else {
jurzua
parents:
diff changeset
1577 return callbacks[ prop ]; // or undefined
jurzua
parents:
diff changeset
1578 }
jurzua
parents:
diff changeset
1579 }
jurzua
parents:
diff changeset
1580 }
jurzua
parents:
diff changeset
1581
jurzua
parents:
diff changeset
1582 // the real equiv function
jurzua
parents:
diff changeset
1583 var innerEquiv,
jurzua
parents:
diff changeset
1584 // stack to decide between skip/abort functions
jurzua
parents:
diff changeset
1585 callers = [],
jurzua
parents:
diff changeset
1586 // stack to avoiding loops from circular referencing
jurzua
parents:
diff changeset
1587 parents = [],
jurzua
parents:
diff changeset
1588
jurzua
parents:
diff changeset
1589 getProto = Object.getPrototypeOf || function ( obj ) {
jurzua
parents:
diff changeset
1590 return obj.__proto__;
jurzua
parents:
diff changeset
1591 },
jurzua
parents:
diff changeset
1592 callbacks = (function () {
jurzua
parents:
diff changeset
1593
jurzua
parents:
diff changeset
1594 // for string, boolean, number and null
jurzua
parents:
diff changeset
1595 function useStrictEquality( b, a ) {
jurzua
parents:
diff changeset
1596 /*jshint eqeqeq:false */
jurzua
parents:
diff changeset
1597 if ( b instanceof a.constructor || a instanceof b.constructor ) {
jurzua
parents:
diff changeset
1598 // to catch short annotaion VS 'new' annotation of a
jurzua
parents:
diff changeset
1599 // declaration
jurzua
parents:
diff changeset
1600 // e.g. var i = 1;
jurzua
parents:
diff changeset
1601 // var j = new Number(1);
jurzua
parents:
diff changeset
1602 return a == b;
jurzua
parents:
diff changeset
1603 } else {
jurzua
parents:
diff changeset
1604 return a === b;
jurzua
parents:
diff changeset
1605 }
jurzua
parents:
diff changeset
1606 }
jurzua
parents:
diff changeset
1607
jurzua
parents:
diff changeset
1608 return {
jurzua
parents:
diff changeset
1609 "string": useStrictEquality,
jurzua
parents:
diff changeset
1610 "boolean": useStrictEquality,
jurzua
parents:
diff changeset
1611 "number": useStrictEquality,
jurzua
parents:
diff changeset
1612 "null": useStrictEquality,
jurzua
parents:
diff changeset
1613 "undefined": useStrictEquality,
jurzua
parents:
diff changeset
1614
jurzua
parents:
diff changeset
1615 "nan": function( b ) {
jurzua
parents:
diff changeset
1616 return isNaN( b );
jurzua
parents:
diff changeset
1617 },
jurzua
parents:
diff changeset
1618
jurzua
parents:
diff changeset
1619 "date": function( b, a ) {
jurzua
parents:
diff changeset
1620 return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
jurzua
parents:
diff changeset
1621 },
jurzua
parents:
diff changeset
1622
jurzua
parents:
diff changeset
1623 "regexp": function( b, a ) {
jurzua
parents:
diff changeset
1624 return QUnit.objectType( b ) === "regexp" &&
jurzua
parents:
diff changeset
1625 // the regex itself
jurzua
parents:
diff changeset
1626 a.source === b.source &&
jurzua
parents:
diff changeset
1627 // and its modifers
jurzua
parents:
diff changeset
1628 a.global === b.global &&
jurzua
parents:
diff changeset
1629 // (gmi) ...
jurzua
parents:
diff changeset
1630 a.ignoreCase === b.ignoreCase &&
jurzua
parents:
diff changeset
1631 a.multiline === b.multiline &&
jurzua
parents:
diff changeset
1632 a.sticky === b.sticky;
jurzua
parents:
diff changeset
1633 },
jurzua
parents:
diff changeset
1634
jurzua
parents:
diff changeset
1635 // - skip when the property is a method of an instance (OOP)
jurzua
parents:
diff changeset
1636 // - abort otherwise,
jurzua
parents:
diff changeset
1637 // initial === would have catch identical references anyway
jurzua
parents:
diff changeset
1638 "function": function() {
jurzua
parents:
diff changeset
1639 var caller = callers[callers.length - 1];
jurzua
parents:
diff changeset
1640 return caller !== Object && typeof caller !== "undefined";
jurzua
parents:
diff changeset
1641 },
jurzua
parents:
diff changeset
1642
jurzua
parents:
diff changeset
1643 "array": function( b, a ) {
jurzua
parents:
diff changeset
1644 var i, j, len, loop;
jurzua
parents:
diff changeset
1645
jurzua
parents:
diff changeset
1646 // b could be an object literal here
jurzua
parents:
diff changeset
1647 if ( QUnit.objectType( b ) !== "array" ) {
jurzua
parents:
diff changeset
1648 return false;
jurzua
parents:
diff changeset
1649 }
jurzua
parents:
diff changeset
1650
jurzua
parents:
diff changeset
1651 len = a.length;
jurzua
parents:
diff changeset
1652 if ( len !== b.length ) {
jurzua
parents:
diff changeset
1653 // safe and faster
jurzua
parents:
diff changeset
1654 return false;
jurzua
parents:
diff changeset
1655 }
jurzua
parents:
diff changeset
1656
jurzua
parents:
diff changeset
1657 // track reference to avoid circular references
jurzua
parents:
diff changeset
1658 parents.push( a );
jurzua
parents:
diff changeset
1659 for ( i = 0; i < len; i++ ) {
jurzua
parents:
diff changeset
1660 loop = false;
jurzua
parents:
diff changeset
1661 for ( j = 0; j < parents.length; j++ ) {
jurzua
parents:
diff changeset
1662 if ( parents[j] === a[i] ) {
jurzua
parents:
diff changeset
1663 loop = true;// dont rewalk array
jurzua
parents:
diff changeset
1664 }
jurzua
parents:
diff changeset
1665 }
jurzua
parents:
diff changeset
1666 if ( !loop && !innerEquiv(a[i], b[i]) ) {
jurzua
parents:
diff changeset
1667 parents.pop();
jurzua
parents:
diff changeset
1668 return false;
jurzua
parents:
diff changeset
1669 }
jurzua
parents:
diff changeset
1670 }
jurzua
parents:
diff changeset
1671 parents.pop();
jurzua
parents:
diff changeset
1672 return true;
jurzua
parents:
diff changeset
1673 },
jurzua
parents:
diff changeset
1674
jurzua
parents:
diff changeset
1675 "object": function( b, a ) {
jurzua
parents:
diff changeset
1676 var i, j, loop,
jurzua
parents:
diff changeset
1677 // Default to true
jurzua
parents:
diff changeset
1678 eq = true,
jurzua
parents:
diff changeset
1679 aProperties = [],
jurzua
parents:
diff changeset
1680 bProperties = [];
jurzua
parents:
diff changeset
1681
jurzua
parents:
diff changeset
1682 // comparing constructors is more strict than using
jurzua
parents:
diff changeset
1683 // instanceof
jurzua
parents:
diff changeset
1684 if ( a.constructor !== b.constructor ) {
jurzua
parents:
diff changeset
1685 // Allow objects with no prototype to be equivalent to
jurzua
parents:
diff changeset
1686 // objects with Object as their constructor.
jurzua
parents:
diff changeset
1687 if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
jurzua
parents:
diff changeset
1688 ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
jurzua
parents:
diff changeset
1689 return false;
jurzua
parents:
diff changeset
1690 }
jurzua
parents:
diff changeset
1691 }
jurzua
parents:
diff changeset
1692
jurzua
parents:
diff changeset
1693 // stack constructor before traversing properties
jurzua
parents:
diff changeset
1694 callers.push( a.constructor );
jurzua
parents:
diff changeset
1695 // track reference to avoid circular references
jurzua
parents:
diff changeset
1696 parents.push( a );
jurzua
parents:
diff changeset
1697
jurzua
parents:
diff changeset
1698 for ( i in a ) { // be strict: don't ensures hasOwnProperty
jurzua
parents:
diff changeset
1699 // and go deep
jurzua
parents:
diff changeset
1700 loop = false;
jurzua
parents:
diff changeset
1701 for ( j = 0; j < parents.length; j++ ) {
jurzua
parents:
diff changeset
1702 if ( parents[j] === a[i] ) {
jurzua
parents:
diff changeset
1703 // don't go down the same path twice
jurzua
parents:
diff changeset
1704 loop = true;
jurzua
parents:
diff changeset
1705 }
jurzua
parents:
diff changeset
1706 }
jurzua
parents:
diff changeset
1707 aProperties.push(i); // collect a's properties
jurzua
parents:
diff changeset
1708
jurzua
parents:
diff changeset
1709 if (!loop && !innerEquiv( a[i], b[i] ) ) {
jurzua
parents:
diff changeset
1710 eq = false;
jurzua
parents:
diff changeset
1711 break;
jurzua
parents:
diff changeset
1712 }
jurzua
parents:
diff changeset
1713 }
jurzua
parents:
diff changeset
1714
jurzua
parents:
diff changeset
1715 callers.pop(); // unstack, we are done
jurzua
parents:
diff changeset
1716 parents.pop();
jurzua
parents:
diff changeset
1717
jurzua
parents:
diff changeset
1718 for ( i in b ) {
jurzua
parents:
diff changeset
1719 bProperties.push( i ); // collect b's properties
jurzua
parents:
diff changeset
1720 }
jurzua
parents:
diff changeset
1721
jurzua
parents:
diff changeset
1722 // Ensures identical properties name
jurzua
parents:
diff changeset
1723 return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
jurzua
parents:
diff changeset
1724 }
jurzua
parents:
diff changeset
1725 };
jurzua
parents:
diff changeset
1726 }());
jurzua
parents:
diff changeset
1727
jurzua
parents:
diff changeset
1728 innerEquiv = function() { // can take multiple arguments
jurzua
parents:
diff changeset
1729 var args = [].slice.apply( arguments );
jurzua
parents:
diff changeset
1730 if ( args.length < 2 ) {
jurzua
parents:
diff changeset
1731 return true; // end transition
jurzua
parents:
diff changeset
1732 }
jurzua
parents:
diff changeset
1733
jurzua
parents:
diff changeset
1734 return (function( a, b ) {
jurzua
parents:
diff changeset
1735 if ( a === b ) {
jurzua
parents:
diff changeset
1736 return true; // catch the most you can
jurzua
parents:
diff changeset
1737 } else if ( a === null || b === null || typeof a === "undefined" ||
jurzua
parents:
diff changeset
1738 typeof b === "undefined" ||
jurzua
parents:
diff changeset
1739 QUnit.objectType(a) !== QUnit.objectType(b) ) {
jurzua
parents:
diff changeset
1740 return false; // don't lose time with error prone cases
jurzua
parents:
diff changeset
1741 } else {
jurzua
parents:
diff changeset
1742 return bindCallbacks(a, callbacks, [ b, a ]);
jurzua
parents:
diff changeset
1743 }
jurzua
parents:
diff changeset
1744
jurzua
parents:
diff changeset
1745 // apply transition with (1..n) arguments
jurzua
parents:
diff changeset
1746 }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );
jurzua
parents:
diff changeset
1747 };
jurzua
parents:
diff changeset
1748
jurzua
parents:
diff changeset
1749 return innerEquiv;
jurzua
parents:
diff changeset
1750 }());
jurzua
parents:
diff changeset
1751
jurzua
parents:
diff changeset
1752 /**
jurzua
parents:
diff changeset
1753 * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
jurzua
parents:
diff changeset
1754 * http://flesler.blogspot.com Licensed under BSD
jurzua
parents:
diff changeset
1755 * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
jurzua
parents:
diff changeset
1756 *
jurzua
parents:
diff changeset
1757 * @projectDescription Advanced and extensible data dumping for Javascript.
jurzua
parents:
diff changeset
1758 * @version 1.0.0
jurzua
parents:
diff changeset
1759 * @author Ariel Flesler
jurzua
parents:
diff changeset
1760 * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
jurzua
parents:
diff changeset
1761 */
jurzua
parents:
diff changeset
1762 QUnit.jsDump = (function() {
jurzua
parents:
diff changeset
1763 function quote( str ) {
jurzua
parents:
diff changeset
1764 return '"' + str.toString().replace( /"/g, '\\"' ) + '"';
jurzua
parents:
diff changeset
1765 }
jurzua
parents:
diff changeset
1766 function literal( o ) {
jurzua
parents:
diff changeset
1767 return o + "";
jurzua
parents:
diff changeset
1768 }
jurzua
parents:
diff changeset
1769 function join( pre, arr, post ) {
jurzua
parents:
diff changeset
1770 var s = jsDump.separator(),
jurzua
parents:
diff changeset
1771 base = jsDump.indent(),
jurzua
parents:
diff changeset
1772 inner = jsDump.indent(1);
jurzua
parents:
diff changeset
1773 if ( arr.join ) {
jurzua
parents:
diff changeset
1774 arr = arr.join( "," + s + inner );
jurzua
parents:
diff changeset
1775 }
jurzua
parents:
diff changeset
1776 if ( !arr ) {
jurzua
parents:
diff changeset
1777 return pre + post;
jurzua
parents:
diff changeset
1778 }
jurzua
parents:
diff changeset
1779 return [ pre, inner + arr, base + post ].join(s);
jurzua
parents:
diff changeset
1780 }
jurzua
parents:
diff changeset
1781 function array( arr, stack ) {
jurzua
parents:
diff changeset
1782 var i = arr.length, ret = new Array(i);
jurzua
parents:
diff changeset
1783 this.up();
jurzua
parents:
diff changeset
1784 while ( i-- ) {
jurzua
parents:
diff changeset
1785 ret[i] = this.parse( arr[i] , undefined , stack);
jurzua
parents:
diff changeset
1786 }
jurzua
parents:
diff changeset
1787 this.down();
jurzua
parents:
diff changeset
1788 return join( "[", ret, "]" );
jurzua
parents:
diff changeset
1789 }
jurzua
parents:
diff changeset
1790
jurzua
parents:
diff changeset
1791 var reName = /^function (\w+)/,
jurzua
parents:
diff changeset
1792 jsDump = {
jurzua
parents:
diff changeset
1793 // type is used mostly internally, you can fix a (custom)type in advance
jurzua
parents:
diff changeset
1794 parse: function( obj, type, stack ) {
jurzua
parents:
diff changeset
1795 stack = stack || [ ];
jurzua
parents:
diff changeset
1796 var inStack, res,
jurzua
parents:
diff changeset
1797 parser = this.parsers[ type || this.typeOf(obj) ];
jurzua
parents:
diff changeset
1798
jurzua
parents:
diff changeset
1799 type = typeof parser;
jurzua
parents:
diff changeset
1800 inStack = inArray( obj, stack );
jurzua
parents:
diff changeset
1801
jurzua
parents:
diff changeset
1802 if ( inStack !== -1 ) {
jurzua
parents:
diff changeset
1803 return "recursion(" + (inStack - stack.length) + ")";
jurzua
parents:
diff changeset
1804 }
jurzua
parents:
diff changeset
1805 if ( type === "function" ) {
jurzua
parents:
diff changeset
1806 stack.push( obj );
jurzua
parents:
diff changeset
1807 res = parser.call( this, obj, stack );
jurzua
parents:
diff changeset
1808 stack.pop();
jurzua
parents:
diff changeset
1809 return res;
jurzua
parents:
diff changeset
1810 }
jurzua
parents:
diff changeset
1811 return ( type === "string" ) ? parser : this.parsers.error;
jurzua
parents:
diff changeset
1812 },
jurzua
parents:
diff changeset
1813 typeOf: function( obj ) {
jurzua
parents:
diff changeset
1814 var type;
jurzua
parents:
diff changeset
1815 if ( obj === null ) {
jurzua
parents:
diff changeset
1816 type = "null";
jurzua
parents:
diff changeset
1817 } else if ( typeof obj === "undefined" ) {
jurzua
parents:
diff changeset
1818 type = "undefined";
jurzua
parents:
diff changeset
1819 } else if ( QUnit.is( "regexp", obj) ) {
jurzua
parents:
diff changeset
1820 type = "regexp";
jurzua
parents:
diff changeset
1821 } else if ( QUnit.is( "date", obj) ) {
jurzua
parents:
diff changeset
1822 type = "date";
jurzua
parents:
diff changeset
1823 } else if ( QUnit.is( "function", obj) ) {
jurzua
parents:
diff changeset
1824 type = "function";
jurzua
parents:
diff changeset
1825 } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
jurzua
parents:
diff changeset
1826 type = "window";
jurzua
parents:
diff changeset
1827 } else if ( obj.nodeType === 9 ) {
jurzua
parents:
diff changeset
1828 type = "document";
jurzua
parents:
diff changeset
1829 } else if ( obj.nodeType ) {
jurzua
parents:
diff changeset
1830 type = "node";
jurzua
parents:
diff changeset
1831 } else if (
jurzua
parents:
diff changeset
1832 // native arrays
jurzua
parents:
diff changeset
1833 toString.call( obj ) === "[object Array]" ||
jurzua
parents:
diff changeset
1834 // NodeList objects
jurzua
parents:
diff changeset
1835 ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
jurzua
parents:
diff changeset
1836 ) {
jurzua
parents:
diff changeset
1837 type = "array";
jurzua
parents:
diff changeset
1838 } else if ( obj.constructor === Error.prototype.constructor ) {
jurzua
parents:
diff changeset
1839 type = "error";
jurzua
parents:
diff changeset
1840 } else {
jurzua
parents:
diff changeset
1841 type = typeof obj;
jurzua
parents:
diff changeset
1842 }
jurzua
parents:
diff changeset
1843 return type;
jurzua
parents:
diff changeset
1844 },
jurzua
parents:
diff changeset
1845 separator: function() {
jurzua
parents:
diff changeset
1846 return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
jurzua
parents:
diff changeset
1847 },
jurzua
parents:
diff changeset
1848 // extra can be a number, shortcut for increasing-calling-decreasing
jurzua
parents:
diff changeset
1849 indent: function( extra ) {
jurzua
parents:
diff changeset
1850 if ( !this.multiline ) {
jurzua
parents:
diff changeset
1851 return "";
jurzua
parents:
diff changeset
1852 }
jurzua
parents:
diff changeset
1853 var chr = this.indentChar;
jurzua
parents:
diff changeset
1854 if ( this.HTML ) {
jurzua
parents:
diff changeset
1855 chr = chr.replace( /\t/g, " " ).replace( / /g, "&nbsp;" );
jurzua
parents:
diff changeset
1856 }
jurzua
parents:
diff changeset
1857 return new Array( this._depth_ + (extra||0) ).join(chr);
jurzua
parents:
diff changeset
1858 },
jurzua
parents:
diff changeset
1859 up: function( a ) {
jurzua
parents:
diff changeset
1860 this._depth_ += a || 1;
jurzua
parents:
diff changeset
1861 },
jurzua
parents:
diff changeset
1862 down: function( a ) {
jurzua
parents:
diff changeset
1863 this._depth_ -= a || 1;
jurzua
parents:
diff changeset
1864 },
jurzua
parents:
diff changeset
1865 setParser: function( name, parser ) {
jurzua
parents:
diff changeset
1866 this.parsers[name] = parser;
jurzua
parents:
diff changeset
1867 },
jurzua
parents:
diff changeset
1868 // The next 3 are exposed so you can use them
jurzua
parents:
diff changeset
1869 quote: quote,
jurzua
parents:
diff changeset
1870 literal: literal,
jurzua
parents:
diff changeset
1871 join: join,
jurzua
parents:
diff changeset
1872 //
jurzua
parents:
diff changeset
1873 _depth_: 1,
jurzua
parents:
diff changeset
1874 // This is the list of parsers, to modify them, use jsDump.setParser
jurzua
parents:
diff changeset
1875 parsers: {
jurzua
parents:
diff changeset
1876 window: "[Window]",
jurzua
parents:
diff changeset
1877 document: "[Document]",
jurzua
parents:
diff changeset
1878 error: function(error) {
jurzua
parents:
diff changeset
1879 return "Error(\"" + error.message + "\")";
jurzua
parents:
diff changeset
1880 },
jurzua
parents:
diff changeset
1881 unknown: "[Unknown]",
jurzua
parents:
diff changeset
1882 "null": "null",
jurzua
parents:
diff changeset
1883 "undefined": "undefined",
jurzua
parents:
diff changeset
1884 "function": function( fn ) {
jurzua
parents:
diff changeset
1885 var ret = "function",
jurzua
parents:
diff changeset
1886 // functions never have name in IE
jurzua
parents:
diff changeset
1887 name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
jurzua
parents:
diff changeset
1888
jurzua
parents:
diff changeset
1889 if ( name ) {
jurzua
parents:
diff changeset
1890 ret += " " + name;
jurzua
parents:
diff changeset
1891 }
jurzua
parents:
diff changeset
1892 ret += "( ";
jurzua
parents:
diff changeset
1893
jurzua
parents:
diff changeset
1894 ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
jurzua
parents:
diff changeset
1895 return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
jurzua
parents:
diff changeset
1896 },
jurzua
parents:
diff changeset
1897 array: array,
jurzua
parents:
diff changeset
1898 nodelist: array,
jurzua
parents:
diff changeset
1899 "arguments": array,
jurzua
parents:
diff changeset
1900 object: function( map, stack ) {
jurzua
parents:
diff changeset
1901 var ret = [ ], keys, key, val, i;
jurzua
parents:
diff changeset
1902 QUnit.jsDump.up();
jurzua
parents:
diff changeset
1903 keys = [];
jurzua
parents:
diff changeset
1904 for ( key in map ) {
jurzua
parents:
diff changeset
1905 keys.push( key );
jurzua
parents:
diff changeset
1906 }
jurzua
parents:
diff changeset
1907 keys.sort();
jurzua
parents:
diff changeset
1908 for ( i = 0; i < keys.length; i++ ) {
jurzua
parents:
diff changeset
1909 key = keys[ i ];
jurzua
parents:
diff changeset
1910 val = map[ key ];
jurzua
parents:
diff changeset
1911 ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
jurzua
parents:
diff changeset
1912 }
jurzua
parents:
diff changeset
1913 QUnit.jsDump.down();
jurzua
parents:
diff changeset
1914 return join( "{", ret, "}" );
jurzua
parents:
diff changeset
1915 },
jurzua
parents:
diff changeset
1916 node: function( node ) {
jurzua
parents:
diff changeset
1917 var len, i, val,
jurzua
parents:
diff changeset
1918 open = QUnit.jsDump.HTML ? "&lt;" : "<",
jurzua
parents:
diff changeset
1919 close = QUnit.jsDump.HTML ? "&gt;" : ">",
jurzua
parents:
diff changeset
1920 tag = node.nodeName.toLowerCase(),
jurzua
parents:
diff changeset
1921 ret = open + tag,
jurzua
parents:
diff changeset
1922 attrs = node.attributes;
jurzua
parents:
diff changeset
1923
jurzua
parents:
diff changeset
1924 if ( attrs ) {
jurzua
parents:
diff changeset
1925 for ( i = 0, len = attrs.length; i < len; i++ ) {
jurzua
parents:
diff changeset
1926 val = attrs[i].nodeValue;
jurzua
parents:
diff changeset
1927 // IE6 includes all attributes in .attributes, even ones not explicitly set.
jurzua
parents:
diff changeset
1928 // Those have values like undefined, null, 0, false, "" or "inherit".
jurzua
parents:
diff changeset
1929 if ( val && val !== "inherit" ) {
jurzua
parents:
diff changeset
1930 ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
jurzua
parents:
diff changeset
1931 }
jurzua
parents:
diff changeset
1932 }
jurzua
parents:
diff changeset
1933 }
jurzua
parents:
diff changeset
1934 ret += close;
jurzua
parents:
diff changeset
1935
jurzua
parents:
diff changeset
1936 // Show content of TextNode or CDATASection
jurzua
parents:
diff changeset
1937 if ( node.nodeType === 3 || node.nodeType === 4 ) {
jurzua
parents:
diff changeset
1938 ret += node.nodeValue;
jurzua
parents:
diff changeset
1939 }
jurzua
parents:
diff changeset
1940
jurzua
parents:
diff changeset
1941 return ret + open + "/" + tag + close;
jurzua
parents:
diff changeset
1942 },
jurzua
parents:
diff changeset
1943 // function calls it internally, it's the arguments part of the function
jurzua
parents:
diff changeset
1944 functionArgs: function( fn ) {
jurzua
parents:
diff changeset
1945 var args,
jurzua
parents:
diff changeset
1946 l = fn.length;
jurzua
parents:
diff changeset
1947
jurzua
parents:
diff changeset
1948 if ( !l ) {
jurzua
parents:
diff changeset
1949 return "";
jurzua
parents:
diff changeset
1950 }
jurzua
parents:
diff changeset
1951
jurzua
parents:
diff changeset
1952 args = new Array(l);
jurzua
parents:
diff changeset
1953 while ( l-- ) {
jurzua
parents:
diff changeset
1954 // 97 is 'a'
jurzua
parents:
diff changeset
1955 args[l] = String.fromCharCode(97+l);
jurzua
parents:
diff changeset
1956 }
jurzua
parents:
diff changeset
1957 return " " + args.join( ", " ) + " ";
jurzua
parents:
diff changeset
1958 },
jurzua
parents:
diff changeset
1959 // object calls it internally, the key part of an item in a map
jurzua
parents:
diff changeset
1960 key: quote,
jurzua
parents:
diff changeset
1961 // function calls it internally, it's the content of the function
jurzua
parents:
diff changeset
1962 functionCode: "[code]",
jurzua
parents:
diff changeset
1963 // node calls it internally, it's an html attribute value
jurzua
parents:
diff changeset
1964 attribute: quote,
jurzua
parents:
diff changeset
1965 string: quote,
jurzua
parents:
diff changeset
1966 date: quote,
jurzua
parents:
diff changeset
1967 regexp: literal,
jurzua
parents:
diff changeset
1968 number: literal,
jurzua
parents:
diff changeset
1969 "boolean": literal
jurzua
parents:
diff changeset
1970 },
jurzua
parents:
diff changeset
1971 // if true, entities are escaped ( <, >, \t, space and \n )
jurzua
parents:
diff changeset
1972 HTML: false,
jurzua
parents:
diff changeset
1973 // indentation unit
jurzua
parents:
diff changeset
1974 indentChar: " ",
jurzua
parents:
diff changeset
1975 // if true, items in a collection, are separated by a \n, else just a space.
jurzua
parents:
diff changeset
1976 multiline: true
jurzua
parents:
diff changeset
1977 };
jurzua
parents:
diff changeset
1978
jurzua
parents:
diff changeset
1979 return jsDump;
jurzua
parents:
diff changeset
1980 }());
jurzua
parents:
diff changeset
1981
jurzua
parents:
diff changeset
1982 // from jquery.js
jurzua
parents:
diff changeset
1983 function inArray( elem, array ) {
jurzua
parents:
diff changeset
1984 if ( array.indexOf ) {
jurzua
parents:
diff changeset
1985 return array.indexOf( elem );
jurzua
parents:
diff changeset
1986 }
jurzua
parents:
diff changeset
1987
jurzua
parents:
diff changeset
1988 for ( var i = 0, length = array.length; i < length; i++ ) {
jurzua
parents:
diff changeset
1989 if ( array[ i ] === elem ) {
jurzua
parents:
diff changeset
1990 return i;
jurzua
parents:
diff changeset
1991 }
jurzua
parents:
diff changeset
1992 }
jurzua
parents:
diff changeset
1993
jurzua
parents:
diff changeset
1994 return -1;
jurzua
parents:
diff changeset
1995 }
jurzua
parents:
diff changeset
1996
jurzua
parents:
diff changeset
1997 /*
jurzua
parents:
diff changeset
1998 * Javascript Diff Algorithm
jurzua
parents:
diff changeset
1999 * By John Resig (http://ejohn.org/)
jurzua
parents:
diff changeset
2000 * Modified by Chu Alan "sprite"
jurzua
parents:
diff changeset
2001 *
jurzua
parents:
diff changeset
2002 * Released under the MIT license.
jurzua
parents:
diff changeset
2003 *
jurzua
parents:
diff changeset
2004 * More Info:
jurzua
parents:
diff changeset
2005 * http://ejohn.org/projects/javascript-diff-algorithm/
jurzua
parents:
diff changeset
2006 *
jurzua
parents:
diff changeset
2007 * Usage: QUnit.diff(expected, actual)
jurzua
parents:
diff changeset
2008 *
jurzua
parents:
diff changeset
2009 * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
jurzua
parents:
diff changeset
2010 */
jurzua
parents:
diff changeset
2011 QUnit.diff = (function() {
jurzua
parents:
diff changeset
2012 /*jshint eqeqeq:false, eqnull:true */
jurzua
parents:
diff changeset
2013 function diff( o, n ) {
jurzua
parents:
diff changeset
2014 var i,
jurzua
parents:
diff changeset
2015 ns = {},
jurzua
parents:
diff changeset
2016 os = {};
jurzua
parents:
diff changeset
2017
jurzua
parents:
diff changeset
2018 for ( i = 0; i < n.length; i++ ) {
jurzua
parents:
diff changeset
2019 if ( !hasOwn.call( ns, n[i] ) ) {
jurzua
parents:
diff changeset
2020 ns[ n[i] ] = {
jurzua
parents:
diff changeset
2021 rows: [],
jurzua
parents:
diff changeset
2022 o: null
jurzua
parents:
diff changeset
2023 };
jurzua
parents:
diff changeset
2024 }
jurzua
parents:
diff changeset
2025 ns[ n[i] ].rows.push( i );
jurzua
parents:
diff changeset
2026 }
jurzua
parents:
diff changeset
2027
jurzua
parents:
diff changeset
2028 for ( i = 0; i < o.length; i++ ) {
jurzua
parents:
diff changeset
2029 if ( !hasOwn.call( os, o[i] ) ) {
jurzua
parents:
diff changeset
2030 os[ o[i] ] = {
jurzua
parents:
diff changeset
2031 rows: [],
jurzua
parents:
diff changeset
2032 n: null
jurzua
parents:
diff changeset
2033 };
jurzua
parents:
diff changeset
2034 }
jurzua
parents:
diff changeset
2035 os[ o[i] ].rows.push( i );
jurzua
parents:
diff changeset
2036 }
jurzua
parents:
diff changeset
2037
jurzua
parents:
diff changeset
2038 for ( i in ns ) {
jurzua
parents:
diff changeset
2039 if ( !hasOwn.call( ns, i ) ) {
jurzua
parents:
diff changeset
2040 continue;
jurzua
parents:
diff changeset
2041 }
jurzua
parents:
diff changeset
2042 if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
jurzua
parents:
diff changeset
2043 n[ ns[i].rows[0] ] = {
jurzua
parents:
diff changeset
2044 text: n[ ns[i].rows[0] ],
jurzua
parents:
diff changeset
2045 row: os[i].rows[0]
jurzua
parents:
diff changeset
2046 };
jurzua
parents:
diff changeset
2047 o[ os[i].rows[0] ] = {
jurzua
parents:
diff changeset
2048 text: o[ os[i].rows[0] ],
jurzua
parents:
diff changeset
2049 row: ns[i].rows[0]
jurzua
parents:
diff changeset
2050 };
jurzua
parents:
diff changeset
2051 }
jurzua
parents:
diff changeset
2052 }
jurzua
parents:
diff changeset
2053
jurzua
parents:
diff changeset
2054 for ( i = 0; i < n.length - 1; i++ ) {
jurzua
parents:
diff changeset
2055 if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
jurzua
parents:
diff changeset
2056 n[ i + 1 ] == o[ n[i].row + 1 ] ) {
jurzua
parents:
diff changeset
2057
jurzua
parents:
diff changeset
2058 n[ i + 1 ] = {
jurzua
parents:
diff changeset
2059 text: n[ i + 1 ],
jurzua
parents:
diff changeset
2060 row: n[i].row + 1
jurzua
parents:
diff changeset
2061 };
jurzua
parents:
diff changeset
2062 o[ n[i].row + 1 ] = {
jurzua
parents:
diff changeset
2063 text: o[ n[i].row + 1 ],
jurzua
parents:
diff changeset
2064 row: i + 1
jurzua
parents:
diff changeset
2065 };
jurzua
parents:
diff changeset
2066 }
jurzua
parents:
diff changeset
2067 }
jurzua
parents:
diff changeset
2068
jurzua
parents:
diff changeset
2069 for ( i = n.length - 1; i > 0; i-- ) {
jurzua
parents:
diff changeset
2070 if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
jurzua
parents:
diff changeset
2071 n[ i - 1 ] == o[ n[i].row - 1 ]) {
jurzua
parents:
diff changeset
2072
jurzua
parents:
diff changeset
2073 n[ i - 1 ] = {
jurzua
parents:
diff changeset
2074 text: n[ i - 1 ],
jurzua
parents:
diff changeset
2075 row: n[i].row - 1
jurzua
parents:
diff changeset
2076 };
jurzua
parents:
diff changeset
2077 o[ n[i].row - 1 ] = {
jurzua
parents:
diff changeset
2078 text: o[ n[i].row - 1 ],
jurzua
parents:
diff changeset
2079 row: i - 1
jurzua
parents:
diff changeset
2080 };
jurzua
parents:
diff changeset
2081 }
jurzua
parents:
diff changeset
2082 }
jurzua
parents:
diff changeset
2083
jurzua
parents:
diff changeset
2084 return {
jurzua
parents:
diff changeset
2085 o: o,
jurzua
parents:
diff changeset
2086 n: n
jurzua
parents:
diff changeset
2087 };
jurzua
parents:
diff changeset
2088 }
jurzua
parents:
diff changeset
2089
jurzua
parents:
diff changeset
2090 return function( o, n ) {
jurzua
parents:
diff changeset
2091 o = o.replace( /\s+$/, "" );
jurzua
parents:
diff changeset
2092 n = n.replace( /\s+$/, "" );
jurzua
parents:
diff changeset
2093
jurzua
parents:
diff changeset
2094 var i, pre,
jurzua
parents:
diff changeset
2095 str = "",
jurzua
parents:
diff changeset
2096 out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
jurzua
parents:
diff changeset
2097 oSpace = o.match(/\s+/g),
jurzua
parents:
diff changeset
2098 nSpace = n.match(/\s+/g);
jurzua
parents:
diff changeset
2099
jurzua
parents:
diff changeset
2100 if ( oSpace == null ) {
jurzua
parents:
diff changeset
2101 oSpace = [ " " ];
jurzua
parents:
diff changeset
2102 }
jurzua
parents:
diff changeset
2103 else {
jurzua
parents:
diff changeset
2104 oSpace.push( " " );
jurzua
parents:
diff changeset
2105 }
jurzua
parents:
diff changeset
2106
jurzua
parents:
diff changeset
2107 if ( nSpace == null ) {
jurzua
parents:
diff changeset
2108 nSpace = [ " " ];
jurzua
parents:
diff changeset
2109 }
jurzua
parents:
diff changeset
2110 else {
jurzua
parents:
diff changeset
2111 nSpace.push( " " );
jurzua
parents:
diff changeset
2112 }
jurzua
parents:
diff changeset
2113
jurzua
parents:
diff changeset
2114 if ( out.n.length === 0 ) {
jurzua
parents:
diff changeset
2115 for ( i = 0; i < out.o.length; i++ ) {
jurzua
parents:
diff changeset
2116 str += "<del>" + out.o[i] + oSpace[i] + "</del>";
jurzua
parents:
diff changeset
2117 }
jurzua
parents:
diff changeset
2118 }
jurzua
parents:
diff changeset
2119 else {
jurzua
parents:
diff changeset
2120 if ( out.n[0].text == null ) {
jurzua
parents:
diff changeset
2121 for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
jurzua
parents:
diff changeset
2122 str += "<del>" + out.o[n] + oSpace[n] + "</del>";
jurzua
parents:
diff changeset
2123 }
jurzua
parents:
diff changeset
2124 }
jurzua
parents:
diff changeset
2125
jurzua
parents:
diff changeset
2126 for ( i = 0; i < out.n.length; i++ ) {
jurzua
parents:
diff changeset
2127 if (out.n[i].text == null) {
jurzua
parents:
diff changeset
2128 str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
jurzua
parents:
diff changeset
2129 }
jurzua
parents:
diff changeset
2130 else {
jurzua
parents:
diff changeset
2131 // `pre` initialized at top of scope
jurzua
parents:
diff changeset
2132 pre = "";
jurzua
parents:
diff changeset
2133
jurzua
parents:
diff changeset
2134 for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
jurzua
parents:
diff changeset
2135 pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
jurzua
parents:
diff changeset
2136 }
jurzua
parents:
diff changeset
2137 str += " " + out.n[i].text + nSpace[i] + pre;
jurzua
parents:
diff changeset
2138 }
jurzua
parents:
diff changeset
2139 }
jurzua
parents:
diff changeset
2140 }
jurzua
parents:
diff changeset
2141
jurzua
parents:
diff changeset
2142 return str;
jurzua
parents:
diff changeset
2143 };
jurzua
parents:
diff changeset
2144 }());
jurzua
parents:
diff changeset
2145
jurzua
parents:
diff changeset
2146 // for CommonJS enviroments, export everything
jurzua
parents:
diff changeset
2147 if ( typeof exports !== "undefined" ) {
jurzua
parents:
diff changeset
2148 extend( exports, QUnit );
jurzua
parents:
diff changeset
2149 }
jurzua
parents:
diff changeset
2150
jurzua
parents:
diff changeset
2151 // get at whatever the global object is, like window in browsers
jurzua
parents:
diff changeset
2152 }( (function() {return this;}.call()) ));