diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java b/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java index cc40b6be1..4264e004c 100644 --- a/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java +++ b/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java @@ -16,7 +16,7 @@ */ import java.util.Collection; -import java.util.function.Consumer; +import java.util.List; import java.util.function.Predicate; import org.pitest.classinfo.ClassInfo; @@ -29,11 +29,11 @@ public class DefaultBuildVerifier implements BuildVerifier { @Override public void verify(final CodeSource code) { - final Collection codeClasses = FCollection.filter(code.getCode(), isNotSynthetic()); + final List codeClasses = FCollection.filter(code.getCode(), isNotSynthetic()); if (hasMutableCode(codeClasses)) { checkAtLeastOneClassHasLineNumbers(codeClasses); - codeClasses.forEach(throwErrorIfHasNoSourceFile()); + checkAtLeastOneClassHasSourceFile(codeClasses); } } @@ -54,6 +54,14 @@ private void checkAtLeastOneClassHasLineNumbers( } } + private void checkAtLeastOneClassHasSourceFile(List codeClasses) { + // perform only a weak check for line numbers as + // some jvm languages are not guaranteed to include a source file for all classes + if (!FCollection.contains(codeClasses, a -> a.getSourceFileName() != null)) { + throw new PitHelpError(Help.NO_SOURCE_FILE, codeClasses.get(0).getName().asJavaName()); + } + } + private static Predicate aConcreteClass() { return a -> !a.isInterface(); } @@ -62,14 +70,6 @@ private static Predicate aClassWithLineNumbers() { return a -> a.getNumberOfCodeLines() != 0; } - private Consumer throwErrorIfHasNoSourceFile() { - return a -> { - if (a.getSourceFileName() == null) { - throw new PitHelpError(Help.NO_SOURCE_FILE, a.getName().asJavaName()); - } - }; - } - private static Predicate isNotSynthetic() { return a -> !a.isSynthetic(); } diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java index cdfa123a9..85f22c704 100644 --- a/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java +++ b/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java @@ -15,6 +15,7 @@ package org.pitest.mutationtest.verify; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; @@ -105,6 +106,12 @@ public void shouldNotThrowAnErrorWhenOnlyInterfacesPresent() { } } + @Test + public void doesNotErrorWhenNoClassesProvided() { + when(this.code.getCode()).thenReturn(Collections.emptyList()); + assertThatCode(() -> this.testee.verify(this.code)).doesNotThrowAnyException(); + } + private void setupClassPath(final Class clazz) { this.setupClassPath( new ClassloaderByteArraySource(IsolationUtils.getContextClassLoader()),