Rollback to midnight in quartz expressions
This commit makes sure that the CronExpression rolls back the time to midnight when dealing with Quartz expression fields (such as "L", "LW", etc.). Closes gh-26390
This commit is contained in:
@@ -1137,4 +1137,110 @@ class CronExpressionTests {
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
assertThat(actual.getDayOfWeek()).isEqualTo(THURSDAY);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartzLastDayOfMonthEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * L * *");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 30, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 1, 31, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
|
||||
last = LocalDateTime.of(2021, 1, 31, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 1, 31, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartzLastDayOfMonthOffsetEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * L-1 * *");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 29, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 1, 30, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
|
||||
last = LocalDateTime.of(2021, 1, 30, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 1, 30, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartzFirstWeekdayOfMonthEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * 1W * *");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 31, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 2, 1, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
|
||||
last = LocalDateTime.of(2021, 2, 1, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 2, 1, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartzLastWeekdayOfMonthEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * LW * *");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 28, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 1, 29, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
|
||||
last = LocalDateTime.of(2021, 1, 29, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 1, 29, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartz5thFridayOfTheMonthEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * ? * FRI#5");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 28, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 1, 29, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
assertThat(actual.getDayOfWeek()).isEqualTo(FRIDAY);
|
||||
|
||||
last = LocalDateTime.of(2021, 1, 29, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 1, 29, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
void quartzLastFridayOfTheMonthEveryHour() {
|
||||
CronExpression expression = CronExpression.parse("0 0 * ? * FRIL");
|
||||
|
||||
LocalDateTime last = LocalDateTime.of(2021, 1, 28, 0, 1);
|
||||
LocalDateTime expected = LocalDateTime.of(2021, 1, 29, 0, 0);
|
||||
LocalDateTime actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
assertThat(actual.getDayOfWeek()).isEqualTo(FRIDAY);
|
||||
|
||||
last = LocalDateTime.of(2021, 1, 29, 1, 0);
|
||||
expected = LocalDateTime.of(2021, 1, 29, 2, 0);
|
||||
actual = expression.next(last);
|
||||
assertThat(actual).isNotNull();
|
||||
assertThat(actual).isEqualTo(expected);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -98,6 +98,7 @@ class QuartzCronFieldTests {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("L#1"));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("8#1"));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("2#1,2#3,2#5"));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("FRI#-1"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user