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

Side by Side Diff: pkg/mdv_observe/test/path_observer_test.dart

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

Powered by Google App Engine
This is Rietveld 408576698