});
test("jQuery()", function() {
- expect(12);
+ expect(23);
// Basic constructor's behavior
- equals( jQuery().length, 1, "jQuery() === jQuery(document)" );
+ equals( jQuery().length, 0, "jQuery() === jQuery([])" );
equals( jQuery(undefined).length, 0, "jQuery(undefined) === jQuery([])" );
equals( jQuery(null).length, 0, "jQuery(null) === jQuery([])" );
equals( jQuery("").length, 0, "jQuery('') === jQuery([])" );
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)" );
+ equals( jQuery(window).length, 1, "Correct number of elements generated for jQuery(window)" );
var main = jQuery("#main");
var code = jQuery("<code/>");
equals( code.length, 1, "Correct number of elements generated for code" );
+ equals( code.parent().length, 0, "Make sure that the generated HTML has no parent." );
var img = jQuery("<img/>");
equals( img.length, 1, "Correct number of elements generated for img" );
+ equals( img.parent().length, 0, "Make sure that the generated HTML has no parent." );
var div = jQuery("<div/><hr/><code/><b/>");
equals( div.length, 4, "Correct number of elements generated for div hr code b" );
+ equals( div.parent().length, 0, "Make sure that the generated HTML has no parent." );
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" );
+
+ var exec = false;
+
+ var elem = jQuery("<div/>", {
+ width: 10,
+ css: { paddingLeft:1, paddingRight:1 },
+ click: function(){ ok(exec, "Click executed."); },
+ text: "test",
+ "class": "test2",
+ id: "test3"
+ });
+
+ equals( elem[0].style.width, '10px', 'jQuery() quick setter width');
+ equals( elem[0].style.paddingLeft, '1px', 'jQuery quick setter css');
+ equals( elem[0].style.paddingRight, '1px', 'jQuery quick setter css');
+ equals( elem[0].childNodes.length, 1, 'jQuery quick setter text');
+ equals( elem[0].firstChild.nodeValue, "test", 'jQuery quick setter text');
+ equals( elem[0].className, "test2", 'jQuery() quick setter class');
+ equals( elem[0].id, "test3", 'jQuery() quick setter id');
+
+ exec = true;
+ elem.click();
});
test("selector state", function() {
);
});
+if ( !isLocal ) {
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" );
- }
+ stop();
+
+ jQuery.get("data/ua.txt", function(data){
+ var uas = data.split("\n");
+ expect( (uas.length - 1) * 2 );
+
+ jQuery.each(uas, function(){
+ var parts = this.split("\t");
+ if ( parts[2] ) {
+ var ua = jQuery.uaMatch( parts[2] );
+ equals( ua.browser, parts[0], "Checking browser for " + parts[2] );
+ equals( ua.version, parts[1], "Checking version string for " + parts[2] );
+ }
+ });
+
+ start();
+ });
});
+}
test("noConflict", function() {
- expect(6);
+ expect(7);
var $$ = jQuery;
equals( jQuery.noConflict(true), $$, "noConflict returned the jQuery object" );
equals( jQuery, originaljQuery, "Make sure jQuery was reverted." );
equals( $, original$, "Make sure $ was reverted." );
+ ok( $$("#main").html("test"), "Make sure that jQuery still works." );
jQuery = $$;
});
+test("trim", function() {
+ expect(9);
+
+ var nbsp = String.fromCharCode(160);
+
+ 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", " " );
+
+ equals( jQuery.trim(), "", "Nothing in." );
+ equals( jQuery.trim( undefined ), "", "Undefined" );
+ equals( jQuery.trim( null ), "", "Null" );
+ equals( jQuery.trim( 5 ), "5", "Number" );
+ equals( jQuery.trim( false ), "false", "Boolean" );
+});
+
+test("type", function() {
+ expect(18);
+
+ equals( jQuery.type(null), "null", "null" );
+ equals( jQuery.type(undefined), "undefined", "undefined" );
+ equals( jQuery.type(true), "boolean", "Boolean" );
+ equals( jQuery.type(false), "boolean", "Boolean" );
+ equals( jQuery.type(Boolean(true)), "boolean", "Boolean" );
+ equals( jQuery.type(0), "number", "Number" );
+ equals( jQuery.type(1), "number", "Number" );
+ equals( jQuery.type(Number(1)), "number", "Number" );
+ equals( jQuery.type(""), "string", "String" );
+ equals( jQuery.type("a"), "string", "String" );
+ equals( jQuery.type(String("a")), "string", "String" );
+ equals( jQuery.type({}), "object", "Object" );
+ equals( jQuery.type(/foo/), "regexp", "RegExp" );
+ equals( jQuery.type(new RegExp("asdf")), "regexp", "RegExp" );
+ equals( jQuery.type([1]), "array", "Array" );
+ equals( jQuery.type(new Date()), "date", "Date" );
+ equals( jQuery.type(new Function("return;")), "function", "Function" );
+ equals( jQuery.type(function(){}), "function", "Function" );
+});
+
+test("isPlainObject", function() {
+ expect(14);
+
+ stop();
+
+ // The use case that we want to match
+ ok(jQuery.isPlainObject({}), "{}");
+
+ // Not objects shouldn't be matched
+ ok(!jQuery.isPlainObject(""), "string");
+ ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number");
+ ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean");
+ ok(!jQuery.isPlainObject(null), "null");
+ ok(!jQuery.isPlainObject(undefined), "undefined");
+
+ // Arrays shouldn't be matched
+ ok(!jQuery.isPlainObject([]), "array");
+
+ // Instantiated objects shouldn't be matched
+ ok(!jQuery.isPlainObject(new Date), "new Date");
+
+ var fn = function(){};
+
+ // Functions shouldn't be matched
+ ok(!jQuery.isPlainObject(fn), "fn");
+
+ // Again, instantiated objects shouldn't be matched
+ ok(!jQuery.isPlainObject(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.isPlainObject(new fn), "new fn");
+
+ // DOM Element
+ ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
+
+ // Window
+ ok(!jQuery.isPlainObject(window), "window");
+
+ try {
+ var iframe = document.createElement("iframe");
+ document.body.appendChild(iframe);
+
+ window.iframeDone = function(otherObject){
+ // Objects from other windows should be matched
+ ok(jQuery.isPlainObject(new otherObject), "new otherObject");
+ document.body.removeChild( iframe );
+ start();
+ };
+
+ var doc = iframe.contentDocument || iframe.contentWindow.document;
+ doc.open();
+ doc.write("<body onload='window.parent.iframeDone(Object);'>");
+ doc.close();
+ } catch(e) {
+ document.body.removeChild( iframe );
+
+ ok(true, "new otherObject - iframes not supported");
+ start();
+ }
+});
+
test("isFunction", function() {
expect(19);
try {
var body = jQuery(iframe).contents()[0];
- ok( !jQuery.isXMLDoc( body ), "Iframe body element" );
- } catch(e){
- ok( false, "Iframe body element exception" );
+
+ try {
+ ok( !jQuery.isXMLDoc( body ), "Iframe body element" );
+ } catch(e) {
+ ok( false, "Iframe body element exception" );
+ }
+
+ } catch(e) {
+ ok( true, "Iframe body element - iframe not working correctly" );
}
document.body.removeChild( iframe );
test("jQuery('html')", function() {
expect(15);
- reset();
+ QUnit.reset();
jQuery.foo = false;
var s = jQuery("<script>jQuery.foo='test';</script>")[0];
ok( s, "Creating a script" );
equals( div.childNodes[1].nodeType, 1, "Paragraph." );
equals( div.childNodes[1].firstChild.nodeType, 3, "Paragraph text." );
- reset();
+ QUnit.reset();
ok( jQuery("<link rel='stylesheet'/>")[0], "Creating a link" );
ok( !jQuery("<script/>")[0].parentNode, "Create a script" );
});
}
+test("end()", function() {
+ expect(3);
+ equals( 'Yahoo', jQuery('#yahoo').parent().end().text(), 'Check for end' );
+ ok( jQuery('#yahoo').end(), 'Check for end with nothing to end' );
+
+ var x = jQuery('#yahoo');
+ x.parent();
+ equals( 'Yahoo', jQuery('#yahoo').text(), 'Check for non-destructive behaviour' );
+});
+
test("length", function() {
expect(1);
equals( jQuery("p").length, 6, "Get Number of Elements Found" );
"Get a single element with negative index" )
})
-test("add(String|Element|Array|undefined)", function() {
- expect(16);
- same( jQuery("#sndp").add("#en").add("#sap").get(), q("sndp", "en", "sap"), "Check elements from document" );
- same( jQuery("#sndp").add( jQuery("#en")[0] ).add( jQuery("#sap") ).get(), q("sndp", "en", "sap"), "Check elements from document" );
- ok( jQuery([]).add(jQuery("#form")[0].elements).length >= 13, "Check elements from array" );
+test("each(Function)", function() {
+ expect(1);
+ var div = jQuery("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;
+ }
+ ok( pass, "Execute a function, Relative" );
+});
- // For the time being, we're discontinuing support for jQuery(form.elements) since it's ambiguous in IE
- // use jQuery([]).add(form.elements) instead.
- //equals( jQuery([]).add(jQuery("#form")[0].elements).length, jQuery(jQuery("#form")[0].elements).length, "Array in constructor must equals array in add()" );
+test("slice()", function() {
+ expect(7);
- var tmp = jQuery("<div/>");
+ var $links = jQuery("#ap a");
- var x = jQuery([]).add(jQuery("<p id='x1'>xxx</p>").appendTo(tmp)).add(jQuery("<p id='x2'>xxx</p>").appendTo(tmp));
- equals( x[0].id, "x1", "Check on-the-fly element1" );
- equals( x[1].id, "x2", "Check on-the-fly element2" );
+ same( $links.slice(1,2).get(), q("groups"), "slice(1,2)" );
+ same( $links.slice(1).get(), q("groups", "anchor1", "mark"), "slice(1)" );
+ same( $links.slice(0,3).get(), q("google", "groups", "anchor1"), "slice(0,3)" );
+ same( $links.slice(-1).get(), q("mark"), "slice(-1)" );
- var x = jQuery([]).add(jQuery("<p id='x1'>xxx</p>").appendTo(tmp)[0]).add(jQuery("<p id='x2'>xxx</p>").appendTo(tmp)[0]);
- equals( x[0].id, "x1", "Check on-the-fly element1" );
- equals( x[1].id, "x2", "Check on-the-fly element2" );
+ same( $links.eq(1).get(), q("groups"), "eq(1)" );
+ same( $links.eq('2').get(), q("anchor1"), "eq('2')" );
+ same( $links.eq(-1).get(), q("mark"), "eq(-1)" );
+});
- var x = jQuery([]).add(jQuery("<p id='x1'>xxx</p>")).add(jQuery("<p id='x2'>xxx</p>"));
- equals( x[0].id, "x1", "Check on-the-fly element1" );
- equals( x[1].id, "x2", "Check on-the-fly element2" );
+test("first()/last()", function() {
+ expect(4);
- var x = jQuery([]).add("<p id='x1'>xxx</p>").add("<p id='x2'>xxx</p>");
- equals( x[0].id, "x1", "Check on-the-fly element1" );
- equals( x[1].id, "x2", "Check on-the-fly element2" );
+ var $links = jQuery("#ap a"), $none = jQuery("asdf");
- var notDefined;
- equals( jQuery([]).add(notDefined).length, 0, "Check that undefined adds nothing" );
+ same( $links.first().get(), q("google"), "first()" );
+ same( $links.last().get(), q("mark"), "last()" );
- // Added after #2811
- equals( jQuery([]).add([window,document,document.body,document]).length, 3, "Pass an array" );
- equals( jQuery(document).add(document).length, 1, "Check duplicated elements" );
- equals( jQuery(window).add(window).length, 1, "Check duplicated elements using the window" );
- ok( jQuery([]).add( document.getElementById('form') ).length >= 13, "Add a form (adds the elements)" );
+ same( $none.first().get(), [], "first() none" );
+ same( $none.last().get(), [], "last() none" );
});
-test("add(String, Context)", function() {
- expect(6);
+test("map()", function() {
+ expect(2);//expect(6);
- equals( jQuery(document).add("#form").length, 2, "Make sure that using regular context document still works." );
- equals( jQuery(document.body).add("#form").length, 2, "Using a body context." );
- equals( jQuery(document.body).add("#html").length, 1, "Using a body context." );
+ same(
+ jQuery("#ap").map(function(){
+ return jQuery(this).find("a").get();
+ }).get(),
+ q("google", "groups", "anchor1", "mark"),
+ "Array Map"
+ );
- equals( jQuery(document).add("#form", document).length, 2, "Use a passed in document context." );
- equals( jQuery(document).add("#form", document.body).length, 2, "Use a passed in body context." );
- equals( jQuery(document).add("#html", document.body).length, 1, "Use a passed in body context." );
-});
+ same(
+ jQuery("#ap > a").map(function(){
+ return this.parentNode;
+ }).get(),
+ q("ap","ap","ap"),
+ "Single Map"
+ );
-test("each(Function)", function() {
- expect(1);
- var div = jQuery("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;
- }
- ok( pass, "Execute a function, Relative" );
-});
+ return;//these haven't been accepted yet
-test("index()", function() {
- expect(1);
+ //for #2616
+ var keys = jQuery.map( {a:1,b:2}, function( v, k ){
+ return k;
+ }, [ ] );
- equals( jQuery("#text2").index(), 2, "Returns the index of a child amongst its siblings" )
-});
+ equals( keys.join(""), "ab", "Map the keys from a hash to an array" );
+
+ var values = jQuery.map( {a:1,b:2}, function( v, k ){
+ return v;
+ }, [ ] );
+
+ equals( values.join(""), "12", "Map the values from a hash to an array" );
+
+ var scripts = document.getElementsByTagName("script");
+ var mapped = jQuery.map( scripts, function( v, k ){
+ return v;
+ }, {length:0} );
+
+ equals( mapped.length, scripts.length, "Map an array(-like) to a hash" );
-test("index(Object|String|undefined)", function() {
- expect(16);
-
- var elements = jQuery([window, document]),
- inputElements = jQuery('#radio1,#radio2,#check1,#check2');
-
- // Passing a node
- equals( elements.index(window), 0, "Check for index of elements" );
- equals( elements.index(document), 1, "Check for index of elements" );
- equals( inputElements.index(document.getElementById('radio1')), 0, "Check for index of elements" );
- equals( inputElements.index(document.getElementById('radio2')), 1, "Check for index of elements" );
- equals( inputElements.index(document.getElementById('check1')), 2, "Check for index of elements" );
- equals( inputElements.index(document.getElementById('check2')), 3, "Check for index of elements" );
- equals( inputElements.index(window), -1, "Check for not found index" );
- equals( inputElements.index(document), -1, "Check for not found index" );
-
- // Passing a jQuery object
- // enabled since [5500]
- equals( elements.index( elements ), 0, "Pass in a jQuery object" );
- equals( elements.index( elements.eq(1) ), 1, "Pass in a jQuery object" );
- equals( jQuery("#form :radio").index( jQuery("#radio2") ), 1, "Pass in a jQuery object" );
-
- // Passing a selector or nothing
- // enabled since [6330]
- equals( jQuery('#text2').index(), 2, "Check for index amongst siblings" );
- equals( jQuery('#form').children().eq(4).index(), 4, "Check for index amongst siblings" );
- equals( jQuery('#radio2').index('#form :radio') , 1, "Check for index within a selector" );
- equals( jQuery('#form :radio').index( jQuery('#radio2') ), 1, "Check for index within a selector" );
- equals( jQuery('#radio2').index('#form :text') , -1, "Check for index not found within a selector" );
+ var flat = jQuery.map( Array(4), function( v, k ){
+ return k % 2 ? k : [k,k,k];//try mixing array and regular returns
+ });
+
+ equals( flat.join(""), "00012223", "try the new flatten technique(#2616)" );
});
test("jQuery.merge()", function() {
- expect(6);
+ expect(8);
var parse = jQuery.merge;
// Fixed at [5998], #3641
same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
+
+ // After fixing #5527
+ same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
+ same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
});
test("jQuery.extend(Object, Object)", function() {
- expect(24);
+ expect(27);
var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" },
options = { xnumber2: 1, xstring2: "x", xxx: "newstring" },
deep1copy = { foo: { bar: true } },
deep2 = { foo: { baz: true }, foo2: document },
deep2copy = { foo: { baz: true }, foo2: document },
- deepmerged = { foo: { bar: true, baz: true }, foo2: document };
+ deepmerged = { foo: { bar: true, baz: true }, foo2: document },
+ arr = [1, 2, 3],
+ nestedarray = { arr: arr };
jQuery.extend(settings, options);
same( settings, merged, "Check if extended: settings must be extended" );
same( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" );
equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
+ ok( jQuery.extend(true, [], arr) !== arr, "Deep extend of array must clone array" );
+ ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
+
var empty = {};
var optionsWithLength = { foo: { length: -1 } };
jQuery.extend(true, empty, optionsWithLength);
var myKlass = function() {};
var customObject = new myKlass();
- var optionsWithCustomObject = { foo: { date: new customObject } };
+ var optionsWithCustomObject = { foo: { date: customObject } };
empty = {};
jQuery.extend(true, empty, optionsWithCustomObject);
- ok( empty.foo && empty.foo.date && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
+ ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
// Makes the class a little more realistic
myKlass.prototype = { someMethod: function(){} };
empty = {};
jQuery.extend(true, empty, optionsWithCustomObject);
- ok( empty.foo && empty.foo.date && empty.foo.date === customObject, "Custom objects copy correctly" );
+ ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly" );
var ret = jQuery.extend(true, { foo: 4 }, { foo: new Number(5) } );
ok( ret.foo == 5, "Wrapped numbers copy correctly" );
});
test("jQuery.makeArray", function(){
- expect(15);
+ expect(17);
equals( jQuery.makeArray(jQuery('html>*'))[0].nodeName.toUpperCase(), "HEAD", "Pass makeArray a jQuery object" );
equals( jQuery.makeArray(/a/)[0].constructor, RegExp, "Pass makeArray a regex" );
ok( jQuery.makeArray(document.getElementById('form')).length >= 13, "Pass makeArray a form (treat as elements)" );
+
+ // For #5610
+ same( jQuery.makeArray({'length': '0'}), [], "Make sure object is coerced properly.");
+ same( jQuery.makeArray({'length': '5'}), [], "Make sure object is coerced properly.");
});
test("jQuery.isEmptyObject", function(){
// What about this ?
// equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" );
});
+
+test("jQuery.proxy", function(){
+ expect(4);
+
+ var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); };
+ var thisObject = { foo: "bar", method: test };
+
+ // Make sure normal works
+ test.call( thisObject );
+
+ // Basic scoping
+ jQuery.proxy( test, thisObject )();
+
+ // Make sure it doesn't freak out
+ equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." );
+
+ // Use the string shortcut
+ jQuery.proxy( thisObject, "method" )();
+});
+
+test("jQuery.parseJSON", function(){
+ expect(8);
+
+ equals( jQuery.parseJSON(), null, "Nothing in, null out." );
+ equals( jQuery.parseJSON( null ), null, "Nothing in, null out." );
+ equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
+
+ same( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
+ same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." );
+
+ same( jQuery.parseJSON('\n{"test":1}'), {"test":1}, "Make sure leading whitespaces are handled." );
+
+ try {
+ jQuery.parseJSON("{a:1}");
+ ok( false, "Test malformed JSON string." );
+ } catch( e ) {
+ ok( true, "Test malformed JSON string." );
+ }
+
+ try {
+ jQuery.parseJSON("{'a':1}");
+ ok( false, "Test malformed JSON string." );
+ } catch( e ) {
+ ok( true, "Test malformed JSON string." );
+ }
+});