Home | History | Annotate | Download | only in reflect
      1 /*
      2  * Copyright (C) 2012 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.reflect;
     18 
     19 import com.google.common.testing.EqualsTester;
     20 import com.google.common.testing.NullPointerTester;
     21 
     22 import junit.framework.TestCase;
     23 
     24 import java.lang.annotation.Retention;
     25 import java.lang.annotation.RetentionPolicy;
     26 import java.lang.reflect.Constructor;
     27 
     28 /**
     29  * Unit tests of {@link Element}.
     30  *
     31  * @author Ben Yu
     32  */
     33 public class ElementTest extends TestCase {
     34 
     35   public void testPrivateField() throws Exception {
     36     Element element = A.field("privateField");
     37     assertTrue(element.isPrivate());
     38     assertFalse(element.isAbstract());
     39     assertFalse(element.isPackagePrivate());
     40     assertFalse(element.isProtected());
     41     assertFalse(element.isPublic());
     42     assertFalse(element.isFinal());
     43     assertFalse(element.isStatic());
     44     assertTrue(element.isAnnotationPresent(Tested.class));
     45   }
     46 
     47   public void testPackagePrivateField() throws Exception {
     48     Element element = A.field("packagePrivateField");
     49     assertFalse(element.isPrivate());
     50     assertTrue(element.isPackagePrivate());
     51     assertFalse(element.isProtected());
     52     assertFalse(element.isPublic());
     53     assertFalse(element.isFinal());
     54     assertFalse(element.isStatic());
     55     assertTrue(element.isAnnotationPresent(Tested.class));
     56   }
     57 
     58   public void testProtectedField() throws Exception {
     59     Element element = A.field("protectedField");
     60     assertFalse(element.isPrivate());
     61     assertFalse(element.isPackagePrivate());
     62     assertTrue(element.isProtected());
     63     assertFalse(element.isPublic());
     64     assertFalse(element.isFinal());
     65     assertFalse(element.isStatic());
     66     assertTrue(element.isAnnotationPresent(Tested.class));
     67   }
     68 
     69   public void testPublicField() throws Exception {
     70     Element element = A.field("publicField");
     71     assertFalse(element.isPrivate());
     72     assertFalse(element.isPackagePrivate());
     73     assertFalse(element.isProtected());
     74     assertTrue(element.isPublic());
     75     assertFalse(element.isFinal());
     76     assertFalse(element.isStatic());
     77     assertTrue(element.isAnnotationPresent(Tested.class));
     78   }
     79 
     80   public void testFinalField() throws Exception {
     81     Element element = A.field("finalField");
     82     assertTrue(element.isFinal());
     83     assertFalse(element.isStatic());
     84     assertTrue(element.isAnnotationPresent(Tested.class));
     85   }
     86 
     87   public void testStaticField() throws Exception {
     88     Element element = A.field("staticField");
     89     assertTrue(element.isStatic());
     90     assertTrue(element.isAnnotationPresent(Tested.class));
     91   }
     92 
     93   public void testVolatileField() throws Exception {
     94     Element element = A.field("volatileField");
     95     assertTrue(element.isVolatile());
     96   }
     97 
     98   public void testTransientField() throws Exception {
     99     Element element = A.field("transientField");
    100     assertTrue(element.isTransient());
    101   }
    102 
    103   public void testConstructor() throws Exception {
    104     Element element = A.constructor();
    105     assertTrue(element.isPublic());
    106     assertFalse(element.isPackagePrivate());
    107     assertFalse(element.isAbstract());
    108     assertFalse(element.isStatic());
    109     assertTrue(element.isAnnotationPresent(Tested.class));
    110   }
    111 
    112   public void testAbstractMethod() throws Exception {
    113     Element element = A.method("abstractMethod");
    114     assertTrue(element.isPackagePrivate());
    115     assertTrue(element.isAbstract());
    116     assertFalse(element.isFinal());
    117     assertTrue(element.isAnnotationPresent(Tested.class));
    118   }
    119 
    120   public void testOverridableMethod() throws Exception {
    121     Element element = A.method("overridableMethod");
    122     assertTrue(element.isPackagePrivate());
    123     assertFalse(element.isAbstract());
    124     assertFalse(element.isFinal());
    125     assertTrue(element.isAnnotationPresent(Tested.class));
    126   }
    127 
    128   public void testPrivateMethod() throws Exception {
    129     Element element = A.method("privateMethod");
    130     assertFalse(element.isAbstract());
    131     assertTrue(element.isPrivate());
    132     assertFalse(element.isPackagePrivate());
    133     assertFalse(element.isPublic());
    134     assertFalse(element.isProtected());
    135     assertTrue(element.isAnnotationPresent(Tested.class));
    136   }
    137 
    138   public void testProtectedMethod() throws Exception {
    139     Element element = A.method("protectedMethod");
    140     assertFalse(element.isAbstract());
    141     assertFalse(element.isPrivate());
    142     assertFalse(element.isPackagePrivate());
    143     assertFalse(element.isFinal());
    144     assertFalse(element.isPublic());
    145     assertTrue(element.isProtected());
    146     assertTrue(element.isAnnotationPresent(Tested.class));
    147   }
    148 
    149   public void testFinalMethod() throws Exception {
    150     Element element = A.method("publicFinalMethod");
    151     assertFalse(element.isAbstract());
    152     assertFalse(element.isPrivate());
    153     assertTrue(element.isFinal());
    154     assertTrue(element.isPublic());
    155     assertTrue(element.isAnnotationPresent(Tested.class));
    156   }
    157 
    158   public void testNativeMethod() throws Exception {
    159     Element element = A.method("nativeMethod");
    160     assertTrue(element.isNative());
    161     assertTrue(element.isPackagePrivate());
    162   }
    163 
    164   public void testSynchronizedMethod() throws Exception {
    165     Element element = A.method("synchronizedMethod");
    166     assertTrue(element.isSynchronized());
    167   }
    168 
    169   public void testUnannotatedMethod() throws Exception {
    170     Element element = A.method("notAnnotatedMethod");
    171     assertFalse(element.isAnnotationPresent(Tested.class));
    172   }
    173 
    174   public void testEquals() throws Exception {
    175     new EqualsTester()
    176         .addEqualityGroup(A.field("privateField"), A.field("privateField"))
    177         .addEqualityGroup(A.field("publicField"))
    178         .addEqualityGroup(A.constructor(), A.constructor())
    179         .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
    180         .addEqualityGroup(A.method("publicFinalMethod"))
    181         .testEquals();
    182   }
    183 
    184   public void testNulls() {
    185     new NullPointerTester()
    186         .testAllPublicStaticMethods(Element.class);
    187   }
    188 
    189   @Retention(RetentionPolicy.RUNTIME)
    190   private @interface Tested {}
    191 
    192   private static abstract class A {
    193     @Tested private boolean privateField;
    194     @Tested int packagePrivateField;
    195     @Tested protected int protectedField;
    196     @Tested public String publicField;
    197     @Tested private static Iterable<String> staticField;
    198     @Tested private final Object finalField;
    199     private volatile char volatileField;
    200     private transient long transientField;
    201 
    202     @Tested public A(Object finalField) {
    203       this.finalField = finalField;
    204     }
    205 
    206     @Tested abstract void abstractMethod();
    207 
    208     @Tested void overridableMethod() {}
    209 
    210     @Tested protected void protectedMethod() {}
    211 
    212     @Tested private void privateMethod() {}
    213 
    214     @Tested public final void publicFinalMethod() {}
    215 
    216     void notAnnotatedMethod() {}
    217 
    218     static Element field(String name) throws Exception {
    219       Element element = new Element(A.class.getDeclaredField(name));
    220       assertEquals(name, element.getName());
    221       assertEquals(A.class, element.getDeclaringClass());
    222       return element;
    223     }
    224 
    225     static Element constructor() throws Exception {
    226       Constructor<?> constructor = A.class.getDeclaredConstructor(Object.class);
    227       Element element = new Element(constructor);
    228       assertEquals(constructor.getName(), element.getName());
    229       assertEquals(A.class, element.getDeclaringClass());
    230       return element;
    231     }
    232 
    233     static Element method(String name, Class<?>... parameterTypes) throws Exception {
    234       Element element = new Element(A.class.getDeclaredMethod(name, parameterTypes));
    235       assertEquals(name, element.getName());
    236       assertEquals(A.class, element.getDeclaringClass());
    237       return element;
    238     }
    239 
    240     native void nativeMethod();
    241 
    242     synchronized void synchronizedMethod() {}
    243   }
    244 }
    245