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.checkers;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.List;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationMatcher;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationMarker;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationsFinder;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.reporting.Discrepancy;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Invocation;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Location;
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class NumberOfInvocationsChecker {
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final Reporter reporter;
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final InvocationsFinder finder;
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final InvocationMarker invocationMarker = new InvocationMarker();
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public NumberOfInvocationsChecker() {
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this(new Reporter(), new InvocationsFinder());
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    NumberOfInvocationsChecker(Reporter reporter, InvocationsFinder finder) {
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.reporter = reporter;
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.finder = finder;
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void check(List<Invocation> invocations, InvocationMatcher wanted, int wantedCount) {
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        List<Invocation> actualInvocations = finder.findInvocations(invocations, wanted);
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        int actualCount = actualInvocations.size();
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (wantedCount > actualCount) {
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Location lastInvocation = finder.getLastLocation(actualInvocations);
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            reporter.tooLittleActualInvocations(new Discrepancy(wantedCount, actualCount), wanted, lastInvocation);
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else if (wantedCount == 0 && actualCount > 0) {
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Location firstUndesired = actualInvocations.get(wantedCount).getLocation();
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            reporter.neverWantedButInvoked(wanted, firstUndesired);
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } else if (wantedCount < actualCount) {
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Location firstUndesired = actualInvocations.get(wantedCount).getLocation();
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            reporter.tooManyActualInvocations(wantedCount, actualCount, wanted, firstUndesired);
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        invocationMarker.markVerified(actualInvocations, wanted);
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}