| 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.node_bindings_test; | 5 library template_binding.test.node_bind_test; |
| 6 | 6 |
| 7 import 'dart:html'; | 7 import 'dart:html'; |
| 8 | 8 |
| 9 @MirrorsUsed(targets: const [NodeBinding], override: | 9 import 'package:observe/observe.dart' show toObservable, PathObserver; |
| 10 'template_binding.test.node_bindings_test') | 10 import 'package:template_binding/template_binding.dart' show nodeBind; |
| 11 import 'dart:mirrors'; | 11 import 'package:template_binding/src/node_binding.dart' show getObserverForTest; |
| 12 | 12 |
| 13 import 'package:observe/observe.dart' show toObservable, PathObserver; | |
| 14 import 'package:template_binding/template_binding.dart' | |
| 15 show nodeBind, NodeBinding; | |
| 16 import 'package:unittest/html_config.dart'; | 13 import 'package:unittest/html_config.dart'; |
| 17 import 'package:unittest/unittest.dart'; | 14 import 'package:unittest/unittest.dart'; |
| 18 import 'utils.dart'; | 15 import 'utils.dart'; |
| 19 | 16 |
| 20 // Note: this file ported from | 17 // Note: this file ported from |
| 21 // https://github.com/toolkitchen/mdv/blob/master/tests/node_bindings.js | 18 // https://github.com/toolkitchen/mdv/blob/master/tests/node_bindings.js |
| 22 | 19 |
| 23 main() { | 20 main() { |
| 24 useHtmlConfiguration(); | 21 useHtmlConfiguration(); |
| 25 | 22 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 }); | 62 }); |
| 66 | 63 |
| 67 observeTest('Path unreachable', () { | 64 observeTest('Path unreachable', () { |
| 68 var text = testDiv.append(new Text('hi')); | 65 var text = testDiv.append(new Text('hi')); |
| 69 var model = 1; | 66 var model = 1; |
| 70 nodeBind(text).bind('text', model, 'a'); | 67 nodeBind(text).bind('text', model, 'a'); |
| 71 expect(text.text, ''); | 68 expect(text.text, ''); |
| 72 }); | 69 }); |
| 73 | 70 |
| 74 observeTest('Observer is Model', () { | 71 observeTest('Observer is Model', () { |
| 75 _observer(x) => reflect(x).getField( | |
| 76 privateSymbol(NodeBinding, '_observer')).reflectee; | |
| 77 | |
| 78 var text = new Text(''); | 72 var text = new Text(''); |
| 79 var model = toObservable({'a': {'b': {'c': 1}}}); | 73 var model = toObservable({'a': {'b': {'c': 1}}}); |
| 80 var observer = new PathObserver(model, 'a.b.c'); | 74 var observer = new PathObserver(model, 'a.b.c'); |
| 81 nodeBind(text).bind('text', observer, 'value'); | 75 nodeBind(text).bind('text', observer, 'value'); |
| 82 expect(text.text, '1'); | 76 expect(text.text, '1'); |
| 83 | 77 |
| 84 var binding = nodeBind(text).bindings['text']; | 78 var binding = nodeBind(text).bindings['text']; |
| 85 expect(binding, isNotNull); | 79 expect(binding, isNotNull); |
| 86 expect(privateField(binding, '_observer'), observer, | 80 expect(getObserverForTest(binding), observer, |
| 87 reason: 'should reuse observer'); | 81 reason: 'should reuse observer'); |
| 88 | 82 |
| 89 model['a']['b']['c'] = 2; | 83 model['a']['b']['c'] = 2; |
| 90 performMicrotaskCheckpoint(); | 84 performMicrotaskCheckpoint(); |
| 91 expect(text.text, '2'); | 85 expect(text.text, '2'); |
| 92 nodeBind(text).unbind('text'); | 86 nodeBind(text).unbind('text'); |
| 93 }); | 87 }); |
| 94 } | 88 } |
| 95 | 89 |
| 96 elementBindings() { | 90 elementBindings() { |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 model['opt2'] = 'X'; | 641 model['opt2'] = 'X'; |
| 648 performMicrotaskCheckpoint(); | 642 performMicrotaskCheckpoint(); |
| 649 expect(select.value, 'X'); | 643 expect(select.value, 'X'); |
| 650 expect(model['selected'], 'X'); | 644 expect(model['selected'], 'X'); |
| 651 | 645 |
| 652 model['selected'] = 'a'; | 646 model['selected'] = 'a'; |
| 653 performMicrotaskCheckpoint(); | 647 performMicrotaskCheckpoint(); |
| 654 expect(select.value, 'a'); | 648 expect(select.value, 'a'); |
| 655 }); | 649 }); |
| 656 } | 650 } |
| 657 | |
| 658 privateField(x, name) => reflect(x).getField( | |
| 659 privateSymbol(reflect(x).type, name)).reflectee; | |
| 660 | |
| 661 // TODO(jmesserly): fix this when it's easier to get a private symbol. | |
| 662 privateSymbol(TypeMirror type, String name) { | |
| 663 while (type != null) { | |
| 664 var symbol = type.variables.keys.firstWhere( | |
| 665 (s) => MirrorSystem.getName(s) == name, orElse: () => null); | |
| 666 if (symbol != null) return symbol; | |
| 667 type = type.superclass; | |
| 668 } | |
| 669 return null; | |
| 670 } | |
| OLD | NEW |