1
1
package io .cucumber .junit .platform .engine ;
2
2
3
- import io .cucumber .core .feature .FeatureWithLines ;
4
3
import io .cucumber .core .logging .Logger ;
5
4
import io .cucumber .core .logging .LoggerFactory ;
6
- import io .cucumber .junit .platform .engine .NodeDescriptor .PickleDescriptor ;
7
5
import org .junit .platform .engine .ConfigurationParameters ;
6
+ import org .junit .platform .engine .DiscoveryFilter ;
7
+ import org .junit .platform .engine .DiscoverySelector ;
8
8
import org .junit .platform .engine .EngineDiscoveryRequest ;
9
- import org .junit .platform .engine .Filter ;
10
9
import org .junit .platform .engine .TestDescriptor ;
11
- import org .junit .platform .engine .discovery .ClassSelector ;
12
- import org .junit .platform .engine .discovery .ClasspathResourceSelector ;
13
- import org .junit .platform .engine .discovery .ClasspathRootSelector ;
14
- import org .junit .platform .engine .discovery .DirectorySelector ;
15
- import org .junit .platform .engine .discovery .FileSelector ;
16
10
import org .junit .platform .engine .discovery .PackageNameFilter ;
17
- import org .junit .platform .engine .discovery .PackageSelector ;
18
- import org .junit .platform .engine .discovery .UniqueIdSelector ;
19
- import org .junit .platform .engine .discovery .UriSelector ;
11
+ import org .junit .platform .engine .support .discovery .EngineDiscoveryRequestResolver ;
20
12
21
13
import java .util .List ;
14
+ import java .util .Objects ;
15
+ import java .util .Set ;
22
16
import java .util .function .Predicate ;
23
17
24
18
import static io .cucumber .junit .platform .engine .Constants .FEATURES_PROPERTY_NAME ;
25
- import static io . cucumber . junit . platform . engine . FeatureResolver . create ;
19
+ import static java . util . stream . Collectors . toList ;
26
20
import static org .junit .platform .engine .Filter .composeFilters ;
27
21
28
22
class DiscoverySelectorResolver {
29
23
30
24
private static final Logger log = LoggerFactory .getLogger (DiscoverySelectorResolver .class );
31
25
26
+ // @formatter:off
27
+ private static final EngineDiscoveryRequestResolver <CucumberEngineDescriptor > resolver = EngineDiscoveryRequestResolver
28
+ .<CucumberEngineDescriptor >builder ()
29
+ .addSelectorResolver (context -> new FeatureResolver (
30
+ context .getDiscoveryRequest ().getConfigurationParameters (),
31
+ getPackageFilter (context .getDiscoveryRequest ()))
32
+ )
33
+ .addTestDescriptorVisitor (context -> new PackageFilteringVisitor (getPackageFilter (context .getDiscoveryRequest ())))
34
+ .addTestDescriptorVisitor (context -> new FeatureOrderingVisitor ())
35
+ .addTestDescriptorVisitor (context -> new FeatureElementOrderingVisitor ())
36
+ .addTestDescriptorVisitor (context -> TestDescriptor ::prune )
37
+ .build ();
38
+ // @formatter:on
39
+
32
40
private static boolean warnedWhenCucumberFeaturesPropertyIsUsed = false ;
33
41
34
42
private static void warnWhenCucumberFeaturesPropertyIsUsed () {
@@ -44,67 +52,49 @@ private static void warnWhenCucumberFeaturesPropertyIsUsed() {
44
52
}
45
53
46
54
void resolveSelectors (EngineDiscoveryRequest request , CucumberEngineDescriptor engineDescriptor ) {
47
- Predicate <String > packageFilter = buildPackageFilter (request );
48
- resolve (request , engineDescriptor , packageFilter );
49
- filter (engineDescriptor , packageFilter );
50
- pruneTree (engineDescriptor );
51
- }
52
-
53
- private Predicate <String > buildPackageFilter (EngineDiscoveryRequest request ) {
54
- Filter <String > packageFilter = composeFilters (request .getFiltersByType (PackageNameFilter .class ));
55
- return packageFilter .toPredicate ();
56
- }
57
-
58
- private void resolve (
59
- EngineDiscoveryRequest request , CucumberEngineDescriptor engineDescriptor , Predicate <String > packageFilter
60
- ) {
61
55
ConfigurationParameters configuration = request .getConfigurationParameters ();
62
- FeatureResolver featureResolver = create (
63
- configuration ,
64
- engineDescriptor ,
65
- packageFilter );
66
-
67
56
CucumberEngineOptions options = new CucumberEngineOptions (configuration );
68
- List < FeatureWithLines > featureWithLines = options .featuresWithLines ();
57
+ Set < CucumberDiscoverySelectors . FeatureWithLinesSelector > featureWithLines = options .featuresWithLines ();
69
58
if (!featureWithLines .isEmpty ()) {
70
59
warnWhenCucumberFeaturesPropertyIsUsed ();
71
- featureWithLines .forEach (featureResolver ::resolveFeatureWithLines );
72
- return ;
60
+ request = new CucumberFeaturesPropertyDiscoveryRequest (request , featureWithLines );
73
61
}
74
-
75
- request .getSelectorsByType (ClasspathRootSelector .class ).forEach (featureResolver ::resolveClasspathRoot );
76
- request .getSelectorsByType (ClasspathResourceSelector .class ).forEach (featureResolver ::resolveClasspathResource );
77
- request .getSelectorsByType (ClassSelector .class ).forEach (featureResolver ::resolveClass );
78
- request .getSelectorsByType (PackageSelector .class ).forEach (featureResolver ::resolvePackageResource );
79
- request .getSelectorsByType (FileSelector .class ).forEach (featureResolver ::resolveFile );
80
- request .getSelectorsByType (DirectorySelector .class ).forEach (featureResolver ::resolveDirectory );
81
- request .getSelectorsByType (UniqueIdSelector .class ).forEach (featureResolver ::resolveUniqueId );
82
- request .getSelectorsByType (UriSelector .class ).forEach (featureResolver ::resolveUri );
62
+ resolver .resolve (request , engineDescriptor );
83
63
}
84
64
85
- private void filter (TestDescriptor engineDescriptor , Predicate <String > packageFilter ) {
86
- applyPackagePredicate (packageFilter , engineDescriptor );
65
+ private static Predicate <String > getPackageFilter (EngineDiscoveryRequest request ) {
66
+ // TODO: Move into JUnit.
67
+ return composeFilters (request .getFiltersByType (PackageNameFilter .class )).toPredicate ();
87
68
}
88
69
89
- private void pruneTree (TestDescriptor rootDescriptor ) {
90
- rootDescriptor .accept (TestDescriptor ::prune );
91
- }
70
+ private static class CucumberFeaturesPropertyDiscoveryRequest implements EngineDiscoveryRequest {
92
71
93
- private void applyPackagePredicate (Predicate <String > packageFilter , TestDescriptor engineDescriptor ) {
94
- engineDescriptor .accept (descriptor -> {
95
- if (descriptor instanceof PickleDescriptor ) {
96
- PickleDescriptor pickleDescriptor = (PickleDescriptor ) descriptor ;
97
- if (!includePickle (pickleDescriptor , packageFilter )) {
98
- descriptor .removeFromHierarchy ();
99
- }
100
- }
101
- });
102
- }
72
+ private final EngineDiscoveryRequest delegate ;
73
+ private final Set <? extends DiscoverySelector > selectors ;
74
+
75
+ public CucumberFeaturesPropertyDiscoveryRequest (
76
+ EngineDiscoveryRequest delegate ,
77
+ Set <? extends DiscoverySelector > selectors
78
+ ) {
79
+ this .delegate = delegate ;
80
+ this .selectors = selectors ;
81
+ }
82
+
83
+ @ Override
84
+ public <T extends DiscoverySelector > List <T > getSelectorsByType (Class <T > selectorType ) {
85
+ Objects .requireNonNull (selectorType );
86
+ return this .selectors .stream ().filter (selectorType ::isInstance ).map (selectorType ::cast ).collect (toList ());
87
+ }
88
+
89
+ @ Override
90
+ public <T extends DiscoveryFilter <?>> List <T > getFiltersByType (Class <T > filterType ) {
91
+ return delegate .getFiltersByType (filterType );
92
+ }
103
93
104
- private boolean includePickle ( PickleDescriptor pickleDescriptor , Predicate < String > packageFilter ) {
105
- return pickleDescriptor . getPackage ()
106
- . map ( packageFilter :: test )
107
- . orElse ( true );
94
+ @ Override
95
+ public ConfigurationParameters getConfigurationParameters () {
96
+ return delegate . getConfigurationParameters ();
97
+ }
108
98
}
109
99
110
100
}
0 commit comments