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 org.mockito.exceptions.Reporter;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationMarker;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationMatcher;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.invocation.InvocationsFinder;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.reporting.Discrepancy;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.verification.api.InOrderContext;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Invocation;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.Location;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.List;
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class NonGreedyNumberOfInvocationsInOrderChecker {
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final InvocationsFinder finder;
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final Reporter reporter;
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final InvocationMarker marker;
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public NonGreedyNumberOfInvocationsInOrderChecker() {
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this(new InvocationsFinder(), new Reporter(), new InvocationMarker());
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    NonGreedyNumberOfInvocationsInOrderChecker(InvocationsFinder finder, Reporter reporter, InvocationMarker marker ) {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.finder = finder;
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.reporter = reporter;
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.marker = marker;
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void check(List<Invocation> invocations, InvocationMatcher wanted, int wantedCount, InOrderContext context) {
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        int actualCount = 0;
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Location lastLocation = null;
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        while( actualCount < wantedCount ){
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Invocation next = finder.findFirstMatchingUnverifiedInvocation( invocations, wanted, context );
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if( next == null ){
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                reporter.tooLittleActualInvocationsInOrder(new Discrepancy(wantedCount, actualCount), wanted, lastLocation );
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            marker.markVerified( next, wanted );
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            context.markVerified( next );
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            lastLocation = next.getLocation();
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            actualCount++;
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}