Chromium Code Reviews| Index: tests/compiler/dart2js/least_upper_bound_test.dart |
| diff --git a/tests/compiler/dart2js/least_upper_bound_test.dart b/tests/compiler/dart2js/least_upper_bound_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e3f63df8d8412d661e1c7ad2dc73338c113d0393 |
| --- /dev/null |
| +++ b/tests/compiler/dart2js/least_upper_bound_test.dart |
| @@ -0,0 +1,853 @@ |
| +// Copyright (c) 2013, 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. |
| + |
| +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" |
| + show Element, ClassElement; |
| +import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart' |
| + show Link; |
| + |
| +void main() { |
| + testInterface1(); |
| + testInterface2(); |
| + testGeneric(); |
| + testMixin(); |
| + testFunction(); |
| + testTypeVariable(); |
| +} |
| + |
| +void testInterface1() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} // A and B have equal depth. |
| + class B {} |
| + class I implements A, B {} |
| + class J implements A, B {} |
| + """).then((var env) { |
| + |
| + DartType Object_ = env['Object']; |
| + DartType A = env['A']; |
| + DartType B = env['B']; |
| + DartType I = env['I']; |
| + DartType J = env['J']; |
| + |
| + checkLub(DartType a, DartType b, DartType expect) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + Expect.equals(expect, lub, |
| + 'Unexpected lub($a,$b) = $lub, expected $expect.'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, A, Object_); |
| + checkLub(Object_, B, Object_); |
| + checkLub(Object_, I, Object_); |
| + checkLub(Object_, J, Object_); |
| + |
| + checkLub(A, Object_, Object_); |
| + checkLub(A, A, A); |
| + checkLub(A, B, Object_); |
| + checkLub(A, I, A); |
| + checkLub(A, J, A); |
| + |
| + checkLub(B, Object_, Object_); |
| + checkLub(B, A, Object_); |
| + checkLub(B, B, B); |
| + checkLub(B, I, B); |
| + checkLub(B, J, B); |
| + |
| + checkLub(I, Object_, Object_); |
| + checkLub(I, A, A); |
| + checkLub(I, B, B); |
| + checkLub(I, I, I); |
| + checkLub(I, J, Object_); |
| + |
| + checkLub(J, Object_, Object_); |
| + checkLub(J, A, A); |
| + checkLub(J, B, B); |
| + checkLub(J, I, Object_); |
| + checkLub(J, J, J); |
| + })); |
| +} |
| + |
| +void testInterface2() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} |
| + class B {} |
| + class C extends B {} // This makes C have higher depth than A. |
| + class I implements A, C {} |
| + class J implements A, C {} |
| + """).then((var env) { |
| + |
| + DartType Object_ = env['Object']; |
| + DartType A = env['A']; |
| + DartType B = env['B']; |
| + DartType C = env['C']; |
| + DartType I = env['I']; |
| + DartType J = env['J']; |
| + |
| + checkLub(DartType a, DartType b, DartType expectedLub) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + Expect.equals(expectedLub, lub, |
| + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, A, Object_); |
| + checkLub(Object_, B, Object_); |
| + checkLub(Object_, C, Object_); |
| + checkLub(Object_, I, Object_); |
| + checkLub(Object_, J, Object_); |
| + |
| + checkLub(A, Object_, Object_); |
| + checkLub(A, A, A); |
| + checkLub(A, B, Object_); |
| + checkLub(A, C, Object_); |
| + checkLub(A, I, A); |
| + checkLub(A, J, A); |
| + |
| + checkLub(B, Object_, Object_); |
| + checkLub(B, A, Object_); |
| + checkLub(B, B, B); |
| + checkLub(B, C, B); |
| + checkLub(B, I, B); |
| + checkLub(B, J, B); |
| + |
| + checkLub(C, Object_, Object_); |
| + checkLub(C, A, Object_); |
| + checkLub(C, B, B); |
| + checkLub(C, C, C); |
| + checkLub(C, I, C); |
| + checkLub(C, J, C); |
| + |
| + checkLub(I, Object_, Object_); |
| + checkLub(I, A, A); |
| + checkLub(I, B, B); |
| + checkLub(I, C, C); |
| + checkLub(I, I, I); |
| + checkLub(I, J, C); |
| + |
| + checkLub(J, Object_, Object_); |
| + checkLub(J, A, A); |
| + checkLub(J, B, B); |
| + checkLub(J, C, C); |
| + checkLub(J, I, C); |
| + checkLub(J, J, J); |
| + })); |
| +} |
| + |
| +void testGeneric() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} |
| + class B {} |
| + class C extends B {} |
| + class I<T> {} |
| + """).then((var env) { |
|
karlklose
2013/11/21 13:29:10
Remove 'var' (also in the other tests).
Johnni Winther
2013/11/25 13:58:27
Done.
|
| + |
| + DartType Object_ = env['Object']; |
| + DartType A = env['A']; |
| + DartType B = env['B']; |
| + DartType C = env['C']; |
| + ClassElement I = env.getElement('I'); |
| + DartType I_A = instantiate(I, [A]); |
| + DartType I_B = instantiate(I, [B]); |
| + DartType I_C = instantiate(I, [C]); |
| + |
| + checkLub(DartType a, DartType b, DartType expectedLub) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + Expect.equals(expectedLub, lub, |
| + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, A, Object_); |
| + checkLub(Object_, B, Object_); |
| + checkLub(Object_, C, Object_); |
| + checkLub(Object_, I_A, Object_); |
| + checkLub(Object_, I_B, Object_); |
| + checkLub(Object_, I_C, Object_); |
| + |
| + checkLub(A, Object_, Object_); |
| + checkLub(A, A, A); |
| + checkLub(A, B, Object_); |
| + checkLub(A, C, Object_); |
| + checkLub(A, I_A, Object_); |
| + checkLub(A, I_B, Object_); |
| + checkLub(A, I_C, Object_); |
| + |
| + checkLub(B, Object_, Object_); |
| + checkLub(B, A, Object_); |
| + checkLub(B, B, B); |
| + checkLub(B, C, B); |
| + checkLub(B, I_A, Object_); |
| + checkLub(B, I_B, Object_); |
| + checkLub(B, I_C, Object_); |
| + |
| + checkLub(C, Object_, Object_); |
| + checkLub(C, A, Object_); |
| + checkLub(C, B, B); |
| + checkLub(C, C, C); |
| + checkLub(C, I_A, Object_); |
| + checkLub(C, I_B, Object_); |
| + checkLub(C, I_C, Object_); |
| + |
| + checkLub(I_A, Object_, Object_); |
| + checkLub(I_A, A, Object_); |
| + checkLub(I_A, B, Object_); |
| + checkLub(I_A, C, Object_); |
| + checkLub(I_A, I_A, I_A); |
| + checkLub(I_A, I_B, Object_); |
| + checkLub(I_A, I_C, Object_); |
| + |
| + checkLub(I_B, Object_, Object_); |
| + checkLub(I_B, A, Object_); |
| + checkLub(I_B, B, Object_); |
| + checkLub(I_B, C, Object_); |
| + checkLub(I_B, I_A, Object_); |
| + checkLub(I_B, I_B, I_B); |
| + checkLub(I_B, I_C, Object_); |
| + |
| + checkLub(I_C, Object_, Object_); |
| + checkLub(I_C, A, Object_); |
| + checkLub(I_C, B, Object_); |
| + checkLub(I_C, C, Object_); |
| + checkLub(I_C, I_A, Object_); |
| + checkLub(I_C, I_B, Object_); |
| + checkLub(I_C, I_C, I_C); |
| + })); |
| +} |
| + |
| +void testMixin() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} |
| + class B {} |
| + class C extends B {} |
| + class D extends C {} // This makes D have higher depth than Object+A. |
| + class I extends Object with A, B implements A, D {} |
| + class I2 extends Object with A, B implements A, D {} |
| + class J extends Object with B, A implements A, D {} |
| + """).then((var env) { |
| + |
| + DartType Object_ = env['Object']; |
| + DartType A = env['A']; |
| + DartType B = env['B']; |
| + DartType C = env['C']; |
| + DartType D = env['D']; |
| + DartType I = env['I']; |
| + DartType I2 = env['I2']; |
| + DartType J = env['J']; |
| + |
| + checkLub(DartType a, DartType b, DartType expectedLub) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + Expect.equals(expectedLub, lub, |
| + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, A, Object_); |
| + checkLub(Object_, B, Object_); |
| + checkLub(Object_, C, Object_); |
| + checkLub(Object_, D, Object_); |
| + checkLub(Object_, I, Object_); |
| + checkLub(Object_, I2, Object_); |
| + checkLub(Object_, J, Object_); |
| + |
| + checkLub(A, Object_, Object_); |
| + checkLub(A, A, A); |
| + checkLub(A, B, Object_); |
| + checkLub(A, C, Object_); |
| + checkLub(A, D, Object_); |
| + checkLub(A, I, A); |
| + checkLub(A, I2, A); |
| + checkLub(A, J, A); |
| + |
| + checkLub(B, Object_, Object_); |
| + checkLub(B, A, Object_); |
| + checkLub(B, B, B); |
| + checkLub(B, C, B); |
| + checkLub(B, D, B); |
| + checkLub(B, I, B); |
| + checkLub(B, I2, B); |
| + checkLub(B, J, B); |
| + |
| + checkLub(C, Object_, Object_); |
| + checkLub(C, A, Object_); |
| + checkLub(C, B, B); |
| + checkLub(C, C, C); |
| + checkLub(C, D, C); |
| + checkLub(C, I, C); |
| + checkLub(C, I2, C); |
| + checkLub(C, J, C); |
| + |
| + checkLub(D, Object_, Object_); |
| + checkLub(D, A, Object_); |
| + checkLub(D, B, B); |
| + checkLub(D, C, C); |
| + checkLub(D, D, D); |
| + checkLub(D, I, D); |
| + checkLub(D, I2, D); |
| + checkLub(D, J, D); |
| + |
| + checkLub(I, Object_, Object_); |
| + checkLub(I, A, A); |
| + checkLub(I, B, B); |
| + checkLub(I, C, C); |
| + checkLub(I, D, D); |
| + checkLub(I, I, I); |
| + checkLub(I, I2, D); |
| + checkLub(I, J, D); |
| + |
| + checkLub(I2, Object_, Object_); |
| + checkLub(I2, A, A); |
| + checkLub(I2, B, B); |
| + checkLub(I2, C, C); |
| + checkLub(I2, D, D); |
| + checkLub(I2, I, D); |
| + checkLub(I2, I2, I2); |
| + checkLub(I2, J, D); |
| + |
| + checkLub(J, Object_, Object_); |
| + checkLub(J, A, A); |
| + checkLub(J, B, B); |
| + checkLub(J, C, C); |
| + checkLub(J, D, D); |
| + checkLub(J, I, D); |
| + checkLub(J, I2, D); |
| + checkLub(J, J, J); |
| + })); |
| +} |
| + |
| +void testFunction() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} |
| + class B {} |
| + class C extends B {} |
| + |
| + typedef dynamic__(); |
| + typedef void void__(); |
| + typedef A A__(); |
| + typedef B B__(); |
| + typedef C C__(); |
| + |
| + typedef void void__A_B(A a, B b); |
| + typedef void void__A_C(A a, C b); |
| + typedef void void__B_A(B a, A b); |
| + typedef void void__B_C(B a, C b); |
| + |
| + typedef void void___B([B a]); |
| + typedef void void___B_C([B a, C b]); |
| + typedef void void___C_C([C a, C b]); |
| + |
| + typedef void void____B({B a}); |
| + typedef void void____B_C({B a, C b}); |
| + typedef void void____C_C({C a, C b}); |
| + """).then((var env) { |
| + |
| + DartType Object_ = env['Object']; |
| + DartType Function_ = env['Function']; |
| + DartType dynamic__ = env['dynamic__']; |
| + DartType void__ = env['void__']; |
| + DartType A__ = env['A__']; |
| + DartType B__ = env['B__']; |
| + DartType C__ = env['C__']; |
| + DartType void__A_B = env['void__A_B']; |
| + DartType void__A_C = env['void__A_C']; |
| + DartType void__B_A = env['void__B_A']; |
| + DartType void__B_C = env['void__B_C']; |
| + DartType void___B = env['void___B']; |
| + DartType void___B_C = env['void___B_C']; |
| + DartType void___C_C = env['void___C_C']; |
| + DartType void____B = env['void____B']; |
| + DartType void____B_C = env['void____B_C']; |
| + DartType void____C_C = env['void____C_C']; |
| + |
| + // Types used only for checking results. |
| + DartType void_ = env['void']; |
| + DartType B = env['B']; |
| + DartType C = env['C']; |
| + FunctionType Object__ = env.functionType(Object_, []); |
| + FunctionType void__Object_Object = |
| + env.functionType(void_, [Object_, Object_]); |
| + FunctionType void__Object_B = |
| + env.functionType(void_, [Object_, B]); |
| + FunctionType void__Object_C = |
| + env.functionType(void_, [Object_, C]); |
| + FunctionType void__B_Object = |
| + env.functionType(void_, [B, Object_]); |
| + |
| + checkLub(DartType a, DartType b, DartType expectedLub) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + if (a != b) { |
| + expectedLub = expectedLub.unalias(env.compiler); |
| + lub = lub.unalias(env.compiler); |
| + } |
| + Expect.equals(expectedLub, lub, |
| + 'Unexpected lub(${a.unalias(env.compiler)},' |
| + '${b.unalias(env.compiler)}) = ' |
| + '${lub}, expected ${expectedLub}'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, Function_, Object_); |
| + checkLub(Object_, dynamic__, Object_); |
| + checkLub(Object_, void__, Object_); |
| + checkLub(Object_, A__, Object_); |
| + checkLub(Object_, B__, Object_); |
| + checkLub(Object_, C__, Object_); |
| + checkLub(Object_, void__A_B, Object_); |
| + checkLub(Object_, void__A_C, Object_); |
| + checkLub(Object_, void__B_A, Object_); |
| + checkLub(Object_, void__B_C, Object_); |
| + checkLub(Object_, void___B, Object_); |
| + checkLub(Object_, void___B_C, Object_); |
| + checkLub(Object_, void___C_C, Object_); |
| + checkLub(Object_, void____B, Object_); |
| + checkLub(Object_, void____B_C, Object_); |
| + checkLub(Object_, void____C_C, Object_); |
| + |
| + checkLub(Function_, Object_, Object_); |
| + checkLub(Function_, Function_, Function_); |
| + checkLub(Function_, dynamic__, Function_); |
| + checkLub(Function_, void__, Function_); |
| + checkLub(Function_, A__, Function_); |
| + checkLub(Function_, B__, Function_); |
| + checkLub(Function_, C__, Function_); |
| + checkLub(Function_, void__A_B, Function_); |
| + checkLub(Function_, void__A_C, Function_); |
| + checkLub(Function_, void__B_A, Function_); |
| + checkLub(Function_, void__B_C, Function_); |
| + checkLub(Function_, void___B, Function_); |
| + checkLub(Function_, void___B_C, Function_); |
| + checkLub(Function_, void___C_C, Function_); |
| + checkLub(Function_, void____B, Function_); |
| + checkLub(Function_, void____B_C, Function_); |
| + checkLub(Function_, void____C_C, Function_); |
| + |
| + checkLub(dynamic__, Object_, Object_); |
| + checkLub(dynamic__, Function_, Function_); |
| + checkLub(dynamic__, dynamic__, dynamic__); |
| + checkLub(dynamic__, void__, dynamic__); |
| + checkLub(dynamic__, A__, dynamic__); |
| + checkLub(dynamic__, B__, dynamic__); |
| + checkLub(dynamic__, C__, dynamic__); |
| + checkLub(dynamic__, void__A_B, Function_); |
| + checkLub(dynamic__, void__A_C, Function_); |
| + checkLub(dynamic__, void__B_A, Function_); |
| + checkLub(dynamic__, void__B_C, Function_); |
| + checkLub(dynamic__, void___B, dynamic__); |
| + checkLub(dynamic__, void___B_C, dynamic__); |
| + checkLub(dynamic__, void___C_C, dynamic__); |
| + checkLub(dynamic__, void____B, dynamic__); |
| + checkLub(dynamic__, void____B_C, dynamic__); |
| + checkLub(dynamic__, void____C_C, dynamic__); |
| + |
| + checkLub(void__, Object_, Object_); |
| + checkLub(void__, Function_, Function_); |
| + checkLub(void__, dynamic__, dynamic__); |
| + checkLub(void__, void__, void__); |
| + checkLub(void__, A__, void__); |
| + checkLub(void__, B__, void__); |
| + checkLub(void__, C__, void__); |
| + checkLub(void__, void__A_B, Function_); |
| + checkLub(void__, void__A_C, Function_); |
| + checkLub(void__, void__B_A, Function_); |
| + checkLub(void__, void__B_C, Function_); |
| + checkLub(void__, void___B, void__); |
| + checkLub(void__, void___B_C, void__); |
| + checkLub(void__, void___C_C, void__); |
| + checkLub(void__, void____B, void__); |
| + checkLub(void__, void____B_C, void__); |
| + checkLub(void__, void____C_C, void__); |
| + |
| + checkLub(A__, Object_, Object_); |
| + checkLub(A__, Function_, Function_); |
| + checkLub(A__, dynamic__, dynamic__); |
| + checkLub(A__, void__, void__); |
| + checkLub(A__, A__, A__); |
| + checkLub(A__, B__, Object__); |
| + checkLub(A__, C__, Object__); |
| + checkLub(A__, void__A_B, Function_); |
| + checkLub(A__, void__A_C, Function_); |
| + checkLub(A__, void__B_A, Function_); |
| + checkLub(A__, void__B_C, Function_); |
| + checkLub(A__, void___B, void__); |
| + checkLub(A__, void___B_C, void__); |
| + checkLub(A__, void___C_C, void__); |
| + checkLub(A__, void____B, void__); |
| + checkLub(A__, void____B_C, void__); |
| + checkLub(A__, void____C_C, void__); |
| + |
| + checkLub(B__, Object_, Object_); |
| + checkLub(B__, Function_, Function_); |
| + checkLub(B__, dynamic__, dynamic__); |
| + checkLub(B__, void__, void__); |
| + checkLub(B__, A__, Object__); |
| + checkLub(B__, B__, B__); |
| + checkLub(B__, C__, B__); |
| + checkLub(B__, void__A_B, Function_); |
| + checkLub(B__, void__A_C, Function_); |
| + checkLub(B__, void__B_A, Function_); |
| + checkLub(B__, void__B_C, Function_); |
| + checkLub(B__, void___B, void__); |
| + checkLub(B__, void___B_C, void__); |
| + checkLub(B__, void___C_C, void__); |
| + checkLub(B__, void____B, void__); |
| + checkLub(B__, void____B_C, void__); |
| + checkLub(B__, void____C_C, void__); |
| + |
| + checkLub(C__, Object_, Object_); |
| + checkLub(C__, Function_, Function_); |
| + checkLub(C__, dynamic__, dynamic__); |
| + checkLub(C__, void__, void__); |
| + checkLub(C__, A__, Object__); |
| + checkLub(C__, B__, B__); |
| + checkLub(C__, C__, C__); |
| + checkLub(C__, void__A_B, Function_); |
| + checkLub(C__, void__A_C, Function_); |
| + checkLub(C__, void__B_A, Function_); |
| + checkLub(C__, void__B_C, Function_); |
| + checkLub(C__, void___B, void__); |
| + checkLub(C__, void___B_C, void__); |
| + checkLub(C__, void___C_C, void__); |
| + checkLub(C__, void____B, void__); |
| + checkLub(C__, void____B_C, void__); |
| + checkLub(C__, void____C_C, void__); |
| + |
| + checkLub(void__A_B, Object_, Object_); |
| + checkLub(void__A_B, Function_, Function_); |
| + checkLub(void__A_B, dynamic__, Function_); |
| + checkLub(void__A_B, void__, Function_); |
| + checkLub(void__A_B, A__, Function_); |
| + checkLub(void__A_B, B__, Function_); |
| + checkLub(void__A_B, C__, Function_); |
| + checkLub(void__A_B, void__A_B, void__A_B); |
| + checkLub(void__A_B, void__A_C, void__A_B); |
| + checkLub(void__A_B, void__B_A, void__Object_Object); |
| + checkLub(void__A_B, void__B_C, void__Object_B); |
| + checkLub(void__A_B, void___B, Function_); |
| + checkLub(void__A_B, void___B_C, Function_); |
| + checkLub(void__A_B, void___C_C, Function_); |
| + checkLub(void__A_B, void____B, Function_); |
| + checkLub(void__A_B, void____B_C, Function_); |
| + checkLub(void__A_B, void____C_C, Function_); |
| + |
| + checkLub(void__A_C, Object_, Object_); |
| + checkLub(void__A_C, Function_, Function_); |
| + checkLub(void__A_C, dynamic__, Function_); |
| + checkLub(void__A_C, void__, Function_); |
| + checkLub(void__A_C, A__, Function_); |
| + checkLub(void__A_C, B__, Function_); |
| + checkLub(void__A_C, C__, Function_); |
| + checkLub(void__A_C, void__A_B, void__A_B); |
| + checkLub(void__A_C, void__A_C, void__A_C); |
| + checkLub(void__A_C, void__B_A, void__Object_Object); |
| + checkLub(void__A_C, void__B_C, void__Object_C); |
| + checkLub(void__A_C, void___B, Function_); |
| + checkLub(void__A_C, void___B_C, Function_); |
| + checkLub(void__A_C, void___C_C, Function_); |
| + checkLub(void__A_C, void____B, Function_); |
| + checkLub(void__A_C, void____B_C, Function_); |
| + checkLub(void__A_C, void____C_C, Function_); |
| + |
| + checkLub(void__B_A, Object_, Object_); |
| + checkLub(void__B_A, Function_, Function_); |
| + checkLub(void__B_A, dynamic__, Function_); |
| + checkLub(void__B_A, void__, Function_); |
| + checkLub(void__B_A, A__, Function_); |
| + checkLub(void__B_A, B__, Function_); |
| + checkLub(void__B_A, C__, Function_); |
| + checkLub(void__B_A, void__A_B, void__Object_Object); |
| + checkLub(void__B_A, void__A_C, void__Object_Object); |
| + checkLub(void__B_A, void__B_A, void__B_A); |
| + checkLub(void__B_A, void__B_C, void__B_Object); |
| + checkLub(void__B_A, void___B, Function_); |
| + checkLub(void__B_A, void___B_C, Function_); |
| + checkLub(void__B_A, void___C_C, Function_); |
| + checkLub(void__B_A, void____B, Function_); |
| + checkLub(void__B_A, void____B_C, Function_); |
| + checkLub(void__B_A, void____C_C, Function_); |
| + |
| + checkLub(void__B_C, Object_, Object_); |
| + checkLub(void__B_C, Function_, Function_); |
| + checkLub(void__B_C, dynamic__, Function_); |
| + checkLub(void__B_C, void__, Function_); |
| + checkLub(void__B_C, A__, Function_); |
| + checkLub(void__B_C, B__, Function_); |
| + checkLub(void__B_C, C__, Function_); |
| + checkLub(void__B_C, void__A_B, void__Object_B); |
| + checkLub(void__B_C, void__A_C, void__Object_C); |
| + checkLub(void__B_C, void__B_A, void__B_Object); |
| + checkLub(void__B_C, void__B_C, void__B_C); |
| + checkLub(void__B_C, void___B, Function_); |
| + checkLub(void__B_C, void___B_C, Function_); |
| + checkLub(void__B_C, void___C_C, Function_); |
| + checkLub(void__B_C, void____B, Function_); |
| + checkLub(void__B_C, void____B_C, Function_); |
| + checkLub(void__B_C, void____C_C, Function_); |
| + |
| + checkLub(void___B, Object_, Object_); |
| + checkLub(void___B, Function_, Function_); |
| + checkLub(void___B, dynamic__, dynamic__); |
| + checkLub(void___B, void__, void__); |
| + checkLub(void___B, A__, void__); |
| + checkLub(void___B, B__, void__); |
| + checkLub(void___B, C__, void__); |
| + checkLub(void___B, void__A_B, Function_); |
| + checkLub(void___B, void__A_C, Function_); |
| + checkLub(void___B, void__B_A, Function_); |
| + checkLub(void___B, void__B_C, Function_); |
| + checkLub(void___B, void___B, void___B); |
| + checkLub(void___B, void___B_C, void___B); |
| + checkLub(void___B, void___C_C, void___B); |
| + checkLub(void___B, void____B, void__); |
| + checkLub(void___B, void____B_C, void__); |
| + checkLub(void___B, void____C_C, void__); |
| + |
| + checkLub(void___B_C, Object_, Object_); |
| + checkLub(void___B_C, Function_, Function_); |
| + checkLub(void___B_C, dynamic__, dynamic__); |
| + checkLub(void___B_C, void__, void__); |
| + checkLub(void___B_C, A__, void__); |
| + checkLub(void___B_C, B__, void__); |
| + checkLub(void___B_C, C__, void__); |
| + checkLub(void___B_C, void__A_B, Function_); |
| + checkLub(void___B_C, void__A_C, Function_); |
| + checkLub(void___B_C, void__B_A, Function_); |
| + checkLub(void___B_C, void__B_C, Function_); |
| + checkLub(void___B_C, void___B, void___B); |
| + checkLub(void___B_C, void___B_C, void___B_C); |
| + checkLub(void___B_C, void___C_C, void___B_C); |
| + checkLub(void___B_C, void____B, void__); |
| + checkLub(void___B_C, void____B_C, void__); |
| + checkLub(void___B_C, void____C_C, void__); |
| + |
| + checkLub(void___C_C, Object_, Object_); |
| + checkLub(void___C_C, Function_, Function_); |
| + checkLub(void___C_C, dynamic__, dynamic__); |
| + checkLub(void___C_C, void__, void__); |
| + checkLub(void___C_C, A__, void__); |
| + checkLub(void___C_C, B__, void__); |
| + checkLub(void___C_C, C__, void__); |
| + checkLub(void___C_C, void__A_B, Function_); |
| + checkLub(void___C_C, void__A_C, Function_); |
| + checkLub(void___C_C, void__B_A, Function_); |
| + checkLub(void___C_C, void__B_C, Function_); |
| + checkLub(void___C_C, void___B, void___B); |
| + checkLub(void___C_C, void___B_C, void___B_C); |
| + checkLub(void___C_C, void___C_C, void___C_C); |
| + checkLub(void___C_C, void____B, void__); |
| + checkLub(void___C_C, void____B_C, void__); |
| + checkLub(void___C_C, void____C_C, void__); |
| + |
| + checkLub(void____B, Object_, Object_); |
| + checkLub(void____B, Function_, Function_); |
| + checkLub(void____B, dynamic__, dynamic__); |
| + checkLub(void____B, void__, void__); |
| + checkLub(void____B, A__, void__); |
| + checkLub(void____B, B__, void__); |
| + checkLub(void____B, C__, void__); |
| + checkLub(void____B, void__A_B, Function_); |
| + checkLub(void____B, void__A_C, Function_); |
| + checkLub(void____B, void__B_A, Function_); |
| + checkLub(void____B, void__B_C, Function_); |
| + checkLub(void____B, void___B, void__); |
| + checkLub(void____B, void___B_C, void__); |
| + checkLub(void____B, void___C_C, void__); |
| + checkLub(void____B, void____B, void____B); |
| + checkLub(void____B, void____B_C, void____B); |
| + checkLub(void____B, void____C_C, void____B); |
| + |
| + checkLub(void____B_C, Object_, Object_); |
| + checkLub(void____B_C, Function_, Function_); |
| + checkLub(void____B_C, dynamic__, dynamic__); |
| + checkLub(void____B_C, void__, void__); |
| + checkLub(void____B_C, A__, void__); |
| + checkLub(void____B_C, B__, void__); |
| + checkLub(void____B_C, C__, void__); |
| + checkLub(void____B_C, void__A_B, Function_); |
| + checkLub(void____B_C, void__A_C, Function_); |
| + checkLub(void____B_C, void__B_A, Function_); |
| + checkLub(void____B_C, void__B_C, Function_); |
| + checkLub(void____B_C, void___B, void__); |
| + checkLub(void____B_C, void___B_C, void__); |
| + checkLub(void____B_C, void___C_C, void__); |
| + checkLub(void____B_C, void____B, void____B); |
| + checkLub(void____B_C, void____B_C, void____B_C); |
| + checkLub(void____B_C, void____C_C, void____B_C); |
| + |
| + checkLub(void____C_C, Object_, Object_); |
| + checkLub(void____C_C, Function_, Function_); |
| + checkLub(void____C_C, dynamic__, dynamic__); |
| + checkLub(void____C_C, void__, void__); |
| + checkLub(void____C_C, A__, void__); |
| + checkLub(void____C_C, B__, void__); |
| + checkLub(void____C_C, C__, void__); |
| + checkLub(void____C_C, void__A_B, Function_); |
| + checkLub(void____C_C, void__A_C, Function_); |
| + checkLub(void____C_C, void__B_A, Function_); |
| + checkLub(void____C_C, void__B_C, Function_); |
| + checkLub(void____C_C, void___B, void__); |
| + checkLub(void____C_C, void___B_C, void__); |
| + checkLub(void____C_C, void___C_C, void__); |
| + checkLub(void____C_C, void____B, void____B); |
| + checkLub(void____C_C, void____B_C, void____B_C); |
| + checkLub(void____C_C, void____C_C, void____C_C); |
| + })); |
| +} |
| + |
| +void testTypeVariable() { |
| + asyncTest(() => TypeEnvironment.create(r""" |
| + class A {} |
| + class B {} |
| + class C extends B {} |
| + class I<S extends A, |
| + T extends B, |
| + U extends C, |
| + V extends T, |
| + W extends V, |
| + X extends T> {} |
| + """).then((var env) { |
| + |
| + // A B |
| + // | / \ |
| + // S T C |
| + // / \ \ |
| + // V X U |
| + // / |
| + // W |
| + |
| + DartType Object_ = env['Object']; |
| + DartType A = env['A']; |
| + DartType B = env['B']; |
| + DartType C = env['C']; |
| + ClassElement I = env.getElement('I'); |
| + DartType S = I.typeVariables.head; |
| + DartType T = I.typeVariables.tail.head; |
| + DartType U = I.typeVariables.tail.tail.head; |
| + DartType V = I.typeVariables.tail.tail.tail.head; |
| + DartType W = I.typeVariables.tail.tail.tail.tail.head; |
| + DartType X = I.typeVariables.tail.tail.tail.tail.tail.head; |
| + |
| + checkLub(DartType a, DartType b, DartType expectedLub) { |
| + DartType lub = env.computeLeastUpperBound(a, b); |
| + Expect.equals(expectedLub, lub, |
| + 'Unexpected lub($a,$b) = $lub, expected $expectedLub'); |
| + } |
| + |
| + checkLub(Object_, Object_, Object_); |
| + checkLub(Object_, A, Object_); |
| + checkLub(Object_, B, Object_); |
| + checkLub(Object_, C, Object_); |
| + checkLub(Object_, S, Object_); |
| + checkLub(Object_, T, Object_); |
| + checkLub(Object_, U, Object_); |
| + checkLub(Object_, V, Object_); |
| + checkLub(Object_, W, Object_); |
| + checkLub(Object_, X, Object_); |
| + |
| + checkLub(A, Object_, Object_); |
| + checkLub(A, A, A); |
| + checkLub(A, B, Object_); |
| + checkLub(A, C, Object_); |
| + checkLub(A, S, A); |
| + checkLub(A, T, Object_); |
| + checkLub(A, U, Object_); |
| + checkLub(A, V, Object_); |
| + checkLub(A, W, Object_); |
| + checkLub(A, X, Object_); |
| + |
| + checkLub(B, Object_, Object_); |
| + checkLub(B, A, Object_); |
| + checkLub(B, B, B); |
| + checkLub(B, C, B); |
| + checkLub(B, S, Object_); |
| + checkLub(B, T, B); |
| + checkLub(B, U, B); |
| + checkLub(B, V, B); |
| + checkLub(B, W, B); |
| + checkLub(B, X, B); |
| + |
| + checkLub(C, Object_, Object_); |
| + checkLub(C, A, Object_); |
| + checkLub(C, B, B); |
| + checkLub(C, C, C); |
| + checkLub(C, S, Object_); |
| + checkLub(C, T, B); |
| + checkLub(C, U, C); |
| + checkLub(C, V, B); |
| + checkLub(C, W, B); |
| + checkLub(C, X, B); |
| + |
| + checkLub(S, Object_, Object_); |
| + checkLub(S, A, A); |
| + checkLub(S, B, Object_); |
| + checkLub(S, C, Object_); |
| + checkLub(S, S, S); |
| + checkLub(S, T, Object_); |
| + checkLub(S, U, Object_); |
| + checkLub(S, V, Object_); |
| + checkLub(S, W, Object_); |
| + checkLub(S, X, Object_); |
| + |
| + checkLub(T, Object_, Object_); |
| + checkLub(T, A, Object_); |
| + checkLub(T, B, B); |
| + checkLub(T, C, B); |
| + checkLub(T, S, Object_); |
| + checkLub(T, T, T); |
| + checkLub(T, U, B); |
| + checkLub(T, V, T); |
| + checkLub(T, W, T); |
| + checkLub(T, X, T); |
| + |
| + checkLub(U, Object_, Object_); |
| + checkLub(U, A, Object_); |
| + checkLub(U, B, B); |
| + checkLub(U, C, C); |
| + checkLub(U, S, Object_); |
| + checkLub(U, T, B); |
| + checkLub(U, U, U); |
| + checkLub(U, V, B); |
| + checkLub(U, W, B); |
| + checkLub(U, X, B); |
| + |
| + checkLub(V, Object_, Object_); |
| + checkLub(V, A, Object_); |
| + checkLub(V, B, B); |
| + checkLub(V, C, B); |
| + checkLub(V, S, Object_); |
| + checkLub(V, T, T); |
| + checkLub(V, U, B); |
| + checkLub(V, V, V); |
| + checkLub(V, W, V); |
| + checkLub(V, X, T); |
| + |
| + checkLub(W, Object_, Object_); |
| + checkLub(W, A, Object_); |
| + checkLub(W, B, B); |
| + checkLub(W, C, B); |
| + checkLub(W, S, Object_); |
| + checkLub(W, T, T); |
| + checkLub(W, U, B); |
| + checkLub(W, V, V); |
| + checkLub(W, W, W); |
| + checkLub(W, X, T); |
| + |
| + checkLub(X, Object_, Object_); |
| + checkLub(X, A, Object_); |
| + checkLub(X, B, B); |
| + checkLub(X, C, B); |
| + checkLub(X, S, Object_); |
| + checkLub(X, T, T); |
| + checkLub(X, U, B); |
| + checkLub(X, V, T); |
| + checkLub(X, W, T); |
| + checkLub(X, X, X); |
| + })); |
| +} |
| + |
| + |