blob: 0818bc3f9ae6d93a3d22a2c0dd1374d6e96aa98f [file] [log] [blame]
package junit.swingui;
import java.util.Vector;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import junit.framework.*;
import junit.runner.*;
/**
* A Panel showing a test suite as a tree.
*/
class TestSuitePanel extends JPanel implements TestListener {
private JTree fTree;
private JScrollPane fScrollTree;
private TestTreeModel fModel;
static class TestTreeCellRenderer extends DefaultTreeCellRenderer {
private Icon fErrorIcon;
private Icon fOkIcon;
private Icon fFailureIcon;
TestTreeCellRenderer() {
super();
loadIcons();
}
void loadIcons() {
fErrorIcon= TestRunner.getIconResource(getClass(), "icons/error.gif");
fOkIcon= TestRunner.getIconResource(getClass(), "icons/ok.gif");
fFailureIcon= TestRunner.getIconResource(getClass(), "icons/failure.gif");
}
String stripParenthesis(Object o) {
String text= o.toString ();
int pos= text.indexOf('(');
if (pos < 1)
return text;
return text.substring (0, pos);
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
Component c= super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
TreeModel model= tree.getModel();
if (model instanceof TestTreeModel) {
TestTreeModel testModel= (TestTreeModel)model;
Test t= (Test)value;
String s= "";
if (testModel.isFailure(t)) {
if (fFailureIcon != null)
setIcon(fFailureIcon);
s= " - Failed";
}
else if (testModel.isError(t)) {
if (fErrorIcon != null)
setIcon(fErrorIcon);
s= " - Error";
}
else if (testModel.wasRun(t)) {
if (fOkIcon != null)
setIcon(fOkIcon);
s= " - Passed";
}
if (c instanceof JComponent)
((JComponent)c).setToolTipText(getText()+s);
}
setText(stripParenthesis(value));
return c;
}
}
public TestSuitePanel() {
super(new BorderLayout());
setPreferredSize(new Dimension(300, 100));
fTree= new JTree();
fTree.setModel(null);
fTree.setRowHeight(20);
ToolTipManager.sharedInstance().registerComponent(fTree);
fTree.putClientProperty("JTree.lineStyle", "Angled");
fScrollTree= new JScrollPane(fTree);
add(fScrollTree, BorderLayout.CENTER);
}
public void addError(final Test test, final Throwable t) {
fModel.addError(test);
fireTestChanged(test, true);
}
public void addFailure(final Test test, final AssertionFailedError t) {
fModel.addFailure(test);
fireTestChanged(test, true);
}
/**
* A test ended.
*/
public void endTest(Test test) {
fModel.addRunTest(test);
fireTestChanged(test, false);
}
/**
* A test started.
*/
public void startTest(Test test) {
}
/**
* Returns the selected test or null if multiple or none is selected
*/
public Test getSelectedTest() {
TreePath[] paths= fTree.getSelectionPaths();
if (paths != null && paths.length == 1)
return (Test)paths[0].getLastPathComponent();
return null;
}
/**
* Returns the Tree
*/
public JTree getTree() {
return fTree;
}
/**
* Shows the test hierarchy starting at the given test
*/
public void showTestTree(Test root) {
fModel= new TestTreeModel(root);
fTree.setModel(fModel);
fTree.setCellRenderer(new TestTreeCellRenderer());
}
private void fireTestChanged(final Test test, final boolean expand) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
Vector vpath= new Vector();
int index= fModel.findTest(test, (Test)fModel.getRoot(), vpath);
if (index >= 0) {
Object[] path= new Object[vpath.size()];
vpath.copyInto(path);
TreePath treePath= new TreePath(path);
fModel.fireNodeChanged(treePath, index);
if (expand) {
Object[] fullPath= new Object[vpath.size()+1];
vpath.copyInto(fullPath);
fullPath[vpath.size()]= fModel.getChild(treePath.getLastPathComponent(), index);;
TreePath fullTreePath= new TreePath(fullPath);
fTree.scrollPathToVisible(fullTreePath);
}
}
}
}
);
}
}