/*
* 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 java.util.*;
import javax.annotation.*;
import mockit.internal.expectations.argumentMatching.*;
import static mockit.internal.util.Utilities.*;
public abstract class TestOnlyPhase extends Phase
{
protected boolean matchInstance;
@Nullable protected List<ArgumentMatcher<?>> argMatchers;
@Nullable Expectation currentExpectation;
TestOnlyPhase(@Nonnull RecordAndReplayExecution recordAndReplay) { super(recordAndReplay); }
public final void addArgMatcher(@Nonnull ArgumentMatcher<?> matcher) { getArgumentMatchers().add(matcher); }
@Nonnull
private List<ArgumentMatcher<?>> getArgumentMatchers()
{
if (argMatchers == null) {
argMatchers = new ArrayList<ArgumentMatcher<?>>();
}
return argMatchers;
}
public final void moveArgMatcher(@Nonnegative int originalMatcherIndex, @Nonnegative int toIndex)
{
List<ArgumentMatcher<?>> matchers = getArgumentMatchers();
int i = getMatcherPositionIgnoringNulls(originalMatcherIndex, matchers);
for (i--; i < toIndex; i++) {
matchers.add(i, null);
}
}
@Nonnegative
private static int getMatcherPositionIgnoringNulls(
@Nonnegative int originalMatcherIndex, @Nonnull List<ArgumentMatcher<?>> matchers)
{
int i = 0;
for (int matchersFound = 0; matchersFound <= originalMatcherIndex; i++) {
if (matchers.get(i) != null) {
matchersFound++;
}
}
return i;
}
public final void setExpectedSingleArgumentType(@Nonnegative int parameterIndex, @Nonnull Class<?> argumentType)
{
ArgumentMatcher<?> newMatcher = ClassMatcher.create(argumentType);
getArgumentMatchers().set(parameterIndex, newMatcher);
}
public final void setExpectedMultiArgumentType(@Nonnegative int parameterIndex, @Nonnull Class<?> argumentType)
{
CaptureMatcher<?> matcher = (CaptureMatcher<?>) getArgumentMatchers().get(parameterIndex);
matcher.setExpectedType(argumentType);
}
public void setMaxInvocationCount(int maxInvocations)
{
if (currentExpectation != null) {
int currentMinimum = currentExpectation.constraints.minInvocations;
int minInvocations = maxInvocations < 0 ? currentMinimum : Math.min(currentMinimum, maxInvocations);
handleInvocationCountConstraint(minInvocations, maxInvocations);
}
}
public abstract void handleInvocationCountConstraint(int minInvocations, int maxInvocations);
protected static boolean isEnumElement(@Nonnull Object mock)
{
Class<?> mockedClass = mock.getClass();
return mockedClass.isEnum() && indexOfReference(mockedClass.getEnumConstants(), mock) >= 0;
}
}