aboutsummaryrefslogtreecommitdiffstats
path: root/build/test/testrunner.js
blob: b315226e408422bc0dbe4058e64991e1fd97929c (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
var fixture;
var Test;
var stats = {
	all: 0,
	bad: 0
};

function runTest(tests) {
	var startTime = new Date();
	
	fixture = document.getElementById('main').innerHTML;
	tests();
	var runTime = new Date() - startTime;
	var result = document.createElement("div");
	result.innerHTML = 'Tests completed in ' + runTime + ' milliseconds.<br/>' +
		stats.bad + ' tests of ' + stats.all + ' failed.';
	document.getElementsByTagName("body")[0].appendChild(result);
}

function test(name, callback) {
	Test = [];
	try {
		callback();
	} catch(e) {
		if(typeof console != "undefined") {
			console.error("Test " + name + " died, exception and test follows");
			console.error(e);
			console.warn(callback.toString());
		}
		Test.push( [ false, "Died on test #" + (Test.length+1) + ": " + e ] );
	}
	reset();
	
	var good = 0, bad = 0;
	var ol = document.createElement("ol");

	var li = "", state = "pass";
	for ( var i = 0; i < Test.length; i++ ) {
		var li = document.createElement("li");
		li.className = Test[i][0] ? "pass" : "fail";
		li.innerHTML = Test[i][1];
		ol.appendChild( li );
		
		stats.all++;
		if ( !Test[i][0] ) {
			state = "fail";
			bad++;
			stats.bad++;
		} else good++;
	}

	var li = document.createElement("li");
	li.className = state;

	var b = document.createElement("b");
	b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + Test.length + ")</b>";
	b.onclick = function(){
		var n = this.nextSibling;
		if ( jQuery.css( n, "display" ) == "none" )
			n.style.display = "block";
		else
			n.style.display = "none";
	};
	li.appendChild( b );
	li.appendChild( ol );

	document.getElementById("tests").appendChild( li );
}

/**
 * Resets the test setup. Useful for tests that modify the DOM.
 */
function reset() {
	document.getElementById('main').innerHTML = fixture;
}

/**
 * Asserts true.
 * @example ok( $("a").size() > 5, "There must be at least 5 anchors" );
 */
function ok(a, msg) {
	Test.push( [ !!a, msg ] );
}

/**
 * Asserts that two arrays are the same
 */
function isSet(a, b, msg) {
	var ret = true;
	if ( a && b && a.length == b.length ) {
		for ( var i in a )
			if ( a[i] != b[i] )
				ret = false;
	} else
		ret = false;
	if ( !ret && console )
		console.log( msg, a, b );
	Test.push( [ ret, msg ] );
}

/**
 * Returns an array of elements with the given IDs, eg.
 * @example q("main", "foo", "bar")
 * @result [<div id="main">, <span id="foo">, <input id="bar">]
 */
function q() {
	var r = [];
	for ( var i = 0; i < arguments.length; i++ )
		r.push( document.getElementById( arguments[i] ) );
	return r;
}

/**
 * Asserts that a select matches the given IDs
 * @example t("Check for something", "//[a]", ["foo", "baar"]);
 * @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar'
 */
function t(a,b,c) {
	var f = jQuery.find(b);
	var s = "";
	for ( var i = 0; i < f.length; i++ )
		s += (s && ",") + '"' + f[i].id + '"';
	isSet(f, q.apply(q,c), a + " (" + b + ")");
}