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 static org.mockito.internal.verification.checkers.MissingInvocationChecker.checkMissingInvocation;
9import static org.mockito.internal.verification.checkers.NumberOfInvocationsChecker.checkNumberOfInvocations;
10
11import java.util.List;
12import org.mockito.exceptions.base.MockitoException;
13import org.mockito.invocation.MatchableInvocation;
14import org.mockito.internal.verification.api.VerificationData;
15import org.mockito.internal.verification.api.VerificationDataInOrder;
16import org.mockito.internal.verification.api.VerificationInOrderMode;
17import org.mockito.invocation.Invocation;
18import org.mockito.verification.VerificationMode;
19
20public class Times implements VerificationInOrderMode, VerificationMode {
21
22    final int wantedCount;
23
24    public Times(int wantedNumberOfInvocations) {
25        if (wantedNumberOfInvocations < 0) {
26            throw new MockitoException("Negative value is not allowed here");
27        }
28        this.wantedCount = wantedNumberOfInvocations;
29    }
30
31    @Override
32    public void verify(VerificationData data) {
33        List<Invocation> invocations = data.getAllInvocations();
34        MatchableInvocation wanted = data.getTarget();
35
36        if (wantedCount > 0) {
37             checkMissingInvocation(data.getAllInvocations(), data.getTarget());
38        }
39        checkNumberOfInvocations(invocations, wanted, wantedCount);
40    }
41    @Override
42    public void verifyInOrder(VerificationDataInOrder data) {
43        List<Invocation> allInvocations = data.getAllInvocations();
44        MatchableInvocation wanted = data.getWanted();
45
46        if (wantedCount > 0) {
47            checkMissingInvocation(allInvocations, wanted, data.getOrderingContext());
48        }
49        checkNumberOfInvocations(allInvocations, wanted, wantedCount, data.getOrderingContext());
50    }
51
52    @Override
53    public String toString() {
54        return "Wanted invocations count: " + wantedCount;
55    }
56
57    @Override
58    public VerificationMode description(String description) {
59        return VerificationModeFactory.description(this, description);
60    }
61}
62