]> source.dussan.org Git - jquery-ui.git/commitdiff
Updated to latest QUnit
authorjzaefferer <joern.zaefferer@gmail.com>
Sun, 20 Mar 2011 14:56:32 +0000 (15:56 +0100)
committerjzaefferer <joern.zaefferer@gmail.com>
Sun, 20 Mar 2011 14:56:32 +0000 (15:56 +0100)
external/qunit.css
external/qunit.js

index 500d404e33d69395426c4581cb77cabd203d3da1..78a7d7e3d0d9da414eff4dd3bb31d82c05511b66 100644 (file)
        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;
        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; }
 #qunit-banner.qunit-fail                    { background-color: #EE5757; }
 
 
-/** Footer */
+/** Result */
 
 #qunit-testresult {
        padding: 0.5em 0.5em 0.5em 2.5em;
        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 */
        position: absolute;
        top: -10000px;
        left: -10000px;
-}
\ No newline at end of file
+}
index 3d7e7c1f3820ba96f1e79db6b0d260722c1d8389..8702871487228659da9368fceed7d966dacb1163 100644 (file)
@@ -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/>&nbsp;';
+               }
        },
        
        /**
@@ -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> &#8250; <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);