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