diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 00000000..9299297d --- /dev/null +++ b/domain-model.md @@ -0,0 +1,46 @@ +# Domain Modelling + +## ITodoTask +| Methods/Properties | Scenario | Outputs | +|-----------------------------------------------|-------------------------------------|--------------------------| +| Id | Stores task ID | int | +| CompletionStatus | stores completion status | TaskCompletionStatusEnum | +| TaskContent | task description | string | +| Priority | stores task priority | TaskPriorityEnum | +| TimeCreated | stores time of task creation | DateTime | +| TimeCompleted | stores time of task completion | DateTime | +| TimeToComplete | shows time it took to complete task | TimeSpan | +| Category | stores task category | TaskCategoryEnum | +| CompleteTask() | changes task completion status | | +| ChangeTaskPriority(TaskPriorityEnum priority) | changes priority of the task | | +| ChangeTaskContent(string newContent) | changes content of the task | | +| ChangeTaskCategory(TaskCategoryEnum category) | changes category of the task | | +| | | | +| | | | + + + + +## ToDoList +| Method | Scenario | Outputs | +|-------------------------------------------------------------|--------------------------------------------------------|------------------------------------------------------------| +| AddTask(Task task) | add new task to list | | +| GetAllTasks() | gets all tasks | return all tasks in IEnumerable | +| GetCompletedTasks() | gets all completed tasks | return all completed tasks in IEnumerable | +| GetIncompleteTasks() | gets all incomplete tasks | return all incomplete tasks in IEnumerable | +| RemoveTaskByName(string name) | remove task by its content | | +| RemoveTaskById(int id) | remove task by its id | | +| GetAlphabeticallySortedTasks(bool ascending) | Get all tasks sorted by content | returns sorted tasks in IEnumerable | +| ChangeTaskPriorityByName(string name) | change tasks priority value by name | | +| ChangeTaskPriorityByid(int id) | change tasks priority value by id | | +| GetAllTasksByPriority() | get all tasks sorted by priority | returns tasks sorted by priority in IEnumerable | +| GetTaskByName(string name) | find a task by its name | return ITodoTask | +| GetTaskById(int id) | find a task by id | return ITodoTask | +| UpdateTaskNameById(int id, string newName) | update tasks description by id | | +| CompleteTaskById(int id) | complete task by id | | +| CompleteTaskByName(string name) | complete task by name | | +| GetTaskLongestToComplete() | get task which took the longest to complete | return ITodoTask | +| GetTaskShortestToComplete() | get task which took the shortest to complete | return ITodoTask | +| GetTasksWhichTookLongerToCompleteThan(int seconds) | get task which took longer to complete than given time | IEnumerable | +| AssignCategoryToTaskById(int id, TaskCategoryEnum category) | assign category to task by id | | +| GetTasksByCategory(TaskCategoryEnum category) | get tasks from given category | IEnumerable | diff --git a/tdd-todo-list.CSharp.Main/ITodoTask.cs b/tdd-todo-list.CSharp.Main/ITodoTask.cs new file mode 100644 index 00000000..385abfed --- /dev/null +++ b/tdd-todo-list.CSharp.Main/ITodoTask.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public interface ITodoTask + { + public int Id { get; } + public bool IsCompleted { get; } + public string TaskContent { get; } + public TaskPriorityEnum Priority { get; } + public DateTime TimeCreated { get; } + public DateTime TimeCompleted { get; } + public TimeSpan TimeToComplete { get; } + public TaskCategoryEnum Category { get; } + + public void CompleteTask(); + public void ChangeTaskPriority(TaskPriorityEnum priority); + public void ChangeTaskContent(string content); + public void ChangeTaskCategory(TaskCategoryEnum category); + + + } +} diff --git a/tdd-todo-list.CSharp.Main/MockTodoTask.cs b/tdd-todo-list.CSharp.Main/MockTodoTask.cs new file mode 100644 index 00000000..8b5c7346 --- /dev/null +++ b/tdd-todo-list.CSharp.Main/MockTodoTask.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public class MockTodoTask : ITodoTask + { + private int _id; + private string _taskContent = ""; + private bool _isCompleted = false; + private TaskPriorityEnum _priority = TaskPriorityEnum.Medium; + private DateTime _timeCompleted; + private TimeSpan _timeToComplete; + private TaskCategoryEnum _category; + + private DateTime _timeCreated; + + public MockTodoTask(int id, string taskContent, bool isCompleted, TaskPriorityEnum priority, + DateTime timeCompleted, TimeSpan timeToComplete, TaskCategoryEnum category, + DateTime timeCreated) + { + _id = id; + _taskContent = taskContent; + _isCompleted = isCompleted; + _priority = priority; + _timeCompleted = timeCompleted; + _timeToComplete = timeToComplete; + _category = category; + _timeCreated = timeCreated; + + } + + public int Id { get { return _id; } } + + public bool IsCompleted { get { return _isCompleted; } } + + public string TaskContent { get { return _taskContent; } } + + public TaskPriorityEnum Priority { get { return _priority; } } + + public DateTime TimeCreated { get { return _timeCreated; } } + + public DateTime TimeCompleted { get { return _timeCompleted; } } + + public TimeSpan TimeToComplete { get { return _timeToComplete; } } + + public TaskCategoryEnum Category { get { return _category; } } + + public void ChangeTaskCategory(TaskCategoryEnum category) + { + _category = category; + } + + public void ChangeTaskContent(string content) + { + _taskContent = content; + } + + public void ChangeTaskPriority(TaskPriorityEnum priority) + { + _priority = priority; + } + + public void CompleteTask() + { + _isCompleted = true; + } + } +} diff --git a/tdd-todo-list.CSharp.Main/TaskCategoryEnum.cs b/tdd-todo-list.CSharp.Main/TaskCategoryEnum.cs new file mode 100644 index 00000000..ec78dd81 --- /dev/null +++ b/tdd-todo-list.CSharp.Main/TaskCategoryEnum.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public enum TaskCategoryEnum + { + None, + Study, + Work, + Admin + } +} + + diff --git a/tdd-todo-list.CSharp.Main/TaskNotFoundException.cs b/tdd-todo-list.CSharp.Main/TaskNotFoundException.cs new file mode 100644 index 00000000..f40d6453 --- /dev/null +++ b/tdd-todo-list.CSharp.Main/TaskNotFoundException.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public class TaskNotFoundException : Exception + { + } +} diff --git a/tdd-todo-list.CSharp.Main/TaskPriorityEnum.cs b/tdd-todo-list.CSharp.Main/TaskPriorityEnum.cs new file mode 100644 index 00000000..54916f4c --- /dev/null +++ b/tdd-todo-list.CSharp.Main/TaskPriorityEnum.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public enum TaskPriorityEnum + { + Low, + Medium, + High + } +} diff --git a/tdd-todo-list.CSharp.Main/ToDoList.cs b/tdd-todo-list.CSharp.Main/ToDoList.cs index 835cb600..715c1af2 100644 --- a/tdd-todo-list.CSharp.Main/ToDoList.cs +++ b/tdd-todo-list.CSharp.Main/ToDoList.cs @@ -3,10 +3,131 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; namespace tdd_todo_list.CSharp.Main { public class TodoList { + public readonly List tasks = new(); + + public void AddTask(ITodoTask task) + { + tasks.Add(task); + } + + public IEnumerable GetAllTasks() + { + return tasks; + } + + public IEnumerable GetCompletedTasks() + { + return tasks.Where(t => t.IsCompleted == true).ToList(); + } + + public IEnumerable GetIncompleteTasks() + { + return tasks.Where(t => t.IsCompleted == false).ToList(); + } + + public void RemoveTaskByName(string taskContent) + { + var taskToRemove = tasks.Where(t => t.TaskContent == taskContent).FirstOrDefault(); + tasks.Remove(taskToRemove); + } + + public void RemoveTaskById(int id) + { + var taskToRemove = tasks.Where(t => t.Id == id).FirstOrDefault(); + tasks.Remove(taskToRemove); + } + + public IEnumerable GetAlphabeticallySortedTasks(bool ascending) + { + if (ascending) + return tasks.OrderBy(task => task.TaskContent).ToList(); + + return tasks.OrderByDescending(task => task.TaskContent).ToList(); + } + + public void ChangeTaskPriorityByName(string name, TaskPriorityEnum priority) + { + tasks.Where(t => t.TaskContent == name).FirstOrDefault().ChangeTaskPriority(priority); + } + + public void ChangeTaskPriorityById(int id, TaskPriorityEnum priority) + { + tasks.Where(t => t.Id == id).FirstOrDefault().ChangeTaskPriority(priority); + } + + public IEnumerable GetAllTasksByPriority() + { + return tasks.OrderByDescending(t => t.Priority).ToArray(); + } + + public ITodoTask GetTaskByName(string name) + { + var task = tasks.Where(t => t.TaskContent == name).FirstOrDefault(); + + if (task != null) + return task; + + else + throw new TaskNotFoundException(); + } + + public ITodoTask GetTaskById(int id) + { + return tasks.Where(t => t.Id == id).FirstOrDefault(); + } + + public void UpdateTaskNameById(int id, string newName) + { + var task = GetTaskById(id); + task.ChangeTaskContent(newName); + } + + public void CompleteTaskById(int id) + { + var task = GetTaskById(id); + task.CompleteTask(); + } + + public void CompleteTaskByName(string name) + { + var task = GetTaskByName(name); + task.CompleteTask(); + } + + public ITodoTask GetTaskLongestToComplete() + { + var task = tasks.OrderByDescending(t => t.TimeToComplete).FirstOrDefault(); + return task; + } + + public ITodoTask GetTaskShortestToComplete() + { + var task = tasks.Where(t => t.IsCompleted == true).OrderBy(t => t.TimeToComplete).FirstOrDefault(); + return task; + } + + public IEnumerable GetTasksWhichTookLongerToCompleteThan(int seconds) + { + TimeSpan timeSpan = TimeSpan.FromSeconds(seconds); + return tasks.Where(task => task.TimeToComplete > timeSpan).OrderByDescending(t => t.TimeToComplete).ToList(); + } + + public void AssignCategoryToTaskById(int id, TaskCategoryEnum category) + { + var task = GetTaskById(id); + task.ChangeTaskCategory(category); + } + + public IEnumerable GetTasksByCategory(TaskCategoryEnum category) + { + return tasks.Where(task => task.Category == category).ToList(); + } + } } diff --git a/tdd-todo-list.CSharp.Main/TodoTask.cs b/tdd-todo-list.CSharp.Main/TodoTask.cs new file mode 100644 index 00000000..f59db31d --- /dev/null +++ b/tdd-todo-list.CSharp.Main/TodoTask.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public class TodoTask : ITodoTask + { + private string _taskContent = ""; + private bool _isCompleted = false; + private TaskPriorityEnum _priority = TaskPriorityEnum.Medium; + private DateTime _timeCompleted; + private TimeSpan _timeToComplete; + private TaskCategoryEnum _category; + + public int Id { get; } + public bool IsCompleted { get { return _isCompleted; } } + + public string TaskContent { get { return _taskContent; } } + public TaskPriorityEnum Priority { get { return _priority; } } + + public DateTime TimeCreated { get; } + public DateTime TimeCompleted { get { return _timeCompleted; } } + public TimeSpan TimeToComplete { get { return _timeToComplete; } } + + public TaskCategoryEnum Category { get { return _category; } } + + public TodoTask(int id, string taskContent) + { + Id = id; + _taskContent = taskContent; + TimeCreated = DateTime.Now; + } + public void ChangeTaskContent(string taskContent) + { + _taskContent = taskContent; + } + + public void CompleteTask() + { + _timeCompleted= DateTime.Now; + _timeToComplete = (TimeCompleted - TimeCreated); + _isCompleted = true; + } + + public void ChangeTaskPriority(TaskPriorityEnum priority) + { + _priority = priority; + } + + public void ChangeTaskCategory(TaskCategoryEnum category) + { + _category = category; + } + + + } + +} diff --git a/tdd-todo-list.CSharp.Test/CoreTests.cs b/tdd-todo-list.CSharp.Test/CoreTests.cs index 084cce19..dddd816e 100644 --- a/tdd-todo-list.CSharp.Test/CoreTests.cs +++ b/tdd-todo-list.CSharp.Test/CoreTests.cs @@ -8,10 +8,238 @@ public class CoreTests { [Test] - public void FirstTest() + public void Add1TaskTest() { - TodoList core = new TodoList(); - Assert.Pass(); + TodoList todoList = new TodoList(); + + var task1 = new TodoTask(0, "do the dishes"); + todoList.AddTask(task1); + + + int expectedTasksNumber = 1; + + Assert.That(todoList.tasks.Count, Is.EqualTo(expectedTasksNumber)); + } + + [Test] + public void Add2TasksTest() + { + TodoList todoList = new TodoList(); + + var task1 = new TodoTask(0, "do the dishes"); + todoList.AddTask(task1); + + var task2 = new TodoTask(1, "do the dishes 2"); + todoList.AddTask(task2); + + int expectedTasksNumber = 2; + + Assert.That(todoList.tasks.Count, Is.EqualTo(expectedTasksNumber)); + } + + [Test] + public void ChangeTaskStatusTest() + { + TodoList todoList = new TodoList(); + + string taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + + todoList.CompleteTaskByName(taskContent); + bool expectedCompleteness = true; + + Assert.That(todoList.tasks.First().IsCompleted, Is.EqualTo(expectedCompleteness)); + } + + [Test] + public void GetAllTasksTest() + { + TodoList todoList = new TodoList(); + + var task1 = new TodoTask(0, "do the dishes"); + todoList.AddTask(task1); + + var task2 = new TodoTask(1, "do the dishes2"); + todoList.AddTask(task2); + + var task3 = new TodoTask(2, "do the dishes3"); + todoList.AddTask(task3); + + int expectedTasksNumber = 3; + + var allTasks = todoList.GetAllTasks(); + + Assert.That(allTasks.Count, Is.EqualTo(expectedTasksNumber)); + } + + [Test] + public void GetCompleteTasksTest() + { + TodoList todoList = new TodoList(); + + string taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var task2 = new TodoTask(1, "do the dishes2"); + todoList.AddTask(task2); + + int expectedTasksNumber = 1; + + todoList.CompleteTaskByName(taskContent); + + var completedTasks = todoList.GetCompletedTasks(); + + Assert.That(completedTasks.Count, Is.EqualTo(expectedTasksNumber)); + Assert.That(completedTasks.FirstOrDefault().TaskContent, Is.EqualTo(taskContent)); + } + + [Test] + public void GetIncompleteTasksTest() + { + TodoList todoList = new TodoList(); + + string taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var task2 = new TodoTask(1, "do the dishes2"); + todoList.AddTask(task2); + + var task3 = new TodoTask(2, "do the dishes3"); + todoList.AddTask(task3); + + int expectedTasksNumber = 2; + + todoList.CompleteTaskByName(taskContent); + + var incompletedTasks = todoList.GetIncompleteTasks(); + + Assert.That(incompletedTasks.Count, Is.EqualTo(expectedTasksNumber)); + } + + [Test] + public void GetTaskNotFoundExceptionTest() + { + TodoList todoList = new TodoList(); + + var task1 = new TodoTask(0, "do the dishes"); + todoList.AddTask(task1); + + Assert.Throws( () => todoList.GetTaskByName("name") ); + } + + [Test] + public void RemoveTaskTest() + { + TodoList todoList = new TodoList(); + + string taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + int expectedTasksNumber = 0; + + todoList.RemoveTaskByName(taskContent); + + var allTasks = todoList.GetAllTasks(); + + Assert.That(allTasks.Count, Is.EqualTo(expectedTasksNumber)); + } + + [Test] + public void GetAlphabethicallySortedTasksTest() + { + TodoList todoList = new TodoList(); + string taskContent = "f"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + string taskContent2 = "a"; + var task2 = new TodoTask(1, taskContent2); + todoList.AddTask(task2); + + var task3 = new TodoTask(2, "c"); + todoList.AddTask(task3); + + bool ascending = true; + var sortedTasks = todoList.GetAlphabeticallySortedTasks(ascending); + + int expectedTasksNumber = 3; + + Assert.That(sortedTasks.Count, Is.EqualTo(expectedTasksNumber)); + + Assert.That(sortedTasks.FirstOrDefault().TaskContent, Is.EqualTo(taskContent2)); + } + + [Test] + public void GetAlphabethicallyReverseSortedTasksTest() + { + TodoList todoList = new TodoList(); + var taskContent = "ddd"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var taskContent2 = "fff"; + var task2 = new TodoTask(1, taskContent2); + todoList.AddTask(task2); + + var task3 = new TodoTask(2, "ccc"); + todoList.AddTask(task3); + + bool ascending = false; + var sortedTasks = todoList.GetAlphabeticallySortedTasks(ascending); + + int expectedTasksNumber = 3; + + Assert.That(sortedTasks.Count, Is.EqualTo(expectedTasksNumber)); + Assert.That(sortedTasks.FirstOrDefault().TaskContent, Is.EqualTo(taskContent2)); + } + + [Test] + public void ChangeTaskPriorityTest() + { + TodoList todoList = new TodoList(); + + var taskContent = "ddd"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + todoList.ChangeTaskPriorityByName(taskContent, TaskPriorityEnum.High); + + TaskPriorityEnum expectedTaskPriority = TaskPriorityEnum.High; + + var task = todoList.GetTaskByName(taskContent); + + Assert.That(task.Priority, Is.EqualTo(expectedTaskPriority)); + } + + [Test] + public void GetHighPriorityTasksTest() + { + TodoList todoList = new TodoList(); + var taskContent = "aaa"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var taskContent2 = "bbb"; + var task2 = new TodoTask(1, taskContent2); + todoList.AddTask(task2); + + var taskContent3 = "ccc"; + var task3 = new TodoTask(2, taskContent3); + todoList.AddTask(task3); + + int totalTasks = 3; + + todoList.ChangeTaskPriorityByName(taskContent, TaskPriorityEnum.Low); + todoList.ChangeTaskPriorityByName(taskContent3, TaskPriorityEnum.High); + + var prioritySortedTasks = todoList.GetAllTasksByPriority(); + Assert.That(prioritySortedTasks.Count, Is.EqualTo(totalTasks)); + Assert.That(prioritySortedTasks.FirstOrDefault().TaskContent, Is.EqualTo(taskContent3)); } } } \ No newline at end of file diff --git a/tdd-todo-list.CSharp.Test/ExtensionTests.cs b/tdd-todo-list.CSharp.Test/ExtensionTests.cs index bdc82ad7..d49f2c55 100644 --- a/tdd-todo-list.CSharp.Test/ExtensionTests.cs +++ b/tdd-todo-list.CSharp.Test/ExtensionTests.cs @@ -1,18 +1,285 @@ -using tdd_todo_list.CSharp.Main; +using NUnit.Framework; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using tdd_todo_list.CSharp.Main; namespace tdd_todo_list.CSharp.Test { public class ExtensionTests { - private TodoListExtension _extension; - public ExtensionTests() + [Test] + public void GetTaskByIdTest() { - _extension = new TodoListExtension(); + TodoList todoList = new TodoList(); + var taskContent = "aaa"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var taskContent2 = "bbb"; + var task2 = new TodoTask(1, taskContent2); + todoList.AddTask(task2); + + var taskContent3 = "ccc"; + var task3 = new TodoTask(2, taskContent3); + todoList.AddTask(task3); + + int idOfFirstTask = 0; + + var task = todoList.GetTaskById(idOfFirstTask); + + Assert.That(task.TaskContent, Is.EqualTo(taskContent)); + } + + [Test] + public void UpdateTaskContentByIdTest() + { + TodoList todoList = new TodoList(); + var taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + int idOfFirstTask = 0; + string updatedTaskContent = "do not do the dishes"; + + todoList.UpdateTaskNameById(idOfFirstTask, updatedTaskContent); + + var task = todoList.GetTaskById(idOfFirstTask); + + Assert.That(task.TaskContent, Is.EqualTo(updatedTaskContent)); + } + + [Test] + public void UpdateTaskStatusByIdTest() + { + TodoList todoList = new TodoList(); + + var taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + int idOfFirstTask = 0; + + todoList.CompleteTaskById(idOfFirstTask); + + var task = todoList.GetTaskById(idOfFirstTask); + + bool expectedCompletionStatus = true; + + Assert.That(task.IsCompleted, Is.EqualTo(expectedCompletionStatus)); + } + + [Test] + public void TaskCreationTimeTest() + { + TodoList todoList = new TodoList(); + + var taskContent = "do the dishes"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + int idOfFirstTask = 0; + + var task = todoList.GetTaskById(idOfFirstTask); + + Assert.That(task.TimeCreated, Is.Not.EqualTo(DateTime.MinValue)); + } + + [Test] + public void TaskCompletionTimeTest() + { + TodoList todoList = new TodoList(); + + var taskContent = "aaa"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + int idOfFirstTask = 0; + + todoList.CompleteTaskById(idOfFirstTask); + + var task = todoList.GetTaskById(idOfFirstTask); + + Assert.That(task.TimeCompleted, Is.Not.EqualTo(DateTime.MinValue)); + } + + [Test] + public void GetTaskWithMaximalCompletionTimeTest() + { + TodoList todoList = new TodoList(); + + var taskContent = "aaa"; + var task1 = new TodoTask(0, taskContent); + todoList.AddTask(task1); + + var taskContent2 = "bbb"; + var task2 = new TodoTask(1, taskContent2); + todoList.AddTask(task2); + + int idOfFirstTask = 0; + int idOfSecondTask = 1; + + todoList.CompleteTaskById(idOfSecondTask); + todoList.CompleteTaskById(idOfFirstTask); + + var task = todoList.GetTaskLongestToComplete(); + + Assert.That(task.Id, Is.EqualTo(idOfFirstTask)); + } + + [Test] + public void GetTaskWithMinimumCompletionTimeTest() + { + TodoList todoList = new TodoList(); + + int idOfFirstTask = 0; + int idOfSecondTask = 1; + int idOfThirdTask = 2; + + var task1 = new MockTodoTask( + id: idOfFirstTask, + taskContent: "ccc", + isCompleted: true, + priority: TaskPriorityEnum.Medium, + timeCompleted: DateTime.Parse("Jan 5, 2009"), + timeCreated: DateTime.Parse("Jan 1, 2009"), + timeToComplete: TimeSpan.MaxValue, + category: TaskCategoryEnum.Study + ); + todoList.AddTask(task1); + + var task2 = new MockTodoTask( + id: idOfSecondTask, + taskContent: "ccc", + isCompleted: true, + priority: TaskPriorityEnum.Medium, + timeCompleted: DateTime.Parse("Jan 5, 2009"), + timeCreated: DateTime.Parse("Jan 1, 2009"), + timeToComplete: TimeSpan.FromSeconds(1), + category: TaskCategoryEnum.Study + ); + todoList.AddTask(task2); + + var task3 = new MockTodoTask( + id: idOfThirdTask, + taskContent: "ccc", + isCompleted: true, + priority: TaskPriorityEnum.Medium, + timeCompleted: DateTime.Parse("Jan 5, 2009"), + timeCreated: DateTime.Parse("Jan 1, 2009"), + timeToComplete: TimeSpan.MaxValue, + category: TaskCategoryEnum.Study + ); + todoList.AddTask(task3); + + var task4 = new MockTodoTask( + id: idOfThirdTask, + taskContent: "ccc", + isCompleted: false, + priority: TaskPriorityEnum.Medium, + timeCompleted: DateTime.Parse("Jan 5, 2009"), + timeCreated: DateTime.Parse("Jan 1, 2009"), + timeToComplete: TimeSpan.MinValue, + category: TaskCategoryEnum.Study + ); + todoList.AddTask(task4); + + var task = todoList.GetTaskShortestToComplete(); + + Assert.That(task.Id, Is.EqualTo(idOfSecondTask)); + } + + [Test] + public void GetTaskWithGivenCompletionTimeTest() + { + TodoList todoList = new TodoList(); + + int idOfFirstTask = 0; + int idOfSecondTask = 1; + int idOfThirdTask = 2; + + var taskContent = "aaa"; + var task1 = new TodoTask(idOfFirstTask, taskContent); + todoList.AddTask(task1); + + var taskContent2 = "bbb"; + var task2 = new TodoTask(idOfSecondTask, taskContent2); + todoList.AddTask(task2); + + var task3 = new MockTodoTask( + id: idOfThirdTask, + taskContent: "ccc", + isCompleted: true, + priority: TaskPriorityEnum.Medium, + timeCompleted: DateTime.Parse("Jan 5, 2009"), + timeCreated: DateTime.Parse("Jan 1, 2009"), + timeToComplete: TimeSpan.MaxValue, + category: TaskCategoryEnum.Study + ); + todoList.AddTask(task3); + + todoList.CompleteTaskById(idOfSecondTask); + todoList.CompleteTaskById(idOfFirstTask); + + int thresholdSeconds = 10; + int expectedTasksNumber = 1; + var tasks = todoList.GetTasksWhichTookLongerToCompleteThan(thresholdSeconds); + + Assert.That(tasks.Count, Is.EqualTo(expectedTasksNumber)); + Assert.That(tasks.FirstOrDefault().Id, Is.EqualTo(idOfThirdTask)); + } + + [Test] + public void AssignCategoryToTaskTest() + { + TodoList todoList = new TodoList(); + + int idOfFirstTask = 0; + + var taskContent = "aaa"; + var task1 = new TodoTask(idOfFirstTask, taskContent); + todoList.AddTask(task1); + + todoList.AssignCategoryToTaskById(idOfFirstTask, TaskCategoryEnum.Admin); + + var task = todoList.GetTaskById(idOfFirstTask); + + Assert.That(task.Category, Is.EqualTo(TaskCategoryEnum.Admin)); + } + + [Test] + public void GetTasksByCategoryTest() + { + TodoList todoList = new TodoList(); + + int idOfFirstTask = 0; + int idOfSecondTask = 1; + int idOfThirdTask = 2; + int idOfFourthTask = 3; + + var task1 = new TodoTask(idOfFirstTask, "aaa"); + todoList.AddTask(task1); + + var task2 = new TodoTask(idOfSecondTask, "bbb"); + todoList.AddTask(task2); + + var task3 = new TodoTask(idOfThirdTask, "ccc"); + todoList.AddTask(task3); + + var task4 = new TodoTask(idOfFourthTask, "ddd"); + todoList.AddTask(task4); + + todoList.AssignCategoryToTaskById(idOfSecondTask, TaskCategoryEnum.Admin); + todoList.AssignCategoryToTaskById(idOfThirdTask, TaskCategoryEnum.Admin); + + var tasks = todoList.GetTasksByCategory(TaskCategoryEnum.Admin); + + int expectedTasks = 2; + + Assert.That(tasks.Count(), Is.EqualTo(expectedTasks)); + Assert.That(tasks.FirstOrDefault().Category, Is.EqualTo(TaskCategoryEnum.Admin)); } } }