Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: tests/html/path_observer_test.dart

Issue 17434008: Move PathObserver to mdv_observe package (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « sdk/lib/mdv_observe_impl/path_observer.dart ('k') | tools/dom/src/PathObserver.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 import 'dart:html' show PathObserver;
6 import 'package:unittest/html_config.dart';
7 import 'package:mdv_observe/mdv_observe.dart';
8 import 'package:unittest/unittest.dart';
9
10 // This file contains code ported from:
11 // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
12
13 main() {
14 useHtmlConfiguration();
15 group('PathObserver', observePathTests);
16 }
17
18 observePath(obj, path) => new PathObserver(obj, path);
19
20 sym(x) => new Symbol(x);
21
22 toSymbolMap(Map map) {
23 var result = new ObservableMap.linked();
24 map.forEach((key, value) {
25 if (value is Map) value = toSymbolMap(value);
26 result[new Symbol(key)] = value;
27 });
28 return result;
29 }
30
31 observePathTests() {
32
33 test('Degenerate Values', () {
34 expect(observePath(null, '').value, null);
35 expect(observePath(123, '').value, 123);
36 expect(observePath(123, 'foo.bar.baz').value, null);
37
38 // shouldn't throw:
39 observePath(123, '').values.listen((_) {}).cancel();
40 observePath(null, '').value = null;
41 observePath(123, '').value = 42;
42 observePath(123, 'foo.bar.baz').value = 42;
43
44 var foo = {};
45 expect(observePath(foo, '').value, foo);
46
47 foo = new Object();
48 expect(observePath(foo, '').value, foo);
49
50 expect(observePath(foo, 'a/3!').value, null);
51 });
52
53 test('get value at path ObservableBox', () {
54 var obj = new ObservableBox(new ObservableBox(new ObservableBox(1)));
55
56 expect(observePath(obj, '').value, obj);
57 expect(observePath(obj, 'value').value, obj.value);
58 expect(observePath(obj, 'value.value').value, obj.value.value);
59 expect(observePath(obj, 'value.value.value').value, 1);
60
61 obj.value.value.value = 2;
62 expect(observePath(obj, 'value.value.value').value, 2);
63
64 obj.value.value = new ObservableBox(3);
65 expect(observePath(obj, 'value.value.value').value, 3);
66
67 obj.value = new ObservableBox(4);
68 expect(observePath(obj, 'value.value.value').value, null);
69 expect(observePath(obj, 'value.value').value, 4);
70 });
71
72
73 test('get value at path ObservableMap', () {
74 var obj = toSymbolMap({'a': {'b': {'c': 1}}});
75
76 expect(observePath(obj, '').value, obj);
77 expect(observePath(obj, 'a').value, obj[sym('a')]);
78 expect(observePath(obj, 'a.b').value, obj[sym('a')][sym('b')]);
79 expect(observePath(obj, 'a.b.c').value, 1);
80
81 obj[sym('a')][sym('b')][sym('c')] = 2;
82 expect(observePath(obj, 'a.b.c').value, 2);
83
84 obj[sym('a')][sym('b')] = toSymbolMap({'c': 3});
85 expect(observePath(obj, 'a.b.c').value, 3);
86
87 obj[sym('a')] = toSymbolMap({'b': 4});
88 expect(observePath(obj, 'a.b.c').value, null);
89 expect(observePath(obj, 'a.b').value, 4);
90 });
91
92 test('set value at path', () {
93 var obj = toSymbolMap({});
94 observePath(obj, 'foo').value = 3;
95 expect(obj[sym('foo')], 3);
96
97 var bar = toSymbolMap({ 'baz': 3 });
98 observePath(obj, 'bar').value = bar;
99 expect(obj[sym('bar')], bar);
100
101 observePath(obj, 'bar.baz.bat').value = 'not here';
102 expect(observePath(obj, 'bar.baz.bat').value, null);
103 });
104
105 test('set value back to same', () {
106 var obj = toSymbolMap({});
107 var path = observePath(obj, 'foo');
108 var values = [];
109 path.values.listen((v) { values.add(v); });
110
111 path.value = 3;
112 expect(obj[sym('foo')], 3);
113 expect(path.value, 3);
114
115 observePath(obj, 'foo').value = 2;
116 deliverChangeRecords();
117 expect(path.value, 2);
118 expect(observePath(obj, 'foo').value, 2);
119
120 observePath(obj, 'foo').value = 3;
121 deliverChangeRecords();
122 expect(path.value, 3);
123
124 deliverChangeRecords();
125 expect(values, [2, 3]);
126 });
127
128 test('Observe and Unobserve - Paths', () {
129 var arr = toSymbolMap({});
130
131 arr[sym('foo')] = 'bar';
132 var fooValues = [];
133 var fooPath = observePath(arr, 'foo');
134 var fooSub = fooPath.values.listen((v) {
135 fooValues.add(v);
136 });
137 arr[sym('foo')] = 'baz';
138 arr[sym('bat')] = 'bag';
139 var batValues = [];
140 var batPath = observePath(arr, 'bat');
141 var batSub = batPath.values.listen((v) {
142 batValues.add(v);
143 });
144
145 deliverChangeRecords();
146 expect(fooValues, ['baz']);
147 expect(batValues, []);
148
149 arr[sym('foo')] = 'bar';
150 fooSub.cancel();
151 arr[sym('bat')] = 'boo';
152 batSub.cancel();
153 arr[sym('bat')] = 'boot';
154
155 deliverChangeRecords();
156 expect(fooValues, ['baz']);
157 expect(batValues, []);
158 });
159
160 test('Path Value With Indices', () {
161 var model = toObservable([]);
162 observePath(model, '0').values.listen(expectAsync1((v) {
163 expect(v, 123);
164 }));
165 model.add(123);
166 });
167
168 test('Path Observation', () {
169 var model = new TestModel(const Symbol('a'),
170 new TestModel(const Symbol('b'),
171 new TestModel(const Symbol('c'), 'hello, world')));
172
173 var path = observePath(model, 'a.b.c');
174 var lastValue = null;
175 var sub = path.values.listen((v) { lastValue = v; });
176
177 model.value.value.value = 'hello, mom';
178
179 expect(lastValue, null);
180 deliverChangeRecords();
181 expect(lastValue, 'hello, mom');
182
183 model.value.value = new TestModel(const Symbol('c'), 'hello, dad');
184 deliverChangeRecords();
185 expect(lastValue, 'hello, dad');
186
187 model.value = new TestModel(const Symbol('b'),
188 new TestModel(const Symbol('c'), 'hello, you'));
189 deliverChangeRecords();
190 expect(lastValue, 'hello, you');
191
192 model.value.value = 1;
193 deliverChangeRecords();
194 expect(lastValue, null);
195
196 // Stop observing
197 sub.cancel();
198
199 model.value.value = new TestModel(const Symbol('c'),
200 'hello, back again -- but not observing');
201 deliverChangeRecords();
202 expect(lastValue, null);
203
204 // Resume observing
205 sub = path.values.listen((v) { lastValue = v; });
206
207 model.value.value.value = 'hello. Back for reals';
208 deliverChangeRecords();
209 expect(lastValue, 'hello. Back for reals');
210 });
211
212 test('observe map', () {
213 var model = toSymbolMap({'a': 1});
214 var path = observePath(model, 'a');
215
216 var values = [path.value];
217 var sub = path.values.listen((v) { values.add(v); });
218 expect(values, [1]);
219
220 model[sym('a')] = 2;
221 deliverChangeRecords();
222 expect(values, [1, 2]);
223
224 sub.cancel();
225 model[sym('a')] = 3;
226 deliverChangeRecords();
227 expect(values, [1, 2]);
228 });
229 }
230
231 class TestModel extends ObservableBase {
232 final Symbol fieldName;
233 var _value;
234
235 TestModel(this.fieldName, [initialValue]) : _value = initialValue;
236
237 get value => _value;
238
239 void set value(newValue) {
240 _value = notifyPropertyChange(fieldName, _value, newValue);
241 }
242
243 getValueWorkaround(key) {
244 if (key == fieldName) return value;
245 return null;
246 }
247 void setValueWorkaround(key, newValue) {
248 if (key == fieldName) value = newValue;
249 }
250
251 toString() => '#<$runtimeType $fieldName: $_value>';
252 }
253
254 _record(key, oldValue, newValue, [kind = ChangeRecord.FIELD]) =>
255 new ChangeRecord(key, oldValue, newValue, kind: kind);
OLDNEW
« no previous file with comments | « sdk/lib/mdv_observe_impl/path_observer.dart ('k') | tools/dom/src/PathObserver.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698