diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..7621b35c9 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,87 @@ +# Todo list core + +## Core Requirements + +- I want to add tasks to my todo list. +- I want to see all the tasks in my todo list. +- I want to change the status of a task between incomplete and complete. +- I want to be able to get only the complete tasks. +- I want to be able to get only the incomplete tasks. +- I want to search for a task and receive a message that says it wasn't found if it doesn't exist. +- I want to remove tasks from my list. +- I want to see all the tasks in my list ordered alphabetically in ascending order. +- I want to see all the tasks in my list ordered alphabetically in descending order. + + +## TodoList Class + + + +| Member variable | Data type | +|-----------------|-------------------| +| `task` | `Task` | +| `todoList` | `ArrayList` | +| | | + +#### Task Class +| Member variable | Data type | +|-----------------|-----------| +| `taskName` | `String` | +| `taskStatus` | `String` | + + + + +| Method | Scenario | Output | +|--------------------------|-------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| +| `addTask(String)` | Task is added to todoList
Task is not added to todoList | `Return` true
`Return` false | +| `getTasks()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list
`Return` "Todo list is empty." | +| `getCompletedTasks()` | todoList contains completed tasks
todoList does not contain completed tasks | `Return` tasks with status 'complete'
`Return` "No completed tasks in todo list." | +| `getUncompletedTasks()` | todoList contains uncompleted tasks
todoList does not contain uncompleted tasks | `Return` tasks with status 'incomplete'
`Return` "No uncompleted tasks in todo list." | +| `searchTask(String)` | Task exists in todoList
Task does not exist in todoList | `Return` task
`Return` "Task not found." | +| `setCompleted(String)` | Task exists in todoList
Task does not exist in todoList | `Return` "Task status is now 'Completed'."
`Return` "Task not found." | +| `setUncompleted(String)` | Task exists in todoList
Task does not exist in todoList | `Return` "Task status is now 'Incomplete'."
`Return` "Task not found." | +| `removeTask(String)` | Task exist in todoList
Task does not exist in todoList | `Return` "Task removed from todo list."
`Return` "Task not found." | +| `getTasksAscending()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list in ascending order
`Return` "Todo list is empty." | +| `getTasksDescending()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list in descending order
`Return` "Todo list is empty." | + + +# Todo list extension + +| Member variable | Data type | +|-----------------|-------------------| +| `task` | `Task` | +| `todoList` | `ArrayList` | +| `idCounter` | `int` | + +#### Task Class +| Member variable | Data type | +|-----------------|-----------------| +| `taskId` | `int` | +| `taskName` | `String` | +| `taskStatus` | `String` | +| `dateTime` | `LocalDateTime` | + + + + +| Method | Scenario | Output | +|-----------------------------|-------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------| +| `addTask(String)` | Task is added to todoList
Task is not added to todoList | `Return` true
`Return` false | +| `getTasks()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list
`Return` "Todo list is empty." | +| `getCompletedTasks()` | todoList contains completed tasks
todoList does not contain completed tasks | `Return` tasks with status 'complete'
`Return` "No completed tasks in todo list." | +| `getUncompletedTasks()` | todoList contains uncompleted tasks
todoList does not contain uncompleted tasks | `Return` tasks with status 'incomplete'
`Return` "No uncompleted tasks in todo list." | +| `searchTask(String)` | Task exists in todoList
Task does not exist in todoList | `Return` task
`Return` "Task not found." | +| `setCompleted(String)` | Task exists in todoList
Task does not exist in todoList | `Return` "Task status is now 'Completed'."
`Return` "Task not found." | +| `setUncompleted(String)` | Task exists in todoList
Task does not exist in todoList | `Return` "Task status is now 'Incomplete'."
`Return` "Task not found." | +| `removeTask(String)` | Task exist in todoList
Task does not exist in todoList | `Return` "Task removed from todo list."
`Return` "Task not found." | +| `getTasksAscending()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list in ascending order
`Return` "Todo list is empty." | +| `getTasksDescending()` | todoList is not empty
todoList is empty | `Return` all tasks in todo list in descending order
`Return` "Todo list is empty." | +| `getTaskById(int)` | Task exists in todoList
Task does not exist in todoList
todoList is empty | `Return` task
`Return` "Task not found."
`Return` "Todo list is empty." | +| `editTaskName(int, String)` | Task exists in todoList
Task does not exist in todoList
todoList is empty | `Return` "Task name changed."
`Return` "Task not found."
`Return` "Todo list is empty." | +| `setCompletedById(int)` | Task exists in todoList
Task does not exist in todoList
todoList is empty | `Return` "Task status is now 'Completed'."
`Return` "Task not found."
`Return` "Todo list is empty." | +| `setUncompletedById(int)` | Task exists in todoList
Task does not exist in todoList
todoList is empty | `Return` "Task status is now 'Incomplete'."
`Return` "Task not found."
`Return` "Todo list is empty." | +| `getCreationDateTime(int)` | Task exists in todoList
Task does not exist in todoList
todoList is empty | `Return` "Task was created at 'DateTime'"
`Return` "Task not found."
`Return` "Todo list is empty." | + + + diff --git a/src/main/java/com/booleanuk/core/TodoList.java b/src/main/java/com/booleanuk/core/TodoList.java index 675adaf0b..6e5bdd120 100644 --- a/src/main/java/com/booleanuk/core/TodoList.java +++ b/src/main/java/com/booleanuk/core/TodoList.java @@ -1,5 +1,136 @@ package com.booleanuk.core; +import java.util.*; + public class TodoList { + public static class Task{ + public String taskName; + public String taskStatus; + } + + ArrayList todoList = new ArrayList<>(); + + public Boolean addTask(String taskName){ + Task task = new Task(); + task.taskName=taskName; + task.taskStatus="Incomplete"; + this.todoList.add(task); + return true; + } + + public String getTasks(){ + if (!this.todoList.isEmpty()){ + ArrayList taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } + + public String setCompleted(String taskName){ + Task task = new Task(); + task.taskStatus = "Completed"; + task.taskName = taskName; + + for (int i=0;i completedTasks = new ArrayList<>(); + for (Task task : todoList) { + if (task.taskStatus.equals("Completed")) { + completedTasks.add(task.taskName); + } + } + if (!completedTasks.isEmpty()){ + return completedTasks.toString(); + }else { + return "No completed tasks in todo list."; + } + } + + public String getUncompletedTasks(){ + ArrayList uncompletedTasks = new ArrayList<>(); + for (Task task : todoList) { + if (task.taskStatus.equals("Incomplete")) { + uncompletedTasks.add(task.taskName); + } + } + if (!uncompletedTasks.isEmpty()){ + return uncompletedTasks.toString(); + }else { + return "No uncompleted tasks in todo list."; + } + } + + public String searchTask(String taskName){ + for (Task task : todoList) { + if (taskName.equals(task.taskName)) { + return "Task '" + taskName + "' is " + task.taskStatus; + } + } + return "Task not found."; + } + + public String removeTask(String taskName) { + for (int i = 0; i < todoList.size(); i++) { + if (taskName.equals((todoList.get(i)).taskName)) { + todoList.remove(i); + return "Task removed from todo list."; + } + } + return "Task not found."; + } + + public String getTasksAscending(){ + if (!this.todoList.isEmpty()){ + ArrayList taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + Collections.sort(taskNames); + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } + + public String getTasksDescending(){ + Comparator reverseComparator = Comparator.reverseOrder(); + if (!this.todoList.isEmpty()){ + ArrayList taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + taskNames.sort(reverseComparator); + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } + } 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..d7394b203 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/TodoListExtension.java @@ -0,0 +1,240 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.TodoList; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class TodoListExtension { + + public static class Task{ + public int taskId; + public String taskName; + public String taskStatus; + public LocalDateTime dateTime; + } + + ArrayList todoList = new ArrayList<>(); + int idCounter = 1; + + // Extension methods + + public String getTaskById(int taskId){ + if (!todoList.isEmpty()){ + for (Task task : todoList) { + if (taskId == task.taskId) { + return "'" + task.taskName + "' is " + task.taskStatus; + } + } + return "Task not found."; + } + else { + return "Todo list is empty."; + } + } + + public String editTaskName(int taskId, String newTaskName){ + if (!todoList.isEmpty()){ + for (int i=0;i taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } + + public String setCompleted(String taskName){ + Task task = new Task(); + task.taskStatus = "Completed"; + task.taskName = taskName; + + for (int i=0;i completedTasks = new ArrayList<>(); + for (Task task : todoList) { + if (task.taskStatus.equals("Completed")) { + completedTasks.add(task.taskName); + } + } + if (!completedTasks.isEmpty()){ + return completedTasks.toString(); + }else { + return "No completed tasks in todo list."; + } + } + + public String getUncompletedTasks(){ + ArrayList uncompletedTasks = new ArrayList<>(); + for (Task task : todoList) { + if (task.taskStatus.equals("Incomplete")) { + uncompletedTasks.add(task.taskName); + } + } + if (!uncompletedTasks.isEmpty()){ + return uncompletedTasks.toString(); + }else { + return "No uncompleted tasks in todo list."; + } + } + + public String searchTask(String taskName){ + for (Task task : todoList) { + if (taskName.equals(task.taskName)) { + return "Task '" + taskName + "' is " + task.taskStatus; + } + } + return "Task not found."; + } + + public String removeTask(String taskName) { + for (int i = 0; i < todoList.size(); i++) { + if (taskName.equals((todoList.get(i)).taskName)) { + todoList.remove(i); + return "Task removed from todo list."; + } + } + return "Task not found."; + } + + public String getTasksAscending(){ + if (!this.todoList.isEmpty()){ + ArrayList taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + Collections.sort(taskNames); + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } + + public String getTasksDescending(){ + Comparator reverseComparator = Comparator.reverseOrder(); + if (!this.todoList.isEmpty()){ + ArrayList taskNames = new ArrayList<>(); + for (Task task : todoList) { + taskNames.add(task.taskName); + } + taskNames.sort(reverseComparator); + return taskNames.toString(); + }else { + return "Todo list is empty."; + } + } +} diff --git a/src/test/java/com/booleanuk/core/TodoListTest.java b/src/test/java/com/booleanuk/core/TodoListTest.java index 0bef779a4..509ffbcb9 100644 --- a/src/test/java/com/booleanuk/core/TodoListTest.java +++ b/src/test/java/com/booleanuk/core/TodoListTest.java @@ -3,11 +3,148 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.ArrayList; + class TodoListTest { @Test - public void exampleTest() { - String hello = "Hello"; - Assertions.assertEquals("Hello", hello); - Assertions.assertNotEquals("Goodbye", hello); + public void testAddTask() { + TodoList todoList = new TodoList(); + + // Test that task is added to list + Assertions.assertTrue(todoList.addTask("Test task 1")); + Assertions.assertEquals("[Test task 1]", todoList.getTasks()); + } + + @Test + public void testGetTasks(){ + TodoList todoList = new TodoList(); + + // Test if return is correct when list is empty + Assertions.assertEquals("Todo list is empty.", todoList.getTasks()); + + // Test if tasks are retrieved + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + ArrayList test = new ArrayList<>(); + test.add("Test task 1"); + test.add("Test task 2"); + test.add("Test task 3"); + Assertions.assertEquals(test.toString(), todoList.getTasks()); + } + + @Test + public void testChangeStatus() { + TodoList todoList = new TodoList(); + + // Test if return is correct when task does not exist + Assertions.assertEquals("Task not found.", todoList.setCompleted("Test task 1")); + + // Test that the status is changed to complete + todoList.addTask("Test task 1"); + Assertions.assertEquals("Task status is now 'Completed'.", todoList.setCompleted("Test task 1")); + + // Test that the status is changed to incomplete + Assertions.assertEquals("Task status is now 'Incomplete'.", todoList.setUncompleted("Test task 1")); + + } + + @Test + public void testGetCompletedTasks() { + TodoList todoList = new TodoList(); + + // Test that no tasks are retrieved if no tasks have status complete + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("No completed tasks in todo list.", todoList.getCompletedTasks()); + + // Test that tasks with status complete are retrieved + todoList.setCompleted("Test task 1"); + todoList.setCompleted("Test task 3"); + Assertions.assertEquals("[Test task 1, Test task 3]", todoList.getCompletedTasks()); + } + + @Test + public void testGetUncompletedTasks() { + TodoList todoList = new TodoList(); + + // Test that no tasks are retrieved if no tasks have status incomplete + todoList.addTask("Test task 1"); + todoList.setCompleted("Test task 1"); + Assertions.assertEquals("No uncompleted tasks in todo list.", todoList.getUncompletedTasks()); + + // Test that tasks with status incomplete are retrieved + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + ArrayList test = new ArrayList<>(); + test.add("Test task 2"); + test.add("Test task 3"); + Assertions.assertEquals(test.toString(), todoList.getUncompletedTasks()); + } + + @Test + public void testSearchTask() { + TodoList todoList = new TodoList(); + + // Test if return is correct when task does not exist + Assertions.assertEquals("Task not found.", todoList.searchTask("Test task 1")); + + // Test if correct task is retrieved by task name + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("Task 'Test task 1' is Incomplete", todoList.searchTask("Test task 1")); + } + + @Test + public void testRemoveTask() { + TodoList todoList = new TodoList(); + + // Test if return is correct when task does not exist + Assertions.assertEquals("Task not found.", todoList.removeTask("Test task 1")); + + // Test if task is removed from list + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("Task removed from todo list.", todoList.removeTask("Test task 1")); + Assertions.assertEquals("[Test task 2, Test task 3]", todoList.getTasks()); + } + + @Test + public void testGetTasksAscending() { + TodoList todoList = new TodoList(); + + // Test if return is correct when list is empty + Assertions.assertEquals("Todo list is empty.", todoList.getTasksAscending()); + + // Test if tasks are retrieved in ascending order + todoList.addTask("C task 1"); + todoList.addTask("A task 2"); + todoList.addTask("F task 3"); + ArrayList test = new ArrayList<>(); + test.add("A task 2"); + test.add("C task 1"); + test.add("F task 3"); + Assertions.assertEquals(test.toString(), todoList.getTasksAscending()); + } + + @Test + public void testGetTasksDescending() { + TodoList todoList = new TodoList(); + + // Test if return is correct when list is empty + Assertions.assertEquals("Todo list is empty.", todoList.getTasksDescending()); + + // Test if tasks are retrieved in descending order + todoList.addTask("C task 1"); + todoList.addTask("A task 2"); + todoList.addTask("F task 3"); + ArrayList test = new ArrayList<>(); + test.add("F task 3"); + test.add("C task 1"); + test.add("A task 2"); + Assertions.assertEquals(test.toString(), todoList.getTasksDescending()); } } 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..09a2bcbc6 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TodoListExtensionTest.java @@ -0,0 +1,71 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.TodoList; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +public class TodoListExtensionTest { + @Test + public void testGetTaskById() { + TodoListExtension todoList = new TodoListExtension(); + + // Test if return is correct when list is empty + Assertions.assertEquals("Todo list is empty.", todoList.getTaskById(2)); + + // Test if return is correct when task does not exist + todoList.addTask("Test task 1"); + Assertions.assertEquals("Task not found.", todoList.getTaskById(2)); + + // Test if correct task is retrieved by id + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("'Test task 2' is Incomplete", todoList.getTaskById(2)); + } + @Test + public void testEditTaskName() { + TodoListExtension todoList = new TodoListExtension(); + + // Test if name is updated by providing id and new name + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("Task name changed to 'Edited name'", todoList.editTaskName(2, "Edited name")); + + // Double check that the new name is set correct in the task object + Assertions.assertEquals("'Edited name' is Incomplete", todoList.getTaskById(2)); + } + + @Test + public void testChangeStatus() { + TodoListExtension todoList = new TodoListExtension(); + + // Test if return is correct when list is empty + Assertions.assertEquals("Task list is empty.", todoList.setCompletedById(2)); + + // Test if return is correct when task does not exist + todoList.addTask("Test task 1"); + Assertions.assertEquals("Task not found.", todoList.setCompletedById(2)); + + // Test that the status is changed to complete + todoList.addTask("Test task 2"); + todoList.addTask("Test task 3"); + Assertions.assertEquals("Task status is now 'Completed'.", todoList.setCompletedById(2)); + + // Test that the status is changed to incomplete + Assertions.assertEquals("Task status is now 'Incomplete'.", todoList.setUncompletedById(2)); + } + + @Test + public void testGetCreationDateTime() { + TodoListExtension todoList = new TodoListExtension(); + + // Test that the creation datetime is retrieved + todoList.addTask("Test task 1"); + todoList.addTask("Test task 2"); + String timeNow = LocalDateTime.now().withNano(0).withSecond(0).toString(); + todoList.addTask("Test task 3"); + Assertions.assertEquals("Task created at '" + timeNow + "' is Incomplete", todoList.getCreationDateTime(2)); + } +}