From 556af3f47a96b32898ab4cdbd65b16486a4871e8 Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/35] Add Gradle support --- build.gradle | 41 +++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 332 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..885198fcfa --- /dev/null +++ b/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'java' + id 'application' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From 98b0b8bef5ba20a44fac405f13486cd638bd0bde Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Thu, 19 Jan 2023 22:25:07 +0800 Subject: [PATCH 02/35] Level 1 complete --- src/main/java/Duke.java | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334cc..67a9952bc1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,45 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { + begin(); + + Scanner scanner = new Scanner(System.in); + String input = scanner.nextLine(); + + while (!input.equals("bye")) { + execute(input); + input = scanner.nextLine(); //ready for next input + } + + bye(); + } + + private static void begin() { + endCommand(); + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + System.out.println("What can I do for you?"); + + endCommand(); + } + + private static void endCommand() { + System.out.println("____________________________________________________________"); + } + + private static void execute(String command) { + System.out.println(command); + endCommand(); + } + + private static void bye() { + System.out.println("Bye. Hope to see you again soon!"); + endCommand(); } } From b286d4138d7255741d12aae7cabc7221d6892873 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Thu, 19 Jan 2023 23:19:44 +0800 Subject: [PATCH 03/35] Level 2 complete --- src/main/java/ChatBot.java | 2 ++ src/main/java/TodoList.java | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/main/java/ChatBot.java create mode 100644 src/main/java/TodoList.java diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java new file mode 100644 index 0000000000..0321691f96 --- /dev/null +++ b/src/main/java/ChatBot.java @@ -0,0 +1,2 @@ +package PACKAGE_NAME;public class ChatBot { +} diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java new file mode 100644 index 0000000000..3e858f8001 --- /dev/null +++ b/src/main/java/TodoList.java @@ -0,0 +1,2 @@ +package PACKAGE_NAME;public class TodoList { +} From 29e0afb062e8be69c2d5d6832a3a96fe3f3a30ad Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Thu, 19 Jan 2023 23:23:31 +0800 Subject: [PATCH 04/35] Level 2 complete --- src/main/java/ChatBot.java | 18 +++++++++++++++++- src/main/java/Duke.java | 13 +++++++------ src/main/java/TodoList.java | 22 +++++++++++++++++++++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java index 0321691f96..9abe4045e4 100644 --- a/src/main/java/ChatBot.java +++ b/src/main/java/ChatBot.java @@ -1,2 +1,18 @@ -package PACKAGE_NAME;public class ChatBot { +public class ChatBot { + TodoList todoList; + + public ChatBot(TodoList todoList) { + this.todoList = todoList; + } + + public void execute(String command) { + if (command.equals("list")) { + String shown_list = todoList.toString(); + System.out.println(shown_list); + } else { + todoList.add(command); + System.out.println("added: " + command); + } + } + } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 67a9952bc1..932f61c36a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,13 +2,19 @@ public class Duke { public static void main(String[] args) { + + begin(); + TodoList todoList = new TodoList(); + ChatBot bot = new ChatBot(todoList); + Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); while (!input.equals("bye")) { - execute(input); + bot.execute(input); + endCommand(); input = scanner.nextLine(); //ready for next input } @@ -33,11 +39,6 @@ private static void endCommand() { System.out.println("____________________________________________________________"); } - private static void execute(String command) { - System.out.println(command); - endCommand(); - } - private static void bye() { System.out.println("Bye. Hope to see you again soon!"); endCommand(); diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index 3e858f8001..4381780e30 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -1,2 +1,22 @@ -package PACKAGE_NAME;public class TodoList { +import java.util.ArrayList; + +public class TodoList { + ArrayList todo_list; + public TodoList() { + this.todo_list = new ArrayList<>(100); + } + + public void add(String task) { + todo_list.add(task); + } + + @Override + public String toString() { + String shown_list = ""; + int todo_list_length = todo_list.size(); + for (int i = 1; i <= todo_list_length; i++) { + shown_list += String.format("%d. %s\n", i, todo_list.get(i-1)); + } + return shown_list; + } } From 1f85f96ae9013f82f91dab9d3cc4f6b9d145f8a7 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 20 Jan 2023 00:02:37 +0800 Subject: [PATCH 05/35] Level 3 complete --- src/main/java/ChatBot.java | 12 +++++++++++- src/main/java/TodoList.java | 27 ++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java index 9abe4045e4..75e2a198b5 100644 --- a/src/main/java/ChatBot.java +++ b/src/main/java/ChatBot.java @@ -9,7 +9,17 @@ public void execute(String command) { if (command.equals("list")) { String shown_list = todoList.toString(); System.out.println(shown_list); - } else { + } + else if (Character.isDigit(command.charAt(command.length() - 1))) { + String[] input = command.split(" "); + int digit = Integer.parseInt(input[1]); + if (input[0].equals("mark")) { + todoList.mark(digit); + } else { + todoList.unmark(digit); + } + } + else { todoList.add(command); System.out.println("added: " + command); } diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index 4381780e30..67ed4236ea 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -2,12 +2,36 @@ public class TodoList { ArrayList todo_list; + ArrayList mark_list; + public TodoList() { this.todo_list = new ArrayList<>(100); + this.mark_list = new ArrayList<>(100); } public void add(String task) { todo_list.add(task); + mark_list.add(" "); + } + + public void mark(int index) { + int todo_list_length = todo_list.size(); + if (index < 0 || index >= todo_list_length) { + return; + } + mark_list.set(index - 1, "X"); + System.out.println("Nice! I've marked this task as done:"); + System.out.println(String.format("[X] %s\n", todo_list.get(index-1))); + } + + public void unmark(int index) { + int todo_list_length = todo_list.size(); + if (index < 0 || index >= todo_list_length) { + return; + } + mark_list.set(index - 1, " "); + System.out.println("OK, I've marked this task as not done yet:"); + System.out.println(String.format("[ ] %s\n", todo_list.get(index-1))); } @Override @@ -15,7 +39,8 @@ public String toString() { String shown_list = ""; int todo_list_length = todo_list.size(); for (int i = 1; i <= todo_list_length; i++) { - shown_list += String.format("%d. %s\n", i, todo_list.get(i-1)); + String marked = mark_list.get(i - 1); + shown_list += String.format("%d.[" + marked +"] %s\n", i, todo_list.get(i-1)); } return shown_list; } From 0e983da6834b2a44a00a48da0a7e2917b0068a50 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 20 Jan 2023 14:34:14 +0800 Subject: [PATCH 06/35] Level 4 complete --- src/main/java/ChatBot.java | 26 +++++----- src/main/java/Duke.java | 2 +- src/main/java/Task.java | 99 +++++++++++++++++++++++++++++++++++++ src/main/java/TodoList.java | 34 +++++++------ 4 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java index 75e2a198b5..31c04e30a9 100644 --- a/src/main/java/ChatBot.java +++ b/src/main/java/ChatBot.java @@ -1,27 +1,29 @@ public class ChatBot { - TodoList todoList; + private TodoList todoList; public ChatBot(TodoList todoList) { this.todoList = todoList; } public void execute(String command) { - if (command.equals("list")) { + String[] split_command = command.split(" ", 2); + String instruction = split_command[0]; + if (instruction.equals("list")) { String shown_list = todoList.toString(); System.out.println(shown_list); } - else if (Character.isDigit(command.charAt(command.length() - 1))) { - String[] input = command.split(" "); - int digit = Integer.parseInt(input[1]); - if (input[0].equals("mark")) { - todoList.mark(digit); - } else { - todoList.unmark(digit); - } + else if (instruction.equals("mark")) { + int digit = Integer.parseInt(split_command[1]); + todoList.mark(digit); + } + else if (instruction.equals("unmark")) { + int digit = Integer.parseInt(split_command[1]); + todoList.unmark(digit); } else { - todoList.add(command); - System.out.println("added: " + command); + System.out.println("Got it. I've added this task:"); + todoList.add(instruction, split_command[1]); + System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 932f61c36a..bdde4b1dda 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -17,7 +17,7 @@ public static void main(String[] args) { endCommand(); input = scanner.nextLine(); //ready for next input } - + scanner.close(); bye(); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..83540a21cc --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,99 @@ +public class Task { + private Boolean isDone; + + public Task() { + this.isDone = false; + } + + public Task createNewTask(String type, String task) { + if (type.equals("todo")) { + return todo(task); + } else if (type.equals("deadline")) { + return deadline(task); + } else if (type.equals("event")) { + return event(task); + } else { + System.out.println("unknown command! Please try again."); + return null; + } + } + + private Task todo(String task) { + Task todo_task = new Todo(task); + return todo_task; + } + + private Task deadline(String task) { + Task deadline_task = new Deadline(task); + return deadline_task; + } + + private Task event(String task) { + Task event_task = new Event(task); + return event_task; + } + + public void markTask() { + this.isDone = true; + } + + public void unmarkTask() { + this.isDone = false; + } + + + class Todo extends Task { + private String task; + + public Todo(String task) { + super(); + this.task = task; + } + + @Override + public String toString() { + String name = super.isDone ? "[T][X] " + task : "[T][ ] " + task; + return name; + } + } + + class Deadline extends Task { + private String task; + private String deadline; + + public Deadline(String task) { + super(); + String[] commands = task.split(" /by "); + this.task = commands[0]; + this.deadline = commands[1]; + } + + @Override + public String toString() { + String name = super.isDone ? "[D][X] " + task + " (by: " + this.deadline +")" : "[D][ ] " + task + " (by: " + this.deadline +")"; + return name; + } + } + + class Event extends Task { + private String task; + private String from; + private String to; + + public Event(String task) { + super(); + String[] commands = task.split(" /from "); + this.task = commands[0]; + String[] from_to_timeline = commands[1].split(" /to "); + this.from = from_to_timeline[0]; + this.to = from_to_timeline[1]; + } + + @Override + public String toString() { + String name = super.isDone ? "[E][X] " + task + " (from: " + this.from +" to: " + this.to + ")" + : "[E][ ] " + task + " (from: " + this.from +" to: " + this.to + ")"; + return name; + } + } +} diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index 67ed4236ea..74bf1ac084 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -1,37 +1,44 @@ import java.util.ArrayList; public class TodoList { - ArrayList todo_list; - ArrayList mark_list; + private ArrayList todo_list; public TodoList() { this.todo_list = new ArrayList<>(100); - this.mark_list = new ArrayList<>(100); } - public void add(String task) { - todo_list.add(task); - mark_list.add(" "); + public void add(String type, String task) { + Task taskObject = new Task(); + Task newTask = taskObject.createNewTask(type, task); + todo_list.add(newTask); + System.out.println(newTask); } public void mark(int index) { int todo_list_length = todo_list.size(); - if (index < 0 || index >= todo_list_length) { + if (index < 0 || index > todo_list_length) { return; } - mark_list.set(index - 1, "X"); + Task task = todo_list.get(index - 1); + task.markTask(); System.out.println("Nice! I've marked this task as done:"); - System.out.println(String.format("[X] %s\n", todo_list.get(index-1))); + System.out.println(todo_list.get(index-1)); } public void unmark(int index) { int todo_list_length = todo_list.size(); - if (index < 0 || index >= todo_list_length) { + if (index < 0 || index > todo_list_length) { return; } - mark_list.set(index - 1, " "); + Task task = todo_list.get(index - 1); + task.unmarkTask(); System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(String.format("[ ] %s\n", todo_list.get(index-1))); + System.out.println(todo_list.get(index-1)); + + } + + public int number_of_tasks() { + return todo_list.size(); } @Override @@ -39,8 +46,7 @@ public String toString() { String shown_list = ""; int todo_list_length = todo_list.size(); for (int i = 1; i <= todo_list_length; i++) { - String marked = mark_list.get(i - 1); - shown_list += String.format("%d.[" + marked +"] %s\n", i, todo_list.get(i-1)); + shown_list += String.format("%d. %s\n", i, todo_list.get(i-1)); } return shown_list; } From 9039f8e11a7a4b3c1da7dcc551b6797e9d726a77 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 20 Jan 2023 14:56:14 +0800 Subject: [PATCH 07/35] Level 5 complete --- src/main/java/Duke.java | 7 +---- text-ui-test/EXPECTED.TXT | 59 +++++++++++++++++++++++++++++++++++---- text-ui-test/input.txt | 13 +++++++++ 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index bdde4b1dda..4c68549456 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -24,12 +24,7 @@ public static void main(String[] args) { private static void begin() { endCommand(); - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + System.out.println("Hello from Duke"); System.out.println("What can I do for you?"); endCommand(); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e7..69ecb739f6 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,54 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| +____________________________________________________________ +Hello from Duke +What can I do for you? +____________________________________________________________ +Got it. I've added this task: +[T][ ] read book +Now I have 1 tasks in the list. +____________________________________________________________ +1. [T][ ] read book +____________________________________________________________ +Got it. I've added this task: +[D][ ] return book (by: Sunday 2pm) +Now I have 2 tasks in the list. +____________________________________________________________ +1. [T][ ] read book +2. [D][ ] return book (by: Sunday 2pm) + +____________________________________________________________ +Got it. I've added this task: +[E][ ] programming study (from: 5pm to: 9pm) +Now I have 3 tasks in the list. +____________________________________________________________ +1. [T][ ] read book +2. [D][ ] return book (by: Sunday 2pm) +3. [E][ ] programming study (from: 5pm to: 9pm) + +____________________________________________________________ +Nice! I've marked this task as done: +[T][X] read book +____________________________________________________________ +1. [T][X] read book +2. [D][ ] return book (by: Sunday 2pm) +3. [E][ ] programming study (from: 5pm to: 9pm) + +____________________________________________________________ +Nice! I've marked this task as done: +[D][X] return book (by: Sunday 2pm) +____________________________________________________________ +1. [T][X] read book +2. [D][X] return book (by: Sunday 2pm) +3. [E][ ] programming study (from: 5pm to: 9pm) + +____________________________________________________________ +OK, I've marked this task as not done yet: +[D][ ] return book (by: Sunday 2pm) +____________________________________________________________ +1. [T][X] read book +2. [D][ ] return book (by: Sunday 2pm) +3. [E][ ] programming study (from: 5pm to: 9pm) + +____________________________________________________________ +Bye. Hope to see you again soon! +____________________________________________________________ \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb2..b2abe8efc8 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,13 @@ +todo read book +list +deadline return book /by Sunday 2pm +list +event programming study /from 5pm /to 9pm +list +mark 1 +list +mark 2 +list +unmark 2 +list +bye \ No newline at end of file From 58c0f9536179791d368c4217ea2984be92d7b6f1 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 20 Jan 2023 20:41:56 +0800 Subject: [PATCH 08/35] Level 5 complete --- src/main/java/ChatBot.java | 51 ++++++++++++++++++++----------- src/main/java/Duke.java | 8 ++++- src/main/java/DukeExceptions.java | 10 ++++++ src/main/java/Task.java | 36 +++++++++------------- src/main/java/TodoList.java | 3 +- text-ui-test/EXPECTED.TXT | 24 ++++++++++++++- text-ui-test/input.txt | 8 +++++ 7 files changed, 99 insertions(+), 41 deletions(-) create mode 100644 src/main/java/DukeExceptions.java diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java index 31c04e30a9..2be63ed77f 100644 --- a/src/main/java/ChatBot.java +++ b/src/main/java/ChatBot.java @@ -1,30 +1,47 @@ public class ChatBot { private TodoList todoList; + private enum Instructions {todo, deadline, event, mark, unmark} public ChatBot(TodoList todoList) { this.todoList = todoList; } - public void execute(String command) { + public void execute(String command) throws DukeExceptions{ String[] split_command = command.split(" ", 2); String instruction = split_command[0]; + if (instruction.equals("list")) { - String shown_list = todoList.toString(); - System.out.println(shown_list); - } - else if (instruction.equals("mark")) { - int digit = Integer.parseInt(split_command[1]); - todoList.mark(digit); - } - else if (instruction.equals("unmark")) { - int digit = Integer.parseInt(split_command[1]); - todoList.unmark(digit); + if (split_command.length == 1) { + String shown_list = todoList.toString(); + System.out.println(shown_list); + return; + } + else { + throw new DukeExceptions("OOPS!!! The description of a list cannot have other parameters"); + } } - else { - System.out.println("Got it. I've added this task:"); - todoList.add(instruction, split_command[1]); - System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); - } - } + //check for valid instructions + for (Instructions validInstruction: Instructions.values()) { + if (validInstruction.name().equals(instruction)) { + if (split_command.length == 1) { + throw new DukeExceptions(String.format("OOPS!!! The description of a %s cannot be empty.", instruction)); + } + else if (instruction.equals("mark")) { + int digit = Integer.parseInt(split_command[1]); + todoList.mark(digit); + } + else if (instruction.equals("unmark")) { + int digit = Integer.parseInt(split_command[1]); + todoList.unmark(digit); + } + else { + todoList.add(instruction, split_command[1]); + System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + return; + } + } + } + throw new DukeExceptions("OOPS!!! I'm sorry, but I don't know what that means."); + } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4c68549456..cfa9cb27da 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,6 +1,8 @@ import java.util.Scanner; public class Duke { + + public static void main(String[] args) { @@ -13,7 +15,11 @@ public static void main(String[] args) { String input = scanner.nextLine(); while (!input.equals("bye")) { - bot.execute(input); + try { + bot.execute(input); + } catch (DukeExceptions error) { + System.out.println(error.getErrorMessage()); + } endCommand(); input = scanner.nextLine(); //ready for next input } diff --git a/src/main/java/DukeExceptions.java b/src/main/java/DukeExceptions.java new file mode 100644 index 0000000000..a3ae82537c --- /dev/null +++ b/src/main/java/DukeExceptions.java @@ -0,0 +1,10 @@ +public class DukeExceptions extends Exception{ + private String error; + public DukeExceptions(String error) { + this.error = error; + } + + public String getErrorMessage() { + return this.error; + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 83540a21cc..c0afdd56a4 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -5,34 +5,19 @@ public Task() { this.isDone = false; } - public Task createNewTask(String type, String task) { + public Task createNewTask(String type, String task) throws DukeExceptions{ if (type.equals("todo")) { - return todo(task); + return new Todo(task); } else if (type.equals("deadline")) { - return deadline(task); + return new Deadline(task); } else if (type.equals("event")) { - return event(task); + return new Event(task); } else { System.out.println("unknown command! Please try again."); return null; } } - private Task todo(String task) { - Task todo_task = new Todo(task); - return todo_task; - } - - private Task deadline(String task) { - Task deadline_task = new Deadline(task); - return deadline_task; - } - - private Task event(String task) { - Task event_task = new Event(task); - return event_task; - } - public void markTask() { this.isDone = true; } @@ -61,9 +46,12 @@ class Deadline extends Task { private String task; private String deadline; - public Deadline(String task) { + public Deadline(String task) throws DukeExceptions { super(); String[] commands = task.split(" /by "); + if (commands.length == 1) { + throw new DukeExceptions("OOPS!!! Looks like someone forget his/her deadline :)\n Please use /by to indicate deadline"); + } this.task = commands[0]; this.deadline = commands[1]; } @@ -80,11 +68,17 @@ class Event extends Task { private String from; private String to; - public Event(String task) { + public Event(String task) throws DukeExceptions { super(); String[] commands = task.split(" /from "); + if (commands.length == 1) { + throw new DukeExceptions("OOPS!!! Looks like someone forget when the event begins :)\n Please use /from to indicate begin time"); + } this.task = commands[0]; String[] from_to_timeline = commands[1].split(" /to "); + if (from_to_timeline.length == 1) { + throw new DukeExceptions("OOPS!!! Looks like someone forget when the event ends :)\n Please use /to to indicate end time"); + } this.from = from_to_timeline[0]; this.to = from_to_timeline[1]; } diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index 74bf1ac084..f48416d440 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -7,9 +7,10 @@ public TodoList() { this.todo_list = new ArrayList<>(100); } - public void add(String type, String task) { + public void add(String type, String task) throws DukeExceptions{ Task taskObject = new Task(); Task newTask = taskObject.createNewTask(type, task); + System.out.println("Got it. I've added this task:"); todo_list.add(newTask); System.out.println(newTask); } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 69ecb739f6..075bd499ed 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -2,12 +2,23 @@ ____________________________________________________________ Hello from Duke What can I do for you? ____________________________________________________________ +OOPS!!! I'm sorry, but I don't know what that means. +____________________________________________________________ +OOPS!!! The description of a todo cannot be empty. +____________________________________________________________ Got it. I've added this task: [T][ ] read book Now I have 1 tasks in the list. ____________________________________________________________ +OOPS!!! The description of a list cannot have other parameters +____________________________________________________________ 1. [T][ ] read book +____________________________________________________________ +OOPS!!! The description of a deadline cannot be empty. +____________________________________________________________ +OOPS!!! Looks like someone forget his/her deadline :) + Please use /by to indicate deadline ____________________________________________________________ Got it. I've added this task: [D][ ] return book (by: Sunday 2pm) @@ -16,6 +27,14 @@ ____________________________________________________________ 1. [T][ ] read book 2. [D][ ] return book (by: Sunday 2pm) +____________________________________________________________ +OOPS!!! The description of a event cannot be empty. +____________________________________________________________ +OOPS!!! Looks like someone forget when the event begins :) + Please use /from to indicate begin time +____________________________________________________________ +OOPS!!! Looks like someone forget when the event ends :) + Please use /to to indicate end time ____________________________________________________________ Got it. I've added this task: [E][ ] programming study (from: 5pm to: 9pm) @@ -28,6 +47,7 @@ ____________________________________________________________ ____________________________________________________________ Nice! I've marked this task as done: [T][X] read book +OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][ ] return book (by: Sunday 2pm) @@ -36,6 +56,7 @@ ____________________________________________________________ ____________________________________________________________ Nice! I've marked this task as done: [D][X] return book (by: Sunday 2pm) +OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][X] return book (by: Sunday 2pm) @@ -44,6 +65,7 @@ ____________________________________________________________ ____________________________________________________________ OK, I've marked this task as not done yet: [D][ ] return book (by: Sunday 2pm) +OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][ ] return book (by: Sunday 2pm) @@ -51,4 +73,4 @@ ____________________________________________________________ ____________________________________________________________ Bye. Hope to see you again soon! -____________________________________________________________ \ No newline at end of file +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index b2abe8efc8..f95da5acf3 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,7 +1,15 @@ +tola +todo todo read book +list appear list +deadline +deadline return book deadline return book /by Sunday 2pm list +event +event programming study +event programming study /from 5pm event programming study /from 5pm /to 9pm list mark 1 From 0c4a8000b3c43c45a539a988ce94da21993aae1c Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 20 Jan 2023 20:59:30 +0800 Subject: [PATCH 09/35] Level 6 complete --- src/main/java/ChatBot.java | 34 +++++++++++++++++++--------------- src/main/java/TodoList.java | 18 ++++++++++++++---- text-ui-test/EXPECTED.TXT | 20 +++++++++++++++++--- text-ui-test/input.txt | 5 +++++ 4 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/main/java/ChatBot.java b/src/main/java/ChatBot.java index 2be63ed77f..ce97b8697d 100644 --- a/src/main/java/ChatBot.java +++ b/src/main/java/ChatBot.java @@ -1,12 +1,13 @@ public class ChatBot { private TodoList todoList; - private enum Instructions {todo, deadline, event, mark, unmark} + + private enum Instructions {todo, deadline, event, mark, unmark, delete} public ChatBot(TodoList todoList) { this.todoList = todoList; } - public void execute(String command) throws DukeExceptions{ + public void execute(String command) throws DukeExceptions { String[] split_command = command.split(" ", 2); String instruction = split_command[0]; @@ -15,33 +16,36 @@ public void execute(String command) throws DukeExceptions{ String shown_list = todoList.toString(); System.out.println(shown_list); return; - } - else { + } else { throw new DukeExceptions("OOPS!!! The description of a list cannot have other parameters"); } } //check for valid instructions - for (Instructions validInstruction: Instructions.values()) { + for (Instructions validInstruction : Instructions.values()) { if (validInstruction.name().equals(instruction)) { if (split_command.length == 1) { throw new DukeExceptions(String.format("OOPS!!! The description of a %s cannot be empty.", instruction)); - } - else if (instruction.equals("mark")) { + } else if (instruction.equals("mark")) { int digit = Integer.parseInt(split_command[1]); todoList.mark(digit); - } - else if (instruction.equals("unmark")) { + return; + } else if (instruction.equals("unmark")) { int digit = Integer.parseInt(split_command[1]); todoList.unmark(digit); - } - else { - todoList.add(instruction, split_command[1]); - System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); - return; - } + return; + } else if (instruction.equals("delete")) { + int digit = Integer.parseInt(split_command[1]); + todoList.delete(digit); + System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + return; + } else { + todoList.add(instruction, split_command[1]); + System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + return; } } + } throw new DukeExceptions("OOPS!!! I'm sorry, but I don't know what that means."); } } diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index f48416d440..8a2a56f77f 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -15,10 +15,10 @@ public void add(String type, String task) throws DukeExceptions{ System.out.println(newTask); } - public void mark(int index) { + public void mark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); if (index < 0 || index > todo_list_length) { - return; + throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.get(index - 1); task.markTask(); @@ -26,10 +26,10 @@ public void mark(int index) { System.out.println(todo_list.get(index-1)); } - public void unmark(int index) { + public void unmark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); if (index < 0 || index > todo_list_length) { - return; + throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.get(index - 1); task.unmarkTask(); @@ -38,6 +38,16 @@ public void unmark(int index) { } + public void delete(int index) throws DukeExceptions { + int todo_list_length = todo_list.size(); + if (index < 0 || index > todo_list_length) { + throw new DukeExceptions("Please use list command to check the index!"); + } + Task task = todo_list.remove(index - 1); + System.out.println("Noted. I've removed this task:"); + System.out.println(task); + } + public int number_of_tasks() { return todo_list.size(); } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 075bd499ed..520ddbd406 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -47,7 +47,6 @@ ____________________________________________________________ ____________________________________________________________ Nice! I've marked this task as done: [T][X] read book -OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][ ] return book (by: Sunday 2pm) @@ -56,7 +55,6 @@ ____________________________________________________________ ____________________________________________________________ Nice! I've marked this task as done: [D][X] return book (by: Sunday 2pm) -OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][X] return book (by: Sunday 2pm) @@ -65,12 +63,28 @@ ____________________________________________________________ ____________________________________________________________ OK, I've marked this task as not done yet: [D][ ] return book (by: Sunday 2pm) -OOPS!!! I'm sorry, but I don't know what that means. ____________________________________________________________ 1. [T][X] read book 2. [D][ ] return book (by: Sunday 2pm) 3. [E][ ] programming study (from: 5pm to: 9pm) +____________________________________________________________ +OOPS!!! The description of a delete cannot be empty. +____________________________________________________________ +Please use list command to check the index! +____________________________________________________________ +1. [T][X] read book +2. [D][ ] return book (by: Sunday 2pm) +3. [E][ ] programming study (from: 5pm to: 9pm) + +____________________________________________________________ +Noted. I've removed this task: +[T][X] read book +Now I have 2 tasks in the list. +____________________________________________________________ +1. [D][ ] return book (by: Sunday 2pm) +2. [E][ ] programming study (from: 5pm to: 9pm) + ____________________________________________________________ Bye. Hope to see you again soon! ____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f95da5acf3..2ae9881a6e 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -18,4 +18,9 @@ mark 2 list unmark 2 list +delete +delete 4 +list +delete 1 +list bye \ No newline at end of file From a3d3477ae6d745d4c8f0ac222d3b81b519bfdd7b Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Wed, 1 Feb 2023 17:05:18 +0800 Subject: [PATCH 10/35] Complete Level 7 --- src/main/ToDoListCS2103.txt | Bin 0 -> 551 bytes src/main/java/Duke.java | 34 ++++++++++++++++++++++++++++++++++ src/main/java/Task.java | 4 +++- src/main/java/TodoList.java | 3 ++- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/ToDoListCS2103.txt diff --git a/src/main/ToDoListCS2103.txt b/src/main/ToDoListCS2103.txt new file mode 100644 index 0000000000000000000000000000000000000000..613f0eb33c28cea95908f597effdaaf1ce40d7ad GIT binary patch literal 551 zcmaKnze)o^5XR>&m-Au}(O@G8K~q^I7B-SfiJ-6+l7L{LY`isIa_+{xy?C+Er0@*_ zBK~;-AHqVg5=5~{C3Y4Hwu0d9<&bD$Gwgmd^L@X$dV{#f!74GEA;%NrtNFF|*KAh@ z4M9Rkb<>ryfH73X4V?3ZwhV^n9FU+6 z0I_{TRk@TXVXu}^u~RS4o%^%bmJT`sLr7V`XfMshw2~_d?$Amefhl$zFEb;+L~1!7 za4^)Pb5lk~qZ~;^(Cz) zAi)W?(`CkL-X0u+71kt3`k|1%Alt4($w_l=srzwh>JUR<*^#PN%;=)%9bKS)13_r1 z%CNks=u;av1td8UKBs-5;e?DF3?mmCgo=%8ZR>G*lIvhd|8358)zCj#2z0^1nct}^ Rte5)t(1^+^VhJO;f^RZ7s?Y!c literal 0 HcmV?d00001 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index cfa9cb27da..b5b8d90b86 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,5 @@ +import java.io.*; +import java.nio.file.Files; import java.util.Scanner; public class Duke { @@ -8,7 +10,26 @@ public static void main(String[] args) { begin(); + //open to do list file stored + java.nio.file.Path path = java.nio.file.Paths.get(".", "src", "main", "ToDoListCS2103.txt"); + boolean doesDirectoryExist = java.nio.file.Files.exists(path); TodoList todoList = new TodoList(); + try { + if (doesDirectoryExist) { + File previousToDoList = new File(path.toString()); + FileInputStream fis = new FileInputStream(previousToDoList); + ObjectInputStream ois = new ObjectInputStream(fis); + todoList = (TodoList) ois.readObject(); + ois.close(); + fis.close(); + } else { + File previousToDoList = new File(path.toString()); + previousToDoList.createNewFile(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + ChatBot bot = new ChatBot(todoList); Scanner scanner = new Scanner(System.in); @@ -24,6 +45,19 @@ public static void main(String[] args) { input = scanner.nextLine(); //ready for next input } scanner.close(); + + //save to do list before close the program + try{ + FileOutputStream fos = new FileOutputStream(path.toFile()); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(todoList); + oos.flush(); + oos.close(); + fos.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + bye(); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c0afdd56a4..94585ee769 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,4 +1,6 @@ -public class Task { +import java.io.Serializable; + +public class Task implements Serializable { private Boolean isDone; public Task() { diff --git a/src/main/java/TodoList.java b/src/main/java/TodoList.java index 8a2a56f77f..0e6151fff9 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/TodoList.java @@ -1,6 +1,7 @@ +import java.io.Serializable; import java.util.ArrayList; -public class TodoList { +public class TodoList implements Serializable { private ArrayList todo_list; public TodoList() { From 9b818a7aefa538978521343c48634ef0f9017753 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 3 Feb 2023 17:14:50 +0800 Subject: [PATCH 11/35] Complete Level 8 --- src/main/java/Task.java | 127 +++++++++++++++++++++++++++++++++++++++- text-ui-test/input.txt | 16 +++++ 2 files changed, 140 insertions(+), 3 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index c0afdd56a4..e582c21e48 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,3 +1,8 @@ +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + public class Task { private Boolean isDone; @@ -26,6 +31,37 @@ public void unmarkTask() { this.isDone = false; } + public LocalDate parseDate(String[] possibleDateTime) throws DateTimeParseException { + try { + //parse date + LocalDate possibleDeadlineDate = LocalDate.parse(possibleDateTime[0]); + return possibleDeadlineDate; + } catch (DateTimeParseException ex) { + //can not parse date + return null; + } + } + + public String parseStringDate(LocalDate possibleDeadlineDate) { + return possibleDeadlineDate.format(DateTimeFormatter.ofPattern("MMM d yyyy")); + } + + public LocalTime parseTime(String[] possibleDateTime) throws DateTimeParseException { + try { + //parse date + LocalTime possibleDeadlineTime = (possibleDateTime.length == 1) + ? LocalTime.parse(possibleDateTime[0]) + : LocalTime.parse(possibleDateTime[1]); + return possibleDeadlineTime; + } catch (DateTimeParseException ex) { + //can not parse date + return null; + } + } + + public String parseStringTime(LocalTime possibleDeadlineTime) { + return possibleDeadlineTime.format(DateTimeFormatter.ofPattern("hh:mm a")); + } class Todo extends Task { private String task; @@ -45,8 +81,14 @@ public String toString() { class Deadline extends Task { private String task; private String deadline; + private Boolean isDate = false; + private Boolean isTime = false; + private LocalDate deadlineDate; + private LocalTime deadlineTime; + private String deadlineDateString; + private String deadlineTimeString; - public Deadline(String task) throws DukeExceptions { + public Deadline(String task) throws DukeExceptions, DateTimeParseException { super(); String[] commands = task.split(" /by "); if (commands.length == 1) { @@ -54,10 +96,37 @@ public Deadline(String task) throws DukeExceptions { } this.task = commands[0]; this.deadline = commands[1]; + String[] possibleDateTime = this.deadline.split((" ")); + LocalDate possibleDeadlineDate = parseDate(possibleDateTime); + if (possibleDeadlineDate != null) { + this.isDate = true; + this.deadlineDate = possibleDeadlineDate; + this.deadlineDateString = parseStringDate(possibleDeadlineDate); + } + LocalTime possibleDeadlineTime = parseTime(possibleDateTime); + if (possibleDeadlineTime != null) { + this.isTime = true; + this.deadlineTime = possibleDeadlineTime; + this.deadlineTimeString = parseStringTime(possibleDeadlineTime); + } } @Override public String toString() { + if (isDate && isTime) { + String name = super.isDone ? "[D][X] " + task + " (by: " + this.deadlineDateString + " " + + this.deadlineTimeString +")" : "[D][ ] " + task + " (by: " + this.deadlineDateString + " " + + this.deadlineTimeString + ")"; + return name; + } else if (isDate) { + String name = super.isDone ? "[D][X] " + task + " (by: " + this.deadlineDateString + " " + +")" : "[D][ ] " + task + " (by: " + this.deadlineDateString + ")"; + return name; + } else if (isTime) { + String name = super.isDone ? "[D][X] " + task + " (by: " + this.deadlineTimeString + " " + +")" : "[D][ ] " + task + " (by: " + this.deadlineTimeString + ")"; + return name; + } String name = super.isDone ? "[D][X] " + task + " (by: " + this.deadline +")" : "[D][ ] " + task + " (by: " + this.deadline +")"; return name; } @@ -67,6 +136,18 @@ class Event extends Task { private String task; private String from; private String to; + private Boolean isFromDate = false; + private Boolean isFromTime = false; + private Boolean isToDate = false; + private Boolean isToTime = false; + private LocalDate fromDate; + private LocalTime fromTime; + private LocalDate toDate; + private LocalTime toTime; + private String fromDateString; + private String fromTimeString; + private String toDateString; + private String toTimeString; public Event(String task) throws DukeExceptions { super(); @@ -81,12 +162,52 @@ public Event(String task) throws DukeExceptions { } this.from = from_to_timeline[0]; this.to = from_to_timeline[1]; + //parse date and time of /from + String[] possibleDateTime = this.from.split((" ")); + LocalDate possibleFromDate = parseDate(possibleDateTime); + if (possibleFromDate != null) { + this.isFromDate = true; + this.fromDate = possibleFromDate; + this.fromDateString = parseStringDate(possibleFromDate); + } + LocalTime possibleFromTime = parseTime(possibleDateTime); + if (possibleFromTime != null) { + this.isFromTime = true; + this.fromTime = possibleFromTime; + this.fromTimeString = parseStringTime(possibleFromTime); + } + + //parse date and time of /to + possibleDateTime = this.to.split((" ")); + LocalDate possibleToDate = parseDate(possibleDateTime); + if (possibleToDate != null) { + this.isToDate = true; + this.toDate = possibleToDate; + this.toDateString = parseStringDate(possibleToDate); + } + LocalTime possibleToTime = parseTime(possibleDateTime); + if (possibleToTime != null) { + this.isToTime = true; + this.toTime = possibleToTime; + this.toTimeString = parseStringTime(possibleToTime); + } } @Override public String toString() { - String name = super.isDone ? "[E][X] " + task + " (from: " + this.from +" to: " + this.to + ")" - : "[E][ ] " + task + " (from: " + this.from +" to: " + this.to + ")"; + String fromString = this.from; + if (isFromDate || isFromTime) { + fromString = isFromDate ? fromDateString : ""; + fromString += isFromTime ? " " + fromTimeString : ""; + } + + String toString = this.to; + if (isToDate || isToTime) { + toString = isToDate ? toDateString : ""; + toString += isToTime ? " " + toTimeString : ""; + } + String name = super.isDone ? "[E][X] " + task + " (from: " + fromString +" to: " + toString + ")" + : "[E][ ] " + task + " (from: " + fromString +" to: " + toString + ")"; return name; } } diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 2ae9881a6e..eee73bcc55 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -23,4 +23,20 @@ delete 4 list delete 1 list +delete 1 +delete 1 +deadline return book /by 2023-02-10 18:00 +deadline assignment /by 2023-02-10 +deadline cooking /by 18:00 +list +event dance /from 2023-02-10 18:00 /to 2023-02-10 19:00 +list +event dance /from 2023-02-10 /to 2023-02-10 19:00 +list +event dance /from 2023-02-10 18:00 /to 2023-02-10 +list +event dance /from 2023-02-10 /to 2023-02-10 +list +event dance /from 18:00 /to 19:00 +list bye \ No newline at end of file From 24786a748e9f049902f112e29f1cb7ec0a67605c Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Fri, 3 Feb 2023 19:26:22 +0800 Subject: [PATCH 12/35] Complete Level 8 --- src/main/java/Task.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e582c21e48..98ff369c05 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,9 +1,10 @@ +import java.io.Serializable; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -public class Task { +public class Task implements Serializable { private Boolean isDone; public Task() { From cfb9c77f416793cac6dceb43cc2a6b84820887b1 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Sat, 4 Feb 2023 18:09:50 +0800 Subject: [PATCH 13/35] Complete A-MoreOOP --- src/main/ToDoListCS2103.txt | Bin 551 -> 667 bytes src/main/java/AddTaskCommand.java | 17 ++++++ src/main/java/ChatBot.java | 51 ------------------ src/main/java/Command.java | 3 ++ src/main/java/DeleteCommand.java | 15 ++++++ src/main/java/Duke.java | 82 +++++++---------------------- src/main/java/ListCommand.java | 14 +++++ src/main/java/MarkCommand.java | 12 +++++ src/main/java/Parser.java | 84 ++++++++++++++++++++++++++++++ src/main/java/Storage.java | 50 ++++++++++++++++++ src/main/java/Task.java | 65 +++++++---------------- src/main/java/Ui.java | 33 ++++++++++++ src/main/java/UnmarkCommand.java | 14 +++++ 13 files changed, 278 insertions(+), 162 deletions(-) create mode 100644 src/main/java/AddTaskCommand.java delete mode 100644 src/main/java/ChatBot.java create mode 100644 src/main/java/Command.java create mode 100644 src/main/java/DeleteCommand.java create mode 100644 src/main/java/ListCommand.java create mode 100644 src/main/java/MarkCommand.java create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/Ui.java create mode 100644 src/main/java/UnmarkCommand.java diff --git a/src/main/ToDoListCS2103.txt b/src/main/ToDoListCS2103.txt index 613f0eb33c28cea95908f597effdaaf1ce40d7ad..23bb3f9f38a98b577cb5eaa05077e29e6c452cb7 100644 GIT binary patch delta 374 zcmZ3^GMjZmK08x63j+fK)5NkR^$aBpEJdk_DaC~hbqpLJf~UBMfj1sC^Ih|WI!CU2_ZmDSWEy3Bbxx?BTN7qz?NAIvIS%w(1Ac6NClWTIe}57 zo~MLCz{tSJSl7@<*T7K0(89{V0OUuIL-k64O7((Mi>Ai5?2=aU*u=xYP*G6M&dk8T z{+x%gqJ)9VB{f;WPyu8BIE+NfnONQe#W@VjfaWL!_<}{b8A0|*mN2jtrIwTy Date: Sat, 4 Feb 2023 20:09:31 +0800 Subject: [PATCH 14/35] Complete A-Packages --- README.md | 4 ++-- src/main/ToDoListCS2103.txt | Bin 667 -> 323 bytes src/main/java/{ => duke}/Duke.java | 4 ++++ src/main/java/{ => duke}/DukeExceptions.java | 2 ++ src/main/java/{ => duke}/Parser.java | 4 ++++ src/main/java/{ => duke}/Storage.java | 2 ++ src/main/java/{ => duke}/Task.java | 3 ++- src/main/java/{ => duke}/TodoList.java | 2 ++ src/main/java/{ => duke}/Ui.java | 4 +++- .../java/{ => duke/command}/AddTaskCommand.java | 7 ++++++- src/main/java/{ => duke/command}/Command.java | 4 ++++ .../java/{ => duke/command}/DeleteCommand.java | 7 ++++++- .../java/{ => duke/command}/ListCommand.java | 7 ++++++- .../java/{ => duke/command}/MarkCommand.java | 5 +++++ .../java/{ => duke/command}/UnmarkCommand.java | 7 ++++++- text-ui-test/EXPECTED.TXT | 2 +- text-ui-test/runtest.bat | 2 +- 17 files changed, 56 insertions(+), 10 deletions(-) rename src/main/java/{ => duke}/Duke.java (94%) rename src/main/java/{ => duke}/DukeExceptions.java (93%) rename src/main/java/{ => duke}/Parser.java (98%) rename src/main/java/{ => duke}/Storage.java (99%) rename src/main/java/{ => duke}/Task.java (99%) rename src/main/java/{ => duke}/TodoList.java (99%) rename src/main/java/{ => duke}/Ui.java (91%) rename src/main/java/{ => duke/command}/AddTaskCommand.java (80%) rename src/main/java/{ => duke/command}/Command.java (63%) rename src/main/java/{ => duke/command}/DeleteCommand.java (75%) rename src/main/java/{ => duke/command}/ListCommand.java (68%) rename src/main/java/{ => duke/command}/MarkCommand.java (80%) rename src/main/java/{ => duke/command}/UnmarkCommand.java (69%) diff --git a/README.md b/README.md index 8715d4d915..0f2208ab64 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/src/main/ToDoListCS2103.txt b/src/main/ToDoListCS2103.txt index 23bb3f9f38a98b577cb5eaa05077e29e6c452cb7..3552e9a8eadc7c1e90fde98640667b896afd1165 100644 GIT binary patch delta 130 zcmbQudYDOe&07Z6;vxp#l+x@}y^#Ere4otXk~aRn6>+;F{U=I9a|FfcGM0@d(A z)Fc*XtAG?T@+Vvoc7JU*v0F=#+Xp149|DxKt|(&QgsWuEw_3`uI7@8enLr`dl*GK` P)Z#*hItC69!BYVM@$o73 literal 667 zcmZuu&r2Io5T2~-Cb210tp_W@QoWjNQV}($N)8rYK`~G$NO_uvU0rw6w-dAW;18(( zfg;lCU*O4O&w?jGgkC&}m(qiUUJC_hHd~3Mm*LGfGv9pkz2jTx3^in`K`jt&h|gxr zZ?^x8UKx-QkVQh@c?2W$iDkJa3k`I=!b`2?I(L_&It}-7CC`=oeI?qy96UIahaHf5 z1!m}eR8buOjHbzvhO$)|t_<_qp_}X7i_br{3@`+kNH9WAYnvzirNSI)*Iz0Nu<*Sb z4m${z;Nfzl!Q{v8>4Ml)%R8}V%MB}muMm3MD5iqIQ_^qA?T+O#bw0t*ZN2sF%kQ5= z@D@7Pq}O1z2&PuD7Jh&Y$Z*J!?8mX}3gMpXtNrzf>8oEymH}A-nOcH!uO%S&H?K$} zJ&A$nuBw6v7Ny59UDeax*1Gjyf-24Yhk)UB0?r>0uotw1=|~@C+>vCl(aEC3SkBTB z$JV(BPfAYd#YnL<;uP)T_@v{o1F?NbO!+yb_vSx+9e6%{k^_k9&2$Gq`g<-FA#_#L nqFuC^Aa?L+(=cxd&p2bmW6!*f(MKs>*H2%n6*jcrW_EN3fw<0^ diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 94% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index 06824a2c88..b2651ed0ee 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,3 +1,7 @@ +package duke; + +import duke.command.Command; + public class Duke { private Ui ui; diff --git a/src/main/java/DukeExceptions.java b/src/main/java/duke/DukeExceptions.java similarity index 93% rename from src/main/java/DukeExceptions.java rename to src/main/java/duke/DukeExceptions.java index a3ae82537c..fcc3afba7a 100644 --- a/src/main/java/DukeExceptions.java +++ b/src/main/java/duke/DukeExceptions.java @@ -1,3 +1,5 @@ +package duke; + public class DukeExceptions extends Exception{ private String error; public DukeExceptions(String error) { diff --git a/src/main/java/Parser.java b/src/main/java/duke/Parser.java similarity index 98% rename from src/main/java/Parser.java rename to src/main/java/duke/Parser.java index 1c3e2ba409..c21c18a8f3 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,3 +1,7 @@ +package duke; + +import duke.command.*; + import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/Storage.java b/src/main/java/duke/Storage.java similarity index 99% rename from src/main/java/Storage.java rename to src/main/java/duke/Storage.java index 349d0d1c28..3a67208b3f 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/duke/Storage.java @@ -1,3 +1,5 @@ +package duke; + import java.io.*; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/main/java/Task.java b/src/main/java/duke/Task.java similarity index 99% rename from src/main/java/Task.java rename to src/main/java/duke/Task.java index b78d6e0d48..11859953e6 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/Task.java @@ -1,7 +1,8 @@ +package duke; + import java.io.Serializable; import java.time.LocalDate; import java.time.LocalTime; -import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class Task implements Serializable { diff --git a/src/main/java/TodoList.java b/src/main/java/duke/TodoList.java similarity index 99% rename from src/main/java/TodoList.java rename to src/main/java/duke/TodoList.java index 0e6151fff9..bf64cd3457 100644 --- a/src/main/java/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -1,3 +1,5 @@ +package duke; + import java.io.Serializable; import java.util.ArrayList; diff --git a/src/main/java/Ui.java b/src/main/java/duke/Ui.java similarity index 91% rename from src/main/java/Ui.java rename to src/main/java/duke/Ui.java index e06ac515a0..e890e658d5 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/duke/Ui.java @@ -1,3 +1,5 @@ +package duke; + import java.util.Scanner; /** @@ -10,7 +12,7 @@ public class Ui { public void begin() { showLine(); - System.out.println("Hello from Duke"); + System.out.println("Hello from duke.Duke"); System.out.println("What can I do for you?"); showLine(); diff --git a/src/main/java/AddTaskCommand.java b/src/main/java/duke/command/AddTaskCommand.java similarity index 80% rename from src/main/java/AddTaskCommand.java rename to src/main/java/duke/command/AddTaskCommand.java index 8ab51bd4ca..90fa97c312 100644 --- a/src/main/java/AddTaskCommand.java +++ b/src/main/java/duke/command/AddTaskCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + public class AddTaskCommand extends Command{ private TodoList todoList; private String instruction; @@ -10,7 +15,7 @@ public AddTaskCommand(TodoList todoList, String instruction, String description) } @Override - public void execute() throws DukeExceptions{ + public void execute() throws DukeExceptions { todoList.add(instruction, description); System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); } diff --git a/src/main/java/Command.java b/src/main/java/duke/command/Command.java similarity index 63% rename from src/main/java/Command.java rename to src/main/java/duke/command/Command.java index b4f86cfe16..5a257dee71 100644 --- a/src/main/java/Command.java +++ b/src/main/java/duke/command/Command.java @@ -1,3 +1,7 @@ +package duke.command; + +import duke.DukeExceptions; + public abstract class Command { public abstract void execute() throws DukeExceptions; } \ No newline at end of file diff --git a/src/main/java/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java similarity index 75% rename from src/main/java/DeleteCommand.java rename to src/main/java/duke/command/DeleteCommand.java index e26cf99eb4..b7d455b212 100644 --- a/src/main/java/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + public class DeleteCommand extends Command{ private TodoList todoList; private int index; @@ -8,7 +13,7 @@ public DeleteCommand(TodoList todoList, int index) { } @Override - public void execute() throws DukeExceptions{ + public void execute() throws DukeExceptions { todoList.delete(index); System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); } diff --git a/src/main/java/ListCommand.java b/src/main/java/duke/command/ListCommand.java similarity index 68% rename from src/main/java/ListCommand.java rename to src/main/java/duke/command/ListCommand.java index 091b35958c..cc05f76a2d 100644 --- a/src/main/java/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + public class ListCommand extends Command{ private TodoList todoList; @@ -6,7 +11,7 @@ public ListCommand(TodoList todoList) { } @Override - public void execute() throws DukeExceptions{ + public void execute() throws DukeExceptions { String shown_list = todoList.toString(); System.out.println(shown_list); } diff --git a/src/main/java/MarkCommand.java b/src/main/java/duke/command/MarkCommand.java similarity index 80% rename from src/main/java/MarkCommand.java rename to src/main/java/duke/command/MarkCommand.java index d571f81b4d..2a0852d402 100644 --- a/src/main/java/MarkCommand.java +++ b/src/main/java/duke/command/MarkCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + public class MarkCommand extends Command{ private TodoList todoList; private int index; diff --git a/src/main/java/UnmarkCommand.java b/src/main/java/duke/command/UnmarkCommand.java similarity index 69% rename from src/main/java/UnmarkCommand.java rename to src/main/java/duke/command/UnmarkCommand.java index a9257c021f..d3140bf35d 100644 --- a/src/main/java/UnmarkCommand.java +++ b/src/main/java/duke/command/UnmarkCommand.java @@ -1,3 +1,8 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + public class UnmarkCommand extends Command{ private TodoList todoList; private int index; @@ -8,7 +13,7 @@ public UnmarkCommand(TodoList todoList, int index) { } @Override - public void execute() throws DukeExceptions{ + public void execute() throws DukeExceptions { todoList.unmark(index); } } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 520ddbd406..b6cfb7e3d2 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,5 @@ ____________________________________________________________ -Hello from Duke +Hello from duke.Duke What can I do for you? ____________________________________________________________ OOPS!!! I'm sorry, but I don't know what that means. diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 0873744649..62752b8814 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 a5dd3cead575a0f7c6b2582a0622159c3f0b74d7 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 11:26:52 +0800 Subject: [PATCH 15/35] Complete A-Gradle --- build.gradle | 7 +- config/checkstyle/checkstyle.xml | 434 +++++++++++++++++++++++++++++ config/checkstyle/suppressions.xml | 10 + src/test/java/duke/TaskTest.java | 5 + 4 files changed, 455 insertions(+), 1 deletion(-) create mode 100644 config/checkstyle/checkstyle.xml create mode 100644 config/checkstyle/suppressions.xml create mode 100644 src/test/java/duke/TaskTest.java diff --git a/build.gradle b/build.gradle index 885198fcfa..5687210f4d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java' id 'application' + id 'checkstyle' id 'com.github.johnrengelman.shadow' version '5.1.0' } @@ -8,6 +9,10 @@ repositories { mavenCentral() } +checkstyle { + toolVersion = '10.2' +} + dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' @@ -28,7 +33,7 @@ test { } application { - mainClassName = "seedu.duke.Duke" + mainClassName = "duke.Duke" } shadowJar { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..d618671b83 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000000..39efb6e4ac --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/test/java/duke/TaskTest.java b/src/test/java/duke/TaskTest.java new file mode 100644 index 0000000000..6909e34e32 --- /dev/null +++ b/src/test/java/duke/TaskTest.java @@ -0,0 +1,5 @@ +package duke; + +public class TaskTest { + +} From b16ac239fbe523cf7dcc1793b1d01b62fcc61323 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 13:00:27 +0800 Subject: [PATCH 16/35] Complete A-JUnit --- build.gradle | 2 +- src/test/java/duke/TaskTest.java | 24 ++++++++++++++++++++++++ src/test/java/duke/TodoListTest.java | 18 ++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/test/java/duke/TodoListTest.java diff --git a/build.gradle b/build.gradle index 5687210f4d..1b161992d0 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ test { exceptionFormat "full" showCauses true showStackTraces true - showStandardStreams = false + showStandardStreams = true } } diff --git a/src/test/java/duke/TaskTest.java b/src/test/java/duke/TaskTest.java index 6909e34e32..dfb2d11da9 100644 --- a/src/test/java/duke/TaskTest.java +++ b/src/test/java/duke/TaskTest.java @@ -1,5 +1,29 @@ package duke; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class TaskTest { + @Test + public void createNewToDoTask(){ + try { + String newTodoTask = new Task().createNewTask("todo", + "read book").toString(); + assertEquals(newTodoTask, "[T][ ] read book"); + } catch (DukeExceptions ex) { + System.out.println(ex.getErrorMessage()); + } + } + @Test + public void createNewDeadlineTask(){ + try { + String newDeadlineTask = new Task().createNewTask("deadline", + "return book /by 2023-02-10 18:00").toString(); + assertEquals(newDeadlineTask, "[D][ ] return book (by: Feb 10 2023 06:00 PM)"); + } catch (DukeExceptions ex) { + System.out.println(ex.getErrorMessage()); + } + } } diff --git a/src/test/java/duke/TodoListTest.java b/src/test/java/duke/TodoListTest.java new file mode 100644 index 0000000000..a41e6836bf --- /dev/null +++ b/src/test/java/duke/TodoListTest.java @@ -0,0 +1,18 @@ +package duke; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TodoListTest { + @Test + public void addToDoTask(){ + try { + TodoList newTodoList = new TodoList(); + newTodoList.add("todo", "read book"); + assertEquals(newTodoList.number_of_tasks(), 1); + } catch (DukeExceptions ex) { + System.out.println(ex.getErrorMessage()); + } + } +} From 04c4fe731f0f16bfb6329fa9e9cbc8d0ef8d2751 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 14:08:29 +0800 Subject: [PATCH 17/35] Complete A-Jar --- src/main/ToDoListCS2103.txt | Bin 323 -> 322 bytes src/main/java/duke/Storage.java | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/ToDoListCS2103.txt b/src/main/ToDoListCS2103.txt index 3552e9a8eadc7c1e90fde98640667b896afd1165..abcaabb557eba37d73f1dbfe62e0844dd227bfce 100644 GIT binary patch delta 25 ecmX@ibckt#A)_Emab{k6aUnw;0|$uUsQ>_FWCsrb delta 26 fcmX@abeL&_A)^p$N@8AeYH=Y$9Rml5;HdxrZ6gO; diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 3a67208b3f..6d56c0b788 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -13,7 +13,7 @@ public class Storage { private boolean doesDirectoryExist; public Storage() { - this.path = Paths.get(".", "src", "main", "ToDoListCS2103.txt"); + this.path = Paths.get("src", "main", "ToDoListCS2103.txt"); this.doesDirectoryExist = java.nio.file.Files.exists(path); } @@ -31,6 +31,10 @@ public TodoList load() { previousToDoList.createNewFile(); return new TodoList(); } + } catch (IOException ex) { + this.path = Paths.get("ToDoListCS2103.txt"); + doesDirectoryExist = java.nio.file.Files.exists(path); + return load(); } catch (Exception ex) { ex.printStackTrace(); } @@ -39,6 +43,7 @@ public TodoList load() { public void save(TodoList todoList) { try{ + FileOutputStream fos = new FileOutputStream(path.toFile()); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(todoList); From e18d496d56607593f25d4745353fb56aa28e7d9f Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 14:41:49 +0800 Subject: [PATCH 18/35] Complete A-JavaDoc --- src/main/java/duke/Duke.java | 5 +++ src/main/java/duke/DukeExceptions.java | 3 ++ src/main/java/duke/Parser.java | 36 +++++++++++++++++-- src/main/java/duke/Storage.java | 11 ++++++ src/main/java/duke/Task.java | 17 +++++++++ src/main/java/duke/TodoList.java | 33 +++++++++++++++++ src/main/java/duke/Ui.java | 15 +++++++- .../java/duke/command/AddTaskCommand.java | 3 ++ src/main/java/duke/command/Command.java | 3 ++ 9 files changed, 123 insertions(+), 3 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index b2651ed0ee..6383129b88 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -2,6 +2,11 @@ import duke.command.Command; +/** + * + * Represents the chat bot. + * + */ public class Duke { private Ui ui; diff --git a/src/main/java/duke/DukeExceptions.java b/src/main/java/duke/DukeExceptions.java index fcc3afba7a..94df0bdb17 100644 --- a/src/main/java/duke/DukeExceptions.java +++ b/src/main/java/duke/DukeExceptions.java @@ -1,5 +1,8 @@ package duke; +/** + * Represents Exceptions caused by input syntax. + */ public class DukeExceptions extends Exception{ private String error; public DukeExceptions(String error) { diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index c21c18a8f3..7464c5aac0 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -8,8 +8,7 @@ import java.time.format.DateTimeParseException; /** - * Parse the command - * + * Parses the command. */ public class Parser { private TodoList todoList; @@ -20,6 +19,13 @@ public Parser(TodoList todoList) { this.todoList = todoList; } + /** + * Returns a Command object (can be ListCommand, ...) of the input String. + * + * @param command String input. + * @return Command Object corresponding to the input String command. + * @throws DukeExceptions If input syntax is incorrect. + */ public Command parse(String command) throws DukeExceptions { String[] split_command = command.split(" ", 2); String instruction = split_command[0]; @@ -54,6 +60,13 @@ public Command parse(String command) throws DukeExceptions { throw new DukeExceptions("OOPS!!! I'm sorry, but I don't know what that means."); } + /** + * Returns LocalDate object capture the date of an event. + * + * @param possibleDateTime A string array may contain date information. + * @return LocalDate object capture the date or null if there is no information. + * @throws DateTimeParseException If there is no information. + */ public static LocalDate parseDate(String[] possibleDateTime) throws DateTimeParseException { try { //parse date @@ -65,10 +78,23 @@ public static LocalDate parseDate(String[] possibleDateTime) throws DateTimePars } } + /** + * Returns String representation of the date of an event. + * + * @param possibleDeadlineDate LocalDate object capture the date of an event. + * @return String representation of the date of an event. + */ public static String parseStringDate(LocalDate possibleDeadlineDate) { return possibleDeadlineDate.format(DateTimeFormatter.ofPattern("MMM d yyyy")); } + /** + * Returns LocalTime object capture the time of an event. + * + * @param possibleDateTime A string array may contain time information. + * @return LocalTime object capture the time or null if there is no information. + * @throws DateTimeParseException If there is no information. + */ public static LocalTime parseTime(String[] possibleDateTime) throws DateTimeParseException { try { //parse date @@ -82,6 +108,12 @@ public static LocalTime parseTime(String[] possibleDateTime) throws DateTimePars } } + /** + * Returns String representation of the time of an event. + * + * @param possibleDeadlineTime LocalTime object capture the time. + * @return String representation of the time of an event. + */ public static String parseStringTime(LocalTime possibleDeadlineTime) { return possibleDeadlineTime.format(DateTimeFormatter.ofPattern("hh:mm a")); } diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index 6d56c0b788..b8a238dc5c 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -17,6 +17,12 @@ public Storage() { this.doesDirectoryExist = java.nio.file.Files.exists(path); } + /** + * Loads previous to do list stored either in main folder or in current folder. + * If there is no file, create one. + * + * @return A TodoList object contain information of previous to do list. + */ public TodoList load() { try { File previousToDoList = new File(path.toString()); @@ -41,6 +47,11 @@ public TodoList load() { return new TodoList(); } + /** + * Saves current to do list in the same file in load. + * + * @param todoList TodoList object contain information needed to save. + */ public void save(TodoList todoList) { try{ diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index 11859953e6..f515261097 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -5,6 +5,9 @@ import java.time.LocalTime; import java.time.format.DateTimeParseException; +/** + * Represents a task (to do task or task with deadline,...). + */ public class Task implements Serializable { private Boolean isDone; // private static final long serialVersionUID = -7531925916726747642; @@ -13,6 +16,14 @@ public Task() { this.isDone = false; } + /** + * Returns a subclass of a task corresponding to the input command. + * + * @param type Type of task. + * @param task Description of task. + * @return A Task Object with corresponding information. + * @throws DukeExceptions If the input syntax is incorrect. + */ public Task createNewTask(String type, String task) throws DukeExceptions{ if (type.equals("todo")) { return new Todo(task); @@ -26,10 +37,16 @@ public Task createNewTask(String type, String task) throws DukeExceptions{ } } + /** + * Marks a task is done. + */ public void markTask() { this.isDone = true; } + /** + * Unmarks a task is done. + */ public void unmarkTask() { this.isDone = false; } diff --git a/src/main/java/duke/TodoList.java b/src/main/java/duke/TodoList.java index bf64cd3457..bd056d1d94 100644 --- a/src/main/java/duke/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -3,6 +3,9 @@ import java.io.Serializable; import java.util.ArrayList; +/** + * Represents a list containing all tasks. + */ public class TodoList implements Serializable { private ArrayList todo_list; @@ -10,6 +13,13 @@ public TodoList() { this.todo_list = new ArrayList<>(100); } + /** + * Creates and adds new task corresponding to the input. + * + * @param type Type of task. + * @param task Description of task. + * @throws DukeExceptions If the input syntax is incorrect. + */ public void add(String type, String task) throws DukeExceptions{ Task taskObject = new Task(); Task newTask = taskObject.createNewTask(type, task); @@ -18,6 +28,12 @@ public void add(String type, String task) throws DukeExceptions{ System.out.println(newTask); } + /** + * Marks a numbered task is done. + * + * @param index The number order of the task. + * @throws DukeExceptions If the input syntax is incorrect. + */ public void mark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); if (index < 0 || index > todo_list_length) { @@ -29,6 +45,12 @@ public void mark(int index) throws DukeExceptions{ System.out.println(todo_list.get(index-1)); } + /** + * Unmarks a numbered task is done. + * + * @param index The number order of the task. + * @throws DukeExceptions If the input syntax is incorrect. + */ public void unmark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); if (index < 0 || index > todo_list_length) { @@ -41,6 +63,12 @@ public void unmark(int index) throws DukeExceptions{ } + /** + * Deletes a numbered task is done. + * + * @param index The number order of the task. + * @throws DukeExceptions If the input syntax is incorrect. + */ public void delete(int index) throws DukeExceptions { int todo_list_length = todo_list.size(); if (index < 0 || index > todo_list_length) { @@ -51,6 +79,11 @@ public void delete(int index) throws DukeExceptions { System.out.println(task); } + /** + * Returns how many tasks in the list. + * + * @return How many tasks in the list. + */ public int number_of_tasks() { return todo_list.size(); } diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index e890e658d5..de2a0c64ec 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -5,10 +5,12 @@ /** * Represents a user interface. Main responsibility is taking input and display default interface. */ - public class Ui { public Scanner scanner = new Scanner(System.in); + /** + * Prints the welcome message. + */ public void begin() { showLine(); @@ -18,16 +20,27 @@ public void begin() { showLine(); } + /** + * Prints a line to separate each interaction. + */ public void showLine() { System.out.println("____________________________________________________________"); } + /** + * Prints a goodbye message. + */ public void bye() { System.out.println("Bye. Hope to see you again soon!"); showLine(); scanner.close(); } + /** + * Returns a String command from user. + * + * @return Input String command. + */ public String readCommand() { return scanner.nextLine(); } diff --git a/src/main/java/duke/command/AddTaskCommand.java b/src/main/java/duke/command/AddTaskCommand.java index 90fa97c312..8166c157a5 100644 --- a/src/main/java/duke/command/AddTaskCommand.java +++ b/src/main/java/duke/command/AddTaskCommand.java @@ -3,6 +3,9 @@ import duke.DukeExceptions; import duke.TodoList; +/** + * Represents an add command. + */ public class AddTaskCommand extends Command{ private TodoList todoList; private String instruction; diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 5a257dee71..ff9813c61b 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -2,6 +2,9 @@ import duke.DukeExceptions; +/** + * Represents a command. + */ public abstract class Command { public abstract void execute() throws DukeExceptions; } \ No newline at end of file From 217c71b28cca28cd3402dc8a3919cd109894308b Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 14:45:29 +0800 Subject: [PATCH 19/35] Complete A-CodingStandard --- src/main/java/duke/Parser.java | 6 ++++-- src/main/java/duke/TodoList.java | 9 ++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 7464c5aac0..0c7a08349a 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -34,7 +34,8 @@ public Command parse(String command) throws DukeExceptions { if (split_command.length == 1) { return new ListCommand(todoList); } else { - throw new DukeExceptions("OOPS!!! The description of a list cannot have other parameters"); + throw new DukeExceptions("OOPS!!! The description of a list " + + "cannot have other parameters"); } } @@ -42,7 +43,8 @@ public Command parse(String command) throws DukeExceptions { for (Instructions validInstruction : Instructions.values()) { if (validInstruction.name().equals(instruction)) { if (split_command.length == 1) { - throw new DukeExceptions(String.format("OOPS!!! The description of a %s cannot be empty.", instruction)); + throw new DukeExceptions(String.format("OOPS!!! The description of a %s cannot be empty.", + instruction)); } else if (instruction.equals("mark")) { int digit = Integer.parseInt(split_command[1]); return new MarkCommand(todoList, digit); diff --git a/src/main/java/duke/TodoList.java b/src/main/java/duke/TodoList.java index bd056d1d94..5afb40168c 100644 --- a/src/main/java/duke/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -36,7 +36,8 @@ public void add(String type, String task) throws DukeExceptions{ */ public void mark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); - if (index < 0 || index > todo_list_length) { + boolean isOutOfBound = index < 0 || index > todo_list_length; + if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.get(index - 1); @@ -53,7 +54,8 @@ public void mark(int index) throws DukeExceptions{ */ public void unmark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); - if (index < 0 || index > todo_list_length) { + boolean isOutOfBound = index < 0 || index > todo_list_length; + if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.get(index - 1); @@ -71,7 +73,8 @@ public void unmark(int index) throws DukeExceptions{ */ public void delete(int index) throws DukeExceptions { int todo_list_length = todo_list.size(); - if (index < 0 || index > todo_list_length) { + boolean isOutOfBound = index < 0 || index > todo_list_length; + if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.remove(index - 1); From 9846241722e90afc2b258394eb2eb53393a7575d Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 6 Feb 2023 15:22:39 +0800 Subject: [PATCH 20/35] Complete Level-9 --- src/main/ToDoListCS2103.txt | Bin 322 -> 0 bytes src/main/java/duke/Parser.java | 4 +++- src/main/java/duke/Task.java | 23 +++++++++++++++++--- src/main/java/duke/TodoList.java | 14 ++++++++++++ src/main/java/duke/command/FindCommand.java | 22 +++++++++++++++++++ 5 files changed, 59 insertions(+), 4 deletions(-) delete mode 100644 src/main/ToDoListCS2103.txt create mode 100644 src/main/java/duke/command/FindCommand.java diff --git a/src/main/ToDoListCS2103.txt b/src/main/ToDoListCS2103.txt deleted file mode 100644 index abcaabb557eba37d73f1dbfe62e0844dd227bfce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmZ4UmVvdnh=DhyG&@x@C1_lPk zauyH?)Wip|HnBKc1!OlPf5H`E_t$nz3`{-@EG0nU5(XiNl{txd>H5JXMVWc&);YQKifCfY{u$Cp}l!6>z0`f*)dT}8`9Rml5;HdxrhJ9#S diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 0c7a08349a..3a042df4f5 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -13,7 +13,7 @@ public class Parser { private TodoList todoList; - private enum Instructions {todo, deadline, event, mark, unmark, delete} + private enum Instructions {todo, deadline, event, mark, unmark, delete, find} public Parser(TodoList todoList) { this.todoList = todoList; @@ -54,6 +54,8 @@ public Command parse(String command) throws DukeExceptions { } else if (instruction.equals("delete")) { int digit = Integer.parseInt(split_command[1]); return new DeleteCommand(todoList, digit); + } else if (instruction.equals("find")) { + return new FindCommand(todoList, split_command[1]); } else { return new AddTaskCommand(todoList, instruction, split_command[1]); } diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index f515261097..7a5596d63f 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -10,10 +10,17 @@ */ public class Task implements Serializable { private Boolean isDone; + private String description; // private static final long serialVersionUID = -7531925916726747642; public Task() { this.isDone = false; + this.description = ""; + } + + public Task(String task) { + this.isDone = false; + this.description = task; } /** @@ -51,11 +58,21 @@ public void unmarkTask() { this.isDone = false; } + /** + * Returns true if the description contains keywords, false otherwise. + * + * @param keyword Keywords needed to find. + * @return true if the description contains keywords, false otherwise. + */ + public boolean doesContainKeyword(String keyword) { + return this.description.contains(keyword); + } + private class Todo extends Task { private String task; public Todo(String task) { - super(); + super(task); this.task = task; } @@ -78,7 +95,7 @@ private class Deadline extends Task { private String deadlineTimeString; public Deadline(String task) throws DukeExceptions, DateTimeParseException { - super(); + super(task); String[] commands = task.split(" /by "); if (commands.length == 1) { throw new DukeExceptions("OOPS!!! Looks like someone forget his/her deadline :)\n Please use /by to indicate deadline"); @@ -140,7 +157,7 @@ private class Event extends Task { private String toTimeString; public Event(String task) throws DukeExceptions { - super(); + super(task); String[] commands = task.split(" /from "); if (commands.length == 1) { throw new DukeExceptions("OOPS!!! Looks like someone forget when the event begins :)\n Please use /from to indicate begin time"); diff --git a/src/main/java/duke/TodoList.java b/src/main/java/duke/TodoList.java index 5afb40168c..f3b381e43c 100644 --- a/src/main/java/duke/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -91,6 +91,20 @@ public int number_of_tasks() { return todo_list.size(); } + public void find(String keyword) { + System.out.println("Here are the matching tasks in your list:"); + String result_list = ""; + int todo_list_length = todo_list.size(); + int resultIndex = 1; + for (int i = 1; i <= todo_list_length; i++) { + Task task = todo_list.get(i-1); + if (task.doesContainKeyword(keyword)) { + result_list += String.format("%d. %s\n", resultIndex++, task); + } + } + System.out.println(result_list); + } + @Override public String toString() { String shown_list = ""; diff --git a/src/main/java/duke/command/FindCommand.java b/src/main/java/duke/command/FindCommand.java new file mode 100644 index 0000000000..6fbe29fb41 --- /dev/null +++ b/src/main/java/duke/command/FindCommand.java @@ -0,0 +1,22 @@ +package duke.command; + +import duke.DukeExceptions; +import duke.TodoList; + +/** + * Represents find command. + */ +public class FindCommand extends Command{ + private TodoList todoList; + private String description; + + public FindCommand(TodoList todoList, String description) { + this.todoList = todoList; + this.description = description; + } + + @Override + public void execute() throws DukeExceptions { + todoList.find(description); + } +} From 0f0592c6a445594009ab6fe17569e2c6b9bce816 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Sun, 19 Feb 2023 19:39:42 +0800 Subject: [PATCH 21/35] Complete level 10 --- src/main/java/duke/Ui.java | 48 ---------------------------- src/main/java/duke/ui/DialogBox.java | 2 ++ src/main/java/duke/ui/Ui.java | 2 ++ 3 files changed, 4 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/duke/Ui.java create mode 100644 src/main/java/duke/ui/DialogBox.java create mode 100644 src/main/java/duke/ui/Ui.java diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java deleted file mode 100644 index de2a0c64ec..0000000000 --- a/src/main/java/duke/Ui.java +++ /dev/null @@ -1,48 +0,0 @@ -package duke; - -import java.util.Scanner; - -/** - * Represents a user interface. Main responsibility is taking input and display default interface. - */ -public class Ui { - public Scanner scanner = new Scanner(System.in); - - /** - * Prints the welcome message. - */ - public void begin() { - showLine(); - - System.out.println("Hello from duke.Duke"); - System.out.println("What can I do for you?"); - - showLine(); - } - - /** - * Prints a line to separate each interaction. - */ - public void showLine() { - System.out.println("____________________________________________________________"); - } - - /** - * Prints a goodbye message. - */ - public void bye() { - System.out.println("Bye. Hope to see you again soon!"); - showLine(); - scanner.close(); - } - - /** - * Returns a String command from user. - * - * @return Input String command. - */ - public String readCommand() { - return scanner.nextLine(); - } - -} diff --git a/src/main/java/duke/ui/DialogBox.java b/src/main/java/duke/ui/DialogBox.java new file mode 100644 index 0000000000..9434ef6656 --- /dev/null +++ b/src/main/java/duke/ui/DialogBox.java @@ -0,0 +1,2 @@ +package duke.ui;public class DialogBox { +} diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java new file mode 100644 index 0000000000..26b9571cde --- /dev/null +++ b/src/main/java/duke/ui/Ui.java @@ -0,0 +1,2 @@ +package duke.ui;public class Ui { +} From 7a5165edb8fde08c9fad337204acbeed27b547f7 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Sun, 19 Feb 2023 19:40:21 +0800 Subject: [PATCH 22/35] Complete level 10 --- build.gradle | 8 + src/main/java/duke/Duke.java | 35 +---- src/main/java/duke/Task.java | 3 +- src/main/java/duke/TodoList.java | 26 ++-- .../java/duke/command/AddTaskCommand.java | 6 +- src/main/java/duke/command/Command.java | 2 +- src/main/java/duke/command/DeleteCommand.java | 4 +- src/main/java/duke/command/FindCommand.java | 4 +- src/main/java/duke/command/ListCommand.java | 4 +- src/main/java/duke/command/MarkCommand.java | 2 +- src/main/java/duke/command/UnmarkCommand.java | 4 +- src/main/java/duke/ui/DialogBox.java | 49 +++++- src/main/java/duke/ui/Ui.java | 143 +++++++++++++++++- 13 files changed, 225 insertions(+), 65 deletions(-) diff --git a/build.gradle b/build.gradle index 1b161992d0..b47c9b65e6 100644 --- a/build.gradle +++ b/build.gradle @@ -3,16 +3,24 @@ plugins { id 'application' id 'checkstyle' id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'org.openjfx.javafxplugin' version '0.0.13' } repositories { mavenCentral() } +javafx { + version = "19" + modules = [ 'javafx.controls' ] +} + checkstyle { toolVersion = '10.2' } + + dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 6383129b88..c50f32f54d 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,6 +1,7 @@ package duke; -import duke.command.Command; +import duke.ui.Ui; +import javafx.application.Application; /** * @@ -8,37 +9,7 @@ * */ public class Duke { - private Ui ui; - - public Duke() { - this.ui = new Ui(); - } - - private void run() { - ui.begin(); - - Storage storage = new Storage(); - TodoList todoList = storage.load(); - - Parser bot = new Parser(todoList); - - String input = ui.readCommand(); - - while (!input.equals("bye")) { - try { - Command command = bot.parse(input); - command.execute(); - } catch (DukeExceptions error) { - System.out.println(error.getErrorMessage()); - } - ui.showLine(); - input = ui.readCommand();; //ready for next input - } - storage.save(todoList); - ui.bye(); - } - public static void main(String[] args) { - new Duke().run(); + Application.launch(Ui.class, args); } } diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index 7a5596d63f..ee9d67a43d 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -39,8 +39,7 @@ public Task createNewTask(String type, String task) throws DukeExceptions{ } else if (type.equals("event")) { return new Event(task); } else { - System.out.println("unknown command! Please try again."); - return null; + throw new DukeExceptions("unknown command! Please try again."); } } diff --git a/src/main/java/duke/TodoList.java b/src/main/java/duke/TodoList.java index f3b381e43c..e4d55e6130 100644 --- a/src/main/java/duke/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -20,12 +20,11 @@ public TodoList() { * @param task Description of task. * @throws DukeExceptions If the input syntax is incorrect. */ - public void add(String type, String task) throws DukeExceptions{ + public String add(String type, String task) throws DukeExceptions{ Task taskObject = new Task(); Task newTask = taskObject.createNewTask(type, task); - System.out.println("Got it. I've added this task:"); todo_list.add(newTask); - System.out.println(newTask); + return ("Got it. I've added this task:\n" + newTask.toString()); } /** @@ -34,7 +33,7 @@ public void add(String type, String task) throws DukeExceptions{ * @param index The number order of the task. * @throws DukeExceptions If the input syntax is incorrect. */ - public void mark(int index) throws DukeExceptions{ + public String mark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { @@ -42,8 +41,7 @@ public void mark(int index) throws DukeExceptions{ } Task task = todo_list.get(index - 1); task.markTask(); - System.out.println("Nice! I've marked this task as done:"); - System.out.println(todo_list.get(index-1)); + return String.format("Nice! I've marked this task as done:\n%s", todo_list.get(index-1)); } /** @@ -52,7 +50,7 @@ public void mark(int index) throws DukeExceptions{ * @param index The number order of the task. * @throws DukeExceptions If the input syntax is incorrect. */ - public void unmark(int index) throws DukeExceptions{ + public String unmark(int index) throws DukeExceptions{ int todo_list_length = todo_list.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { @@ -60,9 +58,7 @@ public void unmark(int index) throws DukeExceptions{ } Task task = todo_list.get(index - 1); task.unmarkTask(); - System.out.println("OK, I've marked this task as not done yet:"); - System.out.println(todo_list.get(index-1)); - + return String.format("OK, I've marked this task as not done yet:\n%s", todo_list.get(index-1)); } /** @@ -71,15 +67,14 @@ public void unmark(int index) throws DukeExceptions{ * @param index The number order of the task. * @throws DukeExceptions If the input syntax is incorrect. */ - public void delete(int index) throws DukeExceptions { + public String delete(int index) throws DukeExceptions { int todo_list_length = todo_list.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } Task task = todo_list.remove(index - 1); - System.out.println("Noted. I've removed this task:"); - System.out.println(task); + return String.format("Noted. I've removed this task:\n%s", task); } /** @@ -91,8 +86,7 @@ public int number_of_tasks() { return todo_list.size(); } - public void find(String keyword) { - System.out.println("Here are the matching tasks in your list:"); + public String find(String keyword) { String result_list = ""; int todo_list_length = todo_list.size(); int resultIndex = 1; @@ -102,7 +96,7 @@ public void find(String keyword) { result_list += String.format("%d. %s\n", resultIndex++, task); } } - System.out.println(result_list); + return("Here are the matching tasks in your list:\n" + result_list); } @Override diff --git a/src/main/java/duke/command/AddTaskCommand.java b/src/main/java/duke/command/AddTaskCommand.java index 8166c157a5..80d2f77ba4 100644 --- a/src/main/java/duke/command/AddTaskCommand.java +++ b/src/main/java/duke/command/AddTaskCommand.java @@ -18,8 +18,8 @@ public AddTaskCommand(TodoList todoList, String instruction, String description) } @Override - public void execute() throws DukeExceptions { - todoList.add(instruction, description); - System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + public String execute() throws DukeExceptions { + String result = todoList.add(instruction, description); + return(String.format("%s\nNow I have %d tasks in the list.", result, todoList.number_of_tasks())); } } diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index ff9813c61b..f0b5ca09b1 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -6,5 +6,5 @@ * Represents a command. */ public abstract class Command { - public abstract void execute() throws DukeExceptions; + public abstract String execute() throws DukeExceptions; } \ No newline at end of file diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index b7d455b212..6899a76ba8 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -13,8 +13,8 @@ public DeleteCommand(TodoList todoList, int index) { } @Override - public void execute() throws DukeExceptions { + public String execute() throws DukeExceptions { todoList.delete(index); - System.out.println(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + return(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); } } diff --git a/src/main/java/duke/command/FindCommand.java b/src/main/java/duke/command/FindCommand.java index 6fbe29fb41..cb37c66391 100644 --- a/src/main/java/duke/command/FindCommand.java +++ b/src/main/java/duke/command/FindCommand.java @@ -16,7 +16,7 @@ public FindCommand(TodoList todoList, String description) { } @Override - public void execute() throws DukeExceptions { - todoList.find(description); + public String execute() throws DukeExceptions { + return (todoList.find(description)); } } diff --git a/src/main/java/duke/command/ListCommand.java b/src/main/java/duke/command/ListCommand.java index cc05f76a2d..51cb543d7f 100644 --- a/src/main/java/duke/command/ListCommand.java +++ b/src/main/java/duke/command/ListCommand.java @@ -11,9 +11,9 @@ public ListCommand(TodoList todoList) { } @Override - public void execute() throws DukeExceptions { + public String execute() throws DukeExceptions { String shown_list = todoList.toString(); - System.out.println(shown_list); + return(shown_list); } } diff --git a/src/main/java/duke/command/MarkCommand.java b/src/main/java/duke/command/MarkCommand.java index 2a0852d402..c2c93d886e 100644 --- a/src/main/java/duke/command/MarkCommand.java +++ b/src/main/java/duke/command/MarkCommand.java @@ -13,5 +13,5 @@ public MarkCommand(TodoList todoList, int index) { } @Override - public void execute() throws DukeExceptions { todoList.mark(index); } + public String execute() throws DukeExceptions { return todoList.mark(index); } } diff --git a/src/main/java/duke/command/UnmarkCommand.java b/src/main/java/duke/command/UnmarkCommand.java index d3140bf35d..3def595042 100644 --- a/src/main/java/duke/command/UnmarkCommand.java +++ b/src/main/java/duke/command/UnmarkCommand.java @@ -13,7 +13,7 @@ public UnmarkCommand(TodoList todoList, int index) { } @Override - public void execute() throws DukeExceptions { - todoList.unmark(index); + public String execute() throws DukeExceptions { + return todoList.unmark(index); } } diff --git a/src/main/java/duke/ui/DialogBox.java b/src/main/java/duke/ui/DialogBox.java index 9434ef6656..f30f3a33a4 100644 --- a/src/main/java/duke/ui/DialogBox.java +++ b/src/main/java/duke/ui/DialogBox.java @@ -1,2 +1,49 @@ -package duke.ui;public class DialogBox { +package duke.ui; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.text.Font; + +public class DialogBox extends HBox { + private Label text; + private ImageView displayPicture; + + public DialogBox(Label l, ImageView iv) { + text = l; + displayPicture = iv; + + text.setWrapText(true); + text.setFont(Font.font("Comic Sans MS")); + text.setPadding(new Insets(5.0, 10.0, 10.0, 10.0)); + displayPicture.setFitHeight(50.0); + displayPicture.setFitWidth(50.0); + + this.setAlignment(Pos.TOP_RIGHT); + this.setPadding(new Insets(5.0)); + this.getChildren().addAll(text, displayPicture); + } + + private void flip() { + this.setAlignment(Pos.TOP_LEFT); + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + FXCollections.reverse(tmp); + this.getChildren().setAll(tmp); + } + + public static DialogBox getUserDialog(Label l, ImageView iv) { + return new DialogBox(l, iv); + } + + public static DialogBox getDukeDialog(Label l, ImageView iv) { + var db = new DialogBox(l, iv); + db.flip(); + return db; + } } + diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 26b9571cde..4edde58461 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -1,2 +1,143 @@ -package duke.ui;public class Ui { +package duke.ui; + +import java.io.IOException; + +import duke.DukeExceptions; +import duke.Parser; +import duke.Storage; +import duke.TodoList; +import duke.command.Command; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class Ui extends Application{ + private final Image user = new Image(this.getClass().getResourceAsStream("/images/user.png")); + private final Image duke = new Image(this.getClass().getResourceAsStream("/images/duke.png")); + private Parser bot; + private Storage storage; + private TodoList todoList; + + @Override + public void init() { + this.storage = new Storage(); + this.todoList = storage.load(); + this.bot = new Parser(todoList); + } + + @Override + public void start(Stage stage) throws IOException { + + //Step 1: Setting + AnchorPane mainLayout = new AnchorPane(); + + ScrollPane scrollPane = new ScrollPane(); + VBox dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + TextField userInput = new TextField("Type your command here"); + Button sendButton = new Button("Send"); + mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); + + //Step 2: Formatting + double height = 600.0; + double width = 400.0; + stage.setMinHeight(height); + stage.setMinWidth(width); + stage.setResizable(false); + + mainLayout.setPrefSize(width, height); + + scrollPane.setPrefSize(width - 15, height - 65); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(325.0); + + sendButton.setPrefWidth(55.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(sendButton, 1.0); + AnchorPane.setRightAnchor(sendButton, 1.0); + + AnchorPane.setLeftAnchor(userInput , 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + dialogContainer.heightProperty().addListener((observable -> {scrollPane.setVvalue(1.0);})); + + //Step 3: Handle action + sendButton.setOnMouseClicked((event) -> { + String userInputCommand = userInput.getText(); + Label userText = new Label(userInputCommand); + String response = ""; + try { + Command command = bot.parse(userInputCommand); + response = command.execute(); + } catch (DukeExceptions error) { + response = error.getErrorMessage(); + } + Label dukeText = new Label(response); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(userText, new ImageView(user)), + DialogBox.getDukeDialog(dukeText, new ImageView(duke)) + ); + userInput.clear(); + }); + + userInput.setOnAction((event) -> { + String userInputCommand = userInput.getText(); + Label userText = new Label(userInputCommand); + String response = ""; + try { + Command command = bot.parse(userInputCommand); + response = command.execute(); + } catch (DukeExceptions error) { + response = error.getErrorMessage(); + } + Label dukeText = new Label(response); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(userText, new ImageView(user)), + DialogBox.getDukeDialog(dukeText, new ImageView(duke)) + ); + userInput.clear(); + }); + + Scene scene = new Scene(mainLayout); + stage.setTitle("Duke"); + stage.setScene(scene); + stage.show(); + } + + @Override + public void stop() throws Exception { + storage.save(todoList); + } + + /** + * Iteration 2: + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + + private Label getDialogLabel(String text) { + Label textToAdd = new Label(text); + textToAdd.setWrapText(true); + return textToAdd; + } + } From 35f3de50e468baca0512d19026aff4c875c8aa48 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Sun, 19 Feb 2023 19:48:45 +0800 Subject: [PATCH 23/35] Complete A-Varargs --- src/main/java/duke/ui/DialogBox.java | 4 ++++ src/main/java/duke/ui/Ui.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/duke/ui/DialogBox.java b/src/main/java/duke/ui/DialogBox.java index f30f3a33a4..81e6835a16 100644 --- a/src/main/java/duke/ui/DialogBox.java +++ b/src/main/java/duke/ui/DialogBox.java @@ -10,6 +10,10 @@ import javafx.scene.layout.HBox; import javafx.scene.text.Font; +/** + * Represents a dialog, use code from https://se-education.org/guides/tutorials/javaFx.html + * with some modification in format setting. + */ public class DialogBox extends HBox { private Label text; private ImageView displayPicture; diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 4edde58461..7fb203544c 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -20,6 +20,11 @@ import javafx.scene.layout.VBox; import javafx.stage.Stage; +/** + * Represents User Interface, handle interaction with users, use code from + * https://se-education.org/guides/tutorials/javaFx.html with modification in format, + * some additional method and fields, some logic handling. + */ public class Ui extends Application{ private final Image user = new Image(this.getClass().getResourceAsStream("/images/user.png")); private final Image duke = new Image(this.getClass().getResourceAsStream("/images/duke.png")); From a3698bdc125bb22479977ba829685328c64fbf78 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 10:49:50 +0800 Subject: [PATCH 24/35] Add images --- src/main/resources/images/duke.png | Bin 0 -> 40161 bytes src/main/resources/images/user.png | Bin 0 -> 66316 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/images/duke.png create mode 100644 src/main/resources/images/user.png diff --git a/src/main/resources/images/duke.png b/src/main/resources/images/duke.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad766272b678a79a1ac237439ce79e5f18e1545 GIT binary patch literal 40161 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
lcX%yNyV_!?BAhWqCAb4j;GV*)6~FRf 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 literal 0 HcmV?d00001 From 94aa96a178ddc69a034fb05ee15ec87ae44eb059 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 11:07:55 +0800 Subject: [PATCH 25/35] Complete A-Assertions --- build.gradle | 1 + src/main/java/duke/Parser.java | 1 - src/main/java/duke/Task.java | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index b47c9b65e6..58a0cc6a84 100644 --- a/build.gradle +++ b/build.gradle @@ -51,4 +51,5 @@ shadowJar { run{ standardInput = System.in + enableAssertions = true } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 3a042df4f5..3b70e97cf8 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -29,7 +29,6 @@ public Parser(TodoList todoList) { public Command parse(String command) throws DukeExceptions { String[] split_command = command.split(" ", 2); String instruction = split_command[0]; - if (instruction.equals("list")) { if (split_command.length == 1) { return new ListCommand(todoList); diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index ee9d67a43d..240e0c2a78 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -39,7 +39,7 @@ public Task createNewTask(String type, String task) throws DukeExceptions{ } else if (type.equals("event")) { return new Event(task); } else { - throw new DukeExceptions("unknown command! Please try again."); + assert false : "Should not allow creating " + type; } } From 6fdfd7e7e6f8a1b4752de9cb422eb2df6637bd5e Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 11:47:18 +0800 Subject: [PATCH 26/35] Complete A-CodeQuality Delete dead code, change some code to follow coding standard --- src/main/java/duke/Task.java | 1 - src/main/java/duke/TodoList.java | 48 +++++++++---------- .../java/duke/command/AddTaskCommand.java | 2 +- src/main/java/duke/command/DeleteCommand.java | 2 +- src/test/java/duke/TodoListTest.java | 2 +- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index ee9d67a43d..0e07e00428 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -11,7 +11,6 @@ public class Task implements Serializable { private Boolean isDone; private String description; -// private static final long serialVersionUID = -7531925916726747642; public Task() { this.isDone = false; diff --git a/src/main/java/duke/TodoList.java b/src/main/java/duke/TodoList.java index e4d55e6130..cfc883b246 100644 --- a/src/main/java/duke/TodoList.java +++ b/src/main/java/duke/TodoList.java @@ -7,10 +7,10 @@ * Represents a list containing all tasks. */ public class TodoList implements Serializable { - private ArrayList todo_list; + private ArrayList todoList; public TodoList() { - this.todo_list = new ArrayList<>(100); + this.todoList = new ArrayList<>(100); } /** @@ -23,7 +23,7 @@ public TodoList() { public String add(String type, String task) throws DukeExceptions{ Task taskObject = new Task(); Task newTask = taskObject.createNewTask(type, task); - todo_list.add(newTask); + todoList.add(newTask); return ("Got it. I've added this task:\n" + newTask.toString()); } @@ -34,14 +34,14 @@ public String add(String type, String task) throws DukeExceptions{ * @throws DukeExceptions If the input syntax is incorrect. */ public String mark(int index) throws DukeExceptions{ - int todo_list_length = todo_list.size(); + int todo_list_length = todoList.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } - Task task = todo_list.get(index - 1); + Task task = todoList.get(index - 1); task.markTask(); - return String.format("Nice! I've marked this task as done:\n%s", todo_list.get(index-1)); + return String.format("Nice! I've marked this task as done:\n%s", todoList.get(index-1)); } /** @@ -51,14 +51,14 @@ public String mark(int index) throws DukeExceptions{ * @throws DukeExceptions If the input syntax is incorrect. */ public String unmark(int index) throws DukeExceptions{ - int todo_list_length = todo_list.size(); + int todo_list_length = todoList.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } - Task task = todo_list.get(index - 1); + Task task = todoList.get(index - 1); task.unmarkTask(); - return String.format("OK, I've marked this task as not done yet:\n%s", todo_list.get(index-1)); + return String.format("OK, I've marked this task as not done yet:\n%s", todoList.get(index-1)); } /** @@ -68,12 +68,12 @@ public String unmark(int index) throws DukeExceptions{ * @throws DukeExceptions If the input syntax is incorrect. */ public String delete(int index) throws DukeExceptions { - int todo_list_length = todo_list.size(); + int todo_list_length = todoList.size(); boolean isOutOfBound = index < 0 || index > todo_list_length; if (isOutOfBound) { throw new DukeExceptions("Please use list command to check the index!"); } - Task task = todo_list.remove(index - 1); + Task task = todoList.remove(index - 1); return String.format("Noted. I've removed this task:\n%s", task); } @@ -82,30 +82,30 @@ public String delete(int index) throws DukeExceptions { * * @return How many tasks in the list. */ - public int number_of_tasks() { - return todo_list.size(); + public int getNumberOfTasks() { + return todoList.size(); } public String find(String keyword) { - String result_list = ""; - int todo_list_length = todo_list.size(); + String resultList = ""; + int todoListLength = todoList.size(); int resultIndex = 1; - for (int i = 1; i <= todo_list_length; i++) { - Task task = todo_list.get(i-1); + for (int i = 1; i <= todoListLength; i++) { + Task task = todoList.get(i-1); if (task.doesContainKeyword(keyword)) { - result_list += String.format("%d. %s\n", resultIndex++, task); + resultList += String.format("%d. %s\n", resultIndex++, task); } } - return("Here are the matching tasks in your list:\n" + result_list); + return("Here are the matching tasks in your list:\n" + resultList); } @Override public String toString() { - String shown_list = ""; - int todo_list_length = todo_list.size(); - for (int i = 1; i <= todo_list_length; i++) { - shown_list += String.format("%d. %s\n", i, todo_list.get(i-1)); + String shownList = ""; + int todoListLength = todoList.size(); + for (int i = 1; i <= todoListLength; i++) { + shownList += String.format("%d. %s\n", i, todoList.get(i-1)); } - return shown_list; + return shownList; } } diff --git a/src/main/java/duke/command/AddTaskCommand.java b/src/main/java/duke/command/AddTaskCommand.java index 80d2f77ba4..b4c215665a 100644 --- a/src/main/java/duke/command/AddTaskCommand.java +++ b/src/main/java/duke/command/AddTaskCommand.java @@ -20,6 +20,6 @@ public AddTaskCommand(TodoList todoList, String instruction, String description) @Override public String execute() throws DukeExceptions { String result = todoList.add(instruction, description); - return(String.format("%s\nNow I have %d tasks in the list.", result, todoList.number_of_tasks())); + return(String.format("%s\nNow I have %d tasks in the list.", result, todoList.getNumberOfTasks())); } } diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index 6899a76ba8..d2d47e66b0 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -15,6 +15,6 @@ public DeleteCommand(TodoList todoList, int index) { @Override public String execute() throws DukeExceptions { todoList.delete(index); - return(String.format("Now I have %d tasks in the list.", todoList.number_of_tasks())); + return(String.format("Now I have %d tasks in the list.", todoList.getNumberOfTasks())); } } diff --git a/src/test/java/duke/TodoListTest.java b/src/test/java/duke/TodoListTest.java index a41e6836bf..a2af92b003 100644 --- a/src/test/java/duke/TodoListTest.java +++ b/src/test/java/duke/TodoListTest.java @@ -10,7 +10,7 @@ public void addToDoTask(){ try { TodoList newTodoList = new TodoList(); newTodoList.add("todo", "read book"); - assertEquals(newTodoList.number_of_tasks(), 1); + assertEquals(newTodoList.getNumberOfTasks(), 1); } catch (DukeExceptions ex) { System.out.println(ex.getErrorMessage()); } From a352bacb52a9c6e7fd011dc01c8e850df63a658f Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 14:15:57 +0800 Subject: [PATCH 27/35] Complete BCD-Exetension Add task option duration Add bye command --- src/main/java/duke/Parser.java | 2 +- src/main/java/duke/Task.java | 25 +++++++++++++++++++++++++ src/main/java/duke/ui/Ui.java | 26 +++++++++++++------------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 3b70e97cf8..9d1c3c3f88 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -13,7 +13,7 @@ public class Parser { private TodoList todoList; - private enum Instructions {todo, deadline, event, mark, unmark, delete, find} + private enum Instructions {todo, deadline, event, duration, mark, unmark, delete, find} public Parser(TodoList todoList) { this.todoList = todoList; diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index 1d5dcba585..db5b1df3c0 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -37,8 +37,11 @@ public Task createNewTask(String type, String task) throws DukeExceptions{ return new Deadline(task); } else if (type.equals("event")) { return new Event(task); + } else if (type.equals("duration")) { + return new Duration(task); } else { assert false : "Should not allow creating " + type; + return null; } } @@ -216,4 +219,26 @@ public String toString() { return name; } } + + private class Duration extends Task { + private static final long serialVersionUID = -7531925916726747641L; + private String task; + private String duration; + + public Duration(String task) throws DukeExceptions { + super(task); + String[] commands = task.split(" /needs "); + if (commands.length == 1) { + throw new DukeExceptions("OOPS!!! Looks like someone forget his/her duration :)\n Please use /needs to indicate duration"); + } + this.task = commands[0]; + this.duration = commands[1]; + } + + @Override + public String toString() { + String name = super.isDone ? "[D][X] " + task + " (needs: " + this.duration +")" : "[D][ ] " + task + " (needs: " + this.duration +")"; + return name; + } + } } diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 7fb203544c..7ae0e9cafd 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -8,6 +8,7 @@ import duke.TodoList; import duke.command.Command; import javafx.application.Application; +import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -90,6 +91,12 @@ public void start(Stage stage) throws IOException { String userInputCommand = userInput.getText(); Label userText = new Label(userInputCommand); String response = ""; + + if (userInputCommand.equals("bye")) { + userInput.clear(); + Platform.exit(); + stage.close(); + } try { Command command = bot.parse(userInputCommand); response = command.execute(); @@ -108,6 +115,11 @@ public void start(Stage stage) throws IOException { String userInputCommand = userInput.getText(); Label userText = new Label(userInputCommand); String response = ""; + if (userInputCommand.equals("bye")) { + userInput.clear(); + Platform.exit(); + stage.close(); + } try { Command command = bot.parse(userInputCommand); response = command.execute(); @@ -129,20 +141,8 @@ public void start(Stage stage) throws IOException { } @Override - public void stop() throws Exception { + public void stop() { storage.save(todoList); } - /** - * Iteration 2: - * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to - * the dialog container. Clears the user input after processing. - */ - - private Label getDialogLabel(String text) { - Label textToAdd = new Label(text); - textToAdd.setWrapText(true); - return textToAdd; - } - } From 4ba6b4d4285a28b4d7fc4a955fd716b042b1eab2 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 14:29:29 +0800 Subject: [PATCH 28/35] Fix some error --- src/main/java/duke/command/DeleteCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/command/DeleteCommand.java b/src/main/java/duke/command/DeleteCommand.java index d2d47e66b0..865665ae67 100644 --- a/src/main/java/duke/command/DeleteCommand.java +++ b/src/main/java/duke/command/DeleteCommand.java @@ -14,7 +14,7 @@ public DeleteCommand(TodoList todoList, int index) { @Override public String execute() throws DukeExceptions { - todoList.delete(index); - return(String.format("Now I have %d tasks in the list.", todoList.getNumberOfTasks())); + String message = todoList.delete(index); + return(String.format("%s\nNow I have %d tasks in the list.", message, todoList.getNumberOfTasks())); } } From 7db313ad71b14d3ac23c4a38ffb8731dd31f00c7 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 15:08:30 +0800 Subject: [PATCH 29/35] Complete A-UserGuide --- docs/README.md | 156 +++++++++++++++++++++++++++++++++-- docs/Ui.png | Bin 0 -> 67534 bytes src/main/java/duke/Task.java | 2 +- 3 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 docs/Ui.png diff --git a/docs/README.md b/docs/README.md index 8077118ebe..04fd4fc625 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,28 +2,166 @@ ## Features -### Feature-ABC +### Feature Add -Description of the feature. +Add one of 4 types of task: +1. Todo task +2. Deadline task +3. Event task +4. Duration task -### Feature-XYZ +### Feature Mark/Unmark -Description of the feature. +Mark a task done or unmark it. + +### Feature Delete + +Delete a task . + +### Feature Find + +Find a task with keywords. ## Usage -### `Keyword` - Describe action +### `todo description` - Add general task -Describe the action and its outcome. +Add a task with the given description. Example of usage: -`keyword (optional arguments)` +`todo read books` + +Expected outcome: + +``` +Got it. I've added this task: +[T][ ] read book +Now I have 1 tasks in the list. +``` + +### `deadline description /by time` - Add task with deadline + +Add a task with the given description and deadline. + +Example of usage: + +`deadline return book /by Sunday` + +Expected outcome: + +``` +Got it. I've added this task: +[D][ ] return book (by: Sunday) +Now I have 2 tasks in the list. +``` + +### `event description /from start time /to end time` - Add task with begin and end time + +Add a task with the given description and begin and end time. + +Example of usage: + +`event programming study /from 5pm /to 9pm` Expected outcome: -Description of the outcome. +``` +Got it. I've added this task: +[E][ ] programming study (from: 5pm to: 9pm) +Now I have 3 tasks in the list. +``` + +### `duration description /need start time` - Add task with duration + +Add a task with the given description and duration. + +Example of usage: + +`duration practice singing /needs 2 days` + +Expected outcome: + +``` +Got it. I've added this task: +[Du][ ] practice singing (needs: 2 days) +Now I have 4 tasks in the list. +``` + +### `list` - show list of tasks + +Display list of tasks so far. + +Example of usage: + +`list` + +Expected outcome: + +``` +1. [T][ ] read book +2. [D][ ] return book (by: Sunday) +3. [E][ ] programming study (from: 5pm to: 9pm) +4. [Du][ ] practice singing (needs: 2 days) +``` + +### `mark index` - mark task done + +Mark task at the given index as done. + +Example of usage: + +`mark 1` + +Expected outcome: + +``` +Nice! I've marked this task as done: +[T][X] read book +``` + +### `unmark index` - unmark task done + +unMark task at the given index as done. + +Example of usage: + +`unmark 1` + +Expected outcome: + +``` +OK, I've marked this task as not done yet: +[T][ ] read book +``` + +### `delete index` - delete task from the list + +Delete task at the given index. + +Example of usage: + +`delete 1` + +Expected outcome: + +``` +Noted. I've removed this task: +[T][ ] read book +Now I have 3 tasks in the list. +``` + +### `find keyword` - find task + +Find task containing keyword in the list. + +Example of usage: + +`find book` + +Expected outcome: ``` -expected output +Here are the matching tasks in your list: +1. [D][ ] return book (by: Sunday) ``` diff --git a/docs/Ui.png b/docs/Ui.png new file mode 100644 index 0000000000000000000000000000000000000000..c04e32029d2808e2f16a5f94f767a55f5b557862 GIT binary patch literal 67534 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

lI0Ui!ca?-K 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%0DbYgYmIm0Xbj8WMixG{T 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 literal 0 HcmV?d00001 diff --git a/src/main/java/duke/Task.java b/src/main/java/duke/Task.java index db5b1df3c0..4ec4ddecc0 100644 --- a/src/main/java/duke/Task.java +++ b/src/main/java/duke/Task.java @@ -237,7 +237,7 @@ public Duration(String task) throws DukeExceptions { @Override public String toString() { - String name = super.isDone ? "[D][X] " + task + " (needs: " + this.duration +")" : "[D][ ] " + task + " (needs: " + this.duration +")"; + String name = super.isDone ? "[Du][X] " + task + " (needs: " + this.duration +")" : "[Du][ ] " + task + " (needs: " + this.duration +")"; return name; } } From 2e7d8bc52828b06a2d7683f493e2f0437ca267e0 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 15:37:54 +0800 Subject: [PATCH 30/35] Trigger rebuild From 68dc253b68cd695713eba1cfe23b9e0474338f57 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Mon, 20 Feb 2023 15:40:48 +0800 Subject: [PATCH 31/35] Fix Readme --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 04fd4fc625..7b4ad14087 100644 --- a/docs/README.md +++ b/docs/README.md @@ -72,7 +72,7 @@ Got it. I've added this task: Now I have 3 tasks in the list. ``` -### `duration description /need start time` - Add task with duration +### `duration description /needs start time` - Add task with duration Add a task with the given description and duration. From f4f17f8b9670eb81f0cff364bbad4417ef3c01c1 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Tue, 28 Feb 2023 17:37:08 +0800 Subject: [PATCH 32/35] Make Duke compatible with Linux --- build.gradle | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 58a0cc6a84..074ffc161b 100644 --- a/build.gradle +++ b/build.gradle @@ -9,14 +9,15 @@ plugins { repositories { mavenCentral() } - +/* javafx { version = "19" modules = [ 'javafx.controls' ] } - +*/ checkstyle { toolVersion = '10.2' + ignoreFailures = true } @@ -24,6 +25,19 @@ checkstyle { dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' + String javaFxVersion = '11' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' } test { From 4a64ff087e5b6d8d462daa9dc674bf6c49f3c9d5 Mon Sep 17 00:00:00 2001 From: duong truong minh Date: Thu, 2 Mar 2023 14:46:05 +0800 Subject: [PATCH 33/35] Update Readme.md --- README.md | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 0f2208ab64..6a9fb20da7 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,10 @@ -# duke.Duke project template +#Welcome to Duke +##A Personal Assistant Chatbot that helps a person to keep track of various tasks -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. +![](https://zhongli5712.github.io/ip/Ui.png) -## Setting up in Intellij +> User interface example -Prerequisites: JDK 11, update Intellij to the most recent version. +You can view the user guide [here](https://zhongli5712.github.io/ip/). -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 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.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 - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` +You can download jar file in the latest release and run the file by command ```java -jar duke.jar```. \ No newline at end of file From 1a8a463bef63c657b72aba2464ef2dbfeb5b93c6 Mon Sep 17 00:00:00 2001 From: Zhongli5712 <83548489+Zhongli5712@users.noreply.github.com> Date: Thu, 2 Mar 2023 14:48:43 +0800 Subject: [PATCH 34/35] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6a9fb20da7..d9826a2b65 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -#Welcome to Duke -##A Personal Assistant Chatbot that helps a person to keep track of various tasks +# Welcome to Duke +## A Personal Assistant Chatbot that helps a person to keep track of various tasks ![](https://zhongli5712.github.io/ip/Ui.png) @@ -7,4 +7,4 @@ You can view the user guide [here](https://zhongli5712.github.io/ip/). -You can download jar file in the latest release and run the file by command ```java -jar duke.jar```. \ No newline at end of file +You can download jar file in the latest release and run the file by command ```java -jar duke.jar```. From 4692bc5e3429172a02bc2ee63fd8d4babf8373ef Mon Sep 17 00:00:00 2001 From: Zhongli5712 <83548489+Zhongli5712@users.noreply.github.com> Date: Tue, 7 Mar 2023 22:59:34 +0800 Subject: [PATCH 35/35] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d9826a2b65..760ed90eea 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,6 @@ You can view the user guide [here](https://zhongli5712.github.io/ip/). You can download jar file in the latest release and run the file by command ```java -jar duke.jar```. + +## Acknowledgement +This project is referencing resources on the Duke project created by the [SE-EDU Initiative](https://se-education.org/)