Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//Dokumentation unter [[Benutzer:Schnark/js/qunit]] <nowiki>
/*global mediaWiki, QUnit*/
(function ($, mw, libs) {
"use strict";
var tests = {
	bandersnatch: ['Benutzer:Schnark/js/bandersnatch.js', 'Benutzer:Schnark/js/bandersnatch.js/test.js'],
	diff: ['Benutzer:Schnark/js/diff.js/core.js', 'Benutzer:Schnark/js/diff.js/core.js/test.js'],
	link: ['Benutzer:Schnark/js/linkUnlinked.js', 'Benutzer:Schnark/js/linkUnlinked.js/test.js'],
	personendaten: ['Benutzer:Schnark/js/personendaten.js', 'Benutzer:Schnark/js/personendaten.js/test.js'],
	rpc: ['Benutzer:Schnark/js/rpc.js', 'Benutzer:Schnark/js/rpc.js/test.js'],
	search: ['Benutzer:Schnark/js/search++.js', 'Benutzer:Schnark/js/search++.js/test.js'],
	syntaxhighlight: ['Benutzer:Schnark/js/syntaxhighlight.js', 'Benutzer:Schnark/js/syntaxhighlight.js/test.js'],
	template: ['Benutzer:Schnark/js/Template.js', 'Benutzer:Schnark/js/Template.js/test.js'],
	templateeditor: ['Benutzer:Schnark/js/templateEditor.js', 'Benutzer:Schnark/js/templateEditor.js/test.js']
}, modules = {}, running = 0, hasOwn = Object.prototype.hasOwnProperty;

function mockAjaxEnabler () {
	var mockAjax = false, answers = {}, cachedAssert;

	$.ajaxPrefilter(function (_, data) {
		if (mockAjax && data.url.indexOf(mw.util.wikiScript('api')) === 0) {
			return 'simple-mock-qunit';
		}
	});
	$.ajaxTransport('simple-mock-qunit', function (o, data) {
		o.dataTypes = o.dataTypes.filter(function (dt) {
			return dt !== 'simple-mock-qunit';
		});
		var query = typeof data.data === 'string' ? data.data : $.param(data.data);
		return {
			send: function (h, callback) {
				var answer;
				if (query in answers) {
					answer = answers[query].shift();
					if (answers[query].length === 0) {
						delete answers[query];
					}
					callback(200, 'success', {text: answer});
				} else {
					cachedAssert.strictEqual(false, query, 'Missing data for query');
					callback(500, 'error');
				}
			},
			abort: $.noop
		};
	});

	function simpleMock (enable, assert) {
		var q;
		if (!enable) {
			for (q in answers) {
				if (hasOwn.call(answers, q)) {
					assert.strictEqual(q, false, 'Unused query');
				}
			}
		}
		mockAjax = enable;
		answers = {};
		cachedAssert = assert;
		return simpleMock;
	}

	function answerWith (query, data) {
		var q;
		if (data === undefined) {
			for (q in query) {
				if (hasOwn.call(query, q)) {
					answerWith(q, query[q]);
				}
			}
			return;
		}
		answers[query] = Array.isArray(data) ? data : [data];
	}

	simpleMock.answerWith = answerWith;
	return simpleMock;
}

function loadFiles (f, name, callback) {
	var i = 0;
	function loadNext () {
		if (i < f.length) {
			$.getScript(mw.util.wikiScript() + '?' +
				$.param({title: f[i++], action: 'raw', ctype: 'text/javascript'})
			).then(loadNext, function () {
				error(name, f[i - 1] + ' did not load', callback);
			});
		} else {
			callback();
		}
	}
	loadNext();
}

function error (name, text, callback) {
	QUnit.module(name);
	QUnit.test('Error: ' + name, function (assert) {
		assert.expect(1);
		assert.ok(false, text);
	});
	callback();
}

function loadTests (t, callback) {
	var i, test, files, todo = t.length;

	function checkDone () {
		todo--;
		if (todo === 0) {
			callback();
		}
	}

	for (i = 0; i < t.length; i++) {
		test = t[i];
		files = tests[test];
		if (files) {
			loadFiles(files, test, checkDone);
		} else {
			error(test, '(missing)', checkDone);
		}
	}
}

function loadQunit () {
	var version = '2.9.2';
	if (mw.loader.getState('jquery.qunit')) {
		return mw.loader.using('jquery.qunit');
	}
	$('<link>', {
		rel: 'stylesheet',
		type: 'text/css',
		href: 'https://code.jquery.com/qunit/qunit-' + version + '.css'
	}).appendTo('head');
	return $.getScript('https://code.jquery.com/qunit/qunit-' + version + '.js');
}

function init () {
	document.title = 'QUnit-Tests';
	$('#firstHeading').hide();
	$('#mw-content-text').html('<div class="mw-content-ltr"><div id="qunit"></div>' +
		'<div id="qunit-fixture"></div></div>');
	window.QUnit = {
		config: {
			autostart: false,
			requireExpects: true
		}
	};
	loadQunit().then(function () {
		QUnit.moduleDone(function (data) {
			if (data.failed) {
				modules[data.name] = 'error';
			}
			if (modules[data.name] !== 'error') {
				modules[data.name] = 'done';
			}
		});
		QUnit.testStart(function () {
			running++;
		});
		QUnit.testDone(function () {
			setTimeout(function () {
				running--;
			}, 1000);
		});

		loadTests((mw.util.getParamValue('tests') || 'No parameter "tests"').split('|'), function () {
			QUnit.start();
		});
	});
}

function getStatus (log) {
	var module, data = {error: [], done: [], running: running};
	for (module in modules) {
		if (hasOwn.call(modules, module)) {
			data[modules[module]].push(module);
			if (log && modules[module] !== 'done') {
				mw.log.warn(module + ': ' + modules[module]);
			}
		}
	}
	return data;
}

mw.loader.using('mediawiki.util').then(function () {
	if (
		mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' &&
		mw.util.getParamValue('action') === 'qunit'
	) {
		libs.qunit = {};
		libs.qunit.simpleMockAjax = mockAjaxEnabler();
		libs.qunit.getQunitStatus = getStatus;
		$(init);
	}
});

})(jQuery, mediaWiki, mediaWiki.libs);
//</nowiki>