blob: 32c6d12e7981a538154df5e15d6b291af47c8dde [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.gwt.dev.javac.typemodel;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.JWildcardType.BoundType;
import com.google.gwt.dev.javac.typemodel.test.CA;
import com.google.gwt.dev.javac.typemodel.test.CB;
import com.google.gwt.dev.javac.typemodel.test.CC;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* Test for {@link JWildcardType}.
*/
public class JWildcardTypeTest extends JDelegatingClassTypeTestBase {
private final boolean logToConsole = false;
private final ModuleContext moduleContext = new ModuleContext(logToConsole
? new PrintWriterTreeLogger() : TreeLogger.NULL,
"com.google.gwt.dev.javac.typemodel.TypeOracleTest");
public JWildcardTypeTest() throws UnableToCompleteException {
}
@Override
public void testFindConstructor() {
// Wildcard types do not have constructors
}
@Override
public void testFindNestedType() {
// Wildcard do not have nested types...
}
@Override
public void testGetConstructors() {
}
@Override
public void testGetEnclosingType() {
// Wildcard do not have nested types...
}
@Override
public void testGetErasedType() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getCanonicalName());
// Tests that ? extends Number erases to number.
JWildcardType upperBoundWildcard = oracle.getWildcardType(
BoundType.EXTENDS, numberType);
assertEquals(numberType, upperBoundWildcard.getErasedType());
// Tests that ? super Number erases to Object
JWildcardType lowerBoundWildcard = oracle.getWildcardType(BoundType.SUPER,
numberType);
assertEquals(oracle.getJavaLangObject(), lowerBoundWildcard.getErasedType());
}
@Override
public void testGetInheritableMethods() {
// No inheritable methods
}
@Override
public void testGetMethods() throws NotFoundException {
super.testGetMethods();
}
@Override
public void testGetNestedType() {
// No nested types
}
@Override
public void testGetNestedTypes() {
// No nested types
}
@Override
public void testGetOverridableMethods() {
// No overridable methods
}
/**
* Tests that {@link JWildcardType#getParameterizedQualifiedSourceName()}
* returns the expected value. We test this because JSNI code depends on it.
*
* @throws NotFoundException
*/
public void testGetParameterizedQualifiedSourceName()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JWildcardType numberUpperBound = oracle.getWildcardType(BoundType.EXTENDS,
numberType);
assertEquals("? extends " + Number.class.getCanonicalName(),
numberUpperBound.getParameterizedQualifiedSourceName());
JWildcardType numberLowerBound = oracle.getWildcardType(BoundType.SUPER,
numberType);
assertEquals("? super " + Number.class.getCanonicalName(),
numberLowerBound.getParameterizedQualifiedSourceName());
JWildcardType unboundWildcard = oracle.getWildcardType(BoundType.UNBOUND,
oracle.getJavaLangObject());
assertEquals("?", unboundWildcard.getParameterizedQualifiedSourceName());
}
@Override
public void testGetSubtypes() {
// Tested by testGetSubtypes_LowerBound() and testGetSubtypes_UpperBound()
}
public void testGetSubtypes_LowerBound() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
// <? super Number>
JWildcardType lowerBoundWildcard = oracle.getWildcardType(BoundType.SUPER,
oracle.getType(Number.class.getName()));
JClassType[] subtypes = lowerBoundWildcard.getSubtypes();
assertEquals(0, subtypes.length);
// assertEquals(oracle.getJavaLangObject(), subtypes[0]);
}
public void testGetSubtypes_UpperBound() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
// <? extends CA>
JWildcardType upperBoundWildcard = oracle.getWildcardType(
BoundType.EXTENDS, oracle.getType(CA.class.getName()));
JClassType[] expected = new JClassType[]{
oracle.getType(CB.class.getName()), oracle.getType(CC.class.getName())};
Set<JClassType> expectedSet = new HashSet<JClassType>();
expectedSet.addAll(Arrays.asList(expected));
JClassType[] actual = upperBoundWildcard.getSubtypes();
assertEquals(expectedSet.size(), actual.length);
for (int i = 0; i < actual.length; ++i) {
expectedSet.remove(actual[i]);
}
assertTrue(expectedSet.isEmpty());
}
@Override
public void testIsAssignableFrom() throws NotFoundException {
// Covered by the different testIsAssignableFrom*() variants below.
TypeOracle oracle = moduleContext.getOracle();
JClassType integerType = oracle.getType(Integer.class.getName());
JClassType numberType = oracle.getType(Number.class.getName());
// ? extends Number
JClassType extendsNumber = oracle.getWildcardType(BoundType.EXTENDS,
numberType);
// ? extends Integer
JClassType extendsInteger = oracle.getWildcardType(BoundType.EXTENDS,
integerType);
// Integer is not assignable from ? extends Number
assertFalse(integerType.isAssignableFrom(extendsNumber));
// Integer is assignable from ? extends Integer
assertTrue(integerType.isAssignableFrom(extendsInteger));
// Number is assignable from ? extends Integer
assertTrue(numberType.isAssignableFrom(extendsInteger));
// ? super Integer
JClassType superInteger = oracle.getWildcardType(BoundType.SUPER,
integerType);
// Integer is assignable from ? super Integer
assertFalse(integerType.isAssignableFrom(superInteger));
// ? super Integer is assignable from Number
assertTrue(superInteger.isAssignableFrom(numberType));
JClassType superNumber = oracle.getWildcardType(BoundType.SUPER, numberType);
// ? super Number is assignable from Integer
assertTrue(superNumber.isAssignableFrom(integerType));
// ? super Number is assignable from Character
JClassType characterType = oracle.getType(Character.class.getName());
assertTrue(superNumber.isAssignableFrom(characterType));
}
/**
* Tests that <? extends Number> is assignable from <? extends Integer> and
* that the reverse is not <code>true</code>.
*/
public void testIsAssignableFrom_Extends_Number_To_Extends_Integer()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
JWildcardType numberWildcard = oracle.getWildcardType(BoundType.EXTENDS,
numberType);
JWildcardType integerWildcard = oracle.getWildcardType(BoundType.EXTENDS,
integerType);
assertTrue(numberWildcard.isAssignableFrom(integerWildcard));
assertFalse(integerWildcard.isAssignableFrom(numberWildcard));
}
/**
* Tests that <? extends Object> is assignable to and from <? super Object>.
*/
public void testIsAssignableFrom_Extends_Object_From_Super_Object() {
TypeOracle oracle = moduleContext.getOracle();
JClassType javaLangObject = oracle.getJavaLangObject();
// ? super Object
JWildcardType lowerWildcard = oracle.getWildcardType(BoundType.SUPER,
javaLangObject);
// ? extends Object
JWildcardType upperWildcard = oracle.getWildcardType(BoundType.EXTENDS,
javaLangObject);
// ? extends Object assignable from ? super Object
assertTrue(upperWildcard.isAssignableFrom(lowerWildcard));
// ? super Object assignable from ? extends Object
assertTrue(lowerWildcard.isAssignableFrom(upperWildcard));
}
/**
* Tests that <? super Integer> is assignable to and from <? super Number>.
*/
public void testIsAssignableFrom_Super_Integer_From_Super_Number()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
numberType);
JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
integerType);
assertTrue(numberWildcard.isAssignableFrom(integerWildcard));
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
assertTrue(integerWildcard.isAssignableFrom(numberWildcard));
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
}
/**
* Tests that <? super Number> is assignable to and from <? super Integer>.
*/
public void testIsAssignableFrom_Super_Number_To_Super_Integer()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
numberType);
JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
integerType);
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
}
@Override
public void testIsAssignableTo() {
// NOTE These cases were tested as part of testIsAssignableFrom.
}
/**
* Tests that <? extends Integer> is assignable to <? extends Number> and that
* the reverse is not <code>true</code>.
*/
public void testIsAssignableTo_Extends_Integer_To_Extends_Number()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
JWildcardType numberWildcard = oracle.getWildcardType(BoundType.EXTENDS,
numberType);
JWildcardType integerWildcard = oracle.getWildcardType(BoundType.EXTENDS,
integerType);
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
assertFalse(numberWildcard.isAssignableTo(integerWildcard));
}
/**
* Tests that <? super Number> is assignable to and from <? super Integer>.
*/
public void testIsAssignableTo_Super_Number_To_Super_Integer()
throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
JClassType numberType = oracle.getType(Number.class.getName());
JClassType integerType = oracle.getType(Integer.class.getName());
JWildcardType numberWildcard = oracle.getWildcardType(BoundType.SUPER,
numberType);
JWildcardType integerWildcard = oracle.getWildcardType(BoundType.SUPER,
integerType);
assertTrue(integerWildcard.isAssignableTo(numberWildcard));
assertTrue(numberWildcard.isAssignableTo(integerWildcard));
}
@Override
protected Substitution getSubstitution() {
return new Substitution() {
public JClassType getSubstitution(JClassType type) {
return type;
}
};
}
@Override
protected JWildcardType getTestType() throws NotFoundException {
TypeOracle oracle = moduleContext.getOracle();
return oracle.getWildcardType(BoundType.EXTENDS,
oracle.getType(Number.class.getName()));
}
}