| Index: pkg/observe/test/path_observer_test.dart
|
| diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
|
| index 471ca27b1830a290274e4efa28a27bf308fc7849..581b68442e23cb2831089f49e7c051cf1ce12014 100644
|
| --- a/pkg/observe/test/path_observer_test.dart
|
| +++ b/pkg/observe/test/path_observer_test.dart
|
| @@ -2,8 +2,10 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| +import 'dart:async';
|
| import 'package:observe/observe.dart';
|
| import 'package:unittest/unittest.dart';
|
| +import 'observe_test_utils.dart';
|
|
|
| // This file contains code ported from:
|
| // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
|
| @@ -26,14 +28,13 @@ toSymbolMap(Map map) {
|
| }
|
|
|
| observePathTests() {
|
| -
|
| - test('Degenerate Values', () {
|
| + observeTest('Degenerate Values', () {
|
| expect(observePath(null, '').value, null);
|
| expect(observePath(123, '').value, 123);
|
| expect(observePath(123, 'foo.bar.baz').value, null);
|
|
|
| // shouldn't throw:
|
| - observePath(123, '').values.listen((_) {}).cancel();
|
| + observePath(123, '').changes.listen((_) {}).cancel();
|
| observePath(null, '').value = null;
|
| observePath(123, '').value = 42;
|
| observePath(123, 'foo.bar.baz').value = 42;
|
| @@ -47,7 +48,7 @@ observePathTests() {
|
| expect(observePath(foo, 'a/3!').value, null);
|
| });
|
|
|
| - test('get value at path ObservableBox', () {
|
| + observeTest('get value at path ObservableBox', () {
|
| var obj = new ObservableBox(new ObservableBox(new ObservableBox(1)));
|
|
|
| expect(observePath(obj, '').value, obj);
|
| @@ -67,7 +68,7 @@ observePathTests() {
|
| });
|
|
|
|
|
| - test('get value at path ObservableMap', () {
|
| + observeTest('get value at path ObservableMap', () {
|
| var obj = toSymbolMap({'a': {'b': {'c': 1}}});
|
|
|
| expect(observePath(obj, '').value, obj);
|
| @@ -86,7 +87,7 @@ observePathTests() {
|
| expect(observePath(obj, 'a.b').value, 4);
|
| });
|
|
|
| - test('set value at path', () {
|
| + observeTest('set value at path', () {
|
| var obj = toSymbolMap({});
|
| observePath(obj, 'foo').value = 3;
|
| expect(obj[sym('foo')], 3);
|
| @@ -99,47 +100,47 @@ observePathTests() {
|
| expect(observePath(obj, 'bar.baz.bat').value, null);
|
| });
|
|
|
| - test('set value back to same', () {
|
| + observeTest('set value back to same', () {
|
| var obj = toSymbolMap({});
|
| var path = observePath(obj, 'foo');
|
| var values = [];
|
| - path.values.listen((v) { values.add(v); });
|
| + path.changes.listen((_) { values.add(path.value); });
|
|
|
| path.value = 3;
|
| expect(obj[sym('foo')], 3);
|
| expect(path.value, 3);
|
|
|
| observePath(obj, 'foo').value = 2;
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(path.value, 2);
|
| expect(observePath(obj, 'foo').value, 2);
|
|
|
| observePath(obj, 'foo').value = 3;
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(path.value, 3);
|
|
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(values, [2, 3]);
|
| });
|
|
|
| - test('Observe and Unobserve - Paths', () {
|
| + observeTest('Observe and Unobserve - Paths', () {
|
| var arr = toSymbolMap({});
|
|
|
| arr[sym('foo')] = 'bar';
|
| var fooValues = [];
|
| var fooPath = observePath(arr, 'foo');
|
| - var fooSub = fooPath.values.listen((v) {
|
| - fooValues.add(v);
|
| + var fooSub = fooPath.changes.listen((_) {
|
| + fooValues.add(fooPath.value);
|
| });
|
| arr[sym('foo')] = 'baz';
|
| arr[sym('bat')] = 'bag';
|
| var batValues = [];
|
| var batPath = observePath(arr, 'bat');
|
| - var batSub = batPath.values.listen((v) {
|
| - batValues.add(v);
|
| + var batSub = batPath.changes.listen((_) {
|
| + batValues.add(batPath.value);
|
| });
|
|
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(fooValues, ['baz']);
|
| expect(batValues, []);
|
|
|
| @@ -149,81 +150,84 @@ observePathTests() {
|
| batSub.cancel();
|
| arr[sym('bat')] = 'boot';
|
|
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(fooValues, ['baz']);
|
| expect(batValues, []);
|
| });
|
|
|
| - test('Path Value With Indices', () {
|
| + observeTest('Path Value With Indices', () {
|
| var model = toObservable([]);
|
| - observePath(model, '0').values.listen(expectAsync1((v) {
|
| - expect(v, 123);
|
| + var path = observePath(model, '0');
|
| + path.changes.listen(expectAsync1((_) {
|
| + expect(path.value, 123);
|
| }));
|
| model.add(123);
|
| });
|
|
|
| - test('Path Observation', () {
|
| - var model = new TestModel()..a =
|
| - (new TestModel()..b = (new TestModel()..c = 'hello, world'));
|
| + for (var createModel in [() => new TestModel(), () => new WatcherModel()]) {
|
| + observeTest('Path Observation - ${createModel().runtimeType}', () {
|
| + var model = createModel()..a =
|
| + (createModel()..b = (createModel()..c = 'hello, world'));
|
|
|
| - var path = observePath(model, 'a.b.c');
|
| - var lastValue = null;
|
| - var sub = path.values.listen((v) { lastValue = v; });
|
| + var path = observePath(model, 'a.b.c');
|
| + var lastValue = null;
|
| + var sub = path.changes.listen((_) { lastValue = path.value; });
|
|
|
| - model.a.b.c = 'hello, mom';
|
| + model.a.b.c = 'hello, mom';
|
|
|
| - expect(lastValue, null);
|
| - deliverChangeRecords();
|
| - expect(lastValue, 'hello, mom');
|
| + expect(lastValue, null);
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, 'hello, mom');
|
|
|
| - model.a.b = new TestModel()..c = 'hello, dad';
|
| - deliverChangeRecords();
|
| - expect(lastValue, 'hello, dad');
|
| + model.a.b = createModel()..c = 'hello, dad';
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, 'hello, dad');
|
|
|
| - model.a = new TestModel()..b =
|
| - (new TestModel()..c = 'hello, you');
|
| - deliverChangeRecords();
|
| - expect(lastValue, 'hello, you');
|
| + model.a = createModel()..b =
|
| + (createModel()..c = 'hello, you');
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, 'hello, you');
|
|
|
| - model.a.b = 1;
|
| - deliverChangeRecords();
|
| - expect(lastValue, null);
|
| + model.a.b = 1;
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, null);
|
|
|
| - // Stop observing
|
| - sub.cancel();
|
| + // Stop observing
|
| + sub.cancel();
|
|
|
| - model.a.b = new TestModel()..c = 'hello, back again -- but not observing';
|
| - deliverChangeRecords();
|
| - expect(lastValue, null);
|
| + model.a.b = createModel()..c = 'hello, back again -- but not observing';
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, null);
|
|
|
| - // Resume observing
|
| - sub = path.values.listen((v) { lastValue = v; });
|
| + // Resume observing
|
| + sub = path.changes.listen((_) { lastValue = path.value; });
|
|
|
| - model.a.b.c = 'hello. Back for reals';
|
| - deliverChangeRecords();
|
| - expect(lastValue, 'hello. Back for reals');
|
| - });
|
| + model.a.b.c = 'hello. Back for reals';
|
| + performMicrotaskCheckpoint();
|
| + expect(lastValue, 'hello. Back for reals');
|
| + });
|
| + }
|
|
|
| - test('observe map', () {
|
| + observeTest('observe map', () {
|
| var model = toSymbolMap({'a': 1});
|
| var path = observePath(model, 'a');
|
|
|
| var values = [path.value];
|
| - var sub = path.values.listen((v) { values.add(v); });
|
| + var sub = path.changes.listen((_) { values.add(path.value); });
|
| expect(values, [1]);
|
|
|
| model[sym('a')] = 2;
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(values, [1, 2]);
|
|
|
| sub.cancel();
|
| model[sym('a')] = 3;
|
| - deliverChangeRecords();
|
| + performMicrotaskCheckpoint();
|
| expect(values, [1, 2]);
|
| });
|
| }
|
|
|
| -class TestModel extends ObservableBase {
|
| +class TestModel extends ChangeNotifierBase {
|
| var _a, _b, _c;
|
|
|
| TestModel();
|
| @@ -246,3 +250,13 @@ class TestModel extends ObservableBase {
|
| _c = notifyPropertyChange(const Symbol('c'), _c, newValue);
|
| }
|
| }
|
| +
|
| +class WatcherModel extends ObservableBase {
|
| + // TODO(jmesserly): dart2js does not let these be on the same line:
|
| + // @observable var a, b, c;
|
| + @observable var a;
|
| + @observable var b;
|
| + @observable var c;
|
| +
|
| + WatcherModel();
|
| +}
|
|
|