diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 00000000..9bb613f2 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,24 @@ +# Domain Model + +|Classes|Method/Properties|Scenario|Outputs| +|-------|-----------------|--------|-------| +|`TodoList`|`AddTask(string name)`|Add task with name to todo list| int ID of new task| +|`TodoList`|`TodoList.Tasks`|Provide all tasks in todo list | Dictionary | +|`TodoList`|`ToggleComplete(string name)` | Toggle status of give task from complete to incomplete or incomplete to complete| bool | +|`TodoList`|`GetCompleteTasks()`| Provide all complete tasks in todo list | List| +|`TodoList`|`GetIncompleteTasks()`| Provide all incomplete tasks in todo list | List| +|`TodoList`|`GetTaskByName(string name)`| Search for Task with given name | Task, provide message if not found | +|`TodoList`|`RemoveTask(string name)` | Remove task with given name from TodoList | bool | +|`TodoList`|`GetAllTasksSortedByName(bool useAscendingOrder)` | Return sorted version of tasks by name, either ascending or descending alphabetical order, to user | Sorted List| +|`TodoList`|`GiveTaskPriority(string name, int priority)` | Add priority (1, 2, 3) to a given task | bool | +|`TodoList`|`SortTasksByPriority()` | Return sorted version of tasks sorted by priority | Sorted List | +|`TodoList`|`GetTaskByID(int id)` | Provide task with given id | Task | +|`TodoList`|`UpdateTaskName(int id, string newName)` | Update the name of a task with given id | bool | +|`TodoList`|`UpdateTaskStatus(int id)` | Toggle the status of task with given ID | bool | +|`TodoList`|`GetAllTaskTimeCreated()` | Provide all tasks along with time of creation | (List, datetime) | +|`TodoList`|`GetAllTaskTimeCompleted()` | Provide all tasks along with time of completion | (List, datetime) | +|`TodoList`|`GetTaskWithLongestCompletionTime()` | Provide the task with the longest completion time | `Task` | +|`TodoList`|`GetTaskWithShortestCompletionTime()` | Provide the task with the shortest completion time | `Task` | +|`TodoList`|`GetTasksByCompletionTime(int numDaysToComplete)` | Provide all tasks with completion time longer than given time | List | +|`TodoList`| `SetTaskCategory(string name, string category)` | Set category of task | bool | +|`TodoList`|`GetTasksByCategory(string category)` | Get all tasks matching the given category | List | \ No newline at end of file diff --git a/tdd-todo-list.CSharp.Main/Task.cs b/tdd-todo-list.CSharp.Main/Task.cs new file mode 100644 index 00000000..bcb70031 --- /dev/null +++ b/tdd-todo-list.CSharp.Main/Task.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace tdd_todo_list.CSharp.Main +{ + public class Task + { + private string _name; + private int _id; + private bool _isCompleted = false; + private int _priority = 3; + private string _category = String.Empty; + private DateTime _timeCreated; + private DateTime _timeCompleted; + private int? _completionTime = null; + + public Task(int count, string name) + { + _id = count; + _name = name; + _timeCreated = DateTime.Today; + } + + public void CalculateCompletionTime() + { + if (IsCompleted) { + _completionTime = (int)(_timeCompleted - _timeCreated).TotalDays; + } + } + + public string Name { get { return _name; } set { _name = value; } } + public int ID { get { return _id; } } + public bool IsCompleted { get { return _isCompleted; } set { _isCompleted = value; } } + public int Priority { get { return _priority; } set { _priority = value; } } + public DateTime TimeCreated { get { return _timeCreated; } set { _timeCreated = value;} } + public DateTime TimeCompleted { get { return _timeCompleted; } set { _timeCompleted = value; } } + public int? CompletionTime { get { return _completionTime; } } + public string Category { get { return _category; } set { _category = value; } } + } +} diff --git a/tdd-todo-list.CSharp.Main/ToDoList.cs b/tdd-todo-list.CSharp.Main/ToDoList.cs index 835cb600..c3f782c1 100644 --- a/tdd-todo-list.CSharp.Main/ToDoList.cs +++ b/tdd-todo-list.CSharp.Main/ToDoList.cs @@ -8,5 +8,259 @@ namespace tdd_todo_list.CSharp.Main { public class TodoList { + private Dictionary _tasks = new Dictionary(); + private int _taskCount = 0; + + public Dictionary Tasks { get { return _tasks; } } + public int TaskCount { get { return _taskCount; } } + + public void AddTask(string name) + { + Task newTask = new Task(_taskCount, name); + _tasks.Add(_taskCount, newTask); + _taskCount++; + } + + public bool ToggleComplete(string taskName) + { + Task? task = GetTaskByName(taskName); + if (task != null) { + task.IsCompleted = !task.IsCompleted; + task.TimeCompleted = DateTime.Today; + return true; + } + return false; + } + + public List GetCompleteTasks() + { + List completeTasks = new List(); + foreach (Task task in _tasks.Values) { + if (task.IsCompleted) + { + completeTasks.Add(task); + } + } + return completeTasks; + } + + public List GetIncompleteTasks() + { + List incompleteTasks = new List(); + foreach (Task task in _tasks.Values) + { + if (!task.IsCompleted) + { + incompleteTasks.Add(task); + } + } + return incompleteTasks; + } + + public Task? GetTaskByName(string taskName) + { + Task? resultTask = null; + foreach (KeyValuePair task in _tasks) + { + if (task.Value.Name == taskName) + { + resultTask = task.Value; + break; + } + } + + if (resultTask == null) + { + Console.WriteLine($"Task {taskName} not found"); + } + + return resultTask; + } + + public bool RemoveTask(string taskName) + { + Task? task = GetTaskByName(taskName); + + if (task == null) + { + return false; + } + + return _tasks.Remove(task.ID); + + } + + public List GetAllTasksSortedByName(bool useAscendingOrder) + { + if (useAscendingOrder) + { + return _tasks.Values.OrderBy(task => task.Name).ToList(); + } + return _tasks.Values.OrderByDescending(task => task.Name).ToList(); + + } + + public bool GiveTaskPriority(string taskName, int priority) + { + Task? task = GetTaskByName(taskName); + if (task == null) + { + return false; + } + task.Priority = priority; + return true; + } + + public List SortTasksByPriority() + { + return _tasks.Values.OrderBy(task => task.Priority).ToList(); + } + + public Task? GetTaskByID(int taskID) + { + if (_tasks.ContainsKey(taskID)) + { + return _tasks[taskID]; + } + return null; + } + + public bool UpdateTaskName(int taskID, string newName) + { + if (_tasks.ContainsKey(taskID)) + { + _tasks[taskID].Name = newName; + return true; + } + return false; + } + + public bool UpdateTaskStatus(int taskID) + { + if (_tasks.ContainsKey(taskID)) + { + _tasks[taskID].IsCompleted = !_tasks[taskID].IsCompleted; + return true; + } + return false; + } + + public List<(Task, DateTime)> GetAllTaskTimeCreated() + { + List<(Task, DateTime)> timeCreatedList = new List<(Task, DateTime)> (); + foreach (Task task in _tasks.Values) + { + timeCreatedList.Add((task, task.TimeCreated)); + } + return timeCreatedList; + } + + public List<(Task, DateTime)> GetAllTaskTimeCompleted() + { + List<(Task, DateTime)> timeCompletedList = new List<(Task, DateTime)> (); + foreach (Task task in _tasks.Values) + { + if (task.IsCompleted) + { + timeCompletedList.Add((task, task.TimeCompleted)); + } + } + return timeCompletedList; + } + + public Task GetTaskWithLongestCompletionTime() + { + int longestCompletionTime = 0; + Task? longestCompletionTask = null; + List<(Task, DateTime)> completedTaskList = GetAllTaskTimeCompleted(); + foreach ((Task, DateTime) listItem in completedTaskList) + { + Task task = listItem.Item1; + if (task.CompletionTime == null) + { + task.CalculateCompletionTime(); + } + if (task.CompletionTime > longestCompletionTime) + { + longestCompletionTime = (int)task.CompletionTime; + longestCompletionTask = task; + } + + } + return longestCompletionTask!; + + } + + public Task GetTaskWithShortestCompletionTime() + { + // Assuming no completion times will exceed 100 days + int shortestCompletionTime = 100; + Task? shortestCompletionTask = null; + List<(Task, DateTime)> completedTaskList = GetAllTaskTimeCompleted(); + foreach ((Task, DateTime) listItem in completedTaskList) + { + Task task = listItem.Item1; + if (task.CompletionTime == null) + { + task.CalculateCompletionTime(); + } + if (task.CompletionTime < shortestCompletionTime) + { + shortestCompletionTime = (int)task.CompletionTime; + shortestCompletionTask = task; + } + + } + return shortestCompletionTask!; + } + + public List GetTasksByCompletionTime(int daysLimit) + { + List tasks = new List(); + List<(Task, DateTime)> completedTaskList = GetAllTaskTimeCompleted(); + foreach ((Task, DateTime) listItem in completedTaskList) + { + Task task = listItem.Item1; + if (task.CompletionTime == null) + { + task.CalculateCompletionTime(); + } + if (task.CompletionTime > daysLimit) + { + tasks.Add(task); + } + } + return tasks; + + } + + public bool SetTaskCategory(string taskName, string category) + { + Task task = GetTaskByName(taskName); + + if (task == null) { + return false; + } + + task.Category = category; + return true; + + } + + public List GetTasksByCategory(string category) + { + List tasks = new List(); + foreach (Task task in _tasks.Values) + { + if (task.Category == String.Empty) + { + continue; + } + if (task.Category == category) { + tasks.Add(task); + } + } + return tasks; + } } } diff --git a/tdd-todo-list.CSharp.Test/CoreTests.cs b/tdd-todo-list.CSharp.Test/CoreTests.cs index 084cce19..19da992a 100644 --- a/tdd-todo-list.CSharp.Test/CoreTests.cs +++ b/tdd-todo-list.CSharp.Test/CoreTests.cs @@ -1,5 +1,8 @@ -using tdd_todo_list.CSharp.Main; -using NUnit.Framework; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using System.Security.Cryptography.X509Certificates; +using tdd_todo_list.CSharp.Main; +using Task = tdd_todo_list.CSharp.Main.Task; namespace tdd_todo_list.CSharp.Test { @@ -8,10 +11,203 @@ public class CoreTests { [Test] - public void FirstTest() + public void AddTaskTest() { - TodoList core = new TodoList(); - Assert.Pass(); + TodoList todoList = new TodoList(); + string taskName = "Homework"; + + todoList.AddTask(taskName); + + Assert.That(todoList.Tasks[0].Name, Is.EqualTo(taskName)); + Assert.That(todoList.Tasks[0].ID, Is.EqualTo(0)); + Assert.That(todoList.TaskCount, Is.EqualTo(1)); } + + [Test] + public void GetAllTasksTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + Assert.That(todoList.Tasks.Count, Is.EqualTo(2)); + } + + [Test] + public void ToggleCompleteTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + bool success = todoList.ToggleComplete("Homework"); + bool fail = todoList.ToggleComplete("Run"); + + Assert.That(todoList.Tasks[0].IsCompleted, Is.True); + Assert.That(todoList.Tasks[1].IsCompleted, Is.False); + Assert.True(success); + Assert.False(fail); + } + + [Test] + public void GetCompleteTasksTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + string taskName4 = "Run"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + todoList.AddTask(taskName4); + + todoList.ToggleComplete("Homework"); + todoList.ToggleComplete("Run"); + + List completeTaskList = todoList.GetCompleteTasks(); + + Assert.That(completeTaskList.All(task => task.IsCompleted), Is.True); + Assert.That(completeTaskList.Count == 2); + } + + [Test] + public void GetIncompleteTasksTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + string taskName4 = "Run"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + todoList.AddTask(taskName4); + + todoList.ToggleComplete("Homework"); + todoList.ToggleComplete("Run"); + + List incompleteTaskList = todoList.GetIncompleteTasks(); + + Assert.That(incompleteTaskList.All(task => task.IsCompleted), Is.False); + Assert.That(incompleteTaskList.Count == 2); + } + + [Test] + public void GetTaskByNameTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + + string nonExistingTaskName = "Run"; + + Task? existingTask = todoList.GetTaskByName(taskName1); + Task? nonExistingTask = todoList.GetTaskByName(nonExistingTaskName); + + Assert.That(existingTask.Name, Is.EqualTo(taskName1)); + Assert.That(nonExistingTask, Is.Null); + } + + [Test] + public void RemoveTaskName() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + string nonExistingTaskName = "Run"; + + bool wasRemoved1 = todoList.RemoveTask(taskName1); + bool wasRemoved2 = todoList.RemoveTask(nonExistingTaskName); + + Assert.That(wasRemoved1, Is.True); + Assert.That(wasRemoved2, Is.False); + + } + + [Test] + public void GetAllTasksSortedByNameTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + + bool useAscendingOrder = true; + + List sortedTaskAscending = todoList.GetAllTasksSortedByName(useAscendingOrder); + List sortedTaskDescending = todoList.GetAllTasksSortedByName(!useAscendingOrder); + + Assert.That(sortedTaskAscending[0].Name == "Dishes"); + Assert.That(sortedTaskAscending[1].Name == "Homework"); + Assert.That(sortedTaskAscending[2].Name == "Laundry"); + + Assert.That(sortedTaskDescending[0].Name == "Laundry"); + Assert.That(sortedTaskDescending[1].Name == "Homework"); + Assert.That(sortedTaskDescending[2].Name == "Dishes"); + } + + [Test] + public void GiveTaskPriorityTest() + { + // Note: Priority from highest to lowest 1, 2, 3 + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + + todoList.GiveTaskPriority(taskName1, 2); + todoList.GiveTaskPriority(taskName2, 3); + todoList.GiveTaskPriority(taskName3, 1); + + bool result = todoList.GiveTaskPriority("Run", 1); + + Assert.That(todoList.Tasks[0].Priority == 2); + Assert.That(todoList.Tasks[1].Priority == 3); + Assert.That(todoList.Tasks[2].Priority == 1); + Assert.That(result, Is.False); + } + + [Test] + public void SortTasksByPriorityTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + + todoList.GiveTaskPriority(taskName1, 2); + todoList.GiveTaskPriority(taskName2, 3); + todoList.GiveTaskPriority(taskName3, 1); + + List sortedTasks = todoList.SortTasksByPriority(); + + Assert.That(sortedTasks[0].Name, Is.EqualTo("Dishes")); + Assert.That(sortedTasks[1].Name, Is.EqualTo("Homework")); + Assert.That(sortedTasks[2].Name, Is.EqualTo("Laundry")); + } + + } } \ 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..80f58d6c 100644 --- a/tdd-todo-list.CSharp.Test/ExtensionTests.cs +++ b/tdd-todo-list.CSharp.Test/ExtensionTests.cs @@ -1,18 +1,267 @@ -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; +using Task = tdd_todo_list.CSharp.Main.Task; 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(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + + todoList.RemoveTask("Laundry"); + + int task1ID = 0; + int task2ID = 1; + int task3ID = 2; + + Task? task1 = todoList.GetTaskByID(task1ID); + Task? task3 = todoList.GetTaskByID(task3ID); + + Task? task2 = todoList.GetTaskByID(task2ID); + + Assert.That(task1.ID, Is.EqualTo(0)); + Assert.That(task3.ID, Is.EqualTo(2)); + Assert.That(task2, Is.Null); + + } + + [Test] + public void UpdateTaskNameTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + todoList.AddTask(taskName1); + + string newName = "Dishes"; + int task1ID = 0; + int notExistID = 1; + + bool success = todoList.UpdateTaskName(task1ID, newName); + bool fail = todoList.UpdateTaskName(notExistID, newName); + + Assert.That(todoList.Tasks[0].Name, Is.EqualTo(newName)); + Assert.True(success); + Assert.False(fail); + } + + [Test] + public void UpdateTaskStatusTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + int task1ID = 0; + int task2ID = 1; + int notExistID = 2; + + bool success = todoList.UpdateTaskStatus(task1ID); + bool fail = todoList.UpdateTaskStatus(notExistID); + + Assert.True(todoList.Tasks[task1ID].IsCompleted); + Assert.False(todoList.Tasks[task2ID].IsCompleted); + Assert.True(success); + Assert.False(fail); + } + + [Test] + public void GetAllTaskTimeCreatedTest() + { + // Simplifying to date, ignoring time of day + DateTime today = DateTime.Today; + + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + List < (Task, DateTime) > timeCreatedList = todoList.GetAllTaskTimeCreated(); + + Assert.That(todoList.Tasks[0].TimeCreated, Is.EqualTo(today)); + Assert.That(timeCreatedList[0].Item2, Is.EqualTo(today)); + Assert.That(timeCreatedList[1].Item2, Is.EqualTo(today)); + + } + + [Test] + public void GetAllTaskTimeCompletedTest() + { + DateTime createdTime = new DateTime(2025, 08, 05); + DateTime completeTime = new DateTime(2025, 08, 06); + + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.ToggleComplete("Homework"); + todoList.AddTask(taskName2); + todoList.ToggleComplete("Laundry"); + // Not completed task + todoList.AddTask("Laundry2"); + + Assert.That(todoList.Tasks[0].TimeCompleted, Is.Not.Null); + + // Override time created and completed + todoList.Tasks[0].TimeCreated = createdTime; + todoList.Tasks[1].TimeCreated = createdTime; + todoList.Tasks[0].TimeCompleted = completeTime; + todoList.Tasks[1].TimeCompleted = completeTime; + + List<(Task, DateTime)> timeCompletedList = todoList.GetAllTaskTimeCompleted(); + + Assert.That(timeCompletedList[0].Item2, Is.EqualTo(completeTime)); + Assert.That(timeCompletedList[1].Item2, Is.EqualTo(completeTime)); + Assert.That(timeCompletedList.Count, Is.EqualTo(2)); + + } + + [Test] + public void GetTaskWithLongestCompletionTimeTest() + { + DateTime createdTime = new DateTime(2025, 08, 05); + DateTime completeTime1 = new DateTime(2025, 08, 06); + DateTime completeTime2 = new DateTime(2025, 08, 10); + + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.ToggleComplete("Homework"); + todoList.AddTask(taskName2); + todoList.ToggleComplete("Laundry"); + + // Override time created and completed + todoList.Tasks[0].TimeCreated = createdTime; + todoList.Tasks[1].TimeCreated = createdTime; + todoList.Tasks[0].TimeCompleted = completeTime1; + todoList.Tasks[1].TimeCompleted = completeTime2; + + Task longestCompletionTimeTask = todoList.GetTaskWithLongestCompletionTime(); + + Assert.That(longestCompletionTimeTask.Name, Is.EqualTo(taskName2)); + } + + [Test] + public void GetTaskWithShortestCompletionTimeTest() + { + DateTime createdTime = new DateTime(2025, 08, 05); + DateTime completeTime1 = new DateTime(2025, 08, 06); + DateTime completeTime2 = new DateTime(2025, 08, 10); + + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.ToggleComplete("Homework"); + todoList.AddTask(taskName2); + todoList.ToggleComplete("Laundry"); + + // Override time created and completed + todoList.Tasks[0].TimeCreated = createdTime; + todoList.Tasks[1].TimeCreated = createdTime; + todoList.Tasks[0].TimeCompleted = completeTime1; + todoList.Tasks[1].TimeCompleted = completeTime2; + + Task shortestCompletionTimeTask = todoList.GetTaskWithShortestCompletionTime(); + + Assert.That(shortestCompletionTimeTask.Name, Is.EqualTo(taskName1)); + } + + [Test] + public void GetTasksByCompletionTimeTest() + { + DateTime createdTime = new DateTime(2025, 08, 05); + DateTime completeTime1 = new DateTime(2025, 08, 06); + DateTime completeTime2 = new DateTime(2025, 08, 11); + DateTime completeTime3 = new DateTime(2025, 08, 12); + + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + todoList.ToggleComplete(taskName1); + todoList.ToggleComplete(taskName2); + todoList.ToggleComplete(taskName3); + // Override time created and completed + todoList.Tasks[0].TimeCreated = createdTime; + todoList.Tasks[1].TimeCreated = createdTime; + todoList.Tasks[2].TimeCreated = createdTime; + todoList.Tasks[0].TimeCompleted = completeTime1; + todoList.Tasks[1].TimeCompleted = completeTime2; + todoList.Tasks[2].TimeCompleted = completeTime3; + + int daysLimit = 5; + + List tasks = todoList.GetTasksByCompletionTime(daysLimit); + + Assert.True(tasks.All(task => task.CompletionTime > daysLimit)); + } + + [Test] + public void SetTaskCategoryTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + + string category = "School"; + + bool success = todoList.SetTaskCategory(taskName1, category); + bool fail = todoList.SetTaskCategory("Dishes", category); + + Assert.True(success); + Assert.False(fail); + Assert.That(todoList.Tasks[0].Category, Is.EqualTo(category)); + Assert.That(todoList.Tasks[1].Category, Is.Empty); + + } + + [Test] + public void GetTasksByCategoryTest() + { + TodoList todoList = new TodoList(); + string taskName1 = "Homework"; + string taskName2 = "Laundry"; + string taskName3 = "Dishes"; + todoList.AddTask(taskName1); + todoList.AddTask(taskName2); + todoList.AddTask(taskName3); + string category1 = "School"; + string category2 = "Home"; + todoList.SetTaskCategory(taskName1, category1); + todoList.SetTaskCategory(taskName2, category2); + todoList.SetTaskCategory(taskName3, category2); + + List cat1Tasks = todoList.GetTasksByCategory(category1); + List cat2Tasks = todoList.GetTasksByCategory(category2); + + Assert.That(cat1Tasks.Count, Is.EqualTo(1)); + Assert.That(cat1Tasks[0].Name, Is.EqualTo(taskName1)); + Assert.That(cat2Tasks.Count, Is.EqualTo(2)); + Assert.That(cat2Tasks[0].Name, Is.EqualTo(taskName2)); + Assert.That(cat2Tasks[1].Name, Is.EqualTo(taskName3)); } } } diff --git a/tdd-todo-list.sln b/tdd-todo-list.sln index 66d24763..2a5e0bbd 100644 --- a/tdd-todo-list.sln +++ b/tdd-todo-list.sln @@ -10,6 +10,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{663B0373-6031-46F8-ADD5-9AF01A5E82D5}" ProjectSection(SolutionItems) = preProject .github\workflows\core-criteria.yml = .github\workflows\core-criteria.yml + domain-model.md = domain-model.md .github\workflows\extension-criteria.yml = .github\workflows\extension-criteria.yml README.md = README.md EndProjectSection