| // 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. | 
 |  | 
 | // @dart = 2.9 | 
 |  | 
 | // 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<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<int>>); | 
 |   Expect.isTrue(foo is FunTakes<FutureOr<String>>); | 
 |   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.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.isTrue(bar is FunReturns<FutureOr<Object>>); | 
 |   Expect.isFalse(bar is FunReturns<FutureOr<int>>); | 
 |   Expect.isFalse(bar is FunReturns<FutureOr<String>>); | 
 |   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<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<int>>); | 
 |   Expect.isTrue(foo2 is FunTakes<FutureOr<String>>); | 
 |   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.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<int>>); | 
 |   Expect.isFalse(bar2 is FunReturns<FutureOr<String>>); | 
 |   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<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<int>>); | 
 |   Expect.isFalse(foo3 is FunTakes<FutureOr<String>>); | 
 |   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<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<int>>); | 
 |   Expect.isFalse(bar3 is FunReturns<FutureOr<String>>); | 
 |   Expect.isTrue(bar3 is FunReturns<FutureOr<FutureOr<Object>>>); | 
 |   Expect.isTrue(bar3 is FunReturns<FutureOr<FutureOr<int>>>); | 
 |   Expect.isFalse(bar3 is FunReturns<FutureOr<FutureOr<String>>>); | 
 | } |