View Javadoc
1   package org.junit.runner;
2   
3   import java.util.HashSet;
4   import java.util.Set;
5   
6   import org.junit.Before;
7   import org.junit.Test;
8   import org.junit.experimental.categories.Category;
9   import org.junit.experimental.categories.ExcludeCategories;
10  import org.junit.experimental.categories.IncludeCategories;
11  import org.junit.runner.notification.RunListener;
12  import org.junit.tests.TestSystem;
13  
14  import static org.hamcrest.CoreMatchers.is;
15  import static org.hamcrest.MatcherAssert.assertThat;
16  import static org.junit.Assert.assertFalse;
17  import static org.junit.Assert.assertTrue;
18  
19  public class FilterOptionIntegrationTest {
20      private static final String INCLUDES_DUMMY_CATEGORY_0 = "--filter=" +
21              IncludeCategories.class.getName() + "=" + DummyCategory0.class.getName();
22      private static final String EXCLUDES_DUMMY_CATEGORY_1 = "--filter=" +
23              ExcludeCategories.class.getName() + "=" + DummyCategory1.class.getName();
24  
25      private JUnitCore jUnitCore = new JUnitCore();
26      private TestListener testListener = new TestListener();
27  
28      @Before
29      public void setUp() {
30          jUnitCore.addListener(testListener);
31      }
32  
33      @Test
34      public void shouldRunAllTests() {
35          Result result = runJUnit(
36                  DummyTestClass.class.getName(),
37                  DummyTestClass0.class.getName(),
38                  DummyTestClass1.class.getName(),
39                  DummyTestClass01.class.getName(),
40                  DummyTestClass0TestMethod1.class.getName());
41  
42          assertWasRun(DummyTestClass.class);
43          assertWasRun(DummyTestClass0.class);
44          assertWasRun(DummyTestClass1.class);
45          assertWasRun(DummyTestClass01.class);
46          assertWasRun(DummyTestClass0TestMethod1.class);
47          assertThat("runCount does not match", result.getRunCount(), is(5));
48          assertThat("failureCount does not match", result.getFailureCount(), is(0));
49      }
50  
51      @Test
52      public void shouldExcludeSomeTests() {
53          Result result = runJUnit(
54                  EXCLUDES_DUMMY_CATEGORY_1,
55                  DummyTestClass.class.getName(),
56                  DummyTestClass0.class.getName(),
57                  DummyTestClass1.class.getName(),
58                  DummyTestClass01.class.getName(),
59                  DummyTestClass0TestMethod1.class.getName());
60  
61          assertWasRun(DummyTestClass.class);
62          assertWasRun(DummyTestClass0.class);
63          assertWasNotRun(DummyTestClass1.class);
64          assertWasNotRun(DummyTestClass01.class);
65          assertWasNotRun(DummyTestClass0TestMethod1.class);
66          assertThat("runCount does not match", result.getRunCount(), is(2));
67          assertThat("failureCount does not match", result.getFailureCount(), is(0));
68      }
69  
70      @Test
71      public void shouldIncludeSomeTests() {
72          Result result = runJUnit(
73                  INCLUDES_DUMMY_CATEGORY_0,
74                  DummyTestClass.class.getName(),
75                  DummyTestClass0.class.getName(),
76                  DummyTestClass1.class.getName(),
77                  DummyTestClass01.class.getName(),
78                  DummyTestClass0TestMethod1.class.getName());
79  
80          assertWasNotRun(DummyTestClass.class);
81          assertWasRun(DummyTestClass0.class);
82          assertWasNotRun(DummyTestClass1.class);
83          assertWasRun(DummyTestClass01.class);
84          assertWasRun(DummyTestClass0TestMethod1.class);
85          assertThat("runCount does not match", result.getRunCount(), is(3));
86          assertThat("failureCount does not match", result.getFailureCount(), is(0));
87      }
88  
89      @Test
90      public void shouldCombineFilters() {
91          Result result = runJUnit(
92                  INCLUDES_DUMMY_CATEGORY_0,
93                  EXCLUDES_DUMMY_CATEGORY_1,
94                  DummyTestClass.class.getName(),
95                  DummyTestClass0.class.getName(),
96                  DummyTestClass1.class.getName(),
97                  DummyTestClass01.class.getName(),
98                  DummyTestClass0TestMethod1.class.getName());
99  
100         assertWasNotRun(DummyTestClass.class);
101         assertWasRun(DummyTestClass0.class);
102         assertWasNotRun(DummyTestClass1.class);
103         assertWasNotRun(DummyTestClass01.class);
104         assertWasNotRun(DummyTestClass0TestMethod1.class);
105         assertThat("runCount does not match", result.getRunCount(), is(1));
106         assertThat("failureCount does not match", result.getFailureCount(), is(0));
107     }
108 
109     private Result runJUnit(final String... args) {
110         return jUnitCore.runMain(new TestSystem(), args);
111     }
112 
113     private void assertWasRun(Class<?> testClass) {
114         assertTrue(testClass.getName() + " expected to finish but did not", testListener.wasRun(testClass));
115     }
116 
117     private void assertWasNotRun(Class<?> testClass) {
118         assertFalse(
119                 testClass.getName() + " expected not to have been started but was",
120                 testListener.wasRun(testClass));
121     }
122 
123     private static class TestListener extends RunListener {
124         private Set<String> startedTests = new HashSet<String>();
125         private Set<String> finishedTests = new HashSet<String>();
126 
127         @Override
128         public void testFinished(final Description description) {
129             finishedTests.add(description.getClassName());
130         }
131 
132         private boolean testFinished(final Class<?> testClass) {
133             return finishedTests.contains(testClass.getName());
134         }
135 
136         @Override
137         public void testStarted(final Description description) {
138             startedTests.add(description.getClassName());
139         }
140 
141         private boolean testStarted(final Class<?> testClass) {
142             return startedTests.contains(testClass.getName());
143         }
144 
145         public boolean wasRun(final Class<?> testClass) {
146             return testStarted(testClass) && testFinished(testClass);
147         }
148     }
149 
150     public static class DummyTestClass {
151         @Test
152         public void dummyTest() {
153         }
154     }
155 
156     @Category(DummyCategory0.class)
157     public static class DummyTestClass0 {
158         @Test
159         public void dummyTest() {
160         }
161     }
162 
163     @Category(DummyCategory1.class)
164     public static class DummyTestClass1 {
165         @Test
166         public void dummyTest() {
167         }
168     }
169 
170     @Category({DummyCategory0.class, DummyCategory1.class})
171     public static class DummyTestClass01 {
172         @Test
173         public void dummyTest() {
174         }
175     }
176 
177     @Category(DummyCategory0.class)
178     public static class DummyTestClass0TestMethod1 {
179         @Category(DummyCategory1.class)
180         @Test
181         public void dummyTest() {
182         }
183     }
184 
185     public static interface DummyCategory0 {
186     }
187 
188     public static interface DummyCategory1 {
189     }
190 }