/* * (c) Rob Gordon 2005 */ package org.oddjob.schedules.schedules; import java.text.ParseException; import java.util.Date; 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.ScheduleRoller; import org.oddjob.schedules.units.DayOfWeek; /** * */ public class DailyScheduleTest extends TestCase { private static final Logger logger = Logger.getLogger("org.oddjob"); protected void setUp() { logger.debug("============== " + getName() + " =================="); } public void testStandardIntervalDifferentStarts() throws ParseException { DailySchedule test = new DailySchedule(); test.setFrom("10:00"); test.setTo("11:00"); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2006-03-02 09:00")); Interval result = test.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2006-03-02 10:00"), DateHelper.parseDateTime("2006-03-02 11:00")); assertEquals(expected, result); context = new ScheduleContext( DateHelper.parseDateTime("2006-03-02 10:30")); result = test.nextDue(context); assertEquals(expected, result); context = new ScheduleContext( DateHelper.parseDateTime("2006-03-02 11:30")); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-03-03 10:00"), DateHelper.parseDateTime("2006-03-03 11:00")); assertEquals(expected, result); } public void testStandardIntervalRollingNext() throws ParseException { DailySchedule test = new DailySchedule(); test.setFrom("10:00"); test.setTo("11:00"); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2006-03-02 09:00")); Interval result = test.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2006-03-02 10:00"), DateHelper.parseDateTime("2006-03-02 11:00")); assertEquals(expected, result); context = context.move(result.getToDate()); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-03-03 10:00"), DateHelper.parseDateTime("2006-03-03 11:00")); assertEquals(expected, result); context = context.move(result.getToDate()); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-03-04 10:00"), DateHelper.parseDateTime("2006-03-04 11:00")); assertEquals(expected, result); } public void testForwardInterval() throws ParseException { DailySchedule s = new DailySchedule(); s.setFrom("11:00"); s.setTo("10:00"); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2006-03-01 11:00"), DateHelper.parseDateTime("2006-03-02 10:00")); Interval 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 IntervalTo( DateHelper.parseDateTime("2006-03-02 11:00"), DateHelper.parseDateTime("2006-03-03 10:00")); assertEquals(expected, result); result = s.nextDue(new ScheduleContext( DateHelper.parseDateTime("2006-03-02 11:30"))); assertEquals(expected, result); } public void testSimple() throws ParseException { DailySchedule s = new DailySchedule(); s.setFrom("10:00"); s.setTo("11:00"); Date on; ScheduleContext context; on = DateHelper.parseDateTime("2005-06-21 9:56"); context = new ScheduleContext(on); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2005-06-21 10:00"), DateHelper.parseDateTime("2005-06-21 11:00")); Interval result = s.nextDue(context); assertEquals(expected, result); on = DateHelper.parseDateTime("2005-06-21 10:30"); context = new ScheduleContext(on); expected = new IntervalTo( DateHelper.parseDateTime("2005-06-21 10:00"), DateHelper.parseDateTime("2005-06-21 11:00")); result = s.nextDue(context); assertEquals(expected, result); on = DateHelper.parseDateTime("2005-06-21 12:30"); context = new ScheduleContext(on); expected = new IntervalTo( DateHelper.parseDateTime("2005-06-22 10:00"), DateHelper.parseDateTime("2005-06-22 11:00")); result = s.nextDue(context); assertEquals(expected, result); } public void testOverMidnight() throws ParseException { DailySchedule s = new DailySchedule(); s.setFrom("23:00"); s.setTo("01:00"); Date on; ScheduleContext context; // before. on = DateHelper.parseDateTime("2005-06-21 02:56"); context = new ScheduleContext(on); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2005-06-21 23:00"), DateHelper.parseDateTime("2005-06-22 01:00")); Interval result = s.nextDue(context); assertEquals(expected, result); // during. on = DateHelper.parseDateTime("2005-06-22 0:30"); context = new ScheduleContext(on); expected = new IntervalTo ( DateHelper.parseDateTime("2005-06-21 23:00"), DateHelper.parseDateTime("2005-06-22 01:00")); result = s.nextDue(context); assertEquals(expected, result); // after on = DateHelper.parseDateTime("2005-06-22 01:00"); context = new ScheduleContext(on); expected = new IntervalTo( DateHelper.parseDateTime("2005-06-22 23:00"), DateHelper.parseDateTime("2005-06-23 01:00")); result = s.nextDue(context); assertEquals(expected, result); } public void testOn() throws ParseException { DailySchedule s = new DailySchedule(); s.setAt("12:00"); Date on; ScheduleContext context; on = DateHelper.parseDateTime("2005-06-21 8:00"); context = new ScheduleContext(on); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2005-06-21 12:00")); Interval result = s.nextDue(context); assertEquals(expected, result); on = DateHelper.parseDateTime("2005-06-21 12:00"); context = new ScheduleContext(on); expected = new IntervalTo( DateHelper.parseDateTime("2005-06-21 12:00")); result = s.nextDue(context); assertEquals(expected, result); on = DateHelper.parseDateTime("2005-06-21 12:30"); context = new ScheduleContext(on); expected = new IntervalTo( DateHelper.parseDateTime("2005-06-22 12:00")); result = s.nextDue(context); assertEquals(expected, result); } public void testWithLimits() throws ParseException { DailySchedule test = new DailySchedule(); test.setAt("12:00"); Date on; ScheduleContext context; on = DateHelper.parseDateTime("2020-06-21 12:00"); context = new ScheduleContext(on); context.spawn(new IntervalTo( DateHelper.parseDate("2020-06-21"), DateHelper.parseDate("2020-06-22"))); Interval result = test.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2020-06-21 12:00")); assertEquals(expected, result); } // with just a from time public void testDefaultTo() throws Exception { DailySchedule test = new DailySchedule(); test.setFrom("10:00"); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2005-12-25 09:00")); Interval result = test.nextDue(context); logger.debug("result " + result); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2005-12-25 10:00"), DateHelper.parseDateTime("2005-12-26 00:00")); assertEquals(expected, result); context = context.move(result.getToDate()); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2005-12-26 10:00"), DateHelper.parseDateTime("2005-12-27 00:00")); } // with just a to time public void testDefaultFrom() throws Exception { DailySchedule s = new DailySchedule(); s.setTo("10:00"); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2005-12-25 11:00")); Interval result = s.nextDue(context); logger.debug("result " + result); assertEquals(new IntervalTo( DateHelper.parseDateTime("2005-12-26 00:00"), DateHelper.parseDateTime("2005-12-26 10:00")), result); } public void testWithInterval() throws Exception { DailySchedule test = new DailySchedule(); test.setFrom("08:00"); test.setTo("11:59"); IntervalSchedule intervalSchedule = new IntervalSchedule(); intervalSchedule.setInterval("00:15"); test.setRefinement(intervalSchedule); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2006-02-23 00:07")); Interval result = test.nextDue(context); logger.debug("result " + result); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2006-02-23 08:00"), DateHelper.parseDateTime("2006-02-23 08:15")); assertEquals(expected, result); result = test.nextDue( context.move(result.getToDate())); 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:58")); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-02-23 11:45"), DateHelper.parseDateTime("2006-02-23 12:00")); assertEquals(expected, result); // Past the to date, but still in the last interval. context = new ScheduleContext( DateHelper.parseDateTime("2006-02-23 11:59:05")); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-02-23 11:45"), DateHelper.parseDateTime("2006-02-23 12:00")); assertEquals(expected, result); // past for that day. context = new ScheduleContext( DateHelper.parseDateTime("2006-02-23 12:00:00")); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2006-02-24 08:00"), DateHelper.parseDateTime("2006-02-24 08:15")); assertEquals(expected, result); } public void testAsChildWithInterval() throws Exception { DailySchedule test = new DailySchedule(); test.setFrom("10:00"); test.setTo("17:00"); IntervalSchedule intervalSchedule = new IntervalSchedule(); intervalSchedule.setInterval("05:00"); WeeklySchedule dayOfWeek = new WeeklySchedule(); dayOfWeek.setOn(DayOfWeek.Days.MONDAY); test.setRefinement(intervalSchedule); dayOfWeek.setRefinement(test); ScheduleRoller roller = new ScheduleRoller(dayOfWeek); Interval[] results = roller.resultsFrom( DateHelper.parseDateTime("2003-05-24 14:00")); IntervalTo expected; expected = new IntervalTo( DateHelper.parseDateTime("2003-05-26 10:00"), DateHelper.parseDateTime("2003-05-26 15:00")); assertEquals(expected, results[0]); expected = new IntervalTo( DateHelper.parseDateTime("2003-05-26 15:00"), DateHelper.parseDateTime("2003-05-26 20:00")); assertEquals(expected, results[1]); expected = new IntervalTo( DateHelper.parseDateTime("2003-06-02 10:00"), DateHelper.parseDateTime("2003-06-02 15:00")); assertEquals(expected, results[2]); } /** * Weird things happen with more than 24 hours in a day... * So we don't support this!! * */ public void testTimeAfter24() throws ParseException { DailySchedule test = new DailySchedule(); test.setFrom("10:00"); test.setTo("25:00"); ScheduleContext context; Interval expected; Interval result; context = new ScheduleContext( DateHelper.parseDateTime("2009-02-27")); expected = new IntervalTo( DateHelper.parseDateTime("2009-02-26 10:00"), DateHelper.parseDateTime("2009-02-28 01:00")); 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 { DailySchedule schedule = new DailySchedule(); schedule.setFrom("07:00"); DailySchedule retry = new DailySchedule(); 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 { DailySchedule retry = new DailySchedule(); 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 IntervalTo( DateHelper.parseDateTime("2009-02-15 07:00"), DateHelper.parseDateTime("2009-02-16 00:00"))); Interval expected; Interval result; expected = new IntervalTo( DateHelper.parseDateTime("2009-02-15 13:45"), DateHelper.parseDateTime("2009-02-15 14:00")); result = retry.nextDue(context); assertEquals(expected, result); result = retry.nextDue(context.move(expected.getToDate())); assertNull(result); } public void testDefaultTimesRollingForward() throws ParseException { DailySchedule test = new DailySchedule(); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2011-06-30 00:00")); Interval result = test.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2011-06-30 00:00"), DateHelper.parseDateTime("2011-07-01 00:00")); assertEquals(expected, result); context = context.move(result.getToDate()); result = test.nextDue(context); expected = new IntervalTo( DateHelper.parseDateTime("2011-07-01 00:00"), DateHelper.parseDateTime("2011-07-02 00:00")); assertEquals(expected, result); } }