Author: [email protected]
Date: Tue Jun 30 17:14:14 2009
New Revision: 5650
Added:
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/AsmTestCase.java
(contents, props changed)
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/CollectClassDataTest.java
(contents, props changed)
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/asm/CollectAnnotationData.java
Log:
Add tests for data-collection ASM visitors.
Modified:
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/asm/CollectAnnotationData.java
==============================================================================
---
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/asm/CollectAnnotationData.java
(original)
+++
changes/jat/ihm/dev/core/src/com/google/gwt/dev/javac/asm/CollectAnnotationData.java
Tue Jun 30 17:14:14 2009
@@ -114,10 +114,23 @@
private Callback<CollectAnnotationData.AnnotationData> callback;
private CollectAnnotationData.AnnotationData annotation;
+ /**
+ * Construct the collector.
+ *
+ * @param desc class descriptor of the annotation class
+ * @param visible true if the annotation is visible at runtime
+ */
public CollectAnnotationData(String desc, boolean visible) {
this(desc, visible, null);
}
+ /**
+ * Construct the collector.
+ *
+ * @param desc class descriptor of the annotation class
+ * @param visible true if the annotation is visible at runtime
+ * @param callback callback to be called when the annotation is finished
+ */
public CollectAnnotationData(String desc, boolean visible,
Callback<CollectAnnotationData.AnnotationData> callback) {
annotation = new AnnotationData(desc, visible);
Added:
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/AsmTestCase.java
==============================================================================
--- (empty file)
+++
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/AsmTestCase.java
Tue Jun 30 17:14:14 2009
@@ -0,0 +1,31 @@
+package com.google.gwt.dev.javac.asm;
+
+import com.google.gwt.dev.util.Util;
+
+import junit.framework.TestCase;
+
+import java.io.InputStream;
+
+public abstract class AsmTestCase extends TestCase {
+
+ private static final ClassLoader CLASSLOADER =
CollectClassDataTest.class.getClassLoader();
+
+ public AsmTestCase() {
+ super();
+ }
+
+ public AsmTestCase(String name) {
+ super(name);
+ }
+
+ protected byte[] getClassBytes(Class<?> clazz) {
+ byte[] bytes;
+ InputStream str = CLASSLOADER.getResourceAsStream(
+ clazz.getName().replace('.', '/') + ".class");
+ if (str == null) {
+ return null;
+ }
+ return Util.readStreamAsBytes(str);
+ }
+
+}
\ No newline at end of file
Added:
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/CollectClassDataTest.java
==============================================================================
--- (empty file)
+++
changes/jat/ihm/dev/core/test/com/google/gwt/dev/javac/asm/CollectClassDataTest.java
Tue Jun 30 17:14:14 2009
@@ -0,0 +1,198 @@
+/*
+ * 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.asm;
+
+import com.google.gwt.core.ext.typeinfo.test.PrimitiveValuesAnnotation;
+import com.google.gwt.core.ext.typeinfo.test.TestAnnotation;
+import com.google.gwt.dev.asm.AnnotationVisitor;
+import com.google.gwt.dev.asm.ClassReader;
+import com.google.gwt.dev.asm.Opcodes;
+import com.google.gwt.dev.asm.Type;
+import com.google.gwt.dev.asm.commons.EmptyVisitor;
+import com.google.gwt.dev.javac.asm.CollectAnnotationData.AnnotationData;
+import com.google.gwt.dev.javac.asm.CollectClassData.ClassType;
+
+
+import java.util.List;
+
+/**
+ * Tests for {...@link CollectClassData}.
+ */
+public class CollectClassDataTest extends AsmTestCase {
+
+ @SuppressWarnings("unused")
+ public static class One extends EmptyVisitor {
+
+ @Override
+ public AnnotationVisitor visitAnnotation(String desc, boolean visible)
{
+ return new CollectAnnotationData(desc, visible);
+ }
+ }
+
+ @PrimitiveValuesAnnotation(b = 42, i = 42)
+ protected static class Two {
+
+ private String field;
+
+ @TestAnnotation("field")
+ private String annotatedField;
+
+ public Two(int a) {
+ this(a, null);
+ }
+
+ @TestAnnotation("foo")
+ public String foo(int a) throws IllegalStateException {
+ return annotatedField;
+ }
+
+ public Two(int a, String b) {
+ field = b;
+ annotatedField = field;
+ }
+ }
+
+ public void testOne() {
+ CollectClassData cd = collect(One.class);
+ // Don't check for super bit, as it will depend on the JDK used to
compile.
+ assertEquals(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
+ cd.getAccess() & ~Opcodes.ACC_SUPER);
+ assertEquals(ClassType.Nested, cd.getClassType());
+ assertEquals(0, cd.getFields().size());
+ assertEquals(0, cd.getInnerClasses().size());
+ assertEquals(0, cd.getInterfaces().length);
+ // Note that @SuppressWarnings is a source-only annotation
+ assertEquals(0, cd.getAnnotations().size());
+ assertEquals("com/google/gwt/dev/asm/commons/EmptyVisitor",
+ cd.getSuperName());
+
+ List<CollectMethodData> methods = cd.getMethods();
+ assertEquals(2, methods.size());
+ // TODO(jat): Is it safe to assume the implicit constructor is always
first?
+ CollectMethodData method = methods.get(0);
+ Type[] argTypes = method.getArgTypes();
+ String[] argNames = method.getArgNames();
+ assertEquals("<init>", method.getName());
+ assertEquals(0, argTypes.length);
+ assertEquals(0, argNames.length);
+ assertEquals(0, method.getArgAnnotations().length);
+ assertEquals(0, method.getAnnotations().size());
+ assertEquals(0, method.getExceptions().length);
+
+ method = methods.get(1);
+ argTypes = method.getArgTypes();
+ argNames = method.getArgNames();
+ assertEquals("visitAnnotation", method.getName());
+ assertEquals(2, argTypes.length);
+ assertEquals("java.lang.String", argTypes[0].getClassName());
+ assertEquals("boolean", argTypes[1].getClassName());
+ assertEquals(2, argNames.length);
+ assertEquals("desc", argNames[0]);
+ assertEquals("visible", argNames[1]);
+ assertEquals(2, method.getArgAnnotations().length);
+ assertEquals(0, method.getArgAnnotations()[0].size());
+ assertEquals(0, method.getArgAnnotations()[1].size());
+ // Note that @Override is a source-only annotation
+ assertEquals(0, method.getAnnotations().size());
+ assertEquals(0, method.getExceptions().length);
+ }
+
+ public void testTwo() {
+ CollectClassData cd = collect(Two.class);
+ // Don't check for super bit, as it will depend on the JDK used to
compile.
+ assertEquals(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
+ cd.getAccess() & ~Opcodes.ACC_SUPER);
+ assertEquals(ClassType.Nested, cd.getClassType());
+ List<CollectFieldData> fields = cd.getFields();
+ assertEquals(2, fields.size());
+ CollectFieldData field = fields.get(0);
+ assertEquals("field", field.getName());
+ assertEquals("Ljava/lang/String;", field.getDesc());
+ List<CollectAnnotationData> annotations = field.getAnnotations();
+ assertEquals(0, annotations.size());
+ field = fields.get(1);
+ assertEquals("annotatedField", field.getName());
+ assertEquals("Ljava/lang/String;", field.getDesc());
+ annotations = field.getAnnotations();
+ assertEquals(1, annotations.size());
+ AnnotationData annotation = annotations.get(0).getAnnotation();
+ assertEquals("Lcom/google/gwt/core/ext/typeinfo/test/TestAnnotation;",
+ annotation.getDesc());
+ assertEquals("field", annotation.getValues().get("value"));
+ assertEquals(0, cd.getInnerClasses().size());
+ assertEquals(0, cd.getInterfaces().length);
+ annotations = cd.getAnnotations();
+ assertEquals(1, annotations.size());
+ annotation = annotations.get(0).getAnnotation();
+ assertEquals(
+ "Lcom/google/gwt/core/ext/typeinfo/test/PrimitiveValuesAnnotation;",
+ annotation.getDesc());
+ assertEquals(Byte.valueOf((byte) 42), annotation.getValues().get("b"));
+ assertEquals(42, annotation.getValues().get("i"));
+ assertEquals("java/lang/Object", cd.getSuperName());
+
+ List<CollectMethodData> methods = cd.getMethods();
+ assertEquals(3, methods.size());
+ // TODO(jat): Is it safe to assume the order?
+ CollectMethodData method = methods.get(0);
+ Type[] argTypes = method.getArgTypes();
+ String[] argNames = method.getArgNames();
+ assertEquals("<init>", method.getName());
+ assertEquals(1, argTypes.length);
+ assertEquals(1, argNames.length);
+ assertEquals(1, method.getArgAnnotations().length);
+ assertEquals(0, method.getAnnotations().size());
+ assertEquals(0, method.getExceptions().length);
+
+ method = methods.get(1);
+ argTypes = method.getArgTypes();
+ argNames = method.getArgNames();
+ assertEquals("foo", method.getName());
+ assertEquals(1, argTypes.length);
+ assertEquals("int", argTypes[0].getClassName());
+ assertEquals(1, argNames.length);
+ assertEquals("a", argNames[0]);
+ assertEquals(1, method.getArgAnnotations().length);
+ assertEquals(0, method.getArgAnnotations()[0].size());
+ assertEquals(1, method.getAnnotations().size());
+ assertEquals(1, method.getExceptions().length);
+
+ method = methods.get(2);
+ argTypes = method.getArgTypes();
+ argNames = method.getArgNames();
+ assertEquals("<init>", method.getName());
+ assertEquals(2, argTypes.length);
+ assertEquals("int", argTypes[0].getClassName());
+ assertEquals("java.lang.String", argTypes[1].getClassName());
+ assertEquals(2, argNames.length);
+ assertEquals("a", argNames[0]);
+ assertEquals("b", argNames[1]);
+ assertEquals(2, method.getArgAnnotations().length);
+ assertEquals(0, method.getArgAnnotations()[0].size());
+ assertEquals(0, method.getArgAnnotations()[1].size());
+ assertEquals(0, method.getAnnotations().size());
+ assertEquals(0, method.getExceptions().length);
+ }
+
+ private CollectClassData collect(Class<?> clazz) {
+ byte[] bytes = getClassBytes(clazz);
+ assertNotNull("Couldn't load bytes for " + clazz, bytes);
+ CollectClassData cv = new CollectClassData(bytes);
+ ClassReader reader = new ClassReader(bytes);
+ reader.accept(cv, 0);
+ return cv;
+ }
+}
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---