Index: mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart |
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c24297f2860b05a1763d94921daa9076a28485f4 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart |
@@ -0,0 +1,358 @@ |
+// Copyright (c) 2015, 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. |
+ |
+// Tests related to the [TypeSystem] class. |
+ |
+library engine.type_system_test; |
+ |
+import 'package:analyzer/src/generated/element.dart'; |
+import 'package:analyzer/src/generated/resolver.dart'; |
+import 'package:analyzer/src/generated/testing/element_factory.dart'; |
+import 'package:analyzer/src/generated/testing/test_type_provider.dart'; |
+import 'package:unittest/unittest.dart'; |
+ |
+import '../reflective_tests.dart'; |
+import '../utils.dart'; |
+ |
+main() { |
+ initializeTestEnvironment(); |
+ runReflectiveTests(TypeSystemTest); |
+} |
+ |
+@reflectiveTest |
+class TypeSystemTest { |
+ TypeProvider typeProvider; |
+ TypeSystem typeSystem; |
+ FunctionType simpleFunctionType; |
+ |
+ DartType get bottomType => typeProvider.bottomType; |
+ InterfaceType get doubleType => typeProvider.doubleType; |
+ DartType get dynamicType => typeProvider.dynamicType; |
+ InterfaceType get functionType => typeProvider.functionType; |
+ InterfaceType get intType => typeProvider.intType; |
+ InterfaceType get listType => typeProvider.listType; |
+ InterfaceType get numType => typeProvider.numType; |
+ InterfaceType get objectType => typeProvider.objectType; |
+ InterfaceType get stringType => typeProvider.stringType; |
+ DartType get voidType => VoidTypeImpl.instance; |
+ |
+ void setUp() { |
+ typeProvider = new TestTypeProvider(); |
+ typeSystem = new TypeSystemImpl(typeProvider); |
+ FunctionTypeAliasElementImpl typeAlias = |
+ ElementFactory.functionTypeAliasElement('A'); |
+ typeAlias.parameters = []; |
+ typeAlias.returnType = voidType; |
+ simpleFunctionType = typeAlias.type; |
+ } |
+ |
+ void test_getLeastUpperBound_bottom_function() { |
+ _checkLeastUpperBound(bottomType, simpleFunctionType, simpleFunctionType); |
+ } |
+ |
+ void test_getLeastUpperBound_bottom_interface() { |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ _checkLeastUpperBound(bottomType, interfaceType, interfaceType); |
+ } |
+ |
+ void test_getLeastUpperBound_bottom_typeParam() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ _checkLeastUpperBound(bottomType, typeParam, typeParam); |
+ } |
+ |
+ void test_getLeastUpperBound_directInterfaceCase() { |
+ // |
+ // class A |
+ // class B implements A |
+ // class C implements B |
+ // |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ ClassElementImpl classC = ElementFactory.classElement2("C"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ classB.interfaces = <InterfaceType>[typeA]; |
+ classC.interfaces = <InterfaceType>[typeB]; |
+ _checkLeastUpperBound(typeB, typeC, typeB); |
+ } |
+ |
+ void test_getLeastUpperBound_directSubclassCase() { |
+ // |
+ // class A |
+ // class B extends A |
+ // class C extends B |
+ // |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement("B", classA.type); |
+ ClassElementImpl classC = ElementFactory.classElement("C", classB.type); |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ _checkLeastUpperBound(typeB, typeC, typeB); |
+ } |
+ |
+ void test_getLeastUpperBound_dynamic_bottom() { |
+ _checkLeastUpperBound(dynamicType, bottomType, dynamicType); |
+ } |
+ |
+ void test_getLeastUpperBound_dynamic_function() { |
+ _checkLeastUpperBound(dynamicType, simpleFunctionType, dynamicType); |
+ } |
+ |
+ void test_getLeastUpperBound_dynamic_interface() { |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ _checkLeastUpperBound(dynamicType, interfaceType, dynamicType); |
+ } |
+ |
+ void test_getLeastUpperBound_dynamic_typeParam() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ _checkLeastUpperBound(dynamicType, typeParam, dynamicType); |
+ } |
+ |
+ void test_getLeastUpperBound_dynamic_void() { |
+ _checkLeastUpperBound(dynamicType, voidType, dynamicType); |
+ } |
+ |
+ void test_getLeastUpperBound_interface_function() { |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ _checkLeastUpperBound(interfaceType, simpleFunctionType, objectType); |
+ } |
+ |
+ void test_getLeastUpperBound_mixinCase() { |
+ // |
+ // class A |
+ // class B extends A |
+ // class C extends A |
+ // class D extends B with M, N, O, P |
+ // |
+ ClassElement classA = ElementFactory.classElement2("A"); |
+ ClassElement classB = ElementFactory.classElement("B", classA.type); |
+ ClassElement classC = ElementFactory.classElement("C", classA.type); |
+ ClassElementImpl classD = ElementFactory.classElement("D", classB.type); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeC = classC.type; |
+ InterfaceType typeD = classD.type; |
+ classD.mixins = <InterfaceType>[ |
+ ElementFactory.classElement2("M").type, |
+ ElementFactory.classElement2("N").type, |
+ ElementFactory.classElement2("O").type, |
+ ElementFactory.classElement2("P").type |
+ ]; |
+ _checkLeastUpperBound(typeD, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_object() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ DartType typeObject = typeA.element.supertype; |
+ // assert that object does not have a super type |
+ expect((typeObject.element as ClassElement).supertype, isNull); |
+ // assert that both A and B have the same super type of Object |
+ expect(typeB.element.supertype, typeObject); |
+ // finally, assert that the only least upper bound of A and B is Object |
+ _checkLeastUpperBound(typeA, typeB, typeObject); |
+ } |
+ |
+ void test_getLeastUpperBound_self() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ expect( |
+ typeSystem.getLeastUpperBound(dynamicType, dynamicType), dynamicType); |
+ expect(typeSystem.getLeastUpperBound(voidType, voidType), voidType); |
+ expect(typeSystem.getLeastUpperBound(bottomType, bottomType), bottomType); |
+ expect(typeSystem.getLeastUpperBound(typeParam, typeParam), typeParam); |
+ expect(typeSystem.getLeastUpperBound(interfaceType, interfaceType), |
+ interfaceType); |
+ expect( |
+ typeSystem.getLeastUpperBound(simpleFunctionType, simpleFunctionType), |
+ simpleFunctionType); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperclass1() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement("B", classA.type); |
+ ClassElementImpl classC = ElementFactory.classElement("C", classA.type); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ _checkLeastUpperBound(typeB, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperclass2() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement("B", classA.type); |
+ ClassElementImpl classC = ElementFactory.classElement("C", classA.type); |
+ ClassElementImpl classD = ElementFactory.classElement("D", classC.type); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeD = classD.type; |
+ _checkLeastUpperBound(typeB, typeD, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperclass3() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement("B", classA.type); |
+ ClassElementImpl classC = ElementFactory.classElement("C", classB.type); |
+ ClassElementImpl classD = ElementFactory.classElement("D", classB.type); |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ InterfaceType typeD = classD.type; |
+ _checkLeastUpperBound(typeC, typeD, typeB); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperclass4() { |
+ ClassElement classA = ElementFactory.classElement2("A"); |
+ ClassElement classA2 = ElementFactory.classElement2("A2"); |
+ ClassElement classA3 = ElementFactory.classElement2("A3"); |
+ ClassElementImpl classB = ElementFactory.classElement("B", classA.type); |
+ ClassElementImpl classC = ElementFactory.classElement("C", classA.type); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeA2 = classA2.type; |
+ InterfaceType typeA3 = classA3.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ classB.interfaces = <InterfaceType>[typeA2]; |
+ classC.interfaces = <InterfaceType>[typeA3]; |
+ _checkLeastUpperBound(typeB, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperinterface1() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ ClassElementImpl classC = ElementFactory.classElement2("C"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ classB.interfaces = <InterfaceType>[typeA]; |
+ classC.interfaces = <InterfaceType>[typeA]; |
+ _checkLeastUpperBound(typeB, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperinterface2() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ ClassElementImpl classC = ElementFactory.classElement2("C"); |
+ ClassElementImpl classD = ElementFactory.classElement2("D"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ InterfaceType typeD = classD.type; |
+ classB.interfaces = <InterfaceType>[typeA]; |
+ classC.interfaces = <InterfaceType>[typeA]; |
+ classD.interfaces = <InterfaceType>[typeC]; |
+ _checkLeastUpperBound(typeB, typeD, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperinterface3() { |
+ ClassElementImpl classA = ElementFactory.classElement2("A"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ ClassElementImpl classC = ElementFactory.classElement2("C"); |
+ ClassElementImpl classD = ElementFactory.classElement2("D"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ InterfaceType typeD = classD.type; |
+ classB.interfaces = <InterfaceType>[typeA]; |
+ classC.interfaces = <InterfaceType>[typeB]; |
+ classD.interfaces = <InterfaceType>[typeB]; |
+ _checkLeastUpperBound(typeC, typeD, typeB); |
+ } |
+ |
+ void test_getLeastUpperBound_sharedSuperinterface4() { |
+ ClassElement classA = ElementFactory.classElement2("A"); |
+ ClassElement classA2 = ElementFactory.classElement2("A2"); |
+ ClassElement classA3 = ElementFactory.classElement2("A3"); |
+ ClassElementImpl classB = ElementFactory.classElement2("B"); |
+ ClassElementImpl classC = ElementFactory.classElement2("C"); |
+ InterfaceType typeA = classA.type; |
+ InterfaceType typeA2 = classA2.type; |
+ InterfaceType typeA3 = classA3.type; |
+ InterfaceType typeB = classB.type; |
+ InterfaceType typeC = classC.type; |
+ classB.interfaces = <InterfaceType>[typeA, typeA2]; |
+ classC.interfaces = <InterfaceType>[typeA, typeA3]; |
+ _checkLeastUpperBound(typeB, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_twoComparables() { |
+ _checkLeastUpperBound(stringType, numType, objectType); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParam_function_bounded() { |
+ DartType typeA = ElementFactory.classElement('A', functionType).type; |
+ TypeParameterElementImpl typeParamElement = |
+ ElementFactory.typeParameterElement('T'); |
+ typeParamElement.bound = typeA; |
+ DartType typeParam = typeParamElement.type; |
+ _checkLeastUpperBound(typeParam, simpleFunctionType, functionType); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParam_function_noBound() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ _checkLeastUpperBound(typeParam, simpleFunctionType, objectType); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParam_interface_bounded() { |
+ DartType typeA = ElementFactory.classElement2('A', []).type; |
+ DartType typeB = ElementFactory.classElement('B', typeA).type; |
+ DartType typeC = ElementFactory.classElement('C', typeA).type; |
+ TypeParameterElementImpl typeParamElement = |
+ ElementFactory.typeParameterElement('T'); |
+ typeParamElement.bound = typeB; |
+ DartType typeParam = typeParamElement.type; |
+ _checkLeastUpperBound(typeParam, typeC, typeA); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParam_interface_noBound() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ _checkLeastUpperBound(typeParam, interfaceType, objectType); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParameters_different() { |
+ // |
+ // class List<int> |
+ // class List<double> |
+ // |
+ InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]); |
+ InterfaceType listOfDoubleType = |
+ listType.substitute4(<DartType>[doubleType]); |
+ _checkLeastUpperBound(listOfIntType, listOfDoubleType, objectType); |
+ } |
+ |
+ void test_getLeastUpperBound_typeParameters_same() { |
+ // |
+ // List<int> |
+ // List<int> |
+ // |
+ InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]); |
+ expect(typeSystem.getLeastUpperBound(listOfIntType, listOfIntType), |
+ listOfIntType); |
+ } |
+ |
+ void test_getLeastUpperBound_void_bottom() { |
+ _checkLeastUpperBound(voidType, bottomType, voidType); |
+ } |
+ |
+ void test_getLeastUpperBound_void_function() { |
+ _checkLeastUpperBound(voidType, simpleFunctionType, voidType); |
+ } |
+ |
+ void test_getLeastUpperBound_void_interface() { |
+ DartType interfaceType = ElementFactory.classElement2('A', []).type; |
+ _checkLeastUpperBound(voidType, interfaceType, voidType); |
+ } |
+ |
+ void test_getLeastUpperBound_void_typeParam() { |
+ DartType typeParam = ElementFactory.typeParameterElement('T').type; |
+ _checkLeastUpperBound(voidType, typeParam, voidType); |
+ } |
+ |
+ void _checkLeastUpperBound( |
+ DartType type1, DartType type2, DartType expectedResult) { |
+ expect(typeSystem.getLeastUpperBound(type1, type2), expectedResult); |
+ } |
+} |