From ec54712ff3dab1ade44f94fa82d67edeffa79a1d Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Mon, 11 Feb 2013 12:25:34 -0800 Subject: fix(angular.forEach): correctly iterate over objects with length prop Should handle JQLite, jQuery, NodeList and other objects like arrays but not other generic objects or instances of user defined types with length property. Closes #1840 --- test/AngularSpec.js | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'test/AngularSpec.js') diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 09bc902f..e29bb16b 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -257,7 +257,7 @@ describe('angular', function() { function MyObj() { this.bar = 'barVal'; this.baz = 'bazVal'; - }; + } MyObj.prototype.foo = 'fooVal'; var obj = new MyObj(), @@ -267,6 +267,77 @@ describe('angular', function() { expect(log).toEqual(['bar:barVal', 'baz:bazVal']); }); + + + it('should handle JQLite and jQuery objects like arrays', function() { + var jqObject = jqLite("

s1s2

").find("span"), + log = []; + + forEach(jqObject, function(value, key) { log.push(key + ':' + value.innerHTML)}); + expect(log).toEqual(['0:s1', '1:s2']); + }); + + + it('should handle NodeList objects like arrays', function() { + var nodeList = jqLite("

abc

")[0].childNodes, + log = []; + + + forEach(nodeList, function(value, key) { log.push(key + ':' + value.innerHTML)}); + expect(log).toEqual(['0:a', '1:b', '2:c']); + }); + + + it('should handle HTMLCollection objects like arrays', function() { + document.body.innerHTML = "

" + + "a" + + "b" + + "c" + + "

"; + + var htmlCollection = document.getElementsByName('x'), + log = []; + + forEach(htmlCollection, function(value, key) { log.push(key + ':' + value.innerHTML)}); + expect(log).toEqual(['0:a', '1:c']); + }); + + + it('should handle arguments objects like arrays', function() { + var args, + log = []; + + (function(){ args = arguments}('a', 'b', 'c')); + + forEach(args, function(value, key) { log.push(key + ':' + value)}); + expect(log).toEqual(['0:a', '1:b', '2:c']); + }); + + + it('should handle objects with length property as objects', function() { + var obj = { + 'foo' : 'bar', + 'length': 2 + }, + log = []; + + forEach(obj, function(value, key) { log.push(key + ':' + value)}); + expect(log).toEqual(['foo:bar', 'length:2']); + }); + + + it('should handle objects of custom types with length property as objects', function() { + function CustomType() { + this.length = 2; + this.foo = 'bar' + } + + var obj = new CustomType(), + log = []; + + forEach(obj, function(value, key) { log.push(key + ':' + value)}); + expect(log).toEqual(['length:2', 'foo:bar']); + }); }); -- cgit v1.2.3