1
2
3
4 package org.junit.tests.experimental.rules;
5
6 import static org.junit.Assert.assertEquals;
7 import static org.junit.Assert.assertThat;
8 import static org.junit.Assert.assertTrue;
9 import static org.junit.experimental.results.PrintableResult.testResult;
10 import static org.junit.experimental.results.ResultMatchers.isSuccessful;
11
12 import java.util.LinkedList;
13 import java.util.List;
14
15 import org.junit.ClassRule;
16 import org.junit.Test;
17 import org.junit.rules.ExternalResource;
18 import org.junit.rules.TestRule;
19 import org.junit.runner.Description;
20 import org.junit.runner.JUnitCore;
21 import org.junit.runner.Result;
22 import org.junit.runners.model.Statement;
23
24
25
26
27 public class ClassRulesTest {
28 public static class Counter extends ExternalResource {
29 public int count = 0;
30
31 @Override
32 protected void before() throws Throwable {
33 count++;
34 }
35 }
36
37 public static class ExampleTestWithClassRule {
38 @ClassRule
39 public static Counter counter = new Counter();
40
41 @Test
42 public void firstTest() {
43 assertEquals(1, counter.count);
44 }
45
46 @Test
47 public void secondTest() {
48 assertEquals(1, counter.count);
49 }
50 }
51
52 @Test
53 public void ruleIsAppliedOnce() {
54 ExampleTestWithClassRule.counter.count = 0;
55 JUnitCore.runClasses(ExampleTestWithClassRule.class);
56 assertEquals(1, ExampleTestWithClassRule.counter.count);
57 }
58
59 public static class SubclassOfTestWithClassRule extends
60 ExampleTestWithClassRule {
61
62 }
63
64 @Test
65 public void ruleIsIntroducedAndEvaluatedOnSubclass() {
66 ExampleTestWithClassRule.counter.count = 0;
67 JUnitCore.runClasses(SubclassOfTestWithClassRule.class);
68 assertEquals(1, ExampleTestWithClassRule.counter.count);
69 }
70
71 public static class CustomCounter implements TestRule {
72 public int count = 0;
73
74 public Statement apply(final Statement base, Description description) {
75 return new Statement() {
76 @Override
77 public void evaluate() throws Throwable {
78 count++;
79 base.evaluate();
80 }
81 };
82 }
83 }
84
85 public static class ExampleTestWithCustomClassRule {
86 @ClassRule
87 public static CustomCounter counter = new CustomCounter();
88
89 @Test
90 public void firstTest() {
91 assertEquals(1, counter.count);
92 }
93
94 @Test
95 public void secondTest() {
96 assertEquals(1, counter.count);
97 }
98 }
99
100
101 @Test
102 public void customRuleIsAppliedOnce() {
103 ExampleTestWithCustomClassRule.counter.count = 0;
104 Result result = JUnitCore.runClasses(ExampleTestWithCustomClassRule.class);
105 assertTrue(result.wasSuccessful());
106 assertEquals(1, ExampleTestWithCustomClassRule.counter.count);
107 }
108
109 private static final List<String> orderList = new LinkedList<String>();
110
111 private static class OrderTestRule implements TestRule {
112 private String name;
113
114 public OrderTestRule(String name) {
115 this.name = name;
116 }
117
118 public Statement apply(final Statement base, final Description description) {
119 return new Statement() {
120 @Override
121 public void evaluate() throws Throwable {
122 orderList.add(name);
123 base.evaluate();
124 }
125 };
126 }
127 }
128
129 ;
130
131 public static class UsesFieldAndMethodRule {
132 @ClassRule
133 public static OrderTestRule orderMethod() {
134 return new OrderTestRule("orderMethod");
135 }
136
137 @ClassRule
138 public static OrderTestRule orderField = new OrderTestRule("orderField");
139
140 @Test
141 public void foo() {
142 assertEquals("orderField", orderList.get(0));
143 assertEquals("orderMethod", orderList.get(1));
144 }
145 }
146
147 @Test
148 public void usesFieldAndMethodRule() {
149 orderList.clear();
150 assertThat(testResult(UsesFieldAndMethodRule.class), isSuccessful());
151 }
152
153
154 public static class MethodExampleTestWithClassRule {
155 private static Counter counter = new Counter();
156
157 @ClassRule
158 public static Counter getCounter() {
159 return counter;
160 }
161
162 @Test
163 public void firstTest() {
164 assertEquals(1, counter.count);
165 }
166
167 @Test
168 public void secondTest() {
169 assertEquals(1, counter.count);
170 }
171 }
172
173 @Test
174 public void methodRuleIsAppliedOnce() {
175 MethodExampleTestWithClassRule.counter.count = 0;
176 JUnitCore.runClasses(MethodExampleTestWithClassRule.class);
177 assertEquals(1, MethodExampleTestWithClassRule.counter.count);
178 }
179
180 public static class MethodSubclassOfTestWithClassRule extends
181 MethodExampleTestWithClassRule {
182
183 }
184
185 @Test
186 public void methodRuleIsIntroducedAndEvaluatedOnSubclass() {
187 MethodExampleTestWithClassRule.counter.count = 0;
188 JUnitCore.runClasses(MethodSubclassOfTestWithClassRule.class);
189 assertEquals(1, MethodExampleTestWithClassRule.counter.count);
190 }
191
192 public static class MethodExampleTestWithCustomClassRule {
193 private static CustomCounter counter = new CustomCounter();
194
195 @ClassRule
196 public static CustomCounter getCounter() {
197 return counter;
198 }
199
200 @Test
201 public void firstTest() {
202 assertEquals(1, counter.count);
203 }
204
205 @Test
206 public void secondTest() {
207 assertEquals(1, counter.count);
208 }
209 }
210
211
212 @Test
213 public void methodCustomRuleIsAppliedOnce() {
214 MethodExampleTestWithCustomClassRule.counter.count = 0;
215 Result result = JUnitCore.runClasses(MethodExampleTestWithCustomClassRule.class);
216 assertTrue(result.wasSuccessful());
217 assertEquals(1, MethodExampleTestWithCustomClassRule.counter.count);
218 }
219
220 public static class CallMethodOnlyOnceRule {
221 static int countOfMethodCalls = 0;
222
223 private static class Dummy implements TestRule {
224 public Statement apply(final Statement base, Description description) {
225 return new Statement() {
226 @Override
227 public void evaluate() throws Throwable {
228 base.evaluate();
229 }
230
231 ;
232 };
233 }
234 }
235
236 @ClassRule
237 public static Dummy both() {
238 countOfMethodCalls++;
239 return new Dummy();
240 }
241
242 @Test
243 public void onlyOnce() {
244 assertEquals(1, countOfMethodCalls);
245 }
246 }
247
248 @Test
249 public void testCallMethodOnlyOnceRule() {
250 CallMethodOnlyOnceRule.countOfMethodCalls = 0;
251 assertTrue(JUnitCore.runClasses(CallMethodOnlyOnceRule.class).wasSuccessful());
252 }
253 }