1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.internal.runners.statements;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.ArrayList;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.util.List;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.FrameworkMethod;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.MultipleFailureException;
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement;
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class RunAfters extends Statement {
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Statement fNext;
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Object fTarget;
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final List<FrameworkMethod> fAfters;
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public RunAfters(Statement next, List<FrameworkMethod> afters, Object target) {
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fNext= next;
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fAfters= afters;
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fTarget= target;
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void evaluate() throws Throwable {
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		List<Throwable> errors = new ArrayList<Throwable>();
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		try {
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			fNext.evaluate();
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		} catch (Throwable e) {
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			errors.add(e);
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		} finally {
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			for (FrameworkMethod each : fAfters)
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				try {
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					each.invokeExplosively(fTarget);
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				} catch (Throwable e) {
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					errors.add(e);
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				}
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		}
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		MultipleFailureException.assertEmpty(errors);
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}