From 5931868b6299d33c3b2ea7576d5bb1c98b7317ab Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Wed, 3 Mar 2021 11:54:36 +0100 Subject: [PATCH] fix overflow bug with adding months --- internal/task/date.go | 10 +++++++++- internal/task/recur.go | 3 +-- internal/task/recur_test.go | 8 ++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/internal/task/date.go b/internal/task/date.go index 7498d6d..6fa6cf2 100644 --- a/internal/task/date.go +++ b/internal/task/date.go @@ -53,7 +53,7 @@ type Date struct { func NewDate(year, month, day int) Date { - if year == 0 && month == 0 && day == 0 { + if year == 0 || month == 0 || month > 12 || day == 0 { return Date{} } @@ -209,6 +209,14 @@ func (d Date) Add(days int) Date { return NewDate(year, int(month), day+days) } +func (d Date) AddMonths(addMonths int) Date { + year, month, day := d.t.Date() + addYears := int((int(month) + addMonths) / 12) + newMonth := (int(month) + addMonths) % 12 + + return NewDate(year+addYears, newMonth, day) +} + func (d Date) Equal(ud Date) bool { return d.t.Equal(ud.Time()) } diff --git a/internal/task/recur.go b/internal/task/recur.go index 6bbbe5c..c5a2447 100644 --- a/internal/task/recur.go +++ b/internal/task/recur.go @@ -268,8 +268,7 @@ func (enm EveryNMonths) RecursOn(date Date) bool { if tDate.After(date) { return false } - tYear, tMonth, tDay := tDate.Time().Date() - tDate = NewDate(tYear, int(tMonth)+enm.N, tDay) + tDate = tDate.AddMonths(enm.N) } } diff --git a/internal/task/recur_test.go b/internal/task/recur_test.go index 18bf2b2..6addf2e 100644 --- a/internal/task/recur_test.go +++ b/internal/task/recur_test.go @@ -359,4 +359,12 @@ func TestEveryNMonths(t *testing.T) { }) } }) + + t.Run("recurs every year", func(t *testing.T) { + recur := task.EveryNMonths{ + Start: task.NewDate(2021, 3, 1), + N: 12, + } + test.Equals(t, false, recur.RecursOn(task.NewDate(2021, 3, 9))) + }) }