1 package org.junit.runner.notification;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertFalse;
5 import static org.junit.Assert.assertNotEquals;
6 import static org.junit.Assert.assertTrue;
7
8 import java.lang.reflect.Method;
9 import java.util.Arrays;
10 import java.util.HashSet;
11 import java.util.List;
12 import java.util.Set;
13
14 import org.junit.Test;
15
16
17
18
19
20
21 public class SynchronizedRunListenerTest {
22
23 private static class MethodSignature {
24 private final Method fMethod;
25 private final String fName;
26 private final List<Class<?>> fParameterTypes;
27
28 public MethodSignature(Method method) {
29 fMethod = method;
30 fName = method.getName();
31 fParameterTypes = Arrays.asList(method.getParameterTypes());
32 }
33
34 @Override
35 public String toString() {
36 return fMethod.toString();
37 }
38
39 @Override
40 public int hashCode() {
41 return fName.hashCode();
42 }
43
44 @Override
45 public boolean equals(Object obj) {
46 if (this == obj) {
47 return true;
48 }
49 if (!(obj instanceof MethodSignature)) {
50 return false;
51 }
52 MethodSignature that = (MethodSignature) obj;
53 return fName.equals(that.fName) && fParameterTypes.equals(that.fParameterTypes);
54 }
55 }
56
57 private Set<MethodSignature> getAllDeclaredMethods(Class<?> type) {
58 Set<MethodSignature> methods = new HashSet<MethodSignature>();
59 for (Method method : type.getDeclaredMethods()) {
60 methods.add(new MethodSignature(method));
61 }
62 return methods;
63 }
64
65 @Test
66 public void overridesAllMethodsInRunListener() {
67 Set<MethodSignature> runListenerMethods = getAllDeclaredMethods(RunListener.class);
68 Set<MethodSignature> synchronizedRunListenerMethods = getAllDeclaredMethods(
69 SynchronizedRunListener.class);
70
71 assertTrue(synchronizedRunListenerMethods.containsAll(runListenerMethods));
72 }
73
74 private static class NamedListener extends RunListener {
75 private final String fName;
76
77 public NamedListener(String name) {
78 fName = name;
79 }
80
81 @Override
82 public String toString() {
83 return "NamedListener";
84 }
85
86 @Override
87 public int hashCode() {
88 return fName.hashCode();
89 }
90
91 @Override
92 public boolean equals(Object obj) {
93 if (this == obj) {
94 return true;
95 }
96 if (!(obj instanceof NamedListener)) {
97 return false;
98 }
99 NamedListener that = (NamedListener) obj;
100 return this.fName.equals(that.fName);
101 }
102 }
103
104 @Test
105 public void namedListenerCorrectlyImplementsEqualsAndHashCode() {
106 NamedListener listener1 = new NamedListener("blue");
107 NamedListener listener2 = new NamedListener("blue");
108 NamedListener listener3 = new NamedListener("red");
109
110 assertTrue(listener1.equals(listener1));
111 assertTrue(listener2.equals(listener2));
112 assertTrue(listener3.equals(listener3));
113
114 assertFalse(listener1.equals(null));
115 assertFalse(listener1.equals(new Object()));
116
117 assertTrue(listener1.equals(listener2));
118 assertTrue(listener2.equals(listener1));
119 assertFalse(listener1.equals(listener3));
120 assertFalse(listener3.equals(listener1));
121
122 assertEquals(listener1.hashCode(), listener2.hashCode());
123 assertNotEquals(listener1.hashCode(), listener3.hashCode());
124 }
125
126 @Test
127 public void toStringDelegates() {
128 NamedListener listener = new NamedListener("blue");
129
130 assertEquals("NamedListener", listener.toString());
131 assertEquals("NamedListener (with synchronization wrapper)", wrap(listener).toString());
132 }
133
134 @Test
135 public void equalsDelegates() {
136 NamedListener listener1 = new NamedListener("blue");
137 NamedListener listener2 = new NamedListener("blue");
138 NamedListener listener3 = new NamedListener("red");
139
140 assertEquals(wrap(listener1), wrap(listener1));
141 assertEquals(wrap(listener1), wrap(listener2));
142 assertNotEquals(wrap(listener1), wrap(listener3));
143 assertNotEquals(wrap(listener1), listener1);
144 assertNotEquals(listener1, wrap(listener1));
145 }
146
147 @Test
148 public void hashCodeDelegates() {
149 NamedListener listener = new NamedListener("blue");
150 assertEquals(listener.hashCode(), wrap(listener).hashCode());
151 }
152
153 private SynchronizedRunListener wrap(RunListener listener) {
154 return new SynchronizedRunListener(listener, this);
155 }
156 }