1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5
6package org.mockito.internal.verification;
7
8import java.util.List;
9
10import org.mockito.exceptions.base.MockitoException;
11import org.mockito.internal.invocation.InvocationMatcher;
12import org.mockito.internal.verification.api.VerificationData;
13import org.mockito.internal.verification.api.VerificationDataInOrder;
14import org.mockito.internal.verification.api.VerificationInOrderMode;
15import org.mockito.internal.verification.checkers.AtLeastXNumberOfInvocationsChecker;
16import org.mockito.internal.verification.checkers.AtLeastXNumberOfInvocationsInOrderChecker;
17import org.mockito.internal.verification.checkers.MissingInvocationChecker;
18import org.mockito.internal.verification.checkers.MissingInvocationInOrderChecker;
19import org.mockito.invocation.Invocation;
20import org.mockito.verification.VerificationMode;
21
22public class AtLeast implements VerificationInOrderMode, VerificationMode {
23
24    final int wantedCount;
25
26    public AtLeast(int wantedNumberOfInvocations) {
27        if (wantedNumberOfInvocations < 0) {
28            throw new MockitoException("Negative value is not allowed here");
29        }
30        this.wantedCount = wantedNumberOfInvocations;
31    }
32
33    public void verify(VerificationData data) {
34        MissingInvocationChecker missingInvocation = new MissingInvocationChecker();
35        AtLeastXNumberOfInvocationsChecker numberOfInvocations = new AtLeastXNumberOfInvocationsChecker();
36
37        if (wantedCount == 1) {
38            missingInvocation.check(data.getAllInvocations(), data.getWanted());
39        }
40        numberOfInvocations.check(data.getAllInvocations(), data.getWanted(), wantedCount);
41    }
42
43    public void verifyInOrder(VerificationDataInOrder data) {
44        List<Invocation> allInvocations = data.getAllInvocations();
45        InvocationMatcher wanted = data.getWanted();
46
47        MissingInvocationInOrderChecker missingInvocation = new MissingInvocationInOrderChecker();
48        AtLeastXNumberOfInvocationsInOrderChecker numberOfCalls = new AtLeastXNumberOfInvocationsInOrderChecker(data.getOrderingContext());
49
50        if (wantedCount == 1) {
51            missingInvocation.check(allInvocations, wanted, this, data.getOrderingContext());
52        }
53
54        numberOfCalls.check(allInvocations, wanted, wantedCount);
55    }
56
57    @Override
58    public String toString() {
59        return "Wanted invocations count: at least " + wantedCount;
60    }
61}