From: Jörn Zaefferer <joern.zaefferer@gmail.com> Date: Sun, 17 Sep 2006 11:41:44 +0000 (+0000) Subject: Refactored test suite once more, as proposed by John X-Git-Url: http://git.asbjorn.biz/?a=commitdiff_plain;h=826bb93cc35a602f27d713a40e9714dedcfb5d47;p=jquery.git Refactored test suite once more, as proposed by John --- diff --git a/build.xml b/build.xml index 19a8b22..6c866f8 100644 --- a/build.xml +++ b/build.xml @@ -61,14 +61,8 @@ <target name="test" depends="jquery"> <echo message="Building Test Suite" /> <delete dir="${TEST_DIR}" /> - <mkdir dir="${TEST_DIR}/js" /> - <copy todir="${TEST_DIR}" file="${BUILD_DIR}/test/index.html" /> - <copy todir="${TEST_DIR}/js"> - <fileset dir="${BUILD_DIR}/test/js"> - <include name="**/*.js"/> - </fileset> - </copy> - + <mkdir dir="${TEST_DIR}" /> + <copy todir="${TEST_DIR}" file="${BUILD_DIR}/test/testrunner.js" /> <java jar="${JAR}" fork="true"> <arg value="${BUILD_DIR}/test/test.js" /> <arg value="${JQ}" /> diff --git a/build/test/index.html b/build/test/index.html index 74539ef..a8d8b44 100644 --- a/build/test/index.html +++ b/build/test/index.html @@ -1,10 +1,12 @@ <html id="html"> <head> <script type="text/javascript" src="../dist/jquery.js"></script> - <script type="text/javascript" src="js/test.js"></script> + <script type="text/javascript" src="testrunner.js"></script> <script> - $(document).ready(function(){ - runTest('tests.js'); + $(document).ready(function(){ + runTest(function() { + {TESTS} + }); }); </script> <style>.pass { color: green; } .fail { color: red; } #tests ol { display: none; }</style> @@ -46,6 +48,8 @@ <input type="text" id="name" name="name" value="name" /> + <textarea id="area1">foobar</textarea> + <select name="select1" id="select1"> <option id="option1a" value="">Nothing</option> <option id="option1b" value="1">1</option> diff --git a/build/test/js/test.js b/build/test/js/test.js deleted file mode 100644 index ec6f9c0..0000000 --- a/build/test/js/test.js +++ /dev/null @@ -1,121 +0,0 @@ -function runTest(file) { - var startTime = new Date(); - var Test; - var stats = { - all: 0, - bad: 0 - }; - var fixture = document.getElementById('main').innerHTML; - $.get(file,function(js) { - js = js.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); - eval(js); - 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 ); - } - - 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 + ")"); - } -} diff --git a/build/test/test.js b/build/test/test.js index 6553d9c..0a2b042 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 0000000..b315226 --- /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.<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