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