View Javadoc
1   package org.junit.tests.running.classes;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertThat;
5   import static org.junit.Assert.assertTrue;
6   import static org.junit.experimental.results.PrintableResult.testResult;
7   import static org.junit.experimental.results.ResultMatchers.hasSingleFailureContaining;
8   
9   import java.util.List;
10  
11  import junit.framework.JUnit4TestAdapter;
12  import junit.framework.TestResult;
13  import org.junit.AfterClass;
14  import org.junit.Assert;
15  import org.junit.BeforeClass;
16  import org.junit.Test;
17  import org.junit.runner.JUnitCore;
18  import org.junit.runner.Request;
19  import org.junit.runner.Result;
20  import org.junit.runner.RunWith;
21  import org.junit.runner.Runner;
22  import org.junit.runners.Suite;
23  import org.junit.runners.Suite.SuiteClasses;
24  
25  public class SuiteTest {
26      public static class TestA {
27          @Test
28          public void pass() {
29          }
30      }
31  
32      public static class TestB {
33          @Test
34          public void fail() {
35              Assert.fail();
36          }
37      }
38  
39      @RunWith(Suite.class)
40      @SuiteClasses({TestA.class, TestB.class})
41      public static class All {
42      }
43  
44      public static class InheritsAll extends All {
45      }
46  
47      @Test
48      public void ensureTestIsRun() {
49          JUnitCore core = new JUnitCore();
50          Result result = core.run(All.class);
51          assertEquals(2, result.getRunCount());
52          assertEquals(1, result.getFailureCount());
53      }
54  
55      @Test
56      public void ensureInheritedTestIsRun() {
57          JUnitCore core = new JUnitCore();
58          Result result = core.run(InheritsAll.class);
59          assertEquals(2, result.getRunCount());
60          assertEquals(1, result.getFailureCount());
61      }
62  
63      @Test
64      public void suiteTestCountIsCorrect() throws Exception {
65          Runner runner = Request.aClass(All.class).getRunner();
66          assertEquals(2, runner.testCount());
67      }
68  
69      @Test
70      public void ensureSuitesWorkWithForwardCompatibility() {
71          junit.framework.Test test = new JUnit4TestAdapter(All.class);
72          TestResult result = new TestResult();
73          test.run(result);
74          assertEquals(2, result.runCount());
75      }
76  
77      @Test
78      public void forwardCompatibilityWorksWithGetTests() {
79          JUnit4TestAdapter adapter = new JUnit4TestAdapter(All.class);
80          List<? extends junit.framework.Test> tests = adapter.getTests();
81          assertEquals(2, tests.size());
82      }
83  
84      @Test
85      public void forwardCompatibilityWorksWithTestCount() {
86          JUnit4TestAdapter adapter = new JUnit4TestAdapter(All.class);
87          assertEquals(2, adapter.countTestCases());
88      }
89  
90  
91      private static String log = "";
92  
93      @RunWith(Suite.class)
94      @SuiteClasses({TestA.class, TestB.class})
95      public static class AllWithBeforeAndAfterClass {
96          @BeforeClass
97          public static void before() {
98              log += "before ";
99          }
100 
101         @AfterClass
102         public static void after() {
103             log += "after ";
104         }
105     }
106 
107     @Test
108     public void beforeAndAfterClassRunOnSuite() {
109         log = "";
110         JUnitCore.runClasses(AllWithBeforeAndAfterClass.class);
111         assertEquals("before after ", log);
112     }
113 
114     @RunWith(Suite.class)
115     public static class AllWithOutAnnotation {
116     }
117 
118     @Test
119     public void withoutSuiteClassAnnotationProducesFailure() {
120         Result result = JUnitCore.runClasses(AllWithOutAnnotation.class);
121         assertEquals(1, result.getFailureCount());
122         String expected = String.format(
123                 "class '%s' must have a SuiteClasses annotation",
124                 AllWithOutAnnotation.class.getName());
125         assertEquals(expected, result.getFailures().get(0).getMessage());
126     }
127 
128     @RunWith(Suite.class)
129     @SuiteClasses(InfiniteLoop.class)
130     static public class InfiniteLoop {
131     }
132 
133     @Test
134     public void whatHappensWhenASuiteHasACycle() {
135         Result result = JUnitCore.runClasses(InfiniteLoop.class);
136         assertEquals(1, result.getFailureCount());
137     }
138 
139     @RunWith(Suite.class)
140     @SuiteClasses({BiInfiniteLoop.class, BiInfiniteLoop.class})
141     static public class BiInfiniteLoop {
142     }
143 
144     @Test
145     public void whatHappensWhenASuiteHasAForkingCycle() {
146         Result result = JUnitCore.runClasses(BiInfiniteLoop.class);
147         assertEquals(2, result.getFailureCount());
148     }
149 
150     // The interesting case here is that Hydra indirectly contains two copies of
151     // itself (if it only contains one, Java's StackOverflowError eventually
152     // bails us out)
153 
154     @RunWith(Suite.class)
155     @SuiteClasses({Hercules.class})
156     static public class Hydra {
157     }
158 
159     @RunWith(Suite.class)
160     @SuiteClasses({Hydra.class, Hydra.class})
161     static public class Hercules {
162     }
163 
164     @Test
165     public void whatHappensWhenASuiteContainsItselfIndirectly() {
166         Result result = JUnitCore.runClasses(Hydra.class);
167         assertEquals(2, result.getFailureCount());
168     }
169 
170     @RunWith(Suite.class)
171     @SuiteClasses({})
172     public class WithoutDefaultConstructor {
173         public WithoutDefaultConstructor(int i) {
174 
175         }
176     }
177 
178     @Test
179     public void suiteShouldBeOKwithNonDefaultConstructor() throws Exception {
180         Result result = JUnitCore.runClasses(WithoutDefaultConstructor.class);
181         assertTrue(result.wasSuccessful());
182     }
183 
184     @RunWith(Suite.class)
185     public class NoSuiteClassesAnnotation {
186     }
187 
188     @Test
189     public void suiteShouldComplainAboutNoSuiteClassesAnnotation() {
190         assertThat(testResult(NoSuiteClassesAnnotation.class), hasSingleFailureContaining("SuiteClasses"));
191     }
192 }