Skip to content

Commit b117b69

Browse files
authored
Merge branch 'main' into argument-count-validation-mode
2 parents beb53ab + 35e5126 commit b117b69

File tree

7 files changed

+76
-36
lines changed

7 files changed

+76
-36
lines changed

documentation/src/docs/asciidoc/release-notes/release-notes-5.12.0-M1.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ JUnit repository on GitHub.
3131
calling the internal `ReflectionUtils.makeAccessible(Field)` method directly.
3232
* Support both the primitive type `void` and the wrapper type `Void` in the internal
3333
`ReflectionUtils` to allow `String` to `Class` conversion in parameterized tests.
34+
* Add support for passing line and column number to `ConsoleLauncher` via
35+
`--select-file` and `--select-resource`.
36+
* `ConsoleLauncher` now accepts multiple values for all `--select` options.
3437

3538

3639
[[release-notes-5.12.0-M1-junit-jupiter]]

junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/ResourceUtils.java renamed to junit-platform-commons/src/main/java/org/junit/platform/commons/util/ResourceUtils.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
* https://www.eclipse.org/legal/epl-v20.html
99
*/
1010

11-
package org.junit.platform.engine.support.descriptor;
11+
package org.junit.platform.commons.util;
12+
13+
import static org.apiguardian.api.API.Status.INTERNAL;
1214

1315
import java.net.URI;
1416

15-
import org.junit.platform.commons.util.Preconditions;
16-
import org.junit.platform.commons.util.StringUtils;
17+
import org.apiguardian.api.API;
1718

1819
/**
1920
* Collection of static utility methods for working with resources.
2021
*
21-
* @since 1.3
22+
* @since 1.3 (originally in org.junit.platform.engine.support.descriptor)
2223
*/
23-
final class ResourceUtils {
24+
@API(status = INTERNAL, since = "1.12")
25+
public final class ResourceUtils {
2426

2527
private ResourceUtils() {
2628
/* no-op */
@@ -33,8 +35,10 @@ private ResourceUtils() {
3335
* @param uri the {@code URI} from which to strip the query component
3436
* @return a new {@code URI} with the query component removed, or the
3537
* original {@code URI} unmodified if it does not have a query component
38+
*
39+
* @since 1.3
3640
*/
37-
static URI stripQueryComponent(URI uri) {
41+
public static URI stripQueryComponent(URI uri) {
3842
Preconditions.notNull(uri, "URI must not be null");
3943

4044
if (StringUtils.isBlank(uri.getQuery())) {

junit-platform-console/src/main/java/org/junit/platform/console/options/SelectorConverter.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
2020
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUri;
2121

22+
import java.net.URI;
23+
2224
import org.junit.platform.commons.PreconditionViolationException;
25+
import org.junit.platform.commons.util.ResourceUtils;
2326
import org.junit.platform.engine.DiscoverySelectorIdentifier;
2427
import org.junit.platform.engine.discovery.ClassSelector;
2528
import org.junit.platform.engine.discovery.ClasspathResourceSelector;
2629
import org.junit.platform.engine.discovery.DirectorySelector;
2730
import org.junit.platform.engine.discovery.DiscoverySelectors;
31+
import org.junit.platform.engine.discovery.FilePosition;
2832
import org.junit.platform.engine.discovery.FileSelector;
2933
import org.junit.platform.engine.discovery.IterationSelector;
3034
import org.junit.platform.engine.discovery.MethodSelector;
@@ -53,8 +57,12 @@ public UriSelector convert(String value) {
5357
static class File implements ITypeConverter<FileSelector> {
5458
@Override
5559
public FileSelector convert(String value) {
56-
return selectFile(value);
60+
URI uri = URI.create(value);
61+
String path = ResourceUtils.stripQueryComponent(uri).getPath();
62+
FilePosition filePosition = FilePosition.fromQuery(uri.getQuery()).orElse(null);
63+
return selectFile(path, filePosition);
5764
}
65+
5866
}
5967

6068
static class Directory implements ITypeConverter<DirectorySelector> {
@@ -88,7 +96,10 @@ public MethodSelector convert(String value) {
8896
static class ClasspathResource implements ITypeConverter<ClasspathResourceSelector> {
8997
@Override
9098
public ClasspathResourceSelector convert(String value) {
91-
return selectClasspathResource(value);
99+
URI uri = URI.create(value);
100+
String path = ResourceUtils.stripQueryComponent(uri).getPath();
101+
FilePosition filePosition = FilePosition.fromQuery(uri.getQuery()).orElse(null);
102+
return selectClasspathResource(path, filePosition);
92103
}
93104
}
94105

junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptionsMixin.java

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,79 +69,84 @@ static class SelectorOptions {
6969
private boolean scanModulepath2;
7070

7171
@Option(names = { "-u",
72-
"--select-uri" }, paramLabel = "URI", arity = "1", converter = SelectorConverter.Uri.class, description = "Select a URI for test discovery. This option can be repeated.")
72+
"--select-uri" }, paramLabel = "URI", arity = "1..*", converter = SelectorConverter.Uri.class, description = "Select a URI for test discovery. This option can be repeated.")
7373
private final List<UriSelector> selectedUris = new ArrayList<>();
7474

75-
@Option(names = { "--u", "-select-uri" }, arity = "1", hidden = true, converter = SelectorConverter.Uri.class)
75+
@Option(names = { "--u",
76+
"-select-uri" }, arity = "1..*", hidden = true, converter = SelectorConverter.Uri.class)
7677
private final List<UriSelector> selectedUris2 = new ArrayList<>();
7778

7879
@Option(names = { "-f",
79-
"--select-file" }, paramLabel = "FILE", arity = "1", converter = SelectorConverter.File.class, description = "Select a file for test discovery. This option can be repeated.")
80+
"--select-file" }, paramLabel = "FILE", arity = "1..*", converter = SelectorConverter.File.class, //
81+
description = "Select a file for test discovery. "
82+
+ "The line and column numbers can be provided as URI query parameters (e.g. foo.txt?line=12&column=34). "
83+
+ "This option can be repeated.")
8084
private final List<FileSelector> selectedFiles = new ArrayList<>();
8185

82-
@Option(names = { "--f", "-select-file" }, arity = "1", hidden = true, converter = SelectorConverter.File.class)
86+
@Option(names = { "--f",
87+
"-select-file" }, arity = "1..*", hidden = true, converter = SelectorConverter.File.class)
8388
private final List<FileSelector> selectedFiles2 = new ArrayList<>();
8489

8590
@Option(names = { "-d",
86-
"--select-directory" }, paramLabel = "DIR", arity = "1", converter = SelectorConverter.Directory.class, description = "Select a directory for test discovery. This option can be repeated.")
91+
"--select-directory" }, paramLabel = "DIR", arity = "1..*", converter = SelectorConverter.Directory.class, description = "Select a directory for test discovery. This option can be repeated.")
8792
private final List<DirectorySelector> selectedDirectories = new ArrayList<>();
8893

8994
@Option(names = { "--d",
90-
"-select-directory" }, arity = "1", hidden = true, converter = SelectorConverter.Directory.class)
95+
"-select-directory" }, arity = "1..*", hidden = true, converter = SelectorConverter.Directory.class)
9196
private final List<DirectorySelector> selectedDirectories2 = new ArrayList<>();
9297

9398
@Option(names = { "-o",
94-
"--select-module" }, paramLabel = "NAME", arity = "1", converter = SelectorConverter.Module.class, description = "Select single module for test discovery. This option can be repeated.")
99+
"--select-module" }, paramLabel = "NAME", arity = "1..*", converter = SelectorConverter.Module.class, description = "Select single module for test discovery. This option can be repeated.")
95100
private final List<ModuleSelector> selectedModules = new ArrayList<>();
96101

97102
@Option(names = { "--o",
98-
"-select-module" }, arity = "1", converter = SelectorConverter.Module.class, hidden = true)
103+
"-select-module" }, arity = "1..*", converter = SelectorConverter.Module.class, hidden = true)
99104
private final List<ModuleSelector> selectedModules2 = new ArrayList<>();
100105

101106
@Option(names = { "-p",
102-
"--select-package" }, paramLabel = "PKG", arity = "1", converter = SelectorConverter.Package.class, description = "Select a package for test discovery. This option can be repeated.")
107+
"--select-package" }, paramLabel = "PKG", arity = "1..*", converter = SelectorConverter.Package.class, description = "Select a package for test discovery. This option can be repeated.")
103108
private final List<PackageSelector> selectedPackages = new ArrayList<>();
104109

105110
@Option(names = { "--p",
106-
"-select-package" }, arity = "1", hidden = true, converter = SelectorConverter.Package.class)
111+
"-select-package" }, arity = "1..*", hidden = true, converter = SelectorConverter.Package.class)
107112
private final List<PackageSelector> selectedPackages2 = new ArrayList<>();
108113

109114
@Option(names = { "-c",
110-
"--select-class" }, paramLabel = "CLASS", arity = "1", converter = SelectorConverter.Class.class, description = "Select a class for test discovery. This option can be repeated.")
115+
"--select-class" }, paramLabel = "CLASS", arity = "1..*", converter = SelectorConverter.Class.class, description = "Select a class for test discovery. This option can be repeated.")
111116
private final List<ClassSelector> selectedClasses = new ArrayList<>();
112117

113118
@Option(names = { "--c",
114-
"-select-class" }, arity = "1", hidden = true, converter = SelectorConverter.Class.class)
119+
"-select-class" }, arity = "1..*", hidden = true, converter = SelectorConverter.Class.class)
115120
private final List<ClassSelector> selectedClasses2 = new ArrayList<>();
116121

117122
@Option(names = { "-m",
118-
"--select-method" }, paramLabel = "NAME", arity = "1", converter = SelectorConverter.Method.class, description = "Select a method for test discovery. This option can be repeated.")
123+
"--select-method" }, paramLabel = "NAME", arity = "1..*", converter = SelectorConverter.Method.class, description = "Select a method for test discovery. This option can be repeated.")
119124
private final List<MethodSelector> selectedMethods = new ArrayList<>();
120125

121126
@Option(names = { "--m",
122-
"-select-method" }, arity = "1", hidden = true, converter = SelectorConverter.Method.class)
127+
"-select-method" }, arity = "1..*", hidden = true, converter = SelectorConverter.Method.class)
123128
private final List<MethodSelector> selectedMethods2 = new ArrayList<>();
124129

125130
@Option(names = { "-r",
126-
"--select-resource" }, paramLabel = "RESOURCE", arity = "1", converter = SelectorConverter.ClasspathResource.class, description = "Select a classpath resource for test discovery. This option can be repeated.")
131+
"--select-resource" }, paramLabel = "RESOURCE", arity = "1..*", converter = SelectorConverter.ClasspathResource.class, description = "Select a classpath resource for test discovery. This option can be repeated.")
127132
private final List<ClasspathResourceSelector> selectedClasspathResources = new ArrayList<>();
128133

129134
@Option(names = { "--r",
130-
"-select-resource" }, arity = "1", hidden = true, converter = SelectorConverter.ClasspathResource.class)
135+
"-select-resource" }, arity = "1..*", hidden = true, converter = SelectorConverter.ClasspathResource.class)
131136
private final List<ClasspathResourceSelector> selectedClasspathResources2 = new ArrayList<>();
132137

133138
@Option(names = { "-i",
134-
"--select-iteration" }, paramLabel = "PREFIX:VALUE[INDEX(..INDEX)?(,INDEX(..INDEX)?)*]", arity = "1", converter = SelectorConverter.Iteration.class, //
139+
"--select-iteration" }, paramLabel = "PREFIX:VALUE[INDEX(..INDEX)?(,INDEX(..INDEX)?)*]", arity = "1..*", converter = SelectorConverter.Iteration.class, //
135140
description = "Select iterations for test discovery via a prefixed identifier and a list of indexes or index ranges "
136141
+ "(e.g. method:com.acme.Foo#m()[1..2] selects the first and second iteration of the m() method in the com.acme.Foo class). "
137142
+ "This option can be repeated.")
138143
private final List<IterationSelector> selectedIterations = new ArrayList<>();
139144

140145
@Option(names = { "--i",
141-
"-select-iteration" }, arity = "1", hidden = true, converter = SelectorConverter.Iteration.class)
146+
"-select-iteration" }, arity = "1..*", hidden = true, converter = SelectorConverter.Iteration.class)
142147
private final List<IterationSelector> selectedIterations2 = new ArrayList<>();
143148

144-
@Option(names = "--select", paramLabel = "PREFIX:VALUE", arity = "1", converter = SelectorConverter.Identifier.class, //
149+
@Option(names = "--select", paramLabel = "PREFIX:VALUE", arity = "1..*", converter = SelectorConverter.Identifier.class, //
145150
description = "Select via a prefixed identifier (e.g. method:com.acme.Foo#m selects the m() method in the com.acme.Foo class). "
146151
+ "This option can be repeated.")
147152
private final List<DiscoverySelectorIdentifier> selectorIdentifiers = new ArrayList<>();

junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/ClasspathResourceSource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apiguardian.api.API;
2020
import org.junit.platform.commons.PreconditionViolationException;
2121
import org.junit.platform.commons.util.Preconditions;
22+
import org.junit.platform.commons.util.ResourceUtils;
2223
import org.junit.platform.commons.util.ToStringBuilder;
2324
import org.junit.platform.engine.TestSource;
2425

junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/UriSource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apiguardian.api.API;
2121
import org.junit.platform.commons.logging.LoggerFactory;
2222
import org.junit.platform.commons.util.Preconditions;
23+
import org.junit.platform.commons.util.ResourceUtils;
2324
import org.junit.platform.engine.TestSource;
2425

2526
/**

0 commit comments

Comments
 (0)