1ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller/*
2ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * Copyright (C) 2011 The Android Open Source Project
3ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller *
4ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
5ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * you may not use this file except in compliance with the License.
6ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * You may obtain a copy of the License at
7ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller *
8ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
9ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller *
10ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * Unless required by applicable law or agreed to in writing, software
11ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
12ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * See the License for the specific language governing permissions and
14ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * limitations under the License.
15ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller */
16ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerpackage libcore.java.lang.reflect.annotations;
17ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
18ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport junit.framework.TestCase;
19ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
20ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport java.lang.annotation.Annotation;
21ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport java.lang.annotation.Retention;
22ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport java.lang.annotation.RetentionPolicy;
23ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport java.util.Arrays;
24ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport libcore.java.lang.reflect.annotations.AnnotatedElementTestSupport.AnnotationA;
25ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport libcore.java.lang.reflect.annotations.AnnotatedElementTestSupport.AnnotationB;
26ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
27ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerimport dalvik.system.VMRuntime;
28ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
29ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller/**
30ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller * Tests for the behavior of Annotation instances at runtime.
31ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller */
32ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fullerpublic class AnnotationsTest extends TestCase {
33ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
34ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    enum Breakfast { WAFFLES, PANCAKES }
35ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
36ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    @Retention(RetentionPolicy.RUNTIME)
37ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public @interface HasDefaultsAnnotation {
38ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        byte a() default 5;
39ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        short b() default 6;
40ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        int c() default 7;
41ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        long d() default 8;
42ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        float e() default 9.0f;
43ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        double f() default 10.0;
44ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        char g() default 'k';
45ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        boolean h() default true;
46ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        Breakfast i() default Breakfast.WAFFLES;
47ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        AnnotationA j() default @AnnotationA();
48ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        String k() default "maple";
49ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        Class l() default AnnotationB.class;
50ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        int[] m() default { 1, 2, 3 };
51ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        Breakfast[] n() default { Breakfast.WAFFLES, Breakfast.PANCAKES };
52ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        Breakfast o();
53ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        int p();
54ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    }
55ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
56ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public void testAnnotationDefaults() throws Exception {
57ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals((byte) 5, defaultValue("a"));
58ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals((short) 6, defaultValue("b"));
59ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(7, defaultValue("c"));
60ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(8L, defaultValue("d"));
61ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(9.0f, defaultValue("e"));
62ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(10.0, defaultValue("f"));
63ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals('k', defaultValue("g"));
64ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(true, defaultValue("h"));
65ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(Breakfast.WAFFLES, defaultValue("i"));
66ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals("@" + AnnotationA.class.getName() + "()", defaultValue("j").toString());
67ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals("maple", defaultValue("k"));
68ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(AnnotationB.class, defaultValue("l"));
69ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals("[1, 2, 3]", Arrays.toString((int[]) defaultValue("m")));
70ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals("[WAFFLES, PANCAKES]", Arrays.toString((Breakfast[]) defaultValue("n")));
71ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(null, defaultValue("o"));
72ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertEquals(null, defaultValue("p"));
73ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    }
74ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
75ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    private static Object defaultValue(String name) throws NoSuchMethodException {
76ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        return HasDefaultsAnnotation.class.getMethod(name).getDefaultValue();
77ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    }
78ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
79ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    @Retention(RetentionPolicy.CLASS)
80ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public @interface ClassRetentionAnnotation {}
81ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
82ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    @Retention(RetentionPolicy.RUNTIME)
83ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public @interface RuntimeRetentionAnnotation {}
84ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
85ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    @Retention(RetentionPolicy.SOURCE)
86ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public @interface SourceRetentionAnnotation {}
87ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
88ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    @ClassRetentionAnnotation @RuntimeRetentionAnnotation @SourceRetentionAnnotation
89ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public static class RetentionAnnotations {}
90ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
91ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    public void testRetentionPolicy() {
92ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        // b/29500035
93ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        int savedTargetSdkVersion = VMRuntime.getRuntime().getTargetSdkVersion();
94ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        try {
95ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            // Test N and later behavior
96ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            VMRuntime.getRuntime().setTargetSdkVersion(24);
97ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            Annotation classRetentionAnnotation =
98ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller                RetentionAnnotations.class.getAnnotation(ClassRetentionAnnotation.class);
99ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            assertNull(classRetentionAnnotation);
100ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller
101ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            // Test pre-N behavior
102ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            VMRuntime.getRuntime().setTargetSdkVersion(23);
103ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            classRetentionAnnotation =
104ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller                RetentionAnnotations.class.getAnnotation(ClassRetentionAnnotation.class);
105ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            assertNotNull(classRetentionAnnotation);
106ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        } finally {
107ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller            VMRuntime.getRuntime().setTargetSdkVersion(savedTargetSdkVersion);
108ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        }
109ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertNotNull(RetentionAnnotations.class.getAnnotation(RuntimeRetentionAnnotation.class));
110ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller        assertNull(RetentionAnnotations.class.getAnnotation(SourceRetentionAnnotation.class));
111ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller    }
112ee3e080dc11ef39567381faadf149c88e7860ce3Neil Fuller}
113