Index: tests/compiler/dart2js/subtype_test.dart |
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart |
index 35a46517582f585d7092c458cbe068ef433df522..2322ee01187906f102314e46d108a1845ddaba07 100644 |
--- a/tests/compiler/dart2js/subtype_test.dart |
+++ b/tests/compiler/dart2js/subtype_test.dart |
@@ -5,6 +5,7 @@ |
library subtype_test; |
import 'package:expect/expect.dart'; |
+import "package:async_helper/async_helper.dart"; |
import 'type_test_helper.dart'; |
import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart'; |
import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart" |
@@ -23,210 +24,210 @@ void main() { |
} |
void testInterfaceSubtype() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
class A<T> {} |
class B<T1, T2> extends A<T1> {} |
// TODO(johnniwinther): Inheritance with different type arguments is |
// currently not supported by the implementation. |
class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {} |
- """); |
- |
- void expect(bool value, DartType T, DartType S) { |
- Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
- } |
- |
- ClassElement A = env.getElement('A'); |
- ClassElement B = env.getElement('B'); |
- ClassElement C = env.getElement('C'); |
- DartType Object_ = env['Object']; |
- DartType num_ = env['num']; |
- DartType int_ = env['int']; |
- DartType String_ = env['String']; |
- DartType dynamic_ = env['dynamic']; |
- |
- expect(true, Object_, Object_); |
- expect(true, num_, Object_); |
- expect(true, int_, Object_); |
- expect(true, String_, Object_); |
- expect(true, dynamic_, Object_); |
- |
- expect(false, Object_, num_); |
- expect(true, num_, num_); |
- expect(true, int_, num_); |
- expect(false, String_, num_); |
- expect(true, dynamic_, num_); |
- |
- expect(false, Object_, int_); |
- expect(false, num_, int_); |
- expect(true, int_, int_); |
- expect(false, String_, int_); |
- expect(true, dynamic_, int_); |
- |
- expect(false, Object_, String_); |
- expect(false, num_, String_); |
- expect(false, int_, String_); |
- expect(true, String_, String_); |
- expect(true, dynamic_, String_); |
- |
- expect(true, Object_, dynamic_); |
- expect(true, num_, dynamic_); |
- expect(true, int_, dynamic_); |
- expect(true, String_, dynamic_); |
- expect(true, dynamic_, dynamic_); |
- |
- DartType A_Object = instantiate(A, [Object_]); |
- DartType A_num = instantiate(A, [num_]); |
- DartType A_int = instantiate(A, [int_]); |
- DartType A_String = instantiate(A, [String_]); |
- DartType A_dynamic = instantiate(A, [dynamic_]); |
- |
- expect(true, A_Object, Object_); |
- expect(false, A_Object, num_); |
- expect(false, A_Object, int_); |
- expect(false, A_Object, String_); |
- expect(true, A_Object, dynamic_); |
- |
- expect(true, A_Object, A_Object); |
- expect(true, A_num, A_Object); |
- expect(true, A_int, A_Object); |
- expect(true, A_String, A_Object); |
- expect(true, A_dynamic, A_Object); |
- |
- expect(false, A_Object, A_num); |
- expect(true, A_num, A_num); |
- expect(true, A_int, A_num); |
- expect(false, A_String, A_num); |
- expect(true, A_dynamic, A_num); |
- |
- expect(false, A_Object, A_int); |
- expect(false, A_num, A_int); |
- expect(true, A_int, A_int); |
- expect(false, A_String, A_int); |
- expect(true, A_dynamic, A_int); |
- |
- expect(false, A_Object, A_String); |
- expect(false, A_num, A_String); |
- expect(false, A_int, A_String); |
- expect(true, A_String, A_String); |
- expect(true, A_dynamic, A_String); |
- |
- expect(true, A_Object, A_dynamic); |
- expect(true, A_num, A_dynamic); |
- expect(true, A_int, A_dynamic); |
- expect(true, A_String, A_dynamic); |
- expect(true, A_dynamic, A_dynamic); |
- |
- DartType B_Object_Object = instantiate(B, [Object_, Object_]); |
- DartType B_num_num = instantiate(B, [num_, num_]); |
- DartType B_int_num = instantiate(B, [int_, num_]); |
- DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); |
- DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); |
- |
- expect(true, B_Object_Object, Object_); |
- expect(true, B_Object_Object, A_Object); |
- expect(false, B_Object_Object, A_num); |
- expect(false, B_Object_Object, A_int); |
- expect(false, B_Object_Object, A_String); |
- expect(true, B_Object_Object, A_dynamic); |
- |
- expect(true, B_num_num, Object_); |
- expect(true, B_num_num, A_Object); |
- expect(true, B_num_num, A_num); |
- expect(false, B_num_num, A_int); |
- expect(false, B_num_num, A_String); |
- expect(true, B_num_num, A_dynamic); |
- |
- expect(true, B_int_num, Object_); |
- expect(true, B_int_num, A_Object); |
- expect(true, B_int_num, A_num); |
- expect(true, B_int_num, A_int); |
- expect(false, B_int_num, A_String); |
- expect(true, B_int_num, A_dynamic); |
- |
- expect(true, B_dynamic_dynamic, Object_); |
- expect(true, B_dynamic_dynamic, A_Object); |
- expect(true, B_dynamic_dynamic, A_num); |
- expect(true, B_dynamic_dynamic, A_int); |
- expect(true, B_dynamic_dynamic, A_String); |
- expect(true, B_dynamic_dynamic, A_dynamic); |
- |
- expect(true, B_String_dynamic, Object_); |
- expect(true, B_String_dynamic, A_Object); |
- expect(false, B_String_dynamic, A_num); |
- expect(false, B_String_dynamic, A_int); |
- expect(true, B_String_dynamic, A_String); |
- expect(true, B_String_dynamic, A_dynamic); |
- |
- expect(true, B_Object_Object, B_Object_Object); |
- expect(true, B_num_num, B_Object_Object); |
- expect(true, B_int_num, B_Object_Object); |
- expect(true, B_dynamic_dynamic, B_Object_Object); |
- expect(true, B_String_dynamic, B_Object_Object); |
- |
- expect(false, B_Object_Object, B_num_num); |
- expect(true, B_num_num, B_num_num); |
- expect(true, B_int_num, B_num_num); |
- expect(true, B_dynamic_dynamic, B_num_num); |
- expect(false, B_String_dynamic, B_num_num); |
- |
- expect(false, B_Object_Object, B_int_num); |
- expect(false, B_num_num, B_int_num); |
- expect(true, B_int_num, B_int_num); |
- expect(true, B_dynamic_dynamic, B_int_num); |
- expect(false, B_String_dynamic, B_int_num); |
- |
- expect(true, B_Object_Object, B_dynamic_dynamic); |
- expect(true, B_num_num, B_dynamic_dynamic); |
- expect(true, B_int_num, B_dynamic_dynamic); |
- expect(true, B_dynamic_dynamic, B_dynamic_dynamic); |
- expect(true, B_String_dynamic, B_dynamic_dynamic); |
- |
- expect(false, B_Object_Object, B_String_dynamic); |
- expect(false, B_num_num, B_String_dynamic); |
- expect(false, B_int_num, B_String_dynamic); |
- expect(true, B_dynamic_dynamic, B_String_dynamic); |
- expect(true, B_String_dynamic, B_String_dynamic); |
- |
- DartType C_Object_Object = instantiate(C, [Object_, Object_]); |
- DartType C_num_num = instantiate(C, [num_, num_]); |
- DartType C_int_String = instantiate(C, [int_, String_]); |
- DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); |
- |
- expect(true, C_Object_Object, B_Object_Object); |
- expect(false, C_Object_Object, B_num_num); |
- expect(false, C_Object_Object, B_int_num); |
- expect(true, C_Object_Object, B_dynamic_dynamic); |
- expect(false, C_Object_Object, B_String_dynamic); |
- |
- expect(true, C_num_num, B_Object_Object); |
- expect(true, C_num_num, B_num_num); |
- expect(false, C_num_num, B_int_num); |
- expect(true, C_num_num, B_dynamic_dynamic); |
- expect(false, C_num_num, B_String_dynamic); |
- |
- expect(true, C_int_String, B_Object_Object); |
- expect(false, C_int_String, B_num_num); |
- expect(false, C_int_String, B_int_num); |
- expect(true, C_int_String, B_dynamic_dynamic); |
- expect(true, C_int_String, B_String_dynamic); |
- |
- expect(true, C_dynamic_dynamic, B_Object_Object); |
- expect(true, C_dynamic_dynamic, B_num_num); |
- expect(true, C_dynamic_dynamic, B_int_num); |
- expect(true, C_dynamic_dynamic, B_dynamic_dynamic); |
- expect(true, C_dynamic_dynamic, B_String_dynamic); |
- |
- expect(false, C_int_String, A_int); |
- expect(true, C_int_String, A_String); |
- // TODO(johnniwinther): Inheritance with different type arguments is |
- // currently not supported by the implementation. |
- //expect(true, C_int_String, instantiate(A, [A_int])); |
- expect(false, C_int_String, instantiate(A, [A_String])); |
+ """).then((env) { |
+ |
+ void expect(bool value, DartType T, DartType S) { |
+ Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
+ } |
+ |
+ ClassElement A = env.getElement('A'); |
+ ClassElement B = env.getElement('B'); |
+ ClassElement C = env.getElement('C'); |
+ DartType Object_ = env['Object']; |
+ DartType num_ = env['num']; |
+ DartType int_ = env['int']; |
+ DartType String_ = env['String']; |
+ DartType dynamic_ = env['dynamic']; |
+ |
+ expect(true, Object_, Object_); |
+ expect(true, num_, Object_); |
+ expect(true, int_, Object_); |
+ expect(true, String_, Object_); |
+ expect(true, dynamic_, Object_); |
+ |
+ expect(false, Object_, num_); |
+ expect(true, num_, num_); |
+ expect(true, int_, num_); |
+ expect(false, String_, num_); |
+ expect(true, dynamic_, num_); |
+ |
+ expect(false, Object_, int_); |
+ expect(false, num_, int_); |
+ expect(true, int_, int_); |
+ expect(false, String_, int_); |
+ expect(true, dynamic_, int_); |
+ |
+ expect(false, Object_, String_); |
+ expect(false, num_, String_); |
+ expect(false, int_, String_); |
+ expect(true, String_, String_); |
+ expect(true, dynamic_, String_); |
+ |
+ expect(true, Object_, dynamic_); |
+ expect(true, num_, dynamic_); |
+ expect(true, int_, dynamic_); |
+ expect(true, String_, dynamic_); |
+ expect(true, dynamic_, dynamic_); |
+ |
+ DartType A_Object = instantiate(A, [Object_]); |
+ DartType A_num = instantiate(A, [num_]); |
+ DartType A_int = instantiate(A, [int_]); |
+ DartType A_String = instantiate(A, [String_]); |
+ DartType A_dynamic = instantiate(A, [dynamic_]); |
+ |
+ expect(true, A_Object, Object_); |
+ expect(false, A_Object, num_); |
+ expect(false, A_Object, int_); |
+ expect(false, A_Object, String_); |
+ expect(true, A_Object, dynamic_); |
+ |
+ expect(true, A_Object, A_Object); |
+ expect(true, A_num, A_Object); |
+ expect(true, A_int, A_Object); |
+ expect(true, A_String, A_Object); |
+ expect(true, A_dynamic, A_Object); |
+ |
+ expect(false, A_Object, A_num); |
+ expect(true, A_num, A_num); |
+ expect(true, A_int, A_num); |
+ expect(false, A_String, A_num); |
+ expect(true, A_dynamic, A_num); |
+ |
+ expect(false, A_Object, A_int); |
+ expect(false, A_num, A_int); |
+ expect(true, A_int, A_int); |
+ expect(false, A_String, A_int); |
+ expect(true, A_dynamic, A_int); |
+ |
+ expect(false, A_Object, A_String); |
+ expect(false, A_num, A_String); |
+ expect(false, A_int, A_String); |
+ expect(true, A_String, A_String); |
+ expect(true, A_dynamic, A_String); |
+ |
+ expect(true, A_Object, A_dynamic); |
+ expect(true, A_num, A_dynamic); |
+ expect(true, A_int, A_dynamic); |
+ expect(true, A_String, A_dynamic); |
+ expect(true, A_dynamic, A_dynamic); |
+ |
+ DartType B_Object_Object = instantiate(B, [Object_, Object_]); |
+ DartType B_num_num = instantiate(B, [num_, num_]); |
+ DartType B_int_num = instantiate(B, [int_, num_]); |
+ DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); |
+ DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); |
+ |
+ expect(true, B_Object_Object, Object_); |
+ expect(true, B_Object_Object, A_Object); |
+ expect(false, B_Object_Object, A_num); |
+ expect(false, B_Object_Object, A_int); |
+ expect(false, B_Object_Object, A_String); |
+ expect(true, B_Object_Object, A_dynamic); |
+ |
+ expect(true, B_num_num, Object_); |
+ expect(true, B_num_num, A_Object); |
+ expect(true, B_num_num, A_num); |
+ expect(false, B_num_num, A_int); |
+ expect(false, B_num_num, A_String); |
+ expect(true, B_num_num, A_dynamic); |
+ |
+ expect(true, B_int_num, Object_); |
+ expect(true, B_int_num, A_Object); |
+ expect(true, B_int_num, A_num); |
+ expect(true, B_int_num, A_int); |
+ expect(false, B_int_num, A_String); |
+ expect(true, B_int_num, A_dynamic); |
+ |
+ expect(true, B_dynamic_dynamic, Object_); |
+ expect(true, B_dynamic_dynamic, A_Object); |
+ expect(true, B_dynamic_dynamic, A_num); |
+ expect(true, B_dynamic_dynamic, A_int); |
+ expect(true, B_dynamic_dynamic, A_String); |
+ expect(true, B_dynamic_dynamic, A_dynamic); |
+ |
+ expect(true, B_String_dynamic, Object_); |
+ expect(true, B_String_dynamic, A_Object); |
+ expect(false, B_String_dynamic, A_num); |
+ expect(false, B_String_dynamic, A_int); |
+ expect(true, B_String_dynamic, A_String); |
+ expect(true, B_String_dynamic, A_dynamic); |
+ |
+ expect(true, B_Object_Object, B_Object_Object); |
+ expect(true, B_num_num, B_Object_Object); |
+ expect(true, B_int_num, B_Object_Object); |
+ expect(true, B_dynamic_dynamic, B_Object_Object); |
+ expect(true, B_String_dynamic, B_Object_Object); |
+ |
+ expect(false, B_Object_Object, B_num_num); |
+ expect(true, B_num_num, B_num_num); |
+ expect(true, B_int_num, B_num_num); |
+ expect(true, B_dynamic_dynamic, B_num_num); |
+ expect(false, B_String_dynamic, B_num_num); |
+ |
+ expect(false, B_Object_Object, B_int_num); |
+ expect(false, B_num_num, B_int_num); |
+ expect(true, B_int_num, B_int_num); |
+ expect(true, B_dynamic_dynamic, B_int_num); |
+ expect(false, B_String_dynamic, B_int_num); |
+ |
+ expect(true, B_Object_Object, B_dynamic_dynamic); |
+ expect(true, B_num_num, B_dynamic_dynamic); |
+ expect(true, B_int_num, B_dynamic_dynamic); |
+ expect(true, B_dynamic_dynamic, B_dynamic_dynamic); |
+ expect(true, B_String_dynamic, B_dynamic_dynamic); |
+ |
+ expect(false, B_Object_Object, B_String_dynamic); |
+ expect(false, B_num_num, B_String_dynamic); |
+ expect(false, B_int_num, B_String_dynamic); |
+ expect(true, B_dynamic_dynamic, B_String_dynamic); |
+ expect(true, B_String_dynamic, B_String_dynamic); |
+ |
+ DartType C_Object_Object = instantiate(C, [Object_, Object_]); |
+ DartType C_num_num = instantiate(C, [num_, num_]); |
+ DartType C_int_String = instantiate(C, [int_, String_]); |
+ DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); |
+ |
+ expect(true, C_Object_Object, B_Object_Object); |
+ expect(false, C_Object_Object, B_num_num); |
+ expect(false, C_Object_Object, B_int_num); |
+ expect(true, C_Object_Object, B_dynamic_dynamic); |
+ expect(false, C_Object_Object, B_String_dynamic); |
+ |
+ expect(true, C_num_num, B_Object_Object); |
+ expect(true, C_num_num, B_num_num); |
+ expect(false, C_num_num, B_int_num); |
+ expect(true, C_num_num, B_dynamic_dynamic); |
+ expect(false, C_num_num, B_String_dynamic); |
+ |
+ expect(true, C_int_String, B_Object_Object); |
+ expect(false, C_int_String, B_num_num); |
+ expect(false, C_int_String, B_int_num); |
+ expect(true, C_int_String, B_dynamic_dynamic); |
+ expect(true, C_int_String, B_String_dynamic); |
+ |
+ expect(true, C_dynamic_dynamic, B_Object_Object); |
+ expect(true, C_dynamic_dynamic, B_num_num); |
+ expect(true, C_dynamic_dynamic, B_int_num); |
+ expect(true, C_dynamic_dynamic, B_dynamic_dynamic); |
+ expect(true, C_dynamic_dynamic, B_String_dynamic); |
+ |
+ expect(false, C_int_String, A_int); |
+ expect(true, C_int_String, A_String); |
+ // TODO(johnniwinther): Inheritance with different type arguments is |
+ // currently not supported by the implementation. |
+ //expect(true, C_int_String, instantiate(A, [A_int])); |
+ expect(false, C_int_String, instantiate(A, [A_String])); |
+ })); |
} |
void testCallableSubtype() { |
- |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
class U {} |
class V extends U {} |
class W extends V {} |
@@ -239,31 +240,31 @@ void testCallableSubtype() { |
int m4(V v, U u); |
void m5(V v, int i); |
} |
- """); |
- |
- void expect(bool value, DartType T, DartType S) { |
- Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
- } |
- |
- ClassElement classA = env.getElement('A'); |
- DartType A = classA.rawType; |
- DartType function = env['Function']; |
- DartType m1 = env.getMemberType(classA, 'm1'); |
- DartType m2 = env.getMemberType(classA, 'm2'); |
- DartType m3 = env.getMemberType(classA, 'm3'); |
- DartType m4 = env.getMemberType(classA, 'm4'); |
- DartType m5 = env.getMemberType(classA, 'm5'); |
- |
- expect(true, A, function); |
- expect(true, A, m1); |
- expect(true, A, m2); |
- expect(false, A, m3); |
- expect(false, A, m4); |
- expect(true, A, m5); |
+ """).then((env) { |
+ void expect(bool value, DartType T, DartType S) { |
+ Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
+ } |
+ |
+ ClassElement classA = env.getElement('A'); |
+ DartType A = classA.rawType; |
+ DartType function = env['Function']; |
+ DartType m1 = env.getMemberType(classA, 'm1'); |
+ DartType m2 = env.getMemberType(classA, 'm2'); |
+ DartType m3 = env.getMemberType(classA, 'm3'); |
+ DartType m4 = env.getMemberType(classA, 'm4'); |
+ DartType m5 = env.getMemberType(classA, 'm5'); |
+ |
+ expect(true, A, function); |
+ expect(true, A, m1); |
+ expect(true, A, m2); |
+ expect(false, A, m3); |
+ expect(false, A, m4); |
+ expect(true, A, m5); |
+ })); |
} |
testFunctionSubtyping() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
_() => null; |
void void_() {} |
void void_2() {} |
@@ -280,12 +281,11 @@ testFunctionSubtyping() { |
int int__int_int(int i1, int i2) => 0; |
void inline_void_(void f()) {} |
void inline_void__int(void f(int i)) {} |
- """); |
- functionSubtypingHelper(env); |
+ """).then(functionSubtypingHelper)); |
} |
testTypedefSubtyping() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
typedef _(); |
typedef void void_(); |
typedef void void_2(); |
@@ -302,8 +302,7 @@ testTypedefSubtyping() { |
typedef int int__int_int(int i1, int i2); |
typedef void inline_void_(void f()); |
typedef void inline_void__int(void f(int i)); |
- """); |
- functionSubtypingHelper(env); |
+ """).then(functionSubtypingHelper)); |
} |
functionSubtypingHelper(TypeEnvironment env) { |
@@ -363,7 +362,7 @@ functionSubtypingHelper(TypeEnvironment env) { |
} |
testFunctionSubtypingOptional() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
void void_() {} |
void void__int(int i) {} |
void void___int([int i]) {} |
@@ -376,12 +375,11 @@ testFunctionSubtypingOptional() { |
void void___int_int([int i1, int i2]) {} |
void void___int_int_int([int i1, int i2, int i3]); |
void void___Object_int([Object o, int i]) {} |
- """); |
- functionSubtypingOptionalHelper(env); |
+ """).then(functionSubtypingOptionalHelper)); |
} |
testTypedefSubtypingOptional() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
typedef void void_(); |
typedef void void__int(int i); |
typedef void void___int([int i]); |
@@ -394,8 +392,7 @@ testTypedefSubtypingOptional() { |
typedef void void___int_int([int i1, int i2]); |
typedef void void___int_int_int([int i1, int i2, int i3]); |
typedef void void___Object_int([Object o, int i]); |
- """); |
- functionSubtypingOptionalHelper(env); |
+ """).then(functionSubtypingOptionalHelper)); |
} |
functionSubtypingOptionalHelper(TypeEnvironment env) { |
@@ -443,7 +440,7 @@ functionSubtypingOptionalHelper(TypeEnvironment env) { |
} |
testFunctionSubtypingNamed() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
void void_() {} |
void void__int(int i) {} |
void void___a_int({int a}) {} |
@@ -458,12 +455,11 @@ testFunctionSubtypingNamed() { |
void void___a_int_c_int({int a, int c}) {} |
void void___b_int_c_int({int b, int c}) {} |
void void___c_int({int c}) {} |
- """); |
- functionSubtypingNamedHelper(env); |
+ """).then(functionSubtypingNamedHelper)); |
} |
testTypedefSubtypingNamed() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
typedef void void_(); |
typedef void void__int(int i); |
typedef void void___a_int({int a}); |
@@ -478,8 +474,7 @@ testTypedefSubtypingNamed() { |
typedef void void___a_int_c_int({int a, int c}); |
typedef void void___b_int_c_int({int b, int c}); |
typedef void void___c_int({int c}); |
- """); |
- functionSubtypingNamedHelper(env); |
+ """).then(functionSubtypingNamedHelper)); |
} |
functionSubtypingNamedHelper(TypeEnvironment env) { |
@@ -521,7 +516,7 @@ functionSubtypingNamedHelper(TypeEnvironment env) { |
} |
void testTypeVariableSubtype() { |
- var env = new TypeEnvironment(r""" |
+ asyncTest(() => TypeEnvironment.create(r""" |
class A<T> {} |
class B<T extends Object> {} |
class C<T extends num> {} |
@@ -532,207 +527,207 @@ void testTypeVariableSubtype() { |
class H<T extends S, S extends T> {} |
class I<T extends S, S extends U, U extends T> {} |
class J<T extends S, S extends U, U extends S> {} |
- """); |
- |
- void expect(bool value, DartType T, DartType S) { |
- Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
- } |
- |
- ClassElement A = env.getElement('A'); |
- TypeVariableType A_T = A.thisType.typeArguments.head; |
- ClassElement B = env.getElement('B'); |
- TypeVariableType B_T = B.thisType.typeArguments.head; |
- ClassElement C = env.getElement('C'); |
- TypeVariableType C_T = C.thisType.typeArguments.head; |
- ClassElement D = env.getElement('D'); |
- TypeVariableType D_T = D.thisType.typeArguments.head; |
- ClassElement E = env.getElement('E'); |
- TypeVariableType E_T = E.thisType.typeArguments.head; |
- TypeVariableType E_S = E.thisType.typeArguments.tail.head; |
- ClassElement F = env.getElement('F'); |
- TypeVariableType F_T = F.thisType.typeArguments.head; |
- TypeVariableType F_S = F.thisType.typeArguments.tail.head; |
- ClassElement G = env.getElement('G'); |
- TypeVariableType G_T = G.thisType.typeArguments.head; |
- ClassElement H = env.getElement('H'); |
- TypeVariableType H_T = H.thisType.typeArguments.head; |
- TypeVariableType H_S = H.thisType.typeArguments.tail.head; |
- ClassElement I = env.getElement('I'); |
- TypeVariableType I_T = I.thisType.typeArguments.head; |
- TypeVariableType I_S = I.thisType.typeArguments.tail.head; |
- TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head; |
- ClassElement J = env.getElement('J'); |
- TypeVariableType J_T = J.thisType.typeArguments.head; |
- TypeVariableType J_S = J.thisType.typeArguments.tail.head; |
- TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head; |
- |
- DartType Object_ = env['Object']; |
- DartType num_ = env['num']; |
- DartType int_ = env['int']; |
- DartType String_ = env['String']; |
- DartType dynamic_ = env['dynamic']; |
- |
- // class A<T> {} |
- expect(true, A_T, Object_); |
- expect(false, A_T, num_); |
- expect(false, A_T, int_); |
- expect(false, A_T, String_); |
- expect(true, A_T, dynamic_); |
- expect(true, A_T, A_T); |
- expect(false, A_T, B_T); |
- |
- // class B<T extends Object> {} |
- expect(true, B_T, Object_); |
- expect(false, B_T, num_); |
- expect(false, B_T, int_); |
- expect(false, B_T, String_); |
- expect(true, B_T, dynamic_); |
- expect(true, B_T, B_T); |
- expect(false, B_T, A_T); |
- |
- // class C<T extends num> {} |
- expect(true, C_T, Object_); |
- expect(true, C_T, num_); |
- expect(false, C_T, int_); |
- expect(false, C_T, String_); |
- expect(true, C_T, dynamic_); |
- expect(true, C_T, C_T); |
- expect(false, C_T, A_T); |
- |
- // class D<T extends int> {} |
- expect(true, D_T, Object_); |
- expect(true, D_T, num_); |
- expect(true, D_T, int_); |
- expect(false, D_T, String_); |
- expect(true, D_T, dynamic_); |
- expect(true, D_T, D_T); |
- expect(false, D_T, A_T); |
- |
- // class E<T extends S, S extends num> {} |
- expect(true, E_T, Object_); |
- expect(true, E_T, num_); |
- expect(false, E_T, int_); |
- expect(false, E_T, String_); |
- expect(true, E_T, dynamic_); |
- expect(true, E_T, E_T); |
- expect(true, E_T, E_S); |
- expect(false, E_T, A_T); |
- |
- expect(true, E_S, Object_); |
- expect(true, E_S, num_); |
- expect(false, E_S, int_); |
- expect(false, E_S, String_); |
- expect(true, E_S, dynamic_); |
- expect(false, E_S, E_T); |
- expect(true, E_S, E_S); |
- expect(false, E_S, A_T); |
- |
- // class F<T extends num, S extends T> {} |
- expect(true, F_T, Object_); |
- expect(true, F_T, num_); |
- expect(false, F_T, int_); |
- expect(false, F_T, String_); |
- expect(true, F_T, dynamic_); |
- expect(false, F_T, F_S); |
- expect(true, F_T, F_T); |
- expect(false, F_T, A_T); |
- |
- expect(true, F_S, Object_); |
- expect(true, F_S, num_); |
- expect(false, F_S, int_); |
- expect(false, F_S, String_); |
- expect(true, F_S, dynamic_); |
- expect(true, F_S, F_S); |
- expect(true, F_S, F_T); |
- expect(false, F_S, A_T); |
- |
- // class G<T extends T> {} |
- expect(true, G_T, Object_); |
- expect(false, G_T, num_); |
- expect(false, G_T, int_); |
- expect(false, G_T, String_); |
- expect(true, G_T, dynamic_); |
- expect(true, G_T, G_T); |
- expect(false, G_T, A_T); |
- |
- // class H<T extends S, S extends T> {} |
- expect(true, H_T, Object_); |
- expect(false, H_T, num_); |
- expect(false, H_T, int_); |
- expect(false, H_T, String_); |
- expect(true, H_T, dynamic_); |
- expect(true, H_T, H_T); |
- expect(true, H_T, H_S); |
- expect(false, H_T, A_T); |
- |
- expect(true, H_S, Object_); |
- expect(false, H_S, num_); |
- expect(false, H_S, int_); |
- expect(false, H_S, String_); |
- expect(true, H_S, dynamic_); |
- expect(true, H_S, H_T); |
- expect(true, H_S, H_S); |
- expect(false, H_S, A_T); |
- |
- // class I<T extends S, S extends U, U extends T> {} |
- expect(true, I_T, Object_); |
- expect(false, I_T, num_); |
- expect(false, I_T, int_); |
- expect(false, I_T, String_); |
- expect(true, I_T, dynamic_); |
- expect(true, I_T, I_T); |
- expect(true, I_T, I_S); |
- expect(true, I_T, I_U); |
- expect(false, I_T, A_T); |
- |
- expect(true, I_S, Object_); |
- expect(false, I_S, num_); |
- expect(false, I_S, int_); |
- expect(false, I_S, String_); |
- expect(true, I_S, dynamic_); |
- expect(true, I_S, I_T); |
- expect(true, I_S, I_S); |
- expect(true, I_S, I_U); |
- expect(false, I_S, A_T); |
- |
- expect(true, I_U, Object_); |
- expect(false, I_U, num_); |
- expect(false, I_U, int_); |
- expect(false, I_U, String_); |
- expect(true, I_U, dynamic_); |
- expect(true, I_U, I_T); |
- expect(true, I_U, I_S); |
- expect(true, I_U, I_U); |
- expect(false, I_U, A_T); |
- |
- // class J<T extends S, S extends U, U extends S> {} |
- expect(true, J_T, Object_); |
- expect(false, J_T, num_); |
- expect(false, J_T, int_); |
- expect(false, J_T, String_); |
- expect(true, J_T, dynamic_); |
- expect(true, J_T, J_T); |
- expect(true, J_T, J_S); |
- expect(true, J_T, J_U); |
- expect(false, J_T, A_T); |
- |
- expect(true, J_S, Object_); |
- expect(false, J_S, num_); |
- expect(false, J_S, int_); |
- expect(false, J_S, String_); |
- expect(true, J_S, dynamic_); |
- expect(false, J_S, J_T); |
- expect(true, J_S, J_S); |
- expect(true, J_S, J_U); |
- expect(false, J_S, A_T); |
- |
- expect(true, J_U, Object_); |
- expect(false, J_U, num_); |
- expect(false, J_U, int_); |
- expect(false, J_U, String_); |
- expect(true, J_U, dynamic_); |
- expect(false, J_U, J_T); |
- expect(true, J_U, J_S); |
- expect(true, J_U, J_U); |
- expect(false, J_U, A_T); |
+ """).then((env) { |
+ void expect(bool value, DartType T, DartType S) { |
+ Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
+ } |
+ |
+ ClassElement A = env.getElement('A'); |
+ TypeVariableType A_T = A.thisType.typeArguments.head; |
+ ClassElement B = env.getElement('B'); |
+ TypeVariableType B_T = B.thisType.typeArguments.head; |
+ ClassElement C = env.getElement('C'); |
+ TypeVariableType C_T = C.thisType.typeArguments.head; |
+ ClassElement D = env.getElement('D'); |
+ TypeVariableType D_T = D.thisType.typeArguments.head; |
+ ClassElement E = env.getElement('E'); |
+ TypeVariableType E_T = E.thisType.typeArguments.head; |
+ TypeVariableType E_S = E.thisType.typeArguments.tail.head; |
+ ClassElement F = env.getElement('F'); |
+ TypeVariableType F_T = F.thisType.typeArguments.head; |
+ TypeVariableType F_S = F.thisType.typeArguments.tail.head; |
+ ClassElement G = env.getElement('G'); |
+ TypeVariableType G_T = G.thisType.typeArguments.head; |
+ ClassElement H = env.getElement('H'); |
+ TypeVariableType H_T = H.thisType.typeArguments.head; |
+ TypeVariableType H_S = H.thisType.typeArguments.tail.head; |
+ ClassElement I = env.getElement('I'); |
+ TypeVariableType I_T = I.thisType.typeArguments.head; |
+ TypeVariableType I_S = I.thisType.typeArguments.tail.head; |
+ TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head; |
+ ClassElement J = env.getElement('J'); |
+ TypeVariableType J_T = J.thisType.typeArguments.head; |
+ TypeVariableType J_S = J.thisType.typeArguments.tail.head; |
+ TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head; |
+ |
+ DartType Object_ = env['Object']; |
+ DartType num_ = env['num']; |
+ DartType int_ = env['int']; |
+ DartType String_ = env['String']; |
+ DartType dynamic_ = env['dynamic']; |
+ |
+ // class A<T> {} |
+ expect(true, A_T, Object_); |
+ expect(false, A_T, num_); |
+ expect(false, A_T, int_); |
+ expect(false, A_T, String_); |
+ expect(true, A_T, dynamic_); |
+ expect(true, A_T, A_T); |
+ expect(false, A_T, B_T); |
+ |
+ // class B<T extends Object> {} |
+ expect(true, B_T, Object_); |
+ expect(false, B_T, num_); |
+ expect(false, B_T, int_); |
+ expect(false, B_T, String_); |
+ expect(true, B_T, dynamic_); |
+ expect(true, B_T, B_T); |
+ expect(false, B_T, A_T); |
+ |
+ // class C<T extends num> {} |
+ expect(true, C_T, Object_); |
+ expect(true, C_T, num_); |
+ expect(false, C_T, int_); |
+ expect(false, C_T, String_); |
+ expect(true, C_T, dynamic_); |
+ expect(true, C_T, C_T); |
+ expect(false, C_T, A_T); |
+ |
+ // class D<T extends int> {} |
+ expect(true, D_T, Object_); |
+ expect(true, D_T, num_); |
+ expect(true, D_T, int_); |
+ expect(false, D_T, String_); |
+ expect(true, D_T, dynamic_); |
+ expect(true, D_T, D_T); |
+ expect(false, D_T, A_T); |
+ |
+ // class E<T extends S, S extends num> {} |
+ expect(true, E_T, Object_); |
+ expect(true, E_T, num_); |
+ expect(false, E_T, int_); |
+ expect(false, E_T, String_); |
+ expect(true, E_T, dynamic_); |
+ expect(true, E_T, E_T); |
+ expect(true, E_T, E_S); |
+ expect(false, E_T, A_T); |
+ |
+ expect(true, E_S, Object_); |
+ expect(true, E_S, num_); |
+ expect(false, E_S, int_); |
+ expect(false, E_S, String_); |
+ expect(true, E_S, dynamic_); |
+ expect(false, E_S, E_T); |
+ expect(true, E_S, E_S); |
+ expect(false, E_S, A_T); |
+ |
+ // class F<T extends num, S extends T> {} |
+ expect(true, F_T, Object_); |
+ expect(true, F_T, num_); |
+ expect(false, F_T, int_); |
+ expect(false, F_T, String_); |
+ expect(true, F_T, dynamic_); |
+ expect(false, F_T, F_S); |
+ expect(true, F_T, F_T); |
+ expect(false, F_T, A_T); |
+ |
+ expect(true, F_S, Object_); |
+ expect(true, F_S, num_); |
+ expect(false, F_S, int_); |
+ expect(false, F_S, String_); |
+ expect(true, F_S, dynamic_); |
+ expect(true, F_S, F_S); |
+ expect(true, F_S, F_T); |
+ expect(false, F_S, A_T); |
+ |
+ // class G<T extends T> {} |
+ expect(true, G_T, Object_); |
+ expect(false, G_T, num_); |
+ expect(false, G_T, int_); |
+ expect(false, G_T, String_); |
+ expect(true, G_T, dynamic_); |
+ expect(true, G_T, G_T); |
+ expect(false, G_T, A_T); |
+ |
+ // class H<T extends S, S extends T> {} |
+ expect(true, H_T, Object_); |
+ expect(false, H_T, num_); |
+ expect(false, H_T, int_); |
+ expect(false, H_T, String_); |
+ expect(true, H_T, dynamic_); |
+ expect(true, H_T, H_T); |
+ expect(true, H_T, H_S); |
+ expect(false, H_T, A_T); |
+ |
+ expect(true, H_S, Object_); |
+ expect(false, H_S, num_); |
+ expect(false, H_S, int_); |
+ expect(false, H_S, String_); |
+ expect(true, H_S, dynamic_); |
+ expect(true, H_S, H_T); |
+ expect(true, H_S, H_S); |
+ expect(false, H_S, A_T); |
+ |
+ // class I<T extends S, S extends U, U extends T> {} |
+ expect(true, I_T, Object_); |
+ expect(false, I_T, num_); |
+ expect(false, I_T, int_); |
+ expect(false, I_T, String_); |
+ expect(true, I_T, dynamic_); |
+ expect(true, I_T, I_T); |
+ expect(true, I_T, I_S); |
+ expect(true, I_T, I_U); |
+ expect(false, I_T, A_T); |
+ |
+ expect(true, I_S, Object_); |
+ expect(false, I_S, num_); |
+ expect(false, I_S, int_); |
+ expect(false, I_S, String_); |
+ expect(true, I_S, dynamic_); |
+ expect(true, I_S, I_T); |
+ expect(true, I_S, I_S); |
+ expect(true, I_S, I_U); |
+ expect(false, I_S, A_T); |
+ |
+ expect(true, I_U, Object_); |
+ expect(false, I_U, num_); |
+ expect(false, I_U, int_); |
+ expect(false, I_U, String_); |
+ expect(true, I_U, dynamic_); |
+ expect(true, I_U, I_T); |
+ expect(true, I_U, I_S); |
+ expect(true, I_U, I_U); |
+ expect(false, I_U, A_T); |
+ |
+ // class J<T extends S, S extends U, U extends S> {} |
+ expect(true, J_T, Object_); |
+ expect(false, J_T, num_); |
+ expect(false, J_T, int_); |
+ expect(false, J_T, String_); |
+ expect(true, J_T, dynamic_); |
+ expect(true, J_T, J_T); |
+ expect(true, J_T, J_S); |
+ expect(true, J_T, J_U); |
+ expect(false, J_T, A_T); |
+ |
+ expect(true, J_S, Object_); |
+ expect(false, J_S, num_); |
+ expect(false, J_S, int_); |
+ expect(false, J_S, String_); |
+ expect(true, J_S, dynamic_); |
+ expect(false, J_S, J_T); |
+ expect(true, J_S, J_S); |
+ expect(true, J_S, J_U); |
+ expect(false, J_S, A_T); |
+ |
+ expect(true, J_U, Object_); |
+ expect(false, J_U, num_); |
+ expect(false, J_U, int_); |
+ expect(false, J_U, String_); |
+ expect(true, J_U, dynamic_); |
+ expect(false, J_U, J_T); |
+ expect(true, J_U, J_S); |
+ expect(true, J_U, J_U); |
+ expect(false, J_U, A_T); |
+ })); |
} |