make sure toggleClass does not delete classNames when forcefully removing classes...
[jquery.git] / test / unit / attributes.js
index e6a30a1..63e587a 100644 (file)
@@ -1,3 +1,5 @@
+module("attributes");
+
 test("attr(String)", function() {
        expect(27);
        equals( jQuery('#text1').attr('value'), "Test", 'Check for value attribute' );
@@ -31,19 +33,19 @@ test("attr(String)", function() {
 
        ok( $body.attr('foo') === undefined, 'Make sure that a non existent attribute returns undefined' );
        ok( $body.attr('nextSibling') === null, 'Make sure a null expando returns null' );
-       
+
        body.setAttribute('foo', 'baz');
        equals( $body.attr('foo'), 'baz', 'Make sure the dom attribute is retrieved when no expando is found' );
-       
+
        body.foo = 'bar';
        equals( $body.attr('foo'), 'bar', 'Make sure the expando is preferred over the dom attribute' );
-       
+
        $body.attr('foo','cool');
        equals( $body.attr('foo'), 'cool', 'Make sure that setting works well when both expando and dom attribute are available' );
-       
+
        body.foo = undefined;
        ok( $body.attr('foo') === undefined, 'Make sure the expando is preferred over the dom attribute, even if undefined' );
-       
+
        body.removeAttribute('foo'); // Cleanup
 });
 
@@ -139,7 +141,7 @@ test("attr(String, Object)", function() {
        }
        ok( thrown, "Exception thrown when trying to change type property" );
        equals( "checkbox", jQuery(check).attr('type'), "Verify that you can change the type of an input element that isn't in the DOM" );
-       
+
        var check = jQuery("<input />");
        var thrown = true;
        try {
@@ -149,7 +151,7 @@ test("attr(String, Object)", function() {
        }
        ok( thrown, "Exception thrown when trying to change type property" );
        equals( "checkbox", check.attr('type'), "Verify that you can change the type of an input element that isn't in the DOM" );
-       
+
        var button = jQuery("#button");
        var thrown = false;
        try {
@@ -183,7 +185,7 @@ test("attr('tabindex')", function() {
        // elements not natively tabbable
        equals(jQuery('#listWithTabIndex').attr('tabindex'), 5, 'not natively tabbable, with tabindex set to 0');
        equals(jQuery('#divWithNoTabIndex').attr('tabindex'), undefined, 'not natively tabbable, no tabindex set');
-       
+
        // anchor with href
        equals(jQuery('#linkWithNoTabIndex').attr('tabindex'), 0, 'anchor with href, no tabindex set');
        equals(jQuery('#linkWithTabIndex').attr('tabindex'), 2, 'anchor with href, tabindex set to 2');
@@ -212,7 +214,7 @@ test("attr('tabindex', value)", function() {
        // set a negative string
        element.attr('tabindex', '-1');
        equals(element.attr('tabindex'), -1, 'set tabindex to -1 (string)');
-       
+
        // set a positive number
        element.attr('tabindex', 1);
        equals(element.attr('tabindex'), 1, 'set tabindex to 1 (number)');
@@ -224,7 +226,7 @@ test("attr('tabindex', value)", function() {
        // set a negative number
        element.attr('tabindex', -1);
        equals(element.attr('tabindex'), -1, 'set tabindex to -1 (number)');
-       
+
        element = jQuery('#linkWithTabIndex');
        equals(element.attr('tabindex'), 2, 'start with tabindex 2');
 
@@ -232,145 +234,6 @@ test("attr('tabindex', value)", function() {
        equals(element.attr('tabindex'), -1, 'set negative tabindex');
 });
 
-test("css(String|Hash)", function() {
-       expect(19);
-
-       equals( jQuery('#main').css("display"), 'none', 'Check for css property "display"');
-
-       ok( jQuery('#nothiddendiv').is(':visible'), 'Modifying CSS display: Assert element is visible');
-       jQuery('#nothiddendiv').css({display: 'none'});
-       ok( !jQuery('#nothiddendiv').is(':visible'), 'Modified CSS display: Assert element is hidden');
-       jQuery('#nothiddendiv').css({display: 'block'});
-       ok( jQuery('#nothiddendiv').is(':visible'), 'Modified CSS display: Assert element is visible');
-
-       jQuery('#floatTest').css({styleFloat: 'right'});
-       equals( jQuery('#floatTest').css('styleFloat'), 'right', 'Modified CSS float using "styleFloat": Assert float is right');
-       jQuery('#floatTest').css({cssFloat: 'left'});
-       equals( jQuery('#floatTest').css('cssFloat'), 'left', 'Modified CSS float using "cssFloat": Assert float is left');
-       jQuery('#floatTest').css({'float': 'right'});
-       equals( jQuery('#floatTest').css('float'), 'right', 'Modified CSS float using "float": Assert float is right');
-       jQuery('#floatTest').css({'font-size': '30px'});
-       equals( jQuery('#floatTest').css('font-size'), '30px', 'Modified CSS font-size: Assert font-size is 30px');
-
-       jQuery.each("0,0.25,0.5,0.75,1".split(','), function(i, n) {
-               jQuery('#foo').css({opacity: n});
-               equals( jQuery('#foo').css('opacity'), parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a String" );
-               jQuery('#foo').css({opacity: parseFloat(n)});
-               equals( jQuery('#foo').css('opacity'), parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a Number" );
-       });
-       jQuery('#foo').css({opacity: ''});
-       equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when set to an empty String" );
-});
-
-test("css(String, Object)", function() {
-       expect(21);
-       ok( jQuery('#nothiddendiv').is(':visible'), 'Modifying CSS display: Assert element is visible');
-       jQuery('#nothiddendiv').css("display", 'none');
-       ok( !jQuery('#nothiddendiv').is(':visible'), 'Modified CSS display: Assert element is hidden');
-       jQuery('#nothiddendiv').css("display", 'block');
-       ok( jQuery('#nothiddendiv').is(':visible'), 'Modified CSS display: Assert element is visible');
-
-       jQuery('#floatTest').css('styleFloat', 'left');
-       equals( jQuery('#floatTest').css('styleFloat'), 'left', 'Modified CSS float using "styleFloat": Assert float is left');
-       jQuery('#floatTest').css('cssFloat', 'right');
-       equals( jQuery('#floatTest').css('cssFloat'), 'right', 'Modified CSS float using "cssFloat": Assert float is right');
-       jQuery('#floatTest').css('float', 'left');
-       equals( jQuery('#floatTest').css('float'), 'left', 'Modified CSS float using "float": Assert float is left');
-       jQuery('#floatTest').css('font-size', '20px');
-       equals( jQuery('#floatTest').css('font-size'), '20px', 'Modified CSS font-size: Assert font-size is 20px');
-
-       jQuery.each("0,0.25,0.5,0.75,1".split(','), function(i, n) {
-               jQuery('#foo').css('opacity', n);
-               equals( jQuery('#foo').css('opacity'), parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a String" );
-               jQuery('#foo').css('opacity', parseFloat(n));
-               equals( jQuery('#foo').css('opacity'), parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a Number" );
-       });
-       jQuery('#foo').css('opacity', '');
-       equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when set to an empty String" );
-       // for #1438, IE throws JS error when filter exists but doesn't have opacity in it
-       if (jQuery.browser.msie) {
-               jQuery('#foo').css("filter", "progid:DXImageTransform.Microsoft.Chroma(color='red');");
-       }
-       equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when a different filter is set in IE, #1438" );
-
-       // using contents will get comments regular, text, and comment nodes
-       var j = jQuery("#nonnodes").contents();
-       j.css("padding-left", "1px");
-       equals( j.css("padding-left"), "1px", "Check node,textnode,comment css works" );
-
-       // opera sometimes doesn't update 'display' correctly, see #2037
-       jQuery("#t2037")[0].innerHTML = jQuery("#t2037")[0].innerHTML
-       equals( jQuery("#t2037 .hidden").css("display"), "none", "Make sure browser thinks it is hidden" );
-});
-
-test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () {
-       expect(4);
-
-       var $checkedtest = jQuery("#checkedtest");
-       // IE6 was clearing "checked" in jQuery.css(elem, "height");
-       jQuery.css($checkedtest[0], "height");
-       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." );
-});
-
-test("width()", function() {
-       expect(6);
-
-       var $div = jQuery("#nothiddendiv");
-       $div.width(30);
-       equals($div.width(), 30, "Test set to 30 correctly");
-       $div.hide();
-       equals($div.width(), 30, "Test hidden div");
-       $div.show();
-       $div.width(-1); // handle negative numbers by ignoring #1599
-       equals($div.width(), 30, "Test negative width ignored");
-       $div.css("padding", "20px");
-       equals($div.width(), 30, "Test padding specified with pixels");
-       $div.css("border", "2px solid #fff");
-       equals($div.width(), 30, "Test border specified with pixels");
-       //$div.css("padding", "2em");
-       //equals($div.width(), 30, "Test padding specified with ems");
-       //$div.css("border", "1em solid #fff");
-       //DISABLED - Opera 9.6 fails this test, returns 8
-       //equals($div.width(), 30, "Test border specified with ems");
-       //$div.css("padding", "2%");
-       //equals($div.width(), 30, "Test padding specified with percent");
-
-       $div.css({ display: "", border: "", padding: "" });
-
-       jQuery("#nothiddendivchild").css({ padding: "3px", border: "2px solid #fff" });
-       equals(jQuery("#nothiddendivchild").width(), 20, "Test child width with border and padding");
-       jQuery("#nothiddendiv, #nothiddendivchild").css({ border: "", padding: "", width: "" });
-});
-
-test("height()", function() {
-       expect(5);
-
-       var $div = jQuery("#nothiddendiv");
-       $div.height(30);
-       equals($div.height(), 30, "Test set to 30 correctly");
-       $div.hide();
-       equals($div.height(), 30, "Test hidden div");
-       $div.show();
-       $div.height(-1); // handle negative numbers by ignoring #1599
-       equals($div.height(), 30, "Test negative height ignored");
-       $div.css("padding", "20px");
-       equals($div.height(), 30, "Test padding specified with pixels");
-       $div.css("border", "2px solid #fff");
-       equals($div.height(), 30, "Test border specified with pixels");
-       //$div.css("padding", "2em");
-       //equals($div.height(), 30, "Test padding specified with ems");
-       //$div.css("border", "1em solid #fff");
-       //DISABLED - Opera 9.6 fails this test, returns 8
-       //equals($div.height(), 30, "Test border specified with ems");
-       //$div.css("padding", "2%");
-       //equals($div.height(), 30, "Test padding specified with percent");
-
-       $div.css({ display: "", border: "", padding: "", height: "1px" });
-});
-
 test("addClass(String)", function() {
        expect(2);
        var div = jQuery("div");
@@ -389,18 +252,18 @@ test("addClass(String)", function() {
 
 test("removeClass(String) - simple", function() {
        expect(5);
-       
+
        var $divs = jQuery('div');
-       
+
        $divs.addClass("test").removeClass("test");
-               
+
        ok( !$divs.is('.test'), "Remove Class" );
 
        reset();
 
        $divs.addClass("test").addClass("foo").addClass("bar");
        $divs.removeClass("test").removeClass("bar").removeClass("foo");
-       
+
        ok( !$divs.is('.test,.bar,.foo'), "Remove multiple classes" );
 
        reset();
@@ -408,7 +271,7 @@ test("removeClass(String) - simple", function() {
        // Make sure that a null value doesn't cause problems
        $divs.eq(0).addClass("test").removeClass(null);
        ok( $divs.eq(0).is('.test'), "Null value passed to removeClass" );
-       
+
        $divs.eq(0).addClass("test").removeClass("");
        ok( $divs.eq(0).is('.test'), "Empty string passed to removeClass" );
 
@@ -418,8 +281,9 @@ test("removeClass(String) - simple", function() {
        ok( !j.hasClass("asdf"), "Check node,textnode,comment for removeClass" );
 });
 
-test("toggleClass(String)", function() {
-       expect(6);
+test("toggleClass(String|boolean|undefined[, boolean])", function() {
+       expect(17);
+
        var e = jQuery("#firstp");
        ok( !e.is(".test"), "Assert class not present" );
        e.toggleClass("test");
@@ -427,12 +291,46 @@ test("toggleClass(String)", function() {
        e.toggleClass("test");
        ok( !e.is(".test"), "Assert class not present" );
 
+       // class name with a boolean
        e.toggleClass("test", false);
        ok( !e.is(".test"), "Assert class not present" );
        e.toggleClass("test", true);
        ok( e.is(".test"), "Assert class present" );
        e.toggleClass("test", false);
        ok( !e.is(".test"), "Assert class not present" );
+
+       // multiple class names
+       e.addClass("testA testB");
+       ok( (e.is(".testA.testB")), "Assert 2 different classes present" );
+       e.toggleClass("testB testC");
+       ok( (e.is(".testA.testC") && !e.is(".testB")), "Assert 1 class added, 1 class removed, and 1 class kept" );
+       e.toggleClass("testA testC");
+       ok( (!e.is(".testA") && !e.is(".testB") && !e.is(".testC")), "Assert no class present" );
+
+       // toggleClass storage
+       e.toggleClass(true);
+       ok( e.get(0).className === "", "Assert class is empty (data was empty)" );
+       e.addClass("testD testE");
+       ok( e.is(".testD.testE"), "Assert class present" );
+       e.toggleClass();
+       ok( !e.is(".testD.testE"), "Assert class not present" );
+       ok( e.data('__className__') === 'testD testE', "Assert data was stored" );
+       e.toggleClass();
+       ok( e.is(".testD.testE"), "Assert class present (restored from data)" );
+       e.toggleClass(false);
+       ok( !e.is(".testD.testE"), "Assert class not present" );
+       e.toggleClass(true);
+       ok( e.is(".testD.testE"), "Assert class present (restored from data)" );
+       e.toggleClass();
+       e.toggleClass(false);
+       e.toggleClass();
+       ok( e.is(".testD.testE"), "Assert class present (restored from data)" );
+       
+       
+
+       // Cleanup
+       e.removeClass("testD");
+       e.removeData('__className__');
 });
 
 test("removeAttr(String", function() {
@@ -455,4 +353,4 @@ test("jQuery.className", function() {
        equals( x.className, "hi bar", "Check removal of one class" );
        ok( c.has(x, "hi"), "Check has1" );
        ok( c.has(x, "bar"), "Check has2" );
-});
\ No newline at end of file
+});