import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import java.util.Hashtable; public class PropertyChangeSupportTest implements Runnable { class Source { PropertyChangeSupport support = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { support.addPropertyChangeListener(l); } public void addPropertyChangeListener(String s, PropertyChangeListener l) { support.addPropertyChangeListener(s,l); } public void removePropertyChangeListener(PropertyChangeListener l) { support.removePropertyChangeListener(l); } public void removePropertyChangeListener(String s, PropertyChangeListener l) { support.removePropertyChangeListener(s,l); } void changeProperty(String name) { support.firePropertyChange(name,"old","new"); } } class Listener implements PropertyChangeListener { Hashtable numEventsReceived = new Hashtable(); int getNumEvents(String propertyName) { Integer i = (Integer)numEventsReceived.get(propertyName); try { return i.intValue(); } catch(NullPointerException e) { return 0; } } public void propertyChange(PropertyChangeEvent e) { Integer i = (Integer)numEventsReceived.get(e.getPropertyName()); try { int newI = i.intValue() + 1; numEventsReceived.put(e.getPropertyName(), new Integer(newI)); } catch(NullPointerException exc) { numEventsReceived.put(e.getPropertyName(), new Integer(1)); } } public void reset() { numEventsReceived = new Hashtable(); } } public void setProperties(Source s) { s.changeProperty("foo"); s.changeProperty("foo"); s.changeProperty("foo"); s.changeProperty("bar"); s.changeProperty("bar"); s.changeProperty("foobar"); } public void shouldEqual(Listener l, int foo, int bar, int foobar, String testName) { String whatsWrong = ""; if(l.getNumEvents("foo") != foo) { whatsWrong += ("foo(" + l.getNumEvents("foo") + ") != " + foo); } if(l.getNumEvents("bar") != bar) { whatsWrong += (" bar(" + l.getNumEvents("bar") + ") != " + bar); } if(l.getNumEvents("foobar") != foobar) { whatsWrong += (" foobar(" + l.getNumEvents("foobar") + ") != " + foobar); } if(!whatsWrong.equals("")) { System.out.println("FAILURE: " + testName + ": " + whatsWrong); } else { System.out.println("Success: " + testName); } } public void run() { Source s = new Source(); /* Test: single multi-property adds */ Listener l = new Listener(); s.addPropertyChangeListener(l); setProperties(s); shouldEqual(l, 3, 2, 1, "single multi-property adds"); /* Test: multiple listeners */ Listener l2 = new Listener(); s.addPropertyChangeListener(l2); setProperties(s); shouldEqual(l, 6, 4, 2, "multiple listeners-l"); shouldEqual(l2, 3, 2, 1, "multiple listeners-l2"); /* Test: multiple multi-property adds */ s.addPropertyChangeListener(l); setProperties(s); shouldEqual(l, 12, 8, 4, "multiple multi-property adds-l"); shouldEqual(l2, 6, 4, 2, "multiple multi-property adds-l2"); /* Test: remove multi-property add */ s.removePropertyChangeListener(l); setProperties(s); shouldEqual(l, 15, 10, 5, "remove multi-property add-l"); shouldEqual(l2, 9, 6, 3, "remove multi-property add-l2"); s.removePropertyChangeListener(l); s.removePropertyChangeListener(l2); l.reset(); l2.reset(); /* ENABLE THIS IF YOU THINK RESET ISN'T HAPPENING shouldEqual(l, 0, 0, 0, "RESET-l"); shouldEqual(l2, 0, 0, 0, "RESET-l2"); setProperties(s); shouldEqual(l, 0, 0, 0, "RESET_AGAIN-l"); shouldEqual(l2, 0, 0, 0, "RESET_AGAIN-l2"); */ /* Test: single property listener */ s.addPropertyChangeListener("foo", l); setProperties(s); shouldEqual(l, 3, 0, 0, "single property listener"); /* Test: multiple different properties */ s.addPropertyChangeListener("bar", l); setProperties(s); shouldEqual(l, 6, 2, 0, "multiple different properties"); /* Test: multiple of same property */ s.addPropertyChangeListener("foo", l); setProperties(s); shouldEqual(l, 12, 4, 0, "multiple of same property"); /* Test: multiple single-property listeners */ s.addPropertyChangeListener("foo", l2); setProperties(s); shouldEqual(l, 18, 6, 0, "multiple single-property listeners-l"); shouldEqual(l2, 3, 0, 0, "multiple single-property listeners-l2"); /* Test: remove single-property add */ s.removePropertyChangeListener("foo", l); setProperties(s); shouldEqual(l, 21, 8, 0, "remove single-property add-l"); shouldEqual(l2, 6, 0, 0, "remove single-property add-l2"); s.removePropertyChangeListener("foo", l); s.removePropertyChangeListener("bar", l); s.removePropertyChangeListener("foo", l2); l.reset(); l2.reset(); /* ENABLE THIS IF YOU THINK RESET ISN'T HAPPENING shouldEqual(l, 0, 0, 0, "RESET-l"); shouldEqual(l2, 0, 0, 0, "RESET-l2"); setProperties(s); shouldEqual(l, 0, 0, 0, "RESET_AGAIN-l"); shouldEqual(l2, 0, 0, 0, "RESET_AGAIN-l2"); */ /* Test: multiple- and single-property interaction */ s.addPropertyChangeListener(l); s.addPropertyChangeListener("foo", l); setProperties(s); shouldEqual(l, 6, 2, 1, "multiple- and single-property interaction"); /* Test: multiple- and single-property interaction: multiple-listener removal */ s.removePropertyChangeListener(l); setProperties(s); shouldEqual(l, 9, 2, 1, "multiple- and single-property interaction: multiple-listener removal"); /* Test: hasListeners() with multiple cases */ if(s.support.hasListeners("foo")) { System.out.println("Success: hasListeners() returning true"); } else { System.out.println("FAILURE: hasListeners() returning true"); } if(s.support.hasListeners("bar")) { System.out.println("FAILURE: hasListeners() returning false"); } else { System.out.println("Success: hasListeners() returning false"); } s.addPropertyChangeListener(l); if(s.support.hasListeners("bar")) { System.out.println("Success: hasListeners() with all-event listeners"); } else { System.out.println("FAILURE: hasListeners() with all-event listeners"); } } public static void main(String[] args) { new PropertyChangeSupportTest().run(); } }