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.data;
7   
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   import edu.umd.cs.findbugs.annotations.Nullable;
10  
11  import java.io.Serializable;
12  
13  import mockit.coverage.CoveragePercentage;
14  import mockit.coverage.TestRun;
15  import mockit.coverage.dataItems.PerFileDataCoverage;
16  import mockit.coverage.lines.PerFileLineCoverage;
17  
18  import org.checkerframework.checker.index.qual.NonNegative;
19  
20  /**
21   * Coverage data gathered for the lines, branching points, and fields of a single source file.
22   */
23  public final class FileCoverageData implements Serializable {
24      private static final long serialVersionUID = 3508572808457541012L;
25  
26      @NonNull
27      private static final PerFileLineCoverage NO_LINE_INFO = new PerFileLineCoverage();
28      @NonNull
29      private static final PerFileDataCoverage NO_DATA_INFO = new PerFileDataCoverage();
30  
31      @NonNull
32      public PerFileLineCoverage lineCoverageInfo;
33      @NonNull
34      public PerFileDataCoverage dataCoverageInfo;
35  
36      // Used for fast indexed access.
37      @NonNegative
38      public final int index;
39  
40      // Used for output styling in the HTML report.
41      @Nullable
42      public String kindOfTopLevelType;
43  
44      // Used to track the last time the ".class" file was modified, to decide if merging can be done.
45      @NonNegative
46      long lastModified;
47  
48      private final boolean loadedAfterTestCompletion;
49  
50      FileCoverageData(@NonNegative int index, @Nullable String kindOfTopLevelType) {
51          this.index = index;
52          this.kindOfTopLevelType = kindOfTopLevelType;
53          lineCoverageInfo = new PerFileLineCoverage();
54          dataCoverageInfo = new PerFileDataCoverage();
55          loadedAfterTestCompletion = TestRun.isTerminated();
56      }
57  
58      boolean wasLoadedAfterTestCompletion() {
59          return loadedAfterTestCompletion;
60      }
61  
62      @NonNull
63      public PerFileLineCoverage getLineCoverageData() {
64          return lineCoverageInfo;
65      }
66  
67      @NonNegative
68      public int getTotalItems() {
69          return lineCoverageInfo.getTotalItems() + dataCoverageInfo.getTotalItems();
70      }
71  
72      @NonNegative
73      public int getCoveredItems() {
74          return lineCoverageInfo.getCoveredItems() + dataCoverageInfo.getCoveredItems();
75      }
76  
77      public int getCoveragePercentage() {
78          int totalItems = getTotalItems();
79          int coveredItems = getCoveredItems();
80          return CoveragePercentage.calculate(coveredItems, totalItems);
81      }
82  
83      void mergeWithDataFromPreviousTestRun(@NonNull FileCoverageData previousInfo) {
84          if (lineCoverageInfo == NO_LINE_INFO) {
85              lineCoverageInfo = previousInfo.lineCoverageInfo;
86          } else if (previousInfo.lineCoverageInfo != NO_LINE_INFO) {
87              lineCoverageInfo.mergeInformation(previousInfo.lineCoverageInfo);
88          }
89  
90          if (dataCoverageInfo == NO_DATA_INFO) {
91              dataCoverageInfo = previousInfo.dataCoverageInfo;
92          } else if (previousInfo.dataCoverageInfo != NO_DATA_INFO) {
93              dataCoverageInfo.mergeInformation(previousInfo.dataCoverageInfo);
94          }
95      }
96  }