diff options
-rw-r--r-- | external/qunit.css | 30 | ||||
-rw-r--r-- | external/qunit.js | 189 |
2 files changed, 133 insertions, 86 deletions
diff --git a/external/qunit.css b/external/qunit.css index 500d404e3..78a7d7e3d 100644 --- a/external/qunit.css +++ b/external/qunit.css @@ -74,10 +74,24 @@ list-style-position: inside; } +#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { + display: none; +} + #qunit-tests li strong { cursor: pointer; } +#qunit-tests li a { + padding: 0.5em; + color: #c2ccd1; + text-decoration: none; +} +#qunit-tests li a:hover, +#qunit-tests li a:focus { + color: #000; +} + #qunit-tests ol { margin-top: 0.5em; padding: 0.5em; @@ -164,6 +178,13 @@ border-left: 26px solid #EE5757; } +#qunit-tests > li:last-child { + border-radius: 0 0 15px 15px; + -moz-border-radius: 0 0 15px 15px; + -webkit-border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; +} + #qunit-tests .fail { color: #000000; background-color: #EE5757; } #qunit-tests .fail .test-name, #qunit-tests .fail .module-name { color: #000000; } @@ -174,7 +195,7 @@ #qunit-banner.qunit-fail { background-color: #EE5757; } -/** Footer */ +/** Result */ #qunit-testresult { padding: 0.5em 0.5em 0.5em 2.5em; @@ -182,10 +203,7 @@ color: #2b81af; background-color: #D2E0E6; - border-radius: 0 0 15px 15px; - -moz-border-radius: 0 0 15px 15px; - -webkit-border-bottom-right-radius: 15px; - -webkit-border-bottom-left-radius: 15px; + border-bottom: 1px solid white; } /** Fixture */ @@ -194,4 +212,4 @@ position: absolute; top: -10000px; left: -10000px; -}
\ No newline at end of file +} diff --git a/external/qunit.js b/external/qunit.js index 3d7e7c1f3..870287148 100644 --- a/external/qunit.js +++ b/external/qunit.js @@ -19,7 +19,7 @@ var defined = { return false; } })() -} +}; var testId = 0; @@ -40,6 +40,7 @@ Test.prototype = { b.innerHTML = "Running " + this.name; var li = document.createElement("li"); li.appendChild( b ); + li.className = "running"; li.id = this.id = "test-output" + testId++; tests.appendChild( li ); } @@ -151,7 +152,13 @@ Test.prototype = { } // store result when possible - defined.sessionStorage && sessionStorage.setItem("qunit-" + this.testName, bad); + if ( QUnit.config.reorder && defined.sessionStorage ) { + if (bad) { + sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad) + } else { + sessionStorage.removeItem("qunit-" + this.testName); + } + } if (bad == 0) { ol.style.display = "none"; @@ -160,8 +167,13 @@ Test.prototype = { var b = document.createElement("strong"); b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>"; + var a = document.createElement("a"); + a.innerHTML = "Rerun"; + a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); + addEvent(b, "click", function() { - var next = b.nextSibling, display = next.style.display; + var next = b.nextSibling.nextSibling, + display = next.style.display; next.style.display = display === "none" ? "block" : "none"; }); @@ -171,15 +183,15 @@ Test.prototype = { target = target.parentNode; } if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location.search = "?" + encodeURIComponent(getText([target]).replace(/\(.+\)$/, "").replace(/(^\s*|\s*$)/g, "")); + window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); } }); var li = id(this.id); li.className = bad ? "fail" : "pass"; - li.style.display = resultDisplayStyle(!bad); li.removeChild( li.firstChild ); li.appendChild( b ); + li.appendChild( a ); li.appendChild( ol ); } else { @@ -227,7 +239,7 @@ Test.prototype = { }); } // defer when previous test run passed, if storage is available - var bad = defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.testName); + var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName); if (bad) { run(); } else { @@ -235,7 +247,7 @@ Test.prototype = { }; } -} +}; var QUnit = { @@ -413,7 +425,6 @@ var QUnit = { }, timeout); } } - }; // Backwards compatibility, deprecated @@ -426,33 +437,40 @@ var config = { queue: [], // block until document ready - blocking: true + blocking: true, + + // by default, run previously failed tests first + // very useful in combination with "Hide passed tests" checked + reorder: true, + + noglobals: false, + notrycatch: false }; // Load paramaters (function() { var location = window.location || { search: "", protocol: "file:" }, - GETParams = location.search.slice(1).split('&'); - - for ( var i = 0; i < GETParams.length; i++ ) { - GETParams[i] = decodeURIComponent( GETParams[i] ); - if ( GETParams[i] === "noglobals" ) { - GETParams.splice( i, 1 ); - i--; - config.noglobals = true; - } else if ( GETParams[i] === "notrycatch" ) { - GETParams.splice( i, 1 ); - i--; - config.notrycatch = true; - } else if ( GETParams[i].search('=') > -1 ) { - GETParams.splice( i, 1 ); - i--; + params = location.search.slice( 1 ).split( "&" ), + length = params.length, + urlParams = {}, + current; + + if ( params[ 0 ] ) { + for ( var i = 0; i < length; i++ ) { + current = params[ i ].split( "=" ); + current[ 0 ] = decodeURIComponent( current[ 0 ] ); + // allow just a key to turn on a flag, e.g., test.html?noglobals + current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; + urlParams[ current[ 0 ] ] = current[ 1 ]; + if ( current[ 0 ] in config ) { + config[ current[ 0 ] ] = current[ 1 ]; + } } } - - // restrict modules/tests by get parameters - config.filters = GETParams; - + + QUnit.urlParams = urlParams; + config.filter = urlParams.filter; + // Figure out if we're running the tests from a server or not QUnit.isLocal = !!(location.protocol === 'file:'); })(); @@ -481,14 +499,14 @@ extend(QUnit, { blocking: false, autostart: true, autorun: false, - filters: [], + filter: "", queue: [], semaphore: 0 }); - var tests = id("qunit-tests"), - banner = id("qunit-banner"), - result = id("qunit-testresult"); + var tests = id( "qunit-tests" ), + banner = id( "qunit-banner" ), + result = id( "qunit-testresult" ); if ( tests ) { tests.innerHTML = ""; @@ -501,6 +519,14 @@ extend(QUnit, { if ( result ) { result.parentNode.removeChild( result ); } + + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = 'Running...<br/> '; + } }, /** @@ -612,6 +638,17 @@ extend(QUnit, { }); }, + url: function( params ) { + params = extend( extend( {}, QUnit.urlParams ), params ); + var querystring = "?", + key; + for ( key in params ) { + querystring += encodeURIComponent( key ) + "=" + + encodeURIComponent( params[ key ] ) + "&"; + } + return window.location.pathname + querystring.slice( 0, -1 ); + }, + // Logging callbacks; all receive a single argument with the listed properties // run test/logs.html for any related changes begin: function() {}, @@ -649,16 +686,14 @@ addEvent(window, "load", function() { } var banner = id("qunit-header"); if ( banner ) { - var paramsIndex = location.href.lastIndexOf(location.search); - if ( paramsIndex > -1 ) { - var mainPageLocation = location.href.slice(0, paramsIndex); - if ( mainPageLocation == location.href ) { - banner.innerHTML = '<a href=""> ' + banner.innerHTML + '</a> '; - } else { - var testName = decodeURIComponent(location.search.slice(1)); - banner.innerHTML = '<a href="' + mainPageLocation + '">' + banner.innerHTML + '</a> › <a href="">' + testName + '</a>'; - } - } + banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + + '<label><input name="noglobals" type="checkbox"' + ( config.noglobals ? ' checked="checked"' : '' ) + '>noglobals</label>' + + '<label><input name="notrycatch" type="checkbox"' + ( config.notrycatch ? ' checked="checked"' : '' ) + '>notrycatch</label>'; + addEvent( banner, "change", function( event ) { + var params = {}; + params[ event.target.name ] = event.target.checked ? true : undefined; + window.location = QUnit.url( params ); + }); } var toolbar = id("qunit-testrunner-toolbar"); @@ -667,18 +702,25 @@ addEvent(window, "load", function() { filter.type = "checkbox"; filter.id = "qunit-filter-pass"; addEvent( filter, "click", function() { - var li = document.getElementsByTagName("li"); - for ( var i = 0; i < li.length; i++ ) { - if ( li[i].className.indexOf("pass") > -1 ) { - li[i].style.display = filter.checked ? "none" : ""; - } + var ol = document.getElementById("qunit-tests"); + if ( filter.checked ) { + ol.className = ol.className + " hidepass"; + } else { + var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; + ol.className = tmp.replace(/ hidepass /, " "); } if ( defined.sessionStorage ) { - sessionStorage.setItem("qunit-filter-passed-tests", filter.checked ? "true" : ""); + if (filter.checked) { + sessionStorage.setItem("qunit-filter-passed-tests", "true"); + } else { + sessionStorage.removeItem("qunit-filter-passed-tests"); + } } }); if ( defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) { filter.checked = true; + var ol = document.getElementById("qunit-tests"); + ol.className = ol.className + " hidepass"; } toolbar.appendChild( filter ); @@ -733,16 +775,7 @@ function done() { } if ( tests ) { - var result = id("qunit-testresult"); - - if ( !result ) { - result = document.createElement("p"); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests.nextSibling ); - } - - result.innerHTML = html; + id( "qunit-testresult" ).innerHTML = html; } QUnit.done( { @@ -754,28 +787,24 @@ function done() { } function validTest( name ) { - var i = config.filters.length, + var filter = config.filter, run = false; - if ( !i ) { + if ( !filter ) { return true; } - - while ( i-- ) { - var filter = config.filters[i], - not = filter.charAt(0) == '!'; - if ( not ) { - filter = filter.slice(1); - } + not = filter.charAt( 0 ) === "!"; + if ( not ) { + filter = filter.slice( 1 ); + } - if ( name.indexOf(filter) !== -1 ) { - return !not; - } + if ( name.indexOf( filter ) !== -1 ) { + return !not; + } - if ( not ) { - run = true; - } + if ( not ) { + run = true; } return run; @@ -797,10 +826,6 @@ function sourceFromStacktrace() { } } -function resultDisplayStyle(passed) { - return passed && id("qunit-filter-pass") && id("qunit-filter-pass").checked ? 'none' : ''; -} - function escapeHtml(s) { if (!s) { return ""; @@ -897,7 +922,11 @@ function fail(message, exception, callback) { function extend(a, b) { for ( var prop in b ) { - a[prop] = b[prop]; + if ( b[prop] === undefined ) { + delete a[prop]; + } else { + a[prop] = b[prop]; + } } return a; @@ -1188,7 +1217,7 @@ QUnit.jsDump = (function() { error:'[ERROR]', //when no parser is found, shouldn't happen unknown: '[Unknown]', 'null':'null', - undefined:'undefined', + 'undefined':'undefined', 'function':function( fn ) { var ret = 'function', name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE @@ -1412,4 +1441,4 @@ QUnit.diff = (function() { }; })(); -})(this);
\ No newline at end of file +})(this); |