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