Sin descripción

queue.js 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. QUnit.module( "queue", { afterEach: moduleTeardown } );
  2. ( function() {
  3. if ( !jQuery.fn.queue ) {
  4. return;
  5. }
  6. QUnit.test( "queue() with other types", function( assert ) {
  7. var done = assert.async( 2 );
  8. assert.expect( 14 );
  9. var $div = jQuery( {} ),
  10. counter = 0;
  11. $div.promise( "foo" ).done( function() {
  12. assert.equal( counter, 0, "Deferred for collection with no queue is automatically resolved" );
  13. } );
  14. $div
  15. .queue( "foo", function() {
  16. assert.equal( ++counter, 1, "Dequeuing" );
  17. jQuery.dequeue( this, "foo" );
  18. } )
  19. .queue( "foo", function() {
  20. assert.equal( ++counter, 2, "Dequeuing" );
  21. jQuery( this ).dequeue( "foo" );
  22. } )
  23. .queue( "foo", function() {
  24. assert.equal( ++counter, 3, "Dequeuing" );
  25. } )
  26. .queue( "foo", function() {
  27. assert.equal( ++counter, 4, "Dequeuing" );
  28. } );
  29. $div.promise( "foo" ).done( function() {
  30. assert.equal( counter, 4, "Testing previous call to dequeue in deferred" );
  31. done();
  32. } );
  33. assert.equal( $div.queue( "foo" ).length, 4, "Testing queue length" );
  34. assert.equal( $div.queue( "foo", undefined ).queue( "foo" ).length, 4, ".queue('name',undefined) does nothing but is chainable (#5571)" );
  35. $div.dequeue( "foo" );
  36. assert.equal( counter, 3, "Testing previous call to dequeue" );
  37. assert.equal( $div.queue( "foo" ).length, 1, "Testing queue length" );
  38. $div.dequeue( "foo" );
  39. assert.equal( counter, 4, "Testing previous call to dequeue" );
  40. assert.equal( $div.queue( "foo" ).length, 0, "Testing queue length" );
  41. $div.dequeue( "foo" );
  42. assert.equal( counter, 4, "Testing previous call to dequeue" );
  43. assert.equal( $div.queue( "foo" ).length, 0, "Testing queue length" );
  44. done();
  45. } );
  46. QUnit.test( "queue(name) passes in the next item in the queue as a parameter", function( assert ) {
  47. assert.expect( 2 );
  48. var div = jQuery( {} ),
  49. counter = 0;
  50. div.queue( "foo", function( next ) {
  51. assert.equal( ++counter, 1, "Dequeueing" );
  52. next();
  53. } ).queue( "foo", function( next ) {
  54. assert.equal( ++counter, 2, "Next was called" );
  55. next();
  56. } ).queue( "bar", function() {
  57. assert.equal( ++counter, 3, "Other queues are not triggered by next()" );
  58. } );
  59. div.dequeue( "foo" );
  60. } );
  61. QUnit.test( "queue() passes in the next item in the queue as a parameter to fx queues", function( assert ) {
  62. var done = assert.async();
  63. assert.expect( 3 );
  64. var div = jQuery( {} ),
  65. counter = 0;
  66. div.queue( function( next ) {
  67. assert.equal( ++counter, 1, "Dequeueing" );
  68. setTimeout( function() { next(); }, 500 );
  69. } ).queue( function( next ) {
  70. assert.equal( ++counter, 2, "Next was called" );
  71. next();
  72. } ).queue( "bar", function() {
  73. assert.equal( ++counter, 3, "Other queues are not triggered by next()" );
  74. } );
  75. jQuery.when( div.promise( "fx" ), div ).done( function() {
  76. assert.equal( counter, 2, "Deferreds resolved" );
  77. done();
  78. } );
  79. } );
  80. QUnit.test( "callbacks keep their place in the queue", function( assert ) {
  81. var done = assert.async();
  82. assert.expect( 5 );
  83. var div = jQuery( "<div>" ),
  84. counter = 0;
  85. div.queue( function( next ) {
  86. assert.equal( ++counter, 1, "Queue/callback order: first called" );
  87. setTimeout( next, 200 );
  88. } ).delay( 100 ).queue( function( next ) {
  89. assert.equal( ++counter, 2, "Queue/callback order: second called" );
  90. jQuery( this ).delay( 100 ).queue( function( next ) {
  91. assert.equal( ++counter, 4, "Queue/callback order: fourth called" );
  92. next();
  93. } );
  94. next();
  95. } ).queue( function( next ) {
  96. assert.equal( ++counter, 3, "Queue/callback order: third called" );
  97. next();
  98. } );
  99. div.promise( "fx" ).done( function() {
  100. assert.equal( counter, 4, "Deferreds resolved" );
  101. done();
  102. } );
  103. } );
  104. QUnit.test( "jQuery.queue should return array while manipulating the queue", function( assert ) {
  105. assert.expect( 1 );
  106. var div = document.createElement( "div" );
  107. assert.ok( Array.isArray( jQuery.queue( div, "fx", jQuery.noop ) ), "jQuery.queue should return an array while manipulating the queue" );
  108. } );
  109. QUnit.test( "delay()", function( assert ) {
  110. var done = assert.async();
  111. assert.expect( 2 );
  112. var foo = jQuery( {} ), run = 0;
  113. foo.delay( 100 ).queue( function() {
  114. run = 1;
  115. assert.ok( true, "The function was dequeued." );
  116. done();
  117. } );
  118. assert.equal( run, 0, "The delay delayed the next function from running." );
  119. } );
  120. QUnit.test( "clearQueue(name) clears the queue", function( assert ) {
  121. var done = assert.async( 2 );
  122. assert.expect( 2 );
  123. var div = jQuery( {} ),
  124. counter = 0;
  125. div.queue( "foo", function( next ) {
  126. counter++;
  127. jQuery( this ).clearQueue( "foo" );
  128. next();
  129. } ).queue( "foo", function() {
  130. counter++;
  131. } );
  132. div.promise( "foo" ).done( function() {
  133. assert.ok( true, "dequeue resolves the deferred" );
  134. done();
  135. } );
  136. div.dequeue( "foo" );
  137. assert.equal( counter, 1, "the queue was cleared" );
  138. done();
  139. } );
  140. QUnit.test( "clearQueue() clears the fx queue", function( assert ) {
  141. assert.expect( 1 );
  142. var div = jQuery( {} ),
  143. counter = 0;
  144. div.queue( function( next ) {
  145. counter++;
  146. var self = this;
  147. setTimeout( function() { jQuery( self ).clearQueue(); next(); }, 50 );
  148. } ).queue( function() {
  149. counter++;
  150. } );
  151. assert.equal( counter, 1, "the queue was cleared" );
  152. div.removeData();
  153. } );
  154. QUnit.test( "fn.promise() - called when fx queue is empty", function( assert ) {
  155. assert.expect( 3 );
  156. var foo = jQuery( "#foo" ).clone().addBack(),
  157. promised = false,
  158. done = assert.async();
  159. foo.queue( function( next ) {
  160. // called twice!
  161. assert.ok( !promised, "Promised hasn't been called" );
  162. setTimeout( next, 10 );
  163. } );
  164. foo.promise().done( function() {
  165. assert.ok( promised = true, "Promised" );
  166. done();
  167. } );
  168. } );
  169. QUnit.test( "fn.promise( \"queue\" ) - called whenever last queue function is dequeued", function( assert ) {
  170. assert.expect( 5 );
  171. var done = assert.async();
  172. var foo = jQuery( "#foo" ),
  173. test;
  174. foo.promise( "queue" ).done( function() {
  175. assert.strictEqual( test, undefined, "called immediately when queue was already empty" );
  176. } );
  177. test = 1;
  178. foo.queue( "queue", function( next ) {
  179. assert.strictEqual( test++, 1, "step one" );
  180. setTimeout( next, 0 );
  181. } ).queue( "queue", function( next ) {
  182. assert.strictEqual( test++, 2, "step two" );
  183. setTimeout( function() {
  184. next();
  185. assert.strictEqual( test++, 4, "step four" );
  186. done();
  187. }, 10 );
  188. } ).promise( "queue" ).done( function() {
  189. assert.strictEqual( test++, 3, "step three" );
  190. } );
  191. foo.dequeue( "queue" );
  192. } );
  193. if ( jQuery.fn.animate ) {
  194. QUnit.test( "fn.promise( \"queue\" ) - waits for animation to complete before resolving", function( assert ) {
  195. assert.expect( 2 );
  196. var done = assert.async();
  197. var foo = jQuery( "#foo" ),
  198. test = 1;
  199. foo.animate( {
  200. top: 100
  201. }, {
  202. duration: 1,
  203. queue: "queue",
  204. complete: function() {
  205. assert.strictEqual( test++, 1, "step one" );
  206. }
  207. } ).dequeue( "queue" );
  208. foo.promise( "queue" ).done( function() {
  209. assert.strictEqual( test++, 2, "step two" );
  210. done();
  211. } );
  212. } );
  213. }
  214. QUnit.test( ".promise(obj)", function( assert ) {
  215. assert.expect( 2 );
  216. var obj = {},
  217. promise = jQuery( "#foo" ).promise( "promise", obj );
  218. assert.ok( typeof promise.promise === "function", ".promise(type, obj) returns a promise" );
  219. assert.strictEqual( promise, obj, ".promise(type, obj) returns obj" );
  220. } );
  221. QUnit[ jQuery.fn.stop ? "test" : "skip" ]( "delay() can be stopped", function( assert ) {
  222. var done = assert.async();
  223. assert.expect( 3 );
  224. var storage = {};
  225. jQuery( {} )
  226. .queue( "alternate", function( next ) {
  227. storage.alt1 = true;
  228. assert.ok( true, "This first function was dequeued" );
  229. next();
  230. } )
  231. .delay( 1000, "alternate" )
  232. .queue( "alternate", function() {
  233. storage.alt2 = true;
  234. assert.ok( true, "The function was dequeued immediately, the delay was stopped" );
  235. } )
  236. .dequeue( "alternate" )
  237. // stop( "alternate", false ) will NOT clear the queue, so it should automatically dequeue the next
  238. .stop( "alternate", false, false )
  239. // this test
  240. .delay( 1 )
  241. .queue( function() {
  242. storage.default1 = true;
  243. assert.ok( false, "This queue should never run" );
  244. } )
  245. // stop( clearQueue ) should clear the queue
  246. .stop( true, false );
  247. assert.deepEqual( storage, { alt1: true, alt2: true }, "Queue ran the proper functions" );
  248. setTimeout( function() {
  249. done();
  250. }, 1500 );
  251. } );
  252. QUnit[ jQuery.fn.stop ? "test" : "skip" ]( "queue stop hooks", function( assert ) {
  253. assert.expect( 2 );
  254. var done = assert.async();
  255. var foo = jQuery( "#foo" );
  256. foo.queue( function( next, hooks ) {
  257. hooks.stop = function( gotoEnd ) {
  258. assert.equal( !!gotoEnd, false, "Stopped without gotoEnd" );
  259. };
  260. } );
  261. foo.stop();
  262. foo.queue( function( next, hooks ) {
  263. hooks.stop = function( gotoEnd ) {
  264. assert.equal( gotoEnd, true, "Stopped with gotoEnd" );
  265. done();
  266. };
  267. } );
  268. foo.stop( false, true );
  269. } );
  270. } )();