Compare commits
62 commits
Author | SHA1 | Date | |
---|---|---|---|
38d25733fc | |||
0671bdfd7a | |||
926580f12e | |||
7fbe975128 | |||
e9f1fe25d9 | |||
ebef9ea3d5 | |||
c4ba97ff6d | |||
4573055b56 | |||
edbc515eba | |||
09beae6e4e | |||
dad854d7e8 | |||
d373dd26c6 | |||
bff5cd76e6 | |||
2e3d65bd08 | |||
22b0babdd5 | |||
f089ff8c9f | |||
80c4ae0744 | |||
3d8d41ae3d | |||
c0afb715d7 | |||
bc35adebfd | |||
c81b0fac5d | |||
a83bea7f27 | |||
dee9abae13 | |||
a7945aea0c | |||
d20b0d3521 | |||
390bceaf4c | |||
34f933628d | |||
8d4fa46d3c | |||
eb20bb7432 | |||
16cf748853 | |||
7dfb3cda59 | |||
3a67e0e1b6 | |||
9ff912ac7f | |||
e5a56b518c | |||
7028acf4d0 | |||
d49fc24bd7 | |||
c03dc8a894 | |||
9ed731e936 | |||
6243355364 | |||
2412c525dd | |||
4a4fa2fb83 | |||
11bdafa259 | |||
1a2a854a8b | |||
d9a225aa0e | |||
ce56ed6e1d | |||
c26f531329 | |||
1227115805 | |||
4adc28d4a5 | |||
6f62c38a9b | |||
9089cae653 | |||
f70c8c89bf | |||
d568ee486f | |||
393d8736aa | |||
fd54c6bd0e | |||
b67915a310 | |||
cfdb81dad4 | |||
bf097e614a | |||
d0f782a9aa | |||
35dc6d38cc | |||
f8718774ae | |||
9455947111 | |||
44bbb80b0f |
27 changed files with 739 additions and 126 deletions
20
.github/workflows/bld.yml
vendored
20
.github/workflows/bld.yml
vendored
|
@ -1,14 +1,16 @@
|
|||
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, 22]
|
||||
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 }}
|
||||
|
||||
steps:
|
||||
- name: Checkout source repository
|
||||
|
@ -22,8 +24,16 @@ 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
|
||||
run: ./bld compile test
|
4
.github/workflows/pages.yml
vendored
4
.github/workflows/pages.yml
vendored
|
@ -47,11 +47,11 @@ jobs:
|
|||
uses: actions/configure-pages@v3
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
uses: actions/upload-pages-artifact@v3
|
||||
with:
|
||||
# Upload generated Javadocs repository
|
||||
path: "build/javadoc/"
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v1
|
||||
uses: actions/deploy-pages@v4
|
||||
|
|
6
.idea/bld.xml
generated
Normal file
6
.idea/bld.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BldConfiguration">
|
||||
<events />
|
||||
</component>
|
||||
</project>
|
4
.idea/copyright/Apache_License.xml
generated
4
.idea/copyright/Apache_License.xml
generated
|
@ -1,6 +1,6 @@
|
|||
<component name="CopyrightManager">
|
||||
<copyright>
|
||||
<option name="notice" value="Copyright 2023-Copyright &#36;today.yearamp;#36;today.year 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. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." />
|
||||
<option name="notice" value="Copyright 2023-&#36;today.year 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. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." />
|
||||
<option name="myName" value="Apache License" />
|
||||
</copyright>
|
||||
</component>
|
||||
</component>
|
13
.idea/icon.svg
generated
Normal file
13
.idea/icon.svg
generated
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 179 108" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-210.511,-96.3382)">
|
||||
<g transform="matrix(1,0,0,1,-23.3386,-649.816)">
|
||||
<g transform="matrix(0.221288,0,0,0.24,73.9536,390.254)">
|
||||
<path d="M722.568,1482.92L722.568,1921.1L808.968,1921.1L808.968,1888.7C822.168,1907.9 846.168,1930.1 893.568,1930.1C933.168,1930.1 961.968,1917.5 985.368,1893.5C1012.97,1865.9 1027.37,1827.5 1027.37,1786.1C1027.37,1741.7 1011.17,1705.1 985.368,1680.5C961.968,1658.3 928.968,1644.5 892.368,1644.5C862.968,1644.5 830.568,1654.1 808.968,1683.5L808.968,1482.92L722.568,1482.92ZM871.368,1718.9C888.768,1718.9 903.768,1723.7 917.568,1736.9C930.168,1748.9 938.568,1766.3 938.568,1787.9C938.568,1807.7 930.168,1825.1 917.568,1837.1C904.368,1849.7 887.568,1855.7 872.568,1855.7C856.368,1855.7 837.168,1849.1 823.368,1835.9C813.168,1826.3 803.568,1810.1 803.568,1787.9C803.568,1765.1 812.568,1749.5 822.768,1738.7C836.568,1724.3 852.768,1718.9 871.368,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
<rect x="1083.77" y="1482.92" width="86.4" height="438.182" style="fill:rgb(250,144,82);fill-rule:nonzero;"/>
|
||||
<path d="M1531.37,1482.92L1444.97,1482.92L1444.97,1683.5C1423.37,1654.1 1390.97,1644.5 1361.57,1644.5C1324.97,1644.5 1291.97,1658.3 1268.57,1680.5C1242.77,1705.1 1226.57,1741.7 1226.57,1786.1C1226.57,1827.5 1240.97,1865.9 1268.57,1893.5C1291.97,1917.5 1320.77,1930.1 1360.37,1930.1C1407.77,1930.1 1431.77,1907.9 1444.97,1888.7L1444.97,1921.1L1531.37,1921.1L1531.37,1482.92ZM1382.57,1718.9C1401.17,1718.9 1417.37,1724.3 1431.17,1738.7C1441.37,1749.5 1450.37,1765.1 1450.37,1787.9C1450.37,1810.1 1440.77,1826.3 1430.57,1835.9C1416.77,1849.1 1397.57,1855.7 1381.37,1855.7C1366.37,1855.7 1349.57,1849.7 1336.37,1837.1C1323.77,1825.1 1315.37,1807.7 1315.37,1787.9C1315.37,1766.3 1323.77,1748.9 1336.37,1736.9C1350.17,1723.7 1365.17,1718.9 1382.57,1718.9Z" style="fill:rgb(35,146,255);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
4
.idea/libraries/bld.xml
generated
4
.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.0.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.0.1-sources.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
4
.idea/libraries/compile.xml
generated
4
.idea/libraries/compile.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/runtime.xml
generated
4
.idea/libraries/runtime.xml
generated
|
@ -8,7 +8,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
.idea/libraries/test.xml
generated
4
.idea/libraries/test.xml
generated
|
@ -8,7 +8,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
|
@ -4,6 +4,7 @@
|
|||
<pattern value="rife.bld.extension.PitestOperationBuild" method="jacoco" />
|
||||
<pattern value="rife.bld.extension.PitestOperationBuild" />
|
||||
<pattern value="rife.bld.extension.PitestOperationBuild" method="pmd" />
|
||||
<pattern value="rife.bld.extension.PitestOperationBuild" method="pmdCli" />
|
||||
</component>
|
||||
<component name="PDMPlugin">
|
||||
<option name="customRuleSets">
|
||||
|
|
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
|
@ -9,7 +9,7 @@
|
|||
],
|
||||
"java.configuration.updateBuildConfiguration": "automatic",
|
||||
"java.project.referencedLibraries": [
|
||||
"${HOME}/.bld/dist/bld-2.0.1.jar",
|
||||
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||
"lib/**/*.jar"
|
||||
]
|
||||
}
|
||||
|
|
20
README.md
20
README.md
|
@ -2,12 +2,20 @@
|
|||
|
||||
[](https://opensource.org/licenses/Apache-2.0)
|
||||
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://rife2.com/bld)
|
||||
[](https://repo.rife2.com/#/releases/com/uwyn/rife2/bld-pitest)
|
||||
[](https://repo.rife2.com/#/snapshots/com/uwyn/rife2/bld-pitest)
|
||||
[](https://github.com/rife2/bld-pitest/actions/workflows/bld.yml)
|
||||
|
||||
To install, please refer to the [extensions documentation](https://github.com/rife2/bld/wiki/Extensions).
|
||||
To install the latest version, add the following to the `lib/bld/bld-wrapper.properties` file:
|
||||
|
||||
```properties
|
||||
bld.extension-pitest=com.uwyn.rife2:bld-pitest
|
||||
```
|
||||
|
||||
For more information, please refer to the [extensions](https://github.com/rife2/bld/wiki/Extensions) documentation.
|
||||
|
||||
## Mutation Testing with PIT
|
||||
|
||||
To run mutation tests and coverage, add the following to your build file:
|
||||
|
||||
|
@ -16,7 +24,7 @@ To run mutation tests and coverage, add the following to your build file:
|
|||
public void pit() throws Exception {
|
||||
new PitestOperation()
|
||||
.fromProject(this)
|
||||
.reportDir(Path.of("reports", "mutations").toString())
|
||||
.reportDir(Path.of("reports", "mutations"))
|
||||
.targetClasses(pkg + ".*")
|
||||
.targetTests(pkg + ".*")
|
||||
.verbose(true)
|
||||
|
@ -40,8 +48,8 @@ Don't forget to add the Pitest `test` dependencies to your build file, as they a
|
|||
```java
|
||||
repositories = List.of(MAVEN_CENTRAL);
|
||||
scope(test)
|
||||
.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.pitest", "pitest", version(1, 19, 1)))
|
||||
.include(dependency("org.pitest", "pitest-command-line", version(1, 17, 4)))
|
||||
.include(dependency("org.pitest", "pitest-junit5-plugin", version(1, 2, 2)))
|
||||
.include(dependency("org.pitest", "pitest-testng-plugin", version(1, 0, 0)));
|
||||
```
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
<!-- BEST PRACTICES -->
|
||||
<rule ref="category/java/bestpractices.xml">
|
||||
<exclude name="AvoidPrintStackTrace"/>
|
||||
<exclude name="JUnit4TestShouldUseTestAnnotation"/>
|
||||
<exclude name="JUnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="GuardLogStatement"/>
|
||||
<exclude name="UnitTestContainsTooManyAsserts"/>
|
||||
<exclude name="UnitTestShouldUseTestAnnotation"/>
|
||||
</rule>
|
||||
|
||||
<rule ref="category/java/bestpractices.xml/MissingOverride">
|
||||
|
|
4
examples/.idea/libraries/bld.xml
generated
4
examples/.idea/libraries/bld.xml
generated
|
@ -2,12 +2,12 @@
|
|||
<library name="bld">
|
||||
<CLASSES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.0.1.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/bld" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.0.1-sources.jar!/" />
|
||||
<root url="jar://$USER_HOME$/.bld/dist/bld-2.2.1-sources.jar!/" />
|
||||
</SOURCES>
|
||||
<excluded>
|
||||
<root url="jar://$PROJECT_DIR$/lib/bld/bld-wrapper.jar!/" />
|
||||
|
|
4
examples/.idea/libraries/compile.xml
generated
4
examples/.idea/libraries/compile.xml
generated
|
@ -7,7 +7,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/compile" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/compile" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
examples/.idea/libraries/runtime.xml
generated
4
examples/.idea/libraries/runtime.xml
generated
|
@ -8,7 +8,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/runtime" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/runtime" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
4
examples/.idea/libraries/test.xml
generated
4
examples/.idea/libraries/test.xml
generated
|
@ -8,7 +8,7 @@
|
|||
<SOURCES>
|
||||
<root url="file://$PROJECT_DIR$/lib/test" />
|
||||
</SOURCES>
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="false" type="SOURCES" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" />
|
||||
<jarDirectory url="file://$PROJECT_DIR$/lib/test" recursive="true" type="SOURCES" />
|
||||
</library>
|
||||
</component>
|
2
examples/.vscode/settings.json
vendored
2
examples/.vscode/settings.json
vendored
|
@ -9,7 +9,7 @@
|
|||
],
|
||||
"java.configuration.updateBuildConfiguration": "automatic",
|
||||
"java.project.referencedLibraries": [
|
||||
"${HOME}/.bld/dist/bld-2.0.1.jar",
|
||||
"${HOME}/.bld/dist/bld-2.2.1.jar",
|
||||
"lib/**/*.jar"
|
||||
]
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -1,7 +1,7 @@
|
|||
bld.downloadExtensionJavadoc=false
|
||||
bld.downloadExtensionSources=true
|
||||
bld.downloadLocation=
|
||||
bld.extension-pitest=com.uwyn.rife2:bld-pitest:0.9.9
|
||||
bld.extension-pitest=com.uwyn.rife2:bld-pitest:1.0.10
|
||||
bld.repositories=MAVEN_CENTRAL,RIFE2_RELEASES,MAVEN_LOCAL,RIFE2_SNAPSHOTS
|
||||
bld.sourceDirectories=
|
||||
bld.version=2.0.1
|
||||
bld.version=2.2.1
|
||||
|
|
|
@ -7,6 +7,9 @@ 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;
|
||||
|
||||
|
@ -26,15 +29,26 @@ 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", 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)));
|
||||
.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)));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -42,7 +56,7 @@ public class ExamplesBuild extends Project {
|
|||
public void pit() throws Exception {
|
||||
new PitestOperation()
|
||||
.fromProject(this)
|
||||
.reportDir(Path.of("reports", "mutations").toString())
|
||||
.reportDir(Path.of("reports", "mutations"))
|
||||
.targetClasses(pkg + ".*")
|
||||
.targetTests(pkg + ".*")
|
||||
.verbose(true)
|
||||
|
|
Binary file not shown.
|
@ -1,8 +1,8 @@
|
|||
bld.downloadExtensionJavadoc=false
|
||||
bld.downloadExtensionSources=true
|
||||
bld.downloadLocation=
|
||||
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.2
|
||||
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.1.4
|
||||
bld.extension-exec=com.uwyn.rife2:bld-exec:1.0.5
|
||||
bld.extension-pmd=com.uwyn.rife2:bld-pmd:1.2.2
|
||||
bld.repositories=MAVEN_CENTRAL,MAVEN_LOCAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES
|
||||
bld.sourceDirectories=
|
||||
bld.version=2.0.1
|
||||
bld.version=2.2.1
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023-2025 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,10 +30,15 @@ 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(0, 9, 9);
|
||||
version = version(1, 0, 11, "SNAPSHOT");
|
||||
|
||||
javaRelease = 17;
|
||||
|
||||
|
@ -42,16 +47,16 @@ public class PitestOperationBuild extends Project {
|
|||
|
||||
repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, RIFE2_RELEASES, RIFE2_SNAPSHOTS);
|
||||
|
||||
var pitest = version(1, 16, 1);
|
||||
var pitest = version(1, 19, 1);
|
||||
scope(compile)
|
||||
.include(dependency("com.uwyn.rife2", "bld", version(2, 0, 1)));
|
||||
.include(dependency("com.uwyn.rife2", "bld", version(2, 2, 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, 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)));
|
||||
.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)));
|
||||
|
||||
javadocOperation()
|
||||
.javadocOptions()
|
||||
|
@ -62,28 +67,26 @@ 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"));
|
||||
|
@ -95,19 +98,23 @@ public class PitestOperationBuild extends Project {
|
|||
|
||||
@BuildCommand(summary = "Runs PMD analysis")
|
||||
public void pmd() throws Exception {
|
||||
new PmdOperation()
|
||||
.fromProject(this)
|
||||
.failOnViolation(true)
|
||||
.ruleSets("config/pmd.xml")
|
||||
.execute();
|
||||
pmdOp.execute();
|
||||
}
|
||||
|
||||
@BuildCommand(value = "pmd-cli", summary = "Runs PMD analysis (CLI)")
|
||||
public void pmdCli() throws Exception {
|
||||
pmdOp.includeLineNumber(false).execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void test() throws Exception {
|
||||
new ExecOperation()
|
||||
.fromProject(this)
|
||||
.command("scripts/cliargs.sh")
|
||||
.execute();
|
||||
var os = System.getProperty("os.name");
|
||||
if (os != null && os.toLowerCase().contains("linux")) {
|
||||
new ExecOperation()
|
||||
.fromProject(this)
|
||||
.command("scripts/cliargs.sh")
|
||||
.execute();
|
||||
}
|
||||
super.test();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023-2025 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,6 +22,7 @@ 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;
|
||||
|
@ -60,6 +61,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
|
@ -104,8 +106,20 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #avoidCallsTo(Collection)
|
||||
*/
|
||||
public PitestOperation avoidCallsTo(String... avoidCallTo) {
|
||||
options_.put("--avoidCallsTo", String.join(",", Arrays.stream(avoidCallTo).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -129,8 +143,31 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #classPath(Collection)
|
||||
*/
|
||||
public PitestOperation classPath(String... path) {
|
||||
options_.put("--classPath", String.join(",", Arrays.stream(path).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
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.
|
||||
* <p>
|
||||
* If a list is not explicitly supplied then PIT will default to a list of common logging packages as follows
|
||||
* <p>
|
||||
* <ul>
|
||||
* <li>java.util.logging</li>
|
||||
* <li>org.apache.log4j</li>
|
||||
* <li>org.slf4j</li>
|
||||
* <li>org.apache.commons.logging</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* 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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -145,6 +182,30 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
* <p>
|
||||
* If a list is not explicitly supplied then PIT will default to a list of common logging packages as follows
|
||||
* <p>
|
||||
* <ul>
|
||||
* <li>java.util.logging</li>
|
||||
* <li>org.apache.log4j</li>
|
||||
* <li>org.slf4j</li>
|
||||
* <li>org.apache.commons.logging</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* 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).
|
||||
*
|
||||
|
@ -158,6 +219,28 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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<File> 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> 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.
|
||||
|
@ -213,6 +296,23 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether to run in dry run mode.
|
||||
* <p>
|
||||
* 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.
|
||||
*
|
||||
|
@ -221,9 +321,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #excludedClasses(Collection)
|
||||
*/
|
||||
public PitestOperation excludedClasses(String... excludedClass) {
|
||||
options_.put("--excludedClasses",
|
||||
String.join(",", Arrays.stream(excludedClass).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return excludedClasses(List.of(excludedClass));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -247,9 +345,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #excludedGroups(Collection)
|
||||
*/
|
||||
public PitestOperation excludedGroups(String... excludedGroup) {
|
||||
options_.put("--excludedGroups",
|
||||
String.join(",", Arrays.stream(excludedGroup).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return excludedGroups(List.of(excludedGroup));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -273,9 +369,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #excludedMethods(Collection)
|
||||
*/
|
||||
public PitestOperation excludedMethods(String... excludedMethod) {
|
||||
options_.put("--excludedMethods",
|
||||
String.join(",", Arrays.stream(excludedMethod).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return excludedMethods(List.of(excludedMethod));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -311,8 +405,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #excludedTestClasses(Collection)
|
||||
*/
|
||||
public PitestOperation excludedTestClasses(String... testClasses) {
|
||||
options_.put("--excludedTestClasses", String.join(",", testClasses));
|
||||
return this;
|
||||
return excludedTestClasses(List.of(testClasses));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -352,9 +445,10 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
if (project_ != null) {
|
||||
args.add(javaTool());
|
||||
args.add("-cp");
|
||||
args.add(String.format("%s:%s:%s:%s", new File(project_.libTestDirectory(), "*"),
|
||||
new File(project_.libCompileDirectory(), "*"), project_.buildMainDirectory(),
|
||||
project_.buildTestDirectory()));
|
||||
args.add(buildClassPath(joinClasspathJar(project_.testClasspathJars()),
|
||||
joinClasspathJar(project_.compileClasspathJars()),
|
||||
joinClasspathJar(project_.providedClasspathJars()),
|
||||
project_.buildMainDirectory().getAbsolutePath(), project_.buildTestDirectory().getAbsolutePath()));
|
||||
args.add("org.pitest.mutationtest.commandline.MutationCoverageReport");
|
||||
|
||||
if (!options_.containsKey(SOURCE_DIRS)) {
|
||||
|
@ -369,6 +463,10 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
});
|
||||
}
|
||||
|
||||
if (LOGGER.isLoggable(Level.FINE)) {
|
||||
LOGGER.fine(String.join(" ", args));
|
||||
}
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
|
@ -438,8 +536,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #features(Collection)
|
||||
*/
|
||||
public PitestOperation features(String... feature) {
|
||||
options_.put("--features", String.join(",", Arrays.stream(feature).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return features(List.of(feature));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -470,6 +567,26 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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)
|
||||
|
@ -484,6 +601,28 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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
|
||||
|
@ -512,9 +651,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #includedGroups(Collection)
|
||||
*/
|
||||
public PitestOperation includedGroups(String... includedGroup) {
|
||||
options_.put("--includedGroups",
|
||||
String.join(",", Arrays.stream(includedGroup).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return includedGroups(List.of(includedGroup));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -563,6 +700,14 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
return s != null && !s.isBlank();
|
||||
}
|
||||
|
||||
private String joinClasspathJar(List<File> 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.
|
||||
|
@ -572,8 +717,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #jvmArgs(Collection)
|
||||
*/
|
||||
public PitestOperation jvmArgs(String... args) {
|
||||
options_.put("--jvmArgs", String.join(",", Arrays.stream(args).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return jvmArgs(List.of(args));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -603,6 +747,28 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
*
|
||||
|
@ -640,8 +806,43 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #mutableCodePaths(Collection)
|
||||
*/
|
||||
public PitestOperation mutableCodePaths(String... path) {
|
||||
options_.put("--mutableCodePaths", String.join(",", Arrays.stream(path).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* 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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -663,6 +864,42 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* 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<File> 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.
|
||||
* <p>
|
||||
* 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.
|
||||
* <p>
|
||||
* 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<Path> paths) {
|
||||
return mutableCodePaths(paths.stream().map(Path::toFile).map(File::getAbsolutePath).toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Mutation engine to use.
|
||||
* <p>
|
||||
|
@ -752,6 +989,34 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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}.
|
||||
* <p>
|
||||
* 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}.
|
||||
* <p>
|
||||
* 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}.
|
||||
|
@ -763,9 +1028,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #outputFormats(Collection)
|
||||
*/
|
||||
public PitestOperation outputFormats(String... outputFormat) {
|
||||
options_.put("--outputFormats",
|
||||
String.join(",", Arrays.stream(outputFormat).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return outputFormats(List.of(outputFormat));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -783,6 +1046,35 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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}.
|
||||
* <p>
|
||||
* Defaults to {@code HTML}.
|
||||
*
|
||||
* @param outputFormats the list of output formats
|
||||
* @return this operation instance
|
||||
* @see #outputFormats(File...)
|
||||
*/
|
||||
public PitestOperation outputFormatsFiles(Collection<File> 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}.
|
||||
* <p>
|
||||
* Defaults to {@code HTML}.
|
||||
*
|
||||
* @param outputFormats the list of output formats
|
||||
* @return this operation instance
|
||||
* @see #outputFormats(Path...)
|
||||
*/
|
||||
public PitestOperation outputFormatsPaths(Collection<Path> outputFormats) {
|
||||
return outputFormats(outputFormats.stream().map(Path::toFile).map(File::getAbsolutePath).toList());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom plugin properties.
|
||||
*
|
||||
|
@ -806,6 +1098,27 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
*
|
||||
|
@ -819,6 +1132,26 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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.
|
||||
* <p>
|
||||
|
@ -844,8 +1177,29 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #sourceDirs(Collection)
|
||||
*/
|
||||
public PitestOperation sourceDirs(String... dir) {
|
||||
options_.put(SOURCE_DIRS, String.join(",", Arrays.stream(dir).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -860,6 +1214,29 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
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<File> 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<Path> 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.
|
||||
* <p>
|
||||
|
@ -892,8 +1269,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #targetClasses(String...)
|
||||
*/
|
||||
public PitestOperation targetClasses(String... targetClass) {
|
||||
options_.put("--targetClasses", String.join(",", Arrays.stream(targetClass).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return targetClasses(List.of(targetClass));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -909,8 +1285,7 @@ public class PitestOperation extends AbstractProcessOperation<PitestOperation> {
|
|||
* @see #targetTests(Collection)
|
||||
*/
|
||||
public PitestOperation targetTests(String... test) {
|
||||
options_.put("--targetTests", String.join(",", Arrays.stream(test).filter(this::isNotBlank).toList()));
|
||||
return this;
|
||||
return targetTests(List.of(test));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2023-2024 the original author or authors.
|
||||
* Copyright 2023-2025 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,12 +16,16 @@
|
|||
|
||||
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;
|
||||
|
@ -33,11 +37,12 @@ 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 final static String BAR = "bar";
|
||||
private final static String FOO = "foo";
|
||||
private final static String FOOBAR = FOO + ',' + BAR;
|
||||
private static final String BAR = "bar";
|
||||
private static final String FOO = "foo";
|
||||
private static final String FOOBAR = FOO + ',' + BAR;
|
||||
|
||||
@Test
|
||||
void argLine() {
|
||||
|
@ -61,6 +66,7 @@ class PitestOperationTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
@EnabledOnOs(OS.LINUX)
|
||||
void checkAllParameters() throws IOException {
|
||||
var args = Files.readAllLines(Paths.get("src", "test", "resources", "pitest-args.txt"));
|
||||
|
||||
|
@ -74,6 +80,7 @@ class PitestOperationTest {
|
|||
.classPathFile(FOO)
|
||||
.coverageThreshold(0)
|
||||
.detectInlinedCode(false)
|
||||
.dryRun(false)
|
||||
.excludedClasses("class")
|
||||
.excludedClasses(List.of(FOO, BAR))
|
||||
.excludedGroups("group")
|
||||
|
@ -119,15 +126,17 @@ class PitestOperationTest {
|
|||
.verbosity("default")
|
||||
.executeConstructProcessCommandList();
|
||||
|
||||
for (var p : args) {
|
||||
var found = false;
|
||||
for (var a : params) {
|
||||
if (a.startsWith(p)) {
|
||||
found = true;
|
||||
break;
|
||||
try (var softly = new AutoCloseableSoftAssertions()) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -589,6 +598,175 @@ 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()
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
--classPathFile
|
||||
--coverageThreshold
|
||||
--detectInlinedCode
|
||||
--dryRun
|
||||
--excludedClasses
|
||||
--excludedGroups
|
||||
--excludedMethods
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue