blob: a9d037d7af4450280098967ab5c450e39135b570 [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;
import com.google.gwt.dev.javac.BinaryTypeReferenceRestrictionsChecker.BinaryTypeReferenceSite;
import junit.framework.TestCase;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Expression;
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
import org.eclipse.jdt.internal.compiler.ast.Statement;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
import org.eclipse.jdt.internal.compiler.env.IBinaryField;
import org.eclipse.jdt.internal.compiler.env.IBinaryMethod;
import org.eclipse.jdt.internal.compiler.env.IBinaryNestedType;
import org.eclipse.jdt.internal.compiler.env.IBinaryType;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
import java.io.File;
import java.util.List;
/**
*
*/
public class BinaryTypeReferenceRestrictionsCheckerTest extends TestCase {
/**
* Mocks a binary type
*/
static class MockBinaryType implements IBinaryType {
private final String qualifiedTypeName;
MockBinaryType(String typeName) {
this.qualifiedTypeName = typeName;
}
public IBinaryAnnotation[] getAnnotations() {
return null;
}
public char[] getEnclosingTypeName() {
return null;
}
public IBinaryField[] getFields() {
return null;
}
public char[] getFileName() {
return (qualifiedTypeName.replace('.', File.separatorChar) + ".java").toCharArray();
}
public char[] getGenericSignature() {
return qualifiedTypeName.toCharArray();
}
public char[][] getInterfaceNames() {
return null;
}
public IBinaryNestedType[] getMemberTypes() {
return null;
}
public IBinaryMethod[] getMethods() {
return null;
}
public char[][][] getMissingTypeNames() {
return null;
}
public int getModifiers() {
return 0;
}
public char[] getName() {
return qualifiedTypeName.toCharArray();
}
public char[] getSourceName() {
return null;
}
public char[] getSuperclassName() {
return null;
}
public long getTagBits() {
return 0;
}
public boolean isAnonymous() {
return false;
}
public boolean isBinaryType() {
return true;
}
public boolean isLocal() {
return false;
}
public boolean isMember() {
return false;
}
public char[] sourceFileName() {
return null;
}
}
private static final String BINARY_TYPE_NAME = "BinaryType";
private static TypeReference createMockBinaryTypeReference(
BinaryTypeBinding binaryTypeBinding) {
SingleTypeReference singleTypeReference = new SingleTypeReference(null, 0);
singleTypeReference.resolvedType = binaryTypeBinding;
return singleTypeReference;
}
private static LookupEnvironment createMockLookupEnvironment() {
LookupEnvironment lookupEnvironment = new LookupEnvironment(null, null,
null, null);
lookupEnvironment.globalOptions = new CompilerOptions();
return lookupEnvironment;
}
public void testCheck() {
// fail("Not yet implemented");
}
/**
* Creates a mock {@link CompilationUnitDeclaration} that has binary type
* references in a superclass reference, in a method return type, in an
* annotation and in a local variable declaration. It then checks that the we
* find all of these locations except for the one used in an annotation.
*/
public void testFindAllBinaryTypeReferenceSites() {
CompilationResult compilationResult = new CompilationResult(
"TestCompilationUnit.java".toCharArray(), 0, 0, 0);
CompilationUnitDeclaration cud = new CompilationUnitDeclaration(null,
compilationResult, 1);
LookupEnvironment lookupEnvironment = createMockLookupEnvironment();
cud.scope = new CompilationUnitScope(cud, lookupEnvironment);
TypeDeclaration typeDeclaration = new TypeDeclaration(compilationResult);
typeDeclaration.scope = new ClassScope(cud.scope, null);
typeDeclaration.staticInitializerScope = new MethodScope(
typeDeclaration.scope, null, false);
cud.types = new TypeDeclaration[] {typeDeclaration};
BinaryTypeBinding binaryTypeBinding = new BinaryTypeBinding(null,
new MockBinaryType(BINARY_TYPE_NAME), lookupEnvironment);
typeDeclaration.superclass = createMockBinaryTypeReference(binaryTypeBinding);
MethodDeclaration methodDeclaration = new MethodDeclaration(
compilationResult);
methodDeclaration.scope = new MethodScope(typeDeclaration.scope, null,
false);
methodDeclaration.returnType = createMockBinaryTypeReference(binaryTypeBinding);
LocalDeclaration localDeclaration = new LocalDeclaration(null, 0, 0);
localDeclaration.type = createMockBinaryTypeReference(binaryTypeBinding);
methodDeclaration.statements = new Statement[] {localDeclaration};
SingleMemberAnnotation annotation = new SingleMemberAnnotation(
createMockBinaryTypeReference(binaryTypeBinding), 0);
annotation.memberValue = annotation.type;
typeDeclaration.annotations = new Annotation[] {annotation};
typeDeclaration.methods = new AbstractMethodDeclaration[] {methodDeclaration};
/*
* Check that we find binary type references in the following expected
* locations.
*/
Expression[] expectedExpressions = new Expression[] {
typeDeclaration.superclass, methodDeclaration.returnType,
localDeclaration.type};
List<BinaryTypeReferenceSite> binaryTypeReferenceSites = BinaryTypeReferenceRestrictionsChecker.findAllBinaryTypeReferenceSites(cud);
assertEquals(expectedExpressions.length, binaryTypeReferenceSites.size());
for (int i = 0; i < binaryTypeReferenceSites.size(); ++i) {
BinaryTypeReferenceSite binaryTypeReferenceSite = binaryTypeReferenceSites.get(i);
assertSame(binaryTypeBinding,
binaryTypeReferenceSite.getBinaryTypeBinding());
assertSame(expectedExpressions[i],
binaryTypeReferenceSite.getExpression());
}
}
public void testFormatBinaryTypeRefErrorMessage() {
String expectedMessage = "No source code is available for type MyClass; did you forget to inherit a required module?";
String actualMessage = BinaryTypeReferenceRestrictionsChecker.formatBinaryTypeRefErrorMessage("MyClass");
assertEquals(expectedMessage, actualMessage);
}
}