diff --git a/internal/task/date.go b/internal/task/date.go index 53d4629..7498d6d 100644 --- a/internal/task/date.go +++ b/internal/task/date.go @@ -131,14 +131,13 @@ func NewDateFromString(date string) Date { case "this sprint": fallthrough case "deze sprint": - aSprintStart := NewDate(2021, 1, 29) - daysToAdd := findDaysToWeekday(Today.Weekday(), time.Thursday) - diff := aSprintStart.DaysBetween(Today.AddDays(daysToAdd)) - if diff%14 != 0 { - daysToAdd += 7 + tDate := NewDate(2021, 1, 28) // a sprint end + for { + if tDate.After(Today) { + return tDate + } + tDate = tDate.AddDays(14) } - - return Today.AddDays(daysToAdd) } t, err := time.Parse("2006-01-02", fmt.Sprintf("%.10s", date)) diff --git a/internal/task/date_test.go b/internal/task/date_test.go index 22fd89f..76c86e6 100644 --- a/internal/task/date_test.go +++ b/internal/task/date_test.go @@ -75,111 +75,180 @@ func TestWeekdaysUnique(t *testing.T) { } func TestNewDateFromString(t *testing.T) { - task.Today = task.NewDate(2021, 1, 30) - for _, tc := range []struct { - name string - input string - exp task.Date - }{ - { - name: "empty", - exp: task.Date{}, - }, - { - name: "no date", - input: "no date", - exp: task.Date{}, - }, - { - name: "normal", - input: "2021-01-30 (saturday)", - exp: task.NewDate(2021, 1, 30), - }, - { - name: "short", - input: "2021-01-30", - exp: task.NewDate(2021, 1, 30), - }, - { - name: "english dayname lowercase", - input: "monday", - exp: task.NewDate(2021, 2, 1), - }, - { - name: "english dayname capitalized", - input: "Monday", - exp: task.NewDate(2021, 2, 1), - }, - { - name: "dutch dayname lowercase", - input: "maandag", - exp: task.NewDate(2021, 2, 1), - }, - { - name: "today english", - input: "today", - exp: task.NewDate(2021, 1, 30), - }, - { - name: "today dutch", - input: "vandaag", - exp: task.NewDate(2021, 1, 30), - }, - { - name: "tomorrow english", - input: "tomorrow", - exp: task.NewDate(2021, 1, 31), - }, - { - name: "tomorrow dutch", - input: "morgen", - exp: task.NewDate(2021, 1, 31), - }, - { - name: "day after tomorrow english", - input: "day after tomorrow", - exp: task.NewDate(2021, 2, 1), - }, - { - name: "day after tomorrow dutch", - input: "overmorgen", - exp: task.NewDate(2021, 2, 1), - }, - { - name: "this week english", - input: "this week", - exp: task.NewDate(2021, 2, 5), - }, - { - name: "this week dutch", - input: "deze week", - exp: task.NewDate(2021, 2, 5), - }, - { - name: "next week english", - input: "next week", - exp: task.NewDate(2021, 2, 12), - }, - { - name: "next week dutch", - input: "volgende week", - exp: task.NewDate(2021, 2, 12), - }, - { - name: "this sprint english", - input: "this sprint", - exp: task.NewDate(2021, 2, 11), - }, - { - name: "this sprint dutch", - input: "deze sprint", - exp: task.NewDate(2021, 2, 11), - }, - } { - t.Run(tc.name, func(t *testing.T) { - test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) - }) - } + + t.Run("no date", func(t *testing.T) { + task.Today = task.NewDate(2021, 1, 30) + for _, tc := range []struct { + name string + input string + exp task.Date + }{ + { + name: "empty", + exp: task.Date{}, + }, + { + name: "no date", + input: "no date", + exp: task.Date{}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) + }) + } + }) + + t.Run("digits", func(t *testing.T) { + task.Today = task.NewDate(2021, 1, 30) + for _, tc := range []struct { + name string + input string + exp task.Date + }{ + { + name: "normal", + input: "2021-01-30 (saturday)", + exp: task.NewDate(2021, 1, 30), + }, + { + name: "short", + input: "2021-01-30", + exp: task.NewDate(2021, 1, 30), + }, + } { + t.Run(tc.name, func(t *testing.T) { + test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) + + }) + } + }) + + t.Run("day name", func(t *testing.T) { + task.Today = task.NewDate(2021, 1, 30) + for _, tc := range []struct { + name string + input string + exp task.Date + }{ + { + name: "english dayname lowercase", + input: "monday", + exp: task.NewDate(2021, 2, 1), + }, + { + name: "english dayname capitalized", + input: "Monday", + exp: task.NewDate(2021, 2, 1), + }, + { + name: "dutch dayname lowercase", + input: "maandag", + exp: task.NewDate(2021, 2, 1), + }, + } { + t.Run(tc.name, func(t *testing.T) { + test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) + }) + } + }) + + t.Run("relative days", func(t *testing.T) { + task.Today = task.NewDate(2021, 1, 30) + for _, tc := range []struct { + name string + input string + exp task.Date + }{ + { + name: "today english", + input: "today", + exp: task.NewDate(2021, 1, 30), + }, + { + name: "today dutch", + input: "vandaag", + exp: task.NewDate(2021, 1, 30), + }, + { + name: "tomorrow english", + input: "tomorrow", + exp: task.NewDate(2021, 1, 31), + }, + { + name: "tomorrow dutch", + input: "morgen", + exp: task.NewDate(2021, 1, 31), + }, + { + name: "day after tomorrow english", + input: "day after tomorrow", + exp: task.NewDate(2021, 2, 1), + }, + { + name: "day after tomorrow dutch", + input: "overmorgen", + exp: task.NewDate(2021, 2, 1), + }, + { + name: "this week english", + input: "this week", + exp: task.NewDate(2021, 2, 5), + }, + { + name: "this week dutch", + input: "deze week", + exp: task.NewDate(2021, 2, 5), + }, + { + name: "next week english", + input: "next week", + exp: task.NewDate(2021, 2, 12), + }, + { + name: "next week dutch", + input: "volgende week", + exp: task.NewDate(2021, 2, 12), + }, + } { + t.Run(tc.name, func(t *testing.T) { + test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) + }) + } + }) + + t.Run("sprint", func(t *testing.T) { + for _, tc := range []struct { + name string + today task.Date + input string + exp task.Date + }{ + { + name: "this sprint english", + today: task.NewDate(2021, 1, 30), + input: "this sprint", + exp: task.NewDate(2021, 2, 11), + }, + { + name: "this sprint dutch", + today: task.NewDate(2021, 1, 30), + input: "deze sprint", + exp: task.NewDate(2021, 2, 11), + }, + { + name: "jump week", + today: task.NewDate(2021, 2, 5), + input: "this sprint", + exp: task.NewDate(2021, 2, 11), + }, + } { + t.Run(tc.name, func(t *testing.T) { + task.Today = tc.today + test.Equals(t, tc.exp, task.NewDateFromString(tc.input)) + }) + } + }) } func TestDateString(t *testing.T) {