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

Side by Side Diff: pkg/template_binding/test/template_element_test.dart

Issue 34453003: Rename mdv -> template_binding, remove experiemntal apis from dart:html (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 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
« no previous file with comments | « pkg/template_binding/test/node_bindings_test.dart ('k') | pkg/template_binding/test/utils.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library template_element_test; 5 library template_binding.test.template_element_test;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:html'; 9 import 'dart:html';
10 import 'dart:math' as math; 10 import 'dart:math' as math;
11 import 'package:mdv/mdv.dart' as mdv;
12 import 'package:observe/observe.dart'; 11 import 'package:observe/observe.dart';
12 import 'package:template_binding/template_binding.dart';
13 import 'package:unittest/html_config.dart'; 13 import 'package:unittest/html_config.dart';
14 import 'package:unittest/unittest.dart'; 14 import 'package:unittest/unittest.dart';
15 import 'mdv_test_utils.dart'; 15 import 'utils.dart';
16 16
17 // Note: this file ported from 17 // Note: this file ported from
18 // https://github.com/toolkitchen/mdv/blob/master/tests/template_element.js 18 // https://github.com/toolkitchen/mdv/blob/master/tests/template_element.js
19 // TODO(jmesserly): submit a small cleanup patch to original. I fixed some 19 // TODO(jmesserly): submit a small cleanup patch to original. I fixed some
20 // cases where "div" and "t" were unintentionally using the JS global scope; 20 // cases where "div" and "t" were unintentionally using the JS global scope;
21 // look for "assertNodesAre". 21 // look for "assertNodesAre".
22 22
23 main() { 23 main() {
24 mdv.initialize();
25 useHtmlConfiguration(); 24 useHtmlConfiguration();
26 group('Template Element', templateElementTests); 25 group('Template Element', templateElementTests);
27 } 26 }
28 27
29 templateElementTests() { 28 templateElementTests() {
30 var testDiv;
31
32 setUp(() { 29 setUp(() {
33 document.body.append(testDiv = new DivElement()); 30 document.body.append(testDiv = new DivElement());
34 }); 31 });
35 32
36 tearDown(() { 33 tearDown(() {
37 testDiv.remove(); 34 testDiv.remove();
38 testDiv = null; 35 testDiv = null;
39 }); 36 });
40 37
41 createTestHtml(s) {
42 var div = new DivElement();
43 div.setInnerHtml(s, treeSanitizer: new NullTreeSanitizer());
44 testDiv.append(div);
45
46 for (var node in div.queryAll('*')) {
47 if (node.isTemplate) TemplateElement.decorate(node);
48 }
49
50 return div;
51 }
52
53 createShadowTestHtml(s) {
54 var div = new DivElement();
55 var root = div.createShadowRoot();
56 root.innerHtml = s;
57 testDiv.append(div);
58
59 for (var node in root.queryAll('*')) {
60 if (node.isTemplate) TemplateElement.decorate(node);
61 }
62
63 return root;
64 }
65
66 var expando = new Expando('observeTest'); 38 var expando = new Expando('observeTest');
67 void addExpandos(node) { 39 void addExpandos(node) {
68 while (node != null) { 40 while (node != null) {
69 expando[node] = node.text; 41 expando[node] = node.text;
70 node = node.nextNode; 42 node = node.nextNode;
71 } 43 }
72 } 44 }
73 45
74 void checkExpandos(node) { 46 void checkExpandos(node) {
75 expect(node, isNotNull); 47 expect(node, isNotNull);
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 expect(div.nodes.length, 4); 382 expect(div.nodes.length, 4);
411 383
412 model.removeRange(1, 2); 384 model.removeRange(1, 2);
413 deliverChanges(model); 385 deliverChanges(model);
414 expect(div.nodes.length, 3); 386 expect(div.nodes.length, 3);
415 }); 387 });
416 388
417 observeTest('Removal from iteration needs to unbind', () { 389 observeTest('Removal from iteration needs to unbind', () {
418 var div = createTestHtml( 390 var div = createTestHtml(
419 '<template repeat="{{}}"><a>{{v}}</a></template>'); 391 '<template repeat="{{}}"><a>{{v}}</a></template>');
420 var model = toObservable([{'v': 0}, {'v': 1}, {'v': 2}, {'v': 3}, {'v': 4}]) ; 392 var model = toObservable([{'v': 0}, {'v': 1}, {'v': 2}, {'v': 3},
393 {'v': 4}]);
421 recursivelySetTemplateModel(div, model); 394 recursivelySetTemplateModel(div, model);
422 deliverChanges(model); 395 deliverChanges(model);
423 396
424 var nodes = div.nodes.skip(1).toList(); 397 var nodes = div.nodes.skip(1).toList();
425 var vs = model.toList(); 398 var vs = model.toList();
426 399
427 for (var i = 0; i < 5; i++) { 400 for (var i = 0; i < 5; i++) {
428 expect(nodes[i].text, '$i'); 401 expect(nodes[i].text, '$i');
429 } 402 }
430 403
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 549
577 expect(div.children.length, 4); 550 expect(div.children.length, 4);
578 expect(div.nodes.length, 4); 551 expect(div.nodes.length, 4);
579 552
580 expect(div.nodes[1].tagName, 'P'); 553 expect(div.nodes[1].tagName, 'P');
581 expect(div.nodes[3].tagName, 'P'); 554 expect(div.nodes[3].tagName, 'P');
582 }); 555 });
583 556
584 observeTest('DefaultStyles', () { 557 observeTest('DefaultStyles', () {
585 var t = new Element.tag('template'); 558 var t = new Element.tag('template');
586 TemplateElement.decorate(t); 559 TemplateBindExtension.decorate(t);
587 560
588 document.body.append(t); 561 document.body.append(t);
589 expect(t.getComputedStyle().display, 'none'); 562 expect(t.getComputedStyle().display, 'none');
590 563
591 t.remove(); 564 t.remove();
592 }); 565 });
593 566
594 567
595 observeTest('Bind', () { 568 observeTest('Bind', () {
596 var div = createTestHtml('<template bind="{{}}">Hi {{ name }}</template>'); 569 var div = createTestHtml('<template bind="{{}}">Hi {{ name }}</template>');
597 var model = toObservable({'name': 'Leela'}); 570 var model = toObservable({'name': 'Leela'});
598 recursivelySetTemplateModel(div, model); 571 recursivelySetTemplateModel(div, model);
599 572
600 deliverChanges(model); 573 deliverChanges(model);
601 expect(div.nodes[1].text, 'Hi Leela'); 574 expect(div.nodes[1].text, 'Hi Leela');
602 }); 575 });
603 576
604 observeTest('BindImperative', () { 577 observeTest('BindImperative', () {
605 var div = createTestHtml( 578 var div = createTestHtml(
606 '<template>' 579 '<template>'
607 'Hi {{ name }}' 580 'Hi {{ name }}'
608 '</template>'); 581 '</template>');
609 var t = div.nodes.first; 582 var t = div.nodes.first;
610 583
611 var model = toObservable({'name': 'Leela'}); 584 var model = toObservable({'name': 'Leela'});
612 t.bind('bind', model, ''); 585 nodeBind(t).bind('bind', model, '');
613 586
614 deliverChanges(model); 587 deliverChanges(model);
615 expect(div.nodes[1].text, 'Hi Leela'); 588 expect(div.nodes[1].text, 'Hi Leela');
616 }); 589 });
617 590
618 observeTest('BindPlaceHolderHasNewLine', () { 591 observeTest('BindPlaceHolderHasNewLine', () {
619 var div = createTestHtml('<template bind="{{}}">Hi {{\nname\n}}</template>') ; 592 var div = createTestHtml(
593 '<template bind="{{}}">Hi {{\nname\n}}</template>');
620 var model = toObservable({'name': 'Leela'}); 594 var model = toObservable({'name': 'Leela'});
621 recursivelySetTemplateModel(div, model); 595 recursivelySetTemplateModel(div, model);
622 596
623 deliverChanges(model); 597 deliverChanges(model);
624 expect(div.nodes[1].text, 'Hi Leela'); 598 expect(div.nodes[1].text, 'Hi Leela');
625 }); 599 });
626 600
627 observeTest('BindWithRef', () { 601 observeTest('BindWithRef', () {
628 var id = 't${new math.Random().nextDouble()}'; 602 var id = 't${new math.Random().nextDouble()}';
629 var div = createTestHtml( 603 var div = createTestHtml(
630 '<template id="$id">' 604 '<template id="$id">'
631 'Hi {{ name }}' 605 'Hi {{ name }}'
632 '</template>' 606 '</template>'
633 '<template ref="$id" bind="{{}}"></template>'); 607 '<template ref="$id" bind="{{}}"></template>');
634 608
635 var t1 = div.nodes.first; 609 var t1 = div.nodes.first;
636 var t2 = div.nodes[1]; 610 var t2 = div.nodes[1];
637 611
638 expect(t2.ref, t1); 612 expect(templateBind(t2).ref, t1);
639 613
640 var model = toObservable({'name': 'Fry'}); 614 var model = toObservable({'name': 'Fry'});
641 recursivelySetTemplateModel(div, model); 615 recursivelySetTemplateModel(div, model);
642 616
643 deliverChanges(model); 617 deliverChanges(model);
644 expect(t2.nextNode.text, 'Hi Fry'); 618 expect(t2.nextNode.text, 'Hi Fry');
645 }); 619 });
646 620
647 observeTest('BindChanged', () { 621 observeTest('BindChanged', () {
648 var model = toObservable({ 622 var model = toObservable({
649 'XX': {'name': 'Leela', 'title': 'Captain'}, 623 'XX': {'name': 'Leela', 'title': 'Captain'},
650 'XY': {'name': 'Fry', 'title': 'Delivery boy'}, 624 'XY': {'name': 'Fry', 'title': 'Delivery boy'},
651 'XZ': {'name': 'Zoidberg', 'title': 'Doctor'} 625 'XZ': {'name': 'Zoidberg', 'title': 'Doctor'}
652 }); 626 });
653 627
654 var div = createTestHtml( 628 var div = createTestHtml(
655 '<template bind="{{ XX }}">Hi {{ name }}</template>'); 629 '<template bind="{{ XX }}">Hi {{ name }}</template>');
656 630
657 recursivelySetTemplateModel(div, model); 631 recursivelySetTemplateModel(div, model);
658 632
659 var t = div.nodes.first; 633 var t = div.nodes.first;
660 deliverChanges(model); 634 deliverChanges(model);
661 635
662 expect(div.nodes.length, 2); 636 expect(div.nodes.length, 2);
663 expect(t.nextNode.text, 'Hi Leela'); 637 expect(t.nextNode.text, 'Hi Leela');
664 638
665 t.bind('bind', model, 'XZ'); 639 nodeBind(t).bind('bind', model, 'XZ');
666 deliverChanges(model); 640 deliverChanges(model);
667 641
668 expect(div.nodes.length, 2); 642 expect(div.nodes.length, 2);
669 expect(t.nextNode.text, 'Hi Zoidberg'); 643 expect(t.nextNode.text, 'Hi Zoidberg');
670 }); 644 });
671 645
672 assertNodesAre(div, [arguments]) { 646 assertNodesAre(div, [arguments]) {
673 var expectedLength = arguments.length; 647 var expectedLength = arguments.length;
674 expect(div.nodes.length, expectedLength + 1); 648 expect(div.nodes.length, expectedLength + 1);
675 649
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 assertNodesAre(div, ['Hi Rafael', 'Hi Alex']); 685 assertNodesAre(div, ['Hi Rafael', 'Hi Alex']);
712 686
713 m['contacts'].insertAll(1, 687 m['contacts'].insertAll(1,
714 toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}])); 688 toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}]));
715 deliverChanges(m); 689 deliverChanges(m);
716 assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']); 690 assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']);
717 691
718 m['contacts'].replaceRange(0, 1, 692 m['contacts'].replaceRange(0, 1,
719 toObservable([{'name': 'Tab'}, {'name': 'Neal'}])); 693 toObservable([{'name': 'Tab'}, {'name': 'Neal'}]));
720 deliverChanges(m); 694 deliverChanges(m);
721 assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri', 'Hi Alex' ]); 695 assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri',
696 'Hi Alex']);
722 697
723 m['contacts'] = toObservable([{'name': 'Alex'}]); 698 m['contacts'] = toObservable([{'name': 'Alex'}]);
724 deliverChanges(m); 699 deliverChanges(m);
725 assertNodesAre(div, ['Hi Alex']); 700 assertNodesAre(div, ['Hi Alex']);
726 701
727 m['contacts'].length = 0; 702 m['contacts'].length = 0;
728 deliverChanges(m); 703 deliverChanges(m);
729 assertNodesAre(div, []); 704 assertNodesAre(div, []);
730 }); 705 });
731 706
(...skipping 11 matching lines...) Expand all
743 }); 718 });
744 recursivelySetTemplateModel(div, m); 719 recursivelySetTemplateModel(div, m);
745 720
746 deliverChanges(m); 721 deliverChanges(m);
747 var t = div.nodes.first; 722 var t = div.nodes.first;
748 723
749 assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']); 724 assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
750 }); 725 });
751 726
752 observeTest('RepeatEmptyPath', () { 727 observeTest('RepeatEmptyPath', () {
753 var div = createTestHtml('<template repeat="{{}}">Hi {{ name }}</template>') ; 728 var div = createTestHtml(
729 '<template repeat="{{}}">Hi {{ name }}</template>');
754 var t = div.nodes.first; 730 var t = div.nodes.first;
755 731
756 var m = toObservable([ 732 var m = toObservable([
757 {'name': 'Raf'}, 733 {'name': 'Raf'},
758 {'name': 'Arv'}, 734 {'name': 'Arv'},
759 {'name': 'Neal'} 735 {'name': 'Neal'}
760 ]); 736 ]);
761 recursivelySetTemplateModel(div, m); 737 recursivelySetTemplateModel(div, m);
762 738
763 deliverChanges(m); 739 deliverChanges(m);
(...skipping 11 matching lines...) Expand all
775 m.removeRange(1, 3); 751 m.removeRange(1, 3);
776 deliverChanges(m); 752 deliverChanges(m);
777 assertNodesAre(div, ['Hi Rafael', 'Hi Alex']); 753 assertNodesAre(div, ['Hi Rafael', 'Hi Alex']);
778 754
779 m.insertAll(1, toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}])); 755 m.insertAll(1, toObservable([{'name': 'Erik'}, {'name': 'Dimitri'}]));
780 deliverChanges(m); 756 deliverChanges(m);
781 assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']); 757 assertNodesAre(div, ['Hi Rafael', 'Hi Erik', 'Hi Dimitri', 'Hi Alex']);
782 758
783 m.replaceRange(0, 1, toObservable([{'name': 'Tab'}, {'name': 'Neal'}])); 759 m.replaceRange(0, 1, toObservable([{'name': 'Tab'}, {'name': 'Neal'}]));
784 deliverChanges(m); 760 deliverChanges(m);
785 assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri', 'Hi Alex' ]); 761 assertNodesAre(div, ['Hi Tab', 'Hi Neal', 'Hi Erik', 'Hi Dimitri',
762 'Hi Alex']);
786 763
787 m.length = 0; 764 m.length = 0;
788 m.add(toObservable({'name': 'Alex'})); 765 m.add(toObservable({'name': 'Alex'}));
789 deliverChanges(m); 766 deliverChanges(m);
790 assertNodesAre(div, ['Hi Alex']); 767 assertNodesAre(div, ['Hi Alex']);
791 }); 768 });
792 769
793 observeTest('RepeatNullModel', () { 770 observeTest('RepeatNullModel', () {
794 var div = createTestHtml('<template repeat="{{}}">Hi {{ name }}</template>') ; 771 var div = createTestHtml(
772 '<template repeat="{{}}">Hi {{ name }}</template>');
795 var t = div.nodes.first; 773 var t = div.nodes.first;
796 774
797 var m = null; 775 var m = null;
798 recursivelySetTemplateModel(div, m); 776 recursivelySetTemplateModel(div, m);
799 777
800 expect(div.nodes.length, 1); 778 expect(div.nodes.length, 1);
801 779
802 t.attributes['iterate'] = ''; 780 t.attributes['iterate'] = '';
803 m = toObservable({}); 781 m = toObservable({});
804 recursivelySetTemplateModel(div, m); 782 recursivelySetTemplateModel(div, m);
805 783
806 deliverChanges(m); 784 deliverChanges(m);
807 expect(div.nodes.length, 1); 785 expect(div.nodes.length, 1);
808 }); 786 });
809 787
810 observeTest('RepeatReuse', () { 788 observeTest('RepeatReuse', () {
811 var div = createTestHtml('<template repeat="{{}}">Hi {{ name }}</template>') ; 789 var div = createTestHtml(
790 '<template repeat="{{}}">Hi {{ name }}</template>');
812 var t = div.nodes.first; 791 var t = div.nodes.first;
813 792
814 var m = toObservable([ 793 var m = toObservable([
815 {'name': 'Raf'}, 794 {'name': 'Raf'},
816 {'name': 'Arv'}, 795 {'name': 'Arv'},
817 {'name': 'Neal'} 796 {'name': 'Neal'}
818 ]); 797 ]);
819 recursivelySetTemplateModel(div, m); 798 recursivelySetTemplateModel(div, m);
820 deliverChanges(m); 799 deliverChanges(m);
821 800
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 832
854 observeTest('Checked', () { 833 observeTest('Checked', () {
855 var div = createTestHtml( 834 var div = createTestHtml(
856 '<template>' 835 '<template>'
857 '<input type="checkbox" checked="{{a}}">' 836 '<input type="checkbox" checked="{{a}}">'
858 '</template>'); 837 '</template>');
859 var t = div.nodes.first; 838 var t = div.nodes.first;
860 var m = toObservable({ 839 var m = toObservable({
861 'a': true 840 'a': true
862 }); 841 });
863 t.bind('bind', m, ''); 842 nodeBind(t).bind('bind', m, '');
864 deliverChanges(m); 843 deliverChanges(m);
865 844
866 var instanceInput = t.nextNode; 845 var instanceInput = t.nextNode;
867 expect(instanceInput.checked, true); 846 expect(instanceInput.checked, true);
868 847
869 instanceInput.click(); 848 instanceInput.click();
870 expect(instanceInput.checked, false); 849 expect(instanceInput.checked, false);
871 850
872 instanceInput.click(); 851 instanceInput.click();
873 expect(instanceInput.checked, true); 852 expect(instanceInput.checked, true);
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1117 var select = div.nodes[0].nextNode; 1096 var select = div.nodes[0].nextNode;
1118 expect(select.nodes.length, 2); 1097 expect(select.nodes.length, 2);
1119 1098
1120 scheduleMicrotask(expectAsync0(() { 1099 scheduleMicrotask(expectAsync0(() {
1121 scheduleMicrotask(expectAsync0(() { 1100 scheduleMicrotask(expectAsync0(() {
1122 // TODO(jmesserly): this should be called sooner. 1101 // TODO(jmesserly): this should be called sooner.
1123 expect(select.selectedIndex, 1); 1102 expect(select.selectedIndex, 1);
1124 })); 1103 }));
1125 })); 1104 }));
1126 expect(select.nodes[0].tagName, 'TEMPLATE'); 1105 expect(select.nodes[0].tagName, 'TEMPLATE');
1127 expect(select.nodes[0].ref.content.nodes[0].tagName, 'OPTGROUP'); 1106 expect(templateBind(select.nodes[0]).ref.content.nodes[0].tagName,
1107 'OPTGROUP');
1128 1108
1129 var optgroup = select.nodes[1]; 1109 var optgroup = select.nodes[1];
1130 expect(optgroup.nodes[0].tagName, 'TEMPLATE'); 1110 expect(optgroup.nodes[0].tagName, 'TEMPLATE');
1131 expect(optgroup.nodes[1].tagName, 'OPTION'); 1111 expect(optgroup.nodes[1].tagName, 'OPTION');
1132 expect(optgroup.nodes[1].text, '0'); 1112 expect(optgroup.nodes[1].text, '0');
1133 expect(optgroup.nodes[2].tagName, 'OPTION'); 1113 expect(optgroup.nodes[2].tagName, 'OPTION');
1134 expect(optgroup.nodes[2].text, '1'); 1114 expect(optgroup.nodes[2].text, '1');
1135 }); 1115 });
1136 1116
1137 observeTest('NestedIterateTableMixedSemanticNative', () { 1117 observeTest('NestedIterateTableMixedSemanticNative', () {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 // 1 for the <td template>, 2 * (1 td) 1180 // 1 for the <td template>, 2 * (1 td)
1201 expect(tbody.nodes[1].nodes.length, 3); 1181 expect(tbody.nodes[1].nodes.length, 3);
1202 expect(tbody.nodes[1].nodes[1].text, '0'); 1182 expect(tbody.nodes[1].nodes[1].text, '0');
1203 expect(tbody.nodes[1].nodes[2].text, '1'); 1183 expect(tbody.nodes[1].nodes[2].text, '1');
1204 1184
1205 // 1 for the <td template>, 2 * (1 td) 1185 // 1 for the <td template>, 2 * (1 td)
1206 expect(tbody.nodes[2].nodes.length, 3); 1186 expect(tbody.nodes[2].nodes.length, 3);
1207 expect(tbody.nodes[2].nodes[1].text, '2'); 1187 expect(tbody.nodes[2].nodes[1].text, '2');
1208 expect(tbody.nodes[2].nodes[2].text, '3'); 1188 expect(tbody.nodes[2].nodes[2].text, '3');
1209 1189
1210 // Asset the 'class' binding is retained on the semantic template (just chec k 1190 // Asset the 'class' binding is retained on the semantic template (just
1211 // the last one). 1191 // check the last one).
1212 expect(tbody.nodes[2].nodes[2].attributes['class'], '3'); 1192 expect(tbody.nodes[2].nodes[2].attributes['class'], '3');
1213 }); 1193 });
1214 1194
1215 observeTest('NestedRepeatDeletionOfMultipleSubTemplates', () { 1195 observeTest('NestedRepeatDeletionOfMultipleSubTemplates', () {
1216 var div = createTestHtml( 1196 var div = createTestHtml(
1217 '<ul>' 1197 '<ul>'
1218 '<template repeat="{{}}" id=t1>' 1198 '<template repeat="{{}}" id=t1>'
1219 '<li>{{name}}' 1199 '<li>{{name}}'
1220 '<ul>' 1200 '<ul>'
1221 '<template ref=t1 repaet="{{items}}"></template>' 1201 '<template ref=t1 repaet="{{items}}"></template>'
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 var div = createTestHtml('<template repeat>{{ foo }}</template>'); 1401 var div = createTestHtml('<template repeat>{{ foo }}</template>');
1422 1402
1423 var m = toObservable([{ 'foo': 'bar' }, { 'foo': 'bat'}]); 1403 var m = toObservable([{ 'foo': 'bar' }, { 'foo': 'bat'}]);
1424 recursivelySetTemplateModel(div, m); 1404 recursivelySetTemplateModel(div, m);
1425 performMicrotaskCheckpoint(); 1405 performMicrotaskCheckpoint();
1426 1406
1427 var observer = new MutationObserver((records, _) {}); 1407 var observer = new MutationObserver((records, _) {});
1428 observer.observe(div, childList: true); 1408 observer.observe(div, childList: true);
1429 1409
1430 var template = div.firstChild; 1410 var template = div.firstChild;
1431 template.bind('repeat', toObservable(m.toList()), ''); 1411 nodeBind(template).bind('repeat', toObservable(m.toList()), '');
1432 performMicrotaskCheckpoint(); 1412 performMicrotaskCheckpoint();
1433 var records = observer.takeRecords(); 1413 var records = observer.takeRecords();
1434 expect(records.length, 0); 1414 expect(records.length, 0);
1435 }); 1415 });
1436 1416
1437 observeTest('RecursiveRef', () { 1417 observeTest('RecursiveRef', () {
1438 var div = createTestHtml( 1418 var div = createTestHtml(
1439 '<template bind>' 1419 '<template bind>'
1440 '<template id=src>{{ foo }}</template>' 1420 '<template id=src>{{ foo }}</template>'
1441 '<template bind ref=src></template>' 1421 '<template bind ref=src></template>'
(...skipping 24 matching lines...) Expand all
1466 // Note: this will use the Map "length" property, not the "length" key. 1446 // Note: this will use the Map "length" property, not the "length" key.
1467 {'length': 42, 'c': 123} 1447 {'length': 42, 'c': 123}
1468 ] 1448 ]
1469 }); 1449 });
1470 recursivelySetTemplateModel(div, m); 1450 recursivelySetTemplateModel(div, m);
1471 deliverChanges(m); 1451 deliverChanges(m);
1472 1452
1473 expect(div.nodes.length, 2); 1453 expect(div.nodes.length, 2);
1474 expect(div.nodes[1].text, '3'); 1454 expect(div.nodes[1].text, '3');
1475 1455
1476 template.unbind('bind'); 1456 nodeBind(template)
1477 template.bind('repeat', m, 'a'); 1457 ..unbind('bind')
1458 ..bind('repeat', m, 'a');
1478 deliverChanges(m); 1459 deliverChanges(m);
1479 expect(div.nodes.length, 4); 1460 expect(div.nodes.length, 4);
1480 expect(div.nodes[1].text, '0'); 1461 expect(div.nodes[1].text, '0');
1481 expect(div.nodes[2].text, '1'); 1462 expect(div.nodes[2].text, '1');
1482 expect(div.nodes[3].text, '2'); 1463 expect(div.nodes[3].text, '2');
1483 1464
1484 template.unbind('repeat'); 1465 nodeBind(template).unbind('repeat');
1485 template.bind('bind', m, 'a.1.b'); 1466 nodeBind(template).bind('bind', m, 'a.1.b');
1486 1467
1487 deliverChanges(m); 1468 deliverChanges(m);
1488 expect(div.nodes.length, 2); 1469 expect(div.nodes.length, 2);
1489 expect(div.nodes[1].text, '4'); 1470 expect(div.nodes[1].text, '4');
1490 }); 1471 });
1491 1472
1492 observeTest('ChangeRefId', () { 1473 observeTest('ChangeRefId', () {
1493 var div = createTestHtml( 1474 var div = createTestHtml(
1494 '<template id="a">a:{{ }}</template>' 1475 '<template id="a">a:{{ }}</template>'
1495 '<template id="b">b:{{ }}</template>' 1476 '<template id="b">b:{{ }}</template>'
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 deliverChanges(model); 1544 deliverChanges(model);
1564 expect(root.nodes[1].text, 'Hi Leela'); 1545 expect(root.nodes[1].text, 'Hi Leela');
1565 } 1546 }
1566 }); 1547 });
1567 1548
1568 observeTest('BindShadowDOM createInstance', () { 1549 observeTest('BindShadowDOM createInstance', () {
1569 if (ShadowRoot.supported) { 1550 if (ShadowRoot.supported) {
1570 var model = toObservable({'name': 'Leela'}); 1551 var model = toObservable({'name': 'Leela'});
1571 var template = new Element.html('<template>Hi {{ name }}</template>'); 1552 var template = new Element.html('<template>Hi {{ name }}</template>');
1572 var root = createShadowTestHtml(''); 1553 var root = createShadowTestHtml('');
1573 root.nodes.add(template.createInstance(model)); 1554 root.nodes.add(templateBind(template).createInstance(model));
1574 1555
1575 performMicrotaskCheckpoint(); 1556 performMicrotaskCheckpoint();
1576 expect(root.text, 'Hi Leela'); 1557 expect(root.text, 'Hi Leela');
1577 1558
1578 model['name'] = 'Fry'; 1559 model['name'] = 'Fry';
1579 performMicrotaskCheckpoint(); 1560 performMicrotaskCheckpoint();
1580 expect(root.text, 'Hi Fry'); 1561 expect(root.text, 'Hi Fry');
1581 } 1562 }
1582 }); 1563 });
1583 1564
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 performMicrotaskCheckpoint(); 1619 performMicrotaskCheckpoint();
1639 }); 1620 });
1640 1621
1641 observeTest('CreateInstance', () { 1622 observeTest('CreateInstance', () {
1642 var div = createTestHtml( 1623 var div = createTestHtml(
1643 '<template bind="{{a}}">' 1624 '<template bind="{{a}}">'
1644 '<template bind="{{b}}">' 1625 '<template bind="{{b}}">'
1645 '{{ foo }}:{{ replaceme }}' 1626 '{{ foo }}:{{ replaceme }}'
1646 '</template>' 1627 '</template>'
1647 '</template>'); 1628 '</template>');
1648 var outer = div.nodes.first; 1629 var outer = templateBind(div.nodes.first);
1649 var model = toObservable({'b': {'foo': 'bar'}}); 1630 var model = toObservable({'b': {'foo': 'bar'}});
1650 1631
1651 var host = new DivElement(); 1632 var host = new DivElement();
1652 var instance = outer.createInstance(model, new TestBindingSyntax()); 1633 var instance = outer.createInstance(model, new TestBindingSyntax());
1653 expect(outer.content.nodes.first, instance.nodes.first.ref); 1634 expect(outer.content.nodes.first,
1635 templateBind(instance.nodes.first).ref);
1654 1636
1655 host.append(instance); 1637 host.append(instance);
1656 performMicrotaskCheckpoint(); 1638 performMicrotaskCheckpoint();
1657 expect(host.firstChild.nextNode.text, 'bar:replaced'); 1639 expect(host.firstChild.nextNode.text, 'bar:replaced');
1658 }); 1640 });
1659 1641
1660 observeTest('Bootstrap', () { 1642 observeTest('Bootstrap', () {
1661 var div = new DivElement(); 1643 var div = new DivElement();
1662 div.innerHtml = 1644 div.innerHtml =
1663 '<template>' 1645 '<template>'
1664 '<div></div>' 1646 '<div></div>'
1665 '<template>' 1647 '<template>'
1666 'Hello' 1648 'Hello'
1667 '</template>' 1649 '</template>'
1668 '</template>'; 1650 '</template>';
1669 1651
1670 TemplateElement.bootstrap(div); 1652 TemplateBindExtension.bootstrap(div);
1671 var template = div.nodes.first; 1653 var template = templateBind(div.nodes.first);
1672 expect(template.content.nodes.length, 2); 1654 expect(template.content.nodes.length, 2);
1673 var template2 = template.content.nodes.first.nextNode; 1655 var template2 = templateBind(template.content.nodes.first.nextNode);
1674 expect(template2.content.nodes.length, 1); 1656 expect(template2.content.nodes.length, 1);
1675 expect(template2.content.nodes.first.text, 'Hello'); 1657 expect(template2.content.nodes.first.text, 'Hello');
1676 1658
1677 template = new Element.tag('template'); 1659 template = new Element.tag('template');
1678 template.innerHtml = 1660 template.innerHtml =
1679 '<template>' 1661 '<template>'
1680 '<div></div>' 1662 '<div></div>'
1681 '<template>' 1663 '<template>'
1682 'Hello' 1664 'Hello'
1683 '</template>' 1665 '</template>'
1684 '</template>'; 1666 '</template>';
1685 1667
1686 TemplateElement.bootstrap(template); 1668 TemplateBindExtension.bootstrap(template);
1687 template2 = template.content.nodes.first; 1669 template2 = template.content.nodes.first;
1688 expect(template2.content.nodes.length, 2); 1670 expect(template2.content.nodes.length, 2);
1689 var template3 = template2.content.nodes.first.nextNode; 1671 var template3 = template2.content.nodes.first.nextNode;
1690 expect(template3.content.nodes.length, 1); 1672 expect(template3.content.nodes.length, 1);
1691 expect(template3.content.nodes.first.text, 'Hello'); 1673 expect(template3.content.nodes.first.text, 'Hello');
1692 }); 1674 });
1693
1694 observeTest('instanceCreated hack', () {
1695 var called = false;
1696
1697 callback(node) {
1698 called = true;
1699 expect(node.nodeType, Node.DOCUMENT_FRAGMENT_NODE);
1700 }
1701 mdv.instanceCreated.add(callback);
1702
1703 var div = createTestHtml('<template bind="{{}}">Foo</template>');
1704 expect(called, false);
1705
1706 recursivelySetTemplateModel(div, null);
1707 performMicrotaskCheckpoint();
1708 expect(called, true);
1709
1710 mdv.instanceCreated.remove(callback);
1711 });
1712 } 1675 }
1713 1676
1714 class TestBindingSyntax extends BindingDelegate { 1677 class TestBindingSyntax extends BindingDelegate {
1715 getBinding(model, String path, name, node) { 1678 getBinding(model, String path, name, node) {
1716 if (path.trim() == 'replaceme') return new ObservableBox('replaced'); 1679 if (path.trim() == 'replaceme') return new ObservableBox('replaced');
1717 return null; 1680 return null;
1718 } 1681 }
1719 } 1682 }
1720 1683
1721 class UnbindingInNestedBindSyntax extends BindingDelegate { 1684 class UnbindingInNestedBindSyntax extends BindingDelegate {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1767 k = k is String ? new Symbol(k) : _deepToSymbol(k); 1730 k = k is String ? new Symbol(k) : _deepToSymbol(k);
1768 result[k] = _deepToSymbol(v); 1731 result[k] = _deepToSymbol(v);
1769 }); 1732 });
1770 return result; 1733 return result;
1771 } 1734 }
1772 if (value is Iterable) { 1735 if (value is Iterable) {
1773 return value.map(_deepToSymbol).toList(); 1736 return value.map(_deepToSymbol).toList();
1774 } 1737 }
1775 return value; 1738 return value;
1776 } 1739 }
1777
1778 /**
1779 * Sanitizer which does nothing.
1780 */
1781 class NullTreeSanitizer implements NodeTreeSanitizer {
1782 void sanitizeTree(Node node) {}
1783 }
OLDNEW
« no previous file with comments | « pkg/template_binding/test/node_bindings_test.dart ('k') | pkg/template_binding/test/utils.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698