diff -r 000000000000 -r 82d1d1de1a01 carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/requests/ClassRequest.java --- /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 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 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