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));
+ }
}