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

Side by Side Diff: tests/html/element_bindings_test.dart

Issue 14732003: Implement Model-Driven-Views spec for Dart (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: comment tweaks Created 7 years, 7 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
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library node_bindings_test;
6
7 import 'dart:async';
8 import 'dart:html';
9 import 'dart:observe';
10 import '../../pkg/unittest/lib/unittest.dart';
11 import '../../pkg/unittest/lib/html_config.dart';
12
13 // Note: this file ported from
14 // https://github.com/toolkitchen/mdv/blob/master/tests/element_bindings.js
15
16 main() {
17 useHtmlConfiguration();
18 group('Element Bindings', elementBindingTests);
19 }
20
21 elementBindingTests() {
22 var testDiv;
23
24 setUp(() {
25 document.body.nodes.add(testDiv = new DivElement());
26 });
27
28 tearDown(() {
29 testDiv.remove();
30 testDiv = null;
31 });
32
33 dispatchEvent(type, target) {
34 target.dispatchEvent(new Event(type, cancelable: false));
35 }
36
37 test('Text', () {
38 var template = new Element.html('<template bind>{{a}} and {{b}}');
39 testDiv.nodes.add(template);
40 var model = toObservable({'a': 1, 'b': 2});
41 template.model = model;
42 deliverChangeRecords();
43 var text = testDiv.nodes[1];
44 expect(text.text, '1 and 2');
45
46 model['a'] = 3;
47 deliverChangeRecords();
48 expect(text.text, '3 and 2');
49 });
50
51 test('SimpleBinding', () {
52 var el = new DivElement();
53 var model = toObservable({'a': '1'});
54 el.bind('foo', model, 'a');
55 deliverChangeRecords();
56 expect(el.attributes['foo'], '1');
57
58 model['a'] = '2';
59 deliverChangeRecords();
60 expect(el.attributes['foo'], '2');
61
62 model['a'] = 232.2;
63 deliverChangeRecords();
64 expect(el.attributes['foo'], '232.2');
65
66 model['a'] = 232;
67 deliverChangeRecords();
68 expect(el.attributes['foo'], '232');
69
70 model['a'] = null;
71 deliverChangeRecords();
72 expect(el.attributes['foo'], '');
73 });
74
75 test('SimpleBindingWithDashes', () {
76 var el = new DivElement();
77 var model = toObservable({'a': '1'});
78 el.bind('foo-bar', model, 'a');
79 deliverChangeRecords();
80 expect(el.attributes['foo-bar'], '1');
81
82 model['a'] = '2';
83 deliverChangeRecords();
84 expect(el.attributes['foo-bar'], '2');
85 });
86
87 test('SimpleBindingWithComment', () {
88 var el = new DivElement();
89 el.innerHtml = '<!-- Comment -->';
90 var model = toObservable({'a': '1'});
91 el.bind('foo-bar', model, 'a');
92 deliverChangeRecords();
93 expect(el.attributes['foo-bar'], '1');
94
95 model['a'] = '2';
96 deliverChangeRecords();
97 expect(el.attributes['foo-bar'], '2');
98 });
99
100 test('PlaceHolderBindingText', () {
101 var model = toObservable({
102 'adj': 'cruel',
103 'noun': 'world'
104 });
105
106 var el = new DivElement();
107 el.text = 'dummy';
108 el.nodes.first.text = 'Hello {{ adj }} {{noun}}!';
109 var template = new Element.html('<template bind>');
110 template.content.nodes.add(el);
111 testDiv.nodes.add(template);
112 template.model = model;
113
114 deliverChangeRecords();
115 el = testDiv.nodes[1].nodes.first;
116 expect(el.text, 'Hello cruel world!');
117
118 model['adj'] = 'happy';
119 deliverChangeRecords();
120 expect(el.text, 'Hello happy world!');
121 });
122
123 test('InputElementTextBinding', () {
124 var model = toObservable({'val': 'ping'});
125
126 var el = new InputElement();
127 el.bind('value', model, 'val');
128 deliverChangeRecords();
129 expect(el.value, 'ping');
130
131 el.value = 'pong';
132 dispatchEvent('input', el);
133 expect(model['val'], 'pong');
134
135 // Try a deep path.
136 model = toObservable({'a': {'b': {'c': 'ping'}}});
137
138 el.bind('value', model, 'a.b.c');
139 deliverChangeRecords();
140 expect(el.value, 'ping');
141
142 el.value = 'pong';
143 dispatchEvent('input', el);
144 expect(observePath(model, 'a.b.c').value, 'pong');
145
146 // Start with the model property being absent.
147 model['a']['b'].remove('c');
148 deliverChangeRecords();
149 expect(el.value, '');
150
151 el.value = 'pong';
152 dispatchEvent('input', el);
153 expect(observePath(model, 'a.b.c').value, 'pong');
154 deliverChangeRecords();
155
156 // Model property unreachable (and unsettable).
157 model['a'].remove('b');
158 deliverChangeRecords();
159 expect(el.value, '');
160
161 el.value = 'pong';
162 dispatchEvent('input', el);
163 expect(observePath(model, 'a.b.c').value, null);
164 });
165
166 test('InputElementCheckbox', () {
167 var model = toObservable({'val': true});
168
169 var el = new InputElement();
170 testDiv.nodes.add(el);
171 el.type = 'checkbox';
172 el.bind('checked', model, 'val');
173 deliverChangeRecords();
174 expect(el.checked, true);
175
176 model['val'] = false;
177 deliverChangeRecords();
178 expect(el.checked, false);
179
180 el.click();
181 expect(model['val'], true);
182
183 el.click();
184 expect(model['val'], false);
185 });
186
187 test('InputElementRadio', () {
188 var model = toObservable({'val1': true, 'val2': false, 'val3': false,
189 'val4': true});
190 var RADIO_GROUP_NAME = 'test';
191
192 var container = testDiv;
193
194 var el1 = new InputElement();
195 testDiv.nodes.add(el1);
196 el1.type = 'radio';
197 el1.name = RADIO_GROUP_NAME;
198 el1.bind('checked', model, 'val1');
199
200 var el2 = new InputElement();
201 testDiv.nodes.add(el2);
202 el2.type = 'radio';
203 el2.name = RADIO_GROUP_NAME;
204 el2.bind('checked', model, 'val2');
205
206 var el3 = new InputElement();
207 testDiv.nodes.add(el3);
208 el3.type = 'radio';
209 el3.name = RADIO_GROUP_NAME;
210 el3.bind('checked', model, 'val3');
211
212 var el4 = new InputElement();
213 testDiv.nodes.add(el4);
214 el4.type = 'radio';
215 el4.name = 'othergroup';
216 el4.bind('checked', model, 'val4');
217
218 deliverChangeRecords();
219 expect(el1.checked, true);
220 expect(el2.checked, false);
221 expect(el3.checked, false);
222 expect(el4.checked, true);
223
224 model['val1'] = false;
225 model['val2'] = true;
226 deliverChangeRecords();
227 expect(el1.checked, false);
228 expect(el2.checked, true);
229 expect(el3.checked, false);
230 expect(el4.checked, true);
231
232 el1.checked = true;
233 dispatchEvent('change', el1);
234 expect(model['val1'], true);
235 expect(model['val2'], false);
236 expect(model['val3'], false);
237 expect(model['val4'], true);
238
239 el3.checked = true;
240 dispatchEvent('change', el3);
241 expect(model['val1'], false);
242 expect(model['val2'], false);
243 expect(model['val3'], true);
244 expect(model['val4'], true);
245 });
246
247 test('InputElementRadioMultipleForms', () {
248 var model = toObservable({'val1': true, 'val2': false, 'val3': false,
249 'val4': true});
250 var RADIO_GROUP_NAME = 'test';
251
252 var form1 = new FormElement();
253 testDiv.nodes.add(form1);
254 var form2 = new FormElement();
255 testDiv.nodes.add(form2);
256
257 var el1 = new InputElement();
258 form1.nodes.add(el1);
259 el1.type = 'radio';
260 el1.name = RADIO_GROUP_NAME;
261 el1.bind('checked', model, 'val1');
262
263 var el2 = new InputElement();
264 form1.nodes.add(el2);
265 el2.type = 'radio';
266 el2.name = RADIO_GROUP_NAME;
267 el2.bind('checked', model, 'val2');
268
269 var el3 = new InputElement();
270 form2.nodes.add(el3);
271 el3.type = 'radio';
272 el3.name = RADIO_GROUP_NAME;
273 el3.bind('checked', model, 'val3');
274
275 var el4 = new InputElement();
276 form2.nodes.add(el4);
277 el4.type = 'radio';
278 el4.name = RADIO_GROUP_NAME;
279 el4.bind('checked', model, 'val4');
280
281 deliverChangeRecords();
282 expect(el1.checked, true);
283 expect(el2.checked, false);
284 expect(el3.checked, false);
285 expect(el4.checked, true);
286
287 el2.checked = true;
288 dispatchEvent('change', el2);
289 expect(model['val1'], false);
290 expect(model['val2'], true);
291
292 // Radio buttons in form2 should be unaffected
293 expect(model['val3'], false);
294 expect(model['val4'], true);
295
296 el3.checked = true;
297 dispatchEvent('change', el3);
298 expect(model['val3'], true);
299 expect(model['val4'], false);
300
301 // Radio buttons in form1 should be unaffected
302 expect(model['val1'], false);
303 expect(model['val2'], true);
304 });
305
306 test('BindToChecked', () {
307 var div = new DivElement();
308 testDiv.nodes.add(div);
309 var child = new DivElement();
310 div.nodes.add(child);
311 var input = new InputElement();
312 child.nodes.add(input);
313 input.type = 'checkbox';
314
315 var model = toObservable({'a': {'b': false}});
316 input.bind('checked', model, 'a.b');
317
318 input.click();
319 expect(model['a']['b'], true);
320
321 input.click();
322 expect(model['a']['b'], false);
323 });
324
325 test('MultipleReferences', () {
326 var el = new DivElement();
327 var template = new Element.html('<template bind>');
328 template.content.nodes.add(el);
329 testDiv.nodes.add(template);
330
331 var model = toObservable({'foo': 'bar'});
332 el.attributes['foo'] = '{{foo}} {{foo}}';
333 template.model = model;
334
335 deliverChangeRecords();
336 el = testDiv.nodes[1];
337 expect(el.attributes['foo'], 'bar bar');
338 });
339 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698