| QUnit.module( "queue", { afterEach: moduleTeardown } ); |
| |
| ( function() { |
| |
| if ( !includesModule( "queue" ) ) { |
| return; |
| } |
| |
| QUnit.test( "queue() with other types", function( assert ) { |
| var done = assert.async( 2 ); |
| assert.expect( 14 ); |
| |
| |
| var $div = jQuery( {} ), |
| counter = 0; |
| |
| $div.promise( "foo" ).done( function() { |
| assert.equal( counter, 0, "Deferred for collection with no queue is automatically resolved" ); |
| } ); |
| |
| $div |
| .queue( "foo", function() { |
| assert.equal( ++counter, 1, "Dequeuing" ); |
| jQuery.dequeue( this, "foo" ); |
| } ) |
| .queue( "foo", function() { |
| assert.equal( ++counter, 2, "Dequeuing" ); |
| jQuery( this ).dequeue( "foo" ); |
| } ) |
| .queue( "foo", function() { |
| assert.equal( ++counter, 3, "Dequeuing" ); |
| } ) |
| .queue( "foo", function() { |
| assert.equal( ++counter, 4, "Dequeuing" ); |
| } ); |
| |
| $div.promise( "foo" ).done( function() { |
| assert.equal( counter, 4, "Testing previous call to dequeue in deferred" ); |
| done(); |
| } ); |
| |
| assert.equal( $div.queue( "foo" ).length, 4, "Testing queue length" ); |
| |
| assert.equal( $div.queue( "foo", undefined ).queue( "foo" ).length, 4, ".queue('name',undefined) does nothing but is chainable (trac-5571)" ); |
| |
| $div.dequeue( "foo" ); |
| |
| assert.equal( counter, 3, "Testing previous call to dequeue" ); |
| assert.equal( $div.queue( "foo" ).length, 1, "Testing queue length" ); |
| |
| $div.dequeue( "foo" ); |
| |
| assert.equal( counter, 4, "Testing previous call to dequeue" ); |
| assert.equal( $div.queue( "foo" ).length, 0, "Testing queue length" ); |
| |
| $div.dequeue( "foo" ); |
| |
| assert.equal( counter, 4, "Testing previous call to dequeue" ); |
| assert.equal( $div.queue( "foo" ).length, 0, "Testing queue length" ); |
| done(); |
| } ); |
| |
| QUnit.test( "queue(name) passes in the next item in the queue as a parameter", function( assert ) { |
| assert.expect( 2 ); |
| |
| var div = jQuery( {} ), |
| counter = 0; |
| |
| div.queue( "foo", function( next ) { |
| assert.equal( ++counter, 1, "Dequeueing" ); |
| next(); |
| } ).queue( "foo", function( next ) { |
| assert.equal( ++counter, 2, "Next was called" ); |
| next(); |
| } ).queue( "bar", function() { |
| assert.equal( ++counter, 3, "Other queues are not triggered by next()" ); |
| } ); |
| |
| div.dequeue( "foo" ); |
| } ); |
| |
| QUnit.test( "queue() passes in the next item in the queue as a parameter to fx queues", function( assert ) { |
| var done = assert.async(); |
| assert.expect( 3 ); |
| |
| var div = jQuery( {} ), |
| counter = 0; |
| |
| div.queue( function( next ) { |
| assert.equal( ++counter, 1, "Dequeueing" ); |
| setTimeout( function() { next(); }, 500 ); |
| } ).queue( function( next ) { |
| assert.equal( ++counter, 2, "Next was called" ); |
| next(); |
| } ).queue( "bar", function() { |
| assert.equal( ++counter, 3, "Other queues are not triggered by next()" ); |
| } ); |
| |
| jQuery.when( div.promise( "fx" ), div ).done( function() { |
| assert.equal( counter, 2, "Deferreds resolved" ); |
| done(); |
| } ); |
| } ); |
| |
| QUnit.test( "callbacks keep their place in the queue", function( assert ) { |
| var done = assert.async(); |
| assert.expect( 5 ); |
| var div = jQuery( "<div>" ), |
| counter = 0; |
| |
| div.queue( function( next ) { |
| assert.equal( ++counter, 1, "Queue/callback order: first called" ); |
| setTimeout( next, 200 ); |
| } ).delay( 100 ).queue( function( next ) { |
| assert.equal( ++counter, 2, "Queue/callback order: second called" ); |
| jQuery( this ).delay( 100 ).queue( function( next ) { |
| assert.equal( ++counter, 4, "Queue/callback order: fourth called" ); |
| next(); |
| } ); |
| next(); |
| } ).queue( function( next ) { |
| assert.equal( ++counter, 3, "Queue/callback order: third called" ); |
| next(); |
| } ); |
| |
| div.promise( "fx" ).done( function() { |
| assert.equal( counter, 4, "Deferreds resolved" ); |
| done(); |
| } ); |
| } ); |
| |
| QUnit.test( "jQuery.queue should return array while manipulating the queue", function( assert ) { |
| assert.expect( 1 ); |
| |
| var div = document.createElement( "div" ); |
| |
| assert.ok( Array.isArray( jQuery.queue( div, "fx", jQuery.noop ) ), "jQuery.queue should return an array while manipulating the queue" ); |
| } ); |
| |
| QUnit.test( "delay()", function( assert ) { |
| var done = assert.async(); |
| assert.expect( 2 ); |
| |
| var foo = jQuery( {} ), run = 0; |
| |
| foo.delay( 100 ).queue( function() { |
| run = 1; |
| assert.ok( true, "The function was dequeued." ); |
| done(); |
| } ); |
| |
| assert.equal( run, 0, "The delay delayed the next function from running." ); |
| } ); |
| |
| QUnit.test( "clearQueue(name) clears the queue", function( assert ) { |
| var done = assert.async( 2 ); |
| assert.expect( 2 ); |
| |
| var div = jQuery( {} ), |
| counter = 0; |
| |
| div.queue( "foo", function( next ) { |
| counter++; |
| jQuery( this ).clearQueue( "foo" ); |
| next(); |
| } ).queue( "foo", function() { |
| counter++; |
| } ); |
| |
| div.promise( "foo" ).done( function() { |
| assert.ok( true, "dequeue resolves the deferred" ); |
| done(); |
| } ); |
| |
| div.dequeue( "foo" ); |
| |
| assert.equal( counter, 1, "the queue was cleared" ); |
| done(); |
| } ); |
| |
| QUnit.test( "clearQueue() clears the fx queue", function( assert ) { |
| assert.expect( 1 ); |
| |
| var div = jQuery( {} ), |
| counter = 0; |
| |
| div.queue( function( next ) { |
| counter++; |
| var self = this; |
| setTimeout( function() { jQuery( self ).clearQueue(); next(); }, 50 ); |
| } ).queue( function() { |
| counter++; |
| } ); |
| |
| assert.equal( counter, 1, "the queue was cleared" ); |
| |
| div.removeData(); |
| } ); |
| |
| QUnit.test( "fn.promise() - called when fx queue is empty", function( assert ) { |
| assert.expect( 3 ); |
| var foo = jQuery( "#foo" ).clone().addBack(), |
| promised = false, |
| done = assert.async(); |
| |
| foo.queue( function( next ) { |
| |
| // called twice! |
| assert.ok( !promised, "Promised hasn't been called" ); |
| setTimeout( next, 10 ); |
| } ); |
| foo.promise().done( function() { |
| assert.ok( promised = true, "Promised" ); |
| done(); |
| } ); |
| } ); |
| |
| QUnit.test( "fn.promise( \"queue\" ) - called whenever last queue function is dequeued", function( assert ) { |
| assert.expect( 5 ); |
| var done = assert.async(); |
| var foo = jQuery( "#foo" ), |
| test; |
| foo.promise( "queue" ).done( function() { |
| assert.strictEqual( test, undefined, "called immediately when queue was already empty" ); |
| } ); |
| test = 1; |
| foo.queue( "queue", function( next ) { |
| assert.strictEqual( test++, 1, "step one" ); |
| setTimeout( next, 0 ); |
| } ).queue( "queue", function( next ) { |
| assert.strictEqual( test++, 2, "step two" ); |
| setTimeout( function() { |
| next(); |
| assert.strictEqual( test++, 4, "step four" ); |
| done(); |
| }, 10 ); |
| } ).promise( "queue" ).done( function() { |
| assert.strictEqual( test++, 3, "step three" ); |
| } ); |
| |
| foo.dequeue( "queue" ); |
| } ); |
| |
| if ( includesModule( "effects" ) ) { |
| |
| QUnit.test( "fn.promise( \"queue\" ) - waits for animation to complete before resolving", function( assert ) { |
| assert.expect( 2 ); |
| var done = assert.async(); |
| var foo = jQuery( "#foo" ), |
| test = 1; |
| |
| foo.animate( { |
| top: 100 |
| }, { |
| duration: 1, |
| queue: "queue", |
| complete: function() { |
| assert.strictEqual( test++, 1, "step one" ); |
| } |
| } ).dequeue( "queue" ); |
| |
| foo.promise( "queue" ).done( function() { |
| assert.strictEqual( test++, 2, "step two" ); |
| done(); |
| } ); |
| |
| } ); |
| } |
| |
| QUnit.test( ".promise(obj)", function( assert ) { |
| assert.expect( 2 ); |
| |
| var obj = {}, |
| promise = jQuery( "#foo" ).promise( "promise", obj ); |
| |
| assert.ok( typeof promise.promise === "function", ".promise(type, obj) returns a promise" ); |
| assert.strictEqual( promise, obj, ".promise(type, obj) returns obj" ); |
| } ); |
| |
| QUnit[ includesModule( "effects" ) ? "test" : "skip" ]( "delay() can be stopped", function( assert ) { |
| var done = assert.async(); |
| assert.expect( 3 ); |
| var storage = {}; |
| jQuery( {} ) |
| .queue( "alternate", function( next ) { |
| storage.alt1 = true; |
| assert.ok( true, "This first function was dequeued" ); |
| next(); |
| } ) |
| .delay( 1000, "alternate" ) |
| .queue( "alternate", function() { |
| storage.alt2 = true; |
| assert.ok( true, "The function was dequeued immediately, the delay was stopped" ); |
| } ) |
| .dequeue( "alternate" ) |
| |
| // stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next |
| .stop( "alternate", false, false ) |
| |
| // this test |
| .delay( 1 ) |
| .queue( function() { |
| storage.default1 = true; |
| assert.ok( false, "This queue should never run" ); |
| } ) |
| |
| // stop( clearQueue ) should clear the queue |
| .stop( true, false ); |
| |
| assert.deepEqual( storage, { alt1: true, alt2: true }, "Queue ran the proper functions" ); |
| |
| setTimeout( function() { |
| done(); |
| }, 1500 ); |
| } ); |
| |
| QUnit[ includesModule( "effects" ) ? "test" : "skip" ]( "queue stop hooks", function( assert ) { |
| assert.expect( 2 ); |
| var done = assert.async(); |
| var foo = jQuery( "#foo" ); |
| |
| foo.queue( function( next, hooks ) { |
| hooks.stop = function( gotoEnd ) { |
| assert.equal( !!gotoEnd, false, "Stopped without gotoEnd" ); |
| }; |
| } ); |
| foo.stop(); |
| |
| foo.queue( function( next, hooks ) { |
| hooks.stop = function( gotoEnd ) { |
| assert.equal( gotoEnd, true, "Stopped with gotoEnd" ); |
| done(); |
| }; |
| } ); |
| |
| foo.stop( false, true ); |
| } ); |
| |
| } )(); |