summaryrefslogtreecommitdiff
path: root/tests/qunit/data/testrunner.js
blob: fdd3116b07cef270e0ddca37179b84f24dcba864 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
( function ( $, mw, QUnit, undefined ) {
"use strict";

var mwTestIgnore, mwTester, addons;

/**
 * Add bogus to url to prevent IE crazy caching
 *
 * @param value {String} a relative path (eg. 'data/defineTestCallback.js'
 * or 'data/test.php?foo=bar').
 * @return {String} Such as 'data/defineTestCallback.js?131031765087663960'
 */
QUnit.fixurl = function (value) {
	return value + (/\?/.test( value ) ? '&' : '?')
		+ String( new Date().getTime() )
		+ String( parseInt( Math.random()*100000, 10 ) );
};

/**
 * Configuration
 */
QUnit.config.testTimeout = 5000;

/**
 * MediaWiki debug mode
 */
QUnit.config.urlConfig.push( 'debug' );

/**
 *  Load TestSwarm agent
 */
if ( QUnit.urlParams.swarmURL  ) {
	document.write( "<scr" + "ipt src='" + QUnit.fixurl( mw.config.get( 'wgScriptPath' )
		+ '/tests/qunit/data/testwarm.inject.js' ) + "'></scr" + "ipt>" );
}

/**
 * CompletenessTest
 */
// Adds toggle checkbox to header
QUnit.config.urlConfig.push( 'completenesstest' );

// Initiate when enabled
if ( QUnit.urlParams.completenesstest ) {

	// Return true to ignore
	mwTestIgnore = function ( val, tester, funcPath ) {

		// Don't record methods of the properties of constructors,
		// to avoid getting into a loop (prototype.constructor.prototype..).
		// Since we're therefor skipping any injection for
		// "new mw.Foo()", manually set it to true here.
		if ( val instanceof mw.Map ) {
			tester.methodCallTracker.Map = true;
			return true;
		}
		if ( val instanceof mw.Title ) {
			tester.methodCallTracker.Title = true;
			return true;
		}

		// Don't record methods of the properties of a jQuery object
		if ( val instanceof $ ) {
			return true;
		}

		return false;
	};

	mwTester = new CompletenessTest( mw, mwTestIgnore );
}

/**
 * Test environment recommended for all QUnit test modules
 */
// Whether to log environment changes to the console
QUnit.config.urlConfig.push( 'mwlogenv' );

/**
 * Reset mw.config to a fresh copy of the live config for each test();
 * @param override {Object} [optional]
 * @example:
 * <code>
 * module( .., newMwEnvironment() );
 *
 * test( .., function () {
 *     mw.config.set( 'foo', 'bar' ); // just for this test
 * } );
 *
 * test( .., function () {
 *     mw.config.get( 'foo' ); // doesn't exist
 * } );
 *
 *
 * module( .., newMwEnvironment({ quux: 'corge' }) );
 *
 * test( .., function () {
 *     mw.config.get( 'quux' ); // "corge"
 *     mw.config.set( 'quux', "grault" );
 * } );
 *
 * test( .., function () {
 *     mw.config.get( 'quux' ); // "corge"
 * } );
 * </code>
 */
QUnit.newMwEnvironment = ( function () {
	var liveConfig, freshConfigCopy, log;

	liveConfig = mw.config.values;

	freshConfigCopy = function ( custom ) {
		// "deep=true" is important here.
		// Otherwise we just create a new object with values referring to live config.
		// e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
		// but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
		// was passed by reference in $.extend's loop.
		return $.extend({}, liveConfig, custom, /*deep=*/true );
	};

	log = QUnit.urlParams.mwlogenv ? mw.log : function () {};

	return function ( override ) {
		override = override || {};

		return {
			setup: function () {
				log( 'MwEnvironment> SETUP    for "' + QUnit.config.current.module
					+ ': ' + QUnit.config.current.testName + '"' );
				// Greetings, mock configuration!
				mw.config.values = freshConfigCopy( override );
			},

			teardown: function () {
				log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
					+ ': ' + QUnit.config.current.testName + '"' );
				// Farewell, mock configuration!
				mw.config.values = liveConfig;
			}
		};
	};
}() );

/**
 * Add-on assertion helpers
 */
// Define the add-ons
addons = {

	// Expect boolean true
	assertTrue: function ( actual, message ) {
		strictEqual( actual, true, message );
	},

	// Expect boolean false
	assertFalse: function ( actual, message ) {
		strictEqual( actual, false, message );
	},

	// Expect numerical value less than X
	lt: function ( actual, expected, message ) {
		QUnit.push( actual < expected, actual, 'less than ' + expected, message );
	},

	// Expect numerical value less than or equal to X
	ltOrEq: function ( actual, expected, message ) {
		QUnit.push( actual <= expected, actual, 'less than or equal to ' + expected, message );
	},

	// Expect numerical value greater than X
	gt: function ( actual, expected, message ) {
		QUnit.push( actual > expected, actual, 'greater than ' + expected, message );
	},

	// Expect numerical value greater than or equal to X
	gtOrEq: function ( actual, expected, message ) {
		QUnit.push( actual >= expected, actual, 'greater than or equal to ' + expected, message );
	},

	// Backwards compatible with new verions of QUnit
	equals: window.equal,
	same: window.deepEqual
};

$.extend( QUnit, addons );
$.extend( window, addons );

})( jQuery, mediaWiki, QUnit );