From b0c3711d3e8bd844d1cfa8569864df1c1f73180a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 19 Sep 2006 09:49:22 +0000 Subject: [PATCH] Refactored test suite to allow async tests (use stop() before starting an async request, use start() when finished), added test for bug #164 --- build.xml | 6 +- build/test/data/dashboard.xml | 15 ++++ build/test/data/testrunner.js | 157 ++++++++++++++++++++++++++++++++++ build/test/index.html | 2 +- build/test/testrunner.js | 124 --------------------------- src/ajax/ajax.js | 13 +++ 6 files changed, 190 insertions(+), 127 deletions(-) create mode 100644 build/test/data/dashboard.xml create mode 100644 build/test/data/testrunner.js delete mode 100644 build/test/testrunner.js diff --git a/build.xml b/build.xml index 6c866f8cc..0a01b5a6e 100644 --- a/build.xml +++ b/build.xml @@ -61,8 +61,10 @@ - - + + + + diff --git a/build/test/data/dashboard.xml b/build/test/data/dashboard.xml new file mode 100644 index 000000000..1bcbf8b0d --- /dev/null +++ b/build/test/data/dashboard.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/test/data/testrunner.js b/build/test/data/testrunner.js new file mode 100644 index 000000000..a72a1c17c --- /dev/null +++ b/build/test/data/testrunner.js @@ -0,0 +1,157 @@ +var asyncTimeout = 2 // seconds for async timeout + +var fixture; +var Test; +var stats = { + all: 0, + bad: 0 +}; +var queue = []; +var blocking = false; + +function synchronize(callback) { + queue[queue.length] = callback; + if(!blocking) { + process(); + } +} + +function process() { + while(queue.length && !blocking) { + var call = queue[0]; + queue = queue.slice(1); + call(); + } +} + +function stop() { + blocking = true; + setTimeout(start, asyncTimeout * 1000); +} +function start() { + blocking = false; + process(); +} + +function runTest(tests) { + var startTime = new Date(); + fixture = document.getElementById('main').innerHTML; + tests(); + synchronize(function() { + 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 = []; + synchronize(function() { + 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 ] ); + } + }); + synchronize(function() { + 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 diff --git a/build/test/index.html b/build/test/index.html index a8d8b4494..2124948a6 100644 --- a/build/test/index.html +++ b/build/test/index.html @@ -1,7 +1,7 @@ - +