diff options
author | Jörn Zaefferer <joern.zaefferer@gmail.com> | 2006-09-19 09:49:22 +0000 |
---|---|---|
committer | Jörn Zaefferer <joern.zaefferer@gmail.com> | 2006-09-19 09:49:22 +0000 |
commit | b0c3711d3e8bd844d1cfa8569864df1c1f73180a (patch) | |
tree | 5053704e7b38298490b60c826999324eba9c215c | |
parent | 4dcbfc92c391983059b920d2a500c1246869f4c7 (diff) | |
download | jquery-b0c3711d3e8bd844d1cfa8569864df1c1f73180a.tar.gz jquery-b0c3711d3e8bd844d1cfa8569864df1c1f73180a.zip |
Refactored test suite to allow async tests (use stop() before starting an async request, use start() when finished), added test for bug #164
-rw-r--r-- | build.xml | 6 | ||||
-rw-r--r-- | build/test/data/dashboard.xml | 15 | ||||
-rw-r--r-- | build/test/data/testrunner.js | 157 | ||||
-rw-r--r-- | build/test/index.html | 2 | ||||
-rw-r--r-- | build/test/testrunner.js | 124 | ||||
-rw-r--r-- | src/ajax/ajax.js | 13 |
6 files changed, 190 insertions, 127 deletions
@@ -61,8 +61,10 @@ <target name="test" depends="jquery"> <echo message="Building Test Suite" /> <delete dir="${TEST_DIR}" /> - <mkdir dir="${TEST_DIR}" />
- <copy todir="${TEST_DIR}" file="${BUILD_DIR}/test/testrunner.js" /> + <mkdir dir="${TEST_DIR}/data" />
+ <copy todir="${TEST_DIR}/data">
+ <fileset dir="${BUILD_DIR}/test/data/" />
+ </copy>
<java jar="${JAR}" fork="true"> <arg value="${BUILD_DIR}/test/test.js" /> <arg value="${JQ}" /> 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 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<dashboard>
+ <locations>
+ <location>
+ <infowindowtab>
+ <tab title="Location">
+ <![CDATA[blabla]]>
+ </tab>
+ <tab title="Users">
+ <![CDATA[blublu]]>
+ </tab>
+ </infowindowtab>
+ </location>
+ </locations>
+</dashboard>
\ 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.<br/>' + + 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 + " <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 + ")"); +}
\ 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 @@ <html id="html"> <head> <script type="text/javascript" src="../dist/jquery.js"></script> - <script type="text/javascript" src="testrunner.js"></script> + <script type="text/javascript" src="data/testrunner.js"></script> <script> $(document).ready(function(){
runTest(function() { diff --git a/build/test/testrunner.js b/build/test/testrunner.js deleted file mode 100644 index b315226e4..000000000 --- a/build/test/testrunner.js +++ /dev/null @@ -1,124 +0,0 @@ -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 + ")"); -}
\ No newline at end of file diff --git a/src/ajax/ajax.js b/src/ajax/ajax.js index 3b1a94922..bd69704de 100644 --- a/src/ajax/ajax.js +++ b/src/ajax/ajax.js @@ -215,6 +215,19 @@ jQuery.extend({ * } * ) * + * @test stop(); + * $.get("data/dashboard.xml", function(xml) { + * var content = []; + * $('tab', xml).each(function(k) { + * // workaround for IE needed here, $(this).text() throws an error + * // content[k] = $.trim(this.firstChild.data) || $(this).text(); + * content[k] = $(this).text(); + * }); + * ok( content[0].match(/blabla/), 'Check first tab' ); + * ok( content[1].match(/blublu/), 'Check second tab' ); + * start(); + * }); + * * @name $.get * @type jQuery * @param String url The URL of the page to load. |