rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionAnnotationTest.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 20 Mar 2016 19:37:07 +0100
changeset 1903 0267fb5bc8d5
parent 1901 e9be21ce2291
permissions -rw-r--r--
Return null if there is not the requested annotation on a method
jaroslav@355
     1
/**
jaroslav@355
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1787
     3
 * Copyright (C) 2012-2015 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@355
     4
 *
jaroslav@355
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@355
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@355
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@355
     8
 *
jaroslav@355
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@355
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@355
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@355
    12
 * GNU General Public License for more details.
jaroslav@355
    13
 *
jaroslav@355
    14
 * You should have received a copy of the GNU General Public License
jaroslav@355
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@355
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@355
    17
 */
jaroslav@355
    18
package org.apidesign.bck2brwsr.tck;
jaroslav@355
    19
jaroslav@1899
    20
import java.lang.annotation.Annotation;
jaroslav@655
    21
import java.lang.annotation.Retention;
jaroslav@655
    22
import java.lang.annotation.RetentionPolicy;
jaroslav@355
    23
import org.apidesign.bck2brwsr.vmtest.Compare;
jaroslav@355
    24
import org.apidesign.bck2brwsr.vmtest.VMTest;
jaroslav@355
    25
import org.testng.annotations.Factory;
jaroslav@355
    26
jaroslav@355
    27
/**
jaroslav@355
    28
 *
jaroslav@1889
    29
 * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@355
    30
 */
jaroslav@1889
    31
public class ReflectionAnnotationTest {
jaroslav@1889
    32
    @Retention(RetentionPolicy.RUNTIME)
jaroslav@1889
    33
    @interface Ann {
jaroslav@1889
    34
        int integer() default 33;
jaroslav@1889
    35
        double dbl() default 33.3;
jaroslav@1889
    36
        String string() default "Ahoj";
jaroslav@1889
    37
        E enums() default E.B;
jaroslav@1889
    38
        Class<?> type() default String.class;
jaroslav@355
    39
    }
jaroslav@355
    40
jaroslav@1889
    41
    @interface AnnAnn {
jaroslav@1889
    42
        Ann ann() default @Ann(
jaroslav@1889
    43
            dbl = 44.4,
jaroslav@1889
    44
            enums = E.A,
jaroslav@1889
    45
            string = "Hi",
jaroslav@1889
    46
            integer = 44
jaroslav@1889
    47
        );
jaroslav@413
    48
    }
jaroslav@413
    49
jaroslav@1889
    50
    @Ann
jaroslav@1889
    51
    @AnnAnn
jaroslav@1889
    52
    class D {
jaroslav@1899
    53
        @Ann
jaroslav@1899
    54
        @AnnAnn
jaroslav@1899
    55
        public void method() {
jaroslav@1899
    56
        }
jaroslav@649
    57
    }
jaroslav@649
    58
jaroslav@1889
    59
    @Ann(type = String.class)
jaroslav@1889
    60
    @AnnAnn(ann = @Ann(string = "Ciao"))
jaroslav@1889
    61
    enum E {
jaroslav@1889
    62
        A, B
jaroslav@1889
    63
    };
jaroslav@886
    64
jaroslav@655
    65
    
jaroslav@655
    66
    @Compare public String annoClass() throws Exception {
jaroslav@655
    67
        Retention r = Ann.class.getAnnotation(Retention.class);
jaroslav@655
    68
        assert r != null : "Annotation is present";
jaroslav@655
    69
        assert r.value() == RetentionPolicy.RUNTIME : "Policy value is OK: " + r.value();
jaroslav@655
    70
        return r.annotationType().getName();
jaroslav@655
    71
    }
jaroslav@1889
    72
jaroslav@661
    73
    @Compare public boolean isAnnotation() {
jaroslav@661
    74
        return Ann.class.isAnnotation();
jaroslav@661
    75
    }
jaroslav@661
    76
    @Compare public boolean isNotAnnotation() {
jaroslav@661
    77
        return String.class.isAnnotation();
jaroslav@661
    78
    }
jaroslav@661
    79
    @Compare public boolean isNotAnnotationEnum() {
jaroslav@661
    80
        return E.class.isAnnotation();
jaroslav@661
    81
    }
jaroslav@1889
    82
jaroslav@1889
    83
    @Compare public int intDefaultAttrIsRead() {
jaroslav@1889
    84
        return D.class.getAnnotation(Ann.class).integer();
jaroslav@586
    85
    }
jaroslav@586
    86
jaroslav@1889
    87
    @Compare public double doubleDefaultAttrIsRead() {
jaroslav@1889
    88
        return D.class.getAnnotation(Ann.class).dbl();
jaroslav@1889
    89
    }
jaroslav@1889
    90
jaroslav@1889
    91
    @Compare public String stringDefaultAttrIsRead() {
jaroslav@1889
    92
        return D.class.getAnnotation(Ann.class).string();
jaroslav@1889
    93
    }
jaroslav@1889
    94
jaroslav@1889
    95
    @Compare public String enumDefaultAttrIsRead() {
jaroslav@1889
    96
        return D.class.getAnnotation(Ann.class).enums().toString();
jaroslav@1889
    97
    }
jaroslav@1889
    98
jaroslav@1889
    99
    @Compare public String classDefaultAttrIsRead() {
jaroslav@1889
   100
        return D.class.getAnnotation(Ann.class).type().getName();
jaroslav@1889
   101
    }
jaroslav@1889
   102
jaroslav@1889
   103
    @Compare public String classAttrIsRead() {
jaroslav@1889
   104
        return E.class.getAnnotation(Ann.class).type().getName();
jaroslav@1889
   105
    }
jaroslav@1889
   106
jaroslav@1889
   107
//    @Compare public String defaultAnnotationAttrIsRead() {
jaroslav@1889
   108
//        final Ann ann = D.class.getAnnotation(AnnAnn.class).ann();
jaroslav@1889
   109
//        return ann.string() + ann.dbl() + ann.enums() + ann.integer() + ann.type();
jaroslav@1889
   110
//    }
jaroslav@1889
   111
//
jaroslav@1889
   112
//    @Compare public String annotationAttrIsRead() {
jaroslav@1889
   113
//        final Ann ann = E.class.getAnnotation(AnnAnn.class).ann();
jaroslav@1889
   114
//        return ann.string();
jaroslav@1889
   115
//    }
jaroslav@1889
   116
jaroslav@1899
   117
    private static String toClassNames(Object[] arr) {
jaroslav@1899
   118
        StringBuilder sb = new StringBuilder();
jaroslav@1899
   119
        sb.append("\n");
jaroslav@1899
   120
        for (Object o : arr) {
jaroslav@1899
   121
            if (o == null) {
jaroslav@1899
   122
                sb.append("null");
jaroslav@1899
   123
            } else if (o instanceof Ann) {
jaroslav@1899
   124
                sb.append("Ann");
jaroslav@1899
   125
            } else if (o instanceof AnnAnn) {
jaroslav@1899
   126
                sb.append("AnnAnn");
jaroslav@1899
   127
            }
jaroslav@1899
   128
            sb.append("\n");
jaroslav@1899
   129
        }
jaroslav@1899
   130
        return sb.toString();
jaroslav@1899
   131
    }
jaroslav@1899
   132
jaroslav@1899
   133
    @Compare
jaroslav@1899
   134
    public String twoAnnotations() {
jaroslav@1899
   135
        Annotation[] arr = D.class.getAnnotations();
jaroslav@1899
   136
        if (arr == null) {
jaroslav@1899
   137
            return "Null array";
jaroslav@1899
   138
        }
jaroslav@1899
   139
        return toClassNames(arr);
jaroslav@1899
   140
    }
jaroslav@1899
   141
jaroslav@1899
   142
    @Compare
jaroslav@1899
   143
    public String twoDeclaredAnnotations() {
jaroslav@1899
   144
        Annotation[] arr = D.class.getDeclaredAnnotations();
jaroslav@1899
   145
        if (arr == null) {
jaroslav@1899
   146
            return "Null array";
jaroslav@1899
   147
        }
jaroslav@1899
   148
        return toClassNames(arr);
jaroslav@1899
   149
    }
jaroslav@1899
   150
jaroslav@1899
   151
    @Compare
jaroslav@1899
   152
    public String twoAnnotationsOnMethod() throws Exception {
jaroslav@1899
   153
        Annotation[] arr = D.class.getMethod("method").getAnnotations();
jaroslav@1899
   154
        if (arr == null) {
jaroslav@1899
   155
            return "Null array";
jaroslav@1899
   156
        }
jaroslav@1899
   157
        return toClassNames(arr);
jaroslav@1899
   158
    }
jaroslav@1899
   159
jaroslav@1899
   160
    @Compare
jaroslav@1901
   161
    public String noAnnotation() {
jaroslav@1901
   162
        Annotation[] arr = ReflectionAnnotationTest.class.getAnnotations();
jaroslav@1901
   163
        if (arr == null) {
jaroslav@1901
   164
            return "Null array";
jaroslav@1901
   165
        }
jaroslav@1901
   166
        return toClassNames(arr);
jaroslav@1901
   167
    }
jaroslav@1901
   168
jaroslav@1901
   169
    @Compare
jaroslav@1903
   170
    public boolean noAnnotationSingle() {
jaroslav@1903
   171
        Annotation arr = ReflectionAnnotationTest.class.getAnnotation(Ann.class);
jaroslav@1903
   172
        return arr == null;
jaroslav@1903
   173
    }
jaroslav@1903
   174
jaroslav@1903
   175
    @Compare
jaroslav@1903
   176
    public boolean noAnnotationOnMethodSingle() throws Exception {
jaroslav@1903
   177
        Annotation arr = ReflectionAnnotationTest.class.getMethod("noAnnotationOnMethodSingle").getAnnotation(Ann.class);
jaroslav@1903
   178
        return arr == null;
jaroslav@1903
   179
    }
jaroslav@1903
   180
jaroslav@1903
   181
    @Compare
jaroslav@1901
   182
    public String noDeclaredAnnotation() {
jaroslav@1901
   183
        Annotation[] arr = ReflectionAnnotationTest.class.getDeclaredAnnotations();
jaroslav@1901
   184
        if (arr == null) {
jaroslav@1901
   185
            return "Null array";
jaroslav@1901
   186
        }
jaroslav@1901
   187
        return toClassNames(arr);
jaroslav@1901
   188
    }
jaroslav@1901
   189
jaroslav@1901
   190
    @Compare
jaroslav@1899
   191
    public String twoDeclaredAnnotationsOnMethod() throws Exception {
jaroslav@1899
   192
        Annotation[] arr = D.class.getMethod("method").getAnnotations();
jaroslav@1899
   193
        if (arr == null) {
jaroslav@1899
   194
            return "Null array";
jaroslav@1899
   195
        }
jaroslav@1899
   196
        return toClassNames(arr);
jaroslav@1899
   197
    }
jaroslav@1899
   198
jaroslav@1889
   199
    @Factory
jaroslav@1889
   200
    public static Object[] create() {
jaroslav@1889
   201
        return VMTest.create(ReflectionAnnotationTest.class);
jaroslav@586
   202
    }
jaroslav@586
   203
    
jaroslav@355
   204
}