package org.limewire.listener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.concurrent.atomic.AtomicReference; import javax.swing.SwingUtilities; import junit.framework.Test; import org.limewire.util.BaseTestCase; /** * A class to test the methods of EventListenerList: adding, removing. * Need to add tests for multiple adds, adds to existing lists, adding different * types of listeners, as well as broadcasting. */ public class SwingSafePropertyChangeSupportTest extends BaseTestCase { public SwingSafePropertyChangeSupportTest(String name) { super(name); } public static Test suite() { return buildTestSuite(SwingSafePropertyChangeSupportTest.class); } public void testSwing() throws Exception { final PropertyChangeSupport support = new SwingSafePropertyChangeSupport(this); Listener listener = new Listener(); support.addPropertyChangeListener(listener); assertNull(listener.t); support.firePropertyChange("a", false, true); assertSame(Thread.currentThread(), listener.t); PropertyChangeListener[] listeners = support.getPropertyChangeListeners(); assertEquals(1, listeners.length); assertSame(listener, listeners[0]); final Listener swingListener = new Listener(); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { support.addPropertyChangeListener(swingListener); } }); listener.t = null; support.firePropertyChange("a", false, true); assertSame(Thread.currentThread(), listener.t); final AtomicReference<Thread> swingThread = new AtomicReference<Thread>(); SwingUtilities.invokeAndWait(new Runnable() { public void run() { swingThread.set(Thread.currentThread()); }}); assertSame(swingThread.get(), swingListener.t); listeners = support.getPropertyChangeListeners(); assertEquals(2, listeners.length); assertSame(listener, listeners[0]); assertSame(swingListener, listeners[1]); support.removePropertyChangeListener(swingListener); listeners = support.getPropertyChangeListeners(); assertEquals(1, listeners.length); assertSame(listener, listeners[0]); support.removePropertyChangeListener(listener); listeners = support.getPropertyChangeListeners(); assertEquals(0, listeners.length); } private static class Listener implements PropertyChangeListener { volatile Thread t; @Override public void propertyChange(PropertyChangeEvent evt) { this.t = Thread.currentThread(); } } }