X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=test%2Funit%2Fcore.js;h=7ec825832106cedb2cc631c30a8a15e7feaa78a5;hb=b8d0c0711f8a9ecd455d4c3cf13394e55c4bf151;hp=229ad2ac494b2143738439e6ca4d6c7285f07aa5;hpb=5e99807271ebe194b7f0278a929b053b4dd46c81;p=jquery.git diff --git a/test/unit/core.js b/test/unit/core.js index 229ad2a..f5f3853 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -8,59 +8,245 @@ test("Basic requirements", function() { ok( document.getElementsByTagName, "getElementsByTagName" ); ok( RegExp, "RegExp" ); ok( jQuery, "jQuery" ); - ok( $, "$()" ); + ok( $, "$" ); }); -test("$()", function() { - expect(5); - - var main = $("#main"); - isSet( $("div p", main).get(), q("sndp", "en", "sap"), "Basic selector with jQuery object as context" ); - +test("jQuery()", function() { + expect(12); + + // Basic constructor's behavior + + equals( jQuery().length, 1, "jQuery() === jQuery(document)" ); + equals( jQuery(undefined).length, 0, "jQuery(undefined) === jQuery([])" ); + equals( jQuery(null).length, 0, "jQuery(null) === jQuery([])" ); + equals( jQuery("").length, 0, "jQuery('') === jQuery([])" ); + + var obj = jQuery("div") + equals( jQuery(obj).selector, "div", "jQuery(jQueryObj) == jQueryObj" ); + + // can actually yield more than one, when iframes are included, the window is an array as well + equals( 1, jQuery(window).length, "Correct number of elements generated for jQuery(window)" ); + + + var main = jQuery("#main"); + same( jQuery("div p", main).get(), q("sndp", "en", "sap"), "Basic selector with jQuery object as context" ); + +/* + // disabled since this test was doing nothing. i tried to fix it but i'm not sure + // what the expected behavior should even be. FF returns "\n" for the text node // make sure this is handled - $('

\r\n

'); - ok( true, "Check for \\r and \\n in jQuery()" ); - + var crlfContainer = jQuery('

\r\n

'); + var x = crlfContainer.contents().get(0).nodeValue; + equals( x, what???, "Check for \\r and \\n in jQuery()" ); +*/ + /* // Disabled until we add this functionality in var pass = true; try { - $("
Testing
").appendTo(document.getElementById("iframe").contentDocument.body); + jQuery("
Testing
").appendTo(document.getElementById("iframe").contentDocument.body); } catch(e){ pass = false; } - ok( pass, "$('<tag>') needs optional document parameter to ease cross-frame DOM wrangling, see #968" );*/ + ok( pass, "jQuery('<tag>') needs optional document parameter to ease cross-frame DOM wrangling, see #968" );*/ - var code = $(""); + var code = jQuery(""); equals( code.length, 1, "Correct number of elements generated for code" ); - var img = $(""); + var img = jQuery(""); equals( img.length, 1, "Correct number of elements generated for img" ); - var div = $("

"); + var div = jQuery("

"); equals( div.length, 4, "Correct number of elements generated for div hr code b" ); + + equals( jQuery([1,2,3]).get(1), 2, "Test passing an array to the factory" ); + + equals( jQuery(document.body).get(0), jQuery('body').get(0), "Test passing an html node to the factory" ); +}); + +test("selector state", function() { + expect(31); + + var test; + + test = jQuery(undefined); + equals( test.selector, "", "Empty jQuery Selector" ); + equals( test.context, undefined, "Empty jQuery Context" ); + + test = jQuery(document); + equals( test.selector, "", "Document Selector" ); + equals( test.context, document, "Document Context" ); + + test = jQuery(document.body); + equals( test.selector, "", "Body Selector" ); + equals( test.context, document.body, "Body Context" ); + + test = jQuery("#main"); + equals( test.selector, "#main", "#main Selector" ); + equals( test.context, document, "#main Context" ); + + test = jQuery("#notfoundnono"); + equals( test.selector, "#notfoundnono", "#notfoundnono Selector" ); + equals( test.context, document, "#notfoundnono Context" ); + + test = jQuery("#main", document); + equals( test.selector, "#main", "#main Selector" ); + equals( test.context, document, "#main Context" ); + + 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" ); + equals( test.context, document.body, "#main find Context" ); + + test = jQuery("#main").filter("div"); + equals( test.selector, "#main.filter(div)", "#main filter Selector" ); + equals( test.context, document, "#main filter Context" ); + + test = jQuery("#main").not("div"); + equals( test.selector, "#main.not(div)", "#main not Selector" ); + equals( test.context, document, "#main not Context" ); + + test = jQuery("#main").filter("div").not("div"); + equals( test.selector, "#main.filter(div).not(div)", "#main filter, not Selector" ); + equals( test.context, document, "#main filter, not Context" ); + + test = jQuery("#main").filter("div").not("div").end(); + equals( test.selector, "#main.filter(div)", "#main filter, not, end Selector" ); + equals( test.context, document, "#main filter, not, end Context" ); + + test = jQuery("#main").parent("body"); + equals( test.selector, "#main.parent(body)", "#main parent Selector" ); + equals( test.context, document, "#main parent Context" ); + + test = jQuery("#main").eq(0); + equals( test.selector, "#main.slice(0,1)", "#main eq Selector" ); + equals( test.context, document, "#main eq Context" ); + + var d = "
"; + equals( + jQuery(d).appendTo(jQuery(d)).selector, + jQuery(d).appendTo(d).selector, + "manipulation methods make same selector for jQuery objects" + ); +}); + +test("browser", function() { + expect(13); + var browsers = { + //Internet Explorer + "Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)": "6.0", + "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)": "7.0", + /** Failing #1876 + * "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30)": "7.0", + */ + //Browsers with Gecko engine + //Mozilla + "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915" : "1.7.12", + //Firefox + "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3": "1.8.1.3", + //Netscape + "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3" : "1.7.5", + //Flock + "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070321 Firefox/1.5.0.11 Flock/0.7.12" : "1.8.0.11", + //Opera browser + "Opera/9.20 (X11; Linux x86_64; U; en)": "9.20", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.20" : "9.20", + "Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.20": "9.20", + //WebKit engine + "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3": "418.9", + "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3" : "418.8", + "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5": "312.8", + //Other user agent string + "Other browser's user agent 1.0":null + }; + for (var i in browsers) { + var v = i.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ); // RegEx from Core jQuery.browser.version check + var version = v ? v[1] : null; + equals( version, browsers[i], "Checking UA string" ); + } }); test("noConflict", function() { expect(6); - - var old = jQuery; - var newjQuery = jQuery.noConflict(); - ok( newjQuery == old, "noConflict returned the jQuery object" ); - ok( jQuery == old, "Make sure jQuery wasn't touched." ); - ok( $ == "$", "Make sure $ was reverted." ); + var $$ = jQuery; + + equals( jQuery, jQuery.noConflict(), "noConflict returned the jQuery object" ); + equals( jQuery, $$, "Make sure jQuery wasn't touched." ); + equals( $, original$, "Make sure $ was reverted." ); + + jQuery = $ = $$; + + equals( jQuery.noConflict(true), $$, "noConflict returned the jQuery object" ); + equals( jQuery, originaljQuery, "Make sure jQuery was reverted." ); + equals( $, original$, "Make sure $ was reverted." ); + + jQuery = $$; +}); + +test("trim", function() { + expect(4); + + var nbsp = String.fromCharCode(160); - jQuery = $ = old; + equals( jQuery.trim("hello "), "hello", "trailing space" ); + equals( jQuery.trim(" hello"), "hello", "leading space" ); + equals( jQuery.trim(" hello "), "hello", "space on both sides" ); + equals( jQuery.trim(" " + nbsp + "hello " + nbsp + " "), "hello", " " ); +}); - newjQuery = jQuery.noConflict(true); +test("isObjectLiteral", function() { + expect(7); - ok( newjQuery == old, "noConflict returned the jQuery object" ); - ok( jQuery == "jQuery", "Make sure jQuery was reverted." ); - ok( $ == "$", "Make sure $ was reverted." ); + stop(); - jQuery = $ = old; + // The use case that we want to match + ok(jQuery.isObjectLiteral({}), "{}"); + + // Instantiated objects shouldn't be matched + ok(!jQuery.isObjectLiteral(new Date), "new Date"); + + var fn = function(){}; + + // Functions shouldn't be matched + ok(!jQuery.isObjectLiteral(fn), "fn"); + + // Again, instantiated objects shouldn't be matched + ok(!jQuery.isObjectLiteral(new fn), "new fn (no methods)"); + + // Makes the function a little more realistic + // (and harder to detect, incidentally) + fn.prototype = {someMethod: function(){}}; + + // Again, instantiated objects shouldn't be matched + ok(!jQuery.isObjectLiteral(new fn), "new fn"); + + // DOM Element + ok(!jQuery.isObjectLiteral(document.createElement("div")), "DOM Element"); + + var iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + + window.iframeDone = function(otherObject){ + // Objects from other windows should be matched + ok(jQuery.isObjectLiteral(new otherObject), "new otherObject"); + document.body.removeChild( iframe ); + start(); + }; + + var doc = iframe.contentDocument || iframe.contentWindow.document; + doc.open(); + doc.write(""); + doc.close(); }); test("isFunction", function() { - expect(21); + expect(19); // Make sure that false values return false ok( !jQuery.isFunction(), "No Value" ); @@ -71,10 +257,10 @@ test("isFunction", function() { // Check built-ins // Safari uses "(Internal Function)" - ok( jQuery.isFunction(String), "String Function" ); - ok( jQuery.isFunction(Array), "Array Function" ); - ok( jQuery.isFunction(Object), "Object Function" ); - ok( jQuery.isFunction(Function), "Function Function" ); + ok( jQuery.isFunction(String), "String Function("+String+")" ); + ok( jQuery.isFunction(Array), "Array Function("+Array+")" ); + ok( jQuery.isFunction(Object), "Object Function("+Object+")" ); + ok( jQuery.isFunction(Function), "Function Function("+Function+")" ); // When stringified, this could be misinterpreted var mystr = "function"; @@ -98,7 +284,8 @@ test("isFunction", function() { ok( !jQuery.isFunction(obj), "Object Element" ); // IE says this is an object - ok( jQuery.isFunction(obj.getAttribute), "getAttribute Function" ); + // Since 1.3, this isn't supported (#2968) + //ok( jQuery.isFunction(obj.getAttribute), "getAttribute Function" ); var nodes = document.body.childNodes; @@ -106,7 +293,7 @@ test("isFunction", function() { ok( !jQuery.isFunction(nodes), "childNodes Property" ); var first = document.body.firstChild; - + // Normal elements are reported ok everywhere ok( !jQuery.isFunction(first), "A normal DOM Element" ); @@ -115,7 +302,8 @@ test("isFunction", function() { document.body.appendChild( input ); // IE says this is an object - ok( jQuery.isFunction(input.focus), "A default function property" ); + // Since 1.3, this isn't supported (#2968) + //ok( jQuery.isFunction(input.focus), "A default function property" ); document.body.removeChild( input ); @@ -136,694 +324,263 @@ test("isFunction", function() { ok( jQuery.isFunction(fn), "Recursive Function Call" ); - fn({ some: "data" }); + fn({ some: "data" }); }; callme(function(){ - callme(function(){}); + callme(function(){}); }); }); -var foo = false; - -test("$('html')", function() { +test("isXMLDoc - HTML", function() { expect(4); - - reset(); - foo = false; - var s = $("")[0]; - ok( s, "Creating a script" ); - ok( !foo, "Make sure the script wasn't executed prematurely" ); - $("body").append(s); - ok( foo, "Executing a scripts contents in the right context" ); - - reset(); - ok( $("")[0], "Creating a link" ); - - reset(); -}); - -test("length", function() { - expect(1); - ok( $("p").length == 6, "Get Number of Elements Found" ); -}); - -test("size()", function() { - expect(1); - ok( $("p").size() == 6, "Get Number of Elements Found" ); -}); -test("get()", function() { - expect(1); - isSet( $("p").get(), q("firstp","ap","sndp","en","sap","first"), "Get All Elements" ); -}); + ok( !jQuery.isXMLDoc( document ), "HTML document" ); + ok( !jQuery.isXMLDoc( document.documentElement ), "HTML documentElement" ); + ok( !jQuery.isXMLDoc( document.body ), "HTML Body Element" ); -test("get(Number)", function() { - expect(1); - ok( $("p").get(0) == document.getElementById("firstp"), "Get A Single Element" ); -}); + var iframe = document.createElement("iframe"); + document.body.appendChild( iframe ); -test("add(String|Element|Array)", function() { - expect(7); - isSet( $("#sndp").add("#en").add("#sap").get(), q("sndp", "en", "sap"), "Check elements from document" ); - isSet( $("#sndp").add( $("#en")[0] ).add( $("#sap") ).get(), q("sndp", "en", "sap"), "Check elements from document" ); - ok( $([]).add($("#form")[0].elements).length >= 13, "Check elements from array" ); - - var x = $([]).add($("

xxx

")).add($("

xxx

")); - ok( x[0].id == "x1", "Check on-the-fly element1" ); - ok( x[1].id == "x2", "Check on-the-fly element2" ); - - var x = $([]).add("

xxx

").add("

xxx

"); - ok( x[0].id == "x1", "Check on-the-fly element1" ); - ok( x[1].id == "x2", "Check on-the-fly element2" ); -}); - -test("each(Function)", function() { - expect(1); - var div = $("div"); - div.each(function(){this.foo = 'zoo';}); - var pass = true; - for ( var i = 0; i < div.size(); i++ ) { - if ( div.get(i).foo != "zoo" ) pass = false; + try { + var body = jQuery(iframe).contents()[0]; + ok( !jQuery.isXMLDoc( body ), "Iframe body element" ); + } catch(e){ + ok( false, "Iframe body element exception" ); } - ok( pass, "Execute a function, Relative" ); -}); -test("index(Object)", function() { - expect(8); - ok( $([window, document]).index(window) == 0, "Check for index of elements" ); - ok( $([window, document]).index(document) == 1, "Check for index of elements" ); - var inputElements = $('#radio1,#radio2,#check1,#check2'); - ok( inputElements.index(document.getElementById('radio1')) == 0, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('radio2')) == 1, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('check1')) == 2, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('check2')) == 3, "Check for index of elements" ); - ok( inputElements.index(window) == -1, "Check for not found index" ); - ok( inputElements.index(document) == -1, "Check for not found index" ); -}); - -test("attr(String)", function() { - expect(20); - ok( $('#text1').attr('value') == "Test", 'Check for value attribute' ); - ok( $('#text1').attr('value', "Test2").attr('defaultValue') == "Test", 'Check for defaultValue attribute' ); - ok( $('#text1').attr('type') == "text", 'Check for type attribute' ); - ok( $('#radio1').attr('type') == "radio", 'Check for type attribute' ); - ok( $('#check1').attr('type') == "checkbox", 'Check for type attribute' ); - ok( $('#simon1').attr('rel') == "bookmark", 'Check for rel attribute' ); - ok( $('#google').attr('title') == "Google!", 'Check for title attribute' ); - ok( $('#mark').attr('hreflang') == "en", 'Check for hreflang attribute' ); - ok( $('#en').attr('lang') == "en", 'Check for lang attribute' ); - ok( $('#simon').attr('class') == "blog link", 'Check for class attribute' ); - ok( $('#name').attr('name') == "name", 'Check for name attribute' ); - ok( $('#text1').attr('name') == "action", 'Check for name attribute' ); - ok( $('#form').attr('action').indexOf("formaction") >= 0, 'Check for action attribute' ); - ok( $('#text1').attr('maxlength') == '30', 'Check for maxlength attribute' ); - ok( $('#text1').attr('maxLength') == '30', 'Check for maxLength attribute' ); - ok( $('#area1').attr('maxLength') == '30', 'Check for maxLength attribute' ); - ok( $('#select2').attr('selectedIndex') == 3, 'Check for selectedIndex attribute' ); - ok( $('#foo').attr('nodeName') == 'DIV', 'Check for nodeName attribute' ); - ok( $('#foo').attr('tagName') == 'DIV', 'Check for tagName attribute' ); - - $('').attr('href', '#5').appendTo('#main'); // using innerHTML in IE causes href attribute to be serialized to the full path - ok( $('#tAnchor5').attr('href') == "#5", 'Check for non-absolute href (an anchor)' ); + document.body.removeChild( iframe ); }); if ( !isLocal ) { - test("attr(String) in XML Files", function() { - expect(2); - stop(); - $.get("data/dashboard.xml", function(xml) { - ok( $("locations", xml).attr("class") == "foo", "Check class attribute in XML document" ); - ok( $("location", xml).attr("for") == "bar", "Check for attribute in XML document" ); - start(); - }); - }); -} - -test("attr(String, Function)", function() { - expect(2); - ok( $('#text1').attr('value', function() { return this.id })[0].value == "text1", "Set value from id" ); - ok( $('#text1').attr('title', function(i) { return i }).attr('title') == "0", "Set value with an index"); -}); - -test("attr(Hash)", function() { - expect(1); - var pass = true; - $("div").attr({foo: 'baz', zoo: 'ping'}).each(function(){ - if ( this.getAttribute('foo') != "baz" && this.getAttribute('zoo') != "ping" ) pass = false; +test("isXMLDoc - XML", function() { + expect(3); + stop(); + jQuery.get('data/dashboard.xml', function(xml) { + ok( jQuery.isXMLDoc( xml ), "XML document" ); + ok( jQuery.isXMLDoc( xml.documentElement ), "XML documentElement" ); + ok( jQuery.isXMLDoc( jQuery("tab", xml)[0] ), "XML Tab Element" ); + start(); }); - ok( pass, "Set Multiple Attributes" ); }); +} -test("attr(String, Object)", function() { - expect(13); - var div = $("div"); - div.attr("foo", "bar"); - var pass = true; - for ( var i = 0; i < div.size(); i++ ) { - if ( div.get(i).getAttribute('foo') != "bar" ) pass = false; - } - ok( pass, "Set Attribute" ); - - ok( $("#foo").attr({"width": null}), "Try to set an attribute to nothing" ); - - $("#name").attr('name', 'something'); - ok( $("#name").attr('name') == 'something', 'Set name attribute' ); - $("#check2").attr('checked', true); - ok( document.getElementById('check2').checked == true, 'Set checked attribute' ); - $("#check2").attr('checked', false); - ok( document.getElementById('check2').checked == false, 'Set checked attribute' ); - $("#text1").attr('readonly', true); - ok( document.getElementById('text1').readOnly == true, 'Set readonly attribute' ); - $("#text1").attr('readonly', false); - ok( document.getElementById('text1').readOnly == false, 'Set readonly attribute' ); - $("#name").attr('maxlength', '5'); - ok( document.getElementById('name').maxLength == '5', 'Set maxlength attribute' ); - $("#name").attr('maxLength', '10'); - ok( document.getElementById('name').maxLength == '10', 'Set maxlength attribute' ); +test("jQuery('html')", function() { + expect(15); reset(); + jQuery.foo = false; + var s = jQuery("")[0]; + ok( s, "Creating a script" ); + ok( !jQuery.foo, "Make sure the script wasn't executed prematurely" ); + jQuery("body").append(""); + ok( jQuery.foo, "Executing a scripts contents in the right context" ); - var type = $("#check2").attr('type'); - var thrown = false; - try { - $("#check2").attr('type','hidden'); - } catch(e) { - thrown = true; - } - ok( thrown, "Exception thrown when trying to change type property" ); - equals( type, $("#check2").attr('type'), "Verify that you can't change the type of an input element" ); + // Test multi-line HTML + var div = jQuery("
\r\nsome text\n

some p

\nmore text\r\n
")[0]; + equals( div.nodeName.toUpperCase(), "DIV", "Make sure we're getting a div." ); + equals( div.firstChild.nodeType, 3, "Text node." ); + equals( div.lastChild.nodeType, 3, "Text node." ); + equals( div.childNodes[1].nodeType, 1, "Paragraph." ); + equals( div.childNodes[1].firstChild.nodeType, 3, "Paragraph text." ); - var check = document.createElement("input"); - var thrown = true; - try { - $(check).attr('type','checkbox'); - } catch(e) { - thrown = false; - } - 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" ); -}); + reset(); + ok( jQuery("")[0], "Creating a link" ); -if ( !isLocal ) { - test("attr(String, Object) - Loaded via XML document", function() { - expect(2); - stop(); - $.get('data/dashboard.xml', function(xml) { - var titles = []; - $('tab', xml).each(function() { - titles.push($(this).attr('title')); - }); - ok( titles[0] == 'Location', 'attr() in XML context: Check first title' ); - ok( titles[1] == 'Users', 'attr() in XML context: Check second title' ); - start(); - }); - }); -} + ok( !jQuery("'); - - $("#main").html('foo
'); - - $("#main").html("