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

Side by Side Diff: tests/lib/observe/observe_path_test.dart

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

Powered by Google App Engine
This is Rietveld 408576698