View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
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  }