diff options
| author | Stuart Skelton <stuarts@broadbean.com> | 2017-08-01 13:51:31 +0100 |
|---|---|---|
| committer | Stuart Skelton <stuarts@broadbean.com> | 2017-08-01 14:06:05 +0100 |
| commit | 650d53a6000a483e11da91b3466e1f57a96c3da0 (patch) | |
| tree | 13844aba7b8a1fff87a42c9380be3bee867bf22f /todolist | |
| parent | bd8acfdea25486e71e4f19ff0703ef59d5ba5dfa (diff) | |
Added a filter for completed date
Diffstat (limited to 'todolist')
| -rw-r--r-- | todolist/date_filter.go | 34 | ||||
| -rw-r--r-- | todolist/date_filter_test.go | 56 | ||||
| -rw-r--r-- | todolist/todo_item.go | 7 |
3 files changed, 93 insertions, 4 deletions
diff --git a/todolist/date_filter.go b/todolist/date_filter.go index a43e3c8..b91bee3 100644 --- a/todolist/date_filter.go +++ b/todolist/date_filter.go @@ -18,12 +18,17 @@ func filterOnDue(todo *Todo) string { return todo.Due } +func filterOnCompletedDate(todo *Todo) string { + return todo.CompletedDateToDate() +} + func (f *DateFilter) FilterDate(input string) []*Todo { agendaRegex, _ := regexp.Compile(`agenda.*$`) if agendaRegex.MatchString(input) { return f.filterAgenda(bod(time.Now())) } + // filter due items r, _ := regexp.Compile(`due .*$`) match := r.FindString(input) switch { @@ -54,6 +59,17 @@ func (f *DateFilter) FilterDate(input string) []*Todo { case match == "overdue": return f.filterOverdue(bod(time.Now())) } + + // filter completed items + r, _ = regexp.Compile(`completed .*$`) + match = r.FindString(input) + switch { + case match == "completed tod" || match == "completed today": + return f.filterCompletedToday(bod(time.Now())) + case match == "completed this week": + return f.filterCompletedThisWeek(bod(time.Now())) + } + return f.Todos } @@ -91,6 +107,10 @@ func (f *DateFilter) filterDueTomorrow(pivot time.Time) []*Todo { return f.filterToExactDate(pivot, filterOnDue) } +func (f *DateFilter) filterCompletedToday(pivot time.Time) []*Todo { + return f.filterToExactDate(pivot, filterOnCompletedDate) +} + func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { var ret []*Todo filtered := f.filterThisWeek(pivot) @@ -104,11 +124,11 @@ func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { return ret } -func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time) []*Todo { +func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time, filterOn func(*Todo) string) []*Todo { var ret []*Todo for _, todo := range f.Todos { - dueTime, _ := time.ParseInLocation("2006-01-02", todo.Due, f.Location) + dueTime, _ := time.ParseInLocation("2006-01-02", filterOn(todo), f.Location) if (begin.Before(dueTime) || begin.Equal(dueTime)) && end.After(dueTime) { ret = append(ret, todo) } @@ -121,7 +141,15 @@ func (f *DateFilter) filterThisWeek(pivot time.Time) []*Todo { begin := bod(f.FindSunday(pivot)) end := begin.AddDate(0, 0, 7) - return f.filterBetweenDatesInclusive(begin, end) + return f.filterBetweenDatesInclusive(begin, end, filterOnDue) +} + +func (f *DateFilter) filterCompletedThisWeek(pivot time.Time) []*Todo { + + begin := bod(f.FindSunday(pivot)) + end := begin.AddDate(0, 0, 7) + + return f.filterBetweenDatesInclusive(begin, end, filterOnCompletedDate) } func (f *DateFilter) filterBetweenDatesExclusive(begin, end time.Time) []*Todo { diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go index a89e27f..e2ac570 100644 --- a/todolist/date_filter_test.go +++ b/todolist/date_filter_test.go @@ -39,6 +39,38 @@ func TestFilterTomorrow(t *testing.T) { assert.Equal(2, filtered[0].Id) } +func TestFilterCompletedToday(t *testing.T) { + assert := assert.New(t) + + var todos []*Todo + todoNo1 := &Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} + todoNo2 := &Todo{Id: 2, Subject: "two", Due: time.Now().Format("2006-01-02")} + + todos = append(todos, todoNo1) + todos = append(todos, todoNo2) + + filter := NewDateFilter(todos) + filtered := filter.filterCompletedToday(time.Now()) + + assert.Equal(0, len(filtered)) + + // now to complted one and see see what happens + todoNo1.Complete() + filtered = filter.filterCompletedToday(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(1, filtered[0].Id) + + // now to complted one and see see what happens + todoNo1.Uncomplete() + todoNo2.Complete() + filtered = filter.filterCompletedToday(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(2, filtered[0].Id) + +} + func TestFilterThisWeek(t *testing.T) { assert := assert.New(t) @@ -57,6 +89,30 @@ func TestFilterThisWeek(t *testing.T) { assert.Equal(2, filtered[0].Id) } +func TestFilterCompletedThisWeek(t *testing.T) { + assert := assert.New(t) + + var todos []*Todo + lastWeekTodo := &Todo{Id: 1, Subject: "two", Due: time.Now().AddDate(0, 0, -7).Format("2006-01-02")} + todayTodo := &Todo{Id: 2, Subject: "one", Due: time.Now().Format("2006-01-02")} + nextWeekTodo := &Todo{Id: 3, Subject: "two", Due: time.Now().AddDate(0, 0, 8).Format("2006-01-02")} + todos = append(todos, lastWeekTodo) + todos = append(todos, todayTodo) + todos = append(todos, nextWeekTodo) + + filter := NewDateFilter(todos) + filtered := filter.filterCompletedThisWeek(time.Now()) + + assert.Equal(0, len(filtered)) + + todayTodo.Complete() + filtered = filter.filterCompletedThisWeek(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(2, filtered[0].Id) + +} + func TestFilterOverdue(t *testing.T) { assert := assert.New(t) diff --git a/todolist/todo_item.go b/todolist/todo_item.go index 859e946..eecb409 100644 --- a/todolist/todo_item.go +++ b/todolist/todo_item.go @@ -43,4 +43,9 @@ func (t *Todo) Complete() { func (t *Todo) Uncomplete() { t.Completed = false t.CompletedDate = "" -}
\ No newline at end of file +} + +func (t Todo) CompletedDateToDate() string { + parsedTime, _ := time.Parse(ISO8601_TIMESTAMP_FORMAT, t.CompletedDate) + return parsedTime.Format("2006-01-02") +} |
