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}