diff --git a/pitest-entry/pom.xml b/pitest-entry/pom.xml
index d92a87417..67089b7df 100644
--- a/pitest-entry/pom.xml
+++ b/pitest-entry/pom.xml
@@ -129,6 +129,13 @@
asm-util
${asm.version}
+
+
+ org.apache.commons
+ commons-text
+ 1.10.0
+
+
org.pitest
pitest
diff --git a/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java b/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
index 300681211..c78d69b52 100644
--- a/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
+++ b/pitest-entry/src/main/java/org/pitest/coverage/export/DefaultCoverageExporter.java
@@ -7,11 +7,11 @@
import java.util.Collections;
import java.util.List;
+import org.apache.commons.text.StringEscapeUtils;
import org.pitest.coverage.BlockCoverage;
import org.pitest.coverage.CoverageExporter;
import org.pitest.mutationtest.engine.Location;
import org.pitest.util.ResultOutputStrategy;
-import org.pitest.util.StringUtil;
import org.pitest.util.Unchecked;
/**
@@ -48,14 +48,14 @@ private void writeLineCoverage(final BlockCoverage each, final Writer out) {
out,
"");
write(out, "\n");
final List ts = new ArrayList<>(each.getTests());
Collections.sort(ts);
for (final String test : ts) {
- write(out, "\n");
+ write(out, "\n");
}
write(out, "\n");
write(out, "\n");
diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java b/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
index 0109b3ee4..57280fa72 100644
--- a/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
+++ b/pitest-entry/src/main/java/org/pitest/mutationtest/report/xml/XMLReportListener.java
@@ -35,12 +35,13 @@
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
+
+import org.apache.commons.text.StringEscapeUtils;
import org.pitest.mutationtest.ClassMutationResults;
import org.pitest.mutationtest.MutationResult;
import org.pitest.mutationtest.MutationResultListener;
import org.pitest.mutationtest.engine.MutationDetails;
import org.pitest.util.ResultOutputStrategy;
-import org.pitest.util.StringUtil;
import org.pitest.util.Unchecked;
enum Tag {
@@ -101,7 +102,7 @@ private String makeMutationNode(final MutationResult mutation) {
}
private String clean(final String value) {
- return StringUtil.escapeBasicHtmlChars(value);
+ return StringEscapeUtils.escapeXml11(value);
}
private String makeNode(final String value, final String attributes,
diff --git a/pitest-entry/src/test/java/org/pitest/coverage/export/DefaultCoverageExporterTest.java b/pitest-entry/src/test/java/org/pitest/coverage/export/DefaultCoverageExporterTest.java
index 8bc3607c5..ac9b33ad8 100644
--- a/pitest-entry/src/test/java/org/pitest/coverage/export/DefaultCoverageExporterTest.java
+++ b/pitest-entry/src/test/java/org/pitest/coverage/export/DefaultCoverageExporterTest.java
@@ -83,9 +83,26 @@ public void shouldEscapeSpecialCharsInTestName() {
final String actual = this.out.toString();
assertThat(actual).contains(
- "\n\n");
+ "\n\n");
assertThat(actual).contains(
- "\n\n");
+ "\n\n");
+ }
+
+ @Test
+ public void escapesQuotesBackTicks() {
+ final LocationBuilder loc = aLocation().withMethod("method");
+ final BlockLocationBuilder block = aBlockLocation().withBlock(42);
+ final Collection coverage = Arrays.asList(
+ new BlockCoverage(
+ block.withLocation(loc.withClass(ClassName.fromString("Foo"))).build(),
+ Collections.singletonList("`escape this ' quote`"))
+ );
+
+ testee.recordCoverage(coverage);
+
+ final String actual = this.out.toString();
+ assertThat(actual).contains(
+ "\n\n");
}
}
diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/report/xml/XMLReportListenerTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/report/xml/XMLReportListenerTest.java
index 2137fa204..ac5c4a6d4 100644
--- a/pitest-entry/src/test/java/org/pitest/mutationtest/report/xml/XMLReportListenerTest.java
+++ b/pitest-entry/src/test/java/org/pitest/mutationtest/report/xml/XMLReportListenerTest.java
@@ -78,7 +78,7 @@ public void shouldEscapeGTAndLTSymbols() {
final MutationResult mr = createdKilledMutationWithKillingTestOf("");
this.testee
.handleMutationResult(MutationTestResultMother.createClassResults(mr));
- assertThat(this.out.toString()).contains("<foo>");
+ assertThat(this.out.toString()).contains("<foo>");
}
@Test
@@ -86,7 +86,7 @@ public void shouldEscapeNullBytes() {
final MutationResult mr = createdKilledMutationWithKillingTestOf("\0 Null-Byte");
this.testee
.handleMutationResult(MutationTestResultMother.createClassResults(mr));
- assertThat(this.out.toString()).contains("\\0 Null-Byte");
+ assertThat(this.out.toString()).contains(" Null-Byte");
}
private MutationResult createdKilledMutationWithKillingTestOf(