Skip to content

Commit 35e5126

Browse files
Accept multiple values for all --select ConsoleLauncher options
Resolves #3485.
1 parent f37db92 commit 35e5126

File tree

3 files changed

+39
-29
lines changed

3 files changed

+39
-29
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ JUnit repository on GitHub.
3333
`ReflectionUtils` to allow `String` to `Class` conversion in parameterized tests.
3434
* Add support for passing line and column number to `ConsoleLauncher` via
3535
`--select-file` and `--select-resource`.
36+
* `ConsoleLauncher` now accepts multiple values for all `--select` options.
3637

3738

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

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

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,85 +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, //
80+
"--select-file" }, paramLabel = "FILE", arity = "1..*", converter = SelectorConverter.File.class, //
8081
description = "Select a file for test discovery. "
8182
+ "The line and column numbers can be provided as URI query parameters (e.g. foo.txt?line=12&column=34). "
8283
+ "This option can be repeated.")
8384
private final List<FileSelector> selectedFiles = new ArrayList<>();
8485

85-
@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)
8688
private final List<FileSelector> selectedFiles2 = new ArrayList<>();
8789

8890
@Option(names = { "-d",
89-
"--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.")
9092
private final List<DirectorySelector> selectedDirectories = new ArrayList<>();
9193

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

9698
@Option(names = { "-o",
97-
"--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.")
98100
private final List<ModuleSelector> selectedModules = new ArrayList<>();
99101

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

104106
@Option(names = { "-p",
105-
"--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.")
106108
private final List<PackageSelector> selectedPackages = new ArrayList<>();
107109

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

112114
@Option(names = { "-c",
113-
"--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.")
114116
private final List<ClassSelector> selectedClasses = new ArrayList<>();
115117

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

120122
@Option(names = { "-m",
121-
"--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.")
122124
private final List<MethodSelector> selectedMethods = new ArrayList<>();
123125

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

128130
@Option(names = { "-r",
129-
"--select-resource" }, paramLabel = "RESOURCE", arity = "1", converter = SelectorConverter.ClasspathResource.class, //
130-
description = "Select a classpath resource for test discovery. "
131-
+ "The line and column numbers can be provided as URI query parameters (e.g. foo.csv?line=12&column=34). "
132-
+ "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.")
133132
private final List<ClasspathResourceSelector> selectedClasspathResources = new ArrayList<>();
134133

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

139138
@Option(names = { "-i",
140-
"--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, //
141140
description = "Select iterations for test discovery via a prefixed identifier and a list of indexes or index ranges "
142141
+ "(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). "
143142
+ "This option can be repeated.")
144143
private final List<IterationSelector> selectedIterations = new ArrayList<>();
145144

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

150-
@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, //
151150
description = "Select via a prefixed identifier (e.g. method:com.acme.Foo#m selects the m() method in the com.acme.Foo class). "
152151
+ "This option can be repeated.")
153152
private final List<DiscoverySelectorIdentifier> selectorIdentifiers = new ArrayList<>();

platform-tests/src/test/java/org/junit/platform/console/options/CommandLineOptionsParsingTests.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,8 @@ void parseValidUriSelectors(ArgsType type) {
362362
() -> assertEquals(List.of(selectUri("file:///foo.txt")), type.parseArgLine("-select-uri=file:///foo.txt").discovery.getSelectedUris()),
363363
() -> assertEquals(List.of(selectUri("file:///foo.txt")), type.parseArgLine("--select-uri file:///foo.txt").discovery.getSelectedUris()),
364364
() -> assertEquals(List.of(selectUri("file:///foo.txt")), type.parseArgLine("--select-uri=file:///foo.txt").discovery.getSelectedUris()),
365-
() -> assertEquals(List.of(selectUri("file:///foo.txt"), selectUri("https://example")), type.parseArgLine("-u file:///foo.txt -u https://example").discovery.getSelectedUris())
365+
() -> assertEquals(List.of(selectUri("file:///foo.txt"), selectUri("https://example")), type.parseArgLine("-u file:///foo.txt -u https://example").discovery.getSelectedUris()),
366+
() -> assertEquals(List.of(selectUri("file:///foo.txt"), selectUri("https://example")), type.parseArgLine("-u file:///foo.txt https://example").discovery.getSelectedUris())
366367
);
367368
// @formatter:on
368369
}
@@ -384,6 +385,7 @@ void parseValidFileSelectors(ArgsType type) {
384385
() -> assertEquals(List.of(selectFile("foo.txt")), type.parseArgLine("--select-file foo.txt").discovery.getSelectedFiles()),
385386
() -> assertEquals(List.of(selectFile("foo.txt")), type.parseArgLine("--select-file=foo.txt").discovery.getSelectedFiles()),
386387
() -> assertEquals(List.of(selectFile("foo.txt"), selectFile("bar.csv")), type.parseArgLine("-f foo.txt -f bar.csv").discovery.getSelectedFiles()),
388+
() -> assertEquals(List.of(selectFile("foo.txt"), selectFile("bar.csv")), type.parseArgLine("-f foo.txt bar.csv").discovery.getSelectedFiles()),
387389
() -> assertEquals(List.of(selectFile("foo.txt", FilePosition.from(5))), type.parseArgLine("-f foo.txt?line=5").discovery.getSelectedFiles()),
388390
() -> assertEquals(List.of(selectFile("foo.txt", FilePosition.from(12, 34))), type.parseArgLine("-f foo.txt?line=12&column=34").discovery.getSelectedFiles())
389391
);
@@ -406,7 +408,8 @@ void parseValidDirectorySelectors(ArgsType type) {
406408
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("-select-directory=foo/bar").discovery.getSelectedDirectories()),
407409
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("--select-directory foo/bar").discovery.getSelectedDirectories()),
408410
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("--select-directory=foo/bar").discovery.getSelectedDirectories()),
409-
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar -d bar/qux").discovery.getSelectedDirectories())
411+
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar -d bar/qux").discovery.getSelectedDirectories()),
412+
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar bar/qux").discovery.getSelectedDirectories())
410413
);
411414
// @formatter:on
412415
}
@@ -427,7 +430,8 @@ void parseValidModuleSelectors(ArgsType type) {
427430
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("-select-module=com.acme.foo").discovery.getSelectedModules()),
428431
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("--select-module com.acme.foo").discovery.getSelectedModules()),
429432
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("--select-module=com.acme.foo").discovery.getSelectedModules()),
430-
() -> assertEquals(List.of(selectModule("com.acme.foo"), selectModule("com.example.bar")), type.parseArgLine("-o com.acme.foo -o com.example.bar").discovery.getSelectedModules())
433+
() -> assertEquals(List.of(selectModule("com.acme.foo"), selectModule("com.example.bar")), type.parseArgLine("-o com.acme.foo -o com.example.bar").discovery.getSelectedModules()),
434+
() -> assertEquals(List.of(selectModule("com.acme.foo"), selectModule("com.example.bar")), type.parseArgLine("-o com.acme.foo com.example.bar").discovery.getSelectedModules())
431435
);
432436
// @formatter:on
433437
}
@@ -448,7 +452,8 @@ void parseValidPackageSelectors(ArgsType type) {
448452
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("-select-package=com.acme.foo").discovery.getSelectedPackages()),
449453
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("--select-package com.acme.foo").discovery.getSelectedPackages()),
450454
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("--select-package=com.acme.foo").discovery.getSelectedPackages()),
451-
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo -p com.example.bar").discovery.getSelectedPackages())
455+
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo -p com.example.bar").discovery.getSelectedPackages()),
456+
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo com.example.bar").discovery.getSelectedPackages())
452457
);
453458
// @formatter:on
454459
}
@@ -469,7 +474,8 @@ void parseValidClassSelectors(ArgsType type) {
469474
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("-select-class=com.acme.Foo").discovery.getSelectedClasses()),
470475
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("--select-class com.acme.Foo").discovery.getSelectedClasses()),
471476
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("--select-class=com.acme.Foo").discovery.getSelectedClasses()),
472-
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo -c com.example.Bar").discovery.getSelectedClasses())
477+
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo -c com.example.Bar").discovery.getSelectedClasses()),
478+
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo com.example.Bar").discovery.getSelectedClasses())
473479
);
474480
// @formatter:on
475481
}
@@ -491,7 +497,9 @@ void parseValidMethodSelectors(ArgsType type) {
491497
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()")), type.parseArgLine("--select-method com.acme.Foo#m()").discovery.getSelectedMethods()),
492498
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()")), type.parseArgLine("--select-method=com.acme.Foo#m()").discovery.getSelectedMethods()),
493499
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()"), selectMethod("com.example.Bar#method(java.lang.Object)")),
494-
type.parseArgLine("-m com.acme.Foo#m() -m com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods())
500+
type.parseArgLine("-m com.acme.Foo#m() -m com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods()),
501+
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()"), selectMethod("com.example.Bar#method(java.lang.Object)")),
502+
type.parseArgLine("-m com.acme.Foo#m() com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods())
495503
);
496504
// @formatter:on
497505
}
@@ -513,6 +521,7 @@ void parseValidClasspathResourceSelectors(ArgsType type) {
513521
() -> assertEquals(List.of(selectClasspathResource("/foo.csv")), type.parseArgLine("--select-resource /foo.csv").discovery.getSelectedClasspathResources()),
514522
() -> assertEquals(List.of(selectClasspathResource("/foo.csv")), type.parseArgLine("--select-resource=/foo.csv").discovery.getSelectedClasspathResources()),
515523
() -> assertEquals(List.of(selectClasspathResource("/foo.csv"), selectClasspathResource("bar.json")), type.parseArgLine("-r /foo.csv -r bar.json").discovery.getSelectedClasspathResources()),
524+
() -> assertEquals(List.of(selectClasspathResource("/foo.csv"), selectClasspathResource("bar.json")), type.parseArgLine("-r /foo.csv bar.json").discovery.getSelectedClasspathResources()),
516525
() -> assertEquals(List.of(selectClasspathResource("/foo.csv", FilePosition.from(5))), type.parseArgLine("-r /foo.csv?line=5").discovery.getSelectedClasspathResources()),
517526
() -> assertEquals(List.of(selectClasspathResource("/foo.csv", FilePosition.from(12, 34))), type.parseArgLine("-r /foo.csv?line=12&column=34").discovery.getSelectedClasspathResources())
518527
);
@@ -535,7 +544,8 @@ void parseValidIterationSelectors(ArgsType type) {
535544
() -> assertEquals(List.of(selectIteration(selectPackage("com.acme.foo"), 3)), type.parseArgLine("-select-iteration=package:com.acme.foo[3]").discovery.getSelectedIterations()),
536545
() -> assertEquals(List.of(selectIteration(selectModule("com.acme.foo"), 0, 1, 2, 4, 5, 6)), type.parseArgLine("--select-iteration module:com.acme.foo[0..2,4..6]").discovery.getSelectedIterations()),
537546
() -> assertEquals(List.of(selectIteration(selectDirectory("foo/bar"), 1, 5)), type.parseArgLine("--select-iteration=directory:foo/bar[1,5]").discovery.getSelectedIterations()),
538-
() -> assertEquals(List.of(selectIteration(selectFile("foo.txt"), 6), selectIteration(selectUri("file:///foo.txt"), 7)), type.parseArgLine("-i file:foo.txt[6] -i uri:file:///foo.txt[7]").discovery.getSelectedIterations())
547+
() -> assertEquals(List.of(selectIteration(selectFile("foo.txt"), 6), selectIteration(selectUri("file:///foo.txt"), 7)), type.parseArgLine("-i file:foo.txt[6] -i uri:file:///foo.txt[7]").discovery.getSelectedIterations()),
548+
() -> assertEquals(List.of(selectIteration(selectFile("foo.txt"), 6), selectIteration(selectUri("file:///foo.txt"), 7)), type.parseArgLine("-i file:foo.txt[6] uri:file:///foo.txt[7]").discovery.getSelectedIterations())
539549
);
540550
// @formatter:on
541551
}

0 commit comments

Comments
 (0)