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

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

Powered by Google App Engine
This is Rietveld 408576698