package org.junit.runner; import java.util.HashSet; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.experimental.categories.ExcludeCategories; import org.junit.experimental.categories.IncludeCategories; import org.junit.runner.notification.RunListener; import org.junit.tests.TestSystem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class FilterOptionIntegrationTest { private static final String INCLUDES_DUMMY_CATEGORY_0 = "--filter=" + IncludeCategories.class.getName() + "=" + DummyCategory0.class.getName(); private static final String EXCLUDES_DUMMY_CATEGORY_1 = "--filter=" + ExcludeCategories.class.getName() + "=" + DummyCategory1.class.getName(); private JUnitCore jUnitCore = new JUnitCore(); private TestListener testListener = new TestListener(); @Before public void setUp() { jUnitCore.addListener(testListener); } @Test public void shouldRunAllTests() { Result result = runJUnit( DummyTestClass.class.getName(), DummyTestClass0.class.getName(), DummyTestClass1.class.getName(), DummyTestClass01.class.getName(), DummyTestClass0TestMethod1.class.getName()); assertWasRun(DummyTestClass.class); assertWasRun(DummyTestClass0.class); assertWasRun(DummyTestClass1.class); assertWasRun(DummyTestClass01.class); assertWasRun(DummyTestClass0TestMethod1.class); assertThat("runCount does not match", result.getRunCount(), is(5)); assertThat("failureCount does not match", result.getFailureCount(), is(0)); } @Test public void shouldExcludeSomeTests() { Result result = runJUnit( EXCLUDES_DUMMY_CATEGORY_1, DummyTestClass.class.getName(), DummyTestClass0.class.getName(), DummyTestClass1.class.getName(), DummyTestClass01.class.getName(), DummyTestClass0TestMethod1.class.getName()); assertWasRun(DummyTestClass.class); assertWasRun(DummyTestClass0.class); assertWasNotRun(DummyTestClass1.class); assertWasNotRun(DummyTestClass01.class); assertWasNotRun(DummyTestClass0TestMethod1.class); assertThat("runCount does not match", result.getRunCount(), is(2)); assertThat("failureCount does not match", result.getFailureCount(), is(0)); } @Test public void shouldIncludeSomeTests() { Result result = runJUnit( INCLUDES_DUMMY_CATEGORY_0, DummyTestClass.class.getName(), DummyTestClass0.class.getName(), DummyTestClass1.class.getName(), DummyTestClass01.class.getName(), DummyTestClass0TestMethod1.class.getName()); assertWasNotRun(DummyTestClass.class); assertWasRun(DummyTestClass0.class); assertWasNotRun(DummyTestClass1.class); assertWasRun(DummyTestClass01.class); assertWasRun(DummyTestClass0TestMethod1.class); assertThat("runCount does not match", result.getRunCount(), is(3)); assertThat("failureCount does not match", result.getFailureCount(), is(0)); } @Test public void shouldCombineFilters() { Result result = runJUnit( INCLUDES_DUMMY_CATEGORY_0, EXCLUDES_DUMMY_CATEGORY_1, DummyTestClass.class.getName(), DummyTestClass0.class.getName(), DummyTestClass1.class.getName(), DummyTestClass01.class.getName(), DummyTestClass0TestMethod1.class.getName()); assertWasNotRun(DummyTestClass.class); assertWasRun(DummyTestClass0.class); assertWasNotRun(DummyTestClass1.class); assertWasNotRun(DummyTestClass01.class); assertWasNotRun(DummyTestClass0TestMethod1.class); assertThat("runCount does not match", result.getRunCount(), is(1)); assertThat("failureCount does not match", result.getFailureCount(), is(0)); } private Result runJUnit(final String... args) { return jUnitCore.runMain(new TestSystem(), args); } private void assertWasRun(Class<?> testClass) { assertTrue(testClass.getName() + " expected to finish but did not", testListener.wasRun(testClass)); } private void assertWasNotRun(Class<?> testClass) { assertFalse( testClass.getName() + " expected not to have been started but was", testListener.wasRun(testClass)); } private static class TestListener extends RunListener { private Set<String> startedTests = new HashSet<String>(); private Set<String> finishedTests = new HashSet<String>(); @Override public void testFinished(final Description description) { finishedTests.add(description.getClassName()); } private boolean testFinished(final Class<?> testClass) { return finishedTests.contains(testClass.getName()); } @Override public void testStarted(final Description description) { startedTests.add(description.getClassName()); } private boolean testStarted(final Class<?> testClass) { return startedTests.contains(testClass.getName()); } public boolean wasRun(final Class<?> testClass) { return testStarted(testClass) && testFinished(testClass); } } public static class DummyTestClass { @Test public void dummyTest() { } } @Category(DummyCategory0.class) public static class DummyTestClass0 { @Test public void dummyTest() { } } @Category(DummyCategory1.class) public static class DummyTestClass1 { @Test public void dummyTest() { } } @Category({DummyCategory0.class, DummyCategory1.class}) public static class DummyTestClass01 { @Test public void dummyTest() { } } @Category(DummyCategory0.class) public static class DummyTestClass0TestMethod1 { @Category(DummyCategory1.class) @Test public void dummyTest() { } } public static interface DummyCategory0 { } public static interface DummyCategory1 { } }