001    /*
002     * Copyright 2002-2004 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.binding.support;
017    
018    import java.beans.PropertyChangeEvent;
019    import java.beans.PropertyChangeListener;
020    import java.beans.PropertyChangeSupport;
021    
022    import junit.framework.TestCase;
023    
024    import org.springframework.binding.value.PropertyChangePublisher;
025    import org.springframework.binding.value.support.AbstractPropertyChangePublisher;
026    
027    /**
028     * Tests class {@link PropertyChangeSupportUtils}.
029     * 
030     * @author Oliver Hutchison
031     */
032    public class PropertyChangeSupportUtilsTests extends TestCase {
033    
034        /**
035         * Checks that #supportsBoundProperties detects observable classes.
036         */
037        public void testDetectObservableClasses() {
038            Class[] observableClasses = new Class[] {PropertyChangePublisherImpl.class, StandardJavaBeanImpl.class};
039            for (int i = 0; i < observableClasses.length; i++) {
040                Class beanClass = observableClasses[i];
041                assertTrue("Could not detect that the class supports bound properties.",
042                        PropertyChangeSupportUtils.supportsBoundProperties(beanClass));
043            }
044        }
045    
046        /**
047         * Checks that #supportsBoundProperties rejects unobservable classes.
048         */
049        public void testRejectUnobservableClasses() {
050            Class[] unobservableClasses = new Class[] {Object.class, int.class};
051            for (int i = 0; i < unobservableClasses.length; i++) {
052                Class beanClass = unobservableClasses[i];
053                assertFalse("Failed to reject a class that supports no bound properties.",
054                        PropertyChangeSupportUtils.supportsBoundProperties(beanClass));
055            }
056        }
057    
058        public void testAddRemovePropertyChangeListener() {
059            final PropertyChangeListener listener = new PropertyChangeListener() {
060                public void propertyChange(PropertyChangeEvent evt) {
061                }
062            };
063    
064            PropertyChangePublisherImpl bean1 = new PropertyChangePublisherImpl();
065            PropertyChangeSupportUtils.addPropertyChangeListener(bean1, "propertName", listener);
066            PropertyChangeListener[] listeners = bean1.getPropertyChangeListeners("propertName");
067            assertEquals(1, listeners.length);
068            assertSame(listener, listeners[0]);
069            PropertyChangeSupportUtils.removePropertyChangeListener(bean1, "propertName", listener);
070            listeners = bean1.getPropertyChangeListeners("propertName");
071            assertEquals(0, listeners.length);
072    
073            StandardJavaBeanImpl bean2 = new StandardJavaBeanImpl();
074            PropertyChangeSupportUtils.addPropertyChangeListener(bean2, "propertName", listener);
075            listeners = bean2.getPropertyChangeListeners("propertName");
076            assertEquals(1, listeners.length);
077            assertSame(listener, listeners[0]);
078            PropertyChangeSupportUtils.removePropertyChangeListener(bean2, "propertName", listener);
079            listeners = bean2.getPropertyChangeListeners("propertName");
080            assertEquals(0, listeners.length);
081        }
082    
083        private class PropertyChangePublisherImpl extends AbstractPropertyChangePublisher implements
084                PropertyChangePublisher {
085        }
086    
087        private class StandardJavaBeanImpl extends PropertyChangeSupport {
088            public StandardJavaBeanImpl() {
089                super("whatever");
090            }
091        }
092    }