Skip to content

Commit e34c3e8

Browse files
authored
Test reporter fixes (#1597)
* Fix error message when an invalid test reporter is supplied in Gradle * Fix Gradle property name in docs * Fix Gradle property name in tasks * Introduce `TestReporter.default`, and use it in places where default is applied * Remove calls to `convention()`; this is not required because the input is optional anyways.
1 parent 3fbcd46 commit e34c3e8

10 files changed

Lines changed: 80 additions & 39 deletions

File tree

docs/modules/pkl-gradle/pages/index.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ Whether to ignore expected example files and generate them again.
323323
====
324324

325325
[[test-reporter]]
326-
.test-reporter: Property<String>
326+
.testReporter: Property<String>
327327
[%collapsible]
328328
====
329329
Default: `"spec"` +
@@ -686,7 +686,7 @@ Default: `false` +
686686
Whether to ignore expected example files and generate them again.
687687
====
688688

689-
.test-reporter: Property<String>
689+
.testReporter: Property<String>
690690
[%collapsible]
691691
====
692692
Default: `"spec"` +

pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/CliTestOptions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ class CliTestOptions(
2222
val overwrite: Boolean = false,
2323
val junitAggregateReports: Boolean = false,
2424
val junitAggregateSuiteName: String = "pkl-tests",
25-
val reporter: TestReporter = TestReporter.SPEC,
25+
val reporter: TestReporter = TestReporter.default,
2626
)

pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/TestReporter.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,9 @@ package org.pkl.commons.cli
1717

1818
enum class TestReporter {
1919
SPEC,
20-
MINIMAL,
20+
MINIMAL;
21+
22+
companion object {
23+
@JvmStatic val default: TestReporter = SPEC
24+
}
2125
}

pkl-commons-cli/src/main/kotlin/org/pkl/commons/cli/commands/TestOptions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class TestOptions : OptionGroup() {
5757
option(names = arrayOf("--test-reporter"), help = "Which test reporter to use for CLI output.")
5858
.enum<TestReporter> { it.name.lowercase() }
5959
.single()
60-
.default(TestReporter.SPEC)
60+
.default(TestReporter.default)
6161

6262
val cliTestOptions: CliTestOptions by lazy {
6363
CliTestOptions(

pkl-gradle/src/main/java/org/pkl/gradle/PklPlugin.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ private void configureProjectPackageTasks(
100100
spec.getOutputPath()
101101
.convention(project.getLayout().getBuildDirectory().dir("generated/pkl/packages"));
102102
spec.getOverwrite().convention(false);
103-
spec.getReporter().convention("spec");
104103
var packageTask = createTask(project, ProjectPackageTask.class, spec);
105104
packageTask.configure(
106105
task -> {
@@ -109,7 +108,7 @@ private void configureProjectPackageTasks(
109108
task.getSkipPublishCheck().set(spec.getSkipPublishCheck());
110109
task.getJunitReportsDir().set(spec.getJunitReportsDir());
111110
task.getOverwrite().set(spec.getOverwrite());
112-
task.getTestReporter().set(spec.getReporter());
111+
task.getTestReporter().set(spec.getTestReporter());
113112
});
114113
project
115114
.getPluginManager()
@@ -280,7 +279,6 @@ private void configureTestTasks(Project project, NamedDomainObjectContainer<Test
280279
configureBaseSpec(project, spec);
281280

282281
spec.getOverwrite().convention(false);
283-
spec.getTestReporter().convention("spec");
284282

285283
var testTask = createModulesTask(project, TestTask.class, spec);
286284
testTask.configure(

pkl-gradle/src/main/java/org/pkl/gradle/spec/ProjectPackageSpec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ public interface ProjectPackageSpec extends BasePklSpec {
3030

3131
Property<Boolean> getSkipPublishCheck();
3232

33-
Property<String> getReporter();
33+
Property<String> getTestReporter();
3434
}

pkl-gradle/src/main/java/org/pkl/gradle/task/ProjectPackageTask.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.pkl.gradle.task;
1717

1818
import static org.pkl.gradle.utils.PluginUtils.mapAndGetOrNull;
19+
import static org.pkl.gradle.utils.PluginUtils.toTestReporter;
1920

2021
import java.io.PrintWriter;
2122
import java.nio.file.Path;
@@ -34,7 +35,6 @@
3435
import org.gradle.api.tasks.UntrackedTask;
3536
import org.pkl.cli.CliProjectPackager;
3637
import org.pkl.commons.cli.CliTestOptions;
37-
import org.pkl.commons.cli.TestReporter;
3838

3939
@UntrackedTask(because = "Output names are known only after execution")
4040
public abstract class ProjectPackageTask extends BasePklTask {
@@ -80,18 +80,6 @@ protected void doRunTask() {
8080
if (projectDirectories.isEmpty()) {
8181
throw new InvalidUserDataException("No project directories specified.");
8282
}
83-
TestReporter testReporter;
84-
try {
85-
testReporter = TestReporter.valueOf(getTestReporter().getOrElse("SPEC").toUpperCase());
86-
} catch (IllegalArgumentException e) {
87-
throw new InvalidUserDataException(
88-
"Invalid reporter: '%s'. Valid reporter options: %s"
89-
.formatted(
90-
getTestReporter().get(),
91-
TestReporter.getEntries().stream()
92-
.map(it -> it.name().toLowerCase())
93-
.collect(Collectors.joining(", "))));
94-
}
9583

9684
new CliProjectPackager(
9785
getCliBaseOptions(),
@@ -101,7 +89,7 @@ protected void doRunTask() {
10189
getOverwrite().get(),
10290
getJunitAggregateReports().getOrElse(false),
10391
getJunitAggregateSuiteName().get(),
104-
testReporter),
92+
toTestReporter(getTestReporter())),
10593
getOutputPath().get().getAsFile().getAbsolutePath(),
10694
getSkipPublishCheck().getOrElse(false),
10795
new PrintWriter(System.out),

pkl-gradle/src/main/java/org/pkl/gradle/task/TestTask.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
package org.pkl.gradle.task;
1717

1818
import static org.pkl.gradle.utils.PluginUtils.mapAndGetOrNull;
19+
import static org.pkl.gradle.utils.PluginUtils.toTestReporter;
1920

2021
import java.io.PrintWriter;
21-
import java.util.stream.Collectors;
22-
import org.gradle.api.InvalidUserDataException;
2322
import org.gradle.api.file.DirectoryProperty;
2423
import org.gradle.api.provider.Property;
2524
import org.gradle.api.tasks.CacheableTask;
@@ -28,7 +27,6 @@
2827
import org.gradle.api.tasks.OutputDirectory;
2928
import org.pkl.cli.CliTestRunner;
3029
import org.pkl.commons.cli.CliTestOptions;
31-
import org.pkl.commons.cli.TestReporter;
3230

3331
@CacheableTask
3432
public abstract class TestTask extends ModulesTask {
@@ -57,26 +55,14 @@ public TestTask() {
5755

5856
@Override
5957
protected void doRunTask() {
60-
TestReporter testReporter;
61-
try {
62-
testReporter = TestReporter.valueOf(getTestReporter().getOrElse("SPEC").toUpperCase());
63-
} catch (IllegalArgumentException e) {
64-
throw new InvalidUserDataException(
65-
"Invalid reporter: '%s'. Valid reporter options: %s"
66-
.formatted(
67-
getTestReporter().get(),
68-
TestReporter.getEntries().stream()
69-
.map(it -> it.name().toLowerCase())
70-
.collect(Collectors.joining(", "))));
71-
}
7258
new CliTestRunner(
7359
getCliBaseOptions(),
7460
new CliTestOptions(
7561
mapAndGetOrNull(getJunitReportsDir(), it -> it.getAsFile().toPath()),
7662
getOverwrite().get(),
7763
getJunitAggregateReports().getOrElse(false),
7864
getJunitAggregateSuiteName().get(),
79-
testReporter),
65+
toTestReporter(getTestReporter())),
8066
new PrintWriter(System.out),
8167
new PrintWriter(System.err))
8268
.run();

pkl-gradle/src/main/java/org/pkl/gradle/utils/PluginUtils.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.gradle.api.file.RegularFile;
3232
import org.gradle.api.provider.Provider;
3333
import org.jspecify.annotations.Nullable;
34+
import org.pkl.commons.cli.TestReporter;
3435
import org.pkl.core.ImportGraph;
3536
import org.pkl.core.util.IoUtils;
3637

@@ -175,4 +176,31 @@ public static List<File> parseTransitiveFiles(RegularFile outputFile) {
175176
@Nullable T value = provider.getOrNull();
176177
return value == null ? null : f.apply(value);
177178
}
179+
180+
public static TestReporter toTestReporter(Provider<String> input) {
181+
var inputStr = input.getOrNull();
182+
if (inputStr == null) {
183+
return TestReporter.getDefault();
184+
}
185+
try {
186+
return TestReporter.valueOf(inputStr.toUpperCase());
187+
} catch (IllegalArgumentException e) {
188+
var sb = new StringBuilder("Invalid test reporter: '");
189+
sb.append(inputStr).append("'. ");
190+
sb.append("Valid reporters: ");
191+
var isFirst = true;
192+
// `enumEntries()` is not available in Kotlin versions below 1.8
193+
//noinspection EnumValuesSoftDeprecateInJava
194+
for (var value : TestReporter.values()) {
195+
if (isFirst) {
196+
isFirst = false;
197+
} else {
198+
sb.append(", ");
199+
}
200+
sb.append('\'').append(value.toString().toLowerCase()).append('\'');
201+
}
202+
sb.append(".");
203+
throw new InvalidUserDataException(sb.toString());
204+
}
205+
}
178206
}

pkl-gradle/src/test/kotlin/org/pkl/gradle/TestsTest.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,43 @@ class TestsTest : AbstractTest() {
332332
)
333333
}
334334

335+
@Test
336+
fun `minimal test reporter`() {
337+
writeFile(
338+
"test.pkl",
339+
"""
340+
amends "pkl:test"
341+
342+
facts {
343+
["passes"] {
344+
true
345+
}
346+
["fails"] {
347+
false
348+
}
349+
}
350+
"""
351+
.trimIndent(),
352+
)
353+
writeFile("test.pkl-expected.pcf", bigTestExpected)
354+
355+
writeBuildFile("testReporter = 'minimal'")
356+
357+
runTask("evalTest", expectFailure = true)
358+
}
359+
360+
@Test
361+
fun `invalid test reporter`() {
362+
writePklFile()
363+
writeFile("test.pkl-expected.pcf", bigTestExpected)
364+
365+
writeBuildFile("testReporter = 'not a reporter'")
366+
367+
val output = runTask("evalTest", expectFailure = true)
368+
assertThat(output.output)
369+
.contains("Invalid test reporter: 'not a reporter'. Valid reporters: 'spec', 'minimal'.")
370+
}
371+
335372
private val examples =
336373
"""
337374
["user 0"] {

0 commit comments

Comments
 (0)