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 }