@@ -752,79 +752,148 @@ test("first()/last()", function() {
});

test("map()", function() {
expect(8);
expect( 2 );

deepEqual(
jQuery("#ap").map(function(){
return jQuery(this).find("a").get();
jQuery("#ap").map(function() {
return jQuery( this ).find("a").get();
}).get(),
q("google", "groups", "anchor1", "mark"),
q( "google", "groups", "anchor1", "mark" ),
"Array Map"
);

deepEqual(
jQuery("#ap > a").map(function(){
jQuery("#ap > a").map(function() {
return this.parentNode;
}).get(),
q("ap","ap","ap"),
q( "ap","ap","ap" ),
"Single Map"
);
});

test("jQuery.map", function() {
expect( 25 );

var keys, values, scripts, nonsense, mapped, flat;
//for #2616
keys = jQuery.map( {"a":1,"b":2}, function( v, k ){
var i, label, result, callback;

result = jQuery.map( [ 3, 4, 5 ], function( v, k ) {
return k;
});
equal( keys.join(""), "ab", "Map the keys from a hash to an array" );
equal( result.join(""), "012", "Map the keys from an array" );

values = jQuery.map( {a:1,b:2}, function( v, k ){
result = jQuery.map( [ 3, 4, 5 ], function( v, k ) {
return v;
});
equal( values.join(""), "12", "Map the values from a hash to an array" );
equal( result.join(""), "345", "Map the values from an array" );

result = jQuery.map( { a: 1, b: 2 }, function( v, k ) {
return k;
});
equal( result.join(""), "ab", "Map the keys from an object" );

// object with length prop
values = jQuery.map( {a:1,b:2, length:3}, function( v, k ){
result = jQuery.map( { a: 1, b: 2 }, function( v, k ) {
return v;
});
equal( values.join(""), "123", "Map the values from a hash with a length property to an array" );
equal( result.join(""), "12", "Map the values from an object" );

scripts = document.getElementsByTagName("script");
mapped = jQuery.map( scripts, function( v, k ){
result = jQuery.map( [ "a", undefined, null, "b" ], function( v, k ) {
return v;
});
equal( mapped.length, scripts.length, "Map an array(-like) to a hash" );
equal( result.join(""), "ab", "Array iteration does not include undefined/null results" );

nonsense = document.getElementsByTagName("asdf");
mapped = jQuery.map( nonsense, function( v, k ){
result = jQuery.map( { a: "a", b: undefined, c: null, d: "b" }, function( v, k ) {
return v;
});
equal( mapped.length, nonsense.length, "Map an empty array(-like) to a hash" );
equal( result.join(""), "ab", "Object iteration does not include undefined/null results" );

result = {
Zero: function() {},
One: function( a ) {},
Two: function( a, b ) {}
};
callback = function( v, k ) {
equal( k, "foo", label + "-argument function treated like object" );
};
for ( i in result ) {
label = i;
result[ i ].foo = "bar";
jQuery.map( result[ i ], callback );
}

result = {
"undefined": undefined,
"null": null,
"false": false,
"true": true,
"empty string": "",
"nonempty string": "string",
"string \"0\"": "0",
"negative": -1,
"excess": 1
};
callback = function( v, k ) {
equal( k, "length", "Object with " + label + " length treated like object" );
};
for ( i in result ) {
label = i;
jQuery.map( { length: result[ i ] }, callback );
}

result = {
"sparse Array": Array( 4 ),
"length: 1 plain object": { length: 1, "0": true },
"length: 2 plain object": { length: 2, "0": true, "1": true },
NodeList: document.getElementsByTagName("html")
};
callback = function( v, k ) {
if ( result[ label ] ) {
delete result[ label ];
equal( k, "0", label + " treated like array" );
}
};
for ( i in result ) {
label = i;
jQuery.map( result[ i ], callback );
}

result = false;
jQuery.map( { length: 0 }, function( v, k ) {
result = true;
});
ok( !result, "length: 0 plain object treated like array" );

result = false;
jQuery.map( document.getElementsByTagName("asdf"), function( v, k ) {
result = true;
});
ok( !result, "empty NodeList treated like array" );

flat = jQuery.map( Array(4), function( v, k ){
return k % 2 ? k : [k,k,k];//try mixing array and regular returns
result = jQuery.map( Array(4), function( v, k ){
return k % 2 ? k : [k,k,k];
});
equal( flat.join(""), "00012223", "try the new flatten technique(#2616)" );
equal( result.join(""), "00012223", "Array results flattened (#2616)" );
});

test("jQuery.merge()", function() {
expect(8);

var parse = jQuery.merge;
deepEqual( jQuery.merge([],[]), [], "Empty arrays" );

deepEqual( parse([],[]), [], "Empty arrays" );
deepEqual( jQuery.merge([ 1 ],[ 2 ]), [ 1, 2 ], "Basic" );
deepEqual( jQuery.merge([ 1, 2 ], [ 3, 4 ]), [ 1, 2, 3, 4 ], "Basic" );

deepEqual( parse([1],[2]), [1,2], "Basic" );
deepEqual( parse([1,2],[3,4]), [1,2,3,4], "Basic" );

deepEqual( parse([1,2],[]), [1,2], "Second empty" );
deepEqual( parse([],[1,2]), [1,2], "First empty" );
deepEqual( jQuery.merge([ 1, 2 ],[]), [ 1, 2 ], "Second empty" );
deepEqual( jQuery.merge([],[ 1, 2 ]), [ 1, 2 ], "First empty" );

// Fixed at [5998], #3641
deepEqual( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
deepEqual( jQuery.merge([ -2, -1 ], [ 0, 1, 2 ]), [ -2, -1 , 0, 1, 2 ],
"Second array including a zero (falsy)");

// After fixing #5527
deepEqual( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
deepEqual( parse({"length":0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
deepEqual( jQuery.merge([], [ null, undefined ]), [ null, undefined ],
"Second array including null and undefined values");
deepEqual( jQuery.merge({ length: 0 }, [ 1, 2 ] ), { length: 2, 0: 1, 1: 2},
"First array like");
});

test("jQuery.extend(Object, Object)", function() {
@@ -937,54 +1006,110 @@ test("jQuery.extend(Object, Object)", function() {
});

test("jQuery.each(Object,Function)", function() {
expect(14);
jQuery.each( [0,1,2], function(i, n){
equal( i, n, "Check array iteration" );
});
expect( 23 );

var i, label, seen, callback;

jQuery.each( [5,6,7], function(i, n){
equal( i, n - 5, "Check array iteration" );
seen = {};
jQuery.each( [ 3, 4, 5 ], function( k, v ) {
seen[ k ] = v;
});
deepEqual( seen, { "0": 3, "1": 4, "2": 5 }, "Array iteration" );

jQuery.each( { name: "name", lang: "lang" }, function(i, n){
equal( i, n, "Check object iteration" );
seen = {};
jQuery.each( { name: "name", lang: "lang" }, function( k, v ) {
seen[ k ] = v;
});
deepEqual( seen, { name: "name", lang: "lang" }, "Object iteration" );

var total = 0;
jQuery.each([1,2,3], function(i,v){ total += v; });
equal( total, 6, "Looping over an array" );
total = 0;
jQuery.each([1,2,3], function(i,v){
total += v;
if ( i == 1 ) {
seen = [];
jQuery.each( [ 1, 2, 3 ], function( k, v ) {
seen.push( v );
if ( k === 1 ) {
return false;
}
});
equal( total, 3, "Looping over an array, with break" );
total = 0;
jQuery.each({"a":1,"b":2,"c":3}, function(i,v){ total += v; });
equal( total, 6, "Looping over an object" );
total = 0;
jQuery.each({"a":3,"b":3,"c":3}, function(i,v){ total += v; return false; });
equal( total, 3, "Looping over an object, with break" );

var f = function(){};
f.foo = "bar";
jQuery.each(f, function(i){
f[i] = "baz";
deepEqual( seen, [ 1, 2 ] , "Broken array iteration" );

seen = [];
jQuery.each( {"a": 1, "b": 2,"c": 3 }, function( k, v ) {
seen.push( v );
return false;
});
deepEqual( seen, [ 1 ], "Broken object iteration" );

seen = {
Zero: function() {},
One: function( a ) {},
Two: function( a, b ) {}
};
callback = function( k, v ) {
equal( k, "foo", label + "-argument function treated like object" );
};
for ( i in seen ) {
label = i;
seen[ i ].foo = "bar";
jQuery.each( seen[ i ], callback );
}

seen = {
"undefined": undefined,
"null": null,
"false": false,
"true": true,
"empty string": "",
"nonempty string": "string",
"string \"0\"": "0",
"negative": -1,
"excess": 1
};
callback = function( k, v ) {
equal( k, "length", "Object with " + label + " length treated like object" );
};
for ( i in seen ) {
label = i;
jQuery.each( { length: seen[ i ] }, callback );
}

seen = {
"sparse Array": Array( 4 ),
"length: 1 plain object": { length: 1, "0": true },
"length: 2 plain object": { length: 2, "0": true, "1": true },
NodeList: document.getElementsByTagName("html")
};
callback = function( k, v ) {
if ( seen[ label ] ) {
delete seen[ label ];
equal( k, "0", label + " treated like array" );
return false;
}
};
for ( i in seen ) {
label = i;
jQuery.each( seen[ i ], callback );
}

seen = false;
jQuery.each( { length: 0 }, function( k, v ) {
seen = true;
});
equal( "baz", f.foo, "Loop over a function" );
ok( !seen, "length: 0 plain object treated like array" );

var stylesheet_count = 0;
jQuery.each(document.styleSheets, function(i){
stylesheet_count++;
seen = false;
jQuery.each( document.getElementsByTagName("asdf"), function( k, v ) {
seen = true;
});
equal(stylesheet_count, 2, "should not throw an error in IE while looping over document.styleSheets and return proper amount");
ok( !seen, "empty NodeList treated like array" );

i = 0;
jQuery.each( document.styleSheets, function() {
i++;
});
equal( i, 2, "Iteration over document.styleSheets" );
});

test("jQuery.makeArray", function(){
expect(17);
expect(15);

equal( jQuery.makeArray(jQuery("html>*"))[0].nodeName.toUpperCase(), "HEAD", "Pass makeArray a jQuery object" );

@@ -1017,10 +1142,6 @@ test("jQuery.makeArray", function(){
equal( 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
deepEqual( jQuery.makeArray({length: "0"}), [], "Make sure object is coerced properly.");
deepEqual( jQuery.makeArray({length: "5"}), [], "Make sure object is coerced properly.");
});

test("jQuery.inArray", function(){
@@ -1072,7 +1193,7 @@ test("jQuery.proxy", function(){
// Test old syntax
var test4 = { "meth": function( a ){ equal( a, "boom", "Ensure old syntax works." ); } };
jQuery.proxy( test4, "meth" )( "boom" );

// jQuery 1.9 improved currying with `this` object
var fn = function() {
equal( Array.prototype.join.call( arguments, "," ), "arg1,arg2,arg3", "args passed" );