@Test
 public void testLastExecution() throws Exception {
   DateTime now = truncateToSeconds(DateTime.now());
   DateTime expected = truncateToSeconds(now.minusSeconds(1));
   ExecutionTime executionTime = ExecutionTime.forCron(quartzCronParser.parse(EVERY_SECOND));
   assertEquals(expected, executionTime.lastExecution(now));
 }
 @Test
 public void testTimeToNextExecution() throws Exception {
   DateTime now = truncateToSeconds(DateTime.now());
   DateTime expected = truncateToSeconds(now.plusSeconds(1));
   ExecutionTime executionTime = ExecutionTime.forCron(quartzCronParser.parse(EVERY_SECOND));
   assertEquals(new Interval(now, expected).toDuration(), executionTime.timeToNextExecution(now));
 }
 /** Issue #24: next execution not properly calculated */
 @Test
 public void testTimeShiftingProperlyDone() throws Exception {
   ExecutionTime executionTime = ExecutionTime.forCron(quartzCronParser.parse("0 0/10 22 * * *"));
   DateTime nextExecution =
       executionTime.nextExecution(DateTime.now().withHourOfDay(15).withMinuteOfHour(27));
   assertEquals(22, nextExecution.getHourOfDay());
   assertEquals(0, nextExecution.getMinuteOfHour());
 }
 /** Issue #30: execution time properly calculated */
 @Test
 public void testSaturdayExecutionTime() {
   DateTime now = DateTime.now();
   CronParser parser =
       new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ));
   ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("0 0 3 ? * 6"));
   DateTime last = executionTime.lastExecution(now);
   DateTime next = executionTime.nextExecution(now);
   assertNotEquals(last, next);
 }
  /**
   * Test for issue #18
   *
   * @throws Exception
   */
  @Test
  public void testHourlyIntervalTimeFromLastExecution() throws Exception {
    DateTime now = DateTime.now();
    DateTime previousHour = now.minusHours(1);
    String quartzCronExpression = String.format("0 0 %s * * ?", previousHour.getHourOfDay());
    ExecutionTime executionTime =
        ExecutionTime.forCron(quartzCronParser.parse(quartzCronExpression));

    assertTrue(executionTime.timeFromLastExecution(now).getStandardMinutes() <= 120);
  }
  /**
   * Test for issue #19 https://github.com/jmrozanec/cron-utils/issues/19 Reported case: When
   * nextExecution shifts to 32nd day (e.g. 2015-01-31 23:59:59 + 00:00:01), JodaTime will throw an
   * exception Expected: should shift one month
   */
  @Test
  public void testShiftTo32ndDay() {
    String expression = "0/1 * * 1/1 * ? *"; // every second every day
    ExecutionTime executionTime = ExecutionTime.forCron(quartzCronParser.parse(expression));

    DateTime now = new DateTime(2015, 1, 31, 23, 59, 59, 0);
    DateTime expected = now.plusSeconds(1);
    DateTime nextExecution = executionTime.nextExecution(now);

    assertEquals(expected, nextExecution);
  }
 /**
  * Test for issue #9 https://github.com/jmrozanec/cron-utils/issues/9 Reported case: If you write
  * a cron expression that contains a month or day of week, nextExection() ignores it. Expected:
  * should not ignore month or day of week field
  */
 @Test
 public void testDoesNotIgnoreMonthOrDayOfWeek() {
   CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
   CronParser cronParser = new CronParser(cronDefinition);
   // seconds, minutes, hours, dayOfMonth, month, dayOfWeek
   ExecutionTime executionTime = ExecutionTime.forCron(cronParser.parse("0 11 11 11 11 ?"));
   DateTime now = new DateTime(2015, 4, 15, 0, 0, 0);
   DateTime whenToExecuteNext = executionTime.nextExecution(now);
   assertEquals(2015, whenToExecuteNext.getYear());
   assertEquals(11, whenToExecuteNext.getMonthOfYear());
   assertEquals(11, whenToExecuteNext.getDayOfMonth());
   assertEquals(11, whenToExecuteNext.getHourOfDay());
   assertEquals(11, whenToExecuteNext.getMinuteOfHour());
   assertEquals(0, whenToExecuteNext.getSecondOfMinute());
 }
 @Test
 public void testForCron() throws Exception {
   assertEquals(
       ExecutionTime.class,
       ExecutionTime.forCron(quartzCronParser.parse(EVERY_SECOND)).getClass());
 }
 /** Issue #27: execution time properly calculated */
 @Test
 public void testMonthRangeExecutionTime() {
   ExecutionTime.forCron(quartzCronParser.parse("0 0 0 * JUL-AUG * *"));
 }