From d8398594b7bc43da5eb865321c5a50cec4b3923d Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/39] Add Gradle support --- build.gradle | 46 ++++++ 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, 337 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 00000000..20c0521c --- /dev/null +++ b/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'application' + id 'checkstyle' + 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 +} + +checkstyle { + toolVersion = '8.29' +} + +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 00000000..b7c8c5db --- /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 00000000..2fe81a7d --- /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 00000000..62bd9b9c --- /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 daef102248c1331ea8ad3935006c6b2467116339 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 7 Sep 2021 00:47:32 +0800 Subject: [PATCH 02/39] Duke Level-1: Greet, Echo, Exit --- src/main/java/Duke.java | 64 +++++++++++++++++++++++++++++++---- src/main/resources/buddha.txt | 24 +++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/buddha.txt diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334..50ff5b6c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,62 @@ +import java.util.Scanner; +import java.io.*; + public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; + + public static void msgGreet() { + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); + System.out.println("_________________________________"); + } + + public static void msgBye() throws IOException { + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("_________________________________"); + buddahProtectMe(); + } + + public static void buddahProtectMe() throws IOException { + String everything = ""; + try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + everything = sb.toString(); + } finally { + System.out.println(everything); + } + + } + + public static void echo(String s) { + System.out.println(" " + s); + System.out.println("_________________________________"); + } + + public static void main(String[] args) throws IOException { + msgGreet(); + + boolean bye = false; + String line; + Scanner in = new Scanner(System.in); + + while (!bye) { + line = in.nextLine(); + if (line.equals("bye")) { + bye = true; + } else { + echo(line); + } + } + + in.close(); + msgBye(); } } diff --git a/src/main/resources/buddha.txt b/src/main/resources/buddha.txt new file mode 100644 index 00000000..314d9323 --- /dev/null +++ b/src/main/resources/buddha.txt @@ -0,0 +1,24 @@ +// +// _oo0oo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// 0\ = /0 +// ___/`---'\___ +// .' \\| |// '. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' |_/ | +// \ .-\__ '-' ___/-. / +// ___'. .' /--.--\ `. .'___ +// ."" '< `.___\_<|>_/___.' >' "". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `_. \_ __\ /__ _/ .-` / / +// =====`-.____`.___ \_____/___.-`___.-'===== +// `=---=' +// +// +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// 佛祖保佑 永无BUG \ No newline at end of file From 2b378e8333de92d294556789031f35b4fc0c7485 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 7 Sep 2021 01:10:40 +0800 Subject: [PATCH 03/39] Duke Level-2: Add, List --- src/main/java/Duke.java | 17 +++++++++++++---- src/main/java/List.java | 26 ++++++++++++++++++++++++++ src/main/resources/buddha.txt | 4 ++-- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 src/main/java/List.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 50ff5b6c..c0b636c4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -14,10 +14,10 @@ public static void msgGreet() { public static void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); - buddahProtectMe(); + msgBuddahProtectMe(); } - public static void buddahProtectMe() throws IOException { + public static void msgBuddahProtectMe() throws IOException { String everything = ""; try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { StringBuilder sb = new StringBuilder(); @@ -36,7 +36,7 @@ public static void buddahProtectMe() throws IOException { } public static void echo(String s) { - System.out.println(" " + s); + System.out.println(" added: " + s); System.out.println("_________________________________"); } @@ -44,14 +44,23 @@ public static void main(String[] args) throws IOException { msgGreet(); boolean bye = false; + String line; Scanner in = new Scanner(System.in); + List myList = new List(); + while (!bye) { line = in.nextLine(); - if (line.equals("bye")) { + if (line.equals("list")) { + for (int i = 0; i < myList.getNumOfItem(); i++) { + System.out.println(" " + Integer.toString(i) + ": " + myList.getItem(i)); + } + System.out.println("_________________________________"); + } else if (line.equals("bye")) { bye = true; } else { + myList.addItem(line); echo(line); } } diff --git a/src/main/java/List.java b/src/main/java/List.java new file mode 100644 index 00000000..e5492451 --- /dev/null +++ b/src/main/java/List.java @@ -0,0 +1,26 @@ +public class List { + private String[] list = new String[100]; + private static int numOfItems; + + public List() { + numOfItems = 0; + } + + public void addItem(String s) { + list[numOfItems] = s; + numOfItems++; + } + + public void removeItem() { + numOfItems--; + list[numOfItems] = ""; + } + + public String getItem(int i) { + return list[i]; + } + + public int getNumOfItem() { + return numOfItems; + } +} diff --git a/src/main/resources/buddha.txt b/src/main/resources/buddha.txt index 314d9323..d792d29f 100644 --- a/src/main/resources/buddha.txt +++ b/src/main/resources/buddha.txt @@ -20,5 +20,5 @@ // // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// 佛祖保佑 永无BUG \ No newline at end of file +// Buddha Protect Me Say Bye to All Bug +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file From 74ffb40190f479d124b8578353dfcd6fdcdeefcf Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 27 Sep 2021 22:39:24 +0800 Subject: [PATCH 04/39] Duke Level-3-1: Modify class structure before actual task --- src/main/java/Duke.java | 45 ++++--------------------------------- src/main/java/List.java | 26 --------------------- src/main/java/Message.java | 40 +++++++++++++++++++++++++++++++++ src/main/java/Task.java | 26 +++++++++++++++++++++ src/main/java/TaskList.java | 28 +++++++++++++++++++++++ 5 files changed, 98 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/List.java create mode 100644 src/main/java/Message.java create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index c0b636c4..e7f2b0b4 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,52 +3,15 @@ public class Duke { - public static void msgGreet() { - String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); - System.out.println("_________________________________"); - } - - public static void msgBye() throws IOException { - System.out.println("Bye. Hope to see you again soon!"); - System.out.println("_________________________________"); - msgBuddahProtectMe(); - } - - public static void msgBuddahProtectMe() throws IOException { - String everything = ""; - try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - - while (line != null) { - sb.append(line); - sb.append(System.lineSeparator()); - line = br.readLine(); - } - everything = sb.toString(); - } finally { - System.out.println(everything); - } - - } - - public static void echo(String s) { - System.out.println(" added: " + s); - System.out.println("_________________________________"); - } - public static void main(String[] args) throws IOException { - msgGreet(); + Message.msgGreet(); boolean bye = false; String line; Scanner in = new Scanner(System.in); - List myList = new List(); + TaskList myList = new TaskList(); while (!bye) { line = in.nextLine(); @@ -61,11 +24,11 @@ public static void main(String[] args) throws IOException { bye = true; } else { myList.addItem(line); - echo(line); + Message.echo(line); } } in.close(); - msgBye(); + Message.msgBye(); } } diff --git a/src/main/java/List.java b/src/main/java/List.java deleted file mode 100644 index e5492451..00000000 --- a/src/main/java/List.java +++ /dev/null @@ -1,26 +0,0 @@ -public class List { - private String[] list = new String[100]; - private static int numOfItems; - - public List() { - numOfItems = 0; - } - - public void addItem(String s) { - list[numOfItems] = s; - numOfItems++; - } - - public void removeItem() { - numOfItems--; - list[numOfItems] = ""; - } - - public String getItem(int i) { - return list[i]; - } - - public int getNumOfItem() { - return numOfItems; - } -} diff --git a/src/main/java/Message.java b/src/main/java/Message.java new file mode 100644 index 00000000..3fbc1201 --- /dev/null +++ b/src/main/java/Message.java @@ -0,0 +1,40 @@ +import java.io.*; + +public class Message { + + public static void msgGreet() { + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); + System.out.println("_________________________________"); + } + + public static void msgBye() throws IOException { + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("_________________________________"); + Message.msgBuddahProtectMe(); + } + + public static void echo(String s) { + System.out.println(" added: " + s); + System.out.println("_________________________________"); + } + + public static void msgBuddahProtectMe() throws IOException { + String everything = ""; + try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + everything = sb.toString(); + } finally { + System.out.println(everything); + } + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 00000000..ec529d52 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,26 @@ +public class Task{ + private String task; + private boolean done; + + public Task(String task) { + this.task = task; + this.done = false; + } + + public void setTask(String modifiedTaskDetail) { + task = modifiedTaskDetail; + } + + public void setTaskCompleted() { + done = true; + } + + public String getTask() { + return task; + } + + public boolean getDoneStatus() { + return done; + } + +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 00000000..6abbba85 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,28 @@ +import java.util.ArrayList; + +import java.util.*; + +public class TaskList { + private List list; + + public TaskList() { + list = new ArrayList(); + } + + public void addItem(String s) { + list.add(new Task(s)); + } + + public void removeItem(int index) { + list.remove(index); + } + + public String getItem(int index) { + Task task = list.get(index); + return task.getTask(); + } + + public int getNumOfItem() { + return list.size(); + } +} From 01003659f82767316e01e868222232b57bd0a528 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 28 Sep 2021 07:55:15 +0800 Subject: [PATCH 05/39] Duke Level-3-2: Further modify class structure before actual task --- src/main/java/Action.java | 44 +++++++++++++++++++++++++++++++++++++ src/main/java/Duke.java | 33 ++++------------------------ src/main/java/Message.java | 25 ++++++++++++++++----- src/main/java/Task.java | 12 +++++----- src/main/java/TaskList.java | 17 ++++++++++++-- 5 files changed, 89 insertions(+), 42 deletions(-) create mode 100644 src/main/java/Action.java diff --git a/src/main/java/Action.java b/src/main/java/Action.java new file mode 100644 index 00000000..c0e04147 --- /dev/null +++ b/src/main/java/Action.java @@ -0,0 +1,44 @@ +import java.util.Scanner; +import java.io.*; + +public class Action { + + public static void StartDuke() { + Message.msgGreet(); + } + + public static void RunDuke() { + boolean bye = false; + String line; + Scanner in = new Scanner(System.in); + TaskList myList = new TaskList(); + while (!bye) { + line = in.nextLine(); + + if (line.equals("list")) { + Message.msgList(myList); + } else if (line.equals("bye")) { + bye = true; + } else if (line.contains("done")) { + // *** assume user key in done properly, tbc edit next time *** + // System.out.println(line.substring(5)); + + if (line.substring(0, 4).equals("done")) { + line.substring(5); + } + } else { + myList.addItem(line); + Message.msgEcho(line); + } + } + in.close(); + } + + public static void EndDuke() { + try { + Message.msgBye(); + } catch (IOException error) { + Message.msgError(error); + } + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index e7f2b0b4..3dfcaa4e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,34 +1,9 @@ -import java.util.Scanner; -import java.io.*; - public class Duke { - public static void main(String[] args) throws IOException { - Message.msgGreet(); - - boolean bye = false; - - String line; - Scanner in = new Scanner(System.in); - - TaskList myList = new TaskList(); - - while (!bye) { - line = in.nextLine(); - if (line.equals("list")) { - for (int i = 0; i < myList.getNumOfItem(); i++) { - System.out.println(" " + Integer.toString(i) + ": " + myList.getItem(i)); - } - System.out.println("_________________________________"); - } else if (line.equals("bye")) { - bye = true; - } else { - myList.addItem(line); - Message.echo(line); - } - } + public static void main(String[] args) { - in.close(); - Message.msgBye(); + Action.StartDuke(); + Action.RunDuke(); + Action.EndDuke(); } } diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 3fbc1201..72b1b085 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -10,17 +10,32 @@ public static void msgGreet() { System.out.println("_________________________________"); } - public static void msgBye() throws IOException { - System.out.println("Bye. Hope to see you again soon!"); - System.out.println("_________________________________"); - Message.msgBuddahProtectMe(); + public static void msgError(Exception e) { + System.out.println("Error Occurs: " + e); } - public static void echo(String s) { + public static void msgEcho(String s) { System.out.println(" added: " + s); System.out.println("_________________________________"); } + public static void msgList(TaskList myList) { + for (int i = 0; i < myList.getNumOfItem(); i++) { + if (!myList.getTaskDoneStatus(i)) { + System.out.println(" " + Integer.toString(i) + ".[ ] " + myList.getTaskDetail(i)); + } else { + System.out.println(" " + Integer.toString(i) + ".[X] " + myList.getTaskDetail(i)); + } + } + System.out.println("_________________________________"); + } + + public static void msgBye() throws IOException { + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("_________________________________"); + Message.msgBuddahProtectMe(); + } + public static void msgBuddahProtectMe() throws IOException { String everything = ""; try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { diff --git a/src/main/java/Task.java b/src/main/java/Task.java index ec529d52..e99f4207 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,22 +1,22 @@ public class Task{ - private String task; + private String taskDetail; private boolean done; - public Task(String task) { - this.task = task; + public Task(String taskDetail) { + this.taskDetail = taskDetail; this.done = false; } public void setTask(String modifiedTaskDetail) { - task = modifiedTaskDetail; + taskDetail = modifiedTaskDetail; } public void setTaskCompleted() { done = true; } - public String getTask() { - return task; + public String getTaskDetail() { + return taskDetail; } public boolean getDoneStatus() { diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 6abbba85..9f5c111d 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -17,12 +17,25 @@ public void removeItem(int index) { list.remove(index); } - public String getItem(int index) { + // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public Task getTask(int index) { + return list.get(index); + } + + public String getTaskDetail(int index) { Task task = list.get(index); - return task.getTask(); + return task.getTaskDetail(); + } + + public boolean getTaskDoneStatus(int index) { + Task task = list.get(index); + return task.getDoneStatus(); } public int getNumOfItem() { return list.size(); } + + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } From d7323f31c278b8d345a65ba84d6fca206a527ad8 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 28 Sep 2021 09:07:09 +0800 Subject: [PATCH 06/39] Duke Level-3-3: Mark as Done --- src/main/java/Action.java | 11 ++++++++++- src/main/java/Message.java | 12 +++++++++--- src/main/java/Task.java | 26 +++++++++++++++----------- src/main/java/TaskList.java | 5 +++++ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/main/java/Action.java b/src/main/java/Action.java index c0e04147..5c15e320 100644 --- a/src/main/java/Action.java +++ b/src/main/java/Action.java @@ -24,7 +24,12 @@ public static void RunDuke() { // System.out.println(line.substring(5)); if (line.substring(0, 4).equals("done")) { - line.substring(5); + Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; + MarkTaskDone(myList, taskNumber); + Message.msgMarkDone(myList, taskNumber); + } else { + myList.addItem(line); + Message.msgEcho(line); } } else { myList.addItem(line); @@ -34,6 +39,10 @@ public static void RunDuke() { in.close(); } + public static void MarkTaskDone(TaskList myList, int taskNumber) { + myList.setTaskDone(taskNumber); + } + public static void EndDuke() { try { Message.msgBye(); diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 72b1b085..2dde5970 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -15,16 +15,22 @@ public static void msgError(Exception e) { } public static void msgEcho(String s) { - System.out.println(" added: " + s); + System.out.println(" Task Added: " + s); + System.out.println("_________________________________"); + } + + public static void msgMarkDone(TaskList myList, int taskNumber) { + System.out.println(" Naisuuuu! This task is marked as done: "); + System.out.println(" " + (taskNumber + 1) + ".[X] " + myList.getTaskDetail(taskNumber)); System.out.println("_________________________________"); } public static void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { if (!myList.getTaskDoneStatus(i)) { - System.out.println(" " + Integer.toString(i) + ".[ ] " + myList.getTaskDetail(i)); + System.out.println(" " + Integer.toString(i + 1) + ".[ ] " + myList.getTaskDetail(i)); } else { - System.out.println(" " + Integer.toString(i) + ".[X] " + myList.getTaskDetail(i)); + System.out.println(" " + Integer.toString(i + 1) + ".[X] " + myList.getTaskDetail(i)); } } System.out.println("_________________________________"); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e99f4207..b9e7b7df 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,26 +1,30 @@ -public class Task{ +public class Task { private String taskDetail; - private boolean done; + private boolean isDone; public Task(String taskDetail) { this.taskDetail = taskDetail; - this.done = false; + this.isDone = false; } - public void setTask(String modifiedTaskDetail) { - taskDetail = modifiedTaskDetail; - } - - public void setTaskCompleted() { - done = true; - } + // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public String getTaskDetail() { return taskDetail; } public boolean getDoneStatus() { - return done; + return isDone; + } + + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public void setTask(String modifiedTaskDetail) { + taskDetail = modifiedTaskDetail; + } + + public void setTaskCompleted() { + isDone = true; } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 9f5c111d..76cc3cd2 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -38,4 +38,9 @@ public int getNumOfItem() { } // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public void setTaskDone(int index) { + Task task = list.get(index); + task.setTaskCompleted(); + } } From 686dcfb740e129aa4a55fee77509e84a957bdd46 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 28 Sep 2021 13:15:09 +0800 Subject: [PATCH 07/39] Duke Level-3-4: Text UI Testing --- src/main/java/Duke.java | 8 +++++ src/main/java/Message.java | 27 +++++++++++++++- text-ui-test/EXPECTED.TXT | 64 ++++++++++++++++++++++++++++++++++++++ text-ui-test/input.txt | 12 +++++++ 4 files changed, 110 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3dfcaa4e..bdca30bc 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,3 +7,11 @@ public static void main(String[] args) { Action.EndDuke(); } } + +// Good morning sunshine +// Enjoy morning breeze and drink coffee +// Have lunch and a hearty meal +// Nap ZzzzZzzzZzzzzzzzzzz +// Have Dinner and watch Avenger +// Play Switch +// Good Night! diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 2dde5970..618cefd2 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -44,7 +44,28 @@ public static void msgBye() throws IOException { public static void msgBuddahProtectMe() throws IOException { String everything = ""; - try (BufferedReader br = new BufferedReader(new FileReader("src/main/resources/buddha.txt"))) { + + // ... \Duke\src\main\resources\buddha.txt + // File.separator == " \ " + + String pathRoot = System.getProperty("user.dir"); + // pathRoot = D:\My Files\School Documents\Repository\Duke + + String pathRssFolder = "src" + File.separator + "main" + File.separator + "resources"; + // pathRssFolder = src\main\resources + + String pathFileName = "buddha.txt"; + // pathFileName = buddha.txt + + String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; + // filePath = D:\My Files\School + // Documents\Repository\Duke\src\main\resources\buddha.txt + + try { + FileReader fr = new FileReader(filePath); + // FileReader fr = new FileReader("\\My Files\\School + // Documents\\Repository\\Duke\\src\\main\\resources\\buddha.txt"); + BufferedReader br = new BufferedReader(fr); StringBuilder sb = new StringBuilder(); String line = br.readLine(); @@ -54,6 +75,10 @@ public static void msgBuddahProtectMe() throws IOException { line = br.readLine(); } everything = sb.toString(); + br.close(); + } catch (FileNotFoundException e) { + System.out.println("\n >>> Buddah Protection is not in forced <<<\n"); + System.out.println(e); } finally { System.out.println(everything); } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6..16e50ef6 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -5,3 +5,67 @@ Hello from | |_| | |_| | < __/ |____/ \__,_|_|\_\___| +Hello! I'm Duke +What can I do for you? +_________________________________ + Task Added: Good morning sunshine +_________________________________ + Task Added: Enjoy morning breeze and drink coffee +_________________________________ + Task Added: Have lunch and a hearty meal +_________________________________ + Task Added: Nap ZzzzZzzzZzzzzzzzzzz +_________________________________ + Task Added: Have Dinner and watch Avenger +_________________________________ + Task Added: Play Switch +_________________________________ + 1.[ ] Good morning sunshine + 2.[ ] Enjoy morning breeze and drink coffee + 3.[ ] Have lunch and a hearty meal + 4.[ ] Nap ZzzzZzzzZzzzzzzzzzz + 5.[ ] Have Dinner and watch Avenger + 6.[ ] Play Switch +_________________________________ + Naisuuuu! This task is marked as done: + 2.[X] Enjoy morning breeze and drink coffee +_________________________________ + Naisuuuu! This task is marked as done: + 3.[X] Have lunch and a hearty meal +_________________________________ + 1.[ ] Good morning sunshine + 2.[X] Enjoy morning breeze and drink coffee + 3.[X] Have lunch and a hearty meal + 4.[ ] Nap ZzzzZzzzZzzzzzzzzzz + 5.[ ] Have Dinner and watch Avenger + 6.[ ] Play Switch +_________________________________ + Task Added: Good Night! +_________________________________ +Bye. Hope to see you again soon! +_________________________________ +// +// _oo0oo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// 0\ = /0 +// ___/`---'\___ +// .' \\| |// '. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' |_/ | +// \ .-\__ '-' ___/-. / +// ___'. .' /--.--\ `. .'___ +// ."" '< `.___\_<|>_/___.' >' "". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `_. \_ __\ /__ _/ .-` / / +// =====`-.____`.___ \_____/___.-`___.-'===== +// `=---=' +// +// +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Buddha Protect Me Say Bye to All Bug +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29b..9d40b478 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,12 @@ +Good morning sunshine +Enjoy morning breeze and drink coffee +Have lunch and a hearty meal +Nap ZzzzZzzzZzzzzzzzzzz +Have Dinner and watch Avenger +Play Switch +list +done 2 +done 3 +list +Good Night! +bye \ No newline at end of file From 189b9dc64efeda2d97481cab91d1217f68437237 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:40:01 +0800 Subject: [PATCH 08/39] Duke Level-4: ToDos, Events, Deadlines --- src/main/java/Action.java | 71 +++++++++++++++++++++++-------- src/main/java/Duke.java | 2 + src/main/java/Message.java | 74 ++++++++++++++++++++++++++++++--- src/main/java/Task.java | 16 +++++-- src/main/java/TaskDeadline.java | 33 +++++++++++++++ src/main/java/TaskEvent.java | 35 ++++++++++++++++ src/main/java/TaskList.java | 40 ++++++++++++++++-- src/main/java/TaskToDos.java | 8 ++++ src/main/java/TaskType.java | 19 +++++++++ 9 files changed, 269 insertions(+), 29 deletions(-) create mode 100644 src/main/java/TaskDeadline.java create mode 100644 src/main/java/TaskEvent.java create mode 100644 src/main/java/TaskToDos.java create mode 100644 src/main/java/TaskType.java diff --git a/src/main/java/Action.java b/src/main/java/Action.java index 5c15e320..fa48db60 100644 --- a/src/main/java/Action.java +++ b/src/main/java/Action.java @@ -15,26 +15,63 @@ public static void RunDuke() { while (!bye) { line = in.nextLine(); - if (line.equals("list")) { - Message.msgList(myList); - } else if (line.equals("bye")) { - bye = true; - } else if (line.contains("done")) { - // *** assume user key in done properly, tbc edit next time *** - // System.out.println(line.substring(5)); - - if (line.substring(0, 4).equals("done")) { - Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; - MarkTaskDone(myList, taskNumber); - Message.msgMarkDone(myList, taskNumber); + try { + if (line.equals("list")) { + Message.msgList(myList); + } else if (line.equals("bye")) { + bye = true; + } else if (line.contains("done")) { + // *** assume user key in done properly, tbc edit next time *** + // System.out.println(line.substring(5)); + + if (line.substring(0, 4).equals("done")) { + Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; + MarkTaskDone(myList, taskNumber); + Message.msgMarkDone(myList, taskNumber); + } else { + Message.msgInvalidInput(); + } + } else if (line.contains("todo")) { + if (line.substring(0, 4).equals("todo") && line.length() >= 6 && line.contains(" ")) { + myList.addItemToDos(line.substring(5)); + Message.msgAssignTask(myList, myList.getNumOfItem() - 1); + } else { + Message.msgInvalidInput(); + } + } else if (line.contains("deadline")) { + if (line.substring(0, 8).equals("deadline") && line.contains("/by")) { + + String taskDetail = line.substring(9, line.indexOf("/")); + String dayWithBy = line.substring(line.indexOf("/") + 1, line.length() - 1); + String day = dayWithBy.substring(3); + + myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 + Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + } else { + Message.msgInvalidInput(); + } + } else if (line.contains("event")) { + if (line.substring(0, 5).equals("event") && line.contains("/at")) { + String test = line.substring(100); + String taskDetail = line.substring(6, line.indexOf("/")); + String after_at = line.substring(line.indexOf("/") + 4); + String day = after_at.substring(0, after_at.indexOf(" ")); + String time = line.substring(line.indexOf("/") + 8); + + myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 + Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); + + } else { + Message.msgInvalidInput(); + } } else { - myList.addItem(line); - Message.msgEcho(line); + Message.msgInvalidInput(); } - } else { - myList.addItem(line); - Message.msgEcho(line); + } catch (Exception e) { + Message.msgInvalidInput(); + Message.msgError(e); } + } in.close(); } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index bdca30bc..6b7e60f3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -15,3 +15,5 @@ public static void main(String[] args) { // Have Dinner and watch Avenger // Play Switch // Good Night! + + diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 618cefd2..70e766d1 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -12,6 +12,61 @@ public static void msgGreet() { public static void msgError(Exception e) { System.out.println("Error Occurs: " + e); + System.out.println("_________________________________"); + } + + public static void msgAssignTask(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public static void msgAssignTaskDeadline(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskDeadlineDateString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public static void msgAssignTaskEvent(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateTimeString = myList.getTaskEventDateTimeString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + + dateTimeString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); } public static void msgEcho(String s) { @@ -27,15 +82,24 @@ public static void msgMarkDone(TaskList myList, int taskNumber) { public static void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { - if (!myList.getTaskDoneStatus(i)) { - System.out.println(" " + Integer.toString(i + 1) + ".[ ] " + myList.getTaskDetail(i)); - } else { - System.out.println(" " + Integer.toString(i + 1) + ".[X] " + myList.getTaskDetail(i)); - } + + TaskType taskType = myList.getTaskType(i); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(i); + String isDoneInString = (isDone ? "X" : " "); + + System.out.println(" " + Integer.toString(i + 1) + ".[" + taskTypeInString + "][" + isDoneInString + "] " + + myList.getTaskDetail(i)); } System.out.println("_________________________________"); } + public static void msgInvalidInput() { + System.out.println("Sorry :( Invalid Input. Try Again ~ "); + System.out.println("_________________________________"); + } + public static void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index b9e7b7df..79907c10 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,10 +1,10 @@ -public class Task { - private String taskDetail; - private boolean isDone; +public abstract class Task { + protected String taskDetail; + protected boolean isDone; + protected TaskType taskType; public Task(String taskDetail) { this.taskDetail = taskDetail; - this.isDone = false; } // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -17,6 +17,10 @@ public boolean getDoneStatus() { return isDone; } + public TaskType getTaskType() { + return taskType; + } + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public void setTask(String modifiedTaskDetail) { @@ -27,4 +31,8 @@ public void setTaskCompleted() { isDone = true; } + public void setTypeOfTask(TaskType taskType) { + this.taskType = taskType; + } + } diff --git a/src/main/java/TaskDeadline.java b/src/main/java/TaskDeadline.java new file mode 100644 index 00000000..f398723d --- /dev/null +++ b/src/main/java/TaskDeadline.java @@ -0,0 +1,33 @@ +import java.sql.Time; +import java.util.Date; + +public class TaskDeadline extends Task { + private Date date; + private Time time; + private String dateString; // temporary attribute for Duke Level 4 + + public TaskDeadline(String taskDetail) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + } + + public TaskDeadline(String taskDetail, Date date, Time time) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + this.date = date; + this.time = time; + } + + public TaskDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + this.dateString = dateString; + } + + public String getDateString() { // temporary constructor for Duke Level 4 + return dateString; + } +} \ No newline at end of file diff --git a/src/main/java/TaskEvent.java b/src/main/java/TaskEvent.java new file mode 100644 index 00000000..d71f07a6 --- /dev/null +++ b/src/main/java/TaskEvent.java @@ -0,0 +1,35 @@ +import java.sql.Time; +import java.util.Date; + +public class TaskEvent extends Task { + private Date date; + private Time startTime; + private Time endTime; + private String dateTime; // temporary attribute for Duke Level 4 + + public TaskEvent(String taskDetail) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + } + + public TaskEvent(String taskDetail, Date date, Time startTime, Time endTime) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + this.date = date; + this.startTime = startTime; + this.endTime = endTime; + } + + public TaskEvent(String taskDetail, String dayTime) { // temporary constructor for Duke Level 4 + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + this.dateTime = dayTime; + } + + public String getDayTime() { // temporary constructor for Duke Level 4 + return dateTime; + } +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 76cc3cd2..6a2d55fa 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,16 +1,35 @@ import java.util.ArrayList; - import java.util.*; +import java.sql.Time; +import java.util.Date; public class TaskList { private List list; + // Initialize & Add Item & Remove Item <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public TaskList() { list = new ArrayList(); } - public void addItem(String s) { - list.add(new Task(s)); + public void addItemToDos(String taskDetail) { + list.add(new TaskToDos(taskDetail)); + } + + public void addItemDeadline(String taskDetail, Date date, Time time) { + list.add(new TaskDeadline(taskDetail, date, time)); + } + + public void addItemDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 + list.add(new TaskDeadline(taskDetail, dateString)); + } + + public void addItemEvent(String taskDetail, Date date, Time startTime, Time endTime) { + list.add(new TaskEvent(taskDetail, date, startTime, endTime)); + } + + public void addItemEvent(String taskDetail, String daytime) { // temporary constructor for Duke Level 4 + list.add(new TaskEvent(taskDetail, daytime)); } public void removeItem(int index) { @@ -33,10 +52,25 @@ public boolean getTaskDoneStatus(int index) { return task.getDoneStatus(); } + public String getTaskDeadlineDateString(int index) { // temporary method for Duke Level 4 + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getDateString(); + } + + public String getTaskEventDateTimeString(int index) { // temporary method for Duke Level 4 + TaskEvent task = (TaskEvent) list.get(index); + return task.getDayTime(); + } + public int getNumOfItem() { return list.size(); } + public TaskType getTaskType(int index) { + Task task = list.get(index); + return task.getTaskType(); + } + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public void setTaskDone(int index) { diff --git a/src/main/java/TaskToDos.java b/src/main/java/TaskToDos.java new file mode 100644 index 00000000..75bf2010 --- /dev/null +++ b/src/main/java/TaskToDos.java @@ -0,0 +1,8 @@ +public class TaskToDos extends Task { + + public TaskToDos(String taskDetail) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.TODOS; + } +} diff --git a/src/main/java/TaskType.java b/src/main/java/TaskType.java new file mode 100644 index 00000000..2cb1f84b --- /dev/null +++ b/src/main/java/TaskType.java @@ -0,0 +1,19 @@ +public enum TaskType { + TODOS, DEADLINE, EVENT; + + public static String taskTypeToString(TaskType taskType) { + String s = ""; + switch (taskType) { + case TODOS: + s = "T"; + break; + case DEADLINE: + s = "D"; + break; + case EVENT: + s = "E"; + break; + } + return s; + } +} From ee366afa4a77a42c1e7ae3780a1a2aff15f7b8e4 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:46:18 +0800 Subject: [PATCH 09/39] Duke Level-5: Handle Errors Errors has been handled in Level 4 --- src/main/java/Duke.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6b7e60f3..3dfcaa4e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,13 +7,3 @@ public static void main(String[] args) { Action.EndDuke(); } } - -// Good morning sunshine -// Enjoy morning breeze and drink coffee -// Have lunch and a hearty meal -// Nap ZzzzZzzzZzzzzzzzzzz -// Have Dinner and watch Avenger -// Play Switch -// Good Night! - - From 796c841ceee3cb6f93535d8064da4cadb89fb284 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:46:32 +0800 Subject: [PATCH 10/39] Revert "Duke Level-5: Handle Errors" This reverts commit ee366afa4a77a42c1e7ae3780a1a2aff15f7b8e4. --- src/main/java/Duke.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3dfcaa4e..6b7e60f3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,3 +7,13 @@ public static void main(String[] args) { Action.EndDuke(); } } + +// Good morning sunshine +// Enjoy morning breeze and drink coffee +// Have lunch and a hearty meal +// Nap ZzzzZzzzZzzzzzzzzzz +// Have Dinner and watch Avenger +// Play Switch +// Good Night! + + From bc937ac2d06f857ca4606a152c5795547d494db9 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:48:08 +0800 Subject: [PATCH 11/39] Duke Level-5: Handle Errors; Errors has been handled in Level 4 --- src/main/java/Duke.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6b7e60f3..3dfcaa4e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,13 +7,3 @@ public static void main(String[] args) { Action.EndDuke(); } } - -// Good morning sunshine -// Enjoy morning breeze and drink coffee -// Have lunch and a hearty meal -// Nap ZzzzZzzzZzzzzzzzzzz -// Have Dinner and watch Avenger -// Play Switch -// Good Night! - - From 87db38c4d64f6b1ef51904e4c1e74e3f89b31d8e Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 1 Oct 2021 12:57:51 +0800 Subject: [PATCH 12/39] Duke Level-5-4: Handle Errors --- src/main/java/Action.java | 77 ++++++++++++++++++++++---------------- src/main/java/Duke.java | 2 + src/main/java/Message.java | 34 ++++++++++++++--- 3 files changed, 76 insertions(+), 37 deletions(-) diff --git a/src/main/java/Action.java b/src/main/java/Action.java index fa48db60..364ced0f 100644 --- a/src/main/java/Action.java +++ b/src/main/java/Action.java @@ -20,49 +20,61 @@ public static void RunDuke() { Message.msgList(myList); } else if (line.equals("bye")) { bye = true; - } else if (line.contains("done")) { - // *** assume user key in done properly, tbc edit next time *** - // System.out.println(line.substring(5)); - - if (line.substring(0, 4).equals("done")) { - Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; - MarkTaskDone(myList, taskNumber); - Message.msgMarkDone(myList, taskNumber); + } else if (line.substring(0, 4).equals("done")) { + + Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; + MarkTaskDone(myList, taskNumber); + Message.msgMarkDone(myList, taskNumber); + + } else if (line.substring(0, 4).equals("todo")) { + + if (line.length() <= 5) { + Message.msgInvalidInputMissingDescription(); } else { - Message.msgInvalidInput(); - } - } else if (line.contains("todo")) { - if (line.substring(0, 4).equals("todo") && line.length() >= 6 && line.contains(" ")) { myList.addItemToDos(line.substring(5)); Message.msgAssignTask(myList, myList.getNumOfItem() - 1); - } else { - Message.msgInvalidInput(); } - } else if (line.contains("deadline")) { - if (line.substring(0, 8).equals("deadline") && line.contains("/by")) { - String taskDetail = line.substring(9, line.indexOf("/")); - String dayWithBy = line.substring(line.indexOf("/") + 1, line.length() - 1); - String day = dayWithBy.substring(3); + } else if (line.substring(0, 5).equals("event")) { - myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 - Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + if (line.length() <= 6) { + Message.msgInvalidInputMissingDescription(); + } else if (!line.contains("/at")) { + Message.msgInvalidInputMissingDay(); } else { - Message.msgInvalidInput(); + + try { + String taskDetail = line.substring(6, line.indexOf("/")); + String after_at = line.substring(line.indexOf("/") + 4); + String day = after_at.substring(0, after_at.indexOf(" ")); + String time = line.substring(line.indexOf("/") + 8); + + myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 + Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); + } catch (Exception e) { + Message.msgInvalidInput(); + } } - } else if (line.contains("event")) { - if (line.substring(0, 5).equals("event") && line.contains("/at")) { - String test = line.substring(100); - String taskDetail = line.substring(6, line.indexOf("/")); - String after_at = line.substring(line.indexOf("/") + 4); - String day = after_at.substring(0, after_at.indexOf(" ")); - String time = line.substring(line.indexOf("/") + 8); + } else if (line.substring(0, 6).equals("delete")) { - myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 - Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); + } else if (line.substring(0, 8).equals("deadline")) { + if (line.length() <= 9) { + Message.msgInvalidInputMissingDescription(); + } else if (!line.contains("/by")) { + Message.msgInvalidInputMissingDay(); } else { - Message.msgInvalidInput(); + try { + String taskDetail = line.substring(9, line.indexOf("/")); + String dayWithBy = line.substring(line.indexOf("/") + 1, line.length() - 1); + String day = dayWithBy.substring(3); + + myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 + Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + + } catch (Exception e) { + Message.msgInvalidInput(); + } } } else { Message.msgInvalidInput(); @@ -74,6 +86,7 @@ public static void RunDuke() { } in.close(); + } public static void MarkTaskDone(TaskList myList, int taskNumber) { diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3dfcaa4e..52fa1fcf 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,3 +7,5 @@ public static void main(String[] args) { Action.EndDuke(); } } + + diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 70e766d1..b0a8c4ff 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -2,6 +2,7 @@ public class Message { + // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgGreet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; @@ -10,10 +11,7 @@ public static void msgGreet() { System.out.println("_________________________________"); } - public static void msgError(Exception e) { - System.out.println("Error Occurs: " + e); - System.out.println("_________________________________"); - } + // Assignment Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgAssignTask(TaskList myList, int taskNumber) { @@ -74,6 +72,8 @@ public static void msgEcho(String s) { System.out.println("_________________________________"); } + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); System.out.println(" " + (taskNumber + 1) + ".[X] " + myList.getTaskDetail(taskNumber)); @@ -95,11 +95,35 @@ public static void msgList(TaskList myList) { System.out.println("_________________________________"); } + // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static void msgError(Exception e) { + System.out.println("Error Occurs: " + e); + System.out.println("_________________________________"); + } + public static void msgInvalidInput() { - System.out.println("Sorry :( Invalid Input. Try Again ~ "); + System.out.println(" Sorry :( Invalid Input. Try Again ~ "); System.out.println("_________________________________"); } + public static void msgInvalidInputMissingDescription() { + System.out.println(" ☹ OOPS!!! The description cannot be empty."); + System.out.println("_________________________________"); + } + + public static void msgInvalidInputMissingDay() { + System.out.println(" ☹ OOPS!!! The day cannot be empty."); + System.out.println("_________________________________"); + } + + public static void msgInvalidInputMissingTime() { + System.out.println(" ☹ OOPS!!! The time cannot be empty."); + System.out.println("_________________________________"); + } + + // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public static void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); From 3da79b0502ba17605322f481cdcd5c7842a29e0e Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:11:54 +0800 Subject: [PATCH 13/39] Duke Level-6: Delete --- src/main/java/Action.java | 122 +++++++++++++++++++++---------------- src/main/java/Duke.java | 2 - src/main/java/Message.java | 55 ++++++++++++++--- text-ui-test/EXPECTED.TXT | 65 +++++++++++++------- text-ui-test/input.txt | 22 ++++--- 5 files changed, 171 insertions(+), 95 deletions(-) diff --git a/src/main/java/Action.java b/src/main/java/Action.java index 364ced0f..a859b58d 100644 --- a/src/main/java/Action.java +++ b/src/main/java/Action.java @@ -21,61 +21,15 @@ public static void RunDuke() { } else if (line.equals("bye")) { bye = true; } else if (line.substring(0, 4).equals("done")) { - - Integer taskNumber = Integer.parseInt(line.substring(5)) - 1; - MarkTaskDone(myList, taskNumber); - Message.msgMarkDone(myList, taskNumber); - + MarkTaskDone(myList, line); } else if (line.substring(0, 4).equals("todo")) { - - if (line.length() <= 5) { - Message.msgInvalidInputMissingDescription(); - } else { - myList.addItemToDos(line.substring(5)); - Message.msgAssignTask(myList, myList.getNumOfItem() - 1); - } - + AddTaskToDo(myList, line); } else if (line.substring(0, 5).equals("event")) { - - if (line.length() <= 6) { - Message.msgInvalidInputMissingDescription(); - } else if (!line.contains("/at")) { - Message.msgInvalidInputMissingDay(); - } else { - - try { - String taskDetail = line.substring(6, line.indexOf("/")); - String after_at = line.substring(line.indexOf("/") + 4); - String day = after_at.substring(0, after_at.indexOf(" ")); - String time = line.substring(line.indexOf("/") + 8); - - myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 - Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); - } catch (Exception e) { - Message.msgInvalidInput(); - } - } + AddTaskEvent(myList, line); } else if (line.substring(0, 6).equals("delete")) { - + RemoveTask(myList, line); } else if (line.substring(0, 8).equals("deadline")) { - - if (line.length() <= 9) { - Message.msgInvalidInputMissingDescription(); - } else if (!line.contains("/by")) { - Message.msgInvalidInputMissingDay(); - } else { - try { - String taskDetail = line.substring(9, line.indexOf("/")); - String dayWithBy = line.substring(line.indexOf("/") + 1, line.length() - 1); - String day = dayWithBy.substring(3); - - myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 - Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); - - } catch (Exception e) { - Message.msgInvalidInput(); - } - } + AddTaskDeadline(myList, line); } else { Message.msgInvalidInput(); } @@ -89,8 +43,70 @@ public static void RunDuke() { } - public static void MarkTaskDone(TaskList myList, int taskNumber) { - myList.setTaskDone(taskNumber); + public static void MarkTaskDone(TaskList myList, String line) { + Integer taskNumber = Integer.parseInt(line.substring(5)); + myList.setTaskDone(taskNumber - 1); + Message.msgMarkDone(myList, taskNumber - 1); + } + + public static void AddTaskToDo(TaskList myList, String line) { + if (line.length() <= 5) { + Message.msgInvalidInputMissingDescription(); + } else { + myList.addItemToDos(line.substring(5)); + Message.msgAssignTask(myList, myList.getNumOfItem() - 1); + } + } + + public static void AddTaskEvent(TaskList myList, String line) { + if (line.length() <= 6) { + Message.msgInvalidInputMissingDescription(); + } else if (!line.contains("/at")) { + Message.msgInvalidInputMissingDay(); + } else { + + try { + String taskDetail = line.substring(6, line.indexOf("/")); + String after_at = line.substring(line.indexOf("/") + 4); + String day = after_at.substring(0, after_at.indexOf(" ")); + String time = line.substring(line.indexOf("/") + 8); + + myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 + Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); + } catch (Exception e) { + Message.msgInvalidInput(); + } + } + } + + public static void AddTaskDeadline(TaskList myList, String line) { + if (line.length() <= 9) { + Message.msgInvalidInputMissingDescription(); + } else if (!line.contains("/by")) { + Message.msgInvalidInputMissingDay(); + } else { + try { + String taskDetail = line.substring(9, line.indexOf("/")); + String dayWithBy = line.substring(line.indexOf("/") + 1, line.length()); + String day = dayWithBy.substring(3); + + myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 + Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + + } catch (Exception e) { + Message.msgInvalidInput(); + } + } + } + + public static void RemoveTask(TaskList myList, String line) { + try { + Integer taskNumber = Integer.parseInt(line.substring(7)); + Message.msgRemoveItem(myList, taskNumber - 1); + myList.removeItem(taskNumber - 1); + } catch (Exception e) { + Message.msgWrongTaskNumber(); + } } public static void EndDuke() { diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 52fa1fcf..3dfcaa4e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -7,5 +7,3 @@ public static void main(String[] args) { Action.EndDuke(); } } - - diff --git a/src/main/java/Message.java b/src/main/java/Message.java index b0a8c4ff..2a552573 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -76,23 +76,49 @@ public static void msgEcho(String s) { public static void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); - System.out.println(" " + (taskNumber + 1) + ".[X] " + myList.getTaskDetail(taskNumber)); + Message.msgBlankBeforeTaskDetail(); + Message.msgTaskDetail(myList, taskNumber); System.out.println("_________________________________"); } public static void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { + System.out.print(" " + Integer.toString(i + 1) + "."); + Message.msgTaskDetail(myList, i); + } + System.out.println("_________________________________"); + } + + public static void msgBlankBeforeTaskDetail() { + System.out.print(" "); + } - TaskType taskType = myList.getTaskType(i); - String taskTypeInString = TaskType.taskTypeToString(taskType); + public static void msgTaskDetail(TaskList myList, int taskNumber) { + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); - boolean isDone = myList.getTaskDoneStatus(i); - String isDoneInString = (isDone ? "X" : " "); + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); - System.out.println(" " + Integer.toString(i + 1) + ".[" + taskTypeInString + "][" + isDoneInString + "] " - + myList.getTaskDetail(i)); + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateTimeString = ""; + + switch (taskType) { + case TODOS: + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + break; + case DEADLINE: + dateTimeString = myList.getTaskDeadlineDateString(taskNumber); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + + dateTimeString + ")"); + break; + case EVENT: + dateTimeString = myList.getTaskEventDateTimeString(taskNumber); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + + dateTimeString + ")"); + break; } - System.out.println("_________________________________"); } // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -122,6 +148,19 @@ public static void msgInvalidInputMissingTime() { System.out.println("_________________________________"); } + public static void msgRemoveItem(TaskList myList, int taskNumber) { + + System.out.println(" Noted. I've removed this task:"); + Message.msgBlankBeforeTaskDetail(); + Message.msgTaskDetail(myList, taskNumber); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public static void msgWrongTaskNumber() { + System.out.println(" ☹ OOPS!!! The task number is invalid."); + System.out.println("_________________________________"); + } // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgBye() throws IOException { diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 16e50ef6..098b0a13 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -8,39 +8,58 @@ Hello from Hello! I'm Duke What can I do for you? _________________________________ - Task Added: Good morning sunshine + Got it. I've added this task: + [T][ ] borrow book + Now you have 1 tasks in the list. _________________________________ - Task Added: Enjoy morning breeze and drink coffee + Got it. I've added this task: + [D][ ] return book (by: Sunday) + Now you have 2 tasks in the list. _________________________________ - Task Added: Have lunch and a hearty meal + Got it. I've added this task: + [E][ ] project meeting (at: Mon 2-4pm) + Now you have 3 tasks in the list. _________________________________ - Task Added: Nap ZzzzZzzzZzzzzzzzzzz + 1.[T][ ] borrow book + 2.[D][ ] return book (by: Sunday) + 3.[E][ ] project meeting (at: Mon 2-4pm) _________________________________ - Task Added: Have Dinner and watch Avenger + Naisuuuu! This task is marked as done: + [D][X] return book (by: Sunday) _________________________________ - Task Added: Play Switch + Sorry :( Invalid Input. Try Again ~ _________________________________ - 1.[ ] Good morning sunshine - 2.[ ] Enjoy morning breeze and drink coffee - 3.[ ] Have lunch and a hearty meal - 4.[ ] Nap ZzzzZzzzZzzzzzzzzzz - 5.[ ] Have Dinner and watch Avenger - 6.[ ] Play Switch +Error Occurs: java.lang.IndexOutOfBoundsException: Index 9 out of bounds for length 3 _________________________________ - Naisuuuu! This task is marked as done: - 2.[X] Enjoy morning breeze and drink coffee + Sorry :( Invalid Input. Try Again ~ _________________________________ - Naisuuuu! This task is marked as done: - 3.[X] Have lunch and a hearty meal +Error Occurs: java.lang.StringIndexOutOfBoundsException: begin 0, end 6, length 5 +_________________________________ + Noted. I've removed this task: + [T][ ] borrow book + Now you have 3 tasks in the list. +_________________________________ + Noted. I've removed this task: + ☹ OOPS!!! The task number is invalid. +_________________________________ + 1.[D][X] return book (by: Sunday) + 2.[E][ ] project meeting (at: Mon 2-4pm) +_________________________________ + Got it. I've added this task: + [D][ ] do homework (by: no idea :-p) + Now you have 3 tasks in the list. +_________________________________ + 1.[D][X] return book (by: Sunday) + 2.[E][ ] project meeting (at: Mon 2-4pm) + 3.[D][ ] do homework (by: no idea :-p) +_________________________________ + ☹ OOPS!!! The day cannot be empty. _________________________________ - 1.[ ] Good morning sunshine - 2.[X] Enjoy morning breeze and drink coffee - 3.[X] Have lunch and a hearty meal - 4.[ ] Nap ZzzzZzzzZzzzzzzzzzz - 5.[ ] Have Dinner and watch Avenger - 6.[ ] Play Switch + ☹ OOPS!!! The description cannot be empty. _________________________________ - Task Added: Good Night! + 1.[D][X] return book (by: Sunday) + 2.[E][ ] project meeting (at: Mon 2-4pm) + 3.[D][ ] do homework (by: no idea :-p) _________________________________ Bye. Hope to see you again soon! _________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 9d40b478..d81236f9 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,12 +1,16 @@ -Good morning sunshine -Enjoy morning breeze and drink coffee -Have lunch and a hearty meal -Nap ZzzzZzzzZzzzzzzzzzz -Have Dinner and watch Avenger -Play Switch +todo borrow book +deadline return book /by Sunday +event project meeting /at Mon 2-4pm list done 2 -done 3 +done 10 +list +delete 1 +delete 10 list -Good Night! -bye \ No newline at end of file +deadline do homework /by no idea :-p +list +deadline do homework +deadline +list +bye From 533b2b372d07e22570fa3370532af37fdcdb9d03 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 28 Oct 2021 19:24:29 +0800 Subject: [PATCH 14/39] Duke Level-7-1: Restructure; File Access: test save file --- myText.txt | 1 + src/main/java/Duke.java | 8 +- src/main/java/DukeActionFacade.java | 33 +++++ src/main/java/Message.java | 7 + src/main/java/Task.java | 2 + src/main/java/TaskDeadline.java | 2 + src/main/java/TaskEvent.java | 2 + src/main/java/TaskList.java | 2 + src/main/java/TaskToDos.java | 2 + src/main/java/TaskType.java | 2 + .../{Action.java => action/DukeAction.java} | 124 ++++++++++-------- 11 files changed, 125 insertions(+), 60 deletions(-) create mode 100644 myText.txt create mode 100644 src/main/java/DukeActionFacade.java rename src/main/java/{Action.java => action/DukeAction.java} (51%) diff --git a/myText.txt b/myText.txt new file mode 100644 index 00000000..22ae1ebc --- /dev/null +++ b/myText.txt @@ -0,0 +1 @@ +helloWold \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3dfcaa4e..9609e6e7 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,9 +1,11 @@ +package src.main.java; + public class Duke { public static void main(String[] args) { - Action.StartDuke(); - Action.RunDuke(); - Action.EndDuke(); + DukeActionFacade.StartDuke(); + DukeActionFacade.RunDuke(); + DukeActionFacade.EndDuke(); } } diff --git a/src/main/java/DukeActionFacade.java b/src/main/java/DukeActionFacade.java new file mode 100644 index 00000000..407e758d --- /dev/null +++ b/src/main/java/DukeActionFacade.java @@ -0,0 +1,33 @@ +package src.main.java; + +import src.main.java.action.DukeAction; + +import java.util.Scanner; +import java.io.*; + +public abstract class DukeActionFacade { + + public static void StartDuke() { + Message.msgGreet(); + } + + public static void RunDuke(){ + boolean runTask = true; + String line; + Scanner in = new Scanner(System.in); + TaskList myList = new TaskList(); + while (runTask) { + line = in.nextLine(); + runTask = DukeAction.ReadUserCommand(myList,line); + } + in.close(); + } + + public static void EndDuke() { + try { + Message.msgBye(); + } catch (IOException error) { + Message.msgError(error); + } + } +} diff --git a/src/main/java/Message.java b/src/main/java/Message.java index 2a552573..b7a16842 100644 --- a/src/main/java/Message.java +++ b/src/main/java/Message.java @@ -1,3 +1,5 @@ +package src.main.java; + import java.io.*; public class Message { @@ -121,6 +123,11 @@ public static void msgTaskDetail(TaskList myList, int taskNumber) { } } + public static void msgSave (){ + System.out.println(" Progress Saved!"); + System.out.println("_________________________________"); + } + // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgError(Exception e) { diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 79907c10..d262f1a7 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,3 +1,5 @@ +package src.main.java; + public abstract class Task { protected String taskDetail; protected boolean isDone; diff --git a/src/main/java/TaskDeadline.java b/src/main/java/TaskDeadline.java index f398723d..6c8114c7 100644 --- a/src/main/java/TaskDeadline.java +++ b/src/main/java/TaskDeadline.java @@ -1,3 +1,5 @@ +package src.main.java; + import java.sql.Time; import java.util.Date; diff --git a/src/main/java/TaskEvent.java b/src/main/java/TaskEvent.java index d71f07a6..d9179fa8 100644 --- a/src/main/java/TaskEvent.java +++ b/src/main/java/TaskEvent.java @@ -1,3 +1,5 @@ +package src.main.java; + import java.sql.Time; import java.util.Date; diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 6a2d55fa..46af26e1 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,3 +1,5 @@ +package src.main.java; + import java.util.ArrayList; import java.util.*; import java.sql.Time; diff --git a/src/main/java/TaskToDos.java b/src/main/java/TaskToDos.java index 75bf2010..414e2d9c 100644 --- a/src/main/java/TaskToDos.java +++ b/src/main/java/TaskToDos.java @@ -1,3 +1,5 @@ +package src.main.java; + public class TaskToDos extends Task { public TaskToDos(String taskDetail) { diff --git a/src/main/java/TaskType.java b/src/main/java/TaskType.java index 2cb1f84b..8788b3b6 100644 --- a/src/main/java/TaskType.java +++ b/src/main/java/TaskType.java @@ -1,3 +1,5 @@ +package src.main.java; + public enum TaskType { TODOS, DEADLINE, EVENT; diff --git a/src/main/java/Action.java b/src/main/java/action/DukeAction.java similarity index 51% rename from src/main/java/Action.java rename to src/main/java/action/DukeAction.java index a859b58d..a0ec60f2 100644 --- a/src/main/java/Action.java +++ b/src/main/java/action/DukeAction.java @@ -1,55 +1,57 @@ -import java.util.Scanner; -import java.io.*; +package src.main.java.action; -public class Action { +import src.main.java.DukeActionFacade; +import src.main.java.Message; +import src.main.java.TaskList; - public static void StartDuke() { - Message.msgGreet(); - } +import java.io.FileWriter; +import java.util.Scanner; - public static void RunDuke() { - boolean bye = false; - String line; - Scanner in = new Scanner(System.in); - TaskList myList = new TaskList(); - while (!bye) { - line = in.nextLine(); +public class DukeAction extends DukeActionFacade { - try { - if (line.equals("list")) { - Message.msgList(myList); - } else if (line.equals("bye")) { - bye = true; - } else if (line.substring(0, 4).equals("done")) { - MarkTaskDone(myList, line); - } else if (line.substring(0, 4).equals("todo")) { - AddTaskToDo(myList, line); - } else if (line.substring(0, 5).equals("event")) { - AddTaskEvent(myList, line); - } else if (line.substring(0, 6).equals("delete")) { - RemoveTask(myList, line); - } else if (line.substring(0, 8).equals("deadline")) { - AddTaskDeadline(myList, line); - } else { - Message.msgInvalidInput(); - } - } catch (Exception e) { - Message.msgInvalidInput(); - Message.msgError(e); + public static boolean ReadUserCommand(TaskList myList, String line) { + try { + if (line.equals("bye")) { + return false; } + if (line.equals("list")) { + ShowFullList(myList); + } else if (line.substring(0, 4).equals("done")) { + MarkTaskDone(myList, line); + } else if (line.substring(0, 4).equals("todo")) { + AddTaskToDo(myList, line); + } else if (line.substring(0, 4).equals("save")) { + SaveTask(myList); + } else if (line.substring(0, 5).equals("event")) { + AddTaskEvent(myList, line); + } else if (line.substring(0, 6).equals("delete")) { + RemoveTask(myList, line); + } else if (line.substring(0, 8).equals("deadline")) { + AddTaskDeadline(myList, line); + } else { + Message.msgInvalidInput(); + } + return true; + } catch (Exception e) { + Message.msgInvalidInput(); + Message.msgError(e); + return true; } - in.close(); + } + private static void ShowFullList(TaskList myList) { + Message.msgList(myList); } - public static void MarkTaskDone(TaskList myList, String line) { - Integer taskNumber = Integer.parseInt(line.substring(5)); + + private static void MarkTaskDone(TaskList myList, String line) { + int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); Message.msgMarkDone(myList, taskNumber - 1); } - public static void AddTaskToDo(TaskList myList, String line) { + private static void AddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { Message.msgInvalidInputMissingDescription(); } else { @@ -58,7 +60,19 @@ public static void AddTaskToDo(TaskList myList, String line) { } } - public static void AddTaskEvent(TaskList myList, String line) { + private static void SaveTask(TaskList myList) { + String filepath = "myText.txt"; + try { + FileWriter fw = new FileWriter(filepath); + fw.write("helloWold"); + fw.close(); + Message.msgSave(); + } catch (Exception e){ + Message.msgError(e); + } + } + + private static void AddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { Message.msgInvalidInputMissingDescription(); } else if (!line.contains("/at")) { @@ -79,7 +93,17 @@ public static void AddTaskEvent(TaskList myList, String line) { } } - public static void AddTaskDeadline(TaskList myList, String line) { + private static void RemoveTask(TaskList myList, String line) { + try { + int taskNumber = Integer.parseInt(line.substring(7)); + Message.msgRemoveItem(myList, taskNumber - 1); + myList.removeItem(taskNumber - 1); + } catch (Exception e) { + Message.msgWrongTaskNumber(); + } + } + + private static void AddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { Message.msgInvalidInputMissingDescription(); } else if (!line.contains("/by")) { @@ -99,21 +123,7 @@ public static void AddTaskDeadline(TaskList myList, String line) { } } - public static void RemoveTask(TaskList myList, String line) { - try { - Integer taskNumber = Integer.parseInt(line.substring(7)); - Message.msgRemoveItem(myList, taskNumber - 1); - myList.removeItem(taskNumber - 1); - } catch (Exception e) { - Message.msgWrongTaskNumber(); - } - } - - public static void EndDuke() { - try { - Message.msgBye(); - } catch (IOException error) { - Message.msgError(error); - } - } } + + + From 18821b96aa7b92f60a61f84c8937346e885f3352 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 28 Oct 2021 22:09:56 +0800 Subject: [PATCH 15/39] Duke Level-7-2: File Access: save file --- .gitignore | 2 +- src/{main => }/java/Duke.java | 2 +- src/{main => }/java/DukeActionFacade.java | 5 ++- src/{main => }/java/Message.java | 7 +++- src/{main => }/java/action/DukeAction.java | 36 +++++++++------- src/java/fileAccess/FileAccess.java | 42 +++++++++++++++++++ src/{main/java => java/task}/Task.java | 4 +- .../java => java/task}/TaskDeadline.java | 2 +- src/{main/java => java/task}/TaskEvent.java | 2 +- src/{main/java => java/task}/TaskList.java | 2 +- src/{main/java => java/task}/TaskToDos.java | 2 +- src/{main/java => java/task}/TaskType.java | 2 +- src/{main => }/resources/buddha.txt | 0 myText.txt => src/resources/myText.txt | 0 src/resources/progress.txt | 2 + 15 files changed, 84 insertions(+), 26 deletions(-) rename src/{main => }/java/Duke.java (88%) rename src/{main => }/java/DukeActionFacade.java (88%) rename src/{main => }/java/Message.java (98%) rename src/{main => }/java/action/DukeAction.java (80%) create mode 100644 src/java/fileAccess/FileAccess.java rename src/{main/java => java/task}/Task.java (93%) rename src/{main/java => java/task}/TaskDeadline.java (97%) rename src/{main/java => java/task}/TaskEvent.java (97%) rename src/{main/java => java/task}/TaskList.java (98%) rename src/{main/java => java/task}/TaskToDos.java (88%) rename src/{main/java => java/task}/TaskType.java (94%) rename src/{main => }/resources/buddha.txt (100%) rename myText.txt => src/resources/myText.txt (100%) create mode 100644 src/resources/progress.txt diff --git a/.gitignore b/.gitignore index f69985ef..2f776923 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ # Gradle build files /.gradle/ /build/ -src/main/resources/docs/ +src/resources/docs/ # MacOS custom attributes files created by Finder .DS_Store diff --git a/src/main/java/Duke.java b/src/java/Duke.java similarity index 88% rename from src/main/java/Duke.java rename to src/java/Duke.java index 9609e6e7..44455f98 100644 --- a/src/main/java/Duke.java +++ b/src/java/Duke.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java; public class Duke { diff --git a/src/main/java/DukeActionFacade.java b/src/java/DukeActionFacade.java similarity index 88% rename from src/main/java/DukeActionFacade.java rename to src/java/DukeActionFacade.java index 407e758d..4ac194e8 100644 --- a/src/main/java/DukeActionFacade.java +++ b/src/java/DukeActionFacade.java @@ -1,6 +1,7 @@ -package src.main.java; +package src.java; -import src.main.java.action.DukeAction; +import src.java.action.DukeAction; +import src.java.task.TaskList; import java.util.Scanner; import java.io.*; diff --git a/src/main/java/Message.java b/src/java/Message.java similarity index 98% rename from src/main/java/Message.java rename to src/java/Message.java index b7a16842..787cf7b5 100644 --- a/src/main/java/Message.java +++ b/src/java/Message.java @@ -1,4 +1,7 @@ -package src.main.java; +package src.java; + +import src.java.task.TaskList; +import src.java.task.TaskType; import java.io.*; @@ -185,7 +188,7 @@ public static void msgBuddahProtectMe() throws IOException { String pathRoot = System.getProperty("user.dir"); // pathRoot = D:\My Files\School Documents\Repository\Duke - String pathRssFolder = "src" + File.separator + "main" + File.separator + "resources"; + String pathRssFolder = "src" + File.separator + "resources"; // pathRssFolder = src\main\resources String pathFileName = "buddha.txt"; diff --git a/src/main/java/action/DukeAction.java b/src/java/action/DukeAction.java similarity index 80% rename from src/main/java/action/DukeAction.java rename to src/java/action/DukeAction.java index a0ec60f2..f2c4e46f 100644 --- a/src/main/java/action/DukeAction.java +++ b/src/java/action/DukeAction.java @@ -1,11 +1,12 @@ -package src.main.java.action; +package src.java.action; -import src.main.java.DukeActionFacade; -import src.main.java.Message; -import src.main.java.TaskList; +import src.java.DukeActionFacade; +import src.java.Message; +import src.java.fileAccess.FileAccess; +import src.java.task.TaskList; +import src.java.task.TaskType; import java.io.FileWriter; -import java.util.Scanner; public class DukeAction extends DukeActionFacade { @@ -61,15 +62,8 @@ private static void AddTaskToDo(TaskList myList, String line) { } private static void SaveTask(TaskList myList) { - String filepath = "myText.txt"; - try { - FileWriter fw = new FileWriter(filepath); - fw.write("helloWold"); - fw.close(); - Message.msgSave(); - } catch (Exception e){ - Message.msgError(e); - } + String listOfTaskString = ReadTaskConvertToString(myList); + FileAccess.SaveProgressIntoFile(myList, listOfTaskString); } private static void AddTaskEvent(TaskList myList, String line) { @@ -123,6 +117,20 @@ private static void AddTaskDeadline(TaskList myList, String line) { } } + protected static String ReadTaskConvertToString(TaskList myList) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + boolean isDone = myList.getTaskDoneStatus(i); + String isDoneString = (isDone ? "1" : "0"); + String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); + + sb.append(taskType).append("|"); + sb.append(isDoneString).append("|"); + sb.append(taskDetail).append("\n"); + } + return sb.toString(); + } } diff --git a/src/java/fileAccess/FileAccess.java b/src/java/fileAccess/FileAccess.java new file mode 100644 index 00000000..e796e0cf --- /dev/null +++ b/src/java/fileAccess/FileAccess.java @@ -0,0 +1,42 @@ +package src.java.fileAccess; + +import src.java.Message; +import src.java.task.TaskList; + +import java.io.FileWriter; + +public class FileAccess { + + public static void SaveProgressIntoFile(TaskList myList, String stringToBeWritten){ + String filepath = "src\\resources\\progress.txt"; + + try { + FileWriter fw = new FileWriter(filepath); + fw.write(stringToBeWritten); + fw.close(); + Message.msgSave(); + } catch (Exception e){ + Message.msgError(e); + } + } + + public static void LoadProgressFromFile(){ + + } + + public static void DeleteFile(){ + + } + + public static void SaveFileExample(){ + String filepath = "src\\resources\\myText.txt"; + try { + FileWriter fw = new FileWriter(filepath); + fw.write("helloWold"); + fw.close(); + Message.msgSave(); + } catch (Exception e){ + Message.msgError(e); + } + } +} diff --git a/src/main/java/Task.java b/src/java/task/Task.java similarity index 93% rename from src/main/java/Task.java rename to src/java/task/Task.java index d262f1a7..a5b351b9 100644 --- a/src/main/java/Task.java +++ b/src/java/task/Task.java @@ -1,4 +1,6 @@ -package src.main.java; +package src.java.task; + +import src.java.task.TaskType; public abstract class Task { protected String taskDetail; diff --git a/src/main/java/TaskDeadline.java b/src/java/task/TaskDeadline.java similarity index 97% rename from src/main/java/TaskDeadline.java rename to src/java/task/TaskDeadline.java index 6c8114c7..db5b5f97 100644 --- a/src/main/java/TaskDeadline.java +++ b/src/java/task/TaskDeadline.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java.task; import java.sql.Time; import java.util.Date; diff --git a/src/main/java/TaskEvent.java b/src/java/task/TaskEvent.java similarity index 97% rename from src/main/java/TaskEvent.java rename to src/java/task/TaskEvent.java index d9179fa8..0a0d1237 100644 --- a/src/main/java/TaskEvent.java +++ b/src/java/task/TaskEvent.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java.task; import java.sql.Time; import java.util.Date; diff --git a/src/main/java/TaskList.java b/src/java/task/TaskList.java similarity index 98% rename from src/main/java/TaskList.java rename to src/java/task/TaskList.java index 46af26e1..27e3b29b 100644 --- a/src/main/java/TaskList.java +++ b/src/java/task/TaskList.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java.task; import java.util.ArrayList; import java.util.*; diff --git a/src/main/java/TaskToDos.java b/src/java/task/TaskToDos.java similarity index 88% rename from src/main/java/TaskToDos.java rename to src/java/task/TaskToDos.java index 414e2d9c..a6f3047d 100644 --- a/src/main/java/TaskToDos.java +++ b/src/java/task/TaskToDos.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java.task; public class TaskToDos extends Task { diff --git a/src/main/java/TaskType.java b/src/java/task/TaskType.java similarity index 94% rename from src/main/java/TaskType.java rename to src/java/task/TaskType.java index 8788b3b6..977d774d 100644 --- a/src/main/java/TaskType.java +++ b/src/java/task/TaskType.java @@ -1,4 +1,4 @@ -package src.main.java; +package src.java.task; public enum TaskType { TODOS, DEADLINE, EVENT; diff --git a/src/main/resources/buddha.txt b/src/resources/buddha.txt similarity index 100% rename from src/main/resources/buddha.txt rename to src/resources/buddha.txt diff --git a/myText.txt b/src/resources/myText.txt similarity index 100% rename from myText.txt rename to src/resources/myText.txt diff --git a/src/resources/progress.txt b/src/resources/progress.txt new file mode 100644 index 00000000..3b378192 --- /dev/null +++ b/src/resources/progress.txt @@ -0,0 +1,2 @@ +T|1|borrow book +T|1|borrow book From 758813c9d98b498af6f22fb5d6f8c85b512b347d Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 29 Oct 2021 10:08:37 +0800 Subject: [PATCH 16/39] Duke Level-7-3: Duke: Restructure duke object; File Access: load file --- src/java/Duke.java | 8 +- src/java/DukeActionFacade.java | 45 ++++++----- .../{DukeAction.java => DukeObject.java} | 75 +++++++++++++++---- src/java/fileAccess/FileAccess.java | 34 +++++++-- src/resources/progress.txt | 4 +- 5 files changed, 121 insertions(+), 45 deletions(-) rename src/java/action/{DukeAction.java => DukeObject.java} (65%) diff --git a/src/java/Duke.java b/src/java/Duke.java index 44455f98..d0d65b81 100644 --- a/src/java/Duke.java +++ b/src/java/Duke.java @@ -4,8 +4,10 @@ public class Duke { public static void main(String[] args) { - DukeActionFacade.StartDuke(); - DukeActionFacade.RunDuke(); - DukeActionFacade.EndDuke(); + DukeActionFacade dukeActionFacade = new DukeActionFacade(); + + dukeActionFacade.StartDuke(); + dukeActionFacade.RunDuke(); + dukeActionFacade.EndDuke(); } } diff --git a/src/java/DukeActionFacade.java b/src/java/DukeActionFacade.java index 4ac194e8..3111a4b5 100644 --- a/src/java/DukeActionFacade.java +++ b/src/java/DukeActionFacade.java @@ -1,34 +1,39 @@ package src.java; -import src.java.action.DukeAction; +import src.java.action.DukeObject; +import src.java.fileAccess.FileAccess; import src.java.task.TaskList; import java.util.Scanner; import java.io.*; -public abstract class DukeActionFacade { +public class DukeActionFacade { - public static void StartDuke() { - Message.msgGreet(); + private FileAccess fileAccess; + private DukeObject dukeObject; + + public DukeActionFacade(){ + fileAccess = new FileAccess(); + dukeObject = new DukeObject(fileAccess); + } + + public void StartDuke() { + dukeObject.ShowGreetMessage(); + } + + public void RunDuke(){ + dukeObject.OnCreateDuke(); + } + + public void EndDuke() { + dukeObject.ShowByeMessage(); } - public static void RunDuke(){ - boolean runTask = true; - String line; - Scanner in = new Scanner(System.in); - TaskList myList = new TaskList(); - while (runTask) { - line = in.nextLine(); - runTask = DukeAction.ReadUserCommand(myList,line); - } - in.close(); + public FileAccess getFileAccess (){ + return fileAccess; } - public static void EndDuke() { - try { - Message.msgBye(); - } catch (IOException error) { - Message.msgError(error); - } + public DukeObject getDukeObject (){ + return dukeObject; } } diff --git a/src/java/action/DukeAction.java b/src/java/action/DukeObject.java similarity index 65% rename from src/java/action/DukeAction.java rename to src/java/action/DukeObject.java index f2c4e46f..5e4cf331 100644 --- a/src/java/action/DukeAction.java +++ b/src/java/action/DukeObject.java @@ -7,15 +7,49 @@ import src.java.task.TaskType; import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; -public class DukeAction extends DukeActionFacade { +public class DukeObject{ - public static boolean ReadUserCommand(TaskList myList, String line) { + FileAccess fileAccess; + + public DukeObject (FileAccess fileAccess){ + this.fileAccess = fileAccess; + } + + // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public void ShowGreetMessage(){ + Message.msgGreet(); + } + + // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public void OnCreateDuke(){ + boolean isDukeRunning = true; + String line; + Scanner in = new Scanner(System.in); + TaskList myList = new TaskList(); + while (isDukeRunning) { + line = in.nextLine(); + isDukeRunning = ReadUserCommand(myList,line); + } + in.close(); + } + + public boolean ReadUserCommand(TaskList myList, String line) { try { + // Guard Condition if (line.equals("bye")) { return false; } + // for testing new function + if (line.equals("tf")) { + System.out.println("XXXXX Test Function XXXXX"); + fileAccess.DeleteProgressFile(); + System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); + } + if (line.equals("list")) { ShowFullList(myList); } else if (line.substring(0, 4).equals("done")) { @@ -24,6 +58,8 @@ public static boolean ReadUserCommand(TaskList myList, String line) { AddTaskToDo(myList, line); } else if (line.substring(0, 4).equals("save")) { SaveTask(myList); + } else if (line.substring(0, 4).equals("load")) { + // loadTask(myList); } else if (line.substring(0, 5).equals("event")) { AddTaskEvent(myList, line); } else if (line.substring(0, 6).equals("delete")) { @@ -41,18 +77,29 @@ public static boolean ReadUserCommand(TaskList myList, String line) { } } - private static void ShowFullList(TaskList myList) { - Message.msgList(myList); + // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public void ShowByeMessage(){ + try { + Message.msgBye(); + } catch (IOException error) { + Message.msgError(error); + } } + // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - private static void MarkTaskDone(TaskList myList, String line) { + private void ShowFullList(TaskList myList) { + Message.msgList(myList); + } + + private void MarkTaskDone(TaskList myList, String line) { int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); Message.msgMarkDone(myList, taskNumber - 1); } - private static void AddTaskToDo(TaskList myList, String line) { + private void AddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { Message.msgInvalidInputMissingDescription(); } else { @@ -61,12 +108,12 @@ private static void AddTaskToDo(TaskList myList, String line) { } } - private static void SaveTask(TaskList myList) { + private void SaveTask(TaskList myList) { String listOfTaskString = ReadTaskConvertToString(myList); - FileAccess.SaveProgressIntoFile(myList, listOfTaskString); + fileAccess.SaveProgressIntoFile(myList, listOfTaskString); } - private static void AddTaskEvent(TaskList myList, String line) { + private void AddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { Message.msgInvalidInputMissingDescription(); } else if (!line.contains("/at")) { @@ -87,7 +134,7 @@ private static void AddTaskEvent(TaskList myList, String line) { } } - private static void RemoveTask(TaskList myList, String line) { + private void RemoveTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); Message.msgRemoveItem(myList, taskNumber - 1); @@ -97,7 +144,7 @@ private static void RemoveTask(TaskList myList, String line) { } } - private static void AddTaskDeadline(TaskList myList, String line) { + private void AddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { Message.msgInvalidInputMissingDescription(); } else if (!line.contains("/by")) { @@ -117,7 +164,9 @@ private static void AddTaskDeadline(TaskList myList, String line) { } } - protected static String ReadTaskConvertToString(TaskList myList) { + // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + private String ReadTaskConvertToString(TaskList myList) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < myList.getNumOfItem(); i++) { String taskDetail = myList.getTaskDetail(i); @@ -127,7 +176,7 @@ protected static String ReadTaskConvertToString(TaskList myList) { sb.append(taskType).append("|"); sb.append(isDoneString).append("|"); - sb.append(taskDetail).append("\n"); + sb.append(taskDetail).append("|\n"); } return sb.toString(); } diff --git a/src/java/fileAccess/FileAccess.java b/src/java/fileAccess/FileAccess.java index e796e0cf..65fdba72 100644 --- a/src/java/fileAccess/FileAccess.java +++ b/src/java/fileAccess/FileAccess.java @@ -3,39 +3,59 @@ import src.java.Message; import src.java.task.TaskList; +import java.io.File; import java.io.FileWriter; +import java.util.Scanner; public class FileAccess { + String filepath; + File progressFile; - public static void SaveProgressIntoFile(TaskList myList, String stringToBeWritten){ - String filepath = "src\\resources\\progress.txt"; + public FileAccess() { + filepath = "src\\resources\\progress.txt"; + progressFile = new File(filepath); + } + + public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { try { FileWriter fw = new FileWriter(filepath); fw.write(stringToBeWritten); fw.close(); Message.msgSave(); - } catch (Exception e){ + } catch (Exception e) { Message.msgError(e); } } - public static void LoadProgressFromFile(){ + public String LoadProgressFromFile() { + StringBuilder sb = new StringBuilder(); + + try { + Scanner scanner = new Scanner(progressFile); + while (scanner.hasNext()) { + sb.append(scanner.nextLine()); + } + + } catch (Exception e) { + Message.msgError(e); + } + return sb.toString(); } - public static void DeleteFile(){ + public void DeleteProgressFile() { } - public static void SaveFileExample(){ + public void SaveFileExample() { String filepath = "src\\resources\\myText.txt"; try { FileWriter fw = new FileWriter(filepath); fw.write("helloWold"); fw.close(); Message.msgSave(); - } catch (Exception e){ + } catch (Exception e) { Message.msgError(e); } } diff --git a/src/resources/progress.txt b/src/resources/progress.txt index 3b378192..d58eea12 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,2 +1,2 @@ -T|1|borrow book -T|1|borrow book +T|1|borrow book| +D|1|return book | From e06829d7e470ecf4c0f7e6588b818d9ef7165a4f Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 29 Oct 2021 10:09:23 +0800 Subject: [PATCH 17/39] Duke Level-7-4: Message: load file --- src/java/Message.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/java/Message.java b/src/java/Message.java index 787cf7b5..37b4a56e 100644 --- a/src/java/Message.java +++ b/src/java/Message.java @@ -77,6 +77,18 @@ public static void msgEcho(String s) { System.out.println("_________________________________"); } + // FileAccess Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public static void msgSave (){ + System.out.println(" Progress Saved!"); + System.out.println("_________________________________"); + } + + public static void msgSLoad (){ + System.out.println(" Progress loaded!"); + System.out.println("_________________________________"); + } + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgMarkDone(TaskList myList, int taskNumber) { @@ -126,11 +138,6 @@ public static void msgTaskDetail(TaskList myList, int taskNumber) { } } - public static void msgSave (){ - System.out.println(" Progress Saved!"); - System.out.println("_________________________________"); - } - // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgError(Exception e) { @@ -171,6 +178,7 @@ public static void msgWrongTaskNumber() { System.out.println(" ☹ OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } + // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public static void msgBye() throws IOException { From 2651e2b500b2448cc05c85db8c8dc7d17c674e8f Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 29 Oct 2021 13:20:07 +0800 Subject: [PATCH 18/39] Duke Level-7-5: OOP: Restructure program, add Ui, rename Parser Storage Ui; Package: organize files into packages --- src/java/Duke.java | 10 ++-- src/java/DukeActionFacade.java | 39 ------------- .../action/{DukeObject.java => Parser.java} | 56 +++++++++--------- src/java/action/ParserFacade.java | 34 +++++++++++ .../{fileAccess => storage}/FileAccess.java | 21 ++++--- src/java/{ => ui}/Message.java | 57 ++++++++++--------- src/java/ui/Ui.java | 33 +++++++++++ src/resources/progress.txt | 5 +- 8 files changed, 145 insertions(+), 110 deletions(-) delete mode 100644 src/java/DukeActionFacade.java rename src/java/action/{DukeObject.java => Parser.java} (80%) create mode 100644 src/java/action/ParserFacade.java rename src/java/{fileAccess => storage}/FileAccess.java (78%) rename src/java/{ => ui}/Message.java (84%) create mode 100644 src/java/ui/Ui.java diff --git a/src/java/Duke.java b/src/java/Duke.java index d0d65b81..17af883a 100644 --- a/src/java/Duke.java +++ b/src/java/Duke.java @@ -1,13 +1,15 @@ package src.java; +import src.java.action.ParserFacade; + public class Duke { public static void main(String[] args) { - DukeActionFacade dukeActionFacade = new DukeActionFacade(); + ParserFacade parserFacade = new ParserFacade(); - dukeActionFacade.StartDuke(); - dukeActionFacade.RunDuke(); - dukeActionFacade.EndDuke(); + parserFacade.StartDuke(); + parserFacade.RunDuke(); + parserFacade.EndDuke(); } } diff --git a/src/java/DukeActionFacade.java b/src/java/DukeActionFacade.java deleted file mode 100644 index 3111a4b5..00000000 --- a/src/java/DukeActionFacade.java +++ /dev/null @@ -1,39 +0,0 @@ -package src.java; - -import src.java.action.DukeObject; -import src.java.fileAccess.FileAccess; -import src.java.task.TaskList; - -import java.util.Scanner; -import java.io.*; - -public class DukeActionFacade { - - private FileAccess fileAccess; - private DukeObject dukeObject; - - public DukeActionFacade(){ - fileAccess = new FileAccess(); - dukeObject = new DukeObject(fileAccess); - } - - public void StartDuke() { - dukeObject.ShowGreetMessage(); - } - - public void RunDuke(){ - dukeObject.OnCreateDuke(); - } - - public void EndDuke() { - dukeObject.ShowByeMessage(); - } - - public FileAccess getFileAccess (){ - return fileAccess; - } - - public DukeObject getDukeObject (){ - return dukeObject; - } -} diff --git a/src/java/action/DukeObject.java b/src/java/action/Parser.java similarity index 80% rename from src/java/action/DukeObject.java rename to src/java/action/Parser.java index 5e4cf331..0e9c0945 100644 --- a/src/java/action/DukeObject.java +++ b/src/java/action/Parser.java @@ -1,26 +1,26 @@ package src.java.action; -import src.java.DukeActionFacade; -import src.java.Message; -import src.java.fileAccess.FileAccess; +import src.java.ui.Message; +import src.java.storage.FileAccess; import src.java.task.TaskList; import src.java.task.TaskType; - -import java.io.FileWriter; +import src.java.ui.Ui; import java.io.IOException; import java.util.Scanner; -public class DukeObject{ +public class Parser { - FileAccess fileAccess; + private FileAccess fileAccess; + private Ui ui; - public DukeObject (FileAccess fileAccess){ + public Parser(FileAccess fileAccess){ this.fileAccess = fileAccess; + ui = new Message(); } // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public void ShowGreetMessage(){ - Message.msgGreet(); + ui.msgGreet(); } // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -67,12 +67,12 @@ public boolean ReadUserCommand(TaskList myList, String line) { } else if (line.substring(0, 8).equals("deadline")) { AddTaskDeadline(myList, line); } else { - Message.msgInvalidInput(); + ui.msgInvalidInput(); } return true; } catch (Exception e) { - Message.msgInvalidInput(); - Message.msgError(e); + ui.msgInvalidInput(); + ui.msgError(e); return true; } } @@ -81,30 +81,30 @@ public boolean ReadUserCommand(TaskList myList, String line) { public void ShowByeMessage(){ try { - Message.msgBye(); + ui.msgBye(); } catch (IOException error) { - Message.msgError(error); + ui.msgError(error); } } // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< private void ShowFullList(TaskList myList) { - Message.msgList(myList); + ui.msgList(myList); } private void MarkTaskDone(TaskList myList, String line) { int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); - Message.msgMarkDone(myList, taskNumber - 1); + ui.msgMarkDone(myList, taskNumber - 1); } private void AddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { - Message.msgInvalidInputMissingDescription(); + ui.msgInvalidInputMissingDescription(); } else { myList.addItemToDos(line.substring(5)); - Message.msgAssignTask(myList, myList.getNumOfItem() - 1); + ui.msgAssignTask(myList, myList.getNumOfItem() - 1); } } @@ -115,9 +115,9 @@ private void SaveTask(TaskList myList) { private void AddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { - Message.msgInvalidInputMissingDescription(); + ui.msgInvalidInputMissingDescription(); } else if (!line.contains("/at")) { - Message.msgInvalidInputMissingDay(); + ui.msgInvalidInputMissingDay(); } else { try { @@ -127,9 +127,9 @@ private void AddTaskEvent(TaskList myList, String line) { String time = line.substring(line.indexOf("/") + 8); myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 - Message.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); } catch (Exception e) { - Message.msgInvalidInput(); + ui.msgInvalidInput(); } } } @@ -137,18 +137,18 @@ private void AddTaskEvent(TaskList myList, String line) { private void RemoveTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); - Message.msgRemoveItem(myList, taskNumber - 1); + ui.msgRemoveItem(myList, taskNumber - 1); myList.removeItem(taskNumber - 1); } catch (Exception e) { - Message.msgWrongTaskNumber(); + ui.msgWrongTaskNumber(); } } private void AddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { - Message.msgInvalidInputMissingDescription(); + ui.msgInvalidInputMissingDescription(); } else if (!line.contains("/by")) { - Message.msgInvalidInputMissingDay(); + ui.msgInvalidInputMissingDay(); } else { try { String taskDetail = line.substring(9, line.indexOf("/")); @@ -156,10 +156,10 @@ private void AddTaskDeadline(TaskList myList, String line) { String day = dayWithBy.substring(3); myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 - Message.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); } catch (Exception e) { - Message.msgInvalidInput(); + ui.msgInvalidInput(); } } } diff --git a/src/java/action/ParserFacade.java b/src/java/action/ParserFacade.java new file mode 100644 index 00000000..8faf06e0 --- /dev/null +++ b/src/java/action/ParserFacade.java @@ -0,0 +1,34 @@ +package src.java.action; + +import src.java.storage.FileAccess; + +public class ParserFacade { + + private FileAccess fileAccess; + private Parser parser; + + public ParserFacade(){ + fileAccess = new FileAccess(); + parser = new Parser(fileAccess); + } + + public void StartDuke() { + parser.ShowGreetMessage(); + } + + public void RunDuke(){ + parser.OnCreateDuke(); + } + + public void EndDuke() { + parser.ShowByeMessage(); + } + + public FileAccess getFileAccess (){ + return fileAccess; + } + + public Parser getDukeObject (){ + return parser; + } +} diff --git a/src/java/fileAccess/FileAccess.java b/src/java/storage/FileAccess.java similarity index 78% rename from src/java/fileAccess/FileAccess.java rename to src/java/storage/FileAccess.java index 65fdba72..b30bb664 100644 --- a/src/java/fileAccess/FileAccess.java +++ b/src/java/storage/FileAccess.java @@ -1,19 +1,22 @@ -package src.java.fileAccess; +package src.java.storage; -import src.java.Message; +import src.java.ui.Message; import src.java.task.TaskList; +import src.java.ui.Ui; import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class FileAccess { - String filepath; - File progressFile; + private String filepath; + private File progressFile; + private Ui ui; public FileAccess() { filepath = "src\\resources\\progress.txt"; progressFile = new File(filepath); + ui = new Message(); } public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { @@ -22,9 +25,9 @@ public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { FileWriter fw = new FileWriter(filepath); fw.write(stringToBeWritten); fw.close(); - Message.msgSave(); + ui.msgSave(); } catch (Exception e) { - Message.msgError(e); + ui.msgError(e); } } @@ -38,7 +41,7 @@ public String LoadProgressFromFile() { } } catch (Exception e) { - Message.msgError(e); + ui.msgError(e); } return sb.toString(); @@ -54,9 +57,9 @@ public void SaveFileExample() { FileWriter fw = new FileWriter(filepath); fw.write("helloWold"); fw.close(); - Message.msgSave(); + ui.msgSave(); } catch (Exception e) { - Message.msgError(e); + ui.msgError(e); } } } diff --git a/src/java/Message.java b/src/java/ui/Message.java similarity index 84% rename from src/java/Message.java rename to src/java/ui/Message.java index 37b4a56e..7f9dbf45 100644 --- a/src/java/Message.java +++ b/src/java/ui/Message.java @@ -1,14 +1,15 @@ -package src.java; +package src.java.ui; import src.java.task.TaskList; import src.java.task.TaskType; import java.io.*; -public class Message { +public class Message implements Ui { // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgGreet() { + @Override + public void msgGreet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); @@ -18,7 +19,7 @@ public static void msgGreet() { // Assignment Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgAssignTask(TaskList myList, int taskNumber) { + public void msgAssignTask(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -34,7 +35,7 @@ public static void msgAssignTask(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public static void msgAssignTaskDeadline(TaskList myList, int taskNumber) { + public void msgAssignTaskDeadline(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -53,7 +54,7 @@ public static void msgAssignTaskDeadline(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public static void msgAssignTaskEvent(TaskList myList, int taskNumber) { + public void msgAssignTaskEvent(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -72,45 +73,45 @@ public static void msgAssignTaskEvent(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public static void msgEcho(String s) { + public void msgEcho(String s) { System.out.println(" Task Added: " + s); System.out.println("_________________________________"); } // FileAccess Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgSave (){ + public void msgSave() { System.out.println(" Progress Saved!"); System.out.println("_________________________________"); } - public static void msgSLoad (){ + public void msgSLoad() { System.out.println(" Progress loaded!"); System.out.println("_________________________________"); } // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgMarkDone(TaskList myList, int taskNumber) { + public void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); - Message.msgBlankBeforeTaskDetail(); - Message.msgTaskDetail(myList, taskNumber); + msgBlankBeforeTaskDetail(); + msgTaskDetail(myList, taskNumber); System.out.println("_________________________________"); } - public static void msgList(TaskList myList) { + public void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { System.out.print(" " + Integer.toString(i + 1) + "."); - Message.msgTaskDetail(myList, i); + msgTaskDetail(myList, i); } System.out.println("_________________________________"); } - public static void msgBlankBeforeTaskDetail() { + public void msgBlankBeforeTaskDetail() { System.out.print(" "); } - public static void msgTaskDetail(TaskList myList, int taskNumber) { + public void msgTaskDetail(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -140,54 +141,54 @@ public static void msgTaskDetail(TaskList myList, int taskNumber) { // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgError(Exception e) { + public void msgError(Exception e) { System.out.println("Error Occurs: " + e); System.out.println("_________________________________"); } - public static void msgInvalidInput() { + public void msgInvalidInput() { System.out.println(" Sorry :( Invalid Input. Try Again ~ "); System.out.println("_________________________________"); } - public static void msgInvalidInputMissingDescription() { + public void msgInvalidInputMissingDescription() { System.out.println(" ☹ OOPS!!! The description cannot be empty."); System.out.println("_________________________________"); } - public static void msgInvalidInputMissingDay() { + public void msgInvalidInputMissingDay() { System.out.println(" ☹ OOPS!!! The day cannot be empty."); System.out.println("_________________________________"); } - public static void msgInvalidInputMissingTime() { + public void msgInvalidInputMissingTime() { System.out.println(" ☹ OOPS!!! The time cannot be empty."); System.out.println("_________________________________"); } - public static void msgRemoveItem(TaskList myList, int taskNumber) { + public void msgRemoveItem(TaskList myList, int taskNumber) { System.out.println(" Noted. I've removed this task:"); - Message.msgBlankBeforeTaskDetail(); - Message.msgTaskDetail(myList, taskNumber); + msgBlankBeforeTaskDetail(); + msgTaskDetail(myList, taskNumber); System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); System.out.println("_________________________________"); } - public static void msgWrongTaskNumber() { + public void msgWrongTaskNumber() { System.out.println(" ☹ OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public static void msgBye() throws IOException { + public void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); - Message.msgBuddahProtectMe(); + msgBuddahProtectMe(); } - public static void msgBuddahProtectMe() throws IOException { + public void msgBuddahProtectMe() throws IOException { String everything = ""; // ... \Duke\src\main\resources\buddha.txt diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java new file mode 100644 index 00000000..a291d987 --- /dev/null +++ b/src/java/ui/Ui.java @@ -0,0 +1,33 @@ +package src.java.ui; + +import src.java.task.TaskList; + +import java.io.IOException; + +public interface Ui { + + Message message = new Message(); + + // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public void msgGreet(); + public void msgAssignTask(TaskList myList, int taskNumber); + public void msgAssignTaskDeadline(TaskList myList, int taskNumber); + public void msgAssignTaskEvent(TaskList myList, int taskNumber); + public void msgEcho(String s); + public void msgSave(); + public void msgSLoad(); + public void msgMarkDone(TaskList myList, int taskNumber); + public void msgList(TaskList myList); + public void msgBlankBeforeTaskDetail(); + public void msgTaskDetail(TaskList myList, int taskNumber); + public void msgError(Exception e); + public void msgInvalidInput(); + public void msgInvalidInputMissingDescription(); + public void msgInvalidInputMissingDay(); + public void msgInvalidInputMissingTime(); + public void msgRemoveItem(TaskList myList, int taskNumber); + public void msgWrongTaskNumber(); + public void msgBye() throws IOException; + public void msgBuddahProtectMe() throws IOException; +} diff --git a/src/resources/progress.txt b/src/resources/progress.txt index d58eea12..2c2af338 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,2 +1,3 @@ -T|1|borrow book| -D|1|return book | +T|0|borrow book| +D|0|return book | +E|0|project meeting | From 952a11e77a3d77c580595a0c6f0789b0cd89ca5c Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Sun, 31 Oct 2021 01:35:46 +0800 Subject: [PATCH 19/39] Duke Level-8-1: Date Time: Add LocalDate to TaskDeadline --- src/FutureImporvement.txt | 3 + src/java/action/ParseDateTime.java | 93 ++++++++++++++++++++++++++++++ src/java/action/Parser.java | 41 ++++++++----- src/java/task/TaskDeadline.java | 47 ++++++++++++--- src/java/task/TaskList.java | 21 +++++-- src/java/ui/Message.java | 9 ++- src/java/ui/Ui.java | 1 + text-ui-test/input.txt | 3 +- 8 files changed, 188 insertions(+), 30 deletions(-) create mode 100644 src/FutureImporvement.txt create mode 100644 src/java/action/ParseDateTime.java diff --git a/src/FutureImporvement.txt b/src/FutureImporvement.txt new file mode 100644 index 00000000..223b65ba --- /dev/null +++ b/src/FutureImporvement.txt @@ -0,0 +1,3 @@ +Level 8: +1. date time should accept other format. for now cannot. +2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. \ No newline at end of file diff --git a/src/java/action/ParseDateTime.java b/src/java/action/ParseDateTime.java new file mode 100644 index 00000000..bd639959 --- /dev/null +++ b/src/java/action/ParseDateTime.java @@ -0,0 +1,93 @@ +package src.java.action; + +import src.java.ui.Message; +import src.java.ui.Ui; + +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoField; +import java.util.Locale; + +public class ParseDateTime { + + private static Ui ui = new Message(); + + public static LocalDate toDate(String taskDate) { + + LocalDate myDate = formatDate(taskDate); + return myDate; + } + + public static LocalDate formatDate(String taskDate) { + LocalDate formattedDate; + DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .parseLenient() + .appendPattern("[yyyy-MM-dd]") + .appendPattern("[M-d-yyyy]") + .appendPattern("[M-dd-yyyy]") + .appendPattern("[MM-d-yyyy]") + .appendPattern("[MM-dd-yyyy]") + .appendPattern("[M/d/yyyy]") + .appendPattern("[M/dd/yyyy]") + .appendPattern("[MM/d/yyyy]") + .appendPattern("[MM/dd/yyyy]") + .appendPattern("[d-M-yyyy]") + .appendPattern("[d-MM-yyyy]") + .appendPattern("[dd-M-yyyy]") + .appendPattern("[dd-MM-yyyy]") + .appendPattern("[d/M/yyyy]") + .appendPattern("[d/MM/yyyy]") + .appendPattern("[dd/M/yyyy]") + .appendPattern("[dd/MM/yyyy]") + .appendPattern("[MMM dd yyyy]"); + + DateTimeFormatter formatter = builder.toFormatter(Locale.ENGLISH); + + try { + formattedDate = LocalDate.parse(taskDate, formatter); + return formattedDate; + } catch (DateTimeParseException e) { + throw e; + } + } + + public static void formatDateExample() { + + // https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text + + String d2arr[] = { + "2016-12-21", + "1/17/2016", + "1/3/2016", + "11/23/2016", + "OCT 20 2016", + "Oct 22 2016", + "Oct 23", // default year is 2016 + "OCT 24", // default year is 2016 + }; + + DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() + .parseCaseInsensitive().parseLenient() + .parseDefaulting(ChronoField.YEAR_OF_ERA, 2016L) + .appendPattern("[yyyy-MM-dd]") + .appendPattern("[M/dd/yyyy]") + .appendPattern("[M/d/yyyy]") + .appendPattern("[MM/dd/yyyy]") + .appendPattern("[MMM dd yyyy]"); + + DateTimeFormatter formatter2 = builder.toFormatter(Locale.ENGLISH); + for (String d2 : d2arr) { + try { + LocalDate date = LocalDate.parse(d2, formatter2); + System.out.printf("%s%n", date); + } catch (DateTimeParseException e) { + System.out.printf("%s is not parsable! %n", d2); + throw e; + } + } + } +} diff --git a/src/java/action/Parser.java b/src/java/action/Parser.java index 0e9c0945..9d55e432 100644 --- a/src/java/action/Parser.java +++ b/src/java/action/Parser.java @@ -5,7 +5,9 @@ import src.java.task.TaskList; import src.java.task.TaskType; import src.java.ui.Ui; + import java.io.IOException; +import java.time.LocalDate; import java.util.Scanner; public class Parser { @@ -13,25 +15,25 @@ public class Parser { private FileAccess fileAccess; private Ui ui; - public Parser(FileAccess fileAccess){ + public Parser(FileAccess fileAccess) { this.fileAccess = fileAccess; ui = new Message(); } // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public void ShowGreetMessage(){ + public void ShowGreetMessage() { ui.msgGreet(); } // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public void OnCreateDuke(){ + public void OnCreateDuke() { boolean isDukeRunning = true; String line; Scanner in = new Scanner(System.in); TaskList myList = new TaskList(); while (isDukeRunning) { line = in.nextLine(); - isDukeRunning = ReadUserCommand(myList,line); + isDukeRunning = ReadUserCommand(myList, line); } in.close(); } @@ -79,7 +81,7 @@ public boolean ReadUserCommand(TaskList myList, String line) { // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public void ShowByeMessage(){ + public void ShowByeMessage() { try { ui.msgBye(); } catch (IOException error) { @@ -145,25 +147,34 @@ private void RemoveTask(TaskList myList, String line) { } private void AddTaskDeadline(TaskList myList, String line) { + if (line.length() <= 9) { ui.msgInvalidInputMissingDescription(); - } else if (!line.contains("/by")) { + } + + if (!line.contains("/by")) { ui.msgInvalidInputMissingDay(); - } else { - try { - String taskDetail = line.substring(9, line.indexOf("/")); - String dayWithBy = line.substring(line.indexOf("/") + 1, line.length()); - String day = dayWithBy.substring(3); + } - myList.addItemDeadline(taskDetail, day); // temporary for Duke Level 4 - ui.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + try { + String taskDetail = line.substring(9, line.indexOf("/")); + String dayWithBy = line.substring(line.indexOf("/") + 1, line.length()); + String day = dayWithBy.substring(3); - } catch (Exception e) { - ui.msgInvalidInput(); + LocalDate taskDate = ParseDateTime.toDate(day); + + if (taskDate == null){ + ui.msgInvalidInputWrongDateFormat(); + } else { + myList.addItemDeadline(taskDetail, taskDate); + ui.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); } + } catch (Exception e) { + ui.msgInvalidInputWrongDateFormat(); } } + // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< private String ReadTaskConvertToString(TaskList myList) { diff --git a/src/java/task/TaskDeadline.java b/src/java/task/TaskDeadline.java index db5b5f97..1ee894f2 100644 --- a/src/java/task/TaskDeadline.java +++ b/src/java/task/TaskDeadline.java @@ -1,11 +1,13 @@ package src.java.task; import java.sql.Time; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.Date; public class TaskDeadline extends Task { - private Date date; - private Time time; + private LocalDate taskDate; + private LocalTime taskTime; private String dateString; // temporary attribute for Duke Level 4 public TaskDeadline(String taskDetail) { @@ -14,22 +16,53 @@ public TaskDeadline(String taskDetail) { this.taskType = TaskType.DEADLINE; } - public TaskDeadline(String taskDetail, Date date, Time time) { + public TaskDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 super(taskDetail); this.isDone = false; this.taskType = TaskType.DEADLINE; - this.date = date; - this.time = time; + this.dateString = dateString; } - public TaskDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 + public TaskDeadline(String taskDetail, LocalDate taskDate) { super(taskDetail); this.isDone = false; this.taskType = TaskType.DEADLINE; - this.dateString = dateString; + this.taskDate = taskDate; + } + + public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + this.taskDate = taskDate; + this.taskTime = localTime; } public String getDateString() { // temporary constructor for Duke Level 4 return dateString; } + + public LocalDate getLocalDate(){ + return taskDate; + } + + public String getLocalDate_toString(){ + return String.valueOf(taskDate); + } + + public String getLocalDate_Day_toString(){ + return String.valueOf(taskDate.getDayOfMonth()); + } + + public String getLocalDate_Month_toString(){ + return String.valueOf(taskDate.getMonth()); + } + + public String getLocalDate_Year_toString(){ + return String.valueOf(taskDate.getYear()); + } + + public LocalTime getLocalTime(){ + return taskTime; + } } \ No newline at end of file diff --git a/src/java/task/TaskList.java b/src/java/task/TaskList.java index 27e3b29b..170b5f8b 100644 --- a/src/java/task/TaskList.java +++ b/src/java/task/TaskList.java @@ -1,5 +1,7 @@ package src.java.task; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.ArrayList; import java.util.*; import java.sql.Time; @@ -18,14 +20,18 @@ public void addItemToDos(String taskDetail) { list.add(new TaskToDos(taskDetail)); } - public void addItemDeadline(String taskDetail, Date date, Time time) { - list.add(new TaskDeadline(taskDetail, date, time)); - } - public void addItemDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 list.add(new TaskDeadline(taskDetail, dateString)); } + public void addItemDeadline(String taskDetail, LocalDate taskDate){ + list.add(new TaskDeadline(taskDetail, taskDate)); + } + + public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime){ + list.add(new TaskDeadline(taskDetail, taskDate, taskTime)); + } + public void addItemEvent(String taskDetail, Date date, Time startTime, Time endTime) { list.add(new TaskEvent(taskDetail, date, startTime, endTime)); } @@ -54,11 +60,16 @@ public boolean getTaskDoneStatus(int index) { return task.getDoneStatus(); } - public String getTaskDeadlineDateString(int index) { // temporary method for Duke Level 4 + public String getTaskDeadline_DateString(int index) { // temporary method for Duke Level 4 TaskDeadline task = (TaskDeadline) list.get(index); return task.getDateString(); } + public String getTaskDeadLine_TaskDate_InString(int index){ + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDate_toString(); + } + public String getTaskEventDateTimeString(int index) { // temporary method for Duke Level 4 TaskEvent task = (TaskEvent) list.get(index); return task.getDayTime(); diff --git a/src/java/ui/Message.java b/src/java/ui/Message.java index 7f9dbf45..7bb3c779 100644 --- a/src/java/ui/Message.java +++ b/src/java/ui/Message.java @@ -45,7 +45,7 @@ public void msgAssignTaskDeadline(TaskList myList, int taskNumber) { String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskDeadlineDateString(taskNumber); + String dateString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println( @@ -127,7 +127,7 @@ public void msgTaskDetail(TaskList myList, int taskNumber) { System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); break; case DEADLINE: - dateTimeString = myList.getTaskDeadlineDateString(taskNumber); + dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateTimeString + ")"); break; @@ -180,6 +180,11 @@ public void msgWrongTaskNumber() { System.out.println("_________________________________"); } + public void msgInvalidInputWrongDateFormat(){ + System.out.println(" ☹ OOPS!!! Please follow this format: yyyy-mm-dd."); + System.out.println("_________________________________"); + } + // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< public void msgBye() throws IOException { diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java index a291d987..968f9d75 100644 --- a/src/java/ui/Ui.java +++ b/src/java/ui/Ui.java @@ -26,6 +26,7 @@ public interface Ui { public void msgInvalidInputMissingDescription(); public void msgInvalidInputMissingDay(); public void msgInvalidInputMissingTime(); + public void msgInvalidInputWrongDateFormat(); public void msgRemoveItem(TaskList myList, int taskNumber); public void msgWrongTaskNumber(); public void msgBye() throws IOException; diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index d81236f9..2b4ae176 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -13,4 +13,5 @@ list deadline do homework deadline list -bye +deadline return book /by 2016-12-21 +event project meeting /at 2-12-2019 1800 From 6e51f512fc373d403f4c795d85170000cf274b4d Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Sun, 31 Oct 2021 21:21:22 +0800 Subject: [PATCH 20/39] Duke Level-8-2: Date Time: Add LocalDate to TaskDeadline; Add LocalDate and LocalTime to TaskEvent; Fix all message issues --- src/FutureImporvement.txt | 3 +- src/java/action/ParseDateTime.java | 46 ++++++-- src/java/action/Parser.java | 167 ++++++++++++++++++++++++----- src/java/task/TaskDeadline.java | 22 +--- src/java/task/TaskEvent.java | 62 ++++++++--- src/java/task/TaskList.java | 74 ++++++++++--- src/java/ui/Message.java | 132 ++++++++++++++++++++--- src/java/ui/Ui.java | 11 +- text-ui-test/input.txt | 10 +- 9 files changed, 429 insertions(+), 98 deletions(-) diff --git a/src/FutureImporvement.txt b/src/FutureImporvement.txt index 223b65ba..bb01328c 100644 --- a/src/FutureImporvement.txt +++ b/src/FutureImporvement.txt @@ -1,3 +1,4 @@ Level 8: 1. date time should accept other format. for now cannot. -2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. \ No newline at end of file +2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. + diff --git a/src/java/action/ParseDateTime.java b/src/java/action/ParseDateTime.java index bd639959..cf0af954 100644 --- a/src/java/action/ParseDateTime.java +++ b/src/java/action/ParseDateTime.java @@ -4,6 +4,7 @@ import src.java.ui.Ui; import java.time.LocalDate; +import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -15,13 +16,8 @@ public class ParseDateTime { private static Ui ui = new Message(); - public static LocalDate toDate(String taskDate) { + public static LocalDate toDate(String date) { - LocalDate myDate = formatDate(taskDate); - return myDate; - } - - public static LocalDate formatDate(String taskDate) { LocalDate formattedDate; DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() .parseCaseInsensitive() @@ -48,13 +44,49 @@ public static LocalDate formatDate(String taskDate) { DateTimeFormatter formatter = builder.toFormatter(Locale.ENGLISH); try { - formattedDate = LocalDate.parse(taskDate, formatter); + formattedDate = LocalDate.parse(date, formatter); return formattedDate; } catch (DateTimeParseException e) { throw e; } } + public static LocalTime toTime(String time){ + LocalTime localTime = LocalTime.parse(time); + return localTime; + } + + public static String[] splitDateAndTime(String dateAndTime) { + return dateAndTime.split(" "); + } + + public static int isDateAndTime(String dateAndTime) { + String[] split = dateAndTime.split(" "); + if (split.length == 1) { + return 1; + } else if (split.length == 2){ + return 2; + } else { + return 3; + } + } + + public static String ExtractDateFromSplitDateAndTime(String[] split) { + return split[0]; + } + + public static String ExtracTimeFromSplitDateAndTime(String[] split) { + return split[1]; + } + + public static String ExtracTimeStartFromSplitDateAndTime(String[] split) { + return split[1]; + } + + public static String ExtracTimeEndFromSplitDateAndTime(String[] split) { + return split[2]; + } + public static void formatDateExample() { // https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text diff --git a/src/java/action/Parser.java b/src/java/action/Parser.java index 9d55e432..695300b1 100644 --- a/src/java/action/Parser.java +++ b/src/java/action/Parser.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.time.LocalDate; +import java.time.LocalTime; import java.util.Scanner; public class Parser { @@ -65,7 +66,7 @@ public boolean ReadUserCommand(TaskList myList, String line) { } else if (line.substring(0, 5).equals("event")) { AddTaskEvent(myList, line); } else if (line.substring(0, 6).equals("delete")) { - RemoveTask(myList, line); + DeleteTask(myList, line); } else if (line.substring(0, 8).equals("deadline")) { AddTaskDeadline(myList, line); } else { @@ -116,27 +117,104 @@ private void SaveTask(TaskList myList) { } private void AddTaskEvent(TaskList myList, String line) { + if (line.length() <= 6) { ui.msgInvalidInputMissingDescription(); - } else if (!line.contains("/at")) { - ui.msgInvalidInputMissingDay(); - } else { + return; + } - try { - String taskDetail = line.substring(6, line.indexOf("/")); - String after_at = line.substring(line.indexOf("/") + 4); - String day = after_at.substring(0, after_at.indexOf(" ")); - String time = line.substring(line.indexOf("/") + 8); + if (!line.contains("/at")) { + ui.msgInvalidInputMissingDay(); + return; + } - myList.addItemEvent(taskDetail, after_at); // temporary for Duke Level 4 - ui.msgAssignTaskEvent(myList, myList.getNumOfItem() - 1); - } catch (Exception e) { - ui.msgInvalidInput(); + try { + String taskDetail = line.substring(6, line.indexOf("/")); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String timeStart; + String timeEnd; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.ExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + AddTaskEvent_LocalDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + timeStart = ParseDateTime.ExtracTimeStartFromSplitDateAndTime(split); + AddTaskEvent_LocalDate_LocalTime(myList, taskDetail, date, timeStart); + } else { + timeStart = ParseDateTime.ExtracTimeStartFromSplitDateAndTime(split); + timeEnd = ParseDateTime.ExtracTimeEndFromSplitDateAndTime(split); + AddTaskEvent_LocalDate_LocalTime(myList, taskDetail, date, timeStart, timeEnd); } + + } catch (Exception e) { + ui.msgInvalidInputWrongDateTimeStartEndFormat(); } + } - private void RemoveTask(TaskList myList, String line) { + private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate); + ui.msgAssignTaskEvent_TaskDate(myList, myList.getNumOfItem() - 1); + } + + private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, + String date, String timeStart) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart); + ui.msgAssignTaskEvent_TaskDate_TaskTimeStart(myList, myList.getNumOfItem() - 1); + + } + + private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, + String date, String timeStart, String timeEnd) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null || taskTimeEnd == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + if (taskTimeStart.isAfter(taskTimeEnd)) { + ui.msgInvalidInputTimeStartLaterThanTimeEnd(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); + ui.msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(myList, myList.getNumOfItem() - 1); + } + + private void DeleteTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); ui.msgRemoveItem(myList, taskNumber - 1); @@ -150,28 +228,67 @@ private void AddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { ui.msgInvalidInputMissingDescription(); + return; } if (!line.contains("/by")) { ui.msgInvalidInputMissingDay(); + return; } try { String taskDetail = line.substring(9, line.indexOf("/")); - String dayWithBy = line.substring(line.indexOf("/") + 1, line.length()); - String day = dayWithBy.substring(3); - - LocalDate taskDate = ParseDateTime.toDate(day); - - if (taskDate == null){ - ui.msgInvalidInputWrongDateFormat(); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String time; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.ExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + AddTaskDeadline_LocalDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + time = ParseDateTime.ExtracTimeFromSplitDateAndTime(split); + AddTaskDeadline_LocalDate_LocalTime(myList, taskDetail, date, time); } else { - myList.addItemDeadline(taskDetail, taskDate); - ui.msgAssignTaskDeadline(myList, myList.getNumOfItem() - 1); + ui.msgInvalidInputWrongDateTimeFormat(); } + } catch (Exception e) { - ui.msgInvalidInputWrongDateFormat(); + ui.msgInvalidInputWrongDateTimeFormat(); + } + } + + private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate); + ui.msgAssignTaskDeadline_TaskDate(myList, myList.getNumOfItem() - 1); + } + + private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDetail, + String date, String time) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTime = ParseDateTime.toTime(time); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTime == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; } + + myList.addItemDeadline(taskDetail, taskDate, taskTime); + ui.msgAssignTaskDeadline_TaskDate_TaskTime(myList, myList.getNumOfItem() - 1); } @@ -191,6 +308,8 @@ private String ReadTaskConvertToString(TaskList myList) { } return sb.toString(); } + + } diff --git a/src/java/task/TaskDeadline.java b/src/java/task/TaskDeadline.java index 1ee894f2..70fb5a63 100644 --- a/src/java/task/TaskDeadline.java +++ b/src/java/task/TaskDeadline.java @@ -8,20 +8,6 @@ public class TaskDeadline extends Task { private LocalDate taskDate; private LocalTime taskTime; - private String dateString; // temporary attribute for Duke Level 4 - - public TaskDeadline(String taskDetail) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.DEADLINE; - } - - public TaskDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.DEADLINE; - this.dateString = dateString; - } public TaskDeadline(String taskDetail, LocalDate taskDate) { super(taskDetail); @@ -38,10 +24,6 @@ public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) this.taskTime = localTime; } - public String getDateString() { // temporary constructor for Duke Level 4 - return dateString; - } - public LocalDate getLocalDate(){ return taskDate; } @@ -65,4 +47,8 @@ public String getLocalDate_Year_toString(){ public LocalTime getLocalTime(){ return taskTime; } + + public String getLocalTime_toString(){ + return String.valueOf(taskTime); + } } \ No newline at end of file diff --git a/src/java/task/TaskEvent.java b/src/java/task/TaskEvent.java index 0a0d1237..3f55858b 100644 --- a/src/java/task/TaskEvent.java +++ b/src/java/task/TaskEvent.java @@ -1,37 +1,73 @@ package src.java.task; import java.sql.Time; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.Date; public class TaskEvent extends Task { - private Date date; - private Time startTime; - private Time endTime; - private String dateTime; // temporary attribute for Duke Level 4 - public TaskEvent(String taskDetail) { + private LocalDate taskDate; + private LocalTime taskTimeStart; + private LocalTime taskTimeEnd; + + public TaskEvent(String taskDetail, LocalDate taskDate) { super(taskDetail); this.isDone = false; this.taskType = TaskType.EVENT; + this.taskDate = taskDate; } - public TaskEvent(String taskDetail, Date date, Time startTime, Time endTime) { + public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { super(taskDetail); this.isDone = false; this.taskType = TaskType.EVENT; - this.date = date; - this.startTime = startTime; - this.endTime = endTime; + this.taskDate = taskDate; + this.taskTimeStart = taskTimeStart; } - public TaskEvent(String taskDetail, String dayTime) { // temporary constructor for Duke Level 4 + public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { super(taskDetail); this.isDone = false; this.taskType = TaskType.EVENT; - this.dateTime = dayTime; + this.taskDate = taskDate; + this.taskTimeStart = taskTimeStart; + this.taskTimeEnd = taskTimeEnd; + } + + public LocalDate getLocalDate() { + return taskDate; + } + + public String getLocalDate_toString() { + return String.valueOf(taskDate); + } + + public String getLocalDate_Day_toString() { + return String.valueOf(taskDate.getDayOfMonth()); + } + + public String getLocalDate_Month_toString() { + return String.valueOf(taskDate.getMonth()); + } + + public String getLocalDate_Year_toString() { + return String.valueOf(taskDate.getYear()); + } + + public LocalTime getLocalTimeStart() { + return taskTimeStart; + } + + public LocalTime getLocalTimeEnd() { + return taskTimeEnd; + } + + public String getLocalTimeStart_toString() { + return String.valueOf(taskTimeStart); } - public String getDayTime() { // temporary constructor for Duke Level 4 - return dateTime; + public String getLocalTimeEnd_toString() { + return String.valueOf(taskTimeEnd); } } diff --git a/src/java/task/TaskList.java b/src/java/task/TaskList.java index 170b5f8b..650eecf3 100644 --- a/src/java/task/TaskList.java +++ b/src/java/task/TaskList.java @@ -20,24 +20,24 @@ public void addItemToDos(String taskDetail) { list.add(new TaskToDos(taskDetail)); } - public void addItemDeadline(String taskDetail, String dateString) { // temporary constructor for Duke Level 4 - list.add(new TaskDeadline(taskDetail, dateString)); - } - - public void addItemDeadline(String taskDetail, LocalDate taskDate){ + public void addItemDeadline(String taskDetail, LocalDate taskDate) { list.add(new TaskDeadline(taskDetail, taskDate)); } - public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime){ + public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime) { list.add(new TaskDeadline(taskDetail, taskDate, taskTime)); } - public void addItemEvent(String taskDetail, Date date, Time startTime, Time endTime) { - list.add(new TaskEvent(taskDetail, date, startTime, endTime)); + public void addItemEvent(String taskDetail, LocalDate taskDate) { + list.add(new TaskEvent(taskDetail, taskDate)); } - public void addItemEvent(String taskDetail, String daytime) { // temporary constructor for Duke Level 4 - list.add(new TaskEvent(taskDetail, daytime)); + public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { + list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart)); + } + + public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { + list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd)); } public void removeItem(int index) { @@ -60,19 +60,59 @@ public boolean getTaskDoneStatus(int index) { return task.getDoneStatus(); } - public String getTaskDeadline_DateString(int index) { // temporary method for Duke Level 4 - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getDateString(); + public String getTaskEvent_TaskDate_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDate_toString(); } - public String getTaskDeadLine_TaskDate_InString(int index){ + public String getTaskEvent_TaskDate_Year_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDate_Year_toString(); + } + + public String getTaskEvent_TaskDate_Month_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDate_Month_toString(); + } + + public String getTaskEvent_TaskDate_Day_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDate_Day_toString(); + } + + public String getTaskEvent_TaskTimeStart_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalTimeStart_toString(); + } + + public String getTaskEvent_TaskTimeEnd_InString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalTimeEnd_toString(); + } + + public String getTaskDeadLine_TaskDate_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalDate_toString(); } - public String getTaskEventDateTimeString(int index) { // temporary method for Duke Level 4 - TaskEvent task = (TaskEvent) list.get(index); - return task.getDayTime(); + public String getTaskDeadLine_TaskDate_Year_InString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDate_Year_toString(); + } + + public String getTaskDeadLine_TaskDate_Month_InString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDate_Month_toString(); + } + + public String getTaskDeadLine_TaskDate_Day_InString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDate_Day_toString(); + } + + public String getTaskDeadLine_TaskTime_InString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalTime_toString(); } public int getNumOfItem() { diff --git a/src/java/ui/Message.java b/src/java/ui/Message.java index 7bb3c779..67e401cf 100644 --- a/src/java/ui/Message.java +++ b/src/java/ui/Message.java @@ -35,7 +35,7 @@ public void msgAssignTask(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public void msgAssignTaskDeadline(TaskList myList, int taskNumber) { + public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -54,7 +54,7 @@ public void msgAssignTaskDeadline(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public void msgAssignTaskEvent(TaskList myList, int taskNumber) { + public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -64,11 +64,73 @@ public void msgAssignTaskEvent(TaskList myList, int taskNumber) { String taskDetail = myList.getTaskDetail(taskNumber); - String dateTimeString = myList.getTaskEventDateTimeString(taskNumber); + String dateString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + String timeString = myList.getTaskDeadLine_TaskTime_InString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + "(by: " + dateString + " " + timeString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); + String timeStartString = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" (at: " + dateString + ", from: " + timeStartString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); + String timeStartString = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); + String timeEndString = myList.getTaskEvent_TaskTimeEnd_InString(taskNumber); System.out.println(" Got it. I've added this task: "); - System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " - + dateTimeString + ")"); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" (at: " + dateString + ", from: " + timeStartString + " to " + timeEndString + ")"); System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); System.out.println("_________________________________"); } @@ -121,20 +183,52 @@ public void msgTaskDetail(TaskList myList, int taskNumber) { String taskDetail = myList.getTaskDetail(taskNumber); String dateTimeString = ""; + String year = ""; + String month = ""; + String day = ""; + String time = ""; + String timeStart = ""; + String timeEnd = ""; switch (taskType) { case TODOS: System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); break; case DEADLINE: - dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " - + dateTimeString + ")"); + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskDeadLine_TaskDate_Year_InString(taskNumber); + month = myList.getTaskDeadLine_TaskDate_Month_InString(taskNumber); + day = myList.getTaskDeadLine_TaskDate_Day_InString(taskNumber); + time = myList.getTaskDeadLine_TaskTime_InString(taskNumber); + + if (time.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + ")"); + } else { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + " " + time + ")"); + } break; case EVENT: - dateTimeString = myList.getTaskEventDateTimeString(taskNumber); - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " - + dateTimeString + ")"); + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskEvent_TaskDate_Year_InString(taskNumber); + month = myList.getTaskEvent_TaskDate_Month_InString(taskNumber); + day = myList.getTaskEvent_TaskDate_Day_InString(taskNumber); + timeStart = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); + timeEnd = myList.getTaskEvent_TaskTimeEnd_InString(taskNumber); + + if (timeStart.equals("null") && timeEnd.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(at: " + year + " " + month + " " + day + ")"); + } else if (timeEnd.equals("null")){ + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + ")"); + } else { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); + } break; } } @@ -180,8 +274,20 @@ public void msgWrongTaskNumber() { System.out.println("_________________________________"); } - public void msgInvalidInputWrongDateFormat(){ - System.out.println(" ☹ OOPS!!! Please follow this format: yyyy-mm-dd."); + public void msgInvalidInputWrongDateTimeFormat() { + System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" /by yyyy-mm-dd hh:mm"); + System.out.println("_________________________________"); + } + + public void msgInvalidInputWrongDateTimeStartEndFormat() { + System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); + System.out.println("_________________________________"); + } + + public void msgInvalidInputTimeStartLaterThanTimeEnd() { + System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); System.out.println("_________________________________"); } diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java index 968f9d75..d9006108 100644 --- a/src/java/ui/Ui.java +++ b/src/java/ui/Ui.java @@ -12,8 +12,11 @@ public interface Ui { public void msgGreet(); public void msgAssignTask(TaskList myList, int taskNumber); - public void msgAssignTaskDeadline(TaskList myList, int taskNumber); - public void msgAssignTaskEvent(TaskList myList, int taskNumber); + public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber); + public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNumber); + public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber); + public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskNumber); + public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myList, int taskNumber); public void msgEcho(String s); public void msgSave(); public void msgSLoad(); @@ -26,7 +29,9 @@ public interface Ui { public void msgInvalidInputMissingDescription(); public void msgInvalidInputMissingDay(); public void msgInvalidInputMissingTime(); - public void msgInvalidInputWrongDateFormat(); + public void msgInvalidInputWrongDateTimeFormat(); + public void msgInvalidInputWrongDateTimeStartEndFormat(); + public void msgInvalidInputTimeStartLaterThanTimeEnd(); public void msgRemoveItem(TaskList myList, int taskNumber); public void msgWrongTaskNumber(); public void msgBye() throws IOException; diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 2b4ae176..8bb6393b 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -13,5 +13,11 @@ list deadline do homework deadline list -deadline return book /by 2016-12-21 -event project meeting /at 2-12-2019 1800 +deadline return book /by 2016-12-25 18:00 +deadline return book /by 2016-12-25 +deadline return book +event project meeting /at 2016-12-25 +event project meeting /at 2016-12-25 18:00 +event project meeting /at 2016-12-25 18:00 19:00 +event project meeting /at 2016-12-25 19:00 18:00 +event project meeting /at 2016-12-25 19:00 19:00 From 89bc4f89f2931b8b1b0d3e11ca65a6a48bd23471 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 1 Nov 2021 00:37:18 +0800 Subject: [PATCH 21/39] Duke Level-8-3: Add JavaDoc --- src/FutureImporvement.txt | 2 +- src/java/Duke.java | 7 ++ src/java/action/ParseDateTime.java | 76 +++++++++++++- src/java/action/Parser.java | 130 ++++++++++++++++++++++++ src/java/action/ParserFacade.java | 35 ++++++- src/java/storage/FileAccess.java | 27 +++++ src/java/task/Task.java | 40 +++++++- src/java/task/TaskDeadline.java | 61 +++++++++-- src/java/task/TaskEvent.java | 55 +++++++++- src/java/task/TaskList.java | 158 ++++++++++++++++++++++++++++- src/java/task/TaskToDos.java | 8 ++ src/java/task/TaskType.java | 8 ++ src/java/ui/Message.java | 9 +- src/java/ui/Ui.java | 9 +- src/resources/progress.txt | 4 +- 15 files changed, 601 insertions(+), 28 deletions(-) diff --git a/src/FutureImporvement.txt b/src/FutureImporvement.txt index bb01328c..64c2357b 100644 --- a/src/FutureImporvement.txt +++ b/src/FutureImporvement.txt @@ -1,4 +1,4 @@ Level 8: 1. date time should accept other format. for now cannot. 2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. - +3. save the time and date diff --git a/src/java/Duke.java b/src/java/Duke.java index 17af883a..64e75d00 100644 --- a/src/java/Duke.java +++ b/src/java/Duke.java @@ -2,6 +2,13 @@ import src.java.action.ParserFacade; +/** + * Begin the program here. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class Duke { public static void main(String[] args) { diff --git a/src/java/action/ParseDateTime.java b/src/java/action/ParseDateTime.java index cf0af954..042e3448 100644 --- a/src/java/action/ParseDateTime.java +++ b/src/java/action/ParseDateTime.java @@ -12,10 +12,28 @@ import java.time.temporal.ChronoField; import java.util.Locale; +/** + * Handle date and time related functions + *

+ * Conversion between String and LocalDate/LocalTime + * String manipulation + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class ParseDateTime { private static Ui ui = new Message(); + /** + * Convert date from String to LocalDate + * + * @param date TaskDate of the task + * @return LocalDate + * @throws DateTimeParseException If format of the date is not accepted + */ public static LocalDate toDate(String date) { LocalDate formattedDate; @@ -51,46 +69,96 @@ public static LocalDate toDate(String date) { } } - public static LocalTime toTime(String time){ + /** + * Convert time from String to LocalTime + * + * @param time TaskDate of the task + * @return LocalTime + * @throws DateTimeParseException If format of the date is not accepted + */ + public static LocalTime toTime(String time) { LocalTime localTime = LocalTime.parse(time); return localTime; } + /** + * Split Date and Time by empty space " " + * + * @param dateAndTime String that contains both date and time + * @return String[] + */ public static String[] splitDateAndTime(String dateAndTime) { return dateAndTime.split(" "); } + /** + * Check if the string contains date and time + * + * return 1 if the string contains only string representation of a Date + * return 2 if the string contains string representation of a Date and a Time + * return 3 if the string contains string representation of a Date and 2 Time + * + * @param dateAndTime string representation of date and time + * @return int 1 or 2 or 3 + */ public static int isDateAndTime(String dateAndTime) { String[] split = dateAndTime.split(" "); if (split.length == 1) { return 1; - } else if (split.length == 2){ + } else if (split.length == 2) { return 2; } else { return 3; } } + /** + * Extract string representation of date from string array + * + * @param split string array of date and time + * @return String Date + */ public static String ExtractDateFromSplitDateAndTime(String[] split) { return split[0]; } + /** + * Extract string representation of time from string array + * + * @param split string array of date and time + * @return String Time + */ public static String ExtracTimeFromSplitDateAndTime(String[] split) { return split[1]; } + /** + * Extract string representation of start time from string array + * + * @param split string array of date and time + * @return String TimeStart + */ public static String ExtracTimeStartFromSplitDateAndTime(String[] split) { return split[1]; } + /** + * Extract string representation of end time from string array + * + * @param split string array of date and time + * @return String TimeEnd + */ public static String ExtracTimeEndFromSplitDateAndTime(String[] split) { return split[2]; } + /** + * Example of formatDateExample + * Reference from: + * https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text + */ public static void formatDateExample() { - // https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text - String d2arr[] = { "2016-12-21", "1/17/2016", diff --git a/src/java/action/Parser.java b/src/java/action/Parser.java index 695300b1..6fbaf96b 100644 --- a/src/java/action/Parser.java +++ b/src/java/action/Parser.java @@ -11,6 +11,15 @@ import java.time.LocalTime; import java.util.Scanner; +/** + * Main logic of the Duke Program + * Handles the sequence of program flow + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class Parser { private FileAccess fileAccess; @@ -22,11 +31,30 @@ public Parser(FileAccess fileAccess) { } // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show the opening Greet Message in System.out.println + */ public void ShowGreetMessage() { ui.msgGreet(); } // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Create main sequence of the Duke program + * This section iterate until "bye" is called + *

+ * Current Supported Duke Command List: + * - list + * - done + * - todo + * - save + * - load + * - event + * - delete + * - deadline + */ public void OnCreateDuke() { boolean isDukeRunning = true; String line; @@ -39,6 +67,13 @@ public void OnCreateDuke() { in.close(); } + /** + * Read a single user input and respond accordingly + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + * @return boolean Return false if user type Bye, else return true + */ public boolean ReadUserCommand(TaskList myList, String line) { try { // Guard Condition @@ -82,6 +117,11 @@ public boolean ReadUserCommand(TaskList myList, String line) { // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Show the Bye Message + *

+ * called when Duke program ends + */ public void ShowByeMessage() { try { ui.msgBye(); @@ -92,16 +132,33 @@ public void ShowByeMessage() { // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Show full list of tasks + * + * @param myList TaskList that contains the list of task + */ private void ShowFullList(TaskList myList) { ui.msgList(myList); } + /** + * Mark a task as done + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ private void MarkTaskDone(TaskList myList, String line) { int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); ui.msgMarkDone(myList, taskNumber - 1); } + /** + * Add a task of ToDo type into the list of task + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ private void AddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { ui.msgInvalidInputMissingDescription(); @@ -111,11 +168,25 @@ private void AddTaskToDo(TaskList myList, String line) { } } + /** + * Save the current task list and output a text file + * + * @param myList TaskList that contains the list of task + */ private void SaveTask(TaskList myList) { String listOfTaskString = ReadTaskConvertToString(myList); fileAccess.SaveProgressIntoFile(myList, listOfTaskString); } + /** + * Add a task of Event type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ private void AddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { @@ -155,6 +226,13 @@ private void AddTaskEvent(TaskList myList, String line) { } + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + */ private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String date) { LocalDate taskDate = ParseDateTime.toDate(date); @@ -167,6 +245,14 @@ private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String d ui.msgAssignTaskEvent_TaskDate(myList, myList.getNumOfItem() - 1); } + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + */ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, String date, String timeStart) { @@ -188,6 +274,15 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail } + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + * @param timeEnd String that represents the end time of the event + */ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, String date, String timeStart, String timeEnd) { @@ -214,6 +309,12 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail ui.msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(myList, myList.getNumOfItem() - 1); } + /** + * Delete a task from the user task + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ private void DeleteTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); @@ -224,6 +325,15 @@ private void DeleteTask(TaskList myList, String line) { } } + /** + * Add a task of Deadline type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ private void AddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { @@ -259,6 +369,13 @@ private void AddTaskDeadline(TaskList myList, String line) { } } + /** + * Add a task of Deadline type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + */ private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, String date) { LocalDate taskDate = ParseDateTime.toDate(date); @@ -271,6 +388,14 @@ private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, Strin ui.msgAssignTaskDeadline_TaskDate(myList, myList.getNumOfItem() - 1); } + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + * @param time String that represents the time of the deadline + */ private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDetail, String date, String time) { @@ -294,6 +419,11 @@ private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDet // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Read a list of task and convert it into string + * + * @param myList TaskList that contains the list of task + */ private String ReadTaskConvertToString(TaskList myList) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < myList.getNumOfItem(); i++) { diff --git a/src/java/action/ParserFacade.java b/src/java/action/ParserFacade.java index 8faf06e0..57d43987 100644 --- a/src/java/action/ParserFacade.java +++ b/src/java/action/ParserFacade.java @@ -2,33 +2,60 @@ import src.java.storage.FileAccess; +/** + * Create an instance of Duke Program + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class ParserFacade { private FileAccess fileAccess; private Parser parser; - public ParserFacade(){ + public ParserFacade() { fileAccess = new FileAccess(); parser = new Parser(fileAccess); } + /** + * Initialize the Duke Program. + */ public void StartDuke() { parser.ShowGreetMessage(); } - public void RunDuke(){ + + /** + * Run the Duke Program + */ + public void RunDuke() { parser.OnCreateDuke(); } + /** + * End the Duke Program + */ public void EndDuke() { parser.ShowByeMessage(); } - public FileAccess getFileAccess (){ + /** + * Return a FileAccess object + * + * @return FileAccess + */ + public FileAccess getFileAccess() { return fileAccess; } - public Parser getDukeObject (){ + /** + * Return a Parser object + * + * @return Parser + */ + public Parser getDukeObject() { return parser; } } diff --git a/src/java/storage/FileAccess.java b/src/java/storage/FileAccess.java index b30bb664..480eba8f 100644 --- a/src/java/storage/FileAccess.java +++ b/src/java/storage/FileAccess.java @@ -8,6 +8,14 @@ import java.io.FileWriter; import java.util.Scanner; +/** + * Handles file handling related functions + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class FileAccess { private String filepath; private File progressFile; @@ -19,6 +27,12 @@ public FileAccess() { ui = new Message(); } + /** + * Save progress of the current task + * + * @param myList TaskList that needs to be output + * @param stringToBeWritten String that needs to be outputed + */ public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { try { @@ -31,6 +45,11 @@ public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { } } + /** + * Load existing progress of the task + * + * @return String that represents a list of task details + */ public String LoadProgressFromFile() { StringBuilder sb = new StringBuilder(); @@ -47,10 +66,18 @@ public String LoadProgressFromFile() { return sb.toString(); } + /** + * Delete an existing progress file + *

+ * todo Method to be completed + */ public void DeleteProgressFile() { } + /** + * Example of Save file + */ public void SaveFileExample() { String filepath = "src\\resources\\myText.txt"; try { diff --git a/src/java/task/Task.java b/src/java/task/Task.java index a5b351b9..78b79774 100644 --- a/src/java/task/Task.java +++ b/src/java/task/Task.java @@ -1,6 +1,15 @@ package src.java.task; -import src.java.task.TaskType; +/** + * Abstract class for Task + *

+ * A task object correspond to a single task object. + * The class object can be of the type todo, event, or deadline. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public abstract class Task { protected String taskDetail; @@ -13,28 +22,57 @@ public Task(String taskDetail) { // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Return the task detail + * + * @return String that represents the task detail + */ public String getTaskDetail() { return taskDetail; } + /** + * Return the boolean done status that represents if a task is done + * + * @return boolean that represents the done status of a task + */ public boolean getDoneStatus() { return isDone; } + /** + * Return the TaskType + * + * @return TaskType that represents the type of task + */ public TaskType getTaskType() { return taskType; } // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Modified the task detail + * + * @param modifiedTaskDetail String that represent the new task detail + */ public void setTask(String modifiedTaskDetail) { taskDetail = modifiedTaskDetail; } + /** + * Set the task as completed + * Change the done status to completed + */ public void setTaskCompleted() { isDone = true; } + /** + * Modified the type of the task + * + * @param taskType String that represent the new task type + */ public void setTypeOfTask(TaskType taskType) { this.taskType = taskType; } diff --git a/src/java/task/TaskDeadline.java b/src/java/task/TaskDeadline.java index 70fb5a63..04ce64eb 100644 --- a/src/java/task/TaskDeadline.java +++ b/src/java/task/TaskDeadline.java @@ -1,9 +1,15 @@ package src.java.task; -import java.sql.Time; import java.time.LocalDate; import java.time.LocalTime; -import java.util.Date; + +/** + * Create an instance of deadline class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class TaskDeadline extends Task { private LocalDate taskDate; @@ -24,31 +30,66 @@ public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) this.taskTime = localTime; } - public LocalDate getLocalDate(){ + /** + * Return LocalDate of a task + * + * @return LocalDate that represents the taskDate + */ + public LocalDate getLocalDate() { return taskDate; } - public String getLocalDate_toString(){ + /** + * Return LocalDate of a task in String + * + * @return String that represents the taskDate + */ + public String getLocalDate_toString() { return String.valueOf(taskDate); } - public String getLocalDate_Day_toString(){ + /** + * Return day from LocalDate of a task in String + * + * @return String that represents the day of taskDate + */ + public String getLocalDate_Day_toString() { return String.valueOf(taskDate.getDayOfMonth()); } - public String getLocalDate_Month_toString(){ + /** + * Return month from LocalDate of a task in String + * + * @return String that represents the month of taskDate + */ + public String getLocalDate_Month_toString() { return String.valueOf(taskDate.getMonth()); } - public String getLocalDate_Year_toString(){ + /** + * Return year from LocalDate of a task in String + * + * @return String that represents the year of taskDate + */ + public String getLocalDate_Year_toString() { return String.valueOf(taskDate.getYear()); } - public LocalTime getLocalTime(){ - return taskTime; + /** + * Return LocalTime of a task + * + * @return LocalTime that represents the taskTime + */ + public LocalTime getLocalTime() { + return taskTime; } - public String getLocalTime_toString(){ + /** + * Return LocalTime of a task in String + * + * @return String that represents the taskTime + */ + public String getLocalTime_toString() { return String.valueOf(taskTime); } } \ No newline at end of file diff --git a/src/java/task/TaskEvent.java b/src/java/task/TaskEvent.java index 3f55858b..f0a4f6ff 100644 --- a/src/java/task/TaskEvent.java +++ b/src/java/task/TaskEvent.java @@ -1,9 +1,15 @@ package src.java.task; -import java.sql.Time; import java.time.LocalDate; import java.time.LocalTime; -import java.util.Date; + +/** + * Create an instance of event class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class TaskEvent extends Task { @@ -35,38 +41,83 @@ public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, this.taskTimeEnd = taskTimeEnd; } + /** + * Return LocalDate of a task + * + * @return LocalDate that represents the taskDate + */ public LocalDate getLocalDate() { return taskDate; } + /** + * Return LocalDate of a task in String + * + * @return String that represents the taskDate + */ public String getLocalDate_toString() { return String.valueOf(taskDate); } + /** + * Return day from LocalDate of a task in String + * + * @return String that represents the day of taskDate + */ public String getLocalDate_Day_toString() { return String.valueOf(taskDate.getDayOfMonth()); } + /** + * Return month from LocalDate of a task in String + * + * @return String that represents the month of taskDate + */ public String getLocalDate_Month_toString() { return String.valueOf(taskDate.getMonth()); } + /** + * Return year from LocalDate of a task in String + * + * @return String that represents the year of taskDate + */ public String getLocalDate_Year_toString() { return String.valueOf(taskDate.getYear()); } + /** + * Return start time of LocalTime of a task + * + * @return LocalTime that represents the start time of taskTime + */ public LocalTime getLocalTimeStart() { return taskTimeStart; } + /** + * Return end time of LocalTime of a task + * + * @return LocalTime that represents the end time of taskTime + */ public LocalTime getLocalTimeEnd() { return taskTimeEnd; } + /** + * Return start time of LocalTime of a task in String + * + * @return String that represents the start time of taskTime + */ public String getLocalTimeStart_toString() { return String.valueOf(taskTimeStart); } + /** + * Return end time of LocalTime of a task in String + * + * @return String that represents the start time of taskTime + */ public String getLocalTimeEnd_toString() { return String.valueOf(taskTimeEnd); } diff --git a/src/java/task/TaskList.java b/src/java/task/TaskList.java index 650eecf3..fd542dca 100644 --- a/src/java/task/TaskList.java +++ b/src/java/task/TaskList.java @@ -4,8 +4,17 @@ import java.time.LocalTime; import java.util.ArrayList; import java.util.*; -import java.sql.Time; -import java.util.Date; + +/** + * Create an instance of list of task + *

+ * Create task object + * Manipulate task object creation, modification and deletion + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class TaskList { private List list; @@ -16,109 +25,248 @@ public TaskList() { list = new ArrayList(); } + /** + * Add a task of type ToDo + * + * @param taskDetail String that represents the task detail + */ public void addItemToDos(String taskDetail) { list.add(new TaskToDos(taskDetail)); } + /** + * Add a task of type Deadline + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + */ public void addItemDeadline(String taskDetail, LocalDate taskDate) { list.add(new TaskDeadline(taskDetail, taskDate)); } + /** + * Add a task of type Deadline + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTime LocalTime that represents the task time + */ public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime) { list.add(new TaskDeadline(taskDetail, taskDate, taskTime)); } + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + */ public void addItemEvent(String taskDetail, LocalDate taskDate) { list.add(new TaskEvent(taskDetail, taskDate)); } + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTimeStart LocalTime that represents the task start time + */ public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart)); } + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTimeStart LocalTime that represents the task start time + * @param taskTimeEnd LocalTime that represents the task end time + */ public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd)); } + /** + * Delete a task from tasklist + * + * @param index Int that represents the index in a task list + */ public void removeItem(int index) { list.remove(index); } // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Return a task from tasklist + * + * @param index Int that represents the index in a task list + * @return Task at the index + */ public Task getTask(int index) { return list.get(index); } + /** + * Return a task detail from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task detail + */ public String getTaskDetail(int index) { Task task = list.get(index); return task.getTaskDetail(); } + /** + * Return a boolean done status from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return boolean that represents the task done status + */ public boolean getTaskDoneStatus(int index) { Task task = list.get(index); return task.getDoneStatus(); } + /** + * Return a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task date + */ public String getTaskEvent_TaskDate_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalDate_toString(); } + /** + * Return year from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the year from taskDate + */ public String getTaskEvent_TaskDate_Year_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalDate_Year_toString(); } + /** + * Return month from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the month from taskDate + */ public String getTaskEvent_TaskDate_Month_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalDate_Month_toString(); } + /** + * Return day from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the day from taskDate + */ public String getTaskEvent_TaskDate_Day_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalDate_Day_toString(); } + /** + * Return start time in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the start time from TaskTime + */ public String getTaskEvent_TaskTimeStart_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalTimeStart_toString(); } + /** + * Return end time in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the end time from TaskTime + */ public String getTaskEvent_TaskTimeEnd_InString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalTimeEnd_toString(); } + /** + * Return a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task date + */ public String getTaskDeadLine_TaskDate_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalDate_toString(); } + /** + * Return year from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the year from TaskDate + */ public String getTaskDeadLine_TaskDate_Year_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalDate_Year_toString(); } + /** + * Return month from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the month from TaskDate + */ public String getTaskDeadLine_TaskDate_Month_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalDate_Month_toString(); } + /** + * Return day from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the day from TaskDate + */ public String getTaskDeadLine_TaskDate_Day_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalDate_Day_toString(); } + /** + * Return TaskTime in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the TaskTime + */ public String getTaskDeadLine_TaskTime_InString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalTime_toString(); } + /** + * Return the number of item in a tasklist + * + * @return Int that represents the number of item in a tasklist + */ public int getNumOfItem() { return list.size(); } + /** + * Return TaskType from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return TaskType that represents the type of task + */ public TaskType getTaskType(int index) { Task task = list.get(index); return task.getTaskType(); @@ -126,6 +274,12 @@ public TaskType getTaskType(int index) { // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Return TaskType from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return TaskType that represents the type of task + */ public void setTaskDone(int index) { Task task = list.get(index); task.setTaskCompleted(); diff --git a/src/java/task/TaskToDos.java b/src/java/task/TaskToDos.java index a6f3047d..f96abbee 100644 --- a/src/java/task/TaskToDos.java +++ b/src/java/task/TaskToDos.java @@ -1,5 +1,13 @@ package src.java.task; +/** + * Create an instance of todo class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class TaskToDos extends Task { public TaskToDos(String taskDetail) { diff --git a/src/java/task/TaskType.java b/src/java/task/TaskType.java index 977d774d..c4180ea6 100644 --- a/src/java/task/TaskType.java +++ b/src/java/task/TaskType.java @@ -1,5 +1,13 @@ package src.java.task; +/** + * Create + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public enum TaskType { TODOS, DEADLINE, EVENT; diff --git a/src/java/ui/Message.java b/src/java/ui/Message.java index 67e401cf..f7f827b4 100644 --- a/src/java/ui/Message.java +++ b/src/java/ui/Message.java @@ -2,9 +2,16 @@ import src.java.task.TaskList; import src.java.task.TaskType; - import java.io.*; +/** + * Handle all the message methods + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class Message implements Ui { // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java index d9006108..ab730a7f 100644 --- a/src/java/ui/Ui.java +++ b/src/java/ui/Ui.java @@ -1,9 +1,16 @@ package src.java.ui; import src.java.task.TaskList; - import java.io.IOException; +/** + * Interface class for User Interface + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public interface Ui { Message message = new Message(); diff --git a/src/resources/progress.txt b/src/resources/progress.txt index 2c2af338..da8f3083 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,3 +1,3 @@ -T|0|borrow book| -D|0|return book | +E|0|project meeting | +E|0|project meeting | E|0|project meeting | From 74ad558005568d0fc705c2fdd388f9fcd9d43dfb Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 1 Nov 2021 12:56:36 +0800 Subject: [PATCH 22/39] Duke Level-8-5: More JavaDoc; Add gradle; Run Checkstyle using Gradle --- build.gradle | 33 ++- config/checkstyle/checkstyle.xml | 398 +++++++++++++++++++++++++++++ config/checkstyle/suppressions.xml | 10 + src/java/Duke.java | 13 +- src/java/action/ParseDateTime.java | 56 +--- src/java/action/Parser.java | 110 ++++---- src/java/action/ParserFacade.java | 19 +- src/java/storage/FileAccess.java | 20 +- src/java/task/Task.java | 2 +- src/java/task/TaskDeadline.java | 19 +- src/java/task/TaskEvent.java | 20 +- src/java/task/TaskList.java | 41 ++- src/java/task/TaskToDos.java | 5 +- src/java/task/TaskType.java | 31 ++- src/java/ui/Message.java | 238 ++++++++++++----- src/java/ui/Ui.java | 57 ++--- 16 files changed, 789 insertions(+), 283 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml create mode 100644 config/checkstyle/suppressions.xml diff --git a/build.gradle b/build.gradle index 20c0521c..a17db885 100644 --- a/build.gradle +++ b/build.gradle @@ -5,10 +5,21 @@ plugins { id 'com.github.johnrengelman.shadow' version '5.1.0' } +group 'com.kangteng.duke' +version '1.0' + repositories { mavenCentral() } +sourceSets { + main { + java { + srcDirs = ['src'] + } + } +} + 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' @@ -16,20 +27,6 @@ dependencies { test { useJUnitPlatform() - - testLogging { - events "passed", "skipped", "failed" - - showExceptions true - exceptionFormat "full" - showCauses true - showStackTraces true - showStandardStreams = false - } -} - -application { - mainClassName = "seedu.duke.Duke" } shadowJar { @@ -37,10 +34,12 @@ shadowJar { archiveClassifier = null } +run{ + standardInput = System.in +} + checkstyle { toolVersion = '8.29' } -run{ - standardInput = System.in -} +mainClassName = 'src.java.Duke' diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..502fbd3a --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 00000000..dcaa1af3 --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/src/java/Duke.java b/src/java/Duke.java index 64e75d00..611f4ecc 100644 --- a/src/java/Duke.java +++ b/src/java/Duke.java @@ -1,6 +1,6 @@ -package src.java; +package java; -import src.java.action.ParserFacade; +import java.action.ParserFacade; /** * Begin the program here. @@ -11,12 +11,15 @@ */ public class Duke { + /** + * Starting point of the program + */ public static void main(String[] args) { ParserFacade parserFacade = new ParserFacade(); - parserFacade.StartDuke(); - parserFacade.RunDuke(); - parserFacade.EndDuke(); + parserFacade.startDuke(); + parserFacade.runDuke(); + parserFacade.endDuke(); } } diff --git a/src/java/action/ParseDateTime.java b/src/java/action/ParseDateTime.java index 042e3448..1c2ec74e 100644 --- a/src/java/action/ParseDateTime.java +++ b/src/java/action/ParseDateTime.java @@ -1,15 +1,12 @@ -package src.java.action; - -import src.java.ui.Message; -import src.java.ui.Ui; +package java.action; import java.time.LocalDate; import java.time.LocalTime; -import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoField; +import java.ui.Message; +import java.ui.Ui; import java.util.Locale; /** @@ -118,7 +115,7 @@ public static int isDateAndTime(String dateAndTime) { * @param split string array of date and time * @return String Date */ - public static String ExtractDateFromSplitDateAndTime(String[] split) { + public static String toExtractDateFromSplitDateAndTime(String[] split) { return split[0]; } @@ -128,7 +125,7 @@ public static String ExtractDateFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String Time */ - public static String ExtracTimeFromSplitDateAndTime(String[] split) { + public static String toExtracTimeFromSplitDateAndTime(String[] split) { return split[1]; } @@ -138,7 +135,7 @@ public static String ExtracTimeFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String TimeStart */ - public static String ExtracTimeStartFromSplitDateAndTime(String[] split) { + public static String toExtracTimeStartFromSplitDateAndTime(String[] split) { return split[1]; } @@ -148,46 +145,7 @@ public static String ExtracTimeStartFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String TimeEnd */ - public static String ExtracTimeEndFromSplitDateAndTime(String[] split) { + public static String toExtracTimeEndFromSplitDateAndTime(String[] split) { return split[2]; } - - /** - * Example of formatDateExample - * Reference from: - * https://coderanch.com/t/677142/java/DateTimeParseException-Text-parsed-unparsed-text - */ - public static void formatDateExample() { - - String d2arr[] = { - "2016-12-21", - "1/17/2016", - "1/3/2016", - "11/23/2016", - "OCT 20 2016", - "Oct 22 2016", - "Oct 23", // default year is 2016 - "OCT 24", // default year is 2016 - }; - - DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() - .parseCaseInsensitive().parseLenient() - .parseDefaulting(ChronoField.YEAR_OF_ERA, 2016L) - .appendPattern("[yyyy-MM-dd]") - .appendPattern("[M/dd/yyyy]") - .appendPattern("[M/d/yyyy]") - .appendPattern("[MM/dd/yyyy]") - .appendPattern("[MMM dd yyyy]"); - - DateTimeFormatter formatter2 = builder.toFormatter(Locale.ENGLISH); - for (String d2 : d2arr) { - try { - LocalDate date = LocalDate.parse(d2, formatter2); - System.out.printf("%s%n", date); - } catch (DateTimeParseException e) { - System.out.printf("%s is not parsable! %n", d2); - throw e; - } - } - } } diff --git a/src/java/action/Parser.java b/src/java/action/Parser.java index 6fbaf96b..25c1240b 100644 --- a/src/java/action/Parser.java +++ b/src/java/action/Parser.java @@ -1,14 +1,13 @@ -package src.java.action; - -import src.java.ui.Message; -import src.java.storage.FileAccess; -import src.java.task.TaskList; -import src.java.task.TaskType; -import src.java.ui.Ui; +package java.action; import java.io.IOException; +import java.storage.FileAccess; +import java.task.TaskList; +import java.task.TaskType; import java.time.LocalDate; import java.time.LocalTime; +import java.ui.Message; +import java.ui.Ui; import java.util.Scanner; /** @@ -25,6 +24,9 @@ public class Parser { private FileAccess fileAccess; private Ui ui; + /** + * Constructor + */ public Parser(FileAccess fileAccess) { this.fileAccess = fileAccess; ui = new Message(); @@ -35,7 +37,7 @@ public Parser(FileAccess fileAccess) { /** * Show the opening Greet Message in System.out.println */ - public void ShowGreetMessage() { + public void showGreetMessage() { ui.msgGreet(); } @@ -55,14 +57,14 @@ public void ShowGreetMessage() { * - delete * - deadline */ - public void OnCreateDuke() { + public void onCreateDuke() { boolean isDukeRunning = true; String line; Scanner in = new Scanner(System.in); TaskList myList = new TaskList(); while (isDukeRunning) { line = in.nextLine(); - isDukeRunning = ReadUserCommand(myList, line); + isDukeRunning = toReadUserCommand(myList, line); } in.close(); } @@ -74,7 +76,7 @@ public void OnCreateDuke() { * @param line String that the user type * @return boolean Return false if user type Bye, else return true */ - public boolean ReadUserCommand(TaskList myList, String line) { + public boolean toReadUserCommand(TaskList myList, String line) { try { // Guard Condition if (line.equals("bye")) { @@ -84,26 +86,26 @@ public boolean ReadUserCommand(TaskList myList, String line) { // for testing new function if (line.equals("tf")) { System.out.println("XXXXX Test Function XXXXX"); - fileAccess.DeleteProgressFile(); + fileAccess.deleteProgressFile(); System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); } if (line.equals("list")) { - ShowFullList(myList); + showFullList(myList); } else if (line.substring(0, 4).equals("done")) { - MarkTaskDone(myList, line); + toMarkTaskDone(myList, line); } else if (line.substring(0, 4).equals("todo")) { - AddTaskToDo(myList, line); + toAddTaskToDo(myList, line); } else if (line.substring(0, 4).equals("save")) { - SaveTask(myList); + toSaveTask(myList); } else if (line.substring(0, 4).equals("load")) { // loadTask(myList); } else if (line.substring(0, 5).equals("event")) { - AddTaskEvent(myList, line); + toAddTaskEvent(myList, line); } else if (line.substring(0, 6).equals("delete")) { - DeleteTask(myList, line); + toDeleteTask(myList, line); } else if (line.substring(0, 8).equals("deadline")) { - AddTaskDeadline(myList, line); + toAddTaskDeadline(myList, line); } else { ui.msgInvalidInput(); } @@ -122,7 +124,7 @@ public boolean ReadUserCommand(TaskList myList, String line) { *

* called when Duke program ends */ - public void ShowByeMessage() { + public void showByeMessage() { try { ui.msgBye(); } catch (IOException error) { @@ -137,7 +139,7 @@ public void ShowByeMessage() { * * @param myList TaskList that contains the list of task */ - private void ShowFullList(TaskList myList) { + private void showFullList(TaskList myList) { ui.msgList(myList); } @@ -147,7 +149,7 @@ private void ShowFullList(TaskList myList) { * @param myList TaskList that contains the list of task * @param line String that the user type */ - private void MarkTaskDone(TaskList myList, String line) { + private void toMarkTaskDone(TaskList myList, String line) { int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); ui.msgMarkDone(myList, taskNumber - 1); @@ -159,7 +161,7 @@ private void MarkTaskDone(TaskList myList, String line) { * @param myList TaskList that contains the list of task * @param line String that the user type */ - private void AddTaskToDo(TaskList myList, String line) { + private void toAddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { ui.msgInvalidInputMissingDescription(); } else { @@ -173,9 +175,9 @@ private void AddTaskToDo(TaskList myList, String line) { * * @param myList TaskList that contains the list of task */ - private void SaveTask(TaskList myList) { - String listOfTaskString = ReadTaskConvertToString(myList); - fileAccess.SaveProgressIntoFile(myList, listOfTaskString); + private void toSaveTask(TaskList myList) { + String listOfTaskString = toReadTaskConvertToString(myList); + fileAccess.saveProgressIntoFile(myList, listOfTaskString); } /** @@ -187,7 +189,7 @@ private void SaveTask(TaskList myList) { * @param myList TaskList that contains the list of task * @param line String that the user type */ - private void AddTaskEvent(TaskList myList, String line) { + private void toAddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { ui.msgInvalidInputMissingDescription(); @@ -207,17 +209,17 @@ private void AddTaskEvent(TaskList myList, String line) { String timeEnd; String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.ExtractDateFromSplitDateAndTime(split); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - AddTaskEvent_LocalDate(myList, taskDetail, date); + toAddTaskEvent_localDate(myList, taskDetail, date); } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - timeStart = ParseDateTime.ExtracTimeStartFromSplitDateAndTime(split); - AddTaskEvent_LocalDate_LocalTime(myList, taskDetail, date, timeStart); + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); } else { - timeStart = ParseDateTime.ExtracTimeStartFromSplitDateAndTime(split); - timeEnd = ParseDateTime.ExtracTimeEndFromSplitDateAndTime(split); - AddTaskEvent_LocalDate_LocalTime(myList, taskDetail, date, timeStart, timeEnd); + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); } } catch (Exception e) { @@ -233,7 +235,7 @@ private void AddTaskEvent(TaskList myList, String line) { * @param taskDetail String that represents the task detail * @param date String that represents the date of the event */ - private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String date) { + private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { @@ -242,7 +244,7 @@ private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String d } myList.addItemEvent(taskDetail, taskDate); - ui.msgAssignTaskEvent_TaskDate(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); } /** @@ -253,8 +255,8 @@ private void AddTaskEvent_LocalDate(TaskList myList, String taskDetail, String d * @param date String that represents the date of the event * @param timeStart String that represents the start time of the event */ - private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, - String date, String timeStart) { + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); @@ -270,7 +272,7 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail } myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - ui.msgAssignTaskEvent_TaskDate_TaskTimeStart(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); } @@ -283,8 +285,8 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail * @param timeStart String that represents the start time of the event * @param timeEnd String that represents the end time of the event */ - private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail, - String date, String timeStart, String timeEnd) { + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart, String timeEnd) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); @@ -306,7 +308,7 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail } myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - ui.msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); } /** @@ -315,7 +317,7 @@ private void AddTaskEvent_LocalDate_LocalTime(TaskList myList, String taskDetail * @param myList TaskList that contains the list of task * @param line String that represents the user input */ - private void DeleteTask(TaskList myList, String line) { + private void toDeleteTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); ui.msgRemoveItem(myList, taskNumber - 1); @@ -334,7 +336,7 @@ private void DeleteTask(TaskList myList, String line) { * @param myList TaskList that contains the list of task * @param line String that represents the user input */ - private void AddTaskDeadline(TaskList myList, String line) { + private void toAddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { ui.msgInvalidInputMissingDescription(); @@ -353,13 +355,13 @@ private void AddTaskDeadline(TaskList myList, String line) { String time; String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.ExtractDateFromSplitDateAndTime(split); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - AddTaskDeadline_LocalDate(myList, taskDetail, date); + toAddTaskDeadline_localDate(myList, taskDetail, date); } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - time = ParseDateTime.ExtracTimeFromSplitDateAndTime(split); - AddTaskDeadline_LocalDate_LocalTime(myList, taskDetail, date, time); + time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); + toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); } else { ui.msgInvalidInputWrongDateTimeFormat(); } @@ -376,7 +378,7 @@ private void AddTaskDeadline(TaskList myList, String line) { * @param taskDetail String that represents the task detail * @param date String that represents the date of the deadline */ - private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, String date) { + private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { @@ -385,7 +387,7 @@ private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, Strin } myList.addItemDeadline(taskDetail, taskDate); - ui.msgAssignTaskDeadline_TaskDate(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); } /** @@ -396,8 +398,8 @@ private void AddTaskDeadline_LocalDate(TaskList myList, String taskDetail, Strin * @param date String that represents the date of the deadline * @param time String that represents the time of the deadline */ - private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDetail, - String date, String time) { + private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, + String date, String time) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTime = ParseDateTime.toTime(time); @@ -413,7 +415,7 @@ private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDet } myList.addItemDeadline(taskDetail, taskDate, taskTime); - ui.msgAssignTaskDeadline_TaskDate_TaskTime(myList, myList.getNumOfItem() - 1); + ui.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); } @@ -424,7 +426,7 @@ private void AddTaskDeadline_LocalDate_LocalTime(TaskList myList, String taskDet * * @param myList TaskList that contains the list of task */ - private String ReadTaskConvertToString(TaskList myList) { + private String toReadTaskConvertToString(TaskList myList) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < myList.getNumOfItem(); i++) { String taskDetail = myList.getTaskDetail(i); diff --git a/src/java/action/ParserFacade.java b/src/java/action/ParserFacade.java index 57d43987..e94154b9 100644 --- a/src/java/action/ParserFacade.java +++ b/src/java/action/ParserFacade.java @@ -1,6 +1,6 @@ -package src.java.action; +package java.action; -import src.java.storage.FileAccess; +import java.storage.FileAccess; /** * Create an instance of Duke Program @@ -14,6 +14,9 @@ public class ParserFacade { private FileAccess fileAccess; private Parser parser; + /** + * Constructor + */ public ParserFacade() { fileAccess = new FileAccess(); parser = new Parser(fileAccess); @@ -22,23 +25,23 @@ public ParserFacade() { /** * Initialize the Duke Program. */ - public void StartDuke() { - parser.ShowGreetMessage(); + public void startDuke() { + parser.showGreetMessage(); } /** * Run the Duke Program */ - public void RunDuke() { - parser.OnCreateDuke(); + public void runDuke() { + parser.onCreateDuke(); } /** * End the Duke Program */ - public void EndDuke() { - parser.ShowByeMessage(); + public void endDuke() { + parser.showByeMessage(); } /** diff --git a/src/java/storage/FileAccess.java b/src/java/storage/FileAccess.java index 480eba8f..96dfb7f5 100644 --- a/src/java/storage/FileAccess.java +++ b/src/java/storage/FileAccess.java @@ -1,11 +1,10 @@ -package src.java.storage; - -import src.java.ui.Message; -import src.java.task.TaskList; -import src.java.ui.Ui; +package java.storage; import java.io.File; import java.io.FileWriter; +import java.task.TaskList; +import java.ui.Message; +import java.ui.Ui; import java.util.Scanner; /** @@ -21,6 +20,9 @@ public class FileAccess { private File progressFile; private Ui ui; + /** + * Constructor + */ public FileAccess() { filepath = "src\\resources\\progress.txt"; progressFile = new File(filepath); @@ -33,7 +35,7 @@ public FileAccess() { * @param myList TaskList that needs to be output * @param stringToBeWritten String that needs to be outputed */ - public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { + public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { try { FileWriter fw = new FileWriter(filepath); @@ -50,7 +52,7 @@ public void SaveProgressIntoFile(TaskList myList, String stringToBeWritten) { * * @return String that represents a list of task details */ - public String LoadProgressFromFile() { + public String loadProgressFromFile() { StringBuilder sb = new StringBuilder(); try { @@ -71,14 +73,14 @@ public String LoadProgressFromFile() { *

* todo Method to be completed */ - public void DeleteProgressFile() { + public void deleteProgressFile() { } /** * Example of Save file */ - public void SaveFileExample() { + public void saveFileExample() { String filepath = "src\\resources\\myText.txt"; try { FileWriter fw = new FileWriter(filepath); diff --git a/src/java/task/Task.java b/src/java/task/Task.java index 78b79774..d3944381 100644 --- a/src/java/task/Task.java +++ b/src/java/task/Task.java @@ -1,4 +1,4 @@ -package src.java.task; +package java.task; /** * Abstract class for Task diff --git a/src/java/task/TaskDeadline.java b/src/java/task/TaskDeadline.java index 04ce64eb..1cbefffd 100644 --- a/src/java/task/TaskDeadline.java +++ b/src/java/task/TaskDeadline.java @@ -1,4 +1,4 @@ -package src.java.task; +package java.task; import java.time.LocalDate; import java.time.LocalTime; @@ -10,11 +10,13 @@ * @version 8.0 * @since 2021-09-01 */ - public class TaskDeadline extends Task { private LocalDate taskDate; private LocalTime taskTime; + /** + * Constructor + */ public TaskDeadline(String taskDetail, LocalDate taskDate) { super(taskDetail); this.isDone = false; @@ -22,6 +24,9 @@ public TaskDeadline(String taskDetail, LocalDate taskDate) { this.taskDate = taskDate; } + /** + * Constructor + */ public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) { super(taskDetail); this.isDone = false; @@ -44,7 +49,7 @@ public LocalDate getLocalDate() { * * @return String that represents the taskDate */ - public String getLocalDate_toString() { + public String getLocalDateToString() { return String.valueOf(taskDate); } @@ -53,7 +58,7 @@ public String getLocalDate_toString() { * * @return String that represents the day of taskDate */ - public String getLocalDate_Day_toString() { + public String getLocalDateDayToString() { return String.valueOf(taskDate.getDayOfMonth()); } @@ -62,7 +67,7 @@ public String getLocalDate_Day_toString() { * * @return String that represents the month of taskDate */ - public String getLocalDate_Month_toString() { + public String getLocalDateMonthToString() { return String.valueOf(taskDate.getMonth()); } @@ -71,7 +76,7 @@ public String getLocalDate_Month_toString() { * * @return String that represents the year of taskDate */ - public String getLocalDate_Year_toString() { + public String getLocalDateYearToString() { return String.valueOf(taskDate.getYear()); } @@ -92,4 +97,4 @@ public LocalTime getLocalTime() { public String getLocalTime_toString() { return String.valueOf(taskTime); } -} \ No newline at end of file +} diff --git a/src/java/task/TaskEvent.java b/src/java/task/TaskEvent.java index f0a4f6ff..f5c1a1dd 100644 --- a/src/java/task/TaskEvent.java +++ b/src/java/task/TaskEvent.java @@ -1,4 +1,4 @@ -package src.java.task; +package java.task; import java.time.LocalDate; import java.time.LocalTime; @@ -17,6 +17,9 @@ public class TaskEvent extends Task { private LocalTime taskTimeStart; private LocalTime taskTimeEnd; + /** + * Constructor + */ public TaskEvent(String taskDetail, LocalDate taskDate) { super(taskDetail); this.isDone = false; @@ -24,6 +27,9 @@ public TaskEvent(String taskDetail, LocalDate taskDate) { this.taskDate = taskDate; } + /** + * Constructor + */ public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { super(taskDetail); this.isDone = false; @@ -32,6 +38,9 @@ public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) this.taskTimeStart = taskTimeStart; } + /** + * Constructor + */ public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { super(taskDetail); this.isDone = false; @@ -64,7 +73,7 @@ public String getLocalDate_toString() { * * @return String that represents the day of taskDate */ - public String getLocalDate_Day_toString() { + public String getLocalDateDayToString() { return String.valueOf(taskDate.getDayOfMonth()); } @@ -73,7 +82,7 @@ public String getLocalDate_Day_toString() { * * @return String that represents the month of taskDate */ - public String getLocalDate_Month_toString() { + public String getLocalDateMonthToString() { return String.valueOf(taskDate.getMonth()); } @@ -82,7 +91,7 @@ public String getLocalDate_Month_toString() { * * @return String that represents the year of taskDate */ - public String getLocalDate_Year_toString() { + public String getLocalDateYearToString() { return String.valueOf(taskDate.getYear()); } @@ -122,3 +131,6 @@ public String getLocalTimeEnd_toString() { return String.valueOf(taskTimeEnd); } } + + + diff --git a/src/java/task/TaskList.java b/src/java/task/TaskList.java index fd542dca..fdcea5bc 100644 --- a/src/java/task/TaskList.java +++ b/src/java/task/TaskList.java @@ -1,9 +1,9 @@ -package src.java.task; +package java.task; import java.time.LocalDate; import java.time.LocalTime; import java.util.ArrayList; -import java.util.*; +import java.util.List; /** * Create an instance of list of task @@ -137,7 +137,7 @@ public boolean getTaskDoneStatus(int index) { * @param index Int that represents the index in a task list * @return String that represents the task date */ - public String getTaskEvent_TaskDate_InString(int index) { + public String getTaskEventTaskDateInString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalDate_toString(); } @@ -148,9 +148,9 @@ public String getTaskEvent_TaskDate_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the year from taskDate */ - public String getTaskEvent_TaskDate_Year_InString(int index) { + public String getTaskEventTaskDateYearInString(int index) { TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDate_Year_toString(); + return task.getLocalDateYearToString(); } /** @@ -159,9 +159,9 @@ public String getTaskEvent_TaskDate_Year_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the month from taskDate */ - public String getTaskEvent_TaskDate_Month_InString(int index) { + public String getTaskEventTaskDateMonthInString(int index) { TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDate_Month_toString(); + return task.getLocalDateMonthToString(); } /** @@ -170,9 +170,9 @@ public String getTaskEvent_TaskDate_Month_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the day from taskDate */ - public String getTaskEvent_TaskDate_Day_InString(int index) { + public String getTaskEventTaskDateDayInString(int index) { TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDate_Day_toString(); + return task.getLocalDateDayToString(); } /** @@ -181,7 +181,7 @@ public String getTaskEvent_TaskDate_Day_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the start time from TaskTime */ - public String getTaskEvent_TaskTimeStart_InString(int index) { + public String getTaskEventTaskTimeStartInString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalTimeStart_toString(); } @@ -192,7 +192,7 @@ public String getTaskEvent_TaskTimeStart_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the end time from TaskTime */ - public String getTaskEvent_TaskTimeEnd_InString(int index) { + public String getTaskEventTaskTimeEndInString(int index) { TaskEvent task = (TaskEvent) list.get(index); return task.getLocalTimeEnd_toString(); } @@ -203,9 +203,9 @@ public String getTaskEvent_TaskTimeEnd_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the task date */ - public String getTaskDeadLine_TaskDate_InString(int index) { + public String getTaskDeadLineTaskDateInString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDate_toString(); + return task.getLocalDateToString(); } /** @@ -214,9 +214,9 @@ public String getTaskDeadLine_TaskDate_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the year from TaskDate */ - public String getTaskDeadLine_TaskDate_Year_InString(int index) { + public String getTaskDeadLineTaskDateYearInString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDate_Year_toString(); + return task.getLocalDateYearToString(); } /** @@ -225,9 +225,9 @@ public String getTaskDeadLine_TaskDate_Year_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the month from TaskDate */ - public String getTaskDeadLine_TaskDate_Month_InString(int index) { + public String getTaskDeadLineTaskDateMonthInString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDate_Month_toString(); + return task.getLocalDateMonthToString(); } /** @@ -236,9 +236,9 @@ public String getTaskDeadLine_TaskDate_Month_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the day from TaskDate */ - public String getTaskDeadLine_TaskDate_Day_InString(int index) { + public String getTaskDeadLineTaskDateDayInString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDate_Day_toString(); + return task.getLocalDateDayToString(); } /** @@ -247,7 +247,7 @@ public String getTaskDeadLine_TaskDate_Day_InString(int index) { * @param index Int that represents the index in a task list * @return String that represents the TaskTime */ - public String getTaskDeadLine_TaskTime_InString(int index) { + public String getTaskDeadLineTaskTimeInString(int index) { TaskDeadline task = (TaskDeadline) list.get(index); return task.getLocalTime_toString(); } @@ -278,7 +278,6 @@ public TaskType getTaskType(int index) { * Return TaskType from a task of tasklist * * @param index Int that represents the index in a task list - * @return TaskType that represents the type of task */ public void setTaskDone(int index) { Task task = list.get(index); diff --git a/src/java/task/TaskToDos.java b/src/java/task/TaskToDos.java index f96abbee..9a350d21 100644 --- a/src/java/task/TaskToDos.java +++ b/src/java/task/TaskToDos.java @@ -1,4 +1,4 @@ -package src.java.task; +package java.task; /** * Create an instance of todo class @@ -10,6 +10,9 @@ public class TaskToDos extends Task { + /** + * Constructor + */ public TaskToDos(String taskDetail) { super(taskDetail); this.isDone = false; diff --git a/src/java/task/TaskType.java b/src/java/task/TaskType.java index c4180ea6..1e2aab20 100644 --- a/src/java/task/TaskType.java +++ b/src/java/task/TaskType.java @@ -1,28 +1,33 @@ -package src.java.task; +package java.task; /** - * Create + * Define task type * - * @author Kang Teng + * @author Kang Teng * @version 8.0 - * @since 2021-09-01 + * @since 2021-09-01 */ public enum TaskType { TODOS, DEADLINE, EVENT; + /** + * Constructor + */ public static String taskTypeToString(TaskType taskType) { String s = ""; switch (taskType) { - case TODOS: - s = "T"; - break; - case DEADLINE: - s = "D"; - break; - case EVENT: - s = "E"; - break; + case TODOS: + s = "T"; + break; + case DEADLINE: + s = "D"; + break; + case EVENT: + s = "E"; + break; + default: + throw new IllegalStateException("Unexpected value: " + taskType); } return s; } diff --git a/src/java/ui/Message.java b/src/java/ui/Message.java index f7f827b4..bf9c0080 100644 --- a/src/java/ui/Message.java +++ b/src/java/ui/Message.java @@ -1,15 +1,19 @@ -package src.java.ui; +package java.ui; -import src.java.task.TaskList; -import src.java.task.TaskType; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.task.TaskList; +import java.task.TaskType; /** * Handle all the message methods * - * @author Kang Teng + * @author Kang Teng * @version 8.0 - * @since 2021-09-01 + * @since 2021-09-01 */ public class Message implements Ui { @@ -26,6 +30,12 @@ public void msgGreet() { // Assignment Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message when a task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ public void msgAssignTask(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); @@ -42,7 +52,13 @@ public void msgAssignTask(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber) { + /** + * Display message when a deadline task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -52,7 +68,7 @@ public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber) { String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println( @@ -61,7 +77,13 @@ public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNumber) { + /** + * Display message when a deadline task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -71,8 +93,8 @@ public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNum String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - String timeString = myList.getTaskDeadLine_TaskTime_InString(taskNumber); + String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); + String timeString = myList.getTaskDeadLineTaskTimeInString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println( @@ -82,7 +104,13 @@ public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNum System.out.println("_________________________________"); } - public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber) { + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -92,7 +120,7 @@ public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber) { String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); + String dateString = myList.getTaskEventTaskDateInString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println( @@ -101,7 +129,13 @@ public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } - public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskNumber) { + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -111,8 +145,8 @@ public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskN String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); - String timeStartString = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); + String dateString = myList.getTaskEventTaskDateInString(taskNumber); + String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); @@ -121,7 +155,13 @@ public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskN System.out.println("_________________________________"); } - public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myList, int taskNumber) { + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -131,9 +171,9 @@ public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myLis String taskDetail = myList.getTaskDetail(taskNumber); - String dateString = myList.getTaskEvent_TaskDate_InString(taskNumber); - String timeStartString = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); - String timeEndString = myList.getTaskEvent_TaskTimeEnd_InString(taskNumber); + String dateString = myList.getTaskEventTaskDateInString(taskNumber); + String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); + String timeEndString = myList.getTaskEventTaskTimeEndInString(taskNumber); System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); @@ -142,18 +182,19 @@ public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myLis System.out.println("_________________________________"); } - public void msgEcho(String s) { - System.out.println(" Task Added: " + s); - System.out.println("_________________________________"); - } - // FileAccess Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message when task is saved + */ public void msgSave() { System.out.println(" Progress Saved!"); System.out.println("_________________________________"); } + /** + * Display message when task is loaded + */ public void msgSLoad() { System.out.println(" Progress loaded!"); System.out.println("_________________________________"); @@ -161,6 +202,12 @@ public void msgSLoad() { // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message when a task is marked as done + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ public void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); msgBlankBeforeTaskDetail(); @@ -168,6 +215,11 @@ public void msgMarkDone(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } + /** + * Display message to show the full list of task + * + * @param myList TaskList that contains the list of task + */ public void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { System.out.print(" " + Integer.toString(i + 1) + "."); @@ -176,10 +228,19 @@ public void msgList(TaskList myList) { System.out.println("_________________________________"); } + /** + * Display blanks + */ public void msgBlankBeforeTaskDetail() { System.out.print(" "); } + /** + * Display detail of a task + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ public void msgTaskDetail(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -198,75 +259,100 @@ public void msgTaskDetail(TaskList myList, int taskNumber) { String timeEnd = ""; switch (taskType) { - case TODOS: + case TODOS: + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + break; + case DEADLINE: + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskDeadLineTaskDateYearInString(taskNumber); + month = myList.getTaskDeadLineTaskDateMonthInString(taskNumber); + day = myList.getTaskDeadLineTaskDateDayInString(taskNumber); + time = myList.getTaskDeadLineTaskTimeInString(taskNumber); + + if (time.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + ")"); + } else { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + " " + time + ")"); + } + break; + case EVENT: + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskEventTaskDateYearInString(taskNumber); + month = myList.getTaskEventTaskDateMonthInString(taskNumber); + day = myList.getTaskEventTaskDateDayInString(taskNumber); + timeStart = myList.getTaskEventTaskTimeStartInString(taskNumber); + timeEnd = myList.getTaskEventTaskTimeEndInString(taskNumber); + + if (timeStart.equals("null") && timeEnd.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(at: " + year + " " + month + " " + day + ")"); + } else if (timeEnd.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + ")"); + } else { System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - break; - case DEADLINE: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskDeadLine_TaskDate_Year_InString(taskNumber); - month = myList.getTaskDeadLine_TaskDate_Month_InString(taskNumber); - day = myList.getTaskDeadLine_TaskDate_Day_InString(taskNumber); - time = myList.getTaskDeadLine_TaskTime_InString(taskNumber); - - if (time.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + " " + time + ")"); - } - break; - case EVENT: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskEvent_TaskDate_Year_InString(taskNumber); - month = myList.getTaskEvent_TaskDate_Month_InString(taskNumber); - day = myList.getTaskEvent_TaskDate_Day_InString(taskNumber); - timeStart = myList.getTaskEvent_TaskTimeStart_InString(taskNumber); - timeEnd = myList.getTaskEvent_TaskTimeEnd_InString(taskNumber); - - if (timeStart.equals("null") && timeEnd.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(at: " + year + " " + month + " " + day + ")"); - } else if (timeEnd.equals("null")){ - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); - } - break; + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); + } + break; + default: + break; } } // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message when a task is marked as done + * + * @param e Exception error + */ public void msgError(Exception e) { System.out.println("Error Occurs: " + e); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + */ public void msgInvalidInput() { System.out.println(" Sorry :( Invalid Input. Try Again ~ "); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Description of the task is missing + */ public void msgInvalidInputMissingDescription() { System.out.println(" ☹ OOPS!!! The description cannot be empty."); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Date of the task is missing + */ public void msgInvalidInputMissingDay() { System.out.println(" ☹ OOPS!!! The day cannot be empty."); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Time of the task is missing + */ public void msgInvalidInputMissingTime() { System.out.println(" ☹ OOPS!!! The time cannot be empty."); System.out.println("_________________________________"); } + /** + * Display message when a task is removed + */ public void msgRemoveItem(TaskList myList, int taskNumber) { System.out.println(" Noted. I've removed this task:"); @@ -276,23 +362,39 @@ public void msgRemoveItem(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * The task number is not found + */ public void msgWrongTaskNumber() { System.out.println(" ☹ OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Format of the date is unaccepted + */ public void msgInvalidInputWrongDateTimeFormat() { System.out.println(" ☹ OOPS!!! Please follow this format:"); System.out.println(" /by yyyy-mm-dd hh:mm"); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Format of the date and time is unaccepted + */ public void msgInvalidInputWrongDateTimeStartEndFormat() { System.out.println(" ☹ OOPS!!! Please follow this format:"); System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); System.out.println("_________________________________"); } + /** + * Display message that remind user about invalid input + * Start time should be before End time + */ public void msgInvalidInputTimeStartLaterThanTimeEnd() { System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); System.out.println("_________________________________"); @@ -300,13 +402,19 @@ public void msgInvalidInputTimeStartLaterThanTimeEnd() { // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message before the end of program + */ public void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); - msgBuddahProtectMe(); + msgBuddhaProtectMe(); } - public void msgBuddahProtectMe() throws IOException { + /** + * Display Buddah.txt + */ + public void msgBuddhaProtectMe() throws IOException { String everything = ""; // ... \Duke\src\main\resources\buddha.txt diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java index ab730a7f..0ab6df98 100644 --- a/src/java/ui/Ui.java +++ b/src/java/ui/Ui.java @@ -1,7 +1,7 @@ -package src.java.ui; +package java.ui; -import src.java.task.TaskList; import java.io.IOException; +import java.task.TaskList; /** * Interface class for User Interface @@ -13,34 +13,33 @@ public interface Ui { - Message message = new Message(); + Message MESSAGE = new Message(); // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public void msgGreet(); - public void msgAssignTask(TaskList myList, int taskNumber); - public void msgAssignTaskDeadline_TaskDate(TaskList myList, int taskNumber); - public void msgAssignTaskDeadline_TaskDate_TaskTime(TaskList myList, int taskNumber); - public void msgAssignTaskEvent_TaskDate(TaskList myList, int taskNumber); - public void msgAssignTaskEvent_TaskDate_TaskTimeStart(TaskList myList, int taskNumber); - public void msgAssignTaskEvent_TaskDate_TaskTimeStart_TaskTimeEnd(TaskList myList, int taskNumber); - public void msgEcho(String s); - public void msgSave(); - public void msgSLoad(); - public void msgMarkDone(TaskList myList, int taskNumber); - public void msgList(TaskList myList); - public void msgBlankBeforeTaskDetail(); - public void msgTaskDetail(TaskList myList, int taskNumber); - public void msgError(Exception e); - public void msgInvalidInput(); - public void msgInvalidInputMissingDescription(); - public void msgInvalidInputMissingDay(); - public void msgInvalidInputMissingTime(); - public void msgInvalidInputWrongDateTimeFormat(); - public void msgInvalidInputWrongDateTimeStartEndFormat(); - public void msgInvalidInputTimeStartLaterThanTimeEnd(); - public void msgRemoveItem(TaskList myList, int taskNumber); - public void msgWrongTaskNumber(); - public void msgBye() throws IOException; - public void msgBuddahProtectMe() throws IOException; + void msgGreet(); + void msgAssignTask(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); + void msgSave(); + void msgSLoad(); + void msgMarkDone(TaskList myList, int taskNumber); + void msgList(TaskList myList); + void msgBlankBeforeTaskDetail(); + void msgTaskDetail(TaskList myList, int taskNumber); + void msgError(Exception e); + void msgInvalidInput(); + void msgInvalidInputMissingDescription(); + void msgInvalidInputMissingDay(); + void msgInvalidInputMissingTime(); + void msgInvalidInputWrongDateTimeFormat(); + void msgInvalidInputWrongDateTimeStartEndFormat(); + void msgInvalidInputTimeStartLaterThanTimeEnd(); + void msgRemoveItem(TaskList myList, int taskNumber); + void msgWrongTaskNumber(); + void msgBye() throws IOException; + void msgBuddhaProtectMe() throws IOException; } From 0da23ac41be7758d5624c61bdbd8fe311b650c87 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 1 Nov 2021 14:19:22 +0800 Subject: [PATCH 23/39] Duke Level-8-6: JUnit --- src/FutureImporvement.txt | 1 + src/test/DukeTest.java | 25 ++ src/test/action/ParseDateTimeTest.java | 151 ++++++++ src/test/action/ParserFacadeTest.java | 64 ++++ src/test/action/ParserTest.java | 448 ++++++++++++++++++++++++ src/test/storage/FileAccessTest.java | 94 +++++ src/test/task/TaskDeadlineTest.java | 100 ++++++ src/test/task/TaskEventTest.java | 136 ++++++++ src/test/task/TaskListTest.java | 286 +++++++++++++++ src/test/task/TaskTest.java | 80 +++++ src/test/task/TaskToDosTest.java | 21 ++ src/test/task/TaskTypeTest.java | 34 ++ src/test/ui/MessageTest.java | 458 +++++++++++++++++++++++++ src/test/ui/UiTest.java | 45 +++ 14 files changed, 1943 insertions(+) create mode 100644 src/test/DukeTest.java create mode 100644 src/test/action/ParseDateTimeTest.java create mode 100644 src/test/action/ParserFacadeTest.java create mode 100644 src/test/action/ParserTest.java create mode 100644 src/test/storage/FileAccessTest.java create mode 100644 src/test/task/TaskDeadlineTest.java create mode 100644 src/test/task/TaskEventTest.java create mode 100644 src/test/task/TaskListTest.java create mode 100644 src/test/task/TaskTest.java create mode 100644 src/test/task/TaskToDosTest.java create mode 100644 src/test/task/TaskTypeTest.java create mode 100644 src/test/ui/MessageTest.java create mode 100644 src/test/ui/UiTest.java diff --git a/src/FutureImporvement.txt b/src/FutureImporvement.txt index 64c2357b..eb4b0eaf 100644 --- a/src/FutureImporvement.txt +++ b/src/FutureImporvement.txt @@ -2,3 +2,4 @@ Level 8: 1. date time should accept other format. for now cannot. 2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. 3. save the time and date +4. JUnit Test buggy diff --git a/src/test/DukeTest.java b/src/test/DukeTest.java new file mode 100644 index 00000000..611f4ecc --- /dev/null +++ b/src/test/DukeTest.java @@ -0,0 +1,25 @@ +package java; + +import java.action.ParserFacade; + +/** + * Begin the program here. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class Duke { + + /** + * Starting point of the program + */ + public static void main(String[] args) { + + ParserFacade parserFacade = new ParserFacade(); + + parserFacade.startDuke(); + parserFacade.runDuke(); + parserFacade.endDuke(); + } +} diff --git a/src/test/action/ParseDateTimeTest.java b/src/test/action/ParseDateTimeTest.java new file mode 100644 index 00000000..9341a784 --- /dev/null +++ b/src/test/action/ParseDateTimeTest.java @@ -0,0 +1,151 @@ +package test.action; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.ui.Message; +import java.ui.Ui; +import java.util.Locale; + +/** + * Handle date and time related functions + *

+ * Conversion between String and LocalDate/LocalTime + * String manipulation + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class ParseDateTime { + + private static Ui ui = new Message(); + + /** + * Convert date from String to LocalDate + * + * @param date TaskDate of the task + * @return LocalDate + * @throws DateTimeParseException If format of the date is not accepted + */ + public static LocalDate toDate(String date) { + + LocalDate formattedDate; + DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .parseLenient() + .appendPattern("[yyyy-MM-dd]") + .appendPattern("[M-d-yyyy]") + .appendPattern("[M-dd-yyyy]") + .appendPattern("[MM-d-yyyy]") + .appendPattern("[MM-dd-yyyy]") + .appendPattern("[M/d/yyyy]") + .appendPattern("[M/dd/yyyy]") + .appendPattern("[MM/d/yyyy]") + .appendPattern("[MM/dd/yyyy]") + .appendPattern("[d-M-yyyy]") + .appendPattern("[d-MM-yyyy]") + .appendPattern("[dd-M-yyyy]") + .appendPattern("[dd-MM-yyyy]") + .appendPattern("[d/M/yyyy]") + .appendPattern("[d/MM/yyyy]") + .appendPattern("[dd/M/yyyy]") + .appendPattern("[dd/MM/yyyy]") + .appendPattern("[MMM dd yyyy]"); + + DateTimeFormatter formatter = builder.toFormatter(Locale.ENGLISH); + + try { + formattedDate = LocalDate.parse(date, formatter); + return formattedDate; + } catch (DateTimeParseException e) { + throw e; + } + } + + /** + * Convert time from String to LocalTime + * + * @param time TaskDate of the task + * @return LocalTime + * @throws DateTimeParseException If format of the date is not accepted + */ + public static LocalTime toTime(String time) { + LocalTime localTime = LocalTime.parse(time); + return localTime; + } + + /** + * Split Date and Time by empty space " " + * + * @param dateAndTime String that contains both date and time + * @return String[] + */ + public static String[] splitDateAndTime(String dateAndTime) { + return dateAndTime.split(" "); + } + + /** + * Check if the string contains date and time + * + * return 1 if the string contains only string representation of a Date + * return 2 if the string contains string representation of a Date and a Time + * return 3 if the string contains string representation of a Date and 2 Time + * + * @param dateAndTime string representation of date and time + * @return int 1 or 2 or 3 + */ + public static int isDateAndTime(String dateAndTime) { + String[] split = dateAndTime.split(" "); + if (split.length == 1) { + return 1; + } else if (split.length == 2) { + return 2; + } else { + return 3; + } + } + + /** + * Extract string representation of date from string array + * + * @param split string array of date and time + * @return String Date + */ + public static String toExtractDateFromSplitDateAndTime(String[] split) { + return split[0]; + } + + /** + * Extract string representation of time from string array + * + * @param split string array of date and time + * @return String Time + */ + public static String toExtracTimeFromSplitDateAndTime(String[] split) { + return split[1]; + } + + /** + * Extract string representation of start time from string array + * + * @param split string array of date and time + * @return String TimeStart + */ + public static String toExtracTimeStartFromSplitDateAndTime(String[] split) { + return split[1]; + } + + /** + * Extract string representation of end time from string array + * + * @param split string array of date and time + * @return String TimeEnd + */ + public static String toExtracTimeEndFromSplitDateAndTime(String[] split) { + return split[2]; + } +} diff --git a/src/test/action/ParserFacadeTest.java b/src/test/action/ParserFacadeTest.java new file mode 100644 index 00000000..76467834 --- /dev/null +++ b/src/test/action/ParserFacadeTest.java @@ -0,0 +1,64 @@ +package test.action; + +import java.storage.FileAccess; + +/** + * Create an instance of Duke Program + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class ParserFacade { + + private FileAccess fileAccess; + private Parser parser; + + /** + * Constructor + */ + public ParserFacade() { + fileAccess = new FileAccess(); + parser = new Parser(fileAccess); + } + + /** + * Initialize the Duke Program. + */ + public void startDuke() { + parser.showGreetMessage(); + } + + + /** + * Run the Duke Program + */ + public void runDuke() { + parser.onCreateDuke(); + } + + /** + * End the Duke Program + */ + public void endDuke() { + parser.showByeMessage(); + } + + /** + * Return a FileAccess object + * + * @return FileAccess + */ + public FileAccess getFileAccess() { + return fileAccess; + } + + /** + * Return a Parser object + * + * @return Parser + */ + public Parser getDukeObject() { + return parser; + } +} diff --git a/src/test/action/ParserTest.java b/src/test/action/ParserTest.java new file mode 100644 index 00000000..180cdc64 --- /dev/null +++ b/src/test/action/ParserTest.java @@ -0,0 +1,448 @@ +package test.action; + +import java.io.IOException; +import java.storage.FileAccess; +import java.task.TaskList; +import java.task.TaskType; +import java.time.LocalDate; +import java.time.LocalTime; +import java.ui.Message; +import java.ui.Ui; +import java.util.Scanner; + +/** + * Main logic of the Duke Program + * Handles the sequence of program flow + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class Parser { + + private FileAccess fileAccess; + private Ui ui; + + /** + * Constructor + */ + public Parser(FileAccess fileAccess) { + this.fileAccess = fileAccess; + ui = new Message(); + } + + // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show the opening Greet Message in System.out.println + */ + public void showGreetMessage() { + ui.msgGreet(); + } + + // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Create main sequence of the Duke program + * This section iterate until "bye" is called + *

+ * Current Supported Duke Command List: + * - list + * - done + * - todo + * - save + * - load + * - event + * - delete + * - deadline + */ + public void onCreateDuke() { + boolean isDukeRunning = true; + String line; + Scanner in = new Scanner(System.in); + TaskList myList = new TaskList(); + while (isDukeRunning) { + line = in.nextLine(); + isDukeRunning = toReadUserCommand(myList, line); + } + in.close(); + } + + /** + * Read a single user input and respond accordingly + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + * @return boolean Return false if user type Bye, else return true + */ + public boolean toReadUserCommand(TaskList myList, String line) { + try { + // Guard Condition + if (line.equals("bye")) { + return false; + } + + // for testing new function + if (line.equals("tf")) { + System.out.println("XXXXX Test Function XXXXX"); + fileAccess.deleteProgressFile(); + System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); + } + + if (line.equals("list")) { + showFullList(myList); + } else if (line.substring(0, 4).equals("done")) { + toMarkTaskDone(myList, line); + } else if (line.substring(0, 4).equals("todo")) { + toAddTaskToDo(myList, line); + } else if (line.substring(0, 4).equals("save")) { + toSaveTask(myList); + } else if (line.substring(0, 4).equals("load")) { + // loadTask(myList); + } else if (line.substring(0, 5).equals("event")) { + toAddTaskEvent(myList, line); + } else if (line.substring(0, 6).equals("delete")) { + toDeleteTask(myList, line); + } else if (line.substring(0, 8).equals("deadline")) { + toAddTaskDeadline(myList, line); + } else { + ui.msgInvalidInput(); + } + return true; + } catch (Exception e) { + ui.msgInvalidInput(); + ui.msgError(e); + return true; + } + } + + // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show the Bye Message + *

+ * called when Duke program ends + */ + public void showByeMessage() { + try { + ui.msgBye(); + } catch (IOException error) { + ui.msgError(error); + } + } + + // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show full list of tasks + * + * @param myList TaskList that contains the list of task + */ + private void showFullList(TaskList myList) { + ui.msgList(myList); + } + + /** + * Mark a task as done + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toMarkTaskDone(TaskList myList, String line) { + int taskNumber = Integer.parseInt(line.substring(5)); + myList.setTaskDone(taskNumber - 1); + ui.msgMarkDone(myList, taskNumber - 1); + } + + /** + * Add a task of ToDo type into the list of task + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toAddTaskToDo(TaskList myList, String line) { + if (line.length() <= 5) { + ui.msgInvalidInputMissingDescription(); + } else { + myList.addItemToDos(line.substring(5)); + ui.msgAssignTask(myList, myList.getNumOfItem() - 1); + } + } + + /** + * Save the current task list and output a text file + * + * @param myList TaskList that contains the list of task + */ + private void toSaveTask(TaskList myList) { + String listOfTaskString = toReadTaskConvertToString(myList); + fileAccess.saveProgressIntoFile(myList, listOfTaskString); + } + + /** + * Add a task of Event type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toAddTaskEvent(TaskList myList, String line) { + + if (line.length() <= 6) { + ui.msgInvalidInputMissingDescription(); + return; + } + + if (!line.contains("/at")) { + ui.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = line.substring(6, line.indexOf("/")); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String timeStart; + String timeEnd; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskEvent_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); + } else { + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); + } + + } catch (Exception e) { + ui.msgInvalidInputWrongDateTimeStartEndFormat(); + } + + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + */ + private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate); + ui.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + */ + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart); + ui.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); + + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + * @param timeEnd String that represents the end time of the event + */ + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart, String timeEnd) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null || taskTimeEnd == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + if (taskTimeStart.isAfter(taskTimeEnd)) { + ui.msgInvalidInputTimeStartLaterThanTimeEnd(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); + ui.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); + } + + /** + * Delete a task from the user task + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ + private void toDeleteTask(TaskList myList, String line) { + try { + int taskNumber = Integer.parseInt(line.substring(7)); + ui.msgRemoveItem(myList, taskNumber - 1); + myList.removeItem(taskNumber - 1); + } catch (Exception e) { + ui.msgWrongTaskNumber(); + } + } + + /** + * Add a task of Deadline type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ + private void toAddTaskDeadline(TaskList myList, String line) { + + if (line.length() <= 9) { + ui.msgInvalidInputMissingDescription(); + return; + } + + if (!line.contains("/by")) { + ui.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = line.substring(9, line.indexOf("/")); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String time; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskDeadline_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); + toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); + } else { + ui.msgInvalidInputWrongDateTimeFormat(); + } + + } catch (Exception e) { + ui.msgInvalidInputWrongDateTimeFormat(); + } + } + + /** + * Add a task of Deadline type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + */ + private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate); + ui.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + * @param time String that represents the time of the deadline + */ + private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, + String date, String time) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTime = ParseDateTime.toTime(time); + + if (taskDate == null) { + ui.msgInvalidInputMissingDay(); + return; + } + + if (taskTime == null) { + ui.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate, taskTime); + ui.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); + } + + + // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Read a list of task and convert it into string + * + * @param myList TaskList that contains the list of task + */ + private String toReadTaskConvertToString(TaskList myList) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + boolean isDone = myList.getTaskDoneStatus(i); + String isDoneString = (isDone ? "1" : "0"); + String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); + + sb.append(taskType).append("|"); + sb.append(isDoneString).append("|"); + sb.append(taskDetail).append("|\n"); + } + return sb.toString(); + } + + +} + + + diff --git a/src/test/storage/FileAccessTest.java b/src/test/storage/FileAccessTest.java new file mode 100644 index 00000000..c8015a32 --- /dev/null +++ b/src/test/storage/FileAccessTest.java @@ -0,0 +1,94 @@ +package test.storage; + +import java.io.File; +import java.io.FileWriter; +import java.task.TaskList; +import java.ui.Message; +import java.ui.Ui; +import java.util.Scanner; + +/** + * Handles file handling related functions + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class FileAccess { + private String filepath; + private File progressFile; + private Ui ui; + + /** + * Constructor + */ + public FileAccess() { + filepath = "src\\resources\\progress.txt"; + progressFile = new File(filepath); + ui = new Message(); + } + + /** + * Save progress of the current task + * + * @param myList TaskList that needs to be output + * @param stringToBeWritten String that needs to be outputed + */ + public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { + + try { + FileWriter fw = new FileWriter(filepath); + fw.write(stringToBeWritten); + fw.close(); + ui.msgSave(); + } catch (Exception e) { + ui.msgError(e); + } + } + + /** + * Load existing progress of the task + * + * @return String that represents a list of task details + */ + public String loadProgressFromFile() { + StringBuilder sb = new StringBuilder(); + + try { + Scanner scanner = new Scanner(progressFile); + while (scanner.hasNext()) { + sb.append(scanner.nextLine()); + } + + } catch (Exception e) { + ui.msgError(e); + } + + return sb.toString(); + } + + /** + * Delete an existing progress file + *

+ * todo Method to be completed + */ + public void deleteProgressFile() { + + } + + /** + * Example of Save file + */ + public void saveFileExample() { + String filepath = "src\\resources\\myText.txt"; + try { + FileWriter fw = new FileWriter(filepath); + fw.write("helloWold"); + fw.close(); + ui.msgSave(); + } catch (Exception e) { + ui.msgError(e); + } + } +} diff --git a/src/test/task/TaskDeadlineTest.java b/src/test/task/TaskDeadlineTest.java new file mode 100644 index 00000000..89cc90a6 --- /dev/null +++ b/src/test/task/TaskDeadlineTest.java @@ -0,0 +1,100 @@ +package test.task; + +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Create an instance of deadline class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class TaskDeadline extends Task { + private LocalDate taskDate; + private LocalTime taskTime; + + /** + * Constructor + */ + public TaskDeadline(String taskDetail, LocalDate taskDate) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + this.taskDate = taskDate; + } + + /** + * Constructor + */ + public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.DEADLINE; + this.taskDate = taskDate; + this.taskTime = localTime; + } + + /** + * Return LocalDate of a task + * + * @return LocalDate that represents the taskDate + */ + public LocalDate getLocalDate() { + return taskDate; + } + + /** + * Return LocalDate of a task in String + * + * @return String that represents the taskDate + */ + public String getLocalDateToString() { + return String.valueOf(taskDate); + } + + /** + * Return day from LocalDate of a task in String + * + * @return String that represents the day of taskDate + */ + public String getLocalDateDayToString() { + return String.valueOf(taskDate.getDayOfMonth()); + } + + /** + * Return month from LocalDate of a task in String + * + * @return String that represents the month of taskDate + */ + public String getLocalDateMonthToString() { + return String.valueOf(taskDate.getMonth()); + } + + /** + * Return year from LocalDate of a task in String + * + * @return String that represents the year of taskDate + */ + public String getLocalDateYearToString() { + return String.valueOf(taskDate.getYear()); + } + + /** + * Return LocalTime of a task + * + * @return LocalTime that represents the taskTime + */ + public LocalTime getLocalTime() { + return taskTime; + } + + /** + * Return LocalTime of a task in String + * + * @return String that represents the taskTime + */ + public String getLocalTime_toString() { + return String.valueOf(taskTime); + } +} diff --git a/src/test/task/TaskEventTest.java b/src/test/task/TaskEventTest.java new file mode 100644 index 00000000..31871faf --- /dev/null +++ b/src/test/task/TaskEventTest.java @@ -0,0 +1,136 @@ +package test.task; + +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Create an instance of event class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class TaskEvent extends Task { + + private LocalDate taskDate; + private LocalTime taskTimeStart; + private LocalTime taskTimeEnd; + + /** + * Constructor + */ + public TaskEvent(String taskDetail, LocalDate taskDate) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + this.taskDate = taskDate; + } + + /** + * Constructor + */ + public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + this.taskDate = taskDate; + this.taskTimeStart = taskTimeStart; + } + + /** + * Constructor + */ + public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.EVENT; + this.taskDate = taskDate; + this.taskTimeStart = taskTimeStart; + this.taskTimeEnd = taskTimeEnd; + } + + /** + * Return LocalDate of a task + * + * @return LocalDate that represents the taskDate + */ + public LocalDate getLocalDate() { + return taskDate; + } + + /** + * Return LocalDate of a task in String + * + * @return String that represents the taskDate + */ + public String getLocalDate_toString() { + return String.valueOf(taskDate); + } + + /** + * Return day from LocalDate of a task in String + * + * @return String that represents the day of taskDate + */ + public String getLocalDateDayToString() { + return String.valueOf(taskDate.getDayOfMonth()); + } + + /** + * Return month from LocalDate of a task in String + * + * @return String that represents the month of taskDate + */ + public String getLocalDateMonthToString() { + return String.valueOf(taskDate.getMonth()); + } + + /** + * Return year from LocalDate of a task in String + * + * @return String that represents the year of taskDate + */ + public String getLocalDateYearToString() { + return String.valueOf(taskDate.getYear()); + } + + /** + * Return start time of LocalTime of a task + * + * @return LocalTime that represents the start time of taskTime + */ + public LocalTime getLocalTimeStart() { + return taskTimeStart; + } + + /** + * Return end time of LocalTime of a task + * + * @return LocalTime that represents the end time of taskTime + */ + public LocalTime getLocalTimeEnd() { + return taskTimeEnd; + } + + /** + * Return start time of LocalTime of a task in String + * + * @return String that represents the start time of taskTime + */ + public String getLocalTimeStart_toString() { + return String.valueOf(taskTimeStart); + } + + /** + * Return end time of LocalTime of a task in String + * + * @return String that represents the start time of taskTime + */ + public String getLocalTimeEnd_toString() { + return String.valueOf(taskTimeEnd); + } +} + + + diff --git a/src/test/task/TaskListTest.java b/src/test/task/TaskListTest.java new file mode 100644 index 00000000..9eaf4cca --- /dev/null +++ b/src/test/task/TaskListTest.java @@ -0,0 +1,286 @@ +package test.task; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; + +/** + * Create an instance of list of task + *

+ * Create task object + * Manipulate task object creation, modification and deletion + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class TaskList { + private List list; + + // Initialize & Add Item & Remove Item <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + public TaskList() { + list = new ArrayList(); + } + + /** + * Add a task of type ToDo + * + * @param taskDetail String that represents the task detail + */ + public void addItemToDos(String taskDetail) { + list.add(new TaskToDos(taskDetail)); + } + + /** + * Add a task of type Deadline + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + */ + public void addItemDeadline(String taskDetail, LocalDate taskDate) { + list.add(new TaskDeadline(taskDetail, taskDate)); + } + + /** + * Add a task of type Deadline + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTime LocalTime that represents the task time + */ + public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime) { + list.add(new TaskDeadline(taskDetail, taskDate, taskTime)); + } + + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + */ + public void addItemEvent(String taskDetail, LocalDate taskDate) { + list.add(new TaskEvent(taskDetail, taskDate)); + } + + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTimeStart LocalTime that represents the task start time + */ + public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { + list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart)); + } + + /** + * Add a task of type Event + * + * @param taskDetail String that represents the task detail + * @param taskDate LocalDate that represents the task date + * @param taskTimeStart LocalTime that represents the task start time + * @param taskTimeEnd LocalTime that represents the task end time + */ + public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { + list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd)); + } + + /** + * Delete a task from tasklist + * + * @param index Int that represents the index in a task list + */ + public void removeItem(int index) { + list.remove(index); + } + + // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Return a task from tasklist + * + * @param index Int that represents the index in a task list + * @return Task at the index + */ + public Task getTask(int index) { + return list.get(index); + } + + /** + * Return a task detail from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task detail + */ + public String getTaskDetail(int index) { + Task task = list.get(index); + return task.getTaskDetail(); + } + + /** + * Return a boolean done status from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return boolean that represents the task done status + */ + public boolean getTaskDoneStatus(int index) { + Task task = list.get(index); + return task.getDoneStatus(); + } + + /** + * Return a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task date + */ + public String getTaskEventTaskDateInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDate_toString(); + } + + /** + * Return year from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the year from taskDate + */ + public String getTaskEventTaskDateYearInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDateYearToString(); + } + + /** + * Return month from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the month from taskDate + */ + public String getTaskEventTaskDateMonthInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDateMonthToString(); + } + + /** + * Return day from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the day from taskDate + */ + public String getTaskEventTaskDateDayInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalDateDayToString(); + } + + /** + * Return start time in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the start time from TaskTime + */ + public String getTaskEventTaskTimeStartInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalTimeStart_toString(); + } + + /** + * Return end time in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the end time from TaskTime + */ + public String getTaskEventTaskTimeEndInString(int index) { + TaskEvent task = (TaskEvent) list.get(index); + return task.getLocalTimeEnd_toString(); + } + + /** + * Return a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the task date + */ + public String getTaskDeadLineTaskDateInString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDateToString(); + } + + /** + * Return year from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the year from TaskDate + */ + public String getTaskDeadLineTaskDateYearInString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDateYearToString(); + } + + /** + * Return month from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the month from TaskDate + */ + public String getTaskDeadLineTaskDateMonthInString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDateMonthToString(); + } + + /** + * Return day from a taskDate in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the day from TaskDate + */ + public String getTaskDeadLineTaskDateDayInString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalDateDayToString(); + } + + /** + * Return TaskTime in String from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return String that represents the TaskTime + */ + public String getTaskDeadLineTaskTimeInString(int index) { + TaskDeadline task = (TaskDeadline) list.get(index); + return task.getLocalTime_toString(); + } + + /** + * Return the number of item in a tasklist + * + * @return Int that represents the number of item in a tasklist + */ + public int getNumOfItem() { + return list.size(); + } + + /** + * Return TaskType from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return TaskType that represents the type of task + */ + public TaskType getTaskType(int index) { + Task task = list.get(index); + return task.getTaskType(); + } + + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Return TaskType from a task of tasklist + * + * @param index Int that represents the index in a task list + */ + public void setTaskDone(int index) { + Task task = list.get(index); + task.setTaskCompleted(); + } +} diff --git a/src/test/task/TaskTest.java b/src/test/task/TaskTest.java new file mode 100644 index 00000000..e46d4f9d --- /dev/null +++ b/src/test/task/TaskTest.java @@ -0,0 +1,80 @@ +package test.task; + +/** + * Abstract class for Task + *

+ * A task object correspond to a single task object. + * The class object can be of the type todo, event, or deadline. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public abstract class Task { + protected String taskDetail; + protected boolean isDone; + protected TaskType taskType; + + public Task(String taskDetail) { + this.taskDetail = taskDetail; + } + + // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Return the task detail + * + * @return String that represents the task detail + */ + public String getTaskDetail() { + return taskDetail; + } + + /** + * Return the boolean done status that represents if a task is done + * + * @return boolean that represents the done status of a task + */ + public boolean getDoneStatus() { + return isDone; + } + + /** + * Return the TaskType + * + * @return TaskType that represents the type of task + */ + public TaskType getTaskType() { + return taskType; + } + + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Modified the task detail + * + * @param modifiedTaskDetail String that represent the new task detail + */ + public void setTask(String modifiedTaskDetail) { + taskDetail = modifiedTaskDetail; + } + + /** + * Set the task as completed + * Change the done status to completed + */ + public void setTaskCompleted() { + isDone = true; + } + + /** + * Modified the type of the task + * + * @param taskType String that represent the new task type + */ + public void setTypeOfTask(TaskType taskType) { + this.taskType = taskType; + } + +} diff --git a/src/test/task/TaskToDosTest.java b/src/test/task/TaskToDosTest.java new file mode 100644 index 00000000..bbfc5dc2 --- /dev/null +++ b/src/test/task/TaskToDosTest.java @@ -0,0 +1,21 @@ +package test.task; + +/** + * Create an instance of todo class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class TaskToDos extends Task { + + /** + * Constructor + */ + public TaskToDos(String taskDetail) { + super(taskDetail); + this.isDone = false; + this.taskType = TaskType.TODOS; + } +} diff --git a/src/test/task/TaskTypeTest.java b/src/test/task/TaskTypeTest.java new file mode 100644 index 00000000..0020b0a0 --- /dev/null +++ b/src/test/task/TaskTypeTest.java @@ -0,0 +1,34 @@ +package test.task; + +/** + * Define task type + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public enum TaskType { + TODOS, DEADLINE, EVENT; + + /** + * Constructor + */ + public static String taskTypeToString(TaskType taskType) { + String s = ""; + switch (taskType) { + case TODOS: + s = "T"; + break; + case DEADLINE: + s = "D"; + break; + case EVENT: + s = "E"; + break; + default: + throw new IllegalStateException("Unexpected value: " + taskType); + } + return s; + } +} diff --git a/src/test/ui/MessageTest.java b/src/test/ui/MessageTest.java new file mode 100644 index 00000000..560a068f --- /dev/null +++ b/src/test/ui/MessageTest.java @@ -0,0 +1,458 @@ +package test.ui; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.task.TaskList; +import java.task.TaskType; + +/** + * Handle all the message methods + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class Message implements Ui { + + // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + @Override + public void msgGreet() { + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); + System.out.println("_________________________________"); + } + + // Assignment Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message when a task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTask(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message when a deadline task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message when a deadline task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); + String timeString = myList.getTaskDeadLineTaskTimeInString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + "(by: " + dateString + " " + timeString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEventTaskDateInString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println( + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEventTaskDateInString(taskNumber); + String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" (at: " + dateString + ", from: " + timeStartString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message when an event task is assigned + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { + + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateString = myList.getTaskEventTaskDateInString(taskNumber); + String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); + String timeEndString = myList.getTaskEventTaskTimeEndInString(taskNumber); + + System.out.println(" Got it. I've added this task: "); + System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.println(" (at: " + dateString + ", from: " + timeStartString + " to " + timeEndString + ")"); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + // FileAccess Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message when task is saved + */ + public void msgSave() { + System.out.println(" Progress Saved!"); + System.out.println("_________________________________"); + } + + /** + * Display message when task is loaded + */ + public void msgSLoad() { + System.out.println(" Progress loaded!"); + System.out.println("_________________________________"); + } + + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message when a task is marked as done + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgMarkDone(TaskList myList, int taskNumber) { + System.out.println(" Naisuuuu! This task is marked as done: "); + msgBlankBeforeTaskDetail(); + msgTaskDetail(myList, taskNumber); + System.out.println("_________________________________"); + } + + /** + * Display message to show the full list of task + * + * @param myList TaskList that contains the list of task + */ + public void msgList(TaskList myList) { + for (int i = 0; i < myList.getNumOfItem(); i++) { + System.out.print(" " + Integer.toString(i + 1) + "."); + msgTaskDetail(myList, i); + } + System.out.println("_________________________________"); + } + + /** + * Display blanks + */ + public void msgBlankBeforeTaskDetail() { + System.out.print(" "); + } + + /** + * Display detail of a task + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public void msgTaskDetail(TaskList myList, int taskNumber) { + TaskType taskType = myList.getTaskType(taskNumber); + String taskTypeInString = TaskType.taskTypeToString(taskType); + + boolean isDone = myList.getTaskDoneStatus(taskNumber); + String isDoneInString = (isDone ? "X" : " "); + + String taskDetail = myList.getTaskDetail(taskNumber); + + String dateTimeString = ""; + String year = ""; + String month = ""; + String day = ""; + String time = ""; + String timeStart = ""; + String timeEnd = ""; + + switch (taskType) { + case TODOS: + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + break; + case DEADLINE: + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskDeadLineTaskDateYearInString(taskNumber); + month = myList.getTaskDeadLineTaskDateMonthInString(taskNumber); + day = myList.getTaskDeadLineTaskDateDayInString(taskNumber); + time = myList.getTaskDeadLineTaskTimeInString(taskNumber); + + if (time.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + ")"); + } else { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(by: " + year + " " + month + " " + day + " " + time + ")"); + } + break; + case EVENT: + // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); + year = myList.getTaskEventTaskDateYearInString(taskNumber); + month = myList.getTaskEventTaskDateMonthInString(taskNumber); + day = myList.getTaskEventTaskDateDayInString(taskNumber); + timeStart = myList.getTaskEventTaskTimeStartInString(taskNumber); + timeEnd = myList.getTaskEventTaskTimeEndInString(taskNumber); + + if (timeStart.equals("null") && timeEnd.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + + "(at: " + year + " " + month + " " + day + ")"); + } else if (timeEnd.equals("null")) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + ")"); + } else { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); + } + break; + default: + break; + } + } + + // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message when a task is marked as done + * + * @param e Exception error + */ + public void msgError(Exception e) { + System.out.println("Error Occurs: " + e); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + */ + public void msgInvalidInput() { + System.out.println(" Sorry :( Invalid Input. Try Again ~ "); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Description of the task is missing + */ + public void msgInvalidInputMissingDescription() { + System.out.println(" ☹ OOPS!!! The description cannot be empty."); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Date of the task is missing + */ + public void msgInvalidInputMissingDay() { + System.out.println(" ☹ OOPS!!! The day cannot be empty."); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Time of the task is missing + */ + public void msgInvalidInputMissingTime() { + System.out.println(" ☹ OOPS!!! The time cannot be empty."); + System.out.println("_________________________________"); + } + + /** + * Display message when a task is removed + */ + public void msgRemoveItem(TaskList myList, int taskNumber) { + + System.out.println(" Noted. I've removed this task:"); + msgBlankBeforeTaskDetail(); + msgTaskDetail(myList, taskNumber); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * The task number is not found + */ + public void msgWrongTaskNumber() { + System.out.println(" ☹ OOPS!!! The task number is invalid."); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Format of the date is unaccepted + */ + public void msgInvalidInputWrongDateTimeFormat() { + System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" /by yyyy-mm-dd hh:mm"); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Format of the date and time is unaccepted + */ + public void msgInvalidInputWrongDateTimeStartEndFormat() { + System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); + System.out.println("_________________________________"); + } + + /** + * Display message that remind user about invalid input + * Start time should be before End time + */ + public void msgInvalidInputTimeStartLaterThanTimeEnd() { + System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); + System.out.println("_________________________________"); + } + + // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message before the end of program + */ + public void msgBye() throws IOException { + System.out.println("Bye. Hope to see you again soon!"); + System.out.println("_________________________________"); + msgBuddhaProtectMe(); + } + + /** + * Display Buddah.txt + */ + public void msgBuddhaProtectMe() throws IOException { + String everything = ""; + + // ... \Duke\src\main\resources\buddha.txt + // File.separator == " \ " + + String pathRoot = System.getProperty("user.dir"); + // pathRoot = D:\My Files\School Documents\Repository\Duke + + String pathRssFolder = "src" + File.separator + "resources"; + // pathRssFolder = src\main\resources + + String pathFileName = "buddha.txt"; + // pathFileName = buddha.txt + + String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; + // filePath = D:\My Files\School + // Documents\Repository\Duke\src\main\resources\buddha.txt + + try { + FileReader fr = new FileReader(filePath); + // FileReader fr = new FileReader("\\My Files\\School + // Documents\\Repository\\Duke\\src\\main\\resources\\buddha.txt"); + BufferedReader br = new BufferedReader(fr); + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + everything = sb.toString(); + br.close(); + } catch (FileNotFoundException e) { + System.out.println("\n >>> Buddah Protection is not in forced <<<\n"); + System.out.println(e); + } finally { + System.out.println(everything); + } + } +} diff --git a/src/test/ui/UiTest.java b/src/test/ui/UiTest.java new file mode 100644 index 00000000..0ab6df98 --- /dev/null +++ b/src/test/ui/UiTest.java @@ -0,0 +1,45 @@ +package java.ui; + +import java.io.IOException; +import java.task.TaskList; + +/** + * Interface class for User Interface + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public interface Ui { + + Message MESSAGE = new Message(); + + // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + void msgGreet(); + void msgAssignTask(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); + void msgSave(); + void msgSLoad(); + void msgMarkDone(TaskList myList, int taskNumber); + void msgList(TaskList myList); + void msgBlankBeforeTaskDetail(); + void msgTaskDetail(TaskList myList, int taskNumber); + void msgError(Exception e); + void msgInvalidInput(); + void msgInvalidInputMissingDescription(); + void msgInvalidInputMissingDay(); + void msgInvalidInputMissingTime(); + void msgInvalidInputWrongDateTimeFormat(); + void msgInvalidInputWrongDateTimeStartEndFormat(); + void msgInvalidInputTimeStartLaterThanTimeEnd(); + void msgRemoveItem(TaskList myList, int taskNumber); + void msgWrongTaskNumber(); + void msgBye() throws IOException; + void msgBuddhaProtectMe() throws IOException; +} From 571fe1c6e78a4b1b3314914fd2879f565869e184 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 2 Nov 2021 12:49:04 +0800 Subject: [PATCH 24/39] Debug branch one. store the changes. --- .classpath | 12 + .project | 34 ++ .settings/org.eclipse.buildship.core.prefs | 13 + src/java/Duke.java | 4 +- src/java/action/ParseDateTime.java | 2 +- src/java/action/Parser.java | 15 + src/java/task/Task.java | 1 + src/java/task/TaskPriority.java | 36 ++ src/java/ui/Message.java | 9 + src/java/ui/Ui.java | 1 + src/test/DukeTest.java | 25 -- src/test/action/ParseDateTimeTest.java | 151 ------- src/test/action/ParserFacadeTest.java | 64 --- src/test/action/ParserTest.java | 448 -------------------- src/test/storage/FileAccessTest.java | 94 ----- src/test/task/TaskDeadlineTest.java | 100 ----- src/test/task/TaskEventTest.java | 136 ------ src/test/task/TaskListTest.java | 286 ------------- src/test/task/TaskTest.java | 80 ---- src/test/task/TaskToDosTest.java | 21 - src/test/task/TaskTypeTest.java | 34 -- src/test/ui/MessageTest.java | 458 --------------------- src/test/ui/UiTest.java | 45 -- 23 files changed, 124 insertions(+), 1945 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.buildship.core.prefs create mode 100644 src/java/task/TaskPriority.java delete mode 100644 src/test/DukeTest.java delete mode 100644 src/test/action/ParseDateTimeTest.java delete mode 100644 src/test/action/ParserFacadeTest.java delete mode 100644 src/test/action/ParserTest.java delete mode 100644 src/test/storage/FileAccessTest.java delete mode 100644 src/test/task/TaskDeadlineTest.java delete mode 100644 src/test/task/TaskEventTest.java delete mode 100644 src/test/task/TaskListTest.java delete mode 100644 src/test/task/TaskTest.java delete mode 100644 src/test/task/TaskToDosTest.java delete mode 100644 src/test/task/TaskTypeTest.java delete mode 100644 src/test/ui/MessageTest.java delete mode 100644 src/test/ui/UiTest.java diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..225833aa --- /dev/null +++ b/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..593d9d82 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + Duke + Project Duke created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + 1635828326582 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..9233ccf5 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=C\:/Program Files/Java/jdk-11.0.2 +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/src/java/Duke.java b/src/java/Duke.java index 611f4ecc..f10b5c58 100644 --- a/src/java/Duke.java +++ b/src/java/Duke.java @@ -5,9 +5,9 @@ /** * Begin the program here. * - * @author Kang Teng + * @author Kang Teng * @version 8.0 - * @since 2021-09-01 + * @since 2021-09-01 */ public class Duke { diff --git a/src/java/action/ParseDateTime.java b/src/java/action/ParseDateTime.java index 1c2ec74e..86dbe10f 100644 --- a/src/java/action/ParseDateTime.java +++ b/src/java/action/ParseDateTime.java @@ -90,7 +90,7 @@ public static String[] splitDateAndTime(String dateAndTime) { /** * Check if the string contains date and time - * + *

* return 1 if the string contains only string representation of a Date * return 2 if the string contains string representation of a Date and a Time * return 3 if the string contains string representation of a Date and 2 Time diff --git a/src/java/action/Parser.java b/src/java/action/Parser.java index 25c1240b..8072cd0e 100644 --- a/src/java/action/Parser.java +++ b/src/java/action/Parser.java @@ -92,6 +92,8 @@ public boolean toReadUserCommand(TaskList myList, String line) { if (line.equals("list")) { showFullList(myList); + } else if (line.substring(0, 3).equals("set")) { + toModifyTask(myList, line); } else if (line.substring(0, 4).equals("done")) { toMarkTaskDone(myList, line); } else if (line.substring(0, 4).equals("todo")) { @@ -143,6 +145,19 @@ private void showFullList(TaskList myList) { ui.msgList(myList); } + /** + * Show a list of Modify Function + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toModifyTask(TaskList myList, String line) { + ui.msgAskUserSetTaskPriority(); + Scanner in = new Scanner(System.in); + String taskNumber = in.nextLine(); + + } + /** * Mark a task as done * diff --git a/src/java/task/Task.java b/src/java/task/Task.java index d3944381..e6088fd7 100644 --- a/src/java/task/Task.java +++ b/src/java/task/Task.java @@ -15,6 +15,7 @@ public abstract class Task { protected String taskDetail; protected boolean isDone; protected TaskType taskType; + protected TaskPriority taskPriority; public Task(String taskDetail) { this.taskDetail = taskDetail; diff --git a/src/java/task/TaskPriority.java b/src/java/task/TaskPriority.java new file mode 100644 index 00000000..880b3ab1 --- /dev/null +++ b/src/java/task/TaskPriority.java @@ -0,0 +1,36 @@ +package java.task; + +public enum TaskPriority { + HIGH, MEDIUM, LOW; + + /** + * Compare two tasks and return true if taskA has higher priority than taskB + * + * @param taskA First Task to compare + * @param taskB Second Task to compare + * @return boolean true if taskA > taskB; false if otherwise + */ + public static boolean isHigherPriority(TaskPriority taskA, TaskPriority taskB) { + int taskAPriority = convertPriorityToInt(taskA); + int taskBPriority = convertPriorityToInt(taskB); + + if (taskAPriority > taskBPriority) { + return true; + } + return false; + } + + private static int convertPriorityToInt(TaskPriority task) { + switch (task) { + case LOW: + return 3; + case MEDIUM: + return 2; + case HIGH: + return 1; + default: + return 0; + } + } + +} diff --git a/src/java/ui/Message.java b/src/java/ui/Message.java index bf9c0080..5988b8c4 100644 --- a/src/java/ui/Message.java +++ b/src/java/ui/Message.java @@ -200,6 +200,15 @@ public void msgSLoad() { System.out.println("_________________________________"); } + // Set Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message to ask user which task they want to set priority + */ + public void msgAskUserSetTaskPriority() { + System.out.println(" Which task do you want to set priority?"); + } + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** diff --git a/src/java/ui/Ui.java b/src/java/ui/Ui.java index 0ab6df98..3c23439f 100644 --- a/src/java/ui/Ui.java +++ b/src/java/ui/Ui.java @@ -26,6 +26,7 @@ public interface Ui { void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); void msgSave(); void msgSLoad(); + void msgAskUserSetTaskPriority(); void msgMarkDone(TaskList myList, int taskNumber); void msgList(TaskList myList); void msgBlankBeforeTaskDetail(); diff --git a/src/test/DukeTest.java b/src/test/DukeTest.java deleted file mode 100644 index 611f4ecc..00000000 --- a/src/test/DukeTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package java; - -import java.action.ParserFacade; - -/** - * Begin the program here. - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ -public class Duke { - - /** - * Starting point of the program - */ - public static void main(String[] args) { - - ParserFacade parserFacade = new ParserFacade(); - - parserFacade.startDuke(); - parserFacade.runDuke(); - parserFacade.endDuke(); - } -} diff --git a/src/test/action/ParseDateTimeTest.java b/src/test/action/ParseDateTimeTest.java deleted file mode 100644 index 9341a784..00000000 --- a/src/test/action/ParseDateTimeTest.java +++ /dev/null @@ -1,151 +0,0 @@ -package test.action; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.DateTimeParseException; -import java.ui.Message; -import java.ui.Ui; -import java.util.Locale; - -/** - * Handle date and time related functions - *

- * Conversion between String and LocalDate/LocalTime - * String manipulation - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class ParseDateTime { - - private static Ui ui = new Message(); - - /** - * Convert date from String to LocalDate - * - * @param date TaskDate of the task - * @return LocalDate - * @throws DateTimeParseException If format of the date is not accepted - */ - public static LocalDate toDate(String date) { - - LocalDate formattedDate; - DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder() - .parseCaseInsensitive() - .parseLenient() - .appendPattern("[yyyy-MM-dd]") - .appendPattern("[M-d-yyyy]") - .appendPattern("[M-dd-yyyy]") - .appendPattern("[MM-d-yyyy]") - .appendPattern("[MM-dd-yyyy]") - .appendPattern("[M/d/yyyy]") - .appendPattern("[M/dd/yyyy]") - .appendPattern("[MM/d/yyyy]") - .appendPattern("[MM/dd/yyyy]") - .appendPattern("[d-M-yyyy]") - .appendPattern("[d-MM-yyyy]") - .appendPattern("[dd-M-yyyy]") - .appendPattern("[dd-MM-yyyy]") - .appendPattern("[d/M/yyyy]") - .appendPattern("[d/MM/yyyy]") - .appendPattern("[dd/M/yyyy]") - .appendPattern("[dd/MM/yyyy]") - .appendPattern("[MMM dd yyyy]"); - - DateTimeFormatter formatter = builder.toFormatter(Locale.ENGLISH); - - try { - formattedDate = LocalDate.parse(date, formatter); - return formattedDate; - } catch (DateTimeParseException e) { - throw e; - } - } - - /** - * Convert time from String to LocalTime - * - * @param time TaskDate of the task - * @return LocalTime - * @throws DateTimeParseException If format of the date is not accepted - */ - public static LocalTime toTime(String time) { - LocalTime localTime = LocalTime.parse(time); - return localTime; - } - - /** - * Split Date and Time by empty space " " - * - * @param dateAndTime String that contains both date and time - * @return String[] - */ - public static String[] splitDateAndTime(String dateAndTime) { - return dateAndTime.split(" "); - } - - /** - * Check if the string contains date and time - * - * return 1 if the string contains only string representation of a Date - * return 2 if the string contains string representation of a Date and a Time - * return 3 if the string contains string representation of a Date and 2 Time - * - * @param dateAndTime string representation of date and time - * @return int 1 or 2 or 3 - */ - public static int isDateAndTime(String dateAndTime) { - String[] split = dateAndTime.split(" "); - if (split.length == 1) { - return 1; - } else if (split.length == 2) { - return 2; - } else { - return 3; - } - } - - /** - * Extract string representation of date from string array - * - * @param split string array of date and time - * @return String Date - */ - public static String toExtractDateFromSplitDateAndTime(String[] split) { - return split[0]; - } - - /** - * Extract string representation of time from string array - * - * @param split string array of date and time - * @return String Time - */ - public static String toExtracTimeFromSplitDateAndTime(String[] split) { - return split[1]; - } - - /** - * Extract string representation of start time from string array - * - * @param split string array of date and time - * @return String TimeStart - */ - public static String toExtracTimeStartFromSplitDateAndTime(String[] split) { - return split[1]; - } - - /** - * Extract string representation of end time from string array - * - * @param split string array of date and time - * @return String TimeEnd - */ - public static String toExtracTimeEndFromSplitDateAndTime(String[] split) { - return split[2]; - } -} diff --git a/src/test/action/ParserFacadeTest.java b/src/test/action/ParserFacadeTest.java deleted file mode 100644 index 76467834..00000000 --- a/src/test/action/ParserFacadeTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package test.action; - -import java.storage.FileAccess; - -/** - * Create an instance of Duke Program - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ -public class ParserFacade { - - private FileAccess fileAccess; - private Parser parser; - - /** - * Constructor - */ - public ParserFacade() { - fileAccess = new FileAccess(); - parser = new Parser(fileAccess); - } - - /** - * Initialize the Duke Program. - */ - public void startDuke() { - parser.showGreetMessage(); - } - - - /** - * Run the Duke Program - */ - public void runDuke() { - parser.onCreateDuke(); - } - - /** - * End the Duke Program - */ - public void endDuke() { - parser.showByeMessage(); - } - - /** - * Return a FileAccess object - * - * @return FileAccess - */ - public FileAccess getFileAccess() { - return fileAccess; - } - - /** - * Return a Parser object - * - * @return Parser - */ - public Parser getDukeObject() { - return parser; - } -} diff --git a/src/test/action/ParserTest.java b/src/test/action/ParserTest.java deleted file mode 100644 index 180cdc64..00000000 --- a/src/test/action/ParserTest.java +++ /dev/null @@ -1,448 +0,0 @@ -package test.action; - -import java.io.IOException; -import java.storage.FileAccess; -import java.task.TaskList; -import java.task.TaskType; -import java.time.LocalDate; -import java.time.LocalTime; -import java.ui.Message; -import java.ui.Ui; -import java.util.Scanner; - -/** - * Main logic of the Duke Program - * Handles the sequence of program flow - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class Parser { - - private FileAccess fileAccess; - private Ui ui; - - /** - * Constructor - */ - public Parser(FileAccess fileAccess) { - this.fileAccess = fileAccess; - ui = new Message(); - } - - // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the opening Greet Message in System.out.println - */ - public void showGreetMessage() { - ui.msgGreet(); - } - - // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Create main sequence of the Duke program - * This section iterate until "bye" is called - *

- * Current Supported Duke Command List: - * - list - * - done - * - todo - * - save - * - load - * - event - * - delete - * - deadline - */ - public void onCreateDuke() { - boolean isDukeRunning = true; - String line; - Scanner in = new Scanner(System.in); - TaskList myList = new TaskList(); - while (isDukeRunning) { - line = in.nextLine(); - isDukeRunning = toReadUserCommand(myList, line); - } - in.close(); - } - - /** - * Read a single user input and respond accordingly - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - * @return boolean Return false if user type Bye, else return true - */ - public boolean toReadUserCommand(TaskList myList, String line) { - try { - // Guard Condition - if (line.equals("bye")) { - return false; - } - - // for testing new function - if (line.equals("tf")) { - System.out.println("XXXXX Test Function XXXXX"); - fileAccess.deleteProgressFile(); - System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); - } - - if (line.equals("list")) { - showFullList(myList); - } else if (line.substring(0, 4).equals("done")) { - toMarkTaskDone(myList, line); - } else if (line.substring(0, 4).equals("todo")) { - toAddTaskToDo(myList, line); - } else if (line.substring(0, 4).equals("save")) { - toSaveTask(myList); - } else if (line.substring(0, 4).equals("load")) { - // loadTask(myList); - } else if (line.substring(0, 5).equals("event")) { - toAddTaskEvent(myList, line); - } else if (line.substring(0, 6).equals("delete")) { - toDeleteTask(myList, line); - } else if (line.substring(0, 8).equals("deadline")) { - toAddTaskDeadline(myList, line); - } else { - ui.msgInvalidInput(); - } - return true; - } catch (Exception e) { - ui.msgInvalidInput(); - ui.msgError(e); - return true; - } - } - - // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the Bye Message - *

- * called when Duke program ends - */ - public void showByeMessage() { - try { - ui.msgBye(); - } catch (IOException error) { - ui.msgError(error); - } - } - - // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show full list of tasks - * - * @param myList TaskList that contains the list of task - */ - private void showFullList(TaskList myList) { - ui.msgList(myList); - } - - /** - * Mark a task as done - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toMarkTaskDone(TaskList myList, String line) { - int taskNumber = Integer.parseInt(line.substring(5)); - myList.setTaskDone(taskNumber - 1); - ui.msgMarkDone(myList, taskNumber - 1); - } - - /** - * Add a task of ToDo type into the list of task - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskToDo(TaskList myList, String line) { - if (line.length() <= 5) { - ui.msgInvalidInputMissingDescription(); - } else { - myList.addItemToDos(line.substring(5)); - ui.msgAssignTask(myList, myList.getNumOfItem() - 1); - } - } - - /** - * Save the current task list and output a text file - * - * @param myList TaskList that contains the list of task - */ - private void toSaveTask(TaskList myList) { - String listOfTaskString = toReadTaskConvertToString(myList); - fileAccess.saveProgressIntoFile(myList, listOfTaskString); - } - - /** - * Add a task of Event type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskEvent(TaskList myList, String line) { - - if (line.length() <= 6) { - ui.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/at")) { - ui.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(6, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String timeStart; - String timeEnd; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskEvent_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); - } else { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); - } - - } catch (Exception e) { - ui.msgInvalidInputWrongDateTimeStartEndFormat(); - } - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - */ - private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - ui.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate); - ui.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - - if (taskDate == null) { - ui.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null) { - ui.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - ui.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - * @param timeEnd String that represents the end time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart, String timeEnd) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); - - if (taskDate == null) { - ui.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null || taskTimeEnd == null) { - ui.msgInvalidInputWrongDateTimeFormat(); - return; - } - - if (taskTimeStart.isAfter(taskTimeEnd)) { - ui.msgInvalidInputTimeStartLaterThanTimeEnd(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - ui.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); - } - - /** - * Delete a task from the user task - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toDeleteTask(TaskList myList, String line) { - try { - int taskNumber = Integer.parseInt(line.substring(7)); - ui.msgRemoveItem(myList, taskNumber - 1); - myList.removeItem(taskNumber - 1); - } catch (Exception e) { - ui.msgWrongTaskNumber(); - } - } - - /** - * Add a task of Deadline type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toAddTaskDeadline(TaskList myList, String line) { - - if (line.length() <= 9) { - ui.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/by")) { - ui.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(9, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String time; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskDeadline_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); - toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); - } else { - ui.msgInvalidInputWrongDateTimeFormat(); - } - - } catch (Exception e) { - ui.msgInvalidInputWrongDateTimeFormat(); - } - } - - /** - * Add a task of Deadline type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - */ - private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - ui.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate); - ui.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - * @param time String that represents the time of the deadline - */ - private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, - String date, String time) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTime = ParseDateTime.toTime(time); - - if (taskDate == null) { - ui.msgInvalidInputMissingDay(); - return; - } - - if (taskTime == null) { - ui.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate, taskTime); - ui.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); - } - - - // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Read a list of task and convert it into string - * - * @param myList TaskList that contains the list of task - */ - private String toReadTaskConvertToString(TaskList myList) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - boolean isDone = myList.getTaskDoneStatus(i); - String isDoneString = (isDone ? "1" : "0"); - String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); - - sb.append(taskType).append("|"); - sb.append(isDoneString).append("|"); - sb.append(taskDetail).append("|\n"); - } - return sb.toString(); - } - - -} - - - diff --git a/src/test/storage/FileAccessTest.java b/src/test/storage/FileAccessTest.java deleted file mode 100644 index c8015a32..00000000 --- a/src/test/storage/FileAccessTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package test.storage; - -import java.io.File; -import java.io.FileWriter; -import java.task.TaskList; -import java.ui.Message; -import java.ui.Ui; -import java.util.Scanner; - -/** - * Handles file handling related functions - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class FileAccess { - private String filepath; - private File progressFile; - private Ui ui; - - /** - * Constructor - */ - public FileAccess() { - filepath = "src\\resources\\progress.txt"; - progressFile = new File(filepath); - ui = new Message(); - } - - /** - * Save progress of the current task - * - * @param myList TaskList that needs to be output - * @param stringToBeWritten String that needs to be outputed - */ - public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { - - try { - FileWriter fw = new FileWriter(filepath); - fw.write(stringToBeWritten); - fw.close(); - ui.msgSave(); - } catch (Exception e) { - ui.msgError(e); - } - } - - /** - * Load existing progress of the task - * - * @return String that represents a list of task details - */ - public String loadProgressFromFile() { - StringBuilder sb = new StringBuilder(); - - try { - Scanner scanner = new Scanner(progressFile); - while (scanner.hasNext()) { - sb.append(scanner.nextLine()); - } - - } catch (Exception e) { - ui.msgError(e); - } - - return sb.toString(); - } - - /** - * Delete an existing progress file - *

- * todo Method to be completed - */ - public void deleteProgressFile() { - - } - - /** - * Example of Save file - */ - public void saveFileExample() { - String filepath = "src\\resources\\myText.txt"; - try { - FileWriter fw = new FileWriter(filepath); - fw.write("helloWold"); - fw.close(); - ui.msgSave(); - } catch (Exception e) { - ui.msgError(e); - } - } -} diff --git a/src/test/task/TaskDeadlineTest.java b/src/test/task/TaskDeadlineTest.java deleted file mode 100644 index 89cc90a6..00000000 --- a/src/test/task/TaskDeadlineTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package test.task; - -import java.time.LocalDate; -import java.time.LocalTime; - -/** - * Create an instance of deadline class - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ -public class TaskDeadline extends Task { - private LocalDate taskDate; - private LocalTime taskTime; - - /** - * Constructor - */ - public TaskDeadline(String taskDetail, LocalDate taskDate) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.DEADLINE; - this.taskDate = taskDate; - } - - /** - * Constructor - */ - public TaskDeadline(String taskDetail, LocalDate taskDate, LocalTime localTime) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.DEADLINE; - this.taskDate = taskDate; - this.taskTime = localTime; - } - - /** - * Return LocalDate of a task - * - * @return LocalDate that represents the taskDate - */ - public LocalDate getLocalDate() { - return taskDate; - } - - /** - * Return LocalDate of a task in String - * - * @return String that represents the taskDate - */ - public String getLocalDateToString() { - return String.valueOf(taskDate); - } - - /** - * Return day from LocalDate of a task in String - * - * @return String that represents the day of taskDate - */ - public String getLocalDateDayToString() { - return String.valueOf(taskDate.getDayOfMonth()); - } - - /** - * Return month from LocalDate of a task in String - * - * @return String that represents the month of taskDate - */ - public String getLocalDateMonthToString() { - return String.valueOf(taskDate.getMonth()); - } - - /** - * Return year from LocalDate of a task in String - * - * @return String that represents the year of taskDate - */ - public String getLocalDateYearToString() { - return String.valueOf(taskDate.getYear()); - } - - /** - * Return LocalTime of a task - * - * @return LocalTime that represents the taskTime - */ - public LocalTime getLocalTime() { - return taskTime; - } - - /** - * Return LocalTime of a task in String - * - * @return String that represents the taskTime - */ - public String getLocalTime_toString() { - return String.valueOf(taskTime); - } -} diff --git a/src/test/task/TaskEventTest.java b/src/test/task/TaskEventTest.java deleted file mode 100644 index 31871faf..00000000 --- a/src/test/task/TaskEventTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package test.task; - -import java.time.LocalDate; -import java.time.LocalTime; - -/** - * Create an instance of event class - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class TaskEvent extends Task { - - private LocalDate taskDate; - private LocalTime taskTimeStart; - private LocalTime taskTimeEnd; - - /** - * Constructor - */ - public TaskEvent(String taskDetail, LocalDate taskDate) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.EVENT; - this.taskDate = taskDate; - } - - /** - * Constructor - */ - public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.EVENT; - this.taskDate = taskDate; - this.taskTimeStart = taskTimeStart; - } - - /** - * Constructor - */ - public TaskEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.EVENT; - this.taskDate = taskDate; - this.taskTimeStart = taskTimeStart; - this.taskTimeEnd = taskTimeEnd; - } - - /** - * Return LocalDate of a task - * - * @return LocalDate that represents the taskDate - */ - public LocalDate getLocalDate() { - return taskDate; - } - - /** - * Return LocalDate of a task in String - * - * @return String that represents the taskDate - */ - public String getLocalDate_toString() { - return String.valueOf(taskDate); - } - - /** - * Return day from LocalDate of a task in String - * - * @return String that represents the day of taskDate - */ - public String getLocalDateDayToString() { - return String.valueOf(taskDate.getDayOfMonth()); - } - - /** - * Return month from LocalDate of a task in String - * - * @return String that represents the month of taskDate - */ - public String getLocalDateMonthToString() { - return String.valueOf(taskDate.getMonth()); - } - - /** - * Return year from LocalDate of a task in String - * - * @return String that represents the year of taskDate - */ - public String getLocalDateYearToString() { - return String.valueOf(taskDate.getYear()); - } - - /** - * Return start time of LocalTime of a task - * - * @return LocalTime that represents the start time of taskTime - */ - public LocalTime getLocalTimeStart() { - return taskTimeStart; - } - - /** - * Return end time of LocalTime of a task - * - * @return LocalTime that represents the end time of taskTime - */ - public LocalTime getLocalTimeEnd() { - return taskTimeEnd; - } - - /** - * Return start time of LocalTime of a task in String - * - * @return String that represents the start time of taskTime - */ - public String getLocalTimeStart_toString() { - return String.valueOf(taskTimeStart); - } - - /** - * Return end time of LocalTime of a task in String - * - * @return String that represents the start time of taskTime - */ - public String getLocalTimeEnd_toString() { - return String.valueOf(taskTimeEnd); - } -} - - - diff --git a/src/test/task/TaskListTest.java b/src/test/task/TaskListTest.java deleted file mode 100644 index 9eaf4cca..00000000 --- a/src/test/task/TaskListTest.java +++ /dev/null @@ -1,286 +0,0 @@ -package test.task; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.List; - -/** - * Create an instance of list of task - *

- * Create task object - * Manipulate task object creation, modification and deletion - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class TaskList { - private List list; - - // Initialize & Add Item & Remove Item <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - public TaskList() { - list = new ArrayList(); - } - - /** - * Add a task of type ToDo - * - * @param taskDetail String that represents the task detail - */ - public void addItemToDos(String taskDetail) { - list.add(new TaskToDos(taskDetail)); - } - - /** - * Add a task of type Deadline - * - * @param taskDetail String that represents the task detail - * @param taskDate LocalDate that represents the task date - */ - public void addItemDeadline(String taskDetail, LocalDate taskDate) { - list.add(new TaskDeadline(taskDetail, taskDate)); - } - - /** - * Add a task of type Deadline - * - * @param taskDetail String that represents the task detail - * @param taskDate LocalDate that represents the task date - * @param taskTime LocalTime that represents the task time - */ - public void addItemDeadline(String taskDetail, LocalDate taskDate, LocalTime taskTime) { - list.add(new TaskDeadline(taskDetail, taskDate, taskTime)); - } - - /** - * Add a task of type Event - * - * @param taskDetail String that represents the task detail - * @param taskDate LocalDate that represents the task date - */ - public void addItemEvent(String taskDetail, LocalDate taskDate) { - list.add(new TaskEvent(taskDetail, taskDate)); - } - - /** - * Add a task of type Event - * - * @param taskDetail String that represents the task detail - * @param taskDate LocalDate that represents the task date - * @param taskTimeStart LocalTime that represents the task start time - */ - public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart) { - list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart)); - } - - /** - * Add a task of type Event - * - * @param taskDetail String that represents the task detail - * @param taskDate LocalDate that represents the task date - * @param taskTimeStart LocalTime that represents the task start time - * @param taskTimeEnd LocalTime that represents the task end time - */ - public void addItemEvent(String taskDetail, LocalDate taskDate, LocalTime taskTimeStart, LocalTime taskTimeEnd) { - list.add(new TaskEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd)); - } - - /** - * Delete a task from tasklist - * - * @param index Int that represents the index in a task list - */ - public void removeItem(int index) { - list.remove(index); - } - - // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Return a task from tasklist - * - * @param index Int that represents the index in a task list - * @return Task at the index - */ - public Task getTask(int index) { - return list.get(index); - } - - /** - * Return a task detail from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the task detail - */ - public String getTaskDetail(int index) { - Task task = list.get(index); - return task.getTaskDetail(); - } - - /** - * Return a boolean done status from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return boolean that represents the task done status - */ - public boolean getTaskDoneStatus(int index) { - Task task = list.get(index); - return task.getDoneStatus(); - } - - /** - * Return a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the task date - */ - public String getTaskEventTaskDateInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDate_toString(); - } - - /** - * Return year from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the year from taskDate - */ - public String getTaskEventTaskDateYearInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDateYearToString(); - } - - /** - * Return month from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the month from taskDate - */ - public String getTaskEventTaskDateMonthInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDateMonthToString(); - } - - /** - * Return day from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the day from taskDate - */ - public String getTaskEventTaskDateDayInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalDateDayToString(); - } - - /** - * Return start time in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the start time from TaskTime - */ - public String getTaskEventTaskTimeStartInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalTimeStart_toString(); - } - - /** - * Return end time in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the end time from TaskTime - */ - public String getTaskEventTaskTimeEndInString(int index) { - TaskEvent task = (TaskEvent) list.get(index); - return task.getLocalTimeEnd_toString(); - } - - /** - * Return a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the task date - */ - public String getTaskDeadLineTaskDateInString(int index) { - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDateToString(); - } - - /** - * Return year from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the year from TaskDate - */ - public String getTaskDeadLineTaskDateYearInString(int index) { - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDateYearToString(); - } - - /** - * Return month from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the month from TaskDate - */ - public String getTaskDeadLineTaskDateMonthInString(int index) { - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDateMonthToString(); - } - - /** - * Return day from a taskDate in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the day from TaskDate - */ - public String getTaskDeadLineTaskDateDayInString(int index) { - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalDateDayToString(); - } - - /** - * Return TaskTime in String from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return String that represents the TaskTime - */ - public String getTaskDeadLineTaskTimeInString(int index) { - TaskDeadline task = (TaskDeadline) list.get(index); - return task.getLocalTime_toString(); - } - - /** - * Return the number of item in a tasklist - * - * @return Int that represents the number of item in a tasklist - */ - public int getNumOfItem() { - return list.size(); - } - - /** - * Return TaskType from a task of tasklist - * - * @param index Int that represents the index in a task list - * @return TaskType that represents the type of task - */ - public TaskType getTaskType(int index) { - Task task = list.get(index); - return task.getTaskType(); - } - - // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Return TaskType from a task of tasklist - * - * @param index Int that represents the index in a task list - */ - public void setTaskDone(int index) { - Task task = list.get(index); - task.setTaskCompleted(); - } -} diff --git a/src/test/task/TaskTest.java b/src/test/task/TaskTest.java deleted file mode 100644 index e46d4f9d..00000000 --- a/src/test/task/TaskTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package test.task; - -/** - * Abstract class for Task - *

- * A task object correspond to a single task object. - * The class object can be of the type todo, event, or deadline. - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public abstract class Task { - protected String taskDetail; - protected boolean isDone; - protected TaskType taskType; - - public Task(String taskDetail) { - this.taskDetail = taskDetail; - } - - // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Return the task detail - * - * @return String that represents the task detail - */ - public String getTaskDetail() { - return taskDetail; - } - - /** - * Return the boolean done status that represents if a task is done - * - * @return boolean that represents the done status of a task - */ - public boolean getDoneStatus() { - return isDone; - } - - /** - * Return the TaskType - * - * @return TaskType that represents the type of task - */ - public TaskType getTaskType() { - return taskType; - } - - // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Modified the task detail - * - * @param modifiedTaskDetail String that represent the new task detail - */ - public void setTask(String modifiedTaskDetail) { - taskDetail = modifiedTaskDetail; - } - - /** - * Set the task as completed - * Change the done status to completed - */ - public void setTaskCompleted() { - isDone = true; - } - - /** - * Modified the type of the task - * - * @param taskType String that represent the new task type - */ - public void setTypeOfTask(TaskType taskType) { - this.taskType = taskType; - } - -} diff --git a/src/test/task/TaskToDosTest.java b/src/test/task/TaskToDosTest.java deleted file mode 100644 index bbfc5dc2..00000000 --- a/src/test/task/TaskToDosTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package test.task; - -/** - * Create an instance of todo class - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class TaskToDos extends Task { - - /** - * Constructor - */ - public TaskToDos(String taskDetail) { - super(taskDetail); - this.isDone = false; - this.taskType = TaskType.TODOS; - } -} diff --git a/src/test/task/TaskTypeTest.java b/src/test/task/TaskTypeTest.java deleted file mode 100644 index 0020b0a0..00000000 --- a/src/test/task/TaskTypeTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package test.task; - -/** - * Define task type - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public enum TaskType { - TODOS, DEADLINE, EVENT; - - /** - * Constructor - */ - public static String taskTypeToString(TaskType taskType) { - String s = ""; - switch (taskType) { - case TODOS: - s = "T"; - break; - case DEADLINE: - s = "D"; - break; - case EVENT: - s = "E"; - break; - default: - throw new IllegalStateException("Unexpected value: " + taskType); - } - return s; - } -} diff --git a/src/test/ui/MessageTest.java b/src/test/ui/MessageTest.java deleted file mode 100644 index 560a068f..00000000 --- a/src/test/ui/MessageTest.java +++ /dev/null @@ -1,458 +0,0 @@ -package test.ui; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.task.TaskList; -import java.task.TaskType; - -/** - * Handle all the message methods - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class Message implements Ui { - - // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - @Override - public void msgGreet() { - String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); - System.out.println("_________________________________"); - } - - // Assignment Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Display message when a task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTask(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message when a deadline task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message when a deadline task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); - String timeString = myList.getTaskDeadLineTaskTimeInString(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " - + taskDetail + "(by: " + dateString + " " + timeString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message when an event task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message when an event task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); - String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" (at: " + dateString + ", from: " + timeStartString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message when an event task is assigned - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); - String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); - String timeEndString = myList.getTaskEventTaskTimeEndInString(taskNumber); - - System.out.println(" Got it. I've added this task: "); - System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" (at: " + dateString + ", from: " + timeStartString + " to " + timeEndString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - // FileAccess Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Display message when task is saved - */ - public void msgSave() { - System.out.println(" Progress Saved!"); - System.out.println("_________________________________"); - } - - /** - * Display message when task is loaded - */ - public void msgSLoad() { - System.out.println(" Progress loaded!"); - System.out.println("_________________________________"); - } - - // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Display message when a task is marked as done - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgMarkDone(TaskList myList, int taskNumber) { - System.out.println(" Naisuuuu! This task is marked as done: "); - msgBlankBeforeTaskDetail(); - msgTaskDetail(myList, taskNumber); - System.out.println("_________________________________"); - } - - /** - * Display message to show the full list of task - * - * @param myList TaskList that contains the list of task - */ - public void msgList(TaskList myList) { - for (int i = 0; i < myList.getNumOfItem(); i++) { - System.out.print(" " + Integer.toString(i + 1) + "."); - msgTaskDetail(myList, i); - } - System.out.println("_________________________________"); - } - - /** - * Display blanks - */ - public void msgBlankBeforeTaskDetail() { - System.out.print(" "); - } - - /** - * Display detail of a task - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public void msgTaskDetail(TaskList myList, int taskNumber) { - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateTimeString = ""; - String year = ""; - String month = ""; - String day = ""; - String time = ""; - String timeStart = ""; - String timeEnd = ""; - - switch (taskType) { - case TODOS: - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - break; - case DEADLINE: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskDeadLineTaskDateYearInString(taskNumber); - month = myList.getTaskDeadLineTaskDateMonthInString(taskNumber); - day = myList.getTaskDeadLineTaskDateDayInString(taskNumber); - time = myList.getTaskDeadLineTaskTimeInString(taskNumber); - - if (time.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + " " + time + ")"); - } - break; - case EVENT: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskEventTaskDateYearInString(taskNumber); - month = myList.getTaskEventTaskDateMonthInString(taskNumber); - day = myList.getTaskEventTaskDateDayInString(taskNumber); - timeStart = myList.getTaskEventTaskTimeStartInString(taskNumber); - timeEnd = myList.getTaskEventTaskTimeEndInString(taskNumber); - - if (timeStart.equals("null") && timeEnd.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(at: " + year + " " + month + " " + day + ")"); - } else if (timeEnd.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); - } - break; - default: - break; - } - } - - // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Display message when a task is marked as done - * - * @param e Exception error - */ - public void msgError(Exception e) { - System.out.println("Error Occurs: " + e); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - */ - public void msgInvalidInput() { - System.out.println(" Sorry :( Invalid Input. Try Again ~ "); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Description of the task is missing - */ - public void msgInvalidInputMissingDescription() { - System.out.println(" ☹ OOPS!!! The description cannot be empty."); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Date of the task is missing - */ - public void msgInvalidInputMissingDay() { - System.out.println(" ☹ OOPS!!! The day cannot be empty."); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Time of the task is missing - */ - public void msgInvalidInputMissingTime() { - System.out.println(" ☹ OOPS!!! The time cannot be empty."); - System.out.println("_________________________________"); - } - - /** - * Display message when a task is removed - */ - public void msgRemoveItem(TaskList myList, int taskNumber) { - - System.out.println(" Noted. I've removed this task:"); - msgBlankBeforeTaskDetail(); - msgTaskDetail(myList, taskNumber); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * The task number is not found - */ - public void msgWrongTaskNumber() { - System.out.println(" ☹ OOPS!!! The task number is invalid."); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Format of the date is unaccepted - */ - public void msgInvalidInputWrongDateTimeFormat() { - System.out.println(" ☹ OOPS!!! Please follow this format:"); - System.out.println(" /by yyyy-mm-dd hh:mm"); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Format of the date and time is unaccepted - */ - public void msgInvalidInputWrongDateTimeStartEndFormat() { - System.out.println(" ☹ OOPS!!! Please follow this format:"); - System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); - System.out.println("_________________________________"); - } - - /** - * Display message that remind user about invalid input - * Start time should be before End time - */ - public void msgInvalidInputTimeStartLaterThanTimeEnd() { - System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); - System.out.println("_________________________________"); - } - - // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Display message before the end of program - */ - public void msgBye() throws IOException { - System.out.println("Bye. Hope to see you again soon!"); - System.out.println("_________________________________"); - msgBuddhaProtectMe(); - } - - /** - * Display Buddah.txt - */ - public void msgBuddhaProtectMe() throws IOException { - String everything = ""; - - // ... \Duke\src\main\resources\buddha.txt - // File.separator == " \ " - - String pathRoot = System.getProperty("user.dir"); - // pathRoot = D:\My Files\School Documents\Repository\Duke - - String pathRssFolder = "src" + File.separator + "resources"; - // pathRssFolder = src\main\resources - - String pathFileName = "buddha.txt"; - // pathFileName = buddha.txt - - String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; - // filePath = D:\My Files\School - // Documents\Repository\Duke\src\main\resources\buddha.txt - - try { - FileReader fr = new FileReader(filePath); - // FileReader fr = new FileReader("\\My Files\\School - // Documents\\Repository\\Duke\\src\\main\\resources\\buddha.txt"); - BufferedReader br = new BufferedReader(fr); - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - - while (line != null) { - sb.append(line); - sb.append(System.lineSeparator()); - line = br.readLine(); - } - everything = sb.toString(); - br.close(); - } catch (FileNotFoundException e) { - System.out.println("\n >>> Buddah Protection is not in forced <<<\n"); - System.out.println(e); - } finally { - System.out.println(everything); - } - } -} diff --git a/src/test/ui/UiTest.java b/src/test/ui/UiTest.java deleted file mode 100644 index 0ab6df98..00000000 --- a/src/test/ui/UiTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package java.ui; - -import java.io.IOException; -import java.task.TaskList; - -/** - * Interface class for User Interface - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public interface Ui { - - Message MESSAGE = new Message(); - - // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - void msgGreet(); - void msgAssignTask(TaskList myList, int taskNumber); - void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber); - void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber); - void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber); - void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber); - void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); - void msgSave(); - void msgSLoad(); - void msgMarkDone(TaskList myList, int taskNumber); - void msgList(TaskList myList); - void msgBlankBeforeTaskDetail(); - void msgTaskDetail(TaskList myList, int taskNumber); - void msgError(Exception e); - void msgInvalidInput(); - void msgInvalidInputMissingDescription(); - void msgInvalidInputMissingDay(); - void msgInvalidInputMissingTime(); - void msgInvalidInputWrongDateTimeFormat(); - void msgInvalidInputWrongDateTimeStartEndFormat(); - void msgInvalidInputTimeStartLaterThanTimeEnd(); - void msgRemoveItem(TaskList myList, int taskNumber); - void msgWrongTaskNumber(); - void msgBye() throws IOException; - void msgBuddhaProtectMe() throws IOException; -} From d8a189c76650157f0bd87a033388de1a9c19400d Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:12:00 +0800 Subject: [PATCH 25/39] Restructure Duke project and incooperate gradle properly --- build.gradle | 10 ++---- gradle/wrapper/gradle-wrapper.properties | 2 +- src/{java => main/java/duke}/Duke.java | 4 +-- .../java/duke}/action/ParseDateTime.java | 6 ++-- .../java/duke}/action/Parser.java | 14 ++++---- .../java/duke}/action/ParserFacade.java | 4 +-- .../java/duke}/storage/FileAccess.java | 9 ++--- src/{java => main/java/duke}/task/Task.java | 2 +- .../java/duke}/task/TaskDeadline.java | 2 +- .../java/duke}/task/TaskEvent.java | 2 +- .../java/duke}/task/TaskList.java | 2 +- .../java/duke}/task/TaskPriority.java | 2 +- .../java/duke}/task/TaskToDos.java | 2 +- .../java/duke}/task/TaskType.java | 2 +- src/{java => main/java/duke}/ui/Message.java | 6 ++-- src/{java => main/java/duke}/ui/Ui.java | 4 +-- src/test/java/duke/DukeTest.java | 25 ++++++++++++++ src/test/java/duke/task/TaskTypeTest.java | 34 +++++++++++++++++++ text-ui-test/input.txt | 4 +-- 19 files changed, 96 insertions(+), 40 deletions(-) rename src/{java => main/java/duke}/Duke.java (89%) rename src/{java => main/java/duke}/action/ParseDateTime.java (98%) rename src/{java => main/java/duke}/action/Parser.java (98%) rename src/{java => main/java/duke}/action/ParserFacade.java (94%) rename src/{java => main/java/duke}/storage/FileAccess.java (95%) rename src/{java => main/java/duke}/task/Task.java (98%) rename src/{java => main/java/duke}/task/TaskDeadline.java (99%) rename src/{java => main/java/duke}/task/TaskEvent.java (99%) rename src/{java => main/java/duke}/task/TaskList.java (99%) rename src/{java => main/java/duke}/task/TaskPriority.java (97%) rename src/{java => main/java/duke}/task/TaskToDos.java (94%) rename src/{java => main/java/duke}/task/TaskType.java (96%) rename src/{java => main/java/duke}/ui/Message.java (99%) rename src/{java => main/java/duke}/ui/Ui.java (97%) create mode 100644 src/test/java/duke/DukeTest.java create mode 100644 src/test/java/duke/task/TaskTypeTest.java diff --git a/build.gradle b/build.gradle index a17db885..10e998af 100644 --- a/build.gradle +++ b/build.gradle @@ -12,13 +12,7 @@ repositories { mavenCentral() } -sourceSets { - main { - java { - srcDirs = ['src'] - } - } -} +mainClassName = 'duke.Duke' dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' @@ -42,4 +36,4 @@ checkstyle { toolVersion = '8.29' } -mainClassName = 'src.java.Duke' + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b7c8c5db..be52383e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/java/Duke.java b/src/main/java/duke/Duke.java similarity index 89% rename from src/java/Duke.java rename to src/main/java/duke/Duke.java index f10b5c58..f256f46a 100644 --- a/src/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,6 +1,6 @@ -package java; +package duke; -import java.action.ParserFacade; +import duke.action.ParserFacade; /** * Begin the program here. diff --git a/src/java/action/ParseDateTime.java b/src/main/java/duke/action/ParseDateTime.java similarity index 98% rename from src/java/action/ParseDateTime.java rename to src/main/java/duke/action/ParseDateTime.java index 86dbe10f..d4edfb7e 100644 --- a/src/java/action/ParseDateTime.java +++ b/src/main/java/duke/action/ParseDateTime.java @@ -1,12 +1,12 @@ -package java.action; +package duke.action; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; -import java.ui.Message; -import java.ui.Ui; +import duke.ui.Message; +import duke.ui.Ui; import java.util.Locale; /** diff --git a/src/java/action/Parser.java b/src/main/java/duke/action/Parser.java similarity index 98% rename from src/java/action/Parser.java rename to src/main/java/duke/action/Parser.java index 8072cd0e..71d2fdd3 100644 --- a/src/java/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,13 +1,15 @@ -package java.action; +package duke.action; + +import duke.task.TaskType; +import duke.ui.Message; +import duke.ui.Ui; import java.io.IOException; -import java.storage.FileAccess; -import java.task.TaskList; -import java.task.TaskType; +import duke.storage.FileAccess; +import duke.task.TaskList; + import java.time.LocalDate; import java.time.LocalTime; -import java.ui.Message; -import java.ui.Ui; import java.util.Scanner; /** diff --git a/src/java/action/ParserFacade.java b/src/main/java/duke/action/ParserFacade.java similarity index 94% rename from src/java/action/ParserFacade.java rename to src/main/java/duke/action/ParserFacade.java index e94154b9..da593d68 100644 --- a/src/java/action/ParserFacade.java +++ b/src/main/java/duke/action/ParserFacade.java @@ -1,6 +1,6 @@ -package java.action; +package duke.action; -import java.storage.FileAccess; +import duke.storage.FileAccess; /** * Create an instance of Duke Program diff --git a/src/java/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java similarity index 95% rename from src/java/storage/FileAccess.java rename to src/main/java/duke/storage/FileAccess.java index 96dfb7f5..d40a5f0a 100644 --- a/src/java/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -1,10 +1,11 @@ -package java.storage; +package duke.storage; + +import duke.task.TaskList; +import duke.ui.Message; +import duke.ui.Ui; import java.io.File; import java.io.FileWriter; -import java.task.TaskList; -import java.ui.Message; -import java.ui.Ui; import java.util.Scanner; /** diff --git a/src/java/task/Task.java b/src/main/java/duke/task/Task.java similarity index 98% rename from src/java/task/Task.java rename to src/main/java/duke/task/Task.java index e6088fd7..37bf97ed 100644 --- a/src/java/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; /** * Abstract class for Task diff --git a/src/java/task/TaskDeadline.java b/src/main/java/duke/task/TaskDeadline.java similarity index 99% rename from src/java/task/TaskDeadline.java rename to src/main/java/duke/task/TaskDeadline.java index 1cbefffd..b31c105c 100644 --- a/src/java/task/TaskDeadline.java +++ b/src/main/java/duke/task/TaskDeadline.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; import java.time.LocalDate; import java.time.LocalTime; diff --git a/src/java/task/TaskEvent.java b/src/main/java/duke/task/TaskEvent.java similarity index 99% rename from src/java/task/TaskEvent.java rename to src/main/java/duke/task/TaskEvent.java index f5c1a1dd..8cc42c77 100644 --- a/src/java/task/TaskEvent.java +++ b/src/main/java/duke/task/TaskEvent.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; import java.time.LocalDate; import java.time.LocalTime; diff --git a/src/java/task/TaskList.java b/src/main/java/duke/task/TaskList.java similarity index 99% rename from src/java/task/TaskList.java rename to src/main/java/duke/task/TaskList.java index fdcea5bc..50bc56d6 100644 --- a/src/java/task/TaskList.java +++ b/src/main/java/duke/task/TaskList.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; import java.time.LocalDate; import java.time.LocalTime; diff --git a/src/java/task/TaskPriority.java b/src/main/java/duke/task/TaskPriority.java similarity index 97% rename from src/java/task/TaskPriority.java rename to src/main/java/duke/task/TaskPriority.java index 880b3ab1..79c5f780 100644 --- a/src/java/task/TaskPriority.java +++ b/src/main/java/duke/task/TaskPriority.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; public enum TaskPriority { HIGH, MEDIUM, LOW; diff --git a/src/java/task/TaskToDos.java b/src/main/java/duke/task/TaskToDos.java similarity index 94% rename from src/java/task/TaskToDos.java rename to src/main/java/duke/task/TaskToDos.java index 9a350d21..a05ba941 100644 --- a/src/java/task/TaskToDos.java +++ b/src/main/java/duke/task/TaskToDos.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; /** * Create an instance of todo class diff --git a/src/java/task/TaskType.java b/src/main/java/duke/task/TaskType.java similarity index 96% rename from src/java/task/TaskType.java rename to src/main/java/duke/task/TaskType.java index 1e2aab20..1b177045 100644 --- a/src/java/task/TaskType.java +++ b/src/main/java/duke/task/TaskType.java @@ -1,4 +1,4 @@ -package java.task; +package duke.task; /** * Define task type diff --git a/src/java/ui/Message.java b/src/main/java/duke/ui/Message.java similarity index 99% rename from src/java/ui/Message.java rename to src/main/java/duke/ui/Message.java index 5988b8c4..c02f5594 100644 --- a/src/java/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -1,12 +1,12 @@ -package java.ui; +package duke.ui; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.task.TaskList; -import java.task.TaskType; +import duke.task.TaskList; +import duke.task.TaskType; /** * Handle all the message methods diff --git a/src/java/ui/Ui.java b/src/main/java/duke/ui/Ui.java similarity index 97% rename from src/java/ui/Ui.java rename to src/main/java/duke/ui/Ui.java index 3c23439f..77a2af54 100644 --- a/src/java/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -1,7 +1,7 @@ -package java.ui; +package duke.ui; import java.io.IOException; -import java.task.TaskList; +import duke.task.TaskList; /** * Interface class for User Interface diff --git a/src/test/java/duke/DukeTest.java b/src/test/java/duke/DukeTest.java new file mode 100644 index 00000000..5f9895d2 --- /dev/null +++ b/src/test/java/duke/DukeTest.java @@ -0,0 +1,25 @@ +package duke; + +import duke.action.ParserFacade; + +/** + * Begin the program here. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class DukeTest { + + /** + * Starting point of the program + */ + public static void main(String[] args) { + + ParserFacade parserFacade = new ParserFacade(); + + parserFacade.startDuke(); + parserFacade.runDuke(); + parserFacade.endDuke(); + } +} diff --git a/src/test/java/duke/task/TaskTypeTest.java b/src/test/java/duke/task/TaskTypeTest.java new file mode 100644 index 00000000..91d146b3 --- /dev/null +++ b/src/test/java/duke/task/TaskTypeTest.java @@ -0,0 +1,34 @@ +package duke.task; + +/** + * Define task type + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public enum TaskTypeTest { + TODOS, DEADLINE, EVENT; + + /** + * Constructor + */ + public static String taskTypeToString(TaskTypeTest taskType) { + String s = ""; + switch (taskType) { + case TODOS: + s = "T"; + break; + case DEADLINE: + s = "D"; + break; + case EVENT: + s = "E"; + break; + default: + throw new IllegalStateException("Unexpected value: " + taskType); + } + return s; + } +} diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 8bb6393b..7aca3cb2 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -17,7 +17,7 @@ deadline return book /by 2016-12-25 18:00 deadline return book /by 2016-12-25 deadline return book event project meeting /at 2016-12-25 -event project meeting /at 2016-12-25 18:00 -event project meeting /at 2016-12-25 18:00 19:00 +eventevent project meeting /at 2016-12-25 18:00 19:00 project meeting /at 2016-12-25 18:00 + event project meeting /at 2016-12-25 19:00 18:00 event project meeting /at 2016-12-25 19:00 19:00 From d96d94c86688852e2fc0ebed92809b055e75af72 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:19:38 +0800 Subject: [PATCH 26/39] Merge debug branch --- src/FutureImporvement.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/FutureImporvement.txt b/src/FutureImporvement.txt index eb4b0eaf..a92d8f62 100644 --- a/src/FutureImporvement.txt +++ b/src/FutureImporvement.txt @@ -3,3 +3,4 @@ Level 8: 2. Stretch goal: Use dates and times in more meaningful ways. e.g., add a command to print deadlines/events occurring on a specific date. 3. save the time and date 4. JUnit Test buggy +5. Read JUnit Basic \ No newline at end of file From d0094fc2093d9897bcaba6f6cf7b9535800fd2a5 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 8 Nov 2021 10:23:18 +0800 Subject: [PATCH 27/39] Duke Level-9-1: Add priority --- src/main/java/duke/action/ParseDateTime.java | 3 +- src/main/java/duke/action/Parser.java | 167 +++++++++++++------ src/main/java/duke/storage/FileAccess.java | 8 +- src/main/java/duke/task/Task.java | 17 ++ src/main/java/duke/task/TaskList.java | 22 +++ src/main/java/duke/task/TaskPriority.java | 81 ++++++++- src/main/java/duke/ui/Message.java | 57 +++++-- src/main/java/duke/ui/Ui.java | 40 ++++- text-ui-test/input.txt | 3 +- 9 files changed, 328 insertions(+), 70 deletions(-) diff --git a/src/main/java/duke/action/ParseDateTime.java b/src/main/java/duke/action/ParseDateTime.java index d4edfb7e..0c893ab1 100644 --- a/src/main/java/duke/action/ParseDateTime.java +++ b/src/main/java/duke/action/ParseDateTime.java @@ -5,9 +5,10 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; +import java.util.Locale; + import duke.ui.Message; import duke.ui.Ui; -import java.util.Locale; /** * Handle date and time related functions diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 71d2fdd3..4e040d2d 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,17 +1,17 @@ package duke.action; -import duke.task.TaskType; -import duke.ui.Message; -import duke.ui.Ui; - import java.io.IOException; -import duke.storage.FileAccess; -import duke.task.TaskList; - import java.time.LocalDate; import java.time.LocalTime; import java.util.Scanner; +import duke.storage.FileAccess; +import duke.task.TaskList; +import duke.task.TaskPriority; +import duke.task.TaskType; +import duke.ui.Message; +import duke.ui.Ui; + /** * Main logic of the Duke Program * Handles the sequence of program flow @@ -24,14 +24,14 @@ public class Parser { private FileAccess fileAccess; - private Ui ui; + private Ui uiMessage; /** * Constructor */ public Parser(FileAccess fileAccess) { this.fileAccess = fileAccess; - ui = new Message(); + uiMessage = new Message(); } // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -40,7 +40,7 @@ public Parser(FileAccess fileAccess) { * Show the opening Greet Message in System.out.println */ public void showGreetMessage() { - ui.msgGreet(); + uiMessage.msgGreet(); } // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -95,7 +95,7 @@ public boolean toReadUserCommand(TaskList myList, String line) { if (line.equals("list")) { showFullList(myList); } else if (line.substring(0, 3).equals("set")) { - toModifyTask(myList, line); + toSetPriorityTask(myList, line); } else if (line.substring(0, 4).equals("done")) { toMarkTaskDone(myList, line); } else if (line.substring(0, 4).equals("todo")) { @@ -111,12 +111,12 @@ public boolean toReadUserCommand(TaskList myList, String line) { } else if (line.substring(0, 8).equals("deadline")) { toAddTaskDeadline(myList, line); } else { - ui.msgInvalidInput(); + uiMessage.msgInvalidInput(); } return true; } catch (Exception e) { - ui.msgInvalidInput(); - ui.msgError(e); + uiMessage.msgInvalidInput(); + uiMessage.msgError(e); return true; } } @@ -130,9 +130,9 @@ public boolean toReadUserCommand(TaskList myList, String line) { */ public void showByeMessage() { try { - ui.msgBye(); + uiMessage.msgBye(); } catch (IOException error) { - ui.msgError(error); + uiMessage.msgError(error); } } @@ -144,20 +144,60 @@ public void showByeMessage() { * @param myList TaskList that contains the list of task */ private void showFullList(TaskList myList) { - ui.msgList(myList); + uiMessage.msgList(myList); } /** - * Show a list of Modify Function + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority * * @param myList TaskList that contains the list of task * @param line String that the user type */ - private void toModifyTask(TaskList myList, String line) { - ui.msgAskUserSetTaskPriority(); - Scanner in = new Scanner(System.in); - String taskNumber = in.nextLine(); + private void toSetPriorityTask(TaskList myList, String line) { + + boolean validTaskNumber = false; + String userInputTaskNumber = ""; + boolean validPriorityNumber = false; + String userInputNewPriorityNumber = ""; + + Scanner in = new Scanner(System.in);; + + while (validTaskNumber == false){ + uiMessage.msgAskUserSetTaskPriority(); + userInputTaskNumber = in.nextLine(); + validTaskNumber = ifValidTaskNumber(myList, userInputTaskNumber); + } + int taskNumber = Integer.parseInt(userInputTaskNumber); + uiMessage.msgDashLines(); + + while (validPriorityNumber == false){ + uiMessage.msgAskUserWhatPriority(); + userInputNewPriorityNumber = in.nextLine(); + validPriorityNumber = ifValidPriorityNumber (userInputNewPriorityNumber); + } + int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); + + TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); + toUpdatePriority(myList, taskNumber - 1, taskPriority); + } + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + * @param taskNumber int that indicates the task number + * @param taskPriority TaskPriority(new one) that want to be set + */ + private void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { + myList.setTaskPriority(taskNumber, taskPriority); + uiMessage.msgSetPriority(myList, taskNumber); // } /** @@ -169,7 +209,7 @@ private void toModifyTask(TaskList myList, String line) { private void toMarkTaskDone(TaskList myList, String line) { int taskNumber = Integer.parseInt(line.substring(5)); myList.setTaskDone(taskNumber - 1); - ui.msgMarkDone(myList, taskNumber - 1); + uiMessage.msgMarkDone(myList, taskNumber - 1); } /** @@ -180,10 +220,10 @@ private void toMarkTaskDone(TaskList myList, String line) { */ private void toAddTaskToDo(TaskList myList, String line) { if (line.length() <= 5) { - ui.msgInvalidInputMissingDescription(); + uiMessage.msgInvalidInputMissingDescription(); } else { myList.addItemToDos(line.substring(5)); - ui.msgAssignTask(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTask(myList, myList.getNumOfItem() - 1); } } @@ -209,12 +249,12 @@ private void toSaveTask(TaskList myList) { private void toAddTaskEvent(TaskList myList, String line) { if (line.length() <= 6) { - ui.msgInvalidInputMissingDescription(); + uiMessage.msgInvalidInputMissingDescription(); return; } if (!line.contains("/at")) { - ui.msgInvalidInputMissingDay(); + uiMessage.msgInvalidInputMissingDay(); return; } @@ -240,7 +280,7 @@ private void toAddTaskEvent(TaskList myList, String line) { } } catch (Exception e) { - ui.msgInvalidInputWrongDateTimeStartEndFormat(); + uiMessage.msgInvalidInputWrongDateTimeStartEndFormat(); } } @@ -256,12 +296,12 @@ private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); return; } myList.addItemEvent(taskDetail, taskDate); - ui.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); } /** @@ -279,17 +319,17 @@ private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDeta LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); if (taskDate == null) { - ui.msgInvalidInputMissingDay(); + uiMessage.msgInvalidInputMissingDay(); return; } if (taskTimeStart == null) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); return; } myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - ui.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); } @@ -310,22 +350,22 @@ private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDeta LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); if (taskDate == null) { - ui.msgInvalidInputMissingDay(); + uiMessage.msgInvalidInputMissingDay(); return; } if (taskTimeStart == null || taskTimeEnd == null) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); return; } if (taskTimeStart.isAfter(taskTimeEnd)) { - ui.msgInvalidInputTimeStartLaterThanTimeEnd(); + uiMessage.msgInvalidInputTimeStartLaterThanTimeEnd(); return; } myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - ui.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); } /** @@ -337,10 +377,10 @@ private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDeta private void toDeleteTask(TaskList myList, String line) { try { int taskNumber = Integer.parseInt(line.substring(7)); - ui.msgRemoveItem(myList, taskNumber - 1); + uiMessage.msgRemoveItem(myList, taskNumber - 1); myList.removeItem(taskNumber - 1); } catch (Exception e) { - ui.msgWrongTaskNumber(); + uiMessage.msgInvalidTaskNumber(); } } @@ -356,12 +396,12 @@ private void toDeleteTask(TaskList myList, String line) { private void toAddTaskDeadline(TaskList myList, String line) { if (line.length() <= 9) { - ui.msgInvalidInputMissingDescription(); + uiMessage.msgInvalidInputMissingDescription(); return; } if (!line.contains("/by")) { - ui.msgInvalidInputMissingDay(); + uiMessage.msgInvalidInputMissingDay(); return; } @@ -380,11 +420,11 @@ private void toAddTaskDeadline(TaskList myList, String line) { time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); } else { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); } } catch (Exception e) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); } } @@ -399,12 +439,12 @@ private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, Str LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); return; } myList.addItemDeadline(taskDetail, taskDate); - ui.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); } /** @@ -422,17 +462,17 @@ private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskD LocalTime taskTime = ParseDateTime.toTime(time); if (taskDate == null) { - ui.msgInvalidInputMissingDay(); + uiMessage.msgInvalidInputMissingDay(); return; } if (taskTime == null) { - ui.msgInvalidInputWrongDateTimeFormat(); + uiMessage.msgInvalidInputWrongDateTimeFormat(); return; } myList.addItemDeadline(taskDetail, taskDate, taskTime); - ui.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); + uiMessage.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); } @@ -458,7 +498,38 @@ private String toReadTaskConvertToString(TaskList myList) { return sb.toString(); } + /** + * Check the validity of task number in String + * + * @param myList TaskList that contains the list of task + * @param userInputString String + * @return boolean True if userInput is a valid task number; False otherwise + */ + private boolean ifValidTaskNumber(TaskList myList, String userInputString){ + try { + int userInputInt = Integer.parseInt(userInputString); + int numOfItem = myList.getNumOfItem(); + if (userInputInt <= numOfItem){ + return true; + } + } catch (Exception e) { + } + uiMessage.msgInvalidTaskNumber(); + return false; + } + + private boolean ifValidPriorityNumber(String userInputNewPriorityString){ + try{ + TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputNewPriorityString); + if (taskPriority == TaskPriority.HIGH || taskPriority == TaskPriority.MEDIUM || taskPriority == TaskPriority.LOW){ + return true; + } + } catch (Exception e){ + } + uiMessage.msgInvalidPriority(); + return false; + } } diff --git a/src/main/java/duke/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java index d40a5f0a..5ae10e3d 100644 --- a/src/main/java/duke/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -1,13 +1,13 @@ package duke.storage; -import duke.task.TaskList; -import duke.ui.Message; -import duke.ui.Ui; - import java.io.File; import java.io.FileWriter; import java.util.Scanner; +import duke.task.TaskList; +import duke.ui.Message; +import duke.ui.Ui; + /** * Handles file handling related functions * diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 37bf97ed..ff97b986 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -17,8 +17,12 @@ public abstract class Task { protected TaskType taskType; protected TaskPriority taskPriority; + /** + * Create an abstract Task object + */ public Task(String taskDetail) { this.taskDetail = taskDetail; + this.taskPriority = TaskPriority.LOW; } // Getter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -50,6 +54,16 @@ public TaskType getTaskType() { return taskType; } + + /** + * Return the TaskPriority + * + * @return TaskPriority that represents the priority of task + */ + public TaskPriority getTaskPriority() { + return taskPriority; + } + // Setter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** @@ -78,4 +92,7 @@ public void setTypeOfTask(TaskType taskType) { this.taskType = taskType; } + public void setPriority(TaskPriority taskPriority) { + this.taskPriority = taskPriority; + } } diff --git a/src/main/java/duke/task/TaskList.java b/src/main/java/duke/task/TaskList.java index 50bc56d6..c47e45b2 100644 --- a/src/main/java/duke/task/TaskList.java +++ b/src/main/java/duke/task/TaskList.java @@ -120,6 +120,17 @@ public String getTaskDetail(int index) { return task.getTaskDetail(); } + /** + * Return a task priority from a task of tasklist + * + * @param index Int that represents the index in a task list + * @return TaskPriority that represents the task priority + */ + public TaskPriority getTaskPriority(int index) { + Task task = list.get(index); + return task.getTaskPriority(); + } + /** * Return a boolean done status from a task of tasklist * @@ -283,4 +294,15 @@ public void setTaskDone(int index) { Task task = list.get(index); task.setTaskCompleted(); } + + /** + * Update the priority of a task in tasklist + * + * @param index Int that represents the index in a task list + * @param taskPriority TaskPriority(new) that will replace the TaskPriority(current) + */ + public void setTaskPriority(int index, TaskPriority taskPriority) { + Task task = list.get(index); + task.setPriority(taskPriority); + } } diff --git a/src/main/java/duke/task/TaskPriority.java b/src/main/java/duke/task/TaskPriority.java index 79c5f780..859e4b9e 100644 --- a/src/main/java/duke/task/TaskPriority.java +++ b/src/main/java/duke/task/TaskPriority.java @@ -1,7 +1,7 @@ package duke.task; public enum TaskPriority { - HIGH, MEDIUM, LOW; + HIGH, MEDIUM, LOW, INVALID; /** * Compare two tasks and return true if taskA has higher priority than taskB @@ -20,7 +20,66 @@ public static boolean isHigherPriority(TaskPriority taskA, TaskPriority taskB) { return false; } - private static int convertPriorityToInt(TaskPriority task) { + /** + * Convert Int value to Priority + * + * 1 -> HIGH + * 2 -> MEDIUM + * 3 -> LOW + * any other number -> INVALID + * + * @param priority Int that indicates the priority + * @return TaskPriority + */ + public static TaskPriority convertIntToPriority(int priority) { + switch (priority) { + case 1: + return HIGH; + case 2: + return MEDIUM; + case 3: + return LOW; + default: + return INVALID; + } + } + + /** + * Convert String value to Priority + * + * "1" -> HIGH + * "2" -> MEDIUM + * "3" -> LOW + * any other number -> INVALID + * + * @param priority String that indicates the priority + * @return TaskPriority + */ + public static TaskPriority convertStringToPriority(String priority) { + switch (priority) { + case "1": + return HIGH; + case "2": + return MEDIUM; + case "3": + return LOW; + default: + return INVALID; + } + } + + /** + * Convert TaskPriority to Int + * + * 1 <- HIGH + * 2 <- MEDIUM + * 3 <- LOW + * 0 <- INVALID + * + * @param task TaskPriority that indicates the TaskPriority + * @return int + */ + public static int convertPriorityToInt(TaskPriority task) { switch (task) { case LOW: return 3; @@ -33,4 +92,22 @@ private static int convertPriorityToInt(TaskPriority task) { } } + /** + * Convert TaskPriority to String + * + * @param task TaskPriority that indicates the TaskPriority + * @return String value of TaskPriority + */ + public static String convertPriorityToString(TaskPriority task) { + switch (task) { + case LOW: + return "LOW"; + case MEDIUM: + return "MEDIUM"; + case HIGH: + return "HIGH"; + default: + return "INVALID"; + } + } } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index c02f5594..a5d1ef49 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -5,7 +5,9 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; + import duke.task.TaskList; +import duke.task.TaskPriority; import duke.task.TaskType; /** @@ -209,6 +211,25 @@ public void msgAskUserSetTaskPriority() { System.out.println(" Which task do you want to set priority?"); } + /** + * Display message to ask user what is the new priority + */ + public void msgAskUserWhatPriority() { + System.out.println(" What is it's priority? choose 1 to 3"); + System.out.println(" 1: Very urgent >>> 3: Chin Cai not that urgent"); + } + + /** + * Display message to tell user that the new priority for a task is set successfully + */ + public void msgSetPriority(TaskList myList, int taskNumber) { + System.out.println(" Done! The new task priority is set"); + TaskPriority taskPriority = myList.getTaskPriority(taskNumber); + String taskPriorityInString = TaskPriority.convertPriorityToString(taskPriority); + System.out.println(" Priority of Task #" + taskNumber + 1 + " has been set to " + taskPriorityInString); + System.out.println("_________________________________"); + } + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** @@ -244,6 +265,13 @@ public void msgBlankBeforeTaskDetail() { System.out.print(" "); } + /** + * Display dash lines separator + */ + public void msgDashLines() { + System.out.println("_________________________________"); + } + /** * Display detail of a task * @@ -312,6 +340,18 @@ public void msgTaskDetail(TaskList myList, int taskNumber) { } } + /** + * Display message when a task is removed + */ + public void msgRemoveItem(TaskList myList, int taskNumber) { + + System.out.println(" Noted. I've removed this task:"); + msgBlankBeforeTaskDetail(); + msgTaskDetail(myList, taskNumber); + System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println("_________________________________"); + } + // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** @@ -360,23 +400,20 @@ public void msgInvalidInputMissingTime() { } /** - * Display message when a task is removed + * Display message that remind user about invalid input + * The task number is not found */ - public void msgRemoveItem(TaskList myList, int taskNumber) { - - System.out.println(" Noted. I've removed this task:"); - msgBlankBeforeTaskDetail(); - msgTaskDetail(myList, taskNumber); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + public void msgInvalidTaskNumber() { + System.out.println(" ☹ OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } /** * Display message that remind user about invalid input - * The task number is not found + * The priority is invalid */ - public void msgWrongTaskNumber() { - System.out.println(" ☹ OOPS!!! The task number is invalid."); + public void msgInvalidPriority() { + System.out.println(" ☹ OOPS!!! The priority is invalid. Choose 1, 2 or 3"); System.out.println("_________________________________"); } diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 77a2af54..28a12530 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -1,14 +1,15 @@ package duke.ui; import java.io.IOException; + import duke.task.TaskList; /** * Interface class for User Interface * - * @author Kang Teng + * @author Kang Teng * @version 8.0 - * @since 2021-09-01 + * @since 2021-09-01 */ public interface Ui { @@ -18,29 +19,62 @@ public interface Ui { // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< void msgGreet(); + void msgAssignTask(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber); + void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); + void msgSave(); + void msgSLoad(); + void msgAskUserSetTaskPriority(); + + void msgAskUserWhatPriority(); + + void msgSetPriority(TaskList myList, int taskNumber); + void msgMarkDone(TaskList myList, int taskNumber); + void msgList(TaskList myList); + void msgBlankBeforeTaskDetail(); + + void msgDashLines(); + void msgTaskDetail(TaskList myList, int taskNumber); + void msgError(Exception e); + void msgInvalidInput(); + void msgInvalidInputMissingDescription(); + void msgInvalidInputMissingDay(); + void msgInvalidInputMissingTime(); + void msgInvalidInputWrongDateTimeFormat(); + void msgInvalidInputWrongDateTimeStartEndFormat(); + void msgInvalidInputTimeStartLaterThanTimeEnd(); + void msgRemoveItem(TaskList myList, int taskNumber); - void msgWrongTaskNumber(); + + void msgInvalidTaskNumber(); + + void msgInvalidPriority(); + void msgBye() throws IOException; + void msgBuddhaProtectMe() throws IOException; } diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 7aca3cb2..56aae9e3 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -17,7 +17,6 @@ deadline return book /by 2016-12-25 18:00 deadline return book /by 2016-12-25 deadline return book event project meeting /at 2016-12-25 -eventevent project meeting /at 2016-12-25 18:00 19:00 project meeting /at 2016-12-25 18:00 - +event project meeting /at 2016-12-25 18:00 19:00 event project meeting /at 2016-12-25 19:00 18:00 event project meeting /at 2016-12-25 19:00 19:00 From 4ce8146acad3124768704956e5088d7fa66cee7c Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 8 Nov 2021 16:50:01 +0800 Subject: [PATCH 28/39] Duke Level-9-2: Improve code standard --- src/main/java/duke/action/Parser.java | 99 ++++++++++++++++++++------- src/main/java/duke/ui/Message.java | 28 +++++++- src/main/java/duke/ui/Ui.java | 5 ++ text-ui-test/input.txt | 5 ++ 4 files changed, 111 insertions(+), 26 deletions(-) diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 4e040d2d..ad8f7f34 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -3,7 +3,10 @@ import java.io.IOException; import java.time.LocalDate; import java.time.LocalTime; +import java.util.ArrayList; import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import duke.storage.FileAccess; import duke.task.TaskList; @@ -66,7 +69,7 @@ public void onCreateDuke() { TaskList myList = new TaskList(); while (isDukeRunning) { line = in.nextLine(); - isDukeRunning = toReadUserCommand(myList, line); + isDukeRunning = shouldReadUserCommand(myList, line); } in.close(); } @@ -78,7 +81,7 @@ public void onCreateDuke() { * @param line String that the user type * @return boolean Return false if user type Bye, else return true */ - public boolean toReadUserCommand(TaskList myList, String line) { + public boolean shouldReadUserCommand(TaskList myList, String line) { try { // Guard Condition if (line.equals("bye")) { @@ -94,21 +97,23 @@ public boolean toReadUserCommand(TaskList myList, String line) { if (line.equals("list")) { showFullList(myList); - } else if (line.substring(0, 3).equals("set")) { + } else if (line.startsWith("set")) { toSetPriorityTask(myList, line); - } else if (line.substring(0, 4).equals("done")) { + } else if (line.startsWith("done")) { toMarkTaskDone(myList, line); - } else if (line.substring(0, 4).equals("todo")) { + } else if (line.startsWith("todo")) { toAddTaskToDo(myList, line); - } else if (line.substring(0, 4).equals("save")) { + } else if (line.startsWith("save")) { toSaveTask(myList); - } else if (line.substring(0, 4).equals("load")) { + } else if (line.startsWith("load")) { // loadTask(myList); - } else if (line.substring(0, 5).equals("event")) { + } else if (line.startsWith("find")) { + toFindTask(myList, line); + } else if (line.startsWith("event")) { toAddTaskEvent(myList, line); - } else if (line.substring(0, 6).equals("delete")) { + } else if (line.startsWith("delete")) { toDeleteTask(myList, line); - } else if (line.substring(0, 8).equals("deadline")) { + } else if (line.startsWith("deadline")) { toAddTaskDeadline(myList, line); } else { uiMessage.msgInvalidInput(); @@ -158,26 +163,27 @@ private void showFullList(TaskList myList) { */ private void toSetPriorityTask(TaskList myList, String line) { - boolean validTaskNumber = false; + boolean isTaskNumberValid = false; String userInputTaskNumber = ""; - boolean validPriorityNumber = false; + boolean isPriorityNumberValid = false; String userInputNewPriorityNumber = ""; - Scanner in = new Scanner(System.in);; + Scanner in = new Scanner(System.in); + ; - while (validTaskNumber == false){ + while (isTaskNumberValid == false) { uiMessage.msgAskUserSetTaskPriority(); userInputTaskNumber = in.nextLine(); - validTaskNumber = ifValidTaskNumber(myList, userInputTaskNumber); + isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); } int taskNumber = Integer.parseInt(userInputTaskNumber); uiMessage.msgDashLines(); - while (validPriorityNumber == false){ + while (isPriorityNumberValid == false) { uiMessage.msgAskUserWhatPriority(); userInputNewPriorityNumber = in.nextLine(); - validPriorityNumber = ifValidPriorityNumber (userInputNewPriorityNumber); + isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); } int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); @@ -237,6 +243,34 @@ private void toSaveTask(TaskList myList) { fileAccess.saveProgressIntoFile(myList, listOfTaskString); } + /** + * Find the Task requested + * + * @param myList TaskList that contains the list of task + */ + private void toFindTask(TaskList myList, String line) { + if (line.length() <= 5) { + uiMessage.msgInvalidFindTerm(); + return; + } + + String searchTerm = line.substring(5); + ArrayList taskNumberContainingSearchTerm = new ArrayList<>(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + if (hasStringContain(taskDetail, searchTerm)) { + taskNumberContainingSearchTerm.add(i); + } + } + + if (taskNumberContainingSearchTerm.isEmpty()) { + uiMessage.msgInvalidFindTerm(); + return; + } + + uiMessage.msgTaskFound(myList, taskNumberContainingSearchTerm); + } + /** * Add a task of Event type into TaskList *

@@ -501,35 +535,50 @@ private String toReadTaskConvertToString(TaskList myList) { /** * Check the validity of task number in String * - * @param myList TaskList that contains the list of task + * @param myList TaskList that contains the list of task * @param userInputString String * @return boolean True if userInput is a valid task number; False otherwise */ - private boolean ifValidTaskNumber(TaskList myList, String userInputString){ + private boolean hasValidTaskNumber(TaskList myList, String userInputString) { try { int userInputInt = Integer.parseInt(userInputString); int numOfItem = myList.getNumOfItem(); - if (userInputInt <= numOfItem){ + if (userInputInt <= numOfItem) { return true; } } catch (Exception e) { + uiMessage.msgInvalidTaskNumber(); + return false; } uiMessage.msgInvalidTaskNumber(); return false; } - private boolean ifValidPriorityNumber(String userInputNewPriorityString){ - try{ - TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputNewPriorityString); - if (taskPriority == TaskPriority.HIGH || taskPriority == TaskPriority.MEDIUM || taskPriority == TaskPriority.LOW){ + private boolean hasValidPriorityNumber(String userInputPriorityS) { + try { + TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); + if (taskPriority == TaskPriority.HIGH) { + return true; + } else if (taskPriority == TaskPriority.MEDIUM) { + return true; + } else if (taskPriority == TaskPriority.LOW) { return true; } - } catch (Exception e){ + } catch (Exception e) { + uiMessage.msgInvalidPriority(); + return false; } uiMessage.msgInvalidPriority(); return false; } + + private boolean hasStringContain(String sourceString, String searchString) { + String pattern = "\\b" + searchString + "\\b"; + Pattern p = Pattern.compile(pattern); + Matcher m = p.matcher(sourceString); + return m.find(); + } } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index a5d1ef49..8bb6bdba 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -5,6 +5,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import duke.task.TaskList; import duke.task.TaskPriority; @@ -230,6 +231,31 @@ public void msgSetPriority(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } + // Find Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display message to tell user that the term that the user try to find is not found + */ + public void msgInvalidFindTerm() { + System.out.println(" Sorry :( Cannot find what you are looking for ~ "); + System.out.println("_________________________________"); + } + + /** + * Display message to show a list of task found based on the term + */ + public void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { + System.out.println(" Here are the matching tasks in your list:"); + int index = 1; + for (int i = 0; i < taskNumberContainingSearchTerm.size(); i++) { + int taskNumber = taskNumberContainingSearchTerm.get(i); + msgBlankBeforeTaskDetail(); + System.out.print(index + "."); + msgTaskDetail(myList, taskNumber); + index++; + } + } + // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** @@ -262,7 +288,7 @@ public void msgList(TaskList myList) { * Display blanks */ public void msgBlankBeforeTaskDetail() { - System.out.print(" "); + System.out.print(" "); } /** diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 28a12530..f2ad9804 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -1,6 +1,7 @@ package duke.ui; import java.io.IOException; +import java.util.ArrayList; import duke.task.TaskList; @@ -42,6 +43,10 @@ public interface Ui { void msgSetPriority(TaskList myList, int taskNumber); + void msgInvalidFindTerm(); + + void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm); + void msgMarkDone(TaskList myList, int taskNumber); void msgList(TaskList myList); diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 56aae9e3..723c13d5 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -20,3 +20,8 @@ event project meeting /at 2016-12-25 event project meeting /at 2016-12-25 18:00 19:00 event project meeting /at 2016-12-25 19:00 18:00 event project meeting /at 2016-12-25 19:00 19:00 + +event project meeting /at 2016-12-25 18:00 19:00 +event project AAmeeting /at 2016-12-25 18:00 19:00 +event project meeting /at 2016-12-25 18:00 19:00 +event project meet /at 2016-12-25 18:00 19:00 \ No newline at end of file From 47663cfdf2e6040c6d244aceef8985f500b061c8 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Mon, 8 Nov 2021 19:37:18 +0800 Subject: [PATCH 29/39] Duke Level-9-3: Improve code quality --- src/main/java/duke/action/Parser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index ad8f7f34..41c0bb7a 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -170,13 +170,13 @@ private void toSetPriorityTask(TaskList myList, String line) { String userInputNewPriorityNumber = ""; Scanner in = new Scanner(System.in); - ; while (isTaskNumberValid == false) { uiMessage.msgAskUserSetTaskPriority(); userInputTaskNumber = in.nextLine(); isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); } + int taskNumber = Integer.parseInt(userInputTaskNumber); uiMessage.msgDashLines(); @@ -185,6 +185,7 @@ private void toSetPriorityTask(TaskList myList, String line) { userInputNewPriorityNumber = in.nextLine(); isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); } + int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); From 018b5db2ae78ff586b85b30eafaa3f01344f7581 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 9 Nov 2021 10:13:02 +0800 Subject: [PATCH 30/39] Restructure --- src/main/java/duke/Command.java | 2 + src/main/java/duke/EndDuke.java | 7 + src/main/java/duke/RunDuke.java | 7 + src/main/java/duke/StartDuke.java | 2 + src/main/java/duke/action/Parser.java | 586 +---------------------- src/main/java/duke/action/ParserOld.java | 586 +++++++++++++++++++++++ 6 files changed, 605 insertions(+), 585 deletions(-) create mode 100644 src/main/java/duke/Command.java create mode 100644 src/main/java/duke/EndDuke.java create mode 100644 src/main/java/duke/RunDuke.java create mode 100644 src/main/java/duke/StartDuke.java create mode 100644 src/main/java/duke/action/ParserOld.java diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java new file mode 100644 index 00000000..fa7b7801 --- /dev/null +++ b/src/main/java/duke/Command.java @@ -0,0 +1,2 @@ +package duke;public class Command { +} diff --git a/src/main/java/duke/EndDuke.java b/src/main/java/duke/EndDuke.java new file mode 100644 index 00000000..3ec69579 --- /dev/null +++ b/src/main/java/duke/EndDuke.java @@ -0,0 +1,7 @@ +package duke.action; + +public class endDuke { + public static void run(){ + + } +} diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java new file mode 100644 index 00000000..b65f926f --- /dev/null +++ b/src/main/java/duke/RunDuke.java @@ -0,0 +1,7 @@ +package duke.action; + +public class RunDuke { + public static void run(){ + + } +} diff --git a/src/main/java/duke/StartDuke.java b/src/main/java/duke/StartDuke.java new file mode 100644 index 00000000..001b4375 --- /dev/null +++ b/src/main/java/duke/StartDuke.java @@ -0,0 +1,2 @@ +package duke;public class StartDuke { +} diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 41c0bb7a..f90c6152 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,586 +1,2 @@ -package duke.action; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import duke.storage.FileAccess; -import duke.task.TaskList; -import duke.task.TaskPriority; -import duke.task.TaskType; -import duke.ui.Message; -import duke.ui.Ui; - -/** - * Main logic of the Duke Program - * Handles the sequence of program flow - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class Parser { - - private FileAccess fileAccess; - private Ui uiMessage; - - /** - * Constructor - */ - public Parser(FileAccess fileAccess) { - this.fileAccess = fileAccess; - uiMessage = new Message(); - } - - // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the opening Greet Message in System.out.println - */ - public void showGreetMessage() { - uiMessage.msgGreet(); - } - - // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Create main sequence of the Duke program - * This section iterate until "bye" is called - *

- * Current Supported Duke Command List: - * - list - * - done - * - todo - * - save - * - load - * - event - * - delete - * - deadline - */ - public void onCreateDuke() { - boolean isDukeRunning = true; - String line; - Scanner in = new Scanner(System.in); - TaskList myList = new TaskList(); - while (isDukeRunning) { - line = in.nextLine(); - isDukeRunning = shouldReadUserCommand(myList, line); - } - in.close(); - } - - /** - * Read a single user input and respond accordingly - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - * @return boolean Return false if user type Bye, else return true - */ - public boolean shouldReadUserCommand(TaskList myList, String line) { - try { - // Guard Condition - if (line.equals("bye")) { - return false; - } - - // for testing new function - if (line.equals("tf")) { - System.out.println("XXXXX Test Function XXXXX"); - fileAccess.deleteProgressFile(); - System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); - } - - if (line.equals("list")) { - showFullList(myList); - } else if (line.startsWith("set")) { - toSetPriorityTask(myList, line); - } else if (line.startsWith("done")) { - toMarkTaskDone(myList, line); - } else if (line.startsWith("todo")) { - toAddTaskToDo(myList, line); - } else if (line.startsWith("save")) { - toSaveTask(myList); - } else if (line.startsWith("load")) { - // loadTask(myList); - } else if (line.startsWith("find")) { - toFindTask(myList, line); - } else if (line.startsWith("event")) { - toAddTaskEvent(myList, line); - } else if (line.startsWith("delete")) { - toDeleteTask(myList, line); - } else if (line.startsWith("deadline")) { - toAddTaskDeadline(myList, line); - } else { - uiMessage.msgInvalidInput(); - } - return true; - } catch (Exception e) { - uiMessage.msgInvalidInput(); - uiMessage.msgError(e); - return true; - } - } - - // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the Bye Message - *

- * called when Duke program ends - */ - public void showByeMessage() { - try { - uiMessage.msgBye(); - } catch (IOException error) { - uiMessage.msgError(error); - } - } - - // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show full list of tasks - * - * @param myList TaskList that contains the list of task - */ - private void showFullList(TaskList myList) { - uiMessage.msgList(myList); - } - - /** - * Ask user which task to set priority and change the priority accordingly - * -- Ask user which task to be changed - * -- Ask user what is the new priority - * -- Update the task with new priority - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toSetPriorityTask(TaskList myList, String line) { - - boolean isTaskNumberValid = false; - String userInputTaskNumber = ""; - - boolean isPriorityNumberValid = false; - String userInputNewPriorityNumber = ""; - - Scanner in = new Scanner(System.in); - - while (isTaskNumberValid == false) { - uiMessage.msgAskUserSetTaskPriority(); - userInputTaskNumber = in.nextLine(); - isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); - } - - int taskNumber = Integer.parseInt(userInputTaskNumber); - uiMessage.msgDashLines(); - - while (isPriorityNumberValid == false) { - uiMessage.msgAskUserWhatPriority(); - userInputNewPriorityNumber = in.nextLine(); - isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); - } - - int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); - - TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); - toUpdatePriority(myList, taskNumber - 1, taskPriority); - } - - /** - * Ask user which task to set priority and change the priority accordingly - * -- Ask user which task to be changed - * -- Ask user what is the new priority - * -- Update the task with new priority - * - * @param myList TaskList that contains the list of task - * @param taskNumber int that indicates the task number - * @param taskPriority TaskPriority(new one) that want to be set - */ - private void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { - myList.setTaskPriority(taskNumber, taskPriority); - uiMessage.msgSetPriority(myList, taskNumber); // - } - - /** - * Mark a task as done - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toMarkTaskDone(TaskList myList, String line) { - int taskNumber = Integer.parseInt(line.substring(5)); - myList.setTaskDone(taskNumber - 1); - uiMessage.msgMarkDone(myList, taskNumber - 1); - } - - /** - * Add a task of ToDo type into the list of task - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskToDo(TaskList myList, String line) { - if (line.length() <= 5) { - uiMessage.msgInvalidInputMissingDescription(); - } else { - myList.addItemToDos(line.substring(5)); - uiMessage.msgAssignTask(myList, myList.getNumOfItem() - 1); - } - } - - /** - * Save the current task list and output a text file - * - * @param myList TaskList that contains the list of task - */ - private void toSaveTask(TaskList myList) { - String listOfTaskString = toReadTaskConvertToString(myList); - fileAccess.saveProgressIntoFile(myList, listOfTaskString); - } - - /** - * Find the Task requested - * - * @param myList TaskList that contains the list of task - */ - private void toFindTask(TaskList myList, String line) { - if (line.length() <= 5) { - uiMessage.msgInvalidFindTerm(); - return; - } - - String searchTerm = line.substring(5); - ArrayList taskNumberContainingSearchTerm = new ArrayList<>(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - if (hasStringContain(taskDetail, searchTerm)) { - taskNumberContainingSearchTerm.add(i); - } - } - - if (taskNumberContainingSearchTerm.isEmpty()) { - uiMessage.msgInvalidFindTerm(); - return; - } - - uiMessage.msgTaskFound(myList, taskNumberContainingSearchTerm); - } - - /** - * Add a task of Event type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskEvent(TaskList myList, String line) { - - if (line.length() <= 6) { - uiMessage.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/at")) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(6, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String timeStart; - String timeEnd; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskEvent_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); - } else { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); - } - - } catch (Exception e) { - uiMessage.msgInvalidInputWrongDateTimeStartEndFormat(); - } - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - */ - private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate); - uiMessage.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - uiMessage.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - * @param timeEnd String that represents the end time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart, String timeEnd) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null || taskTimeEnd == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - if (taskTimeStart.isAfter(taskTimeEnd)) { - uiMessage.msgInvalidInputTimeStartLaterThanTimeEnd(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - uiMessage.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); - } - - /** - * Delete a task from the user task - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toDeleteTask(TaskList myList, String line) { - try { - int taskNumber = Integer.parseInt(line.substring(7)); - uiMessage.msgRemoveItem(myList, taskNumber - 1); - myList.removeItem(taskNumber - 1); - } catch (Exception e) { - uiMessage.msgInvalidTaskNumber(); - } - } - - /** - * Add a task of Deadline type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toAddTaskDeadline(TaskList myList, String line) { - - if (line.length() <= 9) { - uiMessage.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/by")) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(9, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String time; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskDeadline_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); - toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); - } else { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - } - - } catch (Exception e) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - } - } - - /** - * Add a task of Deadline type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - */ - private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate); - uiMessage.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - * @param time String that represents the time of the deadline - */ - private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, - String date, String time) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTime = ParseDateTime.toTime(time); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTime == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate, taskTime); - uiMessage.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); - } - - - // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Read a list of task and convert it into string - * - * @param myList TaskList that contains the list of task - */ - private String toReadTaskConvertToString(TaskList myList) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - boolean isDone = myList.getTaskDoneStatus(i); - String isDoneString = (isDone ? "1" : "0"); - String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); - - sb.append(taskType).append("|"); - sb.append(isDoneString).append("|"); - sb.append(taskDetail).append("|\n"); - } - return sb.toString(); - } - - /** - * Check the validity of task number in String - * - * @param myList TaskList that contains the list of task - * @param userInputString String - * @return boolean True if userInput is a valid task number; False otherwise - */ - private boolean hasValidTaskNumber(TaskList myList, String userInputString) { - - try { - int userInputInt = Integer.parseInt(userInputString); - int numOfItem = myList.getNumOfItem(); - if (userInputInt <= numOfItem) { - return true; - } - } catch (Exception e) { - uiMessage.msgInvalidTaskNumber(); - return false; - } - uiMessage.msgInvalidTaskNumber(); - return false; - } - - private boolean hasValidPriorityNumber(String userInputPriorityS) { - try { - TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); - if (taskPriority == TaskPriority.HIGH) { - return true; - } else if (taskPriority == TaskPriority.MEDIUM) { - return true; - } else if (taskPriority == TaskPriority.LOW) { - return true; - } - } catch (Exception e) { - uiMessage.msgInvalidPriority(); - return false; - } - uiMessage.msgInvalidPriority(); - return false; - } - - private boolean hasStringContain(String sourceString, String searchString) { - String pattern = "\\b" + searchString + "\\b"; - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(sourceString); - return m.find(); - } +package duke.action;public class Parser { } - - - diff --git a/src/main/java/duke/action/ParserOld.java b/src/main/java/duke/action/ParserOld.java new file mode 100644 index 00000000..41c0bb7a --- /dev/null +++ b/src/main/java/duke/action/ParserOld.java @@ -0,0 +1,586 @@ +package duke.action; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import duke.storage.FileAccess; +import duke.task.TaskList; +import duke.task.TaskPriority; +import duke.task.TaskType; +import duke.ui.Message; +import duke.ui.Ui; + +/** + * Main logic of the Duke Program + * Handles the sequence of program flow + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class Parser { + + private FileAccess fileAccess; + private Ui uiMessage; + + /** + * Constructor + */ + public Parser(FileAccess fileAccess) { + this.fileAccess = fileAccess; + uiMessage = new Message(); + } + + // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show the opening Greet Message in System.out.println + */ + public void showGreetMessage() { + uiMessage.msgGreet(); + } + + // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Create main sequence of the Duke program + * This section iterate until "bye" is called + *

+ * Current Supported Duke Command List: + * - list + * - done + * - todo + * - save + * - load + * - event + * - delete + * - deadline + */ + public void onCreateDuke() { + boolean isDukeRunning = true; + String line; + Scanner in = new Scanner(System.in); + TaskList myList = new TaskList(); + while (isDukeRunning) { + line = in.nextLine(); + isDukeRunning = shouldReadUserCommand(myList, line); + } + in.close(); + } + + /** + * Read a single user input and respond accordingly + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + * @return boolean Return false if user type Bye, else return true + */ + public boolean shouldReadUserCommand(TaskList myList, String line) { + try { + // Guard Condition + if (line.equals("bye")) { + return false; + } + + // for testing new function + if (line.equals("tf")) { + System.out.println("XXXXX Test Function XXXXX"); + fileAccess.deleteProgressFile(); + System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); + } + + if (line.equals("list")) { + showFullList(myList); + } else if (line.startsWith("set")) { + toSetPriorityTask(myList, line); + } else if (line.startsWith("done")) { + toMarkTaskDone(myList, line); + } else if (line.startsWith("todo")) { + toAddTaskToDo(myList, line); + } else if (line.startsWith("save")) { + toSaveTask(myList); + } else if (line.startsWith("load")) { + // loadTask(myList); + } else if (line.startsWith("find")) { + toFindTask(myList, line); + } else if (line.startsWith("event")) { + toAddTaskEvent(myList, line); + } else if (line.startsWith("delete")) { + toDeleteTask(myList, line); + } else if (line.startsWith("deadline")) { + toAddTaskDeadline(myList, line); + } else { + uiMessage.msgInvalidInput(); + } + return true; + } catch (Exception e) { + uiMessage.msgInvalidInput(); + uiMessage.msgError(e); + return true; + } + } + + // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show the Bye Message + *

+ * called when Duke program ends + */ + public void showByeMessage() { + try { + uiMessage.msgBye(); + } catch (IOException error) { + uiMessage.msgError(error); + } + } + + // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show full list of tasks + * + * @param myList TaskList that contains the list of task + */ + private void showFullList(TaskList myList) { + uiMessage.msgList(myList); + } + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toSetPriorityTask(TaskList myList, String line) { + + boolean isTaskNumberValid = false; + String userInputTaskNumber = ""; + + boolean isPriorityNumberValid = false; + String userInputNewPriorityNumber = ""; + + Scanner in = new Scanner(System.in); + + while (isTaskNumberValid == false) { + uiMessage.msgAskUserSetTaskPriority(); + userInputTaskNumber = in.nextLine(); + isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); + } + + int taskNumber = Integer.parseInt(userInputTaskNumber); + uiMessage.msgDashLines(); + + while (isPriorityNumberValid == false) { + uiMessage.msgAskUserWhatPriority(); + userInputNewPriorityNumber = in.nextLine(); + isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); + } + + int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); + + TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); + toUpdatePriority(myList, taskNumber - 1, taskPriority); + } + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + * @param taskNumber int that indicates the task number + * @param taskPriority TaskPriority(new one) that want to be set + */ + private void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { + myList.setTaskPriority(taskNumber, taskPriority); + uiMessage.msgSetPriority(myList, taskNumber); // + } + + /** + * Mark a task as done + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toMarkTaskDone(TaskList myList, String line) { + int taskNumber = Integer.parseInt(line.substring(5)); + myList.setTaskDone(taskNumber - 1); + uiMessage.msgMarkDone(myList, taskNumber - 1); + } + + /** + * Add a task of ToDo type into the list of task + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toAddTaskToDo(TaskList myList, String line) { + if (line.length() <= 5) { + uiMessage.msgInvalidInputMissingDescription(); + } else { + myList.addItemToDos(line.substring(5)); + uiMessage.msgAssignTask(myList, myList.getNumOfItem() - 1); + } + } + + /** + * Save the current task list and output a text file + * + * @param myList TaskList that contains the list of task + */ + private void toSaveTask(TaskList myList) { + String listOfTaskString = toReadTaskConvertToString(myList); + fileAccess.saveProgressIntoFile(myList, listOfTaskString); + } + + /** + * Find the Task requested + * + * @param myList TaskList that contains the list of task + */ + private void toFindTask(TaskList myList, String line) { + if (line.length() <= 5) { + uiMessage.msgInvalidFindTerm(); + return; + } + + String searchTerm = line.substring(5); + ArrayList taskNumberContainingSearchTerm = new ArrayList<>(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + if (hasStringContain(taskDetail, searchTerm)) { + taskNumberContainingSearchTerm.add(i); + } + } + + if (taskNumberContainingSearchTerm.isEmpty()) { + uiMessage.msgInvalidFindTerm(); + return; + } + + uiMessage.msgTaskFound(myList, taskNumberContainingSearchTerm); + } + + /** + * Add a task of Event type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that the user type + */ + private void toAddTaskEvent(TaskList myList, String line) { + + if (line.length() <= 6) { + uiMessage.msgInvalidInputMissingDescription(); + return; + } + + if (!line.contains("/at")) { + uiMessage.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = line.substring(6, line.indexOf("/")); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String timeStart; + String timeEnd; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskEvent_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); + } else { + timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); + timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); + } + + } catch (Exception e) { + uiMessage.msgInvalidInputWrongDateTimeStartEndFormat(); + } + + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + */ + private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate); + uiMessage.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + */ + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + + if (taskDate == null) { + uiMessage.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart); + uiMessage.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); + + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + * @param timeEnd String that represents the end time of the event + */ + private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart, String timeEnd) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); + + if (taskDate == null) { + uiMessage.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null || taskTimeEnd == null) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + return; + } + + if (taskTimeStart.isAfter(taskTimeEnd)) { + uiMessage.msgInvalidInputTimeStartLaterThanTimeEnd(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); + uiMessage.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); + } + + /** + * Delete a task from the user task + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ + private void toDeleteTask(TaskList myList, String line) { + try { + int taskNumber = Integer.parseInt(line.substring(7)); + uiMessage.msgRemoveItem(myList, taskNumber - 1); + myList.removeItem(taskNumber - 1); + } catch (Exception e) { + uiMessage.msgInvalidTaskNumber(); + } + } + + /** + * Add a task of Deadline type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param line String that represents the user input + */ + private void toAddTaskDeadline(TaskList myList, String line) { + + if (line.length() <= 9) { + uiMessage.msgInvalidInputMissingDescription(); + return; + } + + if (!line.contains("/by")) { + uiMessage.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = line.substring(9, line.indexOf("/")); + String dateAndTime = line.substring(line.indexOf("/") + 4); + String date; + String time; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskDeadline_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); + toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); + } else { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + } + + } catch (Exception e) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + } + } + + /** + * Add a task of Deadline type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + */ + private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate); + uiMessage.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + * @param time String that represents the time of the deadline + */ + private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, + String date, String time) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTime = ParseDateTime.toTime(time); + + if (taskDate == null) { + uiMessage.msgInvalidInputMissingDay(); + return; + } + + if (taskTime == null) { + uiMessage.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate, taskTime); + uiMessage.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); + } + + + // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Read a list of task and convert it into string + * + * @param myList TaskList that contains the list of task + */ + private String toReadTaskConvertToString(TaskList myList) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + boolean isDone = myList.getTaskDoneStatus(i); + String isDoneString = (isDone ? "1" : "0"); + String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); + + sb.append(taskType).append("|"); + sb.append(isDoneString).append("|"); + sb.append(taskDetail).append("|\n"); + } + return sb.toString(); + } + + /** + * Check the validity of task number in String + * + * @param myList TaskList that contains the list of task + * @param userInputString String + * @return boolean True if userInput is a valid task number; False otherwise + */ + private boolean hasValidTaskNumber(TaskList myList, String userInputString) { + + try { + int userInputInt = Integer.parseInt(userInputString); + int numOfItem = myList.getNumOfItem(); + if (userInputInt <= numOfItem) { + return true; + } + } catch (Exception e) { + uiMessage.msgInvalidTaskNumber(); + return false; + } + uiMessage.msgInvalidTaskNumber(); + return false; + } + + private boolean hasValidPriorityNumber(String userInputPriorityS) { + try { + TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); + if (taskPriority == TaskPriority.HIGH) { + return true; + } else if (taskPriority == TaskPriority.MEDIUM) { + return true; + } else if (taskPriority == TaskPriority.LOW) { + return true; + } + } catch (Exception e) { + uiMessage.msgInvalidPriority(); + return false; + } + uiMessage.msgInvalidPriority(); + return false; + } + + private boolean hasStringContain(String sourceString, String searchString) { + String pattern = "\\b" + searchString + "\\b"; + Pattern p = Pattern.compile(pattern); + Matcher m = p.matcher(sourceString); + return m.find(); + } +} + + + From a7db5206b458c894e1c1e68080513de569ca860c Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 9 Nov 2021 10:13:14 +0800 Subject: [PATCH 31/39] Restructure 2 --- src/main/java/duke/Command.java | 16 ++++- src/main/java/duke/Duke.java | 28 ++++++-- src/main/java/duke/EndDuke.java | 26 +++++-- src/main/java/duke/RunDuke.java | 57 ++++++++++++++- src/main/java/duke/StartDuke.java | 17 ++++- src/main/java/duke/action/Parser.java | 41 ++++++++++- src/main/java/duke/action/ParserFacade.java | 14 ++-- src/main/java/duke/action/ParserOld.java | 4 +- src/main/java/duke/ui/Message.java | 11 ++- src/main/java/duke/ui/Ui.java | 77 +++------------------ 10 files changed, 195 insertions(+), 96 deletions(-) diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java index fa7b7801..65aff42b 100644 --- a/src/main/java/duke/Command.java +++ b/src/main/java/duke/Command.java @@ -1,2 +1,16 @@ -package duke;public class Command { +package duke; + +import duke.action.Parser; + +public class Command { + + Parser parser; + + public Command(Parser parser){ + this.parser = parser; + } + + + + } diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index f256f46a..89abe8b5 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,6 +1,10 @@ package duke; import duke.action.ParserFacade; +import duke.storage.FileAccess; +import duke.task.TaskList; +import duke.ui.Message; +import duke.ui.Ui; /** * Begin the program here. @@ -11,15 +15,27 @@ */ public class Duke { + private FileAccess fileAccess; + private TaskList myList; + private Ui ui; + + public Duke(String filepath){ + ui = new Ui(); + fileAccess = new FileAccess(filepath); + // todo try load task here + } + + public void initialize(){ + StartDuke.run(); + RunDuke.run(myList, ui); + EndDuke.run(); + } + /** * Starting point of the program */ public static void main(String[] args) { - - ParserFacade parserFacade = new ParserFacade(); - - parserFacade.startDuke(); - parserFacade.runDuke(); - parserFacade.endDuke(); + Duke duke = new Duke("src\\resources\\progress.txt"); + duke.initialize(); } } diff --git a/src/main/java/duke/EndDuke.java b/src/main/java/duke/EndDuke.java index 3ec69579..12788d3a 100644 --- a/src/main/java/duke/EndDuke.java +++ b/src/main/java/duke/EndDuke.java @@ -1,7 +1,25 @@ -package duke.action; +package duke; -public class endDuke { - public static void run(){ - +import duke.ui.Message; + +import java.io.IOException; + +public class EndDuke { + + public static void run() { + showByeMessage(); + } + + /** + * Show the Bye Message + *

+ * called when Duke program ends + */ + public static void showByeMessage() { + try { + Message.msgBye(); + } catch (IOException error) { + Message.msgError(error); + } } } diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index b65f926f..2067e8cc 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -1,7 +1,60 @@ -package duke.action; +package duke; + +import duke.action.Parser; +import duke.task.TaskList; +import duke.ui.Ui; public class RunDuke { - public static void run(){ + + private static Parser parser = new Parser(); + + public static void run(TaskList myList, Ui ui) { + + boolean isDukeRunning = true; + + while (isDukeRunning) { + String userInput = ui.requestUserInput(); + String command = parser.processUserCommand(userInput); + processCommand(command); + } } + + private void processCommand(String command) { + switch (command) { + case "list": + showFullList(myList); + break; + case "set": + toSetPriorityTask(myList, line); + break; + case "" + case "todo": + run(); + break; + case "save": + run(); + break; + case "load": + run(); + break; + case "find": + run(); + break; + case "event": + run(); + break; + case "delete": + run(); + break; + case "deadline": + run(); + break; + default + run(); + break; + } + } + + } diff --git a/src/main/java/duke/StartDuke.java b/src/main/java/duke/StartDuke.java index 001b4375..54114c55 100644 --- a/src/main/java/duke/StartDuke.java +++ b/src/main/java/duke/StartDuke.java @@ -1,2 +1,17 @@ -package duke;public class StartDuke { +package duke; + +import duke.ui.Message; + +public class StartDuke { + + public static void run() { + showGreetMessage(); + } + + /** + * Show the opening Greet Message in System.out.println + */ + public static void showGreetMessage() { + Message.msgGreet(); + } } diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index f90c6152..e2fb208c 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,2 +1,41 @@ -package duke.action;public class Parser { +package duke.action; + +import duke.ui.Message; + +public class Parser { + + public Parser (){ + + } + + public String processUserCommand(String userInput){ + if (userInput.equals("bye")) { + return "bye"; + } + + if (userInput.equals("list")) { + return "list"; + } else if (userInput.startsWith("set")) { + return "set"; + } else if (userInput.startsWith("done")) { + return "done"; + } else if (userInput.startsWith("todo")) { + return "todo"; + } else if (userInput.startsWith("save")) { + return "save"; + } else if (userInput.startsWith("load")) { + return "load"; + } else if (userInput.startsWith("find")) { + return "find"; + } else if (userInput.startsWith("event")) { + return "event"; + } else if (userInput.startsWith("delete")) { + return "delete"; + } else if (userInput.startsWith("deadline")) { + return "deadline"; + } else { + return "invalid"; + } + } + } diff --git a/src/main/java/duke/action/ParserFacade.java b/src/main/java/duke/action/ParserFacade.java index da593d68..ff6d9f84 100644 --- a/src/main/java/duke/action/ParserFacade.java +++ b/src/main/java/duke/action/ParserFacade.java @@ -12,21 +12,21 @@ public class ParserFacade { private FileAccess fileAccess; - private Parser parser; + private ParserOld parserOld; /** * Constructor */ public ParserFacade() { fileAccess = new FileAccess(); - parser = new Parser(fileAccess); + parserOld = new ParserOld(fileAccess); } /** * Initialize the Duke Program. */ public void startDuke() { - parser.showGreetMessage(); + parserOld.showGreetMessage(); } @@ -34,14 +34,14 @@ public void startDuke() { * Run the Duke Program */ public void runDuke() { - parser.onCreateDuke(); + parserOld.onCreateDuke(); } /** * End the Duke Program */ public void endDuke() { - parser.showByeMessage(); + parserOld.showByeMessage(); } /** @@ -58,7 +58,7 @@ public FileAccess getFileAccess() { * * @return Parser */ - public Parser getDukeObject() { - return parser; + public ParserOld getDukeObject() { + return parserOld; } } diff --git a/src/main/java/duke/action/ParserOld.java b/src/main/java/duke/action/ParserOld.java index 41c0bb7a..2c22d7fa 100644 --- a/src/main/java/duke/action/ParserOld.java +++ b/src/main/java/duke/action/ParserOld.java @@ -24,7 +24,7 @@ * @since 2021-09-01 */ -public class Parser { +public class ParserOld { private FileAccess fileAccess; private Ui uiMessage; @@ -32,7 +32,7 @@ public class Parser { /** * Constructor */ - public Parser(FileAccess fileAccess) { + public ParserOld(FileAccess fileAccess) { this.fileAccess = fileAccess; uiMessage = new Message(); } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index 8bb6bdba..ae5ae483 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -19,11 +19,10 @@ * @since 2021-09-01 */ -public class Message implements Ui { +public class Message { // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - @Override - public void msgGreet() { + public static void msgGreet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); @@ -385,7 +384,7 @@ public void msgRemoveItem(TaskList myList, int taskNumber) { * * @param e Exception error */ - public void msgError(Exception e) { + public static void msgError(Exception e) { System.out.println("Error Occurs: " + e); System.out.println("_________________________________"); } @@ -477,7 +476,7 @@ public void msgInvalidInputTimeStartLaterThanTimeEnd() { /** * Display message before the end of program */ - public void msgBye() throws IOException { + public static void msgBye() throws IOException { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); msgBuddhaProtectMe(); @@ -486,7 +485,7 @@ public void msgBye() throws IOException { /** * Display Buddah.txt */ - public void msgBuddhaProtectMe() throws IOException { + private void msgBuddhaProtectMe() throws IOException { String everything = ""; // ... \Duke\src\main\resources\buddha.txt diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index f2ad9804..57a01e24 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -1,9 +1,7 @@ package duke.ui; -import java.io.IOException; -import java.util.ArrayList; -import duke.task.TaskList; +import java.util.Scanner; /** * Interface class for User Interface @@ -13,73 +11,20 @@ * @since 2021-09-01 */ -public interface Ui { +public class Ui { - Message MESSAGE = new Message(); + public Ui(){ - // Message Related <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + } - void msgGreet(); + public String requestUserInput(){ - void msgAssignTask(TaskList myList, int taskNumber); + String line; + Scanner in = new Scanner(System.in); + line = in.nextLine(); + in.close(); + return line; - void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber); + } - void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber); - - void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber); - - void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber); - - void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber); - - void msgSave(); - - void msgSLoad(); - - void msgAskUserSetTaskPriority(); - - void msgAskUserWhatPriority(); - - void msgSetPriority(TaskList myList, int taskNumber); - - void msgInvalidFindTerm(); - - void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm); - - void msgMarkDone(TaskList myList, int taskNumber); - - void msgList(TaskList myList); - - void msgBlankBeforeTaskDetail(); - - void msgDashLines(); - - void msgTaskDetail(TaskList myList, int taskNumber); - - void msgError(Exception e); - - void msgInvalidInput(); - - void msgInvalidInputMissingDescription(); - - void msgInvalidInputMissingDay(); - - void msgInvalidInputMissingTime(); - - void msgInvalidInputWrongDateTimeFormat(); - - void msgInvalidInputWrongDateTimeStartEndFormat(); - - void msgInvalidInputTimeStartLaterThanTimeEnd(); - - void msgRemoveItem(TaskList myList, int taskNumber); - - void msgInvalidTaskNumber(); - - void msgInvalidPriority(); - - void msgBye() throws IOException; - - void msgBuddhaProtectMe() throws IOException; } From 060ef507cbbdc2578dcd521d5d41424efbc90f6f Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Tue, 9 Nov 2021 23:40:10 +0800 Subject: [PATCH 32/39] Restructure 3: Basic restructure are done --- src/main/java/duke/Command.java | 16 - src/main/java/duke/Duke.java | 10 +- src/main/java/duke/RunDuke.java | 82 ++- src/main/java/duke/action/ParseDateTime.java | 11 +- src/main/java/duke/action/Parser.java | 4 +- src/main/java/duke/action/ParserFacade.java | 64 -- src/main/java/duke/action/ParserOld.java | 586 ------------------ src/main/java/duke/command/CmdAddTask.java | 220 +++++++ src/main/java/duke/command/CmdDelete.java | 17 + src/main/java/duke/command/CmdFind.java | 41 ++ src/main/java/duke/command/CmdList.java | 18 + .../java/duke/command/CmdMarkTaskDone.java | 13 + src/main/java/duke/command/CmdPriority.java | 106 ++++ src/main/java/duke/command/CmdSave.java | 32 + src/main/java/duke/command/Command.java | 122 ++++ src/main/java/duke/storage/FileAccess.java | 18 +- src/main/java/duke/ui/Message.java | 58 +- src/main/java/duke/ui/Ui.java | 16 +- src/resources/progress.txt | 9 +- text-ui-test/input.txt | 4 +- 20 files changed, 688 insertions(+), 759 deletions(-) delete mode 100644 src/main/java/duke/Command.java delete mode 100644 src/main/java/duke/action/ParserFacade.java delete mode 100644 src/main/java/duke/action/ParserOld.java create mode 100644 src/main/java/duke/command/CmdAddTask.java create mode 100644 src/main/java/duke/command/CmdDelete.java create mode 100644 src/main/java/duke/command/CmdFind.java create mode 100644 src/main/java/duke/command/CmdList.java create mode 100644 src/main/java/duke/command/CmdMarkTaskDone.java create mode 100644 src/main/java/duke/command/CmdPriority.java create mode 100644 src/main/java/duke/command/CmdSave.java create mode 100644 src/main/java/duke/command/Command.java diff --git a/src/main/java/duke/Command.java b/src/main/java/duke/Command.java deleted file mode 100644 index 65aff42b..00000000 --- a/src/main/java/duke/Command.java +++ /dev/null @@ -1,16 +0,0 @@ -package duke; - -import duke.action.Parser; - -public class Command { - - Parser parser; - - public Command(Parser parser){ - this.parser = parser; - } - - - - -} diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 89abe8b5..b3cdc258 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,9 +1,7 @@ package duke; -import duke.action.ParserFacade; import duke.storage.FileAccess; import duke.task.TaskList; -import duke.ui.Message; import duke.ui.Ui; /** @@ -22,12 +20,17 @@ public class Duke { public Duke(String filepath){ ui = new Ui(); fileAccess = new FileAccess(filepath); + myList = new TaskList(); // todo try load task here } public void initialize(){ StartDuke.run(); - RunDuke.run(myList, ui); + new RunDuke(myList, ui, fileAccess).run(); + + } + + public void end(){ EndDuke.run(); } @@ -37,5 +40,6 @@ public void initialize(){ public static void main(String[] args) { Duke duke = new Duke("src\\resources\\progress.txt"); duke.initialize(); + duke.end(); } } diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index 2067e8cc..fbfb0617 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -1,58 +1,80 @@ package duke; import duke.action.Parser; +import duke.command.Command; +import duke.storage.FileAccess; import duke.task.TaskList; import duke.ui.Ui; +import java.util.Scanner; + public class RunDuke { - private static Parser parser = new Parser(); + private static TaskList myList; + private static Ui ui; + private static FileAccess fileAccess; + private static Parser parser; + private static Command cmd; + private static Scanner in; + - public static void run(TaskList myList, Ui ui) { + public RunDuke(TaskList myList, Ui ui, FileAccess fileAccess) { + this.myList = myList; + this.ui = ui; + this.fileAccess = fileAccess; + parser = new Parser(); + cmd = new Command(parser); + in = new Scanner(System.in); + } + + public void run() { boolean isDukeRunning = true; while (isDukeRunning) { - String userInput = ui.requestUserInput(); - String command = parser.processUserCommand(userInput); - processCommand(command); + String userInput = ui.requestUserInput(in); + String userCommand = parser.processUserCommand(userInput); + isDukeRunning = canProcessCommand(userCommand, userInput); } - } - private void processCommand(String command) { - switch (command) { + private static boolean canProcessCommand(String userCommand, String userInput) { + switch (userCommand) { + case "bye": + return false; case "list": - showFullList(myList); - break; + cmd.showFullList(myList); + return true; case "set": - toSetPriorityTask(myList, line); - break; - case "" + cmd.setPriorityTask(myList); + return true; + case "done": + cmd.markTaskDone(myList, userInput); + return true; case "todo": - run(); - break; + cmd.addTaskToDo(myList, userInput); + return true; case "save": - run(); - break; + cmd.saveTask(myList, fileAccess); + return true; case "load": - run(); - break; + // loadTask(myList); todo + return true; case "find": - run(); - break; + cmd.findTask(myList, userInput); + return true; case "event": - run(); - break; + cmd.addTaskEvent(myList, userInput); + return true; case "delete": - run(); - break; + cmd.deleteTask(myList, userInput); + return true; case "deadline": - run(); - break; - default - run(); - break; + cmd.addTaskDeadline(myList, userInput); + return true; + default: + cmd.showInvalidCommand(); // todo + return true; } } diff --git a/src/main/java/duke/action/ParseDateTime.java b/src/main/java/duke/action/ParseDateTime.java index 0c893ab1..79a61ab6 100644 --- a/src/main/java/duke/action/ParseDateTime.java +++ b/src/main/java/duke/action/ParseDateTime.java @@ -7,9 +7,6 @@ import java.time.format.DateTimeParseException; import java.util.Locale; -import duke.ui.Message; -import duke.ui.Ui; - /** * Handle date and time related functions *

@@ -23,8 +20,6 @@ public class ParseDateTime { - private static Ui ui = new Message(); - /** * Convert date from String to LocalDate * @@ -126,7 +121,7 @@ public static String toExtractDateFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String Time */ - public static String toExtracTimeFromSplitDateAndTime(String[] split) { + public static String toExtractTimeFromSplitDateAndTime(String[] split) { return split[1]; } @@ -136,7 +131,7 @@ public static String toExtracTimeFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String TimeStart */ - public static String toExtracTimeStartFromSplitDateAndTime(String[] split) { + public static String toExtractTimeStartFromSplitDateAndTime(String[] split) { return split[1]; } @@ -146,7 +141,7 @@ public static String toExtracTimeStartFromSplitDateAndTime(String[] split) { * @param split string array of date and time * @return String TimeEnd */ - public static String toExtracTimeEndFromSplitDateAndTime(String[] split) { + public static String toExtractTimeEndFromSplitDateAndTime(String[] split) { return split[2]; } } diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index e2fb208c..b3293ecc 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -11,9 +11,7 @@ public Parser (){ public String processUserCommand(String userInput){ if (userInput.equals("bye")) { return "bye"; - } - - if (userInput.equals("list")) { + } else if (userInput.equals("list")) { return "list"; } else if (userInput.startsWith("set")) { return "set"; diff --git a/src/main/java/duke/action/ParserFacade.java b/src/main/java/duke/action/ParserFacade.java deleted file mode 100644 index ff6d9f84..00000000 --- a/src/main/java/duke/action/ParserFacade.java +++ /dev/null @@ -1,64 +0,0 @@ -package duke.action; - -import duke.storage.FileAccess; - -/** - * Create an instance of Duke Program - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ -public class ParserFacade { - - private FileAccess fileAccess; - private ParserOld parserOld; - - /** - * Constructor - */ - public ParserFacade() { - fileAccess = new FileAccess(); - parserOld = new ParserOld(fileAccess); - } - - /** - * Initialize the Duke Program. - */ - public void startDuke() { - parserOld.showGreetMessage(); - } - - - /** - * Run the Duke Program - */ - public void runDuke() { - parserOld.onCreateDuke(); - } - - /** - * End the Duke Program - */ - public void endDuke() { - parserOld.showByeMessage(); - } - - /** - * Return a FileAccess object - * - * @return FileAccess - */ - public FileAccess getFileAccess() { - return fileAccess; - } - - /** - * Return a Parser object - * - * @return Parser - */ - public ParserOld getDukeObject() { - return parserOld; - } -} diff --git a/src/main/java/duke/action/ParserOld.java b/src/main/java/duke/action/ParserOld.java deleted file mode 100644 index 2c22d7fa..00000000 --- a/src/main/java/duke/action/ParserOld.java +++ /dev/null @@ -1,586 +0,0 @@ -package duke.action; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import duke.storage.FileAccess; -import duke.task.TaskList; -import duke.task.TaskPriority; -import duke.task.TaskType; -import duke.ui.Message; -import duke.ui.Ui; - -/** - * Main logic of the Duke Program - * Handles the sequence of program flow - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public class ParserOld { - - private FileAccess fileAccess; - private Ui uiMessage; - - /** - * Constructor - */ - public ParserOld(FileAccess fileAccess) { - this.fileAccess = fileAccess; - uiMessage = new Message(); - } - - // Start Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the opening Greet Message in System.out.println - */ - public void showGreetMessage() { - uiMessage.msgGreet(); - } - - // Run Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Create main sequence of the Duke program - * This section iterate until "bye" is called - *

- * Current Supported Duke Command List: - * - list - * - done - * - todo - * - save - * - load - * - event - * - delete - * - deadline - */ - public void onCreateDuke() { - boolean isDukeRunning = true; - String line; - Scanner in = new Scanner(System.in); - TaskList myList = new TaskList(); - while (isDukeRunning) { - line = in.nextLine(); - isDukeRunning = shouldReadUserCommand(myList, line); - } - in.close(); - } - - /** - * Read a single user input and respond accordingly - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - * @return boolean Return false if user type Bye, else return true - */ - public boolean shouldReadUserCommand(TaskList myList, String line) { - try { - // Guard Condition - if (line.equals("bye")) { - return false; - } - - // for testing new function - if (line.equals("tf")) { - System.out.println("XXXXX Test Function XXXXX"); - fileAccess.deleteProgressFile(); - System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXX"); - } - - if (line.equals("list")) { - showFullList(myList); - } else if (line.startsWith("set")) { - toSetPriorityTask(myList, line); - } else if (line.startsWith("done")) { - toMarkTaskDone(myList, line); - } else if (line.startsWith("todo")) { - toAddTaskToDo(myList, line); - } else if (line.startsWith("save")) { - toSaveTask(myList); - } else if (line.startsWith("load")) { - // loadTask(myList); - } else if (line.startsWith("find")) { - toFindTask(myList, line); - } else if (line.startsWith("event")) { - toAddTaskEvent(myList, line); - } else if (line.startsWith("delete")) { - toDeleteTask(myList, line); - } else if (line.startsWith("deadline")) { - toAddTaskDeadline(myList, line); - } else { - uiMessage.msgInvalidInput(); - } - return true; - } catch (Exception e) { - uiMessage.msgInvalidInput(); - uiMessage.msgError(e); - return true; - } - } - - // End Duke <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show the Bye Message - *

- * called when Duke program ends - */ - public void showByeMessage() { - try { - uiMessage.msgBye(); - } catch (IOException error) { - uiMessage.msgError(error); - } - } - - // ReadUserCommand Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Show full list of tasks - * - * @param myList TaskList that contains the list of task - */ - private void showFullList(TaskList myList) { - uiMessage.msgList(myList); - } - - /** - * Ask user which task to set priority and change the priority accordingly - * -- Ask user which task to be changed - * -- Ask user what is the new priority - * -- Update the task with new priority - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toSetPriorityTask(TaskList myList, String line) { - - boolean isTaskNumberValid = false; - String userInputTaskNumber = ""; - - boolean isPriorityNumberValid = false; - String userInputNewPriorityNumber = ""; - - Scanner in = new Scanner(System.in); - - while (isTaskNumberValid == false) { - uiMessage.msgAskUserSetTaskPriority(); - userInputTaskNumber = in.nextLine(); - isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); - } - - int taskNumber = Integer.parseInt(userInputTaskNumber); - uiMessage.msgDashLines(); - - while (isPriorityNumberValid == false) { - uiMessage.msgAskUserWhatPriority(); - userInputNewPriorityNumber = in.nextLine(); - isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); - } - - int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); - - TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); - toUpdatePriority(myList, taskNumber - 1, taskPriority); - } - - /** - * Ask user which task to set priority and change the priority accordingly - * -- Ask user which task to be changed - * -- Ask user what is the new priority - * -- Update the task with new priority - * - * @param myList TaskList that contains the list of task - * @param taskNumber int that indicates the task number - * @param taskPriority TaskPriority(new one) that want to be set - */ - private void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { - myList.setTaskPriority(taskNumber, taskPriority); - uiMessage.msgSetPriority(myList, taskNumber); // - } - - /** - * Mark a task as done - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toMarkTaskDone(TaskList myList, String line) { - int taskNumber = Integer.parseInt(line.substring(5)); - myList.setTaskDone(taskNumber - 1); - uiMessage.msgMarkDone(myList, taskNumber - 1); - } - - /** - * Add a task of ToDo type into the list of task - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskToDo(TaskList myList, String line) { - if (line.length() <= 5) { - uiMessage.msgInvalidInputMissingDescription(); - } else { - myList.addItemToDos(line.substring(5)); - uiMessage.msgAssignTask(myList, myList.getNumOfItem() - 1); - } - } - - /** - * Save the current task list and output a text file - * - * @param myList TaskList that contains the list of task - */ - private void toSaveTask(TaskList myList) { - String listOfTaskString = toReadTaskConvertToString(myList); - fileAccess.saveProgressIntoFile(myList, listOfTaskString); - } - - /** - * Find the Task requested - * - * @param myList TaskList that contains the list of task - */ - private void toFindTask(TaskList myList, String line) { - if (line.length() <= 5) { - uiMessage.msgInvalidFindTerm(); - return; - } - - String searchTerm = line.substring(5); - ArrayList taskNumberContainingSearchTerm = new ArrayList<>(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - if (hasStringContain(taskDetail, searchTerm)) { - taskNumberContainingSearchTerm.add(i); - } - } - - if (taskNumberContainingSearchTerm.isEmpty()) { - uiMessage.msgInvalidFindTerm(); - return; - } - - uiMessage.msgTaskFound(myList, taskNumberContainingSearchTerm); - } - - /** - * Add a task of Event type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that the user type - */ - private void toAddTaskEvent(TaskList myList, String line) { - - if (line.length() <= 6) { - uiMessage.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/at")) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(6, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String timeStart; - String timeEnd; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskEvent_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); - } else { - timeStart = ParseDateTime.toExtracTimeStartFromSplitDateAndTime(split); - timeEnd = ParseDateTime.toExtracTimeEndFromSplitDateAndTime(split); - toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); - } - - } catch (Exception e) { - uiMessage.msgInvalidInputWrongDateTimeStartEndFormat(); - } - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - */ - private void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate); - uiMessage.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - uiMessage.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); - - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the event - * @param timeStart String that represents the start time of the event - * @param timeEnd String that represents the end time of the event - */ - private void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart, String timeEnd) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); - LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTimeStart == null || taskTimeEnd == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - if (taskTimeStart.isAfter(taskTimeEnd)) { - uiMessage.msgInvalidInputTimeStartLaterThanTimeEnd(); - return; - } - - myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - uiMessage.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); - } - - /** - * Delete a task from the user task - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toDeleteTask(TaskList myList, String line) { - try { - int taskNumber = Integer.parseInt(line.substring(7)); - uiMessage.msgRemoveItem(myList, taskNumber - 1); - myList.removeItem(taskNumber - 1); - } catch (Exception e) { - uiMessage.msgInvalidTaskNumber(); - } - } - - /** - * Add a task of Deadline type into TaskList - *

- * Identify the task date and time that the user input - * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards - * - * @param myList TaskList that contains the list of task - * @param line String that represents the user input - */ - private void toAddTaskDeadline(TaskList myList, String line) { - - if (line.length() <= 9) { - uiMessage.msgInvalidInputMissingDescription(); - return; - } - - if (!line.contains("/by")) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - try { - String taskDetail = line.substring(9, line.indexOf("/")); - String dateAndTime = line.substring(line.indexOf("/") + 4); - String date; - String time; - - String[] split = ParseDateTime.splitDateAndTime(dateAndTime); - date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); - - if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { - toAddTaskDeadline_localDate(myList, taskDetail, date); - } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { - time = ParseDateTime.toExtracTimeFromSplitDateAndTime(split); - toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); - } else { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - } - - } catch (Exception e) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - } - } - - /** - * Add a task of Deadline type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - */ - private void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { - LocalDate taskDate = ParseDateTime.toDate(date); - - if (taskDate == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate); - uiMessage.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); - } - - /** - * Add a task of Event type into TaskList - * - * @param myList TaskList that contains the list of task - * @param taskDetail String that represents the task detail - * @param date String that represents the date of the deadline - * @param time String that represents the time of the deadline - */ - private void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, - String date, String time) { - - LocalDate taskDate = ParseDateTime.toDate(date); - LocalTime taskTime = ParseDateTime.toTime(time); - - if (taskDate == null) { - uiMessage.msgInvalidInputMissingDay(); - return; - } - - if (taskTime == null) { - uiMessage.msgInvalidInputWrongDateTimeFormat(); - return; - } - - myList.addItemDeadline(taskDetail, taskDate, taskTime); - uiMessage.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); - } - - - // Other Support Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - /** - * Read a list of task and convert it into string - * - * @param myList TaskList that contains the list of task - */ - private String toReadTaskConvertToString(TaskList myList) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - boolean isDone = myList.getTaskDoneStatus(i); - String isDoneString = (isDone ? "1" : "0"); - String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); - - sb.append(taskType).append("|"); - sb.append(isDoneString).append("|"); - sb.append(taskDetail).append("|\n"); - } - return sb.toString(); - } - - /** - * Check the validity of task number in String - * - * @param myList TaskList that contains the list of task - * @param userInputString String - * @return boolean True if userInput is a valid task number; False otherwise - */ - private boolean hasValidTaskNumber(TaskList myList, String userInputString) { - - try { - int userInputInt = Integer.parseInt(userInputString); - int numOfItem = myList.getNumOfItem(); - if (userInputInt <= numOfItem) { - return true; - } - } catch (Exception e) { - uiMessage.msgInvalidTaskNumber(); - return false; - } - uiMessage.msgInvalidTaskNumber(); - return false; - } - - private boolean hasValidPriorityNumber(String userInputPriorityS) { - try { - TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); - if (taskPriority == TaskPriority.HIGH) { - return true; - } else if (taskPriority == TaskPriority.MEDIUM) { - return true; - } else if (taskPriority == TaskPriority.LOW) { - return true; - } - } catch (Exception e) { - uiMessage.msgInvalidPriority(); - return false; - } - uiMessage.msgInvalidPriority(); - return false; - } - - private boolean hasStringContain(String sourceString, String searchString) { - String pattern = "\\b" + searchString + "\\b"; - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(sourceString); - return m.find(); - } -} - - - diff --git a/src/main/java/duke/command/CmdAddTask.java b/src/main/java/duke/command/CmdAddTask.java new file mode 100644 index 00000000..e7d8d52e --- /dev/null +++ b/src/main/java/duke/command/CmdAddTask.java @@ -0,0 +1,220 @@ +package duke.command; + +import duke.action.ParseDateTime; +import duke.task.TaskList; +import duke.ui.Message; + +import java.time.LocalDate; +import java.time.LocalTime; + +public class CmdAddTask { + + public static void addTaskToDo(TaskList myList, String userInput){ + if (userInput.length() <= 5) { + Message.msgInvalidInputMissingDescription(); + } else { + myList.addItemToDos(userInput.substring(5)); + Message.msgAssignTask(myList, myList.getNumOfItem() - 1); + } + } + + public static void addTaskEvent(TaskList myList, String userInput){ + if (userInput.length() <= 6) { + Message.msgInvalidInputMissingDescription(); + return; + } + + if (!userInput.contains("/at")) { + Message.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = userInput.substring(6, userInput.indexOf("/")); + String dateAndTime = userInput.substring(userInput.indexOf("/") + 4); + String date; + String timeStart; + String timeEnd; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskEvent_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + timeStart = ParseDateTime.toExtractTimeStartFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart); + } else { + timeStart = ParseDateTime.toExtractTimeStartFromSplitDateAndTime(split); + timeEnd = ParseDateTime.toExtractTimeEndFromSplitDateAndTime(split); + toAddTaskEvent_localDate_localTime(myList, taskDetail, date, timeStart, timeEnd); + } + + } catch (Exception e) { + Message.msgInvalidInputWrongDateTimeStartEndFormat(); + } + } + + public static void addTaskDeadline(TaskList myList, String userInput){ + if (userInput.length() <= 9) { + Message.msgInvalidInputMissingDescription(); + return; + } + + if (!userInput.contains("/by")) { + Message.msgInvalidInputMissingDay(); + return; + } + + try { + String taskDetail = userInput.substring(9, userInput.indexOf("/")); + String dateAndTime = userInput.substring(userInput.indexOf("/") + 4); + String date; + String time; + + String[] split = ParseDateTime.splitDateAndTime(dateAndTime); + date = ParseDateTime.toExtractDateFromSplitDateAndTime(split); + + if (ParseDateTime.isDateAndTime(dateAndTime) == 1) { + toAddTaskDeadline_localDate(myList, taskDetail, date); + } else if (ParseDateTime.isDateAndTime(dateAndTime) == 2) { + time = ParseDateTime.toExtractTimeFromSplitDateAndTime(split); + toAddTaskDeadline_localDate_localTime(myList, taskDetail, date, time); + } else { + Message.msgInvalidInputWrongDateTimeFormat(); + } + + } catch (Exception e) { + Message.msgInvalidInputWrongDateTimeFormat(); + } + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + */ + private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + Message.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate); + Message.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + */ + private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + + if (taskDate == null) { + Message.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null) { + Message.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart); + Message.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the event + * @param timeStart String that represents the start time of the event + * @param timeEnd String that represents the end time of the event + */ + private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, + String date, String timeStart, String timeEnd) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); + LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); + + if (taskDate == null) { + Message.msgInvalidInputMissingDay(); + return; + } + + if (taskTimeStart == null || taskTimeEnd == null) { + Message.msgInvalidInputWrongDateTimeFormat(); + return; + } + + if (taskTimeStart.isAfter(taskTimeEnd)) { + Message.msgInvalidInputTimeStartLaterThanTimeEnd(); + return; + } + + myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); + Message.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Deadline type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + */ + private static void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { + LocalDate taskDate = ParseDateTime.toDate(date); + + if (taskDate == null) { + Message.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate); + Message.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); + } + + /** + * Add a task of Event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param taskDetail String that represents the task detail + * @param date String that represents the date of the deadline + * @param time String that represents the time of the deadline + */ + private static void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, + String date, String time) { + + LocalDate taskDate = ParseDateTime.toDate(date); + LocalTime taskTime = ParseDateTime.toTime(time); + + if (taskDate == null) { + Message.msgInvalidInputMissingDay(); + return; + } + + if (taskTime == null) { + Message.msgInvalidInputWrongDateTimeFormat(); + return; + } + + myList.addItemDeadline(taskDetail, taskDate, taskTime); + Message.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); + } +} diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java new file mode 100644 index 00000000..50bfd7e9 --- /dev/null +++ b/src/main/java/duke/command/CmdDelete.java @@ -0,0 +1,17 @@ +package duke.command; + +import duke.task.TaskList; +import duke.ui.Message; + +public class CmdDelete { + + public static void run(TaskList myList, String userInput) { + try { + int taskNumber = Integer.parseInt(userInput.substring(7)); + Message.msgRemoveItem(myList, taskNumber - 1); + myList.removeItem(taskNumber - 1); + } catch (Exception e) { + Message.msgInvalidTaskNumber(); + } + } +} diff --git a/src/main/java/duke/command/CmdFind.java b/src/main/java/duke/command/CmdFind.java new file mode 100644 index 00000000..73c9fd86 --- /dev/null +++ b/src/main/java/duke/command/CmdFind.java @@ -0,0 +1,41 @@ +package duke.command; + +import duke.task.TaskList; +import duke.ui.Message; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CmdFind { + + public static void run(TaskList myList, String userInput){ + if (userInput.length() <= 5) { + Message.msgInvalidFindTerm(); + return; + } + + String searchTerm = userInput.substring(5); + ArrayList taskNumberContainingSearchTerm = new ArrayList<>(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + if (hasStringContain(taskDetail, searchTerm)) { + taskNumberContainingSearchTerm.add(i); + } + } + + if (taskNumberContainingSearchTerm.isEmpty()) { + Message.msgInvalidFindTerm(); + return; + } + + Message.msgTaskFound(myList, taskNumberContainingSearchTerm); + } + + private static boolean hasStringContain(String sourceString, String searchString) { + String pattern = "\\b" + searchString + "\\b"; + Pattern p = Pattern.compile(pattern); + Matcher m = p.matcher(sourceString); + return m.find(); + } +} diff --git a/src/main/java/duke/command/CmdList.java b/src/main/java/duke/command/CmdList.java new file mode 100644 index 00000000..f4c44b59 --- /dev/null +++ b/src/main/java/duke/command/CmdList.java @@ -0,0 +1,18 @@ +package duke.command; + +import duke.task.TaskList; +import duke.ui.Message; + +public class CmdList { + + /** + * Show full list of tasks + * + * @param myList TaskList that contains the list of task + */ + public static void run(TaskList myList) { + Message.msgList(myList); + + // todo split Message stuffs put here + } +} diff --git a/src/main/java/duke/command/CmdMarkTaskDone.java b/src/main/java/duke/command/CmdMarkTaskDone.java new file mode 100644 index 00000000..af0ed82d --- /dev/null +++ b/src/main/java/duke/command/CmdMarkTaskDone.java @@ -0,0 +1,13 @@ +package duke.command; + +import duke.task.TaskList; +import duke.ui.Message; + +public class CmdMarkTaskDone { + + public static void run(TaskList myList, String userInput) { + int taskNumber = Integer.parseInt(userInput.substring(5)); + myList.setTaskDone(taskNumber - 1); + Message.msgMarkDone(myList, taskNumber - 1); + } +} diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java new file mode 100644 index 00000000..03ec37c0 --- /dev/null +++ b/src/main/java/duke/command/CmdPriority.java @@ -0,0 +1,106 @@ +package duke.command; + +import duke.task.TaskList; +import duke.task.TaskPriority; +import duke.ui.Message; + +import java.util.Scanner; + +public class CmdPriority { + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + */ + public static void run(TaskList myList) { + boolean isTaskNumberValid = false; + String userInputTaskNumber = ""; + + boolean isPriorityNumberValid = false; + String userInputNewPriorityNumber = ""; + + // todo this one go back to ui + + Scanner in = new Scanner(System.in); + + while (isTaskNumberValid == false) { + Message.msgAskUserSetTaskPriority(); + userInputTaskNumber = in.nextLine(); + isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); + } + + int taskNumber = Integer.parseInt(userInputTaskNumber); + Message.msgDashLines(); + + while (isPriorityNumberValid == false) { + Message.msgAskUserWhatPriority(); + userInputNewPriorityNumber = in.nextLine(); + isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); + } + + int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); + + TaskPriority taskPriority = TaskPriority.convertIntToPriority(newPriorityInteger); + toUpdatePriority(myList, taskNumber - 1, taskPriority); + } + + /** + * Check the validity of task number in String + * + * @param myList TaskList that contains the list of task + * @param userInputString String + * @return boolean True if userInput is a valid task number; False otherwise + */ + private static boolean hasValidTaskNumber(TaskList myList, String userInputString) { + + try { + int userInputInt = Integer.parseInt(userInputString); + int numOfItem = myList.getNumOfItem(); + if (userInputInt <= numOfItem) { + return true; + } + } catch (Exception e) { + Message.msgInvalidTaskNumber(); + return false; + } + Message.msgInvalidTaskNumber(); + return false; + } + + private static boolean hasValidPriorityNumber(String userInputPriorityS) { + try { + TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); + if (taskPriority == TaskPriority.HIGH) { + return true; + } else if (taskPriority == TaskPriority.MEDIUM) { + return true; + } else if (taskPriority == TaskPriority.LOW) { + return true; + } + } catch (Exception e) { + Message.msgInvalidPriority(); + return false; + } + Message.msgInvalidPriority(); + return false; + } + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + * @param taskNumber int that indicates the task number + * @param taskPriority TaskPriority(new one) that want to be set + */ + private static void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { + myList.setTaskPriority(taskNumber, taskPriority); + Message.msgSetPriority(myList, taskNumber); // + } +} diff --git a/src/main/java/duke/command/CmdSave.java b/src/main/java/duke/command/CmdSave.java new file mode 100644 index 00000000..a2a96918 --- /dev/null +++ b/src/main/java/duke/command/CmdSave.java @@ -0,0 +1,32 @@ +package duke.command; + +import duke.storage.FileAccess; +import duke.task.TaskList; +import duke.task.TaskType; + +public class CmdSave { + public static void run(TaskList myList, FileAccess fileAccess){ + String listOfTaskString = readTask_ConvertToString(myList); + fileAccess.saveProgressIntoFile(myList, listOfTaskString); + } + + /** + * Read a list of task and convert it into string + * + * @param myList TaskList that contains the list of task + */ + private static String readTask_ConvertToString(TaskList myList) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < myList.getNumOfItem(); i++) { + String taskDetail = myList.getTaskDetail(i); + boolean isDone = myList.getTaskDoneStatus(i); + String isDoneString = (isDone ? "1" : "0"); + String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); + + sb.append(taskType).append("|"); + sb.append(isDoneString).append("|"); + sb.append(taskDetail).append("|\n"); + } + return sb.toString(); + } +} diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java new file mode 100644 index 00000000..8bb04ed9 --- /dev/null +++ b/src/main/java/duke/command/Command.java @@ -0,0 +1,122 @@ +package duke.command; + +import duke.action.ParseDateTime; +import duke.action.Parser; +import duke.storage.FileAccess; +import duke.task.TaskList; +import duke.task.TaskType; +import duke.ui.Message; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Command { + + Parser parser; + + public Command(Parser parser) { + this.parser = parser; + } + + // Basic processCommand Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Show full list of tasks + * + * @param myList TaskList that contains the list of task + */ + public void showFullList(TaskList myList) { + CmdList.run(myList); + } + + /** + * Ask user which task to set priority and change the priority accordingly + * -- Ask user which task to be changed + * -- Ask user what is the new priority + * -- Update the task with new priority + * + * @param myList TaskList that contains the list of task + */ + public void setPriorityTask(TaskList myList) { + CmdPriority.run(myList); + } + + /** + * Mark a task as done + * + * @param myList TaskList that contains the list of task + * @param userInput String that the user type + */ + public void markTaskDone(TaskList myList, String userInput) { + CmdMarkTaskDone.run(myList, userInput); + } + + /** + * Add a task of ToDo type into the list of task + * + * @param myList TaskList that contains the list of task + * @param userInput String that the user type + */ + public void addTaskToDo(TaskList myList, String userInput) { + CmdAddTask.addTaskToDo(myList, userInput); + } + + /** + * Save the current task list and output a text file + * + * @param myList TaskList that contains the list of task + */ + public void saveTask(TaskList myList, FileAccess fileAccess) { + CmdSave.run(myList, fileAccess); + } + + /** + * Find the Task requested + * + * @param myList TaskList that contains the list of task + */ + public void findTask(TaskList myList, String userInput) { + CmdFind.run(myList,userInput); + } + + /** + * Add a task of Event type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param userInput String that the user type + */ + public void addTaskEvent(TaskList myList, String userInput) { + CmdAddTask.addTaskEvent(myList, userInput); + } + + /** + * Delete a task from the user task + * + * @param myList TaskList that contains the list of task + * @param userInput String that represents the user input + */ + public void deleteTask(TaskList myList, String userInput) { + CmdDelete.run(myList,userInput); + } + + /** + * Add a task of Deadline type into TaskList + *

+ * Identify the task date and time that the user input + * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards + * + * @param myList TaskList that contains the list of task + * @param userInput String that represents the user input + */ + public void addTaskDeadline(TaskList myList, String userInput) { + CmdAddTask.addTaskDeadline(myList,userInput); + } + + public void showInvalidCommand(){ + Message.msgInvalidInput(); + } +} diff --git a/src/main/java/duke/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java index 5ae10e3d..b25b3bb5 100644 --- a/src/main/java/duke/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -23,11 +23,11 @@ public class FileAccess { /** * Constructor + * @param filepath */ - public FileAccess() { - filepath = "src\\resources\\progress.txt"; - progressFile = new File(filepath); - ui = new Message(); + public FileAccess(String filepath) { + this.filepath = filepath; + progressFile = new File(this.filepath); } /** @@ -42,9 +42,9 @@ public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { FileWriter fw = new FileWriter(filepath); fw.write(stringToBeWritten); fw.close(); - ui.msgSave(); + Message.msgSave(); } catch (Exception e) { - ui.msgError(e); + Message.msgError(e); } } @@ -63,7 +63,7 @@ public String loadProgressFromFile() { } } catch (Exception e) { - ui.msgError(e); + Message.msgError(e); } return sb.toString(); @@ -87,9 +87,9 @@ public void saveFileExample() { FileWriter fw = new FileWriter(filepath); fw.write("helloWold"); fw.close(); - ui.msgSave(); + Message.msgSave(); } catch (Exception e) { - ui.msgError(e); + Message.msgError(e); } } } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index ae5ae483..63646ba7 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -38,7 +38,7 @@ public static void msgGreet() { * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTask(TaskList myList, int taskNumber) { + public static void msgAssignTask(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -60,7 +60,7 @@ public void msgAssignTask(TaskList myList, int taskNumber) { * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { + public static void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -85,7 +85,7 @@ public void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { + public static void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -112,7 +112,7 @@ public void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumbe * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { + public static void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -137,7 +137,7 @@ public void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { + public static void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -163,7 +163,7 @@ public void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNum * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { + public static void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -189,7 +189,7 @@ public void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, /** * Display message when task is saved */ - public void msgSave() { + public static void msgSave() { System.out.println(" Progress Saved!"); System.out.println("_________________________________"); } @@ -197,7 +197,7 @@ public void msgSave() { /** * Display message when task is loaded */ - public void msgSLoad() { + public static void msgSLoad() { System.out.println(" Progress loaded!"); System.out.println("_________________________________"); } @@ -207,14 +207,14 @@ public void msgSLoad() { /** * Display message to ask user which task they want to set priority */ - public void msgAskUserSetTaskPriority() { + public static void msgAskUserSetTaskPriority() { System.out.println(" Which task do you want to set priority?"); } /** * Display message to ask user what is the new priority */ - public void msgAskUserWhatPriority() { + public static void msgAskUserWhatPriority() { System.out.println(" What is it's priority? choose 1 to 3"); System.out.println(" 1: Very urgent >>> 3: Chin Cai not that urgent"); } @@ -222,7 +222,7 @@ public void msgAskUserWhatPriority() { /** * Display message to tell user that the new priority for a task is set successfully */ - public void msgSetPriority(TaskList myList, int taskNumber) { + public static void msgSetPriority(TaskList myList, int taskNumber) { System.out.println(" Done! The new task priority is set"); TaskPriority taskPriority = myList.getTaskPriority(taskNumber); String taskPriorityInString = TaskPriority.convertPriorityToString(taskPriority); @@ -235,7 +235,7 @@ public void msgSetPriority(TaskList myList, int taskNumber) { /** * Display message to tell user that the term that the user try to find is not found */ - public void msgInvalidFindTerm() { + public static void msgInvalidFindTerm() { System.out.println(" Sorry :( Cannot find what you are looking for ~ "); System.out.println("_________________________________"); } @@ -243,7 +243,7 @@ public void msgInvalidFindTerm() { /** * Display message to show a list of task found based on the term */ - public void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { + public static void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { System.out.println(" Here are the matching tasks in your list:"); int index = 1; for (int i = 0; i < taskNumberContainingSearchTerm.size(); i++) { @@ -263,7 +263,7 @@ public void msgTaskFound(TaskList myList, ArrayList taskNumberContainin * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgMarkDone(TaskList myList, int taskNumber) { + public static void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); msgBlankBeforeTaskDetail(); msgTaskDetail(myList, taskNumber); @@ -275,7 +275,7 @@ public void msgMarkDone(TaskList myList, int taskNumber) { * * @param myList TaskList that contains the list of task */ - public void msgList(TaskList myList) { + public static void msgList(TaskList myList) { for (int i = 0; i < myList.getNumOfItem(); i++) { System.out.print(" " + Integer.toString(i + 1) + "."); msgTaskDetail(myList, i); @@ -286,14 +286,14 @@ public void msgList(TaskList myList) { /** * Display blanks */ - public void msgBlankBeforeTaskDetail() { + public static void msgBlankBeforeTaskDetail() { System.out.print(" "); } /** * Display dash lines separator */ - public void msgDashLines() { + public static void msgDashLines() { System.out.println("_________________________________"); } @@ -303,7 +303,7 @@ public void msgDashLines() { * @param myList TaskList that contains the list of task * @param taskNumber Int that represents the task number */ - public void msgTaskDetail(TaskList myList, int taskNumber) { + public static void msgTaskDetail(TaskList myList, int taskNumber) { TaskType taskType = myList.getTaskType(taskNumber); String taskTypeInString = TaskType.taskTypeToString(taskType); @@ -368,7 +368,7 @@ public void msgTaskDetail(TaskList myList, int taskNumber) { /** * Display message when a task is removed */ - public void msgRemoveItem(TaskList myList, int taskNumber) { + public static void msgRemoveItem(TaskList myList, int taskNumber) { System.out.println(" Noted. I've removed this task:"); msgBlankBeforeTaskDetail(); @@ -392,7 +392,7 @@ public static void msgError(Exception e) { /** * Display message that remind user about invalid input */ - public void msgInvalidInput() { + public static void msgInvalidInput() { System.out.println(" Sorry :( Invalid Input. Try Again ~ "); System.out.println("_________________________________"); } @@ -401,7 +401,7 @@ public void msgInvalidInput() { * Display message that remind user about invalid input * Description of the task is missing */ - public void msgInvalidInputMissingDescription() { + public static void msgInvalidInputMissingDescription() { System.out.println(" ☹ OOPS!!! The description cannot be empty."); System.out.println("_________________________________"); } @@ -410,7 +410,7 @@ public void msgInvalidInputMissingDescription() { * Display message that remind user about invalid input * Date of the task is missing */ - public void msgInvalidInputMissingDay() { + public static void msgInvalidInputMissingDay() { System.out.println(" ☹ OOPS!!! The day cannot be empty."); System.out.println("_________________________________"); } @@ -419,7 +419,7 @@ public void msgInvalidInputMissingDay() { * Display message that remind user about invalid input * Time of the task is missing */ - public void msgInvalidInputMissingTime() { + public static void msgInvalidInputMissingTime() { System.out.println(" ☹ OOPS!!! The time cannot be empty."); System.out.println("_________________________________"); } @@ -428,7 +428,7 @@ public void msgInvalidInputMissingTime() { * Display message that remind user about invalid input * The task number is not found */ - public void msgInvalidTaskNumber() { + public static void msgInvalidTaskNumber() { System.out.println(" ☹ OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } @@ -437,7 +437,7 @@ public void msgInvalidTaskNumber() { * Display message that remind user about invalid input * The priority is invalid */ - public void msgInvalidPriority() { + public static void msgInvalidPriority() { System.out.println(" ☹ OOPS!!! The priority is invalid. Choose 1, 2 or 3"); System.out.println("_________________________________"); } @@ -446,7 +446,7 @@ public void msgInvalidPriority() { * Display message that remind user about invalid input * Format of the date is unaccepted */ - public void msgInvalidInputWrongDateTimeFormat() { + public static void msgInvalidInputWrongDateTimeFormat() { System.out.println(" ☹ OOPS!!! Please follow this format:"); System.out.println(" /by yyyy-mm-dd hh:mm"); System.out.println("_________________________________"); @@ -456,7 +456,7 @@ public void msgInvalidInputWrongDateTimeFormat() { * Display message that remind user about invalid input * Format of the date and time is unaccepted */ - public void msgInvalidInputWrongDateTimeStartEndFormat() { + public static void msgInvalidInputWrongDateTimeStartEndFormat() { System.out.println(" ☹ OOPS!!! Please follow this format:"); System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); System.out.println("_________________________________"); @@ -466,7 +466,7 @@ public void msgInvalidInputWrongDateTimeStartEndFormat() { * Display message that remind user about invalid input * Start time should be before End time */ - public void msgInvalidInputTimeStartLaterThanTimeEnd() { + public static void msgInvalidInputTimeStartLaterThanTimeEnd() { System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); System.out.println("_________________________________"); } @@ -485,7 +485,7 @@ public static void msgBye() throws IOException { /** * Display Buddah.txt */ - private void msgBuddhaProtectMe() throws IOException { + private static void msgBuddhaProtectMe() throws IOException { String everything = ""; // ... \Duke\src\main\resources\buddha.txt diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 57a01e24..b2da9c5c 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -17,14 +17,16 @@ public Ui(){ } - public String requestUserInput(){ + public String requestUserInput(Scanner in){ - String line; - Scanner in = new Scanner(System.in); - line = in.nextLine(); - in.close(); - return line; + String userInput = ""; + try { + System.out.print(">> "); + userInput = in.nextLine(); + } catch (Exception e) { + Message.msgError(e); + } + return userInput; } - } diff --git a/src/resources/progress.txt b/src/resources/progress.txt index da8f3083..ac57e098 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,3 +1,8 @@ +T|0|borrow book| +T|1|borrow book| +T|0|borrow book| +T|0|borrow book| +E|1|project meeting | E|0|project meeting | -E|0|project meeting | -E|0|project meeting | +D|0|return book | +D|0|return book | diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 723c13d5..68d2e904 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,6 +1,6 @@ todo borrow book -deadline return book /by Sunday -event project meeting /at Mon 2-4pm +event project meeting /at 2016-12-25 +deadline return book /by 2016-12-25 18:00 list done 2 done 10 From 7306ae5ab47227e6f3cb57058ab21ee16a3726f9 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Wed, 10 Nov 2021 21:15:45 +0800 Subject: [PATCH 33/39] Restructure 4: Advance Restructure --- src/main/java/duke/Duke.java | 2 + src/main/java/duke/RunDuke.java | 9 +- src/main/java/duke/action/Parser.java | 48 ++- src/main/java/duke/command/CmdAddTask.java | 114 +++++++- src/main/java/duke/command/CmdDelete.java | 7 +- src/main/java/duke/command/CmdFind.java | 18 +- src/main/java/duke/command/CmdList.java | 9 +- src/main/java/duke/command/CmdPriority.java | 25 +- src/main/java/duke/command/Command.java | 32 +- src/main/java/duke/ui/Message.java | 308 ++++++++------------ src/main/java/duke/ui/MsgTaskDetail.java | 104 +++++++ src/main/java/duke/ui/Ui.java | 6 +- text-ui-test/input.txt | 25 +- 13 files changed, 441 insertions(+), 266 deletions(-) create mode 100644 src/main/java/duke/ui/MsgTaskDetail.java diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index b3cdc258..37d37e4c 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -4,6 +4,8 @@ import duke.task.TaskList; import duke.ui.Ui; +import java.util.Scanner; + /** * Begin the program here. * diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index fbfb0617..b3e10ad3 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -15,7 +15,7 @@ public class RunDuke { private static FileAccess fileAccess; private static Parser parser; private static Command cmd; - private static Scanner in; + private static Scanner scanner; public RunDuke(TaskList myList, Ui ui, FileAccess fileAccess) { @@ -24,7 +24,7 @@ public RunDuke(TaskList myList, Ui ui, FileAccess fileAccess) { this.fileAccess = fileAccess; parser = new Parser(); cmd = new Command(parser); - in = new Scanner(System.in); + scanner = new Scanner(System.in); } public void run() { @@ -32,8 +32,9 @@ public void run() { boolean isDukeRunning = true; while (isDukeRunning) { - String userInput = ui.requestUserInput(in); + String userInput = ui.requestUserInput(scanner); String userCommand = parser.processUserCommand(userInput); + System.out.println(userCommand); isDukeRunning = canProcessCommand(userCommand, userInput); } } @@ -46,7 +47,7 @@ private static boolean canProcessCommand(String userCommand, String userInput) { cmd.showFullList(myList); return true; case "set": - cmd.setPriorityTask(myList); + cmd.setPriorityTask(myList, scanner); return true; case "done": cmd.markTaskDone(myList, userInput); diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index b3293ecc..3e71bee6 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,39 +1,57 @@ package duke.action; -import duke.ui.Message; - public class Parser { - public Parser (){ + public Parser() { } - public String processUserCommand(String userInput){ + public String processUserCommand(String userInput) { + if (userInput.equals("bye")) { return "bye"; - } else if (userInput.equals("list")) { + } + + if (userInput.equals("list")) { return "list"; - } else if (userInput.startsWith("set")) { + } + + if (userInput.equals("set")){ return "set"; - } else if (userInput.startsWith("done")) { + } + + String userInputStartWith = getFirstWord(userInput); + + switch (userInputStartWith) { + case "done": return "done"; - } else if (userInput.startsWith("todo")) { + case "todo": return "todo"; - } else if (userInput.startsWith("save")) { + case "save": return "save"; - } else if (userInput.startsWith("load")) { + case "load": return "load"; - } else if (userInput.startsWith("find")) { + case "find": return "find"; - } else if (userInput.startsWith("event")) { + case "event": return "event"; - } else if (userInput.startsWith("delete")) { + case "delete": return "delete"; - } else if (userInput.startsWith("deadline")) { + case "deadline": return "deadline"; - } else { + default: return "invalid"; } } + private String getFirstWord(String firstWord) { + + int index = firstWord.indexOf(' '); + + if (index > -1) { + return firstWord.substring(0, index).trim(); + } else { + return "invalid"; + } + } } diff --git a/src/main/java/duke/command/CmdAddTask.java b/src/main/java/duke/command/CmdAddTask.java index e7d8d52e..7783b398 100644 --- a/src/main/java/duke/command/CmdAddTask.java +++ b/src/main/java/duke/command/CmdAddTask.java @@ -2,6 +2,7 @@ import duke.action.ParseDateTime; import duke.task.TaskList; +import duke.task.TaskType; import duke.ui.Message; import java.time.LocalDate; @@ -9,16 +10,25 @@ public class CmdAddTask { - public static void addTaskToDo(TaskList myList, String userInput){ + public static void addTaskToDo(TaskList myList, String userInput) { + if (userInput.length() <= 5) { Message.msgInvalidInputMissingDescription(); - } else { - myList.addItemToDos(userInput.substring(5)); - Message.msgAssignTask(myList, myList.getNumOfItem() - 1); + return; } + + myList.addItemToDos(userInput.substring(5)); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String taskDetail = getTaskDetail(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + + Message.msgAssignTaskToDo(taskTypeInString, isDoneInString, taskDetail, numOfItem); } - public static void addTaskEvent(TaskList myList, String userInput){ + public static void addTaskEvent(TaskList myList, String userInput) { if (userInput.length() <= 6) { Message.msgInvalidInputMissingDescription(); return; @@ -55,7 +65,7 @@ public static void addTaskEvent(TaskList myList, String userInput){ } } - public static void addTaskDeadline(TaskList myList, String userInput){ + public static void addTaskDeadline(TaskList myList, String userInput) { if (userInput.length() <= 9) { Message.msgInvalidInputMissingDescription(); return; @@ -105,7 +115,15 @@ private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, } myList.addItemEvent(taskDetail, taskDate); - Message.msgAssignTaskEventTaskDate(myList, myList.getNumOfItem() - 1); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + + Message.msgAssignTaskEventTaskDate(taskTypeInString, isDoneInString, + taskDetail, dateInString, numOfItem); } /** @@ -117,7 +135,7 @@ private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, * @param timeStart String that represents the start time of the event */ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart) { + String date, String timeStart) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); @@ -133,7 +151,16 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t } myList.addItemEvent(taskDetail, taskDate, taskTimeStart); - Message.msgAssignTaskEventTaskDateTaskTimeStart(myList, myList.getNumOfItem() - 1); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + String getTimeStartInString = getTaskEvent_TimeStart_InString(myList, lastTaskIndex); + + Message.msgAssignTaskEventTaskDateTaskTimeStart(taskTypeInString, isDoneInString, + taskDetail, dateInString, getTimeStartInString, numOfItem); } /** @@ -146,7 +173,7 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t * @param timeEnd String that represents the end time of the event */ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, - String date, String timeStart, String timeEnd) { + String date, String timeStart, String timeEnd) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); @@ -168,7 +195,17 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t } myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); - Message.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(myList, myList.getNumOfItem() - 1); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); + String getTimeStartInString = getTaskEvent_TimeStart_InString(myList, lastTaskIndex); + String getTimeEndInString = getTaskEvent_TimeEnd_InString(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + + Message.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(taskTypeInString, isDoneInString, + taskDetail, dateInString, getTimeStartInString, getTimeEndInString, numOfItem); } /** @@ -187,7 +224,14 @@ private static void toAddTaskDeadline_localDate(TaskList myList, String taskDeta } myList.addItemDeadline(taskDetail, taskDate); - Message.msgAssignTaskDeadlineTaskDate(myList, myList.getNumOfItem() - 1); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String dateInString = getTaskDeadline_Date_InString(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + + Message.msgAssignTaskDeadlineTaskDate(taskTypeInString, isDoneInString, taskDetail, dateInString, numOfItem); } /** @@ -199,7 +243,7 @@ private static void toAddTaskDeadline_localDate(TaskList myList, String taskDeta * @param time String that represents the time of the deadline */ private static void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, - String date, String time) { + String date, String time) { LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTime = ParseDateTime.toTime(time); @@ -215,6 +259,48 @@ private static void toAddTaskDeadline_localDate_localTime(TaskList myList, Strin } myList.addItemDeadline(taskDetail, taskDate, taskTime); - Message.msgAssignTaskDeadlineTaskDateTaskTime(myList, myList.getNumOfItem() - 1); + + int lastTaskIndex = myList.getNumOfItem() - 1; + String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); + String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String dateInString = getTaskDeadline_Date_InString(myList, lastTaskIndex); + String timeInString = getTaskDeadline_Time_InString(myList, lastTaskIndex); + int numOfItem = lastTaskIndex + 1; + + Message.msgAssignTaskDeadlineTaskDateTaskTime(taskTypeInString, isDoneInString, taskDetail, dateInString, timeInString, numOfItem); + } + + private static String getTaskType_InString(TaskList myList, int taskIndex) { + TaskType taskType = myList.getTaskType(taskIndex); + return TaskType.taskTypeToString(taskType); + } + + private static String getIsDone_InString(TaskList myList, int taskIndex) { + boolean isDone = myList.getTaskDoneStatus(taskIndex); + return (isDone ? "X" : " "); + } + + private static String getTaskDetail(TaskList myList, int taskIndex) { + return myList.getTaskDetail(taskIndex); + } + + private static String getTaskEvent_Date_InString(TaskList myList, int taskIndex) { + return myList.getTaskEventTaskDateInString(taskIndex); + } + + private static String getTaskEvent_TimeStart_InString(TaskList myList, int taskIndex){ + return myList.getTaskEventTaskTimeStartInString(taskIndex); + } + + private static String getTaskEvent_TimeEnd_InString (TaskList myList, int taskIndex){ + return myList.getTaskEventTaskTimeEndInString(taskIndex); + } + + private static String getTaskDeadline_Date_InString(TaskList myList, int taskIndex){ + return myList.getTaskDeadLineTaskDateInString(taskIndex); + } + + private static String getTaskDeadline_Time_InString(TaskList myList, int taskIndex){ + return myList.getTaskDeadLineTaskTimeInString(taskIndex); } } diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java index 50bfd7e9..a654abc7 100644 --- a/src/main/java/duke/command/CmdDelete.java +++ b/src/main/java/duke/command/CmdDelete.java @@ -7,9 +7,10 @@ public class CmdDelete { public static void run(TaskList myList, String userInput) { try { - int taskNumber = Integer.parseInt(userInput.substring(7)); - Message.msgRemoveItem(myList, taskNumber - 1); - myList.removeItem(taskNumber - 1); + int taskIndex = Integer.parseInt(userInput.substring(7)) - 1; + int numOfTaskAfterDelete = myList.getNumOfItem() - 1; + Message.msgRemoveItem(myList, taskIndex, numOfTaskAfterDelete); + myList.removeItem(taskIndex); } catch (Exception e) { Message.msgInvalidTaskNumber(); } diff --git a/src/main/java/duke/command/CmdFind.java b/src/main/java/duke/command/CmdFind.java index 73c9fd86..5c417e70 100644 --- a/src/main/java/duke/command/CmdFind.java +++ b/src/main/java/duke/command/CmdFind.java @@ -2,6 +2,7 @@ import duke.task.TaskList; import duke.ui.Message; +import duke.ui.MsgTaskDetail; import java.util.ArrayList; import java.util.regex.Matcher; @@ -29,7 +30,8 @@ public static void run(TaskList myList, String userInput){ return; } - Message.msgTaskFound(myList, taskNumberContainingSearchTerm); + Message.msgTaskFoundOpeningMsg(); + showTaskFound(myList, taskNumberContainingSearchTerm); } private static boolean hasStringContain(String sourceString, String searchString) { @@ -38,4 +40,18 @@ private static boolean hasStringContain(String sourceString, String searchString Matcher m = p.matcher(sourceString); return m.find(); } + + /** + * Display message to show a list of task found based on the term + */ + private static void showTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { + int index = 1; + for (int i = 0; i < taskNumberContainingSearchTerm.size(); i++) { + int taskNumber = taskNumberContainingSearchTerm.get(i); + Message.msgBlankBeforeTaskDetail(); + Message.msgShowBracketWithIndex(index); + new MsgTaskDetail(myList, taskNumber).showTaskDetail(); + index++; + } + } } diff --git a/src/main/java/duke/command/CmdList.java b/src/main/java/duke/command/CmdList.java index f4c44b59..79a63850 100644 --- a/src/main/java/duke/command/CmdList.java +++ b/src/main/java/duke/command/CmdList.java @@ -2,6 +2,7 @@ import duke.task.TaskList; import duke.ui.Message; +import duke.ui.MsgTaskDetail; public class CmdList { @@ -11,8 +12,10 @@ public class CmdList { * @param myList TaskList that contains the list of task */ public static void run(TaskList myList) { - Message.msgList(myList); - - // todo split Message stuffs put here + for (int i = 0; i < myList.getNumOfItem(); i++) { + Message.msgShowBracketWithIndex(i + 1); + new MsgTaskDetail(myList, i).showTaskDetail(); + } + Message.msgDashLines(); } } diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java index 03ec37c0..be2489f3 100644 --- a/src/main/java/duke/command/CmdPriority.java +++ b/src/main/java/duke/command/CmdPriority.java @@ -16,20 +16,17 @@ public class CmdPriority { * * @param myList TaskList that contains the list of task */ - public static void run(TaskList myList) { + public static void run(TaskList myList, Scanner scanner) { boolean isTaskNumberValid = false; String userInputTaskNumber = ""; boolean isPriorityNumberValid = false; String userInputNewPriorityNumber = ""; - // todo this one go back to ui - - Scanner in = new Scanner(System.in); - while (isTaskNumberValid == false) { Message.msgAskUserSetTaskPriority(); - userInputTaskNumber = in.nextLine(); + Message.msgArrowHead(); + userInputTaskNumber = scanner.nextLine(); isTaskNumberValid = hasValidTaskNumber(myList, userInputTaskNumber); } @@ -38,7 +35,7 @@ public static void run(TaskList myList) { while (isPriorityNumberValid == false) { Message.msgAskUserWhatPriority(); - userInputNewPriorityNumber = in.nextLine(); + userInputNewPriorityNumber = scanner.nextLine(); isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); } @@ -96,11 +93,17 @@ private static boolean hasValidPriorityNumber(String userInputPriorityS) { * -- Update the task with new priority * * @param myList TaskList that contains the list of task - * @param taskNumber int that indicates the task number + * @param taskIndex int that indicates the task number * @param taskPriority TaskPriority(new one) that want to be set */ - private static void toUpdatePriority(TaskList myList, int taskNumber, TaskPriority taskPriority) { - myList.setTaskPriority(taskNumber, taskPriority); - Message.msgSetPriority(myList, taskNumber); // + private static void toUpdatePriority(TaskList myList, int taskIndex, TaskPriority taskPriority) { + myList.setTaskPriority(taskIndex, taskPriority); + String taskPriorityInString = getTaskPriority_InString(myList, taskIndex); + Message.msgSetPriority(taskIndex + 1, taskPriorityInString); + } + + private static String getTaskPriority_InString(TaskList myList, int taskIndex){ + TaskPriority taskPriority = myList.getTaskPriority(taskIndex); + return TaskPriority.convertPriorityToString(taskPriority); } } diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 8bb04ed9..f97819eb 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -8,6 +8,7 @@ import duke.ui.Message; import java.util.ArrayList; +import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,16 +37,17 @@ public void showFullList(TaskList myList) { * -- Ask user what is the new priority * -- Update the task with new priority * - * @param myList TaskList that contains the list of task + * @param myList TaskList that contains the list of task + * @param scanner Scanner for user input */ - public void setPriorityTask(TaskList myList) { - CmdPriority.run(myList); + public void setPriorityTask(TaskList myList, Scanner scanner) { + CmdPriority.run(myList, scanner); } /** * Mark a task as done * - * @param myList TaskList that contains the list of task + * @param myList TaskList that contains the list of task * @param userInput String that the user type */ public void markTaskDone(TaskList myList, String userInput) { @@ -55,7 +57,7 @@ public void markTaskDone(TaskList myList, String userInput) { /** * Add a task of ToDo type into the list of task * - * @param myList TaskList that contains the list of task + * @param myList TaskList that contains the list of task * @param userInput String that the user type */ public void addTaskToDo(TaskList myList, String userInput) { @@ -77,7 +79,7 @@ public void saveTask(TaskList myList, FileAccess fileAccess) { * @param myList TaskList that contains the list of task */ public void findTask(TaskList myList, String userInput) { - CmdFind.run(myList,userInput); + CmdFind.run(myList, userInput); } /** @@ -86,8 +88,8 @@ public void findTask(TaskList myList, String userInput) { * Identify the task date and time that the user input * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards * - * @param myList TaskList that contains the list of task - * @param userInput String that the user type + * @param myList TaskList that contains the list of task + * @param userInput String that the user type */ public void addTaskEvent(TaskList myList, String userInput) { CmdAddTask.addTaskEvent(myList, userInput); @@ -96,11 +98,11 @@ public void addTaskEvent(TaskList myList, String userInput) { /** * Delete a task from the user task * - * @param myList TaskList that contains the list of task - * @param userInput String that represents the user input + * @param myList TaskList that contains the list of task + * @param userInput String that represents the user input */ public void deleteTask(TaskList myList, String userInput) { - CmdDelete.run(myList,userInput); + CmdDelete.run(myList, userInput); } /** @@ -109,14 +111,14 @@ public void deleteTask(TaskList myList, String userInput) { * Identify the task date and time that the user input * Calls for respective AddTaskEvent_XXX to create a task object in TaskList afterwards * - * @param myList TaskList that contains the list of task - * @param userInput String that represents the user input + * @param myList TaskList that contains the list of task + * @param userInput String that represents the user input */ public void addTaskDeadline(TaskList myList, String userInput) { - CmdAddTask.addTaskDeadline(myList,userInput); + CmdAddTask.addTaskDeadline(myList, userInput); } - public void showInvalidCommand(){ + public void showInvalidCommand() { Message.msgInvalidInput(); } } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index 63646ba7..46ed2f16 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -5,11 +5,8 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; import duke.task.TaskList; -import duke.task.TaskPriority; -import duke.task.TaskType; /** * Handle all the message methods @@ -35,152 +32,119 @@ public static void msgGreet() { /** * Display message when a task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes the task type + * @param isDoneInString String that describes the isDone status + * @param taskDetail String that describes the task detail + * @param numOfItem Int that describes the number of items in taskList */ - public static void msgAssignTask(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); + public static void msgAssignTaskToDo(String taskTypeInString, String isDoneInString, String taskDetail, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } /** * Display message when a deadline task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes the task type + * @param isDoneInString String that describes the isDone status + * @param taskDetail String that describes the task detail + * @param dateInString String that describes the task date + * @param numOfItem Int that describes the number of items in taskList */ - public static void msgAssignTaskDeadlineTaskDate(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); + public static void msgAssignTaskDeadlineTaskDate(String taskTypeInString, String isDoneInString, + String taskDetail, String dateInString, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateInString + ")"); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } /** * Display message when a deadline task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes the task type + * @param isDoneInString String that describes the isDone status + * @param taskDetail String that describes the task detail + * @param dateInString String that describes the task date + * @param timeInString String that describes the task time + * @param numOfItem Int that describes the number of items in taskList */ - public static void msgAssignTaskDeadlineTaskDateTaskTime(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskDeadLineTaskDateInString(taskNumber); - String timeString = myList.getTaskDeadLineTaskTimeInString(taskNumber); + public static void msgAssignTaskDeadlineTaskDateTaskTime(String taskTypeInString, String isDoneInString, + String taskDetail, String dateInString, + String timeInString, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println( " [" + taskTypeInString + "][" + isDoneInString + "] " - + taskDetail + "(by: " + dateString + " " + timeString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + + taskDetail + "(by: " + dateInString + " " + timeInString + ")"); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } /** * Display message when an event task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes task type + * @param isDoneInString String that describes is done status + * @param taskDetail String that describes task detail + * @param dateInString String that describes task date + * @param numOfItem Int that describes the number of tasks */ - public static void msgAssignTaskEventTaskDate(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); + public static void msgAssignTaskEventTaskDate(String taskTypeInString, String isDoneInString, + String taskDetail, String dateInString, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateInString + ")"); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } /** * Display message when an event task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes task type + * @param isDoneInString String that describes is done status + * @param taskDetail String that describes task detail + * @param dateInString String that describes task date + * @param timeStartInString String that describes the start time + * @param numOfItem Int that describes the number of tasks */ - public static void msgAssignTaskEventTaskDateTaskTimeStart(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); - String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); + public static void msgAssignTaskEventTaskDateTaskTimeStart(String taskTypeInString, String isDoneInString, String taskDetail, + String dateInString, String timeStartInString, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" (at: " + dateString + ", from: " + timeStartString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println(" (at: " + dateInString + ", from: " + timeStartInString + ")"); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } /** * Display message when an event task is assigned * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number + * @param taskTypeInString String that describes task type + * @param isDoneInString String that describes is done status + * @param taskDetail String that describes task detail + * @param dateInString String that describes task date + * @param timeStartInString String that describes the start time + * @param timeEndInString String that describes the end time + * @param numOfItem Int that describes the number of tasks */ - public static void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(TaskList myList, int taskNumber) { - - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateString = myList.getTaskEventTaskDateInString(taskNumber); - String timeStartString = myList.getTaskEventTaskTimeStartInString(taskNumber); - String timeEndString = myList.getTaskEventTaskTimeEndInString(taskNumber); + public static void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(String taskTypeInString, String isDoneInString, + String taskDetail, String dateInString, + String timeStartInString, String timeEndInString, + int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" (at: " + dateString + ", from: " + timeStartString + " to " + timeEndString + ")"); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + System.out.println(" (at: " + dateInString + ", from: " + timeStartInString + " to " + timeEndInString + ")"); + System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } @@ -221,12 +185,13 @@ public static void msgAskUserWhatPriority() { /** * Display message to tell user that the new priority for a task is set successfully + * + * @param taskNumber Int that describes the task number in the TaskList + * @param taskPriorityInString String that describes the priority of the task */ - public static void msgSetPriority(TaskList myList, int taskNumber) { + public static void msgSetPriority(int taskNumber, String taskPriorityInString) { System.out.println(" Done! The new task priority is set"); - TaskPriority taskPriority = myList.getTaskPriority(taskNumber); - String taskPriorityInString = TaskPriority.convertPriorityToString(taskPriority); - System.out.println(" Priority of Task #" + taskNumber + 1 + " has been set to " + taskPriorityInString); + System.out.println(" Priority of Task #" + taskNumber + " has been set to " + taskPriorityInString); System.out.println("_________________________________"); } @@ -241,18 +206,10 @@ public static void msgInvalidFindTerm() { } /** - * Display message to show a list of task found based on the term + * Display message to show the opening message of "find" */ - public static void msgTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { + public static void msgTaskFoundOpeningMsg() { System.out.println(" Here are the matching tasks in your list:"); - int index = 1; - for (int i = 0; i < taskNumberContainingSearchTerm.size(); i++) { - int taskNumber = taskNumberContainingSearchTerm.get(i); - msgBlankBeforeTaskDetail(); - System.out.print(index + "."); - msgTaskDetail(myList, taskNumber); - index++; - } } // Other Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -266,21 +223,23 @@ public static void msgTaskFound(TaskList myList, ArrayList taskNumberCo public static void msgMarkDone(TaskList myList, int taskNumber) { System.out.println(" Naisuuuu! This task is marked as done: "); msgBlankBeforeTaskDetail(); - msgTaskDetail(myList, taskNumber); + new MsgTaskDetail(myList, taskNumber).showTaskDetail(); System.out.println("_________________________________"); } /** - * Display message to show the full list of task + * Display [x] where x is the int parameter + *

+ * Used in CmdList function to show the following: + * 1. + * 2. + * 3. + * etc. * - * @param myList TaskList that contains the list of task + * @param index Int that will be put inside the bracket */ - public static void msgList(TaskList myList) { - for (int i = 0; i < myList.getNumOfItem(); i++) { - System.out.print(" " + Integer.toString(i + 1) + "."); - msgTaskDetail(myList, i); - } - System.out.println("_________________________________"); + public static void msgShowBracketWithIndex(int index) { + System.out.print(" " + index + "."); } /** @@ -297,86 +256,61 @@ public static void msgDashLines() { System.out.println("_________________________________"); } - /** - * Display detail of a task - * - * @param myList TaskList that contains the list of task - * @param taskNumber Int that represents the task number - */ - public static void msgTaskDetail(TaskList myList, int taskNumber) { - TaskType taskType = myList.getTaskType(taskNumber); - String taskTypeInString = TaskType.taskTypeToString(taskType); - - boolean isDone = myList.getTaskDoneStatus(taskNumber); - String isDoneInString = (isDone ? "X" : " "); - - String taskDetail = myList.getTaskDetail(taskNumber); - - String dateTimeString = ""; - String year = ""; - String month = ""; - String day = ""; - String time = ""; - String timeStart = ""; - String timeEnd = ""; - - switch (taskType) { - case TODOS: - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - break; - case DEADLINE: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskDeadLineTaskDateYearInString(taskNumber); - month = myList.getTaskDeadLineTaskDateMonthInString(taskNumber); - day = myList.getTaskDeadLineTaskDateDayInString(taskNumber); - time = myList.getTaskDeadLineTaskTimeInString(taskNumber); - - if (time.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(by: " + year + " " + month + " " + day + " " + time + ")"); - } - break; - case EVENT: - // dateTimeString = myList.getTaskDeadLine_TaskDate_InString(taskNumber); - year = myList.getTaskEventTaskDateYearInString(taskNumber); - month = myList.getTaskEventTaskDateMonthInString(taskNumber); - day = myList.getTaskEventTaskDateDayInString(taskNumber); - timeStart = myList.getTaskEventTaskTimeStartInString(taskNumber); - timeEnd = myList.getTaskEventTaskTimeEndInString(taskNumber); - - if (timeStart.equals("null") && timeEnd.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail - + "(at: " + year + " " + month + " " + day + ")"); - } else if (timeEnd.equals("null")) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + ")"); - } else { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.print(" (at " + year + " " + month + " " + day); - System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); - } - break; - default: - break; - } + public static void msgTaskTodo(String taskTypeInString, String isDoneInString, + String taskDetail, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + } + + public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, + String year, String month, String day, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println(" (at " + year + " " + month + " " + day + ")"); + } + + public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, + String year, String month, String day, String timeStart, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + ")"); + } + + public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, + String year, String month, String day, String timeStart, + String timeEnd, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.print(" (at " + year + " " + month + " " + day); + System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); + } + + public static void msgTaskDeadline(String taskTypeInString, String isDoneInString, String taskDetail, + String year, String month, String day, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println(" by: " + year + " " + month + " " + day + ")"); } + public static void msgTaskDeadline(String taskTypeInString, String isDoneInString, String taskDetail, + String year, String month, String day, + String timeStart, String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println(" by: " + year + " " + month + " " + day + " " + timeStart + ")"); + } + + /** * Display message when a task is removed */ - public static void msgRemoveItem(TaskList myList, int taskNumber) { + public static void msgRemoveItem(TaskList myList, int taskNumber, int numOfTaskAfterDelete) { System.out.println(" Noted. I've removed this task:"); msgBlankBeforeTaskDetail(); - msgTaskDetail(myList, taskNumber); - System.out.println(" Now you have " + myList.getNumOfItem() + " tasks in the list."); + new MsgTaskDetail(myList, taskNumber).showTaskDetail(); + System.out.println(" Now you have " + numOfTaskAfterDelete + " tasks in the list."); System.out.println("_________________________________"); } + public static void msgArrowHead(){ + System.out.print(">> "); + } // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** @@ -506,8 +440,6 @@ private static void msgBuddhaProtectMe() throws IOException { try { FileReader fr = new FileReader(filePath); - // FileReader fr = new FileReader("\\My Files\\School - // Documents\\Repository\\Duke\\src\\main\\resources\\buddha.txt"); BufferedReader br = new BufferedReader(fr); StringBuilder sb = new StringBuilder(); String line = br.readLine(); diff --git a/src/main/java/duke/ui/MsgTaskDetail.java b/src/main/java/duke/ui/MsgTaskDetail.java new file mode 100644 index 00000000..e266bcc9 --- /dev/null +++ b/src/main/java/duke/ui/MsgTaskDetail.java @@ -0,0 +1,104 @@ +package duke.ui; + +import duke.task.TaskList; +import duke.task.TaskPriority; +import duke.task.TaskType; + +public class MsgTaskDetail { + + private static TaskList myList; + private static int taskIndex; + private static String taskTypeInString; + private static String isDoneInString; + private static String taskDetail; + private static String taskPriorityInString; + private static String year; + private static String month; + private static String day; + private static String timeStart; + private static String timeEnd; + + public MsgTaskDetail(TaskList myList, int taskIndex){ + this.myList = myList; + this.taskIndex = taskIndex; + taskTypeInString = getTaskType_InString(myList, taskIndex); + isDoneInString = getIsDone_InString(myList, taskIndex); + taskDetail = getTaskDetail(myList, taskIndex); + taskPriorityInString = getTaskPriority(myList, taskIndex); + } + + public static void showTaskDetail(){ + TaskType taskType = myList.getTaskType(taskIndex); + + switch(taskType){ + case TODOS: + showTaskTodo(); + break; + case EVENT: + showTaskEvent(myList, taskIndex); + break; + case DEADLINE: + showTaskDeadline(myList, taskIndex); + break; + default: + // todo + } + } + + private static void showTaskTodo(){ + Message.msgTaskTodo(taskTypeInString, isDoneInString,taskDetail, taskPriorityInString); + } + + private static void showTaskEvent(TaskList myList, int taskIndex) { + year = myList.getTaskEventTaskDateYearInString(taskIndex); + month = myList.getTaskEventTaskDateMonthInString(taskIndex); + day = myList.getTaskEventTaskDateDayInString(taskIndex); + timeStart = myList.getTaskEventTaskTimeStartInString(taskIndex); + timeEnd = myList.getTaskEventTaskTimeEndInString(taskIndex); + + if (timeStart.equals("null") && timeEnd.equals("null")) { + Message.msgTaskEvent(taskTypeInString, isDoneInString, taskDetail, + year, month, day, taskPriorityInString); + } else if (timeEnd.equals("null")) { + Message.msgTaskEvent(taskTypeInString, isDoneInString, taskDetail, + year, month, day, timeStart, taskPriorityInString); + } else { + Message.msgTaskEvent(taskTypeInString, isDoneInString, taskDetail, + year, month, day, timeStart, timeEnd, taskPriorityInString); + } + } + + private static void showTaskDeadline(TaskList myList, int taskIndex){ + year = myList.getTaskDeadLineTaskDateYearInString(taskIndex); + month = myList.getTaskDeadLineTaskDateMonthInString(taskIndex); + day = myList.getTaskDeadLineTaskDateDayInString(taskIndex); + timeStart = myList.getTaskDeadLineTaskTimeInString(taskIndex); + + if (timeStart.equals("null")){ + Message.msgTaskDeadline(taskTypeInString, isDoneInString, taskDetail, + year, month, day, taskPriorityInString); + } else { + Message.msgTaskDeadline(taskTypeInString, isDoneInString, taskDetail, + year, month, day, timeStart, taskPriorityInString); + } + } + + private static String getTaskType_InString(TaskList myList, int taskIndex) { + TaskType taskType = myList.getTaskType(taskIndex); + return TaskType.taskTypeToString(taskType); + } + + private static String getIsDone_InString(TaskList myList, int taskIndex) { + boolean isDone = myList.getTaskDoneStatus(taskIndex); + return (isDone ? "X" : " "); + } + + private static String getTaskDetail(TaskList myList, int taskIndex) { + return myList.getTaskDetail(taskIndex); + } + + private static String getTaskPriority(TaskList myList, int taskIndex) { + TaskPriority taskPriority = myList.getTaskPriority(taskIndex); + return TaskPriority.convertPriorityToString(taskPriority); + } +} diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index b2da9c5c..9d6e47d3 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -17,13 +17,13 @@ public Ui(){ } - public String requestUserInput(Scanner in){ + public String requestUserInput(Scanner scanner){ String userInput = ""; try { - System.out.print(">> "); - userInput = in.nextLine(); + Message.msgArrowHead(); + userInput = scanner.nextLine(); } catch (Exception e) { Message.msgError(e); } diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 68d2e904..ed1e364d 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,18 +1,25 @@ todo borrow book -event project meeting /at 2016-12-25 -deadline return book /by 2016-12-25 18:00 +event project meeting /at 2001-01-25 +event project meeting /at 2002-06-25 18:00 +event project meeting /at 2002-06-25 18:00 19:00 +event project meeting /at 2003-12-25 19:00 19:00 +deadline return book /by 2010-01-25 +deadline return book /by 2011-02-25 06:00 list done 2 -done 10 -list -delete 1 -delete 10 +done 5 +done 6 list -deadline do homework /by no idea :-p +delete 1 +delete 5 list -deadline do homework -deadline +set +2 +1 list +save + + deadline return book /by 2016-12-25 18:00 deadline return book /by 2016-12-25 deadline return book From 90a0174a5dc4651abd5355828defa0182a9f7f62 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Thu, 11 Nov 2021 18:58:33 +0800 Subject: [PATCH 34/39] Improve Funcitonality 1: Improve save, introduce load; Update Duke class to incorporate load; Introduce customized exception --- src/main/java/duke/Duke.java | 16 ++- src/main/java/duke/EndDuke.java | 16 ++- src/main/java/duke/LoadDuke.java | 120 +++++++++++++++++ src/main/java/duke/RunDuke.java | 11 +- src/main/java/duke/action/ParseDateTime.java | 12 +- src/main/java/duke/action/ParseProgress.java | 12 ++ src/main/java/duke/action/Parser.java | 17 +-- src/main/java/duke/command/CmdDelete.java | 6 + src/main/java/duke/command/CmdPriority.java | 6 + src/main/java/duke/command/CmdSave.java | 125 +++++++++++++++--- src/main/java/duke/command/Command.java | 6 +- .../UnableToLoadBuddhaException.java | 4 + .../UnableToLoadProcessException.java | 5 + src/main/java/duke/storage/FileAccess.java | 91 ++++++++----- src/main/java/duke/task/TaskPriority.java | 16 +++ src/main/java/duke/ui/Message.java | 96 ++++++++------ src/main/java/duke/ui/MsgTaskDetail.java | 2 +- src/resources/myText.txt | 1 - src/resources/progress.txt | 18 +-- text-ui-test/input.txt | 16 ++- 20 files changed, 457 insertions(+), 139 deletions(-) create mode 100644 src/main/java/duke/LoadDuke.java create mode 100644 src/main/java/duke/action/ParseProgress.java create mode 100644 src/main/java/duke/exception/UnableToLoadBuddhaException.java create mode 100644 src/main/java/duke/exception/UnableToLoadProcessException.java delete mode 100644 src/resources/myText.txt diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index 37d37e4c..db3b5e49 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -2,9 +2,9 @@ import duke.storage.FileAccess; import duke.task.TaskList; +import duke.ui.Message; import duke.ui.Ui; - -import java.util.Scanner; +import duke.exception.UnableToLoadProcessException; /** * Begin the program here. @@ -19,21 +19,27 @@ public class Duke { private TaskList myList; private Ui ui; + public Duke(String filepath){ ui = new Ui(); fileAccess = new FileAccess(filepath); myList = new TaskList(); - // todo try load task here + + try { + String progress = fileAccess.loadProgressFromFile(); + new LoadDuke(myList, progress).run(); + } catch (UnableToLoadProcessException e) { + Message.msgUnableToLoadProgress(); + } } public void initialize(){ StartDuke.run(); new RunDuke(myList, ui, fileAccess).run(); - } public void end(){ - EndDuke.run(); + new EndDuke(fileAccess).run(); } /** diff --git a/src/main/java/duke/EndDuke.java b/src/main/java/duke/EndDuke.java index 12788d3a..3a6017ee 100644 --- a/src/main/java/duke/EndDuke.java +++ b/src/main/java/duke/EndDuke.java @@ -1,11 +1,17 @@ package duke; +import duke.storage.FileAccess; import duke.ui.Message; - -import java.io.IOException; +import duke.exception.UnableToLoadBuddhaException; public class EndDuke { + private static FileAccess fileAccess; + + public EndDuke(FileAccess fileAccess){ + this.fileAccess = fileAccess; + } + public static void run() { showByeMessage(); } @@ -18,8 +24,10 @@ public static void run() { public static void showByeMessage() { try { Message.msgBye(); - } catch (IOException error) { - Message.msgError(error); + String buddhaText = fileAccess.readBuddhaText(); + Message.msgBuddha(buddhaText); + } catch (UnableToLoadBuddhaException e) { + Message.msgUnableToLoadBuddah(); } } } diff --git a/src/main/java/duke/LoadDuke.java b/src/main/java/duke/LoadDuke.java new file mode 100644 index 00000000..d1cd7357 --- /dev/null +++ b/src/main/java/duke/LoadDuke.java @@ -0,0 +1,120 @@ +package duke; + +import duke.action.ParseDateTime; +import duke.action.ParseProgress; +import duke.exception.UnableToLoadProcessException; +import duke.task.TaskList; +import duke.task.TaskPriority; +import duke.ui.Message; + +import java.time.LocalDate; +import java.time.LocalTime; + +public class LoadDuke { + + private TaskList myList; + private String progress; + private String[] sentences; + + public LoadDuke(TaskList myList, String progress) { + this.myList = myList; + this.progress = progress; + } + + public void run() throws UnableToLoadProcessException { + try { + splitStringByTask(); + createTaskFromSentence(); + } catch (Exception e) { + Message.msgError(e); + throw new UnableToLoadProcessException(); + } + } + + private void splitStringByTask() throws Exception { + sentences = ParseProgress.splitStringIntoSentence(progress); + } + + private void createTaskFromSentence() throws Exception { + for (int i = 0; i < sentences.length - 1; i++) { + String[] phrases = ParseProgress.splitSentenceByBarSeparator(sentences[i]); + addTaskFromPhrases(phrases); + } + } + + private void addTaskFromPhrases(String[] phrases) throws Exception { + + String taskIndexInString = phrases[0]; + int taskIndex = Integer.parseInt(taskIndexInString); + + String taskTypeInString = phrases[1]; + + String isDoneInString = phrases[2]; + + String taskDetail = phrases[3]; + + String taskPriorityInString = phrases[4]; + int taskPriorityInInt = Integer.parseInt(taskPriorityInString); + TaskPriority taskPriority = TaskPriority.convertIntToPriority(taskPriorityInInt); + + String taskDateInString = "null"; + LocalDate taskDate; + + String taskStartTimeInString = "null"; + LocalTime taskTimeStart; + + String taskEndTimeInString = "null"; + LocalTime taskTimeEnd; + + int i = 5; + while (true) { + if (phrases[i].equals(";\r")) { + break; + } + + switch (i) { + case 5: + taskDateInString = phrases[5]; + case 6: + taskStartTimeInString = phrases[6]; + case 7: + taskEndTimeInString = phrases[7]; + } + i++; + } + + switch (taskTypeInString) { + case "T": + myList.addItemToDos(taskDetail); + break; + case "E": + taskDate = ParseDateTime.toDate(taskDateInString); + if (taskEndTimeInString.equals("null") && taskStartTimeInString.equals("null")) { + myList.addItemEvent(taskDetail, taskDate); + } else if (taskEndTimeInString.equals("null")) { + taskTimeStart = ParseDateTime.toTime(taskStartTimeInString); + myList.addItemEvent(taskDetail, taskDate, taskTimeStart); + } else { + taskTimeStart = ParseDateTime.toTime(taskStartTimeInString); + taskTimeEnd = ParseDateTime.toTime(taskEndTimeInString); + myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); + } + break; + case "D": + taskDate = ParseDateTime.toDate(taskDateInString); + if (taskStartTimeInString.equals("null")) { + myList.addItemDeadline(taskDetail, taskDate); + } else { + taskTimeStart = ParseDateTime.toTime(taskStartTimeInString); + myList.addItemDeadline(taskDetail, taskDate, taskTimeStart); + } + break; + } + + if (isDoneInString.equals("1")) { + myList.setTaskDone(taskIndex); + } + + myList.setTaskPriority(taskIndex, taskPriority); + } +} diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index b3e10ad3..6257927a 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -34,7 +34,6 @@ public void run() { while (isDukeRunning) { String userInput = ui.requestUserInput(scanner); String userCommand = parser.processUserCommand(userInput); - System.out.println(userCommand); isDukeRunning = canProcessCommand(userCommand, userInput); } } @@ -58,12 +57,12 @@ private static boolean canProcessCommand(String userCommand, String userInput) { case "save": cmd.saveTask(myList, fileAccess); return true; - case "load": - // loadTask(myList); todo - return true; case "find": cmd.findTask(myList, userInput); return true; + case "info": + cmd.showInfo(); + return true; case "event": cmd.addTaskEvent(myList, userInput); return true; @@ -74,10 +73,8 @@ private static boolean canProcessCommand(String userCommand, String userInput) { cmd.addTaskDeadline(myList, userInput); return true; default: - cmd.showInvalidCommand(); // todo + cmd.showInvalidCommand(); return true; } } - - } diff --git a/src/main/java/duke/action/ParseDateTime.java b/src/main/java/duke/action/ParseDateTime.java index 79a61ab6..3bc69f9c 100644 --- a/src/main/java/duke/action/ParseDateTime.java +++ b/src/main/java/duke/action/ParseDateTime.java @@ -65,7 +65,7 @@ public static LocalDate toDate(String date) { /** * Convert time from String to LocalTime * - * @param time TaskDate of the task + * @param time String that describes taskDate of the task * @return LocalTime * @throws DateTimeParseException If format of the date is not accepted */ @@ -91,7 +91,7 @@ public static String[] splitDateAndTime(String dateAndTime) { * return 2 if the string contains string representation of a Date and a Time * return 3 if the string contains string representation of a Date and 2 Time * - * @param dateAndTime string representation of date and time + * @param dateAndTime String representation of date and time * @return int 1 or 2 or 3 */ public static int isDateAndTime(String dateAndTime) { @@ -108,7 +108,7 @@ public static int isDateAndTime(String dateAndTime) { /** * Extract string representation of date from string array * - * @param split string array of date and time + * @param split String Array of date and time * @return String Date */ public static String toExtractDateFromSplitDateAndTime(String[] split) { @@ -118,7 +118,7 @@ public static String toExtractDateFromSplitDateAndTime(String[] split) { /** * Extract string representation of time from string array * - * @param split string array of date and time + * @param split String Array of date and time * @return String Time */ public static String toExtractTimeFromSplitDateAndTime(String[] split) { @@ -128,7 +128,7 @@ public static String toExtractTimeFromSplitDateAndTime(String[] split) { /** * Extract string representation of start time from string array * - * @param split string array of date and time + * @param split String Array of date and time * @return String TimeStart */ public static String toExtractTimeStartFromSplitDateAndTime(String[] split) { @@ -138,7 +138,7 @@ public static String toExtractTimeStartFromSplitDateAndTime(String[] split) { /** * Extract string representation of end time from string array * - * @param split string array of date and time + * @param split String Array of date and time * @return String TimeEnd */ public static String toExtractTimeEndFromSplitDateAndTime(String[] split) { diff --git a/src/main/java/duke/action/ParseProgress.java b/src/main/java/duke/action/ParseProgress.java new file mode 100644 index 00000000..4a95dbaa --- /dev/null +++ b/src/main/java/duke/action/ParseProgress.java @@ -0,0 +1,12 @@ +package duke.action; + +public class ParseProgress { + + public static String[] splitStringIntoSentence(String progress){ + return progress.split("\\n",-1); + } + + public static String[] splitSentenceByBarSeparator(String progress){ + return progress.split("\\|",-1); + } +} diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 3e71bee6..6ebdfec6 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -10,14 +10,14 @@ public String processUserCommand(String userInput) { if (userInput.equals("bye")) { return "bye"; - } - - if (userInput.equals("list")) { + } else if (userInput.equals("list")) { return "list"; - } - - if (userInput.equals("set")){ + } else if (userInput.equals("set")) { return "set"; + } else if (userInput.equals("info")) { + return "info"; + } else if (userInput.equals("save")) { + return "save"; } String userInputStartWith = getFirstWord(userInput); @@ -27,10 +27,6 @@ public String processUserCommand(String userInput) { return "done"; case "todo": return "todo"; - case "save": - return "save"; - case "load": - return "load"; case "find": return "find"; case "event": @@ -54,4 +50,5 @@ private String getFirstWord(String firstWord) { return "invalid"; } } + } diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java index a654abc7..9186d967 100644 --- a/src/main/java/duke/command/CmdDelete.java +++ b/src/main/java/duke/command/CmdDelete.java @@ -9,6 +9,12 @@ public static void run(TaskList myList, String userInput) { try { int taskIndex = Integer.parseInt(userInput.substring(7)) - 1; int numOfTaskAfterDelete = myList.getNumOfItem() - 1; + + if (taskIndex >= myList.getNumOfItem()){ + Message.msgInvalidTaskNumber(); + return; + } + Message.msgRemoveItem(myList, taskIndex, numOfTaskAfterDelete); myList.removeItem(taskIndex); } catch (Exception e) { diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java index be2489f3..b8683589 100644 --- a/src/main/java/duke/command/CmdPriority.java +++ b/src/main/java/duke/command/CmdPriority.java @@ -17,6 +17,12 @@ public class CmdPriority { * @param myList TaskList that contains the list of task */ public static void run(TaskList myList, Scanner scanner) { + + if (myList.getNumOfItem() < 1){ + Message.msgInvalidSetTaskListIsEmpty(); + return; + } + boolean isTaskNumberValid = false; String userInputTaskNumber = ""; diff --git a/src/main/java/duke/command/CmdSave.java b/src/main/java/duke/command/CmdSave.java index a2a96918..e3db55e6 100644 --- a/src/main/java/duke/command/CmdSave.java +++ b/src/main/java/duke/command/CmdSave.java @@ -2,31 +2,124 @@ import duke.storage.FileAccess; import duke.task.TaskList; +import duke.task.TaskPriority; import duke.task.TaskType; public class CmdSave { - public static void run(TaskList myList, FileAccess fileAccess){ - String listOfTaskString = readTask_ConvertToString(myList); - fileAccess.saveProgressIntoFile(myList, listOfTaskString); + + private static FileAccess fileAccess; + private static TaskList myList; + private static StringBuilder sb; + + private static int taskIndex; + private static String taskTypeInString; + private static String isDoneInString; + private static String taskDetail; + private static String taskPriorityInString; + private static String taskDate; + private static String timeStart; + private static String timeEnd; + + public CmdSave(TaskList myList, FileAccess fileAccess) { + this.myList = myList; + this.fileAccess = fileAccess; + sb = new StringBuilder(); + } + + public static void run() { + String listOfTaskString = generateListOfTaskInString(); + fileAccess.saveProgressIntoFile(listOfTaskString); } /** * Read a list of task and convert it into string - * - * @param myList TaskList that contains the list of task */ - private static String readTask_ConvertToString(TaskList myList) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < myList.getNumOfItem(); i++) { - String taskDetail = myList.getTaskDetail(i); - boolean isDone = myList.getTaskDoneStatus(i); - String isDoneString = (isDone ? "1" : "0"); - String taskType = TaskType.taskTypeToString(myList.getTaskType(i)); - - sb.append(taskType).append("|"); - sb.append(isDoneString).append("|"); - sb.append(taskDetail).append("|\n"); + private static String generateListOfTaskInString() { + + for (int taskIndex = 0; taskIndex < myList.getNumOfItem(); taskIndex++) { + clearString(); + appendBasic(taskIndex); + appendAdvance(taskIndex); + appendEnd(); } return sb.toString(); } + + private static void clearString() { + taskTypeInString = "null"; + isDoneInString = "null"; + taskDetail = "null"; + taskPriorityInString = "null"; + taskDate = "null"; + timeStart = "null"; + timeEnd = "null"; + } + + private static StringBuilder appendBasic(int taskIndex) { + + taskTypeInString = TaskType.taskTypeToString(myList.getTaskType(taskIndex)); + + boolean isDone = myList.getTaskDoneStatus(taskIndex); + isDoneInString = (isDone ? "1" : "0"); + + taskDetail = myList.getTaskDetail(taskIndex); + + TaskPriority taskPriority = myList.getTaskPriority(taskIndex); + taskPriorityInString = taskPriority.toStringInNumber(); + + sb.append(taskIndex).append("|"); + sb.append(taskTypeInString).append("|"); + sb.append(isDoneInString).append("|"); + sb.append(taskDetail).append("|"); + sb.append(taskPriorityInString).append("|"); + + return sb; + } + + private static StringBuilder appendAdvance(int taskIndex) { + + switch (taskTypeInString) { + case "D": + appendDeadline(taskIndex); + break; + case "E": + appendEvent(taskIndex); + break; + default: + break; + } + + return sb; + } + + private static StringBuilder appendDeadline(int taskIndex) { + + taskDate = myList.getTaskDeadLineTaskDateInString(taskIndex); + + timeStart = myList.getTaskDeadLineTaskTimeInString(taskIndex); + + sb.append(taskDate).append("|"); + sb.append(timeStart).append("|"); + + return sb; + } + + private static StringBuilder appendEvent(int taskIndex) { + + taskDate = myList.getTaskEventTaskDateInString(taskIndex); + + timeStart = myList.getTaskEventTaskTimeStartInString(taskIndex); + timeEnd = myList.getTaskEventTaskTimeEndInString(taskIndex); + + sb.append(taskDate).append("|"); + sb.append(timeStart).append("|"); + sb.append(timeEnd).append("|"); + + return sb; + } + + private static StringBuilder appendEnd() { + sb.append(";\n"); + return sb; + } } diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index f97819eb..b81ca0b9 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -22,6 +22,10 @@ public Command(Parser parser) { // Basic processCommand Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + public void showInfo(){ + Message.msgShowDukeCommandList(); + } + /** * Show full list of tasks * @@ -70,7 +74,7 @@ public void addTaskToDo(TaskList myList, String userInput) { * @param myList TaskList that contains the list of task */ public void saveTask(TaskList myList, FileAccess fileAccess) { - CmdSave.run(myList, fileAccess); + new CmdSave(myList, fileAccess).run(); } /** diff --git a/src/main/java/duke/exception/UnableToLoadBuddhaException.java b/src/main/java/duke/exception/UnableToLoadBuddhaException.java new file mode 100644 index 00000000..520ff8a9 --- /dev/null +++ b/src/main/java/duke/exception/UnableToLoadBuddhaException.java @@ -0,0 +1,4 @@ +package duke.exception; + +public class UnableToLoadBuddhaException extends Exception{ +} diff --git a/src/main/java/duke/exception/UnableToLoadProcessException.java b/src/main/java/duke/exception/UnableToLoadProcessException.java new file mode 100644 index 00000000..499e5071 --- /dev/null +++ b/src/main/java/duke/exception/UnableToLoadProcessException.java @@ -0,0 +1,5 @@ +package duke.exception; + +public class UnableToLoadProcessException extends Exception{ + +} diff --git a/src/main/java/duke/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java index b25b3bb5..4dbb9300 100644 --- a/src/main/java/duke/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -1,12 +1,14 @@ package duke.storage; -import java.io.File; -import java.io.FileWriter; -import java.util.Scanner; - -import duke.task.TaskList; import duke.ui.Message; import duke.ui.Ui; +import duke.exception.UnableToLoadBuddhaException; +import duke.exception.UnableToLoadProcessException; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; /** * Handles file handling related functions @@ -33,10 +35,9 @@ public FileAccess(String filepath) { /** * Save progress of the current task * - * @param myList TaskList that needs to be output * @param stringToBeWritten String that needs to be outputed */ - public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { + public void saveProgressIntoFile(String stringToBeWritten) { try { FileWriter fw = new FileWriter(filepath); @@ -53,43 +54,69 @@ public void saveProgressIntoFile(TaskList myList, String stringToBeWritten) { * * @return String that represents a list of task details */ - public String loadProgressFromFile() { - StringBuilder sb = new StringBuilder(); + public static String loadProgressFromFile() throws UnableToLoadProcessException{ + String progress = ""; + String pathRoot = System.getProperty("user.dir"); + // e.g. pathRoot = D:\My Files\School Documents\Repository\Duke + + String pathRssFolder = "src" + File.separator + "resources"; + // pathRssFolder = src\resources + + String pathFileName = "progress.txt"; + // pathFileName = progress.txt + + String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; + // e.g. + // filePath = D:\My Files\School + // Documents\Repository\Duke\src\main\resources\progress.txt try { - Scanner scanner = new Scanner(progressFile); - while (scanner.hasNext()) { - sb.append(scanner.nextLine()); - } + FileReader fr = new FileReader(filePath); + BufferedReader br = new BufferedReader(fr); + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + progress = sb.toString(); + br.close(); } catch (Exception e) { - Message.msgError(e); + throw new UnableToLoadProcessException(); } - - return sb.toString(); + return progress; } /** - * Delete an existing progress file - *

- * todo Method to be completed + * Read Buddah.txt + * + * @return String that contains the content in Buddha.txt */ - public void deleteProgressFile() { - - } + public String readBuddhaText() throws UnableToLoadBuddhaException { + String buddhaText = ""; + String pathRoot = System.getProperty("user.dir"); + String pathRssFolder = "src" + File.separator + "resources"; + String pathFileName = "buddha.txt"; + String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; - /** - * Example of Save file - */ - public void saveFileExample() { - String filepath = "src\\resources\\myText.txt"; try { - FileWriter fw = new FileWriter(filepath); - fw.write("helloWold"); - fw.close(); - Message.msgSave(); + FileReader fr = new FileReader(filePath); + BufferedReader br = new BufferedReader(fr); + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + + while (line != null) { + sb.append(line); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + buddhaText = sb.toString(); + br.close(); } catch (Exception e) { - Message.msgError(e); + throw new UnableToLoadBuddhaException(); } + return buddhaText; } } diff --git a/src/main/java/duke/task/TaskPriority.java b/src/main/java/duke/task/TaskPriority.java index 859e4b9e..a90df0e4 100644 --- a/src/main/java/duke/task/TaskPriority.java +++ b/src/main/java/duke/task/TaskPriority.java @@ -110,4 +110,20 @@ public static String convertPriorityToString(TaskPriority task) { return "INVALID"; } } + + /** + * Convert TaskPriority to String + */ + public String toStringInNumber(){ + switch (this) { + case LOW: + return "3"; + case MEDIUM: + return "2"; + case HIGH: + return "1"; + default: + return "0"; + } + } } diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index 46ed2f16..6de7e569 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -311,8 +311,49 @@ public static void msgRemoveItem(TaskList myList, int taskNumber, int numOfTaskA public static void msgArrowHead(){ System.out.print(">> "); } + + public static void msgShowDukeCommandList(){ + System.out.println(">> Full List of Duke Command Available:"); + System.out.println(" 1. todo (task description)"); + System.out.println(" >> add a TODO task"); + System.out.println(" 2. event (task description)"); + System.out.println(" >> add a EVENT task"); + System.out.println(" 3. event (task description) /at (date)"); + System.out.println(" >> add a EVENT task"); + System.out.println(" 4. event (task description) /at (date) (time)"); + System.out.println(" >> add a EVENT task"); + System.out.println(" 5. deadline (task description)"); + System.out.println(" >> add a DEADLINE task"); + System.out.println(" 6. deadline (task description) /at (date)"); + System.out.println(" >> add a DEADLINE task"); + System.out.println(" 7. deadline (task description) /at (date) (time start) (time end)"); + System.out.println(" >> add a DEADLINE task"); + System.out.println(" 8. list"); + System.out.println(" >> show full list of task"); + System.out.println(" 9. set"); + System.out.println(" >> change priority of a task"); + System.out.println(" 10. done (task number)"); + System.out.println(" >> mark a task as completed"); + System.out.println(" 11. find (keyword)"); + System.out.println(" >> find a task based on keyword"); + System.out.println(" 12. info"); + System.out.println(" >> display full list of Duke Command"); + System.out.println(" 13. delete (task number)"); + System.out.println(" >> delete a task"); + System.out.println(" 14. bye"); + System.out.println(" >> end your friendly Duke chat box"); + } // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + /** + * Display message when a progress file fail to load + */ + public static void msgUnableToLoadProgress() { + System.out.println(" >> Fail to load progress. New Task List is created <<"); + System.out.println("_________________________________"); + } + + /** * Display message when a task is marked as done * @@ -405,57 +446,30 @@ public static void msgInvalidInputTimeStartLaterThanTimeEnd() { System.out.println("_________________________________"); } + public static void msgInvalidSetTaskListIsEmpty(){ + System.out.println(" ☹ OOPS!!! The task list is empty."); + System.out.println("_________________________________"); + } + + public static void msgUnableToLoadBuddah(){ + System.out.println(" >> Buddha Protection is under maintenance <<"); + System.out.println("_________________________________"); + } + // Ending Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /** * Display message before the end of program */ - public static void msgBye() throws IOException { + public static void msgBye(){ System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); - msgBuddhaProtectMe(); } /** - * Display Buddah.txt + * Display buddha.txt before the end of program */ - private static void msgBuddhaProtectMe() throws IOException { - String everything = ""; - - // ... \Duke\src\main\resources\buddha.txt - // File.separator == " \ " - - String pathRoot = System.getProperty("user.dir"); - // pathRoot = D:\My Files\School Documents\Repository\Duke - - String pathRssFolder = "src" + File.separator + "resources"; - // pathRssFolder = src\main\resources - - String pathFileName = "buddha.txt"; - // pathFileName = buddha.txt - - String filePath = pathRoot + File.separator + pathRssFolder + File.separator + pathFileName; - // filePath = D:\My Files\School - // Documents\Repository\Duke\src\main\resources\buddha.txt - - try { - FileReader fr = new FileReader(filePath); - BufferedReader br = new BufferedReader(fr); - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - - while (line != null) { - sb.append(line); - sb.append(System.lineSeparator()); - line = br.readLine(); - } - everything = sb.toString(); - br.close(); - } catch (FileNotFoundException e) { - System.out.println("\n >>> Buddah Protection is not in forced <<<\n"); - System.out.println(e); - } finally { - System.out.println(everything); - } + public static void msgBuddha(String buddhaText){ + System.out.println(buddhaText); } } diff --git a/src/main/java/duke/ui/MsgTaskDetail.java b/src/main/java/duke/ui/MsgTaskDetail.java index e266bcc9..159fc71d 100644 --- a/src/main/java/duke/ui/MsgTaskDetail.java +++ b/src/main/java/duke/ui/MsgTaskDetail.java @@ -41,7 +41,7 @@ public static void showTaskDetail(){ showTaskDeadline(myList, taskIndex); break; default: - // todo + break; } } diff --git a/src/resources/myText.txt b/src/resources/myText.txt deleted file mode 100644 index 22ae1ebc..00000000 --- a/src/resources/myText.txt +++ /dev/null @@ -1 +0,0 @@ -helloWold \ No newline at end of file diff --git a/src/resources/progress.txt b/src/resources/progress.txt index ac57e098..7ed2ccbe 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,8 +1,10 @@ -T|0|borrow book| -T|1|borrow book| -T|0|borrow book| -T|0|borrow book| -E|1|project meeting | -E|0|project meeting | -D|0|return book | -D|0|return book | +0|T|0|borrow book|3|; +1|E|1|project meeting|3|2001-01-25|null|null|; +2|E|0|project meeting|3|2002-06-25|18:00|null|; +3|E|0|project meeting|3|2002-06-25|18:00|19:00|; +4|D|0|return book|3|2010-01-25|null|; +5|E|1|project meeting|3|2002-06-25|18:00|null|; +6|E|0|project meeting|3|2002-06-25|18:00|19:00|; +7|E|0|project meeting|3|2003-12-25|19:00|19:00|; +8|D|0|return book|3|2010-01-25|null|; +9|D|1|return book|3|2011-02-25|06:00|; diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index ed1e364d..695ebdba 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,10 +1,10 @@ todo borrow book -event project meeting /at 2001-01-25 -event project meeting /at 2002-06-25 18:00 -event project meeting /at 2002-06-25 18:00 19:00 -event project meeting /at 2003-12-25 19:00 19:00 -deadline return book /by 2010-01-25 -deadline return book /by 2011-02-25 06:00 +event project meeting/at 2001-01-25 +event project meeting/at 2002-06-25 18:00 +event project meeting/at 2002-06-25 18:00 19:00 +event project meeting/at 2003-12-25 19:00 19:00 +deadline return book/by 2010-01-25 +deadline return book/by 2011-02-25 06:00 list done 2 done 5 @@ -18,7 +18,9 @@ set 1 list save - +event project meeting/at 2003-12-25 19:00 19:00 +deadline return book/by 2010-01-25 +save deadline return book /by 2016-12-25 18:00 deadline return book /by 2016-12-25 From 86bdab9789f19ca3e0ce8f6b43e238841bc7ed57 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 12 Nov 2021 09:24:31 +0800 Subject: [PATCH 35/39] Improve Funcitonality 2: Basic Junit Test --- build.gradle | 1 + src/main/java/duke/command/CmdSave.java | 1 - src/main/java/duke/ui/MsgTaskDetail.java | 14 +- src/{ => resources}/FutureImporvement.txt | 0 src/resources/progress.txt | 10 +- src/test/java/duke/DukeTest.java | 27 +-- src/test/java/duke/task/TaskTypeTest.java | 34 --- text-ui-test/EXPECTED.TXT | 245 ++++++++++++++++++---- text-ui-test/input.txt | 14 +- text-ui-test/runtest.bat | 6 +- 10 files changed, 225 insertions(+), 127 deletions(-) rename src/{ => resources}/FutureImporvement.txt (100%) delete mode 100644 src/test/java/duke/task/TaskTypeTest.java diff --git a/build.gradle b/build.gradle index 10e998af..330c7f3d 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,7 @@ shadowJar { run{ standardInput = System.in + enableAssertions = true } checkstyle { diff --git a/src/main/java/duke/command/CmdSave.java b/src/main/java/duke/command/CmdSave.java index e3db55e6..9dc630be 100644 --- a/src/main/java/duke/command/CmdSave.java +++ b/src/main/java/duke/command/CmdSave.java @@ -11,7 +11,6 @@ public class CmdSave { private static TaskList myList; private static StringBuilder sb; - private static int taskIndex; private static String taskTypeInString; private static String isDoneInString; private static String taskDetail; diff --git a/src/main/java/duke/ui/MsgTaskDetail.java b/src/main/java/duke/ui/MsgTaskDetail.java index 159fc71d..13ac109e 100644 --- a/src/main/java/duke/ui/MsgTaskDetail.java +++ b/src/main/java/duke/ui/MsgTaskDetail.java @@ -18,7 +18,7 @@ public class MsgTaskDetail { private static String timeStart; private static String timeEnd; - public MsgTaskDetail(TaskList myList, int taskIndex){ + public MsgTaskDetail(TaskList myList, int taskIndex) { this.myList = myList; this.taskIndex = taskIndex; taskTypeInString = getTaskType_InString(myList, taskIndex); @@ -27,10 +27,10 @@ public MsgTaskDetail(TaskList myList, int taskIndex){ taskPriorityInString = getTaskPriority(myList, taskIndex); } - public static void showTaskDetail(){ + public static void showTaskDetail() { TaskType taskType = myList.getTaskType(taskIndex); - switch(taskType){ + switch (taskType) { case TODOS: showTaskTodo(); break; @@ -45,8 +45,8 @@ public static void showTaskDetail(){ } } - private static void showTaskTodo(){ - Message.msgTaskTodo(taskTypeInString, isDoneInString,taskDetail, taskPriorityInString); + private static void showTaskTodo() { + Message.msgTaskTodo(taskTypeInString, isDoneInString, taskDetail, taskPriorityInString); } private static void showTaskEvent(TaskList myList, int taskIndex) { @@ -68,13 +68,13 @@ private static void showTaskEvent(TaskList myList, int taskIndex) { } } - private static void showTaskDeadline(TaskList myList, int taskIndex){ + private static void showTaskDeadline(TaskList myList, int taskIndex) { year = myList.getTaskDeadLineTaskDateYearInString(taskIndex); month = myList.getTaskDeadLineTaskDateMonthInString(taskIndex); day = myList.getTaskDeadLineTaskDateDayInString(taskIndex); timeStart = myList.getTaskDeadLineTaskTimeInString(taskIndex); - if (timeStart.equals("null")){ + if (timeStart.equals("null")) { Message.msgTaskDeadline(taskTypeInString, isDoneInString, taskDetail, year, month, day, taskPriorityInString); } else { diff --git a/src/FutureImporvement.txt b/src/resources/FutureImporvement.txt similarity index 100% rename from src/FutureImporvement.txt rename to src/resources/FutureImporvement.txt diff --git a/src/resources/progress.txt b/src/resources/progress.txt index 7ed2ccbe..647b25dc 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,10 +1,2 @@ 0|T|0|borrow book|3|; -1|E|1|project meeting|3|2001-01-25|null|null|; -2|E|0|project meeting|3|2002-06-25|18:00|null|; -3|E|0|project meeting|3|2002-06-25|18:00|19:00|; -4|D|0|return book|3|2010-01-25|null|; -5|E|1|project meeting|3|2002-06-25|18:00|null|; -6|E|0|project meeting|3|2002-06-25|18:00|19:00|; -7|E|0|project meeting|3|2003-12-25|19:00|19:00|; -8|D|0|return book|3|2010-01-25|null|; -9|D|1|return book|3|2011-02-25|06:00|; +1|E|0|project meeting|3|2001-01-25|null|null|; diff --git a/src/test/java/duke/DukeTest.java b/src/test/java/duke/DukeTest.java index 5f9895d2..8c182bcf 100644 --- a/src/test/java/duke/DukeTest.java +++ b/src/test/java/duke/DukeTest.java @@ -1,25 +1,14 @@ package duke; -import duke.action.ParserFacade; +import org.junit.jupiter.api.Test; -/** - * Begin the program here. - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ -public class DukeTest { - - /** - * Starting point of the program - */ - public static void main(String[] args) { - - ParserFacade parserFacade = new ParserFacade(); +import static org.junit.jupiter.api.Assertions.assertEquals; - parserFacade.startDuke(); - parserFacade.runDuke(); - parserFacade.endDuke(); +public class DukeTest { + @Test + public void dummyTest(){ + assertEquals(2, 2); } + + } diff --git a/src/test/java/duke/task/TaskTypeTest.java b/src/test/java/duke/task/TaskTypeTest.java deleted file mode 100644 index 91d146b3..00000000 --- a/src/test/java/duke/task/TaskTypeTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package duke.task; - -/** - * Define task type - * - * @author Kang Teng - * @version 8.0 - * @since 2021-09-01 - */ - -public enum TaskTypeTest { - TODOS, DEADLINE, EVENT; - - /** - * Constructor - */ - public static String taskTypeToString(TaskTypeTest taskType) { - String s = ""; - switch (taskType) { - case TODOS: - s = "T"; - break; - case DEADLINE: - s = "D"; - break; - case EVENT: - s = "E"; - break; - default: - throw new IllegalStateException("Unexpected value: " + taskType); - } - return s; - } -} diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 098b0a13..67378fae 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,6 +1,6 @@ Hello from - ____ _ -| _ \ _ _| | _____ + ____ _ +| _ \ _ _| | _____ | | | | | | | |/ / _ \ | |_| | |_| | < __/ |____/ \__,_|_|\_\___| @@ -8,59 +8,215 @@ Hello from Hello! I'm Duke What can I do for you? _________________________________ - Got it. I've added this task: +>> todo borrow book + Got it. I've added this task: [T][ ] borrow book Now you have 1 tasks in the list. _________________________________ - Got it. I've added this task: - [D][ ] return book (by: Sunday) +>> event project meeting/at 2001-01-25 + Got it. I've added this task: + [E][ ] project meeting(at: 2001-01-25) Now you have 2 tasks in the list. _________________________________ - Got it. I've added this task: - [E][ ] project meeting (at: Mon 2-4pm) +>> event project meeting/at 2002-06-25 18:00 + Got it. I've added this task: + [E][ ] project meeting + (at: 2002-06-25, from: 18:00) Now you have 3 tasks in the list. _________________________________ - 1.[T][ ] borrow book - 2.[D][ ] return book (by: Sunday) - 3.[E][ ] project meeting (at: Mon 2-4pm) -_________________________________ - Naisuuuu! This task is marked as done: - [D][X] return book (by: Sunday) -_________________________________ - Sorry :( Invalid Input. Try Again ~ -_________________________________ -Error Occurs: java.lang.IndexOutOfBoundsException: Index 9 out of bounds for length 3 -_________________________________ - Sorry :( Invalid Input. Try Again ~ -_________________________________ -Error Occurs: java.lang.StringIndexOutOfBoundsException: begin 0, end 6, length 5 -_________________________________ +>> event project meeting/at 2002-06-25 18:00 19:00 + Got it. I've added this task: + [E][ ] project meeting + (at: 2002-06-25, from: 18:00 to 19:00) + Now you have 4 tasks in the list. +_________________________________ +>> event project meeting/at 2003-12-25 19:00 19:00 + Got it. I've added this task: + [E][ ] project meeting + (at: 2003-12-25, from: 19:00 to 19:00) + Now you have 5 tasks in the list. +_________________________________ +>> deadline return book/by 2010-01-25 + Got it. I've added this task: + [D][ ] return book(by: 2010-01-25) + Now you have 6 tasks in the list. +_________________________________ +>> deadline return book/by 2011-02-25 06:00 + Got it. I've added this task: + [D][ ] return book(by: 2011-02-25 06:00) + Now you have 7 tasks in the list. +_________________________________ +>> list + 1.[T][ ] borrow book [LOW] + 2.[E][ ] project meeting [LOW] + (at 2001 JANUARY 25) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00) + 4.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 5.[E][ ] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 6.[D][ ] return book [LOW] + by: 2010 JANUARY 25) + 7.[D][ ] return book [LOW] + by: 2011 FEBRUARY 25 06:00) +_________________________________ +>> done 2 + Naisuuuu! This task is marked as done: + [E][X] project meeting [LOW] + (at 2001 JANUARY 25) +_________________________________ +>> done 5 + Naisuuuu! This task is marked as done: + [E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) +_________________________________ +>> done 6 + Naisuuuu! This task is marked as done: + [D][X] return book [LOW] + by: 2010 JANUARY 25) +_________________________________ +>> list + 1.[T][ ] borrow book [LOW] + 2.[E][X] project meeting [LOW] + (at 2001 JANUARY 25) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00) + 4.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 5.[E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 6.[D][X] return book [LOW] + by: 2010 JANUARY 25) + 7.[D][ ] return book [LOW] + by: 2011 FEBRUARY 25 06:00) +_________________________________ +>> delete 1 Noted. I've removed this task: - [T][ ] borrow book - Now you have 3 tasks in the list. + [T][ ] borrow book [LOW] + Now you have 6 tasks in the list. _________________________________ +>> delete 5 Noted. I've removed this task: - ☹ OOPS!!! The task number is invalid. -_________________________________ - 1.[D][X] return book (by: Sunday) - 2.[E][ ] project meeting (at: Mon 2-4pm) -_________________________________ - Got it. I've added this task: - [D][ ] do homework (by: no idea :-p) - Now you have 3 tasks in the list. -_________________________________ - 1.[D][X] return book (by: Sunday) - 2.[E][ ] project meeting (at: Mon 2-4pm) - 3.[D][ ] do homework (by: no idea :-p) -_________________________________ + [D][X] return book [LOW] + by: 2010 JANUARY 25) + Now you have 5 tasks in the list. +_________________________________ +>> list + 1.[E][X] project meeting [LOW] + (at 2001 JANUARY 25) + 2.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 4.[E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 5.[D][ ] return book [LOW] + by: 2011 FEBRUARY 25 06:00) +_________________________________ +>> set + Which task do you want to set priority? +>> 2 +_________________________________ + What is it's priority? choose 1 to 3 + 1: Very urgent >>> 3: Chin Cai not that urgent +1 + Done! The new task priority is set + Priority of Task #2 has been set to HIGH +_________________________________ +>> list + 1.[E][X] project meeting [LOW] + (at 2001 JANUARY 25) + 2.[E][ ] project meeting [HIGH] + (at 2002 JUNE 25 ; from: 18:00) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 4.[E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 5.[D][ ] return book [LOW] + by: 2011 FEBRUARY 25 06:00) +_________________________________ +>> save + Progress Saved! +_________________________________ +>> event project meeting/at 2003-12-25 19:00 19:00 + Got it. I've added this task: + [E][ ] project meeting + (at: 2003-12-25, from: 19:00 to 19:00) + Now you have 6 tasks in the list. +_________________________________ +>> deadline return book/by 2010-01-25 + Got it. I've added this task: + [D][ ] return book(by: 2010-01-25) + Now you have 7 tasks in the list. +_________________________________ +>> save + Progress Saved! +_________________________________ +>> deadline return book ☹ OOPS!!! The day cannot be empty. _________________________________ - ☹ OOPS!!! The description cannot be empty. -_________________________________ - 1.[D][X] return book (by: Sunday) - 2.[E][ ] project meeting (at: Mon 2-4pm) - 3.[D][ ] do homework (by: no idea :-p) -_________________________________ +>> event project meeting /at 2016-12-25 19:00 18:00 + ☹ OOPS!!! Event start time cannot be later than end time! +_________________________________ +>> event project AAmeeting /at 2016-12-25 18:00 19:00 + Got it. I've added this task: + [E][ ] project AAmeeting + (at: 2016-12-25, from: 18:00 to 19:00) + Now you have 8 tasks in the list. +_________________________________ +>> event project meeting /at 2016-12-25 18:00 19:00 + Got it. I've added this task: + [E][ ] project meeting + (at: 2016-12-25, from: 18:00 to 19:00) + Now you have 9 tasks in the list. +_________________________________ +>> event project meet /at 2016-12-25 18:00 19:00 + Got it. I've added this task: + [E][ ] project meet + (at: 2016-12-25, from: 18:00 to 19:00) + Now you have 10 tasks in the list. +_________________________________ +>> find meeting + Here are the matching tasks in your list: + 1.[E][X] project meeting [LOW] + (at 2001 JANUARY 25) + 2.[E][ ] project meeting [HIGH] + (at 2002 JUNE 25 ; from: 18:00) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 4.[E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 5.[E][ ] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 6.[E][ ] project meeting [LOW] + (at 2016 DECEMBER 25 ; from: 18:00 to 19:00) +>> list + 1.[E][X] project meeting [LOW] + (at 2001 JANUARY 25) + 2.[E][ ] project meeting [HIGH] + (at 2002 JUNE 25 ; from: 18:00) + 3.[E][ ] project meeting [LOW] + (at 2002 JUNE 25 ; from: 18:00 to 19:00) + 4.[E][X] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 5.[D][ ] return book [LOW] + by: 2011 FEBRUARY 25 06:00) + 6.[E][ ] project meeting [LOW] + (at 2003 DECEMBER 25 ; from: 19:00 to 19:00) + 7.[D][ ] return book [LOW] + by: 2010 JANUARY 25) + 8.[E][ ] project AAmeeting [LOW] + (at 2016 DECEMBER 25 ; from: 18:00 to 19:00) + 9.[E][ ] project meeting [LOW] + (at 2016 DECEMBER 25 ; from: 18:00 to 19:00) + 10.[E][ ] project meet [LOW] + (at 2016 DECEMBER 25 ; from: 18:00 to 19:00) +_________________________________ +>> save + Progress Saved! +_________________________________ +>> bye Bye. Hope to see you again soon! _________________________________ // @@ -86,5 +242,4 @@ _________________________________ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Buddha Protect Me Say Bye to All Bug -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 695ebdba..d5087eab 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -21,16 +21,12 @@ save event project meeting/at 2003-12-25 19:00 19:00 deadline return book/by 2010-01-25 save - -deadline return book /by 2016-12-25 18:00 -deadline return book /by 2016-12-25 deadline return book -event project meeting /at 2016-12-25 -event project meeting /at 2016-12-25 18:00 19:00 event project meeting /at 2016-12-25 19:00 18:00 -event project meeting /at 2016-12-25 19:00 19:00 - -event project meeting /at 2016-12-25 18:00 19:00 event project AAmeeting /at 2016-12-25 18:00 19:00 event project meeting /at 2016-12-25 18:00 19:00 -event project meet /at 2016-12-25 18:00 19:00 \ No newline at end of file +event project meet /at 2016-12-25 18:00 19:00 +find meeting +list +save +bye \ No newline at end of file diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 08737446..cde27337 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -4,10 +4,10 @@ REM create bin directory if it doesn't exist if not exist ..\bin mkdir ..\bin REM delete output from previous run -if exist ACTUAL.TXT del 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 @@ -18,4 +18,4 @@ REM run the program, feed commands from input.txt file and redirect the output t java -classpath ..\bin Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output -FC ACTUAL.TXT EXPECTED.TXT +FC ACTUAL.TXT EXPECTED.TXT \ No newline at end of file From c6dcb26d47247bdef7607048fd7c8a99fc08b921 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 12 Nov 2021 10:52:29 +0800 Subject: [PATCH 36/39] Improve Funcitonality 2-2: Junit Sample Test --- src/test/java/duke/DukeTest.java | 14 -------- src/test/java/duke/SampleTest.java | 54 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 14 deletions(-) delete mode 100644 src/test/java/duke/DukeTest.java create mode 100644 src/test/java/duke/SampleTest.java diff --git a/src/test/java/duke/DukeTest.java b/src/test/java/duke/DukeTest.java deleted file mode 100644 index 8c182bcf..00000000 --- a/src/test/java/duke/DukeTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package duke; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class DukeTest { - @Test - public void dummyTest(){ - assertEquals(2, 2); - } - - -} diff --git a/src/test/java/duke/SampleTest.java b/src/test/java/duke/SampleTest.java new file mode 100644 index 00000000..5c65bfba --- /dev/null +++ b/src/test/java/duke/SampleTest.java @@ -0,0 +1,54 @@ +package duke; + +import org.junit.jupiter.api.*; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SampleTest { + @Test + @DisplayName("Sample JUnit Test") + public void dummyTest() { + assertEquals(2, 2); + } + + @Test + public void dummyFailTest() { + assertEquals(2, 1); + } + + @Test + @Disabled("Not implemented yet") + public void shouldShowSimpleAssertion() { + Assertions.assertEquals(1, 1); + Assertions.assertEquals(1, 2); + } + + @Test + @DisplayName("Should check all items in the list") + public void shouldCheckAllItemsInTheList() { + List numbers = List.of(2, 3, 5, 7); + + Assertions.assertAll(() -> assertEquals(2, numbers.get(0)), + () -> assertEquals(300, numbers.get(1)), + () -> assertEquals(5, numbers.get(2)), + () -> assertEquals(700, numbers.get(3))); + } + + @Test + @DisplayName("Should only run the test if some criteria are met 1") + void shouldOnlyRunTheTestIfSomeCriteriaAreMet1() { + Assumptions.assumeTrue(13 > 10); + assertEquals(2,1); + } + + @Test + @DisplayName("Should only run the test if some criteria are met 2") + void shouldOnlyRunTheTestIfSomeCriteriaAreMet2() { + Assumptions.assumeTrue(13 < 10); + assertEquals(2,1); + } + + +} From f5e3b89beb64443facb2f409699bd35cb2775595 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 12 Nov 2021 14:08:17 +0800 Subject: [PATCH 37/39] Improve Funcitonality 2-3: Junit Test, Introduce assertion --- src/main/java/duke/RunDuke.java | 4 + src/main/java/duke/action/Parser.java | 2 + src/main/java/duke/command/CmdAddTask.java | 37 +++++++++ src/main/java/duke/command/CmdDelete.java | 4 + src/main/java/duke/command/CmdFind.java | 8 ++ src/main/java/duke/command/CmdList.java | 3 + .../java/duke/command/CmdMarkTaskDone.java | 4 + src/main/java/duke/command/CmdPriority.java | 18 +++++ src/main/java/duke/command/CmdSave.java | 4 + src/main/java/duke/storage/FileAccess.java | 2 + src/main/java/duke/task/TaskPriority.java | 2 +- src/resources/progress.txt | 6 +- .../java/duke/action/ParseProgressTest.java | 25 ++++++ src/test/java/duke/task/TaskPriorityTest.java | 79 +++++++++++++++++++ src/test/java/duke/task/TaskTypeTest.java | 20 +++++ 15 files changed, 215 insertions(+), 3 deletions(-) create mode 100644 src/test/java/duke/action/ParseProgressTest.java create mode 100644 src/test/java/duke/task/TaskPriorityTest.java create mode 100644 src/test/java/duke/task/TaskTypeTest.java diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index 6257927a..1567c4d6 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -39,6 +39,10 @@ public void run() { } private static boolean canProcessCommand(String userCommand, String userInput) { + + assert !userCommand.isEmpty() : "userCommand should not be empty"; + assert !userInput.isEmpty() : "userInput should not be empty"; + switch (userCommand) { case "bye": return false; diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 6ebdfec6..5f0cc7e0 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -8,6 +8,8 @@ public Parser() { public String processUserCommand(String userInput) { + assert userInput != null : "There should be user input in processUserCommand"; + if (userInput.equals("bye")) { return "bye"; } else if (userInput.equals("list")) { diff --git a/src/main/java/duke/command/CmdAddTask.java b/src/main/java/duke/command/CmdAddTask.java index 7783b398..2d03510c 100644 --- a/src/main/java/duke/command/CmdAddTask.java +++ b/src/main/java/duke/command/CmdAddTask.java @@ -12,6 +12,9 @@ public class CmdAddTask { public static void addTaskToDo(TaskList myList, String userInput) { + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + if (userInput.length() <= 5) { Message.msgInvalidInputMissingDescription(); return; @@ -29,6 +32,10 @@ public static void addTaskToDo(TaskList myList, String userInput) { } public static void addTaskEvent(TaskList myList, String userInput) { + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + if (userInput.length() <= 6) { Message.msgInvalidInputMissingDescription(); return; @@ -66,6 +73,10 @@ public static void addTaskEvent(TaskList myList, String userInput) { } public static void addTaskDeadline(TaskList myList, String userInput) { + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + if (userInput.length() <= 9) { Message.msgInvalidInputMissingDescription(); return; @@ -107,6 +118,11 @@ public static void addTaskDeadline(TaskList myList, String userInput) { * @param date String that represents the date of the event */ private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, String date) { + + assert myList != null : "mylist should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert date != null : "date should not be empty"; + LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { @@ -137,6 +153,11 @@ private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, String date, String timeStart) { + assert myList != null : "mylist should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert date != null : "date should not be empty"; + assert timeStart != null : "timeStart should not be empty"; + LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); @@ -175,6 +196,12 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t private static void toAddTaskEvent_localDate_localTime(TaskList myList, String taskDetail, String date, String timeStart, String timeEnd) { + assert myList != null : "mylist should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert date != null : "date should not be empty"; + assert timeStart != null : "timeStart should not be empty"; + assert timeEnd != null : "timeEnd should not be empty"; + LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); @@ -216,6 +243,11 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t * @param date String that represents the date of the deadline */ private static void toAddTaskDeadline_localDate(TaskList myList, String taskDetail, String date) { + + assert myList != null : "mylist should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert date != null : "date should not be empty"; + LocalDate taskDate = ParseDateTime.toDate(date); if (taskDate == null) { @@ -245,6 +277,11 @@ private static void toAddTaskDeadline_localDate(TaskList myList, String taskDeta private static void toAddTaskDeadline_localDate_localTime(TaskList myList, String taskDetail, String date, String time) { + assert myList != null : "mylist should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert date != null : "date should not be empty"; + assert time != null : "time should not be empty"; + LocalDate taskDate = ParseDateTime.toDate(date); LocalTime taskTime = ParseDateTime.toTime(time); diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java index 9186d967..2665a697 100644 --- a/src/main/java/duke/command/CmdDelete.java +++ b/src/main/java/duke/command/CmdDelete.java @@ -6,6 +6,10 @@ public class CmdDelete { public static void run(TaskList myList, String userInput) { + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + try { int taskIndex = Integer.parseInt(userInput.substring(7)) - 1; int numOfTaskAfterDelete = myList.getNumOfItem() - 1; diff --git a/src/main/java/duke/command/CmdFind.java b/src/main/java/duke/command/CmdFind.java index 5c417e70..e5910dad 100644 --- a/src/main/java/duke/command/CmdFind.java +++ b/src/main/java/duke/command/CmdFind.java @@ -11,6 +11,10 @@ public class CmdFind { public static void run(TaskList myList, String userInput){ + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + if (userInput.length() <= 5) { Message.msgInvalidFindTerm(); return; @@ -45,6 +49,10 @@ private static boolean hasStringContain(String sourceString, String searchString * Display message to show a list of task found based on the term */ private static void showTaskFound(TaskList myList, ArrayList taskNumberContainingSearchTerm) { + + assert myList != null : "mylist should not be empty"; + assert taskNumberContainingSearchTerm != null : "taskNumberContainingSearchTerm should not be empty"; + int index = 1; for (int i = 0; i < taskNumberContainingSearchTerm.size(); i++) { int taskNumber = taskNumberContainingSearchTerm.get(i); diff --git a/src/main/java/duke/command/CmdList.java b/src/main/java/duke/command/CmdList.java index 79a63850..bd6e9bcd 100644 --- a/src/main/java/duke/command/CmdList.java +++ b/src/main/java/duke/command/CmdList.java @@ -12,6 +12,9 @@ public class CmdList { * @param myList TaskList that contains the list of task */ public static void run(TaskList myList) { + + assert myList != null : "mylist should not be empty"; + for (int i = 0; i < myList.getNumOfItem(); i++) { Message.msgShowBracketWithIndex(i + 1); new MsgTaskDetail(myList, i).showTaskDetail(); diff --git a/src/main/java/duke/command/CmdMarkTaskDone.java b/src/main/java/duke/command/CmdMarkTaskDone.java index af0ed82d..feec9ebe 100644 --- a/src/main/java/duke/command/CmdMarkTaskDone.java +++ b/src/main/java/duke/command/CmdMarkTaskDone.java @@ -6,6 +6,10 @@ public class CmdMarkTaskDone { public static void run(TaskList myList, String userInput) { + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + int taskNumber = Integer.parseInt(userInput.substring(5)); myList.setTaskDone(taskNumber - 1); Message.msgMarkDone(myList, taskNumber - 1); diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java index b8683589..c2e2ab24 100644 --- a/src/main/java/duke/command/CmdPriority.java +++ b/src/main/java/duke/command/CmdPriority.java @@ -18,6 +18,9 @@ public class CmdPriority { */ public static void run(TaskList myList, Scanner scanner) { + assert myList != null : "mylist should not be empty"; + assert scanner != null : "scanner should not be empty"; + if (myList.getNumOfItem() < 1){ Message.msgInvalidSetTaskListIsEmpty(); return; @@ -60,6 +63,9 @@ public static void run(TaskList myList, Scanner scanner) { */ private static boolean hasValidTaskNumber(TaskList myList, String userInputString) { + assert myList != null : "mylist should not be empty"; + assert userInputString != null : "userInputString should not be empty"; + try { int userInputInt = Integer.parseInt(userInputString); int numOfItem = myList.getNumOfItem(); @@ -75,6 +81,9 @@ private static boolean hasValidTaskNumber(TaskList myList, String userInputStrin } private static boolean hasValidPriorityNumber(String userInputPriorityS) { + + assert userInputPriorityS != null : "userInputPriorityS should not be empty"; + try { TaskPriority taskPriority = TaskPriority.convertStringToPriority(userInputPriorityS); if (taskPriority == TaskPriority.HIGH) { @@ -103,12 +112,21 @@ private static boolean hasValidPriorityNumber(String userInputPriorityS) { * @param taskPriority TaskPriority(new one) that want to be set */ private static void toUpdatePriority(TaskList myList, int taskIndex, TaskPriority taskPriority) { + + assert myList != null : "mylist should not be empty"; + assert taskIndex >= 0 : "taskIndex should be equal or more than 0"; + assert taskPriority != null : "taskPriority should not be empty"; + myList.setTaskPriority(taskIndex, taskPriority); String taskPriorityInString = getTaskPriority_InString(myList, taskIndex); Message.msgSetPriority(taskIndex + 1, taskPriorityInString); } private static String getTaskPriority_InString(TaskList myList, int taskIndex){ + + assert myList != null : "mylist should not be empty"; + assert taskIndex >= 0 : "taskIndex should be equal or more than 0"; + TaskPriority taskPriority = myList.getTaskPriority(taskIndex); return TaskPriority.convertPriorityToString(taskPriority); } diff --git a/src/main/java/duke/command/CmdSave.java b/src/main/java/duke/command/CmdSave.java index 9dc630be..6798b2cc 100644 --- a/src/main/java/duke/command/CmdSave.java +++ b/src/main/java/duke/command/CmdSave.java @@ -66,6 +66,10 @@ private static StringBuilder appendBasic(int taskIndex) { TaskPriority taskPriority = myList.getTaskPriority(taskIndex); taskPriorityInString = taskPriority.toStringInNumber(); + assert taskTypeInString != null : "taskTypeInString should not be empty"; + assert taskDetail != null : "taskDetail should not be empty"; + assert taskPriority != null : "taskPriority should not be empty"; + sb.append(taskIndex).append("|"); sb.append(taskTypeInString).append("|"); sb.append(isDoneInString).append("|"); diff --git a/src/main/java/duke/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java index 4dbb9300..bf2e6299 100644 --- a/src/main/java/duke/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -39,6 +39,8 @@ public FileAccess(String filepath) { */ public void saveProgressIntoFile(String stringToBeWritten) { + assert !stringToBeWritten.isEmpty() : "stringToBeWritten should not be empty"; + try { FileWriter fw = new FileWriter(filepath); fw.write(stringToBeWritten); diff --git a/src/main/java/duke/task/TaskPriority.java b/src/main/java/duke/task/TaskPriority.java index a90df0e4..8dddc14a 100644 --- a/src/main/java/duke/task/TaskPriority.java +++ b/src/main/java/duke/task/TaskPriority.java @@ -14,7 +14,7 @@ public static boolean isHigherPriority(TaskPriority taskA, TaskPriority taskB) { int taskAPriority = convertPriorityToInt(taskA); int taskBPriority = convertPriorityToInt(taskB); - if (taskAPriority > taskBPriority) { + if (taskAPriority < taskBPriority) { return true; } return false; diff --git a/src/resources/progress.txt b/src/resources/progress.txt index 647b25dc..15a2979d 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,2 +1,4 @@ -0|T|0|borrow book|3|; -1|E|0|project meeting|3|2001-01-25|null|null|; +0|E|1|project meeting|3|2001-01-25|null|null|; +1|T|0|borrow book|3|; +2|E|0|project meeting|3|2001-01-25|null|null|; +3|D|1|return book|3|2010-01-25|null|; diff --git a/src/test/java/duke/action/ParseProgressTest.java b/src/test/java/duke/action/ParseProgressTest.java new file mode 100644 index 00000000..68ee746e --- /dev/null +++ b/src/test/java/duke/action/ParseProgressTest.java @@ -0,0 +1,25 @@ +package duke.action; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ParseProgressTest { + + @Test + @Disabled ("Unknown JUnit behaviour") + void testSplitStringIntoSentence() { + String input = "HelloWorld"; + String[] expected = {"HelloWorld"}; + assertEquals(expected, input); + } + + @Test + @Disabled ("Unknown JUnit behaviour") + void splitSentenceByBarSeparator() { + String input = "HelloWorld"; + String[] expected = {"HelloWorld"}; + assertEquals(expected, input); + } +} \ No newline at end of file diff --git a/src/test/java/duke/task/TaskPriorityTest.java b/src/test/java/duke/task/TaskPriorityTest.java new file mode 100644 index 00000000..7d6241f5 --- /dev/null +++ b/src/test/java/duke/task/TaskPriorityTest.java @@ -0,0 +1,79 @@ +package duke.task; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TaskPriorityTest { + + @Test + void testIsHigherPriority() { + TaskPriority taskPriorityHigh = TaskPriority.HIGH; + TaskPriority taskPriorityLow = TaskPriority.LOW; + + assertEquals(true, TaskPriority.isHigherPriority(taskPriorityHigh, taskPriorityLow)); + } + + @Test + void testConvertIntToPriority() { + List priorities = List.of(1,2,3,4,100,0); + + Assertions.assertAll( + () -> assertEquals(TaskPriority.HIGH, TaskPriority.convertIntToPriority(priorities.get(0))), + () -> assertEquals(TaskPriority.MEDIUM, TaskPriority.convertIntToPriority(priorities.get(1))), + () -> assertEquals(TaskPriority.LOW, TaskPriority.convertIntToPriority(priorities.get(2))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(3))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(4))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(5)))); + } + + @Test + void testConvertStringToPriority() { + List priorities = List.of("1","2","3","4","100","0"); + + Assertions.assertAll( + () -> assertEquals(TaskPriority.HIGH, TaskPriority.convertStringToPriority(priorities.get(0))), + () -> assertEquals(TaskPriority.MEDIUM, TaskPriority.convertStringToPriority(priorities.get(1))), + () -> assertEquals(TaskPriority.LOW, TaskPriority.convertStringToPriority(priorities.get(2))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(3))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(4))), + () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(5)))); + } + + @Test + void testConvertPriorityToInt() { + List priorities = List.of(TaskPriority.LOW, + TaskPriority.MEDIUM, TaskPriority.HIGH, TaskPriority.INVALID); + + Assertions.assertAll( + () -> assertEquals(3, TaskPriority.convertPriorityToInt(priorities.get(0))), + () -> assertEquals(2, TaskPriority.convertPriorityToInt(priorities.get(1))), + () -> assertEquals(1, TaskPriority.convertPriorityToInt(priorities.get(2))), + () -> assertEquals(0, TaskPriority.convertPriorityToInt(priorities.get(3)))); + } + + @Test + void testConvertPriorityToString() { + List priorities = List.of(TaskPriority.LOW, + TaskPriority.MEDIUM, TaskPriority.HIGH, TaskPriority.INVALID); + + Assertions.assertAll( + () -> assertEquals("LOW", TaskPriority.convertPriorityToString(priorities.get(0))), + () -> assertEquals("MEDIUM", TaskPriority.convertPriorityToString(priorities.get(1))), + () -> assertEquals("HIGH", TaskPriority.convertPriorityToString(priorities.get(2))), + () -> assertEquals("INVALID", TaskPriority.convertPriorityToString(priorities.get(3)))); + } + + @Test + void testToStringInNumber() { + + Assertions.assertAll( + () -> assertEquals("3", TaskPriority.LOW.toStringInNumber()), + () -> assertEquals("2", TaskPriority.MEDIUM.toStringInNumber()), + () -> assertEquals("1", TaskPriority.HIGH.toStringInNumber()), + () -> assertEquals("0", TaskPriority.INVALID.toStringInNumber())); + } +} \ No newline at end of file diff --git a/src/test/java/duke/task/TaskTypeTest.java b/src/test/java/duke/task/TaskTypeTest.java new file mode 100644 index 00000000..794aff50 --- /dev/null +++ b/src/test/java/duke/task/TaskTypeTest.java @@ -0,0 +1,20 @@ +package duke.task; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TaskTypeTest { + + @Test + void testTaskTypeToString_taskType_string() { + List types = List.of(TaskType.TODOS, TaskType.DEADLINE, TaskType.EVENT); + Assertions.assertAll( + () -> assertEquals("T", TaskType.taskTypeToString(types.get(0))), + () -> assertEquals("D", TaskType.taskTypeToString(types.get(1))), + () -> assertEquals("E", TaskType.taskTypeToString(types.get(2)))); + } +} \ No newline at end of file From 1a96098891080fd0e426a40891734843ab0db8d0 Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Fri, 12 Nov 2021 18:40:16 +0800 Subject: [PATCH 38/39] Improve code quality and follow code standard using checkstyle --- src/main/java/duke/Duke.java | 21 ++- src/main/java/duke/EndDuke.java | 20 ++- src/main/java/duke/LoadDuke.java | 38 ++++- src/main/java/duke/RunDuke.java | 26 ++- src/main/java/duke/StartDuke.java | 7 + src/main/java/duke/action/ParseProgress.java | 31 +++- src/main/java/duke/action/Parser.java | 20 +++ src/main/java/duke/command/CmdAddTask.java | 149 ++++++++++++++---- src/main/java/duke/command/CmdDelete.java | 17 +- src/main/java/duke/command/CmdFind.java | 30 +++- src/main/java/duke/command/CmdList.java | 8 + .../java/duke/command/CmdMarkTaskDone.java | 14 ++ src/main/java/duke/command/CmdPriority.java | 33 +++- src/main/java/duke/command/CmdSave.java | 76 ++++++++- src/main/java/duke/command/Command.java | 28 +++- .../UnableToLoadBuddhaException.java | 9 +- .../UnableToLoadProcessException.java | 9 +- src/main/java/duke/storage/FileAccess.java | 13 +- src/main/java/duke/task/Task.java | 5 + src/main/java/duke/task/TaskPriority.java | 8 +- src/main/java/duke/ui/Message.java | 113 +++++++++---- src/main/java/duke/ui/MsgTaskDetail.java | 59 ++++++- src/main/java/duke/ui/Ui.java | 9 +- src/test/java/duke/SampleTest.java | 32 ++-- .../java/duke/action/ParseProgressTest.java | 10 +- src/test/java/duke/task/TaskPriorityTest.java | 74 ++++----- src/test/java/duke/task/TaskTypeTest.java | 16 +- 27 files changed, 695 insertions(+), 180 deletions(-) diff --git a/src/main/java/duke/Duke.java b/src/main/java/duke/Duke.java index db3b5e49..74cafa95 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,10 +1,10 @@ package duke; +import duke.exception.UnableToLoadProcessException; import duke.storage.FileAccess; import duke.task.TaskList; import duke.ui.Message; import duke.ui.Ui; -import duke.exception.UnableToLoadProcessException; /** * Begin the program here. @@ -19,8 +19,13 @@ public class Duke { private TaskList myList; private Ui ui; - - public Duke(String filepath){ + /** + * Constructor + *

+ * initialize the ui, fileAccess and taskList + * load the progress into taskList + */ + public Duke(String filepath) { ui = new Ui(); fileAccess = new FileAccess(filepath); myList = new TaskList(); @@ -33,12 +38,18 @@ public Duke(String filepath){ } } - public void initialize(){ + /** + * Start the Duke program + */ + public void initialize() { StartDuke.run(); new RunDuke(myList, ui, fileAccess).run(); } - public void end(){ + /** + * End the Duke program + */ + public void end() { new EndDuke(fileAccess).run(); } diff --git a/src/main/java/duke/EndDuke.java b/src/main/java/duke/EndDuke.java index 3a6017ee..6e9db128 100644 --- a/src/main/java/duke/EndDuke.java +++ b/src/main/java/duke/EndDuke.java @@ -1,17 +1,31 @@ package duke; +import duke.exception.UnableToLoadBuddhaException; import duke.storage.FileAccess; import duke.ui.Message; -import duke.exception.UnableToLoadBuddhaException; + +/** + * Duke class that executes when Duke is ending + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class EndDuke { private static FileAccess fileAccess; - public EndDuke(FileAccess fileAccess){ + /** + * Constructor + */ + public EndDuke(FileAccess fileAccess) { this.fileAccess = fileAccess; } + /** + * Start the end sequence + */ public static void run() { showByeMessage(); } @@ -27,7 +41,7 @@ public static void showByeMessage() { String buddhaText = fileAccess.readBuddhaText(); Message.msgBuddha(buddhaText); } catch (UnableToLoadBuddhaException e) { - Message.msgUnableToLoadBuddah(); + Message.msgUnableToLoadBuddha(); } } } diff --git a/src/main/java/duke/LoadDuke.java b/src/main/java/duke/LoadDuke.java index d1cd7357..926ef410 100644 --- a/src/main/java/duke/LoadDuke.java +++ b/src/main/java/duke/LoadDuke.java @@ -1,5 +1,8 @@ package duke; +import java.time.LocalDate; +import java.time.LocalTime; + import duke.action.ParseDateTime; import duke.action.ParseProgress; import duke.exception.UnableToLoadProcessException; @@ -7,8 +10,13 @@ import duke.task.TaskPriority; import duke.ui.Message; -import java.time.LocalDate; -import java.time.LocalTime; +/** + * Duke class that executes when Duke is loading progress + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class LoadDuke { @@ -16,11 +24,17 @@ public class LoadDuke { private String progress; private String[] sentences; + /** + * Constructor + */ public LoadDuke(TaskList myList, String progress) { this.myList = myList; this.progress = progress; } + /** + * Execute the load + */ public void run() throws UnableToLoadProcessException { try { splitStringByTask(); @@ -31,10 +45,18 @@ public void run() throws UnableToLoadProcessException { } } + /** + * Calls to parser to split progress.txt into sentences + * Each sentence represents a task in String + */ private void splitStringByTask() throws Exception { - sentences = ParseProgress.splitStringIntoSentence(progress); + sentences = ParseProgress.splitProgressIntoSentence(progress); } + /** + * Loop through the sentences and read each sentence + * Generate task from each sentence + */ private void createTaskFromSentence() throws Exception { for (int i = 0; i < sentences.length - 1; i++) { String[] phrases = ParseProgress.splitSentenceByBarSeparator(sentences[i]); @@ -42,6 +64,9 @@ private void createTaskFromSentence() throws Exception { } } + /** + * Add task into taskList based on each sentence + */ private void addTaskFromPhrases(String[] phrases) throws Exception { String taskIndexInString = phrases[0]; @@ -75,10 +100,15 @@ private void addTaskFromPhrases(String[] phrases) throws Exception { switch (i) { case 5: taskDateInString = phrases[5]; + break; case 6: taskStartTimeInString = phrases[6]; + break; case 7: taskEndTimeInString = phrases[7]; + break; + default: + break; } i++; } @@ -109,6 +139,8 @@ private void addTaskFromPhrases(String[] phrases) throws Exception { myList.addItemDeadline(taskDetail, taskDate, taskTimeStart); } break; + default: + break; } if (isDoneInString.equals("1")) { diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index 1567c4d6..2dcd7f47 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -1,12 +1,20 @@ package duke; +import java.util.Scanner; + import duke.action.Parser; import duke.command.Command; import duke.storage.FileAccess; import duke.task.TaskList; import duke.ui.Ui; -import java.util.Scanner; +/** + * Duke class that run the main Duke program + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class RunDuke { @@ -17,7 +25,9 @@ public class RunDuke { private static Command cmd; private static Scanner scanner; - + /** + * Constructor + */ public RunDuke(TaskList myList, Ui ui, FileAccess fileAccess) { this.myList = myList; this.ui = ui; @@ -27,6 +37,9 @@ public RunDuke(TaskList myList, Ui ui, FileAccess fileAccess) { scanner = new Scanner(System.in); } + /** + * Execute the run + */ public void run() { boolean isDukeRunning = true; @@ -38,6 +51,13 @@ public void run() { } } + /** + * Read user command and execute respective methods accordingly + * + * @param userCommand String that represents the command type by user + * @param userInput String that represents the full user input + * @return boolean false if the command is "bye"; true if otherwise + */ private static boolean canProcessCommand(String userCommand, String userInput) { assert !userCommand.isEmpty() : "userCommand should not be empty"; @@ -45,7 +65,7 @@ private static boolean canProcessCommand(String userCommand, String userInput) { switch (userCommand) { case "bye": - return false; + return false; case "list": cmd.showFullList(myList); return true; diff --git a/src/main/java/duke/StartDuke.java b/src/main/java/duke/StartDuke.java index 54114c55..c59fdd63 100644 --- a/src/main/java/duke/StartDuke.java +++ b/src/main/java/duke/StartDuke.java @@ -2,6 +2,13 @@ import duke.ui.Message; +/** + * Duke class that executes when Duke is initialized + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class StartDuke { public static void run() { diff --git a/src/main/java/duke/action/ParseProgress.java b/src/main/java/duke/action/ParseProgress.java index 4a95dbaa..0f5591c9 100644 --- a/src/main/java/duke/action/ParseProgress.java +++ b/src/main/java/duke/action/ParseProgress.java @@ -1,12 +1,35 @@ package duke.action; +/** + * Handle progress related string + *

+ * Splitting of string (describes the progress) loaded from progress file into arrays + * String manipulation + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class ParseProgress { - public static String[] splitStringIntoSentence(String progress){ - return progress.split("\\n",-1); + /** + * Convert date from String to LocalDate + * + * @param progress String that is loaded from progress.txt + * @return String[] String array that has been split based on \n + */ + public static String[] splitProgressIntoSentence(String progress) { + return progress.split("\\n", -1); } - public static String[] splitSentenceByBarSeparator(String progress){ - return progress.split("\\|",-1); + /** + * Convert date from String to LocalDate + * + * @param sentence String that contains the task information + * @return String[] String array that has been split based on | + */ + public static String[] splitSentenceByBarSeparator(String sentence) { + return sentence.split("\\|", -1); } } diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 5f0cc7e0..8bc5131d 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -1,11 +1,25 @@ package duke.action; +/** + * Make sense of user input and return the user command + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class Parser { public Parser() { } + /** + * Convert date from String to LocalDate + * + * @param userInput String + * @return String that describe the command specified by user + */ public String processUserCommand(String userInput) { assert userInput != null : "There should be user input in processUserCommand"; @@ -42,6 +56,12 @@ public String processUserCommand(String userInput) { } } + /** + * Convert date from String to LocalDate + * + * @param firstWord String + * @return String that represents the first word of a line of string + */ private String getFirstWord(String firstWord) { int index = firstWord.indexOf(' '); diff --git a/src/main/java/duke/command/CmdAddTask.java b/src/main/java/duke/command/CmdAddTask.java index 2d03510c..54243816 100644 --- a/src/main/java/duke/command/CmdAddTask.java +++ b/src/main/java/duke/command/CmdAddTask.java @@ -1,15 +1,31 @@ package duke.command; +import java.time.LocalDate; +import java.time.LocalTime; + import duke.action.ParseDateTime; import duke.task.TaskList; import duke.task.TaskType; import duke.ui.Message; -import java.time.LocalDate; -import java.time.LocalTime; +/** + * Command class that handle adding task + *

+ * add 3 types of class: TODO, DEADLINE and EVENT. + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class CmdAddTask { + /** + * Add a task of todo type into TaskList + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ public static void addTaskToDo(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; @@ -23,14 +39,20 @@ public static void addTaskToDo(TaskList myList, String userInput) { myList.addItemToDos(userInput.substring(5)); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); String taskDetail = getTaskDetail(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; Message.msgAssignTaskToDo(taskTypeInString, isDoneInString, taskDetail, numOfItem); } + /** + * Add a task of event type into TaskList + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ public static void addTaskEvent(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; @@ -72,6 +94,12 @@ public static void addTaskEvent(TaskList myList, String userInput) { } } + /** + * Add a task of deadline type into TaskList + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ public static void addTaskDeadline(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; @@ -133,9 +161,9 @@ private static void toAddTaskEvent_localDate(TaskList myList, String taskDetail, myList.addItemEvent(taskDetail, taskDate); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); - String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); + String dateInString = getTaskEventDateInString(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; Message.msgAssignTaskEventTaskDate(taskTypeInString, isDoneInString, @@ -174,11 +202,11 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t myList.addItemEvent(taskDetail, taskDate, taskTimeStart); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); - String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); + String dateInString = getTaskEventDateInString(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; - String getTimeStartInString = getTaskEvent_TimeStart_InString(myList, lastTaskIndex); + String getTimeStartInString = getTaskEventTimeStartInString(myList, lastTaskIndex); Message.msgAssignTaskEventTaskDateTaskTimeStart(taskTypeInString, isDoneInString, taskDetail, dateInString, getTimeStartInString, numOfItem); @@ -224,14 +252,14 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t myList.addItemEvent(taskDetail, taskDate, taskTimeStart, taskTimeEnd); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); - String dateInString = getTaskEvent_Date_InString(myList, lastTaskIndex); - String getTimeStartInString = getTaskEvent_TimeStart_InString(myList, lastTaskIndex); - String getTimeEndInString = getTaskEvent_TimeEnd_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); + String dateInString = getTaskEventDateInString(myList, lastTaskIndex); + String getTimeStartInString = getTaskEventTimeStartInString(myList, lastTaskIndex); + String getTimeEndInString = getTaskEventTimeEndInString(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; - Message.msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(taskTypeInString, isDoneInString, + Message.msgAssignEventTaskDateTimeStartEnd(taskTypeInString, isDoneInString, taskDetail, dateInString, getTimeStartInString, getTimeEndInString, numOfItem); } @@ -258,9 +286,9 @@ private static void toAddTaskDeadline_localDate(TaskList myList, String taskDeta myList.addItemDeadline(taskDetail, taskDate); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); - String dateInString = getTaskDeadline_Date_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); + String dateInString = getTaskDeadlineDateInString(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; Message.msgAssignTaskDeadlineTaskDate(taskTypeInString, isDoneInString, taskDetail, dateInString, numOfItem); @@ -298,46 +326,103 @@ private static void toAddTaskDeadline_localDate_localTime(TaskList myList, Strin myList.addItemDeadline(taskDetail, taskDate, taskTime); int lastTaskIndex = myList.getNumOfItem() - 1; - String taskTypeInString = getTaskType_InString(myList, lastTaskIndex); - String isDoneInString = getIsDone_InString(myList, lastTaskIndex); - String dateInString = getTaskDeadline_Date_InString(myList, lastTaskIndex); - String timeInString = getTaskDeadline_Time_InString(myList, lastTaskIndex); + String taskTypeInString = getTaskTypeInString(myList, lastTaskIndex); + String isDoneInString = getIsDoneInString(myList, lastTaskIndex); + String dateInString = getTaskDeadlineDateInString(myList, lastTaskIndex); + String timeInString = getTaskDeadlineTimeInString(myList, lastTaskIndex); int numOfItem = lastTaskIndex + 1; - Message.msgAssignTaskDeadlineTaskDateTaskTime(taskTypeInString, isDoneInString, taskDetail, dateInString, timeInString, numOfItem); + Message.msgAssignTaskDeadlineTaskDateTaskTime(taskTypeInString, + isDoneInString, taskDetail, dateInString, timeInString, numOfItem); } - private static String getTaskType_InString(TaskList myList, int taskIndex) { + /** + * Get TaskType of a task using myList and its task index. + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of TaskType of a task in tasklist + */ + private static String getTaskTypeInString(TaskList myList, int taskIndex) { TaskType taskType = myList.getTaskType(taskIndex); return TaskType.taskTypeToString(taskType); } - private static String getIsDone_InString(TaskList myList, int taskIndex) { + /** + * Get isDone status of a task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of isDone of a task in tasklist + */ + private static String getIsDoneInString(TaskList myList, int taskIndex) { boolean isDone = myList.getTaskDoneStatus(taskIndex); return (isDone ? "X" : " "); } + /** + * Get taskDetail of a task + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of taskDetail of a task in tasklist + */ private static String getTaskDetail(TaskList myList, int taskIndex) { return myList.getTaskDetail(taskIndex); } - private static String getTaskEvent_Date_InString(TaskList myList, int taskIndex) { + /** + * Get date of an EVENT task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of date of a task in tasklist + */ + private static String getTaskEventDateInString(TaskList myList, int taskIndex) { return myList.getTaskEventTaskDateInString(taskIndex); } - private static String getTaskEvent_TimeStart_InString(TaskList myList, int taskIndex){ + /** + * Get start time of an EVENT task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of start time of a task in tasklist + */ + private static String getTaskEventTimeStartInString(TaskList myList, int taskIndex) { return myList.getTaskEventTaskTimeStartInString(taskIndex); } - private static String getTaskEvent_TimeEnd_InString (TaskList myList, int taskIndex){ + /** + * Get end time of an EVENT task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of end time of a task in tasklist + */ + private static String getTaskEventTimeEndInString(TaskList myList, int taskIndex) { return myList.getTaskEventTaskTimeEndInString(taskIndex); } - private static String getTaskDeadline_Date_InString(TaskList myList, int taskIndex){ + /** + * Get date of an DEADLINE task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of date of a task in tasklist + */ + private static String getTaskDeadlineDateInString(TaskList myList, int taskIndex) { return myList.getTaskDeadLineTaskDateInString(taskIndex); } - private static String getTaskDeadline_Time_InString(TaskList myList, int taskIndex){ + /** + * Get start time of an DEADLINE task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String representation of start time of a task in tasklist + */ + private static String getTaskDeadlineTimeInString(TaskList myList, int taskIndex) { return myList.getTaskDeadLineTaskTimeInString(taskIndex); } } diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java index 2665a697..10565c6d 100644 --- a/src/main/java/duke/command/CmdDelete.java +++ b/src/main/java/duke/command/CmdDelete.java @@ -3,8 +3,23 @@ import duke.task.TaskList; import duke.ui.Message; +/** + * Command class that delete a task from a tasklist + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class CmdDelete { + /** + * Execute the delete task command + * Remove a task from a tasklist + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; @@ -14,7 +29,7 @@ public static void run(TaskList myList, String userInput) { int taskIndex = Integer.parseInt(userInput.substring(7)) - 1; int numOfTaskAfterDelete = myList.getNumOfItem() - 1; - if (taskIndex >= myList.getNumOfItem()){ + if (taskIndex >= myList.getNumOfItem()) { Message.msgInvalidTaskNumber(); return; } diff --git a/src/main/java/duke/command/CmdFind.java b/src/main/java/duke/command/CmdFind.java index e5910dad..83d75482 100644 --- a/src/main/java/duke/command/CmdFind.java +++ b/src/main/java/duke/command/CmdFind.java @@ -1,16 +1,31 @@ package duke.command; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import duke.task.TaskList; import duke.ui.Message; import duke.ui.MsgTaskDetail; -import java.util.ArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +/** + * Command class that find a task from a tasklist + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class CmdFind { - public static void run(TaskList myList, String userInput){ + /** + * Execute the find task command + * Find a task based on the keyword input by the user + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ + public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; assert userInput != null : "userInput should not be empty"; @@ -38,6 +53,13 @@ public static void run(TaskList myList, String userInput){ showTaskFound(myList, taskNumberContainingSearchTerm); } + /** + * Check if the searchString can be found inside the sourceString + * + * @param sourceString String that represents the source + * @param searchString String that represents the term used to search in the sourceString + * @return boolean True if the term is found; false otherwise + */ private static boolean hasStringContain(String sourceString, String searchString) { String pattern = "\\b" + searchString + "\\b"; Pattern p = Pattern.compile(pattern); diff --git a/src/main/java/duke/command/CmdList.java b/src/main/java/duke/command/CmdList.java index bd6e9bcd..e3402439 100644 --- a/src/main/java/duke/command/CmdList.java +++ b/src/main/java/duke/command/CmdList.java @@ -4,6 +4,14 @@ import duke.ui.Message; import duke.ui.MsgTaskDetail; +/** + * Command class that list all the task in the tasklist + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class CmdList { /** diff --git a/src/main/java/duke/command/CmdMarkTaskDone.java b/src/main/java/duke/command/CmdMarkTaskDone.java index feec9ebe..c991d4d7 100644 --- a/src/main/java/duke/command/CmdMarkTaskDone.java +++ b/src/main/java/duke/command/CmdMarkTaskDone.java @@ -3,8 +3,22 @@ import duke.task.TaskList; import duke.ui.Message; +/** + * Command class that mark a task as done + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class CmdMarkTaskDone { + /** + * Execute the marking command to mark a task as done + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java index c2e2ab24..b27e2418 100644 --- a/src/main/java/duke/command/CmdPriority.java +++ b/src/main/java/duke/command/CmdPriority.java @@ -1,10 +1,18 @@ package duke.command; +import java.util.Scanner; + import duke.task.TaskList; import duke.task.TaskPriority; import duke.ui.Message; -import java.util.Scanner; +/** + * Command class that find a task from a tasklist + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class CmdPriority { @@ -21,7 +29,7 @@ public static void run(TaskList myList, Scanner scanner) { assert myList != null : "mylist should not be empty"; assert scanner != null : "scanner should not be empty"; - if (myList.getNumOfItem() < 1){ + if (myList.getNumOfItem() < 1) { Message.msgInvalidSetTaskListIsEmpty(); return; } @@ -80,6 +88,14 @@ private static boolean hasValidTaskNumber(TaskList myList, String userInputStrin return false; } + /** + * Check the validity of user input for priority number + *

+ * Expected input should be 1 to 3 + * + * @param userInputPriorityS + * @return boolean True if userInput is "1" to "3"; False otherwise + */ private static boolean hasValidPriorityNumber(String userInputPriorityS) { assert userInputPriorityS != null : "userInputPriorityS should not be empty"; @@ -108,7 +124,7 @@ private static boolean hasValidPriorityNumber(String userInputPriorityS) { * -- Update the task with new priority * * @param myList TaskList that contains the list of task - * @param taskIndex int that indicates the task number + * @param taskIndex int that indicates the task number * @param taskPriority TaskPriority(new one) that want to be set */ private static void toUpdatePriority(TaskList myList, int taskIndex, TaskPriority taskPriority) { @@ -118,11 +134,18 @@ private static void toUpdatePriority(TaskList myList, int taskIndex, TaskPriorit assert taskPriority != null : "taskPriority should not be empty"; myList.setTaskPriority(taskIndex, taskPriority); - String taskPriorityInString = getTaskPriority_InString(myList, taskIndex); + String taskPriorityInString = getTaskPriorityInString(myList, taskIndex); Message.msgSetPriority(taskIndex + 1, taskPriorityInString); } - private static String getTaskPriority_InString(TaskList myList, int taskIndex){ + /** + * Get priority of the task in String + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task in tasklist + * @return String that represents the priority of the task + */ + private static String getTaskPriorityInString(TaskList myList, int taskIndex) { assert myList != null : "mylist should not be empty"; assert taskIndex >= 0 : "taskIndex should be equal or more than 0"; diff --git a/src/main/java/duke/command/CmdSave.java b/src/main/java/duke/command/CmdSave.java index 6798b2cc..3d6a8d00 100644 --- a/src/main/java/duke/command/CmdSave.java +++ b/src/main/java/duke/command/CmdSave.java @@ -5,6 +5,14 @@ import duke.task.TaskPriority; import duke.task.TaskType; +/** + * Command class that save all the task from the current taskList to progress.txt + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class CmdSave { private static FileAccess fileAccess; @@ -19,12 +27,18 @@ public class CmdSave { private static String timeStart; private static String timeEnd; + /** + * Constructor + */ public CmdSave(TaskList myList, FileAccess fileAccess) { this.myList = myList; this.fileAccess = fileAccess; sb = new StringBuilder(); } + /** + * Execute the save + */ public static void run() { String listOfTaskString = generateListOfTaskInString(); fileAccess.saveProgressIntoFile(listOfTaskString); @@ -32,11 +46,19 @@ public static void run() { /** * Read a list of task and convert it into string + *

+ * calls the following methods to generate the string + * setStringToNull(); + * appendBasic(taskIndex); + * appendAdvance(taskIndex); + * appendEnd(); + * + * @return String that represents the string to be saved in text */ private static String generateListOfTaskInString() { for (int taskIndex = 0; taskIndex < myList.getNumOfItem(); taskIndex++) { - clearString(); + setStringToNull(); appendBasic(taskIndex); appendAdvance(taskIndex); appendEnd(); @@ -44,7 +66,20 @@ private static String generateListOfTaskInString() { return sb.toString(); } - private static void clearString() { + /** + * set the private variables to "null" + *

+ * taskTypeInString = "null"; + * isDoneInString = "null"; + * taskDetail = "null"; + * taskPriorityInString = "null"; + * taskDate = "null"; + * timeStart = "null"; + * timeEnd = "null"; + * + * @return StringBuilder + */ + private static void setStringToNull() { taskTypeInString = "null"; isDoneInString = "null"; taskDetail = "null"; @@ -54,6 +89,17 @@ private static void clearString() { timeEnd = "null"; } + /** + * append basic variables to the string builder + *

+ * taskIndex + * taskType + * isDone + * taskDetail + * taskPriority + * + * @return StringBuilder + */ private static StringBuilder appendBasic(int taskIndex) { taskTypeInString = TaskType.taskTypeToString(myList.getTaskType(taskIndex)); @@ -79,6 +125,17 @@ private static StringBuilder appendBasic(int taskIndex) { return sb; } + /** + * append advance variables to the string builder based on the variable types + *

+ * date` + * start time + * end time + *

+ * depending on the taskType, different String is appended + * + * @return StringBuilder + */ private static StringBuilder appendAdvance(int taskIndex) { switch (taskTypeInString) { @@ -95,6 +152,11 @@ private static StringBuilder appendAdvance(int taskIndex) { return sb; } + /** + * append date and start time to DEADLINE type task + * + * @return StringBuilder + */ private static StringBuilder appendDeadline(int taskIndex) { taskDate = myList.getTaskDeadLineTaskDateInString(taskIndex); @@ -107,6 +169,11 @@ private static StringBuilder appendDeadline(int taskIndex) { return sb; } + /** + * append date, start time, and end time to EVENT type task + * + * @return StringBuilder + */ private static StringBuilder appendEvent(int taskIndex) { taskDate = myList.getTaskEventTaskDateInString(taskIndex); @@ -121,6 +188,11 @@ private static StringBuilder appendEvent(int taskIndex) { return sb; } + /** + * append ;\n to the StringBuilder + * + * @return StringBuilder + */ private static StringBuilder appendEnd() { sb.append(";\n"); return sb; diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index b81ca0b9..4fbf1835 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -1,28 +1,37 @@ package duke.command; -import duke.action.ParseDateTime; +import java.util.Scanner; + import duke.action.Parser; import duke.storage.FileAccess; import duke.task.TaskList; -import duke.task.TaskType; import duke.ui.Message; -import java.util.ArrayList; -import java.util.Scanner; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +/** + * Core Command class + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ public class Command { - Parser parser; + private static Parser parser; + /** + * Constructor + */ public Command(Parser parser) { this.parser = parser; } // Basic processCommand Method <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - public void showInfo(){ + /** + * Show info of all the command Duke can accept + */ + public void showInfo() { Message.msgShowDukeCommandList(); } @@ -122,6 +131,9 @@ public void addTaskDeadline(TaskList myList, String userInput) { CmdAddTask.addTaskDeadline(myList, userInput); } + /** + * Show invalid command + */ public void showInvalidCommand() { Message.msgInvalidInput(); } diff --git a/src/main/java/duke/exception/UnableToLoadBuddhaException.java b/src/main/java/duke/exception/UnableToLoadBuddhaException.java index 520ff8a9..9d396772 100644 --- a/src/main/java/duke/exception/UnableToLoadBuddhaException.java +++ b/src/main/java/duke/exception/UnableToLoadBuddhaException.java @@ -1,4 +1,11 @@ package duke.exception; -public class UnableToLoadBuddhaException extends Exception{ +/** + * Exception class that is called when buddha.txt fails to load + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class UnableToLoadBuddhaException extends Exception { } diff --git a/src/main/java/duke/exception/UnableToLoadProcessException.java b/src/main/java/duke/exception/UnableToLoadProcessException.java index 499e5071..30fa4a42 100644 --- a/src/main/java/duke/exception/UnableToLoadProcessException.java +++ b/src/main/java/duke/exception/UnableToLoadProcessException.java @@ -1,5 +1,12 @@ package duke.exception; -public class UnableToLoadProcessException extends Exception{ +/** + * Exception class that is called when progress.txt fails to load + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ +public class UnableToLoadProcessException extends Exception { } diff --git a/src/main/java/duke/storage/FileAccess.java b/src/main/java/duke/storage/FileAccess.java index bf2e6299..0672a892 100644 --- a/src/main/java/duke/storage/FileAccess.java +++ b/src/main/java/duke/storage/FileAccess.java @@ -1,15 +1,15 @@ package duke.storage; -import duke.ui.Message; -import duke.ui.Ui; -import duke.exception.UnableToLoadBuddhaException; -import duke.exception.UnableToLoadProcessException; - import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; +import duke.exception.UnableToLoadBuddhaException; +import duke.exception.UnableToLoadProcessException; +import duke.ui.Message; +import duke.ui.Ui; + /** * Handles file handling related functions * @@ -25,6 +25,7 @@ public class FileAccess { /** * Constructor + * * @param filepath */ public FileAccess(String filepath) { @@ -56,7 +57,7 @@ public void saveProgressIntoFile(String stringToBeWritten) { * * @return String that represents a list of task details */ - public static String loadProgressFromFile() throws UnableToLoadProcessException{ + public static String loadProgressFromFile() throws UnableToLoadProcessException { String progress = ""; String pathRoot = System.getProperty("user.dir"); // e.g. pathRoot = D:\My Files\School Documents\Repository\Duke diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index ff97b986..c01da588 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -92,6 +92,11 @@ public void setTypeOfTask(TaskType taskType) { this.taskType = taskType; } + /** + * Set thr priority of a task + * + * @param taskPriority TaskPriority that represent the new priority + */ public void setPriority(TaskPriority taskPriority) { this.taskPriority = taskPriority; } diff --git a/src/main/java/duke/task/TaskPriority.java b/src/main/java/duke/task/TaskPriority.java index 8dddc14a..6cd53c94 100644 --- a/src/main/java/duke/task/TaskPriority.java +++ b/src/main/java/duke/task/TaskPriority.java @@ -22,7 +22,7 @@ public static boolean isHigherPriority(TaskPriority taskA, TaskPriority taskB) { /** * Convert Int value to Priority - * + *

* 1 -> HIGH * 2 -> MEDIUM * 3 -> LOW @@ -46,7 +46,7 @@ public static TaskPriority convertIntToPriority(int priority) { /** * Convert String value to Priority - * + *

* "1" -> HIGH * "2" -> MEDIUM * "3" -> LOW @@ -70,7 +70,7 @@ public static TaskPriority convertStringToPriority(String priority) { /** * Convert TaskPriority to Int - * + *

* 1 <- HIGH * 2 <- MEDIUM * 3 <- LOW @@ -114,7 +114,7 @@ public static String convertPriorityToString(TaskPriority task) { /** * Convert TaskPriority to String */ - public String toStringInNumber(){ + public String toStringInNumber() { switch (this) { case LOW: return "3"; diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index 6de7e569..8b1c0845 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -1,11 +1,5 @@ package duke.ui; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - import duke.task.TaskList; /** @@ -19,6 +13,10 @@ public class Message { // Starting Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /** + * Display greet message at the start + */ public static void msgGreet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; @@ -37,7 +35,8 @@ public static void msgGreet() { * @param taskDetail String that describes the task detail * @param numOfItem Int that describes the number of items in taskList */ - public static void msgAssignTaskToDo(String taskTypeInString, String isDoneInString, String taskDetail, int numOfItem) { + public static void msgAssignTaskToDo(String taskTypeInString, String isDoneInString, + String taskDetail, int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); @@ -59,7 +58,8 @@ public static void msgAssignTaskDeadlineTaskDate(String taskTypeInString, String System.out.println(" Got it. I've added this task: "); System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(by: " + dateInString + ")"); + " [" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + "(by: " + dateInString + ")"); System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } @@ -99,8 +99,9 @@ public static void msgAssignTaskEventTaskDate(String taskTypeInString, String is String taskDetail, String dateInString, int numOfItem) { System.out.println(" Got it. I've added this task: "); - System.out.println( - " [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + "(at: " + dateInString + ")"); + System.out.println(" [" + taskTypeInString + "][" + + isDoneInString + "] " + + taskDetail + "(at: " + dateInString + ")"); System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } @@ -115,8 +116,12 @@ public static void msgAssignTaskEventTaskDate(String taskTypeInString, String is * @param timeStartInString String that describes the start time * @param numOfItem Int that describes the number of tasks */ - public static void msgAssignTaskEventTaskDateTaskTimeStart(String taskTypeInString, String isDoneInString, String taskDetail, - String dateInString, String timeStartInString, int numOfItem) { + public static void msgAssignTaskEventTaskDateTaskTimeStart(String taskTypeInString, + String isDoneInString, + String taskDetail, + String dateInString, + String timeStartInString, + int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); @@ -136,14 +141,18 @@ public static void msgAssignTaskEventTaskDateTaskTimeStart(String taskTypeInStri * @param timeEndInString String that describes the end time * @param numOfItem Int that describes the number of tasks */ - public static void msgAssignTaskEventTaskDateTaskTimeStartTaskTimeEnd(String taskTypeInString, String isDoneInString, - String taskDetail, String dateInString, - String timeStartInString, String timeEndInString, - int numOfItem) { + public static void msgAssignEventTaskDateTimeStartEnd(String taskTypeInString, + String isDoneInString, + String taskDetail, + String dateInString, + String timeStartInString, + String timeEndInString, + int numOfItem) { System.out.println(" Got it. I've added this task: "); System.out.println(" [" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail); - System.out.println(" (at: " + dateInString + ", from: " + timeStartInString + " to " + timeEndInString + ")"); + System.out.println(" (at: " + dateInString + ", from: " + timeStartInString + + " to " + timeEndInString + ")"); System.out.println(" Now you have " + numOfItem + " tasks in the list."); System.out.println("_________________________________"); } @@ -256,42 +265,72 @@ public static void msgDashLines() { System.out.println("_________________________________"); } + /** + * Display TODO task description + */ public static void msgTaskTodo(String taskTypeInString, String isDoneInString, String taskDetail, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println("[" + taskTypeInString + "][" + + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); } + /** + * Display EVENT task description + */ public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, String year, String month, String day, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + " [" + taskPriorityInString + "]"); System.out.println(" (at " + year + " " + month + " " + day + ")"); } - public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, - String year, String month, String day, String timeStart, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + /** + * Display EVENT task description + */ + public static void msgTaskEvent(String taskTypeInString, + String isDoneInString, + String taskDetail, + String year, + String month, + String day, + String timeStart, + String taskPriorityInString) { + System.out.println("[" + taskTypeInString + "][" + + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); System.out.print(" (at " + year + " " + month + " " + day); System.out.println(" ; from: " + timeStart + ")"); } + /** + * Display EVENT task description + */ public static void msgTaskEvent(String taskTypeInString, String isDoneInString, String taskDetail, String year, String month, String day, String timeStart, String timeEnd, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + " [" + taskPriorityInString + "]"); System.out.print(" (at " + year + " " + month + " " + day); System.out.println(" ; from: " + timeStart + " to " + timeEnd + ")"); } + /** + * Display DEADLINE task description + */ public static void msgTaskDeadline(String taskTypeInString, String isDoneInString, String taskDetail, String year, String month, String day, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + " [" + taskPriorityInString + "]"); System.out.println(" by: " + year + " " + month + " " + day + ")"); } + /** + * Display DEADLINE task description + */ public static void msgTaskDeadline(String taskTypeInString, String isDoneInString, String taskDetail, String year, String month, String day, String timeStart, String taskPriorityInString) { - System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + taskDetail + " [" + taskPriorityInString + "]"); + System.out.println("[" + taskTypeInString + "][" + isDoneInString + "] " + + taskDetail + " [" + taskPriorityInString + "]"); System.out.println(" by: " + year + " " + month + " " + day + " " + timeStart + ")"); } @@ -308,11 +347,17 @@ public static void msgRemoveItem(TaskList myList, int taskNumber, int numOfTaskA System.out.println("_________________________________"); } - public static void msgArrowHead(){ + /** + * Display arrow head + */ + public static void msgArrowHead() { System.out.print(">> "); } - public static void msgShowDukeCommandList(){ + /** + * Display full list of Duke command + */ + public static void msgShowDukeCommandList() { System.out.println(">> Full List of Duke Command Available:"); System.out.println(" 1. todo (task description)"); System.out.println(" >> add a TODO task"); @@ -446,12 +491,18 @@ public static void msgInvalidInputTimeStartLaterThanTimeEnd() { System.out.println("_________________________________"); } - public static void msgInvalidSetTaskListIsEmpty(){ + /** + * Display message about task list being empty + */ + public static void msgInvalidSetTaskListIsEmpty() { System.out.println(" ☹ OOPS!!! The task list is empty."); System.out.println("_________________________________"); } - public static void msgUnableToLoadBuddah(){ + /** + * Display message when buddha.txt fails to load + */ + public static void msgUnableToLoadBuddha() { System.out.println(" >> Buddha Protection is under maintenance <<"); System.out.println("_________________________________"); } @@ -461,7 +512,7 @@ public static void msgUnableToLoadBuddah(){ /** * Display message before the end of program */ - public static void msgBye(){ + public static void msgBye() { System.out.println("Bye. Hope to see you again soon!"); System.out.println("_________________________________"); } @@ -469,7 +520,7 @@ public static void msgBye(){ /** * Display buddha.txt before the end of program */ - public static void msgBuddha(String buddhaText){ + public static void msgBuddha(String buddhaText) { System.out.println(buddhaText); } } diff --git a/src/main/java/duke/ui/MsgTaskDetail.java b/src/main/java/duke/ui/MsgTaskDetail.java index 13ac109e..0e32401f 100644 --- a/src/main/java/duke/ui/MsgTaskDetail.java +++ b/src/main/java/duke/ui/MsgTaskDetail.java @@ -4,6 +4,14 @@ import duke.task.TaskPriority; import duke.task.TaskType; +/** + * Ui class that display message about a task + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + public class MsgTaskDetail { private static TaskList myList; @@ -18,15 +26,21 @@ public class MsgTaskDetail { private static String timeStart; private static String timeEnd; + /** + * Constructor + */ public MsgTaskDetail(TaskList myList, int taskIndex) { this.myList = myList; this.taskIndex = taskIndex; - taskTypeInString = getTaskType_InString(myList, taskIndex); - isDoneInString = getIsDone_InString(myList, taskIndex); + taskTypeInString = getTaskTypeInString(myList, taskIndex); + isDoneInString = getIsDoneInString(myList, taskIndex); taskDetail = getTaskDetail(myList, taskIndex); taskPriorityInString = getTaskPriority(myList, taskIndex); } + /** + * Show task detail based on the task type + */ public static void showTaskDetail() { TaskType taskType = myList.getTaskType(taskIndex); @@ -45,10 +59,16 @@ public static void showTaskDetail() { } } + /** + * Show task detail of TODO type + */ private static void showTaskTodo() { Message.msgTaskTodo(taskTypeInString, isDoneInString, taskDetail, taskPriorityInString); } + /** + * Show task detail of EVENT type + */ private static void showTaskEvent(TaskList myList, int taskIndex) { year = myList.getTaskEventTaskDateYearInString(taskIndex); month = myList.getTaskEventTaskDateMonthInString(taskIndex); @@ -68,6 +88,9 @@ private static void showTaskEvent(TaskList myList, int taskIndex) { } } + /** + * Show task detail of DEADLINE type + */ private static void showTaskDeadline(TaskList myList, int taskIndex) { year = myList.getTaskDeadLineTaskDateYearInString(taskIndex); month = myList.getTaskDeadLineTaskDateMonthInString(taskIndex); @@ -83,20 +106,48 @@ private static void showTaskDeadline(TaskList myList, int taskIndex) { } } - private static String getTaskType_InString(TaskList myList, int taskIndex) { + /** + * Get task type in string + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String that describes the task type + */ + private static String getTaskTypeInString(TaskList myList, int taskIndex) { TaskType taskType = myList.getTaskType(taskIndex); return TaskType.taskTypeToString(taskType); } - private static String getIsDone_InString(TaskList myList, int taskIndex) { + /** + * Get isDone status in string + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String that describes the is done status + */ + private static String getIsDoneInString(TaskList myList, int taskIndex) { boolean isDone = myList.getTaskDoneStatus(taskIndex); return (isDone ? "X" : " "); } + /** + * Get task detail in string + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String that describes the task detail + */ private static String getTaskDetail(TaskList myList, int taskIndex) { return myList.getTaskDetail(taskIndex); } + /** + * Get task priority in string + * + * @param myList TaskList that contains the list of task + * @param taskIndex Int that represents the index of the task + * @return String that describes the priority of a task + */ private static String getTaskPriority(TaskList myList, int taskIndex) { TaskPriority taskPriority = myList.getTaskPriority(taskIndex); return TaskPriority.convertPriorityToString(taskPriority); diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 9d6e47d3..5f861b0e 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -13,11 +13,16 @@ public class Ui { - public Ui(){ + public Ui() { } - public String requestUserInput(Scanner scanner){ + /** + * request user input and read the input string + * + * @param scanner Scanner that read user input + */ + public String requestUserInput(Scanner scanner) { String userInput = ""; diff --git a/src/test/java/duke/SampleTest.java b/src/test/java/duke/SampleTest.java index 5c65bfba..51694fe4 100644 --- a/src/test/java/duke/SampleTest.java +++ b/src/test/java/duke/SampleTest.java @@ -1,53 +1,63 @@ package duke; -import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; public class SampleTest { @Test @DisplayName("Sample JUnit Test") + @Disabled("Sample Test") public void dummyTest() { assertEquals(2, 2); } @Test + @Disabled("Sample Test") public void dummyFailTest() { assertEquals(2, 1); } @Test - @Disabled("Not implemented yet") + @Disabled("Sample Test") public void shouldShowSimpleAssertion() { - Assertions.assertEquals(1, 1); - Assertions.assertEquals(1, 2); + assertEquals(1, 1); + assertEquals(1, 2); } @Test @DisplayName("Should check all items in the list") + @Disabled("Sample Test") public void shouldCheckAllItemsInTheList() { List numbers = List.of(2, 3, 5, 7); - Assertions.assertAll(() -> assertEquals(2, numbers.get(0)), - () -> assertEquals(300, numbers.get(1)), - () -> assertEquals(5, numbers.get(2)), - () -> assertEquals(700, numbers.get(3))); + Assertions.assertAll(() -> + assertEquals(2, numbers.get(0)), () -> + assertEquals(300, numbers.get(1)), () -> + assertEquals(5, numbers.get(2)), () -> + assertEquals(700, numbers.get(3))); } @Test @DisplayName("Should only run the test if some criteria are met 1") + @Disabled("Sample Test") void shouldOnlyRunTheTestIfSomeCriteriaAreMet1() { Assumptions.assumeTrue(13 > 10); - assertEquals(2,1); + assertEquals(2, 1); } @Test @DisplayName("Should only run the test if some criteria are met 2") + @Disabled("Sample Test") void shouldOnlyRunTheTestIfSomeCriteriaAreMet2() { Assumptions.assumeTrue(13 < 10); - assertEquals(2,1); + assertEquals(2, 1); } diff --git a/src/test/java/duke/action/ParseProgressTest.java b/src/test/java/duke/action/ParseProgressTest.java index 68ee746e..a8a78424 100644 --- a/src/test/java/duke/action/ParseProgressTest.java +++ b/src/test/java/duke/action/ParseProgressTest.java @@ -1,14 +1,14 @@ package duke.action; +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - class ParseProgressTest { @Test - @Disabled ("Unknown JUnit behaviour") + @Disabled("Unknown JUnit behaviour") void testSplitStringIntoSentence() { String input = "HelloWorld"; String[] expected = {"HelloWorld"}; @@ -16,10 +16,10 @@ void testSplitStringIntoSentence() { } @Test - @Disabled ("Unknown JUnit behaviour") + @Disabled("Unknown JUnit behaviour") void splitSentenceByBarSeparator() { String input = "HelloWorld"; String[] expected = {"HelloWorld"}; assertEquals(expected, input); } -} \ No newline at end of file +} diff --git a/src/test/java/duke/task/TaskPriorityTest.java b/src/test/java/duke/task/TaskPriorityTest.java index 7d6241f5..04c242d7 100644 --- a/src/test/java/duke/task/TaskPriorityTest.java +++ b/src/test/java/duke/task/TaskPriorityTest.java @@ -1,11 +1,11 @@ package duke.task; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; class TaskPriorityTest { @@ -19,28 +19,28 @@ void testIsHigherPriority() { @Test void testConvertIntToPriority() { - List priorities = List.of(1,2,3,4,100,0); - - Assertions.assertAll( - () -> assertEquals(TaskPriority.HIGH, TaskPriority.convertIntToPriority(priorities.get(0))), - () -> assertEquals(TaskPriority.MEDIUM, TaskPriority.convertIntToPriority(priorities.get(1))), - () -> assertEquals(TaskPriority.LOW, TaskPriority.convertIntToPriority(priorities.get(2))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(3))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(4))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(5)))); + List priorities = List.of(1, 2, 3, 4, 100, 0); + + Assertions.assertAll(() -> + assertEquals(TaskPriority.HIGH, TaskPriority.convertIntToPriority(priorities.get(0))), () -> + assertEquals(TaskPriority.MEDIUM, TaskPriority.convertIntToPriority(priorities.get(1))), () -> + assertEquals(TaskPriority.LOW, TaskPriority.convertIntToPriority(priorities.get(2))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(3))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(4))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertIntToPriority(priorities.get(5)))); } @Test void testConvertStringToPriority() { - List priorities = List.of("1","2","3","4","100","0"); - - Assertions.assertAll( - () -> assertEquals(TaskPriority.HIGH, TaskPriority.convertStringToPriority(priorities.get(0))), - () -> assertEquals(TaskPriority.MEDIUM, TaskPriority.convertStringToPriority(priorities.get(1))), - () -> assertEquals(TaskPriority.LOW, TaskPriority.convertStringToPriority(priorities.get(2))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(3))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(4))), - () -> assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(5)))); + List priorities = List.of("1", "2", "3", "4", "100", "0"); + + Assertions.assertAll(() -> + assertEquals(TaskPriority.HIGH, TaskPriority.convertStringToPriority(priorities.get(0))), () -> + assertEquals(TaskPriority.MEDIUM, TaskPriority.convertStringToPriority(priorities.get(1))), () -> + assertEquals(TaskPriority.LOW, TaskPriority.convertStringToPriority(priorities.get(2))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(3))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(4))), () -> + assertEquals(TaskPriority.INVALID, TaskPriority.convertStringToPriority(priorities.get(5)))); } @Test @@ -48,11 +48,11 @@ void testConvertPriorityToInt() { List priorities = List.of(TaskPriority.LOW, TaskPriority.MEDIUM, TaskPriority.HIGH, TaskPriority.INVALID); - Assertions.assertAll( - () -> assertEquals(3, TaskPriority.convertPriorityToInt(priorities.get(0))), - () -> assertEquals(2, TaskPriority.convertPriorityToInt(priorities.get(1))), - () -> assertEquals(1, TaskPriority.convertPriorityToInt(priorities.get(2))), - () -> assertEquals(0, TaskPriority.convertPriorityToInt(priorities.get(3)))); + Assertions.assertAll(() -> + assertEquals(3, TaskPriority.convertPriorityToInt(priorities.get(0))), () -> + assertEquals(2, TaskPriority.convertPriorityToInt(priorities.get(1))), () -> + assertEquals(1, TaskPriority.convertPriorityToInt(priorities.get(2))), () -> + assertEquals(0, TaskPriority.convertPriorityToInt(priorities.get(3)))); } @Test @@ -60,20 +60,20 @@ void testConvertPriorityToString() { List priorities = List.of(TaskPriority.LOW, TaskPriority.MEDIUM, TaskPriority.HIGH, TaskPriority.INVALID); - Assertions.assertAll( - () -> assertEquals("LOW", TaskPriority.convertPriorityToString(priorities.get(0))), - () -> assertEquals("MEDIUM", TaskPriority.convertPriorityToString(priorities.get(1))), - () -> assertEquals("HIGH", TaskPriority.convertPriorityToString(priorities.get(2))), - () -> assertEquals("INVALID", TaskPriority.convertPriorityToString(priorities.get(3)))); + Assertions.assertAll(() -> + assertEquals("LOW", TaskPriority.convertPriorityToString(priorities.get(0))), () -> + assertEquals("MEDIUM", TaskPriority.convertPriorityToString(priorities.get(1))), () -> + assertEquals("HIGH", TaskPriority.convertPriorityToString(priorities.get(2))), () -> + assertEquals("INVALID", TaskPriority.convertPriorityToString(priorities.get(3)))); } @Test void testToStringInNumber() { - Assertions.assertAll( - () -> assertEquals("3", TaskPriority.LOW.toStringInNumber()), - () -> assertEquals("2", TaskPriority.MEDIUM.toStringInNumber()), - () -> assertEquals("1", TaskPriority.HIGH.toStringInNumber()), - () -> assertEquals("0", TaskPriority.INVALID.toStringInNumber())); + Assertions.assertAll(() -> + assertEquals("3", TaskPriority.LOW.toStringInNumber()), () -> + assertEquals("2", TaskPriority.MEDIUM.toStringInNumber()), () -> + assertEquals("1", TaskPriority.HIGH.toStringInNumber()), () -> + assertEquals("0", TaskPriority.INVALID.toStringInNumber())); } -} \ No newline at end of file +} diff --git a/src/test/java/duke/task/TaskTypeTest.java b/src/test/java/duke/task/TaskTypeTest.java index 794aff50..3d0df045 100644 --- a/src/test/java/duke/task/TaskTypeTest.java +++ b/src/test/java/duke/task/TaskTypeTest.java @@ -1,20 +1,20 @@ package duke.task; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; class TaskTypeTest { @Test void testTaskTypeToString_taskType_string() { List types = List.of(TaskType.TODOS, TaskType.DEADLINE, TaskType.EVENT); - Assertions.assertAll( - () -> assertEquals("T", TaskType.taskTypeToString(types.get(0))), - () -> assertEquals("D", TaskType.taskTypeToString(types.get(1))), - () -> assertEquals("E", TaskType.taskTypeToString(types.get(2)))); + Assertions.assertAll(() -> + assertEquals("T", TaskType.taskTypeToString(types.get(0))), () -> + assertEquals("D", TaskType.taskTypeToString(types.get(1))), () -> + assertEquals("E", TaskType.taskTypeToString(types.get(2)))); } -} \ No newline at end of file +} From efb2181e9f2a7dd8c6eb9aa92a3832b01e5e627b Mon Sep 17 00:00:00 2001 From: EndireKT <72508923+EndireKT@users.noreply.github.com> Date: Sun, 14 Nov 2021 01:07:06 +0800 Subject: [PATCH 39/39] Improve code quality, add undone feature; error handling --- Duke-1.2.jar | Bin 0 -> 43070 bytes local.properties | 8 +++ src/main/java/duke/RunDuke.java | 18 +++++- src/main/java/duke/action/Parser.java | 6 +- src/main/java/duke/command/CmdAddTask.java | 10 +-- src/main/java/duke/command/CmdDelete.java | 7 ++- src/main/java/duke/command/CmdFind.java | 6 ++ src/main/java/duke/command/CmdList.java | 5 +- .../java/duke/command/CmdMarkTaskDone.java | 16 ++++- .../java/duke/command/CmdMarkTaskUnDone.java | 40 ++++++++++++ src/main/java/duke/command/CmdPriority.java | 13 ++-- src/main/java/duke/command/Command.java | 10 +++ src/main/java/duke/task/Task.java | 8 +++ src/main/java/duke/task/TaskList.java | 10 +++ src/main/java/duke/ui/Message.java | 51 ++++++++++----- src/resources/progress.txt | 4 -- src/resources/progress_backup.txt | 5 ++ src/test/java/duke/task/TaskTypeTest.java | 2 +- text-ui-test/input.txt | 59 ++++++++++++------ 19 files changed, 220 insertions(+), 58 deletions(-) create mode 100644 Duke-1.2.jar create mode 100644 local.properties create mode 100644 src/main/java/duke/command/CmdMarkTaskUnDone.java create mode 100644 src/resources/progress_backup.txt diff --git a/Duke-1.2.jar b/Duke-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..48e610234f1c586bbb0f5adf0410df21ebb2b0d9 GIT binary patch literal 43070 zcmaHTW02;IwsrTkHEr9rZQHhO+qP}nHlDVp?Vh$Z?e1^hI``JO_tvQ|spLnps* zKO4&b1j-7^Ns5UotI)}cJ;+W^$w<@EEx<|BQq4}!H7hYJGw&VU%T7-(xz0+`(6uQ^ zP|nExat21~(dp6oA6JO_Keqz*_X;Mi)~5gKHvTUN_P;@f#x9ojcK-|eUSOllTawr@ z1quXY0|Nwv|9`LwhEC3=B8D!eDwejUbjCJ@&d#Z7y6V`fDBI~W7)U_|(8~(70+hdl z8A6q`v1yc`Q`rhFDAtJ16EF=3WELktEl{6k%)bNq1H#XRH%hJdyZa|f^SsG_2g6od zHm!7an*Z53*>awp{(a;B%>kS+An(^QKr9SB5UmzghwG}Z+Emq9%CoVyz|1Cmkz$DT z2NztPqlu_EmXJuGt+AXso6}mpHPySSmVU`k&&GDUOPi%B%kGtMcv#jO2-tI|Id+o3}mElX4n9$tY;Io=d zLBURTYOVS|QEPdcF@J3TWw z$;lJlabQ>H77*^zv`ad6@SYuHtn>D(zVH_HkVJMG9Fwt_XU_qE3t!UaF~auEoG-(( zGP}9-wA7lpDO>5GD2?F_?`208rOD-IRhf1IC(%;$*|-v5Pils_MS30tn#;@twpq7! z|14H;Zw1iCgLT2{gx>@h4$RKrZlKLTuV%J8d7p(P5F4VqjntZ|vMN%jx9)SnqV6

Q=?8v_@oP1R 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%0Am77L zvCLO!%c_R5gykICF@}AI;~Wo(g`LG!B>K96b2!@72R4wF>F5FHOR0}KqLq9|Z1Run zjMD%Ar7;pB2r9fn!T^oQLo zOhZ|%i6aWvJg{E@8#=OvuoESP*=3d{()ixfkW2=jwLg}U<70C8Tf$VoP%@w$mL8S0wFKY%KH=H;Fr~d=tD0>!t3kR}BjR>H#c$={a?)x`xc>O+{L0Pe zyPI5F#C5vY(a_2ORH^lP@zCz1S+D4vP6^VqO_Q%7#qc^JLNrE`yoXZLA1-ovfr zK+?^=g>A>xhJVb@`YB(;!LybpF}dSuK*ON&z6q%VlAWm3#nwu%f&1>7D0ylmi@1)p zf290CAe~1_))n#?ior0v+qrxB2Zz@b7*Vj*D4I`sJ4%frU!hd{sSO^##3$)`)D)O4 zJlAeUo7Yt!gwk;CQ(`0C(*L2q59f*4WFB)zd7*Kxr`96aLzLtV+_r+Q^s4v#yeEQCRliNcBD)-az5ATivyXi zj9wciuIc0~V?gl`MoYvG=1hl@=vkjUQ|=T#2VACze2jwLcXI&BjQHi9L)RxT=8v4z zO$gOC>qCC9jboW2IqK4!#9c`5#9LN|N$<2VoFyz+_RYqB5{)C66CbFTY^>yAmqR(z zHpEa8n;?}-@;Ao4q>W>p->dP9HQB z57#QuwU@i>AlK)i2+f;tg|=4qs$m~qU?L7@lg&P2fg?#`oL?<{h=#uDaiy8)!L$3$ zFXXkJR(y4t#tnk#`5v2)g!Dp7tMc&BD3stn&m)9AQpC!!80}%0#NBnkF}K)oA*PBq z6jF8!Y@uI?2sN@ieKH?gGM^SB8|J)V4`OJ5C$nn#S+N|AaVFmPiFbR8!zgkMOv}*t z19*vt?+$Gx>LZMjxXOdkCRHbiC91=ev|TEUpirib5#k%jEsZA$F28`9NP zU_*O$Sj4s@h|G%yRP;zsb5dN#R?u2f@N8F>cQM%7d|Z{)8kUHrd)a2BYJG_MPC)ED zG|tw-QN9Gjdf7)TMM%C#TmB z-;QG)fFy)}2El_^FvIcW`NE|1p8ct!(&=&OBCjWu$r4K#<`_m~80R3;D#Ik45)rkR ztk+!Qgcd2|_23z~D}8jyRKr69=;*aZ%Fhid6+yP&&%~$o6|6QH74Ok4X$AS=@H1YV zslD~Y=3FIvp@AujsUk+X+`Um;yskBfNQJ(`i?x)y6i(iGL!- z|M6hyBDgWX3Lk2az%%G9)t{&XB|vJp<1?%B+4=&RE1tlI)zcR8S= z4_-3lmb1YP&beDaG)VK6+qJMSmF8$x0)OYcq z!w&A;e2af1_8b4FkMmu?zkDQb0pqg20e`qk-qnLT0Pcl#tCvyvtp{_)0w;hJH*emb z*Tq!T--H{FCvYjaA=K^8d%&gO_E2|Gp!syS7a%)}Uk!8$DeC_2#n0?fa2>e0#f>u8 z$MX-}zpu!kJ%hUs+!BZk?(X?lOzW-}0eD})S8LyrIE}$cch+u$W55@k-eT&_z%l>6 z9E0X0_)?);ikJ;J<>pd%6Rf-2BM=LGwaG0@-tK>~{=V7#EBpGE6z&X8x|53y-XZYp z;#m~5BRC5~WxBmnDYob{I literal 0 HcmV?d00001 diff --git a/local.properties b/local.properties new file mode 100644 index 00000000..6a149695 --- /dev/null +++ b/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Fri Nov 12 19:26:13 SGT 2021 +sdk.dir=C\:\\Users\\Endire\\AppData\\Local\\Android\\Sdk diff --git a/src/main/java/duke/RunDuke.java b/src/main/java/duke/RunDuke.java index 2dcd7f47..c6e3c907 100644 --- a/src/main/java/duke/RunDuke.java +++ b/src/main/java/duke/RunDuke.java @@ -6,6 +6,7 @@ import duke.command.Command; import duke.storage.FileAccess; import duke.task.TaskList; +import duke.ui.Message; import duke.ui.Ui; /** @@ -46,13 +47,23 @@ public void run() { while (isDukeRunning) { String userInput = ui.requestUserInput(scanner); - String userCommand = parser.processUserCommand(userInput); - isDukeRunning = canProcessCommand(userCommand, userInput); + if (userInput.isEmpty()) { + Message.msgInvalidInput(); + } else { + String userCommand = parser.processUserCommand(userInput); + isDukeRunning = canProcessCommand(userCommand, userInput); + } } } /** * Read user command and execute respective methods accordingly + *

+ * Accepted user input: bye, list, set, done, todo, save + * Accepted user input: find, info, event, delete, deadline + *

+ * method returns true for all commands and non-accepted user input + * method return false for bye command. * * @param userCommand String that represents the command type by user * @param userInput String that represents the full user input @@ -90,6 +101,9 @@ private static boolean canProcessCommand(String userCommand, String userInput) { case "event": cmd.addTaskEvent(myList, userInput); return true; + case "undone": + cmd.markTaskUnDone(myList, userInput); + return true; case "delete": cmd.deleteTask(myList, userInput); return true; diff --git a/src/main/java/duke/action/Parser.java b/src/main/java/duke/action/Parser.java index 8bc5131d..4e8e21ea 100644 --- a/src/main/java/duke/action/Parser.java +++ b/src/main/java/duke/action/Parser.java @@ -22,7 +22,9 @@ public Parser() { */ public String processUserCommand(String userInput) { - assert userInput != null : "There should be user input in processUserCommand"; + if (userInput.isEmpty()) { + return "invalid"; + } if (userInput.equals("bye")) { return "bye"; @@ -49,6 +51,8 @@ public String processUserCommand(String userInput) { return "event"; case "delete": return "delete"; + case "undone": + return "undone"; case "deadline": return "deadline"; default: diff --git a/src/main/java/duke/command/CmdAddTask.java b/src/main/java/duke/command/CmdAddTask.java index 54243816..e8f6bc96 100644 --- a/src/main/java/duke/command/CmdAddTask.java +++ b/src/main/java/duke/command/CmdAddTask.java @@ -64,7 +64,7 @@ public static void addTaskEvent(TaskList myList, String userInput) { } if (!userInput.contains("/at")) { - Message.msgInvalidInputMissingDay(); + Message.msgInvalidInputMissingDate(); return; } @@ -111,7 +111,7 @@ public static void addTaskDeadline(TaskList myList, String userInput) { } if (!userInput.contains("/by")) { - Message.msgInvalidInputMissingDay(); + Message.msgInvalidInputMissingDate(); return; } @@ -190,7 +190,7 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t LocalTime taskTimeStart = ParseDateTime.toTime(timeStart); if (taskDate == null) { - Message.msgInvalidInputMissingDay(); + Message.msgInvalidInputMissingDate(); return; } @@ -235,7 +235,7 @@ private static void toAddTaskEvent_localDate_localTime(TaskList myList, String t LocalTime taskTimeEnd = ParseDateTime.toTime(timeEnd); if (taskDate == null) { - Message.msgInvalidInputMissingDay(); + Message.msgInvalidInputMissingDate(); return; } @@ -314,7 +314,7 @@ private static void toAddTaskDeadline_localDate_localTime(TaskList myList, Strin LocalTime taskTime = ParseDateTime.toTime(time); if (taskDate == null) { - Message.msgInvalidInputMissingDay(); + Message.msgInvalidInputMissingDate(); return; } diff --git a/src/main/java/duke/command/CmdDelete.java b/src/main/java/duke/command/CmdDelete.java index 10565c6d..4d458dc0 100644 --- a/src/main/java/duke/command/CmdDelete.java +++ b/src/main/java/duke/command/CmdDelete.java @@ -25,11 +25,16 @@ public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; assert userInput != null : "userInput should not be empty"; + if (myList.getNumOfItem() == 0) { + Message.msgTaskListIsEmpty(); + return; + } + try { int taskIndex = Integer.parseInt(userInput.substring(7)) - 1; int numOfTaskAfterDelete = myList.getNumOfItem() - 1; - if (taskIndex >= myList.getNumOfItem()) { + if (taskIndex >= myList.getNumOfItem() || taskIndex < 0) { Message.msgInvalidTaskNumber(); return; } diff --git a/src/main/java/duke/command/CmdFind.java b/src/main/java/duke/command/CmdFind.java index 83d75482..73ae34b0 100644 --- a/src/main/java/duke/command/CmdFind.java +++ b/src/main/java/duke/command/CmdFind.java @@ -30,6 +30,11 @@ public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; assert userInput != null : "userInput should not be empty"; + if (myList.getNumOfItem() == 0) { + Message.msgTaskListIsEmpty(); + return; + } + if (userInput.length() <= 5) { Message.msgInvalidFindTerm(); return; @@ -83,5 +88,6 @@ private static void showTaskFound(TaskList myList, ArrayList taskNumber new MsgTaskDetail(myList, taskNumber).showTaskDetail(); index++; } + Message.msgDashLines(); } } diff --git a/src/main/java/duke/command/CmdList.java b/src/main/java/duke/command/CmdList.java index e3402439..b515dfe9 100644 --- a/src/main/java/duke/command/CmdList.java +++ b/src/main/java/duke/command/CmdList.java @@ -21,7 +21,10 @@ public class CmdList { */ public static void run(TaskList myList) { - assert myList != null : "mylist should not be empty"; + if (myList.getNumOfItem() == 0) { + Message.msgTaskListIsEmpty(); + return; + } for (int i = 0; i < myList.getNumOfItem(); i++) { Message.msgShowBracketWithIndex(i + 1); diff --git a/src/main/java/duke/command/CmdMarkTaskDone.java b/src/main/java/duke/command/CmdMarkTaskDone.java index c991d4d7..e342eaa6 100644 --- a/src/main/java/duke/command/CmdMarkTaskDone.java +++ b/src/main/java/duke/command/CmdMarkTaskDone.java @@ -24,8 +24,18 @@ public static void run(TaskList myList, String userInput) { assert myList != null : "mylist should not be empty"; assert userInput != null : "userInput should not be empty"; - int taskNumber = Integer.parseInt(userInput.substring(5)); - myList.setTaskDone(taskNumber - 1); - Message.msgMarkDone(myList, taskNumber - 1); + if (myList.getNumOfItem() == 0) { + Message.msgTaskListIsEmpty(); + return; + } + + try { + int taskNumber = Integer.parseInt(userInput.substring(5)); + myList.setTaskDone(taskNumber - 1); + Message.msgMarkDone(myList, taskNumber - 1); + } catch (Exception e) { + Message.msgInvalidTaskNumber(); + } + } } diff --git a/src/main/java/duke/command/CmdMarkTaskUnDone.java b/src/main/java/duke/command/CmdMarkTaskUnDone.java new file mode 100644 index 00000000..a89f9611 --- /dev/null +++ b/src/main/java/duke/command/CmdMarkTaskUnDone.java @@ -0,0 +1,40 @@ +package duke.command; + +import duke.task.TaskList; +import duke.ui.Message; + +/** + * Command class that mark a task as undone + * + * @author Kang Teng + * @version 8.0 + * @since 2021-09-01 + */ + +public class CmdMarkTaskUnDone { + /** + * Execute the marking command to mark a task as done + * + * @param myList TaskList that contains the list of task + * @param userInput String + */ + public static void run(TaskList myList, String userInput) { + + assert myList != null : "mylist should not be empty"; + assert userInput != null : "userInput should not be empty"; + + if (myList.getNumOfItem() == 0) { + Message.msgTaskListIsEmpty(); + return; + } + + try { + int taskNumber = Integer.parseInt(userInput.substring(7)); + myList.setTaskUnDone(taskNumber - 1); + Message.msgMarkUnDone(myList, taskNumber - 1); + } catch (Exception e) { + Message.msgInvalidTaskNumber(); + } + + } +} diff --git a/src/main/java/duke/command/CmdPriority.java b/src/main/java/duke/command/CmdPriority.java index b27e2418..2b3ff1a2 100644 --- a/src/main/java/duke/command/CmdPriority.java +++ b/src/main/java/duke/command/CmdPriority.java @@ -23,6 +23,7 @@ public class CmdPriority { * -- Update the task with new priority * * @param myList TaskList that contains the list of task + * @param scanner Scanner that contains read the user input */ public static void run(TaskList myList, Scanner scanner) { @@ -30,7 +31,7 @@ public static void run(TaskList myList, Scanner scanner) { assert scanner != null : "scanner should not be empty"; if (myList.getNumOfItem() < 1) { - Message.msgInvalidSetTaskListIsEmpty(); + Message.msgTaskListIsEmpty(); return; } @@ -52,9 +53,11 @@ public static void run(TaskList myList, Scanner scanner) { while (isPriorityNumberValid == false) { Message.msgAskUserWhatPriority(); + Message.msgArrowHead(); userInputNewPriorityNumber = scanner.nextLine(); isPriorityNumberValid = hasValidPriorityNumber(userInputNewPriorityNumber); } + Message.msgDashLines(); int newPriorityInteger = Integer.parseInt(userInputNewPriorityNumber); @@ -77,7 +80,8 @@ private static boolean hasValidTaskNumber(TaskList myList, String userInputStrin try { int userInputInt = Integer.parseInt(userInputString); int numOfItem = myList.getNumOfItem(); - if (userInputInt <= numOfItem) { + + if (userInputInt <= numOfItem && userInputInt > 0) { return true; } } catch (Exception e) { @@ -118,10 +122,7 @@ private static boolean hasValidPriorityNumber(String userInputPriorityS) { } /** - * Ask user which task to set priority and change the priority accordingly - * -- Ask user which task to be changed - * -- Ask user what is the new priority - * -- Update the task with new priority + * Update the priority of the task based on the taskPriority * * @param myList TaskList that contains the list of task * @param taskIndex int that indicates the task number diff --git a/src/main/java/duke/command/Command.java b/src/main/java/duke/command/Command.java index 4fbf1835..eba13984 100644 --- a/src/main/java/duke/command/Command.java +++ b/src/main/java/duke/command/Command.java @@ -67,6 +67,16 @@ public void markTaskDone(TaskList myList, String userInput) { CmdMarkTaskDone.run(myList, userInput); } + /** + * Mark a task as undone + * + * @param myList TaskList that contains the list of task + * @param userInput String that the user type + */ + public void markTaskUnDone(TaskList myList, String userInput) { + CmdMarkTaskUnDone.run(myList, userInput); + } + /** * Add a task of ToDo type into the list of task * diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index c01da588..7670ed13 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -83,6 +83,14 @@ public void setTaskCompleted() { isDone = true; } + /** + * Set the task as completed + * Change the done status to completed + */ + public void setTaskInCompleted() { + isDone = false; + } + /** * Modified the type of the task * diff --git a/src/main/java/duke/task/TaskList.java b/src/main/java/duke/task/TaskList.java index c47e45b2..3e479eda 100644 --- a/src/main/java/duke/task/TaskList.java +++ b/src/main/java/duke/task/TaskList.java @@ -295,6 +295,16 @@ public void setTaskDone(int index) { task.setTaskCompleted(); } + /** + * Return TaskType from a task of tasklist + * + * @param index Int that represents the index in a task list + */ + public void setTaskUnDone(int index) { + Task task = list.get(index); + task.setTaskInCompleted(); + } + /** * Update the priority of a task in tasklist * diff --git a/src/main/java/duke/ui/Message.java b/src/main/java/duke/ui/Message.java index 8b1c0845..f418948f 100644 --- a/src/main/java/duke/ui/Message.java +++ b/src/main/java/duke/ui/Message.java @@ -21,7 +21,10 @@ public static void msgGreet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + System.out.println(">>> Copyright (c) Teng Kang Teng (A0211547L NUS) <<<"); + System.out.println(">>> Version 0.2 <<<\n"); System.out.println("Hello! I'm Duke" + System.lineSeparator() + "What can I do for you?"); + System.out.println("Enter \"Info\" to show all Duke commands. "); System.out.println("_________________________________"); } @@ -236,6 +239,19 @@ public static void msgMarkDone(TaskList myList, int taskNumber) { System.out.println("_________________________________"); } + /** + * Display message when a task is marked as not done + * + * @param myList TaskList that contains the list of task + * @param taskNumber Int that represents the task number + */ + public static void msgMarkUnDone(TaskList myList, int taskNumber) { + System.out.println(" Okie! This task is marked as not done: "); + msgBlankBeforeTaskDetail(); + new MsgTaskDetail(myList, taskNumber).showTaskDetail(); + System.out.println("_________________________________"); + } + /** * Display [x] where x is the int parameter *

@@ -363,15 +379,15 @@ public static void msgShowDukeCommandList() { System.out.println(" >> add a TODO task"); System.out.println(" 2. event (task description)"); System.out.println(" >> add a EVENT task"); - System.out.println(" 3. event (task description) /at (date)"); + System.out.println(" 3. event (task description)/at (date)"); System.out.println(" >> add a EVENT task"); - System.out.println(" 4. event (task description) /at (date) (time)"); + System.out.println(" 4. event (task description)/at (date) (time)"); System.out.println(" >> add a EVENT task"); System.out.println(" 5. deadline (task description)"); System.out.println(" >> add a DEADLINE task"); - System.out.println(" 6. deadline (task description) /at (date)"); + System.out.println(" 6. deadline (task description)/by (date)"); System.out.println(" >> add a DEADLINE task"); - System.out.println(" 7. deadline (task description) /at (date) (time start) (time end)"); + System.out.println(" 7. deadline (task description)/by (date) (time start) (time end)"); System.out.println(" >> add a DEADLINE task"); System.out.println(" 8. list"); System.out.println(" >> show full list of task"); @@ -385,8 +401,11 @@ public static void msgShowDukeCommandList() { System.out.println(" >> display full list of Duke Command"); System.out.println(" 13. delete (task number)"); System.out.println(" >> delete a task"); - System.out.println(" 14. bye"); + System.out.println(" 14. save"); + System.out.println(" >> save all the tasks"); + System.out.println(" 15. bye"); System.out.println(" >> end your friendly Duke chat box"); + System.out.println("_________________________________"); } // Error Messages <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -422,7 +441,7 @@ public static void msgInvalidInput() { * Description of the task is missing */ public static void msgInvalidInputMissingDescription() { - System.out.println(" ☹ OOPS!!! The description cannot be empty."); + System.out.println(" OOPS!!! The description cannot be empty."); System.out.println("_________________________________"); } @@ -430,8 +449,8 @@ public static void msgInvalidInputMissingDescription() { * Display message that remind user about invalid input * Date of the task is missing */ - public static void msgInvalidInputMissingDay() { - System.out.println(" ☹ OOPS!!! The day cannot be empty."); + public static void msgInvalidInputMissingDate() { + System.out.println(" OOPS!!! The date cannot be empty."); System.out.println("_________________________________"); } @@ -440,7 +459,7 @@ public static void msgInvalidInputMissingDay() { * Time of the task is missing */ public static void msgInvalidInputMissingTime() { - System.out.println(" ☹ OOPS!!! The time cannot be empty."); + System.out.println(" OOPS!!! The time cannot be empty."); System.out.println("_________________________________"); } @@ -449,7 +468,7 @@ public static void msgInvalidInputMissingTime() { * The task number is not found */ public static void msgInvalidTaskNumber() { - System.out.println(" ☹ OOPS!!! The task number is invalid."); + System.out.println(" OOPS!!! The task number is invalid."); System.out.println("_________________________________"); } @@ -458,7 +477,7 @@ public static void msgInvalidTaskNumber() { * The priority is invalid */ public static void msgInvalidPriority() { - System.out.println(" ☹ OOPS!!! The priority is invalid. Choose 1, 2 or 3"); + System.out.println(" OOPS!!! The priority is invalid. Choose 1, 2 or 3"); System.out.println("_________________________________"); } @@ -467,7 +486,7 @@ public static void msgInvalidPriority() { * Format of the date is unaccepted */ public static void msgInvalidInputWrongDateTimeFormat() { - System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" OOPS!!! Please follow this format:"); System.out.println(" /by yyyy-mm-dd hh:mm"); System.out.println("_________________________________"); } @@ -477,7 +496,7 @@ public static void msgInvalidInputWrongDateTimeFormat() { * Format of the date and time is unaccepted */ public static void msgInvalidInputWrongDateTimeStartEndFormat() { - System.out.println(" ☹ OOPS!!! Please follow this format:"); + System.out.println(" OOPS!!! Please follow this format:"); System.out.println(" /at yyyy-mm-dd hh:mm hh:mm:"); System.out.println("_________________________________"); } @@ -487,15 +506,15 @@ public static void msgInvalidInputWrongDateTimeStartEndFormat() { * Start time should be before End time */ public static void msgInvalidInputTimeStartLaterThanTimeEnd() { - System.out.println(" ☹ OOPS!!! Event start time cannot be later than end time!"); + System.out.println(" OOPS!!! Event start time cannot be later than end time!"); System.out.println("_________________________________"); } /** * Display message about task list being empty */ - public static void msgInvalidSetTaskListIsEmpty() { - System.out.println(" ☹ OOPS!!! The task list is empty."); + public static void msgTaskListIsEmpty() { + System.out.println(" OOPS!!! The task list is empty."); System.out.println("_________________________________"); } diff --git a/src/resources/progress.txt b/src/resources/progress.txt index 15a2979d..e69de29b 100644 --- a/src/resources/progress.txt +++ b/src/resources/progress.txt @@ -1,4 +0,0 @@ -0|E|1|project meeting|3|2001-01-25|null|null|; -1|T|0|borrow book|3|; -2|E|0|project meeting|3|2001-01-25|null|null|; -3|D|1|return book|3|2010-01-25|null|; diff --git a/src/resources/progress_backup.txt b/src/resources/progress_backup.txt new file mode 100644 index 00000000..cf18a6ab --- /dev/null +++ b/src/resources/progress_backup.txt @@ -0,0 +1,5 @@ +0|E|0|project meeting|1|2001-01-25|null|null|; +1|E|0|project meeting|3|2002-06-25|18:00|null|; +2|E|0|project meeting|3|2002-06-25|18:00|19:00|; +3|D|0|return book|3|2010-01-25|null|; +4|D|0|return book|3|2011-02-25|06:00|; diff --git a/src/test/java/duke/task/TaskTypeTest.java b/src/test/java/duke/task/TaskTypeTest.java index 3d0df045..9838eb11 100644 --- a/src/test/java/duke/task/TaskTypeTest.java +++ b/src/test/java/duke/task/TaskTypeTest.java @@ -10,7 +10,7 @@ class TaskTypeTest { @Test - void testTaskTypeToString_taskType_string() { + void testTaskTypeToStringtaskTypeString() { List types = List.of(TaskType.TODOS, TaskType.DEADLINE, TaskType.EVENT); Assertions.assertAll(() -> assertEquals("T", TaskType.taskTypeToString(types.get(0))), () -> diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index d5087eab..880bf1d2 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -2,31 +2,54 @@ todo borrow book event project meeting/at 2001-01-25 event project meeting/at 2002-06-25 18:00 event project meeting/at 2002-06-25 18:00 19:00 -event project meeting/at 2003-12-25 19:00 19:00 deadline return book/by 2010-01-25 deadline return book/by 2011-02-25 06:00 list -done 2 -done 5 -done 6 -list -delete 1 -delete 5 -list set 2 1 +done 2 +list +undone 2 list -save -event project meeting/at 2003-12-25 19:00 19:00 -deadline return book/by 2010-01-25 -save -deadline return book -event project meeting /at 2016-12-25 19:00 18:00 -event project AAmeeting /at 2016-12-25 18:00 19:00 -event project meeting /at 2016-12-25 18:00 19:00 -event project meet /at 2016-12-25 18:00 19:00 find meeting +info +delete 1 +save list save -bye \ No newline at end of file +bye + + +dfd gsfdg +XXXX +to do something +todo +event +deadline +event project meeting sometime later +deadline project meeting sometime later +event project meeting/at 2001 jan 15 +deadline project meeting/by 2001 jan 15 +event project meeting/at 2002-06-25 1800 +deadline return book/by 2011-02-25 0600 +event project meeting/at 2002-06-25 19:00 18:00 +list abc +set abc +set +100 +-1 +-1 +abc +100 +1 +done 100 +undone 100 +done aaa +undone aaa +find +find Meeting +find meeeeeeting +delete +delete 0 +delete -1