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