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