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') return null; |
1692 return; | |
1693 | 1856 |
1694 expect(model['age'], expectedAge); | 1857 return (model, node) { |
1695 count++; | 1858 expect(model['age'], expectedAge); |
| 1859 count++; |
| 1860 return model; |
| 1861 }; |
1696 } | 1862 } |
1697 } | 1863 } |
OLD | NEW |