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

// Requirements=nnbd-strong

// In strong mode, `FutureOr` should be equivalent to the union of `Future<T>`
// and `T`.

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

typedef void FunTakes<T>(T x);
typedef T FunReturns<T>();

main() {
  Expect.isTrue(499 is FutureOr); // Same as `is Object?`.
  Expect.isTrue(499 is FutureOr<int>);
  Expect.isFalse(499 is FutureOr<String>);

  Expect.isTrue(new Future.value(499) is FutureOr); // Same as `is Object?`.
  Expect.isTrue(new Future.value(499) is FutureOr<int>);
  Expect.isFalse(new Future.value(499) is FutureOr<String>);

  void foo(FutureOr x) {} // Equivalent to `void bar(Object? x) {}`.

  // A function that takes Object? takes everything.
  Expect.isTrue(foo is FunTakes<dynamic>);
  Expect.isTrue(foo is FunTakes<Object>);
  Expect.isTrue(foo is FunTakes<Object?>);
  Expect.isTrue(foo is FunTakes<int>);
  Expect.isTrue(foo is FunTakes<String>);
  Expect.isTrue(foo is FunTakes<Future<int>>);
  Expect.isTrue(foo is FunTakes<Future<String>>);
  Expect.isTrue(foo is FunTakes<FutureOr<Object>>);
  Expect.isTrue(foo is FunTakes<FutureOr<Object?>>);
  Expect.isTrue(foo is FunTakes<FutureOr<int>>);
  Expect.isTrue(foo is FunTakes<FutureOr<String>>);
  Expect.isTrue(foo is FunTakes<FutureOr<FutureOr<Object>>>);
  Expect.isTrue(foo is FunTakes<FutureOr<FutureOr<Object?>>>);
  Expect.isTrue(foo is FunTakes<FutureOr<FutureOr<int>>>);
  Expect.isTrue(foo is FunTakes<FutureOr<FutureOr<String>>>);

  FutureOr bar() => 499; // Equivalent to `Object? foo() => 499`.

  Expect.isTrue(bar is FunReturns<dynamic>);
  Expect.isFalse(bar is FunReturns<Object>);
  Expect.isTrue(bar is FunReturns<Object?>);
  Expect.isFalse(bar is FunReturns<int>);
  Expect.isFalse(bar is FunReturns<String>);
  Expect.isFalse(bar is FunReturns<Future<int>>);
  Expect.isFalse(bar is FunReturns<Future<String>>);
  Expect.isFalse(bar is FunReturns<FutureOr<Object>>);
  Expect.isTrue(bar is FunReturns<FutureOr<Object?>>);
  Expect.isFalse(bar is FunReturns<FutureOr<int>>);
  Expect.isFalse(bar is FunReturns<FutureOr<String>>);
  Expect.isFalse(bar is FunReturns<FutureOr<FutureOr<Object>>>);
  Expect.isTrue(bar is FunReturns<FutureOr<FutureOr<Object?>>>);
  Expect.isFalse(bar is FunReturns<FutureOr<FutureOr<int>>>);
  Expect.isFalse(bar is FunReturns<FutureOr<FutureOr<String>>>);

  void foo2(FutureOr<String> x) {}

  Expect.isFalse(foo2 is FunTakes<dynamic>);
  Expect.isFalse(foo2 is FunTakes<Object>);
  Expect.isFalse(foo2 is FunTakes<Object?>);
  Expect.isFalse(foo2 is FunTakes<int>);
  Expect.isTrue(foo2 is FunTakes<String>);
  Expect.isFalse(foo2 is FunTakes<Future<int>>);
  Expect.isTrue(foo2 is FunTakes<Future<String>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<Object>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<Object?>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<int>>);
  Expect.isTrue(foo2 is FunTakes<FutureOr<String>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<FutureOr<Object>>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<FutureOr<Object?>>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<FutureOr<int>>>);
  Expect.isFalse(foo2 is FunTakes<FutureOr<FutureOr<String>>>);

  FutureOr<int> bar2() => 499;

  Expect.isTrue(bar2 is FunReturns<dynamic>);
  Expect.isTrue(bar2 is FunReturns<Object>);
  Expect.isTrue(bar2 is FunReturns<Object?>);
  Expect.isFalse(bar2 is FunReturns<int>);
  Expect.isFalse(bar2 is FunReturns<String>);
  Expect.isFalse(bar2 is FunReturns<Future<int>>);
  Expect.isFalse(bar2 is FunReturns<Future<String>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<Object>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<Object?>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<int>>);
  Expect.isFalse(bar2 is FunReturns<FutureOr<String>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<FutureOr<Object>>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<FutureOr<Object?>>>);
  Expect.isTrue(bar2 is FunReturns<FutureOr<FutureOr<int>>>);
  Expect.isFalse(bar2 is FunReturns<FutureOr<FutureOr<String>>>);

  void foo3(String x) {}

  Expect.isFalse(foo3 is FunTakes<dynamic>);
  Expect.isFalse(foo3 is FunTakes<Object>);
  Expect.isFalse(foo3 is FunTakes<Object?>);
  Expect.isFalse(foo3 is FunTakes<int>);
  Expect.isTrue(foo3 is FunTakes<String>);
  Expect.isFalse(foo3 is FunTakes<Future<int>>);
  Expect.isFalse(foo3 is FunTakes<Future<String>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<Object>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<Object?>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<int>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<String>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<FutureOr<Object>>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<FutureOr<Object?>>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<FutureOr<int>>>);
  Expect.isFalse(foo3 is FunTakes<FutureOr<FutureOr<String>>>);

  int bar3() => 499;

  Expect.isTrue(bar3 is FunReturns<dynamic>);
  Expect.isTrue(bar3 is FunReturns<Object>);
  Expect.isTrue(bar3 is FunReturns<Object?>);
  Expect.isTrue(bar3 is FunReturns<int>);
  Expect.isFalse(bar3 is FunReturns<String>);
  Expect.isFalse(bar3 is FunReturns<Future<int>>);
  Expect.isFalse(bar3 is FunReturns<Future<String>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<Object>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<Object?>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<int>>);
  Expect.isFalse(bar3 is FunReturns<FutureOr<String>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<FutureOr<Object>>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<FutureOr<Object?>>>);
  Expect.isTrue(bar3 is FunReturns<FutureOr<FutureOr<int>>>);
  Expect.isFalse(bar3 is FunReturns<FutureOr<FutureOr<String>>>);
}