
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,
          (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',
          (_) => 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 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),
            (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'),
            (_) => 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'),
            (x) {}
        ).then((_) {
          fail('callback error was swallowed');
        }, onError: (e) {
          expect(e, 'e');
        });
      });

      test('should not swallow onComplete error', () {
        return when(
            () => new Future.value(),
            (x) {},
            onComplete: () => throw 'e')
            .then((ret) {
              fail('onComplete error was swallowed');
            }, onError: (e) {
              expect(e, 'e');
            });
      });

    });
  });
}