Index: packages/when/test/test_when.dart |
diff --git a/packages/when/test/test_when.dart b/packages/when/test/test_when.dart |
new file mode 100755 |
index 0000000000000000000000000000000000000000..25c50861643ddb755a5f6823ff89b0fdc0f6d0ff |
--- /dev/null |
+++ b/packages/when/test/test_when.dart |
@@ -0,0 +1,184 @@ |
+ |
+library when.test; |
+ |
+import 'dart:async'; |
+ |
+import 'package:unittest/unittest.dart'; |
+import 'package:when/when.dart'; |
+ |
+main() { |
+ group('when', () { |
+ |
+ test('on non-Future callback result should call onSuccess with result, then onComplete, and return onSuccess result', () { |
+ var onSuccessCalled = false; |
+ var onErrorCalled = false; |
+ var onCompleteCalled = false; |
+ var ret = when( |
+ () => 5, |
+ onSuccess: (x) { |
+ expect(x, 5); |
+ onSuccessCalled = true; |
+ return 10; |
+ }, |
+ onError: (e) => onErrorCalled = true, |
+ onComplete: () { |
+ expect(onSuccessCalled, isTrue); |
+ onCompleteCalled = true; |
+ }); |
+ expect(onErrorCalled, isFalse); |
+ expect(onCompleteCalled, isTrue); |
+ expect(ret, 10); |
+ }); |
+ |
+ test('on callback failure should call onError with error, then onComplete', () { |
+ var onSuccessCalled = false; |
+ var onErrorCalled = false; |
+ var onCompleteCalled = false; |
+ var ret = when( |
+ () => throw 'e', |
+ onSuccess: (_) => onSuccessCalled = true, |
+ onError: (e) { |
+ expect(e, 'e'); |
+ onErrorCalled = true; |
+ }, |
+ onComplete: () { |
+ expect(onErrorCalled, isTrue); |
+ onCompleteCalled = true; |
+ }); |
+ expect(onSuccessCalled, isFalse); |
+ expect(onCompleteCalled, isTrue); |
+ expect(ret, isNull); |
+ }); |
+ |
+ test('should pass stack trace to onError if binary', () { |
+ var onErrorCalled = false; |
+ when( |
+ () => throw 'e', |
+ onError: (e, s) { |
+ onErrorCalled = true; |
+ expect(s, isNotNull); |
+ }); |
+ expect(onErrorCalled, isTrue); |
+ }); |
+ |
+ test('should throw callback error if no onError provided', () { |
+ try { |
+ when( |
+ () => throw 'e'); |
+ fail('callback error was swallowed'); |
+ } catch (e) { |
+ expect(e, 'e'); |
+ } |
+ }); |
+ |
+ test('should just return callback result if onSuccess not provided', () { |
+ expect(when(() => 5), 5); |
+ }); |
+ |
+ test('should not swallow onComplete error', () { |
+ try { |
+ when( |
+ () {}, |
+ onComplete: () => throw 'e'); |
+ fail('onComplete error was swallowed'); |
+ } catch (e) { |
+ expect(e, 'e'); |
+ } |
+ }); |
+ |
+ group('on Future callback result', () { |
+ |
+ test('which succeeds should call onSuccess with result, then onComplete, and complete with onSuccess result', () { |
+ var onSuccessCalled = false; |
+ var onErrorCalled = false; |
+ var onCompleteCalled = false; |
+ var result = when( |
+ () => new Future.value(5), |
+ onSuccess: (x) { |
+ expect(x, 5); |
+ onSuccessCalled = true; |
+ return 10; |
+ }, |
+ onError: (e) => onErrorCalled = true, |
+ onComplete: () { |
+ expect(onSuccessCalled, isTrue); |
+ onCompleteCalled = true; |
+ }); |
+ expect(onSuccessCalled, isFalse); |
+ expect(onCompleteCalled, isFalse); |
+ expect(result, new isInstanceOf<Future>()); |
+ return result.then((ret) { |
+ expect(onErrorCalled, isFalse); |
+ expect(onCompleteCalled, isTrue); |
+ expect(ret, 10); |
+ }); |
+ }); |
+ |
+ test('which fails should call onError with error, then onComplete', () { |
+ var onSuccessCalled = false; |
+ var onErrorCalled = false; |
+ var onCompleteCalled = false; |
+ var result = when( |
+ () => new Future.error('e'), |
+ onSuccess: (_) => onSuccessCalled = true, |
+ onError: (e) { |
+ expect(e, 'e'); |
+ onErrorCalled = true; |
+ }, |
+ onComplete: () { |
+ onErrorCalled = true; |
+ onCompleteCalled = true; |
+ }); |
+ expect(onErrorCalled, isFalse); |
+ expect(onCompleteCalled, isFalse); |
+ expect(result, new isInstanceOf<Future>()); |
+ return result.then((ret) { |
+ expect(ret, isNull); |
+ expect(onSuccessCalled, isFalse); |
+ expect(onCompleteCalled, isTrue); |
+ }); |
+ }); |
+ |
+ test('should pass stack trace to onError if binary', () { |
+ var onErrorCalled = false; |
+ return when( |
+ () => new Future.error('e'), |
+ onError: (e, s) { |
+ onErrorCalled = true; |
+ // TODO: Why is the stack trace null? |
+ // expect(s, isNotNull); |
+ }).then((_) { |
+ expect(onErrorCalled, isTrue); |
+ }); |
+ }); |
+ |
+ test('should throw callback error if no onError provided', () { |
+ return when( |
+ () => new Future.error('e') |
+ ).then((_) { |
+ fail('callback error was swallowed'); |
+ }, onError: (e) { |
+ expect(e, 'e'); |
+ }); |
+ }); |
+ |
+ test('should just return callback result if onSuccess not provided', () { |
+ return when(() => new Future.value(5)).then((result) { |
+ expect(result, 5); |
+ }); |
+ }); |
+ |
+ test('should not swallow onComplete error', () { |
+ return when( |
+ () => new Future.value(), |
+ onComplete: () => throw 'e') |
+ .then((ret) { |
+ fail('onComplete error was swallowed'); |
+ }, onError: (e) { |
+ expect(e, 'e'); |
+ }); |
+ }); |
+ |
+ }); |
+ }); |
+} |