| /* |
| * Copyright (c) 2012, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.dart.engine.internal.type; |
| |
| import com.google.dart.engine.EngineTestCase; |
| import com.google.dart.engine.element.ClassElement; |
| import com.google.dart.engine.internal.element.ClassElementImpl; |
| import com.google.dart.engine.internal.element.TypeParameterElementImpl; |
| import com.google.dart.engine.type.InterfaceType; |
| import com.google.dart.engine.type.Type; |
| |
| import static com.google.dart.engine.ast.AstFactory.identifier; |
| import static com.google.dart.engine.element.ElementFactory.classElement; |
| import static com.google.dart.engine.element.ElementFactory.getObject; |
| |
| public class TypeParameterTypeImplTest extends EngineTestCase { |
| public void test_creation() { |
| assertNotNull(new TypeParameterTypeImpl(new TypeParameterElementImpl(identifier("E")))); |
| } |
| |
| public void test_getElement() { |
| TypeParameterElementImpl element = new TypeParameterElementImpl(identifier("E")); |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(element); |
| assertEquals(element, type.getElement()); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_dynamic() { |
| TypeParameterElementImpl element = new TypeParameterElementImpl(identifier("E")); |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(element); |
| |
| // E << dynamic |
| assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.getInstance())); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_object() { |
| TypeParameterElementImpl element = new TypeParameterElementImpl(identifier("E")); |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(element); |
| |
| // E << Object |
| assertTrue(type.isMoreSpecificThan(getObject().getType())); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_resursive() { |
| ClassElementImpl classS = classElement("A"); |
| |
| TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(identifier("U")); |
| TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU); |
| |
| TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); |
| TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); |
| |
| typeParameterT.setBound(typeParameterTypeU); |
| typeParameterU.setBound(typeParameterTypeU); |
| |
| // <T extends U> and <U extends T> |
| // T << S |
| assertFalse(typeParameterTypeT.isMoreSpecificThan(classS.getType())); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_self() { |
| TypeParameterElementImpl element = new TypeParameterElementImpl(identifier("E")); |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(element); |
| |
| // E << E |
| assertTrue(type.isMoreSpecificThan(type)); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() { |
| // class A {} |
| // class B extends A {} |
| // |
| ClassElement classA = classElement("A"); |
| ClassElement classB = classElement("B", classA.getType()); |
| InterfaceType typeA = classA.getType(); |
| InterfaceType typeB = classB.getType(); |
| |
| TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); |
| typeParameterT.setBound(typeB); |
| TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); |
| |
| // <T extends B> |
| // T << A |
| assertTrue(typeParameterTypeT.isMoreSpecificThan(typeA)); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() { |
| ClassElementImpl classS = classElement("A"); |
| |
| TypeParameterElementImpl typeParameterU = new TypeParameterElementImpl(identifier("U")); |
| typeParameterU.setBound(classS.getType()); |
| TypeParameterTypeImpl typeParameterTypeU = new TypeParameterTypeImpl(typeParameterU); |
| |
| TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); |
| typeParameterT.setBound(typeParameterTypeU); |
| TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); |
| |
| // <T extends U> and <U extends S> |
| // T << S |
| assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.getType())); |
| } |
| |
| public void test_isMoreSpecificThan_typeArguments_upperBound() { |
| ClassElementImpl classS = classElement("A"); |
| |
| TypeParameterElementImpl typeParameterT = new TypeParameterElementImpl(identifier("T")); |
| typeParameterT.setBound(classS.getType()); |
| TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT); |
| |
| // <T extends S> |
| // T << S |
| assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.getType())); |
| } |
| |
| public void test_substitute_equal() { |
| TypeParameterElementImpl element = new TypeParameterElementImpl(identifier("E")); |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(element); |
| InterfaceTypeImpl argument = new InterfaceTypeImpl(new ClassElementImpl(identifier("A"))); |
| TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element); |
| assertSame(argument, type.substitute(new Type[] {argument}, new Type[] {parameter})); |
| } |
| |
| public void test_substitute_notEqual() { |
| TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl( |
| identifier("E"))); |
| InterfaceTypeImpl argument = new InterfaceTypeImpl(new ClassElementImpl(identifier("A"))); |
| TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl( |
| identifier("F"))); |
| assertSame(type, type.substitute(new Type[] {argument}, new Type[] {parameter})); |
| } |
| } |