]> source.dussan.org Git - jquery.git/commitdiff
Renamed the 'fx' module to 'effects'. Should've been done a long time ago.
authorjeresig <jeresig@gmail.com>
Fri, 18 Dec 2009 16:01:19 +0000 (11:01 -0500)
committerjeresig <jeresig@gmail.com>
Fri, 18 Dec 2009 16:01:19 +0000 (11:01 -0500)
Makefile
Rakefile
build.xml
src/effects.js [new file with mode: 0644]
src/fx.js [deleted file]
test/index.html
test/unit/effects.js [new file with mode: 0644]
test/unit/fx.js [deleted file]

index bf1b2e7b490b1da992c8ae6f4a87a75f6d4435ba..2bf19fe9cdbf67902ac0b043d5d1b9cc847034fb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ BASE_FILES = ${SRC_DIR}/core.js\
        ${SRC_DIR}/manipulation.js\
        ${SRC_DIR}/css.js\
        ${SRC_DIR}/ajax.js\
-       ${SRC_DIR}/fx.js\
+       ${SRC_DIR}/effects.js\
        ${SRC_DIR}/offset.js\
        ${SRC_DIR}/dimensions.js
 
index 92176a6c1b6c218d459eba4f8280accfde6adbe6..ebffabfcb43aa86d831183a0aae03cb7c04517b1 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -1,5 +1,5 @@
 # Basic Rakefile for building jQuery
-files = [ "intro", "core", "support", "data", "queue", "event", "selector", "traversing", "attributes", "manipulation", "css", "ajax", "fx", "offset", "dimensions", "outro" ]
+files = [ "intro", "core", "support", "data", "queue", "event", "selector", "traversing", "attributes", "manipulation", "css", "ajax", "effects", "offset", "dimensions", "outro" ]
 
 date = `git log -1 | grep Date: | sed 's/[^:]*: *//'`.gsub(/\n/, "")
 version = `cat version.txt`.gsub(/\n/, "")
index 363482a6d2cbc134bb13bc019b265ef93cbadc09..581d130344ca196507f03b1a011a2b2242c65da8 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -54,7 +54,7 @@
             <fileset file="src/manipulation.js" />
             <fileset file="src/css.js" />
             <fileset file="src/ajax.js" />
-            <fileset file="src/fx.js" />
+            <fileset file="src/effects.js" />
             <fileset file="src/offset.js" />
             <fileset file="src/dimensions.js" />
             <fileset file="src/outro.js" />
diff --git a/src/effects.js b/src/effects.js
new file mode 100644 (file)
index 0000000..6bcaac0
--- /dev/null
@@ -0,0 +1,458 @@
+var elemdisplay = {},
+       timerId,
+       fxAttrs = [
+               // height animations
+               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+               // width animations
+               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+               // opacity animations
+               [ "opacity" ]
+       ];
+
+function genFx( type, num ){
+       var obj = {};
+       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
+               obj[ this ] = type;
+       });
+       return obj;
+}
+
+jQuery.fn.extend({
+       show: function( speed, callback ) {
+               if ( speed != null ) {
+                       return this.animate( genFx("show", 3), speed, callback);
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ){
+                               var old = jQuery.data(this[i], "olddisplay");
+
+                               this[i].style.display = old || "";
+
+                               if ( jQuery.css(this[i], "display") === "none" ) {
+                                       var nodeName = this[i].nodeName, display;
+
+                                       if ( elemdisplay[ nodeName ] ) {
+                                               display = elemdisplay[ nodeName ];
+                                       } else {
+                                               var elem = jQuery("<" + nodeName + " />").appendTo("body");
+
+                                               display = elem.css("display");
+                                               if ( display === "none" ) {
+                                                       display = "block";
+                                               }
+                                               elem.remove();
+
+                                               elemdisplay[ nodeName ] = display;
+                                       }
+
+                                       jQuery.data(this[i], "olddisplay", display);
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( var i = 0, l = this.length; i < l; i++ ){
+                               this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
+                       }
+
+                       return this;
+               }
+       },
+
+       hide: function( speed, callback ) {
+               if ( speed != null ) {
+                       return this.animate( genFx("hide", 3), speed, callback);
+               } else {
+                       for ( var i = 0, l = this.length; i < l; i++ ){
+                               var old = jQuery.data(this[i], "olddisplay");
+                               if ( !old && old !== "none" ){
+                                       jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
+                               }
+                       }
+
+                       // Set the display of the elements in a second loop
+                       // to avoid the constant reflow
+                       for ( var i = 0, l = this.length; i < l; i++ ){
+                               this[i].style.display = "none";
+                       }
+
+                       return this;
+               }
+       },
+
+       // Save the old toggle function
+       _toggle: jQuery.fn.toggle,
+
+       toggle: function( fn, fn2 ){
+               var bool = typeof fn === "boolean";
+
+               return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
+                       this._toggle.apply( this, arguments ) :
+                       fn == null || bool ?
+                               this.each(function(){
+                                       var state = bool ? fn : jQuery(this).is(":hidden");
+                                       jQuery(this)[ state ? "show" : "hide" ]();
+                               }) :
+                               this.animate(genFx("toggle", 3), fn, fn2);
+       },
+
+       fadeTo: function(speed,to,callback){
+               return this.filter(":hidden").css('opacity', 0).show().end()
+                                       .animate({opacity: to}, speed, callback);
+       },
+
+       animate: function( prop, speed, easing, callback ) {
+               var optall = jQuery.speed(speed, easing, callback);
+
+               return this[ optall.queue === false ? "each" : "queue" ](function(){
+
+                       var opt = jQuery.extend({}, optall), p,
+                               hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
+                               self = this;
+
+                       for ( p in prop ) {
+                               var name = p.replace(rdashAlpha, fcamelCase);
+
+                               if ( p !== name ) {
+                                       prop[ name ] = prop[ p ];
+                                       delete prop[ p ];
+                                       p = name;
+                               }
+
+                               if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) {
+                                       return opt.complete.call(this);
+                               }
+                               if ( ( p == "height" || p == "width" ) && this.style ) {
+                                       // Store display property
+                                       opt.display = jQuery.css(this, "display");
+
+                                       // Make sure that nothing sneaks out
+                                       opt.overflow = this.style.overflow;
+                               }
+                               if ( jQuery.isArray( prop[p] ) ) {
+                                       // Create (if needed) and add to specialEasing
+                                       (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+                                       prop[p] = prop[p][0];
+                               }
+                       }
+
+                       if ( opt.overflow != null ) {
+                               this.style.overflow = "hidden";
+                       }
+                       opt.curAnim = jQuery.extend({}, prop);
+
+                       jQuery.each( prop, function(name, val){
+                               var e = new jQuery.fx( self, opt, name );
+
+                               if ( /toggle|show|hide/.test(val) ) {
+                                       e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+                               } else {
+                                       var parts = /^([+-]=)?([\d+-.]+)(.*)$/.exec(val),
+                                               start = e.cur(true) || 0;
+
+                                       if ( parts ) {
+                                               var end = parseFloat(parts[2]),
+                                                       unit = parts[3] || "px";
+
+                                               // We need to compute starting value
+                                               if ( unit != "px" ) {
+                                                       self.style[ name ] = (end || 1) + unit;
+                                                       start = ((end || 1) / e.cur(true)) * start;
+                                                       self.style[ name ] = start + unit;
+                                               }
+
+                                               // If a +=/-= token was provided, we're doing a relative animation
+                                               if ( parts[1] ) {
+                                                       end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
+                                               }
+                                               e.custom( start, end, unit );
+                                       } else {
+                                               e.custom( start, val, "" );
+                                       }
+                               }
+                       });
+
+                       if ( jQuery.isEmptyObject( prop ) ) {
+                               return optall.complete.call(this);
+                       }
+
+                       // For JS strict compliance
+                       return true;
+               });
+       },
+
+       stop: function(clearQueue, gotoEnd){
+               var timers = jQuery.timers;
+
+               if (clearQueue) {
+                       this.queue([]);
+               }
+               this.each(function(){
+                       // go in reverse order so anything added to the queue during the loop is ignored
+                       for ( var i = timers.length - 1; i >= 0; i-- ) {
+                               if ( timers[i].elem == this ) {
+                                       if (gotoEnd) {
+                                               // force the next step to be the last
+                                               timers[i](true);
+                                       }
+                                       timers.splice(i, 1);
+                               }
+                       }
+               });
+
+               // start the next in the queue if the last step wasn't forced
+               if (!gotoEnd) {
+                       this.dequeue();
+               }
+               return this;
+       }
+
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show", 1),
+       slideUp: genFx("hide", 1),
+       slideToggle: genFx("toggle", 1),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" }
+}, function( name, props ){
+       jQuery.fn[ name ] = function( speed, callback ){
+               return this.animate( props, speed, callback );
+       };
+});
+
+jQuery.extend({
+
+       speed: function(speed, easing, fn) {
+               var opt = speed && typeof speed === "object" ? speed : {
+                       complete: fn || !fn && easing ||
+                               jQuery.isFunction( speed ) && speed,
+                       duration: speed,
+                       easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+               };
+
+               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+                       jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
+
+               // Queueing
+               opt.old = opt.complete;
+               opt.complete = function(){
+                       if ( opt.queue !== false ) {
+                               jQuery(this).dequeue();
+                       }
+                       if ( jQuery.isFunction( opt.old ) ) {
+                               opt.old.call( this );
+                       }
+               };
+
+               return opt;
+       },
+
+       easing: {
+               linear: function( p, n, firstNum, diff ) {
+                       return firstNum + diff * p;
+               },
+               swing: function( p, n, firstNum, diff ) {
+                       return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+               }
+       },
+
+       timers: [],
+
+       fx: function( elem, options, prop ){
+               this.options = options;
+               this.elem = elem;
+               this.prop = prop;
+
+               if ( !options.orig ) {
+                       options.orig = {};
+               }
+       }
+
+});
+
+jQuery.fx.prototype = {
+
+       // Simple function for setting a style value
+       update: function(){
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+               (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+
+               // Set display property to block for height/width animations
+               if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style ) {
+                       this.elem.style.display = "block";
+               }
+       },
+
+       // Get the current size
+       cur: function(force){
+               if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+                       return this.elem[ this.prop ];
+               }
+               var r = parseFloat(jQuery.css(this.elem, this.prop, force));
+               return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
+       },
+
+       // Start an animation from one number to another
+       custom: function(from, to, unit){
+               this.startTime = now();
+               this.start = from;
+               this.end = to;
+               this.unit = unit || this.unit || "px";
+               this.now = this.start;
+               this.pos = this.state = 0;
+
+               var self = this;
+               function t(gotoEnd){
+                       return self.step(gotoEnd);
+               }
+
+               t.elem = this.elem;
+
+               if ( t() && jQuery.timers.push(t) && !timerId ) {
+                       timerId = setInterval(jQuery.fx.tick, 13);
+               }
+       },
+
+       // Simple 'show' function
+       show: function(){
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.show = true;
+
+               // Begin the animation
+               // Make sure that we start at a small width/height to avoid any
+               // flash of content
+               this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
+
+               // Start by showing the element
+               jQuery(this.elem).show();
+       },
+
+       // Simple 'hide' function
+       hide: function(){
+               // Remember where we started, so that we can go back to it later
+               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+               this.options.hide = true;
+
+               // Begin the animation
+               this.custom(this.cur(), 0);
+       },
+
+       // Each step of an animation
+       step: function(gotoEnd){
+               var t = now();
+
+               if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+                       this.now = this.end;
+                       this.pos = this.state = 1;
+                       this.update();
+
+                       this.options.curAnim[ this.prop ] = true;
+
+                       var done = true;
+                       for ( var i in this.options.curAnim ) {
+                               if ( this.options.curAnim[i] !== true ) {
+                                       done = false;
+                               }
+                       }
+                       if ( done ) {
+                               if ( this.options.display != null ) {
+                                       // Reset the overflow
+                                       this.elem.style.overflow = this.options.overflow;
+
+                                       // Reset the display
+                                       var old = jQuery.data(this.elem, "olddisplay");
+                                       this.elem.style.display = old ? old : this.options.display;
+
+                                       if ( jQuery.css(this.elem, "display") == "none" ) {
+                                               this.elem.style.display = "block";
+                                       }
+                               }
+
+                               // Hide the element if the "hide" operation was done
+                               if ( this.options.hide ) {
+                                       jQuery(this.elem).hide();
+                               }
+                               // Reset the properties, if the item has been hidden or shown
+                               if ( this.options.hide || this.options.show ){
+                                       for ( var p in this.options.curAnim ) {
+                                               jQuery.style(this.elem, p, this.options.orig[p]);
+                                       }
+                               }
+                               // Execute the complete function
+                               this.options.complete.call( this.elem );
+                       }
+
+                       return false;
+               } else {
+                       var n = t - this.startTime;
+                       this.state = n / this.options.duration;
+
+                       // Perform the easing function, defaults to swing
+                       var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+                       var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+                       this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+                       this.now = this.start + ((this.end - this.start) * this.pos);
+
+                       // Perform the next step of the animation
+                       this.update();
+               }
+
+               return true;
+       }
+
+};
+
+jQuery.extend( jQuery.fx, {
+
+       tick:function(){
+               var timers = jQuery.timers;
+
+               for ( var i = 0; i < timers.length; i++ ) {
+                       if ( !timers[i]() ) {
+                               timers.splice(i--, 1);
+                       }
+               }
+               if ( !timers.length ) {
+                       jQuery.fx.stop();
+               }
+       },
+               
+       stop:function(){
+               clearInterval( timerId );
+               timerId = null;
+       },
+       
+       speeds:{
+               slow: 600,
+               fast: 200,
+               // Default speed
+               _default: 400
+       },
+
+       step: {
+
+               opacity: function(fx){
+                       jQuery.style(fx.elem, "opacity", fx.now);
+               },
+
+               _default: function(fx){
+                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+                               fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+                       } else {
+                               fx.elem[ fx.prop ] = fx.now;
+                       }
+               }
+       }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function(elem){
+               return jQuery.grep(jQuery.timers, function(fn){
+                       return elem === fn.elem;
+               }).length;
+       };
+}
diff --git a/src/fx.js b/src/fx.js
deleted file mode 100644 (file)
index 6bcaac0..0000000
--- a/src/fx.js
+++ /dev/null
@@ -1,458 +0,0 @@
-var elemdisplay = {},
-       timerId,
-       fxAttrs = [
-               // height animations
-               [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-               // width animations
-               [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-               // opacity animations
-               [ "opacity" ]
-       ];
-
-function genFx( type, num ){
-       var obj = {};
-       jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
-               obj[ this ] = type;
-       });
-       return obj;
-}
-
-jQuery.fn.extend({
-       show: function( speed, callback ) {
-               if ( speed != null ) {
-                       return this.animate( genFx("show", 3), speed, callback);
-               } else {
-                       for ( var i = 0, l = this.length; i < l; i++ ){
-                               var old = jQuery.data(this[i], "olddisplay");
-
-                               this[i].style.display = old || "";
-
-                               if ( jQuery.css(this[i], "display") === "none" ) {
-                                       var nodeName = this[i].nodeName, display;
-
-                                       if ( elemdisplay[ nodeName ] ) {
-                                               display = elemdisplay[ nodeName ];
-                                       } else {
-                                               var elem = jQuery("<" + nodeName + " />").appendTo("body");
-
-                                               display = elem.css("display");
-                                               if ( display === "none" ) {
-                                                       display = "block";
-                                               }
-                                               elem.remove();
-
-                                               elemdisplay[ nodeName ] = display;
-                                       }
-
-                                       jQuery.data(this[i], "olddisplay", display);
-                               }
-                       }
-
-                       // Set the display of the elements in a second loop
-                       // to avoid the constant reflow
-                       for ( var i = 0, l = this.length; i < l; i++ ){
-                               this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
-                       }
-
-                       return this;
-               }
-       },
-
-       hide: function( speed, callback ) {
-               if ( speed != null ) {
-                       return this.animate( genFx("hide", 3), speed, callback);
-               } else {
-                       for ( var i = 0, l = this.length; i < l; i++ ){
-                               var old = jQuery.data(this[i], "olddisplay");
-                               if ( !old && old !== "none" ){
-                                       jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
-                               }
-                       }
-
-                       // Set the display of the elements in a second loop
-                       // to avoid the constant reflow
-                       for ( var i = 0, l = this.length; i < l; i++ ){
-                               this[i].style.display = "none";
-                       }
-
-                       return this;
-               }
-       },
-
-       // Save the old toggle function
-       _toggle: jQuery.fn.toggle,
-
-       toggle: function( fn, fn2 ){
-               var bool = typeof fn === "boolean";
-
-               return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
-                       this._toggle.apply( this, arguments ) :
-                       fn == null || bool ?
-                               this.each(function(){
-                                       var state = bool ? fn : jQuery(this).is(":hidden");
-                                       jQuery(this)[ state ? "show" : "hide" ]();
-                               }) :
-                               this.animate(genFx("toggle", 3), fn, fn2);
-       },
-
-       fadeTo: function(speed,to,callback){
-               return this.filter(":hidden").css('opacity', 0).show().end()
-                                       .animate({opacity: to}, speed, callback);
-       },
-
-       animate: function( prop, speed, easing, callback ) {
-               var optall = jQuery.speed(speed, easing, callback);
-
-               return this[ optall.queue === false ? "each" : "queue" ](function(){
-
-                       var opt = jQuery.extend({}, optall), p,
-                               hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
-                               self = this;
-
-                       for ( p in prop ) {
-                               var name = p.replace(rdashAlpha, fcamelCase);
-
-                               if ( p !== name ) {
-                                       prop[ name ] = prop[ p ];
-                                       delete prop[ p ];
-                                       p = name;
-                               }
-
-                               if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) {
-                                       return opt.complete.call(this);
-                               }
-                               if ( ( p == "height" || p == "width" ) && this.style ) {
-                                       // Store display property
-                                       opt.display = jQuery.css(this, "display");
-
-                                       // Make sure that nothing sneaks out
-                                       opt.overflow = this.style.overflow;
-                               }
-                               if ( jQuery.isArray( prop[p] ) ) {
-                                       // Create (if needed) and add to specialEasing
-                                       (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
-                                       prop[p] = prop[p][0];
-                               }
-                       }
-
-                       if ( opt.overflow != null ) {
-                               this.style.overflow = "hidden";
-                       }
-                       opt.curAnim = jQuery.extend({}, prop);
-
-                       jQuery.each( prop, function(name, val){
-                               var e = new jQuery.fx( self, opt, name );
-
-                               if ( /toggle|show|hide/.test(val) ) {
-                                       e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
-                               } else {
-                                       var parts = /^([+-]=)?([\d+-.]+)(.*)$/.exec(val),
-                                               start = e.cur(true) || 0;
-
-                                       if ( parts ) {
-                                               var end = parseFloat(parts[2]),
-                                                       unit = parts[3] || "px";
-
-                                               // We need to compute starting value
-                                               if ( unit != "px" ) {
-                                                       self.style[ name ] = (end || 1) + unit;
-                                                       start = ((end || 1) / e.cur(true)) * start;
-                                                       self.style[ name ] = start + unit;
-                                               }
-
-                                               // If a +=/-= token was provided, we're doing a relative animation
-                                               if ( parts[1] ) {
-                                                       end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
-                                               }
-                                               e.custom( start, end, unit );
-                                       } else {
-                                               e.custom( start, val, "" );
-                                       }
-                               }
-                       });
-
-                       if ( jQuery.isEmptyObject( prop ) ) {
-                               return optall.complete.call(this);
-                       }
-
-                       // For JS strict compliance
-                       return true;
-               });
-       },
-
-       stop: function(clearQueue, gotoEnd){
-               var timers = jQuery.timers;
-
-               if (clearQueue) {
-                       this.queue([]);
-               }
-               this.each(function(){
-                       // go in reverse order so anything added to the queue during the loop is ignored
-                       for ( var i = timers.length - 1; i >= 0; i-- ) {
-                               if ( timers[i].elem == this ) {
-                                       if (gotoEnd) {
-                                               // force the next step to be the last
-                                               timers[i](true);
-                                       }
-                                       timers.splice(i, 1);
-                               }
-                       }
-               });
-
-               // start the next in the queue if the last step wasn't forced
-               if (!gotoEnd) {
-                       this.dequeue();
-               }
-               return this;
-       }
-
-});
-
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx("show", 1),
-       slideUp: genFx("hide", 1),
-       slideToggle: genFx("toggle", 1),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" }
-}, function( name, props ){
-       jQuery.fn[ name ] = function( speed, callback ){
-               return this.animate( props, speed, callback );
-       };
-});
-
-jQuery.extend({
-
-       speed: function(speed, easing, fn) {
-               var opt = speed && typeof speed === "object" ? speed : {
-                       complete: fn || !fn && easing ||
-                               jQuery.isFunction( speed ) && speed,
-                       duration: speed,
-                       easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
-               };
-
-               opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-                       jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
-
-               // Queueing
-               opt.old = opt.complete;
-               opt.complete = function(){
-                       if ( opt.queue !== false ) {
-                               jQuery(this).dequeue();
-                       }
-                       if ( jQuery.isFunction( opt.old ) ) {
-                               opt.old.call( this );
-                       }
-               };
-
-               return opt;
-       },
-
-       easing: {
-               linear: function( p, n, firstNum, diff ) {
-                       return firstNum + diff * p;
-               },
-               swing: function( p, n, firstNum, diff ) {
-                       return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
-               }
-       },
-
-       timers: [],
-
-       fx: function( elem, options, prop ){
-               this.options = options;
-               this.elem = elem;
-               this.prop = prop;
-
-               if ( !options.orig ) {
-                       options.orig = {};
-               }
-       }
-
-});
-
-jQuery.fx.prototype = {
-
-       // Simple function for setting a style value
-       update: function(){
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
-               (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
-
-               // Set display property to block for height/width animations
-               if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style ) {
-                       this.elem.style.display = "block";
-               }
-       },
-
-       // Get the current size
-       cur: function(force){
-               if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
-                       return this.elem[ this.prop ];
-               }
-               var r = parseFloat(jQuery.css(this.elem, this.prop, force));
-               return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
-       },
-
-       // Start an animation from one number to another
-       custom: function(from, to, unit){
-               this.startTime = now();
-               this.start = from;
-               this.end = to;
-               this.unit = unit || this.unit || "px";
-               this.now = this.start;
-               this.pos = this.state = 0;
-
-               var self = this;
-               function t(gotoEnd){
-                       return self.step(gotoEnd);
-               }
-
-               t.elem = this.elem;
-
-               if ( t() && jQuery.timers.push(t) && !timerId ) {
-                       timerId = setInterval(jQuery.fx.tick, 13);
-               }
-       },
-
-       // Simple 'show' function
-       show: function(){
-               // Remember where we started, so that we can go back to it later
-               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
-               this.options.show = true;
-
-               // Begin the animation
-               // Make sure that we start at a small width/height to avoid any
-               // flash of content
-               this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
-
-               // Start by showing the element
-               jQuery(this.elem).show();
-       },
-
-       // Simple 'hide' function
-       hide: function(){
-               // Remember where we started, so that we can go back to it later
-               this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
-               this.options.hide = true;
-
-               // Begin the animation
-               this.custom(this.cur(), 0);
-       },
-
-       // Each step of an animation
-       step: function(gotoEnd){
-               var t = now();
-
-               if ( gotoEnd || t >= this.options.duration + this.startTime ) {
-                       this.now = this.end;
-                       this.pos = this.state = 1;
-                       this.update();
-
-                       this.options.curAnim[ this.prop ] = true;
-
-                       var done = true;
-                       for ( var i in this.options.curAnim ) {
-                               if ( this.options.curAnim[i] !== true ) {
-                                       done = false;
-                               }
-                       }
-                       if ( done ) {
-                               if ( this.options.display != null ) {
-                                       // Reset the overflow
-                                       this.elem.style.overflow = this.options.overflow;
-
-                                       // Reset the display
-                                       var old = jQuery.data(this.elem, "olddisplay");
-                                       this.elem.style.display = old ? old : this.options.display;
-
-                                       if ( jQuery.css(this.elem, "display") == "none" ) {
-                                               this.elem.style.display = "block";
-                                       }
-                               }
-
-                               // Hide the element if the "hide" operation was done
-                               if ( this.options.hide ) {
-                                       jQuery(this.elem).hide();
-                               }
-                               // Reset the properties, if the item has been hidden or shown
-                               if ( this.options.hide || this.options.show ){
-                                       for ( var p in this.options.curAnim ) {
-                                               jQuery.style(this.elem, p, this.options.orig[p]);
-                                       }
-                               }
-                               // Execute the complete function
-                               this.options.complete.call( this.elem );
-                       }
-
-                       return false;
-               } else {
-                       var n = t - this.startTime;
-                       this.state = n / this.options.duration;
-
-                       // Perform the easing function, defaults to swing
-                       var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
-                       var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
-                       this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
-                       this.now = this.start + ((this.end - this.start) * this.pos);
-
-                       // Perform the next step of the animation
-                       this.update();
-               }
-
-               return true;
-       }
-
-};
-
-jQuery.extend( jQuery.fx, {
-
-       tick:function(){
-               var timers = jQuery.timers;
-
-               for ( var i = 0; i < timers.length; i++ ) {
-                       if ( !timers[i]() ) {
-                               timers.splice(i--, 1);
-                       }
-               }
-               if ( !timers.length ) {
-                       jQuery.fx.stop();
-               }
-       },
-               
-       stop:function(){
-               clearInterval( timerId );
-               timerId = null;
-       },
-       
-       speeds:{
-               slow: 600,
-               fast: 200,
-               // Default speed
-               _default: 400
-       },
-
-       step: {
-
-               opacity: function(fx){
-                       jQuery.style(fx.elem, "opacity", fx.now);
-               },
-
-               _default: function(fx){
-                       if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-                               fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
-                       } else {
-                               fx.elem[ fx.prop ] = fx.now;
-                       }
-               }
-       }
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function(elem){
-               return jQuery.grep(jQuery.timers, function(fn){
-                       return elem === fn.elem;
-               }).length;
-       };
-}
index 6d34672d37caa2ce71d5f31fe8ac470b1c76cc54..4632442a527bef9f0af81ba382d80e4ed566661b 100644 (file)
@@ -21,7 +21,7 @@
        <script type="text/javascript" src="unit/selector.js"></script>
        <script type="text/javascript" src="unit/event.js"></script>
        <script type="text/javascript" src="unit/ajax.js"></script>
-       <script type="text/javascript" src="unit/fx.js"></script>
+       <script type="text/javascript" src="unit/effects.js"></script>
        <script type="text/javascript" src="unit/offset.js"></script>
 </head>
 
diff --git a/test/unit/effects.js b/test/unit/effects.js
new file mode 100644 (file)
index 0000000..2c5616d
--- /dev/null
@@ -0,0 +1,622 @@
+module("effects");
+
+test("show()", function() {
+       expect(16);
+       var pass = true, div = jQuery("#main div");
+       div.show().each(function(){
+               if ( this.style.display == "none" ) pass = false;
+       });
+       ok( pass, "Show" );
+
+       pass = true;
+       div.hide().show(null).each(function() {
+               if ( this.style.display == "none" ) pass = false;
+       });
+       ok( pass, "Show will null speed");
+
+       jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div>');
+
+       var old = jQuery("#show-tests table").show().css("display") !== "table";
+
+       var test = {
+               "div"      : "block",
+               "p"        : "block",
+               "a"        : "inline",
+               "code"     : "inline",
+               "pre"      : "block",
+               "span"     : "inline",
+               "table"    : old ? "block" : "table",
+               "thead"    : old ? "block" : "table-header-group",
+               "tbody"    : old ? "block" : "table-row-group",
+               "tr"       : old ? "block" : "table-row",
+               "th"       : old ? "block" : "table-cell",
+               "td"       : old ? "block" : "table-cell",
+               "ul"       : "block",
+               "li"       : old ? "block" : "list-item"
+       };
+
+       jQuery.each(test, function(selector, expected) {
+               var elem = jQuery(selector, "#show-tests").show();
+               equals( elem.css("display"), expected, "Show using correct display type for " + selector );
+       });
+});
+
+test("show(Number) - other displays", function() {
+       expect(15);
+       reset();
+       stop();
+
+       jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div>');
+
+       var old = jQuery("#show-tests table").show().css("display") !== "table",
+               num = 0;
+
+       var test = {
+               "div"      : "block",
+               "p"        : "block",
+               "a"        : "inline",
+               "code"     : "inline",
+               "pre"      : "block",
+               "span"     : "inline",
+               "table"    : old ? "block" : "table",
+               "thead"    : old ? "block" : "table-header-group",
+               "tbody"    : old ? "block" : "table-row-group",
+               "tr"       : old ? "block" : "table-row",
+               "th"       : old ? "block" : "table-cell",
+               "td"       : old ? "block" : "table-cell",
+               "ul"       : "block",
+               "li"       : old ? "block" : "list-item"
+       };
+
+       jQuery.each(test, function(selector, expected) {
+               var elem = jQuery(selector, "#show-tests").show(1, function() {
+                       equals( elem.css("display"), expected, "Show using correct display type for " + selector );
+                       if ( ++num === 15 ) {
+                               start();
+                       }
+               });
+       });
+});
+
+test("animate(Hash, Object, Function)", function() {
+       expect(1);
+       stop();
+       var hash = {opacity: 'show'};
+       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 negative height", function() {
+       expect(1);
+       stop();
+       jQuery("#foo").animate({ height: -100 }, 100, function() {
+               equals( this.offsetHeight, 0, "Verify height." );
+               start();
+       });
+});
+
+/* // This test ends up being flaky depending upon the CPU load
+test("animate option (queue === false)", function () {
+       expect(1);
+       stop();
+
+       var order = [];
+
+       var $foo = jQuery("#foo");
+       $foo.animate({width:'100px'}, 3000, function () {
+               // should finish after unqueued animation so second
+               order.push(2);
+               same( order, [ 1, 2 ], "Animations finished in the correct order" );
+               start();
+       });
+       $foo.animate({fontSize:'2em'}, {queue:false, duration:10, complete:function () {
+               // short duration and out of queue so should finish first
+               order.push(1);
+       }});
+});
+*/
+
+test("animate with no properties", function() {
+       expect(1);
+       
+       var divs = jQuery("div"), count = 0;
+
+       divs.animate({}, function(){
+               count++;
+       });
+
+       equals( divs.length, count, "Make sure that callback is called for each element in the set." );
+});
+
+test("animate duration 0", function() {
+       expect(11);
+       
+       stop();
+       
+       var $elems = jQuery([{ a:0 },{ a:0 }]), counter = 0;
+       
+       equals( jQuery.timers.length, 0, "Make sure no animation was running from another test" );
+               
+       $elems.eq(0).animate( {a:1}, 0, function(){
+               ok( true, "Animate a simple property." );
+               counter++;
+       });
+       
+       // 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, function(){
+               ok( true, "Animate a second simple property." );
+               counter++;
+       });
+       
+       equals( counter, 3, "Multiple synchronic animations" );
+       
+       $elems.eq(0).animate( {a:3}, 0, function(){
+               ok( true, "Animate a third simple property." );
+               counter++;
+       });
+       $elems.eq(1).animate( {a:3}, 200, function(){
+               counter++;
+               // Failed until [6115]
+               equals( counter, 5, "One synchronic and one asynchronic" );
+               start();
+       });
+       
+       var $elem = jQuery("<div />");
+       $elem.show(0, function(){ 
+               ok(true, "Show callback with no duration");
+       });
+       $elem.hide(0, function(){ 
+               ok(true, "Hide callback with no duration");
+       });
+});
+
+test("animate hyphenated properties", function(){
+       expect(1);
+       stop();
+
+       jQuery("#nothiddendiv")
+               .css("font-size", 10)
+               .animate({"font-size": 20}, 200, function(){
+                       equals( this.style.fontSize, "20px", "The font-size property was animated." );
+                       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." );
+               start();
+       });
+});
+
+test("stop()", function() {
+       expect(3);
+       stop();
+
+       var $foo = jQuery("#nothiddendiv");
+       var w = 0;
+       $foo.hide().width(200).width();
+
+       $foo.animate({ width:'show' }, 1000);
+       setTimeout(function(){
+               var nw = $foo.width();
+               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
+               $foo.stop();
+
+               nw = $foo.width();
+               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
+               setTimeout(function(){
+                       equals( nw, $foo.width(), "The animation didn't continue" );
+                       start();
+               }, 100);
+       }, 100);
+});
+
+test("stop() - several in queue", function() {
+       expect(3);
+       stop();
+
+       var $foo = jQuery("#nothiddendivchild");
+       var w = 0;
+       $foo.hide().width(200).width();
+
+       $foo.animate({ width:'show' }, 1000);
+       $foo.animate({ width:'hide' }, 1000);
+       $foo.animate({ width:'show' }, 1000);
+       setTimeout(function(){
+               equals( $foo.queue().length, 3, "All 3 still in the queue" );
+               var nw = $foo.width();
+               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
+               $foo.stop();
+
+               nw = $foo.width();
+               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
+               // Disabled, being flaky
+               //equals( $foo.queue().length, 1, "The next animation continued" );
+               $foo.stop(true);
+               start();
+       }, 100);
+});
+
+test("stop(clearQueue)", function() {
+       expect(4);
+       stop();
+
+       var $foo = jQuery("#nothiddendiv");
+       var w = 0;
+       $foo.hide().width(200).width();
+
+       $foo.animate({ width:'show' }, 1000);
+       $foo.animate({ width:'hide' }, 1000);
+       $foo.animate({ width:'show' }, 1000);
+       setTimeout(function(){
+               var nw = $foo.width();
+               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
+               $foo.stop(true);
+
+               nw = $foo.width();
+               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
+
+               equals( $foo.queue().length, 0, "The animation queue was cleared" );
+               setTimeout(function(){
+                       equals( nw, $foo.width(), "The animation didn't continue" );
+                       start();
+               }, 100);
+       }, 100);
+});
+
+test("stop(clearQueue, gotoEnd)", function() {
+       expect(1);
+       stop();
+
+       var $foo = jQuery("#nothiddendivchild");
+       var w = 0;
+       $foo.hide().width(200).width();
+
+       $foo.animate({ width:'show' }, 1000);
+       $foo.animate({ width:'hide' }, 1000);
+       $foo.animate({ width:'show' }, 1000);
+       $foo.animate({ width:'hide' }, 1000);
+       setTimeout(function(){
+               var nw = $foo.width();
+               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
+               $foo.stop(false, true);
+
+               nw = $foo.width();
+               // Disabled, being flaky
+               //equals( nw, 1, "Stop() reset the animation" );
+
+               setTimeout(function(){
+                       // Disabled, being flaky
+                       //equals( $foo.queue().length, 2, "The next animation continued" );
+                       $foo.stop(true);
+                       start();
+               }, 100);
+       }, 100);
+});
+
+test("toggle()", function() {
+       expect(6);
+       var x = jQuery("#nothiddendiv");
+       ok( x.is(":visible"), "is visible" );
+       x.toggle();
+       ok( x.is(":hidden"), "is hidden" );
+       x.toggle();
+       ok( x.is(":visible"), "is visible again" );
+       
+       x.toggle(true);
+       ok( x.is(":visible"), "is visible" );
+       x.toggle(false);
+       ok( x.is(":hidden"), "is hidden" );
+       x.toggle(true);
+       ok( x.is(":visible"), "is visible again" );
+});
+
+jQuery.checkOverflowDisplay = function(){
+       var o = jQuery.css( this, "overflow" );
+
+       equals(o, "visible", "Overflow should be visible: " + o);
+       equals(jQuery.css( this, "display" ), "inline", "Display shouldn't be tampered with.");
+
+       start();
+}
+
+test("JS Overflow and Display", function() {
+       expect(2);
+       stop();
+       jQuery.makeTest( "JS Overflow and Display" )
+               .addClass("widewidth")
+               .css({ overflow: "visible", display: "inline" })
+               .addClass("widewidth")
+               .text("Some sample text.")
+               .before("text before")
+               .after("text after")
+               .animate({ opacity: 0.5 }, "slow", jQuery.checkOverflowDisplay);
+});
+               
+test("CSS Overflow and Display", function() {
+       expect(2);
+       stop();
+       jQuery.makeTest( "CSS Overflow and Display" )
+               .addClass("overflow inline")
+               .addClass("widewidth")
+               .text("Some sample text.")
+               .before("text before")
+               .after("text after")
+               .animate({ opacity: 0.5 }, "slow", jQuery.checkOverflowDisplay);
+});
+
+jQuery.each( {
+       "CSS Auto": function(elem,prop){
+               jQuery(elem).addClass("auto" + prop)
+                       .text("This is a long string of text.");
+               return "";
+       },
+       "JS Auto": function(elem,prop){
+               jQuery(elem).css(prop,"auto")
+                       .text("This is a long string of text.");
+               return "";
+       },
+       "CSS 100": function(elem,prop){
+               jQuery(elem).addClass("large" + prop);
+               return "";
+       },
+       "JS 100": function(elem,prop){
+               jQuery(elem).css(prop,prop == "opacity" ? 1 : "100px");
+               return prop == "opacity" ? 1 : 100;
+       },
+       "CSS 50": function(elem,prop){
+               jQuery(elem).addClass("med" + prop);
+               return "";
+       },
+       "JS 50": function(elem,prop){
+               jQuery(elem).css(prop,prop == "opacity" ? 0.50 : "50px");
+               return prop == "opacity" ? 0.5 : 50;
+       },
+       "CSS 0": function(elem,prop){
+               jQuery(elem).addClass("no" + prop);
+               return "";
+       },
+       "JS 0": function(elem,prop){
+               jQuery(elem).css(prop,prop == "opacity" ? 0 : "0px");
+               return 0;
+       }
+}, function(fn, f){
+       jQuery.each( {
+               "show": function(elem,prop){
+                       jQuery(elem).hide().addClass("wide"+prop);
+                       return "show";
+               },
+               "hide": function(elem,prop){
+                       jQuery(elem).addClass("wide"+prop);
+                       return "hide";
+               },
+               "100": function(elem,prop){
+                       jQuery(elem).addClass("wide"+prop);
+                       return prop == "opacity" ? 1 : 100;
+               },
+               "50": function(elem,prop){
+                       return prop == "opacity" ? 0.50 : 50;
+               },
+               "0": function(elem,prop){
+                       jQuery(elem).addClass("noback");
+                       return 0;
+               }
+       }, function(tn, t){
+               test(fn + " to " + tn, function() {
+                       var elem = jQuery.makeTest( fn + " to " + tn );
+       
+                       var t_w = t( elem, "width" );
+                       var f_w = f( elem, "width" );
+                       var t_h = t( elem, "height" );
+                       var f_h = f( elem, "height" );
+                       var t_o = t( elem, "opacity" );
+                       var f_o = f( elem, "opacity" );
+                       
+                       var num = 0;
+                       
+                       if ( t_h == "show" ) num++;
+                       if ( t_w == "show" ) num++;
+                       if ( t_w == "hide"||t_w == "show" ) num++;
+                       if ( t_h == "hide"||t_h == "show" ) num++;
+                       if ( t_o == "hide"||t_o == "show" ) num++;
+                       if ( t_w == "hide" ) num++;
+                       if ( t_o.constructor == Number ) num += 2;
+                       if ( t_w.constructor == Number ) num += 2;
+                       if ( t_h.constructor == Number ) num +=2;
+                       
+                       expect(num);
+                       stop();
+       
+                       var anim = { width: t_w, height: t_h, opacity: t_o };
+       
+                       elem.animate(anim, 50, function(){
+                               if ( t_w == "show" )
+                                       equals( this.style.display, "block", "Showing, display should block: " + this.style.display);
+                                       
+                               if ( t_w == "hide"||t_w == "show" )
+                                       equals(this.style.width.indexOf(f_w), 0, "Width must be reset to " + f_w + ": " + this.style.width);
+                                       
+                               if ( t_h == "hide"||t_h == "show" )
+                                       equals(this.style.height.indexOf(f_h), 0, "Height must be reset to " + f_h + ": " + this.style.height);
+                                       
+                               var cur_o = jQuery.style(this, "opacity");
+                               if ( cur_o !== "" ) cur_o = parseFloat( cur_o );
+       
+                               if ( t_o == "hide"||t_o == "show" )
+                                       equals(cur_o, f_o, "Opacity must be reset to " + f_o + ": " + cur_o);
+                                       
+                               if ( t_w == "hide" )
+                                       equals(this.style.display, "none", "Hiding, display should be none: " + this.style.display);
+                                       
+                               if ( t_o.constructor == Number ) {
+                                       equals(cur_o, t_o, "Final opacity should be " + t_o + ": " + cur_o);
+                                       
+                                       ok(jQuery.curCSS(this, "opacity") != "" || cur_o == t_o, "Opacity should be explicitly set to " + t_o + ", is instead: " + cur_o);
+                               }
+                                       
+                               if ( t_w.constructor == Number ) {
+                                       equals(this.style.width, t_w + "px", "Final width should be " + t_w + ": " + this.style.width);
+                                       
+                                       var cur_w = jQuery.css(this,"width");
+
+                                       ok(this.style.width != "" || cur_w == t_w, "Width should be explicitly set to " + t_w + ", is instead: " + cur_w);
+                               }
+                                       
+                               if ( t_h.constructor == Number ) {
+                                       equals(this.style.height, t_h + "px", "Final height should be " + t_h + ": " + this.style.height);
+                                       
+                                       var cur_h = jQuery.css(this,"height");
+
+                                       ok(this.style.height != "" || cur_h == t_h, "Height should be explicitly set to " + t_h + ", is instead: " + cur_w);
+                               }
+                               
+                               if ( t_h == "show" ) {
+                                       var old_h = jQuery.curCSS(this, "height");
+                                       jQuery(elem).append("<br/>Some more text<br/>and some more...");
+                                       ok(old_h != jQuery.css(this, "height" ), "Make sure height is auto.");
+                               }
+       
+                               start();
+                       });
+               });
+       });
+});
+
+jQuery.fn.saveState = function(){
+       var check = ['opacity','height','width','display','overflow'];  
+       expect(check.length);
+       
+       stop();
+       return this.each(function(){
+               var self = this;
+               self.save = {};
+               jQuery.each(check, function(i,c){
+                       self.save[c] = jQuery.css(self,c);
+               });
+       });
+};
+
+jQuery.checkState = function(){
+       var self = this;
+       jQuery.each(this.save, function(c,v){
+               var cur = jQuery.css(self,c);
+               equals( v, cur, "Make sure that " + c + " is reset (Old: " + v + " Cur: " + cur + ")");
+       });
+       start();
+}
+
+// Chaining Tests
+test("Chain fadeOut fadeIn", function() {
+       jQuery('#fadein div').saveState().fadeOut('fast').fadeIn('fast',jQuery.checkState);
+});
+test("Chain fadeIn fadeOut", function() {
+       jQuery('#fadeout div').saveState().fadeIn('fast').fadeOut('fast',jQuery.checkState);
+});
+
+test("Chain hide show", function() {
+       jQuery('#show div').saveState().hide('fast').show('fast',jQuery.checkState);
+});
+test("Chain show hide", function() {
+       jQuery('#hide div').saveState().show('fast').hide('fast',jQuery.checkState);
+});
+
+test("Chain toggle in", function() {
+       jQuery('#togglein div').saveState().toggle('fast').toggle('fast',jQuery.checkState);
+});
+test("Chain toggle out", function() {
+       jQuery('#toggleout div').saveState().toggle('fast').toggle('fast',jQuery.checkState);
+});
+
+test("Chain slideDown slideUp", function() {
+       jQuery('#slidedown div').saveState().slideDown('fast').slideUp('fast',jQuery.checkState);
+});
+test("Chain slideUp slideDown", function() {
+       jQuery('#slideup div').saveState().slideUp('fast').slideDown('fast',jQuery.checkState);
+});
+
+test("Chain slideToggle in", function() {
+       jQuery('#slidetogglein div').saveState().slideToggle('fast').slideToggle('fast',jQuery.checkState);
+});
+test("Chain slideToggle out", function() {
+       jQuery('#slidetoggleout div').saveState().slideToggle('fast').slideToggle('fast',jQuery.checkState);
+});
+
+jQuery.makeTest = function( text ){
+       var elem = jQuery("<div></div>")
+               .attr("id", "test" + jQuery.makeTest.id++)
+               .addClass("box");
+
+       jQuery("<h4></h4>")
+               .text( text )
+               .appendTo("#fx-tests")
+               .click(function(){
+                       jQuery(this).next().toggle();
+               })
+               .after( elem );
+
+       return elem;
+}
+
+jQuery.makeTest.id = 1;
+
+test("jQuery.show('fast') doesn't clear radio buttons (bug #1095)", function () {
+       expect(4);
+  stop();
+
+       var $checkedtest = jQuery("#checkedtest");
+       // IE6 was clearing "checked" in jQuery(elem).show("fast");
+       $checkedtest.hide().show("fast", function() {
+       ok( !! jQuery(":radio:first", $checkedtest).attr("checked"), "Check first radio still checked." );
+       ok( ! jQuery(":radio:last", $checkedtest).attr("checked"), "Check last radio still NOT checked." );
+       ok( !! jQuery(":checkbox:first", $checkedtest).attr("checked"), "Check first checkbox still checked." );
+       ok( ! jQuery(":checkbox:last", $checkedtest).attr("checked"), "Check last checkbox still NOT checked." );
+       start();
+       });
+});
+
+test("animate with per-property easing", function(){
+       
+       expect(3);
+       stop();
+       
+       var _test1_called = false;
+       var _test2_called = false;
+       var _default_test_called = false;
+       
+       jQuery.easing['_test1'] = function() {
+               _test1_called = true;
+       };
+       
+       jQuery.easing['_test2'] = function() {
+               _test2_called = true;
+       };
+       
+       jQuery.easing['_default_test'] = function() {
+               _default_test_called = true;
+       };
+       
+       jQuery({a:0,b:0,c:0}).animate({
+               a: [100, '_test1'],
+               b: [100, '_test2'],
+               c: 100
+       }, 400, '_default_test', function(){
+               start();
+               ok(_test1_called, "Easing function (1) called");
+               ok(_test2_called, "Easing function (2) called");
+               ok(_default_test_called, "Easing function (_default) called");
+       });
+       
+});
diff --git a/test/unit/fx.js b/test/unit/fx.js
deleted file mode 100644 (file)
index b959799..0000000
+++ /dev/null
@@ -1,622 +0,0 @@
-module("fx");
-
-test("show()", function() {
-       expect(16);
-       var pass = true, div = jQuery("#main div");
-       div.show().each(function(){
-               if ( this.style.display == "none" ) pass = false;
-       });
-       ok( pass, "Show" );
-
-       pass = true;
-       div.hide().show(null).each(function() {
-               if ( this.style.display == "none" ) pass = false;
-       });
-       ok( pass, "Show will null speed");
-
-       jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div>');
-
-       var old = jQuery("#show-tests table").show().css("display") !== "table";
-
-       var test = {
-               "div"      : "block",
-               "p"        : "block",
-               "a"        : "inline",
-               "code"     : "inline",
-               "pre"      : "block",
-               "span"     : "inline",
-               "table"    : old ? "block" : "table",
-               "thead"    : old ? "block" : "table-header-group",
-               "tbody"    : old ? "block" : "table-row-group",
-               "tr"       : old ? "block" : "table-row",
-               "th"       : old ? "block" : "table-cell",
-               "td"       : old ? "block" : "table-cell",
-               "ul"       : "block",
-               "li"       : old ? "block" : "list-item"
-       };
-
-       jQuery.each(test, function(selector, expected) {
-               var elem = jQuery(selector, "#show-tests").show();
-               equals( elem.css("display"), expected, "Show using correct display type for " + selector );
-       });
-});
-
-test("show(Number) - other displays", function() {
-       expect(15);
-       reset();
-       stop();
-
-       jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div>');
-
-       var old = jQuery("#show-tests table").show().css("display") !== "table",
-               num = 0;
-
-       var test = {
-               "div"      : "block",
-               "p"        : "block",
-               "a"        : "inline",
-               "code"     : "inline",
-               "pre"      : "block",
-               "span"     : "inline",
-               "table"    : old ? "block" : "table",
-               "thead"    : old ? "block" : "table-header-group",
-               "tbody"    : old ? "block" : "table-row-group",
-               "tr"       : old ? "block" : "table-row",
-               "th"       : old ? "block" : "table-cell",
-               "td"       : old ? "block" : "table-cell",
-               "ul"       : "block",
-               "li"       : old ? "block" : "list-item"
-       };
-
-       jQuery.each(test, function(selector, expected) {
-               var elem = jQuery(selector, "#show-tests").show(1, function() {
-                       equals( elem.css("display"), expected, "Show using correct display type for " + selector );
-                       if ( ++num === 15 ) {
-                               start();
-                       }
-               });
-       });
-});
-
-test("animate(Hash, Object, Function)", function() {
-       expect(1);
-       stop();
-       var hash = {opacity: 'show'};
-       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 negative height", function() {
-       expect(1);
-       stop();
-       jQuery("#foo").animate({ height: -100 }, 100, function() {
-               equals( this.offsetHeight, 0, "Verify height." );
-               start();
-       });
-});
-
-/* // This test ends up being flaky depending upon the CPU load
-test("animate option (queue === false)", function () {
-       expect(1);
-       stop();
-
-       var order = [];
-
-       var $foo = jQuery("#foo");
-       $foo.animate({width:'100px'}, 3000, function () {
-               // should finish after unqueued animation so second
-               order.push(2);
-               same( order, [ 1, 2 ], "Animations finished in the correct order" );
-               start();
-       });
-       $foo.animate({fontSize:'2em'}, {queue:false, duration:10, complete:function () {
-               // short duration and out of queue so should finish first
-               order.push(1);
-       }});
-});
-*/
-
-test("animate with no properties", function() {
-       expect(1);
-       
-       var divs = jQuery("div"), count = 0;
-
-       divs.animate({}, function(){
-               count++;
-       });
-
-       equals( divs.length, count, "Make sure that callback is called for each element in the set." );
-});
-
-test("animate duration 0", function() {
-       expect(11);
-       
-       stop();
-       
-       var $elems = jQuery([{ a:0 },{ a:0 }]), counter = 0;
-       
-       equals( jQuery.timers.length, 0, "Make sure no animation was running from another test" );
-               
-       $elems.eq(0).animate( {a:1}, 0, function(){
-               ok( true, "Animate a simple property." );
-               counter++;
-       });
-       
-       // 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, function(){
-               ok( true, "Animate a second simple property." );
-               counter++;
-       });
-       
-       equals( counter, 3, "Multiple synchronic animations" );
-       
-       $elems.eq(0).animate( {a:3}, 0, function(){
-               ok( true, "Animate a third simple property." );
-               counter++;
-       });
-       $elems.eq(1).animate( {a:3}, 200, function(){
-               counter++;
-               // Failed until [6115]
-               equals( counter, 5, "One synchronic and one asynchronic" );
-               start();
-       });
-       
-       var $elem = jQuery("<div />");
-       $elem.show(0, function(){ 
-               ok(true, "Show callback with no duration");
-       });
-       $elem.hide(0, function(){ 
-               ok(true, "Hide callback with no duration");
-       });
-});
-
-test("animate hyphenated properties", function(){
-       expect(1);
-       stop();
-
-       jQuery("#nothiddendiv")
-               .css("font-size", 10)
-               .animate({"font-size": 20}, 200, function(){
-                       equals( this.style.fontSize, "20px", "The font-size property was animated." );
-                       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." );
-               start();
-       });
-});
-
-test("stop()", function() {
-       expect(3);
-       stop();
-
-       var $foo = jQuery("#nothiddendiv");
-       var w = 0;
-       $foo.hide().width(200).width();
-
-       $foo.animate({ width:'show' }, 1000);
-       setTimeout(function(){
-               var nw = $foo.width();
-               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
-               $foo.stop();
-
-               nw = $foo.width();
-               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
-               setTimeout(function(){
-                       equals( nw, $foo.width(), "The animation didn't continue" );
-                       start();
-               }, 100);
-       }, 100);
-});
-
-test("stop() - several in queue", function() {
-       expect(3);
-       stop();
-
-       var $foo = jQuery("#nothiddendivchild");
-       var w = 0;
-       $foo.hide().width(200).width();
-
-       $foo.animate({ width:'show' }, 1000);
-       $foo.animate({ width:'hide' }, 1000);
-       $foo.animate({ width:'show' }, 1000);
-       setTimeout(function(){
-               equals( $foo.queue().length, 3, "All 3 still in the queue" );
-               var nw = $foo.width();
-               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
-               $foo.stop();
-
-               nw = $foo.width();
-               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
-               // Disabled, being flaky
-               //equals( $foo.queue().length, 1, "The next animation continued" );
-               $foo.stop(true);
-               start();
-       }, 100);
-});
-
-test("stop(clearQueue)", function() {
-       expect(4);
-       stop();
-
-       var $foo = jQuery("#nothiddendiv");
-       var w = 0;
-       $foo.hide().width(200).width();
-
-       $foo.animate({ width:'show' }, 1000);
-       $foo.animate({ width:'hide' }, 1000);
-       $foo.animate({ width:'show' }, 1000);
-       setTimeout(function(){
-               var nw = $foo.width();
-               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
-               $foo.stop(true);
-
-               nw = $foo.width();
-               ok( nw != w, "Stop didn't reset the animation " + nw + "px " + w + "px");
-
-               equals( $foo.queue().length, 0, "The animation queue was cleared" );
-               setTimeout(function(){
-                       equals( nw, $foo.width(), "The animation didn't continue" );
-                       start();
-               }, 100);
-       }, 100);
-});
-
-test("stop(clearQueue, gotoEnd)", function() {
-       expect(1);
-       stop();
-
-       var $foo = jQuery("#nothiddendivchild");
-       var w = 0;
-       $foo.hide().width(200).width();
-
-       $foo.animate({ width:'show' }, 1000);
-       $foo.animate({ width:'hide' }, 1000);
-       $foo.animate({ width:'show' }, 1000);
-       $foo.animate({ width:'hide' }, 1000);
-       setTimeout(function(){
-               var nw = $foo.width();
-               ok( nw != w, "An animation occurred " + nw + "px " + w + "px");
-               $foo.stop(false, true);
-
-               nw = $foo.width();
-               // Disabled, being flaky
-               //equals( nw, 1, "Stop() reset the animation" );
-
-               setTimeout(function(){
-                       // Disabled, being flaky
-                       //equals( $foo.queue().length, 2, "The next animation continued" );
-                       $foo.stop(true);
-                       start();
-               }, 100);
-       }, 100);
-});
-
-test("toggle()", function() {
-       expect(6);
-       var x = jQuery("#nothiddendiv");
-       ok( x.is(":visible"), "is visible" );
-       x.toggle();
-       ok( x.is(":hidden"), "is hidden" );
-       x.toggle();
-       ok( x.is(":visible"), "is visible again" );
-       
-       x.toggle(true);
-       ok( x.is(":visible"), "is visible" );
-       x.toggle(false);
-       ok( x.is(":hidden"), "is hidden" );
-       x.toggle(true);
-       ok( x.is(":visible"), "is visible again" );
-});
-
-jQuery.checkOverflowDisplay = function(){
-       var o = jQuery.css( this, "overflow" );
-
-       equals(o, "visible", "Overflow should be visible: " + o);
-       equals(jQuery.css( this, "display" ), "inline", "Display shouldn't be tampered with.");
-
-       start();
-}
-
-test("JS Overflow and Display", function() {
-       expect(2);
-       stop();
-       jQuery.makeTest( "JS Overflow and Display" )
-               .addClass("widewidth")
-               .css({ overflow: "visible", display: "inline" })
-               .addClass("widewidth")
-               .text("Some sample text.")
-               .before("text before")
-               .after("text after")
-               .animate({ opacity: 0.5 }, "slow", jQuery.checkOverflowDisplay);
-});
-               
-test("CSS Overflow and Display", function() {
-       expect(2);
-       stop();
-       jQuery.makeTest( "CSS Overflow and Display" )
-               .addClass("overflow inline")
-               .addClass("widewidth")
-               .text("Some sample text.")
-               .before("text before")
-               .after("text after")
-               .animate({ opacity: 0.5 }, "slow", jQuery.checkOverflowDisplay);
-});
-
-jQuery.each( {
-       "CSS Auto": function(elem,prop){
-               jQuery(elem).addClass("auto" + prop)
-                       .text("This is a long string of text.");
-               return "";
-       },
-       "JS Auto": function(elem,prop){
-               jQuery(elem).css(prop,"auto")
-                       .text("This is a long string of text.");
-               return "";
-       },
-       "CSS 100": function(elem,prop){
-               jQuery(elem).addClass("large" + prop);
-               return "";
-       },
-       "JS 100": function(elem,prop){
-               jQuery(elem).css(prop,prop == "opacity" ? 1 : "100px");
-               return prop == "opacity" ? 1 : 100;
-       },
-       "CSS 50": function(elem,prop){
-               jQuery(elem).addClass("med" + prop);
-               return "";
-       },
-       "JS 50": function(elem,prop){
-               jQuery(elem).css(prop,prop == "opacity" ? 0.50 : "50px");
-               return prop == "opacity" ? 0.5 : 50;
-       },
-       "CSS 0": function(elem,prop){
-               jQuery(elem).addClass("no" + prop);
-               return "";
-       },
-       "JS 0": function(elem,prop){
-               jQuery(elem).css(prop,prop == "opacity" ? 0 : "0px");
-               return 0;
-       }
-}, function(fn, f){
-       jQuery.each( {
-               "show": function(elem,prop){
-                       jQuery(elem).hide().addClass("wide"+prop);
-                       return "show";
-               },
-               "hide": function(elem,prop){
-                       jQuery(elem).addClass("wide"+prop);
-                       return "hide";
-               },
-               "100": function(elem,prop){
-                       jQuery(elem).addClass("wide"+prop);
-                       return prop == "opacity" ? 1 : 100;
-               },
-               "50": function(elem,prop){
-                       return prop == "opacity" ? 0.50 : 50;
-               },
-               "0": function(elem,prop){
-                       jQuery(elem).addClass("noback");
-                       return 0;
-               }
-       }, function(tn, t){
-               test(fn + " to " + tn, function() {
-                       var elem = jQuery.makeTest( fn + " to " + tn );
-       
-                       var t_w = t( elem, "width" );
-                       var f_w = f( elem, "width" );
-                       var t_h = t( elem, "height" );
-                       var f_h = f( elem, "height" );
-                       var t_o = t( elem, "opacity" );
-                       var f_o = f( elem, "opacity" );
-                       
-                       var num = 0;
-                       
-                       if ( t_h == "show" ) num++;
-                       if ( t_w == "show" ) num++;
-                       if ( t_w == "hide"||t_w == "show" ) num++;
-                       if ( t_h == "hide"||t_h == "show" ) num++;
-                       if ( t_o == "hide"||t_o == "show" ) num++;
-                       if ( t_w == "hide" ) num++;
-                       if ( t_o.constructor == Number ) num += 2;
-                       if ( t_w.constructor == Number ) num += 2;
-                       if ( t_h.constructor == Number ) num +=2;
-                       
-                       expect(num);
-                       stop();
-       
-                       var anim = { width: t_w, height: t_h, opacity: t_o };
-       
-                       elem.animate(anim, 50, function(){
-                               if ( t_w == "show" )
-                                       equals( this.style.display, "block", "Showing, display should block: " + this.style.display);
-                                       
-                               if ( t_w == "hide"||t_w == "show" )
-                                       equals(this.style.width.indexOf(f_w), 0, "Width must be reset to " + f_w + ": " + this.style.width);
-                                       
-                               if ( t_h == "hide"||t_h == "show" )
-                                       equals(this.style.height.indexOf(f_h), 0, "Height must be reset to " + f_h + ": " + this.style.height);
-                                       
-                               var cur_o = jQuery.style(this, "opacity");
-                               if ( cur_o !== "" ) cur_o = parseFloat( cur_o );
-       
-                               if ( t_o == "hide"||t_o == "show" )
-                                       equals(cur_o, f_o, "Opacity must be reset to " + f_o + ": " + cur_o);
-                                       
-                               if ( t_w == "hide" )
-                                       equals(this.style.display, "none", "Hiding, display should be none: " + this.style.display);
-                                       
-                               if ( t_o.constructor == Number ) {
-                                       equals(cur_o, t_o, "Final opacity should be " + t_o + ": " + cur_o);
-                                       
-                                       ok(jQuery.curCSS(this, "opacity") != "" || cur_o == t_o, "Opacity should be explicitly set to " + t_o + ", is instead: " + cur_o);
-                               }
-                                       
-                               if ( t_w.constructor == Number ) {
-                                       equals(this.style.width, t_w + "px", "Final width should be " + t_w + ": " + this.style.width);
-                                       
-                                       var cur_w = jQuery.css(this,"width");
-
-                                       ok(this.style.width != "" || cur_w == t_w, "Width should be explicitly set to " + t_w + ", is instead: " + cur_w);
-                               }
-                                       
-                               if ( t_h.constructor == Number ) {
-                                       equals(this.style.height, t_h + "px", "Final height should be " + t_h + ": " + this.style.height);
-                                       
-                                       var cur_h = jQuery.css(this,"height");
-
-                                       ok(this.style.height != "" || cur_h == t_h, "Height should be explicitly set to " + t_h + ", is instead: " + cur_w);
-                               }
-                               
-                               if ( t_h == "show" ) {
-                                       var old_h = jQuery.curCSS(this, "height");
-                                       jQuery(elem).append("<br/>Some more text<br/>and some more...");
-                                       ok(old_h != jQuery.css(this, "height" ), "Make sure height is auto.");
-                               }
-       
-                               start();
-                       });
-               });
-       });
-});
-
-jQuery.fn.saveState = function(){
-       var check = ['opacity','height','width','display','overflow'];  
-       expect(check.length);
-       
-       stop();
-       return this.each(function(){
-               var self = this;
-               self.save = {};
-               jQuery.each(check, function(i,c){
-                       self.save[c] = jQuery.css(self,c);
-               });
-       });
-};
-
-jQuery.checkState = function(){
-       var self = this;
-       jQuery.each(this.save, function(c,v){
-               var cur = jQuery.css(self,c);
-               equals( v, cur, "Make sure that " + c + " is reset (Old: " + v + " Cur: " + cur + ")");
-       });
-       start();
-}
-
-// Chaining Tests
-test("Chain fadeOut fadeIn", function() {
-       jQuery('#fadein div').saveState().fadeOut('fast').fadeIn('fast',jQuery.checkState);
-});
-test("Chain fadeIn fadeOut", function() {
-       jQuery('#fadeout div').saveState().fadeIn('fast').fadeOut('fast',jQuery.checkState);
-});
-
-test("Chain hide show", function() {
-       jQuery('#show div').saveState().hide('fast').show('fast',jQuery.checkState);
-});
-test("Chain show hide", function() {
-       jQuery('#hide div').saveState().show('fast').hide('fast',jQuery.checkState);
-});
-
-test("Chain toggle in", function() {
-       jQuery('#togglein div').saveState().toggle('fast').toggle('fast',jQuery.checkState);
-});
-test("Chain toggle out", function() {
-       jQuery('#toggleout div').saveState().toggle('fast').toggle('fast',jQuery.checkState);
-});
-
-test("Chain slideDown slideUp", function() {
-       jQuery('#slidedown div').saveState().slideDown('fast').slideUp('fast',jQuery.checkState);
-});
-test("Chain slideUp slideDown", function() {
-       jQuery('#slideup div').saveState().slideUp('fast').slideDown('fast',jQuery.checkState);
-});
-
-test("Chain slideToggle in", function() {
-       jQuery('#slidetogglein div').saveState().slideToggle('fast').slideToggle('fast',jQuery.checkState);
-});
-test("Chain slideToggle out", function() {
-       jQuery('#slidetoggleout div').saveState().slideToggle('fast').slideToggle('fast',jQuery.checkState);
-});
-
-jQuery.makeTest = function( text ){
-       var elem = jQuery("<div></div>")
-               .attr("id", "test" + jQuery.makeTest.id++)
-               .addClass("box");
-
-       jQuery("<h4></h4>")
-               .text( text )
-               .appendTo("#fx-tests")
-               .click(function(){
-                       jQuery(this).next().toggle();
-               })
-               .after( elem );
-
-       return elem;
-}
-
-jQuery.makeTest.id = 1;
-
-test("jQuery.show('fast') doesn't clear radio buttons (bug #1095)", function () {
-       expect(4);
-  stop();
-
-       var $checkedtest = jQuery("#checkedtest");
-       // IE6 was clearing "checked" in jQuery(elem).show("fast");
-       $checkedtest.hide().show("fast", function() {
-       ok( !! jQuery(":radio:first", $checkedtest).attr("checked"), "Check first radio still checked." );
-       ok( ! jQuery(":radio:last", $checkedtest).attr("checked"), "Check last radio still NOT checked." );
-       ok( !! jQuery(":checkbox:first", $checkedtest).attr("checked"), "Check first checkbox still checked." );
-       ok( ! jQuery(":checkbox:last", $checkedtest).attr("checked"), "Check last checkbox still NOT checked." );
-       start();
-       });
-});
-
-test("animate with per-property easing", function(){
-       
-       expect(3);
-       stop();
-       
-       var _test1_called = false;
-       var _test2_called = false;
-       var _default_test_called = false;
-       
-       jQuery.easing['_test1'] = function() {
-               _test1_called = true;
-       };
-       
-       jQuery.easing['_test2'] = function() {
-               _test2_called = true;
-       };
-       
-       jQuery.easing['_default_test'] = function() {
-               _default_test_called = true;
-       };
-       
-       jQuery({a:0,b:0,c:0}).animate({
-               a: [100, '_test1'],
-               b: [100, '_test2'],
-               c: 100
-       }, 400, '_default_test', function(){
-               start();
-               ok(_test1_called, "Easing function (1) called");
-               ok(_test2_called, "Easing function (2) called");
-               ok(_default_test_called, "Easing function (_default) called");
-       });
-       
-});
\ No newline at end of file