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 node_bindings_test; | 5 library node_bindings_test; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:html'; | 8 import 'dart:html'; |
9 import 'package:mdv/mdv.dart' as mdv; | 9 import 'package:mdv/mdv.dart' as mdv; |
10 import 'package:observe/observe.dart'; | 10 import 'package:observe/observe.dart'; |
11 import 'package:unittest/html_config.dart'; | 11 import 'package:unittest/html_config.dart'; |
12 import 'package:unittest/unittest.dart'; | 12 import 'package:unittest/unittest.dart'; |
13 import 'observe_utils.dart'; | 13 import 'mdv_test_utils.dart'; |
14 | 14 |
15 // Note: this file ported from | 15 // Note: this file ported from |
16 // https://github.com/toolkitchen/mdv/blob/master/tests/element_bindings.js | 16 // https://github.com/toolkitchen/mdv/blob/master/tests/element_bindings.js |
17 | 17 |
18 main() { | 18 main() { |
19 mdv.initialize(); | 19 mdv.initialize(); |
20 useHtmlConfiguration(); | 20 useHtmlConfiguration(); |
21 group('Element Bindings', elementBindingTests); | 21 group('Element Bindings', elementBindingTests); |
22 } | 22 } |
23 | 23 |
(...skipping 10 matching lines...) Expand all Loading... |
34 | 34 |
35 tearDown(() { | 35 tearDown(() { |
36 testDiv.remove(); | 36 testDiv.remove(); |
37 testDiv = null; | 37 testDiv = null; |
38 }); | 38 }); |
39 | 39 |
40 dispatchEvent(type, target) { | 40 dispatchEvent(type, target) { |
41 target.dispatchEvent(new Event(type, cancelable: false)); | 41 target.dispatchEvent(new Event(type, cancelable: false)); |
42 } | 42 } |
43 | 43 |
44 test('Text', () { | 44 observeTest('Text', () { |
45 var template = new Element.html('<template bind>{{a}} and {{b}}'); | 45 var template = new Element.html('<template bind>{{a}} and {{b}}'); |
46 testDiv.append(template); | 46 testDiv.append(template); |
47 var model = toSymbolMap({'a': 1, 'b': 2}); | 47 var model = toSymbolMap({'a': 1, 'b': 2}); |
48 template.model = model; | 48 template.model = model; |
49 deliverChangeRecords(); | 49 performMicrotaskCheckpoint(); |
50 var text = testDiv.nodes[1]; | 50 var text = testDiv.nodes[1]; |
51 expect(text.text, '1 and 2'); | 51 expect(text.text, '1 and 2'); |
52 | 52 |
53 model[sym('a')] = 3; | 53 model[sym('a')] = 3; |
54 deliverChangeRecords(); | 54 performMicrotaskCheckpoint(); |
55 expect(text.text, '3 and 2'); | 55 expect(text.text, '3 and 2'); |
56 }); | 56 }); |
57 | 57 |
58 test('SimpleBinding', () { | 58 observeTest('SimpleBinding', () { |
59 var el = new DivElement(); | 59 var el = new DivElement(); |
60 var model = toSymbolMap({'a': '1'}); | 60 var model = toSymbolMap({'a': '1'}); |
61 el.bind('foo', model, 'a'); | 61 el.bind('foo', model, 'a'); |
62 deliverChangeRecords(); | 62 performMicrotaskCheckpoint(); |
63 expect(el.attributes['foo'], '1'); | 63 expect(el.attributes['foo'], '1'); |
64 | 64 |
65 model[sym('a')] = '2'; | 65 model[sym('a')] = '2'; |
66 deliverChangeRecords(); | 66 performMicrotaskCheckpoint(); |
67 expect(el.attributes['foo'], '2'); | 67 expect(el.attributes['foo'], '2'); |
68 | 68 |
69 model[sym('a')] = 232.2; | 69 model[sym('a')] = 232.2; |
70 deliverChangeRecords(); | 70 performMicrotaskCheckpoint(); |
71 expect(el.attributes['foo'], '232.2'); | 71 expect(el.attributes['foo'], '232.2'); |
72 | 72 |
73 model[sym('a')] = 232; | 73 model[sym('a')] = 232; |
74 deliverChangeRecords(); | 74 performMicrotaskCheckpoint(); |
75 expect(el.attributes['foo'], '232'); | 75 expect(el.attributes['foo'], '232'); |
76 | 76 |
77 model[sym('a')] = null; | 77 model[sym('a')] = null; |
78 deliverChangeRecords(); | 78 performMicrotaskCheckpoint(); |
79 expect(el.attributes['foo'], ''); | 79 expect(el.attributes['foo'], ''); |
80 }); | 80 }); |
81 | 81 |
82 test('SimpleBindingWithDashes', () { | 82 observeTest('SimpleBindingWithDashes', () { |
83 var el = new DivElement(); | 83 var el = new DivElement(); |
84 var model = toSymbolMap({'a': '1'}); | 84 var model = toSymbolMap({'a': '1'}); |
85 el.bind('foo-bar', model, 'a'); | 85 el.bind('foo-bar', model, 'a'); |
86 deliverChangeRecords(); | 86 performMicrotaskCheckpoint(); |
87 expect(el.attributes['foo-bar'], '1'); | 87 expect(el.attributes['foo-bar'], '1'); |
88 | 88 |
89 model[sym('a')] = '2'; | 89 model[sym('a')] = '2'; |
90 deliverChangeRecords(); | 90 performMicrotaskCheckpoint(); |
91 expect(el.attributes['foo-bar'], '2'); | 91 expect(el.attributes['foo-bar'], '2'); |
92 }); | 92 }); |
93 | 93 |
94 test('SimpleBindingWithComment', () { | 94 observeTest('SimpleBindingWithComment', () { |
95 var el = new DivElement(); | 95 var el = new DivElement(); |
96 el.innerHtml = '<!-- Comment -->'; | 96 el.innerHtml = '<!-- Comment -->'; |
97 var model = toSymbolMap({'a': '1'}); | 97 var model = toSymbolMap({'a': '1'}); |
98 el.bind('foo-bar', model, 'a'); | 98 el.bind('foo-bar', model, 'a'); |
99 deliverChangeRecords(); | 99 performMicrotaskCheckpoint(); |
100 expect(el.attributes['foo-bar'], '1'); | 100 expect(el.attributes['foo-bar'], '1'); |
101 | 101 |
102 model[sym('a')] = '2'; | 102 model[sym('a')] = '2'; |
103 deliverChangeRecords(); | 103 performMicrotaskCheckpoint(); |
104 expect(el.attributes['foo-bar'], '2'); | 104 expect(el.attributes['foo-bar'], '2'); |
105 }); | 105 }); |
106 | 106 |
107 test('PlaceHolderBindingText', () { | 107 observeTest('PlaceHolderBindingText', () { |
108 var model = toSymbolMap({ | 108 var model = toSymbolMap({ |
109 'adj': 'cruel', | 109 'adj': 'cruel', |
110 'noun': 'world' | 110 'noun': 'world' |
111 }); | 111 }); |
112 | 112 |
113 var el = new DivElement(); | 113 var el = new DivElement(); |
114 el.text = 'dummy'; | 114 el.text = 'dummy'; |
115 el.nodes.first.text = 'Hello {{ adj }} {{noun}}!'; | 115 el.nodes.first.text = 'Hello {{ adj }} {{noun}}!'; |
116 var template = new Element.html('<template bind>'); | 116 var template = new Element.html('<template bind>'); |
117 template.content.append(el); | 117 template.content.append(el); |
118 testDiv.append(template); | 118 testDiv.append(template); |
119 template.model = model; | 119 template.model = model; |
120 | 120 |
121 deliverChangeRecords(); | 121 performMicrotaskCheckpoint(); |
122 el = testDiv.nodes[1].nodes.first; | 122 el = testDiv.nodes[1].nodes.first; |
123 expect(el.text, 'Hello cruel world!'); | 123 expect(el.text, 'Hello cruel world!'); |
124 | 124 |
125 model[sym('adj')] = 'happy'; | 125 model[sym('adj')] = 'happy'; |
126 deliverChangeRecords(); | 126 performMicrotaskCheckpoint(); |
127 expect(el.text, 'Hello happy world!'); | 127 expect(el.text, 'Hello happy world!'); |
128 }); | 128 }); |
129 | 129 |
130 test('InputElementTextBinding', () { | 130 observeTest('InputElementTextBinding', () { |
131 var model = toSymbolMap({'val': 'ping'}); | 131 var model = toSymbolMap({'val': 'ping'}); |
132 | 132 |
133 var el = new InputElement(); | 133 var el = new InputElement(); |
134 el.bind('value', model, 'val'); | 134 el.bind('value', model, 'val'); |
135 deliverChangeRecords(); | 135 performMicrotaskCheckpoint(); |
136 expect(el.value, 'ping'); | 136 expect(el.value, 'ping'); |
137 | 137 |
138 el.value = 'pong'; | 138 el.value = 'pong'; |
139 dispatchEvent('input', el); | 139 dispatchEvent('input', el); |
140 expect(model[sym('val')], 'pong'); | 140 expect(model[sym('val')], 'pong'); |
141 | 141 |
142 // Try a deep path. | 142 // Try a deep path. |
143 model = toSymbolMap({'a': {'b': {'c': 'ping'}}}); | 143 model = toSymbolMap({'a': {'b': {'c': 'ping'}}}); |
144 | 144 |
145 el.bind('value', model, 'a.b.c'); | 145 el.bind('value', model, 'a.b.c'); |
146 deliverChangeRecords(); | 146 performMicrotaskCheckpoint(); |
147 expect(el.value, 'ping'); | 147 expect(el.value, 'ping'); |
148 | 148 |
149 el.value = 'pong'; | 149 el.value = 'pong'; |
150 dispatchEvent('input', el); | 150 dispatchEvent('input', el); |
151 expect(observePath(model, 'a.b.c').value, 'pong'); | 151 expect(observePath(model, 'a.b.c').value, 'pong'); |
152 | 152 |
153 // Start with the model property being absent. | 153 // Start with the model property being absent. |
154 model[sym('a')][sym('b')].remove(sym('c')); | 154 model[sym('a')][sym('b')].remove(sym('c')); |
155 deliverChangeRecords(); | 155 performMicrotaskCheckpoint(); |
156 expect(el.value, ''); | 156 expect(el.value, ''); |
157 | 157 |
158 el.value = 'pong'; | 158 el.value = 'pong'; |
159 dispatchEvent('input', el); | 159 dispatchEvent('input', el); |
160 expect(observePath(model, 'a.b.c').value, 'pong'); | 160 expect(observePath(model, 'a.b.c').value, 'pong'); |
161 deliverChangeRecords(); | 161 performMicrotaskCheckpoint(); |
162 | 162 |
163 // Model property unreachable (and unsettable). | 163 // Model property unreachable (and unsettable). |
164 model[sym('a')].remove(sym('b')); | 164 model[sym('a')].remove(sym('b')); |
165 deliverChangeRecords(); | 165 performMicrotaskCheckpoint(); |
166 expect(el.value, ''); | 166 expect(el.value, ''); |
167 | 167 |
168 el.value = 'pong'; | 168 el.value = 'pong'; |
169 dispatchEvent('input', el); | 169 dispatchEvent('input', el); |
170 expect(observePath(model, 'a.b.c').value, null); | 170 expect(observePath(model, 'a.b.c').value, null); |
171 }); | 171 }); |
172 | 172 |
173 test('InputElementCheckbox', () { | 173 observeTest('InputElementCheckbox', () { |
174 var model = toSymbolMap({'val': true}); | 174 var model = toSymbolMap({'val': true}); |
175 | 175 |
176 var el = new InputElement(); | 176 var el = new InputElement(); |
177 testDiv.append(el); | 177 testDiv.append(el); |
178 el.type = 'checkbox'; | 178 el.type = 'checkbox'; |
179 el.bind('checked', model, 'val'); | 179 el.bind('checked', model, 'val'); |
180 deliverChangeRecords(); | 180 performMicrotaskCheckpoint(); |
181 expect(el.checked, true); | 181 expect(el.checked, true); |
182 | 182 |
183 model[sym('val')] = false; | 183 model[sym('val')] = false; |
184 deliverChangeRecords(); | 184 performMicrotaskCheckpoint(); |
185 expect(el.checked, false); | 185 expect(el.checked, false); |
186 | 186 |
187 el.click(); | 187 el.click(); |
188 expect(model[sym('val')], true); | 188 expect(model[sym('val')], true); |
189 | 189 |
190 el.click(); | 190 el.click(); |
191 expect(model[sym('val')], false); | 191 expect(model[sym('val')], false); |
192 | 192 |
193 el.onClick.listen((_) { | 193 el.onClick.listen((_) { |
194 expect(model[sym('val')], true); | 194 expect(model[sym('val')], true); |
195 }); | 195 }); |
196 el.onChange.listen((_) { | 196 el.onChange.listen((_) { |
197 expect(model[sym('val')], true); | 197 expect(model[sym('val')], true); |
198 }); | 198 }); |
199 | 199 |
200 el.dispatchEvent(new MouseEvent('click', view: window)); | 200 el.dispatchEvent(new MouseEvent('click', view: window)); |
201 }); | 201 }); |
202 | 202 |
203 test('InputElementCheckbox - binding updated on click', () { | 203 observeTest('InputElementCheckbox - binding updated on click', () { |
204 var model = toSymbolMap({'val': true}); | 204 var model = toSymbolMap({'val': true}); |
205 | 205 |
206 var el = new InputElement(); | 206 var el = new InputElement(); |
207 testDiv.append(el); | 207 testDiv.append(el); |
208 el.type = 'checkbox'; | 208 el.type = 'checkbox'; |
209 el.bind('checked', model, 'val'); | 209 el.bind('checked', model, 'val'); |
210 deliverChangeRecords(); | 210 performMicrotaskCheckpoint(); |
211 expect(el.checked, true); | 211 expect(el.checked, true); |
212 | 212 |
213 el.onClick.listen((_) { | 213 el.onClick.listen((_) { |
214 expect(model[sym('val')], false); | 214 expect(model[sym('val')], false); |
215 }); | 215 }); |
216 | 216 |
217 el.dispatchEvent(new MouseEvent('click', view: window)); | 217 el.dispatchEvent(new MouseEvent('click', view: window)); |
218 }); | 218 }); |
219 | 219 |
220 test('InputElementCheckbox - binding updated on change', () { | 220 observeTest('InputElementCheckbox - binding updated on change', () { |
221 var model = toSymbolMap({'val': true}); | 221 var model = toSymbolMap({'val': true}); |
222 | 222 |
223 var el = new InputElement(); | 223 var el = new InputElement(); |
224 testDiv.append(el); | 224 testDiv.append(el); |
225 el.type = 'checkbox'; | 225 el.type = 'checkbox'; |
226 el.bind('checked', model, 'val'); | 226 el.bind('checked', model, 'val'); |
227 deliverChangeRecords(); | 227 performMicrotaskCheckpoint(); |
228 expect(el.checked, true); | 228 expect(el.checked, true); |
229 | 229 |
230 el.onChange.listen((_) { | 230 el.onChange.listen((_) { |
231 expect(model[sym('val')], false); | 231 expect(model[sym('val')], false); |
232 }); | 232 }); |
233 | 233 |
234 el.dispatchEvent(new MouseEvent('click', view: window)); | 234 el.dispatchEvent(new MouseEvent('click', view: window)); |
235 }); | 235 }); |
236 | 236 |
237 test('InputElementRadio', () { | 237 observeTest('InputElementRadio', () { |
238 var model = toSymbolMap({'val1': true, 'val2': false, 'val3': false, | 238 var model = toSymbolMap({'val1': true, 'val2': false, 'val3': false, |
239 'val4': true}); | 239 'val4': true}); |
240 var RADIO_GROUP_NAME = 'test'; | 240 var RADIO_GROUP_NAME = 'observeTest'; |
241 | 241 |
242 var container = testDiv; | 242 var container = testDiv; |
243 | 243 |
244 var el1 = new InputElement(); | 244 var el1 = new InputElement(); |
245 testDiv.append(el1); | 245 testDiv.append(el1); |
246 el1.type = 'radio'; | 246 el1.type = 'radio'; |
247 el1.name = RADIO_GROUP_NAME; | 247 el1.name = RADIO_GROUP_NAME; |
248 el1.bind('checked', model, 'val1'); | 248 el1.bind('checked', model, 'val1'); |
249 | 249 |
250 var el2 = new InputElement(); | 250 var el2 = new InputElement(); |
251 testDiv.append(el2); | 251 testDiv.append(el2); |
252 el2.type = 'radio'; | 252 el2.type = 'radio'; |
253 el2.name = RADIO_GROUP_NAME; | 253 el2.name = RADIO_GROUP_NAME; |
254 el2.bind('checked', model, 'val2'); | 254 el2.bind('checked', model, 'val2'); |
255 | 255 |
256 var el3 = new InputElement(); | 256 var el3 = new InputElement(); |
257 testDiv.append(el3); | 257 testDiv.append(el3); |
258 el3.type = 'radio'; | 258 el3.type = 'radio'; |
259 el3.name = RADIO_GROUP_NAME; | 259 el3.name = RADIO_GROUP_NAME; |
260 el3.bind('checked', model, 'val3'); | 260 el3.bind('checked', model, 'val3'); |
261 | 261 |
262 var el4 = new InputElement(); | 262 var el4 = new InputElement(); |
263 testDiv.append(el4); | 263 testDiv.append(el4); |
264 el4.type = 'radio'; | 264 el4.type = 'radio'; |
265 el4.name = 'othergroup'; | 265 el4.name = 'othergroup'; |
266 el4.bind('checked', model, 'val4'); | 266 el4.bind('checked', model, 'val4'); |
267 | 267 |
268 deliverChangeRecords(); | 268 performMicrotaskCheckpoint(); |
269 expect(el1.checked, true); | 269 expect(el1.checked, true); |
270 expect(el2.checked, false); | 270 expect(el2.checked, false); |
271 expect(el3.checked, false); | 271 expect(el3.checked, false); |
272 expect(el4.checked, true); | 272 expect(el4.checked, true); |
273 | 273 |
274 model[sym('val1')] = false; | 274 model[sym('val1')] = false; |
275 model[sym('val2')] = true; | 275 model[sym('val2')] = true; |
276 deliverChangeRecords(); | 276 performMicrotaskCheckpoint(); |
277 expect(el1.checked, false); | 277 expect(el1.checked, false); |
278 expect(el2.checked, true); | 278 expect(el2.checked, true); |
279 expect(el3.checked, false); | 279 expect(el3.checked, false); |
280 expect(el4.checked, true); | 280 expect(el4.checked, true); |
281 | 281 |
282 el1.checked = true; | 282 el1.checked = true; |
283 dispatchEvent('change', el1); | 283 dispatchEvent('change', el1); |
284 expect(model[sym('val1')], true); | 284 expect(model[sym('val1')], true); |
285 expect(model[sym('val2')], false); | 285 expect(model[sym('val2')], false); |
286 expect(model[sym('val3')], false); | 286 expect(model[sym('val3')], false); |
287 expect(model[sym('val4')], true); | 287 expect(model[sym('val4')], true); |
288 | 288 |
289 el3.checked = true; | 289 el3.checked = true; |
290 dispatchEvent('change', el3); | 290 dispatchEvent('change', el3); |
291 expect(model[sym('val1')], false); | 291 expect(model[sym('val1')], false); |
292 expect(model[sym('val2')], false); | 292 expect(model[sym('val2')], false); |
293 expect(model[sym('val3')], true); | 293 expect(model[sym('val3')], true); |
294 expect(model[sym('val4')], true); | 294 expect(model[sym('val4')], true); |
295 }); | 295 }); |
296 | 296 |
297 test('InputElementRadioMultipleForms', () { | 297 observeTest('InputElementRadioMultipleForms', () { |
298 var model = toSymbolMap({'val1': true, 'val2': false, 'val3': false, | 298 var model = toSymbolMap({'val1': true, 'val2': false, 'val3': false, |
299 'val4': true}); | 299 'val4': true}); |
300 var RADIO_GROUP_NAME = 'test'; | 300 var RADIO_GROUP_NAME = 'observeTest'; |
301 | 301 |
302 var form1 = new FormElement(); | 302 var form1 = new FormElement(); |
303 testDiv.append(form1); | 303 testDiv.append(form1); |
304 var form2 = new FormElement(); | 304 var form2 = new FormElement(); |
305 testDiv.append(form2); | 305 testDiv.append(form2); |
306 | 306 |
307 var el1 = new InputElement(); | 307 var el1 = new InputElement(); |
308 form1.append(el1); | 308 form1.append(el1); |
309 el1.type = 'radio'; | 309 el1.type = 'radio'; |
310 el1.name = RADIO_GROUP_NAME; | 310 el1.name = RADIO_GROUP_NAME; |
(...skipping 10 matching lines...) Expand all Loading... |
321 el3.type = 'radio'; | 321 el3.type = 'radio'; |
322 el3.name = RADIO_GROUP_NAME; | 322 el3.name = RADIO_GROUP_NAME; |
323 el3.bind('checked', model, 'val3'); | 323 el3.bind('checked', model, 'val3'); |
324 | 324 |
325 var el4 = new InputElement(); | 325 var el4 = new InputElement(); |
326 form2.append(el4); | 326 form2.append(el4); |
327 el4.type = 'radio'; | 327 el4.type = 'radio'; |
328 el4.name = RADIO_GROUP_NAME; | 328 el4.name = RADIO_GROUP_NAME; |
329 el4.bind('checked', model, 'val4'); | 329 el4.bind('checked', model, 'val4'); |
330 | 330 |
331 deliverChangeRecords(); | 331 performMicrotaskCheckpoint(); |
332 expect(el1.checked, true); | 332 expect(el1.checked, true); |
333 expect(el2.checked, false); | 333 expect(el2.checked, false); |
334 expect(el3.checked, false); | 334 expect(el3.checked, false); |
335 expect(el4.checked, true); | 335 expect(el4.checked, true); |
336 | 336 |
337 el2.checked = true; | 337 el2.checked = true; |
338 dispatchEvent('change', el2); | 338 dispatchEvent('change', el2); |
339 expect(model[sym('val1')], false); | 339 expect(model[sym('val1')], false); |
340 expect(model[sym('val2')], true); | 340 expect(model[sym('val2')], true); |
341 | 341 |
342 // Radio buttons in form2 should be unaffected | 342 // Radio buttons in form2 should be unaffected |
343 expect(model[sym('val3')], false); | 343 expect(model[sym('val3')], false); |
344 expect(model[sym('val4')], true); | 344 expect(model[sym('val4')], true); |
345 | 345 |
346 el3.checked = true; | 346 el3.checked = true; |
347 dispatchEvent('change', el3); | 347 dispatchEvent('change', el3); |
348 expect(model[sym('val3')], true); | 348 expect(model[sym('val3')], true); |
349 expect(model[sym('val4')], false); | 349 expect(model[sym('val4')], false); |
350 | 350 |
351 // Radio buttons in form1 should be unaffected | 351 // Radio buttons in form1 should be unaffected |
352 expect(model[sym('val1')], false); | 352 expect(model[sym('val1')], false); |
353 expect(model[sym('val2')], true); | 353 expect(model[sym('val2')], true); |
354 }); | 354 }); |
355 | 355 |
356 test('BindToChecked', () { | 356 observeTest('BindToChecked', () { |
357 var div = new DivElement(); | 357 var div = new DivElement(); |
358 testDiv.append(div); | 358 testDiv.append(div); |
359 var child = new DivElement(); | 359 var child = new DivElement(); |
360 div.append(child); | 360 div.append(child); |
361 var input = new InputElement(); | 361 var input = new InputElement(); |
362 child.append(input); | 362 child.append(input); |
363 input.type = 'checkbox'; | 363 input.type = 'checkbox'; |
364 | 364 |
365 var model = toSymbolMap({'a': {'b': false}}); | 365 var model = toSymbolMap({'a': {'b': false}}); |
366 input.bind('checked', model, 'a.b'); | 366 input.bind('checked', model, 'a.b'); |
367 | 367 |
368 input.click(); | 368 input.click(); |
369 expect(model[sym('a')][sym('b')], true); | 369 expect(model[sym('a')][sym('b')], true); |
370 | 370 |
371 input.click(); | 371 input.click(); |
372 expect(model[sym('a')][sym('b')], false); | 372 expect(model[sym('a')][sym('b')], false); |
373 }); | 373 }); |
374 | 374 |
375 test('Select selectedIndex', () { | 375 observeTest('Select selectedIndex', () { |
376 var select = new SelectElement(); | 376 var select = new SelectElement(); |
377 testDiv.append(select); | 377 testDiv.append(select); |
378 var option0 = select.append(new OptionElement()); | 378 var option0 = select.append(new OptionElement()); |
379 var option1 = select.append(new OptionElement()); | 379 var option1 = select.append(new OptionElement()); |
380 var option2 = select.append(new OptionElement()); | 380 var option2 = select.append(new OptionElement()); |
381 | 381 |
382 var model = toSymbolMap({'val': 2}); | 382 var model = toSymbolMap({'val': 2}); |
383 | 383 |
384 select.bind('selectedIndex', model, 'val'); | 384 select.bind('selectedIndex', model, 'val'); |
385 deliverChangeRecords(); | 385 performMicrotaskCheckpoint(); |
386 expect(select.selectedIndex, 2); | 386 expect(select.selectedIndex, 2); |
387 | 387 |
388 select.selectedIndex = 1; | 388 select.selectedIndex = 1; |
389 dispatchEvent('change', select); | 389 dispatchEvent('change', select); |
390 expect(model[sym('val')], 1); | 390 expect(model[sym('val')], 1); |
391 }); | 391 }); |
392 | 392 |
393 test('MultipleReferences', () { | 393 observeTest('MultipleReferences', () { |
394 var el = new DivElement(); | 394 var el = new DivElement(); |
395 var template = new Element.html('<template bind>'); | 395 var template = new Element.html('<template bind>'); |
396 template.content.append(el); | 396 template.content.append(el); |
397 testDiv.append(template); | 397 testDiv.append(template); |
398 | 398 |
399 var model = toSymbolMap({'foo': 'bar'}); | 399 var model = toSymbolMap({'foo': 'bar'}); |
400 el.attributes['foo'] = '{{foo}} {{foo}}'; | 400 el.attributes['foo'] = '{{foo}} {{foo}}'; |
401 template.model = model; | 401 template.model = model; |
402 | 402 |
403 deliverChangeRecords(); | 403 performMicrotaskCheckpoint(); |
404 el = testDiv.nodes[1]; | 404 el = testDiv.nodes[1]; |
405 expect(el.attributes['foo'], 'bar bar'); | 405 expect(el.attributes['foo'], 'bar bar'); |
406 }); | 406 }); |
407 } | 407 } |
OLD | NEW |