From 388ab257e75e8ffa646311b5bca94c8c1cf5ccad Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 13:36:13 +0200 Subject: [PATCH 1/2] Solution --- domain-model.md | 26 +++ src/main/java/com/booleanuk/core/Task.java | 35 +++ .../java/com/booleanuk/core/TodoList.java | 72 ++++++ .../java/com/booleanuk/extension/TaskExt.java | 60 +++++ .../com/booleanuk/extension/TodoListExt.java | 108 +++++++++ .../java/com/booleanuk/core/TaskTest.java | 35 +++ .../java/com/booleanuk/core/TodoListTest.java | 148 ++++++++++++ .../com/booleanuk/extension/TaskTestExt.java | 41 ++++ .../booleanuk/extension/TodoListTestExt.java | 217 ++++++++++++++++++ 9 files changed, 742 insertions(+) create mode 100644 domain-model.md create mode 100644 src/main/java/com/booleanuk/core/Task.java create mode 100644 src/main/java/com/booleanuk/extension/TaskExt.java create mode 100644 src/main/java/com/booleanuk/extension/TodoListExt.java create mode 100644 src/test/java/com/booleanuk/core/TaskTest.java create mode 100644 src/test/java/com/booleanuk/extension/TaskTestExt.java create mode 100644 src/test/java/com/booleanuk/extension/TodoListTestExt.java diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..1e341484d --- /dev/null +++ b/domain-model.md @@ -0,0 +1,26 @@ +| Class | Members | Method | Scenario | Output | Tested? | +|----------|------------------------|----------------------------------------------|---------------------|------------|---------| +| TodoList | List tasks | add(String description) | | Void | Yes | +| | | getTasks() | | List | Yes | +| | | getCompleteTasks() | | List | Yes | +| | | getIncompleteTasks() | | List | Yes | +| | | search(String search) | Task exists | True | Yes | +| | | | Task does not exist | False | | +| | | remove(String description) | Task exists | True | Yes | +| | | | Task doesnt exist | False | | +| | | getAlphAsc() | | List | Yes | +| | | getAlphDesc() | | List | Yes | +| | | | | | | +| | | getById(String id) | Task exists | Task | Yes | +| | | | Task does not exist | null | | +| | | updateDescription(String id, String newDesc) | Task exists | True | Yes | +| | | | Task does not exist | False | | +| | | changeStatus(String id) | Task exists | True | Yes | +| | | | Task does not exist | False | | +| Task | boolean completed | | | | | +| | String description | | | | | +| | String ID | completeTask( ) | Task was incomplete | True | Yes | +| | LocalDate creationDate | | Task was complete | False | Yes | +| | | incompleteTask() | Task was complete | True | Yes | +| | | | Task was incomplete | False | Yes | +| | | getCreationDate() | | LocalDate | | \ No newline at end of file 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..88f41eabd --- /dev/null +++ b/src/main/java/com/booleanuk/core/Task.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +public class Task { + private String description; + private boolean completeStatus; + + public Task(String description){ + this.completeStatus = false; + this.description = description; + } + + public String getDescription(){ + return this.description; + } + + public boolean getCompleteStatus(){ + return this.completeStatus; + } + + public boolean completeTask(){ + if (this.completeStatus){ + return false; + } + this.completeStatus = true; + return true; + } + + public boolean incompleteTask(){ + if (!this.completeStatus){ + return false; + } + this.completeStatus = false; + return true; + } +} diff --git a/src/main/java/com/booleanuk/core/TodoList.java b/src/main/java/com/booleanuk/core/TodoList.java index 675adaf0b..79b1a7a48 100644 --- a/src/main/java/com/booleanuk/core/TodoList.java +++ b/src/main/java/com/booleanuk/core/TodoList.java @@ -1,5 +1,77 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.List; + public class TodoList { + private List tasks; + + public TodoList(){ + tasks = new ArrayList<>(); + } + + public void add(String desc){ + Task newTask = new Task(desc); + tasks.add(newTask); + } + + public List getTasks(){ + return this.tasks; + } + + public List getCompleteTasks(){ + List completeTasks = new ArrayList<>(); + + for(Task task : this.tasks){ + if(task.getCompleteStatus()){ + completeTasks.add(task); + } + } + return completeTasks; + } + + public List getIncompleteTasks(){ + List completeTasks = new ArrayList<>(); + + for(Task task : this.tasks){ + if(!task.getCompleteStatus()){ + completeTasks.add(task); + } + } + return completeTasks; + } + + public boolean search(String desc){ + for(Task task : this.tasks){ + if(task.getDescription().equals(desc)){ + return true; + } + } + return false; + } + + public boolean remove(String desc){ + for (int i = 0; i < this.tasks.size(); i++){ + if(desc.equals(this.tasks.get(i).getDescription())){ + this.tasks.remove(i); + return true; + } + } + return false; + } + + public List getAlphAsc(){ + List returnVal = new ArrayList<>(List.copyOf(this.tasks)); + + returnVal.sort((a, b) -> {return a.getDescription().compareTo(b.getDescription());}); + return returnVal; + } + + public List getAlphDesc(){ + List returnVal = new ArrayList<>(List.copyOf(this.tasks)); + + returnVal.sort((a, b) -> {return b.getDescription().compareTo(a.getDescription());}); + return returnVal; + } } diff --git a/src/main/java/com/booleanuk/extension/TaskExt.java b/src/main/java/com/booleanuk/extension/TaskExt.java new file mode 100644 index 000000000..3c4fc464d --- /dev/null +++ b/src/main/java/com/booleanuk/extension/TaskExt.java @@ -0,0 +1,60 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.UUID; + +public class TaskExt { + private String description; + private boolean completeStatus; + private String id; + private LocalDateTime creationTime; + + public TaskExt(String description){ + this.completeStatus = false; + this.description = description; + this.id = UUID.randomUUID().toString(); + this.creationTime = LocalDateTime.now(); + } + + public String getDescription(){ + return this.description; + } + + public boolean getCompleteStatus(){ + return this.completeStatus; + } + + public boolean completeTask(){ + if (this.completeStatus){ + return false; + } + this.completeStatus = true; + return true; + } + + public boolean incompleteTask(){ + if (!this.completeStatus){ + return false; + } + this.completeStatus = false; + return true; + } + + public String getId(){ + return this.id; + } + + public void setDescription(String newDesc){ + this.description = newDesc; + } + + public void setCompleteStatus(boolean status){ + this.completeStatus = status; + } + + public LocalDateTime getCreationTime(){ + return this.creationTime; + + } +} diff --git a/src/main/java/com/booleanuk/extension/TodoListExt.java b/src/main/java/com/booleanuk/extension/TodoListExt.java new file mode 100644 index 000000000..94001c596 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/TodoListExt.java @@ -0,0 +1,108 @@ +package com.booleanuk.extension; + +import com.booleanuk.extension.TaskExt; + +import java.util.ArrayList; +import java.util.List; + +public class TodoListExt { + private List tasks; + + public TodoListExt(){ + tasks = new ArrayList<>(); + } + + public void add(String desc){ + TaskExt newTask = new TaskExt(desc); + tasks.add(newTask); + } + + public List getTasks(){ + return this.tasks; + } + + public List getCompleteTasks(){ + List completeTasks = new ArrayList<>(); + + for(TaskExt task : this.tasks){ + if(task.getCompleteStatus()){ + completeTasks.add(task); + } + } + return completeTasks; + } + + public List getIncompleteTasks(){ + List completeTasks = new ArrayList<>(); + + for(TaskExt task : this.tasks){ + if(!task.getCompleteStatus()){ + completeTasks.add(task); + } + } + return completeTasks; + } + + public boolean search(String desc){ + for(TaskExt task : this.tasks){ + if(task.getDescription().equals(desc)){ + return true; + } + } + return false; + } + + public boolean remove(String desc){ + for (int i = 0; i < this.tasks.size(); i++){ + if(desc.equals(this.tasks.get(i).getDescription())){ + this.tasks.remove(i); + return true; + } + } + return false; + } + + public List getAlphAsc(){ + List returnVal = new ArrayList<>(List.copyOf(this.tasks)); + + returnVal.sort((a, b) -> {return a.getDescription().compareTo(b.getDescription());}); + return returnVal; + } + + public List getAlphDesc(){ + List returnVal = new ArrayList<>(List.copyOf(this.tasks)); + + returnVal.sort((a, b) -> {return b.getDescription().compareTo(a.getDescription());}); + return returnVal; + } + + public TaskExt getById(String id){ + for(TaskExt task : this.tasks){ + if(id.equals(task.getId())){ + return task; + } + } + return null; + } + + public boolean updateDescription(String id, String newDesc){ + for(TaskExt task : this.tasks){ + if(task.getId().equals(id)){ + task.setDescription(newDesc); + return true; + } + } + return false; + } + + public boolean changeStatus(String id){ + for(TaskExt task : this.tasks){ + if(task.getId().equals(id)){ + task.setCompleteStatus(!task.getCompleteStatus()); + return true; + } + } + return false; + } + +} 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..2ddcf1d7d --- /dev/null +++ b/src/test/java/com/booleanuk/core/TaskTest.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class TaskTest { + + @Test + public void testCompleteIncompleteTask(){ + TodoList todo = new TodoList(); + + todo.add("Test"); + + Task task = todo.getTasks().get(0); + boolean taskCompleted = task.getCompleteStatus(); + + Assertions.assertFalse(taskCompleted); + + Assertions.assertTrue(task.completeTask()); + + taskCompleted = task.getCompleteStatus(); + Assertions.assertTrue(taskCompleted); + + Assertions.assertFalse(task.completeTask()); + + Assertions.assertTrue(task.incompleteTask()); + + Assertions.assertFalse(task.getCompleteStatus()); + + Assertions.assertFalse(task.incompleteTask()); + } +} diff --git a/src/test/java/com/booleanuk/core/TodoListTest.java b/src/test/java/com/booleanuk/core/TodoListTest.java index 0bef779a4..0068b37d2 100644 --- a/src/test/java/com/booleanuk/core/TodoListTest.java +++ b/src/test/java/com/booleanuk/core/TodoListTest.java @@ -3,6 +3,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + class TodoListTest { @Test public void exampleTest() { @@ -10,4 +13,149 @@ public void exampleTest() { Assertions.assertEquals("Hello", hello); Assertions.assertNotEquals("Goodbye", hello); } + + @Test + public void testAddAndGetTasks(){ + TodoList todo = new TodoList(); + + List tasks = todo.getTasks(); + + Assertions.assertTrue(tasks.isEmpty()); + + todo.add("This is my task"); + + Assertions.assertFalse(tasks.isEmpty()); + Assertions.assertEquals(1, todo.getTasks().size()); + } + + + @Test + public void testGetCompleteTasks(){ + TodoList todo = new TodoList(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertTrue(todo.getCompleteTasks().isEmpty()); + + List tasks = todo.getTasks(); + + tasks.getFirst().completeTask(); + + Assertions.assertEquals(1, todo.getCompleteTasks().size()); + Assertions.assertEquals("Test1", todo.getCompleteTasks().getFirst().getDescription()); + + tasks.get(1).completeTask(); + + Assertions.assertEquals(2, todo.getCompleteTasks().size()); + + } + + + + @Test + public void testGetIncompleteTasks(){ + TodoList todo = new TodoList(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertEquals(4, todo.getIncompleteTasks().size()); + + List tasks = todo.getTasks(); + + tasks.getFirst().completeTask(); + + Assertions.assertEquals(3, todo.getIncompleteTasks().size()); + + tasks.get(1).completeTask(); + + Assertions.assertEquals(2, todo.getIncompleteTasks().size()); + + tasks.get(2).completeTask(); + + Assertions.assertEquals("Test4", todo.getIncompleteTasks().getFirst().getDescription()); + + tasks.get(3).completeTask(); + + Assertions.assertTrue(todo.getIncompleteTasks().isEmpty()); + + } + + @Test + public void testSearch(){ + TodoList todo = new TodoList(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertTrue(todo.search("Test1")); + Assertions.assertTrue(todo.search("Test2")); + Assertions.assertTrue(todo.search("Test3")); + Assertions.assertTrue(todo.search("Test4")); + + Assertions.assertFalse(todo.search("hello")); + Assertions.assertFalse(todo.search("java")); + Assertions.assertFalse(todo.search("wow")); + Assertions.assertFalse(todo.search("hello23")); + } + + @Test + public void testRemove(){ + TodoList todo = new TodoList(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertFalse(todo.remove("wow")); + Assertions.assertFalse(todo.remove("hello")); + Assertions.assertFalse(todo.remove("123")); + + Assertions.assertTrue(todo.remove("Test2")); + Assertions.assertTrue(todo.remove("Test4")); + + boolean removeCheck = todo.search("Test1") && todo.search("Test3") + && !todo.search("Test2") && !todo.search("Test4"); + + Assertions.assertTrue(removeCheck); + + } + + @Test + public void testGetSortAsc(){ + TodoList todo = new TodoList(); + + todo.add("CTest"); + todo.add("ATest"); + todo.add("DTest"); + todo.add("BTest"); + + Assertions.assertEquals("ATest", todo.getAlphAsc().get(0).getDescription()); + Assertions.assertEquals("BTest", todo.getAlphAsc().get(1).getDescription()); + Assertions.assertEquals("CTest", todo.getAlphAsc().get(2).getDescription()); + Assertions.assertEquals("DTest", todo.getAlphAsc().get(3).getDescription()); + } + + @Test + public void testGetSortDesc(){ + TodoList todo = new TodoList(); + + todo.add("CTest"); + todo.add("ATest"); + todo.add("DTest"); + todo.add("BTest"); + + Assertions.assertEquals("DTest", todo.getAlphDesc().get(0).getDescription()); + Assertions.assertEquals("CTest", todo.getAlphDesc().get(1).getDescription()); + Assertions.assertEquals("BTest", todo.getAlphDesc().get(2).getDescription()); + Assertions.assertEquals("ATest", todo.getAlphDesc().get(3).getDescription()); + } } diff --git a/src/test/java/com/booleanuk/extension/TaskTestExt.java b/src/test/java/com/booleanuk/extension/TaskTestExt.java new file mode 100644 index 000000000..9053e5ba8 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TaskTestExt.java @@ -0,0 +1,41 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Task; +import com.booleanuk.core.TodoList; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TaskTestExt { + + @Test + public void testCompleteIncompleteTask(){ + com.booleanuk.core.TodoList todo = new TodoList(); + + todo.add("Test"); + + Task task = todo.getTasks().get(0); + boolean taskCompleted = task.getCompleteStatus(); + + Assertions.assertFalse(taskCompleted); + + Assertions.assertTrue(task.completeTask()); + + taskCompleted = task.getCompleteStatus(); + Assertions.assertTrue(taskCompleted); + + Assertions.assertFalse(task.completeTask()); + + Assertions.assertTrue(task.incompleteTask()); + + Assertions.assertFalse(task.getCompleteStatus()); + + Assertions.assertFalse(task.incompleteTask()); + } + + @Test + public void testGetCreationTime(){ + TaskExt task = new TaskExt("Test"); + + Assertions.assertnotn + } +} diff --git a/src/test/java/com/booleanuk/extension/TodoListTestExt.java b/src/test/java/com/booleanuk/extension/TodoListTestExt.java new file mode 100644 index 000000000..7ba085c71 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TodoListTestExt.java @@ -0,0 +1,217 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +class TodoListTestExt { + @Test + public void exampleTest() { + String hello = "Hello"; + Assertions.assertEquals("Hello", hello); + Assertions.assertNotEquals("Goodbye", hello); + } + + @Test + public void testAddAndGetTasks(){ + TodoListExt todo = new TodoListExt(); + + List tasks = todo.getTasks(); + + Assertions.assertTrue(tasks.isEmpty()); + + todo.add("This is my task"); + + Assertions.assertFalse(tasks.isEmpty()); + Assertions.assertEquals(1, todo.getTasks().size()); + } + + + @Test + public void testGetCompleteTasks(){ + TodoListExt todo = new TodoListExt(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertTrue(todo.getCompleteTasks().isEmpty()); + + List tasks = todo.getTasks(); + + tasks.getFirst().completeTask(); + + Assertions.assertEquals(1, todo.getCompleteTasks().size()); + Assertions.assertEquals("Test1", todo.getCompleteTasks().getFirst().getDescription()); + + tasks.get(1).completeTask(); + + Assertions.assertEquals(2, todo.getCompleteTasks().size()); + + } + + + + @Test + public void testGetIncompleteTasks(){ + TodoListExt todo = new TodoListExt(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertEquals(4, todo.getIncompleteTasks().size()); + + List tasks = todo.getTasks(); + + tasks.getFirst().completeTask(); + + Assertions.assertEquals(3, todo.getIncompleteTasks().size()); + + tasks.get(1).completeTask(); + + Assertions.assertEquals(2, todo.getIncompleteTasks().size()); + + tasks.get(2).completeTask(); + + Assertions.assertEquals("Test4", todo.getIncompleteTasks().getFirst().getDescription()); + + tasks.get(3).completeTask(); + + Assertions.assertTrue(todo.getIncompleteTasks().isEmpty()); + + } + + @Test + public void testSearch(){ + TodoListExt todo = new TodoListExt(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertTrue(todo.search("Test1")); + Assertions.assertTrue(todo.search("Test2")); + Assertions.assertTrue(todo.search("Test3")); + Assertions.assertTrue(todo.search("Test4")); + + Assertions.assertFalse(todo.search("hello")); + Assertions.assertFalse(todo.search("java")); + Assertions.assertFalse(todo.search("wow")); + Assertions.assertFalse(todo.search("hello23")); + } + + @Test + public void testRemove(){ + TodoListExt todo = new TodoListExt(); + + todo.add("Test1"); + todo.add("Test2"); + todo.add("Test3"); + todo.add("Test4"); + + Assertions.assertFalse(todo.remove("wow")); + Assertions.assertFalse(todo.remove("hello")); + Assertions.assertFalse(todo.remove("123")); + + Assertions.assertTrue(todo.remove("Test2")); + Assertions.assertTrue(todo.remove("Test4")); + + boolean removeCheck = todo.search("Test1") && todo.search("Test3") + && !todo.search("Test2") && !todo.search("Test4"); + + Assertions.assertTrue(removeCheck); + + } + + @Test + public void testGetSortAsc(){ + TodoListExt todo = new TodoListExt(); + + todo.add("CTest"); + todo.add("ATest"); + todo.add("DTest"); + todo.add("BTest"); + + Assertions.assertEquals("ATest", todo.getAlphAsc().get(0).getDescription()); + Assertions.assertEquals("BTest", todo.getAlphAsc().get(1).getDescription()); + Assertions.assertEquals("CTest", todo.getAlphAsc().get(2).getDescription()); + Assertions.assertEquals("DTest", todo.getAlphAsc().get(3).getDescription()); + } + + @Test + public void testGetSortDesc(){ + TodoListExt todo = new TodoListExt(); + + todo.add("CTest"); + todo.add("ATest"); + todo.add("DTest"); + todo.add("BTest"); + + Assertions.assertEquals("DTest", todo.getAlphDesc().get(0).getDescription()); + Assertions.assertEquals("CTest", todo.getAlphDesc().get(1).getDescription()); + Assertions.assertEquals("BTest", todo.getAlphDesc().get(2).getDescription()); + Assertions.assertEquals("ATest", todo.getAlphDesc().get(3).getDescription()); + } + + @Test + public void testGetById(){ + TodoListExt todo = new TodoListExt(); + todo.add("test1"); + todo.add("test2"); + + String id = todo.getTasks().getLast().getId(); + + Assertions.assertEquals(id, todo.getById(id).getId()); + Assertions.assertEquals("test2", todo.getById(id).getDescription()); + + Assertions.assertNull(todo.getById("hello")); + } + + @Test + public void testUpdateById(){ + TodoListExt todo = new TodoListExt(); + todo.add("test1"); + todo.add("test2"); + + String firstId = todo.getTasks().getFirst().getId(); + String lastId = todo.getTasks().getLast().getId(); + + Assertions.assertTrue(todo.updateDescription(firstId, "test3")); + Assertions.assertTrue(todo.updateDescription(lastId, "test4")); + + Assertions.assertFalse(todo.updateDescription("123", "tes")); + + Assertions.assertEquals("test3", todo.getById(firstId).getDescription()); + Assertions.assertEquals("test4", todo.getById(lastId).getDescription()); + } + + @Test + public void testChangeStatus(){ + TodoListExt todo = new TodoListExt(); + todo.add("test1"); + todo.add("test2"); + + String id = todo.getTasks().getFirst().getId(); + + boolean prevStatus = todo.getById(id).getCompleteStatus(); + Assertions.assertTrue(todo.changeStatus(id)); + boolean postStatus = todo.getById(id).getCompleteStatus(); + + Assertions.assertNotEquals(prevStatus, postStatus); + + Assertions.assertTrue(todo.changeStatus(id)); + + boolean newerStatus = todo.getById(id).getCompleteStatus(); + + Assertions.assertNotEquals(postStatus, newerStatus); + + Assertions.assertFalse(todo.changeStatus("123")); + + } + +} From dcbde46dc938eeee5102a1ca3eb0443f69dd8151 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 13:39:20 +0200 Subject: [PATCH 2/2] Solution --- src/test/java/com/booleanuk/extension/TaskTestExt.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/booleanuk/extension/TaskTestExt.java b/src/test/java/com/booleanuk/extension/TaskTestExt.java index 9053e5ba8..35887d70e 100644 --- a/src/test/java/com/booleanuk/extension/TaskTestExt.java +++ b/src/test/java/com/booleanuk/extension/TaskTestExt.java @@ -35,7 +35,6 @@ public void testCompleteIncompleteTask(){ @Test public void testGetCreationTime(){ TaskExt task = new TaskExt("Test"); - - Assertions.assertnotn + Assertions.assertNotNull(task.getCreationTime()); } }