| 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); |
| } |
| } |
| } |
| } |
| ); |
| } |
| } |