| 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 bindings_test; | 5 library bindings_test; |
| 6 | 6 |
| 7 import 'dart:html'; | 7 import 'dart:html'; |
| 8 |
| 9 import 'package:logging/logging.dart'; |
| 8 import 'package:mdv/mdv.dart' as mdv; | 10 import 'package:mdv/mdv.dart' as mdv; |
| 9 import 'package:observe/observe.dart'; | 11 import 'package:observe/observe.dart'; |
| 10 import 'package:observe/src/microtask.dart'; | 12 import 'package:observe/src/microtask.dart'; |
| 11 import 'package:polymer_expressions/polymer_expressions.dart'; | 13 import 'package:polymer_expressions/polymer_expressions.dart'; |
| 12 import 'package:unittest/html_config.dart'; | 14 import 'package:unittest/html_config.dart'; |
| 13 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 14 | 16 |
| 15 main() { | 17 main() { |
| 16 mdv.initialize(); | 18 mdv.initialize(); |
| 17 useHtmlConfiguration(); | 19 useHtmlConfiguration(); |
| 18 | 20 |
| 19 group('cursor position tests', () { | 21 group('bindings', () { |
| 22 var stop = null; |
| 23 var messages = []; |
| 20 var testDiv; | 24 var testDiv; |
| 21 setUp(() { | 25 setUp(() { |
| 26 stop = Logger.root.onRecord.listen((r) => messages.add(r)); |
| 22 document.body.append(testDiv = new DivElement()); | 27 document.body.append(testDiv = new DivElement()); |
| 23 }); | 28 }); |
| 24 | 29 |
| 25 tearDown(() { | 30 tearDown(() { |
| 26 testDiv.remove(); | 31 testDiv.remove(); |
| 27 testDiv = null; | 32 testDiv = null; |
| 33 stop.cancel(); |
| 34 stop = null; |
| 35 messages = []; |
| 28 }); | 36 }); |
| 29 | 37 |
| 30 test('cursor position test', wrapMicrotask(() { | 38 observeTest('should update binding when data changes', () { |
| 39 var model = new NotifyModel(); |
| 40 var binding = new PolymerExpressions() |
| 41 .getBinding(model, 'x', null, null); |
| 42 expect(binding.value, isNull); |
| 43 model.x = "hi"; |
| 44 performMicrotaskCheckpoint(); |
| 45 expect(binding.value, 'hi'); |
| 46 expect(messages.length, 0); |
| 47 }); |
| 48 |
| 49 observeTest('should update text content when data changes', () { |
| 50 var model = new NotifyModel('abcde'); |
| 51 var template = new Element.html( |
| 52 '<template><span>{{x}}</span></template>'); |
| 53 testDiv.append(template.createInstance(model, new PolymerExpressions())); |
| 54 |
| 55 performMicrotaskCheckpoint(); |
| 56 var el = testDiv.query("span"); |
| 57 expect(el.text, 'abcde'); |
| 58 expect(model.x, 'abcde'); |
| 59 model.x = '___'; |
| 60 |
| 61 performMicrotaskCheckpoint(); |
| 62 expect(model.x, '___'); |
| 63 expect(el.text, '___'); |
| 64 }); |
| 65 |
| 66 observeTest('should log eval exceptions', () { |
| 67 var model = new NotifyModel('abcde'); |
| 68 var template = new Element.html( |
| 69 '<template><span>{{foo}}</span></template>'); |
| 70 testDiv.append(template.createInstance(model, new PolymerExpressions())); |
| 71 performMicrotaskCheckpoint(); |
| 72 expect(messages.length, 1); |
| 73 expect(messages[0].message, |
| 74 "Error evaluating expression 'foo': variable 'foo' not found"); |
| 75 }); |
| 76 |
| 77 observeTest('should preserve the cursor position', () { |
| 31 var model = new NotifyModel('abcde'); | 78 var model = new NotifyModel('abcde'); |
| 32 var template = new Element.html( | 79 var template = new Element.html( |
| 33 '<template><input id="i1" value={{x}}></template>'); | 80 '<template><input id="i1" value={{x}}></template>'); |
| 34 testDiv.append(template.createInstance(model, new PolymerExpressions())); | 81 testDiv.append(template.createInstance(model, new PolymerExpressions())); |
| 35 | 82 |
| 36 performMicrotaskCheckpoint(); | 83 performMicrotaskCheckpoint(); |
| 37 var el = testDiv.query("#i1"); | 84 var el = testDiv.query("#i1"); |
| 38 var subscription = el.onInput.listen(expectAsync1((_) { | 85 var subscription = el.onInput.listen(expectAsync1((_) { |
| 39 performMicrotaskCheckpoint(); | 86 performMicrotaskCheckpoint(); |
| 40 }, count: 1)); | 87 }, count: 1)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 61 el.dispatchEvent(new Event('input')); | 108 el.dispatchEvent(new Event('input')); |
| 62 expect(model.x, 'abc de'); | 109 expect(model.x, 'abc de'); |
| 63 expect(el.value, 'abc de'); | 110 expect(el.value, 'abc de'); |
| 64 | 111 |
| 65 // But propagating observable values through reassign the value and | 112 // But propagating observable values through reassign the value and |
| 66 // selection will be preserved. | 113 // selection will be preserved. |
| 67 expect(el.selectionStart, 4); | 114 expect(el.selectionStart, 4); |
| 68 expect(el.selectionEnd, 4); | 115 expect(el.selectionEnd, 4); |
| 69 | 116 |
| 70 subscription.cancel(); | 117 subscription.cancel(); |
| 71 })); | 118 }); |
| 72 }); | 119 }); |
| 73 } | 120 } |
| 74 | 121 |
| 75 @reflectable | 122 @reflectable |
| 76 class NotifyModel extends ChangeNotifier { | 123 class NotifyModel extends ChangeNotifier { |
| 77 var _x; | 124 var _x; |
| 78 NotifyModel([this._x]); | 125 NotifyModel([this._x]); |
| 79 | 126 |
| 80 get x => _x; | 127 get x => _x; |
| 81 set x(value) { | 128 set x(value) { |
| 82 _x = notifyPropertyChange(const Symbol('x'), _x, value); | 129 _x = notifyPropertyChange(#x, _x, value); |
| 83 } | 130 } |
| 84 } | 131 } |
| 132 |
| 133 observeTest(name, testCase) => test(name, wrapMicrotask(testCase)); |
| OLD | NEW |