mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 08:44:27 +00:00
Add more tests for FutureOr used as a type.
Change-Id: I53a569eeee04f54fe2ac55009a25a806356d9880 Reviewed-on: https://dart-review.googlesource.com/36440 Commit-Queue: Erik Ernst <eernst@google.com> Reviewed-by: Erik Ernst <eernst@google.com>
This commit is contained in:
parent
1fc73bf1a6
commit
7c05f1e608
2 changed files with 257 additions and 0 deletions
254
tests/lib_2/async/future_or_type_test.dart
Normal file
254
tests/lib_2/async/future_or_type_test.dart
Normal file
|
@ -0,0 +1,254 @@
|
|||
// 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.
|
||||
|
||||
// In strong mode, `FutureOr` should be a valid type in most locations.
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:expect/expect.dart';
|
||||
|
||||
typedef void FunTakes<T>(T x);
|
||||
typedef T FunReturns<T>();
|
||||
|
||||
main() {
|
||||
// Some useful values.
|
||||
dynamic n = null;
|
||||
dynamic i = 0;
|
||||
dynamic d = 1.5;
|
||||
dynamic fni = new Future<num>.value(i);
|
||||
dynamic fnd = new Future<num>.value(d);
|
||||
dynamic fi = new Future<int>.value(i);
|
||||
dynamic fd = new Future<double>.value(d);
|
||||
dynamic fn = new Future<Null>.value(null);
|
||||
|
||||
dynamic o = new Object();
|
||||
dynamic fo = new Future<Object>.value(o);
|
||||
dynamic foi = new Future<Object>.value(i);
|
||||
|
||||
if (typeAssertionsEnabled) {
|
||||
// Type annotation allows correct values.
|
||||
FutureOr<num> v;
|
||||
v = n;
|
||||
v = i;
|
||||
v = d;
|
||||
v = fni;
|
||||
v = fnd;
|
||||
v = fi;
|
||||
v = fd;
|
||||
v = fn;
|
||||
// Disallows invalid values.
|
||||
// These are all valid down-casts that fail at runtime.
|
||||
Expect.throws(() => v = o);
|
||||
Expect.throws(() => v = fo);
|
||||
Expect.throws(() => v = foi);
|
||||
|
||||
void fun(FutureOr<num> v) {}
|
||||
fun(n);
|
||||
fun(i);
|
||||
fun(d);
|
||||
fun(fni);
|
||||
fun(fnd);
|
||||
fun(fi);
|
||||
fun(fd);
|
||||
fun(fn);
|
||||
// Disallows invalid values.
|
||||
// These are all valid down-casts that fail at runtime.
|
||||
Expect.throws(() => fun(o));
|
||||
Expect.throws(() => fun(fo));
|
||||
Expect.throws(() => fun(foi));
|
||||
|
||||
FutureOr<num> fun2(Object o) => o; // implicit down-cast to return type.
|
||||
fun2(n);
|
||||
fun2(i);
|
||||
fun2(d);
|
||||
fun2(fni);
|
||||
fun2(fnd);
|
||||
fun2(fi);
|
||||
fun2(fd);
|
||||
fun2(fn);
|
||||
// Disallows invalid values.
|
||||
Expect.throws(() => fun2(o));
|
||||
Expect.throws(() => fun2(fo));
|
||||
Expect.throws(() => fun2(foi));
|
||||
|
||||
List<Object> list = new List<FutureOr<num>>();
|
||||
list.add(n);
|
||||
list.add(i);
|
||||
list.add(d);
|
||||
list.add(fni);
|
||||
list.add(fnd);
|
||||
list.add(fi);
|
||||
list.add(fd);
|
||||
list.add(fn);
|
||||
Expect.throws(() => list.add(o));
|
||||
Expect.throws(() => list.add(fo));
|
||||
Expect.throws(() => list.add(foi));
|
||||
}
|
||||
|
||||
{
|
||||
// Casts.
|
||||
FutureOr<num> v;
|
||||
v = n as FutureOr<num>;
|
||||
v = i as FutureOr<num>;
|
||||
v = d as FutureOr<num>;
|
||||
v = fni as FutureOr<num>;
|
||||
v = fnd as FutureOr<num>;
|
||||
v = fi as FutureOr<num>;
|
||||
v = fd as FutureOr<num>;
|
||||
v = fn as FutureOr<num>;
|
||||
// Disallows invalid values.
|
||||
// These are all valid down-casts that fail at runtime.
|
||||
Expect.throws(() => v = o as FutureOr<num>);
|
||||
Expect.throws(() => v = fo as FutureOr<num>);
|
||||
Expect.throws(() => v = foi as FutureOr<num>);
|
||||
}
|
||||
|
||||
{
|
||||
// on-catch
|
||||
String check(Object o) {
|
||||
try {
|
||||
throw o;
|
||||
} on FutureOr<num> {
|
||||
return "caught";
|
||||
} on Object {
|
||||
return "uncaught";
|
||||
}
|
||||
}
|
||||
|
||||
// Can't throw null, so no `n` case here.
|
||||
Expect.equals("caught", check(i));
|
||||
Expect.equals("caught", check(d));
|
||||
Expect.equals("caught", check(fni));
|
||||
Expect.equals("caught", check(fnd));
|
||||
Expect.equals("caught", check(fi));
|
||||
Expect.equals("caught", check(fd));
|
||||
Expect.equals("caught", check(fn));
|
||||
|
||||
Expect.equals("uncaught", check(o));
|
||||
Expect.equals("uncaught", check(fo));
|
||||
Expect.equals("uncaught", check(foi));
|
||||
}
|
||||
|
||||
{
|
||||
// Type variable bound.
|
||||
var valids = <C<FutureOr<num>>>[
|
||||
new C<Null>(),
|
||||
new C<int>(),
|
||||
new C<double>(),
|
||||
new C<num>(),
|
||||
new C<Future<Null>>(),
|
||||
new C<Future<int>>(),
|
||||
new C<Future<double>>(),
|
||||
new C<Future<num>>(),
|
||||
new C<FutureOr<Null>>(),
|
||||
new C<FutureOr<int>>(),
|
||||
new C<FutureOr<double>>(),
|
||||
new C<FutureOr<num>>(),
|
||||
];
|
||||
Expect.equals(12, valids.length);
|
||||
}
|
||||
|
||||
{
|
||||
// Dynamic checks.
|
||||
Expect.isFalse(new C<FutureOr<num>>().isCheck(n));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(i));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(d));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(fni));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(fnd));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(fi));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(fd));
|
||||
Expect.isTrue(new C<FutureOr<num>>().isCheck(fn));
|
||||
Expect.isFalse(new C<FutureOr<num>>().isCheck(o));
|
||||
Expect.isFalse(new C<FutureOr<num>>().isCheck(fo));
|
||||
Expect.isFalse(new C<FutureOr<num>>().isCheck(foi));
|
||||
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(n));
|
||||
Expect.isTrue(new C<FutureOr<int>>().isCheck(i));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(d));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(fni));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(fnd));
|
||||
Expect.isTrue(new C<FutureOr<int>>().isCheck(fi));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(fd));
|
||||
Expect.isTrue(new C<FutureOr<int>>().isCheck(fn));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(o));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(fo));
|
||||
Expect.isFalse(new C<FutureOr<int>>().isCheck(foi));
|
||||
|
||||
Expect.isTrue(new C<FutureOr<Null>>().isCheck(n));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(i));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(d));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(fni));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(fnd));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(fi));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(fd));
|
||||
Expect.isTrue(new C<FutureOr<Null>>().isCheck(fn));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(o));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(fo));
|
||||
Expect.isFalse(new C<FutureOr<Null>>().isCheck(foi));
|
||||
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(n));
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(i));
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(d));
|
||||
Expect.isTrue(new C<Future<num>>().isCheck(fni));
|
||||
Expect.isTrue(new C<Future<num>>().isCheck(fnd));
|
||||
Expect.isTrue(new C<Future<num>>().isCheck(fi));
|
||||
Expect.isTrue(new C<Future<num>>().isCheck(fd));
|
||||
Expect.isTrue(new C<Future<num>>().isCheck(fn));
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(o));
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(fo));
|
||||
Expect.isFalse(new C<Future<num>>().isCheck(foi));
|
||||
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(n));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(i));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(d));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(fni));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(fnd));
|
||||
Expect.isTrue(new C<Future<int>>().isCheck(fi));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(fd));
|
||||
Expect.isTrue(new C<Future<int>>().isCheck(fn));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(o));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(fo));
|
||||
Expect.isFalse(new C<Future<int>>().isCheck(foi));
|
||||
|
||||
Expect.isFalse(new C<num>().isCheck(n));
|
||||
Expect.isTrue(new C<num>().isCheck(i));
|
||||
Expect.isTrue(new C<num>().isCheck(d));
|
||||
Expect.isFalse(new C<num>().isCheck(fni));
|
||||
Expect.isFalse(new C<num>().isCheck(fnd));
|
||||
Expect.isFalse(new C<num>().isCheck(fi));
|
||||
Expect.isFalse(new C<num>().isCheck(fd));
|
||||
Expect.isFalse(new C<num>().isCheck(fn));
|
||||
Expect.isFalse(new C<num>().isCheck(o));
|
||||
Expect.isFalse(new C<num>().isCheck(fo));
|
||||
Expect.isFalse(new C<num>().isCheck(foi));
|
||||
|
||||
Expect.isFalse(new C<int>().isCheck(n));
|
||||
Expect.isTrue(new C<int>().isCheck(i));
|
||||
Expect.isFalse(new C<int>().isCheck(d));
|
||||
Expect.isFalse(new C<int>().isCheck(fni));
|
||||
Expect.isFalse(new C<int>().isCheck(fnd));
|
||||
Expect.isFalse(new C<int>().isCheck(fi));
|
||||
Expect.isFalse(new C<int>().isCheck(fd));
|
||||
Expect.isFalse(new C<int>().isCheck(fn));
|
||||
Expect.isFalse(new C<int>().isCheck(o));
|
||||
Expect.isFalse(new C<int>().isCheck(fo));
|
||||
Expect.isFalse(new C<int>().isCheck(foi));
|
||||
|
||||
Expect.isTrue(new C<Null>().isCheck(n));
|
||||
Expect.isFalse(new C<Null>().isCheck(i));
|
||||
Expect.isFalse(new C<Null>().isCheck(d));
|
||||
Expect.isFalse(new C<Null>().isCheck(fni));
|
||||
Expect.isFalse(new C<Null>().isCheck(fnd));
|
||||
Expect.isFalse(new C<Null>().isCheck(fi));
|
||||
Expect.isFalse(new C<Null>().isCheck(fd));
|
||||
Expect.isFalse(new C<Null>().isCheck(fn));
|
||||
Expect.isFalse(new C<Null>().isCheck(o));
|
||||
Expect.isFalse(new C<Null>().isCheck(fo));
|
||||
Expect.isFalse(new C<Null>().isCheck(foi));
|
||||
}
|
||||
}
|
||||
|
||||
// FutureOr used as type parameter bound.
|
||||
class C<T extends FutureOr<num>> {
|
||||
bool isCheck(Object o) => o is T;
|
||||
}
|
|
@ -124,6 +124,9 @@ async/stream_first_where_test/badType: MissingCompileTimeError
|
|||
async/stream_last_where_test/badType: MissingCompileTimeError
|
||||
mirrors/redirecting_factory_different_type_test/02: MissingCompileTimeError
|
||||
|
||||
[ !$strong && $compiler != fasta ]
|
||||
async/future_or_type_test: Fail # Strong mode implements FutureOr, non-strong treats it as dynamic.
|
||||
|
||||
[ $builder_tag == mac10_7 && $runtime == safari ]
|
||||
typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
|
||||
typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
|
||||
|
|
Loading…
Reference in a new issue