package com.googlecode.gwt.test;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.googlecode.gwt.test.rpc.RemoteServiceCreateHandler;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class SchedulerTest extends GwtTestTest {
private int i;
private int j;
@Before
public void before() {
addGwtCreateHandler(new RemoteServiceCreateHandler() {
@Override
protected Object findService(Class<?> remoteServiceClass, String remoteServiceRelativePath) {
if (remoteServiceClass == MyRemoteService.class) {
return new MyRemoteService() {
public String myMethod(String param1) {
return "mock " + param1;
}
};
}
return null;
}
});
}
@Test
public void scheduledCommandOrder() {
// Given
final StringBuilder sb = new StringBuilder();
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry1 ");
}
});
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally1 ");
}
});
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
sb.append("scheduleDeferred1 ");
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry2 ");
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry3 ");
}
});
}
});
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally2 ");
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally3 ");
}
});
}
});
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
sb.append("scheduleDeferred2 ");
}
});
}
});
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo(
"scheduleFinally1 scheduleEntry1 scheduleDeferred1 scheduleFinally2 scheduleFinally3 scheduleEntry2 scheduleEntry3 scheduleDeferred2 ");
}
@Test
public void scheduledCommandOrderWithRpcCall() {
// Given
final StringBuilder sb = new StringBuilder();
final MyRemoteServiceAsync service = GWT.create(MyRemoteService.class);
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry1 ");
}
});
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally1 ");
}
});
service.myMethod("service1", new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
}
public void onSuccess(String result) {
sb.append("onSuccess1 ");
}
});
service.myMethod("service2", new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
}
public void onSuccess(String result) {
sb.append("onSuccess2 ");
}
});
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
sb.append("scheduleDeferred1 ");
service.myMethod("service3", new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
}
public void onSuccess(String result) {
sb.append("onSuccess3 ");
}
});
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry2 ");
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry3 ");
}
});
}
});
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally2 ");
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally3 ");
}
});
}
});
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
sb.append("scheduleDeferred2 ");
}
});
}
});
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo(
"scheduleFinally1 scheduleEntry1 scheduleDeferred1 onSuccess1 onSuccess2 scheduleFinally2 scheduleFinally3 scheduleEntry2 scheduleEntry3 scheduleDeferred2 onSuccess3 ");
}
@Test
public void scheduleDeferred() {
// Given
final StringBuilder sb = new StringBuilder();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
sb.append("scheduleDeferred");
}
});
// Preconditions
assertThat(sb.toString()).isEmpty();
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo("scheduleDeferred");
}
@Test
public void scheduledRepeatingCommandOrder() {
// Given
i = j = 0;
final StringBuilder sb = new StringBuilder();
Scheduler.get().scheduleEntry(new RepeatingCommand() {
public boolean execute() {
sb.append("entry").append(i).append(" ");
return 3 > i++;
}
});
Scheduler.get().scheduleFinally(new RepeatingCommand() {
public boolean execute() {
sb.append("finally").append(j).append(" ");
Scheduler.get().scheduleEntry(new RepeatingCommand() {
public boolean execute() {
sb.append("subentry").append(j).append(" ");
return false;
}
});
Scheduler.get().scheduleFinally(new RepeatingCommand() {
public boolean execute() {
sb.append("subfinally").append(j).append(" ");
return false;
}
});
return 3 > j++;
}
});
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo(
"finally0 subfinally1 entry0 subentry1 finally1 subfinally2 entry1 subentry2 finally2 subfinally3 entry2 subentry3 finally3 subfinally4 entry3 subentry4 ");
}
@Test
public void scheduleEntry() {
// Given
final StringBuilder sb = new StringBuilder();
Scheduler.get().scheduleEntry(new ScheduledCommand() {
public void execute() {
sb.append("scheduleEntry");
}
});
// Preconditions
assertThat(sb.toString()).isEmpty();
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo("scheduleEntry");
}
@Test
public void scheduleFinally() {
// Given
final StringBuilder sb = new StringBuilder();
Scheduler.get().scheduleFinally(new ScheduledCommand() {
public void execute() {
sb.append("scheduleFinally");
}
});
// Preconditions
assertThat(sb.toString()).isEmpty();
// When
getBrowserSimulator().fireLoopEnd();
// Then
assertThat(sb.toString()).isEqualTo("scheduleFinally");
}
@Test
public void scheduleIncremental() {
// Given
final StringBuilder sb = new StringBuilder();
final int COUNT = 2;
RepeatingCommand command = new RepeatingCommand() {
private int index = 0;
public boolean execute() {
sb.append(index++);
return index <= COUNT;
}
};
// When
Scheduler.get().scheduleIncremental(command);
// Then
assertThat(sb.toString()).isEqualTo("012");
}
}