( function() { // Can't test what ain't there if ( !jQuery.fx ) { 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() { this.sandbox = sinon.createSandbox(); this.clock = this.sandbox.useFakeTimers( startTime ); this._oldInterval = jQuery.fx.interval; window.requestAnimationFrame = null; 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.resetHistory(); element = jQuery( "