1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.rules;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.internal.AssumptionViolatedException;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.FrameworkMethod;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * TestWatchman is a base class for Rules that take note of the testing
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * action, without modifying it. For example, this class will keep a log of each
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * passing and failing test:
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <pre>
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public static class WatchmanTest {
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	private static String watchedLog;
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Rule
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public MethodRule watchman= new TestWatchman() {
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		public void failed(Throwable e, FrameworkMethod method) {
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			watchedLog+= method.getName() + &quot; &quot; + e.getClass().getSimpleName()
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 					+ &quot;\n&quot;;
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		public void succeeded(FrameworkMethod method) {
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			watchedLog+= method.getName() + &quot; &quot; + &quot;success!\n&quot;;
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	};
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void fails() {
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		fail();
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void succeeds() {
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * </pre>
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @deprecated {@link MethodRule} is deprecated.
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *             Use {@link TestWatcher} implements {@link TestRule} instead.
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot@Deprecated
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class TestWatchman implements MethodRule {
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Statement apply(final Statement base, final FrameworkMethod method,
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			Object target) {
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return new Statement() {
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			@Override
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			public void evaluate() throws Throwable {
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				starting(method);
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				try {
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					base.evaluate();
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					succeeded(method);
55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				} catch (AssumptionViolatedException e) {
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					throw e;
57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				} catch (Throwable t) {
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					failed(t, method);
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					throw t;
60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				} finally {
61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					finished(method);
62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				}
63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			}
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		};
65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Invoked when a test method succeeds
69b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 *
70b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param method
71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
72b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void succeeded(FrameworkMethod method) {
73b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
74b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
75b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
76b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Invoked when a test method fails
77b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 *
78b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param e
79b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param method
80b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
81b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void failed(Throwable e, FrameworkMethod method) {
82b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
83b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
84b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
85b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Invoked when a test method is about to start
86b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 *
87b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param method
88b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void starting(FrameworkMethod method) {
90b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
91b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
92b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
93b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
94b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Invoked when a test method finishes (whether passing or failing)
95b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 *
96b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param method
97b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
98b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public void finished(FrameworkMethod method) {
99b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
100b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}
101