| 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 node_model_test; | 5 library node_model_test; |
| 6 import 'dart:async'; | 6 import 'dart:async'; |
| 7 import 'dart:html'; | 7 import 'dart:html'; |
| 8 import '../../pkg/unittest/lib/unittest.dart'; | 8 import '../../pkg/unittest/lib/unittest.dart'; |
| 9 import '../../pkg/unittest/lib/html_config.dart'; | 9 import '../../pkg/unittest/lib/html_config.dart'; |
| 10 | 10 |
| 11 var stepDuration; |
| 11 Future get nextStep { | 12 Future get nextStep { |
| 12 return new Future.delayed(new Duration()); | 13 return new Future.delayed(stepDuration); |
| 13 } | 14 } |
| 14 | 15 |
| 15 class ModelTracker { | 16 class ModelTracker { |
| 16 Element element = new DivElement(); | 17 Element element = new DivElement(); |
| 17 List models = []; | 18 List models = []; |
| 18 | 19 |
| 19 ModelTracker() { | 20 ModelTracker() { |
| 20 element.onModelChanged.listen((node) { | 21 element.onModelChanged.listen((node) { |
| 21 models.add(node.model); | 22 models.add(node.model); |
| 22 }); | 23 }); |
| 23 } | 24 } |
| 24 | 25 |
| 25 void append(ModelTracker other) { | 26 void append(ModelTracker other) { |
| 26 element.append(other.element); | 27 element.append(other.element); |
| 27 } | 28 } |
| 28 | 29 |
| 29 get model => element.model; | 30 get model => element.model; |
| 30 void set model(value) { | 31 void set model(value) { |
| 31 element.model = value; | 32 element.model = value; |
| 32 } | 33 } |
| 33 | 34 |
| 34 void clearModel() { | 35 void clearModel() { |
| 35 element.clearModel(); | 36 element.clearModel(); |
| 36 } | 37 } |
| 38 |
| 39 void remove() { |
| 40 element.remove(); |
| 41 } |
| 37 } | 42 } |
| 38 | 43 |
| 39 main() { | 44 main() { |
| 40 useHtmlConfiguration(); | 45 useHtmlConfiguration(); |
| 41 | 46 |
| 47 if (MutationObserver.supported) { |
| 48 stepDuration = new Duration(); |
| 49 } else { |
| 50 // Need to step after the tree update notifications, but on IE9 these may |
| 51 // get polyfilled to use setTimeout(0). So use a longer timer to try to |
| 52 // get a later callback. |
| 53 stepDuration = new Duration(milliseconds: 15); |
| 54 } |
| 55 |
| 42 test('basic top down', () { | 56 test('basic top down', () { |
| 43 var a = new DivElement(); | 57 var a = new DivElement(); |
| 44 var b = new SpanElement(); | 58 var b = new SpanElement(); |
| 45 var c = new DivElement(); | 59 var c = new DivElement(); |
| 46 var d = new DivElement(); | 60 var d = new DivElement(); |
| 47 var e = new DivElement(); | 61 var e = new DivElement(); |
| 48 var model = {}; | 62 var model = {}; |
| 49 var model2 = {}; | 63 var model2 = {}; |
| 50 var model3 = {}; | 64 var model3 = {}; |
| 51 | 65 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 }).then((_) { | 106 }).then((_) { |
| 93 d.remove(); | 107 d.remove(); |
| 94 c.append(d); | 108 c.append(d); |
| 95 | 109 |
| 96 return nextStep; | 110 return nextStep; |
| 97 }).then((_) { | 111 }).then((_) { |
| 98 expect(d.model, model3); | 112 expect(d.model, model3); |
| 99 | 113 |
| 100 c.clearModel(); | 114 c.clearModel(); |
| 101 expect(d.model, model2); | 115 expect(d.model, model2); |
| 116 |
| 117 a.remove(); |
| 118 return nextStep; |
| 102 }); | 119 }); |
| 103 }); | 120 }); |
| 104 | 121 |
| 105 test('changes', () { | 122 test('changes', () { |
| 106 var a = new ModelTracker(); | 123 var a = new ModelTracker(); |
| 107 var b = new ModelTracker(); | 124 var b = new ModelTracker(); |
| 108 var c = new ModelTracker(); | 125 var c = new ModelTracker(); |
| 109 var d = new ModelTracker(); | 126 var d = new ModelTracker(); |
| 110 | 127 |
| 111 var model = {}; | 128 var model = {}; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 133 return nextStep; | 150 return nextStep; |
| 134 }).then((_) { | 151 }).then((_) { |
| 135 c.model = cModel; | 152 c.model = cModel; |
| 136 expect(b.models, [model]); | 153 expect(b.models, [model]); |
| 137 expect(c.models, [model, cModel]); | 154 expect(c.models, [model, cModel]); |
| 138 expect(d.models, [model, cModel]); | 155 expect(d.models, [model, cModel]); |
| 139 | 156 |
| 140 c.clearModel(); | 157 c.clearModel(); |
| 141 expect(c.models, [model, cModel, model]); | 158 expect(c.models, [model, cModel, model]); |
| 142 expect(d.models, [model, cModel, model]); | 159 expect(d.models, [model, cModel, model]); |
| 160 |
| 161 a.remove(); |
| 162 return nextStep; |
| 143 }); | 163 }); |
| 144 }); | 164 }); |
| 145 | 165 |
| 146 test('bottom up', () { | 166 test('bottom up', () { |
| 147 var a = new ModelTracker(); | 167 var a = new ModelTracker(); |
| 148 var b = new ModelTracker(); | 168 var b = new ModelTracker(); |
| 149 var c = new ModelTracker(); | 169 var c = new ModelTracker(); |
| 150 var d = new ModelTracker(); | 170 var d = new ModelTracker(); |
| 151 | 171 |
| 152 var aModel = {}; | 172 var aModel = {}; |
| 153 var cModel = {}; | 173 var cModel = {}; |
| 154 | 174 |
| 155 c.append(d); | 175 c.append(d); |
| 156 c.model = cModel; | 176 c.model = cModel; |
| 157 b.append(c); | 177 b.append(c); |
| 158 a.append(b); | 178 a.append(b); |
| 159 a.model = aModel; | 179 a.model = aModel; |
| 160 document.body.append(a.element); | 180 document.body.append(a.element); |
| 161 | 181 |
| 162 return nextStep.then((_) { | 182 return nextStep.then((_) { |
| 163 expect(a.models, [aModel]); | 183 expect(a.models, [aModel]); |
| 164 expect(b.models, [aModel]); | 184 expect(b.models, [aModel]); |
| 165 expect(c.models, [cModel]); | 185 expect(c.models, [cModel]); |
| 166 expect(d.models, [cModel]); | 186 expect(d.models, [cModel]); |
| 187 |
| 188 a.remove(); |
| 189 return nextStep; |
| 167 }); | 190 }); |
| 168 }); | 191 }); |
| 169 } | 192 } |
| OLD | NEW |