/* * $Id$ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. */ package org.jdesktop.swingx.table; import java.beans.PropertyChangeListener; import java.io.IOException; import javax.swing.table.TableColumn; import junit.framework.TestCase; import org.jdesktop.test.PropertyChangeReport; import org.jdesktop.test.SerializableSupport; /** * Test to exposed known issues of <code>TableColumnExt</code>. * * Ideally, there would be at least one failing test method per open * Issue in the issue tracker. Plus additional failing test methods for * not fully specified or not yet decided upon features/behaviour. * * @author Jeanette Winzenburg */ public class TableColumnExtIssues extends TestCase { /** * Issue #815-swingx: Listeners must not be cloned. * Test that a listener registered with the clone is not registered * with the original. */ public void testListenersOriginalNotRegistered() { TableColumnCloneable column = new TableColumnCloneable(); column.setPreferredWidth(column.getMinWidth()); int old = column.getPropertyChangeListeners().length; assertEquals("sanity, no listener", 0, old); TableColumnCloneable clone = (TableColumnCloneable) column.clone(); PropertyChangeReport report = new PropertyChangeReport(); clone.addPropertyChangeListener(report); assertEquals(old, column.getPropertyChangeListeners().length); } /** * Issue #815-swingx: Listeners must not be cloned. * test that listeners registered with the original are not notified * when changing the clone. */ public void testListenerNotificationCloneChanged() { TableColumnCloneable column = new TableColumnCloneable(); column.setPreferredWidth(column.getMinWidth()); PropertyChangeReport report = new PropertyChangeReport(); column.addPropertyChangeListener(report); TableColumnCloneable clone = (TableColumnCloneable) column.clone(); clone.setPreferredWidth(column.getPreferredWidth() + 10); assertEquals(0, report.getEventCount()); } /** * Issue #815-swingx: Listeners must not be cloned. * Test that the listeners are still registered to the old. */ public void testListenersOriginalRegistered() { TableColumnCloneable column = new TableColumnCloneable(); PropertyChangeReport report = new PropertyChangeReport(); column.addPropertyChangeListener(report); int old = column.getPropertyChangeListeners().length; column.clone(); assertEquals(old, column.getPropertyChangeListeners().length); } /** * Try a TableColumn sub with a better-behaved clone - removes the cloned listeners. * * Doesn't help: the listeners are removed from the original as well. The problem * is in core - it doesn't provide a well-behaved clone implementation (in fact, it * doesn't provide any implementation). With the private listener registering there * is nothing subclasses can do. Except not implement cloneable (which is the best * to do anyway, see Bloch) */ public static class TableColumnCloneable extends TableColumn implements Cloneable { @Override public Object clone() { try { TableColumn column = (TableColumn) super.clone(); PropertyChangeListener[] listeners = getPropertyChangeListeners(); for (PropertyChangeListener listener : listeners) { column.removePropertyChangeListener(listener); } return column; } catch (CloneNotSupportedException e) { // don't expect } return null; } } /** * Issue #??-swingx: tableColumnExt does not fire propertyChange on resizable. * * Happens, if property is changed indirectly by changing min/max value * to be the same. * */ public void testResizableBoundProperty() { TableColumnExt columnExt = new TableColumnExt(); // sanity: assert expected defaults of resizable, minWidth assertTrue(columnExt.getResizable()); assertTrue(columnExt.getMinWidth() > 0); PropertyChangeReport report = new PropertyChangeReport(); columnExt.addPropertyChangeListener(report); columnExt.setMaxWidth(columnExt.getMinWidth()); if (!columnExt.getResizable()) { assertEquals("fixing column widths must fire resizable ", 1, report.getEventCount("resizable")); } else { fail("resizable must respect fixed column width"); } } /** * Sanity test Serializable: Listeners? Report not serializable? * * @throws ClassNotFoundException * @throws IOException * */ public void testSerializable() throws IOException, ClassNotFoundException { TableColumnExt columnExt = new TableColumnExt(); PropertyChangeReport report = new PropertyChangeReport(); columnExt.addPropertyChangeListener(report); TableColumnExt serialized = SerializableSupport.serialize(columnExt); PropertyChangeListener[] listeners = serialized .getPropertyChangeListeners(); assertTrue(listeners.length > 0); } /** * Issue #??-swingx: must handle non-serializable client properties * gracefully. * * @throws ClassNotFoundException * @throws IOException * * */ public void testNonSerializableClientProperties() throws IOException, ClassNotFoundException { TableColumnExt columnExt = new TableColumnExt(); Object value = new Object(); columnExt.putClientProperty("date", value ); SerializableSupport.serialize(columnExt); } /** * Dummy stand-in test method, does nothing. * without, the test would fail if there are no open issues. * */ public void testDummy() { } }