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