package org.tessell.dispatch.client;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.Test;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class StubDispatchAsyncTest {
private final StubDispatchAsync async = new StubDispatchAsync();
private final StubCallback callback = new StubCallback();
@Test
public void callbackIsCalled() {
async.execute(new GetTestAction("a"), callback);
final GetTestResult result = new GetTestResult();
async.getCallback(GetTestAction.class).onSuccess(result);
assertThat(callback.result, is(result));
}
@Test
public void successCannotBeCalledTwice() {
async.execute(new GetTestAction("a"), callback);
async.getCallback(GetTestAction.class).onSuccess(new GetTestResult());
try {
async.getCallback(GetTestAction.class).onSuccess(new GetTestResult());
} catch (IllegalStateException ise) {
assertThat(ise.getMessage(), is("GetTestAction[a] has already been called back"));
}
}
@Test
public void failureCannotBeCalledTwice() {
async.execute(new GetTestAction("a"), callback);
async.getCallback(GetTestAction.class).onFailure(null);
try {
async.getCallback(GetTestAction.class).onFailure(null);
} catch (IllegalStateException ise) {
assertThat(ise.getMessage(), is("GetTestAction[a] has already been called back"));
}
}
@Test
public void successCannotBeCalledOutOfOrder() {
async.execute(new GetTestAction("a"), callback);
async.execute(new GetTestAction("a"), callback);
try {
async.getCallback(GetTestAction.class, 1).onSuccess(null);
} catch (IllegalStateException ise) {
assertThat(ise.getMessage(), is("Call for GetTestAction[a] cannot return before call for GetTestAction[a]"));
}
}
@Test
public void successCanExplicitlyBeOutOfOrder() {
async.execute(new GetTestAction("a"), callback);
async.execute(new GetTestAction("a"), callback);
async.getCallback(GetTestAction.class, 1).onSuccessOutOfOrder(null);
async.getCallback(GetTestAction.class, 0).onSuccessOutOfOrder(null);
}
private class StubCallback implements AsyncCallback<GetTestResult> {
private GetTestResult result;
@Override
public void onSuccess(GetTestResult result) {
this.result = result;
}
@Override
public void onFailure(Throwable t) {
}
}
}