blob: f0d160e2c39b5083d0cd1ac252d3d8b9b7cad59e [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.core.client.testing;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import java.util.ArrayList;
import java.util.List;
/**
* A fake scheduler that records scheduled commands and can execute them when asked to.
*
* <p>Typical usage:
* <pre>
* scheduleCommands(scheduler);
* assertFalse(scheduler.executeCommands());
* </pre>
*/
public class StubScheduler extends Scheduler {
private final List<RepeatingCommand> repeatingCommands = new ArrayList<RepeatingCommand>();
private final List<ScheduledCommand> scheduledCommands = new ArrayList<ScheduledCommand>();
/**
* Returns the currently scheduled {@link RepeatingCommand}s that would be executed
* by {@link #executeRepeatingCommands()}.
*/
public List<RepeatingCommand> getRepeatingCommands() {
return repeatingCommands;
}
/**
* Executes all scheduled commands once. Equivalent to calling {@link #executeRepeatingCommands}
* then {@link #executeScheduledCommands}.
*
* <p>Caveat: executes once any scheduled command created when executing the repeating commands.
*
* @return whether some repeating commands are still scheduled (returned {@code true}) or
* new commands have been scheduled after the execution
*/
public boolean executeCommands() {
boolean repeatingRemaining = executeRepeatingCommands();
boolean scheduledRemaining = executeScheduledCommands();
return repeatingRemaining || scheduledRemaining;
}
/**
* Executes all scheduled {@link RepeatingCommand}s once. Does not execute the commands
* newly scheduled by the initial commands. Removes the commands that returned {@code false}.
*
* <p>After this method completes, {@link #getRepeatingCommands} returns only the commands
* that are still scheduled.
*
* @return whether some commands are still scheduled (returned {@code true}) or
* new commands have been scheduled after the execution
*/
public boolean executeRepeatingCommands() {
List<RepeatingCommand> commands = new ArrayList<RepeatingCommand>(repeatingCommands);
repeatingCommands.clear();
for (RepeatingCommand command : commands) {
boolean reschedule;
try {
reschedule = command.execute();
} catch (Throwable e) {
reschedule = false;
GWT.reportUncaughtException(e);
}
if (reschedule) {
repeatingCommands.add(command);
}
}
return !repeatingCommands.isEmpty();
}
/**
* Returns the currently scheduled {@link ScheduledCommand}s that would be executed
* by {@link #executeScheduledCommands}.
*/
public List<ScheduledCommand> getScheduledCommands() {
return scheduledCommands;
}
/**
* Executes all scheduled {@link ScheduledCommand}s that have been passed to this scheduler,
* then removes all commands.
*
* <p>After this method completes, {@link #getScheduledCommands} returns only the commands
* that have been scheduled by the initial commands.
*
* @return whether new commands have been scheduled after the execution
*/
public boolean executeScheduledCommands() {
List<ScheduledCommand> commands = new ArrayList<ScheduledCommand>(scheduledCommands);
scheduledCommands.clear();
for (ScheduledCommand command : commands) {
try {
command.execute();
} catch (Throwable e) {
GWT.reportUncaughtException(e);
}
}
return !scheduledCommands.isEmpty();
}
@Override
public void scheduleDeferred(ScheduledCommand cmd) {
scheduledCommands.add(cmd);
}
@Override
public void scheduleEntry(RepeatingCommand cmd) {
repeatingCommands.add(cmd);
}
@Override
public void scheduleEntry(ScheduledCommand cmd) {
scheduledCommands.add(cmd);
}
@Override
public void scheduleFinally(RepeatingCommand cmd) {
repeatingCommands.add(cmd);
}
@Override
public void scheduleFinally(ScheduledCommand cmd) {
scheduledCommands.add(cmd);
}
@Override
public void scheduleFixedDelay(RepeatingCommand cmd, int delayMs) {
repeatingCommands.add(cmd);
}
@Override
public void scheduleFixedPeriod(RepeatingCommand cmd, int delayMs) {
repeatingCommands.add(cmd);
}
@Override
public void scheduleIncremental(RepeatingCommand cmd) {
repeatingCommands.add(cmd);
}
}