/*
* Created on 31.01.2006
*
*/
package org.jdesktop.swingx.action;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
import org.jdesktop.test.EDTRunner;
import org.jdesktop.test.PropertyChangeReport;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(EDTRunner.class)
public class ActionIssues {
/**
* core issue:
* set selected via putValue leads to inconsistent state.
*
*/
@Test
public void testFireSelected() {
AbstractActionExt action = new AbstractActionExt("dummy") {
public void actionPerformed(ActionEvent e) {
// nothing to do
}
@Override
public void itemStateChanged(ItemEvent e) {
// nothing to do
}
};
PropertyChangeListener l = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("selected".equals(evt.getPropertyName())) {
assertEquals(evt.getNewValue(), ((AbstractActionExt) evt.getSource()).isSelected());
}
}
};
action.addPropertyChangeListener(l);
action.putValue("selected", true);
}
//--------------------- core: selected is not a bean property
/**
* unexpected core behaviour: selected is not a bound property!
* PENDING: is it in Mustang?
*/
@Test
public void testToggleButtonPropertyChangeSelected() {
JToggleButton button = new JToggleButton();
PropertyChangeReport report = new PropertyChangeReport();
button.addPropertyChangeListener(report);
boolean selected = button.isSelected();
button.setSelected(!selected);
// sanity...
assertEquals(selected, !button.isSelected());
assertEquals("must have one event for selected", 1, report.getEventCount("selected"));
}
@Test
public void testCheckBoxPropertyChangeSelected() {
JCheckBox button = new JCheckBox();
PropertyChangeReport report = new PropertyChangeReport();
button.addPropertyChangeListener(report);
boolean selected = button.isSelected();
button.setSelected(!selected);
// sanity...
assertEquals(selected, !button.isSelected());
assertEquals("must have one event for selected", 1, report.getEventCount("selected"));
}
@Test
public void testRadioButtonPropertyChangeSelected() {
JRadioButton button = new JRadioButton();
PropertyChangeReport report = new PropertyChangeReport();
button.addPropertyChangeListener(report);
boolean selected = button.isSelected();
button.setSelected(!selected);
// sanity...
assertEquals(selected, !button.isSelected());
assertEquals("must have one event for selected", 1, report.getEventCount("selected"));
}
@Test
public void testCheckBoxMenuItemPropertyChangeSelected() {
JMenuItem button = new JCheckBoxMenuItem();
PropertyChangeReport report = new PropertyChangeReport();
button.addPropertyChangeListener(report);
boolean selected = button.isSelected();
button.setSelected(!selected);
// sanity...
assertEquals(selected, !button.isSelected());
assertEquals("must have one event for selected", 1, report.getEventCount("selected"));
}
/**
* Template to try and test memory leaks (from Palantir blog).
* TODO apply for listener problems
*/
@Test
public void testMemory() {
//create test object
Object testObject = new Object();
// create queue and weak reference
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
WeakReference<Object> ref = new WeakReference<Object>(testObject, queue);
// set hard reference to null
testObject = null;
// force garbage collection
System.gc();
// soft reference should now be enqueued (no leak)
assertTrue(ref.isEnqueued());
}
}