| ( 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 = {}; | 
 | 		} | 
 | 	}; | 
 | } )(); | 
 |  | 
 | } )(); |