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.packages;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   import edu.umd.cs.findbugs.annotations.Nullable;
9   
10  import java.io.PrintWriter;
11  import java.util.Arrays;
12  import java.util.Collection;
13  import java.util.List;
14  import java.util.Map;
15  
16  import mockit.coverage.data.FileCoverageData;
17  
18  import org.checkerframework.checker.index.qual.NonNegative;
19  
20  final class PackageCoverageReport extends ListWithFilesAndPercentages {
21      @NonNull
22      private final Map<String, FileCoverageData> filesToFileData;
23      @Nullable
24      private final Collection<String> sourceFilesNotFound;
25      @NonNull
26      private final char[] fileNameWithSpaces;
27  
28      PackageCoverageReport(@NonNull PrintWriter output, @Nullable Collection<String> sourceFilesNotFound,
29              @NonNull Map<String, FileCoverageData> filesToFileData,
30              @NonNull Collection<List<String>> allSourceFileNames) {
31          super(output, "          ");
32          this.sourceFilesNotFound = sourceFilesNotFound;
33          this.filesToFileData = filesToFileData;
34          fileNameWithSpaces = new char[maximumSourceFileNameLength(allSourceFileNames)];
35      }
36  
37      @NonNegative
38      private static int maximumSourceFileNameLength(@NonNull Collection<List<String>> allSourceFileNames) {
39          int maxLength = 0;
40  
41          for (List<String> files : allSourceFileNames) {
42              for (String fileName : files) {
43                  int n = fileName.length();
44  
45                  if (n > maxLength) {
46                      maxLength = n;
47                  }
48              }
49          }
50  
51          return maxLength;
52      }
53  
54      @Override
55      protected void writeMetricsForFile(@Nullable String packageName, @NonNull String fileName) {
56          String filePath = packageName == null || packageName.isEmpty() ? fileName : packageName + '/' + fileName;
57          FileCoverageData fileData = filesToFileData.get(filePath);
58  
59          writeRowStart();
60          printIndent();
61          output.write("  <td class='");
62          output.write(fileData.kindOfTopLevelType != null ? fileData.kindOfTopLevelType : "cls");
63          output.write("'>");
64  
65          int fileNameLength = buildFileNameWithTrailingSpaces(fileName);
66          writeTableCellWithFileName(filePath, fileNameLength);
67          writeCodeCoverageMetricForFile(fileData);
68          writeRowClose();
69      }
70  
71      @NonNegative
72      private int buildFileNameWithTrailingSpaces(@NonNull String fileName) {
73          int n = fileName.length();
74  
75          fileName.getChars(0, n, fileNameWithSpaces, 0);
76          Arrays.fill(fileNameWithSpaces, n, fileNameWithSpaces.length, ' ');
77  
78          return n;
79      }
80  
81      private void writeTableCellWithFileName(@NonNull String filePath, @NonNegative int fileNameLen) {
82          if (sourceFilesNotFound == null || sourceFilesNotFound.contains(filePath)) {
83              output.write(fileNameWithSpaces);
84          } else {
85              output.write("<a href='");
86              int p = filePath.lastIndexOf('.');
87              output.write(filePath.substring(0, p));
88              output.write(".html'>");
89              output.write(fileNameWithSpaces, 0, fileNameLen);
90              output.write("</a>");
91              output.write(fileNameWithSpaces, fileNameLen, fileNameWithSpaces.length - fileNameLen);
92          }
93  
94          output.println("</td>");
95      }
96  
97      private void writeCodeCoverageMetricForFile(@NonNull FileCoverageData coverageInfo) {
98          int percentage = coverageInfo.getCoveragePercentage();
99          int covered = coverageInfo.getCoveredItems();
100         int total = coverageInfo.getTotalItems();
101 
102         coveredItems += covered;
103         totalItems += total;
104 
105         printCoveragePercentage(covered, total, percentage);
106     }
107 }