1 package org.junit.runner;
2
3 import static org.hamcrest.CoreMatchers.instanceOf;
4 import static org.hamcrest.CoreMatchers.is;
5 import static org.hamcrest.CoreMatchers.startsWith;
6 import static org.hamcrest.MatcherAssert.assertThat;
7 import static org.junit.Assume.assumeThat;
8 import org.junit.Rule;
9 import org.junit.Test;
10 import org.junit.experimental.categories.ExcludeCategories;
11 import org.junit.rules.ExpectedException;
12 import org.junit.rules.TestName;
13 import org.junit.runner.manipulation.Filter;
14 import org.junit.runners.Suite;
15 import org.junit.runners.Suite.SuiteClasses;
16
17 public class FilterFactoriesTest {
18 @Rule
19 public ExpectedException expectedException = ExpectedException.none();
20
21 @Rule
22 public TestName testName = new TestName();
23
24 private Request createSuiteRequest() {
25 return Request.aClass(DummySuite.class);
26 }
27
28 @Test
29 public void shouldCreateFilterWithArguments() throws Exception {
30 Filter filter = FilterFactories.createFilterFromFilterSpec(
31 createSuiteRequest(),
32 ExcludeCategories.class.getName() + "=" + DummyCategory.class.getName());
33
34 assertThat(filter.describe(), startsWith("excludes "));
35 }
36
37 @Test
38 public void shouldCreateFilterWithNoArguments() throws Exception {
39 Filter filter = FilterFactories.createFilterFromFilterSpec(
40 createSuiteRequest(), FilterFactoryStub.class.getName());
41
42 assertThat(filter, instanceOf(DummyFilter.class));
43 }
44
45 @Test
46 public void shouldPassOnDescriptionToFilterFactory() throws Exception {
47 Request request = createSuiteRequest();
48 Description description = request.getRunner().getDescription();
49 Filter filter = FilterFactories.createFilterFromFilterSpec(
50 request, FilterFactoryStub.class.getName());
51
52
53 assumeThat(filter, instanceOf(DummyFilter.class));
54
55 DummyFilter dummyFilter = (DummyFilter) filter;
56 assertThat(dummyFilter.getTopLevelDescription(), is(description));
57 }
58
59 @Test
60 public void shouldCreateFilter() throws Exception {
61 Filter filter = FilterFactories.createFilter(
62 FilterFactoryStub.class,
63 new FilterFactoryParams(
64 Description.createSuiteDescription(testName.getMethodName()),
65 ""));
66
67 assertThat(filter, instanceOf(DummyFilter.class));
68 }
69
70 @Test
71 public void shouldThrowExceptionIfNotFilterFactory() throws Exception {
72 expectedException.expect(FilterFactory.FilterNotCreatedException.class);
73
74 FilterFactories.createFilterFactory(NonFilterFactory.class.getName());
75 }
76
77 @Test
78 public void shouldThrowExceptionIfNotInstantiable() throws Exception {
79 expectedException.expect(FilterFactory.FilterNotCreatedException.class);
80
81 FilterFactories.createFilterFactory(NonInstantiableFilterFactory.class);
82 }
83
84 public static class NonFilterFactory {
85 }
86
87 public static class NonInstantiableFilterFactory implements FilterFactory {
88 private NonInstantiableFilterFactory() {
89 }
90
91 public Filter createFilter(FilterFactoryParams params) throws FilterNotCreatedException {
92 throw new FilterNotCreatedException(new Exception("not implemented"));
93 }
94 }
95
96 public static class FilterFactoryStub implements FilterFactory {
97 public Filter createFilter(FilterFactoryParams params) {
98 return new DummyFilter(params.getTopLevelDescription());
99 }
100 }
101
102 private static class DummyFilter extends Filter {
103 private final Description fTopLevelDescription;
104
105 public DummyFilter(Description topLevelDescription) {
106 fTopLevelDescription = topLevelDescription;
107 }
108
109 public Description getTopLevelDescription() {
110 return fTopLevelDescription;
111 }
112
113 @Override
114 public boolean shouldRun(Description description) {
115 return false;
116 }
117
118 @Override
119 public String describe() {
120 return null;
121 }
122 }
123
124 public static class DummyCategory {
125 }
126
127 @RunWith(Suite.class)
128 @SuiteClasses(DummyTest.class)
129 public static class DummySuite {
130 }
131
132 public static class DummyTest {
133 @Test
134 public void passes() {
135 }
136 }
137 }