// Copyright (c) 2018, 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.

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

/*class: global#Future:checkedInstance*/

/*class: A:checks=[],instance*/
class A<T> {
  @NoInline()
  m(o) => o is FutureOr<T>;
}

/*class: B:checkedInstance,checks=[],instance,typeArgument*/
class B {}

// TODO(johnniwinther): Do we need the implied `checkedTypeArgument` from
// the `Future<C>` test in `A.m`?
/*class: C:checkedInstance,checks=[],typeArgument*/
class C {}

/*class: FutureMock:checks=[$isFuture],instance*/
class FutureMock<T> implements Future<T> {
  final T value;

  FutureMock(this.value);

  @override
  Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()}) => null;

  @override
  Stream<T> asStream() => null;

  @override
  Future<T> whenComplete(FutureOr action()) => null;

  @override
  Future<T> catchError(Function onError, {bool test(bool test(Object error))}) {
    return null;
  }

  @override
  Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) => null;
}

main() {
  Expect.isTrue(new A<B>().m(new B()));
  Expect.isTrue(new A<B>().m(new FutureMock<B>(new B())));
  Expect.isFalse(new A<C>().m(new B()));
  Expect.isFalse(new A<C>().m(new FutureMock<B>(new B())));
}
