158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.awtui;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.BorderLayout;
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Button;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Checkbox;
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Color;
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Component;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Font;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Frame;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.GridBagConstraints;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.GridBagLayout;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.GridLayout;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Image;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Insets;
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Label;
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.List;
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Menu;
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.MenuBar;
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.MenuItem;
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Panel;
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.SystemColor;
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.TextArea;
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.TextField;
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.Toolkit;
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.ActionEvent;
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.ActionListener;
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.ItemEvent;
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.ItemListener;
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.TextEvent;
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.TextListener;
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.WindowAdapter;
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.event.WindowEvent;
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.awt.image.ImageProducer;
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Vector;
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestCase;
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult;
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite;
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner;
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.TestRunListener;
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * An AWT based user interface to run tests.
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Enter the name of a class which either provides a static
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * suite method or is a subclass of TestCase.
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre>
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Synopsis: java junit.awtui.TestRunner [-noloading] [TestCase]
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre>
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * TestRunner takes as an optional argument the name of the testcase class to be run.
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public class TestRunner extends BaseTestRunner {
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Frame fFrame;
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Vector fExceptions;
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Vector fFailedTests;
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Thread fRunner;
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult fTestResult;
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TextArea fTraceArea;
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TextField fSuiteField;
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Button fRun;
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected ProgressBar fProgressIndicator;
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected List fFailureList;
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Logo fLogo;
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Label fNumberOfErrors;
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Label fNumberOfFailures;
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Label fNumberOfRuns;
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Button fQuitButton;
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Button fRerunButton;
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TextField fStatusLine;
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Checkbox fUseLoadingRunner;
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected static final Font PLAIN_FONT= new Font("dialog", Font.PLAIN, 12);
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static final int GAP= 4;
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestRunner() {
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void about() {
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		AboutDialog about= new AboutDialog(fFrame);
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		about.setModal(true);
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		about.setLocation(300, 300);
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		about.setVisible(true);
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testStarted(String testName) {
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		showInfo("Running: "+testName);
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testEnded(String testName) {
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		setLabelValue(fNumberOfRuns, fTestResult.runCount());
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		synchronized(this) {
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fProgressIndicator.step(fTestResult.wasSuccessful());
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testFailed(int status, Test test, Throwable t) {
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		switch (status) {
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			case TestRunListener.STATUS_ERROR:
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				fNumberOfErrors.setText(Integer.toString(fTestResult.errorCount()));
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				appendFailure("Error", test, t);
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			case TestRunListener.STATUS_FAILURE:
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				fNumberOfFailures.setText(Integer.toString(fTestResult.failureCount()));
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				appendFailure("Failure", test, t);
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				break;
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void addGrid(Panel p, Component co, int x, int y, int w, int fill, double wx, int anchor) {
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		GridBagConstraints c= new GridBagConstraints();
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.gridx= x; c.gridy= y;
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.gridwidth= w;
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.anchor= anchor;
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.weightx= wx;
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.fill= fill;
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fill == GridBagConstraints.BOTH || fill == GridBagConstraints.VERTICAL)
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			c.weighty= 1.0;
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		c.insets= new Insets(y == 0 ? GAP : 0, x == 0 ? GAP : 0, GAP, GAP);
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		p.add(co, c);
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void appendFailure(String kind, Test test, Throwable t) {
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		kind+= ": " + test;
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String msg= t.getMessage();
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (msg != null) {
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			kind+= ":" + truncate(msg);
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailureList.add(kind);
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fExceptions.addElement(t);
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailedTests.addElement(test);
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fFailureList.getItemCount() == 1) {
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fFailureList.select(0);
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			failureSelected();
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Creates the JUnit menu. Clients override this
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * method to add additional menu items.
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Menu createJUnitMenu() {
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Menu menu= new Menu("JUnit");
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		MenuItem mi= new MenuItem("About...");
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		mi.addActionListener(
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		    new ActionListener() {
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		        public void actionPerformed(ActionEvent event) {
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		            about();
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		        }
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		    }
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		menu.add(mi);
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		menu.addSeparator();
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		mi= new MenuItem("Exit");
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		mi.addActionListener(
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		    new ActionListener() {
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		        public void actionPerformed(ActionEvent event) {
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		            System.exit(0);
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		        }
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		    }
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		menu.add(mi);
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return menu;
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void createMenus(MenuBar mb) {
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		mb.add(createJUnitMenu());
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult createTestResult() {
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return new TestResult();
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Frame createUI(String suiteName) {
17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Frame frame= new Frame("JUnit");
17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Image icon= loadFrameIcon();
17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (icon != null)
17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			frame.setIconImage(icon);
17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.setLayout(new BorderLayout(0, 0));
18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.setBackground(SystemColor.control);
18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		final Frame finalFrame= frame;
18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.addWindowListener(
18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new WindowAdapter() {
18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void windowClosing(WindowEvent e) {
18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					finalFrame.dispose();
18758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					System.exit(0);
18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		MenuBar mb = new MenuBar();
19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		createMenus(mb);
19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.setMenuBar(mb);
19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- first section
19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Label suiteLabel= new Label("Test class name:");
19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField= new TextField(suiteName != null ? suiteName : "");
20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.selectAll();
20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.requestFocus();
20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.setFont(PLAIN_FONT);
20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.setColumns(40);
20458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.addActionListener(
20558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new ActionListener() {
20658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void actionPerformed(ActionEvent e) {
20758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					runSuite();
20858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
20958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
21058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
21158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.addTextListener(
21258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new TextListener() {
21358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void textValueChanged(TextEvent e) {
21458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					fRun.setEnabled(fSuiteField.getText().length() > 0);
21558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					fStatusLine.setText("");
21658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
21758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
21858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
21958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRun= new Button("Run");
22058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRun.setEnabled(false);
22158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRun.addActionListener(
22258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new ActionListener() {
22358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void actionPerformed(ActionEvent e) {
22458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					runSuite();
22558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
22658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
22758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
22858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		boolean useLoader= useReloadingTestSuiteLoader();
22958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fUseLoadingRunner= new Checkbox("Reload classes every run", useLoader);
23058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (inVAJava())
23158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fUseLoadingRunner.setVisible(false);
23258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
23358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- second section
23458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fProgressIndicator= new ProgressBar();
23558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
23658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- third section
23758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfErrors= new Label("0000", Label.RIGHT);
23858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfErrors.setText("0");
23958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfErrors.setFont(PLAIN_FONT);
24058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
24158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfFailures= new Label("0000", Label.RIGHT);
24258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfFailures.setText("0");
24358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfFailures.setFont(PLAIN_FONT);
24458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
24558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfRuns= new Label("0000", Label.RIGHT);
24658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfRuns.setText("0");
24758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fNumberOfRuns.setFont(PLAIN_FONT);
24858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
24958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Panel numbersPanel= createCounterPanel();
25058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
25158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- fourth section
25258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Label failureLabel= new Label("Errors and Failures:");
25358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
25458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailureList= new List(5);
25558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailureList.addItemListener(
25658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new ItemListener() {
25758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void itemStateChanged(ItemEvent e) {
25858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					failureSelected();
25958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
26058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
26158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
26258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRerunButton= new Button("Run");
26358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRerunButton.setEnabled(false);
26458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRerunButton.addActionListener(
26558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new ActionListener() {
26658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void actionPerformed(ActionEvent e) {
26758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					rerun();
26858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
26958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
27058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
27158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
27258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Panel failedPanel= new Panel(new GridLayout(0, 1, 0, 2));
27358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		failedPanel.add(fRerunButton);
27458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
27558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fTraceArea= new TextArea();
27658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fTraceArea.setRows(5);
27758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fTraceArea.setColumns(60);
27858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
27958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- fifth section
28058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine= new TextField();
28158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setFont(PLAIN_FONT);
28258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setEditable(false);
28358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setForeground(Color.red);
28458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
28558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fQuitButton= new Button("Exit");
28658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fQuitButton.addActionListener(
28758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new ActionListener() {
28858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				public void actionPerformed(ActionEvent e) {
28958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					System.exit(0);
29058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				}
29158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
29258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
29358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
29458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		// ---------
29558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fLogo= new Logo();
29658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
29758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		//---- overall layout
29858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Panel panel= new Panel(new GridBagLayout());
29958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
30058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, suiteLabel,		 0, 0, 2, GridBagConstraints.HORIZONTAL, 	1.0, GridBagConstraints.WEST);
30158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
30258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fSuiteField, 	 0, 1, 2, GridBagConstraints.HORIZONTAL, 	1.0, GridBagConstraints.WEST);
30358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fRun, 			 2, 1, 1, GridBagConstraints.HORIZONTAL, 	0.0, GridBagConstraints.CENTER);
30458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fUseLoadingRunner, 0, 2, 2, GridBagConstraints.NONE, 	1.0, GridBagConstraints.WEST);
30558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fProgressIndicator, 0, 3, 2, GridBagConstraints.HORIZONTAL, 	1.0, GridBagConstraints.WEST);
30658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fLogo, 			 2, 3, 1, GridBagConstraints.NONE, 			0.0, GridBagConstraints.NORTH);
30758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
30858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, numbersPanel,	 0, 4, 2, GridBagConstraints.NONE, 			0.0, GridBagConstraints.WEST);
30958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
31058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, failureLabel, 	 0, 5, 2, GridBagConstraints.HORIZONTAL, 	1.0, GridBagConstraints.WEST);
31158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fFailureList, 	 0, 6, 2, GridBagConstraints.BOTH, 			1.0, GridBagConstraints.WEST);
31258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, failedPanel, 	 2, 6, 1, GridBagConstraints.HORIZONTAL, 	0.0, GridBagConstraints.CENTER);
31358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fTraceArea, 	     0, 7, 2, GridBagConstraints.BOTH, 			1.0, GridBagConstraints.WEST);
31458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
31558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fStatusLine, 	 0, 8, 2, GridBagConstraints.HORIZONTAL, 	1.0, GridBagConstraints.CENTER);
31658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addGrid(panel, fQuitButton, 	 2, 8, 1, GridBagConstraints.HORIZONTAL, 	0.0, GridBagConstraints.CENTER);
31758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
31858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.add(panel, BorderLayout.CENTER);
31958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		frame.pack();
32058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return frame;
32158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
32258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
32358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected Panel createCounterPanel() {
32458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Panel numbersPanel= new Panel(new GridBagLayout());
32558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
32658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
32758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new Label("Runs:"),
32858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			0, 0, 1, 1, 0.0, 0.0,
32958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.NONE,
33058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 0, 0, 0)
33158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
33258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
33358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
33458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fNumberOfRuns,
33558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	1, 0, 1, 1, 0.33, 0.0,
33658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
33758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 8, 0, 40)
33858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
33958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
34058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
34158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new Label("Errors:"),
34258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	2, 0, 1, 1, 0.0, 0.0,
34358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.NONE,
34458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 8, 0, 0)
34558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
34658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
34758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
34858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fNumberOfErrors,
34958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	3, 0, 1, 1, 0.33, 0.0,
35058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
35158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 8, 0, 40)
35258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
35358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
35458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
35558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			new Label("Failures:"),
35658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	4, 0, 1, 1, 0.0, 0.0,
35758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.NONE,
35858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 8, 0, 0)
35958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
36058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		addToCounterPanel(
36158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			numbersPanel,
36258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fNumberOfFailures,
36358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	5, 0, 1, 1, 0.33, 0.0,
36458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
36558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot          	new Insets(0, 8, 0, 0)
36658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		);
36758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return numbersPanel;
36858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
36958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
37058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void addToCounterPanel(Panel counter, Component comp,
37158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	    	int gridx, int gridy, int gridwidth, int gridheight,
37258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			double weightx, double weighty,
37358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			int anchor, int fill,
37458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Insets insets) {
37558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
37658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		GridBagConstraints constraints= new GridBagConstraints();
37758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.gridx= gridx;
37858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.gridy= gridy;
37958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.gridwidth= gridwidth;
38058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.gridheight= gridheight;
38158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.weightx= weightx;
38258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.weighty= weighty;
38358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.anchor= anchor;
38458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.fill= fill;
38558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		constraints.insets= insets;
38658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		counter.add(comp, constraints);
38758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
38858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
38958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
39058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void failureSelected() {
39158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRerunButton.setEnabled(isErrorSelected());
39258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		showErrorTrace();
39358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
39458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
39558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean isErrorSelected() {
39658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fFailureList.getSelectedIndex() != -1;
39758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
39858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
39958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private Image loadFrameIcon() {
40058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Toolkit toolkit= Toolkit.getDefaultToolkit();
40158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
40258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			java.net.URL url= BaseTestRunner.class.getResource("smalllogo.gif");
40358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return toolkit.createImage((ImageProducer) url.getContent());
40458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (Exception ex) {
40558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
40658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return null;
40758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
40858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
40958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public Thread getRunner() {
41058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fRunner;
41158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
41258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
41358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static void main(String[] args) {
41458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		new TestRunner().start(args);
41558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
41658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
41758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static void run(Class test) {
41858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String args[]= { test.getName() };
41958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		main(args);
42058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
42158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
42258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void rerun() {
42358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int index= fFailureList.getSelectedIndex();
42458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (index == -1)
42558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return;
42658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
42758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Test test= (Test)fFailedTests.elementAt(index);
42858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		rerunTest(test);
42958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
43058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
43158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void rerunTest(Test test) {
43258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (!(test instanceof TestCase)) {
43358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showInfo("Could not reload "+ test.toString());
43458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return;
43558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
43658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Test reloadedTest= null;
43758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestCase rerunTest= (TestCase)test;
43858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
43958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Class reloadedTestClass= getLoader().reload(test.getClass());
44058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			reloadedTest= TestSuite.createTest(reloadedTestClass, rerunTest.getName());
44158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch(Exception e) {
44258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showInfo("Could not reload "+ test.toString());
44358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return;
44458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
44558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestResult result= new TestResult();
44658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		reloadedTest.run(result);
44758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
44858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String message= reloadedTest.toString();
44958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if(result.wasSuccessful())
45058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showInfo(message+" was successful");
45158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		else if (result.errorCount() == 1)
45258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showStatus(message+" had an error");
45358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		else
45458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showStatus(message+" had a failure");
45558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
45658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
45758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void reset() {
45858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		setLabelValue(fNumberOfErrors, 0);
45958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		setLabelValue(fNumberOfFailures, 0);
46058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		setLabelValue(fNumberOfRuns, 0);
46158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fProgressIndicator.reset();
46258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRerunButton.setEnabled(false);
46358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailureList.removeAll();
46458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fExceptions= new Vector(10);
46558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFailedTests= new Vector(10);
46658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fTraceArea.setText("");
46758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
46858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
46958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
47058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void runFailed(String message) {
47158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		showStatus(message);
47258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRun.setLabel("Run");
47358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fRunner= null;
47458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
47558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
47658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	synchronized public void runSuite() {
47758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fRunner != null && fTestResult != null) {
47858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fTestResult.stop();
47958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} else {
48058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			setLoading(shouldReload());
48158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fRun.setLabel("Stop");
48258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showInfo("Initializing...");
48358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			reset();
48458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
48558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			showInfo("Load Test Case...");
48658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
48758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			final Test testSuite= getTest(fSuiteField.getText());
48858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (testSuite != null) {
48958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				fRunner= new Thread() {
49058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					public void run() {
49158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fTestResult= createTestResult();
49258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fTestResult.addListener(TestRunner.this);
49358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fProgressIndicator.start(testSuite.countTestCases());
49458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						showInfo("Running...");
49558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
49658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						long startTime= System.currentTimeMillis();
49758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						testSuite.run(fTestResult);
49858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
49958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						if (fTestResult.shouldStop()) {
50058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot							showStatus("Stopped");
50158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						} else {
50258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot							long endTime= System.currentTimeMillis();
50358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot							long runTime= endTime-startTime;
50458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot							showInfo("Finished: " + elapsedTimeAsString(runTime) + " seconds");
50558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						}
50658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fTestResult= null;
50758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fRun.setLabel("Run");
50858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						fRunner= null;
50958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot						System.gc();
51058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					}
51158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				};
51258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				fRunner.start();
51358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
51458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
51558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
51658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
51758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private boolean shouldReload() {
51858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return !inVAJava() && fUseLoadingRunner.getState();
51958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
52058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
52158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void setLabelValue(Label label, int value) {
52258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		label.setText(Integer.toString(value));
52358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		label.invalidate();
52458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		label.getParent().validate();
52558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
52658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
52758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
52858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void setSuiteName(String suite) {
52958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fSuiteField.setText(suite);
53058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
53158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
53258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void showErrorTrace() {
53358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		int index= fFailureList.getSelectedIndex();
53458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (index == -1)
53558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return;
53658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
53758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Throwable t= (Throwable) fExceptions.elementAt(index);
53858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fTraceArea.setText(getFilteredTrace(t));
53958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
54058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
54158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
54258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void showInfo(String message) {
54358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setFont(PLAIN_FONT);
54458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setForeground(Color.black);
54558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setText(message);
54658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
54758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
54858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void clearStatus() {
54958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		showStatus("");
55058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
55158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
55258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private void showStatus(String status) {
55358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setFont(PLAIN_FONT);
55458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setForeground(Color.red);
55558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fStatusLine.setText(status);
55658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
55758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
55858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Starts the TestRunner
55958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
56058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void start(String[] args) {
56158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String suiteName= processArguments(args);
56258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFrame= createUI(suiteName);
56358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFrame.setLocation(200, 200);
56458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fFrame.setVisible(true);
56558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
56658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (suiteName != null) {
56758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			setSuiteName(suiteName);
56858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runSuite();
56958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
57058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
57158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}