.closest() with positional selectors wasn't worked as expected.
[jquery.git] / test / unit / core.js
index ae8490e..494917e 100644 (file)
@@ -53,7 +53,7 @@ test("jQuery()", function() {
 });
 
 test("selector state", function() {
-       expect(26);
+       expect(28);
 
        var test;
        
@@ -80,6 +80,11 @@ test("selector state", function() {
        test = jQuery("#main", document.body);
        equals( test.selector, "#main", "#main Selector" );
        equals( test.context, document.body, "#main Context" );
+
+       // Test cloning
+       test = jQuery(test);
+       equals( test.selector, "#main", "#main Selector" );
+       equals( test.context, document.body, "#main Context" );
        
        test = jQuery(document.body).find("#main");
        equals( test.selector, "#main", "#main find Selector" );
@@ -141,7 +146,7 @@ test("browser", function() {
        };
        for (var i in browsers) {
                var v = i.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ); // RegEx from Core jQuery.browser.version check
-               version = v ? v[1] : null;
+               var version = v ? v[1] : null;
                equals( version, browsers[i], "Checking UA string" );
        }
 });
@@ -251,18 +256,16 @@ test("isFunction", function() {
        });
 });
 
-var foo = false;
-
 test("jQuery('html')", function() {
        expect(8);
 
        reset();
-       foo = false;
-       var s = jQuery("<script>foo='test';</script>")[0];
+       jQuery.foo = false;
+       var s = jQuery("<script>jQuery.foo='test';</script>")[0];
        ok( s, "Creating a script" );
-       ok( !foo, "Make sure the script wasn't executed prematurely" );
-       jQuery("body").append("<script>foo='test';</script>");
-       ok( foo, "Executing a scripts contents in the right context" );
+       ok( !jQuery.foo, "Make sure the script wasn't executed prematurely" );
+       jQuery("body").append("<script>jQuery.foo='test';</script>");
+       ok( jQuery.foo, "Executing a scripts contents in the right context" );
 
        reset();
        ok( jQuery("<link rel='stylesheet'/>")[0], "Creating a link" );
@@ -291,9 +294,10 @@ test("jQuery(selector, xml).text(str) - Loaded via XML document", function() {
        stop();
        jQuery.get('data/dashboard.xml', function(xml) {
                // tests for #1419 where IE was a problem
-               equals( jQuery("tab:first", xml).text(), "blabla", "Verify initial text correct" );
-               jQuery("tab:first", xml).text("newtext");
-               equals( jQuery("tab:first", xml).text(), "newtext", "Verify new text correct" );
+               var tab = jQuery("tab", xml).eq(0);
+               equals( tab.text(), "blabla", "Verify initial text correct" );
+               tab.text("newtext");
+               equals( tab.text(), "newtext", "Verify new text correct" );
                start();
        });
 });
@@ -454,7 +458,7 @@ test("attr(Hash)", function() {
 
 test("attr(String, Object)", function() {
        expect(19);
-       var div = jQuery("div").attr("foo", "bar");
+       var div = jQuery("div").attr("foo", "bar"),
                fail = false;
        for ( var i = 0; i < div.size(); i++ ) {
                if ( div.get(i).getAttribute('foo') != "bar" ){
@@ -545,6 +549,62 @@ if ( !isLocal ) {
        });
 }
 
+test("attr('tabindex')", function() {
+       expect(5);
+
+       // tabindex 0
+       equals(jQuery('#listWithTabIndex').attr('tabindex'), 0, 'tabindex of 0');
+
+       // positive tabindex
+       equals(jQuery('#linkWithTabIndex').attr('tabindex'), 2, 'tabindex of 2');
+
+       // negative tabindex
+       equals(jQuery('#linkWithNegativeTabIndex').attr('tabindex'), -1, 'negative tabindex');
+
+       // regular element without a tabindex
+       equals(jQuery('#divWithNoTabIndex').attr('tabindex'), undefined, 'no tabindex, not tabbable by default');
+
+    // link without a tabindex
+       equals(jQuery('#linkWithNoTabIndex').attr('tabindex'), 0, 'no tabindex, tabbable by default');
+});
+
+test("attr('tabindex', value)", function() {
+       expect(9);
+
+       var element = jQuery('#divWithNoTabIndex');
+       equals(element.attr('tabindex'), undefined, 'start with no tabindex');
+
+       // set a positive string
+       element.attr('tabindex', '1');
+       equals(element.attr('tabindex'), 1, 'set tabindex to 1 (string)');
+
+       // set a zero string
+       element.attr('tabindex', '0');
+       equals(element.attr('tabindex'), 0, 'set tabindex to 0 (string)');
+
+       // 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)');
+
+       // set a zero number
+       element.attr('tabindex', 0);
+       equals(element.attr('tabindex'), 0, 'set tabindex to 0 (number)');
+
+       // 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');
+
+       element.attr('tabindex', -1);
+       equals(element.attr('tabindex'), -1, 'set negative tabindex');
+});
+
 test("css(String|Hash)", function() {
        expect(19);
 
@@ -839,7 +899,7 @@ test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 });
 
 test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
-       expect(6);
+       expect(7);
        var defaultText = 'Try them out:'
        jQuery('<b>buga</b>').appendTo('#first');
        equals( jQuery("#first").text(), defaultText + 'buga', 'Check if text appending works' );
@@ -856,6 +916,9 @@ test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
        equals( expected, jQuery('#sap').text(), "Check for appending of array of elements" );
 
        reset();
+       ok( jQuery(document.createElement("script")).appendTo("body").length, "Make sure a disconnected script can be appended." );
+
+       reset();
        expected = document.querySelectorAll ?
                "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:" :
                "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo";
@@ -1111,10 +1174,12 @@ test("clone() on XML nodes", function() {
        stop();
        jQuery.get("data/dashboard.xml", function (xml) {
                var root = jQuery(xml.documentElement).clone();
-               jQuery("tab:first", xml).text("origval");
-               jQuery("tab:first", root).text("cloneval");
-               equals(jQuery("tab:first", xml).text(), "origval", "Check original XML node was correctly set");
-               equals(jQuery("tab:first", root).text(), "cloneval", "Check cloned XML node was correctly set");
+               var origTab = jQuery("tab", xml).eq(0);
+               var cloneTab = jQuery("tab", root).eq(0);
+               origTab.text("origval");
+               cloneTab.text("cloneval");
+               equals(origTab.text(), "origval", "Check original XML node was correctly set");
+               equals(cloneTab.text(), "cloneval", "Check cloned XML node was correctly set");
                start();
        });
 });
@@ -1286,10 +1351,11 @@ test("val(String/Number)", function() {
        j.removeAttr("value");
 });
 
-var scriptorder = 0;
-
 test("html(String)", function() {
        expect(13);
+       
+       jQuery.scriptorder = 0;
+       
        var div = jQuery("#main > div");
        div.html("<b>test</b>");
        var pass = true;
@@ -1322,7 +1388,7 @@ test("html(String)", function() {
        jQuery("#main").html('foo <form><script type="text/javascript">ok( true, "jQuery().html().evalScripts() Evals Scripts Twice in Firefox, see #975" );</script></form>');
 
        // it was decided that waiting to execute ALL scripts makes sense since nested ones have to wait anyway so this test case is changed, see #1959
-       jQuery("#main").html("<script>equals(scriptorder++, 0, 'Script is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html (even though appears before)')<\/script><span id='scriptorder'><script>equals(scriptorder++, 1, 'Script (nested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script></span><script>equals(scriptorder++, 2, 'Script (unnested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script>");
+       jQuery("#main").html("<script>equals(jQuery.scriptorder++, 0, 'Script is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html (even though appears before)')<\/script><span id='scriptorder'><script>equals(jQuery.scriptorder++, 1, 'Script (nested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script></span><script>equals(jQuery.scriptorder++, 2, 'Script (unnested) is executed in order');equals(jQuery('#scriptorder').length, 1,'Execute after html')<\/script>");
 
        setTimeout( start, 100 );
 });
@@ -1341,11 +1407,14 @@ test("filter()", function() {
 });
 
 test("closest()", function() {
-       expect(4);
+       expect(6);
        isSet( jQuery("body").closest("body").get(), q("body"), "closest(body)" );
        isSet( jQuery("body").closest("html").get(), q("html"), "closest(html)" );
        isSet( jQuery("body").closest("div").get(), [], "closest(div)" );
        isSet( jQuery("#main").closest("span,#html").get(), q("html"), "closest(span,#html)" );
+
+       isSet( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" );
+       isSet( jQuery("div").closest("body:first div:last").get(), q("divWithNoTabIndex"), "closest(body:first div:last)" );
 });
 
 test("not()", function() {
@@ -1501,7 +1570,7 @@ test("removeClass(String) - simple", function() {
 });
 
 test("toggleClass(String)", function() {
-       expect(6);\r
+       expect(6);
        var e = jQuery("#firstp");
        ok( !e.is(".test"), "Assert class not present" );
        e.toggleClass("test");
@@ -1509,12 +1578,12 @@ test("toggleClass(String)", function() {
        e.toggleClass("test");
        ok( !e.is(".test"), "Assert class not present" );
 
-       e.toggleClass("test", false);\r
-       ok( !e.is(".test"), "Assert class not present" );\r
-       e.toggleClass("test", true);\r
-       ok( e.is(".test"), "Assert class present" );\r
-       e.toggleClass("test", false);\r
-       ok( !e.is(".test"), "Assert class not present" );\r
+       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" );
 });
 
 test("removeAttr(String", function() {