]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/test/specs/Container.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / test / specs / Container.js
CommitLineData
6527f429
DM
1describe("Ext.Container", function() {\r
2 var ct;\r
3\r
4 afterEach(function() {\r
5 ct = Ext.destroy(ct);\r
6 });\r
7\r
8 function makeContainer(cfg) {\r
9 if (Ext.isArray(cfg)) {\r
10 cfg = {\r
11 items: cfg\r
12 };\r
13 }\r
14 ct = new Ext.container.Container(cfg);\r
15 return ct;\r
16 }\r
17 \r
18 describe("add", function() {\r
19 beforeEach(function() {\r
20 makeContainer();\r
21 });\r
22 \r
23 it("should return the item when adding single item", function() {\r
24 var c = ct.add({\r
25 xtype: 'component'\r
26 });\r
27 \r
28 expect(ct.items.getAt(0)).toBe(c);\r
29 });\r
30 \r
31 it("should return the array of added items when passed an array", function() {\r
32 var cs = ct.add([{ xtype: 'component' }]);\r
33 \r
34 expect(Ext.isArray(cs)).toBe(true);\r
35 expect(cs.length).toBe(1);\r
36 expect(ct.items.getAt(0)).toBe(cs[0]);\r
37 });\r
38 \r
39 it("should return the array of added items when adding more than one", function() {\r
40 var cs = ct.add([\r
41 { xtype: 'component' },\r
42 { xtype: 'component' }\r
43 ]);\r
44 \r
45 expect(Ext.isArray(cs)).toBe(true);\r
46 expect(cs.length).toBe(2);\r
47 expect(ct.items.getAt(0)).toBe(cs[0]);\r
48 expect(ct.items.getAt(1)).toBe(cs[1]);\r
49 });\r
50 });\r
51 \r
52 describe("remove", function() {\r
53 var c0, c1;\r
54 \r
55 beforeEach(function() {\r
56 makeContainer({\r
57 items: [{\r
58 // itemIds are reversed to trip the tests\r
59 // if something goes wrong\r
60 xtype: 'component',\r
61 itemId: '1'\r
62 }, {\r
63 xtype: 'component',\r
64 itemId: '0'\r
65 }]\r
66 });\r
67 \r
68 c0 = ct.items.getAt(0);\r
69 c1 = ct.items.getAt(1);\r
70 });\r
71 \r
72 afterEach(function() {\r
73 Ext.destroy(c0, c1);\r
74 c0 = c1 = null;\r
75 });\r
76 \r
77 describe("by instance", function() {\r
78 it("should remove an item", function() {\r
79 ct.remove(c0);\r
80 \r
81 expect(ct.items.getCount()).toBe(1);\r
82 });\r
83 \r
84 it("should return the removed item", function() {\r
85 var ret = ct.remove(c0);\r
86 \r
87 expect(ret).toBe(c0);\r
88 });\r
89 \r
90 it("should destroy the item when asked to", function() {\r
91 var ret = ct.remove(c0, true);\r
92 \r
93 expect(ret.destroyed).toBe(true);\r
94 });\r
95 \r
96 it("should not remove the remaining item", function() {\r
97 var ret = ct.remove(c0);\r
98 \r
99 expect(ct.items.getAt(0)).toBe(c1);\r
100 });\r
101 });\r
102 \r
103 describe("by index", function() {\r
104 it("should remove an item", function() {\r
105 ct.remove(0);\r
106 \r
107 expect(ct.items.getCount()).toBe(1);\r
108 });\r
109 \r
110 it("should return the removed item", function() {\r
111 var ret = ct.remove(0);\r
112 \r
113 expect(ret).toBe(c0);\r
114 });\r
115 \r
116 it("should destroy the item when asked to", function() {\r
117 var ret = ct.remove(0, true);\r
118 \r
119 expect(ret.destroyed).toBe(true);\r
120 });\r
121 \r
122 it("should not remove the remaining item", function() {\r
123 ct.remove(0);\r
124 \r
125 expect(ct.items.getAt(0)).toBe(c1);\r
126 });\r
127 });\r
128 \r
129 describe("by itemId", function() {\r
130 it("should remove an item", function() {\r
131 ct.remove('0');\r
132 \r
133 expect(ct.items.getCount()).toBe(1);\r
134 });\r
135 \r
136 it("should return the removed item", function() {\r
137 var ret = ct.remove('0');\r
138 \r
139 expect(ret).toBe(c1);\r
140 });\r
141 \r
142 it("should destroy the item when asked to", function() {\r
143 var ret = ct.remove('0');\r
144 \r
145 expect(ret.destroyed).toBe(true);\r
146 });\r
147 \r
148 it("should not remove the remaining item", function() {\r
149 ct.remove('0');\r
150 \r
151 expect(ct.items.getAt(0)).toBe(c0);\r
152 });\r
153 });\r
154 });\r
155 \r
156 describe("removeAll", function() {\r
157 var c0, c1;\r
158 \r
159 beforeEach(function() {\r
160 makeContainer({\r
161 items: [{\r
162 xtype: 'component'\r
163 }, {\r
164 xtype: 'component'\r
165 }]\r
166 });\r
167 \r
168 c0 = ct.items.getAt(0);\r
169 c1 = ct.items.getAt(1);\r
170 });\r
171 \r
172 afterEach(function() {\r
173 Ext.destroy(c0, c1);\r
174 c0 = c1 = null;\r
175 });\r
176 \r
177 it("should remove all items", function() {\r
178 ct.removeAll();\r
179 \r
180 expect(ct.items.getCount()).toBe(0);\r
181 });\r
182 \r
183 it("should return the removed items", function() {\r
184 var ret = ct.removeAll();\r
185 \r
186 expect(Ext.isArray(ret)).toBe(true);\r
187 expect(ret.length).toBe(2);\r
188 expect(ret[0]).toBe(c0);\r
189 expect(ret[1]).toBe(c1);\r
190 });\r
191 \r
192 it("should destroy the items when asked", function() {\r
193 var ret = ct.removeAll(true);\r
194 \r
195 expect(ret[0].destroyed).toBe(true);\r
196 expect(ret[1].destroyed).toBe(true);\r
197 });\r
198 \r
199 // TODO removeAll(true, true)\r
200 xit("should remove everything", function() {\r
201 });\r
202 });\r
203 \r
204 describe("removeAt", function() {\r
205 var c0, c1;\r
206 \r
207 beforeEach(function() {\r
208 makeContainer({\r
209 items: [{\r
210 xtype: 'component'\r
211 }, {\r
212 xtype: 'component'\r
213 }]\r
214 });\r
215 \r
216 c0 = ct.items.getAt(0);\r
217 c1 = ct.items.getAt(1);\r
218 });\r
219 \r
220 afterEach(function() {\r
221 Ext.destroy(c0, c1);\r
222 c0 = c1 = null;\r
223 });\r
224 \r
225 it("should remove the item at index", function() {\r
226 ct.removeAt(0);\r
227 \r
228 expect(ct.items.getCount()).toBe(1);\r
229 });\r
230 \r
231 it("should return the removed item", function() {\r
232 var ret = ct.removeAt(0);\r
233 \r
234 expect(ret).toBe(c0);\r
235 });\r
236 \r
237 it("should not remove other items", function() {\r
238 ct.removeAt(0);\r
239 \r
240 expect(ct.items.getAt(0)).toBe(c1);\r
241 });\r
242 });\r
243 \r
244 // TODO Not sure what an inner item is and how to add it? - AT\r
245 xdescribe("removeInnerAt", function() {\r
246 });\r
247\r
248 describe("references", function() {\r
249 describe("static", function() {\r
250 it("should not be a reference holder by default", function() {\r
251 makeContainer({\r
252 items: {\r
253 xtype: 'component',\r
254 reference: 'a'\r
255 }\r
256 }); \r
257 expect(ct.lookupReference('foo')).toBeNull();\r
258 });\r
259 \r
260 it("should support a direct child", function() {\r
261 makeContainer({\r
262 referenceHolder: true,\r
263 items: {\r
264 xtype: 'component',\r
265 itemId: 'compA',\r
266 reference: 'a'\r
267 }\r
268 });\r
269 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
270 });\r
271 \r
272 it("should support a deep child", function() {\r
273 makeContainer({\r
274 referenceHolder: true,\r
275 items: {\r
276 xtype: 'container',\r
277 items: {\r
278 xtype: 'container',\r
279 items: {\r
280 xtype: 'container',\r
281 items: {\r
282 xtype: 'component',\r
283 itemId: 'compA',\r
284 reference: 'a'\r
285 }\r
286 }\r
287 }\r
288 }\r
289 });\r
290 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
291 });\r
292 \r
293 it("should support children at multiple depths", function() {\r
294 makeContainer({\r
295 referenceHolder: true,\r
296 items: [{\r
297 xtype: 'component',\r
298 itemId: 'compA',\r
299 reference: 'a'\r
300 }, {\r
301 xtype: 'container',\r
302 items: {\r
303 xtype: 'component',\r
304 itemId: 'compB',\r
305 reference: 'b'\r
306 }\r
307 }]\r
308 }); \r
309 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
310 expect(ct.lookupReference('b')).toBe(ct.down('#compB'));\r
311 });\r
312 \r
313 it("should support multiple children at the same depth", function() {\r
314 makeContainer({\r
315 referenceHolder: true,\r
316 items: [{\r
317 xtype: 'component',\r
318 itemId: 'compA',\r
319 reference: 'a'\r
320 }, {\r
321 xtype: 'component',\r
322 itemId: 'compB',\r
323 reference: 'b'\r
324 }]\r
325 });\r
326 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
327 expect(ct.lookupReference('b')).toBe(ct.down('#compB'));\r
328 });\r
329 \r
330 it("should support multiple children down the some tree", function() {\r
331 makeContainer({\r
332 referenceHolder: true,\r
333 items: [{\r
334 xtype: 'container',\r
335 itemId: 'compA',\r
336 reference: 'a',\r
337 items: {\r
338 xtype: 'container',\r
339 itemId: 'compB',\r
340 reference: 'b',\r
341 items: {\r
342 xtype: 'component',\r
343 itemId: 'compC',\r
344 reference: 'c'\r
345 }\r
346 }\r
347 }]\r
348 });\r
349 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
350 expect(ct.lookupReference('b')).toBe(ct.down('#compB'));\r
351 expect(ct.lookupReference('c')).toBe(ct.down('#compC'));\r
352 });\r
353 \r
354 it("should support a reference holder not being at the root", function() {\r
355 makeContainer({\r
356 items: {\r
357 xtype: 'container',\r
358 items: {\r
359 xtype: 'container',\r
360 itemId: 'ref',\r
361 referenceHolder: true,\r
362 items: {\r
363 xtype: 'container',\r
364 items: {\r
365 xtype: 'component',\r
366 itemId: 'compA',\r
367 reference: 'a'\r
368 }\r
369 }\r
370 }\r
371 }\r
372 }); \r
373 var ref = ct.down('#ref');\r
374 expect(ref.lookupReference('a')).toBe(ref.down('#compA'));\r
375 });\r
376 \r
377 it("should support multiple ref holders in a tree", function() {\r
378 makeContainer({\r
379 referenceHolder: true,\r
380 items: {\r
381 xtype: 'container',\r
382 itemId: 'compA',\r
383 reference: 'a',\r
384 items: {\r
385 xtype: 'container',\r
386 referenceHolder: true,\r
387 itemId: 'ref',\r
388 items: {\r
389 xtype: 'container',\r
390 items: {\r
391 xtype: 'component',\r
392 itemId: 'compB',\r
393 reference: 'b'\r
394 }\r
395 }\r
396 }\r
397 }\r
398 });\r
399 var ref = ct.down('#ref');\r
400 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
401 expect(ref.lookupReference('b')).toBe(ref.down('#compB'));\r
402 });\r
403 \r
404 it("should hide inner references from outer holders", function() {\r
405 makeContainer({\r
406 referenceHolder: true,\r
407 items: {\r
408 xtype: 'container',\r
409 itemId: 'compA',\r
410 reference: 'a',\r
411 items: {\r
412 xtype: 'container',\r
413 referenceHolder: true,\r
414 itemId: 'ref',\r
415 items: {\r
416 xtype: 'container',\r
417 items: {\r
418 xtype: 'component',\r
419 itemId: 'compB',\r
420 reference: 'b'\r
421 }\r
422 }\r
423 }\r
424 }\r
425 });\r
426 expect(ct.lookupReference('b')).toBeNull();\r
427 });\r
428 \r
429 it("should allow a reference holder to have a reference", function() {\r
430 makeContainer({\r
431 referenceHolder: true,\r
432 items: {\r
433 referenceHolder: true,\r
434 xtype: 'container',\r
435 itemId: 'compA',\r
436 reference: 'a',\r
437 items: {\r
438 xtype: 'container',\r
439 itemId: 'compB',\r
440 reference: 'b'\r
441 }\r
442 }\r
443 });\r
444 \r
445 var inner = ct.down('#compA');\r
446 \r
447 expect(inner.lookupReference('b')).toBe(inner.down('#compB'));\r
448 expect(ct.lookupReference('a')).toBe(inner);\r
449 });\r
450 \r
451 describe("docking", function() {\r
452 it("should get a reference to a direct child", function() {\r
453 makeContainer({\r
454 referenceHolder: true,\r
455 items: {\r
456 docked: 'top',\r
457 xtype: 'component',\r
458 itemId: 'compA',\r
459 reference: 'a'\r
460 }\r
461 });\r
462 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
463 });\r
464 \r
465 it("should get a reference to an indirect child", function() {\r
466 makeContainer({\r
467 referenceHolder: true,\r
468 items: {\r
469 xtype: 'container',\r
470 docked: 'top',\r
471 items: {\r
472 xtype: 'component',\r
473 itemId: 'compA',\r
474 reference: 'a'\r
475 }\r
476 }\r
477 });\r
478 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
479 });\r
480 });\r
481 \r
482 describe("chained references", function() {\r
483 it("should gain a reference to a deep child", function() {\r
484 makeContainer({\r
485 referenceHolder: true,\r
486 items: [{\r
487 xtype: 'container',\r
488 reference: 'parent>',\r
489 items: {\r
490 xtype: 'component',\r
491 itemId: 'compA',\r
492 reference: 'a'\r
493 }\r
494 }]\r
495 });\r
496 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
497 });\r
498 \r
499 it("should strip the > from the parent reference", function() {\r
500 makeContainer({\r
501 referenceHolder: true,\r
502 items: [{\r
503 xtype: 'container',\r
504 reference: 'a>',\r
505 itemId: 'compA',\r
506 items: {\r
507 xtype: 'component',\r
508 reference: 'b'\r
509 }\r
510 }]\r
511 });\r
512 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
513 });\r
514 \r
515 it("should allow the parent to be reference even if there's no children", function() {\r
516 makeContainer({\r
517 referenceHolder: true,\r
518 items: [{\r
519 xtype: 'container',\r
520 reference: 'a>',\r
521 itemId: 'compA'\r
522 }]\r
523 });\r
524 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
525 });\r
526 \r
527 it("should not setup a deep reference if the there's an intervening referenceHolder", function() {\r
528 makeContainer({\r
529 referenceHolder: true,\r
530 items: [{\r
531 xtype: 'container',\r
532 referenceHolder: true,\r
533 reference: 'a>',\r
534 items: {\r
535 xtype: 'component',\r
536 reference: 'b'\r
537 }\r
538 }]\r
539 });\r
540 expect(ct.lookupReference('b')).toBeNull();\r
541 });\r
542 \r
543 it("should allow for a multiple depth reference", function() {\r
544 makeContainer({\r
545 referenceHolder: true,\r
546 items: [{\r
547 xtype: 'container',\r
548 reference: 'a>',\r
549 items: {\r
550 xtype: 'container',\r
551 reference: 'b>',\r
552 items: {\r
553 xtype: 'container',\r
554 reference: 'c>',\r
555 items: {\r
556 xtype: 'container',\r
557 reference: 'd>',\r
558 items: {\r
559 xtype: 'component',\r
560 reference: 'e',\r
561 itemId: 'compE'\r
562 }\r
563 }\r
564 }\r
565 }\r
566 }]\r
567 });\r
568 expect(ct.lookupReference('a.b.c.d.e')).toBe(ct.down('#compE'));\r
569 });\r
570 \r
571 it("should isolate references by parent", function() {\r
572 makeContainer({\r
573 referenceHolder: true,\r
574 items: [{\r
575 xtype: 'container',\r
576 reference: 'parent1>',\r
577 items: {\r
578 xtype: 'component',\r
579 reference: 'child',\r
580 itemId: 'compA'\r
581 }\r
582 }, {\r
583 xtype: 'container',\r
584 reference: 'parent2>',\r
585 items: {\r
586 xtype: 'component',\r
587 reference: 'child',\r
588 itemId: 'compB'\r
589 }\r
590 }]\r
591 });\r
592 expect(ct.lookupReference('parent1.child')).toBe(ct.down('#compA'));\r
593 expect(ct.lookupReference('parent2.child')).toBe(ct.down('#compB'));\r
594 });\r
595 \r
596 it("should allow the reference holder to begin at any depth", function() {\r
597 makeContainer({\r
598 items: [{\r
599 xtype: 'container',\r
600 reference: 'a>',\r
601 items: {\r
602 xtype: 'container',\r
603 reference: 'b>',\r
604 items: {\r
605 xtype: 'container',\r
606 referenceHolder: true,\r
607 reference: 'c>',\r
608 itemId: 'compC',\r
609 items: {\r
610 xtype: 'container',\r
611 reference: 'd>',\r
612 items: {\r
613 xtype: 'component',\r
614 reference: 'e',\r
615 itemId: 'compE'\r
616 }\r
617 }\r
618 }\r
619 }\r
620 }]\r
621 });\r
622 var inner = ct.down('#compC');\r
623 expect(inner.lookupReference('d.e')).toBe(ct.down('#compE'));\r
624 });\r
625 \r
626 it("should allow multiple references in the tree", function() {\r
627 makeContainer({\r
628 referenceHolder: true,\r
629 items: [{\r
630 xtype: 'container',\r
631 reference: 'a>',\r
632 itemId: 'compA',\r
633 items: {\r
634 xtype: 'container',\r
635 reference: 'b>',\r
636 itemId: 'compB',\r
637 items: {\r
638 xtype: 'container',\r
639 referenceHolder: true,\r
640 reference: 'c>',\r
641 itemId: 'compC',\r
642 items: {\r
643 xtype: 'container',\r
644 reference: 'd>',\r
645 itemId: 'compD',\r
646 items: {\r
647 xtype: 'component',\r
648 reference: 'e',\r
649 itemId: 'compE'\r
650 }\r
651 }\r
652 }\r
653 }\r
654 }]\r
655 });\r
656 expect(ct.lookupReference('a.b')).toBe(ct.down('#compB'));\r
657 expect(ct.lookupReference('a.b.c')).toBe(ct.down('#compC'));\r
658 expect(ct.lookupReference('a.b.c.d')).toBeNull();\r
659 expect(ct.lookupReference('a.b.c.d.e')).toBeNull();\r
660 }); \r
661 \r
662 describe("docking", function() {\r
663 it("should get a reference to an indirect child", function() {\r
664 makeContainer({\r
665 referenceHolder: true,\r
666 items: {\r
667 xtype: 'container',\r
668 docked: 'top',\r
669 reference: 'a>',\r
670 items: {\r
671 xtype: 'component',\r
672 itemId: 'compB',\r
673 reference: 'b'\r
674 }\r
675 }\r
676 });\r
677 expect(ct.lookupReference('a.b')).toBe(ct.down('#compB'));\r
678 });\r
679 });\r
680 });\r
681 });\r
682 \r
683 describe("dynamic", function() {\r
684 describe("adding", function() {\r
685 it("should gain a reference to a direct child", function() {\r
686 makeContainer({\r
687 referenceHolder: true\r
688 });\r
689 ct.add({\r
690 xtype: 'component',\r
691 itemId: 'compA',\r
692 reference: 'a'\r
693 });\r
694 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
695 }); \r
696 \r
697 it("should gain a reference to an indirect child", function() {\r
698 makeContainer({\r
699 referenceHolder: true\r
700 });\r
701 ct.add({\r
702 xtype: 'container',\r
703 items: {\r
704 xtype: 'component',\r
705 itemId: 'compA',\r
706 reference: 'a'\r
707 }\r
708 });\r
709 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
710 });\r
711 \r
712 it("should gain a reference to a component inside an already constructed container", function() {\r
713 var local = new Ext.container.Container({\r
714 items: {\r
715 xtype: 'component',\r
716 itemId: 'compA',\r
717 reference: 'a'\r
718 }\r
719 }); \r
720 \r
721 makeContainer({\r
722 referenceHolder: true,\r
723 items: local\r
724 });\r
725 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
726 });\r
727 \r
728 it("should gain a reference to a component added to containers child", function() {\r
729 makeContainer({\r
730 referenceHolder: true,\r
731 items: {\r
732 xtype: 'container'\r
733 }\r
734 }); \r
735 ct.items.first().add({\r
736 xtype: 'component',\r
737 itemId: 'compA',\r
738 reference: 'a'\r
739 }); \r
740 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
741 });\r
742 \r
743 describe("chained references", function() {\r
744 it("should gain a reference to an indirect child", function() {\r
745 makeContainer({\r
746 referenceHolder: true\r
747 });\r
748 ct.add({\r
749 xtype: 'container',\r
750 reference: 'parent>',\r
751 items: {\r
752 xtype: 'component',\r
753 itemId: 'compA',\r
754 reference: 'a'\r
755 }\r
756 });\r
757 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
758 });\r
759\r
760 it("should gain a reference to a component inside an already constructed container", function() {\r
761 var local = new Ext.container.Container({\r
762 reference: 'parent>',\r
763 items: {\r
764 xtype: 'component',\r
765 itemId: 'compA',\r
766 reference: 'a'\r
767 }\r
768 }); \r
769\r
770 makeContainer({\r
771 referenceHolder: true,\r
772 items: local\r
773 });\r
774 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
775 });\r
776\r
777 it("should gain a reference to a component added to containers child", function() {\r
778 makeContainer({\r
779 referenceHolder: true,\r
780 items: {\r
781 xtype: 'container',\r
782 reference: 'parent>'\r
783 }\r
784 }); \r
785 ct.items.first().add({\r
786 xtype: 'component',\r
787 itemId: 'compA',\r
788 reference: 'a'\r
789 }); \r
790 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
791 });\r
792 \r
793 describe("docking", function() {\r
794 it("should gain a reference to an indirect child", function() {\r
795 makeContainer({\r
796 referenceHolder: true\r
797 });\r
798 ct.add({\r
799 xtype: 'container',\r
800 docked: 'top',\r
801 reference: 'parent>',\r
802 items: {\r
803 xtype: 'component',\r
804 itemId: 'compA',\r
805 reference: 'a'\r
806 }\r
807 });\r
808 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
809 });\r
810\r
811 it("should gain a reference to a component inside an already constructed container", function() {\r
812 var local = new Ext.container.Container({\r
813 docked: 'top',\r
814 reference: 'parent>',\r
815 items: {\r
816 xtype: 'component',\r
817 itemId: 'compA',\r
818 reference: 'a'\r
819 }\r
820 }); \r
821\r
822 makeContainer({\r
823 referenceHolder: true,\r
824 items: local\r
825 });\r
826 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
827 });\r
828\r
829 it("should gain a reference to a component added to containers child", function() {\r
830 makeContainer({\r
831 referenceHolder: true,\r
832 items: {\r
833 docked: 'top',\r
834 xtype: 'container',\r
835 itemId: 'docked',\r
836 reference: 'parent>'\r
837 }\r
838 }); \r
839 ct.down('#docked').add({\r
840 xtype: 'component',\r
841 itemId: 'compA',\r
842 reference: 'a'\r
843 }); \r
844 expect(ct.lookupReference('parent.a')).toBe(ct.down('#compA'));\r
845 });\r
846 });\r
847 });\r
848 \r
849 describe("docking", function() {\r
850 it("should gain a reference to a direct child", function() {\r
851 makeContainer({\r
852 referenceHolder: true\r
853 });\r
854 ct.add({\r
855 xtype: 'component',\r
856 docked: 'top',\r
857 itemId: 'compA',\r
858 reference: 'a'\r
859 });\r
860 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
861 }); \r
862 \r
863 it("should gain a reference to an indirect child", function() {\r
864 makeContainer({\r
865 referenceHolder: true\r
866 });\r
867 ct.add({\r
868 xtype: 'container',\r
869 docked: 'top',\r
870 items: {\r
871 xtype: 'component',\r
872 itemId: 'compA',\r
873 reference: 'a'\r
874 }\r
875 });\r
876 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
877 });\r
878 \r
879 it("should gain a reference to a component inside an already constructed container", function() {\r
880 var local = new Ext.container.Container({\r
881 docked: 'top',\r
882 items: {\r
883 xtype: 'component',\r
884 itemId: 'compA',\r
885 reference: 'a'\r
886 }\r
887 }); \r
888 \r
889 makeContainer({\r
890 referenceHolder: true,\r
891 items: local\r
892 });\r
893 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
894 });\r
895 \r
896 it("should gain a reference to a component added to containers child", function() {\r
897 makeContainer({\r
898 referenceHolder: true,\r
899 items: {\r
900 xtype: 'container',\r
901 docked: 'top',\r
902 itemId: 'docked'\r
903 }\r
904 }); \r
905 ct.down('#docked').add({\r
906 xtype: 'component',\r
907 itemId: 'compA',\r
908 reference: 'a'\r
909 }); \r
910 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
911 });\r
912 }); \r
913 });\r
914 \r
915 describe("removing", function() {\r
916 it("should not have a reference when removing a direct child", function() {\r
917 makeContainer({\r
918 referenceHolder: true,\r
919 items: {\r
920 xtype: 'component',\r
921 reference: 'a'\r
922 }\r
923 }); \r
924 var c = ct.lookupReference('a');\r
925 c.destroy();\r
926 expect(ct.lookupReference('a')).toBeNull();\r
927 });\r
928 \r
929 it("should not have a reference when removing an indirect child", function() {\r
930 makeContainer({\r
931 referenceHolder: true,\r
932 items: {\r
933 xtype: 'container',\r
934 items: {\r
935 xtype: 'component',\r
936 reference: 'a'\r
937 }\r
938 }\r
939 }); \r
940 var c = ct.lookupReference('a');\r
941 c.destroy();\r
942 expect(ct.lookupReference('a')).toBeNull();\r
943 });\r
944 \r
945 it("should not have a reference when removing+destroying a container that has references", function() {\r
946 makeContainer({\r
947 referenceHolder: true,\r
948 items: {\r
949 xtype: 'container',\r
950 items: {\r
951 xtype: 'component',\r
952 reference: 'a'\r
953 }\r
954 }\r
955 }); \r
956 var c = ct.lookupReference('a');\r
957 var removed = ct.remove(0);\r
958 expect(ct.lookupReference('a')).toBeNull();\r
959 removed.destroy();\r
960 });\r
961 \r
962 it("should not have a reference when only removing a container that has references", function() {\r
963 makeContainer({\r
964 id: 'a',\r
965 referenceHolder: true,\r
966 items: {\r
967 id: 'b',\r
968 xtype: 'container',\r
969 items: {\r
970 id: 'c',\r
971 xtype: 'component',\r
972 reference: 'a'\r
973 }\r
974 }\r
975 });\r
976 \r
977 var c = ct.lookupReference('a');\r
978 var removed = ct.remove(0, false);\r
979 expect(ct.lookupReference('a')).toBeNull();\r
980 removed.destroy();\r
981 });\r
982 \r
983 describe("chained references", function() {\r
984 it("should not have a reference when removing an indirect child", function() {\r
985 makeContainer({\r
986 referenceHolder: true,\r
987 items: {\r
988 xtype: 'container',\r
989 reference: 'parent>',\r
990 items: {\r
991 xtype: 'component',\r
992 reference: 'a'\r
993 }\r
994 }\r
995 }); \r
996 var c = ct.lookupReference('parent.a');\r
997 c.destroy();\r
998 expect(ct.lookupReference('parent.a')).toBeNull();\r
999 });\r
1000\r
1001 it("should not have a reference when removing+destroying a container that has references", function() {\r
1002 makeContainer({\r
1003 referenceHolder: true,\r
1004 items: {\r
1005 xtype: 'container',\r
1006 reference: 'parent>',\r
1007 items: {\r
1008 xtype: 'component',\r
1009 reference: 'a'\r
1010 }\r
1011 }\r
1012 }); \r
1013 var c = ct.lookupReference('parent.a');\r
1014 var removed = ct.remove(0);\r
1015 expect(ct.lookupReference('parent.a')).toBeNull();\r
1016 removed.destroy();\r
1017 });\r
1018\r
1019 it("should not have a reference when only removing a container that has references", function() {\r
1020 makeContainer({\r
1021 referenceHolder: true,\r
1022 items: {\r
1023 xtype: 'container',\r
1024 reference: 'parent>',\r
1025 items: {\r
1026 xtype: 'component',\r
1027 reference: 'a'\r
1028 }\r
1029 }\r
1030 }); \r
1031 var c = ct.lookupReference('parent.a');\r
1032 var removed = ct.remove(0, false);\r
1033 expect(ct.lookupReference('parent.a')).toBeNull();\r
1034 removed.destroy();\r
1035 });\r
1036 \r
1037 describe("docking", function() {\r
1038 it("should not have a reference when removing an indirect child", function() {\r
1039 makeContainer({\r
1040 referenceHolder: true,\r
1041 items: {\r
1042 xtype: 'container',\r
1043 docked: 'top',\r
1044 reference: 'parent>',\r
1045 items: {\r
1046 xtype: 'component',\r
1047 reference: 'a'\r
1048 }\r
1049 }\r
1050 }); \r
1051 var c = ct.lookupReference('parent.a');\r
1052 c.destroy();\r
1053 expect(ct.lookupReference('parent.a')).toBeNull();\r
1054 });\r
1055\r
1056 it("should not have a reference when removing+destroying a container that has references", function() {\r
1057 makeContainer({\r
1058 referenceHolder: true,\r
1059 items: {\r
1060 xtype: 'container',\r
1061 docked: 'top',\r
1062 itemId: 'docked',\r
1063 reference: 'parent>',\r
1064 items: {\r
1065 xtype: 'component',\r
1066 reference: 'a'\r
1067 }\r
1068 }\r
1069 }); \r
1070 var dock = ct.down('#docked');\r
1071\r
1072 ct.remove(dock);\r
1073 expect(ct.lookupReference('parent.a')).toBeNull();\r
1074 });\r
1075\r
1076 it("should not have a reference when only removing a container that has references", function() {\r
1077 makeContainer({\r
1078 referenceHolder: true,\r
1079 items: {\r
1080 xtype: 'container',\r
1081 docked: 'top',\r
1082 itemId: 'docked',\r
1083 reference: 'parent>',\r
1084 items: {\r
1085 xtype: 'component',\r
1086 reference: 'a'\r
1087 }\r
1088 }\r
1089 }); \r
1090 var dock = ct.down('#docked');\r
1091\r
1092 var removed = ct.remove(dock, false);\r
1093 expect(ct.lookupReference('parent.a')).toBeNull();\r
1094 removed.destroy();\r
1095 }); \r
1096 });\r
1097 });\r
1098 \r
1099 describe("docking", function() {\r
1100 it("should not have a reference when removing a direct child", function() {\r
1101 makeContainer({\r
1102 referenceHolder: true,\r
1103 items: {\r
1104 xtype: 'component',\r
1105 docked: 'top',\r
1106 reference: 'a'\r
1107 }\r
1108 }); \r
1109 var c = ct.lookupReference('a');\r
1110 c.destroy();\r
1111 expect(ct.lookupReference('a')).toBeNull();\r
1112 });\r
1113 \r
1114 it("should not have a reference when removing an indirect child", function() {\r
1115 makeContainer({\r
1116 referenceHolder: true,\r
1117 items: {\r
1118 xtype: 'container',\r
1119 docked: 'top',\r
1120 items: {\r
1121 xtype: 'component',\r
1122 reference: 'a'\r
1123 }\r
1124 }\r
1125 }); \r
1126 var c = ct.lookupReference('a');\r
1127 c.destroy();\r
1128 expect(ct.lookupReference('a')).toBeNull();\r
1129 });\r
1130 \r
1131 it("should not have a reference when removing+destroying a container that has references", function() {\r
1132 makeContainer({\r
1133 referenceHolder: true,\r
1134 items: {\r
1135 xtype: 'container',\r
1136 docked: 'top',\r
1137 itemId: 'docked',\r
1138 items: {\r
1139 xtype: 'component',\r
1140 reference: 'a'\r
1141 }\r
1142 }\r
1143 }); \r
1144 var dock = ct.down('#docked');\r
1145 \r
1146 ct.remove(dock);\r
1147 expect(ct.lookupReference('a')).toBeNull();\r
1148 });\r
1149 \r
1150 xit("should not have a reference when only removing a container that has references", function() {\r
1151 makeContainer({\r
1152 referenceHolder: true,\r
1153 dockedItems: {\r
1154 xtype: 'container',\r
1155 docked: 'top',\r
1156 itemId: 'docked',\r
1157 items: {\r
1158 xtype: 'component',\r
1159 reference: 'a'\r
1160 }\r
1161 }\r
1162 });\r
1163 \r
1164 var dock = ct.down('#docked');\r
1165 \r
1166 var removed = ct.remove(dock, false);\r
1167 expect(ct.lookupReference('a')).toBeNull();\r
1168 removed.destroy();\r
1169 }); \r
1170 });\r
1171 });\r
1172 });\r
1173\r
1174 describe("setup", function() {\r
1175 it("should not create references on the rootInheritedState if not requested", function() {\r
1176 var vp = new Ext.viewport.Default({\r
1177 referenceHolder: true\r
1178 });\r
1179\r
1180 var temp = new Ext.container.Container({\r
1181 items: {\r
1182 xtype: 'component',\r
1183 reference: 'a'\r
1184 }\r
1185 });\r
1186\r
1187 var c = temp.items.first();\r
1188\r
1189\r
1190 ct = new Ext.container.Container({\r
1191 referenceHolder: true,\r
1192 items: temp\r
1193 });\r
1194\r
1195 expect(vp.lookupReference('a')).toBeNull();\r
1196 expect(ct.lookupReference('a')).toBe(c);\r
1197\r
1198 vp.destroy();\r
1199 });\r
1200 });\r
1201 });\r
1202\r
1203 describe("view controllers", function() {\r
1204 var Controller;\r
1205 beforeEach(function() {\r
1206 Controller = Ext.define('spec.TestController', {\r
1207 extend: 'Ext.app.ViewController',\r
1208 alias: 'controller.test'\r
1209 });\r
1210 });\r
1211 \r
1212 afterEach(function() {\r
1213 Controller = null;\r
1214 Ext.undefine('spec.TestController');\r
1215 Ext.Factory.controller.instance.clearCache();\r
1216 });\r
1217 \r
1218 it("should use a defined controller as a referenceHolder", function() {\r
1219 makeContainer({\r
1220 controller: 'test',\r
1221 items: {\r
1222 xtype: 'component',\r
1223 itemId: 'compA',\r
1224 reference: 'a'\r
1225 }\r
1226 }); \r
1227 expect(ct.lookupReference('a')).toBe(ct.down('#compA'));\r
1228 }); \r
1229 });\r
1230 \r
1231 describe("defaultListenerScope", function() {\r
1232 describe("static", function() {\r
1233 it("should fire on a direct parent", function() {\r
1234 makeContainer({\r
1235 defaultListenerScope: true,\r
1236 items: {\r
1237 xtype: 'container',\r
1238 itemId: 'compA',\r
1239 listeners: {\r
1240 custom: 'callFn'\r
1241 }\r
1242 }\r
1243 });\r
1244 ct.callFn = jasmine.createSpy();\r
1245 ct.down('#compA').fireEvent('custom');\r
1246 expect(ct.callFn).toHaveBeenCalled(); \r
1247 });\r
1248\r
1249 it("should fire on an indirect parent", function() {\r
1250 makeContainer({\r
1251 defaultListenerScope: true,\r
1252 items: {\r
1253 xtype: 'container',\r
1254 items: {\r
1255 xtype: 'container',\r
1256 itemId: 'compA',\r
1257 listeners: {\r
1258 custom: 'callFn'\r
1259 }\r
1260 }\r
1261 }\r
1262 });\r
1263 ct.callFn = jasmine.createSpy();\r
1264 ct.down('#compA').fireEvent('custom');\r
1265 expect(ct.callFn).toHaveBeenCalled(); \r
1266 });\r
1267\r
1268 it("should fire children in the same tree", function() {\r
1269 makeContainer({\r
1270 defaultListenerScope: true,\r
1271 items: {\r
1272 xtype: 'container',\r
1273 itemId: 'compA',\r
1274 listeners: {\r
1275 custom: 'callFn'\r
1276 },\r
1277 items: {\r
1278 xtype: 'container',\r
1279 itemId: 'compB',\r
1280 listeners: {\r
1281 custom: 'callFn'\r
1282 }\r
1283 }\r
1284 }\r
1285 });\r
1286 ct.callFn = jasmine.createSpy();\r
1287 ct.down('#compA').fireEvent('custom');\r
1288 ct.down('#compB').fireEvent('custom');\r
1289 expect(ct.callFn.callCount).toBe(2); \r
1290 });\r
1291\r
1292 it("should fire when the ref holder isn't at the root", function() {\r
1293 makeContainer({\r
1294 items: {\r
1295 defaultListenerScope: true,\r
1296 xtype: 'container',\r
1297 itemId: 'compA',\r
1298 items: {\r
1299 xtype: 'container',\r
1300 itemId: 'compB',\r
1301 listeners: {\r
1302 custom: 'callFn'\r
1303 }\r
1304 }\r
1305 }\r
1306 });\r
1307 var c = ct.down('#compA'); \r
1308 c.callFn = jasmine.createSpy();\r
1309 ct.down('#compB').fireEvent('custom');\r
1310 expect(c.callFn).toHaveBeenCalled(); \r
1311 });\r
1312\r
1313 it("should only fire the event at the closest defaultListenerScope holder", function() {\r
1314 makeContainer({\r
1315 defaultListenerScope: true,\r
1316 items: {\r
1317 defaultListenerScope: true,\r
1318 xtype: 'container',\r
1319 itemId: 'compA',\r
1320 items: {\r
1321 xtype: 'container',\r
1322 itemId: 'compB',\r
1323 listeners: {\r
1324 custom: 'callFn'\r
1325 }\r
1326 }\r
1327 }\r
1328 });\r
1329 var c = ct.down('#compA');\r
1330 ct.callFn = jasmine.createSpy();\r
1331 c.callFn = jasmine.createSpy();\r
1332\r
1333 ct.down('#compB').fireEvent('custom');\r
1334 expect(c.callFn).toHaveBeenCalled();\r
1335 expect(ct.callFn).not.toHaveBeenCalled(); \r
1336 });\r
1337 });\r
1338 \r
1339 describe("dynamic", function() {\r
1340 it("should fire on a direct parent", function() {\r
1341 makeContainer({\r
1342 defaultListenerScope: true\r
1343 });\r
1344\r
1345 var c = ct.add({\r
1346 xtype: 'component',\r
1347 listeners: {\r
1348 custom: 'callFn'\r
1349 }\r
1350 });\r
1351\r
1352 ct.callFn = jasmine.createSpy();\r
1353 c.fireEvent('custom');\r
1354 expect(ct.callFn).toHaveBeenCalled();\r
1355 });\r
1356\r
1357 it("should fire on an indirect parent", function() {\r
1358 makeContainer({\r
1359 defaultListenerScope: true,\r
1360 items: {\r
1361 xtype: 'container'\r
1362 }\r
1363 });\r
1364\r
1365 var c = ct.items.first().add({\r
1366 xtype: 'component',\r
1367 listeners: {\r
1368 custom: 'callFn'\r
1369 }\r
1370 });\r
1371\r
1372 ct.callFn = jasmine.createSpy();\r
1373 c.fireEvent('custom');\r
1374 expect(ct.callFn).toHaveBeenCalled();\r
1375 });\r
1376\r
1377 it("should resolve a new method in a new hierarchy", function() {\r
1378 makeContainer({\r
1379 defaultListenerScope: true,\r
1380 items: {\r
1381 xtype: 'component',\r
1382 itemId: 'compA',\r
1383 listeners: {\r
1384 custom: 'callFn'\r
1385 }\r
1386 }\r
1387 });\r
1388\r
1389 var other = new Ext.container.Container({\r
1390 defaultListenerScope: true\r
1391 });\r
1392\r
1393 var c = ct.down('#compA');\r
1394\r
1395 ct.callFn = jasmine.createSpy();\r
1396 other.callFn = jasmine.createSpy();\r
1397\r
1398 c.fireEvent('custom');\r
1399 expect(ct.callFn).toHaveBeenCalled();\r
1400\r
1401 other.add(c);\r
1402 ct.callFn.reset();\r
1403 c.fireEvent('custom');\r
1404\r
1405 expect(ct.callFn).not.toHaveBeenCalled();\r
1406 expect(other.callFn).toHaveBeenCalled();\r
1407\r
1408 other.destroy();\r
1409 });\r
1410\r
1411 it("should resolve a new method in the same hierarchy", function() {\r
1412 makeContainer({\r
1413 defaultListenerScope: true,\r
1414 items: {\r
1415 defaultListenerScope: true,\r
1416 xtype: 'container',\r
1417 itemId: 'compA',\r
1418 items: {\r
1419 xtype: 'component',\r
1420 itemId: 'compB',\r
1421 listeners: {\r
1422 custom: 'callFn'\r
1423 }\r
1424 }\r
1425 }\r
1426 });\r
1427\r
1428 var inner = ct.down('#compA'),\r
1429 c = ct.down('#compB');\r
1430\r
1431 ct.callFn = jasmine.createSpy();\r
1432 inner.callFn = jasmine.createSpy();\r
1433\r
1434 c.fireEvent('custom');\r
1435 expect(inner.callFn).toHaveBeenCalled();\r
1436 expect(ct.callFn).not.toHaveBeenCalled();\r
1437\r
1438 ct.add(c);\r
1439 inner.callFn.reset();\r
1440\r
1441 c.fireEvent('custom');\r
1442 expect(ct.callFn).toHaveBeenCalled();\r
1443 expect(inner.callFn).not.toHaveBeenCalled();\r
1444 });\r
1445 });\r
1446 });\r
1447\r
1448});