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.MissingInvocationChecker;
16import org.mockito.internal.verification.checkers.MissingInvocationInOrderChecker;
17import org.mockito.internal.verification.checkers.NumberOfInvocationsChecker;
18import org.mockito.internal.verification.checkers.NumberOfInvocationsInOrderChecker;
19import org.mockito.invocation.Invocation;
20import org.mockito.verification.VerificationMode;
21
22public class Times implements VerificationInOrderMode, VerificationMode {
23
24    final int wantedCount;
25
26    public Times(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        if (wantedCount > 0) {
35            MissingInvocationChecker missingInvocation = new MissingInvocationChecker();
36            missingInvocation.check(data.getAllInvocations(), data.getWanted());
37        }
38        NumberOfInvocationsChecker numberOfInvocations = new NumberOfInvocationsChecker();
39        numberOfInvocations.check(data.getAllInvocations(), data.getWanted(), wantedCount);
40    }
41
42    public void verifyInOrder(VerificationDataInOrder data) {
43        List<Invocation> allInvocations = data.getAllInvocations();
44        InvocationMatcher wanted = data.getWanted();
45
46        if (wantedCount > 0) {
47            MissingInvocationInOrderChecker missingInvocation = new MissingInvocationInOrderChecker();
48            missingInvocation.check(allInvocations, wanted, this, data.getOrderingContext());
49        }
50        NumberOfInvocationsInOrderChecker numberOfCalls = new NumberOfInvocationsInOrderChecker();
51        numberOfCalls.check(allInvocations, wanted, wantedCount, data.getOrderingContext());
52    }
53
54    @Override
55    public String toString() {
56        return "Wanted invocations count: " + wantedCount;
57    }
58}