View Javadoc
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 }