/*
* (c) Rob Gordon 2005
*/
package org.oddjob.schedules.schedules;
import java.text.ParseException;
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.oddjob.arooa.utils.DateHelper;
import org.oddjob.schedules.Interval;
import org.oddjob.schedules.IntervalTo;
import org.oddjob.schedules.ScheduleContext;
import org.oddjob.schedules.ScheduleResult;
import org.oddjob.schedules.ScheduleRoller;
import org.oddjob.schedules.SimpleInterval;
import org.oddjob.schedules.SimpleScheduleResult;
import org.oddjob.schedules.units.DayOfMonth;
import org.oddjob.schedules.units.DayOfWeek;
/**
*
*/
public class TimeScheduleTest extends TestCase {
private static final Logger logger = Logger.getLogger("org.oddjob");
protected void setUp() {
logger.debug("============== " + getName() + " ==================");
}
public void testStandardIntervalDifferentStarts() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("11:00");
ScheduleResult result, expected;
// before
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 09:00"));
result = test.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-03-02 10:00"),
DateHelper.parseDateTime("2006-03-02 11:00")),
null);
assertEquals(expected, result);
// during
context = new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 10:30"));
result = test.nextDue(context);
assertEquals(expected, result);
// after
context = new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 11:30"));
result = test.nextDue(context);
expected = null;
assertEquals(expected, result);
}
public void testForwardInterval() throws ParseException {
TimeSchedule s = new TimeSchedule();
s.setFrom("11:00");
s.setTo("10:00");
ScheduleResult expected, result;
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-03-02 11:00"),
DateHelper.parseDateTime("2006-03-03 10:00")),
null);
result = s.nextDue(new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 09:00")));
assertEquals(expected, result);
result = s.nextDue(new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 10:00")));
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-03-02 11:00"),
DateHelper.parseDateTime("2006-03-03 10:00")),
null);
assertEquals(expected, result);
result = s.nextDue(new ScheduleContext(
DateHelper.parseDateTime("2006-03-02 11:30")));
assertEquals(expected, result);
}
public void testOn() throws ParseException {
TimeSchedule s = new TimeSchedule();
s.setAt("12:00");
ScheduleContext context;
ScheduleResult expected, result;
context = new ScheduleContext(
DateHelper.parseDateTime("2005-06-21 8:00"));
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2005-06-21 12:00")),
null);
result = s.nextDue(context);
assertEquals(expected, result);
context = new ScheduleContext(
DateHelper.parseDateTime("2005-06-21 12:00"));
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2005-06-21 12:00")),
null);
result = s.nextDue(context);
assertEquals(expected, result);
context = new ScheduleContext(
DateHelper.parseDateTime("2005-06-21 12:30"));
expected = null;
result = s.nextDue(context);
assertEquals(expected, result);
}
public void testWithLimits() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setAt("12:00");
ScheduleContext context;
ScheduleResult expected, result;
context = new ScheduleContext(
DateHelper.parseDateTime("2020-06-20 12:00"));
context = context.spawn(new IntervalTo(
DateHelper.parseDate("2020-06-21"),
DateHelper.parseDate("2020-06-22")));
result = test.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2020-06-21 12:00")),
null);
assertEquals(expected, result);
}
// with just a from time
public void testDefaultTo() throws Exception {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2005-12-25 09:00"));
Interval result = test.nextDue(context);
logger.debug("result " + result);
Interval expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2005-12-25 10:00"),
Interval.END_OF_TIME),
null);
assertEquals(expected, result);
}
// with just a to time
public void testDefaultFrom() throws Exception {
TimeSchedule s = new TimeSchedule();
s.setTo("10:00");
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2005-12-25 09:00"));
Interval result = s.nextDue(context);
logger.debug("result " + result);
Interval expected = new SimpleScheduleResult(
new IntervalTo(
Interval.START_OF_TIME,
DateHelper.parseDateTime("2005-12-25 10:00")),
null);
assertEquals(expected, result);
}
public void testWithInterval() throws Exception {
TimeSchedule timeSchedule = new TimeSchedule();
timeSchedule.setFrom("08:00");
timeSchedule.setTo("11:57");
IntervalSchedule intervalSchedule = new IntervalSchedule();
intervalSchedule.setInterval("00:15");
timeSchedule.setRefinement(intervalSchedule);
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2006-02-23 00:07"));
ScheduleResult result = timeSchedule.nextDue(context);
logger.debug("result " + result);
ScheduleResult expected = (
new IntervalTo(
DateHelper.parseDateTime("2006-02-23 08:00"),
DateHelper.parseDateTime("2006-02-23 08:15")));
assertEquals(expected, result);
result = timeSchedule.nextDue(
context.move(result.getUseNext()));
expected =
new IntervalTo(
DateHelper.parseDateTime("2006-02-23 08:15"),
DateHelper.parseDateTime("2006-02-23 08:30"));
assertEquals(expected, result);
// In the last interval.
context = new ScheduleContext(
DateHelper.parseDateTime("2006-02-23 11:55"));
result = timeSchedule.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-02-23 11:45"),
DateHelper.parseDateTime("2006-02-23 12:00")),
null);
assertEquals(expected, result);
// Past the to date, but still in the last interval.
context = new ScheduleContext(
DateHelper.parseDateTime("2006-02-23 11:59"));
result = timeSchedule.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-02-23 11:45"),
DateHelper.parseDateTime("2006-02-23 12:00")),
null);
assertEquals(expected, result);
// past for that day.
context = new ScheduleContext(
DateHelper.parseDateTime("2006-02-23 12:00:00"));
result = timeSchedule.nextDue(context);
expected = null;
assertEquals(expected, result);
}
public void testWithIntervalOverMidnight() throws Exception {
TimeSchedule timeSchedule = new TimeSchedule();
timeSchedule.setFrom("23:00");
timeSchedule.setTo("01:50");
IntervalSchedule intervalSchedule = new IntervalSchedule();
intervalSchedule.setInterval("00:15");
timeSchedule.setRefinement(intervalSchedule);
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2006-02-23 01:55"));
ScheduleResult result = timeSchedule.nextDue(context);
ScheduleResult expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2006-02-23 01:45"),
DateHelper.parseDateTime("2006-02-23 02:00")),
null);
assertEquals(expected, result);
}
public void testNextIntervalWithParent() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("17:00");
// Test before
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 14:00"));
context = context.spawn(new IntervalTo(
DateHelper.parseDate("2003-05-26"),
DateHelper.parseDate("2003-05-27")));
Interval result = test.nextInterval(context);
Interval expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-26 10:00"),
DateHelper.parseDateTime("2003-05-26 17:00"));
assertEquals(expected, result);
// Test during last.
context = context.move(
DateHelper.parseDateTime("2003-05-25 14:00"));
result = test.nextInterval(context);
expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-26 10:00"),
DateHelper.parseDateTime("2003-05-26 17:00"));
assertEquals(expected, result);
// Test during current.
context = context.move(
DateHelper.parseDateTime("2003-05-26 14:00"));
result = test.nextInterval(context);
expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-26 10:00"),
DateHelper.parseDateTime("2003-05-26 17:00"));
assertEquals(expected, result);
// Test after parent interval.
context = context.move(
DateHelper.parseDateTime("2003-05-27 14:00"));
result = test.nextInterval(context);
expected = null;
assertEquals(expected, result);
}
public void testLastInterval() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("17:00");
Interval expected, result;
// before
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 09:00"));
result = test.lastInterval(context);
expected = null;
assertEquals(expected, result);
// during
context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 12:00"));
result = test.lastInterval(context);
expected = null;
assertEquals(expected, result);
// after
context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 17:00"));
result = test.lastInterval(context);
expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-24 10:00"),
DateHelper.parseDateTime("2003-05-24 17:00"));
assertEquals(expected, result);
}
public void testLastIntervalOverMidnight() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("22:00");
test.setTo("07:00");
Interval expected, result;
// during
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 06:00"));
result = test.lastInterval(context);
expected = null;
assertEquals(expected, result);
// after
context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 12:00"));
result = test.lastInterval(context);
expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-23 22:00"),
DateHelper.parseDateTime("2003-05-24 07:00"));
assertEquals(expected, result);
// during
context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 23:00"));
result = test.lastInterval(context);
expected = new IntervalTo(
DateHelper.parseDateTime("2003-05-23 22:00"),
DateHelper.parseDateTime("2003-05-24 07:00"));
assertEquals(expected, result);
}
public void testWithParent() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("17:00");
WeeklySchedule weekly = new WeeklySchedule();
weekly.setOn(DayOfWeek.Days.MONDAY);
weekly.setRefinement(test);
// A Saturday.
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 14:00"));
ScheduleResult result = weekly.nextDue(context);
ScheduleResult expected;
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-05-26 10:00"),
DateHelper.parseDateTime("2003-05-26 17:00")));
assertEquals(expected, result);
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-06-02 10:00"),
DateHelper.parseDateTime("2003-06-02 17:00")));
result = weekly.nextDue(context.move(result.getUseNext()));
assertEquals(expected, result);
}
public void testAtWithParentWeekly() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setAt("17:00");
WeeklySchedule weekly = new WeeklySchedule();
weekly.setOn(DayOfWeek.Days.MONDAY);
weekly.setRefinement(test);
// A Saturday.
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 14:00"));
ScheduleResult result = weekly.nextDue(context);
ScheduleResult expected;
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-05-26 17:00")));
assertEquals(expected, result);
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-06-02 17:00")));
result = weekly.nextDue(context.move(result.getUseNext()));
assertEquals(expected, result);
}
public void testAtWithParentMonthly() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setAt("17:00");
MonthlySchedule monthly = new MonthlySchedule();
monthly.setFromDay(new DayOfMonth.Number(17));
monthly.setToDay(new DayOfMonth.Number(22));
monthly.setRefinement(test);
ScheduleResult result, expected;
// before
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 14:00"));
result = monthly.nextDue(context);
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-06-17 17:00")));
assertEquals(expected, result);
// during
context = context.move(
DateHelper.parseDateTime("2003-06-20 14:00"));
result = monthly.nextDue(context);
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-07-17 17:00")));
assertEquals(expected, result);
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2003-08-17 17:00")));
result = monthly.nextDue(context.move(result.getUseNext()));
assertEquals(expected, result);
}
public void testAsChildWithInterval() throws Exception {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("17:00");
IntervalSchedule intervalSchedule = new IntervalSchedule();
intervalSchedule.setInterval("05:00");
WeeklySchedule weekly = new WeeklySchedule();
weekly.setOn(DayOfWeek.Days.MONDAY);
test.setRefinement(intervalSchedule);
weekly.setRefinement(test);
// A Saturday.
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-24 14:00"));
ScheduleResult result = weekly.nextDue(context);
ScheduleResult expected;
expected =
new IntervalTo(
DateHelper.parseDateTime("2003-05-26 10:00"),
DateHelper.parseDateTime("2003-05-26 15:00"));
assertEquals(expected, result);
context = context.move(result.getUseNext());
result = weekly.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2003-05-26 15:00"),
DateHelper.parseDateTime("2003-05-26 20:00")));
assertEquals(expected, result);
}
public void testAsChildOverMidnightWithInterval() throws Exception {
TimeSchedule test = new TimeSchedule();
test.setFrom("22:00");
test.setTo("05:00");
IntervalSchedule intervalSchedule = new IntervalSchedule();
intervalSchedule.setInterval("05:00");
WeeklySchedule weekly = new WeeklySchedule();
weekly.setOn(DayOfWeek.Days.MONDAY);
test.setRefinement(intervalSchedule);
weekly.setRefinement(test);
// A Saturday.
ScheduleResult[] results = new ScheduleRoller(weekly).resultsFrom(
DateHelper.parseDateTime("2003-05-24 14:00"));
ScheduleResult expected;
expected =
new IntervalTo(
DateHelper.parseDateTime("2003-05-26 22:00"),
DateHelper.parseDateTime("2003-05-27 03:00"));
assertEquals(expected, results[0]);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2003-05-27 03:00"),
DateHelper.parseDateTime("2003-05-27 08:00")));
assertEquals(expected, results[1]);
expected =
new IntervalTo(
DateHelper.parseDateTime("2003-06-02 22:00"),
DateHelper.parseDateTime("2003-06-03 03:00"));
assertEquals(expected, results[2]);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2003-06-03 03:00"),
DateHelper.parseDateTime("2003-06-03 08:00")));
assertEquals(expected, results[3]);
// Check last interval is used.
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2003-05-27 07:00"));
ScheduleResult result;
result = weekly.nextDue(context);
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2003-05-27 03:00"),
DateHelper.parseDateTime("2003-05-27 08:00")));
assertEquals(expected, result);
}
/**
* Weird things happen with more than 24 hours in a day...
*/
public void testTimeAfter24() throws ParseException {
TimeSchedule test = new TimeSchedule();
test.setFrom("10:00");
test.setTo("25:00");
ScheduleContext context;
Interval expected;
Interval result;
context = new ScheduleContext(
DateHelper.parseDateTime("2009-02-27"));
expected = new SimpleScheduleResult(
new IntervalTo(
DateHelper.parseDateTime("2009-02-27 10:00"),
DateHelper.parseDateTime("2009-02-28 01:00")),
null);
result = test.nextDue(context);
assertEquals(expected, result);
context = new ScheduleContext(
DateHelper.parseDate("2009-02-27 12:00"));
result = test.nextDue(context);
assertEquals(expected, result);
}
/**
* Note that the retry is never due because it starts before the
* schedule, and so is limited by it to being never due.
*
* @throws ParseException
*/
public void testTwoNestedTimes() throws ParseException {
TimeSchedule schedule = new TimeSchedule();
schedule.setFrom("07:00");
TimeSchedule retry = new TimeSchedule();
retry.setTo("14:00");
schedule.setRefinement(retry);
ScheduleRoller roller = new ScheduleRoller(schedule);
Interval[] results = roller.resultsFrom(
DateHelper.parseDateTime("2009-02-15 13:51"));
assertNull(results[0]);
}
public void testLimitedTimeAndAnInterval() throws ParseException {
TimeSchedule retry = new TimeSchedule();
retry.setFrom("07:00");
retry.setTo("14:00");
IntervalSchedule interval = new IntervalSchedule();
interval.setInterval("00:15");
retry.setRefinement(interval);
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2009-02-15 13:51"));
context = context.spawn(
new SimpleInterval(
DateHelper.parseDateTime("2009-02-15 07:00"),
DateHelper.parseDateTime("2009-02-16 00:00")));
Interval expected;
Interval result;
expected = new SimpleScheduleResult(
new SimpleInterval(
DateHelper.parseDateTime("2009-02-15 13:45"),
DateHelper.parseDateTime("2009-02-15 14:00")),
null);
result = retry.nextDue(context);
assertEquals(expected, result);
result = retry.nextDue(context.move(expected.getToDate()));
assertNull(result);
}
public void testDefaultTimesRollingForward() throws ParseException {
TimeSchedule test = new TimeSchedule();
ScheduleContext context = new ScheduleContext(
DateHelper.parseDateTime("2011-06-30 00:00"));
Interval result = test.nextDue(context);
Interval expected = new SimpleScheduleResult(
new IntervalTo(
Interval.START_OF_TIME,
Interval.END_OF_TIME),
null);
assertEquals(expected, result);
}
}