diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml index f4aa3a2..bf65051 100644 --- a/.github/workflows/bld.yml +++ b/.github/workflows/bld.yml @@ -1,16 +1,14 @@ name: bld-ci -on: [ push, pull_request, workflow_dispatch ] +on: [push, pull_request, workflow_dispatch] jobs: build-bld-project: + runs-on: ubuntu-latest + strategy: matrix: - java-version: [ 17, 21, 24 ] - kotlin-version: [ 1.9.25, 2.0.21, 2.1.20 ] - os: [ ubuntu-latest, windows-latest, macos-latest ] - - runs-on: ${{ matrix.os }} + java-version: [17, 21, 22] steps: - name: Checkout source repository @@ -24,16 +22,8 @@ jobs: distribution: "zulu" java-version: ${{ matrix.java-version }} - - name: Download dependencies [examples] - working-directory: examples - run: ./bld download - - - name: Run PIT tests [examples] - working-directory: examples - run: ./bld compile pit - - name: Download dependencies run: ./bld download - name: Run tests - run: ./bld compile test \ No newline at end of file + run: ./bld compile test diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 508f6a5..bf43624 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -47,11 +47,11 @@ jobs: uses: actions/configure-pages@v3 - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v1 with: # Upload generated Javadocs repository path: "build/javadoc/" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v1 diff --git a/.idea/bld.xml b/.idea/bld.xml deleted file mode 100644 index 6600cee..0000000 --- a/.idea/bld.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml index 4446c15..ade80da 100644 --- a/.idea/copyright/Apache_License.xml +++ b/.idea/copyright/Apache_License.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file + diff --git a/.idea/icon.svg b/.idea/icon.svg deleted file mode 100644 index 81220b4..0000000 --- a/.idea/icon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml index 153a060..4dd96bf 100644 --- a/.idea/libraries/bld.xml +++ b/.idea/libraries/bld.xml @@ -2,12 +2,12 @@ - + - + diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml index 99cc0c0..9bd86aa 100644 --- a/.idea/libraries/compile.xml +++ b/.idea/libraries/compile.xml @@ -7,7 +7,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/.idea/libraries/runtime.xml +++ b/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/.idea/libraries/test.xml +++ b/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 192c134..92bc43d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,6 @@ - \ No newline at end of file diff --git a/examples/.idea/libraries/runtime.xml b/examples/.idea/libraries/runtime.xml index d4069f2..2ae5c4b 100644 --- a/examples/.idea/libraries/runtime.xml +++ b/examples/.idea/libraries/runtime.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.idea/libraries/test.xml b/examples/.idea/libraries/test.xml index 57ed5ef..b80486a 100644 --- a/examples/.idea/libraries/test.xml +++ b/examples/.idea/libraries/test.xml @@ -8,7 +8,7 @@ - - + + \ No newline at end of file diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index ba429d0..5b2667b 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -9,7 +9,7 @@ ], "java.configuration.updateBuildConfiguration": "automatic", "java.project.referencedLibraries": [ - "${HOME}/.bld/dist/bld-2.2.1.jar", + "${HOME}/.bld/dist/bld-2.0.1.jar", "lib/**/*.jar" ] } diff --git a/examples/lib/bld/bld-wrapper.jar b/examples/lib/bld/bld-wrapper.jar index 7731211..be17d84 100644 Binary files a/examples/lib/bld/bld-wrapper.jar and b/examples/lib/bld/bld-wrapper.jar differ diff --git a/examples/lib/bld/bld-wrapper.properties b/examples/lib/bld/bld-wrapper.properties index c84c8d7..bfb37e0 100644 --- a/examples/lib/bld/bld-wrapper.properties +++ b/examples/lib/bld/bld-wrapper.properties @@ -1,7 +1,7 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-pitest=com.uwyn.rife2:bld-pitest:1.0.10 +bld.extension-pitest=com.uwyn.rife2:bld-pitest:0.9.9 bld.repositories=MAVEN_CENTRAL,RIFE2_RELEASES,MAVEN_LOCAL,RIFE2_SNAPSHOTS bld.sourceDirectories= -bld.version=2.2.1 +bld.version=2.0.1 diff --git a/examples/src/bld/java/com/example/ExamplesBuild.java b/examples/src/bld/java/com/example/ExamplesBuild.java index aa1c8a7..39ae49d 100644 --- a/examples/src/bld/java/com/example/ExamplesBuild.java +++ b/examples/src/bld/java/com/example/ExamplesBuild.java @@ -7,9 +7,6 @@ import rife.tools.FileUtils; import java.nio.file.Path; import java.util.List; -import java.util.logging.ConsoleHandler; -import java.util.logging.Level; -import java.util.logging.Logger; import static rife.bld.dependencies.Scope.test; @@ -29,26 +26,15 @@ public class ExamplesBuild extends Project { repositories = List.of(MAVEN_CENTRAL, RIFE2_RELEASES); - var pitest = version(1, 19, 1); scope(test) - .include(dependency("org.pitest", "pitest", pitest)) - .include(dependency("org.pitest", "pitest-command-line", pitest)) - .include(dependency("org.pitest", "pitest-junit5-plugin", version(1, 2, 2))) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))); + .include(dependency("org.pitest", "pitest", version(1, 16, 1))) + .include(dependency("org.pitest", "pitest-command-line", version(1, 16, 1))) + .include(dependency("org.pitest", "pitest-junit5-plugin", version(1, 2, 1))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))); } public static void main(String[] args) { - // Enable detailed logging for the extensions - var level = Level.ALL; - var logger = Logger.getLogger("rife.bld.extension"); - var consoleHandler = new ConsoleHandler(); - - consoleHandler.setLevel(level); - logger.addHandler(consoleHandler); - logger.setLevel(level); - logger.setUseParentHandlers(false); - new ExamplesBuild().start(args); } @@ -56,7 +42,7 @@ public class ExamplesBuild extends Project { public void pit() throws Exception { new PitestOperation() .fromProject(this) - .reportDir(Path.of("reports", "mutations")) + .reportDir(Path.of("reports", "mutations").toString()) .targetClasses(pkg + ".*") .targetTests(pkg + ".*") .verbose(true) diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index 1b14a16..2ed4ea3 100644 Binary files a/lib/bld/bld-wrapper.jar and b/lib/bld/bld-wrapper.jar differ diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties index 2b5c0ac..79b2f59 100644 --- a/lib/bld/bld-wrapper.properties +++ b/lib/bld/bld-wrapper.properties @@ -1,8 +1,8 @@ bld.downloadExtensionJavadoc=false bld.downloadExtensionSources=true bld.downloadLocation= -bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.5 -bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2 +bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.2 +bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.4 bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES bld.sourceDirectories= -bld.version=2.2.1 +bld.version=2.0.1 diff --git a/src/bld/java/rife/bld/extension/PitestOperationBuild.java b/src/bld/java/rife/bld/extension/PitestOperationBuild.java index 67f664f..afad98f 100644 --- a/src/bld/java/rife/bld/extension/PitestOperationBuild.java +++ b/src/bld/java/rife/bld/extension/PitestOperationBuild.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,15 +30,10 @@ import static rife.bld.dependencies.Scope.test; import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING; public class PitestOperationBuild extends Project { - final PmdOperation pmdOp = new PmdOperation() - .fromProject(this) - .failOnViolation(true) - .ruleSets("config/pmd.xml"); - public PitestOperationBuild() { pkg = "rife.bld.extension"; name = "PitestExtension"; - version = version(1, 0, 11, "SNAPSHOT"); + version = version(0, 9, 9); javaRelease = 17; @@ -47,16 +42,16 @@ public class PitestOperationBuild extends Project { repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS); - var pitest = version(1, 19, 1); + var pitest = version(1, 16, 1); scope(compile) - .include(dependency("com.uwyn.rife2", "bld", version(2, 2, 1))); + .include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1))); scope(test) .include(dependency("org.pitest", "pitest", pitest)) .include(dependency("org.pitest", "pitest-command-line", pitest)) - .include(dependency("org.pitest", "pitest-junit5-plugin", version(1, 2, 2))) - .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 12, 1))) - .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 12, 1))) - .include(dependency("org.assertj", "assertj-core", version(3, 27, 3))); + .include(dependency("org.pitest", "pitest-junit5-plugin", version(1, 2, 1))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 10, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 10, 3))) + .include(dependency("org.assertj", "assertj-core", version(3, 26, 3))); javadocOperation() .javadocOptions() @@ -67,26 +62,28 @@ public class PitestOperationBuild extends Project { publishOperation() .repository(version.isSnapshot() ? repository("rife2-snapshot") : repository("rife2")) - .repository(repository("github")) .info() .groupId("com.uwyn.rife2") .artifactId("bld-pitest") .description("PIT Mutation Testing Extension for bld") .url("https://github.com/rife2/bld-pitest") - .developer(new PublishDeveloper() - .id("ethauvin") - .name("Erik C. Thauvin") - .email("erik@thauvin.net") - .url("https://erik.thauvin.net/") + .developer( + new PublishDeveloper() + .id("ethauvin") + .name("Erik C. Thauvin") + .email("erik@thauvin.net") + .url("https://erik.thauvin.net/") ) - .license(new PublishLicense() - .name("The Apache License, Version 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0.txt") + .license( + new PublishLicense() + .name("The Apache License, Version 2.0") + .url("https://www.apache.org/licenses/LICENSE-2.0.txt") ) - .scm(new PublishScm() - .connection("scm:git:https://github.com/rife2/bld-pitest.git") - .developerConnection("scm:git:git@github.com:rife2/bld-pitest.git") - .url("https://github.com/rife2/bld-pitest") + .scm( + new PublishScm() + .connection("scm:git:https://github.com/rife2/bld-pitest.git") + .developerConnection("scm:git:git@github.com:rife2/bld-pitest.git") + .url("https://github.com/rife2/bld-pitest") ) .signKey(property("sign.key")) .signPassphrase(property("sign.passphrase")); @@ -98,23 +95,19 @@ public class PitestOperationBuild extends Project { @BuildCommand(summary = "Runs PMD analysis") public void pmd() throws Exception { - pmdOp.execute(); - } - - @BuildCommand(value = "pmd-cli", summary = "Runs PMD analysis (CLI)") - public void pmdCli() throws Exception { - pmdOp.includeLineNumber(false).execute(); + new PmdOperation() + .fromProject(this) + .failOnViolation(true) + .ruleSets("config/pmd.xml") + .execute(); } @Override public void test() throws Exception { - var os = System.getProperty("os.name"); - if (os != null && os.toLowerCase().contains("linux")) { - new ExecOperation() - .fromProject(this) - .command("scripts/cliargs.sh") - .execute(); - } + new ExecOperation() + .fromProject(this) + .command("scripts/cliargs.sh") + .execute(); super.test(); } } diff --git a/src/main/java/rife/bld/extension/PitestOperation.java b/src/main/java/rife/bld/extension/PitestOperation.java index 632c58a..36758ef 100644 --- a/src/main/java/rife/bld/extension/PitestOperation.java +++ b/src/main/java/rife/bld/extension/PitestOperation.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import rife.bld.operations.exceptions.ExitStatusException; import java.io.File; import java.io.IOException; -import java.nio.file.Path; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; @@ -61,7 +60,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** * List of packages and classes which are to be considered outside the scope of mutation. Any lines of code * containing calls to these classes will not be mutated. @@ -106,20 +104,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #avoidCallsTo(Collection) */ public PitestOperation avoidCallsTo(String... avoidCallTo) { - return avoidCallsTo(List.of(avoidCallTo)); - } - - private String buildClassPath(String... path) { - var classpath = new StringBuilder(); - for (var p : path) { - if (!p.isBlank()) { - if (!classpath.isEmpty()) { - classpath.append(File.pathSeparator); - } - classpath.append(p); - } - } - return classpath.toString(); + options_.put("--avoidCallsTo", String.join(",", Arrays.stream(avoidCallTo).filter(this::isNotBlank).toList())); + return this; } /** @@ -143,31 +129,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #classPath(Collection) */ public PitestOperation classPath(String... path) { - return classPath(List.of(path)); - } - - /** - * List of packages and classes which are to be considered outside the scope of mutation. Any lines of code - * containing calls to these classes will not be mutated. - *

- * If a list is not explicitly supplied then PIT will default to a list of common logging packages as follows - *

- *

    - *
  • java.util.logging
  • - *
  • org.apache.log4j
  • - *
  • org.slf4j
  • - *
  • org.apache.commons.logging
  • - *
- *

- * If the feature {@code FLOGCALL} is disabled, this parameter is ignored and logging calls are also mutated. - * Additional classpath entries to use when looking for tests and mutable code. - * - * @param path one or more paths - * @return this operation instance - * @see #classPathPaths(Collection) - */ - public PitestOperation classPath(Path... path) { - return classPathPaths(List.of(path)); + options_.put("--classPath", String.join(",", Arrays.stream(path).filter(this::isNotBlank).toList())); + return this; } /** @@ -182,30 +145,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * List of packages and classes which are to be considered outside the scope of mutation. Any lines of code - * containing calls to these classes will not be mutated. - *

- * If a list is not explicitly supplied then PIT will default to a list of common logging packages as follows - *

- *

    - *
  • java.util.logging
  • - *
  • org.apache.log4j
  • - *
  • org.slf4j
  • - *
  • org.apache.commons.logging
  • - *
- *

- * If the feature {@code FLOGCALL} is disabled, this parameter is ignored and logging calls are also mutated. - * Additional classpath entries to use when looking for tests and mutable code. - * - * @param path one or more paths - * @return this operation instance - * @see #classPathFiles(Collection) - */ - public PitestOperation classPath(File... path) { - return classPathFiles(List.of(path)); - } - /** * File with a list of additional classpath elements (one per line). * @@ -219,28 +158,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Additional classpath entries to use when looking for tests and mutable code. - * - * @param path the list of paths - * @return this operation instance - * @see #classPath(File...) - */ - public PitestOperation classPathFiles(Collection path) { - return classPath(path.stream().map(File::getAbsolutePath).toList()); - } - - /** - * Additional classpath entries to use when looking for tests and mutable code. - * - * @param path the list of paths - * @return this operation instance - * @see #classPath(Path...) - */ - public PitestOperation classPathPaths(Collection path) { - return classPath(path.stream().map(Path::toFile).map(File::getAbsolutePath).toList()); - } - /** * Line coverage threshold below which the build will fail. This is an integer percent (0-100) that represents the * fraction of the project covered by the tests. @@ -296,23 +213,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Whether to run in dry run mode. - *

- * Defaults to {@code false} - * - * @param isDryRun {@code true} or {@code false} - * @return this operation instance - */ - public PitestOperation dryRun(boolean isDryRun) { - if (isDryRun) { - options_.put("--dryRun", TRUE); - } else { - options_.put("--dryRun", FALSE); - } - return this; - } - /** * List of globs to match against class names. Matching classes will be excluded from mutation. * @@ -321,7 +221,9 @@ public class PitestOperation extends AbstractProcessOperation { * @see #excludedClasses(Collection) */ public PitestOperation excludedClasses(String... excludedClass) { - return excludedClasses(List.of(excludedClass)); + options_.put("--excludedClasses", + String.join(",", Arrays.stream(excludedClass).filter(this::isNotBlank).toList())); + return this; } /** @@ -345,7 +247,9 @@ public class PitestOperation extends AbstractProcessOperation { * @see #excludedGroups(Collection) */ public PitestOperation excludedGroups(String... excludedGroup) { - return excludedGroups(List.of(excludedGroup)); + options_.put("--excludedGroups", + String.join(",", Arrays.stream(excludedGroup).filter(this::isNotBlank).toList())); + return this; } /** @@ -369,7 +273,9 @@ public class PitestOperation extends AbstractProcessOperation { * @see #excludedMethods(Collection) */ public PitestOperation excludedMethods(String... excludedMethod) { - return excludedMethods(List.of(excludedMethod)); + options_.put("--excludedMethods", + String.join(",", Arrays.stream(excludedMethod).filter(this::isNotBlank).toList())); + return this; } /** @@ -405,7 +311,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #excludedTestClasses(Collection) */ public PitestOperation excludedTestClasses(String... testClasses) { - return excludedTestClasses(List.of(testClasses)); + options_.put("--excludedTestClasses", String.join(",", testClasses)); + return this; } /** @@ -445,10 +352,9 @@ public class PitestOperation extends AbstractProcessOperation { if (project_ != null) { args.add(javaTool()); args.add("-cp"); - args.add(buildClassPath(joinClasspathJar(project_.testClasspathJars()), - joinClasspathJar(project_.compileClasspathJars()), - joinClasspathJar(project_.providedClasspathJars()), - project_.buildMainDirectory().getAbsolutePath(), project_.buildTestDirectory().getAbsolutePath())); + args.add(String.format("%s:%s:%s:%s", new File(project_.libTestDirectory(), "*"), + new File(project_.libCompileDirectory(), "*"), project_.buildMainDirectory(), + project_.buildTestDirectory())); args.add("org.pitest.mutationtest.commandline.MutationCoverageReport"); if (!options_.containsKey(SOURCE_DIRS)) { @@ -463,10 +369,6 @@ public class PitestOperation extends AbstractProcessOperation { }); } - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine(String.join(" ", args)); - } - return args; } @@ -536,7 +438,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #features(Collection) */ public PitestOperation features(String... feature) { - return features(List.of(feature)); + options_.put("--features", String.join(",", Arrays.stream(feature).filter(this::isNotBlank).toList())); + return this; } /** @@ -567,26 +470,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Path to a file containing history information for incremental analysis. - * - * @param path the path - * @return this operation instance - */ - public PitestOperation historyInputLocation(File path) { - return historyInputLocation(path.getAbsolutePath()); - } - - /** - * Path to a file containing history information for incremental analysis. - * - * @param path the path - * @return this operation instance - */ - public PitestOperation historyInputLocation(Path path) { - return historyInputLocation(path.toFile()); - } - /** * Path to write history information for incremental analysis. May be the same as * {@link #historyInputLocation(String) @@ -601,28 +484,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Path to write history information for incremental analysis. May be the same as - * {@link #historyInputLocation(String) - * - * @param path the path - * @return this operation instance - */ - public PitestOperation historyOutputLocation(File path) { - return historyOutputLocation(path.getAbsolutePath()); - } - - /** - * Path to write history information for incremental analysis. May be the same as - * {@link #historyInputLocation(String) - * - * @param path the path - * @return this operation instance - */ - public PitestOperation historyOutputLocation(Path path) { - return historyOutputLocation(path.toFile()); - } - /** * Indicates if the PIT should try to mutate classes on the classpath with which it was launched. If not supplied * this flag defaults to {@code true}. If set to {@code false} only classes found on the paths specified by the @@ -651,7 +512,9 @@ public class PitestOperation extends AbstractProcessOperation { * @see #includedGroups(Collection) */ public PitestOperation includedGroups(String... includedGroup) { - return includedGroups(List.of(includedGroup)); + options_.put("--includedGroups", + String.join(",", Arrays.stream(includedGroup).filter(this::isNotBlank).toList())); + return this; } /** @@ -700,14 +563,6 @@ public class PitestOperation extends AbstractProcessOperation { return s != null && !s.isBlank(); } - private String joinClasspathJar(List jars) { - if (!jars.isEmpty()) { - return String.join(File.pathSeparator, jars.stream().map(File::getAbsolutePath).toList()); - } else { - return ""; - } - } - /** * Argument string to use when PIT launches child processes. This is most commonly used to increase the amount of * memory available to the process, but may be used to pass any valid JVM argument. @@ -717,7 +572,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #jvmArgs(Collection) */ public PitestOperation jvmArgs(String... args) { - return jvmArgs(List.of(args)); + options_.put("--jvmArgs", String.join(",", Arrays.stream(args).filter(this::isNotBlank).toList())); + return this; } /** @@ -747,28 +603,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * The path to the java executable to be used to launch test with. If none is supplied defaults to the one - * pointed to by {@code JAVA_HOME}. - * - * @param path the path - * @return this operation instance - */ - public PitestOperation jvmPath(File path) { - return jvmPath(path.getAbsolutePath()); - } - - /** - * The path to the java executable to be used to launch test with. If none is supplied defaults to the one - * pointed to by {@code JAVA_HOME}. - * - * @param path the path - * @return this operation instance - */ - public PitestOperation jvmPath(Path path) { - return jvmPath(path.toFile()); - } - /** * Maximum number of surviving mutants to allow without throwing an error. * @@ -806,43 +640,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #mutableCodePaths(Collection) */ public PitestOperation mutableCodePaths(String... path) { - return mutableCodePaths(List.of(path)); - } - - /** - * List of classpaths which should be considered to contain mutable code. If your build maintains separate output - * directories for tests and production classes this parameter should be set to your code output directory in order - * to avoid mutating test helper classes etc. - *

- * If no mutableCodePath is supplied PIT will default to considering anything not defined within a jar or zip file - * as being a candidate for mutation. - *

- * PIT will always attempt not to mutate test classes even if they are defined on a mutable path. - * - * @param path one or one paths - * @return this operation instance - * @see #mutableCodePathsPaths(Collection) - */ - public PitestOperation mutableCodePaths(Path... path) { - return mutableCodePathsPaths(List.of(path)); - } - - /** - * List of classpaths which should be considered to contain mutable code. If your build maintains separate output - * directories for tests and production classes this parameter should be set to your code output directory in order - * to avoid mutating test helper classes etc. - *

- * If no mutableCodePath is supplied PIT will default to considering anything not defined within a jar or zip file - * as being a candidate for mutation. - *

- * PIT will always attempt not to mutate test classes even if they are defined on a mutable path. - * - * @param path one or one paths - * @return this operation instance - * @see #mutableCodePathsFiles(Collection) - */ - public PitestOperation mutableCodePaths(File... path) { - return mutableCodePathsFiles(List.of(path)); + options_.put("--mutableCodePaths", String.join(",", Arrays.stream(path).filter(this::isNotBlank).toList())); + return this; } /** @@ -864,42 +663,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * List of classpaths which should be considered to contain mutable code. If your build maintains separate output - * directories for tests and production classes this parameter should be set to your code output directory in order - * to avoid mutating test helper classes etc. - *

- * If no mutableCodePath is supplied PIT will default to considering anything not defined within a jar or zip file - * as being a candidate for mutation. - *

- * PIT will always attempt not to mutate test classes even if they are defined on a mutable path. - * - * @param paths the list of paths - * @return this operation instance - * @see #mutableCodePaths(File...) - */ - public PitestOperation mutableCodePathsFiles(Collection paths) { - return mutableCodePaths(paths.stream().map(File::getAbsolutePath).toList()); - } - - /** - * List of classpaths which should be considered to contain mutable code. If your build maintains separate output - * directories for tests and production classes this parameter should be set to your code output directory in order - * to avoid mutating test helper classes etc. - *

- * If no mutableCodePath is supplied PIT will default to considering anything not defined within a jar or zip file - * as being a candidate for mutation. - *

- * PIT will always attempt not to mutate test classes even if they are defined on a mutable path. - * - * @param paths the list of paths - * @return this operation instance - * @see #mutableCodePaths(Path...) - */ - public PitestOperation mutableCodePathsPaths(Collection paths) { - return mutableCodePaths(paths.stream().map(Path::toFile).map(File::getAbsolutePath).toList()); - } - /** * Mutation engine to use. *

@@ -989,34 +752,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * A list of formats in which to write mutation results as the mutations are analysed. - * Supported formats are {@code HTML}, {@code XML}, {@code CSV}. - *

- * Defaults to {@code HTML}. - * - * @param outputFormat one or more output formats - * @return this operation instance - * @see #outputFormatsFiles(Collection) - */ - public PitestOperation outputFormats(File... outputFormat) { - return outputFormatsFiles(List.of(outputFormat)); - } - - /** - * A list of formats in which to write mutation results as the mutations are analysed. - * Supported formats are {@code HTML}, {@code XML}, {@code CSV}. - *

- * Defaults to {@code HTML}. - * - * @param outputFormat one or more output formats - * @return this operation instance - * @see #outputFormatsPaths(Collection) - */ - public PitestOperation outputFormats(Path... outputFormat) { - return outputFormatsPaths(List.of(outputFormat)); - } - /** * A list of formats in which to write mutation results as the mutations are analysed. * Supported formats are {@code HTML}, {@code XML}, {@code CSV}. @@ -1028,7 +763,9 @@ public class PitestOperation extends AbstractProcessOperation { * @see #outputFormats(Collection) */ public PitestOperation outputFormats(String... outputFormat) { - return outputFormats(List.of(outputFormat)); + options_.put("--outputFormats", + String.join(",", Arrays.stream(outputFormat).filter(this::isNotBlank).toList())); + return this; } /** @@ -1046,35 +783,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * A list of formats in which to write mutation results as the mutations are analysed. - * Supported formats are {@code HTML}, {@code XML}, {@code CSV}. - *

- * Defaults to {@code HTML}. - * - * @param outputFormats the list of output formats - * @return this operation instance - * @see #outputFormats(File...) - */ - public PitestOperation outputFormatsFiles(Collection outputFormats) { - return outputFormats(outputFormats.stream().map(File::getAbsolutePath).toList()); - } - - /** - * A list of formats in which to write mutation results as the mutations are analysed. - * Supported formats are {@code HTML}, {@code XML}, {@code CSV}. - *

- * Defaults to {@code HTML}. - * - * @param outputFormats the list of output formats - * @return this operation instance - * @see #outputFormats(Path...) - */ - public PitestOperation outputFormatsPaths(Collection outputFormats) { - return outputFormats(outputFormats.stream().map(Path::toFile).map(File::getAbsolutePath).toList()); - - } - /** * Custom plugin properties. * @@ -1098,27 +806,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Project base. - * - * @param file the file - * @return this operations instance - */ - public PitestOperation projectBase(File file) { - return projectBase(file.getAbsolutePath()); - } - - /** - * Project base. - * - * @param file the file - * @return this operations instance - */ - public PitestOperation projectBase(Path file) { - return projectBase(file.toFile()); - } - - /** * Output directory for the reports. * @@ -1132,26 +819,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * Output directory for the reports. - * - * @param dir the directory - * @return this operation instance - */ - public PitestOperation reportDir(File dir) { - return reportDir(dir.getAbsolutePath()); - } - - /** - * Output directory for the reports. - * - * @param dir the directory - * @return this operation instance - */ - public PitestOperation reportDir(Path dir) { - return reportDir(dir.toFile()); - } - /** * whether to ignore failing tests when computing coverage. *

@@ -1177,29 +844,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #sourceDirs(Collection) */ public PitestOperation sourceDirs(String... dir) { - return sourceDirs(List.of(dir)); - } - - /** - * The folder(s) containing the source code. - * - * @param dir one or more directories - * @return this operation instance - * @see #sourceDirsFiles(Collection) - */ - public PitestOperation sourceDirs(File... dir) { - return sourceDirsFiles(List.of(dir)); - } - - /** - * The folder(s) containing the source code. - * - * @param dir one or more directories - * @return this operation instance - * @see #sourceDirsPaths(Collection) - */ - public PitestOperation sourceDirs(Path... dir) { - return sourceDirsPaths(List.of(dir)); + options_.put(SOURCE_DIRS, String.join(",", Arrays.stream(dir).filter(this::isNotBlank).toList())); + return this; } /** @@ -1214,29 +860,6 @@ public class PitestOperation extends AbstractProcessOperation { return this; } - /** - * The folder(s) containing the source code. - * - * @param dirs the list of directories - * @return this operation instance - * @see #sourceDirs(File...) - */ - public PitestOperation sourceDirsFiles(Collection dirs) { - return sourceDirs(dirs.stream().map(File::getAbsolutePath).toList()); - } - - /** - * The folder(s) containing the source code. - * - * @param dirs the list of directories - * @return this operation instance - * @see #sourceDirs(Path...) - */ - public PitestOperation sourceDirsPaths(Collection dirs) { - return sourceDirs(dirs.stream().map(Path::toFile).map(File::getAbsolutePath).toList()); - - } - /** * The classes to be mutated. This is expressed as a list of globs. *

@@ -1269,7 +892,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #targetClasses(String...) */ public PitestOperation targetClasses(String... targetClass) { - return targetClasses(List.of(targetClass)); + options_.put("--targetClasses", String.join(",", Arrays.stream(targetClass).filter(this::isNotBlank).toList())); + return this; } /** @@ -1285,7 +909,8 @@ public class PitestOperation extends AbstractProcessOperation { * @see #targetTests(Collection) */ public PitestOperation targetTests(String... test) { - return targetTests(List.of(test)); + options_.put("--targetTests", String.join(",", Arrays.stream(test).filter(this::isNotBlank).toList())); + return this; } /** diff --git a/src/test/java/rife/bld/extension/PitestOperationTest.java b/src/test/java/rife/bld/extension/PitestOperationTest.java index bb5ed8c..0fb9902 100644 --- a/src/test/java/rife/bld/extension/PitestOperationTest.java +++ b/src/test/java/rife/bld/extension/PitestOperationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,12 @@ package rife.bld.extension; -import org.assertj.core.api.AutoCloseableSoftAssertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledOnOs; -import org.junit.jupiter.api.condition.OS; import rife.bld.BaseProject; import rife.bld.Project; import rife.bld.WebProject; import rife.bld.operations.exceptions.ExitStatusException; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -37,12 +33,11 @@ import static org.assertj.core.api.Assertions.assertThatCode; import static rife.bld.extension.PitestOperation.FALSE; import static rife.bld.extension.PitestOperation.TRUE; -@SuppressWarnings("PMD.AvoidDuplicateLiterals") class PitestOperationTest { private static final String AS_LIST = "as list"; - private static final String BAR = "bar"; - private static final String FOO = "foo"; - private static final String FOOBAR = FOO + ',' + BAR; + private final static String BAR = "bar"; + private final static String FOO = "foo"; + private final static String FOOBAR = FOO + ',' + BAR; @Test void argLine() { @@ -66,7 +61,6 @@ class PitestOperationTest { } @Test - @EnabledOnOs(OS.LINUX) void checkAllParameters() throws IOException { var args = Files.readAllLines(Paths.get("src", "test", "resources", "pitest-args.txt")); @@ -80,7 +74,6 @@ class PitestOperationTest { .classPathFile(FOO) .coverageThreshold(0) .detectInlinedCode(false) - .dryRun(false) .excludedClasses("class") .excludedClasses(List.of(FOO, BAR)) .excludedGroups("group") @@ -126,17 +119,15 @@ class PitestOperationTest { .verbosity("default") .executeConstructProcessCommandList(); - try (var softly = new AutoCloseableSoftAssertions()) { - for (var p : args) { - var found = false; - for (var a : params) { - if (a.startsWith(p)) { - found = true; - break; - } + for (var p : args) { + var found = false; + for (var a : params) { + if (a.startsWith(p)) { + found = true; + break; } - softly.assertThat(found).as(p + " not found.").isTrue(); } + assertThat(found).as(p + " not found.").isTrue(); } } @@ -598,175 +589,6 @@ class PitestOperationTest { assertThat(op.options().get("--targetTests")).as(AS_LIST).isEqualTo(FOOBAR); } - @Test - void testClassPath() { - var foo = new File(FOO); - var bar = new File(BAR); - - var foobar = String.format("%s,%s", FOO, BAR); - var op = new PitestOperation().classPath(FOO, BAR); - assertThat(op.options().get("--classPath")).as("String...").isEqualTo(foobar); - - op = new PitestOperation().classPath(List.of(FOO, BAR)); - assertThat(op.options().get("--classPath")).as("List(String...)").isEqualTo(foobar); - - foobar = String.format("%s,%s", foo.getAbsolutePath(), bar.getAbsolutePath()); - op = new PitestOperation().classPath(foo, bar); - assertThat(op.options().get("--classPath")).as("File...").isEqualTo(foobar); - - op = new PitestOperation().classPathFiles(List.of(foo, bar)); - assertThat(op.options().get("--classPath")).as("List(String...)").isEqualTo(foobar); - - op = new PitestOperation().classPath(foo.toPath(), bar.toPath()); - assertThat(op.options().get("--classPath")).as("Path...").isEqualTo(foobar); - - op = new PitestOperation().classPathPaths(List.of(foo.toPath(), bar.toPath())); - assertThat(op.options().get("--classPath")).as("List(Path...)").isEqualTo(foobar); - } - - @Test - void testHistoryInputLocation() { - var foo = new File(FOO); - var op = new PitestOperation().historyInputLocation(FOO); - assertThat(op.options().get("--historyInputLocation")).as("as string").isEqualTo(FOO); - - op = new PitestOperation().historyInputLocation(foo); - assertThat(op.options().get("--historyInputLocation")).as("as file").isEqualTo(foo.getAbsolutePath()); - - op = new PitestOperation().historyInputLocation(foo.toPath()); - assertThat(op.options().get("--historyInputLocation")).as("as path").isEqualTo(foo.getAbsolutePath()); - } - - @Test - void testHistoryOutputLocation() { - var foo = new File(FOO); - var op = new PitestOperation().historyOutputLocation(FOO); - assertThat(op.options().get("--historyOutputLocation")).as("as string").isEqualTo(FOO); - - op = new PitestOperation().historyOutputLocation(foo); - assertThat(op.options().get("--historyOutputLocation")).as("as file").isEqualTo(foo.getAbsolutePath()); - - op = new PitestOperation().historyOutputLocation(foo.toPath()); - assertThat(op.options().get("--historyOutputLocation")).as("as path").isEqualTo(foo.getAbsolutePath()); - } - - @Test - void testJvmPath() { - var foo = new File(FOO); - var op = new PitestOperation().jvmPath(FOO); - assertThat(op.options().get("--jvmPath")).as("as string").isEqualTo(FOO); - - op = new PitestOperation().jvmPath(foo); - assertThat(op.options().get("--jvmPath")).as("as file").isEqualTo(foo.getAbsolutePath()); - - op = new PitestOperation().jvmPath(foo.toPath()); - assertThat(op.options().get("--jvmPath")).as("as path").isEqualTo(foo.getAbsolutePath()); - } - - @Test - void testMutableCodePaths() { - var foo = new File(FOO); - var bar = new File(BAR); - - var foobar = String.format("%s,%s", FOO, BAR); - var op = new PitestOperation().mutableCodePaths(FOO, BAR); - assertThat(op.options().get("--mutableCodePaths")).as("String...").isEqualTo(foobar); - - op = new PitestOperation().mutableCodePaths(List.of(FOO, BAR)); - assertThat(op.options().get("--mutableCodePaths")).as("List(String...)").isEqualTo(foobar); - - foobar = String.format("%s,%s", foo.getAbsolutePath(), bar.getAbsolutePath()); - op = new PitestOperation().mutableCodePaths(foo, bar); - assertThat(op.options().get("--mutableCodePaths")).as("File...").isEqualTo(foobar); - - op = new PitestOperation().mutableCodePathsFiles(List.of(foo, bar)); - assertThat(op.options().get("--mutableCodePaths")).as("List(String...)").isEqualTo(foobar); - - op = new PitestOperation().mutableCodePaths(foo.toPath(), bar.toPath()); - assertThat(op.options().get("--mutableCodePaths")).as("Path...").isEqualTo(foobar); - - op = new PitestOperation().mutableCodePathsPaths(List.of(foo.toPath(), bar.toPath())); - assertThat(op.options().get("--mutableCodePaths")).as("List(Path...)").isEqualTo(foobar); - } - - @Test - void testOutputFormats() { - var foo = new File(FOO); - var bar = new File(BAR); - - var foobar = String.format("%s,%s", FOO, BAR); - var op = new PitestOperation().outputFormats(FOO, BAR); - assertThat(op.options().get("--outputFormats")).as("String...").isEqualTo(foobar); - - op = new PitestOperation().outputFormats(List.of(FOO, BAR)); - assertThat(op.options().get("--outputFormats")).as("List(String...)").isEqualTo(foobar); - - foobar = String.format("%s,%s", foo.getAbsolutePath(), bar.getAbsolutePath()); - op = new PitestOperation().outputFormats(foo, bar); - assertThat(op.options().get("--outputFormats")).as("File...").isEqualTo(foobar); - - op = new PitestOperation().outputFormatsFiles(List.of(foo, bar)); - assertThat(op.options().get("--outputFormats")).as("List(String...)").isEqualTo(foobar); - - op = new PitestOperation().outputFormats(foo.toPath(), bar.toPath()); - assertThat(op.options().get("--outputFormats")).as("Path...").isEqualTo(foobar); - - op = new PitestOperation().outputFormatsPaths(List.of(foo.toPath(), bar.toPath())); - assertThat(op.options().get("--outputFormats")).as("List(Path...)").isEqualTo(foobar); - } - - @Test - void testProjectBase() { - var foo = new File(FOO); - var op = new PitestOperation().projectBase(FOO); - assertThat(op.options().get("--projectBase")).as("as string").isEqualTo(FOO); - - op = new PitestOperation().projectBase(foo); - assertThat(op.options().get("--projectBase")).as("as file").isEqualTo(foo.getAbsolutePath()); - - op = new PitestOperation().projectBase(foo.toPath()); - assertThat(op.options().get("--projectBase")).as("as path").isEqualTo(foo.getAbsolutePath()); - } - - @Test - void testReportDir() { - var foo = new File(FOO); - var op = new PitestOperation().reportDir(FOO); - assertThat(op.options().get("--reportDir")).as("as string").isEqualTo(FOO); - - op = new PitestOperation().reportDir(foo); - assertThat(op.options().get("--reportDir")).as("as file").isEqualTo(foo.getAbsolutePath()); - - op = new PitestOperation().reportDir(foo.toPath()); - assertThat(op.options().get("--reportDir")).as("as path").isEqualTo(foo.getAbsolutePath()); - } - - @Test - void testSourceDirs() { - var foo = new File(FOO); - var bar = new File(BAR); - - var foobar = String.format("%s,%s", FOO, BAR); - var op = new PitestOperation().sourceDirs(FOO, BAR); - assertThat(op.options().get("--sourceDirs")).as("String...").isEqualTo(foobar); - - op = new PitestOperation().sourceDirs(List.of(FOO, BAR)); - assertThat(op.options().get("--sourceDirs")).as("List(String...)").isEqualTo(foobar); - - foobar = String.format("%s,%s", foo.getAbsolutePath(), bar.getAbsolutePath()); - op = new PitestOperation().sourceDirs(foo, bar); - assertThat(op.options().get("--sourceDirs")).as("File...").isEqualTo(foobar); - - op = new PitestOperation().sourceDirsFiles(List.of(foo, bar)); - assertThat(op.options().get("--sourceDirs")).as("List(String...)").isEqualTo(foobar); - - op = new PitestOperation().sourceDirs(foo.toPath(), bar.toPath()); - assertThat(op.options().get("--sourceDirs")).as("Path...").isEqualTo(foobar); - - op = new PitestOperation().sourceDirsPaths(List.of(foo.toPath(), bar.toPath())); - assertThat(op.options().get("--sourceDirs")).as("List(Path...)").isEqualTo(foobar); - } - @Test void testStrengthThreshold() { var op = new PitestOperation() diff --git a/src/test/resources/pitest-args.txt b/src/test/resources/pitest-args.txt index df24bfb..348f16e 100644 --- a/src/test/resources/pitest-args.txt +++ b/src/test/resources/pitest-args.txt @@ -4,7 +4,6 @@ --classPathFile --coverageThreshold --detectInlinedCode ---dryRun --excludedClasses --excludedGroups --excludedMethods