'use strict'; describe('angular', function() { var element; afterEach(function() { dealoc(element); }); describe('case', function() { it('should change case', function() { expect(lowercase('ABC90')).toEqual('abc90'); expect(manualLowercase('ABC90')).toEqual('abc90'); expect(uppercase('abc90')).toEqual('ABC90'); expect(manualUppercase('abc90')).toEqual('ABC90'); }); }); describe("copy", function() { it("should return same object", function() { var obj = {}; var arr = []; expect(copy({}, obj)).toBe(obj); expect(copy([], arr)).toBe(arr); }); it("should preserve prototype chaining", function() { var GrandParentProto = {}; var ParentProto = Object.create(GrandParentProto); var obj = Object.create(ParentProto); expect(ParentProto.isPrototypeOf(copy(obj))).toBe(true); expect(GrandParentProto.isPrototypeOf(copy(obj))).toBe(true); var Foo = function() {}; expect(copy(new Foo()) instanceof Foo).toBe(true); }); it("should copy Date", function() { var date = new Date(123); expect(copy(date) instanceof Date).toBeTruthy(); expect(copy(date).getTime()).toEqual(123); expect(copy(date) === date).toBeFalsy(); }); it("should copy RegExp", function() { var re = new RegExp(".*"); expect(copy(re) instanceof RegExp).toBeTruthy(); expect(copy(re).source).toBe(".*"); expect(copy(re) === re).toBe(false); }); it("should copy literal RegExp", function() { var re = /.*/; expect(copy(re) instanceof RegExp).toBeTruthy(); expect(copy(re).source).toEqual(".*"); expect(copy(re) === re).toBeFalsy(); }); it("should copy RegExp with flags", function() { var re = new RegExp('.*', 'gim'); expect(copy(re).global).toBe(true); expect(copy(re).ignoreCase).toBe(true); expect(copy(re).multiline).toBe(true); }); it("should copy RegExp with lastIndex", function() { var re = /a+b+/g; var str = 'ab aabb'; expect(re.exec(str)[0]).toEqual('ab'); expect(copy(re).exec(str)[0]).toEqual('aabb'); }); it("should deeply copy literal RegExp", function() { var objWithRegExp = { re: /.*/ }; expect(copy(objWithRegExp).re instanceof RegExp).toBeTruthy(); expect(copy(objWithRegExp).re.source).toEqual(".*"); expect(copy(objWithRegExp.re) === objWithRegExp.re).toBeFalsy(); }); it("should copy a Uint8Array with no destination", function() { if (typeof Uint8Array !== 'undefined') { var src = new Uint8Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Uint8Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Uint8ClampedArray with no destination", function() { if (typeof Uint8ClampedArray !== 'undefined') { var src = new Uint8ClampedArray(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Uint8ClampedArray).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Uint16Array with no destination", function() { if (typeof Uint16Array !== 'undefined') { var src = new Uint16Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Uint16Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Uint32Array with no destination", function() { if (typeof Uint32Array !== 'undefined') { var src = new Uint32Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Uint32Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Int8Array with no destination", function() { if (typeof Int8Array !== 'undefined') { var src = new Int8Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Int8Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Int16Array with no destination", function() { if (typeof Int16Array !== 'undefined') { var src = new Int16Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Int16Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Int32Array with no destination", function() { if (typeof Int32Array !== 'undefined') { var src = new Int32Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Int32Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Float32Array with no destination", function() { if (typeof Float32Array !== 'undefined') { var src = new Float32Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Float32Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it("should copy a Float64Array with no destination", function() { if (typeof Float64Array !== 'undefined') { var src = new Float64Array(2); src[1] = 1; var dst = copy(src); expect(copy(src) instanceof Float64Array).toBeTruthy(); expect(dst).toEqual(src); expect(dst).not.toBe(src); } }); it('should handle Blob objects', function() { if (typeof Blob !== 'undefined') { var src = new Blob(['foo'], {type: 'bar'}); var dst = copy(src); expect(dst).not.toBe(src); expect(dst.size).toBe(3); expect(dst.type).toBe('bar'); expect(isBlob(dst)).toBe(true); } }); it("should throw an exception if a Uint8Array is the destination", function() { if (typeof Uint8Array !== 'undefined') { var src = new Uint8Array(); var dst = new Uint8Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Uint8ClampedArray is the destination", function() { if (typeof Uint8ClampedArray !== 'undefined') { var src = new Uint8ClampedArray(); var dst = new Uint8ClampedArray(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Uint16Array is the destination", function() { if (typeof Uint16Array !== 'undefined') { var src = new Uint16Array(); var dst = new Uint16Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Uint32Array is the destination", function() { if (typeof Uint32Array !== 'undefined') { var src = new Uint32Array(); var dst = new Uint32Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Int8Array is the destination", function() { if (typeof Int8Array !== 'undefined') { var src = new Int8Array(); var dst = new Int8Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Int16Array is the destination", function() { if (typeof Int16Array !== 'undefined') { var src = new Int16Array(); var dst = new Int16Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Int32Array is the destination", function() { if (typeof Int32Array !== 'undefined') { var src = new Int32Array(); var dst = new Int32Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Float32Array is the destination", function() { if (typeof Float32Array !== 'undefined') { var src = new Float32Array(); var dst = new Float32Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should throw an exception if a Float64Array is the destination", function() { if (typeof Float64Array !== 'undefined') { var src = new Float64Array(); var dst = new Float64Array(5); expect(function() { copy(src, dst); }) .toThrowMinErr("ng", "cpta", "Can't copy! TypedArray destination cannot be mutated."); } }); it("should deeply copy an array into an existing array", function() { var src = [1, {name:"value"}]; var dst = [{key:"v"}]; expect(copy(src, dst)).toBe(dst); expect(dst).toEqual([1, {name:"value"}]); expect(dst[1]).toEqual({name:"value"}); expect(dst[1]).not.toBe(src[1]); }); it("should deeply copy an array into a new array", function() { var src = [1, {name:"value"}]; var dst = copy(src); expect(src).toEqual([1, {name:"value"}]); expect(dst).toEqual(src); expect(dst).not.toBe(src); expect(dst[1]).not.toBe(src[1]); }); it('should copy empty array', function() { var src = []; var dst = [{key: "v"}]; expect(copy(src, dst)).toEqual([]); expect(dst).toEqual([]); }); it("should deeply copy an object into an existing object", function() { var src = {a:{name:"value"}}; var dst = {b:{key:"v"}}; expect(copy(src, dst)).toBe(dst); expect(dst).toEqual({a:{name:"value"}}); expect(dst.a).toEqual(src.a); expect(dst.a).not.toBe(src.a); }); it("should deeply copy an object into a non-existing object", function() { var src = {a:{name:"value"}}; var dst = copy(src, undefined); expect(src).toEqual({a:{name:"value"}}); expect(dst).toEqual(src); expect(dst).not.toBe(src); expect(dst.a).toEqual(src.a); expect(dst.a).not.toBe(src.a); }); it("should copy primitives", function() { expect(copy(null)).toEqual(null); expect(copy('')).toBe(''); expect(copy('lala')).toBe('lala'); expect(copy(123)).toEqual(123); expect(copy([{key:null}])).toEqual([{key:null}]); }); it('should throw an exception if a Scope is being copied', inject(function($rootScope) { expect(function() { copy($rootScope.$new()); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); expect(function() { copy({child: $rootScope.$new()}, {}); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); expect(function() { copy([$rootScope.$new()]); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); })); it('should throw an exception if a Window is being copied', function() { expect(function() { copy(window); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); expect(function() { copy({child: window}); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); expect(function() { copy([window], []); }). toThrowMinErr("ng", "cpws", "Can't copy! Making copies of Window or Scope instances is not supported."); }); it('should throw an exception when source and destination are equivalent', function() { var src, dst; src = dst = {key: 'value'}; expect(function() { copy(src, dst); }).toThrowMinErr("ng", "cpi", "Can't copy! Source and destination are identical."); src = dst = [2, 4]; expect(function() { copy(src, dst); }).toThrowMinErr("ng", "cpi", "Can't copy! Source and destination are identical."); }); it('should not copy the private $$hashKey', function() { var src,dst; src = {}; hashKey(src); dst = copy(src); expect(hashKey(dst)).not.toEqual(hashKey(src)); src = {foo: {}}; hashKey(src.foo); dst = copy(src); expect(hashKey(src.foo)).not.toEqual(hashKey(dst.foo)); }); it('should retain the previous $$hashKey when copying object with hashKey', function() { var src,dst,h; src = {}; dst = {}; // force creation of a hashkey h = hashKey(dst); hashKey(src); dst = copy(src,dst); // make sure we don't copy the key expect(hashKey(dst)).not.toEqual(hashKey(src)); // make sure we retain the old key expect(hashKey(dst)).toEqual(h); }); it('should retain the previous $$hashKey when copying non-object', function() { var dst = {}; var h = hashKey(dst); copy(null, dst); expect(hashKey(dst)).toEqual(h); copy(42, dst); expect(hashKey(dst)).toEqual(h); copy(new Date(), dst); expect(hashKey(dst)).toEqual(h); }); it('should handle circular references', function() { var a = {b: {a: null}, self: null, selfs: [null, null, [null]]}; a.b.a = a; a.self = a; a.selfs = [a, a.b, [a]]; var aCopy = copy(a, null); expect(aCopy).toEqual(a); expect(aCopy).not.toBe(a); expect(aCopy).toBe(aCopy.self); expect(aCopy).toBe(aCopy.selfs[2][0]); expect(aCopy.selfs[2]).not.toBe(a.selfs[2]); var copyTo = []; aCopy = copy(a, copyTo); expect(aCopy).toBe(copyTo); expect(aCopy).not.toBe(a); expect(aCopy).toBe(aCopy.self); }); it('should deeply copy XML nodes', function() { var anElement = document.createElement('foo'); anElement.appendChild(document.createElement('bar')); var theCopy = anElement.cloneNode(true); expect(copy(anElement).outerHTML).toEqual(theCopy.outerHTML); expect(copy(anElement)).not.toBe(anElement); }); it('should not try to call a non-function called `cloneNode`', function() { expect(copy.bind(null, { cloneNode: 100 })).not.toThrow(); }); it('should handle objects with multiple references', function() { var b = {}; var a = [b, -1, b]; var aCopy = copy(a); expect(aCopy[0]).not.toBe(a[0]); expect(aCopy[0]).toBe(aCopy[2]); var copyTo = []; aCopy = copy(a, copyTo); expect(aCopy).toBe(copyTo); expect(aCopy[0]).not.toBe(a[0]); expect(aCopy[0]).toBe(aCopy[2]); }); it('should handle date/regex objects with multiple references', function() { var re = /foo/; var d = new Date(); var o = {re: re, re2: re, d: d, d2: d}; var oCopy = copy(o); expect(oCopy.re).toBe(oCopy.re2); expect(oCopy.d).toBe(oCopy.d2); oCopy = copy(o, {}); expect(oCopy.re).toBe(oCopy.re2); expect(oCopy.d).toBe(oCopy.d2); }); it('should clear destination arrays correctly when source is non-array', function() { expect(copy(null, [1,2,3])).toEqual([]); expect(copy(undefined, [1,2,3])).toEqual([]); expect(copy({0: 1, 1: 2}, [1,2,3])).toEqual([1,2]); expect(copy(new Date(), [1,2,3])).toEqual([]); expect(copy(/a/, [1,2,3])).toEqual([]); expect(copy(true, [1,2,3])).toEqual([]); }); it('should clear destination objects correctly when source is non-array', function() { expect(copy(null, {0:1,1:2,2:3})).toEqual({}); expect(copy(undefined, {0:1,1:2,2:3})).toEqual({}); expect(copy(new Date(), {0:1,1:2,2:3})).toEqual({}); expect(copy(/a/, {0:1,1:2,2:3})).toEqual({}); expect(copy(true, {0:1,1:2,2:3})).toEqual({}); }); it('should copy objects with no prototype parent', function() { var obj = extend(Object.create(null), { a: 1, b: 2, c: 3 }); var dest = copy(obj); expect(Object.getPrototypeOf(dest)).toBe(null); expect(dest.a).toBe(1); expect(dest.b).toBe(2); expect(dest.c).toBe(3); expect(Object.keys(dest)).toEqual(['a', 'b', 'c']); }); }); describe("extend", function() { it('should not copy the private $$hashKey', function() { var src,dst; src = {}; dst = {}; hashKey(src); dst = extend(dst,src); expect(hashKey(dst)).not.toEqual(hashKey(src)); }); it('should copy the properties of the source object onto the destination object', function() { var destination, source; destination = {}; source = {foo: true}; destination = extend(destination, source); expect(isDefined(destination.foo)).toBe(true); }); it('ISSUE #4751 - should copy the length property of an object source to the destination object', function() { var destination, source; destination = {}; source = {radius: 30, length: 0}; destination = extend(destination, source); expect(isDefined(destination.length)).toBe(true); expect(isDefined(destination.radius)).toBe(true); }); it('should retain the previous $$hashKey', function() { var src,dst,h; src = {}; dst = {}; h = hashKey(dst); hashKey(src); dst = extend(dst,src); // make sure we don't copy the key expect(hashKey(dst)).not.toEqual(hashKey(src)); // make sure we retain the old key expect(hashKey(dst)).toEqual(h); }); it('should work when extending with itself', function() { var src,dst,h; dst = src = {}; h = hashKey(dst); dst = extend(dst,src); // make sure we retain the old key expect(hashKey(dst)).toEqual(h); }); it('should copy dates by reference', function() { var src = { date: new Date() }; var dst = {}; extend(dst, src); expect(dst.date).toBe(src.date); }); it('should copy elements by reference', function() { var src = { element: document.createElement('div'), jqObject: jqLite("
s1s2
").find("span") }; var dst = {}; extend(dst, src); expect(dst.element).toBe(src.element); expect(dst.jqObject).toBe(src.jqObject); }); }); describe('merge', function() { it('should recursively copy objects into dst from left to right', function() { var dst = { foo: { bar: 'foobar' }}; var src1 = { foo: { bazz: 'foobazz' }}; var src2 = { foo: { bozz: 'foobozz' }}; merge(dst, src1, src2); expect(dst).toEqual({ foo: { bar: 'foobar', bazz: 'foobazz', bozz: 'foobozz' } }); }); it('should replace primitives with objects', function() { var dst = { foo: "bloop" }; var src = { foo: { bar: { baz: "bloop" }}}; merge(dst, src); expect(dst).toEqual({ foo: { bar: { baz: "bloop" } } }); }); it('should replace null values in destination with objects', function() { var dst = { foo: null }; var src = { foo: { bar: { baz: "bloop" }}}; merge(dst, src); expect(dst).toEqual({ foo: { bar: { baz: "bloop" } } }); }); it('should copy references to functions by value rather than merging', function() { function fn() {} var dst = { foo: 1 }; var src = { foo: fn }; merge(dst, src); expect(dst).toEqual({ foo: fn }); }); it('should create a new array if destination property is a non-object and source property is an array', function() { var dst = { foo: NaN }; var src = { foo: [1,2,3] }; merge(dst, src); expect(dst).toEqual({ foo: [1,2,3] }); expect(dst.foo).not.toBe(src.foo); }); it('should copy dates by value', function() { var src = { date: new Date() }; var dst = {}; merge(dst, src); expect(dst.date).not.toBe(src.date); expect(isDate(dst.date)).toBeTruthy(); expect(dst.date.valueOf()).toEqual(src.date.valueOf()); }); it('should copy regexp by value', function() { var src = { regexp: /blah/ }; var dst = {}; merge(dst, src); expect(dst.regexp).not.toBe(src.regexp); expect(isRegExp(dst.regexp)).toBe(true); expect(dst.regexp.toString()).toBe(src.regexp.toString()); }); it('should copy(clone) elements', function() { var src = { element: document.createElement('div'), jqObject: jqLite('s1s2
').find('span') }; var dst = {}; merge(dst, src); expect(dst.element).not.toBe(src.element); expect(dst.jqObject).not.toBe(src.jqObject); expect(isElement(dst.element)).toBeTruthy(); expect(dst.element.nodeName).toBeDefined(); // i.e it is a DOM element expect(isElement(dst.jqObject)).toBeTruthy(); expect(dst.jqObject.nodeName).toBeUndefined(); // i.e it is a jqLite/jQuery object }); }); describe('shallow copy', function() { it('should make a copy', function() { var original = {key:{}}; var copy = shallowCopy(original); expect(copy).toEqual(original); expect(copy.key).toBe(original.key); }); it('should omit "$$"-prefixed properties', function() { var original = {$$some: true, $$: true}; var clone = {}; expect(shallowCopy(original, clone)).toBe(clone); expect(clone.$$some).toBeUndefined(); expect(clone.$$).toBeUndefined(); }); it('should copy "$"-prefixed properties from copy', function() { var original = {$some: true}; var clone = {}; expect(shallowCopy(original, clone)).toBe(clone); expect(clone.$some).toBe(original.$some); }); it('should handle arrays', function() { var original = [{}, 1], clone = []; var aCopy = shallowCopy(original); expect(aCopy).not.toBe(original); expect(aCopy).toEqual(original); expect(aCopy[0]).toBe(original[0]); expect(shallowCopy(original, clone)).toBe(clone); expect(clone).toEqual(original); }); it('should handle primitives', function() { expect(shallowCopy('test')).toBe('test'); expect(shallowCopy(3)).toBe(3); expect(shallowCopy(true)).toBe(true); }); }); describe('elementHTML', function() { it('should dump element', function() { expect(startingTag('s1s2
").find("span"), log = []; forEach(jqObject, function(value, key) { log.push(key + ':' + value.innerHTML); }); expect(log).toEqual(['0:s1', '1:s2']); log = []; jqObject = 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 = ""; var htmlCollection = document.getElementsByName('x'), log = []; forEach(htmlCollection, function(value, key) { log.push(key + ':' + value.innerHTML); }); expect(log).toEqual(['0:a', '1:c']); }); if (document.querySelectorAll) { it('should handle the result of querySelectorAll in IE8 as it has no hasOwnProperty function', function() { document.body.innerHTML = ""; var htmlCollection = document.querySelectorAll('[name="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 string values like arrays', function() { var log = []; forEach('bar', function(value, key) { log.push(key + ':' + value); }); expect(log).toEqual(['0:b', '1:a', '2:r']); }); 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']); }); it('should not invoke the iterator for indexed properties which are not present in the collection', function() { var log = []; var collection = []; collection[5] = 'SPARSE'; forEach(collection, function(item, index) { log.push(item + index); }); expect(log.length).toBe(1); expect(log[0]).toBe('SPARSE5'); }); it('should safely iterate through objects with no prototype parent', function() { var obj = extend(Object.create(null), { a: 1, b: 2, c: 3 }); var log = []; var self = {}; forEach(obj, function(val, key, collection) { expect(this).toBe(self); expect(collection).toBe(obj); log.push(key + '=' + val); }, self); expect(log.length).toBe(3); expect(log).toEqual(['a=1', 'b=2', 'c=3']); }); it('should safely iterate through objects which shadow Object.prototype.hasOwnProperty', function() { /* jshint -W001 */ var obj = { hasOwnProperty: true, a: 1, b: 2, c: 3 }; var log = []; var self = {}; forEach(obj, function(val, key, collection) { expect(this).toBe(self); expect(collection).toBe(obj); log.push(key + '=' + val); }, self); expect(log.length).toBe(4); expect(log).toEqual(['hasOwnProperty=true', 'a=1', 'b=2', 'c=3']); }); describe('ES spec api compliance', function() { function testForEachSpec(expectedSize, collection) { var that = {}; forEach(collection, function(value, key, collectionArg) { expect(collectionArg).toBe(collection); expect(collectionArg[key]).toBe(value); expect(this).toBe(that); expectedSize--; }, that); expect(expectedSize).toBe(0); } it('should follow the ES spec when called with array', function() { testForEachSpec(2, [1,2]); }); it('should follow the ES spec when called with arguments', function() { testForEachSpec(2, (function() { return arguments; }(1,2))); }); it('should follow the ES spec when called with string', function() { testForEachSpec(2, '12'); }); it('should follow the ES spec when called with jQuery/jqLite', function() { testForEachSpec(2, jqLite("ab")); }); it('should follow the ES spec when called with childNodes NodeList', function() { testForEachSpec(2, jqLite("ab
")[0].childNodes); }); it('should follow the ES spec when called with getElementsByTagName HTMLCollection', function() { testForEachSpec(2, jqLite("ab
")[0].getElementsByTagName("*")); }); it('should follow the ES spec when called with querySelectorAll HTMLCollection', function() { testForEachSpec(2, jqLite("ab
")[0].querySelectorAll("*")); }); it('should follow the ES spec when called with JSON', function() { testForEachSpec(2, {a: 1, b: 2}); }); it('should follow the ES spec when called with function', function() { function f() {} f.a = 1; f.b = 2; testForEachSpec(2, f); }); }); }); describe('encodeUriSegment', function() { it('should correctly encode uri segment and not encode chars defined as pchar set in rfc3986', function() { //don't encode alphanum expect(encodeUriSegment('asdf1234asdf')). toEqual('asdf1234asdf'); //don't encode unreserved' expect(encodeUriSegment("-_.!~*'(); -_.!~*'();")). toEqual("-_.!~*'();%20-_.!~*'();"); //don't encode the rest of pchar' expect(encodeUriSegment(':@&=+$, :@&=+$,')). toEqual(':@&=+$,%20:@&=+$,'); //encode '/' and ' '' expect(encodeUriSegment('/; /;')). toEqual('%2F;%20%2F;'); }); }); describe('encodeUriQuery', function() { it('should correctly encode uri query and not encode chars defined as pchar set in rfc3986', function() { //don't encode alphanum expect(encodeUriQuery('asdf1234asdf')). toEqual('asdf1234asdf'); //don't encode unreserved expect(encodeUriQuery("-_.!~*'() -_.!~*'()")). toEqual("-_.!~*'()+-_.!~*'()"); //don't encode the rest of pchar expect(encodeUriQuery(':@$, :@$,')). toEqual(':@$,+:@$,'); //encode '&', ';', '=', '+', and '#' expect(encodeUriQuery('&;=+# &;=+#')). toEqual('%26;%3D%2B%23+%26;%3D%2B%23'); //encode ' ' as '+' expect(encodeUriQuery(' ')). toEqual('++'); //encode ' ' as '%20' when a flag is used expect(encodeUriQuery(' ', true)). toEqual('%20%20'); //do not encode `null` as '+' when flag is used expect(encodeUriQuery('null', true)). toEqual('null'); //do not encode `null` with no flag expect(encodeUriQuery('null')). toEqual('null'); }); }); describe('angularInit', function() { var bootstrapSpy; var element; beforeEach(function() { element = { hasAttribute: function(name) { return !!element[name]; }, querySelector: function(arg) { return element.querySelector[arg] || null; }, getAttribute: function(name) { return element[name]; } }; bootstrapSpy = jasmine.createSpy('bootstrapSpy'); }); it('should do nothing when not found', function() { angularInit(element, bootstrapSpy); expect(bootstrapSpy).not.toHaveBeenCalled(); }); it('should look for ngApp directive as attr', function() { var appElement = jqLite('')[0]; element.querySelector['[ng-app]'] = appElement; angularInit(element, bootstrapSpy); expect(bootstrapSpy).toHaveBeenCalledOnceWith(appElement, ['ABC'], jasmine.any(Object)); }); it('should look for ngApp directive using querySelectorAll', function() { var appElement = jqLite('')[0]; element.querySelector['[x-ng-app]'] = appElement; angularInit(element, bootstrapSpy); expect(bootstrapSpy).toHaveBeenCalledOnceWith(appElement, ['ABC'], jasmine.any(Object)); }); it('should bootstrap anonymously', function() { var appElement = jqLite('')[0]; element.querySelector['[x-ng-app]'] = appElement; angularInit(element, bootstrapSpy); expect(bootstrapSpy).toHaveBeenCalledOnceWith(appElement, [], jasmine.any(Object)); }); it('should bootstrap if the annotation is on the root element', function() { var appElement = jqLite('')[0]; angularInit(appElement, bootstrapSpy); expect(bootstrapSpy).toHaveBeenCalledOnceWith(appElement, [], jasmine.any(Object)); }); it('should complain if app module cannot be found', function() { var appElement = jqLite('')[0]; expect(function() { angularInit(appElement, angular.bootstrap); }).toThrowMatching( new RegExp('\\[\\$injector:modulerr] Failed to instantiate module doesntexist due to:\\n' + '.*\\[\\$injector:nomod] Module \'doesntexist\' is not available! You either ' + 'misspelled the module name or forgot to load it\\.') ); }); it('should complain if an element has already been bootstrapped', function() { var element = jqLite('Hello, world!
')($rootScope), body = $document.find('body')[0], expected = [false, false, false, false, false, false, false, true, true], tests = [null, undefined, "string", 1001, {}, 0, false, body, element]; angular.forEach(tests, function(value, idx) { var result = angular.isElement(value); expect(typeof result).toEqual('boolean'); expect(result).toEqual(expected[idx]); }); })); // Issue #4805 it('should return false for objects resembling a Backbone Collection', function() { // Backbone stuff is sort of hard to mock, if you have a better way of doing this, // please fix this. var fakeBackboneCollection = { children: [{}, {}, {}], find: function() {}, on: function() {}, off: function() {}, bind: function() {} }; expect(isElement(fakeBackboneCollection)).toBe(false); }); it('should return false for arrays with node-like properties', function() { var array = [1,2,3]; array.on = true; expect(isElement(array)).toBe(false); }); }); });