Permalink
Please
sign in to comment.
Browse files
jquery core: reverted qunit introduction until build scripts are updated
- Loading branch information
Showing
with
449 additions
and 4 deletions.
- +328 −0 test/data/testrunner.js
- +117 −0 test/data/testsuite.css
- +2 −2 test/index.html
- +2 −2 test/offset.html
| @@ -0,0 +1,328 @@ | ||
| var _config = { | ||
| fixture: null, | ||
| Test: [], | ||
| stats: { | ||
| all: 0, | ||
| bad: 0 | ||
| }, | ||
| queue: [], | ||
| blocking: true, | ||
| timeout: null, | ||
| expected: null, | ||
| currentModule: null, | ||
| asyncTimeout: 2 // seconds for async timeout | ||
| }; | ||
|
|
||
| _config.filters = location.search.length > 1 && //restrict modules/tests by get parameters | ||
| $.map( location.search.slice(1).split('&'), decodeURIComponent ); | ||
|
|
||
| var isLocal = !!(window.location.protocol == 'file:'); | ||
|
|
||
| $(function() { | ||
| $('#userAgent').html(navigator.userAgent); | ||
| runTest(); | ||
| }); | ||
|
|
||
| function synchronize(callback) { | ||
| _config.queue[_config.queue.length] = callback; | ||
| if(!_config.blocking) { | ||
| process(); | ||
| } | ||
| } | ||
|
|
||
| function process() { | ||
| while(_config.queue.length && !_config.blocking) { | ||
| var call = _config.queue[0]; | ||
| _config.queue = _config.queue.slice(1); | ||
| call(); | ||
| } | ||
| } | ||
|
|
||
| function stop(allowFailure) { | ||
| _config.blocking = true; | ||
| var handler = allowFailure ? start : function() { | ||
| ok( false, "Test timed out" ); | ||
| start(); | ||
| }; | ||
| // Disabled, caused too many random errors | ||
| //_config.timeout = setTimeout(handler, _config.asyncTimeout * 1000); | ||
| } | ||
| function start() { | ||
| // A slight delay, to avoid any current callbacks | ||
| setTimeout(function(){ | ||
| if(_config.timeout) | ||
| clearTimeout(_config.timeout); | ||
| _config.blocking = false; | ||
| process(); | ||
| }, 13); | ||
| } | ||
|
|
||
| function validTest( name ) { | ||
| var filters = _config.filters; | ||
| if( !filters ) | ||
| return true; | ||
|
|
||
| var i = filters.length, | ||
| run = false; | ||
| while( i-- ){ | ||
| var filter = filters[i], | ||
| not = filter.charAt(0) == '!'; | ||
| if( not ) | ||
| filter = filter.slice(1); | ||
| if( name.indexOf(filter) != -1 ) | ||
| return !not; | ||
| if( not ) | ||
| run = true; | ||
| } | ||
| return run; | ||
| } | ||
|
|
||
| function runTest() { | ||
| _config.blocking = false; | ||
| var time = new Date(); | ||
| _config.fixture = document.getElementById('main').innerHTML; | ||
| _config.ajaxSettings = $.ajaxSettings; | ||
| synchronize(function() { | ||
| time = new Date() - time; | ||
| $("<div>").html(['<p class="result">Tests completed in ', | ||
| time, ' milliseconds.<br/>', | ||
| _config.stats.bad, ' tests of ', _config.stats.all, ' failed.</p>'] | ||
| .join('')) | ||
| .appendTo("body"); | ||
| $("#banner").addClass(_config.stats.bad ? "fail" : "pass"); | ||
| }); | ||
| } | ||
|
|
||
| function test(name, callback, nowait) { | ||
| if(_config.currentModule) | ||
| name = _config.currentModule + " module: " + name; | ||
|
|
||
| if ( !validTest(name) ) | ||
| return; | ||
|
|
||
| synchronize(function() { | ||
| _config.Test = []; | ||
| try { | ||
| callback(); | ||
| } catch(e) { | ||
| if( typeof console != "undefined" && console.error && console.warn ) { | ||
| console.error("Test " + name + " died, exception and test follows"); | ||
| console.error(e); | ||
| console.warn(callback.toString()); | ||
| } | ||
| _config.Test.push( [ false, "Died on test #" + (_config.Test.length+1) + ": " + e ] ); | ||
| } | ||
| }); | ||
| synchronize(function() { | ||
| reset(); | ||
|
|
||
| // don't output pause tests | ||
| if(nowait) return; | ||
|
|
||
| if(_config.expected && _config.expected != _config.Test.length) { | ||
| _config.Test.push( [ false, "Expected " + _config.expected + " assertions, but " + _config.Test.length + " were run" ] ); | ||
| } | ||
| _config.expected = null; | ||
|
|
||
| var good = 0, bad = 0; | ||
| var ol = document.createElement("ol"); | ||
| ol.style.display = "none"; | ||
| var li = "", state = "pass"; | ||
| for ( var i = 0; i < _config.Test.length; i++ ) { | ||
| var li = document.createElement("li"); | ||
| li.className = _config.Test[i][0] ? "pass" : "fail"; | ||
| li.innerHTML = _config.Test[i][1]; | ||
| ol.appendChild( li ); | ||
|
|
||
| _config.stats.all++; | ||
| if ( !_config.Test[i][0] ) { | ||
| state = "fail"; | ||
| bad++; | ||
| _config.stats.bad++; | ||
| } else good++; | ||
| } | ||
|
|
||
| var li = document.createElement("li"); | ||
| li.className = state; | ||
|
|
||
| var b = document.createElement("strong"); | ||
| b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + _config.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"; | ||
| }; | ||
| $(b).dblclick(function(event) { | ||
| var target = jQuery(event.target).filter("strong").clone(); | ||
| if ( target.length ) { | ||
| target.children().remove(); | ||
| location.href = location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent($.trim(target.text())); | ||
| } | ||
| }); | ||
| li.appendChild( b ); | ||
| li.appendChild( ol ); | ||
|
|
||
| document.getElementById("tests").appendChild( li ); | ||
| }); | ||
| } | ||
|
|
||
| // call on start of module test to prepend name to all tests | ||
| function module(moduleName) { | ||
| _config.currentModule = moduleName; | ||
| } | ||
|
|
||
| /** | ||
| * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. | ||
| */ | ||
| function expect(asserts) { | ||
| _config.expected = asserts; | ||
| } | ||
|
|
||
| /** | ||
| * Resets the test setup. Useful for tests that modify the DOM. | ||
| */ | ||
| function reset() { | ||
| $("#main").html( _config.fixture ); | ||
| $.event.global = {}; | ||
| $.ajaxSettings = $.extend({}, _config.ajaxSettings); | ||
| } | ||
|
|
||
| /** | ||
| * Asserts true. | ||
| * @example ok( $("a").size() > 5, "There must be at least 5 anchors" ); | ||
| */ | ||
| function ok(a, msg) { | ||
| _config.Test.push( [ !!a, msg ] ); | ||
| } | ||
|
|
||
| /** | ||
| * Asserts that two arrays are the same | ||
| */ | ||
| function isSet(a, b, msg) { | ||
| var ret = true; | ||
| if ( a && b && a.length != undefined && a.length == b.length ) { | ||
| for ( var i = 0; i < a.length; i++ ) | ||
| if ( a[i] != b[i] ) | ||
| ret = false; | ||
| } else | ||
| ret = false; | ||
| if ( !ret ) | ||
| _config.Test.push( [ ret, msg + " expected: " + serialArray(b) + " result: " + serialArray(a) ] ); | ||
| else | ||
| _config.Test.push( [ ret, msg ] ); | ||
| } | ||
|
|
||
| /** | ||
| * Asserts that two objects are equivalent | ||
| */ | ||
| function isObj(a, b, msg) { | ||
| var ret = true; | ||
|
|
||
| if ( a && b ) { | ||
| for ( var i in a ) | ||
| if ( a[i] != b[i] ) | ||
| ret = false; | ||
|
|
||
| for ( i in b ) | ||
| if ( a[i] != b[i] ) | ||
| ret = false; | ||
| } else | ||
| ret = false; | ||
|
|
||
| _config.Test.push( [ ret, msg ] ); | ||
| } | ||
|
|
||
| function serialArray( a ) { | ||
| var r = []; | ||
|
|
||
| if ( a && a.length ) | ||
| for ( var i = 0; i < a.length; i++ ) { | ||
| var str = a[i].nodeName; | ||
| if ( str ) { | ||
| str = str.toLowerCase(); | ||
| if ( a[i].id ) | ||
| str += "#" + a[i].id; | ||
| } else | ||
| str = a[i]; | ||
| r.push( str ); | ||
| } | ||
|
|
||
| return "[ " + r.join(", ") + " ]"; | ||
| } | ||
|
|
||
| /** | ||
| * 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(b); | ||
| var s = ""; | ||
| for ( var i = 0; i < f.length; i++ ) | ||
| s += (s && ",") + '"' + f[i].id + '"'; | ||
| isSet(f, q.apply(q,c), a + " (" + b + ")"); | ||
| } | ||
|
|
||
| /** | ||
| * Add random number to url to stop IE from caching | ||
| * | ||
| * @example url("data/test.html") | ||
| * @result "data/test.html?10538358428943" | ||
| * | ||
| * @example url("data/test.php?foo=bar") | ||
| * @result "data/test.php?foo=bar&10538358345554" | ||
| */ | ||
| function url(value) { | ||
| return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000); | ||
| } | ||
|
|
||
| /** | ||
| * Checks that the first two arguments are equal, with an optional message. | ||
| * Prints out both expected and actual values on failure. | ||
| * | ||
| * Prefered to ok( expected == actual, message ) | ||
| * | ||
| * @example equals( "Expected 2 characters.", v.formatMessage("Expected {0} characters.", 2) ); | ||
| * | ||
| * @param Object actual | ||
| * @param Object expected | ||
| * @param String message (optional) | ||
| */ | ||
| function equals(actual, expected, message) { | ||
| var result = expected == actual; | ||
| message = message || (result ? "okay" : "failed"); | ||
| _config.Test.push( [ result, result ? message + ": " + expected : message + " expected: " + expected + " actual: " + actual ] ); | ||
| } | ||
|
|
||
| /** | ||
| * Trigger an event on an element. | ||
| * | ||
| * @example triggerEvent( document.body, "click" ); | ||
| * | ||
| * @param DOMElement elem | ||
| * @param String type | ||
| */ | ||
| function triggerEvent( elem, type, event ) { | ||
| if ( jQuery.browser.mozilla || jQuery.browser.opera ) { | ||
| event = document.createEvent("MouseEvents"); | ||
| event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, | ||
| 0, 0, 0, 0, 0, false, false, false, false, 0, null); | ||
| elem.dispatchEvent( event ); | ||
| } else if ( jQuery.browser.msie ) { | ||
| elem.fireEvent("on"+type); | ||
| } | ||
| } |
Oops, something went wrong.
0 comments on commit
aec0dad