/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.coverage.reporting.lineCoverage;
import java.util.*;
import javax.annotation.*;
import static java.lang.Character.*;
import mockit.coverage.*;
import mockit.coverage.lines.*;
import mockit.coverage.reporting.*;
import mockit.coverage.reporting.parsing.*;
final class LineSegmentsFormatter
{
@Nullable private final ListOfCallPoints listOfCallPoints;
@Nonnull private final StringBuilder formattedLine;
// Helper fields:
private int lineNumber;
private int segmentIndex;
private LineSegmentData segmentData;
@Nullable private LineElement element;
LineSegmentsFormatter(boolean withCallPoints, @Nonnull StringBuilder formattedLine)
{
listOfCallPoints = withCallPoints ? new ListOfCallPoints() : null;
this.formattedLine = formattedLine;
}
void formatSegments(@Nonnull LineParser lineParser, @Nonnull LineCoverageData lineData)
{
lineNumber = lineParser.getNumber();
List<BranchCoverageData> branchData = lineData.getBranches();
int numSegments = lineData.getNumberOfSegments();
element = lineParser.getInitialElement().appendUntilNextCodeElement(formattedLine);
segmentIndex = 0;
segmentData = lineData;
appendUntilNextBranchingPoint();
while (element != null && segmentIndex < numSegments) {
segmentData = segmentIndex == 0 ? lineData : branchData.get(segmentIndex - 1);
element = element.appendUntilNextCodeElement(formattedLine);
appendUntilNextBranchingPoint();
}
if (element != null) {
element.appendAllBefore(formattedLine, null);
}
formattedLine.append("</pre>");
if (listOfCallPoints != null) {
formattedLine.append(listOfCallPoints.getContents());
}
}
private void appendUntilNextBranchingPoint()
{
if (element != null) {
LineElement firstElement = element;
element = element.findNextBranchingPoint();
appendToFormattedLine(firstElement);
if (element != null && element.isBranchingElement()) {
formattedLine.append(element.getText());
element = element.getNext();
}
}
}
private void appendToFormattedLine(@Nonnull LineElement firstElement)
{
if (firstElement != element) {
appendStartTag();
firstElement.appendAllBefore(formattedLine, element);
appendEndTag();
segmentIndex++;
}
}
private void appendStartTag()
{
formattedLine.append("<span id='l").append(lineNumber).append('s').append(segmentIndex);
formattedLine.append("' title='Executions: ").append(segmentData.getExecutionCount()).append("' ");
if (segmentData.isCovered()) {
if (segmentData.containsCallPoints()) {
formattedLine.append("class='covered cp' onclick='showHide(this,").append(segmentIndex).append(")'>");
}
else {
formattedLine.append("class='covered'>");
}
}
else {
formattedLine.append("class='uncovered'>");
}
}
private void appendEndTag()
{
int i = formattedLine.length() - 1;
while (isWhitespace(formattedLine.charAt(i))) {
i--;
}
formattedLine.insert(i + 1, "</span>");
if (listOfCallPoints != null) {
List<CallPoint> callPoints = segmentData.getCallPoints();
listOfCallPoints.insertListOfCallPoints(callPoints);
}
}
}