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
//<nowiki>
/*global mediaWiki, QUnit*/
(function ($, mw, s, simpleMockAjax) {
"use strict";

function searchTest (name, query, result, ajax, assert, wait) {
	var cont, d;

	cont = assert.async();
	d = wait || $.Deferred().resolve();

	function onEnd () {
		simpleMockAjax(false, assert);
		cont();
	}

	d = d.then(function () {
		simpleMockAjax(true, assert).answerWith(ajax);
		return s.queryByString(query);
	});
	if (result) {
		d = d.then(function (r) {
			assert.deepEqual(r, result, name);
		});
	} else {
		d = d.then(null, function () {
			assert.ok(true, name);
		});
	}
	return d.then(onEnd, onEnd);
}

QUnit.module('search++');

QUnit.test('Umgebung', function (assert) {
	assert.expect(6);
	assert.ok(s, 'libs["search++"] vorhanden');
	assert.ok(s.addPropertyGetter, 'addPropertyGetter vorhanden');
	assert.ok(s.addSearchEngine, 'addSearchEngine vorhanden');
	assert.ok(s.getHelp, 'getHelp vorhanden');
	assert.ok(s.doQuery, 'doQuery vorhanden');
	assert.ok(s.queryByString, 'queryByString vorhanden');
});

QUnit.test('Falsche Anfragen', function (assert) {
	assert.expect(3);
	searchTest('Falsche Syntax', 'prefix("Foo") ODER prefix("Bar")', false, {}, assert);
	searchTest('Fehlende Funktion', 'praefix("Foo")', false, {}, assert);
	searchTest('Kein Erzeuger', 'redir()', false, {}, assert);
});

QUnit.test('Foo und Bar', function (assert) {
	var wait;
	assert.expect(8);
	wait = searchTest('Einfache Anfrage', 'prefix("Foo")', ['Foo', 'Foobar'], {
		'apprefix=Foo&aplimit=max&action=query&list=allpages&format=json&formatversion=2&continue=':
			'{"query":{"allpages":[{"ns":0,"title":"Foo"},{"ns":0,"title":"Foobar"}]}}'
	}, assert);
	wait = searchTest('Gecachte Anfrage', 'prefix("Foo")', ['Foo', 'Foobar'], {}, assert, wait);
	wait = searchTest('Anfrage mit continue', 'prefix("Bar")', ['Bar', 'Barfoo'], {
		'apprefix=Bar&aplimit=max&action=query&list=allpages&format=json&formatversion=2&continue=':
			'{"query":{"allpages":[{"ns":0,"title":"Bar"}]},"continue":{"apcontinue":"Barf","continue":"-||"}}',
		'apprefix=Bar&aplimit=max&action=query&list=allpages&format=json&formatversion=2&continue=-%7C%7C&apcontinue=Barf':
			'{"query":{"allpages":[{"ns":0,"title":"Barfoo"}]}}'
	}, assert, wait);
	wait = searchTest('Doppelte gecachte Anfrage mit Sortierung', 'prefix("Foo") OR prefix("Bar") SORT title()',
		['Bar', 'Barfoo', 'Foo', 'Foobar'], {}, assert, wait);
	wait = searchTest('Anfrage mit Selektierung', 'prefix("Foo") AND minSize(50)', ['Foobar'], {
		'action=query&prop=info&titles=Foo%7CFoobar&format=json&formatversion=2&continue=':
			'{"query":{"pages":[{"pageid":321,"ns":0,"title":"Foo","length":20},' +
				'{"pageid":789,"ns":0,"title":"Foobar","length":200}]}}'
	}, assert, wait);
	wait = searchTest('Anfrage mit Sortierung', 'prefix("Foo") SORT maxSize()', ['Foobar', 'Foo'], {}, assert, wait);
	wait = searchTest('Anfrage mit Abbildung', 'prefix("Bar") MAP iw("en")', [':en:BAR'], {
		'lllimit=max&action=query&prop=langlinks&titles=Bar%7CBarfoo&format=json&formatversion=2&continue=':
			'{"query":{"pages":[{"pageid":123,"ns":0,"title":"Bar","langlinks":[' +
				'{"lang":"fr","title":"Bár"},{"lang":"en","title":"BAR"}]},{"pageid":987,"ns":0,"title":"Barfoo"}]}}'
	}, assert, wait);
	searchTest('Anfrage mit Ausschluss', 'prefix("Bar") NOT iw("fr")', ['Barfoo'], {}, assert, wait);
});

QUnit.test('Viele Titel', function (assert) {
	assert.expect(3);
	var viele = [], gerade = [], weiter = [], i, q1, q2, a1, a2, id, from, to, wait;
	q1 = 'redirects=true&action=query&prop=&titles=';
	q2 = q1;
	a1 = {
		query: {
			redirects: [],
			pages: []
		}
	};
	a2 = $.extend(true, {}, a1);
	for (i = 0; i < 100; i++) {
		id = 100 * i;
		from = String(i);
		to = i % 2 === 0 ? 'a' + i : from;

		if (from !== to) {
			gerade.push(from);
		}
		viele.push(from);
		weiter.push(to);
		if (i < 50) {
			q1 += (i === 0 ? '' : '%7C') + i;
			if (from !== to) {
				a1.query.redirects.push({from: from, to: to});
			}
			a1.query.pages.push({
				ns: 0, pageid: id, title: to
			});
		} else {
			q2 += (i === 50 ? '' : '%7C') + i;
			if (from !== to) {
				a2.query.redirects.push({from: from, to: to});
			}
			a2.query.pages.push({
				ns: 0, pageid: id, title: to
			});
		}
	}
	q1 += '&format=json&formatversion=2&continue=';
	q2 += '&format=json&formatversion=2&continue=';
	a1 = JSON.stringify(a1);
	a2 = JSON.stringify(a2);
	i = {};
	i[q1] = a1;
	i[q2] = a2;
	s.addSearchEngine('qunit', {
		get: function () {
			return $.Deferred().resolve(viele).promise();
		}
	});
	wait = searchTest('Einfache Anfrage', 'qunit()', viele, {}, assert);
	wait = searchTest('Einschränken auf Weiterleitungen', 'qunit() AND redir()', gerade, i, assert, wait);
	searchTest('Abbildung auf Weiterleitungen', 'qunit() MAP redir()', weiter, {}, assert, wait);
});

QUnit.test('Cattree', function (assert) {
	assert.expect(1);
	searchTest('Cattree', 'cattree("Kategorie:1")', ['A', 'B', 'C', 'D'], {
		//jscs:disable maximumLineLength
		'cmtype=subcat&cmtitle=Kategorie%3A1&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[{"ns":14,"title":"Kategorie:2"}]}}',
		'cmtype=subcat&cmtitle=Kategorie%3A2&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[{"ns":14,"title":"Kategorie:1"},{"ns":14,"title":"Kategorie:3"}]}}',
		'cmtype=subcat&cmtitle=Kategorie%3A3&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[]}}',
		'cmtype=page&cmtitle=Kategorie%3A1&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[{"ns":0,"title":"A"}]}}',
		'cmtype=page&cmtitle=Kategorie%3A2&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[{"ns":0,"title":"A"},{"ns":0,"title":"B"},{"ns":0,"title":"C"}]}}',
		'cmtype=page&cmtitle=Kategorie%3A3&cmlimit=max&action=query&list=categorymembers&format=json&formatversion=2&continue=':
			'{"query":{"categorymembers":[{"ns":0,"title":"D"}]}}'
		//jscs:enable maximumLineLength
	}, assert);
});

})(jQuery, mediaWiki, mediaWiki.libs['search++'], mediaWiki.libs.qunit.simpleMockAjax);
//</nowiki>