( function() { "use strict"; // Store the old count so that we only assert on tests that have actually leaked, // instead of asserting every time a test has leaked sometime in the past var oldActive = 0, splice = [].splice, ajaxSettings = jQuery.ajaxSettings; /** * QUnit configuration */ // Max time for done() to fire in an async test. QUnit.config.testTimeout = 60e3; // 1 minute // Enforce an "expect" argument or expect() call in all test bodies. QUnit.config.requireExpects = true; /** * Ensures that tests have cleaned up properly after themselves. Should be passed as the * teardown function on all modules' lifecycle object. */ window.moduleTeardown = function( assert ) { // Check for (and clean up, if possible) incomplete animations/requests/etc. if ( jQuery.timers && jQuery.timers.length !== 0 ) { assert.equal( jQuery.timers.length, 0, "No timers are still running" ); splice.call( jQuery.timers, 0, jQuery.timers.length ); jQuery.fx.stop(); } if ( jQuery.active !== undefined && jQuery.active !== oldActive ) { assert.equal( jQuery.active, oldActive, "No AJAX requests are still active" ); if ( ajaxTest.abort ) { ajaxTest.abort( "active requests" ); } oldActive = jQuery.active; } Globals.cleanup(); }; QUnit.done( function() { // Remove our own fixtures outside #qunit-fixture supportjQuery( "#qunit ~ *" ).remove(); } ); QUnit.testDone( function() { // Ensure jQuery events and data on the fixture are properly removed jQuery( "#qunit-fixture" ).empty(); // ...even if the jQuery under test has a broken .empty() supportjQuery( "#qunit-fixture" ).empty(); // Remove the iframe fixture supportjQuery( "#qunit-fixture-iframe" ).remove(); // Reset internal jQuery state jQuery.event.global = {}; if ( ajaxSettings ) { jQuery.ajaxSettings = jQuery.extend( true, {}, ajaxSettings ); } else { delete jQuery.ajaxSettings; } // Cleanup globals Globals.cleanup(); } ); // Register globals for cleanup and the cleanup code itself window.Globals = ( function() { var globals = {}; return { register: function( name ) { window[ name ] = globals[ name ] = true; }, cleanup: function() { var name; for ( name in globals ) { delete window[ name ]; } globals = {}; } }; } )(); } )();