package com.googlecode.totallylazy.matchers;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import java.util.concurrent.Callable;
import static com.googlecode.totallylazy.Callers.call;
public class LazyEqualsMatcher<T> extends TypeSafeMatcher<T> {
private final Callable<? extends T> expectedLoader;
private final String descriptionText;
private T actual;
private T expected;
private LazyEqualsMatcher(String descriptionText, Callable<? extends T> expectedLoader) {
this.expectedLoader = expectedLoader;
this.descriptionText = descriptionText;
}
@Override
protected boolean matchesSafely(T actualValue) {
actual = actualValue;
expected = call(expectedLoader);
return expected.equals(actual);
}
public void describeTo(Description description) {
description.appendText(createDescriptionText());
}
private String createDescriptionText() {
return expected != null ? String.format(descriptionText + " [expected: %s, actual: %s]", expected, actual) : descriptionText;
}
public static <E> LazyEqualsMatcher<E> lazyEqualTo(String descriptionText, Callable<? extends E> expectedLoader) {
return new LazyEqualsMatcher<E>(descriptionText, expectedLoader);
}
}