1 package org.junit.tests.experimental.max;
2
3 import static org.hamcrest.CoreMatchers.containsString;
4 import static org.hamcrest.CoreMatchers.is;
5 import static org.junit.Assert.assertEquals;
6 import static org.junit.Assert.assertThat;
7 import static org.junit.Assert.assertTrue;
8 import static org.junit.Assert.fail;
9
10 import java.io.File;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import junit.framework.TestCase;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.junit.experimental.max.MaxCore;
19 import org.junit.internal.runners.JUnit38ClassRunner;
20 import org.junit.runner.Computer;
21 import org.junit.runner.Description;
22 import org.junit.runner.JUnitCore;
23 import org.junit.runner.Request;
24 import org.junit.runner.Result;
25 import org.junit.runner.Runner;
26 import org.junit.runner.manipulation.Filter;
27 import org.junit.runner.notification.Failure;
28 import org.junit.runner.notification.RunListener;
29 import org.junit.tests.AllTests;
30
31 public class MaxStarterTest {
32 private MaxCore fMax;
33
34 private File fMaxFile;
35
36 @Before
37 public void createMax() {
38 fMaxFile = new File("MaxCore.ser");
39 if (fMaxFile.exists()) {
40 fMaxFile.delete();
41 }
42 fMax = MaxCore.storedLocally(fMaxFile);
43 }
44
45 @After
46 public void forgetMax() {
47 fMaxFile.delete();
48 }
49
50 public static class TwoTests {
51 @Test
52 public void succeed() {
53 }
54
55 @Test
56 public void dontSucceed() {
57 fail();
58 }
59 }
60
61 @Test
62 public void twoTestsNotRunComeBackInRandomOrder() {
63 Request request = Request.aClass(TwoTests.class);
64 List<Description> things = fMax.sortedLeavesForTest(request);
65 Description succeed = Description.createTestDescription(TwoTests.class,
66 "succeed");
67 Description dontSucceed = Description.createTestDescription(
68 TwoTests.class, "dontSucceed");
69 assertTrue(things.contains(succeed));
70 assertTrue(things.contains(dontSucceed));
71 assertEquals(2, things.size());
72 }
73
74 @Test
75 public void preferNewTests() {
76 Request one = Request.method(TwoTests.class, "succeed");
77 fMax.run(one);
78 Request two = Request.aClass(TwoTests.class);
79 List<Description> things = fMax.sortedLeavesForTest(two);
80 Description dontSucceed = Description.createTestDescription(
81 TwoTests.class, "dontSucceed");
82 assertEquals(dontSucceed, things.get(0));
83 assertEquals(2, things.size());
84 }
85
86
87
88
89
90
91 @Test
92 public void preferNewTestsOverTestsThatFailed() {
93 Request one = Request.method(TwoTests.class, "dontSucceed");
94 fMax.run(one);
95 Request two = Request.aClass(TwoTests.class);
96 List<Description> things = fMax.sortedLeavesForTest(two);
97 Description succeed = Description.createTestDescription(TwoTests.class,
98 "succeed");
99 assertEquals(succeed, things.get(0));
100 assertEquals(2, things.size());
101 }
102
103 @Test
104 public void preferRecentlyFailed() {
105 Request request = Request.aClass(TwoTests.class);
106 fMax.run(request);
107 List<Description> tests = fMax.sortedLeavesForTest(request);
108 Description dontSucceed = Description.createTestDescription(
109 TwoTests.class, "dontSucceed");
110 assertEquals(dontSucceed, tests.get(0));
111 }
112
113 @Test
114 public void sortTestsInMultipleClasses() {
115 Request request = Request.classes(Computer.serial(), TwoTests.class,
116 TwoTests.class);
117 fMax.run(request);
118 List<Description> tests = fMax.sortedLeavesForTest(request);
119 Description dontSucceed = Description.createTestDescription(
120 TwoTests.class, "dontSucceed");
121 assertEquals(dontSucceed, tests.get(0));
122 assertEquals(dontSucceed, tests.get(1));
123 }
124
125 public static class TwoUnEqualTests {
126 @Test
127 public void slow() throws InterruptedException {
128 Thread.sleep(100);
129 fail();
130 }
131
132 @Test
133 public void fast() {
134 fail();
135 }
136
137 }
138
139 @Test
140 public void rememberOldRuns() {
141 fMax.run(TwoUnEqualTests.class);
142
143 MaxCore reincarnation = MaxCore.storedLocally(fMaxFile);
144 List<Failure> failures = reincarnation.run(TwoUnEqualTests.class)
145 .getFailures();
146 assertEquals("fast", failures.get(0).getDescription().getMethodName());
147 assertEquals("slow", failures.get(1).getDescription().getMethodName());
148 }
149
150 @Test
151 public void preferFast() {
152 Request request = Request.aClass(TwoUnEqualTests.class);
153 fMax.run(request);
154 Description thing = fMax.sortedLeavesForTest(request).get(1);
155 assertEquals(Description.createTestDescription(TwoUnEqualTests.class,
156 "slow"), thing);
157 }
158
159 @Test
160 public void listenersAreCalledCorrectlyInTheFaceOfFailures()
161 throws Exception {
162 JUnitCore core = new JUnitCore();
163 final List<Failure> failures = new ArrayList<Failure>();
164 core.addListener(new RunListener() {
165 @Override
166 public void testRunFinished(Result result) throws Exception {
167 failures.addAll(result.getFailures());
168 }
169 });
170 fMax.run(Request.aClass(TwoTests.class), core);
171 assertEquals(1, failures.size());
172 }
173
174 @Test
175 public void testsAreOnlyIncludedOnceWhenExpandingForSorting()
176 throws Exception {
177 Result result = fMax.run(Request.aClass(TwoTests.class));
178 assertEquals(2, result.getRunCount());
179 }
180
181 public static class TwoOldTests extends TestCase {
182 public void testOne() {
183 }
184
185 public void testTwo() {
186 }
187 }
188
189 @Test
190 public void junit3TestsAreRunOnce() throws Exception {
191 Result result = fMax.run(Request.aClass(TwoOldTests.class),
192 new JUnitCore());
193 assertEquals(2, result.getRunCount());
194 }
195
196 @Test
197 public void filterSingleMethodFromOldTestClass() throws Exception {
198 final Description method = Description.createTestDescription(
199 TwoOldTests.class, "testOne");
200 Filter filter = Filter.matchMethodDescription(method);
201 JUnit38ClassRunner child = new JUnit38ClassRunner(TwoOldTests.class);
202 child.filter(filter);
203 assertEquals(1, child.testCount());
204 }
205
206 @Test
207 public void testCountsStandUpToFiltration() {
208 assertFilterLeavesTestUnscathed(AllTests.class);
209 }
210
211 private void assertFilterLeavesTestUnscathed(Class<?> testClass) {
212 Request oneClass = Request.aClass(testClass);
213 Request filtered = oneClass.filterWith(new Filter() {
214 @Override
215 public boolean shouldRun(Description description) {
216 return true;
217 }
218
219 @Override
220 public String describe() {
221 return "Everything";
222 }
223 });
224
225 int filterCount = filtered.getRunner().testCount();
226 int coreCount = oneClass.getRunner().testCount();
227 assertEquals("Counts match up in " + testClass, coreCount, filterCount);
228 }
229
230 private static class MalformedJUnit38Test {
231 private MalformedJUnit38Test() {
232 }
233
234 @SuppressWarnings("unused")
235 public void testSucceeds() {
236 }
237 }
238
239 @Test
240 public void maxShouldSkipMalformedJUnit38Classes() {
241 Request request = Request.aClass(MalformedJUnit38Test.class);
242 fMax.run(request);
243 }
244
245 public static class MalformedJUnit38TestMethod extends TestCase {
246 @SuppressWarnings("unused")
247 private void testNothing() {
248 }
249 }
250
251 String fMessage = null;
252
253 @Test
254 public void correctErrorFromMalformedTest() {
255 Request request = Request.aClass(MalformedJUnit38TestMethod.class);
256 JUnitCore core = new JUnitCore();
257 Request sorted = fMax.sortRequest(request);
258 Runner runner = sorted.getRunner();
259 Result result = core.run(runner);
260 Failure failure = result.getFailures().get(0);
261 assertThat(failure.toString(), containsString("MalformedJUnit38TestMethod"));
262 assertThat(failure.toString(), containsString("testNothing"));
263 assertThat(failure.toString(), containsString("isn't public"));
264 }
265
266 public static class HalfMalformedJUnit38TestMethod extends TestCase {
267 public void testSomething() {
268 }
269
270 @SuppressWarnings("unused")
271 private void testNothing() {
272 }
273 }
274
275 @Test
276 public void halfMalformed() {
277 assertThat(JUnitCore.runClasses(HalfMalformedJUnit38TestMethod.class)
278 .getFailureCount(), is(1));
279 }
280
281
282 @Test
283 public void correctErrorFromHalfMalformedTest() {
284 Request request = Request.aClass(HalfMalformedJUnit38TestMethod.class);
285 JUnitCore core = new JUnitCore();
286 Request sorted = fMax.sortRequest(request);
287 Runner runner = sorted.getRunner();
288 Result result = core.run(runner);
289 Failure failure = result.getFailures().get(0);
290 assertThat(failure.toString(), containsString("MalformedJUnit38TestMethod"));
291 assertThat(failure.toString(), containsString("testNothing"));
292 assertThat(failure.toString(), containsString("isn't public"));
293 }
294 }