/* * 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); } }