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