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.dataItems;
7   
8   import static java.util.Collections.emptyList;
9   
10  import edu.umd.cs.findbugs.annotations.NonNull;
11  
12  import java.util.Collection;
13  import java.util.HashMap;
14  import java.util.LinkedList;
15  import java.util.List;
16  import java.util.Map;
17  
18  import mockit.internal.state.TestRun;
19  
20  public final class InstanceFieldData extends FieldData {
21      private static final long serialVersionUID = 6991762113575259754L;
22  
23      @NonNull
24      private final transient Map<Integer, List<Integer>> testIdsToAssignments = new HashMap<>();
25  
26      void registerAssignment(@NonNull Object instance) {
27          List<Integer> dataForRunningTest = getDataForRunningTest();
28          Integer instanceId = System.identityHashCode(instance);
29  
30          if (!dataForRunningTest.contains(instanceId)) {
31              dataForRunningTest.add(instanceId);
32          }
33  
34          writeCount++;
35      }
36  
37      void registerRead(@NonNull Object instance) {
38          List<Integer> dataForRunningTest = getDataForRunningTest();
39          Integer instanceId = System.identityHashCode(instance);
40  
41          dataForRunningTest.remove(instanceId);
42          readCount++;
43      }
44  
45      @NonNull
46      private List<Integer> getDataForRunningTest() {
47          int testId = TestRun.getTestId();
48          return testIdsToAssignments.computeIfAbsent(testId, k -> new LinkedList<>());
49      }
50  
51      @Override
52      void markAsCoveredIfNoUnreadValuesAreLeft() {
53          for (List<Integer> unreadInstances : testIdsToAssignments.values()) {
54              if (unreadInstances.isEmpty()) {
55                  covered = true;
56                  break;
57              }
58          }
59      }
60  
61      @NonNull
62      public List<Integer> getOwnerInstancesWithUnreadAssignments() {
63          if (isCovered()) {
64              return emptyList();
65          }
66  
67          Collection<List<Integer>> assignments = testIdsToAssignments.values();
68          return assignments.iterator().next();
69      }
70  }