|
5 | 5 | import static org.junit.experimental.results.PrintableResult.testResult; |
6 | 6 | import static org.junit.experimental.results.ResultMatchers.isSuccessful; |
7 | 7 |
|
8 | | -import java.lang.annotation.Retention; |
9 | | -import java.lang.annotation.RetentionPolicy; |
10 | | -import java.util.ArrayList; |
11 | 8 | import java.util.Arrays; |
12 | | -import java.util.Collection; |
13 | | -import java.util.List; |
14 | 9 |
|
15 | 10 | import org.junit.Test; |
16 | 11 | import org.junit.experimental.categories.Category; |
17 | 12 | import org.junit.experimental.categories.CategoryFilter; |
| 13 | +import org.junit.experimental.runners.Listed; |
| 14 | +import org.junit.experimental.runners.SuiteBuilder; |
| 15 | +import org.junit.experimental.runners.SuiteBuilder.Classes; |
| 16 | +import org.junit.experimental.runners.SuiteBuilder.RunnerFilter; |
18 | 17 | import org.junit.runner.Description; |
19 | 18 | import org.junit.runner.JUnitCore; |
20 | 19 | import org.junit.runner.Result; |
21 | 20 | import org.junit.runner.RunWith; |
22 | 21 | import org.junit.runner.Runner; |
23 | | -import org.junit.runner.notification.RunNotifier; |
24 | 22 | import org.junit.runners.BlockJUnit4ClassRunner; |
25 | 23 | import org.junit.runners.model.InitializationError; |
26 | | -import org.junit.runners.model.TestClass; |
27 | 24 |
|
28 | 25 | public class SuiteBuilderTest { |
29 | | - @Retention(RetentionPolicy.RUNTIME) |
30 | | - public @interface RunnerFilter { |
31 | | - public static interface Value { |
32 | | - public abstract List<Runner> matchingRunners( |
33 | | - List<Runner> allPossibleRunners); |
34 | | - } |
35 | | - } |
36 | | - |
37 | | - public static class Listed implements Classes.Value { |
38 | | - private final Class<?>[] fClasses; |
39 | | - |
40 | | - public Listed(Class<?>... classes) { |
41 | | - fClasses= classes; |
42 | | - } |
43 | | - |
44 | | - public List<? extends Class<?>> get() { |
45 | | - return Arrays.asList(fClasses); |
46 | | - } |
47 | | - } |
48 | | - |
49 | | - // Classes -> RunnerBuilder |
50 | | - |
51 | | - @Retention(RetentionPolicy.RUNTIME) |
52 | | - public @interface Classes { |
53 | | - public static interface Value { |
54 | | - public abstract Collection<? extends Class<?>> get(); |
55 | | - } |
56 | | - } |
57 | | - |
58 | | - public static class SuiteBuilder extends Runner { |
59 | | - private final TestClass fTestClass; |
60 | | - |
61 | | - private final Object fInstance; |
62 | | - |
63 | | - private final List<Runner> fRunners; |
64 | | - |
65 | | - public SuiteBuilder(Class<?> testClass) throws InitializationError { |
66 | | - fTestClass= new TestClass(testClass); |
67 | | - // TODO: extract complexity |
68 | | - try { |
69 | | - fInstance= fTestClass.getOnlyConstructor().newInstance(); |
70 | | - } catch (Exception e) { |
71 | | - throw new InitializationError(e); |
72 | | - } |
73 | | - fRunners= computeRunners(); |
74 | | - } |
75 | | - |
76 | | - @Override |
77 | | - public Description getDescription() { |
78 | | - Description description= Description.createSuiteDescription(fTestClass.getJavaClass()); |
79 | | - for (Runner each : fRunners) { |
80 | | - description.addChild(each.getDescription()); |
81 | | - } |
82 | | - return description; |
83 | | - } |
84 | | - |
85 | | - // TODO: require an instance? |
86 | | - @Override |
87 | | - public void run(RunNotifier notifier) { |
88 | | - for (Runner each : fRunners) |
89 | | - each.run(notifier); |
90 | | - } |
91 | | - |
92 | | - private List<Runner> computeRunners() { |
93 | | - List<Class<?>> allPossibleClasses= gatherClasses(); |
94 | | - List<Runner> allPossibleRunners= runnersForClasses(allPossibleClasses); |
95 | | - return filterRunners(allPossibleRunners); |
96 | | - } |
97 | | - |
98 | | - private List<Runner> filterRunners(List<Runner> allPossibleRunners) { |
99 | | - List<Runner> result= allPossibleRunners; |
100 | | - for (RunnerFilter.Value each : getFilters()) |
101 | | - result= each.matchingRunners(result); |
102 | | - return result; |
103 | | - } |
104 | | - |
105 | | - private List<RunnerFilter.Value> getFilters() { |
106 | | - return fTestClass.getAnnotatedFieldValues(fInstance, |
107 | | - RunnerFilter.class, RunnerFilter.Value.class); |
108 | | - } |
109 | | - |
110 | | - private List<Runner> runnersForClasses(List<Class<?>> allPossibleClasses) { |
111 | | - // TODO: cheating |
112 | | - ArrayList<Runner> result= new ArrayList<Runner>(); |
113 | | - for (Class<?> each : allPossibleClasses) { |
114 | | - try { |
115 | | - result.add(new BlockJUnit4ClassRunner(each)); |
116 | | - } catch (InitializationError e) { |
117 | | - // TODO Auto-generated catch block |
118 | | - e.printStackTrace(); |
119 | | - } |
120 | | - } |
121 | | - return result; |
122 | | - } |
123 | | - |
124 | | - private List<Class<?>> gatherClasses() { |
125 | | - ArrayList<Class<?>> result= new ArrayList<Class<?>>(); |
126 | | - List<Classes.Value> classeses= fTestClass.getAnnotatedFieldValues( |
127 | | - fInstance, Classes.class, Classes.Value.class); |
128 | | - for (Classes.Value each : classeses) |
129 | | - result.addAll(each.get()); |
130 | | - return result; |
131 | | - } |
132 | | - } |
133 | | - |
134 | 26 | static class Yes { |
135 | 27 | } |
136 | 28 |
|
137 | 29 | static class No { |
138 | 30 | } |
139 | 31 |
|
| 32 | + // TODO: test multiple filters, multiple class sources |
| 33 | + |
140 | 34 | @Category(Yes.class) |
141 | 35 | public static class Yes1 { |
142 | 36 | @Test |
@@ -168,7 +62,7 @@ public static class OnlyYesJustOne { |
168 | 62 | } |
169 | 63 |
|
170 | 64 | @RunWith(SuiteBuilder.class) |
171 | | - public static class OnlyYesMaybeTwo { |
| 65 | + public static class OnlyYes { |
172 | 66 | @Classes |
173 | 67 | public Listed classes= new Listed(Yes1.class, Yes2.class, No1.class); |
174 | 68 |
|
@@ -212,9 +106,9 @@ public void onlyRunOne() { |
212 | 106 |
|
213 | 107 | @Test |
214 | 108 | public void runTwo() { |
215 | | - Result result= new JUnitCore().run(OnlyYesMaybeTwo.class); |
| 109 | + Result result= new JUnitCore().run(OnlyYes.class); |
216 | 110 | assertEquals(2, result.getRunCount()); |
217 | | - assertThat(testResult(OnlyYesMaybeTwo.class), isSuccessful()); |
| 111 | + assertThat(testResult(OnlyYes.class), isSuccessful()); |
218 | 112 | } |
219 | 113 |
|
220 | 114 | @Test |
|
0 commit comments