119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson/* 219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * Copyright (C) 2010 Google Inc. 319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * 419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * you may not use this file except in compliance with the License. 619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * You may obtain a copy of the License at 719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * 819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * 1019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * Unless required by applicable law or agreed to in writing, software 1119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 1219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * See the License for the specific language governing permissions and 1419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * limitations under the License. 1519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson */ 1619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 1719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonpackage libcore.java.util.beans; 1819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 1919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.beans.PropertyChangeEvent; 2019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.beans.PropertyChangeListener; 2119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.beans.PropertyChangeListenerProxy; 2219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.beans.PropertyChangeSupport; 2319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.io.Serializable; 2419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.util.ArrayList; 2519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.util.Arrays; 2619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.util.Collections; 2719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.util.EventListener; 2819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport java.util.List; 2919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonimport junit.framework.TestCase; 30b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilsonimport libcore.util.SerializationTester; 3119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 3219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilsonpublic final class PropertyChangeSupportTest extends TestCase { 3319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 3419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testOldAndNewAreBothNull() { 3519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 3619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 3719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog listener = new EventLog(); 3819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(listener); 3919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 4019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent nullToNull = new PropertyChangeEvent(bean, "a", null, null); 4119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(nullToNull); 4219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(nullToNull), listener.log); 4319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 4419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 4519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testOldAndNewAreTheSame() { 4619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 4719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 4819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog listener = new EventLog(); 4919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(listener); 5019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 5119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent xToX = new PropertyChangeEvent(bean, "a", "x", new String("x")); 5219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(xToX); 5319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(), listener.log); 5419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 5519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 5619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testEventsFilteredByProxies() { 5719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 5819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent eventA = new PropertyChangeEvent(bean, "a", false, true); 5919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent eventB = new PropertyChangeEvent(bean, "b", false, true); 6019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent eventC = new PropertyChangeEvent(bean, "c", false, true); 6119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 6219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 6319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 6419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog all = new EventLog(); 6519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(all); 6619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 6719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedA = new EventLog(); 6819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy("a", proxiedA)); 6919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 7019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog addA = new EventLog(); 7119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", addA); 7219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 7319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog addAProxiedB = new EventLog(); 7419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", new PropertyChangeListenerProxy("b", addAProxiedB)); 7519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 7619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedAB = new EventLog(); 7719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy( 7819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson "a", new PropertyChangeListenerProxy("b", proxiedAB))); 7919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 8019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedAA = new EventLog(); 8119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy("a", 8219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("a", proxiedAA))); 8319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 8419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedAAC = new EventLog(); 8519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy("a", 8619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("a", 8719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("c", proxiedAAC)))); 8819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 8919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(eventA); 9019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(eventB); 9119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(eventC); 9219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 9319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.asList(eventA, eventB, eventC), all.log); 9419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.asList(eventA), proxiedA.log); 9519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.asList(eventA), addA.log); 9619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(), addAProxiedB.log); 9719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(), proxiedAB.log); 9819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(eventA), proxiedAA.log); 9919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.<PropertyChangeEvent>asList(), proxiedAAC.log); 10019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 10119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 10219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson /** 10319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * Test that we need to do our own equals() work to manually unwrap an 10419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson * arbitrary number of proxies. 10519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson */ 10619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testRemoveWithProxies() { 10719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 10819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 10919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 11019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog all = new EventLog(); 11119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(all); 11219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(1, support.getPropertyChangeListeners().length); 11319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 11419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedA = new EventLog(); 11519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy("a", proxiedA)); 11619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(2, support.getPropertyChangeListeners().length); 11719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 11819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog addA = new EventLog(); 11919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", addA); 12019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(3, support.getPropertyChangeListeners().length); 12119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 12219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog addAProxiedB = new EventLog(); 12319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", new PropertyChangeListenerProxy("b", addAProxiedB)); 12419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(4, support.getPropertyChangeListeners().length); 12519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 12619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedAB = new EventLog(); 12719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy proxyAB = new PropertyChangeListenerProxy( 12819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson "a", new PropertyChangeListenerProxy("b", proxiedAB)); 12919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(proxyAB); 13019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(5, support.getPropertyChangeListeners().length); 13119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 13219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog proxiedAAC = new EventLog(); 13319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(new PropertyChangeListenerProxy("a", 13419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("a", 13519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("c", proxiedAAC)))); 13619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(6, support.getPropertyChangeListeners().length); 13719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 13819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener(all); 13919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(5, support.getPropertyChangeListeners().length); 14019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener("a", proxiedA); 14119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(4, support.getPropertyChangeListeners().length); 14219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener(new PropertyChangeListenerProxy("a", addA)); 14319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(3, support.getPropertyChangeListeners().length); 14419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener( 14519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson "a", new PropertyChangeListenerProxy("b", addAProxiedB)); 14619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(2, support.getPropertyChangeListeners().length); 14719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener(proxyAB); 14819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(1, support.getPropertyChangeListeners().length); 14919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 15019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener(proxiedAAC); 15119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener(new PropertyChangeListenerProxy("a", proxiedAAC)); 15219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener("a", new PropertyChangeListenerProxy("c", proxiedAAC)); 15319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener("a", new PropertyChangeListenerProxy("c", 15419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("a", proxiedAAC))); 15519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(1, support.getPropertyChangeListeners().length); 15619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 15719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.removePropertyChangeListener("a", new PropertyChangeListenerProxy("a", 15819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson new PropertyChangeListenerProxy("c", proxiedAAC))); 15919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(0, support.getPropertyChangeListeners().length); 16019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 16119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 16219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testAddingOneListenerTwice() { 16319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 16419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 16519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog log = new EventLog(); 16619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", log); 16719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(log); 16819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(log); 16919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", log); 17019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 17119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent eventA = new PropertyChangeEvent(bean, "a", false, true); 17219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeEvent eventB = new PropertyChangeEvent(bean, "b", false, true); 17319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 17419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(eventA); 17519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.firePropertyChange(eventB); 17619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 17719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(Arrays.asList(eventA, eventA, eventA, eventA, eventB, eventB), log.log); 17819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 17919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 18019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testAddingAListenerActuallyAddsAProxy() { 18119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 18219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 18319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListener listener = new PropertyChangeListener() { 18419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void propertyChange(PropertyChangeEvent event) {} 18519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson }; 18619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", listener); 18719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 18819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy p1 18919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson = (PropertyChangeListenerProxy) support.getPropertyChangeListeners()[0]; 19019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(PropertyChangeListenerProxy.class, p1.getClass()); 19119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertTrue(p1 != listener); // weird but consistent with the RI 19219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals("a", p1.getPropertyName()); 19319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(listener, p1.getListener()); 19419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 19519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 19619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testAddingAProxy() { 19719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = new Object(); 19819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 19919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListener listener = new PropertyChangeListener() { 20019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void propertyChange(PropertyChangeEvent event) {} 20119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson }; 20219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy proxy = new PropertyChangeListenerProxy("a", listener); 20319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("b", proxy); 20419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 20519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson // this proxy sets us up to receive 'b' events 20619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy p1 20719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson = (PropertyChangeListenerProxy) support.getPropertyChangeListeners()[0]; 20819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(PropertyChangeListenerProxy.class, p1.getClass()); 20919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals("b", p1.getPropertyName()); 21019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 21119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson // this proxy sets us up to receive 'a' events 21219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy p2 = (PropertyChangeListenerProxy) p1.getListener(); 21319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(PropertyChangeListenerProxy.class, p2.getClass()); 21419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals("a", p2.getPropertyName()); 21519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals(listener, p2.getListener()); 21619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 21719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 21819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void testSerialize() { 21919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson String s = "aced0005737200206a6176612e6265616e732e50726f70657274794368616e67" 22019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "65537570706f727458d5d264574860bb03000349002a70726f706572747943686" 22119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "16e6765537570706f727453657269616c697a65644461746156657273696f6e4c" 22219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "00086368696c6472656e7400154c6a6176612f7574696c2f486173687461626c6" 22319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "53b4c0006736f757263657400124c6a6176612f6c616e672f4f626a6563743b78" 22419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "7000000002737200136a6176612e7574696c2e486173687461626c6513bb0f252" 22519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "14ae4b803000246000a6c6f6164466163746f724900097468726573686f6c6478" 22619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "703f4000000000000877080000000b00000001740001617371007e00000000000" 22719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "2707400046265616e7372003a6c6962636f72652e6a6176612e7574696c2e6265" 22819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "616e732e50726f70657274794368616e6765537570706f7274546573742445766" 22919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "56e744c6f67b92667637d0b6f450200024c00036c6f677400104c6a6176612f75" 23019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "74696c2f4c6973743b4c00046e616d657400124c6a6176612f6c616e672f53747" 23119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "2696e673b7870737200136a6176612e7574696c2e41727261794c6973747881d2" 23219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "1d99c7619d03000149000473697a6578700000000077040000000a7874000b6c6" 23319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "97374656e6572546f4171007e000c70787871007e00087371007e00097371007e" 23419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson + "000d0000000077040000000a7874000d6c697374656e6572546f416c6c7078"; 23519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 23619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Object bean = "bean"; 23719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeSupport support = new PropertyChangeSupport(bean); 23819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog listenerToAll = new EventLog(); 23919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson listenerToAll.name = "listenerToAll"; 24019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson EventLog listenerToA = new EventLog(); 24119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson listenerToA.name = "listenerToA"; 24219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener(listenerToAll); 24319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", listenerToA); 24419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson support.addPropertyChangeListener("a", listenerToA); 24519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 246b416ef5dc224630af2b9393a15ae120b27e4864aJesse Wilson new SerializationTester<PropertyChangeSupport>(support, s) { 24719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson @Override protected boolean equals(PropertyChangeSupport a, PropertyChangeSupport b) { 24819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson return describe(a.getPropertyChangeListeners()) 24919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson .equals(describe(b.getPropertyChangeListeners())); 25019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 25119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson @Override protected void verify(PropertyChangeSupport deserialized) { 25219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson assertEquals("[a to listenerToA, a to listenerToA, listenerToAll]", 25319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson describe(deserialized.getPropertyChangeListeners())); 25419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 25519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson }.test(); 25619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 25719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 25819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson private String describe(PropertyChangeListener[] listeners) { 25919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson List<String> result = new ArrayList<String>(); 26019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson for (PropertyChangeListener listener : listeners) { 26119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson result.add(describe(listener)); 26219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 26319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson Collections.sort(result); 26419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson return result.toString(); 26519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 26619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 26719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson private String describe(EventListener listener) { 26819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson if (listener instanceof PropertyChangeListenerProxy) { 26919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy) listener; 27019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson return proxy.getPropertyName() + " to " + describe(proxy.getListener()); 27119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } else { 27219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson return listener.toString(); 27319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 27419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 27519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson 27619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson static class EventLog implements PropertyChangeListener, Serializable { 27719a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson String name = "EventLog"; 27819a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson List<PropertyChangeEvent> log = new ArrayList<PropertyChangeEvent>(); 27919a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson public void propertyChange(PropertyChangeEvent event) { 28019a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson log.add(event); 28119a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 28219a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson @Override public String toString() { 28319a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson return name; 28419a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 28519a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson } 28619a270e90b1e992c1f6639f355ae13564c2f3a6aJesse Wilson} 287