| 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 binding_syntax_test; |
| 6 |
| 7 import 'dart:async'; |
| 8 import 'dart:html'; |
| 9 import 'dart:observe'; |
| 10 import '../../pkg/unittest/lib/html_config.dart'; |
| 11 import '../../pkg/unittest/lib/mock.dart'; |
| 12 import '../../pkg/unittest/lib/unittest.dart'; |
| 13 |
| 14 // Note: this file ported from |
| 15 // https://github.com/toolkitchen/mdv/blob/master/tests/syntax.js |
| 16 |
| 17 main() { |
| 18 useHtmlConfiguration(); |
| 19 group('Syntax', syntaxTests); |
| 20 } |
| 21 |
| 22 syntaxTests() { |
| 23 var testDiv; |
| 24 |
| 25 setUp(() { |
| 26 document.body.nodes.add(testDiv = new DivElement()); |
| 27 }); |
| 28 |
| 29 tearDown(() { |
| 30 testDiv.remove(); |
| 31 testDiv = null; |
| 32 }); |
| 33 |
| 34 createTestHtml(s) { |
| 35 var div = new DivElement(); |
| 36 div.innerHtml = s; |
| 37 testDiv.nodes.add(div); |
| 38 |
| 39 for (var node in div.queryAll('*')) { |
| 40 if (node.isTemplate) TemplateElement.decorate(node); |
| 41 } |
| 42 |
| 43 return div; |
| 44 } |
| 45 |
| 46 recursivelySetTemplateModel(element, model) { |
| 47 for (var node in element.queryAll('*')) { |
| 48 if (node.isTemplate) node.model = model; |
| 49 } |
| 50 } |
| 51 |
| 52 test('Registration', () { |
| 53 var model = toObservable({ 'foo': 'bar'}); |
| 54 |
| 55 var testSyntax = new TestBindingSyntax(); |
| 56 TemplateElement.syntax['Test'] = testSyntax; |
| 57 |
| 58 var div = createTestHtml( |
| 59 '<template bind syntax="Test">{{ foo }}' + |
| 60 '<template bind>{{ foo }}</template></template>'); |
| 61 recursivelySetTemplateModel(div, model); |
| 62 deliverChangeRecords(); |
| 63 expect(div.nodes.length, 4); |
| 64 expect(div.nodes.last.text, 'bar'); |
| 65 expect(div.nodes[2].tagName, 'TEMPLATE'); |
| 66 expect(div.nodes[2].attributes['syntax'], 'Test'); |
| 67 |
| 68 expect(testSyntax.log, [ |
| 69 [model, 'foo', 'text', null], |
| 70 [model, '', 'bind', 'TEMPLATE'], |
| 71 [model, 'foo', 'text', null], |
| 72 ]); |
| 73 |
| 74 TemplateElement.syntax.remove('Test'); |
| 75 }); |
| 76 |
| 77 test('Basic', () { |
| 78 var model = toObservable({ 'foo': 2, 'bar': 4 }); |
| 79 |
| 80 TemplateElement.syntax['2x'] = new TimesTwoSyntax(); |
| 81 |
| 82 var div = createTestHtml( |
| 83 '<template bind syntax="2x">' |
| 84 '{{ foo }} + {{ 2x: bar }} + {{ 4x: bar }}</template>'); |
| 85 recursivelySetTemplateModel(div, model); |
| 86 deliverChangeRecords(); |
| 87 expect(div.nodes.length, 2); |
| 88 expect(div.nodes.last.text, '2 + 8 + '); |
| 89 |
| 90 model['foo'] = 4; |
| 91 model['bar'] = 8; |
| 92 deliverChangeRecords(); |
| 93 expect(div.nodes.last.text, '4 + 16 + '); |
| 94 |
| 95 TemplateElement.syntax.remove('2x'); |
| 96 }); |
| 97 |
| 98 test('Different Sub-Template Syntax', () { |
| 99 var model = toObservable({'foo': 'bar'}); |
| 100 |
| 101 TemplateElement.syntax['Test'] = new TestBindingSyntax(); |
| 102 TemplateElement.syntax['Test2'] = new TestBindingSyntax(); |
| 103 |
| 104 var div = createTestHtml( |
| 105 '<template bind syntax="Test">{{ foo }}' |
| 106 '<template bind syntax="Test2">{{ foo }}</template></template>'); |
| 107 recursivelySetTemplateModel(div, model); |
| 108 deliverChangeRecords(); |
| 109 expect(div.nodes.length, 4); |
| 110 expect(div.nodes.last.text, 'bar'); |
| 111 expect(div.nodes[2].tagName, 'TEMPLATE'); |
| 112 expect(div.nodes[2].attributes['syntax'], 'Test2'); |
| 113 |
| 114 var testLog = TemplateElement.syntax['Test'].log; |
| 115 var test2Log = TemplateElement.syntax['Test2'].log; |
| 116 |
| 117 expect(testLog, [ |
| 118 [model, 'foo', 'text', null], |
| 119 [model, '', 'bind', 'TEMPLATE'] |
| 120 ]); |
| 121 |
| 122 expect(test2Log, [[model, 'foo', 'text', null]]); |
| 123 |
| 124 TemplateElement.syntax.remove('Test'); |
| 125 TemplateElement.syntax.remove('Test2'); |
| 126 }); |
| 127 } |
| 128 |
| 129 class TestBindingSyntax extends CustomBindingSyntax { |
| 130 var log = []; |
| 131 |
| 132 getBinding(model, String path, String name, Node node) { |
| 133 log.add([model, path, name, node is Element ? node.tagName : null]); |
| 134 } |
| 135 } |
| 136 |
| 137 class TimesTwoSyntax extends CustomBindingSyntax { |
| 138 getBinding(model, path, name, node) { |
| 139 path = path.trim(); |
| 140 if (!path.startsWith('2x:')) return null; |
| 141 |
| 142 path = path.substring(3); |
| 143 return new CompoundBinding((values) => values['value'] * 2) |
| 144 ..bind('value', model, path); |
| 145 } |
| 146 } |
| OLD | NEW |