Chromium Code Reviews| 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 8d71680a39e0c3af1f3cfc1d27889e87c083db18..8395eb948b986657d0c20c947c830925ab38de2b 100644 |
| --- a/pkg/observe/test/path_observer_test.dart |
| +++ b/pkg/observe/test/path_observer_test.dart |
| @@ -9,7 +9,6 @@ import 'observe_test_utils.dart'; |
| // This file contains code ported from: |
| // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js |
| - |
| main() => dirtyCheckZone().run(() { |
| group('PathObserver', observePathTests); |
| @@ -68,26 +67,32 @@ main() => dirtyCheckZone().run(() { |
| }); |
| }); |
| - |
| observePathTests() { |
| test('Degenerate Values', () { |
| expect(new PathObserver(null, '').value, null); |
| expect(new PathObserver(123, '').value, 123); |
| - expect(new PathObserver(123, 'foo.bar.baz').value, null); |
| - |
| - // shouldn't throw: |
| - new PathObserver(123, '')..open((_) {})..close(); |
| - new PropertyPath('').setValueFrom(null, null); |
| - new PropertyPath('').setValueFrom(123, 42); |
| - new PropertyPath('foo.bar.baz').setValueFrom(123, 42); |
| - |
| - var foo = {}; |
| - expect(new PathObserver(foo, '').value, foo); |
| - |
| - foo = new Object(); |
| - expect(new PathObserver(foo, '').value, foo); |
| - |
| - expect(new PathObserver(foo, 'a/3!').value, null); |
| + new Future(() {}).then((_) { |
|
Jennifer Messerly
2014/03/25 22:32:44
return the Future?
also does it work to start wit
Siggi Cherem (dart-lang)
2014/03/26 00:32:07
(obsolete)
|
| + // should throw: |
| + return _asyncError('foo', |
| + () => expect(new PathObserver(123, 'foo.bar.baz').value, null)); |
|
Jennifer Messerly
2014/03/25 22:32:44
as noted earlier, I'd expect this error to be sync
Siggi Cherem (dart-lang)
2014/03/26 00:32:07
Done.
|
| + }).then((_) { |
| + // shouldn't throw: |
| + new PathObserver(123, '')..open((_) {})..close(); |
| + new PropertyPath('').setValueFrom(null, null); |
| + new PropertyPath('').setValueFrom(123, 42); |
| + |
| + // should throw: |
| + return _asyncError('foo', |
|
Jennifer Messerly
2014/03/25 22:32:44
when i'm changing behavior w.r.t. JS I usually put
Siggi Cherem (dart-lang)
2014/03/26 00:32:07
Done (made the note on the source code too)
|
| + () => new PropertyPath('foo.bar.baz').setValueFrom(123, 42)); |
| + }).then((_) { |
| + var foo = {}; |
| + expect(new PathObserver(foo, '').value, foo); |
| + |
| + foo = new Object(); |
| + expect(new PathObserver(foo, '').value, foo); |
| + |
| + expect(new PathObserver(foo, 'a/3!').value, null); |
| + }); |
| }); |
| test('get value at path ObservableBox', () { |
| @@ -105,8 +110,9 @@ observePathTests() { |
| expect(new PathObserver(obj, 'value.value.value').value, 3); |
| obj.value = new ObservableBox(4); |
| - expect(new PathObserver(obj, 'value.value.value').value, null); |
| expect(new PathObserver(obj, 'value.value').value, 4); |
| + return _asyncError('value', |
| + () => expect(new PathObserver(obj, 'value.value.value').value, null)); |
| }); |
| @@ -125,8 +131,9 @@ observePathTests() { |
| expect(new PathObserver(obj, 'a.b.c').value, 3); |
| obj['a'] = toObservable({'b': 4}); |
| - expect(new PathObserver(obj, 'a.b.c').value, null); |
| expect(new PathObserver(obj, 'a.b').value, 4); |
| + return _asyncError('c', |
| + () => expect(new PathObserver(obj, 'a.b.c').value, null)); |
| }); |
| test('set value at path', () { |
| @@ -138,8 +145,13 @@ observePathTests() { |
| new PropertyPath('bar').setValueFrom(obj, bar); |
| expect(obj['bar'], bar); |
| - new PropertyPath('bar.baz.bat').setValueFrom(obj, 'not here'); |
| - expect(new PathObserver(obj, 'bar.baz.bat').value, null); |
| + new Future(() {}).then((_) { |
| + return _asyncError('bat=', |
| + () => new PropertyPath('bar.baz.bat').setValueFrom(obj, 'not here')); |
| + }).then((_) { |
| + return _asyncError('bat', |
| + () => expect(new PathObserver(obj, 'bar.baz.bat').value, null)); |
| + }); |
| }); |
| test('set value back to same', () { |
| @@ -239,7 +251,9 @@ observePathTests() { |
| var path = new PathObserver(model, 'a.b.c'); |
| var lastValue = null; |
| - path.open((x) { lastValue = x; }); |
| + var errorSeen = false; |
| + var future = _asyncError('c', () => path.open((x) { lastValue = x; })) |
| + .then((_) { errorSeen = true; }); |
| model.a.b.c = 'hello, mom'; |
| @@ -257,7 +271,9 @@ observePathTests() { |
| expect(lastValue, 'hello, you'); |
| model.a.b = 1; |
| - }).then(newMicrotask).then((_) { |
| + expect(errorSeen, false); // update will be seen on next micro task |
| + }).then((_) => future).then((_) { |
| + expect(errorSeen, true); |
| expect(lastValue, null); |
| // Stop observing |
| @@ -300,11 +316,14 @@ observePathTests() { |
| var model = new ObjectWithErrors(); |
| var observer = new PathObserver(model, 'foo'); |
| - expect(() => observer.value, throws); |
| - expect(model.getFooCalled, 1); |
| - |
| - expect(() { observer.value = 123; }, throws); |
| - expect(model.setFooCalled, [123]); |
| + new Future(() {}).then((_) { |
| + return _asyncError('bar', () => observer.value); |
| + }).then((_) { |
| + expect(model.getFooCalled, 1); |
| + return _asyncError('bar=', () { observer.value = 123; }); |
| + }).then((_) { |
| + expect(model.setFooCalled, [123]); |
| + }); |
| }); |
| test('object with noSuchMethod', () { |
| @@ -352,6 +371,24 @@ observePathTests() { |
| }); |
| } |
| +_asyncError(String missingPropertyName, Function code) { |
| + var completer = new Completer(); |
| + runZoned(() { |
| + code(); |
| + return new Future(() {}); |
| + }, onError: (e) { |
| + completer.complete(true); |
| + expect(e, predicate((e) => e is NoSuchMethodError)); |
| + |
| + // Dart2js and VM error messages are a bit different, but they are both |
| + // contain the missingPropertyName. |
| + expect('$e', predicate((message) => |
| + message.contains("'$missingPropertyName'") || // VM error |
| + message.contains('\'Symbol("$missingPropertyName")\''))); // dart2js error |
| + }); |
| + return completer.future; |
| +} |
| + |
| class ObjectWithErrors { |
| int getFooCalled = 0; |
| List setFooCalled = []; |
| @@ -383,7 +420,7 @@ class NoSuchMethodModel { |
| } |
| } |
| -class IndexerModel { |
| +class IndexerModel implements StringIndexer { |
| var _foo = 42; |
| List log = []; |