aboutsummaryrefslogtreecommitdiffstats
path: root/test/directive/ngRepeatSpec.js
diff options
context:
space:
mode:
authorIgor Minar2012-03-08 15:00:38 -0800
committerIgor Minar2012-03-08 22:29:34 -0800
commitf54db2ccda399f2677e4ca7588018cb31545a2b4 (patch)
tree29ef2f8f834544c84cea1a82e3d08679358fb992 /test/directive/ngRepeatSpec.js
parentdd7b0f56fcd9785f7fccae8c4f088a8f3e7b125e (diff)
downloadangular.js-f54db2ccda399f2677e4ca7588018cb31545a2b4.tar.bz2
chore(directives,widgets): reorg the code under directive/ dir
Diffstat (limited to 'test/directive/ngRepeatSpec.js')
-rw-r--r--test/directive/ngRepeatSpec.js282
1 files changed, 282 insertions, 0 deletions
diff --git a/test/directive/ngRepeatSpec.js b/test/directive/ngRepeatSpec.js
new file mode 100644
index 00000000..8400edaa
--- /dev/null
+++ b/test/directive/ngRepeatSpec.js
@@ -0,0 +1,282 @@
+'use strict';
+
+describe('ng:repeat', function() {
+ var element;
+
+
+ afterEach(function(){
+ dealoc(element);
+ });
+
+
+ it('should ng:repeat over array', inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="item in items" ng:init="suffix = \';\'" ng:bind="item + suffix"></li>' +
+ '</ul>')($rootScope);
+
+ Array.prototype.extraProperty = "should be ignored";
+ // INIT
+ $rootScope.items = ['misko', 'shyam'];
+ $rootScope.$digest();
+ expect(element.find('li').length).toEqual(2);
+ expect(element.text()).toEqual('misko;shyam;');
+ delete Array.prototype.extraProperty;
+
+ // GROW
+ $rootScope.items = ['adam', 'kai', 'brad'];
+ $rootScope.$digest();
+ expect(element.find('li').length).toEqual(3);
+ expect(element.text()).toEqual('adam;kai;brad;');
+
+ // SHRINK
+ $rootScope.items = ['brad'];
+ $rootScope.$digest();
+ expect(element.find('li').length).toEqual(1);
+ expect(element.text()).toEqual('brad;');
+ }));
+
+
+ it('should ng:repeat over object', inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="(key, value) in items" ng:bind="key + \':\' + value + \';\' "></li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = {misko:'swe', shyam:'set'};
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:swe;shyam:set;');
+ }));
+
+
+ it('should not ng:repeat over parent properties', inject(function($rootScope, $compile) {
+ var Class = function() {};
+ Class.prototype.abc = function() {};
+ Class.prototype.value = 'abc';
+
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="(key, value) in items" ng:bind="key + \':\' + value + \';\' "></li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = new Class();
+ $rootScope.items.name = 'value';
+ $rootScope.$digest();
+ expect(element.text()).toEqual('name:value;');
+ }));
+
+
+ it('should error on wrong parsing of ng:repeat', inject(function($rootScope, $compile, $log) {
+ expect(function() {
+ element = $compile('<ul><li ng:repeat="i dont parse"></li></ul>')($rootScope);
+ }).toThrow("Expected ng:repeat in form of '_item_ in _collection_' but got 'i dont parse'.");
+
+ $log.error.logs.shift();
+ }));
+
+
+ it('should expose iterator offset as $index when iterating over arrays',
+ inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="item in items" ng:bind="item + $index + \'|\'"></li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = ['misko', 'shyam', 'frodo'];
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko0|shyam1|frodo2|');
+ }));
+
+
+ it('should expose iterator offset as $index when iterating over objects',
+ inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="(key, val) in items" ng:bind="key + \':\' + val + $index + \'|\'"></li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = {'misko':'m', 'shyam':'s', 'frodo':'f'};
+ $rootScope.$digest();
+ expect(element.text()).toEqual('frodo:f0|misko:m1|shyam:s2|');
+ }));
+
+
+ it('should expose iterator position as $position when iterating over arrays',
+ inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="item in items" ng:bind="item + \':\' + $position + \'|\'"></li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = ['misko', 'shyam', 'doug'];
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:first|shyam:middle|doug:last|');
+
+ $rootScope.items.push('frodo');
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:first|shyam:middle|doug:middle|frodo:last|');
+
+ $rootScope.items.pop();
+ $rootScope.items.pop();
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:first|shyam:last|');
+ }));
+
+
+ it('should expose iterator position as $position when iterating over objects',
+ inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="(key, val) in items" ng:bind="key + \':\' + val + \':\' + $position + \'|\'">' +
+ '</li>' +
+ '</ul>')($rootScope);
+ $rootScope.items = {'misko':'m', 'shyam':'s', 'doug':'d', 'frodo':'f'};
+ $rootScope.$digest();
+ expect(element.text()).toEqual('doug:d:first|frodo:f:middle|misko:m:middle|shyam:s:last|');
+
+ delete $rootScope.items.doug;
+ delete $rootScope.items.frodo;
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:m:first|shyam:s:last|');
+ }));
+
+
+ it('should ignore $ and $$ properties', inject(function($rootScope, $compile) {
+ element = $compile('<ul><li ng:repeat="i in items">{{i}}|</li></ul>')($rootScope);
+ $rootScope.items = ['a', 'b', 'c'];
+ $rootScope.items.$$hashkey = 'xxx';
+ $rootScope.items.$root = 'yyy';
+ $rootScope.$digest();
+
+ expect(element.text()).toEqual('a|b|c|');
+ }));
+
+
+ it('should repeat over nested arrays', inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="subgroup in groups">' +
+ '<div ng:repeat="group in subgroup">{{group}}|</div>X' +
+ '</li>' +
+ '</ul>')($rootScope);
+ $rootScope.groups = [['a', 'b'], ['c','d']];
+ $rootScope.$digest();
+
+ expect(element.text()).toEqual('a|b|Xc|d|X');
+ }));
+
+
+ it('should ignore non-array element properties when iterating over an array',
+ inject(function($rootScope, $compile) {
+ element = $compile('<ul><li ng:repeat="item in array">{{item}}|</li></ul>')($rootScope);
+ $rootScope.array = ['a', 'b', 'c'];
+ $rootScope.array.foo = '23';
+ $rootScope.array.bar = function() {};
+ $rootScope.$digest();
+
+ expect(element.text()).toBe('a|b|c|');
+ }));
+
+
+ it('should iterate over non-existent elements of a sparse array',
+ inject(function($rootScope, $compile) {
+ element = $compile('<ul><li ng:repeat="item in array">{{item}}|</li></ul>')($rootScope);
+ $rootScope.array = ['a', 'b'];
+ $rootScope.array[4] = 'c';
+ $rootScope.array[6] = 'd';
+ $rootScope.$digest();
+
+ expect(element.text()).toBe('a|b|||c||d|');
+ }));
+
+
+ it('should iterate over all kinds of types', inject(function($rootScope, $compile) {
+ element = $compile('<ul><li ng:repeat="item in array">{{item}}|</li></ul>')($rootScope);
+ $rootScope.array = ['a', 1, null, undefined, {}];
+ $rootScope.$digest();
+
+ expect(element.text()).toMatch(/a\|1\|\|\|\{\s*\}\|/);
+ }));
+
+
+ describe('stability', function() {
+ var a, b, c, d, lis;
+
+ beforeEach(inject(function($rootScope, $compile) {
+ element = $compile(
+ '<ul>' +
+ '<li ng:repeat="item in items" ng:bind="key + \':\' + val + \':\' + $position + \'|\'"></li>' +
+ '</ul>')($rootScope);
+ a = {};
+ b = {};
+ c = {};
+ d = {};
+
+ $rootScope.items = [a, b, c];
+ $rootScope.$digest();
+ lis = element.find('li');
+ }));
+
+
+ it('should preserve the order of elements', inject(function($rootScope) {
+ $rootScope.items = [a, c, d];
+ $rootScope.$digest();
+ var newElements = element.find('li');
+ expect(newElements[0]).toEqual(lis[0]);
+ expect(newElements[1]).toEqual(lis[2]);
+ expect(newElements[2]).not.toEqual(lis[1]);
+ }));
+
+
+ it('should support duplicates', inject(function($rootScope) {
+ $rootScope.items = [a, a, b, c];
+ $rootScope.$digest();
+ var newElements = element.find('li');
+ expect(newElements[0]).toEqual(lis[0]);
+ expect(newElements[1]).not.toEqual(lis[0]);
+ expect(newElements[2]).toEqual(lis[1]);
+ expect(newElements[3]).toEqual(lis[2]);
+
+ lis = newElements;
+ $rootScope.$digest();
+ newElements = element.find('li');
+ expect(newElements[0]).toEqual(lis[0]);
+ expect(newElements[1]).toEqual(lis[1]);
+ expect(newElements[2]).toEqual(lis[2]);
+ expect(newElements[3]).toEqual(lis[3]);
+
+ $rootScope.$digest();
+ newElements = element.find('li');
+ expect(newElements[0]).toEqual(lis[0]);
+ expect(newElements[1]).toEqual(lis[1]);
+ expect(newElements[2]).toEqual(lis[2]);
+ expect(newElements[3]).toEqual(lis[3]);
+ }));
+
+
+ it('should remove last item when one duplicate instance is removed',
+ inject(function($rootScope) {
+ $rootScope.items = [a, a, a];
+ $rootScope.$digest();
+ lis = element.find('li');
+
+ $rootScope.items = [a, a];
+ $rootScope.$digest();
+ var newElements = element.find('li');
+ expect(newElements.length).toEqual(2);
+ expect(newElements[0]).toEqual(lis[0]);
+ expect(newElements[1]).toEqual(lis[1]);
+ }));
+
+
+ it('should reverse items when the collection is reversed',
+ inject(function($rootScope) {
+ $rootScope.items = [a, b, c];
+ $rootScope.$digest();
+ lis = element.find('li');
+
+ $rootScope.items = [c, b, a];
+ $rootScope.$digest();
+ var newElements = element.find('li');
+ expect(newElements.length).toEqual(3);
+ expect(newElements[0]).toEqual(lis[2]);
+ expect(newElements[1]).toEqual(lis[1]);
+ expect(newElements[2]).toEqual(lis[0]);
+ }));
+ });
+});