package junit.swingui; | |
import java.awt.*; | |
import java.util.Vector; | |
import javax.swing.*; | |
import javax.swing.tree.*; | |
import junit.framework.*; | |
/** | |
* 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); | |
} | |
} | |
} | |
} | |
); | |
} | |
} |