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 }