View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.coverage.reporting.lineCoverage;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   import edu.umd.cs.findbugs.annotations.Nullable;
9   
10  import java.util.List;
11  
12  import mockit.coverage.CallPoint;
13  import mockit.coverage.lines.LineCoverageData;
14  import mockit.coverage.lines.PerFileLineCoverage;
15  import mockit.coverage.reporting.ListOfCallPoints;
16  import mockit.coverage.reporting.parsing.LineParser;
17  
18  final class LineCoverageFormatter {
19      @NonNull
20      private final StringBuilder formattedLine;
21      @NonNull
22      private final LineSegmentsFormatter segmentsFormatter;
23      @Nullable
24      private final ListOfCallPoints listOfCallPoints;
25  
26      LineCoverageFormatter(boolean withCallPoints) {
27          formattedLine = new StringBuilder(200);
28          segmentsFormatter = new LineSegmentsFormatter(withCallPoints, formattedLine);
29          listOfCallPoints = withCallPoints ? new ListOfCallPoints() : null;
30      }
31  
32      String format(@NonNull LineParser lineParser, @NonNull PerFileLineCoverage lineCoverageData) {
33          formattedLine.setLength(0);
34          formattedLine.append("<pre class='pp");
35  
36          int line = lineParser.getNumber();
37          LineCoverageData lineData = lineCoverageData.getLineData(line);
38  
39          if (lineData.containsBranches()) {
40              formatLineWithMultipleSegments(lineParser, lineData);
41          } else {
42              formatLineWithSingleSegment(lineParser, lineData);
43          }
44  
45          return formattedLine.toString();
46      }
47  
48      private void formatLineWithMultipleSegments(@NonNull LineParser lineParser, @NonNull LineCoverageData lineData) {
49          formattedLine.append(" jmp'>");
50          segmentsFormatter.formatSegments(lineParser, lineData);
51      }
52  
53      private void formatLineWithSingleSegment(@NonNull LineParser lineParser, @NonNull LineCoverageData lineData) {
54          formattedLine.append(lineData.isCovered() ? " cvd" : " uncvd");
55  
56          List<CallPoint> callPoints = lineData.getCallPoints();
57  
58          if (listOfCallPoints != null && callPoints != null) {
59              formattedLine.append(" cp' onclick='sh(this)");
60          }
61  
62          formattedLine.append("' id='l").append(lineParser.getNumber()).append("s0'>");
63          String content = lineParser.getInitialElement().toString();
64          formattedLine.append(content).append("</pre>");
65  
66          if (listOfCallPoints != null) {
67              listOfCallPoints.insertListOfCallPoints(callPoints);
68              formattedLine.append(listOfCallPoints.getContents());
69          }
70      }
71  }