package org.junit.runner; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assume.assumeThat; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.ExcludeCategories; import org.junit.rules.ExpectedException; import org.junit.rules.TestName; import org.junit.runner.manipulation.Filter; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; public class FilterFactoriesTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Rule public TestName testName = new TestName(); private Request createSuiteRequest() { return Request.aClass(DummySuite.class); } @Test public void shouldCreateFilterWithArguments() throws Exception { Filter filter = FilterFactories.createFilterFromFilterSpec( createSuiteRequest(), ExcludeCategories.class.getName() + "=" + DummyCategory.class.getName()); assertThat(filter.describe(), startsWith("excludes ")); } @Test public void shouldCreateFilterWithNoArguments() throws Exception { Filter filter = FilterFactories.createFilterFromFilterSpec( createSuiteRequest(), FilterFactoryStub.class.getName()); assertThat(filter, instanceOf(DummyFilter.class)); } @Test public void shouldPassOnDescriptionToFilterFactory() throws Exception { Request request = createSuiteRequest(); Description description = request.getRunner().getDescription(); Filter filter = FilterFactories.createFilterFromFilterSpec( request, FilterFactoryStub.class.getName()); // This assumption tested in shouldCreateFilterWithNoArguments() assumeThat(filter, instanceOf(DummyFilter.class)); DummyFilter dummyFilter = (DummyFilter) filter; assertThat(dummyFilter.getTopLevelDescription(), is(description)); } @Test public void shouldCreateFilter() throws Exception { Filter filter = FilterFactories.createFilter( FilterFactoryStub.class, new FilterFactoryParams( Description.createSuiteDescription(testName.getMethodName()), "")); assertThat(filter, instanceOf(DummyFilter.class)); } @Test public void shouldThrowExceptionIfNotFilterFactory() throws Exception { expectedException.expect(FilterFactory.FilterNotCreatedException.class); FilterFactories.createFilterFactory(NonFilterFactory.class.getName()); } @Test public void shouldThrowExceptionIfNotInstantiable() throws Exception { expectedException.expect(FilterFactory.FilterNotCreatedException.class); FilterFactories.createFilterFactory(NonInstantiableFilterFactory.class); } public static class NonFilterFactory { } public static class NonInstantiableFilterFactory implements FilterFactory { private NonInstantiableFilterFactory() { } public Filter createFilter(FilterFactoryParams params) throws FilterNotCreatedException { throw new FilterNotCreatedException(new Exception("not implemented")); } } public static class FilterFactoryStub implements FilterFactory { public Filter createFilter(FilterFactoryParams params) { return new DummyFilter(params.getTopLevelDescription()); } } private static class DummyFilter extends Filter { private final Description fTopLevelDescription; public DummyFilter(Description topLevelDescription) { fTopLevelDescription = topLevelDescription; } public Description getTopLevelDescription() { return fTopLevelDescription; } @Override public boolean shouldRun(Description description) { return false; } @Override public String describe() { return null; } } public static class DummyCategory { } @RunWith(Suite.class) @SuiteClasses(DummyTest.class) public static class DummySuite { } public static class DummyTest { @Test public void passes() { } } }