/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations.argumentMatching;
import javax.annotation.*;
import mockit.internal.reflection.*;
import org.hamcrest.*;
import org.hamcrest.core.*;
/**
* Adapts the {@code org.hamcrest.Matcher} interface to {@link ArgumentMatcher}.
*/
public final class HamcrestAdapter implements ArgumentMatcher<HamcrestAdapter>
{
@Nonnull private final Matcher<?> hamcrestMatcher;
public HamcrestAdapter(@Nonnull Matcher<?> matcher) { hamcrestMatcher = matcher; }
@Override
public boolean same(@Nonnull HamcrestAdapter other) { return hamcrestMatcher == other.hamcrestMatcher; }
@Override
public boolean matches(@Nullable Object argValue)
{
return hamcrestMatcher.matches(argValue);
}
@Override
public void writeMismatchPhrase(@Nonnull ArgumentMismatch argumentMismatch)
{
Description strDescription = new StringDescription();
hamcrestMatcher.describeTo(strDescription);
argumentMismatch.append(strDescription.toString());
}
@Nullable
public Object getInnerValue()
{
Object innermostMatcher = getInnermostMatcher();
return getArgumentValueFromMatcherIfAvailable(innermostMatcher);
}
@Nonnull
private Object getInnermostMatcher()
{
Matcher<?> innerMatcher = hamcrestMatcher;
while (innerMatcher instanceof Is || innerMatcher instanceof IsNot) {
innerMatcher = FieldReflection.getField(innerMatcher.getClass(), Matcher.class, innerMatcher);
}
assert innerMatcher != null;
return innerMatcher;
}
@Nullable
private static Object getArgumentValueFromMatcherIfAvailable(@Nonnull Object argMatcher)
{
if (
argMatcher instanceof IsEqual || argMatcher instanceof IsSame ||
"org.hamcrest.number.OrderingComparison".equals(argMatcher.getClass().getName())
) {
return FieldReflection.getField(argMatcher.getClass(), Object.class, argMatcher);
}
return null;
}
}