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