package org.activityinfo.core.client; import com.google.gwt.user.client.rpc.AsyncCallback; import org.activityinfo.promise.Promise; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; import java.util.ArrayList; import java.util.List; /** * Hamcrest matchers for promises */ public class PromiseMatchers { public static <T> T assertResolves(Promise<T> promise) { final List<T> results = new ArrayList<>(); promise.then(new AsyncCallback<T>() { @Override public void onFailure(Throwable caught) { throw new RuntimeException(caught); } @Override public void onSuccess(T result) { // no problems results.add(result); } }); if(results.size() > 1) { throw new RuntimeException("Callback called " + results.size() + " times, expected exactly one callback."); } if(results.isEmpty()) { throw new RuntimeException("Callback not called, expected exactly one callback."); } return results.get(0); } public static <T> Matcher<Promise<? extends T>> resolvesTo(final Matcher<T> matcher) { return new TypeSafeMatcher<Promise<? extends T>>() { private T resolution = null; @Override public boolean matchesSafely(Promise<? extends T> item) { item.then(new AsyncCallback<T>() { @Override public void onFailure(Throwable throwable) { throw new AssertionError(throwable); } @Override public void onSuccess(T t) { resolution = t; } }); return matcher.matches(resolution); } @Override public void describeTo(Description description) { description.appendText("resolves to value "); matcher.describeTo(description); } }; } }