/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations;
import javax.annotation.*;
import mockit.internal.expectations.invocation.*;
import mockit.internal.state.*;
import static mockit.internal.state.ExecutingTest.*;
public final class RecordPhase extends TestOnlyPhase
{
final boolean strict;
RecordPhase(@Nonnull RecordAndReplayExecution recordAndReplay, boolean strict)
{
super(recordAndReplay);
this.strict = strict;
}
public void addResult(@Nullable Object result)
{
if (currentExpectation != null) {
currentExpectation.addResult(result);
}
}
public void addSequenceOfReturnValues(@Nonnull Object[] values)
{
if (currentExpectation != null) {
currentExpectation.addSequenceOfReturnValues(values);
}
}
@Nullable @Override
Object handleInvocation(
@Nullable Object mock, int mockAccess, @Nonnull String mockClassDesc, @Nonnull String mockNameAndDesc,
@Nullable String genericSignature, boolean withRealImpl, @Nonnull Object[] args)
throws Throwable
{
//noinspection AssignmentToMethodParameter
mock = configureMatchingOnMockInstanceIfSpecified(mock);
ExpectedInvocation invocation = new ExpectedInvocation(
mock, mockAccess, mockClassDesc, mockNameAndDesc, matchInstance, genericSignature, args);
boolean nonStrictInvocation = false;
if (strict) {
TestRun.getExecutingTest().addStrictMock(mock, matchInstance ? null : mockClassDesc);
}
else if (!matchInstance && invocation.isConstructor()) {
invocation.replacementInstance = mock;
getReplacementMap().put(mock, mock);
}
else {
nonStrictInvocation = isInstanceMethodWithStandardBehavior(mock, mockNameAndDesc);
}
currentExpectation = new Expectation(this, invocation, strict, nonStrictInvocation);
if (argMatchers != null) {
invocation.arguments.setMatchers(argMatchers);
argMatchers = null;
}
recordAndReplay.executionState.addExpectation(currentExpectation, strict);
return invocation.getDefaultValueForReturnType();
}
@Nullable
private Object configureMatchingOnMockInstanceIfSpecified(@Nullable Object mock)
{
matchInstance = false;
if (mock == null) {
return null;
}
Object replacementInstance = getReplacementMap().get(mock);
matchInstance = mock == replacementInstance || isEnumElement(mock);
return mock;
}
@Override
public void handleInvocationCountConstraint(int minInvocations, int maxInvocations)
{
if (currentExpectation != null) {
currentExpectation.constraints.setLimits(minInvocations, maxInvocations);
}
}
}