15
15
import static java .util .stream .Collectors .toCollection ;
16
16
import static java .util .stream .Collectors .toSet ;
17
17
import static org .junit .jupiter .engine .descriptor .NestedClassTestDescriptor .getEnclosingTestClasses ;
18
- import static org .junit .platform .commons .support .AnnotationSupport .isAnnotated ;
19
18
import static org .junit .platform .commons .support .HierarchyTraversalMode .TOP_DOWN ;
20
19
import static org .junit .platform .commons .support .ReflectionSupport .findMethods ;
21
20
import static org .junit .platform .commons .support .ReflectionSupport .streamNestedClasses ;
34
33
import java .util .function .Supplier ;
35
34
import java .util .stream .Stream ;
36
35
37
- import org .junit .jupiter .api .ClassTemplate ;
38
36
import org .junit .jupiter .api .extension .ClassTemplateInvocationContext ;
39
37
import org .junit .jupiter .engine .config .JupiterConfiguration ;
40
38
import org .junit .jupiter .engine .descriptor .ClassBasedTestDescriptor ;
44
42
import org .junit .jupiter .engine .descriptor .Filterable ;
45
43
import org .junit .jupiter .engine .descriptor .NestedClassTestDescriptor ;
46
44
import org .junit .jupiter .engine .descriptor .TestClassAware ;
47
- import org .junit .jupiter .engine .discovery .predicates .IsTestClassWithTests ;
45
+ import org .junit .jupiter .engine .discovery .predicates .TestClassPredicates ;
48
46
import org .junit .platform .commons .support .ReflectionSupport ;
49
47
import org .junit .platform .engine .DiscoverySelector ;
50
48
import org .junit .platform .engine .TestDescriptor ;
62
60
*/
63
61
class ClassSelectorResolver implements SelectorResolver {
64
62
65
- private static final Predicate <Class <?>> isAnnotatedWithClassTemplate = testClass -> isAnnotated (testClass ,
66
- ClassTemplate .class );
67
-
68
- private final IsTestClassWithTests isTestClassWithTests ;
69
-
70
63
private final Predicate <String > classNameFilter ;
71
64
private final JupiterConfiguration configuration ;
65
+ private final TestClassPredicates predicates ;
72
66
73
67
ClassSelectorResolver (Predicate <String > classNameFilter , JupiterConfiguration configuration ,
74
68
DiscoveryIssueReporter issueReporter ) {
75
69
this .classNameFilter = classNameFilter ;
76
70
this .configuration = configuration ;
77
- this .isTestClassWithTests = new IsTestClassWithTests (issueReporter );
71
+ this .predicates = new TestClassPredicates (issueReporter );
78
72
}
79
73
80
74
@ Override
81
75
public Resolution resolve (ClassSelector selector , Context context ) {
82
76
Class <?> testClass = selector .getJavaClass ();
83
- if (this .isTestClassWithTests .test (testClass )) {
84
- // Nested tests are never filtered out
85
- if (classNameFilter .test (testClass .getName ())) {
77
+
78
+ if (this .predicates .isAnnotatedWithNested .test (testClass )) {
79
+ // Class name filter is not applied to nested test classes
80
+ if (this .predicates .isValidNestedTestClass (testClass )) {
86
81
return toResolution (
87
- context .addToParent (parent -> Optional .of (newStaticClassTestDescriptor (parent , testClass ))));
82
+ context .addToParent (() -> DiscoverySelectors .selectClass (testClass .getEnclosingClass ()),
83
+ parent -> Optional .of (newMemberClassTestDescriptor (parent , testClass ))));
88
84
}
89
85
}
90
- else if (this . isTestClassWithTests . isNestedTestClass . test (testClass )) {
91
- return toResolution (context . addToParent (() -> DiscoverySelectors . selectClass ( testClass . getEnclosingClass ()),
92
- parent -> Optional .of (newMemberClassTestDescriptor (parent , testClass ))));
86
+ else if (isAcceptedStandaloneTestClass (testClass )) {
87
+ return toResolution (
88
+ context . addToParent ( parent -> Optional .of (newStandaloneClassTestDescriptor (parent , testClass ))));
93
89
}
94
90
return unresolved ();
95
91
}
96
92
93
+ private boolean isAcceptedStandaloneTestClass (Class <?> testClass ) {
94
+ return this .classNameFilter .test (testClass .getName ()) //
95
+ && this .predicates .looksLikeIntendedTestClass (testClass ) //
96
+ && this .predicates .isValidStandaloneTestClass (testClass );
97
+ }
98
+
97
99
@ Override
98
100
public Resolution resolve (NestedClassSelector selector , Context context ) {
99
- if (this .isTestClassWithTests . isNestedTestClass .test (selector .getNestedClass ())) {
101
+ if (this .predicates . isAnnotatedWithNestedAndValid .test (selector .getNestedClass ())) {
100
102
return toResolution (context .addToParent (() -> selectClass (selector .getEnclosingClasses ()),
101
103
parent -> Optional .of (newMemberClassTestDescriptor (parent , selector .getNestedClass ()))));
102
104
}
@@ -108,17 +110,17 @@ public Resolution resolve(UniqueIdSelector selector, Context context) {
108
110
UniqueId uniqueId = selector .getUniqueId ();
109
111
UniqueId .Segment lastSegment = uniqueId .getLastSegment ();
110
112
if (ClassTestDescriptor .SEGMENT_TYPE .equals (lastSegment .getType ())) {
111
- return resolveStaticClassUniqueId (context , lastSegment , __ -> true , this ::newClassTestDescriptor );
113
+ return resolveStandaloneClassUniqueId (context , lastSegment , __ -> true , this ::newClassTestDescriptor );
112
114
}
113
- if (ClassTemplateTestDescriptor .STATIC_CLASS_SEGMENT_TYPE .equals (lastSegment .getType ())) {
114
- return resolveStaticClassUniqueId (context , lastSegment , isAnnotatedWithClassTemplate ,
115
- this ::newStaticClassTemplateTestDescriptor );
115
+ if (ClassTemplateTestDescriptor .STANDALONE_CLASS_SEGMENT_TYPE .equals (lastSegment .getType ())) {
116
+ return resolveStandaloneClassUniqueId (context , lastSegment , this . predicates . isAnnotatedWithClassTemplate ,
117
+ this ::newClassTemplateTestDescriptor );
116
118
}
117
119
if (NestedClassTestDescriptor .SEGMENT_TYPE .equals (lastSegment .getType ())) {
118
120
return resolveNestedClassUniqueId (context , uniqueId , __ -> true , this ::newNestedClassTestDescriptor );
119
121
}
120
122
if (ClassTemplateTestDescriptor .NESTED_CLASS_SEGMENT_TYPE .equals (lastSegment .getType ())) {
121
- return resolveNestedClassUniqueId (context , uniqueId , isAnnotatedWithClassTemplate ,
123
+ return resolveNestedClassUniqueId (context , uniqueId , this . predicates . isAnnotatedWithClassTemplate ,
122
124
this ::newNestedClassTemplateTestDescriptor );
123
125
}
124
126
if (ClassTemplateInvocationTestDescriptor .SEGMENT_TYPE .equals (lastSegment .getType ())) {
@@ -138,11 +140,11 @@ public Resolution resolve(UniqueIdSelector selector, Context context) {
138
140
public Resolution resolve (IterationSelector selector , Context context ) {
139
141
DiscoverySelector parentSelector = selector .getParentSelector ();
140
142
if (parentSelector instanceof ClassSelector
141
- && isAnnotatedWithClassTemplate .test (((ClassSelector ) parentSelector ).getJavaClass ())) {
143
+ && this . predicates . isAnnotatedWithClassTemplate .test (((ClassSelector ) parentSelector ).getJavaClass ())) {
142
144
return resolveIterations (selector , context );
143
145
}
144
- if (parentSelector instanceof NestedClassSelector
145
- && isAnnotatedWithClassTemplate . test ( ((NestedClassSelector ) parentSelector ).getNestedClass ())) {
146
+ if (parentSelector instanceof NestedClassSelector && this . predicates . isAnnotatedWithClassTemplate . test (
147
+ ((NestedClassSelector ) parentSelector ).getNestedClass ())) {
146
148
return resolveIterations (selector , context );
147
149
}
148
150
return unresolved ();
@@ -160,13 +162,13 @@ private Resolution resolveIterations(IterationSelector selector, Context context
160
162
return matches .isEmpty () ? unresolved () : Resolution .matches (matches );
161
163
}
162
164
163
- private Resolution resolveStaticClassUniqueId (Context context , UniqueId .Segment lastSegment ,
165
+ private Resolution resolveStandaloneClassUniqueId (Context context , UniqueId .Segment lastSegment ,
164
166
Predicate <? super Class <?>> condition ,
165
167
BiFunction <TestDescriptor , Class <?>, ClassBasedTestDescriptor > factory ) {
166
168
167
169
String className = lastSegment .getValue ();
168
170
return ReflectionSupport .tryToLoadClass (className ).toOptional () //
169
- .filter (this .isTestClassWithTests ) //
171
+ .filter (this .predicates :: isValidStandaloneTestClass ) //
170
172
.filter (condition ) //
171
173
.map (testClass -> toResolution (
172
174
context .addToParent (parent -> Optional .of (factory .apply (parent , testClass ))))) //
@@ -180,8 +182,9 @@ private Resolution resolveNestedClassUniqueId(Context context, UniqueId uniqueId
180
182
String simpleClassName = uniqueId .getLastSegment ().getValue ();
181
183
return toResolution (context .addToParent (() -> selectUniqueId (uniqueId .removeLastSegment ()), parent -> {
182
184
Class <?> parentTestClass = ((TestClassAware ) parent ).getTestClass ();
183
- return ReflectionSupport .findNestedClasses (parentTestClass , this .isTestClassWithTests .isNestedTestClass .and (
184
- where (Class ::getSimpleName , isEqual (simpleClassName )))).stream () //
185
+ return ReflectionSupport .findNestedClasses (parentTestClass ,
186
+ this .predicates .isAnnotatedWithNestedAndValid .and (
187
+ where (Class ::getSimpleName , isEqual (simpleClassName )))).stream () //
185
188
.findFirst () //
186
189
.filter (condition ) //
187
190
.map (testClass -> factory .apply (parent , testClass ));
@@ -196,15 +199,14 @@ private ClassTemplateInvocationTestDescriptor newDummyClassTemplateInvocationTes
196
199
DummyClassTemplateInvocationContext .INSTANCE , index , parent .getSource ().orElse (null ), configuration );
197
200
}
198
201
199
- private ClassBasedTestDescriptor newStaticClassTestDescriptor (TestDescriptor parent , Class <?> testClass ) {
200
- return isAnnotatedWithClassTemplate .test (testClass ) //
201
- ? newStaticClassTemplateTestDescriptor (parent , testClass ) //
202
+ private ClassBasedTestDescriptor newStandaloneClassTestDescriptor (TestDescriptor parent , Class <?> testClass ) {
203
+ return this . predicates . isAnnotatedWithClassTemplate .test (testClass ) //
204
+ ? newClassTemplateTestDescriptor (parent , testClass ) //
202
205
: newClassTestDescriptor (parent , testClass );
203
206
}
204
207
205
- private ClassTemplateTestDescriptor newStaticClassTemplateTestDescriptor (TestDescriptor parent ,
206
- Class <?> testClass ) {
207
- return newClassTemplateTestDescriptor (parent , ClassTemplateTestDescriptor .STATIC_CLASS_SEGMENT_TYPE ,
208
+ private ClassTemplateTestDescriptor newClassTemplateTestDescriptor (TestDescriptor parent , Class <?> testClass ) {
209
+ return newClassTemplateTestDescriptor (parent , ClassTemplateTestDescriptor .STANDALONE_CLASS_SEGMENT_TYPE ,
208
210
newClassTestDescriptor (parent , testClass ));
209
211
}
210
212
@@ -215,7 +217,7 @@ private ClassTestDescriptor newClassTestDescriptor(TestDescriptor parent, Class<
215
217
}
216
218
217
219
private ClassBasedTestDescriptor newMemberClassTestDescriptor (TestDescriptor parent , Class <?> testClass ) {
218
- return isAnnotatedWithClassTemplate .test (testClass ) //
220
+ return this . predicates . isAnnotatedWithClassTemplate .test (testClass ) //
219
221
? newNestedClassTemplateTestDescriptor (parent , testClass ) //
220
222
: newNestedClassTestDescriptor (parent , testClass );
221
223
}
@@ -273,11 +275,11 @@ private Supplier<Set<? extends DiscoverySelector>> expansionCallback(TestDescrip
273
275
List <Class <?>> testClasses = testClassesSupplier .get ();
274
276
Class <?> testClass = testClasses .get (testClasses .size () - 1 );
275
277
Stream <DiscoverySelector > methods = findMethods (testClass ,
276
- this .isTestClassWithTests .isTestOrTestFactoryOrTestTemplateMethod , TOP_DOWN ).stream (). map (
277
- method -> selectMethod (testClasses , method ));
278
+ this .predicates .isTestOrTestFactoryOrTestTemplateMethod , TOP_DOWN ).stream () //
279
+ . map ( method -> selectMethod (testClasses , method ));
278
280
Stream <NestedClassSelector > nestedClasses = streamNestedClasses (testClass ,
279
- this .isTestClassWithTests . isNestedTestClass ). map (
280
- nestedClass -> DiscoverySelectors .selectNestedClass (testClasses , nestedClass ));
281
+ this .predicates . isAnnotatedWithNestedAndValid ) //
282
+ . map ( nestedClass -> DiscoverySelectors .selectNestedClass (testClasses , nestedClass ));
281
283
return Stream .concat (methods , nestedClasses ).collect (
282
284
toCollection ((Supplier <Set <DiscoverySelector >>) LinkedHashSet ::new ));
283
285
};
0 commit comments