blob: 6bd39b78a44aa0787e9e5fab2431bcc035a87df3 [file] [log] [blame]
package org.junit.runner.notification;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
/**
* Tests for {@link SynchronizedRunListener}.
*
* @author kcooney (Kevin Cooney)
*/
public class SynchronizedRunListenerTest {
private static class MethodSignature {
private final Method fMethod;
private final String fName;
private final List<Class<?>> fParameterTypes;
public MethodSignature(Method method) {
fMethod = method;
fName = method.getName();
fParameterTypes = Arrays.asList(method.getParameterTypes());
}
@Override
public String toString() {
return fMethod.toString();
}
@Override
public int hashCode() {
return fName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof MethodSignature)) {
return false;
}
MethodSignature that = (MethodSignature) obj;
return fName.equals(that.fName) && fParameterTypes.equals(that.fParameterTypes);
}
}
private Set<MethodSignature> getAllDeclaredMethods(Class<?> type) {
Set<MethodSignature> methods = new HashSet<MethodSignature>();
for (Method method : type.getDeclaredMethods()) {
methods.add(new MethodSignature(method));
}
return methods;
}
@Test
public void overridesAllMethodsInRunListener() {
Set<MethodSignature> runListenerMethods = getAllDeclaredMethods(RunListener.class);
Set<MethodSignature> synchronizedRunListenerMethods = getAllDeclaredMethods(
SynchronizedRunListener.class);
assertTrue(synchronizedRunListenerMethods.containsAll(runListenerMethods));
}
private static class NamedListener extends RunListener {
private final String fName;
public NamedListener(String name) {
fName = name;
}
@Override
public String toString() {
return "NamedListener";
}
@Override
public int hashCode() {
return fName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof NamedListener)) {
return false;
}
NamedListener that = (NamedListener) obj;
return this.fName.equals(that.fName);
}
}
@Test
public void namedListenerCorrectlyImplementsEqualsAndHashCode() {
NamedListener listener1 = new NamedListener("blue");
NamedListener listener2 = new NamedListener("blue");
NamedListener listener3 = new NamedListener("red");
assertTrue(listener1.equals(listener1));
assertTrue(listener2.equals(listener2));
assertTrue(listener3.equals(listener3));
assertFalse(listener1.equals(null));
assertFalse(listener1.equals(new Object()));
assertTrue(listener1.equals(listener2));
assertTrue(listener2.equals(listener1));
assertFalse(listener1.equals(listener3));
assertFalse(listener3.equals(listener1));
assertEquals(listener1.hashCode(), listener2.hashCode());
assertNotEquals(listener1.hashCode(), listener3.hashCode());
}
@Test
public void toStringDelegates() {
NamedListener listener = new NamedListener("blue");
assertEquals("NamedListener", listener.toString());
assertEquals("NamedListener (with synchronization wrapper)", wrap(listener).toString());
}
@Test
public void equalsDelegates() {
NamedListener listener1 = new NamedListener("blue");
NamedListener listener2 = new NamedListener("blue");
NamedListener listener3 = new NamedListener("red");
assertEquals(wrap(listener1), wrap(listener1));
assertEquals(wrap(listener1), wrap(listener2));
assertNotEquals(wrap(listener1), wrap(listener3));
assertNotEquals(wrap(listener1), listener1);
assertNotEquals(listener1, wrap(listener1));
}
@Test
public void hashCodeDelegates() {
NamedListener listener = new NamedListener("blue");
assertEquals(listener.hashCode(), wrap(listener).hashCode());
}
private SynchronizedRunListener wrap(RunListener listener) {
return new SynchronizedRunListener(listener, this);
}
}