| /* |
| * 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; |
| } |
| } |