+ var hashCopy = jQuery.extend({}, hash);
+ jQuery('#foo').animate(hash, 0, function() {
+ equals( hash.opacity, hashCopy.opacity, 'Check if animate changed the hash parameter' );
+ start();
+ });
+});
+
+test("animate option (queue === false)", function () {
+ expect(1);
+ stop();
+
+ var order = [];
+
+ var $foo = jQuery("#foo");
+ $foo.animate({width:'100px'}, 200, function () {
+ // should finish after unqueued animation so second
+ order.push(2);
+ });
+ $foo.animate({fontSize:'2em'}, {queue:false, duration:10, complete:function () {
+ // short duration and out of queue so should finish first
+ order.push(1);
+ }});
+ $foo.animate({height:'100px'}, 10, function() {
+ // queued behind the first animation so should finish third
+ order.push(3);
+ isSet( order, [ 1, 2, 3], "Animations finished in the correct order" );
+ start();
+ });
+});
+
+test("animate duration 0", function() {
+ expect(5);
+
+ stop();
+
+ var $elems = jQuery([{ a:0 },{ a:0 }]),
+ counter = 0,
+ count = function(){
+ counter++;
+ };
+
+ equals( jQuery.timers.length, 0, "Make sure no animation was running from another test" );
+
+ $elems.eq(0).animate( {a:1}, 0, count );
+
+ // Failed until [6115]
+ equals( jQuery.timers.length, 0, "Make sure synchronic animations are not left on jQuery.timers" );
+
+ equals( counter, 1, "One synchronic animations" );
+
+ $elems.animate( { a:2 }, 0, count );
+
+ equals( counter, 3, "Multiple synchronic animations" );
+
+ $elems.eq(0).animate( {a:3}, 0, count );
+ $elems.eq(1).animate( {a:3}, 20, function(){
+ count();
+ // Failed until [6115]
+ equals( counter, 5, "One synchronic and one asynchronic" );
+ start();
+ });
+});
+
+test("animate non-element", function(){
+ expect(1);
+ stop();
+
+ var obj = { test: 0 };
+
+ jQuery(obj).animate({test: 200}, 200, function(){
+ equals( obj.test, 200, "The custom property should be modified." );