swingx-master/swingx-core/src/test/java/org/jdesktop/swingx/border/IconBorderTest.java
/*
 * $Id$
 *
 * Copyright 2006 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.swingx.border;

import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Insets;
import java.awt.event.ActionEvent;

import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.border.AbstractBorder;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.icon.ColumnControlIcon;
import org.jdesktop.swingx.plaf.SafeBorder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;


/**
 * Tests related to SwingX Borders.
 * 
 * @author Jeanette Winzenburg
 */
@RunWith(JUnit4.class)
public class IconBorderTest extends InteractiveTestCase {
    
    
    @Test
    public void testSafeBorderMisbehavingDelegate() {
        JComponent comp = new JButton();
        MisbehavingBorder delegate = new MisbehavingBorder();
        assertNull("sanity", delegate.getBorderInsets(comp));
        assertNull("sanity", delegate.getBorderInsets(comp, null));
        SafeBorder border = new SafeBorder(delegate);
        assertNotNull(border.getBorderInsets(comp));
        assertNotNull(border.getBorderInsets(comp, null));
    }
    
    @Test
    public void testSafeBorderBehavingDelegate() {
        JComponent comp = new JButton();
        AbstractBorder delegate = new BevelBorder(BevelBorder.LOWERED);
        SafeBorder border = new SafeBorder(delegate);
        assertNotNull(border.getBorderInsets(comp));
        assertNotNull(border.getBorderInsets(comp, null));
    }
    
    public static class MisbehavingBorder extends  AbstractBorder {

        /**
         * 
         * @inherited <p>
         * 
         * Here's the mis-behaviour: returns null
         */
        @Override
        public Insets getBorderInsets(Component c) {
            return null;
        }

        /** 
         * @inherited <p>
         */
        @Override
        public Insets getBorderInsets(Component c, Insets insets) {
            return null;
        }

        
    }

    /**
     * Issue ??-swingx: IconBorder must handle null icon.
     *
     */
    @Test
    public void testIconBorderNullIcon() {
        IconBorder border = new IconBorder();
        JLabel label = new JLabel("dummy");
        border.getBorderInsets(label);
    }
    
    @Test
    public void testIconBorderSetNullIcon() {
        IconBorder border = new IconBorder(new ColumnControlIcon());
        border.setIcon(null);
        JLabel label = new JLabel("dummy");
        border.getBorderInsets(label);
    }
    /**
     * test new padding api.
     *
     */
    @Test
    public void testPadding() {
        IconBorder border = new IconBorder(new ColumnControlIcon());
        int oldPadding = border.getPadding();
        int padding = oldPadding + 10;
        border.setPadding(padding);
        assertEquals(padding, border.getPadding());
    }
    
    @Test
    public void testNotNegativePadding() {
        IconBorder border = new IconBorder(new ColumnControlIcon(),
                SwingConstants.EAST, - 10);
        assertTrue(border.getPadding() >= 0);
        border.setPadding(-10);
        assertTrue(border.getPadding() >= 0);
    }
    
    /**
     * test default padding for backward compatibility. 
     * Was hardcoded to 2*4.
     *
     */
    @Test
    public void testDefaultPadding() {
        Icon icon = new ColumnControlIcon();
        IconBorder border = new IconBorder(icon, SwingConstants.WEST);
        JLabel label = new JLabel("dummy");
        label.setBorder(border);
        Insets insets = border.getBorderInsets(label);
        // internal knowledge: default padding has been 2 * 4
        assertEquals(insets.left, icon.getIconWidth() + 8);
    }
    
    
//------------------- visual checks
    
    /**
     * Visuals: null border, component orientation, padding.
     * 
     */
    public void interactiveIconBorderNullIcon() {
        final Icon icon = new ColumnControlIcon();
        final IconBorder border = new IconBorder(icon);
        final JLabel label = new JLabel("...dummy............ with icon border");
        Border lineBorder = BorderFactory.createLineBorder(Color.RED, 2);
        label.setBorder(BorderFactory.createCompoundBorder(lineBorder, border));
        Action setIcon = new AbstractActionExt("null icon") {
            public void actionPerformed(ActionEvent e) {
                border.setIcon(null);
                label.repaint();
                setEnabled(false);
            }
            
        };
        Action setPadding = new AbstractActionExt("set padding") {

            public void actionPerformed(ActionEvent e) {
                border.setPadding(border.getPadding() + 10);
                label.repaint();
                
            }
            
        };
        final JXFrame frame = wrapInFrame(label, "IconBorder");
        Action toggleComponentOrientation = new AbstractActionExt("toggle orientation") {
            
            public void actionPerformed(ActionEvent e) {
                ComponentOrientation current = frame.getComponentOrientation();
                if (current == ComponentOrientation.LEFT_TO_RIGHT) {
                    frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                } else {
                    frame.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
                    
                }
                frame.validate();
                frame.repaint();
                
            }
            
        };
        addAction(frame, toggleComponentOrientation);
        addAction(frame, setIcon);
        addAction(frame, setPadding);
        frame.setSize(400, 200);
        frame.setVisible(true);

    }

    public static void main(String args[]) {
        IconBorderTest test = new IconBorderTest();
        try {
          test.runInteractiveTests();
//            test.runInteractiveTests("interactive.*Mark.*");
        } catch (Exception e) {
            System.err.println("exception when executing interactive tests:");
            e.printStackTrace();
        }
    }


}
