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