From 5f95210255ef0158acc4f1d6f187ee7332660130 Mon Sep 17 00:00:00 2001 From: Jerry Wang Date: Sat, 28 Oct 2023 15:43:42 -0500 Subject: [PATCH] fix: set multi-weekdays bug about issue-590 (#592) Co-authored-by: jerry.wang Co-authored-by: John Roesler --- job.go | 3 +++ scheduler.go | 4 ++-- scheduler_test.go | 11 ++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/job.go b/job.go index c877ba1..13f0197 100644 --- a/job.go +++ b/job.go @@ -482,6 +482,9 @@ func (j *Job) Weekdays() []time.Weekday { if len(j.scheduledWeekdays) == 0 { return []time.Weekday{time.Sunday} } + sort.Slice(j.scheduledWeekdays, func(i, k int) bool { + return j.scheduledWeekdays[i] < j.scheduledWeekdays[k] + }) return j.scheduledWeekdays } diff --git a/scheduler.go b/scheduler.go index 479abaa..baafaa9 100644 --- a/scheduler.go +++ b/scheduler.go @@ -393,8 +393,8 @@ func (s *Scheduler) calculateWeeks(job *Job, lastRun time.Time) nextRun { func (s *Scheduler) calculateTotalDaysDifference(lastRun time.Time, daysToWeekday int, job *Job) int { if job.getInterval() > 1 { - // just count weeks after the first jobs were done - if job.RunCount() < len(job.Weekdays()) { + weekDays := job.Weekdays() + if job.lastRun.Weekday() != weekDays[len(weekDays)-1] { return daysToWeekday } if daysToWeekday > 0 { diff --git a/scheduler_test.go b/scheduler_test.go index dd074f0..c5425fa 100644 --- a/scheduler_test.go +++ b/scheduler_test.go @@ -2322,9 +2322,9 @@ func TestScheduler_CheckEveryWeekHigherThanOne(t *testing.T) { daysToTest []int caseTest int }{ - {description: "every two weeks after run the first scheduled task", interval: 2, weekDays: []time.Weekday{time.Thursday}, daysToTest: []int{1, 2}, caseTest: 1}, - {description: "every three weeks after run the first scheduled task", interval: 3, weekDays: []time.Weekday{time.Thursday}, daysToTest: []int{1, 2}, caseTest: 2}, - {description: "every two weeks after run the first 2 scheduled tasks", interval: 2, weekDays: []time.Weekday{time.Thursday, time.Friday}, daysToTest: []int{1, 2, 3}, caseTest: 3}, + {description: "every two weeks after run the first scheduled task", interval: 2, weekDays: []time.Weekday{time.Thursday}, daysToTest: []int{1, 2, 15, 16}, caseTest: 1}, + {description: "every three weeks after run the first scheduled task", interval: 3, weekDays: []time.Weekday{time.Thursday}, daysToTest: []int{1, 2, 15, 16}, caseTest: 2}, + {description: "every two weeks after run the first 2 scheduled tasks", interval: 2, weekDays: []time.Weekday{time.Friday, time.Thursday}, daysToTest: []int{1, 2, 3, 15, 16, 17}, caseTest: 3}, } const ( @@ -2347,13 +2347,14 @@ func TestScheduler_CheckEveryWeekHigherThanOne(t *testing.T) { } job, err := s.Do(func() {}) require.NoError(t, err) - for numJob, day := range tc.daysToTest { + for _, day := range tc.daysToTest { lastRun := januaryDay2020At(day) job.lastRun = lastRun got := s.durationToNextRun(lastRun, job).duration - if numJob < len(tc.weekDays) { + jobWeekdays := job.Weekdays() + if lastRun.Weekday() < jobWeekdays[len(jobWeekdays)-1] { assert.Equal(t, wantTimeUntilNextRunOneDay, got) } else { if tc.caseTest == 1 {