Update jquery.qunit from upstream v1.8.0 to v1.9.0
authorTimo Tijhof <ttijhof@wikimedia.org>
Fri, 27 Jul 2012 23:09:20 +0000 (16:09 -0700)
committerTimo Tijhof <ttijhof@wikimedia.org>
Fri, 27 Jul 2012 23:09:20 +0000 (16:09 -0700)
* Upstream https://github.com/jquery/qunit.git
 - tag: v1.9.0
 - tree: https://github.com/jquery/qunit/tree/v1.9.0
 - commit: https://github.com/jquery/qunit/commit/e36f17de98b2813df25ef8d3a504139f488971d2

* Also update our testrunner.js since the format of
  QUnit.config.urlConfig has changed (it is still backwards
  compatible, but we might as well use the new format right away,
  as it makes the checkboxes look better).

Change-Id: Ia5a9eb7a40a438c126879497ec0dbecbb72e0edb

resources/jquery/jquery.qunit.css
resources/jquery/jquery.qunit.js
tests/qunit/data/testrunner.js

index 5684a44..257b224 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.8.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.9.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
        line-height: 1em;
        font-weight: normal;
 
-       border-radius: 15px 15px 0 0;
-       -moz-border-radius: 15px 15px 0 0;
-       -webkit-border-top-right-radius: 15px;
-       -webkit-border-top-left-radius: 15px;
+       border-radius: 5px 5px 0 0;
+       -moz-border-radius: 5px 5px 0 0;
+       -webkit-border-top-right-radius: 5px;
+       -webkit-border-top-left-radius: 5px;
 }
 
 #qunit-header a {
@@ -54,9 +54,9 @@
        color: #fff;
 }
 
-#qunit-header label {
+#qunit-testrunner-toolbar label {
        display: inline-block;
-       padding-left: 0.5em;
+       padding: 0 .5em 0 .1em;
 }
 
 #qunit-banner {
 
        background-color: #fff;
 
-       border-radius: 15px;
-       -moz-border-radius: 15px;
-       -webkit-border-radius: 15px;
-
-       box-shadow: inset 0px 2px 13px #999;
-       -moz-box-shadow: inset 0px 2px 13px #999;
-       -webkit-box-shadow: inset 0px 2px 13px #999;
+       border-radius: 5px;
+       -moz-border-radius: 5px;
+       -webkit-border-radius: 5px;
 }
 
 #qunit-tests table {
 #qunit-tests b.failed                       { color: #710909; }
 
 #qunit-tests li li {
-       margin: 0.5em;
-       padding: 0.4em 0.5em 0.4em 0.5em;
+       padding: 5px;
        background-color: #fff;
        border-bottom: none;
        list-style-position: inside;
 /*** Passing Styles */
 
 #qunit-tests li li.pass {
-       color: #5E740B;
+       color: #3c510c;
        background-color: #fff;
-       border-left: 26px solid #C6E746;
+       border-left: 10px solid #C6E746;
 }
 
 #qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
 #qunit-tests li li.fail {
        color: #710909;
        background-color: #fff;
-       border-left: 26px solid #EE5757;
+       border-left: 10px solid #EE5757;
        white-space: pre;
 }
 
 #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;
+       border-radius: 0 0 5px 5px;
+       -moz-border-radius: 0 0 5px 5px;
+       -webkit-border-bottom-right-radius: 5px;
+       -webkit-border-bottom-left-radius: 5px;
 }
 
 #qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
index c1570c2..9efedcb 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.8.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.9.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
@@ -403,6 +403,8 @@ QUnit = {
 QUnit.assert = {
        /**
         * Asserts rough true-ish result.
+        * @name ok
+        * @function
         * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
         */
        ok: function( result, msg ) {
@@ -437,36 +439,59 @@ QUnit.assert = {
        /**
         * Assert that the first two arguments are equal, with an optional message.
         * Prints out both actual and expected values.
+        * @name equal
+        * @function
         * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
         */
        equal: function( actual, expected, message ) {
                QUnit.push( expected == actual, actual, expected, message );
        },
 
+       /**
+        * @name notEqual
+        * @function
+        */
        notEqual: function( actual, expected, message ) {
                QUnit.push( expected != actual, actual, expected, message );
        },
 
+       /**
+        * @name deepEqual
+        * @function
+        */
        deepEqual: function( actual, expected, message ) {
                QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
        },
 
+       /**
+        * @name notDeepEqual
+        * @function
+        */
        notDeepEqual: function( actual, expected, message ) {
                QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
        },
 
+       /**
+        * @name strictEqual
+        * @function
+        */
        strictEqual: function( actual, expected, message ) {
                QUnit.push( expected === actual, actual, expected, message );
        },
 
+       /**
+        * @name notStrictEqual
+        * @function
+        */
        notStrictEqual: function( actual, expected, message ) {
                QUnit.push( expected !== actual, actual, expected, message );
        },
 
-       raises: function( block, expected, message ) {
+       throws: function( block, expected, message ) {
                var actual,
                        ok = false;
 
+               // 'expected' is optional
                if ( typeof expected === "string" ) {
                        message = expected;
                        expected = null;
@@ -494,18 +519,29 @@ QUnit.assert = {
                        } else if ( expected.call( {}, actual ) === true ) {
                                ok = true;
                        }
-               }
 
-               QUnit.push( ok, actual, null, message );
+                       QUnit.push( ok, actual, null, message );
+               } else {
+                       QUnit.pushFailure( message, null, 'No exception was thrown.' );
+               }
        }
 };
 
-// @deprecated: Kept assertion helpers in root for backwards compatibility
+/**
+ * @deprecate since 1.8.0
+ * Kept assertion helpers in root for backwards compatibility
+ */
 extend( QUnit, QUnit.assert );
 
 /**
- * @deprecated: Kept for backwards compatibility
- * next step: remove entirely
+ * @deprecated since 1.9.0
+ * Kept global "raises()" for backwards compatibility
+ */
+QUnit.raises = QUnit.assert.throws;
+
+/**
+ * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
+ * Kept to avoid TypeErrors for undefined methods.
  */
 QUnit.equals = function() {
        QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
@@ -549,7 +585,20 @@ config = {
        // when enabled, all tests must call expect()
        requireExpects: false,
 
-       urlConfig: [ "noglobals", "notrycatch" ],
+       // add checkboxes that are persisted in the query-string
+       // when enabled, the id is set to `true` as a `QUnit.config` property
+       urlConfig: [
+               {
+                       id: "noglobals",
+                       label: "Check for Globals",
+                       tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
+               },
+               {
+                       id: "notrycatch",
+                       label: "No try-catch",
+                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
+               }
+       ],
 
        // logging callback queues
        begin: [],
@@ -770,7 +819,7 @@ extend( QUnit, {
                });
        },
 
-       pushFailure: function( message, source ) {
+       pushFailure: function( message, source, actual ) {
                if ( !config.current ) {
                        throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
                }
@@ -781,15 +830,23 @@ extend( QUnit, {
                                message: message
                        };
 
-               message = escapeInnerText(message ) || "error";
+               message = escapeInnerText( message ) || "error";
                message = "<span class='test-message'>" + message + "</span>";
                output = message;
 
+               output += "<table>";
+
+               if ( actual ) {
+                       output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeInnerText( actual ) + "</pre></td></tr>";
+               }
+
                if ( source ) {
                        details.source = source;
-                       output += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
+                       output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
                }
 
+               output += "</table>";
+
                runLoggingCallbacks( "log", QUnit, details );
 
                config.current.assertions.push({
@@ -859,7 +916,7 @@ QUnit.load = function() {
        runLoggingCallbacks( "begin", QUnit, {} );
 
        // Initialize the config, saving the execution queue
-       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes,
                urlConfigHtml = "",
                oldconfig = extend( {}, config );
 
@@ -872,8 +929,15 @@ QUnit.load = function() {
 
        for ( i = 0; i < len; i++ ) {
                val = config.urlConfig[i];
-               config[val] = QUnit.urlParams[val];
-               urlConfigHtml += "<label><input name='" + val + "' type='checkbox'" + ( config[val] ? " checked='checked'" : "" ) + ">" + val + "</label>";
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val,
+                               tooltip: "[no tooltip available]"
+                       };
+               }
+               config[ val.id ] = QUnit.urlParams[ val.id ];
+               urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
        }
 
        // `userAgent` initialized at top of scope
@@ -885,12 +949,7 @@ QUnit.load = function() {
        // `banner` initialized at top of scope
        banner = id( "qunit-header" );
        if ( banner ) {
-               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined }) + "'>" + banner.innerHTML + "</a> " + urlConfigHtml;
-               addEvent( banner, "change", function( event ) {
-                       var params = {};
-                       params[ event.target.name ] = event.target.checked ? true : undefined;
-                       window.location = QUnit.url( params );
-               });
+               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
        }
 
        // `toolbar` initialized at top of scope
@@ -931,8 +990,18 @@ QUnit.load = function() {
                // `label` initialized at top of scope
                label = document.createElement( "label" );
                label.setAttribute( "for", "qunit-filter-pass" );
+               label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." );
                label.innerHTML = "Hide passed tests";
                toolbar.appendChild( label );
+
+               urlConfigCheckboxes = document.createElement( 'span' );
+               urlConfigCheckboxes.innerHTML = urlConfigHtml;
+               addEvent( urlConfigCheckboxes, "change", function( event ) {
+                       var params = {};
+                       params[ event.target.name ] = event.target.checked ? true : undefined;
+                       window.location = QUnit.url( params );
+               });
+               toolbar.appendChild( urlConfigCheckboxes );
        }
 
        // `main` initialized at top of scope
@@ -1051,14 +1120,14 @@ function done() {
 function validTest( test ) {
        var include,
                filter = config.filter && config.filter.toLowerCase(),
-               module = config.module,
+               module = config.module && config.module.toLowerCase(),
                fullName = (test.module + ": " + test.testName).toLowerCase();
 
        if ( config.testNumber ) {
                return test.testNumber === config.testNumber;
        }
 
-       if ( module && test.module !== module ) {
+       if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
                return false;
        }
 
index 848384b..57b1acb 100644 (file)
@@ -26,7 +26,11 @@ QUnit.fixurl = function ( value ) {
 QUnit.config.testTimeout = 10 * 1000;
 
 // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
-QUnit.config.urlConfig.push( 'debug' );
+QUnit.config.urlConfig.push( {
+       id: 'debug',
+       label: 'Enable ResourceLoaderDebug',
+       tooltip: 'Enable debug mode in ResourceLoader'
+} );
 
 /**
  * Load TestSwarm agent
@@ -45,7 +49,11 @@ if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) )
  * CompletenessTest
  */
 // Adds toggle checkbox to header
-QUnit.config.urlConfig.push( 'completenesstest' );
+QUnit.config.urlConfig.push( {
+       id: 'completenesstest',
+       label: 'Run CompletenessTest',
+       tooltip: 'Run the completeness test'
+} );
 
 // Initiate when enabled
 if ( QUnit.urlParams.completenesstest ) {