Refactored test suite to allow async tests (use stop() before starting an async reque...
authorJörn Zaefferer <joern.zaefferer@gmail.com>
Tue, 19 Sep 2006 09:49:22 +0000 (09:49 +0000)
committerJörn Zaefferer <joern.zaefferer@gmail.com>
Tue, 19 Sep 2006 09:49:22 +0000 (09:49 +0000)
build.xml
build/test/data/dashboard.xml [new file with mode: 0644]
build/test/data/testrunner.js [new file with mode: 0644]
build/test/index.html
build/test/testrunner.js [deleted file]
src/ajax/ajax.js

index 6c866f8..0a01b5a 100644 (file)
--- a/build.xml
+++ b/build.xml
     <target name="test" depends="jquery">
         <echo message="Building Test Suite" />
         <delete dir="${TEST_DIR}" />
-        <mkdir dir="${TEST_DIR}" />\r
-        <copy todir="${TEST_DIR}" file="${BUILD_DIR}/test/testrunner.js" />
+       <mkdir dir="${TEST_DIR}/data" />\r
+        <copy todir="${TEST_DIR}/data">\r
+               <fileset dir="${BUILD_DIR}/test/data/" />\r
+       </copy>\r
         <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 (file)
index 0000000..1bcbf8b
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<dashboard>\r
+       <locations>\r
+               <location>\r
+                       <infowindowtab>\r
+                               <tab title="Location">\r
+                                       <![CDATA[blabla]]>\r
+                               </tab>\r
+                               <tab title="Users">\r
+                                       <![CDATA[blublu]]>\r
+                               </tab>\r
+                       </infowindowtab>\r
+               </location>\r
+       </locations>\r
+</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 (file)
index 0000000..a72a1c1
--- /dev/null
@@ -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
index a8d8b44..2124948 100644 (file)
@@ -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(){\r
                runTest(function() {
diff --git a/build/test/testrunner.js b/build/test/testrunner.js
deleted file mode 100644 (file)
index b315226..0000000
+++ /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
index 3b1a949..bd69704 100644 (file)
@@ -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.