blob: 2c2fc65c9b3696b3856993476c791ae3b3efb049 [file] [log] [blame]
/*
* Copyright 2007 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.typemodel;
import com.google.gwt.dev.util.collect.IdentityHashMap;
import junit.framework.TestCase;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.HashMap;
import java.util.Map;
/**
* Test cases for the {@link Annotations} class.
*/
public class AnnotationsTest extends TestCase {
@TestAnnotation1("1")
private static class AnnotatedClass1 {
}
@TestAnnotation2("2")
private static class AnnotatedClass2 extends AnnotatedClass1 {
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
private @interface TestAnnotation1 {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
private @interface TestAnnotation2 {
String value();
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
private @interface UnusedAnnotation {
String value();
}
/**
* Initializes an {@link Annotations} instance from a given {@link Class}.
*/
private static Annotations initializeAnnotationsFromClass(
Class<?> annotatedClass, Annotations parent) {
Annotation[] jAnnotations = annotatedClass.getDeclaredAnnotations();
Map<Class<? extends Annotation>, Annotation> map = new IdentityHashMap<Class<? extends Annotation>, Annotation>();
for (Annotation annotation : jAnnotations) {
map.put(annotation.annotationType(), annotation);
}
Annotations annotations = new Annotations(map);
if (parent != null) {
annotations.setParent(parent);
}
return annotations;
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#addAnnotations(java.util.Map)}
* .
*/
public void testAddAnnotations() {
Annotations annotations = new Annotations();
Map<Class<? extends Annotation>, Annotation> entries = new HashMap<Class<? extends Annotation>, Annotation>();
entries.put(TestAnnotation1.class,
AnnotatedClass1.class.getAnnotation(TestAnnotation1.class));
annotations.addAnnotations(entries);
assertNotNull(annotations.getAnnotation(TestAnnotation1.class));
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#getAnnotation(java.lang.Class)}
* .
*
* case 1: annotation is a declared case 2: annotation is inherited case 3:
* annotation is not found
*/
public void testGetAnnotationDeclared() {
Annotations annotations = initializeAnnotationsFromClass(
AnnotatedClass1.class, null);
assertNotNull(annotations.getAnnotation(TestAnnotation1.class));
assertNull(annotations.getAnnotation(UnusedAnnotation.class));
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#getAnnotation(java.lang.Class)}
* .
*
* case 1: annotation is a declared case 2: annotation is inherited case 3:
* annotation is not found
*/
public void testGetAnnotationInherited() {
Annotations annotations1 = initializeAnnotationsFromClass(
AnnotatedClass1.class, null);
Annotations annotations2 = initializeAnnotationsFromClass(
AnnotatedClass2.class, annotations1);
assertNotNull(annotations2.getAnnotation(TestAnnotation1.class));
assertNull(annotations2.getAnnotation(UnusedAnnotation.class));
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#getAnnotations()}.
*/
public void testGetAnnotations() {
Annotations annotations1 = initializeAnnotationsFromClass(
AnnotatedClass1.class, null);
Annotations annotations2 = initializeAnnotationsFromClass(
AnnotatedClass2.class, annotations1);
assertEquals(2, annotations2.getAnnotations().length);
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#getDeclaredAnnotations()}
* .
*/
public void testGetDeclaredAnnotations() {
Annotations annotations1 = initializeAnnotationsFromClass(
AnnotatedClass1.class, null);
Annotations annotations2 = initializeAnnotationsFromClass(
AnnotatedClass2.class, annotations1);
assertEquals(1, annotations2.getDeclaredAnnotations().length);
assertEquals(1, annotations1.getDeclaredAnnotations().length);
}
/**
* Test method for
* {@link com.google.gwt.core.ext.typeinfo.Annotations#isAnnotationPresent(java.lang.Class)}
* .
*/
public void testIsAnnotationPresent() {
Annotations annotations1 = initializeAnnotationsFromClass(
AnnotatedClass1.class, null);
Annotations annotations2 = initializeAnnotationsFromClass(
AnnotatedClass2.class, annotations1);
assertTrue(annotations2.isAnnotationPresent(TestAnnotation1.class));
assertTrue(annotations2.isAnnotationPresent(TestAnnotation2.class));
assertFalse(annotations2.isAnnotationPresent(UnusedAnnotation.class));
}
}