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