1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.internal.runners;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.InvocationTargetException;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.Arrays;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Description;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Runner;
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.notification.Failure;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.notification.RunNotifier;
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.InitializationError;
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class ErrorReportingRunner extends Runner {
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final List<Throwable> fCauses;
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Class<?> fTestClass;
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public ErrorReportingRunner(Class<?> testClass, Throwable cause) {
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fTestClass= testClass;
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fCauses= getCauses(cause);
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Description getDescription() {
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		Description description= Description.createSuiteDescription(fTestClass);
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Throwable each : fCauses)
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			description.addChild(describeCause(each));
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return description;
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void run(RunNotifier notifier) {
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		for (Throwable each : fCauses)
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			runCause(each, notifier);
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@SuppressWarnings("deprecation")
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private List<Throwable> getCauses(Throwable cause) {
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (cause instanceof InvocationTargetException)
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			return getCauses(cause.getCause());
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (cause instanceof InitializationError)
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			return ((InitializationError) cause).getCauses();
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		if (cause instanceof org.junit.internal.runners.InitializationError)
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			return ((org.junit.internal.runners.InitializationError) cause)
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					.getCauses();
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Arrays.asList(cause);
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private Description describeCause(Throwable child) {
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Description.createTestDescription(fTestClass,
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				"initializationError");
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private void runCause(Throwable child, RunNotifier notifier) {
55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		Description description= describeCause(child);
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		notifier.fireTestStarted(description);
57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		notifier.fireTestFailure(new Failure(description, child));
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		notifier.fireTestFinished(description);
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}