package org.jdesktop.swingx.treetable;
import java.util.Vector;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
*
*/
@RunWith(JUnit4.class)
public class DefaultTreeTableModelUnitTest extends TestCase {
private DefaultTreeTableModel model;
private DefaultMutableTreeTableNode root;
private DefaultMutableTreeTableNode child1;
private DefaultMutableTreeTableNode child2;
private DefaultMutableTreeTableNode grandchild1;
private DefaultMutableTreeTableNode grandchild2;
private DefaultMutableTreeTableNode grandchild3;
private DefaultMutableTreeTableNode grandchild4;
private DefaultMutableTreeTableNode grandchild5;
private AbstractMutableTreeTableNode grandchild6;
@Before
public void setUpJ4() throws Exception {
setUp();
}
@After
public void tearDownJ4() throws Exception {
tearDown();
}
private TreeTableNode createTree() {
root = new DefaultMutableTreeTableNode("root");
child1 = new DefaultMutableTreeTableNode("child1");
grandchild1 = new DefaultMutableTreeTableNode("grandchild1");
child1.add(grandchild1);
grandchild2 = new DefaultMutableTreeTableNode("grandchild2");
child1.add(grandchild2);
grandchild3 = new DefaultMutableTreeTableNode("grandchild3");
child1.add(grandchild3);
root.add(child1);
child2 = new DefaultMutableTreeTableNode("child2");
grandchild4 = new DefaultMutableTreeTableNode("grandchild4");
child2.add(grandchild4);
grandchild5 = new DefaultMutableTreeTableNode("grandchild5");
child2.add(grandchild5);
grandchild6 = new AbstractMutableTreeTableNode("grandchild6") {
public int getColumnCount() {
return 0;
}
public Object getValueAt(int column) {
return getUserObject();
}
};
child2.add(grandchild6);
root.add(child2);
return root;
}
/**
* {@inheritDoc}
*/
@Override
protected void setUp() throws Exception {
super.setUp();
Vector<String> names = new Vector<String>();
names.add("A");
model = new DefaultTreeTableModel(createTree(), names);
}
@Test
public void testGetPathToRoot() {
TreeNode[] testGroup1 = model.getPathToRoot(grandchild3);
assertEquals(testGroup1[0], root);
assertEquals(testGroup1[1], child1);
assertEquals(testGroup1[2], grandchild3);
TreeNode[] testGroup2 = model.getPathToRoot(child2);
assertEquals(testGroup2[0], root);
assertEquals(testGroup2[1], child2);
TreeNode[] testGroup3 = model.getPathToRoot(root);
assertEquals(testGroup3[0], root);
try {
model.getPathToRoot(null);
fail("expected NullPointerException");
} catch (NullPointerException e) {
//success
}
try {
model.getPathToRoot(new DefaultMutableTreeTableNode("failure"));
fail("expected NullPointerException");
} catch (NullPointerException e) {
//success
}
}
@Test
public void testGetValueAt() {
//Test expected cases
assertEquals(model.getValueAt(root, 0), "root");
//Outside TTN count
assertNull(model.getValueAt(grandchild6, 0));
//Test boundary cases
try {
model.getValueAt(child1, model.getColumnCount());
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.getValueAt(grandchild4, -1);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
//Test exceptional cases
try {
model.getValueAt(null, 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.getValueAt(new Object(), 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
}
@Test
public void testSetValueAt() {
//Test expected cases
model.setValueAt("new", root, 0);
assertEquals(model.getValueAt(root, 0), "new");
//Test boundary cases
try {
model.setValueAt("new", child1, model.getColumnCount());
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.setValueAt("new", grandchild4, -1);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
//Test exceptional cases
try {
model.setValueAt("new", null, 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.setValueAt("new", new Object(), 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
}
public void testSetValueAtIssues() {
//TODO what to do in this case? exception? nothing?
//Outside TTN count
model.setValueAt("new", grandchild6, 0);
}
@Test
public void testGetChild() {
assertEquals(model.getChild(root, 0), child1);
//Test boundary cases
//TODO untestable: outcome depends on how node handles OOB
//should TTN document an IOOBException?
//Test exceptional cases
try {
model.getChild(null, 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.getChild(new Object(), 0);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
}
@Test
public void testGetChildCount() {
assertEquals(model.getChildCount(root), 2);
assertEquals(model.getChildCount(child1), 3);
assertEquals(model.getChildCount(grandchild4), 0);
//Test exceptional cases
try {
model.getChildCount(null);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.getChildCount(new Object());
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
}
/**
* Testing that indexOfChild returns -1 for uncontained parent/child nodes.
*/
@Test
public void testGetIndexOfChild() {
assertEquals(model.getIndexOfChild(root,child1), 0);
assertEquals(model.getIndexOfChild(root,child2), 1);
assertEquals(-1, model.getIndexOfChild(null, child1));
assertEquals(-1, model.getIndexOfChild(new Object(), child1));
assertEquals(-1, model.getIndexOfChild(child1, null));
assertEquals(-1, model.getIndexOfChild(child1, new Object()));
// //Test exceptional cases
// try {
// model.getIndexOfChild(null, child1);
// fail("expected IllegalArgumentException");
// } catch (IllegalArgumentException e) {
// //success
// }
//
// try {
// model.getIndexOfChild(new Object(), child1);
// fail("expected IllegalArgumentException");
// } catch (IllegalArgumentException e) {
// //success
// }
// try {
// model.getIndexOfChild(child1, null);
// fail("expected IllegalArgumentException");
// } catch (IllegalArgumentException e) {
// //success
// }
//
// try {
// model.getIndexOfChild(child1, new Object());
// fail("expected IllegalArgumentException");
// } catch (IllegalArgumentException e) {
// //success
// }
}
@Test
public void testIsCellEditable() {
//Test expected cases
// assertFalse(model.isLeaf(root));
// assertFalse(model.isLeaf(child2));
// assertTrue(model.isLeaf(grandchild3));
//Test boundary cases
try {
model.isCellEditable(root, model.getColumnCount());
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
model.isCellEditable(root, -1);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
//Test exceptional cases
try {
model.isCellEditable(null, 0);
fail("IllegalArgumentException is not thrown.");
} catch (IllegalArgumentException e) {
//test succeeded
}
try {
model.isCellEditable(new Object(), 0);
fail("IllegalArgumentException is not thrown.");
} catch (IllegalArgumentException e) {
//test succeeded
}
}
@Test
public void testModelIsLeaf() {
//Test expected cases
assertFalse(model.isLeaf(root));
assertFalse(model.isLeaf(child2));
assertTrue(model.isLeaf(grandchild3));
//Test exceptional cases
try {
model.isLeaf(null);
fail("IllegalArgumentException is not thrown.");
} catch (IllegalArgumentException e) {
//test succeeded
}
try {
model.isLeaf(new Object());
fail("IllegalArgumentException is not thrown.");
} catch (IllegalArgumentException e) {
//test succeeded
}
}
@Test
public void testRemoveFromParent() {
try {
model.removeNodeFromParent(new DefaultMutableTreeTableNode());
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
try {
DefaultMutableTreeTableNode p = new DefaultMutableTreeTableNode();
DefaultMutableTreeTableNode c = new DefaultMutableTreeTableNode();
c.setParent(p);
model.removeNodeFromParent(c);
fail("Expected NullPointerException");
} catch (NullPointerException e) {
//success
//TODO does not seem like the correct exception
}
TreeNode parent = grandchild6.getParent();
int count = parent.getChildCount();
model.removeNodeFromParent(grandchild6);
assertNull(grandchild6.getParent());
assertEquals(parent.getChildCount(), count - 1);
model.removeNodeFromParent(child1);
assertNull(child1.getParent());
try {
model.removeNodeFromParent(root);
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
//TODO test removing already removed nodes?
}
@Test
public void testSetRoot() {
assertEquals(model.getRoot(), root);
DefaultMutableTreeTableNode newRoot = new DefaultMutableTreeTableNode("a new root");
model.setRoot(newRoot);
assertEquals(model.getRoot(), newRoot);
}
//TODO test "fire" methods and reloads
@Test
public void testValueForPathChanged() {
//Test expected cases
model.valueForPathChanged(new TreePath(root), "a new root");
assertEquals(root.getUserObject(), "a new root");
//Test exceptional cases
try {
model.valueForPathChanged(null, new Object());
fail("Expected NullPointerException");
} catch (NullPointerException e) {
//success
}
try {
model.valueForPathChanged(new TreePath(new Object()), new Object());
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
//success
}
}
@Test
public void testSetUserObject() {
//Test expected cases
model.setUserObject(grandchild2, "a new value");
assertEquals(grandchild2.getUserObject(), "a new value");
//Test exceptional cases
try {
model.setUserObject(null, new Object());
fail("Expected NullPointerException");
} catch (NullPointerException e) {
//success
}
//TODO fix model to return correct exception
// try {
// model.setUserObject(new DefaultMutableTreeTableNode("unmanaged"), new Object());
// fail("Expected IllegalArgumentException");
// } catch (IllegalArgumentException e) {
// //success
// }
}
}