494 lines
17 KiB
Java
494 lines
17 KiB
Java
/*
|
|
* 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.
|
|
* 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.
|
|
*/
|
|
|
|
package rife.bld.extension;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
import rife.bld.BaseProject;
|
|
import rife.bld.Project;
|
|
import rife.bld.WebProject;
|
|
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
|
import static rife.bld.extension.PitestOperation.*;
|
|
|
|
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;
|
|
|
|
@Test
|
|
void argLine() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.argLine(FOO);
|
|
assertThat(op.options.get("--argLine")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void avoidCallsTo() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.avoidCallsTo(FOO, BAR);
|
|
assertThat(op.options.get("--avoidCallsTo")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.avoidCallsTo(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--avoidCallsTo")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void classPath() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.classPath(FOO, BAR);
|
|
assertThat(op.options.get("--classPath")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.classPath(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--classPath")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void classPathFile() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.classPathFile(FOO);
|
|
assertThat(op.options.get("--classPathFile")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void coverageThreshold() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.coverageThreshold(3);
|
|
assertThat(op.options.get("--coverageThreshold")).isEqualTo("3");
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.coverageThreshold(101);
|
|
assertThat(op.options.get("--coverageThreshold")).isNull();
|
|
}
|
|
|
|
@Test
|
|
void detectInlinedCode() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.detectInlinedCode(true);
|
|
assertThat(op.options.get("--detectInlinedCode")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.detectInlinedCode(false);
|
|
assertThat(op.options.get("--detectInlinedCode")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void excludedClasses() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.excludedClasses(FOO, BAR);
|
|
assertThat(op.options.get("--excludedClasses")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.excludedClasses(Set.of(FOO, BAR));
|
|
assertThat(op.options.get("--excludedClasses")).as("as set").contains(FOO).contains(BAR).contains(",");
|
|
}
|
|
|
|
@Test
|
|
void excludedGroups() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.excludedGroups(FOO, BAR);
|
|
assertThat(op.options.get("--excludedGroups")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.excludedGroups(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--excludedGroups")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void excludedMethods() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.excludedMethods(FOO, BAR);
|
|
assertThat(op.options.get("--excludedMethods")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.excludedMethods(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--excludedMethods")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void excludedTests() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.excludedTests(FOO, BAR);
|
|
assertThat(op.options.get("--excludedTests")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.excludedTests(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--excludedTests")).as("as list").isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void execute() throws IOException {
|
|
var tmpDir = Files.createTempDirectory("bld-pitest-");
|
|
tmpDir.toFile().deleteOnExit();
|
|
var op = new PitestOperation().
|
|
fromProject(new WebProject())
|
|
.reportDir(tmpDir.toAbsolutePath().toString())
|
|
.targetClasses("com.example.*")
|
|
.targetTests("com.example.*")
|
|
.verbose(true)
|
|
.failWhenNoMutations(false)
|
|
.sourceDirs("examples/src");
|
|
|
|
assertThatCode(op::execute).doesNotThrowAnyException();
|
|
assertThat(tmpDir).isEmptyDirectory();
|
|
}
|
|
|
|
@Test
|
|
void executeConstructProcessCommandList() {
|
|
var op = new PitestOperation().
|
|
fromProject(new WebProject())
|
|
.reportDir("outputdir")
|
|
.targetClasses("com.your.package.tobemutated*")
|
|
.targetTests("com.your.package.*")
|
|
.sourceDirs("parthsource");
|
|
|
|
assertThat(String.join(" ", op.executeConstructProcessCommandList())).endsWith(
|
|
" org.pitest.mutationtest.commandline.MutationCoverageReport " +
|
|
"--targetTests com.your.package.* " +
|
|
"--reportDir outputdir " +
|
|
"--targetClasses com.your.package.tobemutated* " +
|
|
"--sourceDirs parthsource");
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.reportDir("c:\\mutationReports")
|
|
.targetClasses("example.foo.*")
|
|
.sourceDirs("c:\\myProject\\src")
|
|
.targetTests("example.foo*")
|
|
.threads(2)
|
|
.excludedMethods("hashcode", "equals");
|
|
assertThat(String.join(" ", op.executeConstructProcessCommandList())).as("mutationReports").endsWith(
|
|
"org.pitest.mutationtest.commandline.MutationCoverageReport " +
|
|
"--targetTests example.foo* " +
|
|
"--threads 2 " +
|
|
"--excludedMethods hashcode,equals " +
|
|
"--reportDir c:\\mutationReports " +
|
|
"--targetClasses example.foo.* " +
|
|
"--sourceDirs c:\\myProject\\src");
|
|
}
|
|
|
|
@Test
|
|
void exportLineCoverage() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.exportLineCoverage(true);
|
|
assertThat(op.options.get("--exportLineCoverage")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.exportLineCoverage(false);
|
|
assertThat(op.options.get("--exportLineCoverage")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void failWhenNoMutations() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.failWhenNoMutations(true);
|
|
assertThat(op.options.get("--failWhenNoMutations")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.failWhenNoMutations(false);
|
|
assertThat(op.options.get("--failWhenNoMutations")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void features() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.features(FOO, BAR);
|
|
assertThat(op.options.get("--features")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.features(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--features")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void historyInputLocation() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.historyInputLocation(FOO);
|
|
assertThat(op.options.get("--historyInputLocation")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void historyOutputLocation() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.historyOutputLocation(FOO);
|
|
assertThat(op.options.get("--historyOutputLocation")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void includeLaunchClasspath() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.includeLaunchClasspath(true);
|
|
assertThat(op.options.get("--includeLaunchClasspath")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.includeLaunchClasspath(false);
|
|
assertThat(op.options.get("--includeLaunchClasspath")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void includedGroups() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.includedGroups(FOO, BAR);
|
|
assertThat(op.options.get("--includedGroups")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.includedGroups(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--includedGroups")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void jvmArgs() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.jvmArgs(FOO, BAR);
|
|
assertThat(op.options.get("--jvmArgs")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.jvmArgs(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--jvmArgs")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void jvmPath() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.jvmPath(FOO);
|
|
assertThat(op.options.get("--jvmPath")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void mutableCodePaths() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.mutableCodePaths(FOO, BAR);
|
|
assertThat(op.options.get("--mutableCodePaths")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.mutableCodePaths(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--mutableCodePaths")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void mutationThreshold() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.mutationThreshold(3);
|
|
assertThat(op.options.get("--mutationThreshold")).isEqualTo("3");
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.mutationThreshold(101);
|
|
assertThat(op.options.get("--mutationThreshold")).isNull();
|
|
}
|
|
|
|
@Test
|
|
void mutators() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.mutators(FOO, BAR);
|
|
assertThat(op.options.get("--mutators")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.mutators(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--mutators")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void outputEncoding() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.outputEncoding(FOO);
|
|
assertThat(op.options.get("--outputEncoding")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void outputFormats() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.outputFormats(FOO, BAR);
|
|
assertThat(op.options.get("--outputFormats")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.outputFormats(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--outputFormats")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void reportDir() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.reportDir(FOO);
|
|
assertThat(op.options.get("--reportDir")).isEqualTo(FOO);
|
|
}
|
|
|
|
@Test
|
|
void skipFailingTests() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.skipFailingTests(true);
|
|
assertThat(op.options.get("--skipFailingTests")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.skipFailingTests(false);
|
|
assertThat(op.options.get("--skipFailingTests")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void sourceDirs() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.sourceDirs(FOO, BAR);
|
|
assertThat(op.options.get(SOURCE_DIRS)).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.sourceDirs(List.of(FOO, BAR));
|
|
assertThat(op.options.get(SOURCE_DIRS)).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void targetClasses() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.targetClasses(FOO, BAR);
|
|
assertThat(op.options.get("--targetClasses")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.targetClasses(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--targetClasses")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void targetTests() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.targetTests(FOO, BAR);
|
|
assertThat(op.options.get("--targetTests")).isEqualTo(FOOBAR);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.targetTests(List.of(FOO, BAR));
|
|
assertThat(op.options.get("--targetTests")).as(AS_LIST).isEqualTo(FOOBAR);
|
|
}
|
|
|
|
@Test
|
|
void threads() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.threads(3);
|
|
assertThat(op.options.get("--threads")).isEqualTo("3");
|
|
}
|
|
|
|
@Test
|
|
void timeoutConst() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.timeoutConst(300);
|
|
assertThat(op.options.get("--timeoutConst")).isEqualTo("300");
|
|
}
|
|
|
|
@Test
|
|
void timeoutFactor() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.timeoutFactor(5.25);
|
|
assertThat(op.options.get("--timeoutFactor")).isEqualTo("5.25");
|
|
}
|
|
|
|
@Test
|
|
void timestampedReports() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.timestampedReports(true);
|
|
assertThat(op.options.get("--timestampedReports")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.timestampedReports(false);
|
|
assertThat(op.options.get("--timestampedReports")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void useClasspathJar() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.useClasspathJar(true);
|
|
assertThat(op.options.get("--useClasspathJar")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.useClasspathJar(false);
|
|
assertThat(op.options.get("--useClasspathJar")).isEqualTo(FALSE);
|
|
}
|
|
|
|
@Test
|
|
void verbose() {
|
|
var op = new PitestOperation()
|
|
.fromProject(new BaseProject())
|
|
.verbose(true);
|
|
assertThat(op.options.get("--verbose")).isEqualTo(TRUE);
|
|
|
|
op = new PitestOperation()
|
|
.fromProject(new Project())
|
|
.verbose(false);
|
|
assertThat(op.options.get("--verbose")).isEqualTo(FALSE);
|
|
}
|
|
}
|