carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/runner/Request.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 org.junit.runner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     2
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     3
import java.util.Comparator;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     4
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     5
import org.junit.internal.requests.ClassRequest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     6
import org.junit.internal.requests.ClassesRequest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     7
import org.junit.internal.requests.ErrorReportingRequest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     8
import org.junit.internal.requests.FilterRequest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     9
import org.junit.internal.requests.SortingRequest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    10
import org.junit.runner.manipulation.Filter;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    11
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    12
/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    13
 * <p>A <code>Request</code> is an abstract description of tests to be run. Older versions of 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    14
 * JUnit did not need such a concept--tests to be run were described either by classes containing
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    15
 * tests or a tree of {@link  org.junit.Test}s. However, we want to support filtering and sorting,
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    16
 * so we need a more abstract specification than the tests themselves and a richer
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    17
 * specification than just the classes.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    18
 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    19
 * <p>The flow when JUnit runs tests is that a <code>Request</code> specifies some tests to be run ->
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    20
 * a {@link org.junit.runner.Runner} is created for each class implied by the <code>Request</code> -> 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    21
 * the {@link org.junit.runner.Runner} returns a detailed {@link org.junit.runner.Description} 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    22
 * which is a tree structure of the tests to be run.</p>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    23
 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    24
public abstract class Request {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    25
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    26
	 * Create a <code>Request</code> that, when processed, will run a single test.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    27
	 * This is done by filtering out all other tests. This method is used to support rerunning
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    28
	 * single tests.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    29
	 * @param clazz the class of the test
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    30
	 * @param methodName the name of the test
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    31
	 * @return a <code>Request</code> that will cause a single test be run
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    32
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    33
	public static Request method(Class<?> clazz, String methodName) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    34
		Description method= Description.createTestDescription(clazz, methodName);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    35
		return Request.aClass(clazz).filterWith(method);
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
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    39
	 * Create a <code>Request</code> that, when processed, will run all the tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    40
	 * in a class. The odd name is necessary because <code>class</code> is a reserved word.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    41
	 * @param clazz the class containing the tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    42
	 * @return a <code>Request</code> that will cause all tests in the class to be run
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    43
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    44
	public static Request aClass(Class<?> clazz) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    45
		return new ClassRequest(clazz);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    46
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    47
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    48
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    49
	 * Create a <code>Request</code> that, when processed, will run all the tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    50
	 * in a set of classes.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    51
	 * @param collectionName a name to identify this suite of tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    52
	 * @param classes the classes containing the tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    53
	 * @return a <code>Request</code> that will cause all tests in the classes to be run
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    54
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    55
	public static Request classes(String collectionName, Class<?>... classes) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    56
		return new ClassesRequest(collectionName, classes);
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
	public static Request errorReport(Class<?> klass, Throwable cause) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    60
		return new ErrorReportingRequest(klass, cause);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    61
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    62
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    63
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    64
	 * Returns a {@link Runner} for this Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    65
	 * @return corresponding {@link Runner} for this Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    66
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    67
	public abstract Runner getRunner();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    68
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    69
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    70
	 * Returns a Request that only contains those tests that should run when
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    71
	 * <code>filter</code> is applied
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    72
	 * @param filter The {@link Filter} to apply to this Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    73
	 * @return the filtered Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    74
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    75
	public Request filterWith(Filter filter) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    76
		return new FilterRequest(this, filter);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    77
	}
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
	 * Returns a Request that only runs contains tests whose {@link Description}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    81
	 * equals <code>desiredDescription</code>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    82
	 * @param desiredDescription {@link Description} of those tests that should be run
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    83
	 * @return the filtered Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    84
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    85
	public Request filterWith(final Description desiredDescription) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    86
		return filterWith(new Filter() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    87
			@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    88
			public boolean shouldRun(Description description) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    89
				// TODO: test for equality even if we have children?
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    90
				if (description.isTest())
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    91
					return desiredDescription.equals(description);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    92
				for (Description each : description.getChildren())
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    93
					if (shouldRun(each))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    94
						return true;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    95
				return false;					
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    96
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    97
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    98
			@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    99
			public String describe() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   100
				return String.format("Method %s", desiredDescription.getDisplayName());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   101
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   102
		});
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   103
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   104
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   105
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   106
	 * Returns a Request whose Tests can be run in a certain order, defined by 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   107
	 * <code>comparator</code>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   108
	 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   109
	 * For example, here is code to run a test suite in alphabetical order:
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   110
	 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   111
	 * <pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   112
	private static Comparator<Description> forward() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   113
		return new Comparator<Description>() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   114
			public int compare(Description o1, Description o2) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   115
				return o1.getDisplayName().compareTo(o2.getDisplayName());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   116
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   117
		};
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   118
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   119
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   120
	public static main() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   121
		new JUnitCore().run(Request.aClass(AllTests.class).sortWith(forward()));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   122
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   123
	 * </pre>
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   124
	 * 
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   125
	 * @param comparator definition of the order of the tests in this Request
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   126
	 * @return a Request with ordered Tests
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   127
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   128
	public Request sortWith(Comparator<Description> comparator) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   129
		return new SortingRequest(this, comparator);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   130
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   131
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   132
	public static Request classWithoutSuiteMethod(Class<?> newTestClass) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   133
		return new ClassRequest(newTestClass, false);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   134
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   135
}