blob: 42bb6f82cb1158611f61fd6628664d6bfa8fa899 [file] [log] [blame]
/*
* Copyright 2009 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.asm;
import com.google.gwt.dev.javac.typemodel.test.TestAnnotation;
import com.google.gwt.dev.asm.ClassReader;
import com.google.gwt.dev.util.Name.BinaryName;
import java.util.Map;
import java.util.Set;
/**
* Tests for {@link CollectClassData}.
*/
public class CollectReferencesVisitorTest extends AsmTestCase {
/**
* This class is empty, but it still has references to itself, its superclass
* (Object), and its enclosing class.
*/
public static class Empty {
}
/**
* In addition to the visible types, this class has references to itself, its
* superclass (Object), and its enclosing class.
*/
public static class Full {
protected Integer i;
protected String s;
@TestAnnotation(value = "foo", classLiteral = Double.class)
public Map<Boolean, String> getMap() {
return null;
}
}
public void testEmpty() {
CollectReferencesVisitor rv = collect(Empty.class);
Set<String> referencedTypes = rv.getReferencedTypes();
assertDoesNotContainNull(referencedTypes);
assertEquals(3, referencedTypes.size());
assertContainsInternalName(Object.class, referencedTypes);
assertContainsInternalName(CollectReferencesVisitorTest.class,
referencedTypes);
assertContainsInternalName(Empty.class, referencedTypes);
}
public void testFull() {
CollectReferencesVisitor rv = collect(Full.class);
Set<String> referencedTypes = rv.getReferencedTypes();
assertDoesNotContainNull(referencedTypes);
assertEquals(7, referencedTypes.size());
assertContainsInternalName(Object.class, referencedTypes);
assertContainsInternalName(CollectReferencesVisitorTest.class,
referencedTypes);
assertContainsInternalName(Full.class, referencedTypes);
assertContainsInternalName(Map.class, referencedTypes);
assertContainsInternalName(Integer.class, referencedTypes);
assertContainsInternalName(String.class, referencedTypes);
assertContainsInternalName(Boolean.class, referencedTypes);
// We no longer collect references from annotations to allow for
// binary-only annotations and nontranslatable things like File mentioned
// in the annotation
// assertContainsInternalName(Double.class, referencedTypes);
// assertContainsInternalName(TestAnnotation.class, referencedTypes);
}
// ASM passes null for Object's superclass, so we make sure we don't
// insert null into the set of referenced types.
public void testObject() {
CollectReferencesVisitor rv = collect(Object.class);
Set<String> referencedTypes = rv.getReferencedTypes();
assertDoesNotContainNull(referencedTypes);
}
private void assertContainsInternalName(Class<?> clazz, Set<String> set) {
String className = BinaryName.toInternalName(clazz.getName());
assertTrue("Should contain " + className, set.contains(className));
}
private void assertDoesNotContainNull(Set<String> referencedTypes) {
assertFalse(referencedTypes.contains(null));
}
private CollectReferencesVisitor collect(Class<?> clazz) {
return collect(clazz.getName());
}
private CollectReferencesVisitor collect(String className) {
byte[] bytes = getClassBytes(className);
assertNotNull("Couldn't load bytes for " + className, bytes);
CollectReferencesVisitor cv = new CollectReferencesVisitor();
ClassReader reader = new ClassReader(bytes);
reader.accept(cv, 0);
return cv;
}
}