carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/junit/textui/TestRunner.java
author cawthron
Wed, 18 Mar 2009 17:21:00 -0500
changeset 1 82d1d1de1a01
permissions -rw-r--r--
import Carbide.c++
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     1
package junit.textui;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     2
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     3
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     4
import java.io.PrintStream;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     5
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     6
import junit.framework.Test;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     7
import junit.framework.TestCase;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     8
import junit.framework.TestResult;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     9
import junit.framework.TestSuite;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    10
import junit.runner.BaseTestRunner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    11
import junit.runner.Version;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    12
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    13
/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    14
 * A command line based tool to run tests.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    15
 * <pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    16
 * java junit.textui.TestRunner [-wait] TestCaseClass
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    17
 * </pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    18
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    19
 * <p>TestRunner expects the name of a TestCase class as argument.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    20
 * If this class defines a static <code>suite</code> method it 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    21
 * will be invoked and the returned test is run. Otherwise all 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    22
 * the methods starting with "test" having no arguments are run.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    23
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    24
 * <p> When the wait command line argument is given TestRunner
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    25
 * waits until the users types RETURN.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    26
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    27
 * <p>TestRunner prints a trace as the tests are executed followed by a
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    28
 * summary at the end.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    29
 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    30
public class TestRunner extends BaseTestRunner {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    31
	private ResultPrinter fPrinter;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    32
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    33
	public static final int SUCCESS_EXIT= 0;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    34
	public static final int FAILURE_EXIT= 1;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    35
	public static final int EXCEPTION_EXIT= 2;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    36
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    37
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    38
	 * Constructs a TestRunner.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    39
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    40
	public TestRunner() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    41
		this(System.out);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    42
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    43
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    44
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    45
	 * Constructs a TestRunner using the given stream for all the output
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    46
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    47
	public TestRunner(PrintStream writer) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    48
		this(new ResultPrinter(writer));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    49
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    50
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    51
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    52
	 * Constructs a TestRunner using the given ResultPrinter all the output
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    53
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    54
	public TestRunner(ResultPrinter printer) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    55
		fPrinter= printer;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    56
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    57
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    58
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    59
	 * Runs a suite extracted from a TestCase subclass.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    60
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    61
	static public void run(Class<? extends TestCase> testClass) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    62
		run(new TestSuite(testClass));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    63
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    64
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    65
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    66
	 * Runs a single test and collects its results.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    67
	 * This method can be used to start a test run
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    68
	 * from your program.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    69
	 * <pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    70
	 * public static void main (String[] args) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    71
	 *    test.textui.TestRunner.run(suite());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    72
	 * }
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    73
	 * </pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    74
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    75
	static public TestResult run(Test test) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    76
		TestRunner runner= new TestRunner();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    77
		return runner.doRun(test);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    78
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    79
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    80
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    81
	 * Runs a single test and waits until the user
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    82
	 * types RETURN.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    83
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    84
	static public void runAndWait(Test suite) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    85
		TestRunner aTestRunner= new TestRunner();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    86
		aTestRunner.doRun(suite, true);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    87
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    88
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    89
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    90
	public void testFailed(int status, Test test, Throwable t) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    91
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    92
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    93
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    94
	public void testStarted(String testName) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    95
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    96
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    97
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    98
	public void testEnded(String testName) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    99
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   100
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   101
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   102
	 * Creates the TestResult to be used for the test run.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   103
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   104
	protected TestResult createTestResult() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   105
		return new TestResult();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   106
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   107
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   108
	public TestResult doRun(Test test) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   109
		return doRun(test, false);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   110
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   111
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   112
	public TestResult doRun(Test suite, boolean wait) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   113
		TestResult result= createTestResult();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   114
		result.addListener(fPrinter);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   115
		long startTime= System.currentTimeMillis();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   116
		suite.run(result);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   117
		long endTime= System.currentTimeMillis();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   118
		long runTime= endTime-startTime;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   119
		fPrinter.print(result, runTime);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   120
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   121
		pause(wait);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   122
		return result;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   123
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   124
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   125
	protected void pause(boolean wait) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   126
		if (!wait) return;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   127
		fPrinter.printWaitPrompt();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   128
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   129
			System.in.read();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   130
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   131
		catch(Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   132
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   133
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   134
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   135
	public static void main(String args[]) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   136
		TestRunner aTestRunner= new TestRunner();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   137
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   138
			TestResult r= aTestRunner.start(args);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   139
			if (!r.wasSuccessful()) 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   140
				System.exit(FAILURE_EXIT);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   141
			System.exit(SUCCESS_EXIT);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   142
		} catch(Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   143
			System.err.println(e.getMessage());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   144
			System.exit(EXCEPTION_EXIT);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   145
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   146
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   147
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   148
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   149
	 * Starts a test run. Analyzes the command line arguments and runs the given
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   150
	 * test suite.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   151
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   152
	public TestResult start(String args[]) throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   153
		String testCase= "";
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   154
		String method= "";
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   155
		boolean wait= false;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   156
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   157
		for (int i= 0; i < args.length; i++) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   158
			if (args[i].equals("-wait"))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   159
				wait= true;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   160
			else if (args[i].equals("-c"))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   161
				testCase= extractClassName(args[++i]);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   162
			else if (args[i].equals("-m")) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   163
				String arg= args[++i];
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   164
				int lastIndex= arg.lastIndexOf('.');
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   165
				testCase= arg.substring(0, lastIndex);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   166
				method= arg.substring(lastIndex + 1);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   167
			} else if (args[i].equals("-v"))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   168
				System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   169
			else
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   170
				testCase= args[i];
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   171
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   172
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   173
		if (testCase.equals(""))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   174
			throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   175
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   176
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   177
			if (!method.equals("")) 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   178
				return runSingleMethod(testCase, method, wait);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   179
			Test suite= getTest(testCase);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   180
			return doRun(suite, wait);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   181
		} catch (Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   182
			throw new Exception("Could not create and run test suite: " + e);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   183
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   184
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   185
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   186
	protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   187
		Class<? extends TestCase> testClass= loadSuiteClass(testCase);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   188
		Test test= TestSuite.createTest(testClass, method);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   189
		return doRun(test, wait);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   190
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   191
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   192
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   193
	protected void runFailed(String message) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   194
		System.err.println(message);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   195
		System.exit(FAILURE_EXIT);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   196
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   197
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   198
	public void setPrinter(ResultPrinter printer) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   199
		fPrinter= printer;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   200
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   201
		
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   202
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   203
}