diff --git a/build.xml b/build.xml index 19a8b2215..6c866f8cc 100644 --- a/build.xml +++ b/build.xml @@ -61,14 +61,8 @@ - - - - - - - - + + diff --git a/build/test/index.html b/build/test/index.html index 74539eff5..a8d8b4494 100644 --- a/build/test/index.html +++ b/build/test/index.html @@ -1,10 +1,12 @@ - + @@ -46,6 +48,8 @@ + + ] - */ - 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 + ")"); - } -} diff --git a/build/test/test.js b/build/test/test.js index 6553d9c10..0a2b0427c 100644 --- a/build/test/test.js +++ b/build/test/test.js @@ -20,12 +20,17 @@ var jq = parse( readFile( arguments[0] ) ); var testFile = []; +String.prototype.decode = function() { + return this.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); +}; + for ( var i = 0; i < jq.length; i++ ) { if ( jq[i].tests.length > 0 ) { var method = jq[i]; var name = addParams(method.name, method.params); - testFile[testFile.length] = addTestWrapper(name, method.tests.join("\n")); + testFile[testFile.length] = addTestWrapper(name, method.tests.join("\n").decode()); } } -writeFile( dir + "/tests.js", testFile.join("\n") ); \ No newline at end of file +var indexFile = readFile( "build/test/index.html" ); +writeFile( dir + "/index.html", indexFile.replace( /{TESTS}/g, testFile.join("\n") ) ); diff --git a/build/test/testrunner.js b/build/test/testrunner.js new file mode 100644 index 000000000..b315226e4 --- /dev/null +++ b/build/test/testrunner.js @@ -0,0 +1,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.
' + + 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 + " (" + bad + ", " + good + ", " + Test.length + ")"; + 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 [
, , ] + */ +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 + ")"); +} \ No newline at end of file