/******************************************************************************* | |
* 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); | |
} | |
} | |
} |