package org.junit.internal.matchers;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class ThrowableCauseMatcher<T extends Throwable> extends
TypeSafeMatcher<T> {
private final Matcher<T> fMatcher;
public ThrowableCauseMatcher(Matcher<T> matcher) {
fMatcher = matcher;
}
public void describeTo(Description description) {
description.appendText("exception with cause ");
description.appendDescriptionOf(fMatcher);
}
@Override
protected boolean matchesSafely(T item) {
return fMatcher.matches(item.getCause());
}
@Override
protected void describeMismatchSafely(T item, Description description) {
description.appendText("cause ");
fMatcher.describeMismatch(item.getCause(), description);
}
@Factory
public static <T extends Throwable> Matcher<T> hasCause(final Matcher<T> matcher) {
return new ThrowableCauseMatcher<T>(matcher);
}
}