Package org.apache.harmony.beans.tests.java.beans

Source Code of org.apache.harmony.beans.tests.java.beans.PropertyChangeSupportTest$MockPropertyChangeListener2

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.harmony.beans.tests.java.beans;

import java.beans.IndexedPropertyChangeEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeListenerProxy;
import java.beans.PropertyChangeSupport;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

import org.apache.harmony.beans.tests.support.NonSerializablePropertyChangeListener;
import org.apache.harmony.beans.tests.support.SerializablePropertyChangeListener;
import org.apache.harmony.testframework.serialization.SerializationTest;
import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;

import tests.util.SerializationTester;

/**
* Test class PropertyChangeSupport.
*/
public class PropertyChangeSupportTest extends TestCase {

    /*
     * Test the constructor with a normal parameter.
     */
    public void testConstructor_Normal() {
        Object src = new Object();
        new PropertyChangeSupport(src);
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener) with a
     * normal listener parameter.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        PropertyChangeListener l4 = new PropertyChangeListenerProxy("myProp",
                l3);

        sup.addPropertyChangeListener(l1);

        assertEquals(1, sup.getPropertyChangeListeners().length);
        assertSame(l1, sup.getPropertyChangeListeners()[0]);

        sup.removePropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        assertEquals(1, sup.getPropertyChangeListeners().length);
        assertSame(l2, ((PropertyChangeListenerProxy) sup
                .getPropertyChangeListeners()[0]).getListener());
        assertNotSame(l3, sup.getPropertyChangeListeners()[0]);

        sup.removePropertyChangeListener(sup.getPropertyChangeListeners()[0]);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        sup.addPropertyChangeListener(l4);
        //RI asserts to true here, really strange behavior
        assertNotSame(l3, ((PropertyChangeListenerProxy) sup
                .getPropertyChangeListeners()[0]).getListener());
        assertNotSame(l4, sup.getPropertyChangeListeners()[0]);
        assertSame(
                l2,
                ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) sup
                        .getPropertyChangeListeners()[0]).getListener())
                        .getListener());
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener) with a
     * null listener parameter.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_Null() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.addPropertyChangeListener(null);
        PropertyChangeListener[] listeners = sup.getPropertyChangeListeners();
        assertEquals(0, listeners.length);
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener) with a
     * listener parameter that has already been registered.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_Duplicate() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l1);

        PropertyChangeListener[] listeners = sup.getPropertyChangeListeners();
        assertEquals(2, listeners.length);
        assertSame(l1, listeners[0]);
        assertSame(l1, listeners[1]);
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener,
     * String) with a normal listener parameter and property name parameter.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_String_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        PropertyChangeListener[] listeners;

        sup.addPropertyChangeListener("myProp2", l1);

        listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        assertSame(l1, ((PropertyChangeListenerProxy) listeners[0])
                .getListener());

        sup.removePropertyChangeListener(listeners[0]);
        sup.addPropertyChangeListener("myProp3", l3);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        // pay attention to this recursive proxy
        assertNotSame(l3, ((PropertyChangeListenerProxy) listeners[0])
                .getListener());
        assertNotSame(l3, listeners[0]);
        assertSame(
                l2,
                ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[0])
                        .getListener()).getListener());

        listeners = sup.getPropertyChangeListeners("myProp");
        assertEquals(0, listeners.length);

        listeners = sup.getPropertyChangeListeners("myProp3");
        assertEquals(1, listeners.length);
        // pay attention to this recursive proxy
        assertNotSame(l3, ((PropertyChangeListenerProxy) listeners[0])
                .getListener());
        assertNotSame(l3, listeners[0]);
        assertSame(l2, ((PropertyChangeListenerProxy) listeners[0])
                .getListener());

    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener,
     * String) with a null listener parameter and a normal property name
     * parameter.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_String_NullListener() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.addPropertyChangeListener("myProp", null);

        PropertyChangeListener[] listeners = sup.getPropertyChangeListeners();
        assertEquals(0, listeners.length);

        new PropertyChangeListenerProxy("myProp", null);
        assertEquals(0, listeners.length);
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener,
     * String) with a normal listener parameter and a null property name
     * parameter.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_String_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);

        sup.addPropertyChangeListener(null, l1);
        sup.addPropertyChangeListener(null, l3);
        l3 = new PropertyChangeListenerProxy(null, l2);
        sup.addPropertyChangeListener(l3);
    }

    /*
     * Test the method addPropertyChangeListener(PropertyChangeListener,
     * String) with a listener parameter that has already been registered for
     * the named property.
     */
    public void testAddPropertyChangeListener_PropertyChangeListener_String_Duplicate() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);

        sup.addPropertyChangeListener("myProp2", l1);
        sup.addPropertyChangeListener("myProp2", l1);

        PropertyChangeListener[] listeners = sup.getPropertyChangeListeners();
        assertEquals(2, listeners.length);
        assertSame(l1, ((PropertyChangeListenerProxy) listeners[0])
                .getListener());
        assertSame(l1, ((PropertyChangeListenerProxy) listeners[1])
                .getListener());

        sup.removePropertyChangeListener(listeners[0]);
        sup.removePropertyChangeListener(listeners[1]);
        sup.addPropertyChangeListener("myProp3", l3);
        sup.addPropertyChangeListener("myProp3", l3);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(2, listeners.length);
        assertSame(
                l2,
                ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[0])
                        .getListener()).getListener());
        assertSame(
                l2,
                ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[1])
                        .getListener()).getListener());
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener)
     * with a normal listener parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);

        sup.addPropertyChangeListener(l1);

        PropertyChangeListener[] listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        sup.removePropertyChangeListener(l1);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(0, listeners.length);
        sup.addPropertyChangeListener(l3);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        sup.removePropertyChangeListener(l3);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(0, listeners.length);
        sup.addPropertyChangeListener("myProp3", l2);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        sup.removePropertyChangeListener(l2);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(1, listeners.length);
        sup.removePropertyChangeListener(listeners[0]);
        listeners = sup.getPropertyChangeListeners();
        assertEquals(0, listeners.length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener)
     * with a null listener parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_Null() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.removePropertyChangeListener(null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        sup.addPropertyChangeListener(null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        sup.removePropertyChangeListener(null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener)
     * with a non-registered listener parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_NonRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        sup.removePropertyChangeListener(new MockPropertyChangeListener());
        assertEquals(0, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener,
     * String) when a listener for all properties has been registered.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_String_AllRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);

        sup.addPropertyChangeListener(l1);

        sup.removePropertyChangeListener("myProp", l1);
        assertEquals(1, sup.getPropertyChangeListeners().length);
        assertEquals(0, sup.getPropertyChangeListeners("myProp").length);
        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener,
     * String) when a listener for the named property has been registered.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_String_PropertyRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        sup.addPropertyChangeListener("myProp", l1);
        assertEquals(1, sup.getPropertyChangeListeners().length);

        sup.removePropertyChangeListener("myProp", l1);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        assertEquals(0, sup.getPropertyChangeListeners("myProp").length);

        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        sup.addPropertyChangeListener(l3);
        assertEquals(1, sup.getPropertyChangeListeners().length);
        sup.removePropertyChangeListener("myProp", l2);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        assertEquals(0, sup.getPropertyChangeListeners("myProp").length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener,
     * String) with a non-registered listener parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_String_NonRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        sup.removePropertyChangeListener("myProp",
                new MockPropertyChangeListener());
        assertEquals(0, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener,
     * String) with a null listener parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_String_NullListener() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.removePropertyChangeListener("myProp", null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        sup.addPropertyChangeListener("myProp", null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
        sup.removePropertyChangeListener("myProp", null);
        assertEquals(0, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method removePropertyChangeListener(PropertyChangeListener,
     * String) with a null property name parameter.
     */
    public void testRemovePropertyChangeListener_PropertyChangeListener_String_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.removePropertyChangeListener(null,
                new MockPropertyChangeListener());
        sup.addPropertyChangeListener("myProp",
                new MockPropertyChangeListener());
        sup.removePropertyChangeListener(null,
                new MockPropertyChangeListener());
    }

    /*
     * Test the method getPropertyChangeListeners() when there is one listener
     * for all properties and one for a named property.
     */
    public void testGetPropertyChangeListener_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        PropertyChangeListener l4 = new MockPropertyChangeListener();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp2", l4);

        assertEquals(3, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method getPropertyChangeListeners() when there is no listeners.
     */
    public void testGetPropertyChangeListener_Empty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        assertEquals(0, sup.getPropertyChangeListeners().length);
    }

    /*
     * Test the method getPropertyChangeListeners(String) when there is one
     * listener for all properties and one for the named property and a third
     * for another named property.
     */
    public void testGetPropertyChangeListener_String_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        PropertyChangeListener l4 = new MockPropertyChangeListener();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp2", l4);

        assertEquals(1, sup.getPropertyChangeListeners("myProp").length);
        assertSame(l2, sup.getPropertyChangeListeners("myProp")[0]);
        sup.addPropertyChangeListener("myProp",
                new MockPropertyChangeListener());
        assertEquals(2, sup.getPropertyChangeListeners("myProp").length);
    }

    /*
     * Test the method getPropertyChangeListeners(String) when there is no
     * listener for the named property but there is one for another named
     * property.
     */
    public void testGetPropertyChangeListener_String_None() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp2",
                l2);
        PropertyChangeListener l4 = new MockPropertyChangeListener();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp3", l4);

        assertEquals(0, sup.getPropertyChangeListeners("myProp").length);
    }

    /*
     * Test the method getPropertyChangeListeners(String) with a null parameter.
     */
    public void testGetPropertyChangeListener_String_Null() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.getPropertyChangeListeners(null);
        sup.addPropertyChangeListener("myProp",
                new MockPropertyChangeListener());
        sup.getPropertyChangeListeners(null);
    }

    /*
     * Test the method hasListeners(String) when there is one listener for all
     * properties.
     */
    public void testHasListener_AllRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);

        assertFalse(sup.hasListeners("myProp"));
        sup.addPropertyChangeListener(l1);
        assertTrue(sup.hasListeners("myProp"));
        sup.removePropertyChangeListener(l1);
        assertFalse(sup.hasListeners("myProp"));
        sup.addPropertyChangeListener(l3);
        assertTrue(sup.hasListeners("myProp"));
    }

    /*
     * Test the method hasListeners(String) when there is one listener for the
     * named property.
     */
    public void testHasListener_PropertyRegistered() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();
        PropertyChangeListener l2 = new MockPropertyChangeListener();
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);

        assertFalse(sup.hasListeners("myProp"));
        sup.addPropertyChangeListener("myProP", l1);
        assertFalse(sup.hasListeners("myProp"));
        sup.addPropertyChangeListener("myProp", l2);
        assertTrue(sup.hasListeners("myProp"));
        sup.removePropertyChangeListener("myProp", l2);
        assertFalse(sup.hasListeners("myProp"));
        // The following assertion fails on RI. See HARMONY-2526
        sup.addPropertyChangeListener("myProp", l3);
        assertTrue(sup.hasListeners("myProp"));
    }

    /*
     * Test the method hasListeners(String) when there is no listeners.
     */
    public void testHasListener_None() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        assertFalse(sup.hasListeners("myProp"));
    }

    /*
     * Test the method hasListeners(String) with a null parameter.
     */
    public void testHasListener_Null() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeListener l1 = new MockPropertyChangeListener();

        assertFalse(sup.hasListeners(null));

        sup.addPropertyChangeListener("myProP", l1);
        sup.hasListeners(null);
    }

    public void testFireIndexedPropertyChange() {
        final Object src = new Object();
        PropertyChangeSupport pcs = new PropertyChangeSupport(src);
        pcs.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                assertEquals(src, evt.getSource());
                assertEquals(0, ((IndexedPropertyChangeEvent)evt).getIndex());
                assertEquals("one", evt.getOldValue());
                assertEquals("two", evt.getNewValue());
            }
        });

        pcs.fireIndexedPropertyChange("foo", 0, "one", "two");
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with normal
     * parameters, when there is no listeners.
     */
    public void testFirePropertyChange_Object_NoListeners() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        sup.firePropertyChange("myProp", new Object(), new Object());
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with normal
     * parameters, when there is a listener for all properties and another for
     * the named property.
     */
    public void testFirePropertyChange_Object_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with equal old
     * and new non-null values, when there is a listener for all properties and
     * another for the named property.
     */
    public void testFirePropertyChange_Object_EqualValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = newValue;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertNotCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with null old
     * and new values, when there is a listener for all properties and another
     * for the named property.
     */
    public void testFirePropertyChange_Object_NullValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = null;
        Object oldValue = null;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with a
     * non-null old value and a null new value, when there is a listener for all
     * properties and another for the named property.
     */
    public void testFirePropertyChange_Object_NullNewValue() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = null;
        Object oldValue = new Object();

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with a null
     * old value and a non-null new value, when there is a listener for all
     * properties and another for the named property.
     */
    public void testFirePropertyChange_Object_NullOldValue() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = null;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) with a null
     * property name parameter.
     */
    public void testFirePropertyChange_Object_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(null, oldValue, newValue);
        l1.assertCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, Object, Object) when a null
     * listener has been registered.
     */
    public void testFirePropertyChange_Object_NullListener() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();

        sup.addPropertyChangeListener(null);
        sup.firePropertyChange("myProp", oldValue, newValue);
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with normal
     * parameters, when there is a listener for all properties and another for
     * the named property.
     */
    public void testFirePropertyChange_PropertyChangeEvent_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp",
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with equal old
     * and new non-null values, when there is a listener for all properties and
     * another for the named property.
     */
    public void testFirePropertyChange_PropertyChangeEvent_EqualValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = newValue;
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp",
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertNotCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with null old and
     * new values, when there is a listener for all properties and another for
     * the named property.
     */
    public void testFirePropertyChange_PropertyChangeEvent_NullValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = null;
        Object oldValue = null;
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp",
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with a non-null
     * old value and a null new value, when there is a listener for all
     * properties and another for the named property.
     */
    public void testFirePropertyChange_PropertyChangeEvent_NullNewValue() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = null;
        Object oldValue = new Object();
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp",
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with a null old
     * value and a non-null new value, when there is a listener for all
     * properties and another for the named property.
     */
    public void testFirePropertyChange_PropertyChangeEvent_NullOldValue() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = null;
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp",
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) with a null
     * property name parameter.
     */
    public void testFirePropertyChange_PropertyChangeEvent_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = new Object();
        Object oldValue = new Object();
        Object src2 = new Object();
        PropertyChangeEvent event = new PropertyChangeEvent(src2, null,
                oldValue, newValue);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2,
                null, oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2,
                null, oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2,
                null, oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(event);
        l1.assertCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) when null.
     */
    public void testFirePropertyChange_PropertyChangeEvent_Null() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        try {
            sup.firePropertyChange(null);
            fail("Should throw NullPointerException!");
        } catch (NullPointerException ex) {
            // expected
        }
    }

    /*
     * Test the method firePropertyChange(PropertyChangeEvent) when a null
     * listener has been registered.
     */
    public void testFirePropertyChange_PropertyChangeEvent_NullListener() {
        PropertyChangeSupport sup = new PropertyChangeSupport(new Object());
        PropertyChangeEvent event = new PropertyChangeEvent(new Object(),
                "myProp", new Object(), new Object());

        sup.addPropertyChangeListener(null);
        sup.firePropertyChange(event);
    }

    /*
     * Test the method firePropertyChange(String, boolean, boolean) with normal
     * parameters, when there is a listener for all properties and another for
     * the named property.
     */
    public void testFirePropertyChange_Boolean_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = Boolean.TRUE;
        Object oldValue = Boolean.FALSE;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", false, true);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, boolean, boolean) with equal
     * old and new non-null values, when there is a listener for all properties
     * and another for the named property.
     */
    public void testFirePropertyChange_Boolean_EqualValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = Boolean.TRUE;
        Object oldValue = newValue;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", true, true);
        l1.assertNotCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, boolean, boolean) with a null
     * property name parameter.
     */
    public void testFirePropertyChange_Boolean_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Object newValue = Boolean.TRUE;
        Object oldValue = Boolean.FALSE;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(null, false, true);
        l1.assertCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, boolean, boolean) when a null
     * listener has been registered.
     */
    public void testFirePropertyChange_Boolean_NullListener() {
        PropertyChangeSupport sup = new PropertyChangeSupport(new Object());

        sup.addPropertyChangeListener(null);
        sup.firePropertyChange("myProp", true, false);
    }

    /*
     * Test the method firePropertyChange(String, int, int) with normal
     * parameters, when there is a listener for all properties and another for
     * the named property.
     */
    public void testFirePropertyChange_Int_Normal() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        int newValue = 1;
        int oldValue = 2;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue, newValue);
        l1.assertCalled();
        l2.assertCalled();
        l4.assertCalled();
    }

    /*
     * Test the method firePropertyChange(String, int, int) with equal old and
     * new non-null values, when there is a listener for all properties and
     * another for the named property.
     */
    public void testFirePropertyChange_Int_EqualValues() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Integer newValue = new Integer(1);
        Integer oldValue = newValue;

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange("myProp", oldValue.intValue(), newValue
                .intValue());
        l1.assertNotCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, int, int) with a null property
     * name parameter.
     */
    public void testFirePropertyChange_Int_NullProperty() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        Integer newValue = new Integer(1);
        Integer oldValue = new Integer(2);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        MockPropertyChangeListener l2 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp",
                l2);
        MockPropertyChangeListener l4 = new MockPropertyChangeListener(src,
                null, oldValue, newValue);
        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener(l3);
        sup.addPropertyChangeListener("myProp", l4);

        sup.firePropertyChange(null, oldValue.intValue(), newValue.intValue());
        l1.assertCalled();
        l2.assertNotCalled();
        l4.assertNotCalled();
    }

    /*
     * Test the method firePropertyChange(String, int, int) when a null listener
     * has been registered.
     */
    public void testFirePropertyChange_Int_NullListener() {
        Object src = new Object();
        PropertyChangeSupport sup = new PropertyChangeSupport(src);

        sup.addPropertyChangeListener(null);
        sup.firePropertyChange("myProp", 1, 2);
    }

    /*
     * Test serialization/deserialization.
     */
    public void testSerialization() throws Exception {
        Object src = "PropertyChangeSupportSerializationTest";
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeSupport sup2 = new PropertyChangeSupport(src);
        Integer newValue = new Integer(1);
        Integer oldValue = new Integer(2);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener2 l2 = new MockPropertyChangeListener2();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener("myProp", l1);
        sup.addPropertyChangeListener("myProp", l2);
        sup2.addPropertyChangeListener(l1);
        sup2.addPropertyChangeListener("myProp", l1);

        PropertyChangeSupport deSup = (PropertyChangeSupport) SerializationTester
                .getDeserilizedObject(sup);
        assertEquals(sup2.getPropertyChangeListeners()[0], deSup
                .getPropertyChangeListeners()[0]);
        assertEquals(((PropertyChangeListenerProxy) sup2
                .getPropertyChangeListeners()[1]).getListener(),
                ((PropertyChangeListenerProxy) deSup
                        .getPropertyChangeListeners()[1]).getListener());
    }

    /*
     * Test serialization/deserialization compatibility
     */

    public void testSerializationCompatibility() throws Exception {
        Object src = "PropertyChangeSupportSerializationTest";
        PropertyChangeSupport sup = new PropertyChangeSupport(src);
        PropertyChangeSupport sup2 = new PropertyChangeSupport(src);
        Integer newValue = new Integer(1);
        Integer oldValue = new Integer(2);

        MockPropertyChangeListener l1 = new MockPropertyChangeListener(src,
                "myProp", oldValue, newValue);
        MockPropertyChangeListener2 l2 = new MockPropertyChangeListener2();

        sup.addPropertyChangeListener(l1);
        sup.addPropertyChangeListener("myProp", l1);
        sup.addPropertyChangeListener("myProp", l2);
        sup2.addPropertyChangeListener(l1);
        sup2.addPropertyChangeListener("myProp", l1);
        SerializationTest.verifyGolden(this, sup2, new SerializableAssert() {
            public void assertDeserialized(Serializable initial,
                    Serializable deserialized) {
                PropertyChangeSupport sup2 = (PropertyChangeSupport) initial;
                PropertyChangeSupport deSup = (PropertyChangeSupport) deserialized;
                assertEquals(sup2.getPropertyChangeListeners()[0], deSup
                        .getPropertyChangeListeners()[0]);
                assertEquals(((PropertyChangeListenerProxy) sup2
                        .getPropertyChangeListeners()[1]).getListener(),
                        ((PropertyChangeListenerProxy) deSup
                                .getPropertyChangeListeners()[1]).getListener());
            }
        });
    }

    /*
     * Mock PropertyChangeListener.
     */
    static class MockPropertyChangeListener implements PropertyChangeListener,
            Serializable {

        private static final long serialVersionUID = 161877638385579731L;

        private transient Object expSrc;

        private String expPropName;

        private transient Object expOldValue;

        private transient Object expNewValue;

        private transient PropertyChangeEvent event;

        private final transient boolean called = false;

        public MockPropertyChangeListener() {
        }

        public MockPropertyChangeListener(Object src, String propName,
                Object oldValue, Object newValue) {
            this.expSrc = src;
            this.expPropName = propName;
            this.expOldValue = oldValue;
            this.expNewValue = newValue;
        }

        public void setAll(Object src, String propName, Object oldValue,
                Object newValue) {
            this.expSrc = src;
            this.expPropName = propName;
            this.expOldValue = oldValue;
            this.expNewValue = newValue;
        }

        public void propertyChange(PropertyChangeEvent event) {
            this.event = event;
        }

        public void assertCalled() {
            assertSame(expSrc, event.getSource());
            assertEquals(expPropName, event.getPropertyName());
            assertEquals(expOldValue, event.getOldValue());
            assertEquals(expNewValue, event.getNewValue());
            assertNull(event.getPropagationId());
        }

        public void assertNotCalled() {
            assertNull(event);
            assertFalse(called);
        }

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof MockPropertyChangeListener) {
                MockPropertyChangeListener l = (MockPropertyChangeListener) obj;
                return null == this.expPropName ? null == l.expPropName
                        : this.expPropName.equals(l.expPropName);
            }
            return false;
        }
    }

    /*
     * Mock PropertyChangeListener which is not serializable.
     */
    static class MockPropertyChangeListener2 implements PropertyChangeListener {

        public void propertyChange(PropertyChangeEvent event) {
        }
    }

    /*
     * Mock PropertyChangeListener that modifies the listener set on
     * notification.
     */
    static class MockPropertyChangeListener3 implements PropertyChangeListener {

        PropertyChangeSupport changeSupport;

        public MockPropertyChangeListener3(PropertyChangeSupport changeSupport) {
            super();
            this.changeSupport = changeSupport;
        }

        /* On property changed event modify the listener set */
        public void propertyChange(PropertyChangeEvent event) {
            changeSupport
                    .addPropertyChangeListener(new PropertyChangeListener() {
                        public void propertyChange(PropertyChangeEvent event) {
                            // Empty
                        }
                    });
        }
    }

    /**
     * Regression test for concurrent modification of listener set
     */
    @SuppressWarnings("unused")
    public void testConcurrentModification() {
        PropertyChangeSupport changeSupport = new PropertyChangeSupport("bogus");
        MockPropertyChangeListener3 changeListener = new MockPropertyChangeListener3(
                changeSupport);
        changeSupport.firePropertyChange("bogus property", "previous", "newer");
    }

    /**
     * @tests java.beans.PropertyChangeSupport#PropertyChangeSupport(
     *        java.lang.Object)
     */
    public void testConstructor_Null() {
        // Regression for HARMONY-227
        try {
            new PropertyChangeSupport(null);
            fail("Should throw NullPointerException!");
        } catch (NullPointerException ex) {
            // expected
        }
    }

    /**
     * @tests java.beans.PropertyChangeSupport#addPropertyChangeSupport
     *
     */
    public void test_addPropertyChangeListenerNullNull() throws Exception {
        // Regression for HARMONY-441
        new PropertyChangeSupport("bean1")
                .addPropertyChangeListener(null, null);
    }

    /**
     * @tests java.beans.PropertyChangeSupport#removePropertyChangeListener(
     *        java.lang.String, java.beans.PropertyChangeListener)
     */
    public void testRemovePropertyChangeListener() {
        // Regression for HARMONY-386
        PropertyChangeSupport prop = new PropertyChangeSupport(new Object());

        PropertyChangeListener lis1 = new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent event) {
            }
        };

        PropertyChangeListener lis2 = new PropertyChangeListenerProxy("name",
                lis1);

        assertEquals(0, prop.getPropertyChangeListeners().length);

        prop.addPropertyChangeListener(lis2);
        assertEquals(1, prop.getPropertyChangeListeners().length);

        prop.removePropertyChangeListener("name", lis1);
        assertEquals(0, prop.getPropertyChangeListeners().length);
    }

    /**
     * @tests java.beans.PropertyChangeSupport#removePropertyChangeListener(
     *        java.lang.String, java.beans.PropertyChangeListener)
     */
    public void testRemovePropertyChangeListener2() {
        // Regression for HARMONY-320
        PropertyChangeListener listener = new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent arg0) {
            }
        };

        PropertyChangeSupport pcs = new PropertyChangeSupport(this);

        pcs.addPropertyChangeListener("property", listener);
        PropertyChangeListener[] listeners = pcs.getPropertyChangeListeners();
        assertEquals(1, listeners.length);

        pcs.removePropertyChangeListener(listeners[0]);
        listeners = pcs.getPropertyChangeListeners();
        assertEquals(0, listeners.length);
    }

    /**
     * The test checks the serialization for listeners supporting serialization
     */
    public void testSerializableListener() throws Exception {
        writePropertyChangeListeners(new PropertyChangeListener[] { new SerializablePropertyChangeListener() });
        readPropertyChangeListeners();
    }

    /**
     * The test checks the serialization for listeners not supporting
     * serialization
     */
    public void testNonSerializableListener() throws Exception {
        writePropertyChangeListeners(new PropertyChangeListener[] { new NonSerializablePropertyChangeListener() });
        readPropertyChangeListeners();
    }

    /**
     *
     */
    public static Test suite() {
        return new TestSuite(PropertyChangeSupportTest.class);
    }

    /**
     *
     */
    public static void main(String[] args) {
        TestRunner.run(suite());
    }

    private void writePropertyChangeListeners(PropertyChangeListener[] array) {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("x.ser"));
            PropertyChangeSupport pcs = new PropertyChangeSupport("bean");
            if (array != null && array.length > 0) {
                for (PropertyChangeListener element : array) {
                    pcs.addPropertyChangeListener(element);
                }
            }
            oos.writeObject(pcs);
            oos.flush();
        } catch (Exception e) {
            System.out.println(e.getClass() + ": " + e.getMessage());
            fail("Exception is thrown in testNonSerializableListener");
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException ioe) {
                    fail("Exception while closing ObjectOutputStream");
                }
            }
        }
    }

    private PropertyChangeListener[] readPropertyChangeListeners()
            throws Exception {
        ObjectInputStream ois = null;
        PropertyChangeSupport pcs = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("x.ser"));
            pcs = (PropertyChangeSupport) ois.readObject();
        } finally {
            if (ois != null) {
                ois.close();
            }
        }
        return pcs.getPropertyChangeListeners();
    }
}
TOP

Related Classes of org.apache.harmony.beans.tests.java.beans.PropertyChangeSupportTest$MockPropertyChangeListener2

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.