| ( function() { | 
 |  | 
 | // Can't test what ain't there | 
 | if ( !includesModule( "effects" ) ) { | 
 | 	return; | 
 | } | 
 |  | 
 | var oldRaf = window.requestAnimationFrame, | 
 | 	defaultPrefilter = jQuery.Animation.prefilters[ 0 ], | 
 | 	defaultTweener = jQuery.Animation.tweeners[ "*" ][ 0 ], | 
 | 	startTime = 505877050; | 
 |  | 
 | // This module tests jQuery.Animation and the corresponding 1.8+ effects APIs | 
 | QUnit.module( "animation", { | 
 | 	beforeEach: function() { | 
 | 		window.requestAnimationFrame = null; | 
 | 		this.sandbox = sinon.sandbox.create(); | 
 | 		this.clock = this.sandbox.useFakeTimers( startTime ); | 
 | 		this._oldInterval = jQuery.fx.interval; | 
 | 		jQuery.fx.step = {}; | 
 | 		jQuery.fx.interval = 10; | 
 | 		jQuery.Animation.prefilters = [ defaultPrefilter ]; | 
 | 		jQuery.Animation.tweeners = { "*": [ defaultTweener ] }; | 
 | 	}, | 
 | 	afterEach: function() { | 
 | 		this.sandbox.restore(); | 
 | 		jQuery.fx.stop(); | 
 | 		jQuery.fx.interval = this._oldInterval; | 
 | 		window.requestAnimationFrame = oldRaf; | 
 | 		return moduleTeardown.apply( this, arguments ); | 
 | 	} | 
 | } ); | 
 |  | 
 | QUnit.test( "Animation( subject, props, opts ) - shape", function( assert ) { | 
 | 	assert.expect( 20 ); | 
 |  | 
 | 	var subject = { test: 0 }, | 
 | 		props = { test: 1 }, | 
 | 		opts = { queue: "fx", duration: 100 }, | 
 | 		animation = jQuery.Animation( subject, props, opts ); | 
 |  | 
 | 	assert.equal( | 
 | 		animation.elem, | 
 | 		subject, | 
 | 		".elem is set to the exact object passed" | 
 | 	); | 
 | 	assert.equal( | 
 | 		animation.originalOptions, | 
 | 		opts, | 
 | 		".originalOptions is set to options passed" | 
 | 	); | 
 | 	assert.equal( | 
 | 		animation.originalProperties, | 
 | 		props, | 
 | 		".originalProperties is set to props passed" | 
 | 	); | 
 |  | 
 | 	assert.notEqual( animation.props, props, ".props is not the original however" ); | 
 | 	assert.deepEqual( animation.props, props, ".props is a copy of the original" ); | 
 |  | 
 | 	assert.deepEqual( animation.opts, { | 
 | 		duration: 100, | 
 | 		queue: "fx", | 
 | 		specialEasing: { test: undefined }, | 
 | 		easing: jQuery.easing._default | 
 | 	}, ".options is filled with default easing and specialEasing" ); | 
 |  | 
 | 	assert.equal( animation.startTime, startTime, "startTime was set" ); | 
 | 	assert.equal( animation.duration, 100, ".duration is set" ); | 
 |  | 
 | 	assert.equal( animation.tweens.length, 1, ".tweens has one Tween" ); | 
 | 	assert.equal( typeof animation.tweens[ 0 ].run, "function", "which has a .run function" ); | 
 |  | 
 | 	assert.equal( typeof animation.createTween, "function", ".createTween is a function" ); | 
 | 	assert.equal( typeof animation.stop, "function", ".stop is a function" ); | 
 |  | 
 | 	assert.equal( typeof animation.done, "function", ".done is a function" ); | 
 | 	assert.equal( typeof animation.fail, "function", ".fail is a function" ); | 
 | 	assert.equal( typeof animation.always, "function", ".always is a function" ); | 
 | 	assert.equal( typeof animation.progress, "function", ".progress is a function" ); | 
 |  | 
 | 	assert.equal( jQuery.timers.length, 1, "Added a timers function" ); | 
 | 	assert.equal( jQuery.timers[ 0 ].elem, subject, "...with .elem as the subject" ); | 
 | 	assert.equal( jQuery.timers[ 0 ].anim, animation, "...with .anim as the animation" ); | 
 | 	assert.equal( jQuery.timers[ 0 ].queue, opts.queue, "...with .queue" ); | 
 |  | 
 | 	// Cleanup after ourselves by ticking to the end | 
 | 	this.clock.tick( 100 ); | 
 | } ); | 
 |  | 
 | QUnit.test( "Animation.prefilter( fn ) - calls prefilter after defaultPrefilter", | 
 | 	function( assert ) { | 
 | 		assert.expect( 1 ); | 
 |  | 
 | 		var prefilter = this.sandbox.stub(), | 
 | 			defaultSpy = this.sandbox.spy( jQuery.Animation.prefilters, 0 ); | 
 |  | 
 | 		jQuery.Animation.prefilter( prefilter ); | 
 |  | 
 | 		jQuery.Animation( {}, {}, {} ); | 
 | 		assert.ok( prefilter.calledAfter( defaultSpy ), "our prefilter called after" ); | 
 | 	} | 
 | ); | 
 |  | 
 | QUnit.test( "Animation.prefilter( fn, true ) - calls prefilter before defaultPrefilter", | 
 | 	function( assert ) { | 
 | 		assert.expect( 1 ); | 
 |  | 
 | 		var prefilter = this.sandbox.stub(), | 
 | 			defaultSpy = this.sandbox.spy( jQuery.Animation.prefilters, 0 ); | 
 |  | 
 | 		jQuery.Animation.prefilter( prefilter, true ); | 
 |  | 
 | 		jQuery.Animation( {}, {}, {} ); | 
 | 		assert.ok( prefilter.calledBefore( defaultSpy ), "our prefilter called before" ); | 
 | 	} | 
 | ); | 
 |  | 
 | QUnit.test( "Animation.prefilter - prefilter return hooks", function( assert ) { | 
 | 	assert.expect( 34 ); | 
 |  | 
 | 	var animation, realAnimation, element, | 
 | 		sandbox = this.sandbox, | 
 | 		ourAnimation = { stop: this.sandbox.spy() }, | 
 | 		target = { height: 50 }, | 
 | 		props = { height: 100 }, | 
 | 		opts = { duration: 100 }, | 
 | 		prefilter = this.sandbox.spy( function() { | 
 | 			realAnimation = this; | 
 | 			sandbox.spy( realAnimation, "createTween" ); | 
 |  | 
 | 			assert.deepEqual( realAnimation.originalProperties, props, "originalProperties" ); | 
 | 			assert.equal( arguments[ 0 ], this.elem, "first param elem" ); | 
 | 			assert.equal( arguments[ 1 ], this.props, "second param props" ); | 
 | 			assert.equal( arguments[ 2 ], this.opts, "third param opts" ); | 
 | 			return ourAnimation; | 
 | 		} ), | 
 | 		defaultSpy = sandbox.spy( jQuery.Animation.prefilters, 0 ), | 
 | 		queueSpy = sandbox.spy( function( next ) { | 
 | 			next(); | 
 | 		} ), | 
 | 		TweenSpy = sandbox.spy( jQuery, "Tween" ); | 
 |  | 
 | 	jQuery.Animation.prefilter( prefilter, true ); | 
 |  | 
 | 	sandbox.stub( jQuery.fx, "timer" ); | 
 |  | 
 | 	animation = jQuery.Animation( target, props, opts ); | 
 |  | 
 | 	assert.equal( prefilter.callCount, 1, "Called prefilter" ); | 
 |  | 
 | 	assert.equal( | 
 | 		defaultSpy.callCount, | 
 | 		0, | 
 | 		"Returning something from a prefilter caused remaining prefilters to not run" | 
 | 	); | 
 | 	assert.equal( jQuery.fx.timer.callCount, 0, "Returning something never queues a timer" ); | 
 | 	assert.equal( | 
 | 		animation, | 
 | 		ourAnimation, | 
 | 		"Returning something returned it from jQuery.Animation" | 
 | 	); | 
 | 	assert.equal( | 
 | 		realAnimation.createTween.callCount, | 
 | 		0, | 
 | 		"Returning something never creates tweens" | 
 | 	); | 
 | 	assert.equal( TweenSpy.callCount, 0, "Returning something never creates tweens" ); | 
 |  | 
 | 	// Test overridden usage on queues: | 
 | 	prefilter.reset(); | 
 | 	element = jQuery( "<div>" ) | 
 | 		.css( "height", 50 ) | 
 | 		.animate( props, 100 ) | 
 | 		.queue( queueSpy ) | 
 | 		.animate( props, 100 ) | 
 | 		.queue( queueSpy ) | 
 | 		.animate( props, 100 ) | 
 | 		.queue( queueSpy ); | 
 |  | 
 | 	assert.equal( prefilter.callCount, 1, "Called prefilter" ); | 
 | 	assert.equal( queueSpy.callCount, 0, "Next function in queue not called" ); | 
 |  | 
 | 	realAnimation.opts.complete.call( realAnimation.elem ); | 
 | 	assert.equal( queueSpy.callCount, 1, "Next function in queue called after complete" ); | 
 |  | 
 | 	assert.equal( prefilter.callCount, 2, "Called prefilter again - animation #2" ); | 
 | 	assert.equal( ourAnimation.stop.callCount, 0, ".stop() on our animation hasn't been called" ); | 
 |  | 
 | 	element.stop(); | 
 | 	assert.equal( ourAnimation.stop.callCount, 1, ".stop() called ourAnimation.stop()" ); | 
 | 	assert.ok( | 
 | 		!ourAnimation.stop.args[ 0 ][ 0 ], | 
 | 		".stop( falsy ) (undefined or false are both valid)" | 
 | 	); | 
 |  | 
 | 	assert.equal( queueSpy.callCount, 2, "Next queue function called" ); | 
 | 	assert.ok( queueSpy.calledAfter( ourAnimation.stop ), "After our animation was told to stop" ); | 
 |  | 
 | 	// ourAnimation.stop.reset(); | 
 | 	assert.equal( prefilter.callCount, 3, "Got the next animation" ); | 
 |  | 
 | 	ourAnimation.stop.reset(); | 
 |  | 
 | 	// do not clear queue, gotoEnd | 
 | 	element.stop( false, true ); | 
 | 	assert.ok( ourAnimation.stop.calledWith( true ), ".stop(true) calls .stop(true)" ); | 
 | 	assert.ok( queueSpy.calledAfter( ourAnimation.stop ), | 
 | 		"and the next queue function ran after we were told" ); | 
 | } ); | 
 |  | 
 | QUnit.test( "Animation.tweener( fn ) - unshifts a * tweener", function( assert ) { | 
 | 	assert.expect( 2 ); | 
 | 	var starTweeners = jQuery.Animation.tweeners[ "*" ]; | 
 |  | 
 | 	jQuery.Animation.tweener( jQuery.noop ); | 
 | 	assert.equal( starTweeners.length, 2 ); | 
 | 	assert.deepEqual( starTweeners, [ jQuery.noop, defaultTweener ] ); | 
 | } ); | 
 |  | 
 | QUnit.test( "Animation.tweener( 'prop', fn ) - unshifts a 'prop' tweener", function( assert ) { | 
 | 	assert.expect( 4 ); | 
 | 	var tweeners = jQuery.Animation.tweeners, | 
 | 		fn = function() {}; | 
 |  | 
 | 	jQuery.Animation.tweener( "prop", jQuery.noop ); | 
 | 	assert.equal( tweeners.prop.length, 1 ); | 
 | 	assert.deepEqual( tweeners.prop, [ jQuery.noop ] ); | 
 |  | 
 | 	jQuery.Animation.tweener( "prop", fn ); | 
 | 	assert.equal( tweeners.prop.length, 2 ); | 
 | 	assert.deepEqual( tweeners.prop, [ fn, jQuery.noop ] ); | 
 | } ); | 
 |  | 
 | QUnit.test( | 
 | 	"Animation.tweener( 'list of props', fn ) - unshifts a tweener to each prop", | 
 | 	function( assert ) { | 
 | 		assert.expect( 2 ); | 
 | 		var tweeners = jQuery.Animation.tweeners, | 
 | 			fn = function() {}; | 
 |  | 
 | 		jQuery.Animation.tweener( "list of props", jQuery.noop ); | 
 | 		assert.deepEqual( tweeners, { | 
 | 			list: [ jQuery.noop ], | 
 | 			of: [ jQuery.noop ], | 
 | 			props: [ jQuery.noop ], | 
 | 			"*": [ defaultTweener ] | 
 | 		} ); | 
 |  | 
 | 		// Test with extra whitespaces | 
 | 		jQuery.Animation.tweener( " list\t of \tprops\n*", fn ); | 
 | 		assert.deepEqual( tweeners, { | 
 | 			list: [ fn, jQuery.noop ], | 
 | 			of: [ fn, jQuery.noop ], | 
 | 			props: [ fn, jQuery.noop ], | 
 | 			"*": [ fn, defaultTweener ] | 
 | 		} ); | 
 | 	} | 
 | ); | 
 |  | 
 | } )(); |