Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Side by Side Diff: third_party/pkg/angular/test/directive/ng_repeat_spec.dart

Issue 180873006: Update the Angular/DI tests to latest from github. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Review feedback Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 library ng_repeat_spec; 1 library ng_repeat_spec;
2 2
3 import '../_specs.dart'; 3 import '../_specs.dart';
4 4
5 main() { 5 main() {
6 describe('NgRepeater', () { 6 describe('NgRepeater', () {
7 var element, $compile, scope, $exceptionHandler; 7 var element, $compile, scope, $exceptionHandler, directives;
8 8
9 beforeEach(inject((Injector injector, Scope $rootScope, Compiler compiler) { 9 beforeEach(inject((Injector injector, Scope $rootScope, Compiler compiler, D irectiveMap _directives) {
10 $exceptionHandler = injector.get(ExceptionHandler); 10 $exceptionHandler = injector.get(ExceptionHandler);
11 scope = $rootScope; 11 scope = $rootScope;
12 $compile = (html) { 12 $compile = (html) {
13 element = $(html); 13 element = $(html);
14 var blockFactory = compiler(element); 14 var blockFactory = compiler(element, _directives);
15 var block = blockFactory(injector, element); 15 var block = blockFactory(injector, element);
16 return element; 16 return element;
17 }; 17 };
18 directives = _directives;
18 })); 19 }));
19 20
20 it(r'should set create a list of items', inject((Scope scope, Compiler compi ler, Injector injector) { 21 it(r'should set create a list of items', inject((Scope scope, Compiler compi ler, Injector injector) {
21 var element = $('<div><div ng-repeat="item in items">{{item}}</div></div>' ); 22 var element = $('<div><div ng-repeat="item in items">{{item}}</div></div>' );
22 BlockFactory blockFactory = compiler(element); 23 BlockFactory blockFactory = compiler(element, directives);
23 Block block = blockFactory(injector, element); 24 Block block = blockFactory(injector, element);
24 scope.items = ['a', 'b']; 25 scope.context['items'] = ['a', 'b'];
25 scope.$apply(); 26 scope.apply();
26 expect(element.text()).toEqual('ab'); 27 expect(element.text()).toEqual('ab');
27 })); 28 }));
28 29
29 30
30 it(r'should set create a list of items from iterable', 31 it(r'should set create a list of items from iterable',
31 inject((Scope scope, Compiler compiler, Injector injector) { 32 inject((Scope scope, Compiler compiler, Injector injector) {
32 var element = $('<div><div ng-repeat="item in items">{{item}}</div></div>' ); 33 var element = $('<div><div ng-repeat="item in items">{{item}}</div></div>' );
33 BlockFactory blockFactory = compiler(element); 34 BlockFactory blockFactory = compiler(element, directives);
34 Block block = blockFactory(injector, element); 35 Block block = blockFactory(injector, element);
35 scope.items = ['a', 'b'].map((i) => i); // makes an iterable 36 scope.context['items'] = ['a', 'b'].map((i) => i); // makes an iterable
36 scope.$apply(); 37 scope.apply();
37 expect(element.text()).toEqual('ab'); 38 expect(element.text()).toEqual('ab');
38 })); 39 }));
39 40
40 41
41 it(r'should iterate over an array of objects', () { 42 it(r'should iterate over an array of objects', () {
42 element = $compile( 43 element = $compile(
43 '<ul>' + 44 '<ul>' +
44 '<li ng-repeat="item in items">{{item.name}};</li>' + 45 '<li ng-repeat="item in items">{{item.name}};</li>' +
45 '</ul>'); 46 '</ul>');
46 47
47 // INIT 48 // INIT
48 scope.items = [{"name": 'misko'}, {"name":'shyam'}]; 49 scope.context['items'] = [{"name": 'misko'}, {"name":'shyam'}];
49 scope.$digest(); 50 scope.apply();
50 expect(element.find('li').length).toEqual(2); 51 expect(element.find('li').length).toEqual(2);
51 expect(element.text()).toEqual('misko;shyam;'); 52 expect(element.text()).toEqual('misko;shyam;');
52 53
53 // GROW 54 // GROW
54 scope.items.add({"name": 'adam'}); 55 scope.context['items'].add({"name": 'adam'});
55 scope.$digest(); 56 scope.apply();
56 expect(element.find('li').length).toEqual(3); 57 expect(element.find('li').length).toEqual(3);
57 expect(element.text()).toEqual('misko;shyam;adam;'); 58 expect(element.text()).toEqual('misko;shyam;adam;');
58 59
59 // SHRINK 60 // SHRINK
60 scope.items.removeLast(); 61 scope.context['items'].removeLast();
61 scope.items.removeAt(0); 62 scope.context['items'].removeAt(0);
62 scope.$digest(); 63 scope.apply();
63 expect(element.find('li').length).toEqual(1); 64 expect(element.find('li').length).toEqual(1);
64 expect(element.text()).toEqual('shyam;'); 65 expect(element.text()).toEqual('shyam;');
65 }); 66 });
66 67
67 68
68 it(r'should gracefully handle nulls', () { 69 it(r'should gracefully handle nulls', () {
69 element = $compile( 70 element = $compile(
70 '<div>' + 71 '<div>' +
71 '<ul>' + 72 '<ul>' +
72 '<li ng-repeat="item in null">{{item.name}};</li>' + 73 '<li ng-repeat="item in null">{{item.name}};</li>' +
73 '</ul>' + 74 '</ul>' +
74 '</div>'); 75 '</div>');
75 scope.$digest(); 76 scope.apply();
76 expect(element.find('ul').length).toEqual(1); 77 expect(element.find('ul').length).toEqual(1);
77 expect(element.find('li').length).toEqual(0); 78 expect(element.find('li').length).toEqual(0);
78 }); 79 });
79 80
80 81
81 describe('track by', () { 82 describe('track by', () {
82 it(r'should track using expression function', () { 83 it(r'should track using expression function', () {
83 element = $compile( 84 element = $compile(
84 '<ul>' + 85 '<ul>' +
85 '<li ng-repeat="item in items track by item.id">{{item.name}};</ li>' + 86 '<li ng-repeat="item in items track by item.id">{{item.name}};</ li>' +
86 '</ul>'); 87 '</ul>');
87 scope.items = [{"id": 'misko'}, {"id": 'igor'}]; 88 scope.context['items'] = [{"id": 'misko'}, {"id": 'igor'}];
88 scope.$digest(); 89 scope.apply();
89 var li0 = element.find('li')[0]; 90 var li0 = element.find('li')[0];
90 var li1 = element.find('li')[1]; 91 var li1 = element.find('li')[1];
91 92
92 scope.items.add(scope.items.removeAt(0)); 93 scope.context['items'].add(scope.context['items'].removeAt(0));
93 scope.$digest(); 94 scope.apply();
94 expect(element.find('li')[0]).toBe(li1); 95 expect(element.find('li')[0]).toBe(li1);
95 expect(element.find('li')[1]).toBe(li0); 96 expect(element.find('li')[1]).toBe(li0);
96 }); 97 });
97 98
98 99
99 it(r'should track using build in $id function', () { 100 it(r'should track using build in $id function', () {
100 element = $compile( 101 element = $compile(
101 '<ul>' + 102 '<ul>' +
102 r'<li ng-repeat="item in items track by $id(item)">{{item.name}} ;</li>' + 103 r'<li ng-repeat="item in items track by $id(item)">{{item.name}} ;</li>' +
103 '</ul>'); 104 '</ul>');
104 scope.items = [{"name": 'misko'}, {"name": 'igor'}]; 105 scope.context['items'] = [{"name": 'misko'}, {"name": 'igor'}];
105 scope.$digest(); 106 scope.apply();
106 var li0 = element.find('li')[0]; 107 var li0 = element.find('li')[0];
107 var li1 = element.find('li')[1]; 108 var li1 = element.find('li')[1];
108 109
109 scope.items.add(scope.items.removeAt(0)); 110 scope.context['items'].add(scope.context['items'].removeAt(0));
110 scope.$digest(); 111 scope.apply();
111 expect(element.find('li')[0]).toBe(li1); 112 expect(element.find('li')[0]).toBe(li1);
112 expect(element.find('li')[1]).toBe(li0); 113 expect(element.find('li')[1]).toBe(li0);
113 }); 114 });
114 115
115 116
116 xit(r'should iterate over an array of primitives', () { 117 it(r'should iterate over an array of primitives', () {
117 element = $compile( 118 element = $compile(
118 r'<ul>' + 119 r'<ul>' +
119 r'<li ng-repeat="item in items track by $index">{{item}};</li>' + 120 r'<li ng-repeat="item in items track by $index">{{item}};</li>' +
120 r'</ul>'); 121 r'</ul>');
121 122
122 // INIT 123 // INIT
123 scope.items = [true, true, true]; 124 scope.context['items'] = [true, true, true];
124 scope.$digest(); 125 scope.apply();
125 expect(element.find('li').length).toEqual(3); 126 expect(element.find('li').length).toEqual(3);
126 expect(element.text()).toEqual('true;true;true;'); 127 expect(element.text()).toEqual('true;true;true;');
127 128
128 scope.items = [false, true, true]; 129 scope.context['items'] = [false, true, true];
129 scope.$digest(); 130 scope.apply();
130 expect(element.find('li').length).toEqual(3); 131 expect(element.find('li').length).toEqual(3);
131 expect(element.text()).toEqual('false;true;true;'); 132 expect(element.text()).toEqual('false;true;true;');
132 133
133 scope.items = [false, true, false]; 134 scope.context['items'] = [false, true, false];
134 scope.$digest(); 135 scope.apply();
135 expect(element.find('li').length).toEqual(3); 136 expect(element.find('li').length).toEqual(3);
136 expect(element.text()).toEqual('false;true;false;'); 137 expect(element.text()).toEqual('false;true;false;');
137 138
138 scope.items = [true]; 139 scope.context['items'] = [true];
139 scope.$digest(); 140 scope.apply();
140 expect(element.find('li').length).toEqual(1); 141 expect(element.find('li').length).toEqual(1);
141 expect(element.text()).toEqual('true;'); 142 expect(element.text()).toEqual('true;');
142 143
143 scope.items = [true, true, false]; 144 scope.context['items'] = [true, true, false];
144 scope.$digest(); 145 scope.apply();
145 expect(element.find('li').length).toEqual(3); 146 expect(element.find('li').length).toEqual(3);
146 expect(element.text()).toEqual('true;true;false;'); 147 expect(element.text()).toEqual('true;true;false;');
147 148
148 scope.items = [true, false, false]; 149 scope.context['items'] = [true, false, false];
149 scope.$digest(); 150 scope.apply();
150 expect(element.find('li').length).toEqual(3); 151 expect(element.find('li').length).toEqual(3);
151 expect(element.text()).toEqual('true;false;false;'); 152 expect(element.text()).toEqual('true;false;false;');
152 153
153 // string 154 // string
154 scope.items = ['a', 'a', 'a']; 155 scope.context['items'] = ['a', 'a', 'a'];
155 scope.$digest(); 156 scope.apply();
156 expect(element.find('li').length).toEqual(3); 157 expect(element.find('li').length).toEqual(3);
157 expect(element.text()).toEqual('a;a;a;'); 158 expect(element.text()).toEqual('a;a;a;');
158 159
159 scope.items = ['ab', 'a', 'a']; 160 scope.context['items'] = ['ab', 'a', 'a'];
160 scope.$digest(); 161 scope.apply();
161 expect(element.find('li').length).toEqual(3); 162 expect(element.find('li').length).toEqual(3);
162 expect(element.text()).toEqual('ab;a;a;'); 163 expect(element.text()).toEqual('ab;a;a;');
163 164
164 scope.items = ['test']; 165 scope.context['items'] = ['test'];
165 scope.$digest(); 166 scope.apply();
166 expect(element.find('li').length).toEqual(1); 167 expect(element.find('li').length).toEqual(1);
167 expect(element.text()).toEqual('test;'); 168 expect(element.text()).toEqual('test;');
168 169
169 scope.items = ['same', 'value']; 170 scope.context['items'] = ['same', 'value'];
170 scope.$digest(); 171 scope.apply();
171 expect(element.find('li').length).toEqual(2); 172 expect(element.find('li').length).toEqual(2);
172 expect(element.text()).toEqual('same;value;'); 173 expect(element.text()).toEqual('same;value;');
173 174
174 // number 175 // number
175 scope.items = [12, 12, 12]; 176 scope.context['items'] = [12, 12, 12];
176 scope.$digest(); 177 scope.apply();
177 expect(element.find('li').length).toEqual(3); 178 expect(element.find('li').length).toEqual(3);
178 expect(element.text()).toEqual('12;12;12;'); 179 expect(element.text()).toEqual('12;12;12;');
179 180
180 scope.items = [53, 12, 27]; 181 scope.context['items'] = [53, 12, 27];
181 scope.$digest(); 182 scope.apply();
182 expect(element.find('li').length).toEqual(3); 183 expect(element.find('li').length).toEqual(3);
183 expect(element.text()).toEqual('53;12;27;'); 184 expect(element.text()).toEqual('53;12;27;');
184 185
185 scope.items = [89]; 186 scope.context['items'] = [89];
186 scope.$digest(); 187 scope.apply();
187 expect(element.find('li').length).toEqual(1); 188 expect(element.find('li').length).toEqual(1);
188 expect(element.text()).toEqual('89;'); 189 expect(element.text()).toEqual('89;');
189 190
190 scope.items = [89, 23]; 191 scope.context['items'] = [89, 23];
191 scope.$digest(); 192 scope.apply();
192 expect(element.find('li').length).toEqual(2); 193 expect(element.find('li').length).toEqual(2);
193 expect(element.text()).toEqual('89;23;'); 194 expect(element.text()).toEqual('89;23;');
194 }); 195 });
195 196
196 }); 197 });
197 198
198 199
199 it(r'should error on wrong parsing of ngRepeat', () { 200 it(r'should error on wrong parsing of ngRepeat', () {
200 element = $('<ul><li ng-repeat="i dont parse"></li></ul>'); 201 element = $('<ul><li ng-repeat="i dont parse"></li></ul>');
201 expect(() { 202 expect(() {
202 $compile(element); 203 $compile(element);
203 }).toThrow("[NgErr7] ngRepeat error! Expected expression in form of '_item _ in _collection_[ track by _id_]' but got 'i dont parse'."); 204 }).toThrow("[NgErr7] ngRepeat error! Expected expression in form of '_item _ in _collection_[ track by _id_]' but got 'i dont parse'.");
204 }); 205 });
205 206
206 207
207 it("should throw error when left-hand-side of ngRepeat can't be parsed", () { 208 it("should throw error when left-hand-side of ngRepeat can't be parsed", () {
208 element = $('<ul><li ng-repeat="i dont parse in foo"></li></ul>'); 209 element = $('<ul><li ng-repeat="i dont parse in foo"></li></ul>');
209 expect(() { 210 expect(() {
210 $compile(element); 211 $compile(element);
211 }).toThrow("[NgErr8] ngRepeat error! '_item_' in '_item_ in _collection_ ' should be an identifier or '(_key_, _value_)' expression, but got 'i dont pars e'."); 212 }).toThrow("[NgErr8] ngRepeat error! '_item_' in '_item_ in _collection_ ' should be an identifier or '(_key_, _value_)' expression, but got 'i dont pars e'.");
212 }); 213 });
213 214
214 215
215 it(r'should expose iterator offset as $index when iterating over arrays', 216 it(r'should expose iterator offset as $index when iterating over arrays',
216 () { 217 () {
217 element = $compile( 218 element = $compile(
218 '<ul>' + 219 '<ul>' +
219 '<li ng-repeat="item in items">{{item}}:{{\$index}}|</li>' + 220 '<li ng-repeat="item in items">{{item}}:{{\$index}}|</li>' +
220 '</ul>'); 221 '</ul>');
221 scope.items = ['misko', 'shyam', 'frodo']; 222 scope.context['items'] = ['misko', 'shyam', 'frodo'];
222 scope.$digest(); 223 scope.apply();
223 expect(element.text()).toEqual('misko:0|shyam:1|frodo:2|'); 224 expect(element.text()).toEqual('misko:0|shyam:1|frodo:2|');
224 }); 225 });
225 226
226 227
227 it(r'should expose iterator position as $first, $middle and $last when itera ting over arrays', 228 it(r'should expose iterator position as $first, $middle and $last when itera ting over arrays',
228 () { 229 () {
229 element = $compile( 230 element = $compile(
230 '<ul>' + 231 '<ul>' +
231 '<li ng-repeat="item in items">{{item}}:{{\$first}}-{{\$middle}}-{{\$l ast}}|</li>' + 232 '<li ng-repeat="item in items">{{item}}:{{\$first}}-{{\$middle}}-{{\$l ast}}|</li>' +
232 '</ul>'); 233 '</ul>');
233 scope.items = ['misko', 'shyam', 'doug']; 234 scope.context['items'] = ['misko', 'shyam', 'doug'];
234 scope.$digest(); 235 scope.apply();
235 expect(element.text()). 236 expect(element.text()).
236 toEqual('misko:true-false-false|shyam:false-true-false|doug:false-fals e-true|'); 237 toEqual('misko:true-false-false|shyam:false-true-false|doug:false-fals e-true|');
237 238
238 scope.items.add('frodo'); 239 scope.context['items'].add('frodo');
239 scope.$digest(); 240 scope.apply();
240 expect(element.text()). 241 expect(element.text()).
241 toEqual('misko:true-false-false|' + 242 toEqual('misko:true-false-false|' +
242 'shyam:false-true-false|' + 243 'shyam:false-true-false|' +
243 'doug:false-true-false|' + 244 'doug:false-true-false|' +
244 'frodo:false-false-true|'); 245 'frodo:false-false-true|');
245 246
246 scope.items.removeLast(); 247 scope.context['items'].removeLast();
247 scope.items.removeLast(); 248 scope.context['items'].removeLast();
248 scope.$digest(); 249 scope.apply();
249 expect(element.text()).toEqual('misko:true-false-false|shyam:false-false-t rue|'); 250 expect(element.text()).toEqual('misko:true-false-false|shyam:false-false-t rue|');
250 251
251 scope.items.removeLast(); 252 scope.context['items'].removeLast();
252 scope.$digest(); 253 scope.apply();
253 expect(element.text()).toEqual('misko:true-false-true|'); 254 expect(element.text()).toEqual('misko:true-false-true|');
254 }); 255 });
255 256
256 it(r'should report odd', () { 257 it(r'should report odd', () {
257 element = $compile( 258 element = $compile(
258 '<ul>' + 259 '<ul>' +
259 '<li ng-repeat="item in items">{{item}}:{{\$odd}}-{{\$even}}|</li>' + 260 '<li ng-repeat="item in items">{{item}}:{{\$odd}}-{{\$even}}|</li>' +
260 '</ul>'); 261 '</ul>');
261 scope.items = ['misko', 'shyam', 'doug']; 262 scope.context['items'] = ['misko', 'shyam', 'doug'];
262 scope.$digest(); 263 scope.apply();
263 expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:fal se-true|'); 264 expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:fal se-true|');
264 265
265 scope.items.add('frodo'); 266 scope.context['items'].add('frodo');
266 scope.$digest(); 267 scope.apply();
267 expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:fal se-true|frodo:true-false|'); 268 expect(element.text()).toEqual('misko:false-true|shyam:true-false|doug:fal se-true|frodo:true-false|');
268 269
269 scope.items.removeLast(); 270 scope.context['items'].removeLast();
270 scope.items.removeLast(); 271 scope.context['items'].removeLast();
271 scope.$digest(); 272 scope.apply();
272 expect(element.text()).toEqual('misko:false-true|shyam:true-false|'); 273 expect(element.text()).toEqual('misko:false-true|shyam:true-false|');
273 274
274 scope.items.removeLast(); 275 scope.context['items'].removeLast();
275 scope.$digest(); 276 scope.apply();
276 expect(element.text()).toEqual('misko:false-true|'); 277 expect(element.text()).toEqual('misko:false-true|');
277 }); 278 });
278 279
279 it(r'should repeat over nested arrays', () { 280 it(r'should repeat over nested arrays', () {
280 element = $compile( 281 element = $compile(
281 '<ul>' + 282 '<ul>' +
282 '<li ng-repeat="subgroup in groups">' + 283 '<li ng-repeat="subgroup in groups">' +
283 '<div ng-repeat="group in subgroup">{{group}}|</div>X' + 284 '<div ng-repeat="group in subgroup">{{group}}|</div>X' +
284 '</li>' + 285 '</li>' +
285 '</ul>'); 286 '</ul>');
286 scope.groups = [['a', 'b'], ['c','d']]; 287 scope.context['groups'] = [['a', 'b'], ['c','d']];
287 scope.$digest(); 288 scope.apply();
288 289
289 expect(element.text()).toEqual('a|b|Xc|d|X'); 290 expect(element.text()).toEqual('a|b|Xc|d|X');
290 }); 291 });
291 292
292 293
293 describe('stability', () { 294 describe('stability', () {
294 var a, b, c, d, lis; 295 var a, b, c, d, lis;
295 296
296 beforeEach(() { 297 beforeEach(() {
297 element = $compile( 298 element = $compile(
298 '<ul>' + 299 '<ul>' +
299 '<li ng-repeat="item in items">{{key}}:{{val}}|></li>' + 300 '<li ng-repeat="item in items">{{key}}:{{val}}|></li>' +
300 '</ul>'); 301 '</ul>');
301 a = {}; 302 a = {};
302 b = {}; 303 b = {};
303 c = {}; 304 c = {};
304 d = {}; 305 d = {};
305 306
306 scope.items = [a, b, c]; 307 scope.context['items'] = [a, b, c];
307 scope.$digest(); 308 scope.apply();
308 lis = element.find('li'); 309 lis = element.find('li');
309 }); 310 });
310 311
311 312
312 it(r'should preserve the order of elements', () { 313 it(r'should preserve the order of elements', () {
313 scope.items = [a, c, d]; 314 scope.context['items'] = [a, c, d];
314 scope.$digest(); 315 scope.apply();
315 var newElements = element.find('li'); 316 var newElements = element.find('li');
316 expect(newElements[0]).toEqual(lis[0]); 317 expect(newElements[0]).toEqual(lis[0]);
317 expect(newElements[1]).toEqual(lis[2]); 318 expect(newElements[1]).toEqual(lis[2]);
318 expect(newElements[2] == lis[1]).toEqual(false); 319 expect(newElements[2] == lis[1]).toEqual(false);
319 }); 320 });
320 321
321 322
322 it(r'should throw error on adding existing duplicates and recover', () { 323 it(r'should throw error on adding existing duplicates and recover', () {
323 scope.items = [a, a, a]; 324 scope.context['items'] = [a, a, a];
324 expect(() { 325 expect(() {
325 scope.$digest(); 326 scope.apply();
326 }).toThrow("[NgErr50] ngRepeat error! Duplicates in a repeater are not a llowed. Use 'track by' expression to specify unique keys. Repeater: item in item s, Duplicate key: {}"); 327 }).toThrow("[NgErr50] ngRepeat error! Duplicates in a repeater are not a llowed. Use 'track by' expression to specify unique keys. Repeater: item in item s, Duplicate key: {}");
327 328
328 // recover 329 // recover
329 scope.items = [a]; 330 scope.context['items'] = [a];
330 scope.$digest(); 331 scope.apply();
331 var newElements = element.find('li'); 332 var newElements = element.find('li');
332 expect(newElements.length).toEqual(1); 333 expect(newElements.length).toEqual(1);
333 expect(newElements[0]).toEqual(lis[0]); 334 expect(newElements[0]).toEqual(lis[0]);
334 335
335 scope.items = []; 336 scope.context['items'] = [];
336 scope.$digest(); 337 scope.apply();
337 newElements = element.find('li'); 338 newElements = element.find('li');
338 expect(newElements.length).toEqual(0); 339 expect(newElements.length).toEqual(0);
339 }); 340 });
340 341
341 342
342 it(r'should throw error on new duplicates and recover', () { 343 it(r'should throw error on new duplicates and recover', () {
343 scope.items = [d, d, d]; 344 scope.context['items'] = [d, d, d];
344 expect(() { 345 expect(() {
345 scope.$digest(); 346 scope.apply();
346 }).toThrow("[NgErr50] ngRepeat error! Duplicates in a repeater are not a llowed. Use 'track by' expression to specify unique keys. Repeater: item in item s, Duplicate key: {}"); 347 }).toThrow("[NgErr50] ngRepeat error! Duplicates in a repeater are not a llowed. Use 'track by' expression to specify unique keys. Repeater: item in item s, Duplicate key: {}");
347 348
348 // recover 349 // recover
349 scope.items = [a]; 350 scope.context['items'] = [a];
350 scope.$digest(); 351 scope.apply();
351 var newElements = element.find('li'); 352 var newElements = element.find('li');
352 expect(newElements.length).toEqual(1); 353 expect(newElements.length).toEqual(1);
353 expect(newElements[0]).toEqual(lis[0]); 354 expect(newElements[0]).toEqual(lis[0]);
354 355
355 scope.items = []; 356 scope.context['items'] = [];
356 scope.$digest(); 357 scope.apply();
357 newElements = element.find('li'); 358 newElements = element.find('li');
358 expect(newElements.length).toEqual(0); 359 expect(newElements.length).toEqual(0);
359 }); 360 });
360 361
361 362
362 it(r'should reverse items when the collection is reversed', () { 363 it(r'should reverse items when the collection is reversed', () {
363 scope.items = [a, b, c]; 364 scope.context['items'] = [a, b, c];
364 scope.$digest(); 365 scope.apply();
365 lis = element.find('li'); 366 lis = element.find('li');
366 367
367 scope.items = [c, b, a]; 368 scope.context['items'] = [c, b, a];
368 scope.$digest(); 369 scope.apply();
369 var newElements = element.find('li'); 370 var newElements = element.find('li');
370 expect(newElements.length).toEqual(3); 371 expect(newElements.length).toEqual(3);
371 expect(newElements[0]).toEqual(lis[2]); 372 expect(newElements[0]).toEqual(lis[2]);
372 expect(newElements[1]).toEqual(lis[1]); 373 expect(newElements[1]).toEqual(lis[1]);
373 expect(newElements[2]).toEqual(lis[0]); 374 expect(newElements[2]).toEqual(lis[0]);
374 }); 375 });
375 376
376 377
377 it(r'should reuse elements even when model is composed of primitives', () { 378 it(r'should reuse elements even when model is composed of primitives', () {
378 // rebuilding repeater from scratch can be expensive, we should try to a void it even for 379 // rebuilding repeater from scratch can be expensive, we should try to a void it even for
379 // model that is composed of primitives. 380 // model that is composed of primitives.
380 381
381 scope.items = ['hello', 'cau', 'ahoj']; 382 scope.context['items'] = ['hello', 'cau', 'ahoj'];
382 scope.$digest(); 383 scope.apply();
383 lis = element.find('li'); 384 lis = element.find('li');
384 lis[2].id = 'yes'; 385 lis[2].id = 'yes';
385 386
386 scope.items = ['ahoj', 'hello', 'cau']; 387 scope.context['items'] = ['ahoj', 'hello', 'cau'];
387 scope.$digest(); 388 scope.apply();
388 var newLis = element.find('li'); 389 var newLis = element.find('li');
389 expect(newLis.length).toEqual(3); 390 expect(newLis.length).toEqual(3);
390 expect(newLis[0]).toEqual(lis[2]); 391 expect(newLis[0]).toEqual(lis[2]);
391 expect(newLis[1]).toEqual(lis[0]); 392 expect(newLis[1]).toEqual(lis[0]);
392 expect(newLis[2]).toEqual(lis[1]); 393 expect(newLis[2]).toEqual(lis[1]);
393 }); 394 });
394 }); 395 });
395 396
396 describe('shalow', () {
397 TestBed _;
398 beforeEach(inject((TestBed tb) => _ = tb));
399
400 it('should x', () {
401 _.compile('<ul><li ng-shallow-repeat="i in items">{{i.name}}</li></ul>') ;
402 _.rootScope.items = [{'name': 'a'}, {'name':'b'}];
403 _.rootScope.$digest();
404 expect(_.rootElement.text).toEqual('ab');
405
406 // Should not see this.
407 _.rootScope.items[0]['name'] = 'x';
408 _.rootScope.$digest();
409 expect(_.rootElement.text).toEqual('ab');
410
411 // We see additions but not changse
412 _.rootScope.items.add({'name': 'C'});
413 _.rootScope.$digest();
414 expect(_.rootElement.text).toEqual('abC');
415
416
417 // Cloning list does a full update
418 _.rootScope.items = new List.from(_.rootScope.items);
419 _.rootScope.$digest();
420 expect(_.rootElement.text).toEqual('xbC');
421 });
422 });
423 }); 397 });
424 } 398 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698