You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2010/09/14 00:03:12 UTC

svn commit: r996701 - /commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java

Author: mbenson
Date: Mon Sep 13 22:03:12 2010
New Revision: 996701

URL: http://svn.apache.org/viewvc?rev=996701&view=rev
Log:
verify that a user-generated annotation which does not directly implement equals() nevertheless compares equivalently to a 'real' annotation

Modified:
    commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java

Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java?rev=996701&r1=996700&r2=996701&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/AnnotationUtilsTest.java Mon Sep 13 22:03:12 2010
@@ -26,6 +26,9 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Arrays;
 
@@ -36,337 +39,127 @@ import org.junit.Test;
  * @version $Id$
  */
 public class AnnotationUtilsTest {
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
+    @TestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, nest = @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object.class, types = { Object.class }), nests = { @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object[].class, types = { Object[].class }) }, shortValue = 0, shortValues = { 0 }, stooge = SHEMP, stooges = {
+            MOE, LARRY, CURLY }, string = "", strings = { "" }, type = Object.class, types = { Object.class })
     public Object dummy1;
 
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
+    @TestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, nest = @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object.class, types = { Object.class }), nests = { @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object[].class, types = { Object[].class }) }, shortValue = 0, shortValues = { 0 }, stooge = SHEMP, stooges = {
+            MOE, LARRY, CURLY }, string = "", strings = { "" }, type = Object.class, types = { Object.class })
     public Object dummy2;
 
-    @TestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            nest = @NestAnnotation(
-                    booleanValue = false,
-                    booleanValues = { false },
-                    byteValue = 0,
-                    byteValues = { 0 },
-                    charValue = 0,
-                    charValues = { 0 },
-                    doubleValue = 0,
-                    doubleValues = { 0 },
-                    floatValue = 0,
-                    floatValues = { 0 },
-                    intValue = 0,
-                    intValues = { 0 },
-                    longValue = 0,
-                    longValues = { 0 },
-                    shortValue = 0,
-                    shortValues = { 0 },
-                    stooge = CURLY,
-                    stooges = { MOE, LARRY, SHEMP },
-                    string = "",
-                    strings = { "" },
-                    type = Object.class,
-                    types = { Object.class }
-            ),
-            nests = {
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                ),
-                //add a second NestAnnotation to break equality:
-                @NestAnnotation(
-                        booleanValue = false,
-                        booleanValues = { false },
-                        byteValue = 0,
-                        byteValues = { 0 },
-                        charValue = 0,
-                        charValues = { 0 },
-                        doubleValue = 0,
-                        doubleValues = { 0 },
-                        floatValue = 0,
-                        floatValues = { 0 },
-                        intValue = 0,
-                        intValues = { 0 },
-                        longValue = 0,
-                        longValues = { 0 },
-                        shortValue = 0,
-                        shortValues = { 0 },
-                        stooge = CURLY,
-                        stooges = { MOE, LARRY, SHEMP },
-                        string = "",
-                        strings = { "" },
-                        type = Object[].class,
-                        types = { Object[].class }
-                )
-            },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = SHEMP,
-            stooges = { MOE, LARRY, CURLY },
-            string = "",
-            strings = { "" },
-            type = Object.class,
-            types = { Object.class }
-    )
+    @TestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, nest = @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object.class, types = { Object.class }), nests = {
+            @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+                    MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object[].class, types = { Object[].class }),
+            //add a second NestAnnotation to break equality:
+            @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+                    MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object[].class, types = { Object[].class }) }, shortValue = 0, shortValues = { 0 }, stooge = SHEMP, stooges = {
+            MOE, LARRY, CURLY }, string = "", strings = { "" }, type = Object.class, types = { Object.class })
     public Object dummy3;
 
-    @NestAnnotation(
-            booleanValue = false,
-            booleanValues = { false },
-            byteValue = 0,
-            byteValues = { 0 },
-            charValue = 0,
-            charValues = { 0 },
-            doubleValue = 0,
-            doubleValues = { 0 },
-            floatValue = 0,
-            floatValues = { 0 },
-            intValue = 0,
-            intValues = { 0 },
-            longValue = 0,
-            longValues = { 0 },
-            shortValue = 0,
-            shortValues = { 0 },
-            stooge = CURLY,
-            stooges = { MOE, LARRY, SHEMP },
-            string = "",
-            strings = { "" },
-            type = Object[].class,
-            types = { Object[].class }
-    )
-
+    @NestAnnotation(booleanValue = false, booleanValues = { false }, byteValue = 0, byteValues = { 0 }, charValue = 0, charValues = { 0 }, doubleValue = 0, doubleValues = { 0 }, floatValue = 0, floatValues = { 0 }, intValue = 0, intValues = { 0 }, longValue = 0, longValues = { 0 }, shortValue = 0, shortValues = { 0 }, stooge = CURLY, stooges = {
+            MOE, LARRY, SHEMP }, string = "", strings = { "" }, type = Object[].class, types = { Object[].class })
     public Object dummy4;
 
     @Target(FIELD)
     @Retention(RUNTIME)
     public @interface TestAnnotation {
         String string();
+
         String[] strings();
+
         Class<?> type();
+
         Class<?>[] types();
+
         byte byteValue();
+
         byte[] byteValues();
+
         short shortValue();
+
         short[] shortValues();
+
         int intValue();
+
         int[] intValues();
+
         char charValue();
+
         char[] charValues();
+
         long longValue();
+
         long[] longValues();
+
         float floatValue();
+
         float[] floatValues();
+
         double doubleValue();
+
         double[] doubleValues();
+
         boolean booleanValue();
+
         boolean[] booleanValues();
+
         Stooge stooge();
+
         Stooge[] stooges();
+
         NestAnnotation nest();
+
         NestAnnotation[] nests();
     }
 
     public @interface NestAnnotation {
         String string();
+
         String[] strings();
+
         Class<?> type();
+
         Class<?>[] types();
+
         byte byteValue();
+
         byte[] byteValues();
+
         short shortValue();
+
         short[] shortValues();
+
         int intValue();
+
         int[] intValues();
+
         char charValue();
+
         char[] charValues();
+
         long longValue();
+
         long[] longValues();
+
         float floatValue();
+
         float[] floatValues();
+
         double doubleValue();
+
         double[] doubleValues();
+
         boolean booleanValue();
+
         boolean[] booleanValues();
+
         Stooge stooge();
+
         Stooge[] stooges();
     }
 
@@ -389,22 +182,26 @@ public class AnnotationUtilsTest {
 
     @Test
     public void testEquivalence() {
-        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field2.getAnnotation(TestAnnotation.class)));
+        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field2
+                .getAnnotation(TestAnnotation.class)));
     }
 
     @Test
     public void testSameInstance() {
-        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field1.getAnnotation(TestAnnotation.class)));
+        assertTrue(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field1
+                .getAnnotation(TestAnnotation.class)));
     }
 
     @Test
     public void testNonEquivalentAnnotationsOfSameType() {
-        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field3.getAnnotation(TestAnnotation.class)));
+        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field3
+                .getAnnotation(TestAnnotation.class)));
     }
 
     @Test
     public void testAnnotationsOfDifferingTypes() {
-        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field4.getAnnotation(NestAnnotation.class)));
+        assertFalse(AnnotationUtils.equals(field1.getAnnotation(TestAnnotation.class), field4
+                .getAnnotation(NestAnnotation.class)));
     }
 
     @Test
@@ -427,4 +224,42 @@ public class AnnotationUtilsTest {
                     .getClass()));
         }
     }
+
+    @Test(timeout = 666)
+    public void testGeneratedAnnotationEquivalentToRealAnnotation() throws Exception {
+        final Test real = getClass().getDeclaredMethod(
+                "testGeneratedAnnotationEquivalentToRealAnnotation").getAnnotation(Test.class);
+
+        InvocationHandler generatedTestInvocationHandler = new InvocationHandler() {
+
+            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                if ("equals".equals(method.getName()) && method.getParameterTypes().length == 1) {
+                    return proxy == args[0];
+                }
+                if ("hashCode".equals(method.getName()) && method.getParameterTypes().length == 0) {
+                    return System.identityHashCode(proxy);
+                }
+                if ("toString".equals(method.getName()) && method.getParameterTypes().length == 0) {
+                    return "Test proxy";
+                }
+                return method.invoke(real, args);
+            }
+        };
+
+        Test generated = (Test) Proxy.newProxyInstance(Thread.currentThread()
+                .getContextClassLoader(), new Class[] { Test.class },
+                generatedTestInvocationHandler);
+        assertTrue(real.equals(generated));
+        assertFalse(generated.equals(real));
+        assertTrue(AnnotationUtils.equals(generated, real));
+        assertTrue(AnnotationUtils.equals(real, generated));
+
+        Test generated2 = (Test) Proxy.newProxyInstance(Thread.currentThread()
+                .getContextClassLoader(), new Class[] { Test.class },
+                generatedTestInvocationHandler);
+        assertFalse(generated.equals(generated2));
+        assertFalse(generated2.equals(generated));
+        assertTrue(AnnotationUtils.equals(generated, generated2));
+        assertTrue(AnnotationUtils.equals(generated2, generated));
+    }
 }