Adds a unit test for the TypeOracleMediator that feeds byte code instead of source.
Review at http://gwt-code-reviews.appspot.com/1254801
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9517 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java b/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
index eadc572..3df184c 100644
--- a/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
+++ b/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java
@@ -787,6 +787,15 @@
addAnnotations(type, declaredAnnotations);
String signature = classData.getSignature();
+
+ /*
+ * Note: Byte code from the OpenJDK compiler doesn't contain a type signature for non-static
+ * inner classes of parameterized types that do not contain new parameters (but JDT compiled
+ * byte code does). That can cause some differences in the way generic types are represented
+ * in the type oracle.
+ *
+ * These differences also show up when using java.lang.reflect to look at types.
+ */
if (signature != null) {
// If we have a signature, use it for superclass and interfaces
SignatureReader reader = new SignatureReader(signature);
diff --git a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromByteCodeTest.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromByteCodeTest.java
new file mode 100644
index 0000000..f6f63de
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromByteCodeTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2010 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;
+
+import com.google.gwt.core.ext.typeinfo.TypeOracleException;
+import com.google.gwt.dev.javac.TypeOracleMediator.TypeData;
+import com.google.gwt.dev.resource.Resource;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Tests the type oracle when loaded from byte code extracted from the current classpath.
+ *
+ * This test uses the byte code on the class path created when compiling this
+ * GWT instance, so it may fail in different ways depending on your environment.
+ * When reporting a bug, make sure to report which JDK was used to compile the
+ * tests.
+ */
+public class TypeOracleMediatorFromByteCodeTest extends
+ TypeOracleMediatorTestBase {
+
+ @Override
+ protected synchronized void buildTypeOracle() throws TypeOracleException {
+ Collection<TypeOracleMediator.TypeData> typeDataList = new ArrayList<TypeOracleMediator.TypeData>();
+ for (Resource resource : resources) {
+ if (resource instanceof MutableJavaResource) {
+ MutableJavaResource javaResource = (MutableJavaResource) resource;
+ try {
+ for (TypeData result : javaResource.getTypeData()) {
+ typeDataList.add(result);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new TypeOracleException(e);
+ }
+ }
+ }
+ TypeOracleMediator mediator = new TypeOracleMediator();
+ mediator.addNewTypes(createTreeLogger(), typeDataList);
+ typeOracle = mediator.getTypeOracle();
+ checkTypes(typeOracle.getTypes());
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromSourceTest.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromSourceTest.java
index d10d790..4d762c8 100644
--- a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromSourceTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorFromSourceTest.java
@@ -1,10 +1,179 @@
+
package com.google.gwt.dev.javac;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.core.ext.typeinfo.TypeOracleException;
+import java.io.IOException;
public class TypeOracleMediatorFromSourceTest extends
TypeOracleMediatorTestBase {
+ protected CheckedJavaResource CU_HasSyntaxErrors = new CheckedJavaResource(
+ "test", "HasSyntaxErrors", "NoSyntaxErrors") {
+ @Override
+ public void check(JClassType classInfo) {
+ fail("This class should have been removed");
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package test;\n");
+ sb.append("class NoSyntaxErrors { }\n");
+ sb.append("public class HasSyntaxErrors { a syntax error }\n");
+ return sb.toString();
+ }
+ };
+
+ protected CheckedJavaResource CU_HasUnresolvedSymbols = new CheckedJavaResource(
+ "test", "Invalid", "Valid") {
+ @Override
+ public void check(JClassType classInfo) {
+ fail("Both classes should have been removed");
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package " + getPackageName() + ";\n");
+ sb.append("public class Invalid extends NoSuchClass { }\n");
+ sb.append("class Valid extends Object { }\n");
+ return sb.toString();
+ }
+ };
+
+ protected CheckedJavaResource CU_RefsInfectedCompilationUnit = new CheckedJavaResource(
+ "test", "RefsInfectedCompilationUnit") {
+ @Override
+ public void check(JClassType classInfo) {
+ fail("This class should should have been removed because it refers to a class in another compilation unit that had problems");
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package test;\n");
+ sb.append("public class RefsInfectedCompilationUnit extends Valid { }\n");
+ return sb.toString();
+ }
+ };
+
+ /**
+ * Tests that refreshing with a unit that has errors does not cause new units
+ * that reference unchanged units to be removed. The strategy is to add some
+ * good units that reference each other and build a {@link TypeOracle}. Then
+ * we add some new units that have errors as well as some units that reference
+ * old units which did not have errors. This ensures that the correct units
+ * are pruned from the type oracle in the case where we encounter units with
+ * errors.
+ *
+ * @throws UnableToCompleteException
+ * @throws IOException
+ */
+ public void testRefreshWithErrors() throws TypeOracleException {
+ // Add Object
+ StringBuffer sb = new StringBuffer();
+ sb.append("package java.lang;");
+ sb.append("public class Object { }");
+ addResource("java.lang.Object", sb);
+
+ // Add UnmodifiedClass that will never change.
+ sb = new StringBuffer();
+ sb.append("package test.refresh.with.errors;");
+ sb.append("public class UnmodifiedClass { }");
+ addResource("test.refresh.with.errors.UnmodifiedClass", sb);
+
+ // Add GoodClass that references a class that will go bad.
+ sb = new StringBuffer();
+ sb.append("package test.refresh.with.errors;\n");
+ sb.append("public class GoodClass {\n");
+ sb.append(" ClassThatWillGoBad ctwgb;\n");
+ sb.append("}\n");
+ addResource("test.refresh.with.errors.GoodClass", sb);
+
+ // Add ClassThatWillGoBad that goes bad on the next refresh.
+ MutableJavaResource unitThatWillGoBad = new MutableJavaResource(
+ "test.refresh.with.errors",
+ "test.refresh.with.errors.ClassThatWillGoBad") {
+
+ private String source = "package test.refresh.with.errors;\n"
+ + "public class ClassThatWillGoBad { }\n";
+
+ @Override
+ public String getSource() {
+ return source;
+ }
+
+ @Override
+ public void touch() {
+ super.touch();
+ source = "This will cause a syntax error.";
+ }
+ };
+
+ resources.add(unitThatWillGoBad);
+
+ buildTypeOracle();
+
+ assertNotNull(typeOracle.findType("test.refresh.with.errors.UnmodifiedClass"));
+ assertNotNull(typeOracle.findType("test.refresh.with.errors.GoodClass"));
+ assertNotNull(typeOracle.findType("test.refresh.with.errors.ClassThatWillGoBad"));
+
+ // Add AnotherGoodClass that references a
+ // class that was not recompiled.
+ sb = new StringBuffer();
+ sb.append("package test.refresh.with.errors;\n");
+ sb.append("public class AnotherGoodClass {\n");
+ sb.append(" UnmodifiedClass uc; // This will cause the runaway pruning.\n");
+ sb.append("}\n");
+ addResource("test.refresh.with.errors.AnotherGoodClass", sb);
+
+ // Add BadClass that has errors and originally
+ // forced issue 2238.
+ sb = new StringBuffer();
+ sb.append("package test.refresh.with.errors;\n");
+ sb.append("public class BadClass {\n");
+ sb.append(" This will trigger a syntax error.\n");
+ sb.append("}\n");
+ addResource("test.refresh.with.errors.BadClass", sb);
+
+ // Now this cup should cause errors.
+ unitThatWillGoBad.touch();
+
+ buildTypeOracle();
+
+ assertNotNull(typeOracle.findType("test.refresh.with.errors.UnmodifiedClass"));
+ assertNotNull(typeOracle.findType("test.refresh.with.errors.AnotherGoodClass"));
+ assertNull(typeOracle.findType("test.refresh.with.errors.BadClass"));
+ assertNull(typeOracle.findType("test.refresh.with.errors.ClassThatWillGoBad"));
+ assertNull(typeOracle.findType("test.refresh.with.errors.GoodClass"));
+ }
+
+ public void testSyntaxErrors() throws TypeOracleException {
+ resources.add(CU_Object);
+ resources.add(CU_HasSyntaxErrors);
+ buildTypeOracle();
+ JClassType[] types = typeOracle.getTypes();
+ // Only java.lang.Object should remain.
+ //
+ assertEquals(1, types.length);
+ assertEquals("java.lang.Object", types[0].getQualifiedSourceName());
+ }
+
+ public void testUnresolvedSymbols() throws TypeOracleException {
+ resources.add(CU_Object);
+ resources.add(CU_HasUnresolvedSymbols);
+ resources.add(CU_RefsInfectedCompilationUnit);
+ buildTypeOracle();
+ JClassType[] types = typeOracle.getTypes();
+ // Only java.lang.Object should remain.
+ //
+ assertEquals(1, types.length);
+ assertEquals("java.lang.Object", types[0].getQualifiedSourceName());
+ }
+
@Override
protected void buildTypeOracle() throws TypeOracleException {
typeOracle = TypeOracleTestingUtils.buildTypeOracle(createTreeLogger(),
diff --git a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
index b9c1f3d..00fbde6 100644
--- a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Google Inc.
+ * Copyright 2010 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
@@ -16,6 +16,7 @@
package com.google.gwt.dev.javac;
import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JConstructor;
@@ -30,9 +31,37 @@
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.core.ext.typeinfo.TypeOracleException;
+import com.google.gwt.dev.javac.TypeOracleMediator.TypeData;
import com.google.gwt.dev.javac.impl.MockJavaResource;
import com.google.gwt.dev.javac.impl.StaticJavaResource;
+import com.google.gwt.dev.javac.mediatortest.AfterAssimilate;
+import com.google.gwt.dev.javac.mediatortest.BaseInterface;
+import com.google.gwt.dev.javac.mediatortest.BeforeAssimilate;
+import com.google.gwt.dev.javac.mediatortest.BindToTypeScope;
+import com.google.gwt.dev.javac.mediatortest.ConstrainedList;
+import com.google.gwt.dev.javac.mediatortest.ConstrainedListAsField;
+import com.google.gwt.dev.javac.mediatortest.DeclaresGenericInnerInterface;
+import com.google.gwt.dev.javac.mediatortest.DeclaresGenericInnerType;
+import com.google.gwt.dev.javac.mediatortest.DefaultClass;
+import com.google.gwt.dev.javac.mediatortest.Derived;
+import com.google.gwt.dev.javac.mediatortest.DerivedInterface;
+import com.google.gwt.dev.javac.mediatortest.EnclosingLocal;
+import com.google.gwt.dev.javac.mediatortest.EnclosingLocalWithMember;
+import com.google.gwt.dev.javac.mediatortest.ExtendsGenericList;
+import com.google.gwt.dev.javac.mediatortest.ExtendsGenericOuter;
+import com.google.gwt.dev.javac.mediatortest.ExtendsParameterizedInterface;
+import com.google.gwt.dev.javac.mediatortest.Fields;
+import com.google.gwt.dev.javac.mediatortest.GenericList;
+import com.google.gwt.dev.javac.mediatortest.GenericOuter;
+import com.google.gwt.dev.javac.mediatortest.Implementations;
+import com.google.gwt.dev.javac.mediatortest.ListAsField;
+import com.google.gwt.dev.javac.mediatortest.Methods;
+import com.google.gwt.dev.javac.mediatortest.Outer;
+import com.google.gwt.dev.javac.mediatortest.OuterInt;
+import com.google.gwt.dev.javac.mediatortest.ReferencesGenericListConstant;
+import com.google.gwt.dev.javac.mediatortest.ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed;
import com.google.gwt.dev.resource.Resource;
+import com.google.gwt.dev.util.Util;
import com.google.gwt.dev.util.log.AbstractTreeLogger;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
@@ -41,37 +70,118 @@
import org.apache.commons.collections.map.AbstractReferenceMap;
import org.apache.commons.collections.map.ReferenceMap;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Test TypeOracleMediator.
+ *
+ * NOTE: These tests require the test source code to be on the classpath. In
+ * Eclipse, make sure your launch configuration includes the 'core/test'
+ * directory on the classpath tab.
*/
public abstract class TypeOracleMediatorTestBase extends TestCase {
- private abstract class CheckedJavaResource extends MutableJavaResource {
+ protected static abstract class CheckedJavaResource extends
+ MutableJavaResource {
+ private final String[] shortTypeNames;
+
+ public CheckedJavaResource(Class<?> clazz, String... shortTypeNames) {
+ super(clazz);
+ this.shortTypeNames = shortTypeNames;
+ }
+
public CheckedJavaResource(String packageName, String shortMainTypeName,
String... shortTypeNames) {
- super(Shared.makeTypeName(packageName, shortMainTypeName));
- register(getTypeName(), this);
- for (String shortTypeName : shortTypeNames) {
- register(Shared.makeTypeName(packageName, shortTypeName), this);
- }
+ super(packageName, Shared.makeTypeName(packageName, shortMainTypeName));
+ this.shortTypeNames = shortTypeNames;
}
public abstract void check(JClassType type) throws NotFoundException;
+
+ public List<String> getTypeNames() {
+ List<String> typeNames = new ArrayList<String>();
+ typeNames.add(getTypeName());
+ for (String shortTypeName : shortTypeNames) {
+ String typeName = Shared.makeTypeName(getPackageName(), shortTypeName);
+ typeNames.add(typeName);
+ }
+ return typeNames;
+ }
}
- private abstract class MutableJavaResource extends MockJavaResource {
- private String extraSource = "";
-
- public MutableJavaResource(String qualifiedTypeName) {
- super(qualifiedTypeName);
+ protected static abstract class MutableJavaResource extends MockJavaResource {
+ private static byte[] getByteCode(Class<?> aClass) throws IOException {
+ String resourcePath = aClass.getName().replace(".", "/") + ".class";
+ ClassLoader loader = aClass.getClassLoader();
+ if (loader == null && aClass.getName().startsWith("java.")) {
+ loader = Thread.currentThread().getContextClassLoader();
+ }
+ InputStream istream = loader.getResourceAsStream(resourcePath);
+ assertNotNull(istream);
+ return Util.readStreamAsBytes(istream);
}
- public abstract String getSource();
+ // For building the type oracle from bytecode
+ private final Class<?> clazz;
+ private String extraSource = "";
+ private final String packageName;
+
+ public MutableJavaResource(Class<?> clazz) {
+ super(clazz.getName());
+ this.clazz = clazz;
+ this.packageName = clazz.getPackage().getName();
+ }
+
+ public MutableJavaResource(String packageName, String qualifiedTypeName) {
+ super(qualifiedTypeName);
+ this.clazz = null;
+ this.packageName = packageName;
+ }
+
+ public String getPackageName() {
+ return packageName;
+ }
+
+ /**
+ * This method is used to pull sample source from inside the test case. By
+ * default, return <code>null</code> to indicate that source should be on
+ * the classpath.
+ *
+ * @return
+ */
+ public String getSource() {
+ return null;
+ }
+
+ /**
+ * Pulls Java source from files in the mediatortest package. If source files
+ * are on the classpath, prefer this data.
+ */
+ public String getSourceFromClasspath() throws IOException {
+ if (clazz == null) {
+ return null;
+ }
+ assertFalse(clazz.getName().startsWith("java."));
+ ClassLoader loader = clazz.getClassLoader();
+ String resourcePath = clazz.getName().replace(".", "/") + ".java";
+ InputStream istream = loader.getResourceAsStream(resourcePath);
+ if (istream == null) {
+ fail("Could not read " + resourcePath + " from classloader.");
+ }
+ return Util.readStreamAsString(istream);
+ }
+
+ public TypeData[] getTypeData() throws IOException {
+ return getTypeData(clazz);
+ }
@Override
public void touch() {
@@ -79,144 +189,74 @@
extraSource += '\n';
}
+ /**
+ * Looks for the source data on the classpath.
+ */
@Override
protected CharSequence getContent() {
- return getSource() + extraSource;
+ String source = getSource();
+ if (source == null) {
+ try {
+ source = getSourceFromClasspath();
+ } catch (IOException ex) {
+ return null;
+ }
+ assertNotNull("Make sure your runtime environment includes the source "
+ + "for the testcases on the classpath if this assertion fails",
+ source);
+ }
+ return source + extraSource;
+ }
+
+ private TypeData[] getTypeData(Class<?> aClass) throws IOException {
+ List<TypeData> results = new ArrayList<TypeData>();
+ String packageName = Shared.getPackageName(aClass.getName());
+ TypeData newData = new TypeData(packageName, aClass.getSimpleName(),
+ aClass.getName().replace(".", "/"), null, getByteCode(aClass),
+ System.currentTimeMillis());
+ results.add(newData);
+ Class<?>[] subclasses = aClass.getDeclaredClasses();
+ for (Class<?> subclass : subclasses) {
+ for (TypeData result : getTypeData(subclass)) {
+ results.add(result);
+ }
+ }
+ return results.toArray(new TypeData[results.size()]);
}
}
- private static void assertIsAssignable(JClassType from, JClassType to) {
- assertTrue("'" + from + "' should be assignable to '" + to + "'",
- from.isAssignableTo(to));
- assertTrue("'" + to + "' should be assignable from '" + from + "'",
- to.isAssignableFrom(from));
- }
-
- private static void assertIsNotAssignable(JClassType from, JClassType to) {
- assertFalse(from + " should not be assignable to " + to,
- from.isAssignableTo(to));
- assertFalse(to + " should not be assignable to " + from,
- to.isAssignableFrom(from));
- }
-
- private static void recordAssignability(
- Map<JClassType, Set<JClassType>> assignabilityMap, JClassType from,
- JClassType to) {
- Set<JClassType> set = assignabilityMap.get(from);
- if (set == null) {
- set = new HashSet<JClassType>();
- assignabilityMap.put(from, set);
- }
- set.add(to);
- }
-
- /**
- * Public so that this will be initialized before the CUs.
- */
- public final Map<String, CheckedJavaResource> publicTypeNameToTestCupMap = new HashMap<String, CheckedJavaResource>();
-
- protected CheckedJavaResource CU_AfterAssimilate = new CheckedJavaResource(
- "test.assim", "AfterAssimilate") {
+ protected static final CheckedJavaResource CU_AfterAssimilate = new CheckedJavaResource(
+ AfterAssimilate.class) {
@Override
public void check(JClassType type) {
- assertEquals("test.assim.BeforeAssimilate",
+ assertNotNull(type);
+ assertEquals("AfterAssimilate", type.getSimpleSourceName());
+ assertNotNull(type.getSuperclass());
+ assertEquals(getPackageName() + ".BeforeAssimilate",
type.getSuperclass().getQualifiedSourceName());
}
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test.assim;\n");
- sb.append("class AfterAssimilate extends BeforeAssimilate { }");
- return sb.toString();
- }
};
-
- protected CheckedJavaResource CU_AnonymousClass = new CheckedJavaResource(
- "test", "Enclosing") {
+ protected static final CheckedJavaResource CU_BaseInterface = new CheckedJavaResource(
+ BaseInterface.class) {
@Override
public void check(JClassType type) {
- final String name = type.getSimpleSourceName();
- assertEquals("Enclosing", name);
- checkEnclosing(type);
- }
-
- public void checkEnclosing(JClassType type) {
- assertEquals("Enclosing", type.getSimpleSourceName());
- assertEquals("test.Enclosing", type.getQualifiedSourceName());
- // verify the anonymous class doesn't show up
- JClassType[] nested = type.getNestedTypes();
- assertEquals(0, nested.length);
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Enclosing {\n");
- sb.append(" public static Object getLocal() {");
- sb.append(" return new Object() { };\n");
- sb.append(" }\n");
- sb.append("}\n");
- return sb.toString();
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ assertNotNull(type.isInterface());
}
};
- protected CheckedJavaResource CU_Assignable = new CheckedJavaResource(
- "test.sub", "Derived", "BaseInterface", "DerivedInterface",
- "Derived.Nested") {
+ protected static final CheckedJavaResource CU_BeforeAssimilate = new CheckedJavaResource(
+ BeforeAssimilate.class) {
@Override
public void check(JClassType type) {
- if ("Derived".equals(type.getSimpleSourceName())) {
- checkDerived(type);
- } else if ("Nested".equals(type.getSimpleSourceName())) {
- checkNested(type);
- }
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test.sub;\n");
- sb.append("import test.Outer;");
- sb.append("interface BaseInterface { }");
- sb.append("interface DerivedInterface extends BaseInterface { }");
- sb.append("public class Derived extends Outer.Inner {\n");
- sb.append(" public static class Nested extends Outer.Inner implements DerivedInterface { }\n");
- sb.append("}\n");
- return sb.toString();
- }
-
- private void checkDerived(JClassType type) {
- assertEquals("test.sub.Derived", type.getQualifiedSourceName());
- }
-
- private void checkNested(JClassType type) {
- assertEquals("test.sub.Derived.Nested", type.getQualifiedSourceName());
-
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
}
};
- protected CheckedJavaResource CU_BeforeAssimilate = new CheckedJavaResource(
- "test.assim", "BeforeAssimilate") {
- @Override
- public void check(JClassType type) {
- assertEquals("test.assim.BeforeAssimilate", type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test.assim;\n");
- sb.append("class BeforeAssimilate { }");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_BindToTypeScope = new CheckedJavaResource(
- "test", "BindToTypeScope", "BindToTypeScope.Object",
+ protected static final CheckedJavaResource CU_BindToTypeScope = new CheckedJavaResource(
+ BindToTypeScope.class, "BindToTypeScope.Object",
"BindToTypeScope.DerivedObject") {
@Override
@@ -232,7 +272,7 @@
public void checkBindToTypeScope(JClassType type) throws NotFoundException {
assertEquals("BindToTypeScope", type.getSimpleSourceName());
- assertEquals("test.BindToTypeScope", type.getQualifiedSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
JClassType object = type.getNestedType("Object");
assertNotNull(object);
JClassType derivedObject = type.getNestedType("DerivedObject");
@@ -241,18 +281,7 @@
public void checkObject(JClassType type) {
assertEquals("Object", type.getSimpleSourceName());
- assertEquals("test.BindToTypeScope.Object", type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class BindToTypeScope {\n");
- sb.append(" public static class Object { }\n");
- sb.append(" public static class DerivedObject extends Object { }\n");
- sb.append("}\n");
- return sb.toString();
+ assertEquals(getTypeName() + ".Object", type.getQualifiedSourceName());
}
private void checkDerivedObject(JClassType type) throws NotFoundException {
@@ -261,115 +290,152 @@
JClassType object = bindToTypeScope.getNestedType("Object");
assertNotNull(object);
+ assertEquals(object.getSimpleSourceName(), "Object");
JClassType derivedObject = bindToTypeScope.getNestedType("DerivedObject");
assertNotNull(derivedObject);
+ assertEquals(derivedObject.getSimpleSourceName(), "DerivedObject");
assertEquals(object, derivedObject.getSuperclass());
}
};
- protected CheckedJavaResource CU_ConstrainedList = new CheckedJavaResource(
- "test", "ConstrainedList") {
+ protected static final CheckedJavaResource CU_ConstrainedList = new CheckedJavaResource(
+ ConstrainedList.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.isGenericType());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test;\n");
- sb.append("public interface ConstrainedList<E extends Throwable> {\n");
- sb.append("}");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_ConstrainedListAsField = new CheckedJavaResource(
- "test", "ConstrainedListAsField") {
+ protected static final CheckedJavaResource CU_ConstrainedListAsField = new CheckedJavaResource(
+ ConstrainedListAsField.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNull(type.isGenericType());
assertNull(type.getEnclosingType());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test;\n");
- sb.append("public class ConstrainedListAsField {\n");
- sb.append(" private ConstrainedList<?> field;");
- sb.append("}");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_DeclaresInnerGenericType = new CheckedJavaResource(
- "parameterized.type.build.dependency", "Class1", "Class1.Inner") {
+ protected static final CheckedJavaResource CU_DeclaresInnerGenericInterface = new CheckedJavaResource(
+ DeclaresGenericInnerInterface.class,
+ "DeclaresGenericInnerInterface.Inner") {
@Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.isGenericType());
}
+ };
+ protected static final CheckedJavaResource CU_DeclaresInnerGenericType = new CheckedJavaResource(
+ DeclaresGenericInnerType.class, "DeclaresGenericInnerType.Inner") {
@Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package parameterized.type.build.dependency;\n");
- sb.append("public class Class1<T> {\n");
- sb.append(" public interface Inner<T> {}\n");
- sb.append("}\n");
- return sb.toString();
+ public void check(JClassType type) throws NotFoundException {
+ assertNotNull(type.isGenericType());
}
};
- protected CheckedJavaResource CU_DefaultClass = new CheckedJavaResource(
- "test", "DefaultClass") {
+ protected static final CheckedJavaResource CU_DefaultClass = new CheckedJavaResource(
+ DefaultClass.class) {
@Override
public void check(JClassType type) {
assertEquals("DefaultClass", type.getSimpleSourceName());
- assertEquals("test.DefaultClass", type.getQualifiedSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
JClassType object = type.getOracle().findType("java.lang", "Object");
assertNotNull(object);
+
assertEquals(object, type.getSuperclass());
assertNull(type.isInterface());
assertEquals(0, type.getMethods().length);
assertEquals(0, type.getFields().length);
}
+ };
+ protected static final CheckedJavaResource CU_Derived = new CheckedJavaResource(
+ Derived.class, "Derived.Nested") {
@Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class DefaultClass extends Object { }\n");
- return sb.toString();
+ public void check(JClassType type) {
+ if ("Derived".equals(type.getSimpleSourceName())) {
+ checkDerived(type);
+ } else if ("Nested".equals(type.getSimpleSourceName())) {
+ checkNested(type);
+ } else {
+ assert (false);
+ }
+ }
+
+ private void checkDerived(JClassType type) {
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ }
+
+ private void checkNested(JClassType type) {
+ assertEquals(getTypeName() + ".Nested", type.getQualifiedSourceName());
+
}
};
- protected CheckedJavaResource CU_ExtendsGenericList = new CheckedJavaResource(
- "test.refresh", "ExtendsGenericList") {
+ protected static final CheckedJavaResource CU_DerivedInterface = new CheckedJavaResource(
+ DerivedInterface.class) {
+
+ @Override
+ public void check(JClassType type) {
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ assertNotNull(type.isInterface());
+ }
+ };
+
+ protected static final CheckedJavaResource CU_EnclosingLocalClass = new CheckedJavaResource(
+ EnclosingLocal.class) {
+
+ @Override
+ public void check(JClassType type) {
+ final String name = type.getSimpleSourceName();
+ assertEquals("EnclosingLocal", name);
+ checkEnclosing(type);
+ }
+
+ public void checkEnclosing(JClassType type) {
+ assertEquals("EnclosingLocal", type.getSimpleSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ // verify the local class doesn't show up
+ JClassType[] nested = type.getNestedTypes();
+ assertEquals(0, nested.length);
+ }
+ };
+
+ protected static final CheckedJavaResource CU_EnclosingLocalWithMember = new CheckedJavaResource(
+ EnclosingLocalWithMember.class) {
+
+ @Override
+ public void check(JClassType type) {
+ final String name = type.getSimpleSourceName();
+ assertEquals("EnclosingLocalWithMember", name);
+ checkEnclosing(type);
+ }
+
+ public void checkEnclosing(JClassType type) {
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ // verify the local class doesn't show up
+ JClassType[] nested = type.getNestedTypes();
+ assertEquals(0, nested.length);
+ }
+ };
+
+ protected static final CheckedJavaResource CU_ExtendsGenericList = new CheckedJavaResource(
+ ExtendsGenericList.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.getSuperclass().isParameterized());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test.refresh;\n");
- sb.append("class ExtendsGenericList extends GenericList<Object> {}");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_ExtendsGenericOuterInner = new CheckedJavaResource(
- "test", "ExtendsOuter", "ExtendsOuter.ExtendsInner") {
+ protected static final CheckedJavaResource CU_ExtendsGenericOuterInner = new CheckedJavaResource(
+ ExtendsGenericOuter.class, "ExtendsGenericOuter.ExtendsInner") {
@Override
public void check(JClassType type) {
final String name = type.getSimpleSourceName();
- if ("ExtendsOuter".equals(name)) {
+ if ("ExtendsGenericOuter".equals(name)) {
checkOuter(type);
} else {
checkInner(type);
@@ -378,56 +444,37 @@
public void checkInner(JClassType type) {
assertEquals("ExtendsInner", type.getSimpleSourceName());
- assertEquals("test.ExtendsOuter.ExtendsInner",
+ assertEquals(getTypeName() + ".ExtendsInner",
type.getQualifiedSourceName());
- assertEquals("test.ExtendsOuter",
+ assertEquals(getTypeName(),
type.getEnclosingType().getQualifiedSourceName());
}
public void checkOuter(JClassType type) {
- assertEquals("ExtendsOuter", type.getSimpleSourceName());
- assertEquals("test.ExtendsOuter", type.getQualifiedSourceName());
+ assertEquals("ExtendsGenericOuter", type.getSimpleSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
JClassType[] nested = type.getNestedTypes();
assertEquals(1, nested.length);
JClassType inner = nested[0];
- assertEquals("test.ExtendsOuter.ExtendsInner",
+ assertEquals(getTypeName() + ".ExtendsInner",
inner.getQualifiedSourceName());
}
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class ExtendsOuter extends Outer<Object> {\n");
- sb.append(" public class ExtendsInner extends Inner {\n");
- sb.append(" }\n");
- sb.append("}\n");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_ExtendsParameterizedType = new CheckedJavaResource(
- "parameterized.type.build.dependency", "Class2") {
+ protected static final CheckedJavaResource CU_ExtendsParameterizedInterface = new CheckedJavaResource(
+ ExtendsParameterizedInterface.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.getSuperclass().isParameterized());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package parameterized.type.build.dependency;\n");
- sb.append("public class Class2 extends Class1<Object> {}\n");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_FieldsAndTypes = new CheckedJavaResource(
- "test", "Fields", "SomeType") {
+ protected static final CheckedJavaResource CU_FieldsAndTypes = new CheckedJavaResource(
+ Fields.class) {
@Override
public void check(JClassType type) throws NotFoundException {
if ("Fields".equals(type.getSimpleSourceName())) {
- assertEquals("test.Fields", type.getQualifiedSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
TypeOracle tio = type.getOracle();
@@ -438,7 +485,8 @@
JType fieldType;
JArrayType arrayType;
JType componentType;
- final JClassType someType = tio.getType("test", "SomeType");
+ final JClassType someType = tio.getType(getPackageName(),
+ "DefaultClass");
final JArrayType intArrayType = tio.getArrayType(JPrimitiveType.INT);
final JArrayType someTypeArrayType = tio.getArrayType(someType);
final JArrayType intArrayArrayType = tio.getArrayType(intArrayType);
@@ -493,7 +541,8 @@
componentType = arrayType.getComponentType();
assertNotNull(componentType);
assertSame(someType, componentType);
- assertEquals("test.SomeType[]", fieldType.getQualifiedSourceName());
+ assertEquals(getPackageName() + ".DefaultClass[]",
+ fieldType.getQualifiedSourceName());
field = type.getField("intArrayArray");
fieldType = field.getType();
@@ -508,55 +557,22 @@
assertEquals("int[][]", fieldType.getQualifiedSourceName());
} else {
- // No need to check SomeType since
- // there's already a DefaultClass
+ // No need to check SomeType since there's already a DefaultClass
// test.
}
}
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("class SomeType { }");
- sb.append("public class Fields {\n");
- sb.append(" private int privateInt;\n");
- sb.append(" private SomeType privateSomeType;\n");
- sb.append(" protected int protectedInt;\n");
- sb.append(" public int publicInt;\n");
- sb.append(" int packageInt;\n");
- sb.append(" private static int staticInt;\n");
- sb.append(" private transient int transientInt;\n");
- sb.append(" private volatile int volatileInt;\n");
- sb.append(" public static final transient int multiInt = 0;\n");
- sb.append(" private int[] intArray;\n");
- sb.append(" private SomeType[] someTypeArray;\n");
- sb.append(" private int[][] intArrayArray;\n");
- sb.append("}\n");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_GenericList = new CheckedJavaResource(
- "test.refresh", "GenericList") {
+ protected static final CheckedJavaResource CU_GenericList = new CheckedJavaResource(
+ GenericList.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.isGenericType());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test.refresh;\n");
- sb.append("class GenericList<T> {\n");
- sb.append(" public static final int CONSTANT = 0;\n");
- sb.append("}");
- return sb.toString();
- }
};
- protected CheckedJavaResource CU_GenericOuterInner = new CheckedJavaResource(
- "test", "Outer", "Outer.Inner") {
+ protected static final CheckedJavaResource CU_GenericOuterInner = new CheckedJavaResource(
+ GenericOuter.class, "GenericOuter.Inner") {
@Override
public void check(JClassType type) {
@@ -570,74 +586,31 @@
public void checkInner(JClassType type) {
assertEquals("Inner", type.getSimpleSourceName());
- assertEquals("test.Outer.Inner", type.getQualifiedSourceName());
- assertEquals("test.Outer",
+ assertEquals(getTypeName() + ".Inner", type.getQualifiedSourceName());
+ assertEquals(getTypeName(),
type.getEnclosingType().getQualifiedSourceName());
}
public void checkOuter(JClassType type) {
- assertEquals("Outer", type.getSimpleSourceName());
- assertEquals("test.Outer", type.getQualifiedSourceName());
+ assertEquals("GenericOuter", type.getSimpleSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
JClassType[] nested = type.getNestedTypes();
assertEquals(1, nested.length);
JClassType inner = nested[0];
- assertEquals("test.Outer.Inner", inner.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("import java.util.List;\n");
- sb.append("public class Outer<V> {\n");
- sb.append(" public class Inner {\n");
- sb.append(" private V field;\n");
- sb.append(" private List<V> list;\n");
- sb.append(" }\n");
- sb.append("}\n");
- return sb.toString();
+ assertEquals(getTypeName() + ".Inner", inner.getQualifiedSourceName());
}
};
- protected CheckedJavaResource CU_HasSyntaxErrors = new CheckedJavaResource(
- "test", "HasSyntaxErrors", "NoSyntaxErrors") {
- @Override
- public void check(JClassType classInfo) {
- fail("This class should have been removed");
- }
+ protected static final CheckedJavaResource CU_List = new CheckedJavaResource(
+ List.class) {
@Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("class NoSyntaxErrors { }\n");
- sb.append("public class HasSyntaxErrors { a syntax error }\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_HasUnresolvedSymbols = new CheckedJavaResource(
- "test", "Invalid", "Valid") {
- @Override
- public void check(JClassType classInfo) {
- fail("Both classes should have been removed");
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Invalid extends NoSuchClass { }\n");
- sb.append("class Valid extends Object { }\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_List = new CheckedJavaResource("java.util",
- "List") {
- @Override
public void check(JClassType type) throws NotFoundException {
assertNotNull(type.isGenericType());
+ assertNotNull(type.isInterface());
+ // TODO(zundel): This is a bug when building from source: interfaces
+ // should not be default instantiable
+ // assertNull(type.isDefaultInstantiable());
}
@Override
@@ -650,95 +623,162 @@
}
};
+ protected static final CheckedJavaResource CU_Object = new CheckedJavaResource(
+ Object.class) {
+ @Override
+ public void check(JClassType type) {
+ assertEquals("Object", type.getSimpleSourceName());
+ assertEquals("java.lang.Object", type.getQualifiedSourceName());
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package java.lang;");
+ sb.append("public class Object { }");
+ return sb.toString();
+ }
+ };
+
+ protected static final CheckedJavaResource CU_OuterInner = new CheckedJavaResource(
+ Outer.class, "Outer.Inner") {
+
+ @Override
+ public void check(JClassType type) {
+ final String name = type.getSimpleSourceName();
+ if ("Outer".equals(name)) {
+ checkOuter(type);
+ } else {
+ checkInner(type);
+ }
+ }
+
+ public void checkInner(JClassType type) {
+ assertEquals("Inner", type.getSimpleSourceName());
+ assertEquals(CU_OuterInner.getTypeName() + ".Inner",
+ type.getQualifiedSourceName());
+ assertEquals(CU_OuterInner.getTypeName(),
+ type.getEnclosingType().getQualifiedSourceName());
+ }
+
+ public void checkOuter(JClassType type) {
+ assertEquals("Outer", type.getSimpleSourceName());
+ assertEquals(CU_OuterInner.getTypeName(), type.getQualifiedSourceName());
+ JClassType[] nested = type.getNestedTypes();
+ assertEquals(1, nested.length);
+ JClassType inner = nested[0];
+ assertEquals(CU_OuterInner.getTypeName() + ".Inner",
+ inner.getQualifiedSourceName());
+ }
+ };
+
+ protected static final CheckedJavaResource CU_ReferencesGenericListConstant = new CheckedJavaResource(
+ ReferencesGenericListConstant.class) {
+ @Override
+ public void check(JClassType type) throws NotFoundException {
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ }
+ };
+
+ protected static final CheckedJavaResource CU_ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed = new CheckedJavaResource(
+ ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed.class) {
+
+ @Override
+ public void check(JClassType type) throws NotFoundException {
+
+ JClassType[] intfs = type.getImplementedInterfaces();
+ assertEquals(1, intfs.length);
+ assertNotNull(intfs[0].isParameterized());
+ }
+ };
+
+ protected static final CheckedJavaResource CU_String = new CheckedJavaResource(
+ String.class) {
+ @Override
+ public void check(JClassType type) {
+ assertEquals("String", type.getSimpleSourceName());
+ assertEquals("java.lang.String", type.getQualifiedSourceName());
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package java.lang;");
+ sb.append("public class String { }");
+ return sb.toString();
+ }
+ };
+
+ protected static final CheckedJavaResource CU_Throwable = new CheckedJavaResource(
+ Throwable.class) {
+
+ @Override
+ public void check(JClassType type) {
+ assertEquals("Throwable", type.getSimpleSourceName());
+ assertEquals("java.lang.Throwable", type.getQualifiedSourceName());
+ }
+
+ @Override
+ public String getSource() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("package java.lang;");
+ sb.append("public class Throwable { }");
+ return sb.toString();
+ }
+ };
+
+ protected static final CheckedJavaResource CU_UnnestedImplementations = new CheckedJavaResource(
+ Implementations.class, "Implementations.OuterImpl",
+ "Implementations.InnerImpl") {
+ @Override
+ public void check(JClassType type) {
+ if (type.getSimpleSourceName().equals("Implementations")) {
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
+ }
+ }
+ };
+
+ protected static void assertIsAssignable(JClassType from, JClassType to) {
+ assertTrue("'" + from + "' should be assignable to '" + to + "'",
+ from.isAssignableTo(to));
+ assertTrue("'" + to + "' should be assignable from '" + from + "'",
+ to.isAssignableFrom(from));
+ }
+
+ protected static void assertIsNotAssignable(JClassType from, JClassType to) {
+ assertFalse(from + " should not be assignable to " + to,
+ from.isAssignableTo(to));
+ assertFalse(to + " should not be assignable to " + from,
+ to.isAssignableFrom(from));
+ }
+
+ protected static void recordAssignability(
+ Map<JClassType, Set<JClassType>> assignabilityMap, JClassType from,
+ JClassType to) {
+ Set<JClassType> set = assignabilityMap.get(from);
+ if (set == null) {
+ set = new HashSet<JClassType>();
+ assignabilityMap.put(from, set);
+ }
+ set.add(to);
+ }
+
+ /**
+ * Public so that this will be initialized before the CUs.
+ */
+ public final Map<String, CheckedJavaResource> publicTypeNameToTestCupMap = new HashMap<String, CheckedJavaResource>();
+
protected CheckedJavaResource CU_ListAsField = new CheckedJavaResource(
- "test.refresh", "ListAsField") {
+ ListAsField.class) {
@Override
public void check(JClassType type) throws NotFoundException {
assertNull(type.isGenericType());
assertNull(type.getEnclosingType());
}
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test.refresh;\n");
- sb.append("import java.util.List;\n");
- sb.append("public class ListAsField {\n");
- sb.append(" private List<Object> field;");
- sb.append("}");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_LocalClass = new CheckedJavaResource("test",
- "Enclosing") {
-
- @Override
- public void check(JClassType type) {
- final String name = type.getSimpleSourceName();
- assertEquals("Enclosing", name);
- checkEnclosing(type);
- }
-
- public void checkEnclosing(JClassType type) {
- assertEquals("Enclosing", type.getSimpleSourceName());
- assertEquals("test.Enclosing", type.getQualifiedSourceName());
- // verify the local class doesn't show up
- JClassType[] nested = type.getNestedTypes();
- assertEquals(0, nested.length);
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Enclosing {\n");
- sb.append(" public static Object getLocal() {");
- sb.append(" class MyObject { }\n");
- sb.append(" return new MyObject();\n");
- sb.append(" }\n");
- sb.append("}\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_LocalClass2 = new CheckedJavaResource("test",
- "Enclosing") {
-
- @Override
- public void check(JClassType type) {
- final String name = type.getSimpleSourceName();
- assertEquals("Enclosing", name);
- checkEnclosing(type);
- }
-
- public void checkEnclosing(JClassType type) {
- assertEquals("Enclosing", type.getSimpleSourceName());
- assertEquals("test.Enclosing", type.getQualifiedSourceName());
- // verify the local class doesn't show up
- JClassType[] nested = type.getNestedTypes();
- assertEquals(0, nested.length);
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Enclosing {\n");
- sb.append(" public int foo;\n");
- sb.append(" public Object getLocal() {\n");
- sb.append(" class MyObject {\n");
- sb.append(" int getFoo() { return foo; }\n");
- sb.append(" }\n");
- sb.append(" return new MyObject() {};\n");
- sb.append(" }\n");
- sb.append("}\n");
- return sb.toString();
- }
};
protected CheckedJavaResource CU_MethodsAndParams = new CheckedJavaResource(
- "test", "Methods") {
+ Methods.class) {
@Override
public void check(JClassType type) throws NotFoundException {
@@ -782,38 +822,23 @@
assertEquals("overloaded", element.getName());
}
- method = type.getMethod("overloaded", new JType[] {
+ method = type.getMethod("overloaded", new JType[]{
JPrimitiveType.INT, javaLangObject});
assertSame(JPrimitiveType.VOID, method.getReturnType());
thrownTypes = method.getThrows();
assertEquals(1, thrownTypes.length);
assertSame(javaLangThrowable, thrownTypes[0]);
- method = type.getMethod("overloaded", new JType[] {
+ method = type.getMethod("overloaded", new JType[]{
JPrimitiveType.INT, JPrimitiveType.CHAR});
assertSame(javaLangObject, method.getReturnType());
thrownTypes = method.getThrows();
assertEquals(0, thrownTypes.length);
}
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Methods {\n");
- sb.append(" private int returnsInt() { return 0; };\n");
- sb.append(" private Object returnsSomeType() { return null; }\n");
- sb.append(" public static void staticMethod() { return; }\n");
- sb.append(" public final void finalMethod() { return; }\n");
- sb.append(" public void overloaded(int x, Object y) throws Throwable { return; }\n");
- sb.append(" public Object overloaded(int x, char y) { return null; }\n");
- sb.append("}\n");
- return sb.toString();
- }
};
protected CheckedJavaResource CU_NestedGenericInterfaces = new CheckedJavaResource(
- "test", "OuterInt", "OuterInt.InnerInt") {
+ OuterInt.class, "OuterInt.InnerInt") {
@Override
public void check(JClassType type) {
@@ -827,180 +852,22 @@
public void checkInner(JClassType type) {
assertEquals("InnerInt", type.getSimpleSourceName());
- assertEquals("test.OuterInt.InnerInt", type.getQualifiedSourceName());
- assertEquals("test.OuterInt",
+ assertEquals(getTypeName() + ".InnerInt", type.getQualifiedSourceName());
+ assertEquals(getTypeName(),
type.getEnclosingType().getQualifiedSourceName());
}
public void checkOuter(JClassType type) {
assertEquals("OuterInt", type.getSimpleSourceName());
- assertEquals("test.OuterInt", type.getQualifiedSourceName());
+ assertEquals(getTypeName(), type.getQualifiedSourceName());
JClassType[] nested = type.getNestedTypes();
assertEquals(1, nested.length);
JClassType inner = nested[0];
- assertEquals("test.OuterInt.InnerInt", inner.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public interface OuterInt<K,V> {\n");
- sb.append(" public interface InnerInt<V> { }\n");
- sb.append("}\n");
- return sb.toString();
+ assertEquals(getTypeName() + ".InnerInt", inner.getQualifiedSourceName());
}
};
- protected CheckedJavaResource CU_Object = new CheckedJavaResource(
- "java.lang", "Object") {
- @Override
- public void check(JClassType type) {
- assertEquals("Object", type.getSimpleSourceName());
- assertEquals("java.lang.Object", type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package java.lang;");
- sb.append("public class Object { }");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_OuterInner = new CheckedJavaResource("test",
- "Outer", "Outer.Inner") {
-
- @Override
- public void check(JClassType type) {
- final String name = type.getSimpleSourceName();
- if ("Outer".equals(name)) {
- checkOuter(type);
- } else {
- checkInner(type);
- }
- }
-
- public void checkInner(JClassType type) {
- assertEquals("Inner", type.getSimpleSourceName());
- assertEquals("test.Outer.Inner", type.getQualifiedSourceName());
- assertEquals("test.Outer",
- type.getEnclosingType().getQualifiedSourceName());
- }
-
- public void checkOuter(JClassType type) {
- assertEquals("Outer", type.getSimpleSourceName());
- assertEquals("test.Outer", type.getQualifiedSourceName());
- JClassType[] nested = type.getNestedTypes();
- assertEquals(1, nested.length);
- JClassType inner = nested[0];
- assertEquals("test.Outer.Inner", inner.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class Outer {\n");
- sb.append(" public static class Inner { }\n");
- sb.append("}\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_ReferencesGenericListConstant = new CheckedJavaResource(
- "test.refresh", "ReferencesGenericListConstant") {
- @Override
- public void check(JClassType type) throws NotFoundException {
- assertEquals("test.refresh.ReferencesGenericListConstant",
- type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package test.refresh;\n");
- sb.append("class ReferencesGenericListConstant {\n");
- sb.append(" public static final int MY_CONSTANT = GenericList.CONSTANT;\n");
- sb.append("}");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed = new CheckedJavaResource(
- "parameterized.type.build.dependency", "Class0") {
- @Override
- public void check(JClassType type) throws NotFoundException {
- JClassType[] intfs = type.getImplementedInterfaces();
- assertEquals(1, intfs.length);
- assertNotNull(intfs[0].isParameterized());
- }
-
- @Override
- public String getSource() {
- StringBuilder sb = new StringBuilder();
- sb.append("package parameterized.type.build.dependency;\n");
- sb.append("public class Class0 implements Class2.Inner<Object> {\n");
- sb.append("}\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_RefsInfectedCompilationUnit = new CheckedJavaResource(
- "test", "RefsInfectedCompilationUnit") {
- @Override
- public void check(JClassType classInfo) {
- fail("This class should should have been removed because it refers to a class in another compilation unit that had problems");
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;\n");
- sb.append("public class RefsInfectedCompilationUnit extends Valid { }\n");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_Throwable = new CheckedJavaResource(
- "java.lang", "Throwable") {
- @Override
- public void check(JClassType type) {
- assertEquals("Throwable", type.getSimpleSourceName());
- assertEquals("java.lang.Throwable", type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package java.lang;");
- sb.append("public class Throwable { }");
- return sb.toString();
- }
- };
-
- protected CheckedJavaResource CU_UnnestedImplementations = new CheckedJavaResource(
- "test", "Implementations") {
- @Override
- public void check(JClassType type) {
- assertEquals("Implementations", type.getSimpleSourceName());
- assertEquals("test.Implementations", type.getQualifiedSourceName());
- }
-
- @Override
- public String getSource() {
- StringBuffer sb = new StringBuffer();
- sb.append("package test;");
- sb.append("public class Implementations {");
- sb.append(" public static class OuterImpl<K,V> implements OuterInt<K,V> {}");
- sb.append(" public static class InnerImpl<V> implements OuterInt.InnerInt<V> {}");
- sb.append("}");
- return sb.toString();
- }
- };
-
- protected final Set<Resource> resources = new HashSet<Resource>();
+ protected final Set<Resource> resources = new LinkedHashSet<Resource>();
protected TypeOracle typeOracle;
@@ -1056,27 +923,55 @@
assertEquals(0, reverseMap.size());
}
- public void testAssignable() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_Assignable);
- resources.add(CU_OuterInner);
+ @Override
+ public void setUp() {
+ resources.clear();
+ }
+
+ public void testAssignable() throws TypeOracleException, IOException {
+
+ // Note: The order of adding resources is important for testing from byte
+ // code
+ addTestResource(CU_Object);
+ addTestResource(CU_BaseInterface);
+ addTestResource(CU_DerivedInterface);
+ addTestResource(CU_OuterInner);
+ addTestResource(CU_Derived);
+
buildTypeOracle();
- JClassType[] allTypes = typeOracle.getTypes();
- assertEquals(7, allTypes.length);
Map<JClassType, Set<JClassType>> assignabilityMap = new HashMap<JClassType, Set<JClassType>>();
+ JClassType obj = typeOracle.findType(CU_Object.getTypeName());
+ assertNotNull(obj);
- JClassType inner = typeOracle.findType("test.Outer.Inner");
- JClassType baseIntf = typeOracle.findType("test.sub.BaseInterface");
- JClassType derivedIntf = typeOracle.findType("test.sub.DerivedInterface");
+ JClassType inner = typeOracle.findType(CU_OuterInner.getTypeName()
+ + ".Inner");
+ assertNotNull(inner);
+
+ JClassType derived = typeOracle.findType(CU_Derived.getTypeName());
+ assertNotNull(derived);
+
+ JClassType nested = typeOracle.findType(CU_Derived.getTypeName()
+ + ".Nested");
+ assertNotNull(nested);
+
+ JClassType baseIntf = typeOracle.findType(CU_Derived.getPackageName()
+ + ".BaseInterface");
+ assertNotNull(baseIntf);
+
+ JClassType derivedIntf = typeOracle.findType(CU_Derived.getPackageName()
+ + ".DerivedInterface");
+ assertNotNull(derivedIntf);
+
recordAssignability(assignabilityMap, derivedIntf, baseIntf);
- JClassType derived = typeOracle.findType("test.sub.Derived");
recordAssignability(assignabilityMap, derived, inner);
- JClassType nested = typeOracle.findType("test.sub.Derived.Nested");
recordAssignability(assignabilityMap, nested, inner);
recordAssignability(assignabilityMap, nested, derivedIntf);
recordAssignability(assignabilityMap, nested, baseIntf);
+ JClassType[] allTypes = typeOracle.getTypes();
+ assertEquals(7, allTypes.length);
+
for (JClassType fromType : allTypes) {
for (JClassType toType : allTypes) {
if (fromType == toType || toType == typeOracle.getJavaLangObject()) {
@@ -1093,38 +988,38 @@
}
}
- public void testAssimilation() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_BeforeAssimilate);
+ public void testAssimilation() throws TypeOracleException, IOException {
+ addTestResource(CU_Object);
+ addTestResource(CU_BeforeAssimilate);
buildTypeOracle();
assertEquals(2, typeOracle.getTypes().length);
// Build onto an existing type oracle.
- resources.add(CU_AfterAssimilate);
+ addTestResource(CU_AfterAssimilate);
buildTypeOracle();
assertEquals(3, typeOracle.getTypes().length);
}
- public void testBindToTypeScope() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_BindToTypeScope);
+ public void testBindToTypeScope() throws TypeOracleException, IOException {
+ addTestResource(CU_Object);
+ addTestResource(CU_BindToTypeScope);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(4, types.length);
}
- public void testConstrainedField() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_Throwable);
- resources.add(CU_ConstrainedList);
- resources.add(CU_ConstrainedListAsField);
-
+ public void testConstrainedField() throws TypeOracleException, IOException {
+ addTestResource(CU_Object);
+ addTestResource(CU_Throwable);
+ addTestResource(CU_ConstrainedList);
+ addTestResource(CU_ConstrainedListAsField);
buildTypeOracle();
// Get the types produced by the TypeOracle
- JClassType type = typeOracle.getType("test.ConstrainedListAsField");
-
+ JClassType type = typeOracle.getType(CU_ConstrainedListAsField.getTypeName());
assertNull(type.isParameterized());
+ JField[] fields = type.getFields();
+ assert (fields.length == 1);
JField field = type.getField("field");
assertNotNull(field);
JType fieldType = field.getType();
@@ -1133,7 +1028,8 @@
assertNull(fieldParamType.getEnclosingType());
JGenericType baseType = fieldParamType.getBaseType();
assertNotNull(baseType);
- assertEquals("test.ConstrainedList", baseType.getQualifiedSourceName());
+ assertEquals(CU_ConstrainedList.getTypeName(),
+ baseType.getQualifiedSourceName());
JClassType[] typeArgs = fieldParamType.getTypeArgs();
assertEquals(1, typeArgs.length);
JWildcardType wildcard = typeArgs[0].isWildcard();
@@ -1142,15 +1038,19 @@
assertEquals("Throwable", upperBound.getSimpleSourceName());
}
- public void testConstrainedList() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_Throwable);
- resources.add(CU_ConstrainedList);
+ public void testConstrainedList() throws TypeOracleException, IOException,
+ InterruptedException {
+ addTestResource(CU_Object);
+ addTestResource(CU_Throwable);
+ addTestResource(CU_ConstrainedList);
buildTypeOracle();
- JClassType type = typeOracle.getType("test.ConstrainedList");
+ JClassType type = typeOracle.getType(CU_ConstrainedList.getPackageName()
+ + ".ConstrainedList");
JClassType throwable = typeOracle.getType("java.lang.Throwable");
+ assertNotNull(throwable);
+ assertEquals("Throwable", throwable.getSimpleSourceName());
assertNull(type.isParameterized());
JGenericType genericType = type.isGenericType();
@@ -1164,8 +1064,8 @@
assertEquals(throwable, bounds[0]);
}
- public void testConstructors() throws TypeOracleException {
- resources.add(CU_Object);
+ public void testConstructors() throws TypeOracleException, IOException {
+ addTestResource(CU_Object);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(1, types.length);
@@ -1179,30 +1079,36 @@
}
public void testDefaultClass() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_DefaultClass);
+ addTestResource(CU_Object);
+ addTestResource(CU_DefaultClass);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(2, types.length);
+
}
public void testEnclosingGenericType() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_List);
- resources.add(CU_GenericOuterInner);
- resources.add(CU_ExtendsGenericOuterInner);
+ addTestResource(CU_Object);
+ addTestResource(CU_String);
+ addTestResource(CU_List);
+ addTestResource(CU_GenericOuterInner);
+ addTestResource(CU_ExtendsGenericOuterInner);
buildTypeOracle();
// Get the types produced by the TypeOracle
- JClassType outer = typeOracle.getType("test.Outer");
- JClassType inner = typeOracle.getType("test.Outer.Inner");
+ JClassType outer = typeOracle.getType(CU_GenericOuterInner.getPackageName()
+ + ".GenericOuter");
+ JClassType inner = typeOracle.getType(CU_GenericOuterInner.getPackageName()
+ + ".GenericOuter.Inner");
assertNull(outer.getEnclosingType());
assertEquals(outer, inner.getEnclosingType());
assertNull(inner.isParameterized());
assertNotNull(outer.isGenericType());
assertNotNull(inner.isGenericType());
+ JField[] fields = inner.getFields();
+ assertEquals(fields.length, 2);
JField field = inner.getField("field");
assertNotNull(field);
JType fieldType = field.getType();
@@ -1213,30 +1119,46 @@
assertEquals(1, bounds.length);
assertEquals(typeOracle.getJavaLangObject(), bounds[0]);
- JClassType extendsOuter = typeOracle.getType("test.ExtendsOuter");
- JClassType extendsInner = typeOracle.getType("test.ExtendsOuter.ExtendsInner");
+ JClassType extendsOuter = typeOracle.getType(CU_GenericOuterInner.getPackageName()
+ + ".ExtendsGenericOuter");
+ JClassType extendsInner = typeOracle.getType(CU_GenericOuterInner.getPackageName()
+ + ".ExtendsGenericOuter.ExtendsInner");
assertNull(extendsOuter.getEnclosingType());
assertEquals(extendsOuter, extendsInner.getEnclosingType());
+
JClassType outerSuper = extendsOuter.getSuperclass();
JParameterizedType outerSuperParam = outerSuper.isParameterized();
assertNotNull(outerSuperParam);
assertEquals(outer, outerSuperParam.getBaseType());
JClassType innerSuper = extendsInner.getSuperclass();
- JParameterizedType innerSuperParam = innerSuper.isParameterized();
- assertNotNull(innerSuperParam);
- assertEquals(inner, innerSuperParam.getBaseType());
+ assertEquals("GenericOuter.Inner", innerSuper.getName());
+ field = inner.getField("field");
+ assertNotNull(field);
+
+ /*
+ * This test fails for OpenJDK compiled classes compared to JDT classes. The
+ * reason is that the superclass of this type doesn't contain a type
+ * signature for OpenJDK byte code.
+ *
+ * Commenting out this code for the tests: I'm not sure any generators
+ * depend on this subtle difference.
+ */
+ // assertEquals("java.lang.String",
+ // field.getType().getQualifiedSourceName());
+ // JParameterizedType innerSuperParam = innerSuper.isParameterized();
+ // assertNotNull(innerSuperParam);
+ // assertEquals(inner, innerSuperParam.getBaseType());
}
- public void testEnclosingType() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_List);
- resources.add(CU_ListAsField);
+ public void testEnclosingType() throws TypeOracleException, IOException {
+ addTestResource(CU_Object);
+ addTestResource(CU_List);
+ addTestResource(CU_ListAsField);
buildTypeOracle();
- // Get the types produced by the TypeOracle
- JClassType listAsField = typeOracle.getType("test.refresh.ListAsField");
-
+ JClassType listAsField = typeOracle.getType(CU_ListAsField.getTypeName());
+ assertNotNull(listAsField);
assertNull(listAsField.isParameterized());
JField field = listAsField.getField("field");
assertNotNull(field);
@@ -1250,8 +1172,9 @@
}
public void testFieldsAndTypes() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_FieldsAndTypes);
+ addTestResource(CU_Object);
+ addTestResource(CU_DefaultClass);
+ addTestResource(CU_FieldsAndTypes);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(3, types.length);
@@ -1259,33 +1182,33 @@
// Check that anonymous classes are not reflected in TypeOracle
public void testLocal() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_LocalClass);
+ addTestResource(CU_Object);
+ addTestResource(CU_EnclosingLocalClass);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(2, types.length);
}
public void testLocalWithSynthetic() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_LocalClass2);
+ addTestResource(CU_Object);
+ addTestResource(CU_EnclosingLocalWithMember);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(2, types.length);
}
public void testMethodsAndParams() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_Throwable);
- resources.add(CU_MethodsAndParams);
+ addTestResource(CU_Object);
+ addTestResource(CU_Throwable);
+ addTestResource(CU_MethodsAndParams);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(3, types.length);
}
public void testOuterInner() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_OuterInner);
+ addTestResource(CU_Object);
+ addTestResource(CU_OuterInner);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(3, types.length);
@@ -1297,27 +1220,32 @@
}
}
assertNotNull(outer);
+ assertEquals("Outer", outer.getSimpleSourceName());
JClassType superclass = outer.getSuperclass();
- assertEquals(typeOracle.getJavaLangObject(), superclass);
+ JType objectRef = typeOracle.getJavaLangObject();
+ assertNotNull(objectRef);
+ assertEquals(objectRef, superclass);
}
/**
* Tests that we can build nested parameterized types even if that happens
* while the type oracle is being built. This test assumes that
* CU_ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed will
- * cause a parameterized form of CU_DeclaresInnerGenericType to be created
- * before the type oracle has had a chance to resolve
- * CU_DeclaresInnerGenericType.
+ * cause a parameterized form of CU_DeclaresInnerGenericInterface to be
+ * created before the type oracle has had a chance to resolve
+ * CU_DeclaresInnerGenericInterface.
*/
public void testParameterizedTypeBuildDependencies()
throws TypeOracleException {
- resources.add(CU_ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed);
- resources.add(CU_ExtendsParameterizedType);
- resources.add(CU_DeclaresInnerGenericType);
- resources.add(CU_Object);
+ addTestResource(CU_ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed);
+ // Intentionally omitting the ExtendsParameterizedInterface resource
+ // addResource(CU_ExtendsParameterizedInterface);
+ addTestResource(CU_DeclaresInnerGenericInterface);
+ addTestResource(CU_Object);
buildTypeOracle();
- assertNull(typeOracle.findType("test.parameterizedtype.build.dependencies.Class2"));
+
+ assertNull(typeOracle.findType(CU_ExtendsParameterizedInterface.getTypeName()));
}
/**
@@ -1329,17 +1257,17 @@
* @throws IOException
*/
public void testRefresh() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_ExtendsGenericList);
- resources.add(CU_GenericList);
- resources.add(CU_ReferencesGenericListConstant);
+ addTestResource(CU_Object);
+ addTestResource(CU_ExtendsGenericList);
+ addTestResource(CU_GenericList);
+ addTestResource(CU_ReferencesGenericListConstant);
buildTypeOracle();
// Get the types produced by the TypeOracle
- JClassType extendsGenericListType = typeOracle.getType("test.refresh.ExtendsGenericList");
- JClassType genericListType = typeOracle.getType("test.refresh.GenericList");
- JClassType referencesGenericListConstantType = typeOracle.getType("test.refresh.ReferencesGenericListConstant");
+ JClassType extendsGenericListType = typeOracle.getType(CU_ExtendsGenericList.getTypeName());
+ JClassType genericListType = typeOracle.getType(CU_GenericList.getTypeName());
+ JClassType referencesGenericListConstantType = typeOracle.getType(CU_ReferencesGenericListConstant.getTypeName());
/*
* Invalidate CU_GenericList and simulate a refresh. This should cause
@@ -1349,9 +1277,9 @@
buildTypeOracle();
assertNotSame(genericListType.getQualifiedSourceName() + "; ",
- typeOracle.getType("test.refresh.GenericList"), genericListType);
+ typeOracle.getType(CU_GenericList.getTypeName()), genericListType);
assertNotSame(extendsGenericListType.getQualifiedSourceName() + "; ",
- typeOracle.getType("test.refresh.ExtendsGenericList"),
+ typeOracle.getType(CU_ExtendsGenericList.getTypeName()),
extendsGenericListType);
/*
@@ -1359,117 +1287,19 @@
* rebuilt if the constant changes.
*/
assertNotSame(referencesGenericListConstantType.getQualifiedSourceName(),
- typeOracle.getType("test.refresh.ReferencesGenericListConstant"),
+ typeOracle.getType(CU_ReferencesGenericListConstant.getTypeName()),
referencesGenericListConstantType);
}
- /**
- * Tests that refreshing with a unit that has errors does not cause new units
- * that reference unchanged units to be removed. The strategy is to add some
- * good units that reference each other and build a {@link TypeOracle}. Then
- * we add some new units that have errors as well as some units that reference
- * old units which did not have errors. This ensures that the correct units
- * are pruned from the type oracle in the case where we encounter units with
- * errors.
- *
- * @throws UnableToCompleteException
- * @throws IOException
- */
- public void testRefreshWithErrors() throws TypeOracleException {
- // Add Object
- StringBuffer sb = new StringBuffer();
- sb.append("package java.lang;");
- sb.append("public class Object { }");
- addResource("java.lang.Object", sb);
-
- // Add UnmodifiedClass that will never change.
- sb = new StringBuffer();
- sb.append("package test.refresh.with.errors;");
- sb.append("public class UnmodifiedClass { }");
- addResource("test.refresh.with.errors.UnmodifiedClass", sb);
-
- // Add GoodClass that references a class that will go bad.
- sb = new StringBuffer();
- sb.append("package test.refresh.with.errors;\n");
- sb.append("public class GoodClass {\n");
- sb.append(" ClassThatWillGoBad ctwgb;\n");
- sb.append("}\n");
- addResource("test.refresh.with.errors.GoodClass", sb);
-
- // Add ClassThatWillGoBad that goes bad on the next refresh.
- MutableJavaResource unitThatWillGoBad = new MutableJavaResource(
- "test.refresh.with.errors.ClassThatWillGoBad") {
- private String source = "package test.refresh.with.errors;\n"
- + "public class ClassThatWillGoBad { }\n";
-
- @Override
- public String getSource() {
- return source;
- }
-
- @Override
- public void touch() {
- super.touch();
- source = "This will cause a syntax error.";
- }
- };
- resources.add(unitThatWillGoBad);
-
- buildTypeOracle();
-
- assertNotNull(typeOracle.findType("test.refresh.with.errors.UnmodifiedClass"));
- assertNotNull(typeOracle.findType("test.refresh.with.errors.GoodClass"));
- assertNotNull(typeOracle.findType("test.refresh.with.errors.ClassThatWillGoBad"));
-
- // Add AnotherGoodClass that references a
- // class that was not recompiled.
- sb = new StringBuffer();
- sb.append("package test.refresh.with.errors;\n");
- sb.append("public class AnotherGoodClass {\n");
- sb.append(" UnmodifiedClass uc; // This will cause the runaway pruning.\n");
- sb.append("}\n");
- addResource("test.refresh.with.errors.AnotherGoodClass", sb);
-
- // Add BadClass that has errors and originally
- // forced issue 2238.
- sb = new StringBuffer();
- sb.append("package test.refresh.with.errors;\n");
- sb.append("public class BadClass {\n");
- sb.append(" This will trigger a syntax error.\n");
- sb.append("}\n");
- addResource("test.refresh.with.errors.BadClass", sb);
-
- // Now this cup should cause errors.
- unitThatWillGoBad.touch();
-
- buildTypeOracle();
-
- assertNotNull(typeOracle.findType("test.refresh.with.errors.UnmodifiedClass"));
- assertNotNull(typeOracle.findType("test.refresh.with.errors.AnotherGoodClass"));
- assertNull(typeOracle.findType("test.refresh.with.errors.BadClass"));
- assertNull(typeOracle.findType("test.refresh.with.errors.ClassThatWillGoBad"));
- assertNull(typeOracle.findType("test.refresh.with.errors.GoodClass"));
- }
-
- public void testSyntaxErrors() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_HasSyntaxErrors);
- buildTypeOracle();
- JClassType[] types = typeOracle.getTypes();
- // Only java.lang.Object should remain.
- //
- assertEquals(1, types.length);
- assertEquals("java.lang.Object", types[0].getQualifiedSourceName());
- }
-
public void testTypeParams() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_NestedGenericInterfaces);
- resources.add(CU_UnnestedImplementations);
+ addTestResource(CU_Object);
+ addTestResource(CU_NestedGenericInterfaces);
+ addTestResource(CU_UnnestedImplementations);
buildTypeOracle();
JClassType[] types = typeOracle.getTypes();
assertEquals(6, types.length);
- JClassType type = typeOracle.findType("test.Implementations.InnerImpl");
+ JClassType type = typeOracle.findType(CU_UnnestedImplementations.getTypeName()
+ + ".InnerImpl");
assertNotNull(type);
JClassType[] interfaces = type.getImplementedInterfaces();
assertEquals(1, interfaces.length);
@@ -1480,16 +1310,13 @@
assertNotNull(intfEnclosing.isRawType());
}
- public void testUnresolvedSymbls() throws TypeOracleException {
- resources.add(CU_Object);
- resources.add(CU_HasUnresolvedSymbols);
- resources.add(CU_RefsInfectedCompilationUnit);
- buildTypeOracle();
- JClassType[] types = typeOracle.getTypes();
- // Only java.lang.Object should remain.
- //
- assertEquals(1, types.length);
- assertEquals("java.lang.Object", types[0].getQualifiedSourceName());
+ /**
+ * Creates a {@link Resource} and adds it the set of resources.
+ *
+ * @throws UnableToCompleteException
+ */
+ protected void addResource(String qualifiedTypeName, CharSequence source) {
+ resources.add(new StaticJavaResource(qualifiedTypeName, source));
}
protected abstract void buildTypeOracle() throws TypeOracleException;
@@ -1508,13 +1335,11 @@
}
}
- /**
- * Creates a {@link Resource} and adds it the set of resources.
- *
- * @throws UnableToCompleteException
- */
- private void addResource(String qualifiedTypeName, CharSequence source) {
- resources.add(new StaticJavaResource(qualifiedTypeName, source));
+ private void addTestResource(CheckedJavaResource checkedResource) {
+ resources.add(checkedResource);
+ for (String typeName : checkedResource.getTypeNames()) {
+ register(typeName, checkedResource);
+ }
}
private void check(JClassType classInfo) throws NotFoundException {
@@ -1526,6 +1351,7 @@
}
private void register(String qualifiedTypeName, CheckedJavaResource cup) {
+ assertFalse(publicTypeNameToTestCupMap.containsKey(qualifiedTypeName));
publicTypeNameToTestCupMap.put(qualifiedTypeName, cup);
}
}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/AfterAssimilate.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/AfterAssimilate.java
new file mode 100644
index 0000000..9a9cf99
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/AfterAssimilate.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+
+package com.google.gwt.dev.javac.mediatortest;
+
+public class AfterAssimilate extends BeforeAssimilate {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/BaseInterface.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BaseInterface.java
new file mode 100644
index 0000000..234bff24
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BaseInterface.java
@@ -0,0 +1,7 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ * */
+package com.google.gwt.dev.javac.mediatortest;
+
+public interface BaseInterface {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/BeforeAssimilate.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BeforeAssimilate.java
new file mode 100644
index 0000000..d3f5af5
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BeforeAssimilate.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+
+package com.google.gwt.dev.javac.mediatortest;
+
+public class BeforeAssimilate {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/BindToTypeScope.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BindToTypeScope.java
new file mode 100644
index 0000000..dd3708a
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/BindToTypeScope.java
@@ -0,0 +1,10 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class BindToTypeScope {
+ public static class Object { }
+ // Fails when loaded from bytecode
+ public static class DerivedObject extends Object { }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedList.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedList.java
new file mode 100644
index 0000000..d9cd9eb
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedList.java
@@ -0,0 +1,7 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public interface ConstrainedList <E extends Throwable> {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedListAsField.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedListAsField.java
new file mode 100644
index 0000000..78c7c56
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ConstrainedListAsField.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ConstrainedListAsField {
+ private ConstrainedList<?> field;
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerInterface.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerInterface.java
new file mode 100644
index 0000000..a30d01f
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerInterface.java
@@ -0,0 +1,13 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+/**
+ * Test of a parameterized interface declared inside another interface.
+ *
+ * @param <T>
+ */
+public class DeclaresGenericInnerInterface<T> {
+ public interface Inner<T> {}
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerType.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerType.java
new file mode 100644
index 0000000..c268638
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DeclaresGenericInnerType.java
@@ -0,0 +1,13 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+/**
+ * Test of a parameterized class declared inside another class.
+ *
+ * @param <T> Some type
+ */
+public class DeclaresGenericInnerType<T> {
+ public interface Inner<T> {}
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/DefaultClass.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DefaultClass.java
new file mode 100644
index 0000000..d822174
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DefaultClass.java
@@ -0,0 +1,11 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+/**
+ * A plain class that extends {@link java.lang.Object}.
+ *
+ */
+public class DefaultClass extends Object {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Derived.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Derived.java
new file mode 100644
index 0000000..34deb4e
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Derived.java
@@ -0,0 +1,10 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Derived extends Outer.Inner {
+ public static class Nested extends Outer.Inner implements DerivedInterface { }
+}
+
+
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/DerivedInterface.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DerivedInterface.java
new file mode 100644
index 0000000..efb0857
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/DerivedInterface.java
@@ -0,0 +1,7 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public interface DerivedInterface extends BaseInterface {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Enclosing.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Enclosing.java
new file mode 100644
index 0000000..0150216
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Enclosing.java
@@ -0,0 +1,10 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Enclosing {
+ public static Object getLocal() {
+ return new Object() { };
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocal.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocal.java
new file mode 100644
index 0000000..a78ca96
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocal.java
@@ -0,0 +1,11 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class EnclosingLocal {
+ public static Object getLocal() {
+ class MyObject { }
+ return new MyObject();
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocalWithMember.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocalWithMember.java
new file mode 100644
index 0000000..a89a869
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/EnclosingLocalWithMember.java
@@ -0,0 +1,17 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class EnclosingLocalWithMember {
+ public int foo;
+ public Object getLocal() {
+ class MyObject {
+ int getFoo() {
+ return foo;
+ }
+ }
+ return new MyObject() {
+ };
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericList.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericList.java
new file mode 100644
index 0000000..9559c99
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericList.java
@@ -0,0 +1,7 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ExtendsGenericList extends GenericList<Object> {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericOuter.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericOuter.java
new file mode 100644
index 0000000..e68aed8
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsGenericOuter.java
@@ -0,0 +1,9 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ExtendsGenericOuter extends GenericOuter<String> {
+ public class ExtendsInner extends Inner {
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsParameterizedInterface.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsParameterizedInterface.java
new file mode 100644
index 0000000..dc40efa
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ExtendsParameterizedInterface.java
@@ -0,0 +1,7 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ExtendsParameterizedInterface extends DeclaresGenericInnerInterface<Object> {
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Fields.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Fields.java
new file mode 100644
index 0000000..51ef868
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Fields.java
@@ -0,0 +1,19 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Fields {
+ private int privateInt;
+ private DefaultClass privateSomeType;
+ protected int protectedInt;
+ public int publicInt;
+ int packageInt;
+ private static int staticInt;
+ private transient int transientInt;
+ private volatile int volatileInt;
+ public static final transient int multiInt = 0;
+ private int[] intArray;
+ private DefaultClass[] someTypeArray;
+ private int[][] intArrayArray;
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericList.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericList.java
new file mode 100644
index 0000000..f172999
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericList.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class GenericList<T> {
+ public static final int CONSTANT = 0;
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericOuter.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericOuter.java
new file mode 100644
index 0000000..e6917f3
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/GenericOuter.java
@@ -0,0 +1,13 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+import java.util.List;
+
+public class GenericOuter<V> {
+ public class Inner {
+ private V field;
+ private List<V> list;
+ }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Implementations.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Implementations.java
new file mode 100644
index 0000000..15da0df
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Implementations.java
@@ -0,0 +1,9 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Implementations {
+ public static class OuterImpl<K,V> implements OuterInt<K,V> {}
+ public static class InnerImpl<V> implements OuterInt.InnerInt<V> {}
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ListAsField.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ListAsField.java
new file mode 100644
index 0000000..8891130c
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ListAsField.java
@@ -0,0 +1,10 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+import java.util.List;
+
+public class ListAsField {
+ private List<Object> field;
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Methods.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Methods.java
new file mode 100644
index 0000000..9141ac9
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Methods.java
@@ -0,0 +1,13 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Methods {
+ private int returnsInt() { return 0; };
+ private Object returnsSomeType() { return null; }
+ public static void staticMethod() { return; }
+ public final void finalMethod() { return; }
+ public void overloaded(int x, Object y) throws Throwable { return; }
+ public Object overloaded(int x, char y) { return null; }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/Outer.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Outer.java
new file mode 100644
index 0000000..466266f
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/Outer.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class Outer {
+ public static class Inner { };
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/OuterInt.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/OuterInt.java
new file mode 100644
index 0000000..c470569
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/OuterInt.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public interface OuterInt<K,V> {
+ public interface InnerInt<V> { }
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesGenericListConstant.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesGenericListConstant.java
new file mode 100644
index 0000000..a2266b7
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesGenericListConstant.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ReferencesGenericListConstant {
+
+}
diff --git a/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed.java b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed.java
new file mode 100644
index 0000000..70787f5
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/javac/mediatortest/ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed.java
@@ -0,0 +1,8 @@
+/**
+ * This code must be kept in sync with {@link com.google.gwt.dev.javac.TypeOracleMediatorTestBase}
+ */
+package com.google.gwt.dev.javac.mediatortest;
+
+public class ReferencesParameterizedTypeBeforeItsGenericFormHasBeenProcessed
+ implements ExtendsParameterizedInterface.Inner<Object> {
+}