package org.test4j.hamcrest.matcher;
import mockit.internal.expectations.argumentMatching.ArgumentMatcher;
import mockit.internal.expectations.argumentMatching.ArgumentMismatch;
import mockit.internal.util.FieldReflection;
import ext.test4j.hamcrest.Description;
import ext.test4j.hamcrest.Matcher;
import ext.test4j.hamcrest.StringDescription;
import ext.test4j.hamcrest.core.IsEqual;
import ext.test4j.hamcrest.core.IsSame;
import ext.test4j.hamcrest.number.OrderingComparison;
/**
* Adapts the<br>
* <br>
* {@code ext.test4j.hamcrest.Matcher} interface to
* {@link mockit.external.hamcrest.Matcher}.
*/
@SuppressWarnings({ "rawtypes" })
public final class JMockitAdapter implements ArgumentMatcher {
private final Matcher hamcrestMatcher;
public static JMockitAdapter create(final Matcher matcher) {
return new JMockitAdapter(matcher);
}
private JMockitAdapter(Matcher matcher) {
hamcrestMatcher = matcher;
}
@Override
public boolean matches(Object item) {
return hamcrestMatcher.matches(item);
}
@Override
public void writeMismatchPhrase(ArgumentMismatch description) {
Description strDescription = new StringDescription();
hamcrestMatcher.describeTo(strDescription);
description.append(strDescription.toString());
}
public Object getInnerValue() {
Matcher innerMatcher = hamcrestMatcher;
while (innerMatcher instanceof ext.test4j.hamcrest.core.Is
|| innerMatcher instanceof ext.test4j.hamcrest.core.IsNot) {
innerMatcher = FieldReflection.getField(innerMatcher.getClass(), Matcher.class, innerMatcher);
}
if (innerMatcher instanceof IsEqual || innerMatcher instanceof IsSame
|| innerMatcher instanceof OrderingComparison) {
return FieldReflection.getField(innerMatcher.getClass(), Object.class, innerMatcher);
} else {
return null;
}
}
}