From afc20bca35ba6ad060b6c0e1dd3217c228d9f2f2 Mon Sep 17 00:00:00 2001 From: L Date: Thu, 2 Sep 2021 14:02:34 +0800 Subject: [PATCH 01/12] level 1 --- src/main/java/Duke.java | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334..ff023de8 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,4 +1,32 @@ +import java.util.Scanner; + public class Duke { + public static void printLine(){ + System.out.println(" --------------------------------"); + } + + public static void dukeGreet(){ + printLine(); + System.out.println(" Hello! I'm Duke"); + System.out.println(" What can I do for you?\n"); + printLine(); + } + + public static void dukeEcho(){ + String req; + Scanner sc = new Scanner(System.in); + while(!(req = sc.nextLine()).equals("bye")){ + System.out.println(req + "\n"); + printLine(); + System.out.println(" " + req + "\n"); + printLine(); + } + System.out.println(req + "\n"); + printLine(); + System.out.println(" Bye.Hope to see you again soon!\n"); + printLine(); + } + public static void main(String[] args) { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" @@ -6,5 +34,8 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + dukeGreet(); + dukeEcho(); + } -} +} \ No newline at end of file From 2c0629b43540a971388014c8d1dd159c6cb7e832 Mon Sep 17 00:00:00 2001 From: L Date: Thu, 2 Sep 2021 14:04:58 +0800 Subject: [PATCH 02/12] level 2 --- src/main/java/Duke.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ff023de8..eb927a7d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,4 @@ +import java.util.ArrayList; import java.util.Scanner; public class Duke { @@ -15,16 +16,28 @@ public static void dukeGreet(){ public static void dukeEcho(){ String req; Scanner sc = new Scanner(System.in); + ArrayList list = new ArrayList<>(); while(!(req = sc.nextLine()).equals("bye")){ System.out.println(req + "\n"); printLine(); - System.out.println(" " + req + "\n"); + if(req.equals("list")){ + for(int i = 0; i < list.size(); i++){ + System.out.println(" " + (i + 1) + ". " + list.get(i)); + } + System.out.println(); + } + else{ + System.out.println(" added: " + req + "\n"); + list.add(req); + } printLine(); + } System.out.println(req + "\n"); printLine(); System.out.println(" Bye.Hope to see you again soon!\n"); printLine(); + } public static void main(String[] args) { From e55e19ac3e33012a425cda667ec2181cc737d380 Mon Sep 17 00:00:00 2001 From: L Date: Sun, 12 Sep 2021 13:13:04 +0800 Subject: [PATCH 03/12] level 3 --- src/main/java/Duke.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index eb927a7d..34c5ff7c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -21,15 +21,22 @@ public static void dukeEcho(){ System.out.println(req + "\n"); printLine(); if(req.equals("list")){ + System.out.println(" Here are the tasks in your list:"); for(int i = 0; i < list.size(); i++){ - System.out.println(" " + (i + 1) + ". " + list.get(i)); + System.out.println(" " + (i + 1) + "." + list.get(i)); } - System.out.println(); + } + else if(req.substring(0, 4).equals("done")){ + System.out.println(" Nice! I've marked this task as done:"); + int idx = Integer.parseInt(req.trim().split(" ")[1]) - 1; + list.set(idx, "[X] " + list.get(idx).substring(4)); + System.out.println(" " + list.get(idx)); } else{ - System.out.println(" added: " + req + "\n"); - list.add(req); + System.out.println(" added: " + req); + list.add("[ ] " + req); } + System.out.println(); printLine(); } From a5899c3881bbfffb34dd9efa6c870f82b905905f Mon Sep 17 00:00:00 2001 From: L Date: Sun, 12 Sep 2021 14:58:37 +0800 Subject: [PATCH 04/12] level 4 --- src/main/java/Deadline.java | 15 +++++++++++ src/main/java/Duke.java | 54 ++++++++++++++++++++++++++++--------- src/main/java/Event.java | 14 ++++++++++ src/main/java/Task.java | 17 ++++++++++++ src/main/java/Todo.java | 13 +++++++++ 5 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 00000000..347d9db6 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,15 @@ +public class Deadline extends Task{ + String by; + + public Deadline(String description, String by){ + super(description); + this.by = by; + taskType = 'D'; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[" + taskType + "][" + mark + "] " + description + " (by: " + by + ")"); + } + +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 34c5ff7c..527cda3f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,9 +1,11 @@ import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class Duke { + public static List taskList = new ArrayList<>(); public static void printLine(){ - System.out.println(" --------------------------------"); + System.out.println(" -----------------------------------------------"); } public static void dukeGreet(){ @@ -13,38 +15,64 @@ public static void dukeGreet(){ printLine(); } + public static void addTask(String req){ + Task newTask; + String type = req.trim().split(" ")[0]; + String description; + if(type.equals("todo")){ + description = req.replaceFirst("todo", "").trim(); + newTask = new Todo(description); + } else if(type.equals("deadline")){ + String[] descriptions = req.replaceFirst("deadline", "").trim().split("/by "); + description = descriptions[0].trim(); + String by = descriptions[1]; + newTask = new Deadline(description, by); + } else if(type.equals("event")){ + String[] descriptions = req.replaceFirst("event", "").trim().split("/at "); + description = descriptions[0].trim(); + String at = descriptions[1]; + newTask = new Event(description, at); + } else{ + System.out.println("Error: Input is invalid!"); + return; + } + taskList.add(newTask); + System.out.println(" Got it. I've added this task:"); + System.out.print(" "); + newTask.showTask(); + System.out.println(" Now you have " + taskList.size() + " tasks in the list."); + } + public static void dukeEcho(){ String req; Scanner sc = new Scanner(System.in); - ArrayList list = new ArrayList<>(); while(!(req = sc.nextLine()).equals("bye")){ System.out.println(req + "\n"); printLine(); if(req.equals("list")){ System.out.println(" Here are the tasks in your list:"); - for(int i = 0; i < list.size(); i++){ - System.out.println(" " + (i + 1) + "." + list.get(i)); + for(int i = 0; i < taskList.size(); i++){ + System.out.print(" " + (i + 1) + "."); + taskList.get(i).showTask(); } } else if(req.substring(0, 4).equals("done")){ + int idx = Integer.parseInt(req.substring(4).trim()) - 1; + taskList.get(idx).doTask(); System.out.println(" Nice! I've marked this task as done:"); - int idx = Integer.parseInt(req.trim().split(" ")[1]) - 1; - list.set(idx, "[X] " + list.get(idx).substring(4)); - System.out.println(" " + list.get(idx)); + System.out.print(" "); + taskList.get(idx).showTask(); } - else{ - System.out.println(" added: " + req); - list.add("[ ] " + req); + else { + addTask(req); } System.out.println(); printLine(); - } System.out.println(req + "\n"); printLine(); System.out.println(" Bye.Hope to see you again soon!\n"); printLine(); - } public static void main(String[] args) { @@ -58,4 +86,4 @@ public static void main(String[] args) { dukeEcho(); } -} \ No newline at end of file +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 00000000..c4c7b17e --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,14 @@ +public class Event extends Task{ + String at; + + public Event(String description, String at){ + super(description); + this.at = at; + taskType = 'E'; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[" + taskType + "][" + mark + "] " + description + " (at: " + at + ")"); + } +} \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 00000000..effd50ec --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,17 @@ +public class Task { + String description; + boolean isDone; + char taskType; + + public Task(String description){ + this.description = description; + isDone = false; + taskType = '#'; + } + + public void showTask(){} + + public void doTask(){ + this.isDone = true; + } +} \ No newline at end of file diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 00000000..1a37ea35 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,13 @@ +public class Todo extends Task{ + + public Todo(String description){ + super(description); + taskType = 'T'; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[" + taskType + "][" + mark + "] " + description); + } + +} \ No newline at end of file From eeccc114dce60eb8c5a5ce95330690a29b31b45c Mon Sep 17 00:00:00 2001 From: L Date: Wed, 22 Sep 2021 13:56:17 +0800 Subject: [PATCH 05/12] level 5 --- src/main/java/Duke.java | 29 ++++++++++++++++++++++------- src/main/java/InvalidException.java | 6 ++++++ src/main/java/MissReqException.java | 10 ++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 src/main/java/InvalidException.java create mode 100644 src/main/java/MissReqException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 527cda3f..6c5cb44f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -15,26 +15,35 @@ public static void dukeGreet(){ printLine(); } - public static void addTask(String req){ + public static void addTask(String req)throws InvalidException, MissReqException{ Task newTask; - String type = req.trim().split(" ")[0]; + String[] reqs = req.trim().split(" "); + String type = reqs[0]; String description; if(type.equals("todo")){ + if(reqs.length == 1){ + throw new MissReqException("todo"); + } description = req.replaceFirst("todo", "").trim(); newTask = new Todo(description); } else if(type.equals("deadline")){ + if(reqs.length == 1){ + throw new MissReqException("deadline"); + } String[] descriptions = req.replaceFirst("deadline", "").trim().split("/by "); description = descriptions[0].trim(); String by = descriptions[1]; newTask = new Deadline(description, by); } else if(type.equals("event")){ + if(reqs.length == 1){ + throw new MissReqException("event"); + } String[] descriptions = req.replaceFirst("event", "").trim().split("/at "); description = descriptions[0].trim(); String at = descriptions[1]; newTask = new Event(description, at); } else{ - System.out.println("Error: Input is invalid!"); - return; + throw new InvalidException(); } taskList.add(newTask); System.out.println(" Got it. I've added this task:"); @@ -47,16 +56,17 @@ public static void dukeEcho(){ String req; Scanner sc = new Scanner(System.in); while(!(req = sc.nextLine()).equals("bye")){ + String[] reqs = req.split(" "); System.out.println(req + "\n"); printLine(); - if(req.equals("list")){ + if(reqs[0].equals("list")){ System.out.println(" Here are the tasks in your list:"); for(int i = 0; i < taskList.size(); i++){ System.out.print(" " + (i + 1) + "."); taskList.get(i).showTask(); } } - else if(req.substring(0, 4).equals("done")){ + else if(reqs[0].equals("done")){ int idx = Integer.parseInt(req.substring(4).trim()) - 1; taskList.get(idx).doTask(); System.out.println(" Nice! I've marked this task as done:"); @@ -64,7 +74,12 @@ else if(req.substring(0, 4).equals("done")){ taskList.get(idx).showTask(); } else { - addTask(req); + try{ + addTask(req); + }catch (Exception e){ + System.out.println(" " + e.getMessage()); + } + } System.out.println(); printLine(); diff --git a/src/main/java/InvalidException.java b/src/main/java/InvalidException.java new file mode 100644 index 00000000..2202fadf --- /dev/null +++ b/src/main/java/InvalidException.java @@ -0,0 +1,6 @@ +public class InvalidException extends Exception{ + + public String getMessage(){ + return "☹ OOPS!!! I'm sorry, but I don't know what that means :-("; + } +} \ No newline at end of file diff --git a/src/main/java/MissReqException.java b/src/main/java/MissReqException.java new file mode 100644 index 00000000..d328636b --- /dev/null +++ b/src/main/java/MissReqException.java @@ -0,0 +1,10 @@ +public class MissReqException extends Exception{ + String message; + MissReqException(String req){ + message = String.format("☹ OOPS!!! The description of a %s cannot be empty.", req); + + } + public String getMessage(){ + return message; + } +} \ No newline at end of file From b6098a6c9dade91b120f17f4111e2afeb2b78800 Mon Sep 17 00:00:00 2001 From: L Date: Sat, 2 Oct 2021 12:58:10 +0800 Subject: [PATCH 06/12] level 6 --- src/main/java/Deadline.java | 4 ++-- src/main/java/Duke.java | 9 ++++++++- src/main/java/Event.java | 4 ++-- src/main/java/Task.java | 4 ++-- src/main/java/Todo.java | 4 ++-- src/main/java/Types.java | 3 +++ 6 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 src/main/java/Types.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 347d9db6..0290bda7 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -4,12 +4,12 @@ public class Deadline extends Task{ public Deadline(String description, String by){ super(description); this.by = by; - taskType = 'D'; + type = Types.DEADLINE; } public void showTask(){ String mark = isDone ? "X" : " "; - System.out.println("[" + taskType + "][" + mark + "] " + description + " (by: " + by + ")"); + System.out.println("[D][" + mark + "] " + description + " (by: " + by + ")"); } } \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6c5cb44f..8e64b511 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -73,6 +73,14 @@ else if(reqs[0].equals("done")){ System.out.print(" "); taskList.get(idx).showTask(); } + else if(reqs[0].equals("delete")){ + int idx = Integer.parseInt(reqs[1]) - 1; + System.out.println(" Noted! I've removed this task:"); + System.out.print(" "); + taskList.get(idx).showTask(); + taskList.remove(idx); + System.out.println(" Now you have " + taskList.size() + " tasks in the list."); + } else { try{ addTask(req); @@ -99,6 +107,5 @@ public static void main(String[] args) { System.out.println("Hello from\n" + logo); dukeGreet(); dukeEcho(); - } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index c4c7b17e..79457a9d 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -4,11 +4,11 @@ public class Event extends Task{ public Event(String description, String at){ super(description); this.at = at; - taskType = 'E'; + type = Types.EVENT; } public void showTask(){ String mark = isDone ? "X" : " "; - System.out.println("[" + taskType + "][" + mark + "] " + description + " (at: " + at + ")"); + System.out.println("[E][" + mark + "] " + description + " (at: " + at + ")"); } } \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index effd50ec..56746b75 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,12 +1,12 @@ public class Task { String description; boolean isDone; - char taskType; + Types type; public Task(String description){ this.description = description; isDone = false; - taskType = '#'; + type = Types.UNKNOWN; } public void showTask(){} diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 1a37ea35..d69f3052 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -2,12 +2,12 @@ public class Todo extends Task{ public Todo(String description){ super(description); - taskType = 'T'; + type = Types.TODO; } public void showTask(){ String mark = isDone ? "X" : " "; - System.out.println("[" + taskType + "][" + mark + "] " + description); + System.out.println("[T][" + mark + "] " + description); } } \ No newline at end of file diff --git a/src/main/java/Types.java b/src/main/java/Types.java new file mode 100644 index 00000000..d62d21a1 --- /dev/null +++ b/src/main/java/Types.java @@ -0,0 +1,3 @@ +public enum Types { + TODO, EVENT, DEADLINE, UNKNOWN +} From fe43ec8a32aadc4390e9b82dca66a603c27ac7cb Mon Sep 17 00:00:00 2001 From: L Date: Sat, 9 Oct 2021 13:58:33 +0800 Subject: [PATCH 07/12] level 7 --- README.md | 4 +- data/duke.txt | 1 + src/main/java/Deadline.java | 15 --- src/main/java/Duke.java | 111 ------------------ src/main/java/Event.java | 14 --- src/main/java/Todo.java | 13 -- src/main/java/duke/Duke.java | 79 +++++++++++++ src/main/java/duke/Parser.java | 64 ++++++++++ src/main/java/duke/Storage.java | 63 ++++++++++ src/main/java/duke/TaskList.java | 28 +++++ src/main/java/duke/Ui.java | 80 +++++++++++++ src/main/java/duke/command/AddCommand.java | 26 ++++ src/main/java/duke/command/Command.java | 20 ++++ src/main/java/duke/command/DeleteCommand.java | 27 +++++ src/main/java/duke/command/DoneCommand.java | 27 +++++ src/main/java/duke/command/ExitCommand.java | 21 ++++ src/main/java/duke/command/ListCommand.java | 21 ++++ .../exception}/InvalidException.java | 5 +- .../exception}/MissReqException.java | 6 +- src/main/java/duke/task/Deadline.java | 29 +++++ src/main/java/duke/task/Event.java | 28 +++++ src/main/java/{ => duke/task}/Task.java | 10 +- src/main/java/duke/task/Todo.java | 25 ++++ src/main/java/{ => duke/task}/Types.java | 2 + text-ui-test/runtest.bat | 2 +- 25 files changed, 559 insertions(+), 162 deletions(-) create mode 100644 data/duke.txt delete mode 100644 src/main/java/Deadline.java delete mode 100644 src/main/java/Duke.java delete mode 100644 src/main/java/Event.java delete mode 100644 src/main/java/Todo.java create mode 100644 src/main/java/duke/Duke.java create mode 100644 src/main/java/duke/Parser.java create mode 100644 src/main/java/duke/Storage.java create mode 100644 src/main/java/duke/TaskList.java create mode 100644 src/main/java/duke/Ui.java create mode 100644 src/main/java/duke/command/AddCommand.java create mode 100644 src/main/java/duke/command/Command.java create mode 100644 src/main/java/duke/command/DeleteCommand.java create mode 100644 src/main/java/duke/command/DoneCommand.java create mode 100644 src/main/java/duke/command/ExitCommand.java create mode 100644 src/main/java/duke/command/ListCommand.java rename src/main/java/{ => duke/exception}/InvalidException.java (73%) rename src/main/java/{ => duke/exception}/MissReqException.java (77%) create mode 100644 src/main/java/duke/task/Deadline.java create mode 100644 src/main/java/duke/task/Event.java rename src/main/java/{ => duke/task}/Task.java (66%) create mode 100644 src/main/java/duke/task/Todo.java rename src/main/java/{ => duke/task}/Types.java (74%) diff --git a/README.md b/README.md index 8715d4d9..0f2208ab 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# duke.Duke project template This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. @@ -13,7 +13,7 @@ Prerequisites: JDK 11, update Intellij to the most recent version. 1. If there are any further prompts, accept the defaults. 1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: +3. After that, locate the `src/main/java/duke.Duke.java` file, right-click it, and choose `Run duke.Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: ``` Hello from ____ _ diff --git a/data/duke.txt b/data/duke.txt new file mode 100644 index 00000000..3ecf41bc --- /dev/null +++ b/data/duke.txt @@ -0,0 +1 @@ +E | 0 | go school | 7:00am diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java deleted file mode 100644 index 0290bda7..00000000 --- a/src/main/java/Deadline.java +++ /dev/null @@ -1,15 +0,0 @@ -public class Deadline extends Task{ - String by; - - public Deadline(String description, String by){ - super(description); - this.by = by; - type = Types.DEADLINE; - } - - public void showTask(){ - String mark = isDone ? "X" : " "; - System.out.println("[D][" + mark + "] " + description + " (by: " + by + ")"); - } - -} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 8e64b511..00000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,111 +0,0 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class Duke { - public static List taskList = new ArrayList<>(); - public static void printLine(){ - System.out.println(" -----------------------------------------------"); - } - - public static void dukeGreet(){ - printLine(); - System.out.println(" Hello! I'm Duke"); - System.out.println(" What can I do for you?\n"); - printLine(); - } - - public static void addTask(String req)throws InvalidException, MissReqException{ - Task newTask; - String[] reqs = req.trim().split(" "); - String type = reqs[0]; - String description; - if(type.equals("todo")){ - if(reqs.length == 1){ - throw new MissReqException("todo"); - } - description = req.replaceFirst("todo", "").trim(); - newTask = new Todo(description); - } else if(type.equals("deadline")){ - if(reqs.length == 1){ - throw new MissReqException("deadline"); - } - String[] descriptions = req.replaceFirst("deadline", "").trim().split("/by "); - description = descriptions[0].trim(); - String by = descriptions[1]; - newTask = new Deadline(description, by); - } else if(type.equals("event")){ - if(reqs.length == 1){ - throw new MissReqException("event"); - } - String[] descriptions = req.replaceFirst("event", "").trim().split("/at "); - description = descriptions[0].trim(); - String at = descriptions[1]; - newTask = new Event(description, at); - } else{ - throw new InvalidException(); - } - taskList.add(newTask); - System.out.println(" Got it. I've added this task:"); - System.out.print(" "); - newTask.showTask(); - System.out.println(" Now you have " + taskList.size() + " tasks in the list."); - } - - public static void dukeEcho(){ - String req; - Scanner sc = new Scanner(System.in); - while(!(req = sc.nextLine()).equals("bye")){ - String[] reqs = req.split(" "); - System.out.println(req + "\n"); - printLine(); - if(reqs[0].equals("list")){ - System.out.println(" Here are the tasks in your list:"); - for(int i = 0; i < taskList.size(); i++){ - System.out.print(" " + (i + 1) + "."); - taskList.get(i).showTask(); - } - } - else if(reqs[0].equals("done")){ - int idx = Integer.parseInt(req.substring(4).trim()) - 1; - taskList.get(idx).doTask(); - System.out.println(" Nice! I've marked this task as done:"); - System.out.print(" "); - taskList.get(idx).showTask(); - } - else if(reqs[0].equals("delete")){ - int idx = Integer.parseInt(reqs[1]) - 1; - System.out.println(" Noted! I've removed this task:"); - System.out.print(" "); - taskList.get(idx).showTask(); - taskList.remove(idx); - System.out.println(" Now you have " + taskList.size() + " tasks in the list."); - } - else { - try{ - addTask(req); - }catch (Exception e){ - System.out.println(" " + e.getMessage()); - } - - } - System.out.println(); - printLine(); - } - System.out.println(req + "\n"); - printLine(); - System.out.println(" Bye.Hope to see you again soon!\n"); - printLine(); - } - - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - dukeGreet(); - dukeEcho(); - } -} diff --git a/src/main/java/Event.java b/src/main/java/Event.java deleted file mode 100644 index 79457a9d..00000000 --- a/src/main/java/Event.java +++ /dev/null @@ -1,14 +0,0 @@ -public class Event extends Task{ - String at; - - public Event(String description, String at){ - super(description); - this.at = at; - type = Types.EVENT; - } - - public void showTask(){ - String mark = isDone ? "X" : " "; - System.out.println("[E][" + mark + "] " + description + " (at: " + at + ")"); - } -} \ No newline at end of file diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java deleted file mode 100644 index d69f3052..00000000 --- a/src/main/java/Todo.java +++ /dev/null @@ -1,13 +0,0 @@ -public class Todo extends Task{ - - public Todo(String description){ - super(description); - type = Types.TODO; - } - - public void showTask(){ - String mark = isDone ? "X" : " "; - System.out.println("[T][" + mark + "] " + description); - } - -} \ No newline at end of file diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java new file mode 100644 index 00000000..fbd51af8 --- /dev/null +++ b/src/main/java/duke/Duke.java @@ -0,0 +1,79 @@ +package duke; + +import duke.command.Command; +import duke.exception.InvalidException; +import duke.exception.MissReqException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Duke { + + private TaskList tasks; + private Storage storage; + private Ui ui; + private boolean isExit; + + public Duke(){isExit = false;} + + public Duke(String path){ + ui = new Ui(); + storage = new Storage(path); + isExit = false; + try{ + tasks = storage.load(); + }catch (FileNotFoundException e){ + tasks = new TaskList(); + ui.showLoadException(); + } + + } + + + + public void dukeGreet(){ + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + ui.showLine(); + System.out.println(" Hello! I'm duke.Duke"); + System.out.println(" What can I do for you?\n"); + ui.showLine(); + } + + + public void dukeEcho(){ + while(!isExit){ + String req = ui.readReq(); + try{ + Command command = Parser.parse(req); + command.execute(tasks, ui, storage); + isExit = command.isExit(); + }catch (IOException e){ + ui.showStoreException(); + }catch (Exception e){ + ui.showException(e, req); + } + } + + } + + public void run(){ + dukeGreet(); + dukeEcho(); + } + public static void main(String[] args) { + new Duke("./data/duke.txt").run(); + } +} diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java new file mode 100644 index 00000000..ed26fb1a --- /dev/null +++ b/src/main/java/duke/Parser.java @@ -0,0 +1,64 @@ +package duke; + +import duke.command.*; +import duke.exception.InvalidException; +import duke.exception.MissReqException; +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + +public class Parser { + public static Task getTask(String req) throws MissReqException, InvalidException { + String[] reqs = req.trim().split(" "); + String type = reqs[0]; + String description; + if(type.equals("todo")){ + if(reqs.length == 1){ + throw new MissReqException("todo"); + } + description = req.replaceFirst("todo", "").trim(); + return new Todo(description); + } else if(type.equals("deadline")){ + if(reqs.length == 1){ + throw new MissReqException("deadline"); + } + String[] descriptions = req.replaceFirst("deadline", "").trim().split("/by "); + description = descriptions[0].trim(); + String by = descriptions[1]; + return new Deadline(description, by); + } else if(type.equals("event")){ + if(reqs.length == 1){ + throw new MissReqException("event"); + } + String[] descriptions = req.replaceFirst("event", "").trim().split("/at "); + description = descriptions[0].trim(); + String at = descriptions[1]; + return new Event(description, at); + } else{ + throw new InvalidException(); + } + } + + public static Command parse(String req) throws MissReqException, InvalidException { + Command command; + String[] reqs = req.split(" "); + if(req.equals("bye")){ + return new ExitCommand(req); + } + else if (reqs[0].equals("list")) { + return new ListCommand(req); + } else if (reqs[0].equals("done")) { + int idx = Integer.parseInt(req.substring(4).trim()) - 1; + return new DoneCommand(req, idx); + } else if (reqs[0].equals("delete")) { + int idx = Integer.parseInt(reqs[1]) - 1; + return new DeleteCommand(req, idx); + } else { + Task task = getTask(req); + return new AddCommand(req, task); + } + } + + +} diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java new file mode 100644 index 00000000..df2e8ef2 --- /dev/null +++ b/src/main/java/duke/Storage.java @@ -0,0 +1,63 @@ +package duke; + +import duke.task.Deadline; +import duke.task.Event; +import duke.task.Task; +import duke.task.Todo; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; + +public class Storage { + public String filepath; + + public Storage(String filepath){ + this.filepath = filepath; + + } + + + public void store(TaskList tasks) throws IOException { + File file = new File(filepath); + File dir = file.getParentFile(); + if(!file.exists()){ + if(!dir.exists()){ + dir.mkdirs(); + } + file.createNewFile(); + } + FileWriter fw = new FileWriter(file); + for(int i = 0; i < tasks.size(); i++){ + fw.write(tasks.taskList.get(i).toStoreString()); + } + fw.close(); + } + + + public TaskList load() throws FileNotFoundException { + TaskList tasks = new TaskList(); + File file = new File(filepath); + Scanner sc = new Scanner(file); + while(sc.hasNext()){ + String line = sc.nextLine(); + String[] data = line.split(" \\| "); + boolean isDone = data[1].equals("1") ? true : false; + Task task; + if(data[0].equals("T")){ + task = new Todo(isDone, data[2]); + } + else if(data[0].equals("D")){ + task = new Deadline(isDone, data[2], data[3]); + } + else{ + task = new Event(isDone, data[2], data[3]); + } + tasks.addTask(task); + } + return tasks; + } + +} diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java new file mode 100644 index 00000000..73f1692b --- /dev/null +++ b/src/main/java/duke/TaskList.java @@ -0,0 +1,28 @@ +package duke; + +import duke.task.Task; + +import java.util.ArrayList; + +public class TaskList { + public ArrayList taskList = new ArrayList<>(); + + public void addTask(Task t){ + taskList.add(t); + } + + public Task deleteTask(int idx){ + Task t = taskList.get(idx); + taskList.remove(idx); + return t; + } + + public Task doneTask(int idx){ + taskList.get(idx).doTask(); + return taskList.get(idx); + } + + public int size(){ + return taskList.size(); + } +} diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java new file mode 100644 index 00000000..f174297f --- /dev/null +++ b/src/main/java/duke/Ui.java @@ -0,0 +1,80 @@ +package duke; + +import duke.task.Task; + +import java.util.Scanner; + +public class Ui { + + public void showLine(){ + System.out.println(" -----------------------------------------------"); + } + + public String readReq(){ + Scanner sc = new Scanner(System.in); + return sc.nextLine(); + } + + public void showReq(String req){ + System.out.println(req + "\n"); + showLine(); + } + + public void showAdd(TaskList tasks, Task task){ + System.out.println(" Got it. I've added this task:"); + System.out.print(" "); + task.showTask(); + System.out.println(" Now you have " + tasks.size() + " tasks in the list."); + System.out.println(); + showLine(); + } + + public void showDelete(TaskList tasks, Task task){ + System.out.println(" Noted! I've removed this task:"); + System.out.print(" "); + task.showTask(); + System.out.println(" Now you have " + tasks.size() + " tasks in the list."); + System.out.println(); + showLine(); + } + + public void showDone(Task task){ + System.out.println(" Nice! I've marked this task as done:"); + System.out.print(" "); + task.showTask(); + System.out.println(); + showLine(); + } + + public void showList(TaskList tasks){ + System.out.println(" Here are the tasks in your list:"); + for(int i = 0; i < tasks.size(); i++){ + System.out.print(" " + (i + 1) + "."); + tasks.taskList.get(i).showTask(); + } + System.out.println(); + showLine(); + } + + public void showExit(){ + System.out.println(" Bye.Hope to see you again soon!\n"); + showLine(); + } + + public void showLoadException(){ + System.out.println("No data can be loaded! "); + System.out.println(); + } + + public void showStoreException(){ + System.out.println("There may be a problem with the storage! "); + System.out.println(); + } + + public void showException(Exception e, String req){ + showReq(req); + System.out.println(" " + e.getMessage()); + System.out.println(); + showLine(); + } +} diff --git a/src/main/java/duke/command/AddCommand.java b/src/main/java/duke/command/AddCommand.java new file mode 100644 index 00000000..2a1d2757 --- /dev/null +++ b/src/main/java/duke/command/AddCommand.java @@ -0,0 +1,26 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; +import duke.task.Task; + +import java.io.IOException; + +public class AddCommand extends Command{ + public AddCommand(String req, Task task){ + this.task = task; + this.req = req; + } + + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + ui.showReq(req); + tasks.addTask(task); + ui.showAdd(tasks, task); + storage.store(tasks); + } + + public boolean isExit(){ + return false; + } +} diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java new file mode 100644 index 00000000..69cb9fbf --- /dev/null +++ b/src/main/java/duke/command/Command.java @@ -0,0 +1,20 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; +import duke.task.Task; + +import java.io.IOException; + +public abstract class Command { + public Task task; + + public int idx; + + public String req; + + public abstract void execute(TaskList tasks, Ui ui, Storage storage) throws IOException; + + public abstract boolean isExit(); +} diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java new file mode 100644 index 00000000..1367e7d3 --- /dev/null +++ b/src/main/java/duke/command/DeleteCommand.java @@ -0,0 +1,27 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; +import duke.task.Task; + +import java.io.IOException; + +public class DeleteCommand extends Command{ + + public DeleteCommand(String req, int idx){ + this.idx = idx; + this.req = req; + } + + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + ui.showReq(req); + Task t = tasks.deleteTask(idx); + ui.showDelete(tasks, t); + storage.store(tasks); + } + + public boolean isExit(){ + return false; + } +} diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java new file mode 100644 index 00000000..cc6f6cf2 --- /dev/null +++ b/src/main/java/duke/command/DoneCommand.java @@ -0,0 +1,27 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; +import duke.task.Task; + +import java.io.IOException; + +public class DoneCommand extends Command{ + + public DoneCommand(String req, int idx){ + this.idx = idx; + this.req = req; + } + + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + ui.showReq(req); + Task t = tasks.doneTask(idx); + ui.showDone(t); + storage.store(tasks); + } + + public boolean isExit(){ + return false; + } +} diff --git a/src/main/java/duke/command/ExitCommand.java b/src/main/java/duke/command/ExitCommand.java new file mode 100644 index 00000000..373704be --- /dev/null +++ b/src/main/java/duke/command/ExitCommand.java @@ -0,0 +1,21 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; + +public class ExitCommand extends Command{ + + public ExitCommand(String req){ + this.req = req; + } + + public void execute(TaskList tasks, Ui ui, Storage storage){ + ui.showReq(req); + ui.showExit(); + } + + public boolean isExit(){ + return true; + } +} diff --git a/src/main/java/duke/command/ListCommand.java b/src/main/java/duke/command/ListCommand.java new file mode 100644 index 00000000..85617415 --- /dev/null +++ b/src/main/java/duke/command/ListCommand.java @@ -0,0 +1,21 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; + +public class ListCommand extends Command{ + + public ListCommand(String req){ + this.req = req; + } + + public void execute(TaskList tasks, Ui ui, Storage storage){ + ui.showReq(req); + ui.showList(tasks); + } + + public boolean isExit(){ + return false; + } +} diff --git a/src/main/java/InvalidException.java b/src/main/java/duke/exception/InvalidException.java similarity index 73% rename from src/main/java/InvalidException.java rename to src/main/java/duke/exception/InvalidException.java index 2202fadf..47ea89ce 100644 --- a/src/main/java/InvalidException.java +++ b/src/main/java/duke/exception/InvalidException.java @@ -1,6 +1,9 @@ +package duke.exception; + public class InvalidException extends Exception{ + public InvalidException(){} public String getMessage(){ return "☹ OOPS!!! I'm sorry, but I don't know what that means :-("; } -} \ No newline at end of file +} diff --git a/src/main/java/MissReqException.java b/src/main/java/duke/exception/MissReqException.java similarity index 77% rename from src/main/java/MissReqException.java rename to src/main/java/duke/exception/MissReqException.java index d328636b..a1a45414 100644 --- a/src/main/java/MissReqException.java +++ b/src/main/java/duke/exception/MissReqException.java @@ -1,10 +1,12 @@ +package duke.exception; + public class MissReqException extends Exception{ String message; - MissReqException(String req){ + public MissReqException(String req){ message = String.format("☹ OOPS!!! The description of a %s cannot be empty.", req); } public String getMessage(){ return message; } -} \ No newline at end of file +} diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java new file mode 100644 index 00000000..ef6ca2ec --- /dev/null +++ b/src/main/java/duke/task/Deadline.java @@ -0,0 +1,29 @@ +package duke.task; + +public class Deadline extends Task{ + String by; + + public Deadline(String description, String by){ + super(description); + this.by = by; + type = Types.DEADLINE; + } + + public Deadline(boolean isDone, String description, String by){ + super(description); + this.by = by; + this.isDone = isDone; + type = Types.DEADLINE; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[D][" + mark + "] " + description + " (by: " + by + ")"); + } + + public String toStoreString(){ + int state = isDone ? 1 : 0; + return 'D' + " | " + state + " | " + description + " | " + by + System.lineSeparator(); + } + +} diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java new file mode 100644 index 00000000..c5c0e96d --- /dev/null +++ b/src/main/java/duke/task/Event.java @@ -0,0 +1,28 @@ +package duke.task; + +public class Event extends Task{ + String at; + + public Event(String description, String at){ + super(description); + this.at = at; + type = Types.EVENT; + } + + public Event(boolean isDone, String description, String at){ + super(description); + this.at = at; + this.isDone = isDone; + type = Types.EVENT; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[E][" + mark + "] " + description + " (at: " + at + ")"); + } + + public String toStoreString(){ + int state = isDone ? 1 : 0; + return 'E' + " | " + state + " | " + description + " | " + at + System.lineSeparator(); + } +} diff --git a/src/main/java/Task.java b/src/main/java/duke/task/Task.java similarity index 66% rename from src/main/java/Task.java rename to src/main/java/duke/task/Task.java index 56746b75..a7a77d0e 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,4 +1,6 @@ -public class Task { +package duke.task; + +public abstract class Task { String description; boolean isDone; Types type; @@ -9,9 +11,11 @@ public Task(String description){ type = Types.UNKNOWN; } - public void showTask(){} + public abstract void showTask(); public void doTask(){ this.isDone = true; } -} \ No newline at end of file + + public abstract String toStoreString(); +} diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java new file mode 100644 index 00000000..db751349 --- /dev/null +++ b/src/main/java/duke/task/Todo.java @@ -0,0 +1,25 @@ +package duke.task; + +public class Todo extends Task{ + + public Todo(String description){ + super(description); + type = Types.TODO; + } + + public Todo(boolean isDone, String description){ + super(description); + this.isDone = isDone; + type = Types.TODO; + } + + public void showTask(){ + String mark = isDone ? "X" : " "; + System.out.println("[T][" + mark + "] " + description); + } + + public String toStoreString(){ + int state = isDone ? 1 : 0; + return 'T' + " | " + state + " | " + description + System.lineSeparator(); + } +} diff --git a/src/main/java/Types.java b/src/main/java/duke/task/Types.java similarity index 74% rename from src/main/java/Types.java rename to src/main/java/duke/task/Types.java index d62d21a1..3718114f 100644 --- a/src/main/java/Types.java +++ b/src/main/java/duke/task/Types.java @@ -1,3 +1,5 @@ +package duke.task; + public enum Types { TODO, EVENT, DEADLINE, UNKNOWN } diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 08737446..62752b88 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -15,7 +15,7 @@ IF ERRORLEVEL 1 ( REM no error here, errorlevel == 0 REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ..\bin Duke < input.txt > ACTUAL.TXT +java -classpath ..\bin duke.Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From 38b97167bfd8de77b77b9f7bb59d398beb437ad9 Mon Sep 17 00:00:00 2001 From: "Damith C. Rajapakse" Date: Tue, 12 Oct 2021 17:02:55 +0800 Subject: [PATCH 08/12] Add license info --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8715d4d9..d4047fc1 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,4 @@ Prerequisites: JDK 11, update Intellij to the most recent version. | |_| | |_| | < __/ |____/ \__,_|_|\_\___| ``` +4. Duke is released under an MIT license. From 8469194969b7fb8dd1f726e12cf9097fc39c74a8 Mon Sep 17 00:00:00 2001 From: "Damith C. Rajapakse" Date: Tue, 12 Oct 2021 17:04:47 +0800 Subject: [PATCH 09/12] Mention se-education.org --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8715d4d9..1347ae67 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,4 @@ Prerequisites: JDK 11, update Intellij to the most recent version. | |_| | |_| | < __/ |____/ \__,_|_|\_\___| ``` +4. Duke is part of https://se-education.org From ce6de8249a5a86f3e92afe422970fcef354703ee Mon Sep 17 00:00:00 2001 From: L Date: Sat, 16 Oct 2021 14:02:15 +0800 Subject: [PATCH 10/12] level 8 --- data/duke.txt | 3 ++- src/main/java/duke/DateFun.java | 25 +++++++++++++++++++ src/main/java/duke/Parser.java | 14 +++++++++++ src/main/java/duke/Storage.java | 14 +++++++++++ src/main/java/duke/task/Deadline.java | 31 ++++++++++++++++++++++-- src/main/java/duke/task/Event.java | 16 ++++++++++-- src/main/java/duke/test/DateFunTest.java | 19 +++++++++++++++ src/main/java/duke/test/ParseTest.java | 15 ++++++++++++ 8 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 src/main/java/duke/DateFun.java create mode 100644 src/main/java/duke/test/DateFunTest.java create mode 100644 src/main/java/duke/test/ParseTest.java diff --git a/data/duke.txt b/data/duke.txt index 3ecf41bc..111801de 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1 +1,2 @@ -E | 0 | go school | 7:00am +E | 0 | hhh | 2020-10-25 - 2020-10-16 +D | 0 | aaa | 2020-10-16 diff --git a/src/main/java/duke/DateFun.java b/src/main/java/duke/DateFun.java new file mode 100644 index 00000000..c1ecd650 --- /dev/null +++ b/src/main/java/duke/DateFun.java @@ -0,0 +1,25 @@ +package duke; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +public class DateFun { + + public static LocalDate stringToLocalDate(String timeStr){ + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate date = LocalDate.parse(timeStr, fmt); + return date; + } + + /** + * data convert to string + * @param date + * @return data string + */ + public static String LocalDateToString(LocalDate date){ + DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM dd yyyy"); + return date.format(fmt); + } + +} \ No newline at end of file diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index ed26fb1a..54b0a842 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -9,6 +9,13 @@ import duke.task.Todo; public class Parser { + /** + * + * @param req Extract task from command + * @return a task object + * @throws MissReqException + * @throws InvalidException + */ public static Task getTask(String req) throws MissReqException, InvalidException { String[] reqs = req.trim().split(" "); String type = reqs[0]; @@ -40,6 +47,13 @@ public static Task getTask(String req) throws MissReqException, InvalidException } } + /** + * Extract command + * @param req + * @return + * @throws MissReqException + * @throws InvalidException + */ public static Command parse(String req) throws MissReqException, InvalidException { Command command; String[] reqs = req.split(" "); diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index df2e8ef2..67973e3a 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -14,11 +14,20 @@ public class Storage { public String filepath; + /** + * storage constructor + * @param filepath the address of file path + */ public Storage(String filepath){ this.filepath = filepath; } + /** + * store the task list to selected file + * @param tasks + * @throws IOException + */ public void store(TaskList tasks) throws IOException { File file = new File(filepath); @@ -37,6 +46,11 @@ public void store(TaskList tasks) throws IOException { } + /** + * load task list from selected file + * @return + * @throws FileNotFoundException + */ public TaskList load() throws FileNotFoundException { TaskList tasks = new TaskList(); File file = new File(filepath); diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index ef6ca2ec..cee8c32f 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,29 +1,56 @@ package duke.task; +import duke.DateFun; + +import java.time.LocalDate; + public class Deadline extends Task{ String by; + LocalDate deadLineDate; + + /** + * Deadline constructor + * @param description + * @param by deadline date. + */ public Deadline(String description, String by){ super(description); this.by = by; + deadLineDate = DateFun.stringToLocalDate(by); type = Types.DEADLINE; } + /** + * + * @param isDone status + * @param description + * @param by + */ + public Deadline(boolean isDone, String description, String by){ super(description); this.by = by; this.isDone = isDone; + deadLineDate = DateFun.stringToLocalDate(by); type = Types.DEADLINE; } + /** + * print deardline task + */ public void showTask(){ String mark = isDone ? "X" : " "; - System.out.println("[D][" + mark + "] " + description + " (by: " + by + ")"); + System.out.println("[D][" + mark + "] " + description + " (by: " + DateFun.LocalDateToString(deadLineDate) + ")"); } + /** + * convert deadline to string + * @return a string + */ public String toStoreString(){ int state = isDone ? 1 : 0; return 'D' + " | " + state + " | " + description + " | " + by + System.lineSeparator(); } -} +} \ No newline at end of file diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index c5c0e96d..cfcd5738 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,11 +1,20 @@ package duke.task; +import duke.DateFun; + +import java.time.LocalDate; + public class Event extends Task{ String at; + LocalDate begin; + LocalDate end; public Event(String description, String at){ super(description); this.at = at; + String[] dateStr = at.split(" - "); + begin = DateFun.stringToLocalDate(dateStr[0]); + end = DateFun.stringToLocalDate(dateStr[1]); type = Types.EVENT; } @@ -13,16 +22,19 @@ public Event(boolean isDone, String description, String at){ super(description); this.at = at; this.isDone = isDone; + String[] dateStr = at.split(" - "); + begin = DateFun.stringToLocalDate(dateStr[0]); + end = DateFun.stringToLocalDate(dateStr[1]); type = Types.EVENT; } public void showTask(){ String mark = isDone ? "X" : " "; - System.out.println("[E][" + mark + "] " + description + " (at: " + at + ")"); + System.out.println("[E][" + mark + "] " + description + " (at: " + DateFun.LocalDateToString(begin) + " - " + DateFun.LocalDateToString(end) + ")"); } public String toStoreString(){ int state = isDone ? 1 : 0; return 'E' + " | " + state + " | " + description + " | " + at + System.lineSeparator(); } -} +} \ No newline at end of file diff --git a/src/main/java/duke/test/DateFunTest.java b/src/main/java/duke/test/DateFunTest.java new file mode 100644 index 00000000..72477903 --- /dev/null +++ b/src/main/java/duke/test/DateFunTest.java @@ -0,0 +1,19 @@ +package duke.test; +import duke.DateFun; +import java.time.LocalDate; +import org.junit.Test; +import static org.junit.Assert.*; +public class DateFunTest { + + @Test + public void stringToLocalDateTest(){ + assertEquals(LocalDate.of(2021, 10, 14), DateFun.stringToLocalDate("2021-10-14")); + assertEquals(LocalDate.of(2021, 11, 15), DateFun.stringToLocalDate("2021-11-15")); + } + + @Test + public void LocalDateToStringTest(){ + assertEquals("Oct 11 2000", DateFun.LocalDateToString(LocalDate.of(2000, 10, 11))); + assertEquals("Jan 31 2021", DateFun.LocalDateToString(LocalDate.of(2021, 1, 31))); + } +} \ No newline at end of file diff --git a/src/main/java/duke/test/ParseTest.java b/src/main/java/duke/test/ParseTest.java new file mode 100644 index 00000000..2ce84505 --- /dev/null +++ b/src/main/java/duke/test/ParseTest.java @@ -0,0 +1,15 @@ +package duke.test; +import duke.Parser; +import duke.command.DeleteCommand; +import duke.exception.InvalidException; +import duke.exception.MissReqException; +import org.junit.Test; +import static org.junit.Assert.*; +public class ParseTest { + @Test + public void parseTest() throws MissReqException, InvalidException { + assertEquals(0, Parser.parse("delete 1").idx); + assertEquals("delete 1", Parser.parse("delete 1").req); + assertEquals("list", Parser.parse("list").req); + } +} \ No newline at end of file From 9e805a5dc6534263fcb5acbbc12c4186a58e49aa Mon Sep 17 00:00:00 2001 From: L Date: Wed, 27 Oct 2021 13:25:43 +0800 Subject: [PATCH 11/12] level 9,A-Codingstandard,A-CodeQuality,C-BetterSearch --- src/main/java/duke/Parser.java | 18 ++++++++----- src/main/java/duke/TaskList.java | 10 +++++++ src/main/java/duke/Ui.java | 10 +++++++ src/main/java/duke/command/AddCommand.java | 2 ++ src/main/java/duke/command/Command.java | 5 ---- src/main/java/duke/command/DeleteCommand.java | 1 + src/main/java/duke/command/DoneCommand.java | 1 + src/main/java/duke/command/FindCommand.java | 26 +++++++++++++++++++ src/main/java/duke/task/Task.java | 11 ++++++++ src/main/java/duke/test/ParseTest.java | 4 +-- 10 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 src/main/java/duke/command/FindCommand.java diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 54b0a842..b043bb64 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -55,23 +55,27 @@ public static Task getTask(String req) throws MissReqException, InvalidException * @throws InvalidException */ public static Command parse(String req) throws MissReqException, InvalidException { - Command command; String[] reqs = req.split(" "); if(req.equals("bye")){ return new ExitCommand(req); } - else if (reqs[0].equals("list")) { + if(reqs[0].equals("list")) { return new ListCommand(req); - } else if (reqs[0].equals("done")) { + } + if(reqs[0].equals("done")) { int idx = Integer.parseInt(req.substring(4).trim()) - 1; return new DoneCommand(req, idx); - } else if (reqs[0].equals("delete")) { + } + if(reqs[0].equals("delete")) { int idx = Integer.parseInt(reqs[1]) - 1; return new DeleteCommand(req, idx); - } else { - Task task = getTask(req); - return new AddCommand(req, task); } + if(reqs[0].equals("find")){ + String search = reqs[1]; + return new FindCommand(req, search); + } + Task task = getTask(req); + return new AddCommand(req, task); } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 73f1692b..b91c4305 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -25,4 +25,14 @@ public Task doneTask(int idx){ public int size(){ return taskList.size(); } + + public TaskList find(String search){ + TaskList tl = new TaskList(); + for(Task task: taskList){ + if(task.containInfo(search)){ + tl.addTask(task); + } + } + return tl; + } } diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index f174297f..a6619d94 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -61,6 +61,16 @@ public void showExit(){ showLine(); } + public void showFind(TaskList tasks){ + System.out.println(" Here are the matching tasks in your list:"); + for(int i = 0; i < tasks.size(); i++){ + System.out.print(" " + (i + 1) + "."); + tasks.taskList.get(i).showTask(); + } + System.out.println(); + showLine(); + } + public void showLoadException(){ System.out.println("No data can be loaded! "); System.out.println(); diff --git a/src/main/java/duke/command/AddCommand.java b/src/main/java/duke/command/AddCommand.java index 2a1d2757..651e4868 100644 --- a/src/main/java/duke/command/AddCommand.java +++ b/src/main/java/duke/command/AddCommand.java @@ -8,6 +8,8 @@ import java.io.IOException; public class AddCommand extends Command{ + public Task task; + public AddCommand(String req, Task task){ this.task = task; this.req = req; diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 69cb9fbf..6f8d0c12 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -3,15 +3,10 @@ import duke.Storage; import duke.TaskList; import duke.Ui; -import duke.task.Task; import java.io.IOException; public abstract class Command { - public Task task; - - public int idx; - public String req; public abstract void execute(TaskList tasks, Ui ui, Storage storage) throws IOException; diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index 1367e7d3..99dd7235 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -8,6 +8,7 @@ import java.io.IOException; public class DeleteCommand extends Command{ + public int idx; public DeleteCommand(String req, int idx){ this.idx = idx; diff --git a/src/main/java/duke/command/DoneCommand.java b/src/main/java/duke/command/DoneCommand.java index cc6f6cf2..a9d868d0 100644 --- a/src/main/java/duke/command/DoneCommand.java +++ b/src/main/java/duke/command/DoneCommand.java @@ -8,6 +8,7 @@ import java.io.IOException; public class DoneCommand extends Command{ + public int idx; public DoneCommand(String req, int idx){ this.idx = idx; diff --git a/src/main/java/duke/command/FindCommand.java b/src/main/java/duke/command/FindCommand.java new file mode 100644 index 00000000..0e8257e1 --- /dev/null +++ b/src/main/java/duke/command/FindCommand.java @@ -0,0 +1,26 @@ +package duke.command; + +import duke.Storage; +import duke.TaskList; +import duke.Ui; + +import java.io.IOException; + +public class FindCommand extends Command{ + public String search; + + public FindCommand(String req, String search){ + this.req = req; + this.search = search; + } + + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + ui.showReq(req); + TaskList tl = tasks.find(search); + ui.showFind(tl); + } + + public boolean isExit(){ + return false; + } +} diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index a7a77d0e..143db1b8 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -18,4 +18,15 @@ public void doTask(){ } public abstract String toStoreString(); + + public boolean containInfo(String info){ + double match = 0.6; + int minSize = (int)Math.ceil(info.length() * match); + for(int i = 0; i < info.length() - minSize + 1; i++){ + if(description.contains(info.substring(i, i + minSize))){ + return true; + } + } + return false; + } } diff --git a/src/main/java/duke/test/ParseTest.java b/src/main/java/duke/test/ParseTest.java index 2ce84505..aeb3b80a 100644 --- a/src/main/java/duke/test/ParseTest.java +++ b/src/main/java/duke/test/ParseTest.java @@ -8,8 +8,8 @@ public class ParseTest { @Test public void parseTest() throws MissReqException, InvalidException { - assertEquals(0, Parser.parse("delete 1").idx); + assertEquals(0, ((DeleteCommand)Parser.parse("delete 1")).idx); assertEquals("delete 1", Parser.parse("delete 1").req); assertEquals("list", Parser.parse("list").req); } -} \ No newline at end of file +} From b53902a42283e32a54fcac04beb1bb4506c425dd Mon Sep 17 00:00:00 2001 From: L Date: Sat, 6 Nov 2021 13:32:55 +0800 Subject: [PATCH 12/12] -Jar -Assertions --- data/duke.txt | 6 ++++-- src/main/java/META-INF/MANIFEST.MF | 3 +++ src/main/java/duke/DateFun.java | 6 +++--- src/main/java/duke/Parser.java | 11 +++++++++-- src/main/java/duke/Storage.java | 2 +- 5 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/data/duke.txt b/data/duke.txt index 111801de..766ec201 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,2 +1,4 @@ -E | 0 | hhh | 2020-10-25 - 2020-10-16 -D | 0 | aaa | 2020-10-16 +E | 1 | read book | 2021-10-11 - 2021-10-13 +D | 0 | return book | 2021-10-14 +T | 0 | sporting +D | 0 | sporting | 2021-11-13 diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 00000000..2c9a9745 --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: duke.Duke + diff --git a/src/main/java/duke/DateFun.java b/src/main/java/duke/DateFun.java index c1ecd650..be025009 100644 --- a/src/main/java/duke/DateFun.java +++ b/src/main/java/duke/DateFun.java @@ -13,9 +13,9 @@ public static LocalDate stringToLocalDate(String timeStr){ } /** - * data convert to string - * @param date - * @return data string + * date convert to string + * @param date: a LocalDate variable + * @return a string which shows date */ public static String LocalDateToString(LocalDate date){ DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMM dd yyyy"); diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index b043bb64..62d2ddfd 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -20,6 +20,7 @@ public static Task getTask(String req) throws MissReqException, InvalidException String[] reqs = req.trim().split(" "); String type = reqs[0]; String description; + assert reqs.length > 1 : "invalid input"; if(type.equals("todo")){ if(reqs.length == 1){ throw new MissReqException("todo"); @@ -31,6 +32,7 @@ public static Task getTask(String req) throws MissReqException, InvalidException throw new MissReqException("deadline"); } String[] descriptions = req.replaceFirst("deadline", "").trim().split("/by "); + assert descriptions.length == 2: "invalid input"; description = descriptions[0].trim(); String by = descriptions[1]; return new Deadline(description, by); @@ -39,6 +41,7 @@ public static Task getTask(String req) throws MissReqException, InvalidException throw new MissReqException("event"); } String[] descriptions = req.replaceFirst("event", "").trim().split("/at "); + assert descriptions.length == 2: "invalid input"; description = descriptions[0].trim(); String at = descriptions[1]; return new Event(description, at); @@ -49,8 +52,8 @@ public static Task getTask(String req) throws MissReqException, InvalidException /** * Extract command - * @param req - * @return + * @param req the command input of user + * @return Variable of Command * @throws MissReqException * @throws InvalidException */ @@ -60,17 +63,21 @@ public static Command parse(String req) throws MissReqException, InvalidExceptio return new ExitCommand(req); } if(reqs[0].equals("list")) { + assert reqs.length == 1: "invalid input"; return new ListCommand(req); } if(reqs[0].equals("done")) { + assert reqs.length == 2: "invalid input"; int idx = Integer.parseInt(req.substring(4).trim()) - 1; return new DoneCommand(req, idx); } if(reqs[0].equals("delete")) { + assert reqs.length == 2: "invalid input"; int idx = Integer.parseInt(reqs[1]) - 1; return new DeleteCommand(req, idx); } if(reqs[0].equals("find")){ + assert reqs.length > 1: "invalid input"; String search = reqs[1]; return new FindCommand(req, search); } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 67973e3a..a8e2597d 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -48,7 +48,7 @@ public void store(TaskList tasks) throws IOException { /** * load task list from selected file - * @return + * @return task List from selected file * @throws FileNotFoundException */ public TaskList load() throws FileNotFoundException {