| 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); |
| } |
| } |