From 917c8e461b8b093f6568480bef94e57842d69a7c Mon Sep 17 00:00:00 2001 From: reugn Date: Thu, 11 Mar 2021 08:55:36 +0200 Subject: [PATCH 1/2] fix bug in day-of-week cron expression --- quartz/cron.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quartz/cron.go b/quartz/cron.go index 0d0cc36..6f0d698 100644 --- a/quartz/cron.go +++ b/quartz/cron.go @@ -404,6 +404,10 @@ func (parser *CronExpressionParser) nextDay(prevWeek int, weekField *CronField, nextWeek, bumpDayOfMonth := parser.findNextValue(prevWeek, weekField.values) parser.setDone(dayOfWeekIndex) var _step int + if len(weekField.values) == 1 && weekField.values[0] < prevWeek { + bumpDayOfMonth = false + } + if bumpDayOfMonth && len(weekField.values) == 1 { _step = 7 } else { From 06bfe99d901d3b96648f96a268ec8a979c00e133 Mon Sep 17 00:00:00 2001 From: reugn Date: Thu, 11 Mar 2021 08:57:43 +0200 Subject: [PATCH 2/2] add day-of-week cron expression tests --- quartz/cron_test.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/quartz/cron_test.go b/quartz/cron_test.go index 1258e39..d787117 100644 --- a/quartz/cron_test.go +++ b/quartz/cron_test.go @@ -1,6 +1,8 @@ package quartz_test import ( + "fmt" + "strconv" "testing" "time" @@ -88,6 +90,41 @@ func TestCronExpression7(t *testing.T) { assertEqual(t, result, "Tue Jul 16 16:09:00 2019") } +func TestCronDaysOfWeek(t *testing.T) { + daysOfWeek := []string{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"} + expected := []string{ + "Sun Apr 21 00:00:00 2019", + "Mon Apr 22 00:00:00 2019", + "Tue Apr 23 00:00:00 2019", + "Wed Apr 24 00:00:00 2019", + "Thu Apr 18 00:00:00 2019", + "Fri Apr 19 00:00:00 2019", + "Sat Apr 20 00:00:00 2019", + } + + for i := 0; i < len(daysOfWeek); i++ { + cronDayOfWeek(t, daysOfWeek[i], expected[i]) + cronDayOfWeek(t, strconv.Itoa(i), expected[i]) + } +} + +func cronDayOfWeek(t *testing.T, dayOfWeek, expected string) { + prev := int64(1555524000000000000) // Wed Apr 17 18:00:00 2019 + expression := fmt.Sprintf("0 0 0 * * %s", dayOfWeek) + cronTrigger, err := quartz.NewCronTrigger(expression) + if err != nil { + t.Fatal(err) + } else { + nextFireTime, err := cronTrigger.NextFireTime(prev) + if err != nil { + t.Fatal(err) + } else { + assertEqual(t, time.Unix(nextFireTime/int64(time.Second), 0).UTC().Format(readDateLayout), + expected) + } + } +} + func TestCronYearly(t *testing.T) { prev := int64(1555351200000000000) result := "" @@ -121,7 +158,7 @@ func TestCronWeekly(t *testing.T) { } else { result, _ = iterate(prev, cronTrigger, 100) } - assertEqual(t, result, "Mon Mar 15 00:00:00 2021") + assertEqual(t, result, "Sun Mar 14 00:00:00 2021") } func TestCronDaily(t *testing.T) {