| 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 'package:mdv_observe/mdv_observe.dart'; | |
| 10 import 'package:unittest/html_config.dart'; | |
| 11 import 'package:unittest/unittest.dart'; | |
| 12 import 'mdv_observe_utils.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 = toSymbolMap({'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 = toSymbolMap({'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[const Symbol('foo')] = 4; | |
| 91 model[const Symbol('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 = toSymbolMap({'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 |