| // 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>>>); |
| } |