// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// 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.

library future_timeout_test;

import 'dart:async';
import 'package:unittest/unittest.dart';

main() {
  test("timeoutNoComplete", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => 42);
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutCompleteAfterTimeout", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => 42);
    Timer timer = new Timer(const Duration(seconds: 1), () {
      completer.complete(-1);
    });
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutCompleteBeforeTimeout", () {
    Completer completer = new Completer();
    Timer timer = new Timer(const Duration(milliseconds: 5), () {
      completer.complete(42);
    });
    Future timedOut = completer.future.timeout(
        const Duration(seconds: 1), onTimeout: () => -1);
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutCompleteBeforeCreate", () {
    Completer completer = new Completer.sync();
    completer.complete(42);
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => -1);
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutThrows", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () { throw "EXN1"; });
    timedOut.catchError(expectAsync((e, s) {
      expect(e, "EXN1");
    }));
  });

  test("timeoutThrowAfterTimeout", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => 42);
    Timer timer = new Timer(const Duration(seconds: 1), () {
      completer.completeError("EXN2");
    });
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutThrowBeforeTimeout", () {
    Completer completer = new Completer();
    Timer timer = new Timer(const Duration(milliseconds: 5), () {
      completer.completeError("EXN3");
    });
    Future timedOut = completer.future.timeout(
        const Duration(seconds: 1), onTimeout: () => -1);
    timedOut.catchError(expectAsync((e, s) {
      expect(e, "EXN3");
    }));
  });

  test("timeoutThrowBeforeCreate", () {
    // Prevent uncaught error when we create the error.
    Completer completer = new Completer.sync()..future.catchError((e){});
    completer.completeError("EXN4");
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => -1);
    timedOut.catchError(expectAsync((e, s) {
      expect(e, "EXN4");
    }));
  });

  test("timeoutReturnFutureValue", () {
    Future result = new Future.value(42);
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => result);
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutReturnFutureError", () {
    Future result = new Future.error("EXN5")..catchError((e){});
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () => result);
    timedOut.catchError(expectAsync((e, s) {
      expect(e, "EXN5");
    }));
  });

  test("timeoutReturnFutureValueLater", () {
    Completer result = new Completer();
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () {
      result.complete(42);
      return result.future;
    });
    timedOut.then(expectAsync((v) {
      expect(v, 42);
    }));
  });

  test("timeoutReturnFutureErrorLater", () {
    Completer result = new Completer();
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), onTimeout: () {
      result.completeError("EXN6");
      return result.future;
    });
    timedOut.catchError(expectAsync((e, s) {
      expect(e, "EXN6");
    }));
  });

  test("timeoutZone", () {
    var initialZone = Zone.current;
    Zone forked;
    int registerCallDelta = 0;
    bool callbackCalled = false;
    Function callback = () {
      expect(callbackCalled, false);
      callbackCalled = true;
      expect(Zone.current, forked);
      return 42;
    };
    forked = Zone.current.fork(specification: new ZoneSpecification(
        registerCallback: (Zone self, ZoneDelegate parent, Zone origin, f()) {
          if (!identical(f, callback)) return f;
          registerCallDelta++;  // Increment calls to register.
          expect(origin, forked);
          expect(self, forked);
          return expectAsync(() { registerCallDelta--; return f(); });
        }
    ));
    Completer completer = new Completer();
    Future timedOut;
    forked.run(() {
      timedOut = completer.future.timeout(const Duration(milliseconds: 5),
                                          onTimeout: callback);
    });
    timedOut.then(expectAsync((v) {
      expect(callbackCalled, true);
      expect(registerCallDelta, 0);
      expect(Zone.current, initialZone);
      expect(v, 42);
    }));
  });

  test("timeoutNoFunction", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5));
    timedOut.catchError(expectAsync((e, s) {
      expect(e, new isInstanceOf<TimeoutException>());
      expect(e.duration, const Duration(milliseconds: 5));
      expect(s, null);
    }));
  });

  test("timeoutType", () {
    Completer completer = new Completer<int>();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5));
    expect(timedOut, new isInstanceOf<Future<int>>());
    expect(timedOut, isNot(new isInstanceOf<Future<String>>()));
    timedOut.catchError((_) {});
    completer.complete(499);
  });
}
