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