package util; import java.util.Calendar; import java.util.Date; /** * Use an instance of this class to rebase the Date * reported by Clock.currentTimeInMillis()/currentDate() * or measured by a new TimeMeasurement(). * @see Clock#restoreDefaultClock() */ public class DateAlteringClock extends Clock { private long rebaseToTime; private final long baseSystemTime; private boolean frozen, advanceOnEachQuery; public DateAlteringClock(Date rebaseToDate) { super(true); this.rebaseToTime = rebaseToDate.getTime(); this.baseSystemTime = SYSTEM_CLOCK.currentClockTimeInMillis(); } @Override public long currentClockTimeInMillis() { if (frozen) { return rebaseToTime; } else if (advanceOnEachQuery) { return ++rebaseToTime; } return rebaseToTime + SYSTEM_CLOCK.currentClockTimeInMillis() - baseSystemTime; } public DateAlteringClock freeze() { frozen = true; return this; } public DateAlteringClock advanceMillisOnEachQuery() { advanceOnEachQuery = true; return this; } }