View Javadoc
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   * Tests for {@link SynchronizedRunListener}.
18   *
19   * @author kcooney (Kevin Cooney)
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 }