/*
* $Id$
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*/
package org.jdesktop.swingx;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.text.Position.Bias;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import org.jdesktop.swingx.JXTree.DelegatingRenderer;
import org.jdesktop.swingx.JXTreeTableUnitTest.InsertTreeTableModel;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.decorator.SearchPredicate;
import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
import org.jdesktop.swingx.renderer.StringValue;
import org.jdesktop.swingx.renderer.StringValues;
import org.jdesktop.swingx.tree.DefaultXTreeCellEditor;
import org.jdesktop.swingx.tree.DefaultXTreeCellRenderer;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jdesktop.swingx.treetable.FileSystemModel;
import org.jdesktop.swingx.treetable.TreeTableModel;
import org.jdesktop.test.AncientSwingTeam;
import org.jdesktop.test.PropertyChangeReport;
import org.jdesktop.test.TestUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit tests for JXTree.
*
* @author Jeanette Winzenburg
*/
@RunWith(JUnit4.class)
public class JXTreeUnitTest extends InteractiveTestCase {
protected TreeTableModel treeTableModel;
public JXTreeUnitTest() {
super("JXTree Test");
}
/**
* Issue #1563-swingx: find cell that was clicked for componentPopup
*
* Test api and event firing.
*/
@Test
public void testPopupTriggerLocationAvailable() {
JXTree table = new JXTree();
table.expandAll();
MouseEvent event = new MouseEvent(table, 0,
0, 0, 40, 5, 0, false);
PropertyChangeReport report = new PropertyChangeReport(table);
table.getPopupLocation(event);
assertEquals(event.getPoint(), table.getPopupTriggerLocation());
TestUtils.assertPropertyChangeEvent(report, "popupTriggerLocation",
null, event.getPoint());
}
/**
* Issue #1563-swingx: find cell that was clicked for componentPopup
*
* Test safe return value.
*/
@Test
public void testPopupTriggerCopy() {
JXTree table = new JXTree();
table.expandAll();
MouseEvent event = new MouseEvent(table, 0,
0, 0, 40, 5, 0, false);
table.getPopupLocation(event);
assertNotSame("trigger point must not be same",
table.getPopupTriggerLocation(), table.getPopupTriggerLocation());
}
/**
* Issue #1563-swingx: find cell that was clicked for componentPopup
*
* Test safe handle null.
*/
@Test
public void testPopupTriggerKeyboard() {
JXTree table = new JXTree();
table.expandAll();
MouseEvent event = new MouseEvent(table, 0,
0, 0, 40, 5, 0, false);
table.getPopupLocation(event);
PropertyChangeReport report = new PropertyChangeReport(table);
table.getPopupLocation(null);
assertNull("trigger must null",
table.getPopupTriggerLocation());
TestUtils.assertPropertyChangeEvent(report, "popupTriggerLocation",
event.getPoint(), null);
}
/**
* Issue http://java.net/jira/browse/SWINGX-1483 - nextMatch must respect string rep
*/
@Test
public void testNextMatch() {
JXTree tree = new JXTree(AncientSwingTeam.createNamedColorTreeModel());
tree.setCellRenderer(new DefaultTreeRenderer(createColorStringValue()));
tree.expandAll();
assertEquals("must not find a match for 'b', all start with 'r'",
null, tree.getNextMatch("b", 0, Bias.Forward));
}
/**
* Issue #1231-swingx: tree cell renderer size problems.
*
* Cache not invalidated on setCellRenderer due to not firing a
* propertyChange (it's wrapped). Problem or not is LAF dependent ;-)
* The not-firing is clearly a bug.
*
*/
@Test
public void testRendererNotification() {
JXTree tree = new JXTree();
TreeCellRenderer renderer = tree.getCellRenderer();
assertNotNull("sanity: ", renderer);
PropertyChangeReport report = new PropertyChangeReport(tree);
tree.setCellRenderer(new DefaultTreeRenderer());
assertEquals(1, report.getEventCount());
assertEquals(1, report.getEventCount("cellRenderer"));
}
/**
* Issue #1061-swingx: renderer/editor inconsistent on startup
*/
@Test
public void testRendererOnInit() {
TestTree tree = new TestTree();
assertSame(tree.getSuperRenderer(), tree.getCellRenderer());
}
/**
* Issue #1061-swingx: renderer/editor inconsistent on startup
*/
@Test
public void testEditorOnInit() {
TestTree tree = new TestTree();
assertSame(tree.getSuperEditor(), tree.getCellEditor());
}
/**
* Issue #1061-swingx: renderer/editor inconsistent on startup
*/
@Test
public void testDefaultRendererOnInit() {
TestTree tree = new TestTree();
assertNotNull("sanity: default renderer created", tree.getCreatedDefaultRenderer());
assertSame("sanity: default renderer used as wrappee", tree.getCreatedDefaultRenderer(), tree.getWrappedCellRenderer());
}
/**
* Issue #1061-swingx: renderer/editor inconsistent on startup.
* Note: this test will fail once we use an enhanced cellEditor (which can cope with
* SwingX default renderers).
*/
@Test
public void testDefaultRendererUsedInEditorOnInit() {
TestTree tree = new TestTree();
assertTrue("sanity: editor is of type DefaultXTreeCellEditor", tree.getCellEditor() instanceof DefaultXTreeCellEditor);
assertSame(tree.getWrappedCellRenderer(), ((DefaultXTreeCellEditor) tree.getCellEditor()).getRenderer());
}
/**
* Subclass for testing: access cellRenderer/cellEditor fields
*/
public static class TestTree extends JXTree {
private TreeCellRenderer createdDefaultRenderer;
public TreeCellRenderer getSuperRenderer() {
return cellRenderer;
}
public TreeCellEditor getSuperEditor() {
return cellEditor;
}
public TreeCellRenderer getCreatedDefaultRenderer() {
return createdDefaultRenderer;
}
@Override
protected TreeCellRenderer createDefaultCellRenderer() {
createdDefaultRenderer = super.createDefaultCellRenderer();
return createdDefaultRenderer;
}
}
/**
* Issue #862-swingx: JXTree - add api for selection colors.
*/
@Test
public void testSelectionBackground() {
JXTree tree = new JXTree();
Color uiColor = UIManager.getColor("Tree.selectionBackground");
assertEquals(uiColor, tree.getSelectionBackground());
Color customColor = Color.RED;
tree.setSelectionBackground(customColor);
tree.updateUI();
assertEquals("custom color must not be reset by ui", customColor, tree.getSelectionBackground());
}
/**
* Issue #862-swingx: JXTree - add api for selection colors.
*/
@Test
public void testSelectionForeground() {
JXTree tree = new JXTree();
Color uiColor = UIManager.getColor("Tree.selectionForeground");
assertEquals(uiColor, tree.getSelectionForeground());
Color customColor = Color.RED;
tree.setSelectionForeground(customColor);
tree.updateUI();
assertEquals("custom color must not be reset by ui", customColor, tree.getSelectionForeground());
}
/**
* Issue #862-swingx: JXTree - add api for selection colors.
*/
@Test
public void testSelectionBackgroundChange() {
JXTree tree = new JXTree();
Color uiColor = tree.getSelectionBackground();
Color customColor = Color.RED;
PropertyChangeReport report = new PropertyChangeReport();
tree.addPropertyChangeListener(report);
tree.setSelectionBackground(customColor);
TestUtils.assertPropertyChangeEvent(report, "selectionBackground", uiColor, customColor);
}
/**
* Issue #862-swingx: JXTree - add api for selection colors.
*/
@Test
public void testSelectionForegroundChange() {
JXTree tree = new JXTree();
Color uiColor = tree.getSelectionForeground();
Color customColor = Color.RED;
PropertyChangeReport report = new PropertyChangeReport();
tree.addPropertyChangeListener(report);
tree.setSelectionForeground(customColor);
TestUtils.assertPropertyChangeEvent(report, "selectionForeground", uiColor, customColor);
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Consistent api: expose wrappedRenderer the same way as wrappedModel
*/
@Test
public void testWrappedRendererDefault() {
JXTree list = new JXTree();
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
assertSame("wrapping renderer must use list's default on null",
renderer.getDelegateRenderer(), list.getWrappedCellRenderer());
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Consistent api: expose wrappedRenderer the same way as wrappedModel
*/
@Test
public void testWrappedRendererCustom() {
JXTree list = new JXTree();
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
TreeCellRenderer custom = new DefaultTreeRenderer();
list.setCellRenderer(custom);
assertSame("wrapping renderer must use list's default on null",
renderer.getDelegateRenderer(), list.getWrappedCellRenderer());
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Delegating uses default on null, here: default default.
*/
@Test
public void testDelegatingRendererUseDefaultSetNull() {
JXTree list = new JXTree();
TreeCellRenderer defaultRenderer = list.createDefaultCellRenderer();
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
list.setCellRenderer(null);
assertEquals("wrapping renderer must use list's default on null",
defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Delegating has default from list initially, here: default default.
*
* Note: this test has to be changed once we switch to default to DefaultTreeRenderer.
*/
@Test
public void testDelegatingRendererUseDefault() {
JXTree list = new JXTree();
TreeCellRenderer defaultRenderer = list.createDefaultCellRenderer();
assertEquals("sanity: creates default", DefaultXTreeCellRenderer.class,
defaultRenderer.getClass());
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
assertEquals(defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Delegating has default from list initially, here: custom default.
*/
@Test
public void testDelegatingRendererUseCustomDefaultSetNull() {
JXTree list = new JXTree() {
@Override
protected TreeCellRenderer createDefaultCellRenderer() {
return new CustomDefaultRenderer();
}
};
TreeCellRenderer defaultRenderer = list.createDefaultCellRenderer();
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
list.setCellRenderer(null);
assertEquals("wrapping renderer must use list's default on null",
defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
}
/**
* Issue #817-swingx: Delegating renderer must create list's default.
* Delegating has default from list initially, here: custom default.
*/
@Test
public void testDelegatingRendererUseCustomDefault() {
JXTree list = new JXTree() {
@Override
protected TreeCellRenderer createDefaultCellRenderer() {
return new CustomDefaultRenderer();
}
};
TreeCellRenderer defaultRenderer = list.createDefaultCellRenderer();
assertEquals("sanity: creates custom", CustomDefaultRenderer.class,
defaultRenderer.getClass());
DelegatingRenderer renderer = (DelegatingRenderer) list.getCellRenderer();
assertEquals(defaultRenderer.getClass(), renderer.getDelegateRenderer().getClass());
}
/**
* Dummy extension for testing - does nothing more as super.
* For tree, we subclass swingx renderer, as the default still it core default.
*/
public static class CustomDefaultRenderer extends DefaultTreeRenderer {
}
/**
* Issue #767-swingx: consistent string representation.
*
* Here: test api on JXTable.
*/
@Test
public void testGetStringForRow() {
JXTree tree = new JXTree(AncientSwingTeam.createNamedColorTreeModel());
tree.expandAll();
StringValue sv = new StringValue() {
public String getString(Object value) {
if (value instanceof Color) {
Color color = (Color) value;
return "R/G/B: " + color.getRGB();
}
return StringValues.TO_STRING.getString(value);
}
};
tree.setCellRenderer(new DefaultTreeRenderer(sv));
Object value =((DefaultMutableTreeNode) tree.getPathForRow(2).getLastPathComponent()).getUserObject();
String text = tree.getStringAt(2);
assertEquals(sv.getString(value), text);
}
/**
* Issue #767-swingx: consistent string representation.
*
* Here: test api on JXTable.
*/
@Test
public void testGetStringForPath() {
JXTree tree = new JXTree(AncientSwingTeam.createNamedColorTreeModel());
tree.expandAll();
StringValue sv = new StringValue() {
public String getString(Object value) {
if (value instanceof Color) {
Color color = (Color) value;
return "R/G/B: " + color.getRGB();
}
return StringValues.TO_STRING.getString(value);
}
};
tree.setCellRenderer(new DefaultTreeRenderer(sv));
Object value =((DefaultMutableTreeNode) tree.getPathForRow(2).getLastPathComponent()).getUserObject();
String text = tree.getStringAt(tree.getPathForRow(2));
assertEquals(sv.getString(value), text);
}
/**
* Issue #769-swingx: setXXIcon on renderer vs setXXIcon on Tree/Table.
* Characterize tree behaviour.
*
* Here: icon on renderer must be respected if overwrite is false.
*/
@Test
public void testIconSetOnRendererFalseOverwrite() {
JXTree tree = new JXTree();
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(null);
tree.setCellRenderer(renderer);
assertEquals("renderer must have null leaf icon", null, renderer.getLeafIcon());
}
/**
* Issue #769-swingx: setXXIcon on renderer vs setXXIcon on Tree/Table.
* Characterize tree behaviour.
*
* Here: icon on renderer must be overwritten if overwrite is true.
*/
@Test
public void testIconSetOnRendererTrueOverwrite() {
JXTree tree = new JXTree();
tree.setLeafIcon(null);
tree.setOverwriteRendererIcons(true);
// PENDING: incomplete api - no getter
// Icon leaf = tree.getLeafIcon();
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
assertNotNull("sanity - the renderer has a leafIcon ", renderer.getLeafIcon());
tree.setCellRenderer(renderer);
assertEquals("renderer leaf icon must be overwritten by tree's leaf icon",
null, renderer.getLeafIcon());
}
/**
* Issue #769-swingx: setXXIcon on renderer vs setXXIcon on Tree/Table.
* Characterize tree behaviour.
*
* Here: set icon on tree is passed on to renderer always.
*/
@Test
public void testIconSetOnTreeFalseOverwrite() {
JXTree tree = new JXTree();
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
assertNotNull(renderer.getLeafIcon());
tree.setCellRenderer(renderer);
tree.setLeafIcon(null);
assertEquals("renderer must have null leaf icon", null, renderer.getLeafIcon());
}
/**
* Issue #769-swingx: setXXIcon on renderer vs setXXIcon on Tree/Table.
* Characterize tree behaviour.
*
* Here: set icon on tree is passed on to renderer always.
*/
@Test
public void testIconSetOnTreeTrueOverwrite() {
JXTree tree = new JXTree();
tree.setOverwriteRendererIcons(true);
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
assertNotNull(renderer.getLeafIcon());
tree.setCellRenderer(renderer);
tree.setLeafIcon(null);
assertEquals("renderer must have null leaf icon", null, renderer.getLeafIcon());
}
/**
* Issue #769-swingx: setXXIcon on renderer vs setXXIcon on Tree/Table.
* Characterize tree behaviour.
*
* Here: default overwriteOnRenderer is false.
*/
@Test
public void testIconOverwriteInitial() {
JXTree tree = new JXTree();
assertFalse("initial overwriteRendererIcons must be false", tree.isOverwriteRendererIcons());
}
/**
* focus issues with popup in editors: tweak with
* custom cellEditorListener.
*
*/
@Test
public void testEditorListenerRemovedOnEditorStopped() {
JXTree tree = createEditingTree();
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
// core doesn't remove the listener ... dooh
cellEditor.stopCellEditing();
// but we do ...
assertEquals(1, cellEditor.getCellEditorListeners().length);
}
/**
* focus issues with popup in editors: tweak with
* custom cellEditorListener.
*
*/
@Test
public void testEditorListenerRemovedOnEditorCancel() {
JXTree tree = createEditingTree();
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
// core doesn't remove the listener ... dooh
cellEditor.cancelCellEditing();
// but we do ...
assertEquals(1, cellEditor.getCellEditorListeners().length);
}
/**
* focus issues with popup in editors: tweak with
* custom cellEditorListener.
*
*/
@Test
public void testEditorListenerRemovedOnTreeCancel() {
JXTree tree = createEditingTree();
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
// core doesn't remove the listener ... dooh
tree.cancelEditing();
// but we do ...
assertEquals(1, cellEditor.getCellEditorListeners().length);
}
/**
* focus issues with popup in editors: tweak with
* custom cellEditorListener.
*
*/
@Test
public void testEditorListenerRemovedOnTreeStop() {
JXTree tree = createEditingTree();
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
// core doesn't remove the listener ... dooh
tree.stopEditing();
// but we do ...
assertEquals(1, cellEditor.getCellEditorListeners().length);
}
/**
* focus issues with popup in editors: tweak with
* custom cellEditorListener.
*
*/
@Test
public void testEditorListenerOnXTree() {
JTree core = new JTree();
int coreCount = getListenerCountAfterStartEditing(core);
JXTree tree = createEditingTree();
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
assertEquals("need one more listener than core",
coreCount + 1, cellEditor.getCellEditorListeners().length);
}
/**
* @return a tree with default model and editing started on row 2
*/
private JXTree createEditingTree() {
JXTree tree = new JXTree();
tree.setEditable(true);
// sanity
assertTrue(tree.getRowCount() > 2);
TreePath path = tree.getPathForRow(2);
tree.startEditingAtPath(path);
return tree;
}
/**
* characterization: listeners in core tree.
*
*/
@Test
public void testEditorListenerOnCoreTree() {
JTree tree = new JTree();
int listenerCount = getListenerCountAfterStartEditing(tree);
assertEquals(1, listenerCount);
tree.stopEditing();
// doesn't remove the listener ... dooh
assertEquals(1, ((DefaultTreeCellEditor) tree.getCellEditor()).getCellEditorListeners().length);
}
/**
* Starts editing on row 2 and returns the cell editor listener count after.
*
* @param tree
* @return
*/
private int getListenerCountAfterStartEditing(JTree tree) {
tree.setEditable(true);
// sanity
assertTrue(tree.getRowCount() > 2);
TreePath path = tree.getPathForRow(2);
tree.startEditingAtPath(path);
DefaultTreeCellEditor cellEditor = (DefaultTreeCellEditor) tree.getCellEditor();
int listenerCount = cellEditor.getCellEditorListeners().length;
return listenerCount;
}
/**
* Issue #473-swingx: NPE in JXTree with highlighter.<p>
*
* Renderers are doc'ed to cope with invalid input values.
* Highlighters can rely on valid ComponentAdapter state.
* JXTree delegatingRenderer is the culprit which does set
* invalid ComponentAdapter state. Negative invalid index.
*
*/
@Test
public void testIllegalNegativeTreeRowIndex() {
JXTree tree = new JXTree();
tree.expandAll();
assertTrue(tree.getRowCount() > 0);
TreeCellRenderer renderer = tree.getCellRenderer();
renderer.getTreeCellRendererComponent(tree, "dummy", false, false, false, -1, false);
SearchPredicate predicate = new SearchPredicate("\\QNode\\E");
Highlighter searchHighlighter = new ColorHighlighter(predicate, null, Color.RED);
tree.addHighlighter(searchHighlighter);
renderer.getTreeCellRendererComponent(tree, "dummy", false, false, false, -1, false);
}
/**
* Issue #473-swingx: NPE in JXTree with highlighter.<p>
*
* Renderers are doc'ed to cope with invalid input values.
* Highlighters can rely on valid ComponentAdapter state.
* JXTree delegatingRenderer is the culprit which does set
* invalid ComponentAdapter state. Invalid index > valid range.
*
*/
@Test
public void testIllegalExceedingTreeRowIndex() {
JXTree tree = new JXTree();
tree.expandAll();
assertTrue(tree.getRowCount() > 0);
TreeCellRenderer renderer = tree.getCellRenderer();
renderer.getTreeCellRendererComponent(tree, "dummy", false, false, false, tree.getRowCount(), false);
SearchPredicate predicate = new SearchPredicate("\\QNode\\E");
Highlighter searchHighlighter = new ColorHighlighter(predicate, null, Color.RED);
tree.addHighlighter(searchHighlighter);
renderer.getTreeCellRendererComponent(tree, "dummy", false, false, false, tree.getRowCount(), false);
}
/**
* test convenience method accessing the configured adapter.
*
*/
@Test
public void testConfiguredComponentAdapter() {
JXTree list = new JXTree();
list.expandAll();
assertTrue(list.getRowCount() > 0);
ComponentAdapter adapter = list.getComponentAdapter();
assertEquals(0, adapter.column);
assertEquals(0, adapter.row);
assertTrue(adapter.isHierarchical());
adapter.row = 1;
// corrupt adapter
adapter.column = 1;
adapter = list.getComponentAdapter(0);
assertEquals(0, adapter.column);
assertEquals(0, adapter.row);
}
/**
* Issue #254-swingx: expandAll doesn't expand if root not shown?
*
*/
@Test
public void testExpandAllWithInvisible() {
final DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode();
final InsertTreeTableModel model = new InsertTreeTableModel(root);
int childCount = 5;
for (int i = 0; i < childCount; i++) {
model.addChild(root);
}
final JXTree treeTable = new JXTree(model);
// sanity...
assertTrue(treeTable.isRootVisible());
assertEquals("all children visible", childCount + 1, treeTable.getRowCount());
treeTable.collapseAll();
assertEquals(" all children invisible", 1, treeTable.getRowCount());
treeTable.setRootVisible(false);
assertEquals("no rows with invisible root", 0, treeTable.getRowCount());
treeTable.expandAll();
assertTrue(treeTable.getRowCount() > 0);
}
/**
* test enhanced getSelectedRows contract: returned
* array != null
*
*/
@Test
public void testNotNullGetSelectedRows() {
JXTree tree = new JXTree(treeTableModel);
// sanity: no selection
assertEquals(0, tree.getSelectionCount());
assertNotNull("getSelectedRows guarantees not null array", tree.getSelectionRows());
}
/**
* test enhanced getSelectedRows contract: returned
* array != null
*
*/
@Test
public void testNotNullGetSelectedPaths() {
JXTree tree = new JXTree(treeTableModel);
// sanity: no selection
assertEquals(0, tree.getSelectionCount());
assertNotNull("getSelectedPaths guarantees not null array", tree.getSelectionPaths());
}
/**
* Issue #221-swingx: actionMap not initialized in JXTreeNode constructor.
* Issue #231-swingx: icons lost in editor, enhanced default editor not installed.
*
* PENDING: test all constructors!
*
*/
@Test
public void testInitInConstructors() {
assertXTreeInit(new JXTree());
assertXTreeInit(new JXTree(new Object[] {}));
assertXTreeInit(new JXTree(new Vector<Object>()));
assertXTreeInit(new JXTree(new Hashtable<Object, Object>()));
assertXTreeInit(new JXTree(new DefaultMutableTreeNode("dummy"), false));
assertXTreeInit(new JXTree(new DefaultMutableTreeNode("dummy")));
assertXTreeInit(new JXTree(new DefaultTreeModel(new DefaultMutableTreeNode("dummy"))));
}
/**
* @param tree
*/
private void assertXTreeInit(JXTree tree) {
assertNotNull("Actions must be initialized", tree.getActionMap().get("find"));
assertTrue("Editor must be DefaultXTreeCellEditor",
tree.getCellEditor() instanceof DefaultXTreeCellEditor);
// JW: wrong assumption, available for TreeTableModel impl only?
// assertNotNull("conversionMethod must be initialized",
// tree.getValueConversionMethod(tree.getModel()));
// tree.getValueConversionMethod(tree.getModel());
}
/**
* JTree allows null model.
* learning something new every day :-)
*
*/
@Test
public void testNullModel() {
JXTree tree = new JXTree();
assertNotNull(tree.getModel());
tree.setModel(null);
assertEquals(0, tree.getRowCount());
// tree.getComponentAdapter().isLeaf();
}
/**
* Creates and returns a StringValue which maps a Color to it's R/G/B rep,
* prepending "R/G/B: "
*
* @return the StringValue for color.
*/
private StringValue createColorStringValue() {
StringValue sv = new StringValue() {
public String getString(Object value) {
if (value instanceof Color) {
Color color = (Color) value;
return "R/G/B: " + color.getRGB();
}
return StringValues.TO_STRING.getString(value);
}
};
return sv;
}
@Override
protected void setUp() throws Exception {
super.setUp();
treeTableModel = new FileSystemModel();
}
}