package org.pitest.coverage.export;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
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;
/**
* Quick and dirty export of coverage data into XML
*/
public class DefaultCoverageExporter implements CoverageExporter {
private final ResultOutputStrategy outputStrategy;
public DefaultCoverageExporter(final ResultOutputStrategy outputStrategy) {
this.outputStrategy = outputStrategy;
}
@Override
public void recordCoverage(final Collection<BlockCoverage> coverage) {
final Writer out = this.outputStrategy
.createWriterForFile("linecoverage.xml");
writeHeader(out);
for (final BlockCoverage each : coverage) {
writeLineCoverage(each, out);
}
writeFooterAndClose(out);
}
private void writeHeader(final Writer out) {
write(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
write(out, "<coverage>\n");
}
private void writeLineCoverage(final BlockCoverage each, final Writer out) {
Location l = each.getBlock().getLocation();
write(
out,
"<block classname='" + l.getClassName().asJavaName() + "'"
+ " method='"
+ StringUtil.escapeBasicHtmlChars(l.getMethodName().name()) + StringUtil.escapeBasicHtmlChars(l.getMethodDesc())
+ "' number='" + each.getBlock().getBlock() + "'>");
write(out, "<tests>\n");
final List<String> ts = new ArrayList<String>(each.getTests());
Collections.sort(ts);
for (final String test : ts) {
write(out, "<test name='" + test + "'/>\n");
}
write(out, "</tests>\n");
write(out, "</block>\n");
}
private void writeFooterAndClose(final Writer out) {
try {
write(out, "</coverage>\n");
out.close();
} catch (final IOException e) {
throw Unchecked.translateCheckedException(e);
}
}
private void write(final Writer out, final String value) {
try {
out.write(value);
} catch (final IOException e) {
throw Unchecked.translateCheckedException(e);
}
}
}