aboutsummaryrefslogtreecommitdiff
path: root/src/junit/swingui/TestSuitePanel.java
blob: d8902ad39cb215a808b439ab5f9cac0c011ed9d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package junit.swingui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Vector;

import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestListener;

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