diff --git a/src/main/java/com/booleanuk/core/TodoList.java b/src/main/java/com/booleanuk/core/TodoList.java index 675adaf0b..37d596325 100644 --- a/src/main/java/com/booleanuk/core/TodoList.java +++ b/src/main/java/com/booleanuk/core/TodoList.java @@ -1,5 +1,88 @@ package com.booleanuk.core; +import javax.swing.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public class TodoList { + List todoList; + + public TodoList(){ + this.todoList = new ArrayList<>(); + } + + public static class Task { + String task; + String status; + + public Task(String task, String status){ + this.task = task; + this.status = status; + } + } + + public boolean addTask(String task){ + if (task.isEmpty() || !task.matches("[a-zA-Z]+")) + return false; + else { + todoList.add(new Task(task, "incomplete")); + return true; + } + } + + public List seeTodoList(){ + return (todoList.isEmpty()) ? null : todoList; + } + + public Task setStatus(String task, String status){ + + List targets = todoList.stream().filter(it -> it.task.equals(task)).toList(); + Task updatedTask = new Task(task, status); + if (targets.isEmpty()) + return null; + else { + this.todoList.set(todoList.indexOf(targets.getFirst()), updatedTask); + return updatedTask; + } + } + + public List getCompleteTasks() { + List completedTasks = todoList.stream().filter(it -> it.status.equals("complete")).toList(); + return completedTasks.isEmpty() ? null : completedTasks; + } + + public List getIncompleteTasks() { + List completedTasks = todoList.stream().filter(it -> it.status.equals("incomplete")).toList(); + return completedTasks.isEmpty() ? null : completedTasks; + } + + public Task searchForTask(String task) { + List targets = todoList.stream().filter(it -> it.task.equals(task)).toList(); + return (targets.isEmpty()) ? null : targets.getFirst(); + } + + public boolean removeTask(String task) { + List targets = todoList.stream().filter(it -> it.task.equals(task)).toList(); + if (targets.isEmpty()) + return false; + else { + todoList.remove(targets.getFirst()); + return true; + } + } + + public List seeTasksInAscendingAndAlphabeticalOrder() { + List res = new ArrayList<>(todoList); + res.sort(Comparator.comparing(s -> s.task)); + return res.isEmpty() ? null : res; + } + + public List seeTasksInDescendingAndAlphabeticalOrder() { + List res = new ArrayList<>(todoList); + res.sort((s1, s2) -> s2.task.compareTo(s1.task)); + return res.isEmpty() ? null : res; + } + } diff --git a/src/main/java/com/booleanuk/core/domain-models.md b/src/main/java/com/booleanuk/core/domain-models.md new file mode 100644 index 000000000..d3d36019c --- /dev/null +++ b/src/main/java/com/booleanuk/core/domain-models.md @@ -0,0 +1,84 @@ + + + + + + + +1. Add tasks to my todo list. + +| Classes | Methods | Scenario | Outputs | +|------------|--------------------------------|----------------------------|---------| +| `TodoList` | `boolean addTask(String task)` | If task is null or invalid | false | +| | | If task is provided | true | + + +2. See all the tasks in my todo list. + + +| Classes | Methods | Scenario | Outputs | +|------------|----------------------------|----------------------|------------| +| `TodoList` | `List seeTodoList()` | If list is empty | null | +| | | If list is not empty | List | + + +3. Change the status of a task between incomplete and complete. + +| Classes | Methods | Scenario | Outputs | +|------------|----------------------------------------------|------------------------------|---------| +| `TodoList` | `Task setStatus(String task, String status)` | If status or task is invalid | null | +| | | If status and task is valid | Task | + + +4. Get only the complete tasks. + + +| Classes | Methods | Scenario | Outputs | +|------------|---------------------------------|------------------------------|------------| +| `TodoList` | `List getCompleteTasks()` | If no tasks are complete | null | +| | | If there are completed tasks | List | + + +5. Get only the incomplete tasks. + + +| Classes | Methods | Scenario | Outputs | +|------------|-----------------------------------|-------------------------------|------------| +| `TodoList` | `List getIncompleteTasks()` | If no tasks are incomplete | null | +| | | If there are incomplete tasks | List | + + +6. Search for a task and receive a message that says it wasn't found if it doesn't exist. + + +| Classes | Methods | Scenario | Outputs | +|------------|-----------------------------------|-----------------------|-------------------------------------------| +| `TodoList` | `Task searchForTask(String task)` | If task doesn't exist | print "not found" message and return null | +| | | If task exists | return task | + + +7. Remove tasks from my list. + + +| Classes | Methods | Scenario | Outputs | +|------------|-----------------------------------|-----------------------|------------------------| +| `TodoList` | `boolean removeTask(String task)` | If task doesn't exist | false | +| | | If task does exist | remove and return true | + + +8. See all the tasks in my list ordered alphabetically in ascending order. + + +| Classes | Methods | Scenario | Outputs | +|------------|-------------------------------------------------------|---------------------------|------------| +| `TodoList` | `List seeTasksInAscendingAndAlpabeticalOrder()` | If list of tasks is empty | null | +| | | If list is not empty | List | + + +9. See all the tasks in my list ordered alphabetically in descending order. + + +| Classes | Methods | Scenario | Outputs | +|------------|---------------------------------------------------------|---------------------------|------------| +| `TodoList` | `List seeTasksInDescendingAndAlphabeticalOrder()` | If list of tasks is empty | null | +| | | If list is not empty | List | \ No newline at end of file diff --git a/src/main/java/com/booleanuk/extension/TodoListExtension.java b/src/main/java/com/booleanuk/extension/TodoListExtension.java new file mode 100644 index 000000000..0c70ee11b --- /dev/null +++ b/src/main/java/com/booleanuk/extension/TodoListExtension.java @@ -0,0 +1,64 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +public class TodoListExtension { + List todoList; + + public TodoListExtension() { + this.todoList = new ArrayList<>(); + } + + public static class TaskExt { + String task; + String status; + int id; + LocalDateTime timeCreated; + + public TaskExt(String task, int id) { + this.task = task; + this.status = "incomplete"; + this.id = id; + this.timeCreated = LocalDateTime.now(); + } + } + + public void addTaskExt(String task, int id){ + todoList.add(new TaskExt(task, id)); + } + + public TaskExt getTaskByUniqueId(int id){ + List res = todoList.stream().filter(it -> it.id == id).toList(); + return res.isEmpty() ? null : res.getFirst(); + } + + public TaskExt updateNameBasedOnId(int id, String task){ + List targets = todoList.stream().filter(it -> it.id == id).toList(); + TaskExt updatedTask = new TaskExt(task, id); + if (targets.isEmpty()) + return null; + else { + this.todoList.set(todoList.indexOf(targets.getFirst()), updatedTask); + return updatedTask; + } + } + + public TaskExt updateStatusBasedOnId(int id, String newStatus) { + List targets = todoList.stream().filter(it -> it.id == id).toList(); + TaskExt updatedTask = new TaskExt(targets.getFirst().task, id); + updatedTask.status = newStatus; + if (targets.isEmpty()) + return null; + else { + this.todoList.set(todoList.indexOf(targets.getFirst()), updatedTask); + return updatedTask; + } + } + + public LocalDateTime whenTaskCreated(int id) { + List targets = todoList.stream().filter(it -> it.id == id).toList(); + return targets.isEmpty() ? null : targets.getFirst().timeCreated; + } +} diff --git a/src/test/java/com/booleanuk/core/TodoListTest.java b/src/test/java/com/booleanuk/core/TodoListTest.java index 0bef779a4..ae2a233f4 100644 --- a/src/test/java/com/booleanuk/core/TodoListTest.java +++ b/src/test/java/com/booleanuk/core/TodoListTest.java @@ -4,10 +4,200 @@ import org.junit.jupiter.api.Test; class TodoListTest { + + @Test + public void testAddTasksValidInput() { + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "clean"; + + boolean res1 = todoList.addTask(task1); + boolean res2 = todoList.addTask(task2); + + Assertions.assertTrue(res1); + Assertions.assertTrue(res2); + } + + @Test + public void testAddTasksInvalidInput() { + TodoList todoList = new TodoList(); + + String task1 = "/clean!"; + String task2 = ""; + String task3 = "1111"; + + boolean res1 = todoList.addTask(task1); + boolean res2 = todoList.addTask(task2); + boolean res3 = todoList.addTask(task3); + + Assertions.assertFalse(res1); + Assertions.assertFalse(res2); + Assertions.assertFalse(res3); + } + + @Test + public void testSeeTodoList() { + TodoList todoList1 = new TodoList(); + TodoList todoList2 = new TodoList(); + + String task1 = "running"; + String task2 = "clean"; + + todoList1.addTask(task1); + todoList1.addTask(task2); + + Assertions.assertNull(todoList2.seeTodoList()); + Assertions.assertEquals(2, todoList1.seeTodoList().size()); + } + + @Test + public void testSetStatus() { + TodoList todoList = new TodoList(); + TodoList todoList2 = new TodoList(); + + String task1 = "running"; + + todoList.addTask(task1); + TodoList.Task task = todoList.setStatus(task1, "complete"); + + Assertions.assertEquals("complete", task.status); + Assertions.assertNull(todoList2.setStatus(task1, "complete")); + } + + @Test + public void testGetCompleteTasks() { + TodoList todoList = new TodoList(); + TodoList todoList2 = new TodoList(); + + String task1 = "running"; + String task2 = "cleaning"; + String task3 = "shopping"; + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + todoList2.addTask(task1); + todoList2.addTask(task2); + todoList2.addTask(task3); + + todoList.setStatus(task1, "complete"); + todoList.setStatus(task2, "complete"); + + Assertions.assertNull(todoList2.getCompleteTasks()); + Assertions.assertEquals(2, todoList.getCompleteTasks().size()); + } + + @Test + public void testGetIncompleteTasks() { + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "cleaning"; + String task3 = "shopping"; + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals(3, todoList.getIncompleteTasks().size()); + + todoList.setStatus(task1, "complete"); + todoList.setStatus(task2, "complete"); + todoList.setStatus(task3, "complete"); + + Assertions.assertNull(todoList.getIncompleteTasks()); + } + + @Test + public void testSearchForTask() { + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "cleaning"; + String task3 = "shopping"; + String task4 = "something"; + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + TodoList.Task res = todoList.searchForTask(task1); + + Assertions.assertEquals("running", res.task); + Assertions.assertEquals("incomplete", res.status); + Assertions.assertNull(todoList.searchForTask(task4)); + } + + @Test + public void testRemoveTask() { + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "shopping"; + + Assertions.assertFalse(todoList.removeTask(task1)); + + todoList.addTask(task1); + todoList.addTask(task2); + + Assertions.assertTrue(todoList.removeTask(task1)); + Assertions.assertTrue(todoList.removeTask(task2)); + Assertions.assertTrue(todoList.todoList.isEmpty()); + } + + @Test + public void testSeeTasksInAscendingAndAlphabeticalOrder() { + + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "cleaning"; + String task3 = "shopping"; + String task4 = "anything"; + + Assertions.assertNull(todoList.seeTasksInAscendingAndAlphabeticalOrder()); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + todoList.addTask(task4); + + // Check if the list is unsorted + Assertions.assertEquals(task1, todoList.todoList.getFirst().task); + + // Then check if the return-value of the method is correctly sorted + Assertions.assertEquals(task4, todoList.seeTasksInAscendingAndAlphabeticalOrder().getFirst().task); + + // Then make sure the original list is unchanged + Assertions.assertEquals(task1, todoList.todoList.getFirst().task); + } + @Test - public void exampleTest() { - String hello = "Hello"; - Assertions.assertEquals("Hello", hello); - Assertions.assertNotEquals("Goodbye", hello); + public void testSeeTasksInDescendingAndAlphabeticalOrder() { + + TodoList todoList = new TodoList(); + + String task1 = "running"; + String task2 = "cleaning"; + String task3 = "shopping"; + String task4 = "anything"; + + Assertions.assertNull(todoList.seeTasksInDescendingAndAlphabeticalOrder()); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + todoList.addTask(task4); + + // Check if the list is unsorted + Assertions.assertEquals(task1, todoList.todoList.getFirst().task); + + // Then check if the return-value of the method is correctly sorted + Assertions.assertEquals(task3, todoList.seeTasksInDescendingAndAlphabeticalOrder().getFirst().task); + + // Then make sure the original list is unchanged + Assertions.assertEquals(task1, todoList.todoList.getFirst().task); } } diff --git a/src/test/java/com/booleanuk/extension/TodoListExtensionTest.java b/src/test/java/com/booleanuk/extension/TodoListExtensionTest.java new file mode 100644 index 000000000..13b6ba000 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TodoListExtensionTest.java @@ -0,0 +1,74 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +public class TodoListExtensionTest { + + @Test + public void testGetTaskByUniqueId() { + + TodoListExtension todoList = new TodoListExtension(); + + TodoListExtension.TaskExt task1 = new TodoListExtension.TaskExt("running", 5); + TodoListExtension.TaskExt task2 = new TodoListExtension.TaskExt("shopping", 3); + + todoList.addTaskExt(task1.task, task1.id); + todoList.addTaskExt(task2.task, task2.id); + + Assertions.assertEquals("running", todoList.getTaskByUniqueId(5).task); + Assertions.assertEquals("shopping", todoList.getTaskByUniqueId(3).task); + } + + @Test + public void testUpdateNameBasedOnId() { + + TodoListExtension todoList = new TodoListExtension(); + + TodoListExtension.TaskExt task1 = new TodoListExtension.TaskExt("running", 5); + TodoListExtension.TaskExt task2 = new TodoListExtension.TaskExt("shopping", 3); + + todoList.addTaskExt(task1.task, task1.id); + todoList.addTaskExt(task2.task, task2.id); + + String newName = "work"; + + Assertions.assertEquals(newName, todoList.updateNameBasedOnId(5, newName).task); + } + + + @Test + public void testUpdateStatusBasedOnId() { + + TodoListExtension todoList = new TodoListExtension(); + + TodoListExtension.TaskExt task1 = new TodoListExtension.TaskExt("running", 5); + TodoListExtension.TaskExt task2 = new TodoListExtension.TaskExt("shopping", 3); + + todoList.addTaskExt(task1.task, task1.id); + todoList.addTaskExt(task2.task, task2.id); + + String newStatus = "complete"; + + Assertions.assertEquals(newStatus, todoList.updateStatusBasedOnId(5, newStatus).status); + } + + + @Test + public void testWhenTaskCreated() { + + TodoListExtension todoList = new TodoListExtension(); + + TodoListExtension.TaskExt task1 = new TodoListExtension.TaskExt("running", 5); + TodoListExtension.TaskExt task2 = new TodoListExtension.TaskExt("shopping", 3); + + int currentDateTime = LocalDateTime.now().getHour(); + todoList.addTaskExt(task1.task, task1.id); + todoList.addTaskExt(task2.task, task2.id); + + Assertions.assertEquals(currentDateTime, todoList.whenTaskCreated(5).getHour()); + } +} +