QUnit.module("queue", { teardown: moduleTeardown} ); QUnit.test("queue() with other types", function (assert){ assert.expect(14); QUnit.stop(); 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"); QUnit.start(); } ); assert.equal(_AN_Read_length("length", $div.queue("foo")), 4, "Testing queue length"); assert.equal(_AN_Read_length("length", $div.queue("foo", undefined).queue("foo")), 4, ".queue('name',undefined) does nothing but is chainable (#5571)"); $div.dequeue("foo"); assert.equal(counter, 3, "Testing previous call to dequeue"); assert.equal(_AN_Read_length("length", $div.queue("foo")), 1, "Testing queue length"); $div.dequeue("foo"); assert.equal(counter, 4, "Testing previous call to dequeue"); assert.equal(_AN_Read_length("length", $div.queue("foo")), 0, "Testing queue length"); $div.dequeue("foo"); assert.equal(counter, 4, "Testing previous call to dequeue"); assert.equal(_AN_Read_length("length", $div.queue("foo")), 0, "Testing queue length"); } ); 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){ assert.expect(3); QUnit.stop(); var div = jQuery({ } ), counter = 0; div.queue(function (next){ assert.equal(++counter, 1, "Dequeueing"); _AN_Call_settimeout("setTimeout", window, 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"); QUnit.start(); } ); } ); QUnit.test("callbacks keep their place in the queue", function (assert){ assert.expect(5); QUnit.stop(); var div = jQuery("
"), counter = 0; div.queue(function (next){ assert.equal(++counter, 1, "Queue/callback order: first called"); _AN_Call_settimeout("setTimeout", window, 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"); QUnit.start(); } ); } ); QUnit.test("delay()", function (assert){ assert.expect(2); QUnit.stop(); var foo = jQuery({ } ), run = 0; foo.delay(100).queue(function (){ run = 1; assert.ok(true , "The function was dequeued."); QUnit.start(); } ); assert.equal(run, 0, "The delay delayed the next function from running."); } ); QUnit.test("clearQueue(name) clears the queue", function (assert){ assert.expect(2); QUnit.stop(); 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"); QUnit.start(); } ); div.dequeue("foo"); assert.equal(counter, 1, "the queue was cleared"); } ); 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; _AN_Call_settimeout("setTimeout", window, function (){ jQuery(self).clearQueue(); next(); } , 50); } ).queue(function (){ counter++ ; } ); assert.equal(counter, 1, "the queue was cleared"); div.removeData(); } ); QUnit.asyncTest("fn.promise() - called when fx queue is empty", 3, function (assert){ var foo = jQuery("#foo").clone().addBack(), promised = false ; foo.queue(function (next){ assert.ok(!promised, "Promised hasn't been called"); _AN_Call_settimeout("setTimeout", window, next, 10); } ); foo.promise().done(function (){ assert.ok(promised = true , "Promised"); QUnit.start(); } ); } ); QUnit.asyncTest("fn.promise( \"queue\" ) - called whenever last queue function is dequeued", 5, function (assert){ 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"); _AN_Call_settimeout("setTimeout", window, next, 0); } ).queue("queue", function (next){ assert.strictEqual(test++ , 2, "step two"); _AN_Call_settimeout("setTimeout", window, function (){ next(); assert.strictEqual(test++ , 4, "step four"); QUnit.start(); } , 10); } ).promise("queue").done(function (){ assert.strictEqual(test++ , 3, "step three"); } ); foo.dequeue("queue"); } ); QUnit.asyncTest("fn.promise( \"queue\" ) - waits for animation to complete before resolving", 2, function (assert){ 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"); QUnit.start(); } ); } ); QUnit.test(".promise(obj)", function (assert){ assert.expect(2); var obj = { } , promise = jQuery("#foo").promise("promise", obj); assert.ok(jQuery.isFunction(promise.promise), ".promise(type, obj) returns a promise"); assert.strictEqual(promise, obj, ".promise(type, obj) returns obj"); } ); if (jQuery.fn.stop) { QUnit.test("delay() can be stopped", function (assert){ assert.expect(3); QUnit.stop(); var done = { } ; jQuery({ } ).queue("alternate", function (next){ done.alt1 = true ; assert.ok(true , "This first function was dequeued"); next(); } ).delay(1000, "alternate").queue("alternate", function (){ done.alt2 = true ; assert.ok(true , "The function was dequeued immediately, the delay was stopped"); } ).dequeue("alternate").stop("alternate", false , false ).delay(1).queue(function (){ done.default1 = true ; assert.ok(false , "This queue should never run"); } ).stop(true , false ); assert.deepEqual(done, { alt1: true , alt2: true } , "Queue ran the proper functions"); _AN_Call_settimeout("setTimeout", window, function (){ QUnit.start(); } , 1500); } ); QUnit.asyncTest("queue stop hooks", 2, function (assert){ 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"); QUnit.start(); } ; } ); foo.stop(false , true ); } ); }