1
2
3
4
5
6 package mockit.internal.expectations.invocation;
7
8 import edu.umd.cs.findbugs.annotations.NonNull;
9 import edu.umd.cs.findbugs.annotations.Nullable;
10
11 import java.util.Collections;
12 import java.util.List;
13
14 import org.checkerframework.checker.index.qual.NonNegative;
15
16 public final class InvocationConstraints {
17 public int minInvocations;
18 private int maxInvocations;
19 @NonNegative
20 public int invocationCount;
21
22 public InvocationConstraints(boolean nonStrictInvocation) {
23 setLimits(nonStrictInvocation ? 0 : 1, -1);
24 }
25
26 public void setLimits(int minInvocations, int maxInvocations) {
27 this.minInvocations = minInvocations;
28 this.maxInvocations = maxInvocations;
29 }
30
31 void adjustMaxInvocations(@NonNegative int expectedInvocationCount) {
32 if (maxInvocations > 0 && maxInvocations < expectedInvocationCount) {
33 maxInvocations = expectedInvocationCount;
34 }
35 }
36
37 void setUnlimitedMaxInvocations() {
38 maxInvocations = -1;
39 }
40
41 public void incrementInvocationCount() {
42 invocationCount++;
43 }
44
45 public boolean isInvocationCountLessThanMinimumExpected() {
46 return invocationCount < minInvocations;
47 }
48
49 public boolean isInvocationCountMoreThanMaximumExpected() {
50 return maxInvocations >= 0 && invocationCount > maxInvocations;
51 }
52
53 @Nullable
54 public Error verifyLowerLimit(@NonNull ExpectedInvocation invocation, int lowerLimit) {
55 if (invocationCount < lowerLimit) {
56 int missingInvocations = lowerLimit - invocationCount;
57 return invocation.errorForMissingInvocations(missingInvocations,
58 Collections.<ExpectedInvocation> emptyList());
59 }
60
61 return null;
62 }
63
64 @Nullable
65 public Error verifyUpperLimit(@NonNull ExpectedInvocation invocation, @NonNull Object[] replayArgs,
66 int upperLimit) {
67 if (upperLimit >= 0) {
68 int unexpectedInvocations = invocationCount - upperLimit;
69
70 if (unexpectedInvocations > 0) {
71 return invocation.errorForUnexpectedInvocations(replayArgs, unexpectedInvocations);
72 }
73 }
74
75 return null;
76 }
77
78 @NonNull
79 public Error errorForMissingExpectations(@NonNull ExpectedInvocation invocation,
80 @NonNull List<ExpectedInvocation> nonMatchingInvocations) {
81 return invocation.errorForMissingInvocations(minInvocations - invocationCount, nonMatchingInvocations);
82 }
83 }