import Foundation import Testing @testable import Todos @Suite("TaskGroupListView view model tests") struct TaskGroupListViewModelTests { // MARK: Properties private let calendar: Calendar = .current // MARK: Computed tests @Test("groups returns cases in predetermined order") func groups() { // GIVEN let viewModel = TaskGroupListView.ViewModel() // WHEN let groups = viewModel.groups // THEN #expect(groups.count == 4) #expect(groups[0] == .today) #expect(groups[1] == .upcoming) #expect(groups[2] == .overdue) #expect(groups[3] == .completed) } // MARK: Functions tests @Test( "count returns zero when empty data", arguments: TodoGroup.allCases ) func countWhenEmptyData(for group: TodoGroup) throws { // GIVEN let viewModel = TaskGroupListView.ViewModel() // WHEN let count = viewModel.count(emptyTasks, for: group) // THEN #expect(count == 0) } @Test( "count returns correct count when filled data", arguments: TodoGroup.allCases ) func countWhenFilledData(for group: TodoGroup) throws { // GIVEN let viewModel = TaskGroupListView.ViewModel() // WHEN let count = viewModel.count(sampleTasks, for: group) // THEN #expect(count == 2) } } // MARK: - Helpers private extension TaskGroupListViewModelTests { // MARK: Computed var emptyTasks: [Todo] { [] } var sampleTasks: [Todo] { let today: Date = .now let tomorrow = calendar.date(byAdding: .day, value: 1, to: today) ?? today let yesterday = calendar.date(byAdding: .day, value: -1, to: today) ?? today let nextWeek = calendar.date(byAdding: .day, value: 7, to: today) ?? today let lastWeek = calendar.date(byAdding: .day, value: -7, to: today) ?? today return [ Todo(title: "Today task #1", due: today), Todo(title: "Today task #2", due: today), Todo(title: "Tomorrow task #1", due: tomorrow), Todo(title: "Next week task #1", due: nextWeek), Todo(title: "Yesterday task #1", due: yesterday), Todo(title: "Last week task #1", due: lastWeek), Todo(title: "Completed task #1", due: tomorrow, completed: today), Todo(title: "Completed task #2", due: yesterday, completed: today), ] } }