Skip to content

Commit 3489f76

Browse files
Accept multiple values for all --select ConsoleLauncher options
1 parent 35d3dd7 commit 3489f76

File tree

3 files changed

+41
-28
lines changed

3 files changed

+41
-28
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
@@ -31,6 +31,7 @@ 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+
* `ConsoleLauncher` now accepts multiple values for all `--select` options.
3435

3536

3637
[[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 & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,79 +69,81 @@ 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, description = "Select a file for test discovery. This option can be repeated.")
8081
private final List<FileSelector> selectedFiles = new ArrayList<>();
8182

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

8587
@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.")
88+
"--select-directory" }, paramLabel = "DIR", arity = "1..*", converter = SelectorConverter.Directory.class, description = "Select a directory for test discovery. This option can be repeated.")
8789
private final List<DirectorySelector> selectedDirectories = new ArrayList<>();
8890

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

9395
@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.")
96+
"--select-module" }, paramLabel = "NAME", arity = "1..*", converter = SelectorConverter.Module.class, description = "Select single module for test discovery. This option can be repeated.")
9597
private final List<ModuleSelector> selectedModules = new ArrayList<>();
9698

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

101103
@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.")
104+
"--select-package" }, paramLabel = "PKG", arity = "1..*", converter = SelectorConverter.Package.class, description = "Select a package for test discovery. This option can be repeated.")
103105
private final List<PackageSelector> selectedPackages = new ArrayList<>();
104106

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

109111
@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.")
112+
"--select-class" }, paramLabel = "CLASS", arity = "1..*", converter = SelectorConverter.Class.class, description = "Select a class for test discovery. This option can be repeated.")
111113
private final List<ClassSelector> selectedClasses = new ArrayList<>();
112114

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

117119
@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.")
120+
"--select-method" }, paramLabel = "NAME", arity = "1..*", converter = SelectorConverter.Method.class, description = "Select a method for test discovery. This option can be repeated.")
119121
private final List<MethodSelector> selectedMethods = new ArrayList<>();
120122

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

125127
@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.")
128+
"--select-resource" }, paramLabel = "RESOURCE", arity = "1..*", converter = SelectorConverter.ClasspathResource.class, description = "Select a classpath resource for test discovery. This option can be repeated.")
127129
private final List<ClasspathResourceSelector> selectedClasspathResources = new ArrayList<>();
128130

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

133135
@Option(names = { "-i",
134-
"--select-iteration" }, paramLabel = "PREFIX:VALUE[INDEX(..INDEX)?(,INDEX(..INDEX)?)*]", arity = "1", converter = SelectorConverter.Iteration.class, //
136+
"--select-iteration" }, paramLabel = "PREFIX:VALUE[INDEX(..INDEX)?(,INDEX(..INDEX)?)*]", arity = "1..*", converter = SelectorConverter.Iteration.class, //
135137
description = "Select iterations for test discovery via a prefixed identifier and a list of indexes or index ranges "
136138
+ "(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). "
137139
+ "This option can be repeated.")
138140
private final List<IterationSelector> selectedIterations = new ArrayList<>();
139141

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

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

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,8 @@ void parseValidUriSelectors(ArgsType type) {
361361
() -> assertEquals(List.of(selectUri("file:///foo.txt")), type.parseArgLine("-select-uri=file:///foo.txt").discovery.getSelectedUris()),
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()),
364-
() -> assertEquals(List.of(selectUri("file:///foo.txt"), selectUri("https://example")), type.parseArgLine("-u file:///foo.txt -u https://example").discovery.getSelectedUris())
364+
() -> 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 https://example").discovery.getSelectedUris())
365366
);
366367
// @formatter:on
367368
}
@@ -382,7 +383,8 @@ void parseValidFileSelectors(ArgsType type) {
382383
() -> assertEquals(List.of(selectFile("foo.txt")), type.parseArgLine("-select-file=foo.txt").discovery.getSelectedFiles()),
383384
() -> assertEquals(List.of(selectFile("foo.txt")), type.parseArgLine("--select-file foo.txt").discovery.getSelectedFiles()),
384385
() -> assertEquals(List.of(selectFile("foo.txt")), type.parseArgLine("--select-file=foo.txt").discovery.getSelectedFiles()),
385-
() -> assertEquals(List.of(selectFile("foo.txt"), selectFile("bar.csv")), type.parseArgLine("-f foo.txt -f bar.csv").discovery.getSelectedFiles())
386+
() -> assertEquals(List.of(selectFile("foo.txt"), selectFile("bar.csv")), type.parseArgLine("-f foo.txt -f bar.csv").discovery.getSelectedFiles()),
387+
() -> assertEquals(List.of(selectFile("foo.txt"), selectFile("bar.csv")), type.parseArgLine("-f foo.txt bar.csv").discovery.getSelectedFiles())
386388
);
387389
// @formatter:on
388390
}
@@ -403,7 +405,8 @@ void parseValidDirectorySelectors(ArgsType type) {
403405
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("-select-directory=foo/bar").discovery.getSelectedDirectories()),
404406
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("--select-directory foo/bar").discovery.getSelectedDirectories()),
405407
() -> assertEquals(List.of(selectDirectory("foo/bar")), type.parseArgLine("--select-directory=foo/bar").discovery.getSelectedDirectories()),
406-
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar -d bar/qux").discovery.getSelectedDirectories())
408+
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar -d bar/qux").discovery.getSelectedDirectories()),
409+
() -> assertEquals(List.of(selectDirectory("foo/bar"), selectDirectory("bar/qux")), type.parseArgLine("-d foo/bar bar/qux").discovery.getSelectedDirectories())
407410
);
408411
// @formatter:on
409412
}
@@ -424,7 +427,8 @@ void parseValidModuleSelectors(ArgsType type) {
424427
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("-select-module=com.acme.foo").discovery.getSelectedModules()),
425428
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("--select-module com.acme.foo").discovery.getSelectedModules()),
426429
() -> assertEquals(List.of(selectModule("com.acme.foo")), type.parseArgLine("--select-module=com.acme.foo").discovery.getSelectedModules()),
427-
() -> assertEquals(List.of(selectModule("com.acme.foo"), selectModule("com.example.bar")), type.parseArgLine("-o com.acme.foo -o com.example.bar").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()),
431+
() -> assertEquals(List.of(selectModule("com.acme.foo"), selectModule("com.example.bar")), type.parseArgLine("-o com.acme.foo com.example.bar").discovery.getSelectedModules())
428432
);
429433
// @formatter:on
430434
}
@@ -445,7 +449,8 @@ void parseValidPackageSelectors(ArgsType type) {
445449
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("-select-package=com.acme.foo").discovery.getSelectedPackages()),
446450
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("--select-package com.acme.foo").discovery.getSelectedPackages()),
447451
() -> assertEquals(List.of(selectPackage("com.acme.foo")), type.parseArgLine("--select-package=com.acme.foo").discovery.getSelectedPackages()),
448-
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo -p com.example.bar").discovery.getSelectedPackages())
452+
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo -p com.example.bar").discovery.getSelectedPackages()),
453+
() -> assertEquals(List.of(selectPackage("com.acme.foo"), selectPackage("com.example.bar")), type.parseArgLine("-p com.acme.foo com.example.bar").discovery.getSelectedPackages())
449454
);
450455
// @formatter:on
451456
}
@@ -466,7 +471,8 @@ void parseValidClassSelectors(ArgsType type) {
466471
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("-select-class=com.acme.Foo").discovery.getSelectedClasses()),
467472
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("--select-class com.acme.Foo").discovery.getSelectedClasses()),
468473
() -> assertEquals(List.of(selectClass("com.acme.Foo")), type.parseArgLine("--select-class=com.acme.Foo").discovery.getSelectedClasses()),
469-
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo -c com.example.Bar").discovery.getSelectedClasses())
474+
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo -c com.example.Bar").discovery.getSelectedClasses()),
475+
() -> assertEquals(List.of(selectClass("com.acme.Foo"), selectClass("com.example.Bar")), type.parseArgLine("-c com.acme.Foo com.example.Bar").discovery.getSelectedClasses())
470476
);
471477
// @formatter:on
472478
}
@@ -488,7 +494,9 @@ void parseValidMethodSelectors(ArgsType type) {
488494
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()")), type.parseArgLine("--select-method com.acme.Foo#m()").discovery.getSelectedMethods()),
489495
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()")), type.parseArgLine("--select-method=com.acme.Foo#m()").discovery.getSelectedMethods()),
490496
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()"), selectMethod("com.example.Bar#method(java.lang.Object)")),
491-
type.parseArgLine("-m com.acme.Foo#m() -m com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods())
497+
type.parseArgLine("-m com.acme.Foo#m() -m com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods()),
498+
() -> assertEquals(List.of(selectMethod("com.acme.Foo#m()"), selectMethod("com.example.Bar#method(java.lang.Object)")),
499+
type.parseArgLine("-m com.acme.Foo#m() com.example.Bar#method(java.lang.Object)").discovery.getSelectedMethods())
492500
);
493501
// @formatter:on
494502
}
@@ -509,7 +517,8 @@ void parseValidClasspathResourceSelectors(ArgsType type) {
509517
() -> assertEquals(List.of(selectClasspathResource("/foo.csv")), type.parseArgLine("-select-resource=/foo.csv").discovery.getSelectedClasspathResources()),
510518
() -> assertEquals(List.of(selectClasspathResource("/foo.csv")), type.parseArgLine("--select-resource /foo.csv").discovery.getSelectedClasspathResources()),
511519
() -> assertEquals(List.of(selectClasspathResource("/foo.csv")), type.parseArgLine("--select-resource=/foo.csv").discovery.getSelectedClasspathResources()),
512-
() -> assertEquals(List.of(selectClasspathResource("/foo.csv"), selectClasspathResource("bar.json")), type.parseArgLine("-r /foo.csv -r bar.json").discovery.getSelectedClasspathResources())
520+
() -> assertEquals(List.of(selectClasspathResource("/foo.csv"), selectClasspathResource("bar.json")), type.parseArgLine("-r /foo.csv -r bar.json").discovery.getSelectedClasspathResources()),
521+
() -> assertEquals(List.of(selectClasspathResource("/foo.csv"), selectClasspathResource("bar.json")), type.parseArgLine("-r /foo.csv bar.json").discovery.getSelectedClasspathResources())
513522
);
514523
// @formatter:on
515524
}
@@ -530,7 +539,8 @@ void parseValidIterationSelectors(ArgsType type) {
530539
() -> assertEquals(List.of(selectIteration(selectPackage("com.acme.foo"), 3)), type.parseArgLine("-select-iteration=package:com.acme.foo[3]").discovery.getSelectedIterations()),
531540
() -> 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()),
532541
() -> assertEquals(List.of(selectIteration(selectDirectory("foo/bar"), 1, 5)), type.parseArgLine("--select-iteration=directory:foo/bar[1,5]").discovery.getSelectedIterations()),
533-
() -> 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())
542+
() -> 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()),
543+
() -> 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())
534544
);
535545
// @formatter:on
536546
}

0 commit comments

Comments
 (0)