OLD | NEW |
---|---|
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_binding.test.template_element_test; | 5 library template_binding.test.template_binding_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:observe/observe.dart'; | 11 import 'package:observe/observe.dart'; |
12 import 'package:template_binding/template_binding.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 | |
16 // TODO(jmesserly): merge this file? | |
17 import 'binding_syntax.dart' show syntaxTests; | |
15 import 'utils.dart'; | 18 import 'utils.dart'; |
16 | 19 |
17 // Note: this file ported from | 20 // Note: this file ported from |
18 // https://github.com/toolkitchen/mdv/blob/master/tests/template_element.js | 21 // https://github.com/Polymer/TemplateBinding/blob/ed3266266e751b5ab1f75f8e0509d 0d5f0ef35d8/tests/tests.js |
22 | |
19 // TODO(jmesserly): submit a small cleanup patch to original. I fixed some | 23 // 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; | 24 // cases where "div" and "t" were unintentionally using the JS global scope; |
21 // look for "assertNodesAre". | 25 // look for "assertNodesAre". |
22 | 26 |
23 main() { | 27 main() { |
24 useHtmlConfiguration(); | 28 useHtmlConfiguration(); |
25 group('Template Element', templateElementTests); | |
26 } | |
27 | 29 |
28 templateElementTests() { | |
29 setUp(() { | 30 setUp(() { |
30 document.body.append(testDiv = new DivElement()); | 31 document.body.append(testDiv = new DivElement()); |
31 }); | 32 }); |
32 | 33 |
33 tearDown(() { | 34 tearDown(() { |
34 testDiv.remove(); | 35 testDiv.remove(); |
35 testDiv = null; | 36 testDiv = null; |
36 }); | 37 }); |
37 | 38 |
38 var expando = new Expando('observeTest'); | 39 group('Template Instantiation', templateInstantiationTests); |
39 void addExpandos(node) { | 40 |
40 while (node != null) { | 41 group('Binding Delegate API', () { |
41 expando[node] = node.text; | 42 group('with Observable', () { |
42 node = node.nextNode; | 43 syntaxTests(([f, b]) => new FooBarModel(f, b)); |
43 } | 44 }); |
45 | |
46 group('with ChangeNotifier', () { | |
47 syntaxTests(([f, b]) => new FooBarNotifyModel(f, b)); | |
48 }); | |
49 }); | |
50 | |
51 group('Compat', compatTests); | |
52 } | |
53 | |
54 var expando = new Expando('test'); | |
55 void addExpandos(node) { | |
56 while (node != null) { | |
57 expando[node] = node.text; | |
58 node = node.nextNode; | |
44 } | 59 } |
60 } | |
45 | 61 |
46 void checkExpandos(node) { | 62 void checkExpandos(node) { |
47 expect(node, isNotNull); | 63 expect(node, isNotNull); |
48 while (node != null) { | 64 while (node != null) { |
49 expect(expando[node], node.text); | 65 expect(expando[node], node.text); |
50 node = node.nextNode; | 66 node = node.nextNode; |
51 } | |
52 } | 67 } |
68 } | |
69 | |
70 templateInstantiationTests() { | |
53 | 71 |
54 observeTest('Template', () { | 72 observeTest('Template', () { |
55 var div = createTestHtml('<template bind={{}}>text</template>'); | 73 var div = createTestHtml('<template bind={{}}>text</template>'); |
56 recursivelySetTemplateModel(div, null); | 74 templateBind(div.firstChild).model = {}; |
57 performMicrotaskCheckpoint(); | 75 performMicrotaskCheckpoint(); |
58 expect(div.nodes.length, 2); | 76 expect(div.nodes.length, 2); |
59 expect(div.nodes.last.text, 'text'); | 77 expect(div.nodes.last.text, 'text'); |
78 | |
79 templateBind(div.firstChild).model = null; | |
80 performMicrotaskCheckpoint(); | |
81 expect(div.nodes.length, 1); | |
60 }); | 82 }); |
61 | 83 |
62 observeTest('Template bind, no parent', () { | 84 observeTest('Template bind, no parent', () { |
63 var div = createTestHtml('<template bind>text</template>'); | 85 var div = createTestHtml('<template bind>text</template>'); |
64 var template = div.nodes[0]; | 86 var template = div.firstChild; |
65 template.remove(); | 87 template.remove(); |
66 | 88 |
67 recursivelySetTemplateModel(template, toObservable({})); | 89 templateBind(template).model = {}; |
68 performMicrotaskCheckpoint(); | 90 performMicrotaskCheckpoint(); |
69 expect(template.nodes.length, 0); | 91 expect(template.nodes.length, 0); |
70 expect(template.nextNode, null); | 92 expect(template.nextNode, null); |
71 }); | 93 }); |
72 | 94 |
73 observeTest('Template bind, no defaultView', () { | 95 observeTest('Template bind, no defaultView', () { |
74 var div = createTestHtml('<template bind>text</template>'); | 96 var div = createTestHtml('<template bind>text</template>'); |
75 var template = div.nodes[0]; | 97 var template = div.firstChild; |
76 var doc = document.implementation.createHtmlDocument(''); | 98 var doc = document.implementation.createHtmlDocument(''); |
77 doc.adoptNode(div); | 99 doc.adoptNode(div); |
78 recursivelySetTemplateModel(template, toObservable({})); | 100 recursivelySetTemplateModel(template, {}); |
79 performMicrotaskCheckpoint(); | 101 performMicrotaskCheckpoint(); |
80 expect(div.nodes.length, 1); | 102 expect(div.nodes.length, 1); |
81 }); | 103 }); |
82 | 104 |
83 observeTest('Template-Empty Bind', () { | 105 observeTest('Template-Empty Bind', () { |
84 var div = createTestHtml('<template bind>text</template>'); | 106 var div = createTestHtml('<template bind>text</template>'); |
85 recursivelySetTemplateModel(div, null); | 107 var template = div.firstChild; |
108 templateBind(template).model = {}; | |
86 performMicrotaskCheckpoint(); | 109 performMicrotaskCheckpoint(); |
87 expect(div.nodes.length, 2); | 110 expect(div.nodes.length, 2); |
88 expect(div.nodes.last.text, 'text'); | 111 expect(div.nodes.last.text, 'text'); |
89 }); | 112 }); |
90 | 113 |
91 observeTest('Template Bind If', () { | 114 observeTest('Template Bind If', () { |
92 var div = createTestHtml('<template bind if="{{ foo }}">text</template>'); | 115 var div = createTestHtml('<template bind if="{{ foo }}">text</template>'); |
93 // Note: changed this value from 0->null because zero is not falsey in Dart. | 116 // Note: changed this value from 0->null because zero is not falsey in Dart. |
94 // See https://code.google.com/p/dart/issues/detail?id=11956 | 117 // See https://code.google.com/p/dart/issues/detail?id=11956 |
95 var m = toObservable({ 'foo': null }); | 118 var m = toObservable({ 'foo': null }); |
96 recursivelySetTemplateModel(div, m); | 119 var template = div.firstChild; |
120 templateBind(template).model = m; | |
97 performMicrotaskCheckpoint(); | 121 performMicrotaskCheckpoint(); |
98 expect(div.nodes.length, 1); | 122 expect(div.nodes.length, 1); |
99 | 123 |
100 m['foo'] = 1; | 124 m['foo'] = 1; |
101 performMicrotaskCheckpoint(); | 125 performMicrotaskCheckpoint(); |
102 expect(div.nodes.length, 2); | 126 expect(div.nodes.length, 2); |
103 expect(div.lastChild.text, 'text'); | 127 expect(div.lastChild.text, 'text'); |
128 | |
129 templateBind(template).model = null; | |
130 performMicrotaskCheckpoint(); | |
131 expect(div.nodes.length, 1); | |
104 }); | 132 }); |
105 | 133 |
106 observeTest('Template Bind If, 2', () { | 134 observeTest('Template Bind If, 2', () { |
107 var div = createTestHtml( | 135 var div = createTestHtml( |
108 '<template bind="{{ foo }}" if="{{ bar }}">{{ bat }}</template>'); | 136 '<template bind="{{ foo }}" if="{{ bar }}">{{ bat }}</template>'); |
109 var m = toObservable({ 'bar': null, 'foo': { 'bat': 'baz' } }); | 137 var m = toObservable({ 'bar': null, 'foo': { 'bat': 'baz' } }); |
110 recursivelySetTemplateModel(div, m); | 138 recursivelySetTemplateModel(div, m); |
111 performMicrotaskCheckpoint(); | 139 performMicrotaskCheckpoint(); |
112 expect(div.nodes.length, 1); | 140 expect(div.nodes.length, 1); |
113 | 141 |
114 m['bar'] = 1; | 142 m['bar'] = 1; |
115 performMicrotaskCheckpoint(); | 143 performMicrotaskCheckpoint(); |
116 expect(div.nodes.length, 2); | 144 expect(div.nodes.length, 2); |
117 expect(div.lastChild.text, 'baz'); | 145 expect(div.lastChild.text, 'baz'); |
118 }); | 146 }); |
119 | 147 |
120 observeTest('Template If', () { | 148 observeTest('Template If', () { |
121 var div = createTestHtml('<template if="{{ foo }}">{{ value }}</template>'); | 149 var div = createTestHtml('<template if="{{ foo }}">{{ value }}</template>'); |
122 // Note: changed this value from 0->null because zero is not falsey in Dart. | 150 // Note: changed this value from 0->null because zero is not falsey in |
123 // See https://code.google.com/p/dart/issues/detail?id=11956 | 151 // Dart. See https://code.google.com/p/dart/issues/detail?id=11956 |
124 var m = toObservable({ 'foo': null, 'value': 'foo' }); | 152 var m = toObservable({ 'foo': null, 'value': 'foo' }); |
125 recursivelySetTemplateModel(div, m); | 153 var template = div.firstChild; |
154 templateBind(template).model = m; | |
126 performMicrotaskCheckpoint(); | 155 performMicrotaskCheckpoint(); |
127 expect(div.nodes.length, 1); | 156 expect(div.nodes.length, 1); |
128 | 157 |
129 m['foo'] = 1; | 158 m['foo'] = 1; |
130 performMicrotaskCheckpoint(); | 159 performMicrotaskCheckpoint(); |
131 expect(div.nodes.length, 2); | 160 expect(div.nodes.length, 2); |
132 expect(div.lastChild.text, 'foo'); | 161 expect(div.lastChild.text, 'foo'); |
162 | |
163 templateBind(template).model = null; | |
164 performMicrotaskCheckpoint(); | |
165 expect(div.nodes.length, 1); | |
166 }); | |
167 | |
168 observeTest('Template Empty-If', () { | |
169 var div = createTestHtml('<template if>{{ value }}</template>'); | |
170 var m = toObservable({ 'value': 'foo' }); | |
171 recursivelySetTemplateModel(div, null); | |
172 performMicrotaskCheckpoint(); | |
173 expect(div.nodes.length, 1); | |
174 | |
175 recursivelySetTemplateModel(div, m); | |
176 performMicrotaskCheckpoint(); | |
177 expect(div.nodes.length, 2); | |
178 expect(div.lastChild.text, 'foo'); | |
133 }); | 179 }); |
134 | 180 |
135 observeTest('Template Repeat If', () { | 181 observeTest('Template Repeat If', () { |
136 var div = createTestHtml( | 182 var div = createTestHtml( |
137 '<template repeat="{{ foo }}" if="{{ bar }}">{{ }}</template>'); | 183 '<template repeat="{{ foo }}" if="{{ bar }}">{{ }}</template>'); |
138 // Note: changed this value from 0->null because zero is not falsey in Dart. | 184 // Note: changed this value from 0->null because zero is not falsey in Dart. |
139 // See https://code.google.com/p/dart/issues/detail?id=11956 | 185 // See https://code.google.com/p/dart/issues/detail?id=11956 |
140 var m = toObservable({ 'bar': null, 'foo': [1, 2, 3] }); | 186 var m = toObservable({ 'bar': null, 'foo': [1, 2, 3] }); |
141 recursivelySetTemplateModel(div, m); | 187 var template = div.firstChild; |
188 templateBind(template).model = m; | |
142 performMicrotaskCheckpoint(); | 189 performMicrotaskCheckpoint(); |
143 expect(div.nodes.length, 1); | 190 expect(div.nodes.length, 1); |
144 | 191 |
145 m['bar'] = 1; | 192 m['bar'] = 1; |
146 performMicrotaskCheckpoint(); | 193 performMicrotaskCheckpoint(); |
147 expect(div.nodes.length, 4); | 194 expect(div.nodes.length, 4); |
148 expect(div.nodes[1].text, '1'); | 195 expect(div.nodes[1].text, '1'); |
149 expect(div.nodes[2].text, '2'); | 196 expect(div.nodes[2].text, '2'); |
150 expect(div.nodes[3].text, '3'); | 197 expect(div.nodes[3].text, '3'); |
198 | |
199 templateBind(template).model = null; | |
200 performMicrotaskCheckpoint(); | |
201 expect(div.nodes.length, 1); | |
151 }); | 202 }); |
152 | 203 |
153 observeTest('TextTemplateWithNullStringBinding', () { | 204 observeTest('TextTemplateWithNullStringBinding', () { |
154 var div = createTestHtml('<template bind={{}}>a{{b}}c</template>'); | 205 var div = createTestHtml('<template bind={{}}>a{{b}}c</template>'); |
155 var model = toObservable({'b': 'B'}); | 206 var model = toObservable({'b': 'B'}); |
156 recursivelySetTemplateModel(div, model); | 207 recursivelySetTemplateModel(div, model); |
157 | 208 |
158 performMicrotaskCheckpoint(); | 209 performMicrotaskCheckpoint(); |
159 expect(div.nodes.length, 2); | 210 expect(div.nodes.length, 2); |
160 expect(div.nodes.last.text, 'aBc'); | 211 expect(div.nodes.last.text, 'aBc'); |
161 | 212 |
162 model['b'] = 'b'; | 213 model['b'] = 'b'; |
163 performMicrotaskCheckpoint(); | 214 performMicrotaskCheckpoint(); |
164 expect(div.nodes.last.text, 'abc'); | 215 expect(div.nodes.last.text, 'abc'); |
165 | 216 |
166 model['b'] = null; | 217 model['b'] = null; |
167 performMicrotaskCheckpoint(); | 218 performMicrotaskCheckpoint(); |
168 expect(div.nodes.last.text, 'ac'); | 219 expect(div.nodes.last.text, 'ac'); |
169 | 220 |
170 model = null; | 221 model = null; |
171 performMicrotaskCheckpoint(); | 222 performMicrotaskCheckpoint(); |
172 // setting model isn't observable. | 223 // setting model isn't observable. |
173 expect(div.nodes.last.text, 'ac'); | 224 expect(div.nodes.last.text, 'ac'); |
174 }); | 225 }); |
175 | 226 |
176 observeTest('TextTemplateWithBindingPath', () { | 227 observeTest('TextTemplateWithBindingPath', () { |
177 var div = createTestHtml( | 228 var div = createTestHtml( |
178 '<template bind="{{ data }}">a{{b}}c</template>'); | 229 '<template bind="{{ data }}">a{{b}}c</template>'); |
179 var model = toObservable({ 'data': {'b': 'B'} }); | 230 var model = toObservable({ 'data': {'b': 'B'} }); |
180 recursivelySetTemplateModel(div, model); | 231 var template = div.firstChild; |
232 templateBind(template).model = model; | |
181 | 233 |
182 performMicrotaskCheckpoint(); | 234 performMicrotaskCheckpoint(); |
183 expect(div.nodes.length, 2); | 235 expect(div.nodes.length, 2); |
184 expect(div.nodes.last.text, 'aBc'); | 236 expect(div.nodes.last.text, 'aBc'); |
185 | 237 |
186 model['data']['b'] = 'b'; | 238 model['data']['b'] = 'b'; |
187 performMicrotaskCheckpoint(); | 239 performMicrotaskCheckpoint(); |
188 expect(div.nodes.last.text, 'abc'); | 240 expect(div.nodes.last.text, 'abc'); |
189 | 241 |
190 model['data'] = toObservable({'b': 'X'}); | 242 model['data'] = toObservable({'b': 'X'}); |
191 performMicrotaskCheckpoint(); | 243 performMicrotaskCheckpoint(); |
192 expect(div.nodes.last.text, 'aXc'); | 244 expect(div.nodes.last.text, 'aXc'); |
193 | 245 |
246 // Dart note: changed from `null` since our null means don't render a model. | |
247 model['data'] = toObservable({}); | |
248 performMicrotaskCheckpoint(); | |
249 expect(div.nodes.last.text, 'ac'); | |
250 | |
194 model['data'] = null; | 251 model['data'] = null; |
195 performMicrotaskCheckpoint(); | 252 performMicrotaskCheckpoint(); |
196 expect(div.nodes.last.text, 'ac'); | 253 expect(div.nodes.length, 1); |
197 }); | 254 }); |
198 | 255 |
199 observeTest('TextTemplateWithBindingAndConditional', () { | 256 observeTest('TextTemplateWithBindingAndConditional', () { |
200 var div = createTestHtml( | 257 var div = createTestHtml( |
201 '<template bind="{{}}" if="{{ d }}">a{{b}}c</template>'); | 258 '<template bind="{{}}" if="{{ d }}">a{{b}}c</template>'); |
202 var model = toObservable({'b': 'B', 'd': 1}); | 259 var model = toObservable({'b': 'B', 'd': 1}); |
203 recursivelySetTemplateModel(div, model); | 260 recursivelySetTemplateModel(div, model); |
204 | 261 |
205 performMicrotaskCheckpoint(); | 262 performMicrotaskCheckpoint(); |
206 expect(div.nodes.length, 2); | 263 expect(div.nodes.length, 2); |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
592 var div = createTestHtml( | 649 var div = createTestHtml( |
593 '<template bind="{{}}">Hi {{\nname\n}}</template>'); | 650 '<template bind="{{}}">Hi {{\nname\n}}</template>'); |
594 var model = toObservable({'name': 'Leela'}); | 651 var model = toObservable({'name': 'Leela'}); |
595 recursivelySetTemplateModel(div, model); | 652 recursivelySetTemplateModel(div, model); |
596 | 653 |
597 performMicrotaskCheckpoint(); | 654 performMicrotaskCheckpoint(); |
598 expect(div.nodes[1].text, 'Hi Leela'); | 655 expect(div.nodes[1].text, 'Hi Leela'); |
599 }); | 656 }); |
600 | 657 |
601 observeTest('BindWithRef', () { | 658 observeTest('BindWithRef', () { |
602 var id = 't${new math.Random().nextDouble()}'; | 659 var id = 't${new math.Random().nextInt(100)}'; |
603 var div = createTestHtml( | 660 var div = createTestHtml( |
604 '<template id="$id">' | 661 '<template id="$id">' |
605 'Hi {{ name }}' | 662 'Hi {{ name }}' |
606 '</template>' | 663 '</template>' |
607 '<template ref="$id" bind="{{}}"></template>'); | 664 '<template ref="$id" bind="{{}}"></template>'); |
608 | 665 |
609 var t1 = div.nodes.first; | 666 var t1 = div.nodes.first; |
610 var t2 = div.nodes[1]; | 667 var t2 = div.nodes[1]; |
611 | 668 |
612 expect(templateBind(t2).ref, t1); | 669 expect(templateBind(t2).ref, t1); |
613 | 670 |
614 var model = toObservable({'name': 'Fry'}); | 671 var model = toObservable({'name': 'Fry'}); |
615 recursivelySetTemplateModel(div, model); | 672 recursivelySetTemplateModel(div, model); |
616 | 673 |
617 performMicrotaskCheckpoint(); | 674 performMicrotaskCheckpoint(); |
618 expect(t2.nextNode.text, 'Hi Fry'); | 675 expect(t2.nextNode.text, 'Hi Fry'); |
619 }); | 676 }); |
620 | 677 |
678 observeTest('BindWithDynamicRef', () { | |
679 var id = 't${new math.Random().nextInt(100)}'; | |
680 var div = createTestHtml( | |
681 '<template id="$id">' | |
682 'Hi {{ name }}' | |
683 '</template>' | |
684 '<template ref="{{ id }}" bind="{{}}"></template>'); | |
685 | |
686 var t1 = div.firstChild; | |
687 var t2 = div.nodes[1]; | |
688 var model = toObservable({'name': 'Fry', 'id': id }); | |
689 recursivelySetTemplateModel(div, model); | |
690 | |
691 performMicrotaskCheckpoint(); | |
692 expect(t2.nextNode.text, 'Hi Fry'); | |
693 }); | |
694 | |
621 observeTest('BindChanged', () { | 695 observeTest('BindChanged', () { |
622 var model = toObservable({ | 696 var model = toObservable({ |
623 'XX': {'name': 'Leela', 'title': 'Captain'}, | 697 'XX': {'name': 'Leela', 'title': 'Captain'}, |
624 'XY': {'name': 'Fry', 'title': 'Delivery boy'}, | 698 'XY': {'name': 'Fry', 'title': 'Delivery boy'}, |
625 'XZ': {'name': 'Zoidberg', 'title': 'Doctor'} | 699 'XZ': {'name': 'Zoidberg', 'title': 'Doctor'} |
626 }); | 700 }); |
627 | 701 |
628 var div = createTestHtml( | 702 var div = createTestHtml( |
629 '<template bind="{{ XX }}">Hi {{ name }}</template>'); | 703 '<template bind="{{ XX }}">Hi {{ name }}</template>'); |
630 | 704 |
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1541 if (ShadowRoot.supported) { | 1615 if (ShadowRoot.supported) { |
1542 var root = createShadowTestHtml( | 1616 var root = createShadowTestHtml( |
1543 '<template bind="{{}}">Hi {{ name }}</template>'); | 1617 '<template bind="{{}}">Hi {{ name }}</template>'); |
1544 var model = toObservable({'name': 'Leela'}); | 1618 var model = toObservable({'name': 'Leela'}); |
1545 recursivelySetTemplateModel(root, model); | 1619 recursivelySetTemplateModel(root, model); |
1546 performMicrotaskCheckpoint(); | 1620 performMicrotaskCheckpoint(); |
1547 expect(root.nodes[1].text, 'Hi Leela'); | 1621 expect(root.nodes[1].text, 'Hi Leela'); |
1548 } | 1622 } |
1549 }); | 1623 }); |
1550 | 1624 |
1625 // Dart note: this test seems gone from JS. Keeping for posterity sake. | |
1551 observeTest('BindShadowDOM createInstance', () { | 1626 observeTest('BindShadowDOM createInstance', () { |
1552 if (ShadowRoot.supported) { | 1627 if (ShadowRoot.supported) { |
1553 var model = toObservable({'name': 'Leela'}); | 1628 var model = toObservable({'name': 'Leela'}); |
1554 var template = new Element.html('<template>Hi {{ name }}</template>'); | 1629 var template = new Element.html('<template>Hi {{ name }}</template>'); |
1555 var root = createShadowTestHtml(''); | 1630 var root = createShadowTestHtml(''); |
1556 root.nodes.add(templateBind(template).createInstance(model)); | 1631 root.nodes.add(templateBind(template).createInstance(model)); |
1557 | 1632 |
1558 performMicrotaskCheckpoint(); | 1633 performMicrotaskCheckpoint(); |
1559 expect(root.text, 'Hi Leela'); | 1634 expect(root.text, 'Hi Leela'); |
1560 | 1635 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1667 '</template>' | 1742 '</template>' |
1668 '</template>'; | 1743 '</template>'; |
1669 | 1744 |
1670 TemplateBindExtension.bootstrap(template); | 1745 TemplateBindExtension.bootstrap(template); |
1671 template2 = templateBind(templateBind(template).content.nodes.first); | 1746 template2 = templateBind(templateBind(template).content.nodes.first); |
1672 expect(template2.content.nodes.length, 2); | 1747 expect(template2.content.nodes.length, 2); |
1673 var template3 = templateBind(template2.content.nodes.first.nextNode); | 1748 var template3 = templateBind(template2.content.nodes.first.nextNode); |
1674 expect(template3.content.nodes.length, 1); | 1749 expect(template3.content.nodes.length, 1); |
1675 expect(template3.content.nodes.first.text, 'Hello'); | 1750 expect(template3.content.nodes.first.text, 'Hello'); |
1676 }); | 1751 }); |
1752 | |
1753 observeTest('issue-285', () { | |
1754 var div = createTestHtml( | |
1755 '<template>' | |
1756 '<template bind if="{{show}}">' | |
1757 '<template id=del repeat="{{items}}">' | |
1758 '{{}}' | |
1759 '</template>' | |
1760 '</template>' | |
1761 '</template>'); | |
1762 | |
1763 var template = div.firstChild; | |
1764 | |
1765 var model = toObservable({ | |
1766 'show': true, | |
1767 'items': [1] | |
1768 }); | |
1769 | |
1770 div.append(templateBind(template).createInstance(model, | |
1771 new Issue285Syntax())); | |
1772 | |
1773 performMicrotaskCheckpoint(); | |
1774 expect(template.nextNode.nextNode.nextNode.text, '2'); | |
1775 model['show'] = false; | |
1776 performMicrotaskCheckpoint(); | |
1777 model['show'] = true; | |
1778 performMicrotaskCheckpoint(); | |
1779 expect(template.nextNode.nextNode.nextNode.text, '2'); | |
1780 }); | |
1781 | |
1782 observeTest('issue-141', () { | |
1783 var div = createTestHtml( | |
1784 '<template bind>' + | |
1785 '<div foo="{{foo1}} {{foo2}}" bar="{{bar}}"></div>' + | |
1786 '</template>'); | |
1787 | |
1788 var model = toObservable({ | |
1789 'foo1': 'foo1Value', | |
1790 'foo2': 'foo2Value', | |
1791 'bar': 'barValue' | |
1792 }); | |
1793 | |
1794 recursivelySetTemplateModel(div, model); | |
1795 performMicrotaskCheckpoint(); | |
1796 | |
1797 expect(div.lastChild.attributes['bar'], 'barValue'); | |
1798 }); | |
1799 } | |
1800 | |
1801 compatTests() { | |
1802 observeTest('underbar bindings', () { | |
1803 var div = createTestHtml( | |
1804 '<template bind>' | |
1805 '<div _style="color: {{ color }};"></div>' | |
1806 '<img _src="{{ url }}">' | |
1807 '<a _href="{{ url2 }}">Link</a>' | |
1808 '<input type="number" _value="{{ number }}">' | |
1809 '</template>'); | |
1810 | |
1811 var model = toObservable({ | |
1812 'color': 'red', | |
1813 'url': 'pic.jpg', | |
1814 'url2': 'link.html', | |
1815 'number': 4 | |
1816 }); | |
1817 | |
1818 recursivelySetTemplateModel(div, model); | |
1819 performMicrotaskCheckpoint(); | |
1820 | |
1821 var subDiv = div.firstChild.nextNode; | |
1822 expect(subDiv.attributes['style'], 'color: red;'); | |
1823 | |
1824 var img = subDiv.nextNode; | |
1825 expect(img.attributes['src'], 'pic.jpg'); | |
1826 | |
1827 var a = img.nextNode; | |
1828 expect(a.attributes['href'], 'link.html'); | |
1829 | |
1830 var input = a.nextNode; | |
1831 expect(input.value, '4'); | |
1832 }); | |
1833 } | |
1834 | |
1835 class Issue285Syntax extends BindingDelegate { | |
1836 prepareInstanceModel(template) { | |
1837 if (template.id == 'del') return (val) => val * 2; | |
1838 } | |
1677 } | 1839 } |
1678 | 1840 |
1679 class TestBindingSyntax extends BindingDelegate { | 1841 class TestBindingSyntax extends BindingDelegate { |
1680 getBinding(model, String path, name, node) { | 1842 prepareBinding(String path, name, node) { |
1681 if (path.trim() == 'replaceme') return new ObservableBox('replaced'); | 1843 if (path.trim() == 'replaceme') { |
1844 return (x, y) => new ObservableBox('replaced'); | |
1845 } | |
1682 return null; | 1846 return null; |
1683 } | 1847 } |
1684 } | 1848 } |
1685 | 1849 |
1686 class UnbindingInNestedBindSyntax extends BindingDelegate { | 1850 class UnbindingInNestedBindSyntax extends BindingDelegate { |
1687 int expectedAge = 42; | 1851 int expectedAge = 42; |
1688 int count = 0; | 1852 int count = 0; |
1689 | 1853 |
1690 getBinding(model, path, name, node) { | 1854 prepareBinding(path, name, node) { |
1691 if (name != 'text' || path != 'age') | 1855 if (name != 'text' || path != 'age') |
1692 return; | 1856 return; |
Siggi Cherem (dart-lang)
2013/10/29 21:00:07
nit - use 'return null' to be more explicit?
Jennifer Messerly
2013/10/29 23:07:19
Done.
| |
1693 | 1857 |
1694 expect(model['age'], expectedAge); | 1858 return (model, node) { |
1695 count++; | 1859 expect(model['age'], expectedAge); |
1860 count++; | |
1861 return model; | |
1862 }; | |
1696 } | 1863 } |
1697 } | 1864 } |
OLD | NEW |