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