| OLD | NEW |
| (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 } |
| OLD | NEW |