/*
 * $Id: AbstractSerializableBeanTest.java,v 1.2 2008/10/11 20:39:18 rah003 Exp $
 *
 * Copyright 2008 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.jdesktop.beans;

import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.io.Serializable;

import junit.framework.TestCase;

import org.jdesktop.test.SerializableSupport;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;


/**
 * @author <a href="mailto:jesse@swank.ca">Jesse Wilson</a>
 */
@RunWith(JUnit4.class)
public class AbstractSerializableBeanTest extends TestCase {
    private static class ShoeSizeCap implements VetoableChangeListener, Serializable {
        public void vetoableChange(PropertyChangeEvent event) throws PropertyVetoException {
            if("size".equals(event.getPropertyName()) && ((Integer)event.getNewValue()).intValue() > 13) {
                throw new PropertyVetoException("Feet too big!", event);
            }
        }
    }

    private static class ShoeColorListener implements PropertyChangeListener, Serializable {
        public void propertyChange(PropertyChangeEvent evt) {
            //does nothing
        }
    }
    
    public static class Shoe extends AbstractSerializableBean {
        private Color color;
        private int size;

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) throws PropertyVetoException {
            fireVetoableChange("color", this.color, color);
            Color oldColor = getColor();
            this.color = color;
            firePropertyChange("color", oldColor, getColor());
        }

        public int getSize() {
            return size;
        }

        public void setSize(int size) throws PropertyVetoException {
            fireVetoableChange("size", this.size, size);
            int oldSize = getSize();
            this.size = size;
            firePropertyChange("size", oldSize, getSize());
        }
    }

    @Test
    public void testShoeSerialize() throws Exception {

        Shoe leftShoe = new Shoe();
        leftShoe.addVetoableChangeListener(new ShoeSizeCap());
        leftShoe.addPropertyChangeListener(new ShoeColorListener());
        leftShoe.setColor(Color.GREEN);
        leftShoe.setSize(10);
        try {
            leftShoe.setSize(20);
            fail("Expected property veto exception");
        } catch(PropertyVetoException e) {
            // expected
        }

        Shoe rightShoe = SerializableSupport.serialize(leftShoe);
        assertEquals(Color.GREEN, rightShoe.getColor());
        
        PropertyChangeListener[] pcls = rightShoe.getPropertyChangeListeners();
        assertEquals(1, pcls.length);
        assertTrue(pcls[0] instanceof ShoeColorListener);
        
        assertEquals(10, rightShoe.getSize());
        
        try {
            rightShoe.setSize(20);
            fail("Expected property veto exception");
        } catch(PropertyVetoException e) {
            // expected
        }
    }
}
