carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/requests/ClassRequest.java
changeset 1 82d1d1de1a01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/requests/ClassRequest.java	Wed Mar 18 17:21:00 2009 -0500
@@ -0,0 +1,72 @@
+package org.junit.internal.requests;
+
+import org.junit.Ignore;
+import org.junit.internal.runners.InitializationError;
+import org.junit.internal.runners.OldTestClassRunner;
+import org.junit.internal.runners.TestClassRunner;
+import org.junit.runner.Request;
+import org.junit.runner.RunWith;
+import org.junit.runner.Runner;
+import org.junit.runners.AllTests;
+
+public class ClassRequest extends Request {
+	private static final String CONSTRUCTOR_ERROR_FORMAT= "Custom runner class %s should have a public constructor with signature %s(Class testClass)";
+	private final Class<?> fTestClass;
+	private boolean fCanUseSuiteMethod;
+
+	public ClassRequest(Class<?> testClass, boolean canUseSuiteMethod) {
+		fTestClass= testClass;
+		fCanUseSuiteMethod= canUseSuiteMethod;
+	}
+
+	public ClassRequest(Class<?> testClass) {
+		this(testClass, true);
+	}
+	
+	@Override
+	public Runner getRunner() {
+		return buildRunner(getRunnerClass(fTestClass)); 
+	}
+
+	public Runner buildRunner(Class<? extends Runner> runnerClass) {
+		try {
+			return runnerClass.getConstructor(Class.class).newInstance(new Object[] { fTestClass });
+		} catch (NoSuchMethodException e) {
+			String simpleName= runnerClass.getSimpleName();
+			InitializationError error= new InitializationError(String.format(
+					CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
+			return Request.errorReport(fTestClass, error).getRunner();
+		} catch (Exception e) {
+			return Request.errorReport(fTestClass, e).getRunner();
+		}
+	}
+
+	Class<? extends Runner> getRunnerClass(final Class<?> testClass) {
+		if (testClass.getAnnotation(Ignore.class) != null)
+			return new IgnoredClassRunner(testClass).getClass();
+		RunWith annotation= testClass.getAnnotation(RunWith.class);
+		if (annotation != null) {
+			return annotation.value();
+		} else if (hasSuiteMethod() && fCanUseSuiteMethod) {
+			return AllTests.class;
+		} else if (isPre4Test(testClass)) {
+			return OldTestClassRunner.class; 
+		} else {
+			return TestClassRunner.class;
+		}
+	}
+	
+	public boolean hasSuiteMethod() {
+		// TODO: check all attributes
+		try {
+			fTestClass.getMethod("suite");
+		} catch (NoSuchMethodException e) {
+			return false;
+		}
+		return true;
+	}
+
+	boolean isPre4Test(Class<?> testClass) {
+		return junit.framework.TestCase.class.isAssignableFrom(testClass);
+	}
+}
\ No newline at end of file