View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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  }