158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.textui;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintStream;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport junit.framework.TestCase;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.Version;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A command line based tool to run tests.
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre>
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * java junit.textui.TestRunner [-wait] TestCaseClass
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre>
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p>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
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * the methods starting with "test" having no arguments are run.</p>
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p> When the wait command line argument is given TestRunner
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * waits until the users types RETURN.</p>
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p>TestRunner prints a trace as the tests are executed followed by a
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * summary at the end.</p>
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	 */
61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	static public void run(Class<? extends TestCase> 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) {
71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett 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
89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testFailed(int status, Test test, Throwable t) {
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
93b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testStarted(String testName) {
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
97b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void testEnded(String testName) {
9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Creates the TestResult to be used for the test run.
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult createTestResult() {
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return new TestResult();
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult doRun(Test test) {
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return doRun(test, false);
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult doRun(Test suite, boolean wait) {
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestResult result= createTestResult();
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		result.addListener(fPrinter);
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long startTime= System.currentTimeMillis();
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		suite.run(result);
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long endTime= System.currentTimeMillis();
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		long runTime= endTime-startTime;
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter.print(result, runTime);
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		pause(wait);
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return result;
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void pause(boolean wait) {
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (!wait) return;
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter.printWaitPrompt();
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.in.read();
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch(Exception e) {
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static void main(String args[]) {
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		TestRunner aTestRunner= new TestRunner();
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			TestResult r= aTestRunner.start(args);
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (!r.wasSuccessful())
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				System.exit(FAILURE_EXIT);
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.exit(SUCCESS_EXIT);
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch(Exception e) {
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.err.println(e.getMessage());
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			System.exit(EXCEPTION_EXIT);
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Starts a test run. Analyzes the command line arguments and runs the given
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * test suite.
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public TestResult start(String args[]) throws Exception {
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String testCase= "";
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String method= "";
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		boolean wait= false;
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 0; i < args.length; i++) {
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (args[i].equals("-wait"))
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				wait= true;
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else if (args[i].equals("-c"))
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= extractClassName(args[++i]);
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else if (args[i].equals("-m")) {
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				String arg= args[++i];
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				int lastIndex= arg.lastIndexOf('.');
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= arg.substring(0, lastIndex);
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				method= arg.substring(lastIndex + 1);
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} else if (args[i].equals("-v"))
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma");
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			else
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				testCase= args[i];
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (testCase.equals(""))
17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (!method.equals(""))
17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				return runSingleMethod(testCase, method, wait);
17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			Test suite= getTest(testCase);
18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return doRun(suite, wait);
18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (Exception e) {
18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			throw new Exception("Could not create and run test suite: " + e);
18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception {
187b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		Class<? extends TestCase> testClass= loadSuiteClass(testCase).asSubclass(TestCase.class);
18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Test test= TestSuite.createTest(testClass, method);
18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return doRun(test, wait);
19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
192b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void runFailed(String message) {
19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		System.err.println(message);
19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		System.exit(FAILURE_EXIT);
19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void setPrinter(ResultPrinter printer) {
19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPrinter= printer;
20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}