Moving away from testing with java.awt code because on OS X it kicks off a Java UI window, also causing Gump to fail when running headless. See: http://mail-archives.apache.org/mod_mbox/commons-dev/201011.mbox/%3C87lj4p1ekq.fsf@v35516.1blu.de%3E and its replies

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@1040879 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Henri Yandell 2010-12-01 07:18:16 +00:00
parent e8138eafe7
commit bebf1a53f7
2 changed files with 63 additions and 61 deletions

View File

@ -17,8 +17,9 @@
package org.apache.commons.lang3.event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.beans.PropertyChangeEvent;
import java.beans.VetoableChangeListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -26,6 +27,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
@ -40,7 +42,7 @@ public class EventListenerSupportTest extends TestCase
{
public void testAddNullListener()
{
EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
try
{
listenerSupport.addListener(null);
@ -54,7 +56,7 @@ public class EventListenerSupportTest extends TestCase
public void testRemoveNullListener()
{
EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
try
{
listenerSupport.removeListener(null);
@ -66,16 +68,16 @@ public class EventListenerSupportTest extends TestCase
}
}
public void testEventDispatchOrder()
public void testEventDispatchOrder() throws PropertyVetoException
{
EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
final List<ActionListener> calledListeners = new ArrayList<ActionListener>();
EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
final List<VetoableChangeListener> calledListeners = new ArrayList<VetoableChangeListener>();
final ActionListener listener1 = createListener(calledListeners);
final ActionListener listener2 = createListener(calledListeners);
final VetoableChangeListener listener1 = createListener(calledListeners);
final VetoableChangeListener listener2 = createListener(calledListeners);
listenerSupport.addListener(listener1);
listenerSupport.addListener(listener2);
listenerSupport.fire().actionPerformed(new ActionEvent("Hello", 0, "Hello"));
listenerSupport.fire().vetoableChange(new PropertyChangeEvent(new Date(), "Day", 4, 5));
assertEquals(calledListeners.size(), 2);
assertSame(calledListeners.get(0), listener1);
assertSame(calledListeners.get(1), listener2);
@ -107,32 +109,32 @@ public class EventListenerSupportTest extends TestCase
}
}
public void testRemoveListenerDuringEvent()
public void testRemoveListenerDuringEvent() throws PropertyVetoException
{
final EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
for (int i = 0; i < 10; ++i)
{
addDeregisterListener(listenerSupport);
}
assertEquals(listenerSupport.getListenerCount(), 10);
listenerSupport.fire().actionPerformed(new ActionEvent("Hello", 0, "Hello"));
listenerSupport.fire().vetoableChange(new PropertyChangeEvent(new Date(), "Day", 4, 5));
assertEquals(listenerSupport.getListenerCount(), 0);
}
public void testGetListeners() {
final EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
ActionListener[] listeners = listenerSupport.getListeners();
VetoableChangeListener[] listeners = listenerSupport.getListeners();
assertEquals(0, listeners.length);
assertEquals(ActionListener.class, listeners.getClass().getComponentType());
ActionListener[] empty = listeners;
assertEquals(VetoableChangeListener.class, listeners.getClass().getComponentType());
VetoableChangeListener[] empty = listeners;
//for fun, show that the same empty instance is used
assertSame(empty, listenerSupport.getListeners());
ActionListener listener1 = EasyMock.createNiceMock(ActionListener.class);
VetoableChangeListener listener1 = EasyMock.createNiceMock(VetoableChangeListener.class);
listenerSupport.addListener(listener1);
assertEquals(1, listenerSupport.getListeners().length);
ActionListener listener2 = EasyMock.createNiceMock(ActionListener.class);
VetoableChangeListener listener2 = EasyMock.createNiceMock(VetoableChangeListener.class);
listenerSupport.addListener(listener2);
assertEquals(2, listenerSupport.getListeners().length);
listenerSupport.removeListener(listener1);
@ -141,14 +143,14 @@ public class EventListenerSupportTest extends TestCase
assertSame(empty, listenerSupport.getListeners());
}
public void testSerialization() throws IOException, ClassNotFoundException {
EventListenerSupport<ActionListener> listenerSupport = EventListenerSupport.create(ActionListener.class);
listenerSupport.addListener(new ActionListener() {
public void testSerialization() throws IOException, ClassNotFoundException, PropertyVetoException {
EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
listenerSupport.addListener(new VetoableChangeListener() {
public void actionPerformed(ActionEvent e) {
public void vetoableChange(PropertyChangeEvent e) {
}
});
listenerSupport.addListener(EasyMock.createNiceMock(ActionListener.class));
listenerSupport.addListener(EasyMock.createNiceMock(VetoableChangeListener.class));
//serialize:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@ -159,20 +161,20 @@ public class EventListenerSupportTest extends TestCase
//deserialize:
@SuppressWarnings("unchecked")
EventListenerSupport<ActionListener> deserializedListenerSupport = (EventListenerSupport<ActionListener>) new ObjectInputStream(
EventListenerSupport<VetoableChangeListener> deserializedListenerSupport = (EventListenerSupport<VetoableChangeListener>) new ObjectInputStream(
new ByteArrayInputStream(outputStream.toByteArray())).readObject();
//make sure we get a listener array back, of the correct component type, and that it contains only the serializable mock
ActionListener[] listeners = deserializedListenerSupport.getListeners();
assertEquals(ActionListener.class, listeners.getClass().getComponentType());
VetoableChangeListener[] listeners = deserializedListenerSupport.getListeners();
assertEquals(VetoableChangeListener.class, listeners.getClass().getComponentType());
assertEquals(1, listeners.length);
//now verify that the mock still receives events; we can infer that the proxy was correctly reconstituted
ActionListener listener = listeners[0];
ActionEvent evt = new ActionEvent(new Object(), 666, "sit");
listener.actionPerformed(evt);
VetoableChangeListener listener = listeners[0];
PropertyChangeEvent evt = new PropertyChangeEvent(new Date(), "Day", 7, 9);
listener.vetoableChange(evt);
EasyMock.replay(listener);
deserializedListenerSupport.fire().actionPerformed(evt);
deserializedListenerSupport.fire().vetoableChange(evt);
EasyMock.verify(listener);
//remove listener and verify we get an empty array of listeners
@ -180,11 +182,11 @@ public class EventListenerSupportTest extends TestCase
assertEquals(0, deserializedListenerSupport.getListeners().length);
}
public void testSubclassInvocationHandling() {
public void testSubclassInvocationHandling() throws PropertyVetoException {
@SuppressWarnings("serial")
EventListenerSupport<ActionListener> eventListenerSupport = new EventListenerSupport<ActionListener>(
ActionListener.class) {
EventListenerSupport<VetoableChangeListener> eventListenerSupport = new EventListenerSupport<VetoableChangeListener>(
VetoableChangeListener.class) {
protected java.lang.reflect.InvocationHandler createInvocationHandler() {
return new ProxyInvocationHandler() {
/**
@ -193,42 +195,42 @@ public class EventListenerSupportTest extends TestCase
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return "actionPerformed".equals(method.getName())
&& "ignore".equals(((ActionEvent) args[0]).getActionCommand()) ? null
return "vetoableChange".equals(method.getName())
&& "Hour".equals(((PropertyChangeEvent) args[0]).getPropertyName()) ? null
: super.invoke(proxy, method, args);
}
};
};
};
ActionListener listener = EasyMock.createNiceMock(ActionListener.class);
VetoableChangeListener listener = EasyMock.createNiceMock(VetoableChangeListener.class);
eventListenerSupport.addListener(listener);
Object source = new Object();
ActionEvent ignore = new ActionEvent(source, 0, "ignore");
ActionEvent respond = new ActionEvent(source, 1, "respond");
listener.actionPerformed(respond);
Object source = new Date();
PropertyChangeEvent ignore = new PropertyChangeEvent(source, "Hour", 5, 6);
PropertyChangeEvent respond = new PropertyChangeEvent(source, "Day", 6, 7);
listener.vetoableChange(respond);
EasyMock.replay(listener);
eventListenerSupport.fire().actionPerformed(ignore);
eventListenerSupport.fire().actionPerformed(respond);
eventListenerSupport.fire().vetoableChange(ignore);
eventListenerSupport.fire().vetoableChange(respond);
EasyMock.verify(listener);
}
private void addDeregisterListener(final EventListenerSupport<ActionListener> listenerSupport)
private void addDeregisterListener(final EventListenerSupport<VetoableChangeListener> listenerSupport)
{
listenerSupport.addListener(new ActionListener()
listenerSupport.addListener(new VetoableChangeListener()
{
public void actionPerformed(ActionEvent e)
public void vetoableChange(PropertyChangeEvent e)
{
listenerSupport.removeListener(this);
}
});
}
private ActionListener createListener(final List<ActionListener> calledListeners)
private VetoableChangeListener createListener(final List<VetoableChangeListener> calledListeners)
{
return new ActionListener()
return new VetoableChangeListener()
{
public void actionPerformed(ActionEvent e)
public void vetoableChange(PropertyChangeEvent e)
{
calledListeners.add(this);
}

View File

@ -16,14 +16,14 @@
*/
package org.apache.commons.lang3.event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.naming.event.ObjectChangeListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.VetoableChangeListener;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;
@ -51,15 +51,15 @@ public class EventUtilsTest extends TestCase
{
final PropertyChangeSource src = new PropertyChangeSource();
EventCountingInvociationHandler handler = new EventCountingInvociationHandler();
ActionListener listener = handler.createListener(ActionListener.class);
ObjectChangeListener listener = handler.createListener(ObjectChangeListener.class);
try
{
EventUtils.addEventListener(src, ActionListener.class, listener);
EventUtils.addEventListener(src, ObjectChangeListener.class, listener);
fail("Should not be allowed to add a listener to an object that doesn't support it.");
}
catch (IllegalArgumentException e)
{
assertEquals("Class " + src.getClass().getName() + " does not have a public add" + ActionListener.class.getSimpleName() + " method which takes a parameter of type " + ActionListener.class.getName() + ".", e.getMessage());
assertEquals("Class " + src.getClass().getName() + " does not have a public add" + ObjectChangeListener.class.getSimpleName() + " method which takes a parameter of type " + ObjectChangeListener.class.getName() + ".", e.getMessage());
}
}
@ -68,9 +68,9 @@ public class EventUtilsTest extends TestCase
final ExceptionEventSource src = new ExceptionEventSource();
try
{
EventUtils.addEventListener(src, ActionListener.class, new ActionListener()
EventUtils.addEventListener(src, PropertyChangeListener.class, new PropertyChangeListener()
{
public void actionPerformed(ActionEvent e)
public void propertyChange(PropertyChangeEvent e)
{
// Do nothing!
}
@ -127,17 +127,17 @@ public class EventUtilsTest extends TestCase
final EventCounter counter = new EventCounter();
EventUtils.bindEventsToMethod(counter, "eventOccurred", src, MultipleEventListener.class, "event1");
assertEquals(0, counter.getCount());
src.listeners.fire().event1(new ActionEvent(src, ActionEvent.ACTION_PERFORMED, "event1"));
src.listeners.fire().event1(new PropertyChangeEvent(new Date(), "Day", 0, 1));
assertEquals(1, counter.getCount());
src.listeners.fire().event2(new ActionEvent(src, ActionEvent.ACTION_PERFORMED, "event2"));
src.listeners.fire().event2(new PropertyChangeEvent(new Date(), "Day", 1, 2));
assertEquals(1, counter.getCount());
}
public static interface MultipleEventListener
{
public void event1(ActionEvent e);
public void event1(PropertyChangeEvent e);
public void event2(ActionEvent e);
public void event2(PropertyChangeEvent e);
}
public static class EventCounter
@ -215,7 +215,7 @@ public class EventUtilsTest extends TestCase
public static class ExceptionEventSource
{
public void addActionListener(ActionListener listener)
public void addPropertyChangeListener(PropertyChangeListener listener)
{
throw new RuntimeException();
}