1 package org.pojomatic.internal; 2 3 import static org.testng.Assert.*; 4 5 import org.testng.annotations.Test; 6 import java.lang.reflect.Method; 7 import java.util.EnumSet; 8 9 import org.pojomatic.internal.a.C1; 10 import org.pojomatic.internal.a.C3; 11 import org.pojomatic.internal.b.C2; 12 import org.pojomatic.internal.b.C4; 13 14 public class OverridableMethodsTest { 15 private static final EnumSet<PropertyRole> EQUALS_HASH_CODE = 16 EnumSet.of(PropertyRole.EQUALS, PropertyRole.HASH_CODE); 17 private static final EnumSet<PropertyRole> EQUALS = EnumSet.of(PropertyRole.EQUALS); 18 private static final EnumSet<PropertyRole> ALL = EnumSet.allOf(PropertyRole.class); 19 20 @Test public void testPackagePrivate() throws Exception { 21 checkMethod("packagePrivate", true, true, false, false); 22 } 23 24 @Test public void testPackagePrivateToProtected() throws Exception { 25 checkMethod("packagePrivateOverriddenProtected", true, true, false, false); 26 } 27 28 @Test public void testPackagePrivateToPublic() throws Exception { 29 checkMethod("packagePrivateOverriddenPublic", true, true, false, false); 30 } 31 32 @Test public void testProtected() throws Exception { 33 checkMethod("protectedMethod", true, false, false, false); 34 } 35 36 @Test public void testPublic() throws Exception { 37 checkMethod("publicMethod", true, false, false, false); 38 } 39 40 @Test 41 public void testEqualsThenEquals() throws Exception { 42 OverridableMethods overridableMethods = new OverridableMethods(); 43 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 44 method(C1.class, "publicMethod"), EQUALS), EQUALS); 45 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 46 method(C2.class, "publicMethod"), EQUALS), EnumSet.noneOf(PropertyRole.class)); 47 } 48 49 @Test 50 public void testEqualsThenToString() throws Exception { 51 OverridableMethods overridableMethods = new OverridableMethods(); 52 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 53 method(C1.class, "publicMethod"), EQUALS), EQUALS); 54 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 55 method(C2.class, "publicMethod"), EnumSet.of(PropertyRole.TO_STRING)), EnumSet.of(PropertyRole.TO_STRING)); 56 } 57 58 @Test 59 public void testEqualsThenToEqualsString() throws Exception { 60 OverridableMethods overridableMethods = new OverridableMethods(); 61 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 62 method(C1.class, "publicMethod"), EQUALS), EQUALS); 63 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 64 method(C2.class, "publicMethod"), EnumSet.of(PropertyRole.TO_STRING, PropertyRole.EQUALS)), EnumSet.of(PropertyRole.TO_STRING)); 65 } 66 67 @Test 68 public void testEqualsHashCodeThenEqualsHashCode() throws Exception { 69 OverridableMethods overridableMethods = new OverridableMethods(); 70 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 71 method(C1.class, "publicMethod"), EQUALS_HASH_CODE), EQUALS_HASH_CODE); 72 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 73 method(C2.class, "publicMethod"), EQUALS_HASH_CODE), EnumSet.noneOf(PropertyRole.class)); 74 } 75 76 @Test 77 public void testEqualsThenEqualsHashCode() throws Exception { 78 OverridableMethods overridableMethods = new OverridableMethods(); 79 assertEquals(overridableMethods.checkAndMaybeAddRolesToMethod( 80 method(C1.class, "publicMethod"), EQUALS), EQUALS); 81 try { 82 overridableMethods.checkAndMaybeAddRolesToMethod( 83 method(C2.class, "publicMethod"), EQUALS_HASH_CODE); 84 fail("Exception expected"); 85 } 86 catch (IllegalArgumentException e) { 87 assertEquals(e.getMessage(), "Method org.pojomatic.internal.b.C2.publicMethod is requested to be included in hashCode" 88 + " computations, but already overrides a method which is requested for" 89 + " equals computations, but not hashCode computations."); 90 } 91 } 92 93 private void checkMethod( 94 String methodName, boolean c1Add, boolean c2Add, boolean c3Add, boolean c4Add) 95 throws Exception { 96 OverridableMethods overridableMethods = new OverridableMethods(); 97 assertEquals(!overridableMethods.checkAndMaybeAddRolesToMethod( 98 method(C1.class, methodName), ALL).isEmpty(), c1Add); 99 assertEquals(!overridableMethods.checkAndMaybeAddRolesToMethod( 100 method(C2.class, methodName), ALL).isEmpty(), c2Add); 101 assertEquals(!overridableMethods.checkAndMaybeAddRolesToMethod( 102 method(C3.class, methodName), ALL).isEmpty(), c3Add); 103 assertEquals(!overridableMethods.checkAndMaybeAddRolesToMethod( 104 method(C4.class, methodName), ALL).isEmpty(), c4Add); 105 } 106 107 private static Method method(Class<?> clazz, String name) throws Exception { 108 return clazz.getDeclaredMethod(name); 109 } 110 }