158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.textui;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintStream;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.StandardTestSuiteLoader;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.TestSuiteLoader;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.Version;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A command line based tool to run tests.
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre>
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * java junit.textui.TestRunner [-wait] TestCaseClass
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre>
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * TestRunner expects the name of a TestCase class as argument.
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * If this class defines a static <code>suite</code> method it
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * will be invoked and the returned test is run. Otherwise all
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * the methods starting with "test" having no arguments are run.
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <p>
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * When the wait command line argument is given TestRunner
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * waits until the users types RETURN.
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <p>
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * TestRunner prints a trace as the tests are executed followed by a
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * summary at the end.
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class TestRunner extends BaseTestRunner {
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private ResultPrinter fPrinter;
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static final int SUCCESS_EXIT= 0;
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static final int FAILURE_EXIT= 1;
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static final int EXCEPTION_EXIT= 2;
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Constructs a TestRunner.
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestRunner() {
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		this(System.out);
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Constructs a TestRunner using the given stream for all the output
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestRunner(PrintStream writer) {
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		this(new ResultPrinter(writer));
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Constructs a TestRunner using the given ResultPrinter all the output
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestRunner(ResultPrinter printer) {
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter= printer;
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a suite extracted from a TestCase subclass.
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static public void run(Class testClass) {
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		run(new TestSuite(testClass));
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a single test and collects its results.
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * This method can be used to start a test run
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * from your program.
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * <pre>
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * public static void main (String[] args) {
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 *     test.textui.TestRunner.run(suite());
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * }
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * </pre>
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static public TestResult run(Test test) {
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestRunner runner= new TestRunner();
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return runner.doRun(test);
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Runs a single test and waits until the user
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * types RETURN.
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static public void runAndWait(Test suite) {
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestRunner aTestRunner= new TestRunner();
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		aTestRunner.doRun(suite, true);
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Always use the StandardTestSuiteLoader. Overridden from
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * BaseTestRunner.
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestSuiteLoader getLoader() {
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return new StandardTestSuiteLoader();
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testFailed(int status, Test test, Throwable t) {
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testStarted(String testName) {
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testEnded(String testName) {
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Creates the TestResult to be used for the test run.
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult createTestResult() {
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return new TestResult();
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult doRun(Test test) {
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return doRun(test, false);
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult doRun(Test suite, boolean wait) {
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestResult result= createTestResult();
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		result.addListener(fPrinter);
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long startTime= System.currentTimeMillis();
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		suite.run(result);
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long endTime= System.currentTimeMillis();
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long runTime= endTime-startTime;
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter.print(result, runTime);
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		pause(wait);
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return result;
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void pause(boolean wait) {
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (!wait) return;
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter.printWaitPrompt();
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.in.read();
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch(Exception e) {
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static void main(String args[]) {
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestRunner aTestRunner= new TestRunner();
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			TestResult r= aTestRunner.start(args);
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (!r.wasSuccessful())
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				System.exit(FAILURE_EXIT);
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.exit(SUCCESS_EXIT);
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch(Exception e) {
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.err.println(e.getMessage());
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.exit(EXCEPTION_EXIT);
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Starts a test run. Analyzes the command line arguments and runs the given
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * test suite.
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult start(String args[]) throws Exception {
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String testCase= "";
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String method= "";
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		boolean wait= false;
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 0; i < args.length; i++) {
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (args[i].equals("-wait"))
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				wait= true;
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else if (args[i].equals("-c"))
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= extractClassName(args[++i]);
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else if (args[i].equals("-m")) {
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				String arg= args[++i];
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				int lastIndex= arg.lastIndexOf('.');
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= arg.substring(0, lastIndex);
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				method= arg.substring(lastIndex + 1);
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} else if (args[i].equals("-v"))
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma");
17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else
17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= args[i];
17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (testCase.equals(""))
17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (!method.equals(""))
18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				return runSingleMethod(testCase, method, wait);
18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Test suite= getTest(testCase);
18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return doRun(suite, wait);
18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (Exception e) {
18758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw new Exception("Could not create and run test suite: " + e);
18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception {
19258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Class testClass= loadSuiteClass(testCase);
19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Test test= TestSuite.createTest(testClass, method);
19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return doRun(test, wait);
19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void runFailed(String message) {
19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		System.err.println(message);
19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		System.exit(FAILURE_EXIT);
20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void setPrinter(ResultPrinter printer) {
20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter= printer;
20458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
20558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}