Author: mbenson
Date: Mon Sep 13 22:12:35 2010
New Revision: 996705

URL: http://svn.apache.org/viewvc?rev=996705&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=996705&r1=996704&r2=996705&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:12:35 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;
 
@@ -427,4 +430,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));
+    }
 }


Reply via email to