/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.coverage.reporting.pathCoverage;
import java.io.*;
import java.util.*;
import javax.annotation.*;
import mockit.coverage.paths.*;
final class PathCoverageFormatter
{
@Nonnull private final PrintWriter output;
@Nonnull private final StringBuilder lineSegmentIds;
private char pathId1;
private char pathId2;
PathCoverageFormatter(@Nonnull PrintWriter output)
{
this.output = output;
lineSegmentIds = new StringBuilder(100);
}
void writeInformationForEachPath(@Nonnull List<Path> paths)
{
pathId1 = 'A';
pathId2 = '\0';
for (Path path : paths) {
writeCoverageInfoForIndividualPath(path);
if (pathId2 == '\0' && pathId1 < 'Z') {
pathId1++;
}
else if (pathId2 == '\0') {
pathId1 = 'A';
pathId2 = 'A';
}
else if (pathId2 < 'Z') {
pathId2++;
}
else {
pathId1++;
pathId2 = 'A';
}
}
}
private void writeCoverageInfoForIndividualPath(@Nonnull Path path)
{
int executionCount = path.getExecutionCount();
String lineSegmentIdsForPath = getIdsForLineSegmentsBelongingToThePath(path);
output.write(" <span class='");
output.write(executionCount == 0 ? "uncovered" : "covered");
output.write("' onclick=\"showPath(this,'");
output.write(lineSegmentIdsForPath);
output.write("')\">");
writePathId();
output.write(": ");
output.print(executionCount);
output.println("</span>");
}
@Nonnull
private String getIdsForLineSegmentsBelongingToThePath(@Nonnull Path path)
{
lineSegmentIds.setLength(0);
int previousLine = 0;
int previousSegment = 0;
for (Node node : path.getNodes()) {
int line = node.line;
int segment = node.getSegment();
if (line > previousLine) {
appendSegmentId(line, segment);
previousLine = line;
}
else if (segment > previousSegment) {
appendSegmentId(line, segment);
}
previousSegment = segment;
}
return lineSegmentIds.toString();
}
private void appendSegmentId(int line, int segment)
{
if (lineSegmentIds.length() > 0) {
lineSegmentIds.append(' ');
}
lineSegmentIds.append('l').append(line).append('s').append(segment);
}
private void writePathId()
{
output.write(pathId1);
if (pathId2 != '\0') {
output.write(pathId2);
}
}
}