blob: e71c9d01d312ae5efb81f1e3c15854173b82b79a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.uitools;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.tools.workbench.uitools.SwitcherPanel;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyAspectAdapter;
import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel;
import org.eclipse.persistence.tools.workbench.uitools.app.TransformationPropertyValueModel;
import org.eclipse.persistence.tools.workbench.utility.AbstractModel;
/**
*
*/
public class SwitcherPanelTests extends TestCase
{
public static Test suite() {
return new TestSuite(SwitcherPanelTests.class);
}
public SwitcherPanelTests(String name)
{
super(name);
}
private PropertyValueModel buildPropertyAdapter(ModelTest modelTest)
{
return new PropertyAspectAdapter(ModelTest.NAME_PROPERTY, modelTest)
{
protected Object getValueFromSubject()
{
return ((ModelTest) this.subject).getName();
}
};
}
private TransformationPropertyValueModel buildTransformationPropertyAdapter1(ModelTest modelTest)
{
return new TransformationPropertyValueModel(buildPropertyAdapter(modelTest))
{
protected Object transform(Object value)
{
if (value == null)
return null;
if ("label".equals(value))
return new JLabel("A label");
if ("button".equals(value))
return new JButton("A button");
throw new IllegalArgumentException("The value is unknown");
}
};
}
private TransformationPropertyValueModel buildTransformationPropertyAdapter2(ModelTest modelTest)
{
final JLabel label = new JLabel("A label");
final JButton button = new JButton("A button");
return new TransformationPropertyValueModel(buildPropertyAdapter(modelTest))
{
protected Object transform(Object value)
{
if (value == null)
return null;
if ("label".equals(value))
return label;
if ("button".equals(value))
return button;
throw new IllegalArgumentException("The value is unknown");
}
};
}
public void testNestedSwitching1()
{
ModelTest modelTest = new ModelTest();
TransformationPropertyValueModel holder = buildTransformationPropertyAdapter2(modelTest);
new SwitcherPanel(holder);
}
public void testNullPropertyHolder()
{
try
{
new SwitcherPanel(null);
assertTrue("The property holder cannot be null and no exception was thrown", false);
}
catch (NullPointerException e)
{
// Good
}
}
public void testSwitching1()
{
ModelTest modelTest = new ModelTest();
TransformationPropertyValueModel holder = buildTransformationPropertyAdapter1(modelTest);
SwitcherPanel panel = new SwitcherPanel(holder);
// First there is no children since the panel is not a child of any component
assertTrue(panel.getComponentCount() == 0);
// This will engage the listeners on the model
JPanel container = new JPanel();
container.add(panel);
// The value that is been listened is still null
assertTrue(panel.getComponentCount() == 0);
}
public void testSwitching2()
{
ModelTest modelTest = new ModelTest();
TransformationPropertyValueModel holder = buildTransformationPropertyAdapter1(modelTest);
SwitcherPanel panel = new SwitcherPanel(holder);
// First there is no children since the panel is not a child of any component
assertTrue(panel.getComponentCount() == 0);
modelTest.setName("label");
// This will engage the listener on the model and should add a children
JPanel container = new JPanel();
// We need a peer in order for addNotify() to be called
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.getContentPane().add(container);
frame.setVisible(true);
// Now we can do the test
container.add(panel);
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) instanceof JLabel);
// This should switch the children
modelTest.setName("button");
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) instanceof JButton);
// This should simply remove the children
modelTest.setName(null);
assertTrue(panel.getComponentCount() == 0);
frame.setVisible(false);
}
public void testSwitching3()
{
ModelTest modelTest = new ModelTest();
TransformationPropertyValueModel holder = buildTransformationPropertyAdapter2(modelTest);
SwitcherPanel panel = new SwitcherPanel(holder);
// First there is no children since the panel is not a child of any component
assertTrue(panel.getComponentCount() == 0);
// Changing the value in the model should not affect the PanelSwitcherAdapter
// yet since it does not have a parent yet
modelTest.setName("label");
// This will engage the listener on the model and should add a children
JPanel container = new JPanel();
// We need a peer in order for addNotify() to be called
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.getContentPane().add(container);
frame.setVisible(true);
// Now we can do the test
container.add(panel);
assertEquals(1, panel.getComponentCount());
assertTrue(panel.getComponent(0) instanceof JLabel);
JLabel label = (JLabel) panel.getComponent(0);
// This should switch the children
modelTest.setName("button");
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) instanceof JButton);
JButton button = (JButton) panel.getComponent(0);
// This should simply remove the children
modelTest.setName(null);
assertTrue(panel.getComponentCount() == 0);
// Switch again
modelTest.setName("label");
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) == label);
// Switch again
modelTest.setName("button");
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) == button);
// Switch again
modelTest.setName("label");
assertTrue(panel.getComponentCount() == 1);
assertTrue(panel.getComponent(0) == label);
// Switch again
modelTest.setName(null);
assertTrue(panel.getComponentCount() == 0);
frame.setVisible(false);
}
private static class ModelTest extends AbstractModel
{
private String name;
public static final String NAME_PROPERTY = "name";
public String getName()
{
return this.name;
}
public void setName(String name)
{
String oldName = getName();
this.name = name;
firePropertyChanged(NAME_PROPERTY, oldName, name);
}
}
}