/*
* Copyright (c) 2006-2012 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations;
import java.util.*;
import mockit.internal.expectations.invocation.*;
final class UnorderedVerificationPhase extends BaseVerificationPhase
{
final List<VerifiedExpectation> verifiedExpectations;
UnorderedVerificationPhase(
RecordAndReplayExecution recordAndReplay,
List<Expectation> expectationsInReplayOrder, List<Object[]> invocationArgumentsInReplayOrder)
{
super(recordAndReplay, expectationsInReplayOrder, invocationArgumentsInReplayOrder);
verifiedExpectations = new ArrayList<VerifiedExpectation>();
}
@Override
protected void findNonStrictExpectation(Object mock, String mockClassDesc, String mockNameAndDesc, Object[] args)
{
if (!matchInstance && recordAndReplay.executionState.isToBeMatchedOnInstance(mock, mockNameAndDesc)) {
matchInstance = true;
}
replayIndex = -1;
for (int i = 0, n = expectationsInReplayOrder.size(); i < n; i++) {
Expectation replayExpectation = expectationsInReplayOrder.get(i);
Object[] replayArgs = invocationArgumentsInReplayOrder.get(i);
if (matches(mock, mockClassDesc, mockNameAndDesc, args, replayExpectation, replayArgs)) {
replayIndex = i;
currentVerification.constraints.invocationCount++;
currentExpectation = replayExpectation;
}
}
if (replayIndex >= 0) {
pendingError = verifyConstraints();
}
}
private Error verifyConstraints()
{
ExpectedInvocation lastInvocation = expectationsInReplayOrder.get(replayIndex).invocation;
Object[] lastArgs = invocationArgumentsInReplayOrder.get(replayIndex);
int minInvocations = numberOfIterations > 0 ? numberOfIterations : 1;
int maxInvocations = numberOfIterations > 0 ? numberOfIterations : -1;
return currentVerification.verifyConstraints(lastInvocation, lastArgs, minInvocations, maxInvocations);
}
@Override
void addVerifiedExpectation(VerifiedExpectation verifiedExpectation)
{
super.addVerifiedExpectation(verifiedExpectation);
verifiedExpectations.add(verifiedExpectation);
}
@Override
public void handleInvocationCountConstraint(int minInvocations, int maxInvocations)
{
validatePresenceOfExpectation(currentVerification);
int multiplier = numberOfIterations <= 1 ? 1 : numberOfIterations;
ExpectedInvocation replayInvocation =
replayIndex < 0 ? null : expectationsInReplayOrder.get(replayIndex).invocation;
Object[] replayArgs = replayIndex < 0 ? null : invocationArgumentsInReplayOrder.get(replayIndex);
pendingError =
currentVerification.verifyConstraints(
replayInvocation, replayArgs, multiplier * minInvocations, multiplier * maxInvocations);
}
@Override
public void applyHandlerForEachInvocation(Object invocationHandler)
{
if (pendingError != null) {
return;
}
validatePresenceOfExpectation(currentVerification);
InvocationHandlerResult handler = new InvocationHandlerResult(invocationHandler);
int matchedExpectations = 0;
for (int i = 0, n = expectationsInReplayOrder.size(); i < n; i++) {
Expectation expectation = expectationsInReplayOrder.get(i);
Object[] args = invocationArgumentsInReplayOrder.get(i);
if (evaluateInvocationHandlerIfExpectationMatchesCurrent(expectation, args, handler, matchedExpectations)) {
matchedExpectations++;
}
}
}
VerifiedExpectation firstExpectationVerified()
{
VerifiedExpectation first = null;
for (VerifiedExpectation expectation : verifiedExpectations) {
if (first == null || expectation.replayIndex < first.replayIndex) {
first = expectation;
}
}
return first;
}
}