Benutzer:Schnark/js/diff.js/core.js/test.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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, diff) {
"use strict";
var randomTestCount = 100;

function random (from, to) {
	return from + Math.floor(Math.random() * (to + 1 - from));
}

function getChar () {
	return String.fromCharCode(random(97, 122));
}
function getWord () {
	var len = random(1, 10), chars = [], i;
	for (i = 0; i < len; i++) {
		chars.push(getChar());
	}
	return chars.join('');
}
function getClause () {
	var len = random(1, 10), words = [], i;
	for (i = 0; i < len; i++) {
		words.push(getWord());
	}
	return words.join(' ');
}
function getSentence () {
	var len = random(1, 5), clauses = [], i;
	for (i = 0; i < len; i++) {
		clauses.push(getClause());
	}
	return clauses.join(', ') + '.';
}
function varyWord (word) {
	return $.map(word.split(''), function (c) {
		switch (random(0, 30)) {
		case 0: case 1:
			return null;
		case 2:
			return [c, getChar()];
		case 3:
			return [getChar(), c];
		case 4: case 5:
			return getChar();
		default:
			return c;
		}
	}).join('');
}
function varyClause (clause) {
	return $.map(clause.split(' '), function (w) {
		switch (random(0, 30)) {
		case 0: case 1:
			return null;
		case 2:
			return [w, getWord()];
		case 3:
			return [getWord(), w];
		case 4: case 5:
			return varyWord(w);
		default:
			return w;
		}
	}).join(' ');
}
function varySentence (sentence) {
	var clauses = sentence.slice(0, -1).split(', '), i;
	for (i = 0; i < clauses.length; i++) {
		clauses[i] = [clauses[i], random(i - 1, i + 1)];
	}
	clauses.sort(function (a, b) {
		return a[1] - b[1];
	});
	return $.map(clauses, function (c) {
		c = c[0];
		switch (random(0, 10)) {
		case 0: case 1:
			return null;
		case 2:
			return [c, getClause()];
		case 3:
			return [getClause(), c];
		case 4: case 5:
			return varyClause(c);
		default:
			return c;
		}
	}).join(', ') + '.';
}

function randomInput1 () {
	return [getSentence(), getSentence()];
}
function randomInput2 () {
	var sentence = getSentence();
	return [sentence, varySentence(sentence)];
}
function randomTest (input, text, assert) {
	var d = diff.diff(input[0], input[1]), o = '', n = '', i;
	for (i = 0; i < d.length; i++) {
		switch (d[i][1]) {
		case '=':
			o += d[i][0];
			n += d[i][0];
			break;
		case '+':
		case '.':
			n += d[i][0];
			break;
		case '-':
		case ':':
			o += d[i][0];
			break;
		}
	}
	assert.strictEqual(o, input[0], text + 'Alter Text wieder hergestellt');
	assert.strictEqual(n, input[1], text + 'Neuer Text wieder hergestellt');
}
function randomTest1 (text, assert) {
	randomTest(randomInput1(), text, assert);
}
function randomTest2 (text, assert) {
	randomTest(randomInput2(), text, assert);
}

function mapTest (Map, assert) {
	var map = new Map(), data = [];
	assert.expect(7);
	assert.ok(map.size === 0, 'neue Map ist leer');
	map.set('foo', {x: 'FOO', y: 'FOO'});
	assert.ok(map.size !== 0, 'Map nicht mehr leer');
	assert.ok(map.has('foo'), 'Schlüssel vorhanden');
	assert.deepEqual(map.get('foo'), {x: 'FOO', y: 'FOO'}, 'korrekter Wert');
	map.set('bar', {x: 'BAR', y: 'BAR'});
	map.set('__proto__', {x: 'PROTO', y: 'PROTO'});
	assert.deepEqual(map.get('__proto__'), {x: 'PROTO', y: 'PROTO'}, 'korrekter Wert für speziellen Schlüssel');
	map.forEach(function (val, key) {
		data.push(key + '=' + val.x);
	});
	data.sort();
	data = data.join(',');
	assert.strictEqual(data, '__proto__=PROTO,bar=BAR,foo=FOO', 'forEach');
	assert.ok(map.size !== 0, 'Map immer noch nicht leer');
}

function cssTest (html, assert) {
	var $div = $('<div>').html(html).appendTo('#qunit-fixture'),
		css = mw.util.addCSS(diff.getCSS()),
		foundColor;

	$div.find('.enhanced-diff-moved-to.enhanced-diff-block-0').find('ins, del, span').addBack().each(function () {
		var $this = $(this),
			color = $this.css($this.is('del, ins') ? 'borderTopColor' : 'backgroundColor');
		//console.log(color);
		if (foundColor === undefined) {
			foundColor = color;
		} else if (foundColor !== color) {
			foundColor = false;
		}
	});
	assert.ok(foundColor, 'Alle im verschobenen Block haben gleiche Farbe');

	$(css.ownerNode).remove(); //aufräumen
}

QUnit.module('Diff');

QUnit.test('Umgebung', function (assert) {
	var diffFromHook;
	mw.hook('userjs.load-script.diff-core').add(function (d) {
		diffFromHook = d;
	});
	assert.expect(7);
	assert.ok(diff.getCSS, 'getCSS definiert');
	assert.ok(diff.diff, 'diff definiert');
	assert.ok(diff.htmlDiff, 'htmlDiff definiert');
	assert.ok(diff.config.get, 'config.get definiert');
	assert.ok(diff.config.set, 'config.set definiert');
	assert.ok(diff.addEvents, 'addEvents definiert');
	assert.strictEqual(diff, diffFromHook, 'Hook liefert korrektes Objekt');
});
QUnit.test('Longest increasing subsequence', function (assert) {
	assert.expect(4);
	//lis(folge, laengen) = teilfolge
	assert.deepEqual(diff.lis([1, 2, 3, 4, 5], [3, 2, 4, 5, 1]), [1, 2, 3, 4, 5], 'Aufsteigende Folge');
	assert.deepEqual(diff.lis([5, 4, 3, 2, 1], [3, 2, 4, 5, 1]), [2], 'Fallende Folge');
	assert.deepEqual(diff.lis([1, 2, 4, 5, 3], [3, 2, 4, 5, 1]), [1, 2, 4, 5], 'Realistische Folge - ein kurzer Block');
	assert.deepEqual(diff.lis([1, 2, 4, 5, 3], [3, 2, 1, 1, 4]), [1, 2, 3], 'Realistische Folge - zwei kurze Blöcke');
});
QUnit.test('SimplePolyfillMap', function (assert) {
	mapTest(diff.SimplePolyfillMap, assert);
});
QUnit.test('SimpleMap', function (assert) {
	mapTest(diff.SimpleMap, assert);
});
QUnit.test('Konfigurationsparameter', function (assert) {
	var orig = diff.config.get();
	assert.expect(4);
	assert.strictEqual(diff.config.get('indicateMoves'), orig.indicateMoves, 'Ein Parameter geholt');
	assert.deepEqual(
		diff.config.get(['indicateMoves', 'tooShort']),
		{indicateMoves: orig.indicateMoves, tooShort: orig.tooShort},
		'Zwei Parameter geholt'
	);
	diff.config.set('indicateMoves', 5);
	assert.strictEqual(diff.config.get('indicateMoves'), 5, 'Ein Parameter gesetzt');
	diff.config.set({indicateMoves: 4, tooShort: 3});
	assert.deepEqual(diff.config.get(['indicateMoves', 'tooShort']), {indicateMoves: 4, tooShort: 3},
		'Zwei Parameter gesetzt');
	diff.config.set(orig);
});
QUnit.test('Einfache Fälle', function (assert) {
	assert.expect(3);
	assert.deepEqual(diff.diff('asdf jklö', 'asdf jklö'), [
		['asdf jklö', '=']
	], 'Identisch');
	assert.deepEqual(diff.diff('asdf', 'asdf jklö'), [
		['asdf', '='],
		[' jklö', '+']
	], 'Angehängt');
	assert.deepEqual(diff.diff('asdf jklö', 'jklö'), [
		['asdf ', '-'],
		['jklö', '=']
	], 'Entfernt');
});
//jscs:disable maximumLineLength
QUnit.test('Einfache Verschiebungen', function (assert) {
	var o = 'asdf jklö foobarbaz fdsa FDSA sdaf ölkj', n = 'asdf jklö fdsa FDSA sdaf foobarbaz ölkj', $div;
	assert.expect(5);
	assert.deepEqual(diff.diff(o, n), [
		['asdf jklö ', '='],
		['foobarbaz ', ':', 0],
		['fdsa FDSA sdaf ', '='],
		['foobarbaz ', '.', 0],
		['ölkj', '=']
	], 'Diff');
	assert.strictEqual(diff.htmlDiff(o, n), '<span class="enhanced-diff-equal">asdf jklö </span><a class="enhanced-diff-moved-from enhanced-diff-block-0" href="#moved-block-0" title="foobarbaz ">^</a><span class="enhanced-diff-equal">fdsa FDSA sdaf </span><span class="enhanced-diff-moved-to enhanced-diff-block-0" id="moved-block-0">foobarbaz </span><span class="enhanced-diff-equal">ölkj</span>', 'HTML - indicateMoves === 1');
	diff.config.set('indicateMoves', 0);
	assert.strictEqual(diff.htmlDiff(o, n), '<span class="enhanced-diff-equal">asdf jklö </span><del class="enhanced-diff-del">foobarbaz </del><span class="enhanced-diff-equal">fdsa FDSA sdaf </span><ins class="enhanced-diff-ins">foobarbaz </ins><span class="enhanced-diff-equal">ölkj</span>', 'HTML - indicateMoves === 0');
	diff.config.set('indicateMoves', 2);
	assert.strictEqual(diff.htmlDiff(o, n), '<span class="enhanced-diff-equal">asdf jklö </span><del class="enhanced-diff-moved-del">foobarbaz </del><span class="enhanced-diff-equal">fdsa FDSA sdaf </span><ins class="enhanced-diff-moved-ins">foobarbaz </ins><span class="enhanced-diff-equal">ölkj</span>', 'HTML - indicateMoves === 2');
	diff.config.set('indicateMoves', 1);
	$div = $('<div>').html(diff.htmlDiff(o, n));
	diff.addEvents($div);
	$div.find('#moved-block-0').trigger('mouseover');
	assert.strictEqual($div.find('.enhanced-diff-moved-hover').length, 2, 'Hover');
});
QUnit.test('Völlig zufälliger Text', function (assert) {
	var i;
	assert.expect(randomTestCount * 2);
	for (i = 1; i <= randomTestCount; i++) {
		randomTest1('', assert);
	}
});
QUnit.test('Zufälliger Text', function (assert) {
	var i;
	assert.expect(randomTestCount * 2);
	for (i = 1; i <= randomTestCount; i++) {
		randomTest2('', assert);
	}
});
QUnit.test('Verschiedene Sprachen', function (assert) {
	assert.expect(3);
	//https://el.wikipedia.org/w/index.php?title=%CE%A3%CF%80%CF%8D%CF%81%CE%BF%CF%82_%CE%9C%CE%BF%CF%85%CF%83%CF%84%CE%B1%CE%BA%CE%BB%CE%AE%CF%82&curid=90006&diff=4769172&oldid=4757516
	assert.deepEqual(diff.diff(
		'Μετά το θάνατό του, δόθηκε τιμητικά το όνομά του στο στρατόπεδο-κέντρο νεοσυλλέκτων του Μεσολογγίου (Σύνταγμα Πεζικού). Στο όνομά του επίσης υπάρχει οδός στην Πυλαία Θεσσαλονίκης και στο Ίλιον της Αθήνας.',
		'Μετά το θάνατό του, δόθηκε τιμητικά το όνομά του στο στρατόπεδο-κέντρο νεοσυλλέκτων του Μεσολογγίου (Σύνταγμα Πεζικού). Προτομή του έχει ανεγερθεί στα πρώην κρατητήρια του [[ΕΑΤ-ΕΣΑ]] (σήμερα πάρκο Ελευθερίας) στην Αθήνα. Επίσης στο όνομά του υπάρχουν οδοί στην [[Πυλαία Θεσσαλονίκης]], στην [[Καλαμαριά]] ,στην [[Ερμούπολη]], στα [[Χανιά]] και το [[Ηράκλειο Κρήτης]], στο [[Ίλιον]], στη [[Λυκόβρυση]] και στο [[Αιγάλεω]] της Αθήνας.'
	), [
		['Μετά το θάνατό του, δόθηκε τιμητικά το όνομά του στο στρατόπεδο-κέντρο νεοσυλλέκτων του Μεσολογγίου (Σύνταγμα Πεζικού). ', '='],
		['Στο', '-'],
		['Προτομή του έχει ανεγερθεί στα πρώην κρατητήρια του [[ΕΑΤ-ΕΣΑ]] (σήμερα πάρκο Ελευθερίας) στην Αθήνα. Επίσης στο', '+'],
		[' όνομά του ', '='],
		['επίσης ', '-'],
		['υπάρχ', '='],
		['ει', '-'],
		['ουν', '+'],
		[' οδ', '='],
		['ός', '-'],
		['οί', '+'],
		[' στην ', '='],
		['[[', '+'],
		['Πυλαία Θεσσαλονίκης', '='],
		[']], στην [[Καλαμαριά]] ,στην [[Ερμούπολη]], στα [[Χανιά]]', '+'],
		[' και ', '='],
		['το [[Ηράκλειο Κρήτης]], ', '+'],
		['στο ', '='],
		['[[', '+'],
		['Ίλιον', '='],
		[']], στη [[Λυκόβρυση]] και στο [[Αιγάλεω]]', '+'],
		[' της Αθήνας.', '=']
	], 'Griechisch');
	//https://hi.wikipedia.org/w/index.php?title=%E0%A4%A6%E0%A5%88%E0%A4%B2%E0%A5%87%E0%A4%96_%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A4%BE&curid=59502&diff=2387810&oldid=2368462
	assert.deepEqual(diff.diff(
		'\'\'\'दैलेख\'\'\' [[नेपाल]] के [[भेरी अंचल]] का एक [[जिला]] है। दैलेख [[नेपाल]] का मध्य पश्चिमांचल विकास क्षेत्र व [[भेरी अंचल]]का एक जिला है। यह एक विकट [[पहाड|पहाडी]] जिलोंकी श्रेणी मे लिया जाता है। इस जिलेका नक्शा त्रिकोण आकारका है। यहांकी सबसे उंची चोटी "महाबुलेक" है। यहां का सबसे कम उचाईंवाला स्थान "तल्लो डुंगेश्वर" नामक स्थान है। यह जिलेका सिमाना पूर्व में [[भेरी अंचल]]का [[जाजरकोट जिला]] पश्चिममें [[सेती अंचल]]का [[अछाम जिला]] दक्षिणमें भेरी अंचलका [[सुर्खेत जिला]] उत्तरमें [[कर्णाली अंचल]]का [[कालीकोट जिला]]के साथ जुडा हुआ है। इस जिले की भौगोलीक बनावटको मुख्यतया तिन हिस्सों में बांटा गया है। ',
		'\'\'\'दैलेख जिला\'\'\' [[नेपाल]] के [[भेरी अंचल]] का एक [[जिला]] है। दैलेख [[नेपाल]] के मध्य पश्चिमांचल विकास क्षेत्र व [[भेरी अंचल]] का एक जिला है। यह एक विकट [[पहाड़ी]] जिलों की श्रेणी मे गिना जाता है। इस जिले की आकृति त्रिभुजाकार है। यहां की सबसे उंची चोटी "महाबुलेक" और सबसे कम उचाईंवाला स्थान "तल्लो डुंगेश्वर" नामक स्थान है। इस जिले की सीमायें पूर्व में [[भेरी अंचल]] के [[जाजरकोट जिला]], पश्चिम में [[सेती अंचल]] के [[अछाम जिला]] दक्षिण में भेरी अंचल के [[सुर्खेत जिला]] और उत्तर में [[कर्णाली अंचल]] के [[कालीकोट जिला|कालिकोट जिले]] के साथ जुड़ी हुई हैं। इस जिले की भौगोलिक बनावट को मुख्यतया तीन हिस्सों में बांटा जाता है। '
	), [
		['\'\'\'दैलेख', '='],
		[' जिला', '+'],
		['\'\'\' [[नेपाल]] के [[भेरी अंचल]] का एक [[जिला]] है। दैलेख [[नेपाल]] क', '='],
		['ा', '-'],
		['े', '+'],
		[' मध्य पश्चिमांचल विकास क्षेत्र व [[भेरी अंचल]]', '='],
		[' ', '+'],
		['का एक जिला है। यह एक विकट [[पहाड', '='],
		['|पहाड', '-'],
		['़', '+'],
		['ी]] जिलों', '='],
		[' ', '+'],
		['की श्रेणी मे ', '='],
		['लिय', '-'],
		['गिन', '+'],
		['ा जाता है। इस जिले', '='],
		['का नक्शा', '-'],
		[' की आकृति', '+'],
		[' त्रि', '='],
		['कोण आक', '-'],
		['भुजाक', '+'],
		['ार', '='],
		['का', '-'],
		[' है। यहां', '='],
		[' ', '+'],
		['की सबसे उंची चोटी "महाबुलेक" ', '='],
		['है। यहां का', '-'],
		['और', '+'],
		[' सबसे कम उचाईंवाला स्थान "तल्लो डुंगेश्वर" नामक स्थान है। ', '='],
		['यह', '-'],
		['इस', '+'],
		[' जिले', '='],
		[' ', '+'],
		['क', '='],
		['ा', '-'],
		['ी', '+'],
		[' स', '='],
		['ि', '-'],
		['ी', '+'],
		['मा', '='],
		['ना', '-'],
		['यें', '+'],
		[' पूर्व में [[भेरी अंचल]]', '='],
		['का', '-'],
		[' के', '+'],
		[' [[जाजरकोट जिला]]', '='],
		[',', '+'],
		[' पश्चिम', '='],
		[' ', '+'],
		['में [[सेती अंचल]]', '='],
		['का', '-'],
		[' के', '+'],
		[' [[अछाम जिला]] दक्षिण', '='],
		[' ', '+'],
		['में भेरी अंचल', '='],
		[' ', '+'],
		['क', '='],
		['ा', '-'],
		['े', '+'],
		[' [[सुर्खेत जिला]]', '='],
		[' और', '+'],
		[' उत्तर', '='],
		[' ', '+'],
		['में [[कर्णाली अंचल]]', '='],
		['का', '-'],
		[' के', '+'],
		[' [[कालीकोट जिला', '='],
		['|कालिकोट जिले', '+'],
		[']]', '='],
		[' ', '+'],
		['के साथ जुड', '='],
		['ा', '-'],
		['़ी', '+'],
		[' हु', '='],
		['आ', '-'],
		['ई', '+'],
		[' है', '='],
		['ं', '+'],
		['। इस जिले की भौगोल', '='],
		['ी', '-'],
		['ि', '+'],
		['क बनावट', '='],
		[' ', '+'],
		['को मुख्यतया त', '='],
		['ि', '-'],
		['ी', '+'],
		['न हिस्सों में बांटा ', '='],
		['गया', '-'],
		['जाता', '+'],
		[' है। ', '=']
	], 'Devanagari');
	//https://ja.wikipedia.org/w/index.php?title=%E6%AE%8B%E9%9F%BF%E3%81%AE%E3%83%86%E3%83%AD%E3%83%AB&curid=2953422&diff=52379538&oldid=52377459
	assert.deepEqual(diff.diff(
		'雪が降る青森の核燃料再処理施設で、ある二人の人物によってプルトニウムが強奪される。その一人は、施設の床にスプレーで「VON」という謎のメッセージを書き残しもう一人とともに施設を脱出、姿を消す。\nそれから半年後。夏休み前の暑い日、\'\'\'九重新(ここのえ・あらた)\'\'\'と\'\'\'久見冬二(ひさみ・とうじ)\'\'\'がとある高校に転入してくる。周りの注目に目もくれず、二人はある計画を進めようとしていた。一方で二人は他の女子生徒からいじめられていた\'\'\'三島リサ\'\'\'に心を奪われる。リサは彼らが幼いころに脱出した施設に残してきた少女に面影が似ていたのだ。そして、リサもまた新の氷のような瞳と冬二の太陽のような笑顔を心に焼き付かせていた。',
		'青森の核燃料再処理施設で、ある二人の人物によってプルトニウムが強奪される。その一人は、施設の床にスプレーで「VON」という謎のメッセージを書き残し、もう一人とともに施設を脱出する。\nそれから半年後。夏休み前の暑い日、\'\'\'九重 新\'\'\'と\'\'\'久見 冬二\'\'\'がとある高校に転入してくる。周りの注目に目もくれず、二人はある計画を進めようとしていた。他の女子生徒からいじめられていた、施設に残してきた幼馴染に似た少女\'\'\'三島リサ\'\'\'に、二人は心を奪われる。'
	), [
		['雪が降る', '-'],
		['青森の核燃料再処理施設で、ある二人の人物によってプルトニウムが強奪される。その一人は、施設の床にスプレーで「VON」という謎のメッセージを書き残し', '='],
		['、', '+'],
		['もう一人とともに施設を脱出', '='],
		['、姿を消す', '-'],
		['する', '+'],
		['。\nそれから半年後。夏休み前の暑い日、\'\'\'', '='],
		['九重新(ここのえ・あらた)', '-'],
		['九重 新', '+'],
		['\'\'\'と\'\'\'久見', '='],
		[' ', '+'],
		['冬二', '='],
		['(ひさみ・とうじ)', '-'],
		['\'\'\'がとある高校に転入してくる。周りの注目に目もくれず、二人はある計画を進めようとしていた。', '='],
		['一方で二人は', '-'],
		['他の女子生徒からいじめられていた', '='],
		['、施設に残してきた幼馴染に似た少女', '+'],
		['\'\'\'三島リサ\'\'\'', '='],
		['に心を奪われる。リサは彼らが幼いころに脱出した施設に残してきた少女に面影が似ていたのだ。そして、リサもまた新の氷のような瞳と冬二の太陽のような笑顔を心に焼き付かせていた', '-'],
		['に、二人は心を奪われる', '+'],
		['。', '=']
	], 'Japanisch');
});
QUnit.test('Gleichlautende Verschiebungen', function (assert) {
	assert.expect(1);
	var o = 'quick brown fox jumped over lazy dog\n\ndog jumped over quick brown lazy fox',
		n = 'dog jumped over quick brown lazy fox\n\nquick brown fox jumped over lazy dog';
	assert.deepEqual(diff.diff(o, n), [ //may change at any time if it is at least a bit sensible
		['quick brown ', ':', 0],
		['fox', '-'],
		['dog', '+'],
		[' jumped over ', '='],
		['quick brown ', '.', 0],
		['lazy ', '='],
		['dog', '-'],
		['fox', '+'],
		['\n\n', '='],
		['dog', '-'],
		['quick brown fox', '+'],
		[' jumped over ', '='],
		['quick brown ', '-'],
		['lazy ', '='],
		['fox', '-'],
		['dog', '+']
	], 'Diff');
});
QUnit.test('Viele Verschiebungen hintereinander', function (assert) {
	assert.expect(3);
	var o = 'außenaußen, verschobenen - Verschoben - VERSCHOBEN, AußenAußen, AUSSENAUSSEN, AuSSeNAuSSeN, aUßEnaUßEn, AußeNAußeN, hhiinntteenn, Hhiinntteenn',
		n = 'außenaußen; AußenAußen; AUSSENAUSSEN; AuSSeNAuSSeN; aUßEnaUßEn; verschobenen + Verschoben + VERSCHOBEN; AußeNAußeN; Hhiinntteenn; hhiinntteenn';
	assert.deepEqual(diff.diff(o, n), [
		['außenaußen', '='],
		[',', '-'],
		[' verschobenen ', ':', 0],
		['-', '-'],
		[' Verschoben ', ':', 1],
		['-', '-'],
		[' VERSCHOBEN', ':', 2],
		[',', '-'],
		[';', '+'],
		[' AußenAußen', '='],
		[',', '-'],
		[';', '+'],
		[' AUSSENAUSSEN', '='],
		[',', '-'],
		[';', '+'],
		[' AuSSeNAuSSeN', '='],
		[',', '-'],
		[';', '+'],
		[' aUßEnaUßEn', '='],
		[',', '-'],
		[';', '+'],
		[' verschobenen ', '.', 0],
		['+', '+'],
		[' Verschoben ', '.', 1],
		['+', '+'],
		[' VERSCHOBEN', '.', 2],
		[';', '+'],
		[' AußeNAußeN', '='],
		[',', '-'],
		[' hhiinntteenn', ':', 3],
		[',', '-'],
		[';', '+'],
		[' Hhiinntteenn', '='],
		[';', '+'],
		[' hhiinntteenn', '.', 3]
	], 'Diff (nicht verschachtelt)');
	assert.deepEqual(diff.diff(o, n, true), [
		['außenaußen', '='],
		[',', '-'],
		[' verschobenen  Verschoben  VERSCHOBEN', ':', 0],
		[',', '-'],
		[';', '+'],
		[' AußenAußen', '='],
		[',', '-'],
		[';', '+'],
		[' AUSSENAUSSEN', '='],
		[',', '-'],
		[';', '+'],
		[' AuSSeNAuSSeN', '='],
		[',', '-'],
		[';', '+'],
		[' aUßEnaUßEn', '='],
		[',', '-'],
		[';', '+'],
		[' verschobenen ', '<', 0],
		['-', '-'],
		['+', '+'],
		[' Verschoben ', '='],
		['-', '-'],
		['+', '+'],
		[' VERSCHOBEN', '>'],
		[';', '+'],
		[' AußeNAußeN', '='],
		[',', '-'],
		[' hhiinntteenn', ':', 1],
		[',', '-'],
		[';', '+'],
		[' Hhiinntteenn', '='],
		[';', '+'],
		[' hhiinntteenn', '.', 1]
	], 'Diff (verschachtelt)');
	cssTest(diff.htmlDiff(o, n, true), assert);
});
QUnit.test('Wort-Diff', function (assert) {
	assert.expect(4);
	assert.deepEqual(diff.diff('Wird das zusammen geschrieben?', 'Wird das zusammengeschrieben?'), [
		['Wird das zusammen', '='],
		[' ', '-'],
		['geschrieben?', '=']
	], 'Zwei Wörter -> ein Wort');
	assert.deepEqual(diff.diff('Das ist großer Unfug!', 'Das ist eine großartige Idee!'), [
		['Das ist ', '='],
		['großer Unfug', '-'],
		['eine großartige Idee', '+'],
		['!', '=']
	], 'Mehrere Wörter geändert');
	assert.deepEqual(diff.diff('Das ist ein Recktschraibfähler!', 'Das war ein Rechtschreibfehler!'), [
		['Das ', '='],
		['ist', '-'],
		['war', '+'],
		[' ein Rec', '='],
		['k', '-'],
		['h', '+'],
		['tschr', '='],
		['a', '-'],
		['e', '+'],
		['ibf', '='],
		['ä', '-'],
		['e', '+'],
		['hler!', '=']
	], 'Ein Wort geändert');
	assert.deepEqual(diff.diff('Fiele Vehler', 'Viele Fehler'), [
		['F', '-'],
		['V', '+'],
		['iele ', '='],
		['V', '-'],
		['F', '+'],
		['ehler', '=']
	], 'Zwei Wörter geändert');
});
QUnit.test('Echte Beispiele: Dokumentation', function (assert) {
	assert.expect(2);
	var o = '... einen Schrägstrich.\n\nBesonders trickreich ist eine Gruppe mit dem Namen <tt>\' \'</tt>, also einfach einem Leerzeichen. Dies bewirkt einen kleinen Abstand.\n\n== Beispiele ==', n = '... einen Schrägstrich.\n\nBeginnt der Name einer Gruppe mit einem Leerzeichen, so wird er nicht angezeigt. Dies ist nützlich, wenn man einfach nur einen kleinen Abstand haben möchte.\n\n== Beispiele ==';
	assert.deepEqual(diff.diff(o, n), [
		['... einen Schrägstrich.\n\n', '='],
		['Besonders trickreich ist eine', '-'],
		['Beginnt der Name einer', '+'],
		[' Gruppe mit ', '='],
		['dem Namen <tt>\' \'</tt>, also einfach ', '-'],
		['einem Leerzeichen', '='],
		[', so wird er nicht angezeigt', '+'],
		['. Dies ', '='],
		['bewirkt', '-'],
		['ist nützlich, wenn man einfach nur', '+'],
		[' einen kleinen Abstand', '='],
		[' haben möchte', '+'],
		['.\n\n== Beispiele ==', '=']
	], 'Diff');
	assert.strictEqual(diff.htmlDiff(o, n), '<span class="enhanced-diff-equal">... einen Schrägstrich.<br /><br /></span><del class="enhanced-diff-del">Besonders trickreich ist eine</del><ins class="enhanced-diff-ins">Beginnt der Name einer</ins><span class="enhanced-diff-equal">&nbsp;Gruppe mit </span><del class="enhanced-diff-del">dem Namen &lt;tt&gt;&#039; &#039;&lt;/tt&gt;, also einfach </del><span class="enhanced-diff-equal">einem Leerzeichen</span><ins class="enhanced-diff-ins">, so wird er nicht angezeigt</ins><span class="enhanced-diff-equal">. Dies </span><del class="enhanced-diff-del">bewirkt</del><ins class="enhanced-diff-ins">ist nützlich, wenn man einfach nur</ins><span class="enhanced-diff-equal">&nbsp;einen kleinen Abstand</span><ins class="enhanced-diff-ins">&nbsp;haben möchte</ins><span class="enhanced-diff-equal">.<br /><br />== Beispiele ==</span>', 'HTML-Diff');
});
QUnit.test('Echte Beispiele: Biographie', function (assert) {
	assert.expect(4);
	var o = '{{DEFAULTSORT:B, A}}\n[[Kategorie:Mann]]\n[[Kategorie:geboren 1234]]\n[[Kategorie:gestorben 2345]]', n = '{{Normdaten|PND=123456}}\n\n{{SORTIERUNG:B, A}}\n[[Kategorie:Deutscher]]\n[[Kategorie:Geboren 1234]]\n[[Kategorie:Gestorben 2345]]\n[[Kategorie:Mann]]\n\n{{Personendaten\n|NAME=B, A\n}}', dHtml = '<span class="enhanced-diff-equal">{{</span><del class="enhanced-diff-del">DEFAULTSORT</del><ins class="enhanced-diff-ins">Normdaten|PND=123456}}<br /><br />{{SORTIERUNG</ins><span class="enhanced-diff-equal">:B, A}}<br /></span><a class="enhanced-diff-moved-from enhanced-diff-block-0" href="#moved-block-0" title="[[Kategorie:Mann]]&#10;">^</a><span class="enhanced-diff-equal">[[Kategorie:</span><del class="enhanced-diff-del">g</del><ins class="enhanced-diff-ins">Deutscher]]<br />[[Kategorie:G</ins><span class="enhanced-diff-equal">eboren 1234]]<br />[[Kategorie:</span><del class="enhanced-diff-del">g</del><ins class="enhanced-diff-ins">G</ins><span class="enhanced-diff-equal">estorben 2345]]</span><ins class="enhanced-diff-ins">¶<br /></ins><span class="enhanced-diff-moved-to enhanced-diff-block-0" id="moved-block-0">[[Kategorie:Mann]]<br /></span><ins class="enhanced-diff-ins">¶<br />{{Personendaten<br />|NAME=B, A<br />}}</ins>', d = [
		['{{', '='],
		['DEFAULTSORT', '-'],
		['Normdaten|PND=123456}}\n\n{{SORTIERUNG', '+'],
		[':B, A}}\n', '='],
		['[[Kategorie:Mann]]\n', ':', 0],
		['[[Kategorie:', '='],
		['g', '-'],
		['Deutscher]]\n[[Kategorie:G', '+'],
		['eboren 1234]]\n[[Kategorie:', '='],
		['g', '-'],
		['G', '+'],
		['estorben 2345]]', '='],
		['\n', '+'],
		['[[Kategorie:Mann]]\n', '.', 0],
		['\n{{Personendaten\n|NAME=B, A\n}}', '+']
	];
	assert.deepEqual(diff.diff(o, n), d, 'Diff (ohne Verschachtelung)');
	assert.strictEqual(diff.htmlDiff(o, n), dHtml, 'HTML-Diff');
	assert.deepEqual(diff.diff(o, n, true), d, 'Diff (mit Verschachtelung)');
	assert.strictEqual(diff.htmlDiff(o, n), dHtml, 'HTML-Diff');
});
QUnit.test('Echte Beispiele: Konstruierter Vandalismus', function (assert) {
	assert.expect(2);
	var o = 'Google works nice, Vandalism is bad. Wikipedia Is Cool!', n = 'Google works bad. Wikipedia Is nice. Vandalism is Cool!', d = [
		['Google works ', '='],
		['nice,', '-'],
		[' Vandalism is ', ':', 0],
		['bad. Wikipedia Is ', '='],
		['nice.', '+'],
		[' Vandalism is ', '.', 0],
		['Cool!', '=']
	];
	assert.deepEqual(diff.diff(o, n), d, 'Ohne Verschachtelung');
	assert.deepEqual(diff.diff(o, n, true), d, 'Mit Verschachtelung');
});
QUnit.test('Echte Beispiele: Art Ross', function (assert) {
	assert.expect(6);
	var o = 'Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice rather than pass it to a forward. He won the Stanley Cup twice in a playing career that lasted thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers.', n = 'Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. He won the Stanley Cup twice in a playing career lasting thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers. Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice instead of passing it to a forward.';
	assert.deepEqual(diff.diff(o, n), [
		['Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. ', '='],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', ':', 0],
		['rather than pass', '-'],
		[' it to a forward.', ':', 1],
		[' ', '-'],
		['He won the Stanley Cup twice in a playing career ', '='],
		['that lasted', '-'],
		['lasting', '+'],
		[' thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers.', '='],
		[' ', '+'],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', '.', 0],
		['instead of passing', '+'],
		[' it to a forward.', '.', 1]
	], 'Ohne Verschachtelung');

	assert.deepEqual(diff.diff(n, o), [
		['Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. ', '='],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', '.', 0],
		['rather than pass', '+'],
		[' it to a forward.', '.', 1],
		[' ', '+'],
		['He won the Stanley Cup twice in a playing career ', '='],
		['lasting', '-'],
		['that lasted', '+'],
		[' thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers.', '='],
		[' ', '-'],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', ':', 0],
		['instead of passing', '-'],
		[' it to a forward.', ':', 1]
	], 'Ohne Verschachtelung (neu -> alt)');

	assert.deepEqual(diff.diff(o, n, true), [
		['Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. ', '='],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice  it to a forward.', ':', 0],
		[' ', '-'],
		['He won the Stanley Cup twice in a playing career ', '='],
		['that lasted', '-'],
		['lasting', '+'],
		[' thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers.', '='],
		[' ', '+'],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', '<', 0],
		['rather than pass', '-'],
		['instead of passing', '+'],
		[' it to a forward.', '>']
	], 'Mit Verschachtelung');

	assert.deepEqual(diff.diff(n, o, true), [
		['Art Ross (1886–1964) was a Canadian ice hockey defenceman and executive from 1905 until 1954. ', '='],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice ', '<', 0],
		['instead of passing', '-'],
		['rather than pass', '+'],
		[' it to a forward.', '>'],
		[' ', '+'],
		['He won the Stanley Cup twice in a playing career ', '='],
		['lasting', '-'],
		['that lasted', '+'],
		[' thirteen seasons; in January 1907 with the Kenora Thistles and 1908 with the Montreal Wanderers.', '='],
		[' ', '-'],
		['Regarded as one of the best defenders of his era by his peers, he was one of the first to skate with the puck up the ice  it to a forward.', ':', 0]
	], 'Mit Verschachtelung (neu -> alt)');

	cssTest(diff.htmlDiff(o, n, true), assert);
	cssTest(diff.htmlDiff(n, o, true), assert);
});
QUnit.test('Echte Beispiele: Burg Gleichenstein', function (assert) {
	assert.expect(6);
	//Autoren der Texte: Menzer (alt), Pez (neu); siehe auch https://de.wikipedia.org/w/index.php?title=Burg_Gleichenstein_%28Sachsen%29&action=history
	var o = '[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\nDer \'\'\'Gleichenstein\'\'\' (373,3 m) ist ein Berg zwischen Wingendorf und Bräunsdorf im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n\nDie \'\'\'Burg Gleichenstein\'\'\' befand sich auf einem dem Berg vorgelagerten Plateau, das als Jacobstein bezeichnet wird. Lauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen Fachwerkbau, der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein Vorwerk oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n{{Coordinate |NS=50/55/34/N |EW=13/12/54/E |type=landmark |region=DE-SN}}\n\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]', n = '{{Infobox Burg\n|Name = Burg Gleichenstein\n|Bild = \n|Bildbeschreibung = \n|Alternativname = \n|Entstehungszeit = \n|Typologie n. geo. Lage = Höhenburg\n|Erhaltungszustand = Burgstall\n|Ständische Stellung = Adelige\n|Mauerwerksmerkmale = Fachwerk\n|Heutiger Ortsname = [[Oberschöna]] \n|Breitengrad = 50/55/34\n|Längengrad = 13/12/54\n|Unauffindbar = \n|Region-ISO = DE-SN\n|Poskarte = \n|Höhenordinate = \n|Höhe-Bezug = DE-NN\n}}\n \nDie \'\'\'Burg Gleichenstein\'\'\' ist eine [[Burgstall|abgegangene]] [[Höhenburg]] auf dem „Jacobstein“ einem vorgelagerten Plateau des Gleichenstein unweit der Gemeinde [[Oberschöna]] im [[Landkreis Mittelsachsen]] in [[Sachsen]].\n\nLauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen [[Fachwerkbau]], der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein [[Vorwerk]] oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n==Der Gleichenstein==\n\nDer \'\'\'Gleichenstein\'\'\' ist ein 373,3 Meter hoher Berg zwischen [[Frankenstein (Sachsen)|Wingendorf]] und [[Bräunsdorf (Oberschöna)|Bräunsdorf]] im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]';
	assert.deepEqual(diff.diff(o, n), [
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', ':', 0],
		['Der \'\'\'Gleichenstein\'\'\' ', ':', 1],
		['(373,3 m) ist ein', '-'],
		[' Berg zwischen ', ':', 2],
		['Wingendorf', ':', 3],
		[' und Bräunsdorf', '-'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', ':', 4],
		['{{Infobox Burg\n|Name = Burg Gleichenstein\n|Bild = \n|Bildbeschreibung = \n|Alternativname = \n|Entstehungszeit = \n|Typologie n. geo. Lage = Höhenburg\n|Erhaltungszustand = Burgstall\n|Ständische Stellung = Adelige\n|Mauerwerksmerkmale = Fachwerk\n|Heutiger Ortsname = [[Oberschöna]] \n|Breitengrad = 50/55/34\n|Längengrad = 13/12/54\n|Unauffindbar = \n|Region-ISO = DE-SN\n|Poskarte = \n|Höhenordinate = \n|Höhe-Bezug = DE-NN\n}}\n ', '+'],
		['\nDie \'\'\'Burg Gleichenstein\'\'\' ', '='],
		['befand sich', '-'],
		['ist eine [[Burgstall|abgegangene]] [[Höhenburg]]', '+'],
		[' auf ', '='],
		['einem ', '-'],
		['dem ', '='],
		['Berg', '-'],
		['„', '+'],
		['Jacobstein', '.', 5],
		['“ einem', '+'],
		[' vorgelagerten Plateau', '='],
		[', das als ', '-'],
		['Jacobstein', ':', 5],
		[' bezeichnet wird. ', '-'],
		[' des Gleichenstein unweit der Gemeinde [[Oberschöna]] im [[Landkreis Mittelsachsen]] in [[Sachsen]].\n\n', '+'],
		['Lauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen ', '='],
		['[[', '+'],
		['Fachwerkbau', '='],
		[']]', '+'],
		[', der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein ', '='],
		['[[', '+'],
		['Vorwerk', '='],
		[']]', '+'],
		[' oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n', '='],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', '.', 0],
		['==Der Gleichenstein==\n\n', '+'],
		['Der \'\'\'Gleichenstein\'\'\' ', '.', 1],
		['ist ein 373,3 Meter hoher', '+'],
		[' Berg zwischen ', '.', 2],
		['[[Frankenstein (Sachsen)|', '+'],
		['Wingendorf', '.', 3],
		[']] und [[Bräunsdorf (Oberschöna)|Bräunsdorf]]', '+'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', '.', 4],
		['\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n', '='],
		['{{Coordinate |NS=50/55/34/N |EW=13/12/54/E |type=landmark |region=DE-SN}}\n', '-'],
		['\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]', '=']
	], 'Ohne Verschachtelung');
	assert.deepEqual(diff.diff(n, o), [
		['{{Infobox Burg\n|Name = Burg Gleichenstein\n|Bild = \n|Bildbeschreibung = \n|Alternativname = \n|Entstehungszeit = \n|Typologie n. geo. Lage = Höhenburg\n|Erhaltungszustand = Burgstall\n|Ständische Stellung = Adelige\n|Mauerwerksmerkmale = Fachwerk\n|Heutiger Ortsname = [[Oberschöna]] \n|Breitengrad = 50/55/34\n|Längengrad = 13/12/54\n|Unauffindbar = \n|Region-ISO = DE-SN\n|Poskarte = \n|Höhenordinate = \n|Höhe-Bezug = DE-NN\n}}\n ', '-'],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', '.', 0],
		['Der \'\'\'Gleichenstein\'\'\' ', '.', 1],
		['(373,3 m) ist ein', '+'],
		[' Berg zwischen ', '.', 2],
		['Wingendorf', '.', 3],
		[' und Bräunsdorf', '+'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', '.', 4],
		['\nDie \'\'\'Burg Gleichenstein\'\'\' ', '='],
		['ist eine [[Burgstall|abgegangene]] [[Höhenburg]]', '-'],
		['befand sich', '+'],
		[' auf ', '='],
		['einem ', '+'],
		['dem ', '='],
		['„', '-'],
		['Jacobstein', ':', 5],
		['“ einem', '-'],
		['Berg', '+'],
		[' vorgelagerten Plateau', '='],
		[' des Gleichenstein unweit der Gemeinde [[Oberschöna]] im [[Landkreis Mittelsachsen]] in [[Sachsen]].\n\n', '-'],
		[', das als ', '+'],
		['Jacobstein', '.', 5],
		[' bezeichnet wird. ', '+'],
		['Lauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen ', '='],
		['[[', '-'],
		['Fachwerkbau', '='],
		[']]', '-'],
		[', der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein ', '='],
		['[[', '-'],
		['Vorwerk', '='],
		[']]', '-'],
		[' oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n', '='],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', ':', 0],
		['==Der Gleichenstein==\n\n', '-'],
		['Der \'\'\'Gleichenstein\'\'\' ', ':', 1],
		['ist ein 373,3 Meter hoher', '-'],
		[' Berg zwischen ', ':', 2],
		['[[Frankenstein (Sachsen)|', '-'],
		['Wingendorf', ':', 3],
		[']] und [[Bräunsdorf (Oberschöna)|Bräunsdorf]]', '-'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', ':', 4],
		['\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n', '='],
		['{{Coordinate |NS=50/55/34/N |EW=13/12/54/E |type=landmark |region=DE-SN}}\n', '+'],
		['\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]', '=']
	], 'Ohne Verschachtelung (neu -> alt)');
	assert.deepEqual(diff.diff(o, n, true), [
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\nDer \'\'\'Gleichenstein\'\'\'  Berg zwischen Wingendorf im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', ':', 0],
		['{{Infobox Burg\n|Name = Burg Gleichenstein\n|Bild = \n|Bildbeschreibung = \n|Alternativname = \n|Entstehungszeit = \n|Typologie n. geo. Lage = Höhenburg\n|Erhaltungszustand = Burgstall\n|Ständische Stellung = Adelige\n|Mauerwerksmerkmale = Fachwerk\n|Heutiger Ortsname = [[Oberschöna]] \n|Breitengrad = 50/55/34\n|Längengrad = 13/12/54\n|Unauffindbar = \n|Region-ISO = DE-SN\n|Poskarte = \n|Höhenordinate = \n|Höhe-Bezug = DE-NN\n}}\n ', '+'],
		['\nDie \'\'\'Burg Gleichenstein\'\'\' ', '='],
		['befand sich', '-'],
		['ist eine [[Burgstall|abgegangene]] [[Höhenburg]]', '+'],
		[' auf ', '='],
		['einem ', '-'],
		['dem ', '='],
		['Berg', '-'],
		['„', '+'],
		['Jacobstein', '.', 1],
		['“ einem', '+'],
		[' vorgelagerten Plateau', '='],
		[', das als ', '-'],
		['Jacobstein', ':', 1],
		[' bezeichnet wird. ', '-'],
		[' des Gleichenstein unweit der Gemeinde [[Oberschöna]] im [[Landkreis Mittelsachsen]] in [[Sachsen]].\n\n', '+'],
		['Lauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen ', '='],
		['[[', '+'],
		['Fachwerkbau', '='],
		[']]', '+'],
		[', der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein ', '='],
		['[[', '+'],
		['Vorwerk', '='],
		[']]', '+'],
		[' oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n', '='],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', '<', 0],
		['==Der Gleichenstein==\n\n', '+'],
		['Der \'\'\'Gleichenstein\'\'\' ', '='],
		['(373,3 m) ist ein', '-'],
		['ist ein 373,3 Meter hoher', '+'],
		[' Berg zwischen ', '='],
		['[[Frankenstein (Sachsen)|', '+'],
		['Wingendorf', '='],
		[' und Bräunsdorf', '-'],
		[']] und [[Bräunsdorf (Oberschöna)|Bräunsdorf]]', '+'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', '>'],
		['\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n', '='],
		['{{Coordinate |NS=50/55/34/N |EW=13/12/54/E |type=landmark |region=DE-SN}}\n', '-'],
		['\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]', '=']
	], 'Mit Verschachtelung');
	assert.deepEqual(diff.diff(n, o, true), [
		['{{Infobox Burg\n|Name = Burg Gleichenstein\n|Bild = \n|Bildbeschreibung = \n|Alternativname = \n|Entstehungszeit = \n|Typologie n. geo. Lage = Höhenburg\n|Erhaltungszustand = Burgstall\n|Ständische Stellung = Adelige\n|Mauerwerksmerkmale = Fachwerk\n|Heutiger Ortsname = [[Oberschöna]] \n|Breitengrad = 50/55/34\n|Längengrad = 13/12/54\n|Unauffindbar = \n|Region-ISO = DE-SN\n|Poskarte = \n|Höhenordinate = \n|Höhe-Bezug = DE-NN\n}}\n ', '-'],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\n', '<', 0],
		['==Der Gleichenstein==\n\n', '-'],
		['Der \'\'\'Gleichenstein\'\'\' ', '='],
		['ist ein 373,3 Meter hoher', '-'],
		['(373,3 m) ist ein', '+'],
		[' Berg zwischen ', '='],
		['[[Frankenstein (Sachsen)|', '-'],
		['Wingendorf', '='],
		[']] und [[Bräunsdorf (Oberschöna)|Bräunsdorf]]', '-'],
		[' und Bräunsdorf', '+'],
		[' im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', '>'],
		['\nDie \'\'\'Burg Gleichenstein\'\'\' ', '='],
		['ist eine [[Burgstall|abgegangene]] [[Höhenburg]]', '-'],
		['befand sich', '+'],
		[' auf ', '='],
		['einem ', '+'],
		['dem ', '='],
		['„', '-'],
		['Jacobstein', ':', 1],
		['“ einem', '-'],
		['Berg', '+'],
		[' vorgelagerten Plateau', '='],
		[' des Gleichenstein unweit der Gemeinde [[Oberschöna]] im [[Landkreis Mittelsachsen]] in [[Sachsen]].\n\n', '-'],
		[', das als ', '+'],
		['Jacobstein', '.', 1],
		[' bezeichnet wird. ', '+'],
		['Lauterbach und Wagner (1997) berichten, dass bei Grabungen des Landesmuseums für Vorgeschichte im Jahre 1976 ein neun Meter breiter und vier Meter tiefer Graben freigelegt wurde. Die dabei entdeckten Funde deuten auf einen ', '='],
		['[[', '-'],
		['Fachwerkbau', '='],
		[']]', '-'],
		[', der bis ins 14. Jahrhundert existiert haben muss. Ob es sich um ein ', '='],
		['[[', '-'],
		['Vorwerk', '='],
		[']]', '-'],
		[' oder eine eigenständige Burg handelte, konnte jedoch nicht abschließend geklärt werden.\n\nDer Sage nach verfiel die Burg nach der Rückkehr des Ritters von Gleichenstein von einem Kreuzzug. Er traf seine Frau mit einem neuen Mann an, worauf es zu einem Kampf kam, in dessen Verlauf die Burg im Getümmel zusammenfiel. Die dabei verschütteten Schätze sollen heute noch unter der Burg ruhen, beschützt von einem goldenen Löwen, nur zur Sommersonnenwende, von einem Sonntagskind, zu heben.\n', '='],
		['[[Bild:GleichensteinbeiWingendorf.jpg|thumb|Der Gleichenstein von Bräunsdorf aus gesehen]]\nDer \'\'\'Gleichenstein\'\'\'  Berg zwischen Wingendorf im Tal der [[Striegis|Großen Striegis]] im [[Landkreis Mittelsachsen]]. Geologisch ist er aus [[Gneis]] aufgebaut und heute vollständig bewaldet.\n', ':', 0],
		['\n== Literatur ==\n* W. Lauterbach, S. Wagner: \'\'Der gespenstige Mönch.\'\' Altis-Verlag, Berlin 1997.\n* A. Sauer, A. Rothpletz: \'\'Erläuterungen zur geologischen Specialkarte des Kgr. Sachsen - Section Freiberg-Langhennersdorf Blatt 79.\'\' Engelmann Verlag, Leipzig 1887, 60 S.\n\n', '='],
		['{{Coordinate |NS=50/55/34/N |EW=13/12/54/E |type=landmark |region=DE-SN}}\n', '+'],
		['\n[[Kategorie:Ehemalige Burganlage in Sachsen|Gleichenstein]]\n[[Kategorie:Oberschöna]]', '=']
	], 'Mit Verschachtelung (neu -> alt)');

	cssTest(diff.htmlDiff(o, n, true), assert);
	cssTest(diff.htmlDiff(n, o, true), assert);
});
QUnit.test('Echte Beispiele: IMO', function (assert) {
	assert.expect(1);
	assert.deepEqual(diff.diff(
		'[[Christian Reiher]] ([[Germany]]), [[Lisa Sauermann]] ([[Germany]]), [[Teodor von Burg]] ([[Serbia]]), and Nipun Pitimanaaree ([[Thailand]]) are the only other participants to have won four gold medals.',
		'[[Christian Reiher]] ([[Germany]]), [[Lisa Sauermann]] ([[Germany]]), [[Teodor von Burg]] ([[Serbia]]), Nipun Pitimanaaree ([[Thailand]]), and Zhuoqun Alex Song ([[Canada]]) are the only other participants to have won four gold medals.'
	), [
		['[[Christian Reiher]] ([[Germany]]), [[Lisa Sauermann]] ([[Germany]]), [[Teodor von Burg]] ([[Serbia]]), ', '='],
		['and ', '-'],
		['Nipun Pitimanaaree ([[Thailand]])', '='],
		[', and Zhuoqun Alex Song ([[Canada]])', '+'],
		[' are the only other participants to have won four gold medals.', '=']
	], 'Sinnvolle Platzierung der Einfügung');
});
QUnit.test('Echte Beispiele: Hexabromcyclododecan', function (assert) {
	assert.expect(1);
	//Status quo, nicht unbedingt erwünschter Zustand
	var o = '* 2,3 mol·l<sup>−7</sup> (technisches Gemisch, 25&nbsp;°C) <ref name="Arnot" />\n* 2,8 mol·l<sup>−6</sup> (α-HBCD, 25&nbsp;°C) <ref name="Arnot" />\n* 9,9 mol·l<sup>−7</sup> (β-HBCD, 25&nbsp;°C) <ref name="Arnot" />\n* 1,7 mol·l<sup>−7</sup> (γ-HBCD, 25&nbsp;°C) <ref name="Arnot" />', n = '* 2,3·10<sup>−7</sup> mol·l<sup>−1</sup> (technisches Gemisch, 25&nbsp;°C) <ref name="Arnot" />\n* 2,8·10<sup>−6</sup> mol·l<sup>−1</sup> (α-HBCD, 25&nbsp;°C) <ref name="Arnot" />\n* 9,9·10<sup>−7</sup> mol·l<sup>−1</sup> (β-HBCD, 25&nbsp;°C) <ref name="Arnot" />\n* 1,7·10<sup>−7</sup> mol·l<sup>−1</sup> (γ-HBCD, 25&nbsp;°C) <ref name="Arnot" />';
	assert.strictEqual(diff.htmlDiff(o, n), '<span class="enhanced-diff-equal">* 2,3</span><ins class="enhanced-diff-ins">·10&lt;sup&gt;<span title="MINUS SIGN">−</span>7&lt;/sup&gt;</ins><span class="enhanced-diff-equal">&nbsp;mol·l&lt;sup&gt;−</span><del class="enhanced-diff-del">7</del><ins class="enhanced-diff-ins">1</ins><span class="enhanced-diff-equal">&lt;/sup&gt; (technisches Gemisch, 25&amp;nbsp;°C) &lt;ref name=&quot;Arnot&quot; /&gt;<br />* 2,8</span><del class="enhanced-diff-del">&nbsp;mol·l</del><ins class="enhanced-diff-ins">·10</ins><span class="enhanced-diff-equal">&lt;sup&gt;−6&lt;/sup&gt;</span><ins class="enhanced-diff-ins">&nbsp;mol·l&lt;sup&gt;<span title="MINUS SIGN">−</span>1&lt;/sup&gt;</ins><span class="enhanced-diff-equal">&nbsp;(α-HBCD, 25&amp;nbsp;°C) &lt;ref name=&quot;Arnot&quot; /&gt;<br />* 9,9</span><ins class="enhanced-diff-ins">·10&lt;sup&gt;<span title="MINUS SIGN">−</span>7&lt;/sup&gt;</ins><span class="enhanced-diff-equal">&nbsp;mol·l&lt;sup&gt;−</span><del class="enhanced-diff-del">7</del><ins class="enhanced-diff-ins">1</ins><span class="enhanced-diff-equal">&lt;/sup&gt; (β-HBCD, 25&amp;nbsp;°C) &lt;ref name=&quot;Arnot&quot; /&gt;<br />* 1,7</span><ins class="enhanced-diff-ins">·10&lt;sup&gt;<span title="MINUS SIGN">−</span>7&lt;/sup&gt;</ins><span class="enhanced-diff-equal">&nbsp;mol·l&lt;sup&gt;−</span><del class="enhanced-diff-del">7</del><ins class="enhanced-diff-ins">1</ins><span class="enhanced-diff-equal">&lt;/sup&gt; (γ-HBCD, 25&amp;nbsp;°C) &lt;ref name=&quot;Arnot&quot; /&gt;</span>', 'HTML-Diff');
});
})(jQuery, mediaWiki, mediaWiki.libs.schnarkDiff);
//</nowiki>