// 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 '../../../pkg/unittest/lib/unittest.dart';

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

  test("timeoutCompleteAfterTimeout", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), () => 42);
    Timer timer = new Timer(const Duration(seconds: 1), () {
      completer.complete(-1);
    });
    timedOut.then(expectAsync1((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), () => -1);
    timedOut.then(expectAsync1((v) {
      expect(v, 42);
    }));
  });

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

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

  test("timeoutThrowAfterTimeout", () {
    Completer completer = new Completer();
    Future timedOut = completer.future.timeout(
        const Duration(milliseconds: 5), () => 42);
    Timer timer = new Timer(const Duration(seconds: 1), () {
      completer.completeError("EXN2");
    });
    timedOut.then(expectAsync1((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), () => -1);
    timedOut.catchError(expectAsync2((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), () => -1);
    timedOut.catchError(expectAsync2((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), () => result);
    timedOut.then(expectAsync1((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), () => result);
    timedOut.catchError(expectAsync2((e, s) {
      expect(e, "EXN5");
    }));
  });

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

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

  test("timeoutZone", () {
    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 expectAsync0(() { registerCallDelta--; return f(); });
        }
    ));
    Completer completer = new Completer();
    Future timedOut;
    forked.run(() {
      timedOut = completer.future.timeout(const Duration(milliseconds: 5),
                                          callback);
    });
    timedOut.then(expectAsync1((v) {
      expect(callbackCalled, true);
      expect(registerCallDelta, 0);
      expect(Zone.current, Zone.ROOT);
      expect(v, 42);
    }));
  });

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