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}