/* * Copyright (c) 2004, Rob Gordon. */ package org.oddjob.schedules.schedules; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import junit.framework.TestCase; import org.oddjob.OddjobDescriptorFactory; import org.oddjob.arooa.ArooaDescriptor; import org.oddjob.arooa.ArooaParseException; import org.oddjob.arooa.standard.StandardFragmentParser; import org.oddjob.arooa.utils.DateHelper; import org.oddjob.arooa.xml.XMLConfiguration; import org.oddjob.schedules.Interval; import org.oddjob.schedules.IntervalTo; import org.oddjob.schedules.Schedule; import org.oddjob.schedules.ScheduleContext; import org.oddjob.schedules.ScheduleResult; import org.oddjob.schedules.ScheduleRoller; import org.oddjob.schedules.SimpleScheduleResult; import org.oddjob.schedules.units.DayOfMonth; import org.oddjob.schedules.units.DayOfWeek; import org.oddjob.schedules.units.WeekOfMonth; /** * * @author Rob Gordon. */ public class MonthlyScheduleTest extends TestCase { // private static Logger logger = Logger.getLogger(DayOfMonthScheduleTest.class); DateFormat checkFormat; DateFormat inputFormat; protected void setUp() { checkFormat = new SimpleDateFormat("dd-MMM-yy HH:mm:ss:SSS"); inputFormat = new SimpleDateFormat("dd-MMM-yy HH:mm"); } /** * Test the next due time when a date is between the from * and the to date. */ public void testFromAndTo() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(5)); schedule.setToDay(new DayOfMonth.Number(25)); Date now1 = inputFormat.parse("10-feb-2003 12:30"); IntervalTo expected = new IntervalTo( DateHelper.parseDate("2003-02-05"), DateHelper.parseDate("2003-02-26")); Interval result = schedule.nextDue(new ScheduleContext(now1)); assertEquals(expected, result); } /** * Test the next due time when a date is after * the to time. */ public void testAfter() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(5)); schedule.setToDay(new DayOfMonth.Number(25)); Date now1 = inputFormat.parse("26-feb-2003 12:30"); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2003-03-05"), DateHelper.parseDateTime("2003-03-26")); Interval result = schedule.nextDue(new ScheduleContext(now1)); assertEquals(expected, result); } /** * Test the next due when the from and to span * a month boundry. */ public void testOverBoundry() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(25)); schedule.setToDay(new DayOfMonth.Number(5)); Date now1 = inputFormat.parse("26-feb-2003 12:30"); IntervalTo expected = new IntervalTo( DateHelper.parseDate("2003-02-25"), DateHelper.parseDate("2003-03-06")); Interval result1 = schedule.nextDue(new ScheduleContext(now1)); assertEquals(expected, result1); Date now2 = inputFormat.parse("24-feb-2003 12:30"); Interval result2 = schedule.nextDue(new ScheduleContext(now2)); assertEquals(expected, result2); Date now3 = inputFormat.parse("1-mar-2003 12:30"); Interval result3 = schedule.nextDue(new ScheduleContext(now3)); assertEquals(expected, result3); } /** * Test last day of the month. */ public void testLastDay() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(5)); schedule.setToDay(DayOfMonth.Shorthands.LAST); Date now1 = inputFormat.parse("02-mar-2003 12:30"); Interval interval1 = schedule.nextDue( new ScheduleContext(now1)); IntervalTo expected1 = new IntervalTo( DateHelper.parseDateTime("2003-03-05"), DateHelper.parseDateTime("2003-04-01")); assertTrue("interval as expected", interval1.equals(expected1)); Interval interval2 = schedule.nextDue( new ScheduleContext(now1)); IntervalTo expected2 = new IntervalTo( DateHelper.parseDateTime("2003-03-05"), DateHelper.parseDateTime("2003-04-01")); assertEquals(expected2, interval2); } public void testPenultimateDayOfMonth() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(5)); schedule.setToDay(DayOfMonth.Shorthands.PENULTIMATE); ScheduleResult[] results = new ScheduleRoller( schedule).resultsFrom( DateHelper.parseDateTime("2008-01-15 12:30")); ScheduleResult expected = new IntervalTo( DateHelper.parseDateTime("2008-01-05"), DateHelper.parseDateTime("2008-01-31")); assertEquals(expected, results[0]); expected = new IntervalTo( DateHelper.parseDateTime("2008-02-05"), DateHelper.parseDateTime("2008-02-29")); assertEquals(expected, results[1]); expected = new IntervalTo( DateHelper.parseDateTime("2008-03-05"), DateHelper.parseDateTime("2008-03-31")); assertEquals(expected, results[2]); expected = new IntervalTo( DateHelper.parseDateTime("2008-04-05"), DateHelper.parseDateTime("2008-04-30")); assertEquals(expected, results[3]); expected = new IntervalTo( DateHelper.parseDateTime("2008-05-05"), DateHelper.parseDateTime("2008-05-31")); assertEquals(expected, results[4]); } public void testLastDayOfMonthWithTimeOverMidnight() throws ParseException { MonthlySchedule test = new MonthlySchedule(); test.setOnDay(DayOfMonth.Shorthands.LAST); TimeSchedule time = new TimeSchedule(); time.setFrom("23:00"); time.setTo("01:00"); test.setRefinement(time); ScheduleResult[] results = new ScheduleRoller( test).resultsFrom( DateHelper.parseDateTime("2008-01-15 12:30")); ScheduleResult expected = new IntervalTo( DateHelper.parseDateTime("2008-01-31 23:00"), DateHelper.parseDateTime("2008-02-01 01:00")); assertEquals(expected, results[0]); expected = new IntervalTo( DateHelper.parseDateTime("2008-02-29 23:00"), DateHelper.parseDateTime("2008-03-01 01:00")); assertEquals(expected, results[1]); expected = new IntervalTo( DateHelper.parseDateTime("2008-03-31 23:00"), DateHelper.parseDateTime("2008-04-01 01:00")); assertEquals(expected, results[2]); expected = new IntervalTo( DateHelper.parseDateTime("2008-04-30 23:00"), DateHelper.parseDateTime("2008-05-01 01:00")); assertEquals(expected, results[3]); expected = new IntervalTo( DateHelper.parseDateTime("2008-05-31 23:00"), DateHelper.parseDateTime("2008-06-01 01:00")); assertEquals(expected, results[4]); // Check the last interval is tested. results = new ScheduleRoller( test).resultsFrom( DateHelper.parseDateTime("2008-03-01 00:30")); expected = new IntervalTo( DateHelper.parseDateTime("2008-02-29 23:00"), DateHelper.parseDateTime("2008-03-01 01:00")); assertEquals(expected, results[0]); expected = new IntervalTo( DateHelper.parseDateTime("2008-03-31 23:00"), DateHelper.parseDateTime("2008-04-01 01:00")); assertEquals(expected, results[1]); } public void testDefaultFrom() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setToDay(new DayOfMonth.Number(25)); Interval result = schedule.nextDue( new ScheduleContext(DateHelper.parseDate("2006-03-26"))); assertEquals(new IntervalTo( DateHelper.parseDateTime("2006-04-01 00:00"), DateHelper.parseDateTime("2006-04-26 00:00")), result); } public void testDefaultTo() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setFromDay(new DayOfMonth.Number(5)); Interval result = schedule.nextDue( new ScheduleContext( DateHelper.parseDate("2006-03-26"))); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2006-03-05 00:00"), DateHelper.parseDateTime("2006-04-01 00:00")); assertEquals(expected, result); } public void testInclusive() throws ParseException { MonthlySchedule schedule = new MonthlySchedule(); schedule.setToDay(new DayOfMonth.Number(25)); Interval result = schedule.nextDue( new ScheduleContext(DateHelper.parseDate("2006-03-25 10:15"))); assertEquals(new IntervalTo( DateHelper.parseDateTime("2006-03-01 00:00"), DateHelper.parseDateTime("2006-03-26 00:00")), result); } public void testDayOfMonthExample1() throws ArooaParseException, ParseException { OddjobDescriptorFactory df = new OddjobDescriptorFactory(); ArooaDescriptor descriptor = df.createDescriptor( getClass().getClassLoader()); StandardFragmentParser parser = new StandardFragmentParser(descriptor); parser.parse(new XMLConfiguration( "org/oddjob/schedules/schedules/DayOfMonthExample1.xml", getClass().getClassLoader())); Schedule schedule = (Schedule) parser.getRoot(); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2011-04-12 11:00")); Interval next = schedule.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2011-04-17 10:00")); assertEquals(expected, next); next = schedule.nextDue(context.move( expected.getToDate())); expected = new IntervalTo( DateHelper.parseDateTime("2011-04-18 10:00")); assertEquals(expected, next); } public void testDayOfMonthExample2() throws ArooaParseException, ParseException { OddjobDescriptorFactory df = new OddjobDescriptorFactory(); ArooaDescriptor descriptor = df.createDescriptor( getClass().getClassLoader()); StandardFragmentParser parser = new StandardFragmentParser(descriptor); parser.parse(new XMLConfiguration( "org/oddjob/schedules/schedules/DayOfMonthExample2.xml", getClass().getClassLoader())); Schedule schedule = (Schedule) parser.getRoot(); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2011-04-12 11:00")); Interval next = schedule.nextDue(context); IntervalTo expected = new IntervalTo( DateHelper.parseDateTime("2011-04-15 00:00"), DateHelper.parseDateTime("2011-04-16 00:00")); assertEquals(expected, next); next = schedule.nextDue(context.move( expected.getToDate())); expected = new IntervalTo( DateHelper.parseDateTime("2011-05-15 00:00"), DateHelper.parseDateTime("2011-05-16 00:00")); assertEquals(expected, next); } public void testShiftFromCalendar() throws ParseException { MonthlySchedule test = new MonthlySchedule(); test.setOnDayOfWeek(DayOfWeek.Days.FRIDAY); test.setInWeek(WeekOfMonth.Weeks.LAST); Calendar calendar = Calendar.getInstance(); calendar.clear(); // Friday 25th March 2011 calendar.set(2011, 2, 25); Calendar result = test.shiftFromCalendar(calendar, 1); assertEquals( DateHelper.parseDate("2011-4-29"), result.getTime()); } public void testDayOfWeekInMonth() throws ParseException { MonthlySchedule test = new MonthlySchedule(); test.setOnDayOfWeek(DayOfWeek.Days.FRIDAY); test.setInWeek(WeekOfMonth.Weeks.LAST); TimeSchedule time = new TimeSchedule(); time.setAt("07:00"); test.setRefinement(time); ScheduleContext context = new ScheduleContext( DateHelper.parseDateTime("2011-03-25 12:00")); Interval result = test.nextDue(context); ScheduleResult expected = new SimpleScheduleResult( new IntervalTo( DateHelper.parseDateTime("2011-04-29 07:00"))); assertEquals(expected, result); } public void testDayOfWeekInMonthOverBoundry() throws ParseException { MonthlySchedule test = new MonthlySchedule(); test.setFromDayOfWeek(DayOfWeek.Days.FRIDAY); test.setFromWeek(WeekOfMonth.Weeks.LAST); test.setToDayOfWeek(DayOfWeek.Days.MONDAY); test.setToWeek(WeekOfMonth.Weeks.FIRST); DailySchedule time = new DailySchedule(); time.setAt("07:00"); test.setRefinement(time); Interval[] results = new ScheduleRoller(test, 12).resultsFrom( DateHelper.parseDateTime("2011-03-25 12:00")); assertEquals(new IntervalTo( DateHelper.parseDateTime("2011-03-26 07:00")), results[0]); assertEquals(new IntervalTo( DateHelper.parseDateTime("2011-03-27 07:00")), results[1]); assertEquals(new IntervalTo( DateHelper.parseDateTime("2011-04-04 07:00")), results[9]); assertEquals(new IntervalTo( DateHelper.parseDateTime("2011-04-29 07:00")), results[10]); } public void testLastFridayOfMonth() throws ParseException, ArooaParseException { OddjobDescriptorFactory df = new OddjobDescriptorFactory(); ArooaDescriptor descriptor = df.createDescriptor( getClass().getClassLoader()); StandardFragmentParser parser = new StandardFragmentParser(descriptor); parser.parse(new XMLConfiguration( "org/oddjob/schedules/schedules/LastFridayOfMonth.xml", getClass().getClassLoader())); Schedule schedule = (Schedule) parser.getRoot(); ScheduleRoller roller = new ScheduleRoller(schedule, 12); Interval[] results = roller.resultsFrom( DateHelper.parseDateTime("2011-04-12 11:00")); ScheduleResult expected; expected = new SimpleScheduleResult( new IntervalTo( DateHelper.parseDateTime("2011-04-29 07:00"))); assertEquals(expected, results[0]); expected = new SimpleScheduleResult( new IntervalTo( DateHelper.parseDateTime("2011-05-27 07:00"))); assertEquals(expected, results[1]); expected = new SimpleScheduleResult( new IntervalTo( DateHelper.parseDateTime("2011-06-24 07:00"))); assertEquals(expected, results[2]); expected = new SimpleScheduleResult( new IntervalTo( DateHelper.parseDateTime("2011-07-29 07:00"))); assertEquals(expected, results[3]); } public void testToString() { MonthlySchedule test = new MonthlySchedule(); test.setOnDayOfWeek(DayOfWeek.Days.FRIDAY); test.setInWeek(WeekOfMonth.Weeks.LAST); String expected = "Monthly on week LAST, day FRIDAY"; assertEquals(expected, test.toString()); test = new MonthlySchedule(); test.setFromDay(new DayOfMonth.Number(5)); test.setToDay(new DayOfMonth.Number(15)); expected = "Monthly from day 5 to day 15"; assertEquals(expected, test.toString()); test = new MonthlySchedule(); expected = "Monthly from the start of the month to the end of the month"; assertEquals(expected, test.toString()); test = new MonthlySchedule(); test.setInWeek(WeekOfMonth.Weeks.FIRST); TimeSchedule time = new TimeSchedule(); time.setAt("07:00"); test.setRefinement(time); expected = "Monthly on week FIRST with refinement Time at 07:00"; assertEquals(expected, test.toString()); } /** * Trying to understand day of week in month stuff. */ public static void main(String... args) throws ParseException { Calendar cal = Calendar.getInstance(); System.out.println(cal.getMinimalDaysInFirstWeek()); System.out.println(cal.getFirstDayOfWeek()); YearlySchedule test = new YearlySchedule(); // DayOfMonthSchedule test = new DayOfMonthSchedule(); ScheduleContext context = new ScheduleContext( DateHelper.parseDate("2011-09-13")); Interval month = test.nextDue(context); TimeSchedule daily = new TimeSchedule(); context = context.spawn(month.getFromDate(), month); while (true) { Interval next = daily.nextDue(context); if (next == null) { break; } cal.setTime(next.getFromDate()); System.out.println(next.getFromDate() + " " + cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) + " " + cal.get(Calendar.DAY_OF_WEEK) + " " + cal.get(Calendar.WEEK_OF_MONTH)); context = context.move(next.getToDate()); } } }