1
2
3
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 }