Home | History | Annotate | Download | only in builders
      1 /**
      2  *
      3  */
      4 package org.junit.internal.builders;
      5 
      6 import org.junit.runner.RunWith;
      7 import org.junit.runner.Runner;
      8 import org.junit.runners.model.InitializationError;
      9 import org.junit.runners.model.RunnerBuilder;
     10 
     11 public class AnnotatedBuilder extends RunnerBuilder {
     12 	private static final String CONSTRUCTOR_ERROR_FORMAT= "Custom runner class %s should have a public constructor with signature %s(Class testClass)";
     13 
     14 	private RunnerBuilder fSuiteBuilder;
     15 
     16 	public AnnotatedBuilder(RunnerBuilder suiteBuilder) {
     17 		fSuiteBuilder= suiteBuilder;
     18 	}
     19 
     20 	@Override
     21 	public Runner runnerForClass(Class<?> testClass) throws Exception {
     22 		RunWith annotation= testClass.getAnnotation(RunWith.class);
     23 		if (annotation != null)
     24 			return buildRunner(annotation.value(), testClass);
     25 		return null;
     26 	}
     27 
     28 	public Runner buildRunner(Class<? extends Runner> runnerClass,
     29 			Class<?> testClass) throws Exception {
     30 		try {
     31 			return runnerClass.getConstructor(Class.class).newInstance(
     32 					new Object[] { testClass });
     33 		} catch (NoSuchMethodException e) {
     34 			try {
     35 				return runnerClass.getConstructor(Class.class,
     36 						RunnerBuilder.class).newInstance(
     37 						new Object[] { testClass, fSuiteBuilder });
     38 			} catch (NoSuchMethodException e2) {
     39 				String simpleName= runnerClass.getSimpleName();
     40 				throw new InitializationError(String.format(
     41 						CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
     42 			}
     43 		}
     44 	}
     45 }