From 556af3f47a96b32898ab4cdbd65b16486a4871e8 Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/33] 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 d931af63fc80713812c317177f41bd8521a2638c Mon Sep 17 00:00:00 2001 From: Randall Date: Mon, 16 Jan 2023 18:50:45 +0800 Subject: [PATCH 02/33] Level-1 --- src/main/java/Duke.java | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334cc..a632da38bf 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,24 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; + public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + public static void main(String[] args) throws IOException { + + System.out.println("Hello! I'm Duke\n" + + "What can I do for you?"); + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String word = br.readLine(); + ArrayList lst = new ArrayList<>(); + lst.add(word); + + while (!word.equals("bye")) { + System.out.println("Duke: " + word); + word = br.readLine(); + } + System.out.println("Duke: Goodbye"); } } From 34904a0f3027967a084d18351bdfff01935e9424 Mon Sep 17 00:00:00 2001 From: Randall Date: Mon, 16 Jan 2023 18:56:19 +0800 Subject: [PATCH 03/33] Level-1 --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2873e189e1..b50afce371 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT + +*.class \ No newline at end of file From 4e12dadb97c868b328b8a9c74eda856241cdf880 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Mon, 16 Jan 2023 19:25:01 +0800 Subject: [PATCH 04/33] Level-2 --- src/main/java/Duke.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a632da38bf..62cd053c69 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.Iterator; public class Duke { public static void main(String[] args) throws IOException { @@ -13,11 +14,21 @@ public static void main(String[] args) throws IOException { String word = br.readLine(); ArrayList lst = new ArrayList<>(); - lst.add(word); while (!word.equals("bye")) { - System.out.println("Duke: " + word); - word = br.readLine(); + if (word.equals("list")) { + int curr = 1; + Iterator iter = lst.iterator(); + while (iter.hasNext()) { + System.out.println(curr + ". " + iter.next()); + curr++; + } + word = br.readLine(); + } else { + System.out.println("Added: " + word); + lst.add(word); + word = br.readLine(); + } } System.out.println("Duke: Goodbye"); } From 510ffffa7ef4fc8056fade56f20a3a5d81f4f6ed Mon Sep 17 00:00:00 2001 From: randallnhr Date: Wed, 18 Jan 2023 21:31:42 +0800 Subject: [PATCH 05/33] Level-3 --- src/main/java/Duke.java | 47 ++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 62cd053c69..09e0ba25ca 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -12,24 +12,51 @@ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String word = br.readLine(); - ArrayList lst = new ArrayList<>(); + String[] word = br.readLine().split(" "); + ArrayList lst = new ArrayList<>(); - while (!word.equals("bye")) { - if (word.equals("list")) { + while (!word[0].equals("bye")) { + if (word[0].equals("list")) { int curr = 1; - Iterator iter = lst.iterator(); + Iterator iter = lst.iterator(); while (iter.hasNext()) { - System.out.println(curr + ". " + iter.next()); + System.out.println(curr + " " + iter.next()); curr++; } - word = br.readLine(); + word = br.readLine().split(" "); + } else if (word[0].equals("mark")) { + Task t = lst.get(Integer.parseInt(word[1]) - 1); + t.isDone = true; + System.out.println("Task has been marked as done:\n " + t); + word = br.readLine().split(" "); + } else if (word[0].equals("unmark")) { + Task t = lst.get(Integer.parseInt(word[1]) - 1); + t.isDone = false; + System.out.println("Task has been marked as not done:\n " + t); + word = br.readLine().split(" "); } else { - System.out.println("Added: " + word); - lst.add(word); - word = br.readLine(); + System.out.println("Added task: " + word[0]); + lst.add(new Task(word[0])); + word = br.readLine().split(" "); } } System.out.println("Duke: Goodbye"); } } + +class Task { + protected String name; + protected boolean isDone; + + public Task(String name) { + this.name = name; + this.isDone = false; + } + + @Override + public String toString() { + return isDone + ? "[X] " + this.name + : "[ ] " + this.name; + } +} From 927000ea664df6fced0b18d5c6bbd82956d94d07 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Thu, 19 Jan 2023 10:56:59 +0800 Subject: [PATCH 06/33] Level-4 --- src/main/java/Deadline.java | 12 +++++++++ src/main/java/Duke.java | 49 +++++++++++++++++++++---------------- src/main/java/Event.java | 12 +++++++++ src/main/java/Task.java | 20 +++++++++++++++ src/main/java/Todo.java | 12 +++++++++ 5 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 0000000000..824662af8b --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,12 @@ +class Deadline extends Task { + public Deadline(String name, String start) { + super(name, start, null); + } + + @Override + public String toString() { + return this.isDone + ? "[D][X] " + this.name + " (by: " + this.startDate + ")" + : "[D][ ] " + this.name + " (by: " + this.startDate + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 09e0ba25ca..d73bd840d1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Iterator; + public class Duke { public static void main(String[] args) throws IOException { @@ -12,8 +13,9 @@ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String[] word = br.readLine().split(" "); + String[] word = br.readLine().split(" ",2); ArrayList lst = new ArrayList<>(); + int count = 0; while (!word[0].equals("bye")) { if (word[0].equals("list")) { @@ -23,40 +25,45 @@ public static void main(String[] args) throws IOException { System.out.println(curr + " " + iter.next()); curr++; } - word = br.readLine().split(" "); + word = br.readLine().split(" ",2); } else if (word[0].equals("mark")) { Task t = lst.get(Integer.parseInt(word[1]) - 1); t.isDone = true; System.out.println("Task has been marked as done:\n " + t); - word = br.readLine().split(" "); + word = br.readLine().split(" ",2); } else if (word[0].equals("unmark")) { Task t = lst.get(Integer.parseInt(word[1]) - 1); t.isDone = false; System.out.println("Task has been marked as not done:\n " + t); - word = br.readLine().split(" "); + word = br.readLine().split(" ",2); + } else if (word[0].equals("todo")) { + Task t = new Todo(word[1]); + lst.add(t); + count++; + System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().split(" ",2); + } else if (word[0].equals("deadline")) { + String[] tempWord = word[1].split("/by "); + Task t = new Deadline(tempWord[0], tempWord[1].strip()); + lst.add(t); + count++; + System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().split(" ",2); + } else if (word[0].equals("event")) { + String[] tempWord = word[1].split("/"); + Task t = new Event(tempWord[0], tempWord[1].split(" ",2)[1].strip(), tempWord[2].split(" ")[1].strip()); + lst.add(t); + count++; + System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().split(" ",2); } else { - System.out.println("Added task: " + word[0]); - lst.add(new Task(word[0])); - word = br.readLine().split(" "); + System.out.println("Error"); + word = br.readLine().split(" ",2); } } System.out.println("Duke: Goodbye"); } } -class Task { - protected String name; - protected boolean isDone; - public Task(String name) { - this.name = name; - this.isDone = false; - } - @Override - public String toString() { - return isDone - ? "[X] " + this.name - : "[ ] " + this.name; - } -} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 0000000000..887900212a --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,12 @@ +class Event extends Task { + public Event(String name, String start, String end) { + super(name, start, end); + } + + @Override + public String toString() { + return this.isDone + ? "[E][X] " + this.name + " (from: " + this.startDate + " to: " + this.endDate + ")" + : "[E][ ] " + this.name + " (from: " + this.startDate + " to: " + this.endDate + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..307f5c1d5e --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,20 @@ +public class Task { + protected String name; + protected boolean isDone; + protected String startDate; + protected String endDate; + + public Task(String name, String date1, String date2) { + this.name = name; + this.isDone = false; + this.startDate = date1; + this.endDate = date2; + } + + @Override + public String toString() { + return this.isDone + ? "[X] " + this.name + : "[ ] " + this.name; + } +} \ No newline at end of file diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 0000000000..6377081430 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,12 @@ +public class Todo extends Task { + public Todo(String name) { + super(name, null, null); + } + + @Override + public String toString() { + return this.isDone + ? "[T][X] " + this.name + : "[T][ ] " + this.name; + } +} \ No newline at end of file From 73158483669efda80ce6271e683d9d74c71ed8a9 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Fri, 20 Jan 2023 14:33:39 +0800 Subject: [PATCH 07/33] A-TextUiTesting --- text-ui-test/EXPECTED.TXT | 26 +++++++++++++++++++------- text-ui-test/input.txt | 7 +++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e7..e7b1744eb9 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,19 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - +Hello! I'm Duke +What can I do for you? +Added new todo: + [T][ ] task 1 +Number of tasks: 1 +Added new deadline: + [D][ ] task 2 (by: sun) +Number of tasks: 2 +Added new event: + [E][ ] task 3 (from: sun to: mon) +Number of tasks: 3 +1 [T][ ] task 1 +2 [D][ ] task 2 (by: sun) +3 [E][ ] task 3 (from: sun to: mon) +Task has been marked as done: + [D][X] task 2 (by: sun) +Task has been marked as not done: + [D][ ] task 2 (by: sun) +Duke: Goodbye \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb2..dbcd0bedc3 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,7 @@ +todo task 1 +deadline task 2 /by sun +event task 3 /from sun /to mon +list +mark 2 +unmark 2 +bye \ No newline at end of file From 149e1d0433befb9f4b859ff45199574a490a646b Mon Sep 17 00:00:00 2001 From: randallnhr Date: Fri, 20 Jan 2023 15:18:16 +0800 Subject: [PATCH 08/33] Level-5 --- src/main/java/Duke.java | 121 ++++++++++++++++++++----------- src/main/java/DukeException.java | 5 ++ 2 files changed, 82 insertions(+), 44 deletions(-) create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d73bd840d1..e5b5977d36 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -6,61 +6,94 @@ public class Duke { - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, DukeException { System.out.println("Hello! I'm Duke\n" + "What can I do for you?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String[] word = br.readLine().split(" ",2); ArrayList lst = new ArrayList<>(); int count = 0; + String[] word = br.readLine().strip().split(" ",2); - while (!word[0].equals("bye")) { - if (word[0].equals("list")) { - int curr = 1; - Iterator iter = lst.iterator(); - while (iter.hasNext()) { - System.out.println(curr + " " + iter.next()); - curr++; + while (!word[0].equals("bye")) { + try { + if (word[0].equals("list")) { + int curr = 1; + Iterator iter = lst.iterator(); + while (iter.hasNext()) { + System.out.println(curr + " " + iter.next()); + curr++; + } + word = br.readLine().strip().split(" ",2); + } else if (word[0].equals("mark")) { + if (word.length == 1) { + throw new DukeException("Mark needs a number."); + } + if (Integer.parseInt(word[1]) > count) { + throw new DukeException("Invalid task."); + } + Task t = lst.get(Integer.parseInt(word[1]) - 1); + t.isDone = true; + System.out.println("Task has been marked as done:\n " + t); + word = br.readLine().split(" ",2); + } else if (word[0].equals("unmark")) { + if (word.length == 1) { + throw new DukeException("Unmark needs a number."); + } + if (Integer.parseInt(word[1]) > count) { + throw new DukeException("Invalid task."); + } + Task t = lst.get(Integer.parseInt(word[1]) - 1); + t.isDone = false; + System.out.println("Task has been marked as not done:\n " + t); + word = br.readLine().split(" ",2); + } else if (word[0].equals("todo")) { + if (word.length == 1) { + throw new DukeException("todo needs a description"); + } + Task t = new Todo(word[1].strip()); + lst.add(t); + count++; + System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); + } else if (word[0].equals("deadline")) { + if (word.length == 1 || !word[1].contains("/by")) { + throw new DukeException("Deadline needs a /by."); + } + String[] tempWord = word[1].strip().split("/by "); + if (tempWord.length == 1) { + throw new DukeException("/by needs a date/time."); + } + Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); + lst.add(t); + count++; + System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); + } else if (word[0].equals("event")) { + if (word.length == 1 || !word[1].contains("/from") || !word[1].contains("/to") ) { + throw new DukeException("Event needs a /from and /to."); + } + String[] tempWord = word[1].split("/"); + String[] from = tempWord[1].split(" ",2); + String[] to = tempWord[2].split(" ",2); + if (from.length == 1 || to.length == 1) { + throw new DukeException("/from and /to needs a date/time."); + } + Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); + lst.add(t); + count++; + System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); + } else { + throw new DukeException("Sorry I do not understand the command"); + } + } catch (DukeException e) { + System.out.println(e.getMessage()); + word = br.readLine().strip().split(" ",2); } - word = br.readLine().split(" ",2); - } else if (word[0].equals("mark")) { - Task t = lst.get(Integer.parseInt(word[1]) - 1); - t.isDone = true; - System.out.println("Task has been marked as done:\n " + t); - word = br.readLine().split(" ",2); - } else if (word[0].equals("unmark")) { - Task t = lst.get(Integer.parseInt(word[1]) - 1); - t.isDone = false; - System.out.println("Task has been marked as not done:\n " + t); - word = br.readLine().split(" ",2); - } else if (word[0].equals("todo")) { - Task t = new Todo(word[1]); - lst.add(t); - count++; - System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().split(" ",2); - } else if (word[0].equals("deadline")) { - String[] tempWord = word[1].split("/by "); - Task t = new Deadline(tempWord[0], tempWord[1].strip()); - lst.add(t); - count++; - System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().split(" ",2); - } else if (word[0].equals("event")) { - String[] tempWord = word[1].split("/"); - Task t = new Event(tempWord[0], tempWord[1].split(" ",2)[1].strip(), tempWord[2].split(" ")[1].strip()); - lst.add(t); - count++; - System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().split(" ",2); - } else { - System.out.println("Error"); - word = br.readLine().split(" ",2); } - } System.out.println("Duke: Goodbye"); } } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 0000000000..9b101d3f88 --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,5 @@ +public class DukeException extends Exception{ + public DukeException(String m) { + super(m); + } +} From 357e5f7259617b406e7efb46fb100adeac012dcb Mon Sep 17 00:00:00 2001 From: randallnhr Date: Fri, 20 Jan 2023 15:29:28 +0800 Subject: [PATCH 09/33] Level-6 --- src/main/java/Duke.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index e5b5977d36..a32689668c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Iterator; - public class Duke { public static void main(String[] args) throws IOException, DukeException { @@ -86,6 +85,17 @@ public static void main(String[] args) throws IOException, DukeException { count++; System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); word = br.readLine().strip().split(" ",2); + } else if (word[0].equals("delete")) { + if (word.length == 1) { + throw new DukeException("Delete needs a number."); + } + if (Integer.parseInt(word[1]) > count) { + throw new DukeException("Invalid task."); + } + Task t = lst.remove(Integer.parseInt(word[1]) - 1); + count--; + System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); } else { throw new DukeException("Sorry I do not understand the command"); } @@ -96,7 +106,4 @@ public static void main(String[] args) throws IOException, DukeException { } System.out.println("Duke: Goodbye"); } -} - - - +} \ No newline at end of file From c2c69033d1813d23015387a4fdeb09b9093b0f54 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sat, 4 Feb 2023 01:59:06 +0800 Subject: [PATCH 10/33] Level-7 --- src/main/java/Deadline.java | 7 +++++ src/main/java/Duke.java | 59 ++++++++++++++++++++++++++++++++++--- src/main/java/Event.java | 7 +++++ src/main/java/Task.java | 15 ++++++++++ src/main/java/Todo.java | 7 +++++ src/main/java/taskList.txt | 1 + 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/main/java/taskList.txt diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 824662af8b..efe09a202a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -3,6 +3,13 @@ public Deadline(String name, String start) { super(name, start, null); } + @Override + public String getFileDesc() { + return this.isDone + ? "D|1|" + this.name + "|" + this.startDate + : "D|0|" + this.name + "|" + this.startDate; + } + @Override public String toString() { return this.isDone diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a32689668c..2e8b7f015e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,19 +1,66 @@ import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; +import java.util.Scanner; public class Duke { + + private static final String SAVE_PATH = "./taskList.txt"; + + private static ArrayList loadData(String filePath) throws IOException { + ArrayList taskList = new ArrayList<>(); + File file = new File(filePath); + if (file.createNewFile()){ + return taskList; + } + Scanner sc = new Scanner(file); + while (sc.hasNextLine()) { + Task task; + String[] line = sc.nextLine().split("\\|"); + if (line[0].equals("T")) { + task = new Todo(line[2].strip()); + } else if (line[0].equals("D")) { + task = new Deadline(line[2], line[3]); + } else { + task = new Event(line[2], line[3], line[4]); + } + + if (line[1] == "1") { + task.mark(); + } + + taskList.add(task); + } + sc.close(); + return taskList; + } + + public static void storeData(ArrayList t) throws IOException { + File file = new File(SAVE_PATH); + if (file.createNewFile()) { + System.out.println("Created new file taskList.txt"); + } + FileWriter fw = new FileWriter(file); + String taskString = ""; + for (int i = 0; i < t.size(); i++){ + taskString += t.get(i).getFileDesc() + "\n"; + } + fw.write(taskString); + fw.close(); + } public static void main(String[] args) throws IOException, DukeException { System.out.println("Hello! I'm Duke\n" + "What can I do for you?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - - ArrayList lst = new ArrayList<>(); - int count = 0; + try { + ArrayList lst = loadData(SAVE_PATH); + int count = 0 + lst.size(); String[] word = br.readLine().strip().split(" ",2); while (!word[0].equals("bye")) { @@ -104,6 +151,10 @@ public static void main(String[] args) throws IOException, DukeException { word = br.readLine().strip().split(" ",2); } } - System.out.println("Duke: Goodbye"); + storeData(lst); + System.out.println("Duke: Goodbye"); + } catch (IOException e) { + System.out.println(e.getMessage()); + } } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 887900212a..87b68052eb 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -3,6 +3,13 @@ public Event(String name, String start, String end) { super(name, start, end); } + @Override + public String getFileDesc() { + return this.isDone + ? "E|1|" + this.name + "|" + this.startDate + "|" + this.endDate + : "E|0|" + this.name + "|" + this.startDate + "|" + this.endDate; + } + @Override public String toString() { return this.isDone diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 307f5c1d5e..9a5a8fb393 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -11,6 +11,21 @@ public Task(String name, String date1, String date2) { this.endDate = date2; } + public void mark() { + this.isDone = true; + } + + + public void unmark() { + this.isDone = false; + } + + public String getFileDesc() { + return this.isDone + ? "1|" + this.name + : "0|" + this.name; + } + @Override public String toString() { return this.isDone diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 6377081430..face48abbf 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -3,6 +3,13 @@ public Todo(String name) { super(name, null, null); } + @Override + public String getFileDesc() { + return this.isDone + ? "T|1|" + this.name + : "T|0|" + this.name; + } + @Override public String toString() { return this.isDone diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt new file mode 100644 index 0000000000..cb6376f274 --- /dev/null +++ b/src/main/java/taskList.txt @@ -0,0 +1 @@ +D|0|2|sun From 231ec2eb0fb9847ded1f946964e54f23e4eac4db Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sat, 4 Feb 2023 15:13:07 +0800 Subject: [PATCH 11/33] Level-8 --- src/main/java/Deadline.java | 10 +++++++--- src/main/java/Duke.java | 29 +++++++++++++++++++---------- src/main/java/Event.java | 17 +++++++++++++---- src/main/java/Task.java | 14 +++++++++----- src/main/java/Todo.java | 2 +- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 824662af8b..c11b0fbd46 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,12 +1,16 @@ +import java.time.LocalDate; + class Deadline extends Task { + private LocalDate deadline; public Deadline(String name, String start) { - super(name, start, null); + super(name); + this.deadline = LocalDate.parse(start); } @Override public String toString() { return this.isDone - ? "[D][X] " + this.name + " (by: " + this.startDate + ")" - : "[D][ ] " + this.name + " (by: " + this.startDate + ")"; + ? "[D][X] " + this.name + " (by: " + getDate(this.deadline) + ")" + : "[D][ ] " + this.name + " (by: " + getDate(this.deadline) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a32689668c..0ca38b483f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,6 +1,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Iterator; @@ -65,11 +66,15 @@ public static void main(String[] args) throws IOException, DukeException { if (tempWord.length == 1) { throw new DukeException("/by needs a date/time."); } - Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); - lst.add(t); - count++; - System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); + try { + Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); + lst.add(t); + count++; + System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); + } catch (DateTimeParseException e) { + throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); + } } else if (word[0].equals("event")) { if (word.length == 1 || !word[1].contains("/from") || !word[1].contains("/to") ) { throw new DukeException("Event needs a /from and /to."); @@ -80,11 +85,15 @@ public static void main(String[] args) throws IOException, DukeException { if (from.length == 1 || to.length == 1) { throw new DukeException("/from and /to needs a date/time."); } - Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); - lst.add(t); - count++; - System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); + try { + Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); + lst.add(t); + count++; + System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); + word = br.readLine().strip().split(" ",2); + } catch (DateTimeParseException e) { + throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); + } } else if (word[0].equals("delete")) { if (word.length == 1) { throw new DukeException("Delete needs a number."); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 887900212a..e1c6c2f820 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,12 +1,21 @@ +import java.time.LocalDate; + class Event extends Task { - public Event(String name, String start, String end) { - super(name, start, end); + private LocalDate from; + private LocalDate to; + public Event(String name, String start, String end) throws DukeException { + super(name); + this.from = LocalDate.parse(start); + this.to = LocalDate.parse(end); + if (this.from.isAfter(this.to)) { + throw new DukeException("/to date is before /from date"); + } } @Override public String toString() { return this.isDone - ? "[E][X] " + this.name + " (from: " + this.startDate + " to: " + this.endDate + ")" - : "[E][ ] " + this.name + " (from: " + this.startDate + " to: " + this.endDate + ")"; + ? "[E][X] " + this.name + " (from: " + getDate(this.from) + " to: " + getDate(this.to) + ")" + : "[E][ ] " + this.name + " (from: " + getDate(this.from) + " to: " + getDate(this.to) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 307f5c1d5e..d9e768638b 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,14 +1,18 @@ +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Task { protected String name; protected boolean isDone; - protected String startDate; - protected String endDate; - public Task(String name, String date1, String date2) { + public Task(String name) { this.name = name; this.isDone = false; - this.startDate = date1; - this.endDate = date2; + } + + public String getDate(LocalDate date) { + DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyy"); + return date.format(format); } @Override diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 6377081430..5d5344b2d3 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,6 +1,6 @@ public class Todo extends Task { public Todo(String name) { - super(name, null, null); + super(name); } @Override From 4614698af9830d61b24d5489691d533446f1298f Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sat, 4 Feb 2023 15:23:39 +0800 Subject: [PATCH 12/33] updated input and expected txt files --- text-ui-test/EXPECTED.TXT | 15 +++++++++------ text-ui-test/input.txt | 3 +++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index e7b1744eb9..6a8bd869df 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -4,16 +4,19 @@ Added new todo: [T][ ] task 1 Number of tasks: 1 Added new deadline: - [D][ ] task 2 (by: sun) + [D][ ] task 2 (by: May 05 2023) Number of tasks: 2 Added new event: - [E][ ] task 3 (from: sun to: mon) + [E][ ] task 3 (from: May 05 2023 to: May 06 2023) Number of tasks: 3 +Date after /by needs to be in format yyyy-mm-dd +Date after /from and /to needs to be in format yyyy-mm-dd +/to date is before /from date 1 [T][ ] task 1 -2 [D][ ] task 2 (by: sun) -3 [E][ ] task 3 (from: sun to: mon) +2 [D][ ] task 2 (by: May 05 2023) +3 [E][ ] task 3 (from: May 05 2023 to: May 06 2023) Task has been marked as done: - [D][X] task 2 (by: sun) + [D][X] task 2 (by: May 05 2023) Task has been marked as not done: - [D][ ] task 2 (by: sun) + [D][ ] task 2 (by: May 05 2023) Duke: Goodbye \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index dbcd0bedc3..d0be57369f 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,6 +1,9 @@ todo task 1 +deadline task 2 /by 2023-05-05 +event task 3 /from 2023-05-05 /to 2023-05-06 deadline task 2 /by sun event task 3 /from sun /to mon +event task 3 /from 2023-05-05 /to 2023-05-04 list mark 2 unmark 2 From df38bcaa73c0b6067b8b415c6c8aac4efc15e2b7 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sat, 4 Feb 2023 16:12:52 +0800 Subject: [PATCH 13/33] Merge Level-8 to master --- src/main/java/Deadline.java | 4 ++-- src/main/java/Duke.java | 32 ++++++++++++++++++-------------- src/main/java/Event.java | 4 ++-- src/main/java/Task.java | 5 +++++ src/main/java/taskList.txt | 3 ++- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 553f1f5793..d16ea5df17 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -10,8 +10,8 @@ public Deadline(String name, String start) { @Override public String getFileDesc() { return this.isDone - ? "D|1|" + this.name + "|" + this.startDate - : "D|0|" + this.name + "|" + this.startDate; + ? "D|1|" + this.name + "|" + convertFileDate(this.deadline) + : "D|0|" + this.name + "|" + convertFileDate(this.deadline); } @Override diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ca25bbc3f6..bedca3d77c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -20,21 +20,25 @@ private static ArrayList loadData(String filePath) throws IOException { } Scanner sc = new Scanner(file); while (sc.hasNextLine()) { - Task task; - String[] line = sc.nextLine().split("\\|"); - if (line[0].equals("T")) { - task = new Todo(line[2].strip()); - } else if (line[0].equals("D")) { - task = new Deadline(line[2], line[3]); - } else { - task = new Event(line[2], line[3], line[4]); - } - - if (line[1] == "1") { - task.mark(); + try { + Task task; + String[] line = sc.nextLine().split("\\|"); + if (line[0].equals("T")) { + task = new Todo(line[2].strip()); + } else if (line[0].equals("D")) { + task = new Deadline(line[2], line[3]); + } else { + task = new Event(line[2], line[3], line[4]); + } + + if (line[1] == "1") { + task.mark(); + } + + taskList.add(task); + } catch (DukeException e) { + System.out.println(e.getMessage()); } - - taskList.add(task); } sc.close(); return taskList; diff --git a/src/main/java/Event.java b/src/main/java/Event.java index ed5e8c526a..5b8780cbb1 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -15,8 +15,8 @@ public Event(String name, String start, String end) throws DukeException { @Override public String getFileDesc() { return this.isDone - ? "E|1|" + this.name + "|" + this.startDate + "|" + this.endDate - : "E|0|" + this.name + "|" + this.startDate + "|" + this.endDate; + ? "E|1|" + this.name + "|" + convertFileDate(this.from) + "|" + convertFileDate(this.to) + : "E|0|" + this.name + "|" + convertFileDate(this.from) + "|" + convertFileDate(this.to); } @Override diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 08cff88d68..cba173d054 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -15,6 +15,11 @@ public String getDate(LocalDate date) { return date.format(format); } + public String convertFileDate(LocalDate date) { + DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + return date.format(format); + } + public void mark() { this.isDone = true; } diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt index cb6376f274..a0e1ba49a5 100644 --- a/src/main/java/taskList.txt +++ b/src/main/java/taskList.txt @@ -1 +1,2 @@ -D|0|2|sun +D|0|1|2023-05-24 +E|0|2|2023-05-23|2023-05-24 From 5c0e7b1bf64d52140850b54a237835aa4644fcfb Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 01:35:40 +0800 Subject: [PATCH 14/33] A-MoreOOP --- src/main/java/Duke.java | 295 +++++++++++++++++------------------- src/main/java/Parser.java | 109 +++++++++++++ src/main/java/Storage.java | 74 +++++++++ src/main/java/TaskList.java | 52 +++++++ src/main/java/Ui.java | 31 ++++ src/main/java/taskList.txt | 5 +- 6 files changed, 405 insertions(+), 161 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/TaskList.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index bedca3d77c..ee5ec734bb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,173 +1,150 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileWriter; import java.io.IOException; -import java.io.InputStreamReader; -import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Scanner; public class Duke { private static final String SAVE_PATH = "./taskList.txt"; + private Storage storage; + private TaskList taskList; + private Ui ui = new Ui(); + private Parser parser = new Parser(); - private static ArrayList loadData(String filePath) throws IOException { - ArrayList taskList = new ArrayList<>(); - File file = new File(filePath); - if (file.createNewFile()){ - return taskList; - } - Scanner sc = new Scanner(file); - while (sc.hasNextLine()) { - try { - Task task; - String[] line = sc.nextLine().split("\\|"); - if (line[0].equals("T")) { - task = new Todo(line[2].strip()); - } else if (line[0].equals("D")) { - task = new Deadline(line[2], line[3]); - } else { - task = new Event(line[2], line[3], line[4]); - } - - if (line[1] == "1") { - task.mark(); - } - - taskList.add(task); - } catch (DukeException e) { - System.out.println(e.getMessage()); - } - } - sc.close(); - return taskList; - } - - public static void storeData(ArrayList t) throws IOException { - File file = new File(SAVE_PATH); - if (file.createNewFile()) { - System.out.println("Created new file taskList.txt"); - } - FileWriter fw = new FileWriter(file); - String taskString = ""; - for (int i = 0; i < t.size(); i++){ - taskString += t.get(i).getFileDesc() + "\n"; + public Duke() { + try { + this.storage = new Storage(SAVE_PATH); + this.taskList = storage.loadData(); + } catch (DukeException e) { + System.out.println(e.getMessage()); } - fw.write(taskString); - fw.close(); } - public static void main(String[] args) throws IOException, DukeException { - System.out.println("Hello! I'm Duke\n" + - "What can I do for you?"); - - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + public void run() { try { - ArrayList lst = loadData(SAVE_PATH); - int count = 0 + lst.size(); - String[] word = br.readLine().strip().split(" ",2); - - while (!word[0].equals("bye")) { - try { - if (word[0].equals("list")) { - int curr = 1; - Iterator iter = lst.iterator(); - while (iter.hasNext()) { - System.out.println(curr + " " + iter.next()); - curr++; - } - word = br.readLine().strip().split(" ",2); - } else if (word[0].equals("mark")) { - if (word.length == 1) { - throw new DukeException("Mark needs a number."); - } - if (Integer.parseInt(word[1]) > count) { - throw new DukeException("Invalid task."); - } - Task t = lst.get(Integer.parseInt(word[1]) - 1); - t.isDone = true; - System.out.println("Task has been marked as done:\n " + t); - word = br.readLine().split(" ",2); - } else if (word[0].equals("unmark")) { - if (word.length == 1) { - throw new DukeException("Unmark needs a number."); - } - if (Integer.parseInt(word[1]) > count) { - throw new DukeException("Invalid task."); - } - Task t = lst.get(Integer.parseInt(word[1]) - 1); - t.isDone = false; - System.out.println("Task has been marked as not done:\n " + t); - word = br.readLine().split(" ",2); - } else if (word[0].equals("todo")) { - if (word.length == 1) { - throw new DukeException("todo needs a description"); - } - Task t = new Todo(word[1].strip()); - lst.add(t); - count++; - System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); - } else if (word[0].equals("deadline")) { - if (word.length == 1 || !word[1].contains("/by")) { - throw new DukeException("Deadline needs a /by."); - } - String[] tempWord = word[1].strip().split("/by "); - if (tempWord.length == 1) { - throw new DukeException("/by needs a date/time."); - } - try { - Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); - lst.add(t); - count++; - System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); - } catch (DateTimeParseException e) { - throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); - } - } else if (word[0].equals("event")) { - if (word.length == 1 || !word[1].contains("/from") || !word[1].contains("/to") ) { - throw new DukeException("Event needs a /from and /to."); - } - String[] tempWord = word[1].split("/"); - String[] from = tempWord[1].split(" ",2); - String[] to = tempWord[2].split(" ",2); - if (from.length == 1 || to.length == 1) { - throw new DukeException("/from and /to needs a date/time."); - } - try { - Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); - lst.add(t); - count++; - System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); - } catch (DateTimeParseException e) { - throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); - } - } else if (word[0].equals("delete")) { - if (word.length == 1) { - throw new DukeException("Delete needs a number."); - } - if (Integer.parseInt(word[1]) > count) { - throw new DukeException("Invalid task."); - } - Task t = lst.remove(Integer.parseInt(word[1]) - 1); - count--; - System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); - word = br.readLine().strip().split(" ",2); - } else { - throw new DukeException("Sorry I do not understand the command"); - } - } catch (DukeException e) { - System.out.println(e.getMessage()); - word = br.readLine().strip().split(" ",2); - } + ui.start(); + String[] input = ui.readLine(); + while (!input[0].equals("bye")) { + ui.displayLine(); + parser.readInput(input, taskList); + ui.displayLine(); + input = ui.readLine(); } - storeData(lst); - System.out.println("Duke: Goodbye"); - } catch (IOException e) { + ui.goodbye(); + storage.storeData(this.taskList.getTasks()); + } catch (DukeException e) { System.out.println(e.getMessage()); } } -} \ No newline at end of file + + public static void main(String[] args) throws IOException, DukeException { + new Duke().run(); + } +} + // System.out.println("Hello! I'm Duke\n" + + // "What can I do for you?"); + + // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // try { + // ArrayList lst = loadData(SAVE_PATH); + // int count = 0 + lst.size(); + // String[] word = br.readLine().strip().split(" ",2); + + // while (!word[0].equals("bye")) { + // try { + // if (word[0].equals("list")) { + // int curr = 1; + // Iterator iter = lst.iterator(); + // while (iter.hasNext()) { + // System.out.println(curr + " " + iter.next()); + // curr++; + // } + // word = br.readLine().strip().split(" ",2); + // } else if (word[0].equals("mark")) { + // if (word.length == 1) { + // throw new DukeException("Mark needs a number."); + // } + // if (Integer.parseInt(word[1]) > count) { + // throw new DukeException("Invalid task."); + // } + // Task t = lst.get(Integer.parseInt(word[1]) - 1); + // t.isDone = true; + // System.out.println("Task has been marked as done:\n " + t); + // word = br.readLine().split(" ",2); + // } else if (word[0].equals("unmark")) { + // if (word.length == 1) { + // throw new DukeException("Unmark needs a number."); + // } + // if (Integer.parseInt(word[1]) > count) { + // throw new DukeException("Invalid task."); + // } + // Task t = lst.get(Integer.parseInt(word[1]) - 1); + // t.isDone = false; + // System.out.println("Task has been marked as not done:\n " + t); + // word = br.readLine().split(" ",2); + // } else if (word[0].equals("todo")) { + // if (word.length == 1) { + // throw new DukeException("todo needs a description"); + // } + // Task t = new Todo(word[1].strip()); + // lst.add(t); + // count++; + // System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); + // word = br.readLine().strip().split(" ",2); + // } else if (word[0].equals("deadline")) { + // if (word.length == 1 || !word[1].contains("/by")) { + // throw new DukeException("Deadline needs a /by."); + // } + // String[] tempWord = word[1].strip().split("/by "); + // if (tempWord.length == 1) { + // throw new DukeException("/by needs a date/time."); + // } + // try { + // Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); + // lst.add(t); + // count++; + // System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); + // word = br.readLine().strip().split(" ",2); + // } catch (DateTimeParseException e) { + // throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); + // } + // } else if (word[0].equals("event")) { + // if (word.length == 1 || !word[1].contains("/from") || !word[1].contains("/to") ) { + // throw new DukeException("Event needs a /from and /to."); + // } + // String[] tempWord = word[1].split("/"); + // String[] from = tempWord[1].split(" ",2); + // String[] to = tempWord[2].split(" ",2); + // if (from.length == 1 || to.length == 1) { + // throw new DukeException("/from and /to needs a date/time."); + // } + // try { + // Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); + // lst.add(t); + // count++; + // System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); + // word = br.readLine().strip().split(" ",2); + // } catch (DateTimeParseException e) { + // throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); + // } + // } else if (word[0].equals("delete")) { + // if (word.length == 1) { + // throw new DukeException("Delete needs a number."); + // } + // if (Integer.parseInt(word[1]) > count) { + // throw new DukeException("Invalid task."); + // } + // Task t = lst.remove(Integer.parseInt(word[1]) - 1); + // count--; + // System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); + // word = br.readLine().strip().split(" ",2); + // } else { + // throw new DukeException("Sorry I do not understand the command"); + // } + // } catch (DukeException e) { + // System.out.println(e.getMessage()); + // word = br.readLine().strip().split(" ",2); + // } + // } + // storeData(lst); + // System.out.println("Duke: Goodbye"); + // } catch (IOException e) { + // System.out.println(e.getMessage()); + // } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..b30fd0a71d --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,109 @@ +import java.time.format.DateTimeParseException; + +public class Parser { + public Parser() {}; + + public void readInput(String[] input, TaskList taskList) throws DukeException { + switch (input[0]) { + case "list": + taskList.list(); + break; + case "mark": + mark(input, taskList); + break; + case "unmark": + unmark(input, taskList); + break; + case "todo": + todo(input, taskList); + break; + case "deadline": + deadline(input, taskList); + break; + case "event": + event(input, taskList); + break; + case "delete": + delete(input, taskList); + break; + default: + throw new DukeException("Sorry I do not understand the command"); + } + } + + public void mark(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1) { + throw new DukeException("Mark needs a number."); + } + if (Integer.parseInt(input[1]) > taskList.size()) { + throw new DukeException("Invalid task."); + } + taskList.markTask(Integer.parseInt(input[1]) - 1); + } + + public void unmark(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1) { + throw new DukeException("Unmark needs a number."); + } + if (Integer.parseInt(input[1]) > taskList.size()) { + throw new DukeException("Invalid task."); + } + taskList.unmarkTask(Integer.parseInt(input[1]) - 1); + } + + public void todo(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1) { + throw new DukeException("todo needs a description"); + } + Task t = new Todo(input[1].strip()); + taskList.addTask(t); + System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + taskList.size()); + } + + public void deadline(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1 || !input[1].contains("/by")) { + throw new DukeException("Deadline needs a /by."); + } + String[] tempInput = input[1].strip().split("/by "); + if (tempInput.length == 1) { + throw new DukeException("/by needs a date/time."); + } + try { + Task t = new Deadline(tempInput[0].strip(), tempInput[1].strip()); + taskList.addTask(t); + System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + taskList.size()); + } catch (DateTimeParseException e) { + throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); + } + } + + public void event(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1 || !input[1].contains("/from") || !input[1].contains("/to") ) { + throw new DukeException("Event needs a /from and /to."); + } + String[] tempInput = input[1].split("/"); + String[] from = tempInput[1].split(" ",2); + String[] to = tempInput[2].split(" ",2); + if (from.length == 1 || to.length == 1) { + throw new DukeException("/from and /to needs a date/time."); + } + try { + Task t = new Event(tempInput[0].strip(), from[1].strip(), to[1].strip()); + taskList.addTask(t); + System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + taskList.size()); + } catch (DateTimeParseException e) { + throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); + } + } + + public void delete(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1) { + throw new DukeException("Delete needs a number."); + } + int index = Integer.parseInt(input[1]); + if (index > taskList.size()) { + throw new DukeException("Invalid task."); + } + taskList.deleteTask(index - 1); + } +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..6bb8dbd402 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,74 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class Storage { + private String filePath; + + public Storage(String filePath) { + this.filePath = filePath; + } + + public TaskList loadData() throws DukeException { + TaskList taskList = new TaskList(); + File file = new File(this.filePath); + try { + if (file.createNewFile()){ + return taskList; + } + } catch (IOException e) { + throw new DukeException("Something went wrong when accessing file"); + } + Scanner sc; + try { + sc = new Scanner(file); + } catch (FileNotFoundException e) { + throw new DukeException("Unable to read file"); + } + + while (sc.hasNextLine()) { + try { + Task task; + String[] line = sc.nextLine().split("\\|"); + if (line[0].equals("T")) { + task = new Todo(line[2].strip()); + } else if (line[0].equals("D")) { + task = new Deadline(line[2], line[3]); + } else { + task = new Event(line[2], line[3], line[4]); + } + + if (line[1].equals("1")) { + task.mark(); + } + + taskList.addTask(task); + } catch (DukeException e) { + System.out.println(e.getMessage()); + } + } + sc.close(); + return taskList; + } + + public void storeData(ArrayList t) throws DukeException { + File file = new File(this.filePath); + try { + if (file.createNewFile()) { + System.out.println("Created new file taskList.txt"); + } + FileWriter fw = new FileWriter(file); + String taskString = ""; + for (int i = 0; i < t.size(); i++){ + taskString += t.get(i).getFileDesc() + "\n"; + } + fw.write(taskString); + fw.close(); + } catch (IOException e) { + throw new DukeException("Unable to save to file"); + } + } +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..e3d333ffe1 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,52 @@ +import java.util.ArrayList; +import java.util.Iterator; + +public class TaskList { + private ArrayList taskList; + private int count; + + public TaskList() { + this.taskList = new ArrayList<>(); + } + + public void list() { + int curr = 1; + Iterator iter = this.taskList.iterator(); + while (iter.hasNext()) { + System.out.println(curr + " " + iter.next()); + curr++; + } + } + + public void addTask(Task t) { + this.taskList.add(t); + count++; + } + + + public void deleteTask(int i) { + Task t = this.taskList.remove(i); + count--; + System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); + } + + public void markTask(int i) { + Task t = this.taskList.get(i); + t.mark(); + System.out.println("Task has been marked as done:\n " + t); + } + + public void unmarkTask(int i) { + Task t = this.taskList.get(i); + t.unmark(); + System.out.println("Task has been marked as not done:\n " + t); + } + + public int size() { + return count; + } + + public ArrayList getTasks() { + return this.taskList; + } +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..9c4ceedf32 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,31 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Ui { + private BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + public void start() { + System.out.println("Hello! I'm Duke!\n" + + "What can I do for you?"); + displayLine(); + } + + public String[] readLine() throws DukeException { + try { + System.out.print("Type your command: "); + return br.readLine().strip().split(" ",2); + } catch (IOException e) { + throw new DukeException("Error reading input"); + } + } + + public void displayLine() { + System.out.println("_________________________________________\n"); + } + + public void goodbye() { + displayLine(); + System.out.println("Goodbye!"); + } +} diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt index a0e1ba49a5..09e8347b03 100644 --- a/src/main/java/taskList.txt +++ b/src/main/java/taskList.txt @@ -1,2 +1,3 @@ -D|0|1|2023-05-24 -E|0|2|2023-05-23|2023-05-24 +T|0|1 +D|1|2|2023-05-20 +E|0|3|2023-05-05|2023-05-06 From 674f297c5dff80ce8d710e080f26028c36c8ae90 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 16:36:21 +0800 Subject: [PATCH 15/33] A-Packages --- src/main/java/Duke.java | 144 +++----------------- src/main/java/{ => duke}/DukeException.java | 2 + src/main/java/{ => duke}/Parser.java | 34 ++++- src/main/java/{ => duke}/Storage.java | 7 + src/main/java/{ => duke}/TaskList.java | 4 + src/main/java/{ => duke}/Ui.java | 12 +- src/main/java/{ => duke/task}/Deadline.java | 4 +- src/main/java/{ => duke/task}/Event.java | 6 +- src/main/java/{ => duke/task}/Task.java | 2 + src/main/java/{ => duke/task}/Todo.java | 2 + src/main/java/taskList.txt | 3 - text-ui-test/EXPECTED.TXT | 70 +++++++--- text-ui-test/input.txt | 8 +- 13 files changed, 137 insertions(+), 161 deletions(-) rename src/main/java/{ => duke}/DukeException.java (87%) rename src/main/java/{ => duke}/Parser.java (82%) rename src/main/java/{ => duke}/Storage.java (95%) rename src/main/java/{ => duke}/TaskList.java (96%) rename src/main/java/{ => duke}/Ui.java (67%) rename src/main/java/{ => duke/task}/Deadline.java (91%) rename src/main/java/{ => duke/task}/Event.java (92%) rename src/main/java/{ => duke/task}/Task.java (98%) rename src/main/java/{ => duke/task}/Todo.java (95%) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ee5ec734bb..e1a56ad36e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,11 @@ import java.io.IOException; +import duke.DukeException; +import duke.Parser; +import duke.Storage; +import duke.TaskList; +import duke.Ui; + public class Duke { private static final String SAVE_PATH = "./taskList.txt"; @@ -17,134 +23,26 @@ public Duke() { } } - public void run() { - try { - ui.start(); - String[] input = ui.readLine(); - while (!input[0].equals("bye")) { - ui.displayLine(); - parser.readInput(input, taskList); - ui.displayLine(); - input = ui.readLine(); + public void run() throws IOException, DukeException{ + ui.start(); + String[] input = ui.readLine(); + while (!input[0].equals("bye")) { + try { + ui.displayLine(); + parser.readInput(input, taskList); + ui.displayLine(); + input = ui.readLine(); + } catch (DukeException e) { + System.out.println(e.getMessage()); + ui.displayLine(); + input = ui.readLine(); } - ui.goodbye(); - storage.storeData(this.taskList.getTasks()); - } catch (DukeException e) { - System.out.println(e.getMessage()); } + ui.goodbye(); + storage.storeData(this.taskList.getTasks()); } public static void main(String[] args) throws IOException, DukeException { new Duke().run(); } } - // System.out.println("Hello! I'm Duke\n" + - // "What can I do for you?"); - - // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - // try { - // ArrayList lst = loadData(SAVE_PATH); - // int count = 0 + lst.size(); - // String[] word = br.readLine().strip().split(" ",2); - - // while (!word[0].equals("bye")) { - // try { - // if (word[0].equals("list")) { - // int curr = 1; - // Iterator iter = lst.iterator(); - // while (iter.hasNext()) { - // System.out.println(curr + " " + iter.next()); - // curr++; - // } - // word = br.readLine().strip().split(" ",2); - // } else if (word[0].equals("mark")) { - // if (word.length == 1) { - // throw new DukeException("Mark needs a number."); - // } - // if (Integer.parseInt(word[1]) > count) { - // throw new DukeException("Invalid task."); - // } - // Task t = lst.get(Integer.parseInt(word[1]) - 1); - // t.isDone = true; - // System.out.println("Task has been marked as done:\n " + t); - // word = br.readLine().split(" ",2); - // } else if (word[0].equals("unmark")) { - // if (word.length == 1) { - // throw new DukeException("Unmark needs a number."); - // } - // if (Integer.parseInt(word[1]) > count) { - // throw new DukeException("Invalid task."); - // } - // Task t = lst.get(Integer.parseInt(word[1]) - 1); - // t.isDone = false; - // System.out.println("Task has been marked as not done:\n " + t); - // word = br.readLine().split(" ",2); - // } else if (word[0].equals("todo")) { - // if (word.length == 1) { - // throw new DukeException("todo needs a description"); - // } - // Task t = new Todo(word[1].strip()); - // lst.add(t); - // count++; - // System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + count); - // word = br.readLine().strip().split(" ",2); - // } else if (word[0].equals("deadline")) { - // if (word.length == 1 || !word[1].contains("/by")) { - // throw new DukeException("Deadline needs a /by."); - // } - // String[] tempWord = word[1].strip().split("/by "); - // if (tempWord.length == 1) { - // throw new DukeException("/by needs a date/time."); - // } - // try { - // Task t = new Deadline(tempWord[0].strip(), tempWord[1].strip()); - // lst.add(t); - // count++; - // System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + count); - // word = br.readLine().strip().split(" ",2); - // } catch (DateTimeParseException e) { - // throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); - // } - // } else if (word[0].equals("event")) { - // if (word.length == 1 || !word[1].contains("/from") || !word[1].contains("/to") ) { - // throw new DukeException("Event needs a /from and /to."); - // } - // String[] tempWord = word[1].split("/"); - // String[] from = tempWord[1].split(" ",2); - // String[] to = tempWord[2].split(" ",2); - // if (from.length == 1 || to.length == 1) { - // throw new DukeException("/from and /to needs a date/time."); - // } - // try { - // Task t = new Event(tempWord[0].strip(), from[1].strip(), to[1].strip()); - // lst.add(t); - // count++; - // System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + count); - // word = br.readLine().strip().split(" ",2); - // } catch (DateTimeParseException e) { - // throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); - // } - // } else if (word[0].equals("delete")) { - // if (word.length == 1) { - // throw new DukeException("Delete needs a number."); - // } - // if (Integer.parseInt(word[1]) > count) { - // throw new DukeException("Invalid task."); - // } - // Task t = lst.remove(Integer.parseInt(word[1]) - 1); - // count--; - // System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); - // word = br.readLine().strip().split(" ",2); - // } else { - // throw new DukeException("Sorry I do not understand the command"); - // } - // } catch (DukeException e) { - // System.out.println(e.getMessage()); - // word = br.readLine().strip().split(" ",2); - // } - // } - // storeData(lst); - // System.out.println("Duke: Goodbye"); - // } catch (IOException e) { - // System.out.println(e.getMessage()); - // } diff --git a/src/main/java/DukeException.java b/src/main/java/duke/DukeException.java similarity index 87% rename from src/main/java/DukeException.java rename to src/main/java/duke/DukeException.java index 9b101d3f88..37aef45abc 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/duke/DukeException.java @@ -1,3 +1,5 @@ +package duke; + public class DukeException extends Exception{ public DukeException(String m) { super(m); diff --git a/src/main/java/Parser.java b/src/main/java/duke/Parser.java similarity index 82% rename from src/main/java/Parser.java rename to src/main/java/duke/Parser.java index b30fd0a71d..7185ce458c 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/duke/Parser.java @@ -1,5 +1,12 @@ +package duke; + import java.time.format.DateTimeParseException; +import duke.task.Task; +import duke.task.Todo; +import duke.task.Deadline; +import duke.task.Event; + public class Parser { public Parser() {}; @@ -35,7 +42,13 @@ public void mark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Mark needs a number."); } - if (Integer.parseInt(input[1]) > taskList.size()) { + int index; + try { + index = Integer.parseInt(input[1]); + } catch (NumberFormatException e) { + throw new DukeException("Invalid number."); + } + if (index > taskList.size()) { throw new DukeException("Invalid task."); } taskList.markTask(Integer.parseInt(input[1]) - 1); @@ -45,7 +58,13 @@ public void unmark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Unmark needs a number."); } - if (Integer.parseInt(input[1]) > taskList.size()) { + int index; + try { + index = Integer.parseInt(input[1]); + } catch (NumberFormatException e) { + throw new DukeException("Invalid number."); + } + if (index > taskList.size()) { throw new DukeException("Invalid task."); } taskList.unmarkTask(Integer.parseInt(input[1]) - 1); @@ -73,7 +92,7 @@ public void deadline(String[] input, TaskList taskList) throws DukeException { taskList.addTask(t); System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + taskList.size()); } catch (DateTimeParseException e) { - throw new DukeException("Date after /by needs to be in format yyyy-mm-dd"); + throw new DukeException("Date after /by needs to be in format yyyy-mm-dd."); } } @@ -92,7 +111,7 @@ public void event(String[] input, TaskList taskList) throws DukeException { taskList.addTask(t); System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + taskList.size()); } catch (DateTimeParseException e) { - throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd"); + throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd."); } } @@ -100,7 +119,12 @@ public void delete(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Delete needs a number."); } - int index = Integer.parseInt(input[1]); + int index; + try { + index = Integer.parseInt(input[1]); + } catch (NumberFormatException e) { + throw new DukeException("Invalid number."); + } if (index > taskList.size()) { throw new DukeException("Invalid task."); } diff --git a/src/main/java/Storage.java b/src/main/java/duke/Storage.java similarity index 95% rename from src/main/java/Storage.java rename to src/main/java/duke/Storage.java index 6bb8dbd402..df3a5d98ce 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/duke/Storage.java @@ -1,3 +1,5 @@ +package duke; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; @@ -5,6 +7,11 @@ import java.util.ArrayList; import java.util.Scanner; +import duke.task.Task; +import duke.task.Todo; +import duke.task.Deadline; +import duke.task.Event; + public class Storage { private String filePath; diff --git a/src/main/java/TaskList.java b/src/main/java/duke/TaskList.java similarity index 96% rename from src/main/java/TaskList.java rename to src/main/java/duke/TaskList.java index e3d333ffe1..69cab01753 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -1,6 +1,10 @@ +package duke; + import java.util.ArrayList; import java.util.Iterator; +import duke.task.Task; + public class TaskList { private ArrayList taskList; private int count; diff --git a/src/main/java/Ui.java b/src/main/java/duke/Ui.java similarity index 67% rename from src/main/java/Ui.java rename to src/main/java/duke/Ui.java index 9c4ceedf32..b9e5e4fd15 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/duke/Ui.java @@ -1,3 +1,5 @@ +package duke; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -11,13 +13,9 @@ public void start() { displayLine(); } - public String[] readLine() throws DukeException { - try { - System.out.print("Type your command: "); - return br.readLine().strip().split(" ",2); - } catch (IOException e) { - throw new DukeException("Error reading input"); - } + public String[] readLine() throws IOException { + System.out.print("Type your command: "); + return br.readLine().strip().split(" ",2); } public void displayLine() { diff --git a/src/main/java/Deadline.java b/src/main/java/duke/task/Deadline.java similarity index 91% rename from src/main/java/Deadline.java rename to src/main/java/duke/task/Deadline.java index d16ea5df17..6835557c33 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -1,6 +1,8 @@ +package duke.task; + import java.time.LocalDate; -class Deadline extends Task { +public class Deadline extends Task { private LocalDate deadline; public Deadline(String name, String start) { super(name); diff --git a/src/main/java/Event.java b/src/main/java/duke/task/Event.java similarity index 92% rename from src/main/java/Event.java rename to src/main/java/duke/task/Event.java index 5b8780cbb1..feca8d8483 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/task/Event.java @@ -1,6 +1,10 @@ +package duke.task; + import java.time.LocalDate; -class Event extends Task { +import duke.DukeException; + +public class Event extends Task { private LocalDate from; private LocalDate to; public Event(String name, String start, String end) throws DukeException { diff --git a/src/main/java/Task.java b/src/main/java/duke/task/Task.java similarity index 98% rename from src/main/java/Task.java rename to src/main/java/duke/task/Task.java index cba173d054..5d32b78601 100644 --- a/src/main/java/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,3 +1,5 @@ +package duke.task; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/Todo.java b/src/main/java/duke/task/Todo.java similarity index 95% rename from src/main/java/Todo.java rename to src/main/java/duke/task/Todo.java index 567c4a857b..6226fc8d02 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -1,3 +1,5 @@ +package duke.task; + public class Todo extends Task { public Todo(String name) { super(name); diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt index 09e8347b03..e69de29bb2 100644 --- a/src/main/java/taskList.txt +++ b/src/main/java/taskList.txt @@ -1,3 +0,0 @@ -T|0|1 -D|1|2|2023-05-20 -E|0|3|2023-05-05|2023-05-06 diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 6a8bd869df..7e104566f3 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,22 +1,60 @@ -Hello! I'm Duke +Hello! I'm Duke! What can I do for you? +_________________________________________ + +Type your command: _________________________________________ + Added new todo: - [T][ ] task 1 -Number of tasks: 1 + [T][ ] 1 +Number of tasks: 4 +_________________________________________ + +Type your command: _________________________________________ + Added new deadline: - [D][ ] task 2 (by: May 05 2023) -Number of tasks: 2 + [D][ ] 2 (by: May 20 2023) +Number of tasks: 5 +_________________________________________ + +Type your command: _________________________________________ + Added new event: - [E][ ] task 3 (from: May 05 2023 to: May 06 2023) -Number of tasks: 3 -Date after /by needs to be in format yyyy-mm-dd -Date after /from and /to needs to be in format yyyy-mm-dd -/to date is before /from date -1 [T][ ] task 1 -2 [D][ ] task 2 (by: May 05 2023) -3 [E][ ] task 3 (from: May 05 2023 to: May 06 2023) + [E][ ] 3 (from: May 05 2023 to: May 06 2023) +Number of tasks: 6 +_________________________________________ + +Type your command: _________________________________________ + Task has been marked as done: - [D][X] task 2 (by: May 05 2023) + [T][X] 1 +_________________________________________ + +Type your command: _________________________________________ + +1 [T][X] 1 +2 [D][ ] 2 (by: May 20 2023) +3 [E][X] 3 (from: May 05 2023 to: May 06 2023) +4 [T][ ] 1 +5 [D][ ] 2 (by: May 20 2023) +6 [E][ ] 3 (from: May 05 2023 to: May 06 2023) +_________________________________________ + +Type your command: _________________________________________ + Task has been marked as not done: - [D][ ] task 2 (by: May 05 2023) -Duke: Goodbye \ No newline at end of file + [T][ ] 1 +_________________________________________ + +Type your command: _________________________________________ + +1 [T][ ] 1 +2 [D][ ] 2 (by: May 20 2023) +3 [E][X] 3 (from: May 05 2023 to: May 06 2023) +4 [T][ ] 1 +5 [D][ ] 2 (by: May 20 2023) +6 [E][ ] 3 (from: May 05 2023 to: May 06 2023) +_________________________________________ + +Type your command: _________________________________________ + +Goodbye! diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index d0be57369f..19bc25d8ef 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,10 +1,8 @@ todo task 1 deadline task 2 /by 2023-05-05 event task 3 /from 2023-05-05 /to 2023-05-06 -deadline task 2 /by sun -event task 3 /from sun /to mon -event task 3 /from 2023-05-05 /to 2023-05-04 +mark 1 +list +unmark 1 list -mark 2 -unmark 2 bye \ No newline at end of file From 2e673f7e20323863a7fa939e7634e2ecbd893a2c Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 18:10:53 +0800 Subject: [PATCH 16/33] A-Gradle --- build.gradle | 2 +- src/main/java/{ => duke}/Duke.java | 13 ++++++++----- src/main/java/taskList.txt | 1 + taskList.txt | 3 +++ text-ui-test/runtest.bat | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) rename src/main/java/{ => duke}/Duke.java (92%) create mode 100644 taskList.txt diff --git a/build.gradle b/build.gradle index 885198fcfa..0bdc254568 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ test { } application { - mainClassName = "seedu.duke.Duke" + mainClassName = "duke.Duke" } shadowJar { diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 92% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index e1a56ad36e..76dd61a48c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,3 +1,5 @@ +package duke; + import java.io.IOException; import duke.DukeException; @@ -23,6 +25,11 @@ public Duke() { } } + public static void main(String[] args) throws IOException, DukeException { + Duke duke = new Duke(); + duke.run(); + } + public void run() throws IOException, DukeException{ ui.start(); String[] input = ui.readLine(); @@ -30,7 +37,7 @@ public void run() throws IOException, DukeException{ try { ui.displayLine(); parser.readInput(input, taskList); - ui.displayLine(); + ui.displayLine(); input = ui.readLine(); } catch (DukeException e) { System.out.println(e.getMessage()); @@ -41,8 +48,4 @@ public void run() throws IOException, DukeException{ ui.goodbye(); storage.storeData(this.taskList.getTasks()); } - - public static void main(String[] args) throws IOException, DukeException { - new Duke().run(); - } } diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt index e69de29bb2..055934e2c0 100644 --- a/src/main/java/taskList.txt +++ b/src/main/java/taskList.txt @@ -0,0 +1 @@ +T|0|1 diff --git a/taskList.txt b/taskList.txt new file mode 100644 index 0000000000..50bda774f1 --- /dev/null +++ b/taskList.txt @@ -0,0 +1,3 @@ +T|1|1 +D|0|2|2023-05-20 +E|0|3|2023-05-05|2023-05-06 diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 0873744649..bb7a8849b7 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -7,7 +7,7 @@ REM delete output from previous run if exist ACTUAL.TXT del ACTUAL.TXT REM compile the code into the bin folder -javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java +javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\duke\*.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 From 359765a8e426c2346f77b83937c373a09f92e429 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 18:59:13 +0800 Subject: [PATCH 17/33] A-JUnit --- src/test/java/duke/task/DeadlineTest.java | 24 ++++++++++++++++++++++ src/test/java/duke/task/TodoTest.java | 25 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/test/java/duke/task/DeadlineTest.java create mode 100644 src/test/java/duke/task/TodoTest.java diff --git a/src/test/java/duke/task/DeadlineTest.java b/src/test/java/duke/task/DeadlineTest.java new file mode 100644 index 0000000000..90ee942c81 --- /dev/null +++ b/src/test/java/duke/task/DeadlineTest.java @@ -0,0 +1,24 @@ +package duke.task; + +import duke.DukeException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class DeadlineTest { + @Test + void getFileDesc() { + Deadline test = new Deadline("Test", "2023-05-05"); + assertEquals("D|0|Test|2023-05-05", test.getFileDesc()); + test.mark(); + assertEquals("D|1|Test|2023-05-05", test.getFileDesc()); + } + + @Test + void testToString() { + Deadline test = new Deadline("Test", "2023-05-05"); + assertEquals("[D][ ] Test (by: May 05 2023)", test.toString()); + test.mark(); + assertEquals("[D][X] Test (by: May 05 2023)", test.toString()); + } +} \ No newline at end of file diff --git a/src/test/java/duke/task/TodoTest.java b/src/test/java/duke/task/TodoTest.java new file mode 100644 index 0000000000..5ca430d5c4 --- /dev/null +++ b/src/test/java/duke/task/TodoTest.java @@ -0,0 +1,25 @@ +package duke.task; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class TodoTest { + + + @Test + void getFileDesc() { + Todo test = new Todo("Test"); + assertEquals("T|0|Test", test.getFileDesc()); + test.mark(); + assertEquals("T|1|Test", test.getFileDesc()); + } + + @Test + void testToString() { + Todo test = new Todo("Test"); + assertEquals("[T][ ] Test", test.toString()); + test.mark(); + assertEquals("[T][X] Test", test.toString()); + } +} \ No newline at end of file From 224fa3082dfc74897c67f3add2853cf7298ce9f4 Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 22:31:40 +0800 Subject: [PATCH 18/33] Add increment A-JavaDoc --- src/main/java/duke/Duke.java | 7 +++++ src/main/java/duke/Parser.java | 45 ++++++++++++++++++++++++++++++++ src/main/java/duke/Storage.java | 17 ++++++++++++ src/main/java/duke/TaskList.java | 34 +++++++++++++++++++++++- src/main/java/duke/Ui.java | 14 ++++++++++ src/main/java/taskList.txt | 1 - taskList.txt | 3 --- 7 files changed, 116 insertions(+), 5 deletions(-) delete mode 100644 src/main/java/taskList.txt diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 76dd61a48c..182fd2bf91 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -8,6 +8,9 @@ import duke.TaskList; import duke.Ui; +/** + * Represents the main Duke class. + */ public class Duke { private static final String SAVE_PATH = "./taskList.txt"; @@ -16,6 +19,9 @@ public class Duke { private Ui ui = new Ui(); private Parser parser = new Parser(); + /** + * Constructor for a Duke object. + */ public Duke() { try { this.storage = new Storage(SAVE_PATH); @@ -25,6 +31,7 @@ public Duke() { } } + public static void main(String[] args) throws IOException, DukeException { Duke duke = new Duke(); duke.run(); diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 7185ce458c..b408940da0 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -7,9 +7,18 @@ import duke.task.Deadline; import duke.task.Event; +/** + * Represents a class to decipher user's commands. + */ public class Parser { public Parser() {}; + /** + * Reads the command that the user input, calls the respective functions. + * @param input User's input command. + * @param taskList User's TaskList. + * @throws DukeException If user enters invalid input. + */ public void readInput(String[] input, TaskList taskList) throws DukeException { switch (input[0]) { case "list": @@ -38,6 +47,12 @@ public void readInput(String[] input, TaskList taskList) throws DukeException { } } + /** + * Method to handle the mark command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user enters invalid number or task that has not been created. + */ public void mark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Mark needs a number."); @@ -54,6 +69,12 @@ public void mark(String[] input, TaskList taskList) throws DukeException { taskList.markTask(Integer.parseInt(input[1]) - 1); } + /** + * Method to handle the unmark command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user enters invalid number or task that has not been created. + */ public void unmark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Unmark needs a number."); @@ -70,6 +91,12 @@ public void unmark(String[] input, TaskList taskList) throws DukeException { taskList.unmarkTask(Integer.parseInt(input[1]) - 1); } + /** + * Method to handle the todo command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user did not provide name of Todo. + */ public void todo(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("todo needs a description"); @@ -79,6 +106,12 @@ public void todo(String[] input, TaskList taskList) throws DukeException { System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + taskList.size()); } + /** + * Method to handle the deadline command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user did not enter /by date or invalid date format. + */ public void deadline(String[] input, TaskList taskList) throws DukeException { if (input.length == 1 || !input[1].contains("/by")) { throw new DukeException("Deadline needs a /by."); @@ -96,6 +129,12 @@ public void deadline(String[] input, TaskList taskList) throws DukeException { } } + /** + * Method to handle the event command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user did not enter /from or /to or invalid date format. + */ public void event(String[] input, TaskList taskList) throws DukeException { if (input.length == 1 || !input[1].contains("/from") || !input[1].contains("/to") ) { throw new DukeException("Event needs a /from and /to."); @@ -115,6 +154,12 @@ public void event(String[] input, TaskList taskList) throws DukeException { } } + /** + * Method to handle the delete command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user enters invalid number. + */ public void delete(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Delete needs a number."); diff --git a/src/main/java/duke/Storage.java b/src/main/java/duke/Storage.java index df3a5d98ce..fd1a7563f5 100644 --- a/src/main/java/duke/Storage.java +++ b/src/main/java/duke/Storage.java @@ -12,13 +12,25 @@ import duke.task.Deadline; import duke.task.Event; +/** + * Represents a class used to store and load user's tasks from Duke chatbot. + */ public class Storage { private String filePath; + /** + * Constructor for a Storage object. + * @param filePath Relative path of taskList.txt file. + */ public Storage(String filePath) { this.filePath = filePath; } + /** + * Loads a TaskList from taskList.txt. + * @return TaskList containing user's saved tasks. + * @throws DukeException If file could not be read. + */ public TaskList loadData() throws DukeException { TaskList taskList = new TaskList(); File file = new File(this.filePath); @@ -61,6 +73,11 @@ public TaskList loadData() throws DukeException { return taskList; } + /** + * Store user's tasks in a taskList.txt file in given relative file path. + * @param t User's tasks to store. + * @throws DukeException If unable to save file. + */ public void storeData(ArrayList t) throws DukeException { File file = new File(this.filePath); try { diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 69cab01753..553068b1e2 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -5,14 +5,23 @@ import duke.task.Task; +/** + * Represents a class to store a user's tasks. + */ public class TaskList { private ArrayList taskList; private int count; + /** + * Constructor for a TaskList object. + */ public TaskList() { this.taskList = new ArrayList<>(); } + /** + * Prints a user's tasks in list form. + */ public void list() { int curr = 1; Iterator iter = this.taskList.iterator(); @@ -22,34 +31,57 @@ public void list() { } } + /** + * Adds a task to the user's TaskList. + * @param t Task to be added. + */ public void addTask(Task t) { this.taskList.add(t); count++; } - + /** + * Removes a task from the user's TaskList. + * @param i Index of task to be deleted. + */ public void deleteTask(int i) { Task t = this.taskList.remove(i); count--; System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); } + /** + * Marks the given task as completed. + * @param i Index of task to be marked. + */ public void markTask(int i) { Task t = this.taskList.get(i); t.mark(); System.out.println("Task has been marked as done:\n " + t); } + /** + * Unmarks the given task as completed. + * @param i Index of task to be unmarked. + */ public void unmarkTask(int i) { Task t = this.taskList.get(i); t.unmark(); System.out.println("Task has been marked as not done:\n " + t); } + /** + * Returns the number of tasks in the user's TaskList. + * @return int Number of tasks + */ public int size() { return count; } + /** + * Returns the user's tasks in an ArrayList. + * @return ArrayList User's task + */ public ArrayList getTasks() { return this.taskList; } diff --git a/src/main/java/duke/Ui.java b/src/main/java/duke/Ui.java index b9e5e4fd15..444e474a89 100644 --- a/src/main/java/duke/Ui.java +++ b/src/main/java/duke/Ui.java @@ -7,21 +7,35 @@ public class Ui { private BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + /** + * Prints a greeting message when the program starts. + */ public void start() { System.out.println("Hello! I'm Duke!\n" + "What can I do for you?"); displayLine(); } + /** + * Reads the input from the command line and returns an array of String with index 0 as the first word. + * @return array of String with index 0 as the first word + * @throws IOException On input error + */ public String[] readLine() throws IOException { System.out.print("Type your command: "); return br.readLine().strip().split(" ",2); } + /** + * Prints a line to separate user commands and output. + */ public void displayLine() { System.out.println("_________________________________________\n"); } + /** + * Prints a goodbye message when a bye command is entered. + */ public void goodbye() { displayLine(); System.out.println("Goodbye!"); diff --git a/src/main/java/taskList.txt b/src/main/java/taskList.txt deleted file mode 100644 index 055934e2c0..0000000000 --- a/src/main/java/taskList.txt +++ /dev/null @@ -1 +0,0 @@ -T|0|1 diff --git a/taskList.txt b/taskList.txt index 50bda774f1..e69de29bb2 100644 --- a/taskList.txt +++ b/taskList.txt @@ -1,3 +0,0 @@ -T|1|1 -D|0|2|2023-05-20 -E|0|3|2023-05-05|2023-05-06 From 24d5209c051f6d4570f120b757ec40a395bda69e Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 23:05:05 +0800 Subject: [PATCH 19/33] Remove redundant codes and correct layout of code --- src/main/java/duke/Duke.java | 28 +++++++--------- src/main/java/duke/Parser.java | 46 +++++++++++++-------------- src/main/java/duke/TaskList.java | 16 +++++----- src/main/java/duke/task/Deadline.java | 8 ++--- src/main/java/duke/task/Event.java | 8 ++--- src/main/java/duke/task/Todo.java | 8 ++--- 6 files changed, 48 insertions(+), 66 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 182fd2bf91..91db5f38a3 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -2,12 +2,6 @@ import java.io.IOException; -import duke.DukeException; -import duke.Parser; -import duke.Storage; -import duke.TaskList; -import duke.Ui; - /** * Represents the main Duke class. */ @@ -16,8 +10,8 @@ public class Duke { private static final String SAVE_PATH = "./taskList.txt"; private Storage storage; private TaskList taskList; - private Ui ui = new Ui(); - private Parser parser = new Parser(); + private static final Ui UI = new Ui(); + private static final Parser PARSER = new Parser(); /** * Constructor for a Duke object. @@ -38,21 +32,21 @@ public static void main(String[] args) throws IOException, DukeException { } public void run() throws IOException, DukeException{ - ui.start(); - String[] input = ui.readLine(); + UI.start(); + String[] input = UI.readLine(); while (!input[0].equals("bye")) { try { - ui.displayLine(); - parser.readInput(input, taskList); - ui.displayLine(); - input = ui.readLine(); + UI.displayLine(); + PARSER.readInput(input, taskList); + UI.displayLine(); + input = UI.readLine(); } catch (DukeException e) { System.out.println(e.getMessage()); - ui.displayLine(); - input = ui.readLine(); + UI.displayLine(); + input = UI.readLine(); } } - ui.goodbye(); + UI.goodbye(); storage.storeData(this.taskList.getTasks()); } } diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index b408940da0..4fe110155d 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -21,29 +21,29 @@ public class Parser { */ public void readInput(String[] input, TaskList taskList) throws DukeException { switch (input[0]) { - case "list": - taskList.list(); - break; - case "mark": - mark(input, taskList); - break; - case "unmark": - unmark(input, taskList); - break; - case "todo": - todo(input, taskList); - break; - case "deadline": - deadline(input, taskList); - break; - case "event": - event(input, taskList); - break; - case "delete": - delete(input, taskList); - break; - default: - throw new DukeException("Sorry I do not understand the command"); + case "list": + taskList.list(); + break; + case "mark": + mark(input, taskList); + break; + case "unmark": + unmark(input, taskList); + break; + case "todo": + todo(input, taskList); + break; + case "deadline": + deadline(input, taskList); + break; + case "event": + event(input, taskList); + break; + case "delete": + delete(input, taskList); + break; + default: + throw new DukeException("Sorry I do not understand the command"); } } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 553068b1e2..f74c254e9c 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -9,14 +9,14 @@ * Represents a class to store a user's tasks. */ public class TaskList { - private ArrayList taskList; + private ArrayList tasks; private int count; /** * Constructor for a TaskList object. */ public TaskList() { - this.taskList = new ArrayList<>(); + this.tasks = new ArrayList<>(); } /** @@ -24,7 +24,7 @@ public TaskList() { */ public void list() { int curr = 1; - Iterator iter = this.taskList.iterator(); + Iterator iter = this.tasks.iterator(); while (iter.hasNext()) { System.out.println(curr + " " + iter.next()); curr++; @@ -36,7 +36,7 @@ public void list() { * @param t Task to be added. */ public void addTask(Task t) { - this.taskList.add(t); + this.tasks.add(t); count++; } @@ -45,7 +45,7 @@ public void addTask(Task t) { * @param i Index of task to be deleted. */ public void deleteTask(int i) { - Task t = this.taskList.remove(i); + Task t = this.tasks.remove(i); count--; System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); } @@ -55,7 +55,7 @@ public void deleteTask(int i) { * @param i Index of task to be marked. */ public void markTask(int i) { - Task t = this.taskList.get(i); + Task t = this.tasks.get(i); t.mark(); System.out.println("Task has been marked as done:\n " + t); } @@ -65,7 +65,7 @@ public void markTask(int i) { * @param i Index of task to be unmarked. */ public void unmarkTask(int i) { - Task t = this.taskList.get(i); + Task t = this.tasks.get(i); t.unmark(); System.out.println("Task has been marked as not done:\n " + t); } @@ -83,6 +83,6 @@ public int size() { * @return ArrayList User's task */ public ArrayList getTasks() { - return this.taskList; + return this.tasks; } } diff --git a/src/main/java/duke/task/Deadline.java b/src/main/java/duke/task/Deadline.java index 6835557c33..d1ea3d9039 100644 --- a/src/main/java/duke/task/Deadline.java +++ b/src/main/java/duke/task/Deadline.java @@ -11,15 +11,11 @@ public Deadline(String name, String start) { @Override public String getFileDesc() { - return this.isDone - ? "D|1|" + this.name + "|" + convertFileDate(this.deadline) - : "D|0|" + this.name + "|" + convertFileDate(this.deadline); + return "D|" + super.getFileDesc() + "|" + convertFileDate(this.deadline); } @Override public String toString() { - return this.isDone - ? "[D][X] " + this.name + " (by: " + getDate(this.deadline) + ")" - : "[D][ ] " + this.name + " (by: " + getDate(this.deadline) + ")"; + return "[D]" + super.toString() + " (by: " + getDate(this.deadline) + ")"; } } \ No newline at end of file diff --git a/src/main/java/duke/task/Event.java b/src/main/java/duke/task/Event.java index feca8d8483..999442a95b 100644 --- a/src/main/java/duke/task/Event.java +++ b/src/main/java/duke/task/Event.java @@ -18,15 +18,11 @@ public Event(String name, String start, String end) throws DukeException { @Override public String getFileDesc() { - return this.isDone - ? "E|1|" + this.name + "|" + convertFileDate(this.from) + "|" + convertFileDate(this.to) - : "E|0|" + this.name + "|" + convertFileDate(this.from) + "|" + convertFileDate(this.to); + return "E|" + super.getFileDesc() + "|" + convertFileDate(this.from) + "|" + convertFileDate(this.to); } @Override public String toString() { - return this.isDone - ? "[E][X] " + this.name + " (from: " + getDate(this.from) + " to: " + getDate(this.to) + ")" - : "[E][ ] " + this.name + " (from: " + getDate(this.from) + " to: " + getDate(this.to) + ")"; + return "[E]" + super.toString() + " (from: " + getDate(this.from) + " to: " + getDate(this.to) + ")"; } } \ No newline at end of file diff --git a/src/main/java/duke/task/Todo.java b/src/main/java/duke/task/Todo.java index 6226fc8d02..5e271ae320 100644 --- a/src/main/java/duke/task/Todo.java +++ b/src/main/java/duke/task/Todo.java @@ -7,15 +7,11 @@ public Todo(String name) { @Override public String getFileDesc() { - return this.isDone - ? "T|1|" + this.name - : "T|0|" + this.name; + return "T|" + super.getFileDesc(); } @Override public String toString() { - return this.isDone - ? "[T][X] " + this.name - : "[T][ ] " + this.name; + return "[T]" + super.toString(); } } \ No newline at end of file From 74266a2217eed3965bcd3e8ca49e51023cd68e8e Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 5 Feb 2023 23:38:41 +0800 Subject: [PATCH 20/33] Add increment Level-9 --- src/main/java/duke/Parser.java | 17 +++++++++++++++++ src/main/java/duke/TaskList.java | 20 ++++++++++++++++++-- src/main/java/duke/task/Task.java | 4 ++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 4fe110155d..23da5e8048 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -42,6 +42,9 @@ public void readInput(String[] input, TaskList taskList) throws DukeException { case "delete": delete(input, taskList); break; + case "find": + find(input, taskList); + break; default: throw new DukeException("Sorry I do not understand the command"); } @@ -175,4 +178,18 @@ public void delete(String[] input, TaskList taskList) throws DukeException { } taskList.deleteTask(index - 1); } + + /** + * Method to handle the find command. + * @param input User's input + * @param taskList User's TaskList + * @throws DukeException If user did not enter a keyword. + */ + public void find(String[] input, TaskList taskList) throws DukeException { + if (input.length == 1) { + throw new DukeException("Find needs a keyword."); + } + System.out.println("Here are the matching tasks in your list:"); + taskList.findTask(input[1].strip()); + } } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index f74c254e9c..4b5adf4d41 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -20,17 +20,33 @@ public TaskList() { } /** - * Prints a user's tasks in list form. + * Prints the user's tasks in list form. */ public void list() { int curr = 1; Iterator iter = this.tasks.iterator(); while (iter.hasNext()) { - System.out.println(curr + " " + iter.next()); + Task task = iter.next(); + System.out.println(curr + ". " + task); curr++; } } + /** + * Prints the user's tasks that matches keyword in list form. + */ + public void findTask(String keyword) { + int curr = 1; + Iterator iter = this.tasks.iterator(); + while (iter.hasNext()) { + Task task = iter.next(); + if (task.getName().contains(keyword)) { + System.out.println(curr + ". " + task); + curr++; + } + } + } + /** * Adds a task to the user's TaskList. * @param t Task to be added. diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 5d32b78601..a543e0c877 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -17,6 +17,10 @@ public String getDate(LocalDate date) { return date.format(format); } + public String getName() { + return this.name; + } + public String convertFileDate(LocalDate date) { DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return date.format(format); From 1318085896f7e5abb4a42305b95b0360cbb6935c Mon Sep 17 00:00:00 2001 From: randallnhr Date: Sun, 12 Feb 2023 02:05:33 +0800 Subject: [PATCH 21/33] Add GUI Set up JavaFX and link Duke class to GUI. Add MainWindow.java as controller for as main GUI. Add DialogBox.java as controller for DialogBox in GUI. Add MainWindow.fxml and DialogBox.fxml for GUI layout and interaction --- build.gradle | 18 +++++- src/main/java/duke/DialogBox.java | 61 ++++++++++++++++++ src/main/java/duke/Duke.java | 18 ++++-- src/main/java/duke/Launcher.java | 9 +++ src/main/java/duke/Main.java | 31 +++++++++ src/main/java/duke/MainWindow.java | 53 +++++++++++++++ src/main/java/duke/Parser.java | 59 ++++++++--------- src/main/java/duke/TaskList.java | 24 ++++--- src/main/resources/images/DaDuke.png | Bin 0 -> 32657 bytes src/main/resources/images/DaUser.png | Bin 0 -> 37794 bytes .../resources/images/buddy, bleu icon.png | Bin 0 -> 48969 bytes src/main/resources/images/ligne-icon.png | Bin 0 -> 53702 bytes src/main/resources/view/DialogBox.fxml | 19 ++++++ src/main/resources/view/MainWindow.fxml | 19 ++++++ taskList.txt | 5 ++ 15 files changed, 267 insertions(+), 49 deletions(-) create mode 100644 src/main/java/duke/DialogBox.java create mode 100644 src/main/java/duke/Launcher.java create mode 100644 src/main/java/duke/Main.java create mode 100644 src/main/java/duke/MainWindow.java create mode 100644 src/main/resources/images/DaDuke.png create mode 100644 src/main/resources/images/DaUser.png create mode 100644 src/main/resources/images/buddy, bleu icon.png create mode 100644 src/main/resources/images/ligne-icon.png create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/build.gradle b/build.gradle index 0bdc254568..cc8c096c06 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'org.openjfx.javafxplugin' version '0.0.13' } repositories { @@ -9,8 +10,23 @@ repositories { } dependencies { + 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' 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 { @@ -28,7 +44,7 @@ test { } application { - mainClassName = "duke.Duke" + mainClassName = "duke.Launcher" } shadowJar { diff --git a/src/main/java/duke/DialogBox.java b/src/main/java/duke/DialogBox.java new file mode 100644 index 0000000000..d183f8252b --- /dev/null +++ b/src/main/java/duke/DialogBox.java @@ -0,0 +1,61 @@ +package duke; + +import java.io.IOException; +import java.util.Collections; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +/** + * An example of a custom control using FXML. + * This control represents a dialog box consisting of an ImageView to represent the speaker's face and a label + * containing text from the speaker. + */ +public class DialogBox extends HBox { + @FXML + private Label dialog; + @FXML + private ImageView displayPicture; + + private DialogBox(String text, Image img) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); + fxmlLoader.setController(this); + fxmlLoader.setRoot(this); + fxmlLoader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + dialog.setText(text); + displayPicture.setImage(img); + } + + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + Collections.reverse(tmp); + getChildren().setAll(tmp); + setAlignment(Pos.TOP_LEFT); + } + + public static DialogBox getUserDialog(String text, Image img) { + return new DialogBox(text, img); + } + + public static DialogBox getDukeDialog(String text, Image img) { + var db = new DialogBox(text, img); + db.flip(); + return db; + } +} \ No newline at end of file diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 91db5f38a3..1f987c30ea 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -25,12 +25,6 @@ public Duke() { } } - - public static void main(String[] args) throws IOException, DukeException { - Duke duke = new Duke(); - duke.run(); - } - public void run() throws IOException, DukeException{ UI.start(); String[] input = UI.readLine(); @@ -49,4 +43,16 @@ public void run() throws IOException, DukeException{ UI.goodbye(); storage.storeData(this.taskList.getTasks()); } + + public String getResponse(String input) { + String[] inputArr = input.strip().split(" ",2); + try { + String toPrint = PARSER.readInput(inputArr, taskList); + storage.storeData(this.taskList.getTasks()); + return toPrint; + } catch (DukeException e) { + return e.getMessage(); + } + } + } diff --git a/src/main/java/duke/Launcher.java b/src/main/java/duke/Launcher.java new file mode 100644 index 0000000000..b8c0f9c373 --- /dev/null +++ b/src/main/java/duke/Launcher.java @@ -0,0 +1,9 @@ +package duke; + +import javafx.application.Application; + +public class Launcher { + public static void main(String[] args) { + Application.launch(Main.class, args); + } +} diff --git a/src/main/java/duke/Main.java b/src/main/java/duke/Main.java new file mode 100644 index 0000000000..db593707b5 --- /dev/null +++ b/src/main/java/duke/Main.java @@ -0,0 +1,31 @@ +package duke; + +import java.io.IOException; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +/** + * A GUI for Duke using FXML. + */ +public class Main extends Application { + + private Duke duke = new Duke(); + + @Override + public void start(Stage stage) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + fxmlLoader.getController().setDuke(duke); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/duke/MainWindow.java b/src/main/java/duke/MainWindow.java new file mode 100644 index 0000000000..98083dc7a0 --- /dev/null +++ b/src/main/java/duke/MainWindow.java @@ -0,0 +1,53 @@ +package duke; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +/** + * Controller for MainWindow. Provides the layout for the other controls. + */ +public class MainWindow extends AnchorPane { + @FXML + private ScrollPane scrollPane; + @FXML + private VBox dialogContainer; + @FXML + private TextField userInput; + @FXML + private Button sendButton; + + private Duke duke; + + private Image userImage = new Image(this.getClass().getResourceAsStream("/images/buddy, bleu icon.png")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/ligne-icon.png")); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + dialogContainer.getChildren().addAll(DialogBox.getDukeDialog("Hello! I'm Duke!\n" + + "What can I do for you?", dukeImage)); + } + + public void setDuke(Duke d) { + duke = d; + } + + /** + * 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. + */ + @FXML + private void handleUserInput() { + String input = userInput.getText(); + String response = duke.getResponse(input); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(input, userImage), + DialogBox.getDukeDialog(response, dukeImage) + ); + userInput.clear(); + } +} diff --git a/src/main/java/duke/Parser.java b/src/main/java/duke/Parser.java index 23da5e8048..f7f54afb67 100644 --- a/src/main/java/duke/Parser.java +++ b/src/main/java/duke/Parser.java @@ -6,6 +6,7 @@ import duke.task.Todo; import duke.task.Deadline; import duke.task.Event; +import javafx.application.Platform; /** * Represents a class to decipher user's commands. @@ -19,32 +20,27 @@ public class Parser { * @param taskList User's TaskList. * @throws DukeException If user enters invalid input. */ - public void readInput(String[] input, TaskList taskList) throws DukeException { + public String readInput(String[] input, TaskList taskList) throws DukeException { switch (input[0]) { case "list": - taskList.list(); - break; + return taskList.list(); case "mark": - mark(input, taskList); - break; + return mark(input, taskList); case "unmark": - unmark(input, taskList); - break; + return unmark(input, taskList); case "todo": - todo(input, taskList); - break; + return todo(input, taskList); case "deadline": - deadline(input, taskList); - break; + return deadline(input, taskList); case "event": - event(input, taskList); - break; + return event(input, taskList); case "delete": - delete(input, taskList); - break; + return delete(input, taskList); case "find": - find(input, taskList); - break; + return find(input, taskList); + case "bye": + Platform.exit(); + return "Goodbye!"; default: throw new DukeException("Sorry I do not understand the command"); } @@ -56,7 +52,7 @@ public void readInput(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user enters invalid number or task that has not been created. */ - public void mark(String[] input, TaskList taskList) throws DukeException { + public String mark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Mark needs a number."); } @@ -69,7 +65,7 @@ public void mark(String[] input, TaskList taskList) throws DukeException { if (index > taskList.size()) { throw new DukeException("Invalid task."); } - taskList.markTask(Integer.parseInt(input[1]) - 1); + return taskList.markTask(Integer.parseInt(input[1]) - 1); } /** @@ -78,7 +74,7 @@ public void mark(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user enters invalid number or task that has not been created. */ - public void unmark(String[] input, TaskList taskList) throws DukeException { + public String unmark(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Unmark needs a number."); } @@ -91,7 +87,7 @@ public void unmark(String[] input, TaskList taskList) throws DukeException { if (index > taskList.size()) { throw new DukeException("Invalid task."); } - taskList.unmarkTask(Integer.parseInt(input[1]) - 1); + return taskList.unmarkTask(Integer.parseInt(input[1]) - 1); } /** @@ -100,13 +96,13 @@ public void unmark(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user did not provide name of Todo. */ - public void todo(String[] input, TaskList taskList) throws DukeException { + public String todo(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("todo needs a description"); } Task t = new Todo(input[1].strip()); taskList.addTask(t); - System.out.println("Added new todo:\n " + t + "\nNumber of tasks: " + taskList.size()); + return "Added new todo:\n " + t + "\nNumber of tasks: " + taskList.size(); } /** @@ -115,7 +111,7 @@ public void todo(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user did not enter /by date or invalid date format. */ - public void deadline(String[] input, TaskList taskList) throws DukeException { + public String deadline(String[] input, TaskList taskList) throws DukeException { if (input.length == 1 || !input[1].contains("/by")) { throw new DukeException("Deadline needs a /by."); } @@ -126,7 +122,7 @@ public void deadline(String[] input, TaskList taskList) throws DukeException { try { Task t = new Deadline(tempInput[0].strip(), tempInput[1].strip()); taskList.addTask(t); - System.out.println("Added new deadline:\n " + t + "\nNumber of tasks: " + taskList.size()); + return "Added new deadline:\n " + t + "\nNumber of tasks: " + taskList.size(); } catch (DateTimeParseException e) { throw new DukeException("Date after /by needs to be in format yyyy-mm-dd."); } @@ -138,7 +134,7 @@ public void deadline(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user did not enter /from or /to or invalid date format. */ - public void event(String[] input, TaskList taskList) throws DukeException { + public String event(String[] input, TaskList taskList) throws DukeException { if (input.length == 1 || !input[1].contains("/from") || !input[1].contains("/to") ) { throw new DukeException("Event needs a /from and /to."); } @@ -151,7 +147,7 @@ public void event(String[] input, TaskList taskList) throws DukeException { try { Task t = new Event(tempInput[0].strip(), from[1].strip(), to[1].strip()); taskList.addTask(t); - System.out.println("Added new event:\n " + t + "\nNumber of tasks: " + taskList.size()); + return "Added new event:\n " + t + "\nNumber of tasks: " + taskList.size(); } catch (DateTimeParseException e) { throw new DukeException("Date after /from and /to needs to be in format yyyy-mm-dd."); } @@ -163,7 +159,7 @@ public void event(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user enters invalid number. */ - public void delete(String[] input, TaskList taskList) throws DukeException { + public String delete(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Delete needs a number."); } @@ -176,7 +172,7 @@ public void delete(String[] input, TaskList taskList) throws DukeException { if (index > taskList.size()) { throw new DukeException("Invalid task."); } - taskList.deleteTask(index - 1); + return taskList.deleteTask(index - 1); } /** @@ -185,11 +181,10 @@ public void delete(String[] input, TaskList taskList) throws DukeException { * @param taskList User's TaskList * @throws DukeException If user did not enter a keyword. */ - public void find(String[] input, TaskList taskList) throws DukeException { + public String find(String[] input, TaskList taskList) throws DukeException { if (input.length == 1) { throw new DukeException("Find needs a keyword."); } - System.out.println("Here are the matching tasks in your list:"); - taskList.findTask(input[1].strip()); + return "Here are the matching tasks in your list:\n" + taskList.findTask(input[1].strip()); } } diff --git a/src/main/java/duke/TaskList.java b/src/main/java/duke/TaskList.java index 4b5adf4d41..5ef63cfd3b 100644 --- a/src/main/java/duke/TaskList.java +++ b/src/main/java/duke/TaskList.java @@ -22,29 +22,33 @@ public TaskList() { /** * Prints the user's tasks in list form. */ - public void list() { + public String list() { int curr = 1; + String toPrint = "Here are your tasks:\n"; Iterator iter = this.tasks.iterator(); while (iter.hasNext()) { Task task = iter.next(); - System.out.println(curr + ". " + task); + toPrint += curr + ". " + task + "\n"; curr++; } + return toPrint; } /** * Prints the user's tasks that matches keyword in list form. */ - public void findTask(String keyword) { + public String findTask(String keyword) { int curr = 1; + String toPrint = ""; Iterator iter = this.tasks.iterator(); while (iter.hasNext()) { Task task = iter.next(); if (task.getName().contains(keyword)) { - System.out.println(curr + ". " + task); + toPrint += curr + ". " + task + "\n"; curr++; } } + return toPrint; } /** @@ -60,30 +64,30 @@ public void addTask(Task t) { * Removes a task from the user's TaskList. * @param i Index of task to be deleted. */ - public void deleteTask(int i) { + public String deleteTask(int i) { Task t = this.tasks.remove(i); count--; - System.out.println("Deleted task:\n " + t + "\nNumber of tasks: " + count); + return "Deleted task:\n " + t + "\nNumber of tasks: " + count; } /** * Marks the given task as completed. * @param i Index of task to be marked. */ - public void markTask(int i) { + public String markTask(int i) { Task t = this.tasks.get(i); t.mark(); - System.out.println("Task has been marked as done:\n " + t); + return "Task has been marked as done:\n " + t; } /** * Unmarks the given task as completed. * @param i Index of task to be unmarked. */ - public void unmarkTask(int i) { + public String unmarkTask(int i) { Task t = this.tasks.get(i); t.unmark(); - System.out.println("Task has been marked as not done:\n " + t); + return "Task has been marked as not done:\n " + t; } /** diff --git a/src/main/resources/images/DaDuke.png b/src/main/resources/images/DaDuke.png new file mode 100644 index 0000000000000000000000000000000000000000..d893658717e29b50b4ceedada235d9f75835a118 GIT binary patch literal 32657 zcmV)5K*_&}P)Zf>Tg`t%N;{PE9Y2%-o7`CdniQG#9szpJX+ zcrVK`zK7pG^!n{1T{qo3os(XNkTqW0IXIfGihv^wpO4cHg6YjrzS7VYZJZVWev% z!fK9RcD(ntf zCxMCmC7oRZecuOe6J~p&f5@?I;U2zE;O2T?Vy_8UZ1S4i=b>l%q0jeYAI+i(>K zsIun-!&|SPodfa+5u7Z5yhtd`XRjxuF+Ww~1H4xg)(?GXYLo{q2VPiixh(3*`0iyFHj`V{p-_+Q4jWKC=o6ohr zW)q;Nb7IxtY}qD4RyBpAMv`rR!YytU)sgEIa8F)wX(O<=RwjYY+sLdy0`5o0>=a zd(GePvuhIc}2|`2Y7OgN%4u~XV>q*3e$65qJ;}bK0Li-Wh%~iQn_FhV_*O6|& z$E%S!>BN;~l+|jbw5B2<783HDuPYE-T1Z)&EZTFhZGIj)nseO*|7}7`Vz4%vMl&l& z!c*D(>n3|ulhD`D1FzG)Tik79GgrpJ#HE0O)y{gM#c%L1=xtu`A<9oj(;}Q6cpHb= zIjOSNTO3vD|G|N_tH+^nj?I`D4+@;j;9`s4!*lY>X2_|khHWO LGkWs%c&z?S( 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 z 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 KMNUMnLSTa5`eeEQ literal 0 HcmV?d00001 diff --git a/src/main/resources/images/buddy, bleu icon.png b/src/main/resources/images/buddy, bleu icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6f56e025e88c002c863ccced6ab17eaa877c6bdf GIT binary patch literal 48969 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%0DSkter-yir_|8{t;%kP!Q(csud0kNr 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

STF(rXcE94qKG20Rm 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/ligne-icon.png b/src/main/resources/images/ligne-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d45bc33991ebf33efb98b13286f9546aef319ba GIT binary patch literal 53702 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

EZMn2-V0l<4; z8igPB>fl4L4MqB@(hK%{WqBjqL9v=vvk0$K{hg;d09fAk$5#Mc^3(mZ0G@;i!F~?5 zh$H(i!TkhqCtVYO=l%9`exx1+@QpB!!-oKT(38S3goN4GvL1P(_wUTBdf$Eurmpi0 z46Xkn%t-TsKeqeVegb$~T>{`7fM4}nTnD{Uc%Q$04}fKizI5Cb16SP?s3)^J?Lcw-R@Cw`^+`=&uwDfA>i{l#0AKQ?_bPx_V07Aedk(fzySx7q*iQia*Nv|&zr6|rx%zA2 z)x!pW1OE0PYzlGAZzF8u(dP&_j;4J~{{Qg}lG7#3wUb}-V87_6_?Ewa+3$N5HfFo# jpTCThT-m?g4%hz!5H{5X?Z`hx00000NkvXXu0mjfNB1z) literal 0 HcmV?d00001 diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..1d03b90354 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..e9c91841a2 --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +