jaroslav@355: /** jaroslav@355: * Back 2 Browser Bytecode Translator jaroslav@1787: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@355: * jaroslav@355: * This program is free software: you can redistribute it and/or modify jaroslav@355: * it under the terms of the GNU General Public License as published by jaroslav@355: * the Free Software Foundation, version 2 of the License. jaroslav@355: * jaroslav@355: * This program is distributed in the hope that it will be useful, jaroslav@355: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@355: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@355: * GNU General Public License for more details. jaroslav@355: * jaroslav@355: * You should have received a copy of the GNU General Public License jaroslav@355: * along with this program. Look for COPYING file in the top folder. jaroslav@355: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@355: */ jaroslav@355: package org.apidesign.bck2brwsr.tck; jaroslav@355: jaroslav@1899: import java.lang.annotation.Annotation; jaroslav@655: import java.lang.annotation.Retention; jaroslav@655: import java.lang.annotation.RetentionPolicy; jaroslav@355: import org.apidesign.bck2brwsr.vmtest.Compare; jaroslav@355: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@355: import org.testng.annotations.Factory; jaroslav@355: jaroslav@355: /** jaroslav@355: * jaroslav@1889: * @author Jaroslav Tulach jaroslav@355: */ jaroslav@1889: public class ReflectionAnnotationTest { jaroslav@1889: @Retention(RetentionPolicy.RUNTIME) jaroslav@1889: @interface Ann { jaroslav@1889: int integer() default 33; jaroslav@1889: double dbl() default 33.3; jaroslav@1889: String string() default "Ahoj"; jaroslav@1889: E enums() default E.B; jaroslav@1889: Class type() default String.class; jaroslav@355: } jaroslav@355: jaroslav@1889: @interface AnnAnn { jaroslav@1889: Ann ann() default @Ann( jaroslav@1889: dbl = 44.4, jaroslav@1889: enums = E.A, jaroslav@1889: string = "Hi", jaroslav@1889: integer = 44 jaroslav@1889: ); jaroslav@413: } jaroslav@413: jaroslav@1889: @Ann jaroslav@1889: @AnnAnn jaroslav@1889: class D { jaroslav@1899: @Ann jaroslav@1899: @AnnAnn jaroslav@1899: public void method() { jaroslav@1899: } jaroslav@649: } jaroslav@649: jaroslav@1889: @Ann(type = String.class) jaroslav@1889: @AnnAnn(ann = @Ann(string = "Ciao")) jaroslav@1889: enum E { jaroslav@1889: A, B jaroslav@1889: }; jaroslav@886: jaroslav@655: jaroslav@655: @Compare public String annoClass() throws Exception { jaroslav@655: Retention r = Ann.class.getAnnotation(Retention.class); jaroslav@655: assert r != null : "Annotation is present"; jaroslav@655: assert r.value() == RetentionPolicy.RUNTIME : "Policy value is OK: " + r.value(); jaroslav@655: return r.annotationType().getName(); jaroslav@655: } jaroslav@1889: jaroslav@661: @Compare public boolean isAnnotation() { jaroslav@661: return Ann.class.isAnnotation(); jaroslav@661: } jaroslav@661: @Compare public boolean isNotAnnotation() { jaroslav@661: return String.class.isAnnotation(); jaroslav@661: } jaroslav@661: @Compare public boolean isNotAnnotationEnum() { jaroslav@661: return E.class.isAnnotation(); jaroslav@661: } jaroslav@1889: jaroslav@1889: @Compare public int intDefaultAttrIsRead() { jaroslav@1889: return D.class.getAnnotation(Ann.class).integer(); jaroslav@586: } jaroslav@586: jaroslav@1889: @Compare public double doubleDefaultAttrIsRead() { jaroslav@1889: return D.class.getAnnotation(Ann.class).dbl(); jaroslav@1889: } jaroslav@1889: jaroslav@1889: @Compare public String stringDefaultAttrIsRead() { jaroslav@1889: return D.class.getAnnotation(Ann.class).string(); jaroslav@1889: } jaroslav@1889: jaroslav@1889: @Compare public String enumDefaultAttrIsRead() { jaroslav@1889: return D.class.getAnnotation(Ann.class).enums().toString(); jaroslav@1889: } jaroslav@1889: jaroslav@1889: @Compare public String classDefaultAttrIsRead() { jaroslav@1889: return D.class.getAnnotation(Ann.class).type().getName(); jaroslav@1889: } jaroslav@1889: jaroslav@1889: @Compare public String classAttrIsRead() { jaroslav@1889: return E.class.getAnnotation(Ann.class).type().getName(); jaroslav@1889: } jaroslav@1889: jaroslav@1889: // @Compare public String defaultAnnotationAttrIsRead() { jaroslav@1889: // final Ann ann = D.class.getAnnotation(AnnAnn.class).ann(); jaroslav@1889: // return ann.string() + ann.dbl() + ann.enums() + ann.integer() + ann.type(); jaroslav@1889: // } jaroslav@1889: // jaroslav@1889: // @Compare public String annotationAttrIsRead() { jaroslav@1889: // final Ann ann = E.class.getAnnotation(AnnAnn.class).ann(); jaroslav@1889: // return ann.string(); jaroslav@1889: // } jaroslav@1889: jaroslav@1899: private static String toClassNames(Object[] arr) { jaroslav@1899: StringBuilder sb = new StringBuilder(); jaroslav@1899: sb.append("\n"); jaroslav@1899: for (Object o : arr) { jaroslav@1899: if (o == null) { jaroslav@1899: sb.append("null"); jaroslav@1899: } else if (o instanceof Ann) { jaroslav@1899: sb.append("Ann"); jaroslav@1899: } else if (o instanceof AnnAnn) { jaroslav@1899: sb.append("AnnAnn"); jaroslav@1899: } jaroslav@1899: sb.append("\n"); jaroslav@1899: } jaroslav@1899: return sb.toString(); jaroslav@1899: } jaroslav@1899: jaroslav@1899: @Compare jaroslav@1899: public String twoAnnotations() { jaroslav@1899: Annotation[] arr = D.class.getAnnotations(); jaroslav@1899: if (arr == null) { jaroslav@1899: return "Null array"; jaroslav@1899: } jaroslav@1899: return toClassNames(arr); jaroslav@1899: } jaroslav@1899: jaroslav@1899: @Compare jaroslav@1899: public String twoDeclaredAnnotations() { jaroslav@1899: Annotation[] arr = D.class.getDeclaredAnnotations(); jaroslav@1899: if (arr == null) { jaroslav@1899: return "Null array"; jaroslav@1899: } jaroslav@1899: return toClassNames(arr); jaroslav@1899: } jaroslav@1899: jaroslav@1899: @Compare jaroslav@1899: public String twoAnnotationsOnMethod() throws Exception { jaroslav@1899: Annotation[] arr = D.class.getMethod("method").getAnnotations(); jaroslav@1899: if (arr == null) { jaroslav@1899: return "Null array"; jaroslav@1899: } jaroslav@1899: return toClassNames(arr); jaroslav@1899: } jaroslav@1899: jaroslav@1899: @Compare jaroslav@1901: public String noAnnotation() { jaroslav@1901: Annotation[] arr = ReflectionAnnotationTest.class.getAnnotations(); jaroslav@1901: if (arr == null) { jaroslav@1901: return "Null array"; jaroslav@1901: } jaroslav@1901: return toClassNames(arr); jaroslav@1901: } jaroslav@1901: jaroslav@1901: @Compare jaroslav@1903: public boolean noAnnotationSingle() { jaroslav@1903: Annotation arr = ReflectionAnnotationTest.class.getAnnotation(Ann.class); jaroslav@1903: return arr == null; jaroslav@1903: } jaroslav@1903: jaroslav@1903: @Compare jaroslav@1903: public boolean noAnnotationOnMethodSingle() throws Exception { jaroslav@1903: Annotation arr = ReflectionAnnotationTest.class.getMethod("noAnnotationOnMethodSingle").getAnnotation(Ann.class); jaroslav@1903: return arr == null; jaroslav@1903: } jaroslav@1903: jaroslav@1903: @Compare jaroslav@1901: public String noDeclaredAnnotation() { jaroslav@1901: Annotation[] arr = ReflectionAnnotationTest.class.getDeclaredAnnotations(); jaroslav@1901: if (arr == null) { jaroslav@1901: return "Null array"; jaroslav@1901: } jaroslav@1901: return toClassNames(arr); jaroslav@1901: } jaroslav@1901: jaroslav@1901: @Compare jaroslav@1899: public String twoDeclaredAnnotationsOnMethod() throws Exception { jaroslav@1899: Annotation[] arr = D.class.getMethod("method").getAnnotations(); jaroslav@1899: if (arr == null) { jaroslav@1899: return "Null array"; jaroslav@1899: } jaroslav@1899: return toClassNames(arr); jaroslav@1899: } jaroslav@1899: jaroslav@1889: @Factory jaroslav@1889: public static Object[] create() { jaroslav@1889: return VMTest.create(ReflectionAnnotationTest.class); jaroslav@586: } jaroslav@586: jaroslav@355: }