158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.swingui;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Enumeration;
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Hashtable;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Vector;
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport javax.swing.event.TreeModelEvent;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport javax.swing.event.TreeModelListener;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport javax.swing.tree.TreeModel;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport javax.swing.tree.TreePath;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.extensions.TestDecorator;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite;
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A tree model for a Test.
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotclass TestTreeModel implements TreeModel {
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Test fRoot;
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Vector fModelListeners= new Vector();
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Hashtable fFailures= new Hashtable();
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Hashtable fErrors= new Hashtable();
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Hashtable fRunTests= new Hashtable();
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Constructs a tree model with the given test as its root.
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestTreeModel(Test root) {
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		super();
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRoot= root;
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * adds a TreeModelListener
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void addTreeModelListener(TreeModelListener l) {
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (!fModelListeners.contains(l))
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fModelListeners.addElement(l);
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Removes a TestModelListener
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void removeTreeModelListener(TreeModelListener l) {
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fModelListeners.removeElement(l);
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Finds the path to a test. Returns the index of the test in its
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * parent test suite.
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public int findTest(Test target, Test node, Vector path) {
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (target.equals(node))
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return 0;
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestSuite suite= isTestSuite(node);
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 0; i < getChildCount(node); i++) {
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Test t= suite.testAt(i);
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			int index= findTest(target, t, path);
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (index >= 0) {
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				path.insertElementAt(node, 0);
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				if (path.size() == 1)
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					return i;
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				return index;
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return -1;
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Fires a node changed event
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void fireNodeChanged(TreePath path, int index) {
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int[] indices= {index};
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Object[] changedChildren= {getChild(path.getLastPathComponent(), index)};
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TreeModelEvent event= new TreeModelEvent(this, path, indices, changedChildren);
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Enumeration e= fModelListeners.elements();
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		while (e.hasMoreElements()) {
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			TreeModelListener l= (TreeModelListener) e.nextElement();
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			l.treeNodesChanged(event);
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the test at the given index
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public Object getChild(Object parent, int index) {
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestSuite suite= isTestSuite(parent);
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (suite != null)
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return suite.testAt(index);
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return null;
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the number of tests.
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public int getChildCount(Object parent) {
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestSuite suite= isTestSuite(parent);
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (suite != null)
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return suite.testCount();
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return 0;
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Gets the index of a test in a test suite
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public int getIndexOfChild(Object parent, Object child) {
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestSuite suite= isTestSuite(parent);
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (suite != null) {
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			int i= 0;
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			for (Enumeration e= suite.tests(); e.hasMoreElements(); i++) {
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				if (child.equals(e.nextElement()))
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					return i;
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return -1;
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns the root of the tree
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public Object getRoot() {
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fRoot;
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Tests if the test is a leaf.
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public boolean isLeaf(Object node) {
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return isTestSuite(node) == null;
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Tests if the node is a TestSuite.
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	TestSuite isTestSuite(Object node) {
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (node instanceof TestSuite)
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return (TestSuite)node;
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (node instanceof TestDecorator) {
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Test baseTest= ((TestDecorator)node).getTest();
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return isTestSuite(baseTest);
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return null;
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Called when the value of the model object was changed in the view
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void valueForPathChanged(TreePath path, Object newValue) {
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		// we don't support direct editing of the model
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		System.out.println("TreeModel.valueForPathChanged: not implemented");
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Remembers a test failure
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	void addFailure(Test t) {
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailures.put(t, t);
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Remembers a test error
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	void addError(Test t) {
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fErrors.put(t, t);
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Remembers that a test was run
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	void addRunTest(Test t) {
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRunTests.put(t, t);
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns whether a test was run
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	boolean wasRun(Test t) {
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fRunTests.get(t) != null;
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Tests whether a test was an error
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	boolean isError(Test t) {
17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return (fErrors != null) && fErrors.get(t) != null;
17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Tests whether a test was a failure
17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	boolean isFailure(Test t) {
18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return (fFailures != null) && fFailures.get(t) != null;
18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Resets the test results
18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	void resetResults() {
18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailures= new Hashtable();
18758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRunTests= new Hashtable();
18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fErrors= new Hashtable();
18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}