From 4a3435f05ea2a47085596829541a35fbf56dc9e3 Mon Sep 17 00:00:00 2001 From: RusdiHaizim Date: Sat, 14 Sep 2019 14:52:39 +0800 Subject: [PATCH 1/2] A-Libraries: Compiled natty --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 7a50b729f8..5b41d1aa61 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ run { dependencies { compile files("${System.properties['java.home']}/../lib/tools.jar") + compile group: 'com.joestelmach', name: 'natty', version: '0.6' testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' } From a8f7d7d551addc351457c26e5bfa2168985d0031 Mon Sep 17 00:00:00 2001 From: RusdiHaizim Date: Sun, 15 Sep 2019 12:10:03 +0800 Subject: [PATCH 2/2] B-Reminders: +ReminderCommand +Changes to Deadline class to include natty +Changes to JUnit --- data/saved_data.txt | 5 +- data/test_data.txt | 0 src/main/java/duke/Parser.java | 12 ++-- src/main/java/duke/commands/AddCommand.java | 2 + .../java/duke/commands/ReminderCommand.java | 46 ++++++++++++++ src/main/java/duke/tasks/Deadline.java | 23 ++++--- src/main/java/duke/tasks/Event.java | 6 +- src/main/java/duke/tasks/Task.java | 13 +++- src/main/java/duke/tasks/ToDo.java | 5 +- src/test/java/DeadlineTest.java | 44 ++++++++++++-- src/test/java/DukeTest.java | 30 +++++++++- src/test/java/EventTest.java | 42 +++++++++++-- src/test/java/ReminderTest.java | 51 ++++++++++++++++ src/test/java/TodoTest.java | 60 +++++++++++++++---- 14 files changed, 288 insertions(+), 51 deletions(-) create mode 100644 data/test_data.txt create mode 100644 src/main/java/duke/commands/ReminderCommand.java create mode 100644 src/test/java/ReminderTest.java diff --git a/data/saved_data.txt b/data/saved_data.txt index e7f7b71031..ef04e7de85 100644 --- a/data/saved_data.txt +++ b/data/saved_data.txt @@ -1,3 +1,2 @@ -T|✓|eat food -E|✗|event|now -T|✗|eat +D|✗|a|0600 9/15/2019 +D|✗|b|0500 9/15/2019 diff --git a/data/test_data.txt b/data/test_data.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 87db82f2f1..b1748608a2 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,12 +1,6 @@ package duke; -import duke.commands.Command; -import duke.commands.AddCommand; -import duke.commands.DeleteCommand; -import duke.commands.DoneCommand; -import duke.commands.ExitCommand; -import duke.commands.FindCommand; -import duke.commands.ListCommand; +import duke.commands.*; import duke.tasks.Deadline; import duke.tasks.Event; import duke.tasks.Task; @@ -28,6 +22,8 @@ public static Command parse(String input) throws DukeException { return new ExitCommand(); } else if (input.equals("list")) { return new ListCommand(); + } else if (input.equals("reminder")) { + return new ReminderCommand(); } else if (input.length() > 4 && input.substring(0, 4).equals("find")) { return new FindCommand(input); } else if (input.length() > 4 && input.substring(0, 4).equals("done")) { @@ -88,7 +84,7 @@ public static String runTodo(ArrayList data, String input, int state) { * 2 : Returns null string with checked task * @return String which highlights what Duke processed */ - public static String runDeadline(ArrayList data, String input, int state) { + public static String runDeadline(ArrayList data, String input, int state) throws DukeException { StringBuilder stringBuilder = new StringBuilder(); input = input.substring(9); int startOfBy = input.indexOf("/"); diff --git a/src/main/java/duke/commands/AddCommand.java b/src/main/java/duke/commands/AddCommand.java index 65665159c8..53ce9e017d 100644 --- a/src/main/java/duke/commands/AddCommand.java +++ b/src/main/java/duke/commands/AddCommand.java @@ -1,5 +1,6 @@ package duke.commands; +import com.joestelmach.natty.DateGroup; import duke.DukeException; import duke.Storage; import duke.TaskList; @@ -42,6 +43,7 @@ public AddCommand(CmdType cmdType, String str) throws DukeException { */ @Override public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException { + switch (type) { case TODO: ui.showMessage(Parser.runTodo(tasks.getData(), input, 0)); diff --git a/src/main/java/duke/commands/ReminderCommand.java b/src/main/java/duke/commands/ReminderCommand.java new file mode 100644 index 0000000000..de6a5e1490 --- /dev/null +++ b/src/main/java/duke/commands/ReminderCommand.java @@ -0,0 +1,46 @@ +package duke.commands; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; +import duke.tasks.Task; + +import java.util.ArrayList; + +public class ReminderCommand extends Command { + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) { + ArrayList deadlineList = new ArrayList<>(); + for (Task task : tasks.getData()) { + if (task.getTaskType() == Task.TaskType.DEADLINE) { + deadlineList.add(task); + } + } + deadlineList.sort((o1, o2) -> { + if (o1.getDateTime() == null) { + return 1; + } else if (o2.getDateTime() == null) { + return -1; + } + if (o1.getDateTime().before(o2.getDateTime())) { + return -1; + } else if (o1.getDateTime().after(o2.getDateTime())) { + return 1; + } + return 0; + }); + int idx = 1; + if (deadlineList.size() > 0) { + ui.showMessage("Here are the upcoming Deadlines:"); + for (Task task : deadlineList) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(idx++).append("."); + stringBuilder.append(task.getFullString()); + ui.showMessage(stringBuilder.toString()); + } + } else { + ui.showError("Empty List!"); + } + } +} diff --git a/src/main/java/duke/tasks/Deadline.java b/src/main/java/duke/tasks/Deadline.java index a5b3d1a9c8..73877d85f0 100644 --- a/src/main/java/duke/tasks/Deadline.java +++ b/src/main/java/duke/tasks/Deadline.java @@ -1,8 +1,13 @@ package duke.tasks; +import com.joestelmach.natty.DateGroup; +import com.joestelmach.natty.Parser; +import duke.DukeException; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; public class Deadline extends Task { private String by; @@ -14,16 +19,16 @@ public class Deadline extends Task { * of the task inputted by user * @param by The details of when task is to be done */ - public Deadline(String description, String by) { + public Deadline(String description, String by) throws DukeException { super(description); this.by = by; - - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HHmm"); - sdf.setLenient(false); + taskType = TaskType.DEADLINE; try { - dateNow = sdf.parse(by); - } catch (ParseException e) { - //throw new DukeException("Tasks.Task does not have dd/MM/yyyy HHmm date-time format!"); + Parser parser = new Parser(); + List groups = parser.parse(by); + dateNow = groups.get(0).getDates().get(0); + } catch (Exception e) { + throw new DukeException(" Date cannot be parsed: " + by); } } @@ -47,8 +52,8 @@ public String getFullString() { * @return String containing the date of Task */ @Override - public String getDateTime() { - return dateNow.toString(); + public Date getDateTime() { + return dateNow; } /** diff --git a/src/main/java/duke/tasks/Event.java b/src/main/java/duke/tasks/Event.java index b26014304e..2ed30e8f11 100644 --- a/src/main/java/duke/tasks/Event.java +++ b/src/main/java/duke/tasks/Event.java @@ -17,7 +17,7 @@ public class Event extends Task { public Event(String description, String at) { super(description); this.at = at; - + taskType = TaskType.EVENT; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HHmm"); sdf.setLenient(false); try { @@ -42,8 +42,8 @@ public String toString() { * @return String containing the date of Task */ @Override - public String getDateTime() { - return dateNow.toString(); + public Date getDateTime() { + return dateNow; } @Override diff --git a/src/main/java/duke/tasks/Task.java b/src/main/java/duke/tasks/Task.java index 9511d2a75e..273d9b63fc 100644 --- a/src/main/java/duke/tasks/Task.java +++ b/src/main/java/duke/tasks/Task.java @@ -1,9 +1,16 @@ package duke.tasks; +import java.util.Date; + public abstract class Task { String description; private boolean isDone; + protected TaskType taskType; + + public enum TaskType { + TODO, DEADLINE, EVENT + } /** * Initialises description of task and sets it to !isDone. @@ -42,7 +49,11 @@ public void markAsDone() { this.isDone = true; } - public abstract String getDateTime(); + public abstract Date getDateTime(); public abstract String getExtra(); + + public TaskType getTaskType() { + return taskType; + } } diff --git a/src/main/java/duke/tasks/ToDo.java b/src/main/java/duke/tasks/ToDo.java index bbc289c5af..aa96fce4de 100644 --- a/src/main/java/duke/tasks/ToDo.java +++ b/src/main/java/duke/tasks/ToDo.java @@ -1,5 +1,7 @@ package duke.tasks; +import java.util.Date; + public class ToDo extends Task { /** @@ -9,6 +11,7 @@ public class ToDo extends Task { */ public ToDo(String description) { super(description); + taskType = TaskType.TODO; } /** @@ -40,7 +43,7 @@ public String getExtra() { * @return Null String */ @Override - public String getDateTime() { + public Date getDateTime() { return null; } } diff --git a/src/test/java/DeadlineTest.java b/src/test/java/DeadlineTest.java index d7602f1e2d..6ed8c49999 100644 --- a/src/test/java/DeadlineTest.java +++ b/src/test/java/DeadlineTest.java @@ -1,23 +1,55 @@ import duke.DukeException; import duke.Parser; import duke.TaskList; +import duke.commands.Command; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + import static org.junit.jupiter.api.Assertions.assertEquals; public class DeadlineTest { + private static final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private static final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private static final PrintStream originalOut = System.out; + private static final PrintStream originalErr = System.err; + + @BeforeEach + void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + void restoreStreams() { + outContent.reset(); + System.setOut(originalOut); + System.setErr(originalErr); + } + @Test - public void test(String input) throws DukeException { + void test(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runDeadline(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[D][✗] test (by: 0000)"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [D][✗] test (by: 0000)\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } @Test - public void examBy_Date(String input) throws DukeException { + void examBy_Date(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runDeadline(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[D][✗] exam (by: 01/01/2019)"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [D][✗] exam (by: 01/01/2019)\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } } diff --git a/src/test/java/DukeTest.java b/src/test/java/DukeTest.java index 0ceb7a8d4d..de249cc32d 100644 --- a/src/test/java/DukeTest.java +++ b/src/test/java/DukeTest.java @@ -1,15 +1,37 @@ import duke.DukeException; -import org.junit.jupiter.api.Test; +import duke.Storage; +import duke.Ui; +import org.junit.jupiter.api.*; +import java.io.File; +import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertEquals; public class DukeTest { + public static Ui ui; + public static Storage storage; + + private void testSetup() throws DukeException { + new File("./data").mkdir(); + File file = new File("./data/test_data.txt"); + try { + file.createNewFile(); + } catch (IOException error) { + System.out.println("ERROR, FAILED TO CREATE"); + } + ui = new Ui(); + storage = new Storage("./data/test_data.txt"); + } + @Test public void test() throws DukeException { dummyTest(); + //Setting up configurations + testSetup(); + //Tests for todo - new TodoTest().test("todo test"); + new TodoTest().test("todo eat"); new TodoTest().jog("todo jog"); new TodoTest().todo("todo todo"); @@ -20,6 +42,10 @@ public void test() throws DukeException { //Test for event new EventTest().test("event test /at 0000"); new EventTest().birthdayAt_myBday("event bday /at 06/06/2019"); + + //Test for reminders + new ReminderTest().test(); + } public void dummyTest() { diff --git a/src/test/java/EventTest.java b/src/test/java/EventTest.java index 618160cf79..247e76e466 100644 --- a/src/test/java/EventTest.java +++ b/src/test/java/EventTest.java @@ -1,22 +1,54 @@ import duke.DukeException; import duke.Parser; import duke.TaskList; +import duke.commands.Command; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + import static org.junit.jupiter.api.Assertions.assertEquals; public class EventTest { + private static final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private static final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private static final PrintStream originalOut = System.out; + private static final PrintStream originalErr = System.err; + + @BeforeEach + void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + void restoreStreams() { + outContent.reset(); + System.setOut(originalOut); + System.setErr(originalErr); + } + @Test - public void test(String input) throws DukeException { + void test(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runEvent(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[E][✗] test (at: 0000)"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [E][✗] test (at: 0000)\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } @Test public void birthdayAt_myBday(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runEvent(taskList.getData(), input, 2); - assertEquals(taskList.get(0).getFullString(), "[E][✓] bday (at: 06/06/2019)"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [E][✗] bday (at: 06/06/2019)\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } } diff --git a/src/test/java/ReminderTest.java b/src/test/java/ReminderTest.java new file mode 100644 index 0000000000..5d364566ef --- /dev/null +++ b/src/test/java/ReminderTest.java @@ -0,0 +1,51 @@ +import duke.DukeException; +import duke.Parser; +import duke.TaskList; +import duke.commands.Command; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ReminderTest { + private static final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private static final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private static final PrintStream originalOut = System.out; + private static final PrintStream originalErr = System.err; + + @BeforeEach + void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + void restoreStreams() { + outContent.reset(); + System.setOut(originalOut); + System.setErr(originalErr); + } + + @Test + void test() throws DukeException { + setUpStreams(); + TaskList taskList = new TaskList(); + Command c = Parser.parse("deadline a /by 0600 9/15/2019"); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + c = Parser.parse("deadline b /by 0500 9/15/2019");; + c.execute(taskList, DukeTest.ui, DukeTest.storage); + restoreStreams(); + setUpStreams(); + c = Parser.parse("reminder"); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Here are the upcoming Deadlines:\n1.[D][✗] b (by: 0500 9/15/2019)\n2.[D][✗] a (by: 0600 9/15/2019)"; + assertEquals(exp, outContent.toString().trim().replace("\r", "")); + restoreStreams(); + } + +} diff --git a/src/test/java/TodoTest.java b/src/test/java/TodoTest.java index eaca1e7dac..5c4755cdb8 100644 --- a/src/test/java/TodoTest.java +++ b/src/test/java/TodoTest.java @@ -1,30 +1,64 @@ -import duke.DukeException; -import duke.Parser; -import duke.TaskList; -import org.junit.jupiter.api.Test; +import duke.*; +import duke.commands.Command; +import org.junit.jupiter.api.*; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertEquals; public class TodoTest { + private static final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private static final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private static final PrintStream originalOut = System.out; + private static final PrintStream originalErr = System.err; + + @BeforeEach + void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + void restoreStreams() { + outContent.reset(); + System.setOut(originalOut); + System.setErr(originalErr); + } + @Test - public void test(String input) throws DukeException { + void test(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runTodo(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[T][✗] test"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [T][✗] eat\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } @Test - public void jog(String input) throws DukeException { + void jog(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runTodo(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[T][✗] jog"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [T][✗] jog\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } @Test - public void todo(String input) throws DukeException { + void todo(String input) throws DukeException { + setUpStreams(); TaskList taskList = new TaskList(); - Parser.runTodo(taskList.getData(), input, 1); - assertEquals(taskList.get(0).getFullString(), "[T][✗] todo"); + Command c = Parser.parse(input); + c.execute(taskList, DukeTest.ui, DukeTest.storage); + String exp = "Got it. I've added this task: \n [T][✗] todo\nNow you have 1 tasks in the list."; + assertEquals(exp, outContent.toString().trim()); + restoreStreams(); } }