diff --git a/domain-model.png b/domain-model.png new file mode 100644 index 000000000..2955daaee Binary files /dev/null and b/domain-model.png differ diff --git a/src/main/java/com/booleanuk/core/Task.java b/src/main/java/com/booleanuk/core/Task.java new file mode 100644 index 000000000..45b3ccf8c --- /dev/null +++ b/src/main/java/com/booleanuk/core/Task.java @@ -0,0 +1,22 @@ +package com.booleanuk.core; + +public class Task { + private boolean completed = false; + private String name; + + public Task(String name) { + this.name = name; + } + + void complete() { + completed = true; + } + + boolean isComplete() { + return completed; + } + + String getName() { + return name; + } +} diff --git a/src/main/java/com/booleanuk/core/TodoList.java b/src/main/java/com/booleanuk/core/TodoList.java index 675adaf0b..04f7c77ba 100644 --- a/src/main/java/com/booleanuk/core/TodoList.java +++ b/src/main/java/com/booleanuk/core/TodoList.java @@ -1,5 +1,85 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + public class TodoList { + private ArrayList tasks = new ArrayList<>(); + + ArrayList addTask(Task t) { + tasks.add(t); + return tasks; + } + + void completeTask(String taskName) { + for (Task t : tasks) { + if (t.getName().equals(taskName)) { + t.complete(); + } + } + } + + ArrayList getAll() { + return tasks; + } + + ArrayList getCompleted() { + ArrayList completed = new ArrayList<>(); + + for (Task t : tasks) { + if (t.isComplete()) + completed.add(t); + } + + return completed; + } + + ArrayList getIncompleted() { + ArrayList incompleted = new ArrayList<>(); + + for (Task t : tasks) { + if (!t.isComplete()) + incompleted.add(t); + } + + return incompleted; + } + + ArrayList getAllAscending() { + Collections.sort(tasks, new Comparator() { + @Override + public int compare(Task t1, Task t2) { + return t1.getName().compareToIgnoreCase(t2.getName()); + } + }); + return tasks; + } + + ArrayList getAllDescending() { + Collections.sort(tasks, new Comparator() { + @Override + public int compare(Task t1, Task t2) { + return t2.getName().compareToIgnoreCase(t1.getName()); + } + }); + return tasks; + } + + boolean search(String taskName) { + for (Task t : tasks) { + if (t.getName().equals(taskName)) + return true; + } + return false; + } + Task removeTask(String taskName) { + for (int i = 0; i < tasks.size(); i++) { + if (tasks.get(i).getName().equals(taskName)) { + return tasks.remove(i); + } + } + return null; + } } diff --git a/src/main/java/com/booleanuk/extension/Task.java b/src/main/java/com/booleanuk/extension/Task.java new file mode 100644 index 000000000..50d964723 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Task.java @@ -0,0 +1,52 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; + +public class Task { + private boolean completed = false; + private String name; + private int id = -1; + private LocalDateTime timeCreated = LocalDateTime.now(); + + public Task(String name) { + this.name = name; + } + + public Task(String name, int id) { + this.name = name; + this.id = id; + } + + + void complete() { + completed = true; + } + + boolean isComplete() { + return completed; + } + + String getName() { + return name; + } + + int getId() { + return id; + } + + void changeName(String newName) { + name = newName; + } + + void setStatus(boolean completed) { + this.completed = completed; + } + + LocalDateTime getTimeCreated() { + return timeCreated; + } + + void setId(int id) { + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/extension/TodoList.java b/src/main/java/com/booleanuk/extension/TodoList.java new file mode 100644 index 000000000..91eb192cd --- /dev/null +++ b/src/main/java/com/booleanuk/extension/TodoList.java @@ -0,0 +1,114 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class TodoList { + private ArrayList tasks = new ArrayList<>(); + private int idCounter = 1; // gives unique ids to tasks + + ArrayList addTask(Task t) { + t.setId(idCounter++); + tasks.add(t); + return tasks; + } + + void completeTask(String taskName) { + for (Task t : tasks) { + if (t.getName().equals(taskName)) { + t.complete(); + } + } + } + + ArrayList getAll() { + return tasks; + } + + ArrayList getCompleted() { + ArrayList completed = new ArrayList<>(); + + for (Task t : tasks) { + if (t.isComplete()) + completed.add(t); + } + + return completed; + } + + ArrayList getIncompleted() { + ArrayList incompleted = new ArrayList<>(); + + for (Task t : tasks) { + if (!t.isComplete()) + incompleted.add(t); + } + + return incompleted; + } + + ArrayList getAllAscending() { + ArrayList ascending = new ArrayList<>(tasks); + Collections.sort(ascending, new Comparator() { + @Override + public int compare(Task t1, Task t2) { + return t1.getName().compareToIgnoreCase(t2.getName()); + } + }); + return ascending; + } + + ArrayList getAllDescending() { + ArrayList descending = getAllAscending(); + Collections.reverse(descending); + return descending; + } + + boolean search(String taskName) { + for (Task t : tasks) { + if (t.getName().equals(taskName)) + return true; + } + return false; + } + + Task removeTask(String taskName) { + for (int i = 0; i < tasks.size(); i++) { + if (tasks.get(i).getName().equals(taskName)) { + return tasks.remove(i); + } + } + return null; + } + + Task getTaskId(int id) { + for (Task t : tasks) { + if (t.getId() == id) + return t; + } + return null; + } + + Task changeTaskName(int id, String newName) { + Task t = getTaskId(id); + + if (t != null) { + t.changeName(newName); + return t; + } + + return null; + } + + Task setTaskStatus(boolean completed, int id) { + Task t = getTaskId(id); + + if (t != null) { + t.setStatus(completed); + return t; + } + + return null; + } +} diff --git a/src/test/java/com/booleanuk/core/TaskTest.java b/src/test/java/com/booleanuk/core/TaskTest.java new file mode 100644 index 000000000..dbcbc9fb6 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TaskTest.java @@ -0,0 +1,24 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TaskTest { + @Test + void testComplete() { + Task task = new Task("task1"); + + Assertions.assertFalse(task.isComplete()); + + task.complete(); + + Assertions.assertTrue(task.isComplete()); + } + + @Test + void testGetName() { + Task task = new Task("task1"); + + Assertions.assertEquals("task1", task.getName()); + } +} diff --git a/src/test/java/com/booleanuk/core/TodoListTest.java b/src/test/java/com/booleanuk/core/TodoListTest.java index 0bef779a4..168f35f96 100644 --- a/src/test/java/com/booleanuk/core/TodoListTest.java +++ b/src/test/java/com/booleanuk/core/TodoListTest.java @@ -1,13 +1,169 @@ package com.booleanuk.core; +import java.util.ArrayList; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; class TodoListTest { @Test - public void exampleTest() { - String hello = "Hello"; - Assertions.assertEquals("Hello", hello); - Assertions.assertNotEquals("Goodbye", hello); + void testGetAll() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + ArrayList tasks = todoList.getAll(); + + Assertions.assertEquals(tasks.get(0), task1); + Assertions.assertEquals(tasks.get(1), task2); + Assertions.assertEquals(tasks.get(2), task3); + } + + @Test + void testAddTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + + Assertions.assertEquals(task1, todoList.addTask(task1).get(0)); + } + + @Test + void testCompleteTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + todoList.addTask(task1); + todoList.completeTask("task1"); + + Assertions.assertTrue(todoList.getAll().get(0).isComplete()); + } + + @Test + void testGetCompleted() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + todoList.completeTask("task1"); + + ArrayList completed = todoList.getCompleted(); + + Assertions.assertEquals("task1", completed.get(0).getName()); + Assertions.assertEquals(1, completed.size()); + } + + @Test + void testGetIncompleted() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + todoList.completeTask("task1"); + + ArrayList incompleted = todoList.getIncompleted(); + + Assertions.assertEquals("task2", incompleted.get(0).getName()); + Assertions.assertEquals("task3", incompleted.get(1).getName()); + Assertions.assertEquals(2, incompleted.size()); + } + + @Test + void testSearch() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertTrue(todoList.search("task1")); + Assertions.assertFalse(todoList.search("task0")); + } + + @Test + void testGetAllAscending() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task3); + todoList.addTask(task2); + + ArrayList tasks = todoList.getAllAscending(); + + Assertions.assertEquals("a", tasks.get(0).getName()); + Assertions.assertEquals("b", tasks.get(1).getName()); + Assertions.assertEquals("c", tasks.get(2).getName()); + } + + @Test + void testGetAllDescending() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + ArrayList tasks = todoList.getAllDescending(); + + Assertions.assertEquals("c", tasks.get(0).getName()); + Assertions.assertEquals("b", tasks.get(1).getName()); + Assertions.assertEquals("a", tasks.get(2).getName()); + } + + @Test + void testRemoveTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + + Assertions.assertEquals("b", todoList.removeTask("b").getName()); + + ArrayList tasks = todoList.getAll(); + + Assertions.assertEquals(2, tasks.size()); + } + + @Test + void testRemoveTaskThatDoesNotExist() { + TodoList todoList = new TodoList(); + + Assertions.assertEquals(null, todoList.removeTask("task1")); } -} +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/TaskExtensionTest.java b/src/test/java/com/booleanuk/extension/TaskExtensionTest.java new file mode 100644 index 000000000..506352a8e --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TaskExtensionTest.java @@ -0,0 +1,80 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TaskExtensionTest { + @Test + void testComplete() { + Task task = new Task("task1"); + + Assertions.assertFalse(task.isComplete()); + + task.complete(); + + Assertions.assertTrue(task.isComplete()); + } + + @Test + void testGetName() { + Task task = new Task("task1"); + + Assertions.assertEquals("task1", task.getName()); + } + + @Test + void testGetId() { + Task task = new Task("task1", 1); + + Assertions.assertEquals(1, task.getId()); + } + + @Test + void testChangeName() { + Task task = new Task("task1"); + task.changeName("task2"); + + Assertions.assertEquals("task2", task.getName()); + } + + @Test + void testSetStatus() { + Task task = new Task("task1"); + + task.setStatus(true); + Assertions.assertTrue(task.isComplete()); + + task.setStatus(false); + Assertions.assertFalse(task.isComplete()); + } + + @Test + void testGetTimeCreated() { + Task task = new Task("task1"); + LocalDateTime time = task.getTimeCreated(); + LocalDateTime now = LocalDateTime.now(); + + try { + TimeUnit.SECONDS.sleep(1); + } catch (Exception e) { + System.err.println(e); + } + + Task task2 = new Task("task2"); + + Assertions.assertTrue(Math.abs(ChronoUnit.MILLIS.between(time, now)) < 50); + Assertions.assertNotEquals(time, task2.getTimeCreated()); + } + + @Test + void testSetId() { + Task task = new Task("task1"); + + task.setId(777); + Assertions.assertEquals(777, task.getId()); + } +} 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..c369fe99d --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TodoListExtensionTest.java @@ -0,0 +1,260 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TodoListExtensionTest { + @Test + void testGetAll() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + ArrayList tasks = todoList.getAll(); + + Assertions.assertEquals(tasks.get(0), task1); + Assertions.assertEquals(tasks.get(1), task2); + Assertions.assertEquals(tasks.get(2), task3); + } + + @Test + void testAddTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + + Assertions.assertEquals(task1, todoList.addTask(task1).get(0)); + } + + @Test + void testCompleteTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + todoList.addTask(task1); + todoList.completeTask("task1"); + + Assertions.assertTrue(todoList.getAll().get(0).isComplete()); + } + + @Test + void testGetCompleted() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + todoList.completeTask("task1"); + + ArrayList completed = todoList.getCompleted(); + + Assertions.assertEquals("task1", completed.get(0).getName()); + Assertions.assertEquals(1, completed.size()); + } + + @Test + void testGetIncompleted() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + todoList.completeTask("task1"); + + ArrayList incompleted = todoList.getIncompleted(); + + Assertions.assertEquals("task2", incompleted.get(0).getName()); + Assertions.assertEquals("task3", incompleted.get(1).getName()); + Assertions.assertEquals(2, incompleted.size()); + } + + @Test + void testSearch() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("task1"); + Task task2 = new Task("task2"); + Task task3 = new Task("task3"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertTrue(todoList.search("task1")); + Assertions.assertFalse(todoList.search("task0")); + } + + @Test + void testGetAllAscending() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task3); + todoList.addTask(task2); + + ArrayList tasks = todoList.getAllAscending(); + + Assertions.assertEquals("a", tasks.get(0).getName()); + Assertions.assertEquals("b", tasks.get(1).getName()); + Assertions.assertEquals("c", tasks.get(2).getName()); + } + + @Test + void testGetAllDescending() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + ArrayList tasks = todoList.getAllDescending(); + + Assertions.assertEquals("c", tasks.get(0).getName()); + Assertions.assertEquals("b", tasks.get(1).getName()); + Assertions.assertEquals("a", tasks.get(2).getName()); + } + + @Test + void testRemoveTask() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + + Assertions.assertEquals("b", todoList.removeTask("b").getName()); + + ArrayList tasks = todoList.getAll(); + + Assertions.assertEquals(2, tasks.size()); + } + + @Test + void testRemoveTaskThatDoesNotExist() { + TodoList todoList = new TodoList(); + + Assertions.assertEquals(null, todoList.removeTask("task1")); + } + + @Test + void testGetExistingTaskId() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a", 1); + Task task2 = new Task("b", 2); + Task task3 = new Task("c", 3); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals("b", todoList.getTaskId(2).getName()); + } + + @Test + void testGetNonExistingTaskId() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a", 1); + Task task2 = new Task("b", 2); + Task task3 = new Task("c", 3); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals(null, todoList.getTaskId(4)); + } + + @Test + void testChangeExistingTaskName() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals("d", todoList.changeTaskName(task3.getId(), "d").getName()); + } + + @Test + void testChangeNonExistingTaskName() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a", 1); + Task task2 = new Task("b", 2); + Task task3 = new Task("c", 3); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals(null, todoList.changeTaskName(4, "d")); + } + + @Test + void testSetExistingTaskStatus() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a"); + Task task2 = new Task("b"); + Task task3 = new Task("c"); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertTrue(todoList.setTaskStatus(true, task2.getId()).isComplete()); + Assertions.assertFalse(todoList.setTaskStatus(false, task2.getId()).isComplete()); + } + @Test + + void testSetNonExistingTaskStatus() { + TodoList todoList = new TodoList(); + + Task task1 = new Task("a", 1); + Task task2 = new Task("b", 2); + Task task3 = new Task("c", 3); + + todoList.addTask(task1); + todoList.addTask(task2); + todoList.addTask(task3); + + Assertions.assertEquals(null, todoList.setTaskStatus(true, 4)); + } +}