/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations.invocation;
import java.util.*;
import javax.annotation.*;
import mockit.internal.expectations.argumentMatching.*;
final class ArgumentValuesAndMatchersWithoutVarargs extends ArgumentValuesAndMatchers
{
ArgumentValuesAndMatchersWithoutVarargs(@Nonnull InvocationArguments signature, @Nonnull Object[] values)
{
super(signature, values);
}
@Override
boolean isMatch(@Nonnull Object[] replayArgs, @Nonnull Map<Object, Object> instanceMap)
{
if (matchers == null) {
return areEqual(values, replayArgs, replayArgs.length, instanceMap);
}
for (int i = 0; i < replayArgs.length; i++) {
Object actual = replayArgs[i];
ArgumentMatcher<?> expected = getArgumentMatcher(i);
if (expected == null) {
Object arg = values[i];
if (arg == null) continue;
expected = new LenientEqualityMatcher(arg, instanceMap);
}
if (!expected.matches(actual)) {
return false;
}
}
return true;
}
@Nullable @Override
Error assertMatch(@Nonnull Object[] replayArgs, @Nonnull Map<Object, Object> instanceMap)
{
if (matchers == null) {
return assertEquals(values, replayArgs, replayArgs.length, instanceMap);
}
for (int i = 0; i < replayArgs.length; i++) {
Object actual = replayArgs[i];
ArgumentMatcher<?> expected = getArgumentMatcher(i);
if (expected == null) {
Object arg = values[i];
if (arg == null) continue;
expected = new LenientEqualityMatcher(arg, instanceMap);
}
if (!expected.matches(actual)) {
return signature.argumentMismatchMessage(i, expected, actual);
}
}
return null;
}
@Override
boolean hasEquivalentMatchers(@Nonnull ArgumentValuesAndMatchers other)
{
@SuppressWarnings("unchecked") int i = indexOfFirstValueAfterEquivalentMatchers(other);
if (i < 0) {
return false;
}
while (i < values.length) {
if (!EqualityMatcher.areEqual(values[i], other.values[i])) {
return false;
}
i++;
}
return true;
}
}