From d8398594b7bc43da5eb865321c5a50cec4b3923d Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/18] 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 779912f165e28e81e2e1ba376734eede23c99a38 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 23 Sep 2021 21:59:33 +0800 Subject: [PATCH 02/18] Implement Level-1 --- src/main/java/Duke.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334..0fbc0690 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,5 @@ +import java.util.Scanner; + public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" @@ -6,5 +8,20 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + + //Hello command + System.out.println("Hello, I'm Duke\n" + "What can I do for you?"); + //read line + String line; + Scanner in = new Scanner(System.in); + System.out.println("________________________________________________"); + while(true){ + line = in.nextLine(); + System.out.println(line +"\n________________________________________________"); + if(line.equals("bye")) { + System.out.println("Bye! Thanks for visiting The Duke!"); + break; + } + } } } From 4a9508cefc57a5d3f9d10b121847adc829135898 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 23 Sep 2021 22:02:33 +0800 Subject: [PATCH 03/18] Level-1 --- src/main/java/Duke.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0fbc0690..7e240562 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -17,9 +17,9 @@ public static void main(String[] args) { System.out.println("________________________________________________"); while(true){ line = in.nextLine(); - System.out.println(line +"\n________________________________________________"); + System.out.println("\t" + line +"\n________________________________________________"); if(line.equals("bye")) { - System.out.println("Bye! Thanks for visiting The Duke!"); + System.out.println("\tBye! Thanks for visiting The Duke!"); break; } } From bb734d7113354efe6968b08232d5df106f1f70fc Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 23 Sep 2021 22:42:06 +0800 Subject: [PATCH 04/18] Level-2 --- src/main/java/List.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/List.java diff --git a/src/main/java/List.java b/src/main/java/List.java new file mode 100644 index 00000000..c8c5994f --- /dev/null +++ b/src/main/java/List.java @@ -0,0 +1,2 @@ +public class List { +} From 3ffda125ce6e9df8165e9b0aba0ab46bae3812a7 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 23 Sep 2021 22:42:37 +0800 Subject: [PATCH 05/18] Level-2 --- src/main/java/Duke.java | 8 +++++++- src/main/java/List.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7e240562..65397abb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -14,14 +14,20 @@ public static void main(String[] args) { //read line String line; Scanner in = new Scanner(System.in); + List list = new List(); System.out.println("________________________________________________"); while(true){ line = in.nextLine(); - System.out.println("\t" + line +"\n________________________________________________"); if(line.equals("bye")) { System.out.println("\tBye! Thanks for visiting The Duke!"); break; } + else if(line.equals("list")) { + list.printList(); + } + else { + list.addList(line); + } } } } diff --git a/src/main/java/List.java b/src/main/java/List.java index c8c5994f..0a6076ff 100644 --- a/src/main/java/List.java +++ b/src/main/java/List.java @@ -1,2 +1,18 @@ +import java.util.Arrays; + public class List { + public String[] List = new String[100]; + int count = 0; + + public void addList(String list){ + this.List[count] = list; + this.count++; + System.out.println("added: " + list +"\n________________________________________________"); + } + + public void printList () { + for (int i=0; i Date: Fri, 24 Sep 2021 00:41:15 +0800 Subject: [PATCH 06/18] Level-3 --- src/main/java/Duke.java | 25 +++++++++++++++++-------- src/main/java/List.java | 18 ++++++++++++------ src/main/java/Task.java | 27 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 65397abb..96db5e39 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -16,17 +16,26 @@ public static void main(String[] args) { Scanner in = new Scanner(System.in); List list = new List(); System.out.println("________________________________________________"); + //to set what to do with the line in while(true){ - line = in.nextLine(); - if(line.equals("bye")) { - System.out.println("\tBye! Thanks for visiting The Duke!"); - break; - } - else if(line.equals("list")) { - list.printList(); + line = in.nextLine(); + //check for done statements, to update to DONE + if (line.contains("done")) { + System.out.println("Nice! I've marked this task as done:"); + int ref = Integer.parseInt(line.split(" ")[1]); + list.setDone(ref - 1); } + //switch statements for other conditions else { - list.addList(line); + switch(line){ + case "bye": System.out.println("\tBye! Thanks for visiting The Duke!"); + break; + + case "list": list.printList(); + break; + + default: list.addList(line); + } } } } diff --git a/src/main/java/List.java b/src/main/java/List.java index 0a6076ff..0769deab 100644 --- a/src/main/java/List.java +++ b/src/main/java/List.java @@ -1,18 +1,24 @@ import java.util.Arrays; -public class List { - public String[] List = new String[100]; +public class List extends Task { + public Task[] List = new Task[100]; int count = 0; - public void addList(String list){ - this.List[count] = list; + public void addList(String description){ + this.List[count] = new Task(description); this.count++; - System.out.println("added: " + list +"\n________________________________________________"); + System.out.println("added: " + description +"\n________________________________________________"); } public void printList () { + System.out.println("Here are the tasks in your list:"); for (int i=0; i Date: Fri, 24 Sep 2021 01:24:14 +0800 Subject: [PATCH 07/18] text-ui-test --- src/main/text-ui-test/ACTUAL.TXT | 23 +++++++++++++++ src/main/text-ui-test/EXPECTED-UNIX.TXT | 23 +++++++++++++++ src/main/text-ui-test/EXPECTED.txt | 23 +++++++++++++++ src/main/text-ui-test/input.txt | 6 ++++ src/main/text-ui-test/runtest.sh | 38 +++++++++++++++++++++++++ 5 files changed, 113 insertions(+) create mode 100644 src/main/text-ui-test/ACTUAL.TXT create mode 100644 src/main/text-ui-test/EXPECTED-UNIX.TXT create mode 100644 src/main/text-ui-test/EXPECTED.txt create mode 100644 src/main/text-ui-test/input.txt create mode 100644 src/main/text-ui-test/runtest.sh diff --git a/src/main/text-ui-test/ACTUAL.TXT b/src/main/text-ui-test/ACTUAL.TXT new file mode 100644 index 00000000..ebb16a09 --- /dev/null +++ b/src/main/text-ui-test/ACTUAL.TXT @@ -0,0 +1,23 @@ +Hello from + ____ _ +| _ \ _ _| | _____ +| | | | | | | |/ / _ \ +| |_| | |_| | < __/ +|____/ \__,_|_|\_\___| + +Hello, I'm Duke +What can I do for you? +________________________________________________ +added: dance +________________________________________________ +added: sing +________________________________________________ +added: act +________________________________________________ +Here are the tasks in your list: +1. [ ] dance +2. [ ] sing +3. [ ] act +Nice! I've marked this task as done: + [X] sing + Bye! Thanks for visiting The Duke! diff --git a/src/main/text-ui-test/EXPECTED-UNIX.TXT b/src/main/text-ui-test/EXPECTED-UNIX.TXT new file mode 100644 index 00000000..4e400a3c --- /dev/null +++ b/src/main/text-ui-test/EXPECTED-UNIX.TXT @@ -0,0 +1,23 @@ +Hello from + ____ _ +| _ \ _ _| | _____ +| | | | | | | |/ / _ \ +| |_| | |_| | < __/ +|____/ \__,_|_|\_\___| + +Hello, I'm Duke +What can I do for you? +________________________________________________ +added: dance +________________________________________________ +added: sing +________________________________________________ +added: act +________________________________________________ +Here are the tasks in your list: +1. [ ] dance +2. [ ] sing +3. [ ] act +Nice! I've marked this task as done: + [X] sing + Bye! Thanks for visiting The Duke! diff --git a/src/main/text-ui-test/EXPECTED.txt b/src/main/text-ui-test/EXPECTED.txt new file mode 100644 index 00000000..4e400a3c --- /dev/null +++ b/src/main/text-ui-test/EXPECTED.txt @@ -0,0 +1,23 @@ +Hello from + ____ _ +| _ \ _ _| | _____ +| | | | | | | |/ / _ \ +| |_| | |_| | < __/ +|____/ \__,_|_|\_\___| + +Hello, I'm Duke +What can I do for you? +________________________________________________ +added: dance +________________________________________________ +added: sing +________________________________________________ +added: act +________________________________________________ +Here are the tasks in your list: +1. [ ] dance +2. [ ] sing +3. [ ] act +Nice! I've marked this task as done: + [X] sing + Bye! Thanks for visiting The Duke! diff --git a/src/main/text-ui-test/input.txt b/src/main/text-ui-test/input.txt new file mode 100644 index 00000000..3596387c --- /dev/null +++ b/src/main/text-ui-test/input.txt @@ -0,0 +1,6 @@ +dance +sing +act +list +done 2 +bye \ No newline at end of file diff --git a/src/main/text-ui-test/runtest.sh b/src/main/text-ui-test/runtest.sh new file mode 100644 index 00000000..b86ef4fe --- /dev/null +++ b/src/main/text-ui-test/runtest.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# create bin directory if it doesn't exist +if [ ! -d "../bin" ] +then + mkdir ../bin +fi + +# delete output from previous run +if [ -e "./ACTUAL.TXT" ] +then + rm ACTUAL.TXT +fi + +# compile the code into the bin folder, terminates if error occurred +if ! javac -cp /Users/mwhy/duke/src/main/java -Xlint:none -d ../bin /Users/mwhy/duke/src/main/java/*.java +then + echo "********** BUILD FAILURE **********" + exit 1 +fi + +# run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT +java -classpath ../bin Duke < input.txt > ACTUAL.TXT + +# convert to UNIX format +cp EXPECTED.TXT EXPECTED-UNIX.TXT +dos2unix ACTUAL.TXT EXPECTED-UNIX.TXT + +# compare the output to the expected output +diff ACTUAL.TXT EXPECTED-UNIX.TXT +if [ $? -eq 0 ] +then + echo "Test result: PASSED" + exit 0 +else + echo "Test result: FAILED" + exit 1 +fi From 1f5270920af65df8a3129e2ab48914f23e7d34a0 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Fri, 24 Sep 2021 05:27:07 +0800 Subject: [PATCH 08/18] Level-4 --- src/main/java/Deadline.java | 13 ++++++ src/main/java/Duke.java | 82 ++++++++++++++++++++++++++++--------- src/main/java/Event.java | 14 +++++++ src/main/java/List.java | 19 ++++++--- src/main/java/Task.java | 4 +- src/main/java/Todo.java | 12 ++++++ 6 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 00000000..156f9970 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String printTask() { + return "[D]" + super.printTask() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 96db5e39..434bb107 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,7 +1,7 @@ import java.util.Scanner; public class Duke { - public static void main(String[] args) { + public static void startDuke() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -10,33 +10,77 @@ public static void main(String[] args) { System.out.println("Hello from\n" + logo); //Hello command - System.out.println("Hello, I'm Duke\n" + "What can I do for you?"); + System.out.println("Hello, I'm Duke\n" + "What tasks can I serve you?"); + } + + public static void endDuke() { + System.out.println("\tBye! Thanks for visiting The Duke!"); + System.exit(0); + } + + public static void newLine(){ + System.out.println("________________________________________________"); + } + + public static void main(String[] args) { + startDuke(); + //read line String line; + String placeholder; + String description; Scanner in = new Scanner(System.in); - List list = new List(); - System.out.println("________________________________________________"); + List tasks = new List(); + newLine(); //to set what to do with the line in while(true){ line = in.nextLine(); - //check for done statements, to update to DONE - if (line.contains("done")) { - System.out.println("Nice! I've marked this task as done:"); - int ref = Integer.parseInt(line.split(" ")[1]); - list.setDone(ref - 1); - } - //switch statements for other conditions - else { - switch(line){ - case "bye": System.out.println("\tBye! Thanks for visiting The Duke!"); - break; + newLine(); + String command = line.split(" ")[0]; + + //use lineCheck for case statements for cleaner code + switch (command) { + case "bye": + endDuke(); - case "list": list.printList(); - break; + case "done": + System.out.println("\tNice! I've marked this task as done:"); + int ref = Integer.parseInt(line.split(" ")[1]); + tasks.setDone(ref - 1); + newLine(); + break; - default: list.addList(line); + case "deadline": + placeholder = line.replaceFirst(command + " ",""); + description = placeholder.split(" /")[0]; + String by = placeholder.split(" /by ")[1]; + tasks.addList(new Deadline(description, by)); + tasks.printCount(); + newLine(); + break; + + case "todo": + description = line.replaceFirst(command + " ",""); + tasks.addList(new Todo(description)); + tasks.printCount(); + newLine(); + break; + + case "event": + placeholder = line.replaceFirst(command + " ",""); + description = placeholder.split(" /")[0]; + String at = placeholder.split(" /at ")[1]; + tasks.addList(new Event(description, at)); + tasks.printCount(); + newLine(); + break; + + case "list": + tasks.printList(); + newLine(); + break; } } } } -} + diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 00000000..69a65b22 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,14 @@ +public class Event extends Task { + + protected String at; + + public Event(String description, String ends) { + super(description); + this.at = ends; + } + + @Override + public String printTask() { + return "[E]" + super.printTask() + " (at: " + at + ")"; + } +} diff --git a/src/main/java/List.java b/src/main/java/List.java index 0769deab..150513af 100644 --- a/src/main/java/List.java +++ b/src/main/java/List.java @@ -2,21 +2,28 @@ public class List extends Task { public Task[] List = new Task[100]; - int count = 0; + public int count = 0; - public void addList(String description){ - this.List[count] = new Task(description); + public void addList(Task t){ + this.List[count] = t; + printTask(count); this.count++; - System.out.println("added: " + description +"\n________________________________________________"); } + public void printCount(){ + System.out.println("\tNow you have " + this.count + " tasks in the list."); + } public void printList () { - System.out.println("Here are the tasks in your list:"); + System.out.println("\tHere are the tasks in your list:"); for (int i=0; i Date: Fri, 24 Sep 2021 08:22:46 +0800 Subject: [PATCH 09/18] Level-5 Having issues with exceptions on DukeException, can throw in hardcoding --- src/main/java/Duke.java | 114 +++++++++++++++++++++---------- src/main/java/DukeException.java | 3 + 2 files changed, 81 insertions(+), 36 deletions(-) create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 434bb107..ebee733c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -24,7 +24,6 @@ public static void newLine(){ public static void main(String[] args) { startDuke(); - //read line String line; String placeholder; @@ -33,54 +32,97 @@ public static void main(String[] args) { List tasks = new List(); newLine(); //to set what to do with the line in + //noinspection InfiniteLoopStatement while(true){ line = in.nextLine(); newLine(); String command = line.split(" ")[0]; //use lineCheck for case statements for cleaner code - switch (command) { - case "bye": - endDuke(); + switch (command) { + case "bye": + endDuke(); + + case "done": + if(line.equals ("done")) { + System.out.println("Please enter choice for list"); + break; + } + try{ + int ref = Integer.parseInt(line.split(" ")[1]); + tasks.setDone(ref - 1); + System.out.println("\tNice! I've marked this task as done:"); + } catch (NullPointerException e) { + System.out.println("Please choose from list only"); + break; + } + newLine(); + break; - case "done": - System.out.println("\tNice! I've marked this task as done:"); - int ref = Integer.parseInt(line.split(" ")[1]); - tasks.setDone(ref - 1); - newLine(); - break; + case "deadline": + try{ + placeholder = line.replaceFirst(command + " ", ""); + description = placeholder.split(" /")[0]; + String by = placeholder.split(" /by ")[1]; + tasks.addList(new Deadline(description, by)); + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println("Have to include /by"); + break; + } + tasks.printCount(); + newLine(); + break; - case "deadline": - placeholder = line.replaceFirst(command + " ",""); - description = placeholder.split(" /")[0]; - String by = placeholder.split(" /by ")[1]; - tasks.addList(new Deadline(description, by)); - tasks.printCount(); - newLine(); - break; + case "todo": + description = line.replaceFirst(command + " ", ""); + if(description.equals(command) && line.length() == 4){ + System.out.println("☹ OOPS!!! The description of a todo cannot be empty."); + break; + } + tasks.addList(new Todo(description)); + tasks.printCount(); + newLine(); + break; - case "todo": - description = line.replaceFirst(command + " ",""); - tasks.addList(new Todo(description)); - tasks.printCount(); - newLine(); - break; + case "event": + placeholder = line.replaceFirst(command + " ", ""); + if(placeholder.equals(command) && line.length() == 5){ + System.out.println("☹ OOPS!!! The description of a event cannot be empty."); + break; + } + description = placeholder.split(" /")[0]; + try { + String at = placeholder.split(" /at ")[1]; + tasks.addList(new Event(description, at)); + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println("Have to include /at"); + break; + } + tasks.printCount(); + newLine(); + break; - case "event": - placeholder = line.replaceFirst(command + " ",""); - description = placeholder.split(" /")[0]; - String at = placeholder.split(" /at ")[1]; - tasks.addList(new Event(description, at)); - tasks.printCount(); - newLine(); - break; + case "list": + tasks.printList(); + newLine(); + break; - case "list": - tasks.printList(); - newLine(); - break; + case "help": + System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + + "\n\tevent [description] /at [time]\n\t" + + "todo [description]\n\t" + + "deadline [description] /by [time]\n\t" + + "done [number] - to mark task as completed\n\t" + + "list - to show all tasks\n\t" + + "bye - to end DUKE"); + newLine(); + break; + + default: + System.out.println("Please enter a valid input"); } } } } + diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 00000000..857dadd8 --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,3 @@ +public class DukeException extends Exception{ + +} From 0152a64052272fbe9f1adf989d069675d6c5adb7 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Sat, 6 Nov 2021 20:02:10 +0800 Subject: [PATCH 10/18] Level-6 --- src/main/java/Duke.java | 17 +++++++++++++ src/main/java/List.java | 23 ++++++++++++++++++ src/main/out/production/main/Deadline.class | Bin 0 -> 980 bytes src/main/out/production/main/Duke.class | Bin 0 -> 4813 bytes .../out/production/main/DukeException.class | Bin 0 -> 267 bytes src/main/out/production/main/Event.class | Bin 0 -> 978 bytes src/main/out/production/main/List.class | Bin 0 -> 2237 bytes src/main/out/production/main/Task.class | Bin 0 -> 1508 bytes src/main/out/production/main/Todo.class | Bin 0 -> 854 bytes 9 files changed, 40 insertions(+) create mode 100644 src/main/out/production/main/Deadline.class create mode 100644 src/main/out/production/main/Duke.class create mode 100644 src/main/out/production/main/DukeException.class create mode 100644 src/main/out/production/main/Event.class create mode 100644 src/main/out/production/main/List.class create mode 100644 src/main/out/production/main/Task.class create mode 100644 src/main/out/production/main/Todo.class diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ebee733c..f9bbfc43 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -107,6 +107,22 @@ public static void main(String[] args) { newLine(); break; + case "delete": + if(line.equals ("delete")) { + System.out.println("Please enter choice for list"); + break; + } + try{ + int ref = Integer.parseInt(line.split(" ")[1]); + tasks.deleteTask(ref - 1); + } catch (NullPointerException e) { + System.out.println("\tPlease choose from list only"); + break; + } + tasks.printCount(); + newLine(); + break; + case "help": System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + "\n\tevent [description] /at [time]\n\t" + @@ -114,6 +130,7 @@ public static void main(String[] args) { "deadline [description] /by [time]\n\t" + "done [number] - to mark task as completed\n\t" + "list - to show all tasks\n\t" + + "delete [number] - to delete a task\n\t" + "bye - to end DUKE"); newLine(); break; diff --git a/src/main/java/List.java b/src/main/java/List.java index 150513af..35b0b02f 100644 --- a/src/main/java/List.java +++ b/src/main/java/List.java @@ -14,6 +14,10 @@ public void printCount(){ System.out.println("\tNow you have " + this.count + " tasks in the list."); } public void printList () { + if(count == 0){ + System.out.println("\tThere are no items in your list"); + return; + } System.out.println("\tHere are the tasks in your list:"); for (int i=0; i= count) { + throw new NullPointerException(); + } + System.out.println("\tNoted. I've removed this task: "); + System.out.println("\t\t" + this.List[ref].printTask()); + Task[] Temp = new Task[count]; + for (int i=0; i 0) { + Temp[i] = List[i]; + } + } + List = Temp; + } } diff --git a/src/main/out/production/main/Deadline.class b/src/main/out/production/main/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..8097a06ad3f52a1f27b8f723b4075daeb52e189e GIT binary patch literal 980 zcmaJllv?2w$3`1vs@`|-z`;X? zRDa4)ZlCi@e&};`cGxk2RA)_w>`SSndBw0-OCBdH^&Z1gOAiD?sV$XwKe_0Opv(I{ zRmyGcalgj{Y4fJ>Gwa7i9$PLPUF>L+6kA7B$Za6?2 zw0oy0MR6VldKW4CNO_vR#m4>>SmWRaQs1H`m)2AgJM^R2pjVq)Z-;uf|9r#M!DcA|w7-^Z^C|-$~)3_aVt)WI=EB6T+*uy67 LQf?=1(sS<*#QpEw literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/Duke.class b/src/main/out/production/main/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..d5c3f68f2ae7acf43be5b5e8dd57317e9b218c88 GIT binary patch literal 4813 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 literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/Event.class b/src/main/out/production/main/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..737d2c8494e53184b846d8c99da084bc550307d1 GIT binary patch literal 978 zcmaJ<-A)rh7(LU%Zhuw^6~tdGQlu>imlA8duz_e&HKt9yAYM$j6FPL6X?CYgcoQE( z6AcL$K7bEp{C2vDHQSg?X1?EZ&bQzE`hD{gz;hfH;NVUk%h-&qyJd<#bn(c=7DI*` zhI0FYPx(>6)%j7!gi@V18Jw3=N%M+fua-`yBlRA`QcDj6L#Zv5ct5%9i?GZ40Y%Df z?en0=LmB%?aLEj1#Nf71ra~EFEDl8EhjMJBRs<&0fYSLf=`md%jTqKz^)xX@jxE(c)gzHCX~uWTeWSxG7YDSnw$`J`nB=`xN`$R|N0A^AU*<(57_(pShO0p!qUx-% znN~Iz`KPgaH5LoX&*ths^e=>On)9L+64%_s^9eUif z!FcIpWysE>KxdJ>kK||RE;jbB!5RlYkojhdJUUlw${`4s8gjTrvC6ERawYPp5v!D8 z)>z#m(mkQ&#>HohZsLpt!4sxycg9NXzxWY5|w333+ewrT@)x?{O}*hdZb M=!0dvPq7Do0L`xMX#fBK literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/List.class b/src/main/out/production/main/List.class new file mode 100644 index 0000000000000000000000000000000000000000..809f5901e43b2210c8ef30d1546ae896387e4d41 GIT binary patch literal 2237 zcmZuzU2_vv7=BI@y4f_4kP<4C)}wjPU0pJW4WWu%Rr?ea*v#scnt=?LOWta|tgktu-4uq= z2lkqsz&qGSEHO`D4>AetMPC9(kTq~UfhpWjNL}_kzv0*I+O+nUyh}6f>+_LT8cKjud8ourNEQt)W6~YJNiS4-eSs}e0D4EWn4yyDglihww z(!M9#5w6=*qt?7qIFg;}aB%w)eK$?oAMV7{$-K){2JT8)zEl|A45j0)dCPh%bSw

qUaQtzI(yjoL8Ou4SE7piunp&6I&xAHbI!YaFNyOpYL42K8v+qG<2X*)Q( zUeg`S=eOA3TzsI*etv5Rn-B%NS}n13^9F2%L)-l8q^+$i+oUvoz(GD*U3{*(_&V{D zairv)u{Sv46=b`gv#Wsx(3^V+l}lBAN7r*ia*^kV{t_JTXS<7U8u*Ly+ld`Gz*&L- zJca=bvR8N)Rul3bErog@_l!u-5It7PN%sOfa(CEA7uvwn1O;MW z0paM=5GfSiYpI`Xs!#ojZlQQZ@9+Y#P3iI`ivvl1o3c|a*~2ZYC)6Rf7X|1?BnX){ z1xp5T4kG9JW$R~HTV`LVeavfWGi`_ZU#9MdcGlKXGixB zumlELRG^G7Yce_-kSe}+8_;)~(1RNe?rP^q{*NQ94vXnKNZg?HN@f<*$RAc@0_NS5_{6sH)KJdW{_jNk^2 zV-BNOzzN*PNz}N$hST_t{}@OTbM)ps(<(`n+w!pG`@^R1d0Zk+hRK%1rqG=<{=p#w t$JJ2s4R2M1=yGAlaF2bQiJr$-_<}`phV%Wz|B!2EgZ5(3UJlx;{{cXY#e)C< literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/Task.class b/src/main/out/production/main/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..0b77790bb5ccda2f3c42a30a027515fc402069d8 GIT binary patch literal 1508 zcmaJ=YflqF6g|_|w(CN%ynI^~6sl6+qV7&9 zk@&$M;Eyt%>2By^iD`Cb?(Mnfo_p`i?>|3(0l0~$HU=<}gM&%4oXz1Jrm~o}QNsBw zE@W}hrhmpPC@j5`+p^r0-bQ&vw_R_eB9PKMEhUg~ zgL&WMLA;@H$Msx&Parup{gRNXU*|vhCD&8WI$P_iy(-t6^c0r-nryz5ZP(b5Go?4( zfE-J!GH5Wt=v04N!)gUehbad(lwQ$NcY?*5(K#|T-5(+_KuoQ%EL+_~7H$X(GIBm% zVy?xqw8<=BulSvIO)a=aYR>p(O#KdqG2&nlc?SnkuyE7CEN%&$$UXLT(bY4>#dF)L zDC>1qFPdVCnz6Sn+;&jG5w_?xzoLUo9VV}uZcxdWe5SZvy<9geE zLq*pt%(ozG+Hdbzcw%mc?>9Ov0cX+kRJ+=gL7*t&eOyGu5w`S+^y*C&OoV}zeq}Mw zp1@V!?|tBFF?=|UO1!p+qAHus6<4c@g++nMzWVml#+&qi98U3}4)C2Okuvv?rxb>w zomY}}2AnHKxQ@~)a~Isxr5_NVc}QR^0vYHy&rS%yAsnV={T-Pe-5An@WvL~{pG{>4n8xYSkA)NwJ;}PdjjE%&Dz6b^RAx#k^7nY{ zZfu_HLounDU8#IVk<n^FK=HtGXMYp literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/Todo.class b/src/main/out/production/main/Todo.class new file mode 100644 index 0000000000000000000000000000000000000000..d339d2c95dbd4fa1c4c3536a6919d52daae31cfa GIT binary patch literal 854 zcmaJ<%Wl&^6g`uscH$ZmLLZbzp^%oONOXh5!l(-(RUide#A+86i-|pIrg3L1ds3-? z($6TXN?q^){iupNjwON;VaYT1+&TB0xmR;{fBPH2M|3?bV$;P_2IrGh z(i||Xb^2%gg6}6>o$e1zCe>-sJz}W#bSxMeeW}Fv$@x%ZAs;4`Y4vr)lOvuv^;~RQlO2Zk-|nQk&|^`~ajJgEBcroR7jNx+v>s1V2LG#4BI_kQ z&jndt&03Zk(|*2i6(=HZPYZ+jYs_T+DGV=Dv4DOu!~Zcn6OjpKM_)?xc#;gH5rK;i z!_HiPi|)p-^?x3=QKffizY1s;aA~a(Iv`x3-PwD01NN&puhZ%kSzEJAF|a;mVFf-R z;^P4xk_Np}G)t`y1*Y1)8&qzw1Y8rd0;}iH87Q(^ei3`6))F2StQOj|dvx|1yLf|5 MtP!peUZ;QK4{s;Xy#N3J literal 0 HcmV?d00001 From 69073c0ccbf946376ad6c68b7b4af20a7828046d Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Mon, 15 Nov 2021 05:11:01 +0800 Subject: [PATCH 11/18] Level-7 --- src/main/java/Duke.java | 152 +++------------------ src/main/java/List.java | 54 -------- src/main/java/Task.java | 27 ---- src/main/java/{ => app}/DukeException.java | 2 + src/main/java/app/Parser.java | 87 ++++++++++++ src/main/java/app/Storage.java | 115 ++++++++++++++++ src/main/java/app/UI.java | 83 +++++++++++ src/main/java/{ => task}/Deadline.java | 8 +- src/main/java/{ => task}/Event.java | 10 +- src/main/java/task/List.java | 30 ++++ src/main/java/task/Task.java | 39 ++++++ src/main/java/task/TaskCommands.java | 60 ++++++++ src/main/java/{ => task}/Todo.java | 6 +- src/main/text-ui-test/ACTUAL.TXT | 25 ++-- 14 files changed, 466 insertions(+), 232 deletions(-) delete mode 100644 src/main/java/List.java delete mode 100644 src/main/java/Task.java rename src/main/java/{ => app}/DukeException.java (77%) create mode 100644 src/main/java/app/Parser.java create mode 100644 src/main/java/app/Storage.java create mode 100644 src/main/java/app/UI.java rename src/main/java/{ => task}/Deadline.java (55%) rename src/main/java/{ => task}/Event.java (52%) create mode 100644 src/main/java/task/List.java create mode 100644 src/main/java/task/Task.java create mode 100644 src/main/java/task/TaskCommands.java rename src/main/java/{ => task}/Todo.java (60%) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index f9bbfc43..bb7a0e4f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,145 +1,27 @@ +import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Scanner; +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.IOException; -public class Duke { - public static void startDuke() { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - - //Hello command - System.out.println("Hello, I'm Duke\n" + "What tasks can I serve you?"); - } +import app.DukeException; +import app.Storage; +import task.TaskCommands; +import app.UI; - public static void endDuke() { - System.out.println("\tBye! Thanks for visiting The Duke!"); - System.exit(0); - } +public class Duke { - public static void newLine(){ - System.out.println("________________________________________________"); - } + private Storage storage; + private TaskCommands tasks; + private UI ui; public static void main(String[] args) { - startDuke(); - //read line - String line; - String placeholder; - String description; - Scanner in = new Scanner(System.in); - List tasks = new List(); - newLine(); - //to set what to do with the line in - //noinspection InfiniteLoopStatement - while(true){ - line = in.nextLine(); - newLine(); - String command = line.split(" ")[0]; - - //use lineCheck for case statements for cleaner code - switch (command) { - case "bye": - endDuke(); - - case "done": - if(line.equals ("done")) { - System.out.println("Please enter choice for list"); - break; - } - try{ - int ref = Integer.parseInt(line.split(" ")[1]); - tasks.setDone(ref - 1); - System.out.println("\tNice! I've marked this task as done:"); - } catch (NullPointerException e) { - System.out.println("Please choose from list only"); - break; - } - newLine(); - break; - - case "deadline": - try{ - placeholder = line.replaceFirst(command + " ", ""); - description = placeholder.split(" /")[0]; - String by = placeholder.split(" /by ")[1]; - tasks.addList(new Deadline(description, by)); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Have to include /by"); - break; - } - tasks.printCount(); - newLine(); - break; - - case "todo": - description = line.replaceFirst(command + " ", ""); - if(description.equals(command) && line.length() == 4){ - System.out.println("☹ OOPS!!! The description of a todo cannot be empty."); - break; - } - tasks.addList(new Todo(description)); - tasks.printCount(); - newLine(); - break; - - case "event": - placeholder = line.replaceFirst(command + " ", ""); - if(placeholder.equals(command) && line.length() == 5){ - System.out.println("☹ OOPS!!! The description of a event cannot be empty."); - break; - } - description = placeholder.split(" /")[0]; - try { - String at = placeholder.split(" /at ")[1]; - tasks.addList(new Event(description, at)); - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Have to include /at"); - break; - } - tasks.printCount(); - newLine(); - break; - - case "list": - tasks.printList(); - newLine(); - break; - - case "delete": - if(line.equals ("delete")) { - System.out.println("Please enter choice for list"); - break; - } - try{ - int ref = Integer.parseInt(line.split(" ")[1]); - tasks.deleteTask(ref - 1); - } catch (NullPointerException e) { - System.out.println("\tPlease choose from list only"); - break; - } - tasks.printCount(); - newLine(); - break; + UI ui = new UI(); + ui.run(); + } - case "help": - System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + - "\n\tevent [description] /at [time]\n\t" + - "todo [description]\n\t" + - "deadline [description] /by [time]\n\t" + - "done [number] - to mark task as completed\n\t" + - "list - to show all tasks\n\t" + - "delete [number] - to delete a task\n\t" + - "bye - to end DUKE"); - newLine(); - break; +} - default: - System.out.println("Please enter a valid input"); - } - } - } - } diff --git a/src/main/java/List.java b/src/main/java/List.java deleted file mode 100644 index 35b0b02f..00000000 --- a/src/main/java/List.java +++ /dev/null @@ -1,54 +0,0 @@ -import java.util.Arrays; - -public class List extends Task { - public Task[] List = new Task[100]; - public int count = 0; - - public void addList(Task t){ - this.List[count] = t; - printTask(count); - this.count++; - } - - public void printCount(){ - System.out.println("\tNow you have " + this.count + " tasks in the list."); - } - public void printList () { - if(count == 0){ - System.out.println("\tThere are no items in your list"); - return; - } - System.out.println("\tHere are the tasks in your list:"); - for (int i=0; i= count) { - throw new NullPointerException(); - } - System.out.println("\tNoted. I've removed this task: "); - System.out.println("\t\t" + this.List[ref].printTask()); - Task[] Temp = new Task[count]; - for (int i=0; i 0) { - Temp[i] = List[i]; - } - } - List = Temp; - } -} diff --git a/src/main/java/Task.java b/src/main/java/Task.java deleted file mode 100644 index 558aaf0b..00000000 --- a/src/main/java/Task.java +++ /dev/null @@ -1,27 +0,0 @@ -public class Task { - protected String description; - protected String type; - protected boolean isDone; - - public Task(){} - - public Task(String description) { - this.description = description; - this.isDone = false; - System.out.println("\tGot it. I've added this task:"); - } - //set done - public void setDone() { - this.isDone = true; - } - - public String getStatusIcon() { - return (isDone ? "X" : " "); // mark done task with X - } - public String getDescription() { - return description; - } - public String printTask() { - return "[" + getStatusIcon() + "] " + getDescription(); - } -} diff --git a/src/main/java/DukeException.java b/src/main/java/app/DukeException.java similarity index 77% rename from src/main/java/DukeException.java rename to src/main/java/app/DukeException.java index 857dadd8..8b38d290 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/app/DukeException.java @@ -1,3 +1,5 @@ +package app; + public class DukeException extends Exception{ } diff --git a/src/main/java/app/Parser.java b/src/main/java/app/Parser.java new file mode 100644 index 00000000..65258aa3 --- /dev/null +++ b/src/main/java/app/Parser.java @@ -0,0 +1,87 @@ +package app; + +import task.TaskCommands; +import static task.TaskCommands.*; + +public class Parser { + + public enum validCommands { + LIST, DONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE + } + + public static boolean validInput (String check){ + for (validCommands a : validCommands.values()){ + if(a.name().equals(check)){ + return true; + } + } + return false; + } + + public static void parseCommand(String userEntry) throws DukeException { + String [] userInput = userEntry.split("\\ "); + int size = userEntry.length(); + String commandLower = userInput[0]; + String commandFirst = commandLower.toUpperCase(); + if(size == 1 && !commandFirst.equals("LIST") && !commandFirst.equals("BYE")){ + throw new DukeException(); + } + { + switch (commandFirst){ + case "LIST": + TaskCommands.printList(); + break; + + case"DONE": + int ref = 0; + ref = Integer.valueOf(userInput[1]); + TaskCommands.setDone(ref-1); + break; + + case"DELETE": + ref = 0; + ref = Integer.valueOf(userInput[1]); + TaskCommands.deleteTask(ref-1); + break; + + case"HELP": + UI.instructions(); + break; + + case"BYE": + UI.endDuke(); + break; + + case"TODO": + addTodo(userInput[1]); + break; + + case"EVENT": + if(!userInput[2].equals("/at")){ + System.out.println("include /at"); + break; + } + else{ + addEvent(userInput[1],userInput[3]); + } + break; + + case"DEADLINE": + if(!userInput[2].equals("/by")){ + System.out.println("include /by"); + break; + } + else{ + addDeadline(userInput[1],userInput[3]); + } + break; + + default: throw new DukeException(); + } + } + } + + } + + + diff --git a/src/main/java/app/Storage.java b/src/main/java/app/Storage.java new file mode 100644 index 00000000..bc1d8b4c --- /dev/null +++ b/src/main/java/app/Storage.java @@ -0,0 +1,115 @@ +package app; + +import task.*; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; + +public class Storage { + + private static ArrayList Load = new ArrayList<>(); + public static void loadList() { + String home = System.getProperty("user.home"); + java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); + // if exist + boolean directoryExists = java.nio.file.Files.exists(path); + String description; + if(directoryExists) { + try (BufferedReader br = new BufferedReader(new FileReader(path + ""))) { + String sCurrentLine; + int i = 0; + while ((sCurrentLine = br.readLine()) != null) { + String [] words = sCurrentLine.split("\\|"); + String type = words[0]; + boolean done = Boolean.parseBoolean(words[1]); + switch (type){ + case "T": + description = words[2]; + Load.add(new Todo(description)); + if(done == true){ + Load.get(i).setDone(); + } + i++; + break; + case "D": + description = words[2]; + Load.add(new Deadline(description, words[3])); + if(done == true){ + Load.get(i).setDone(); + } + i++; + break; + case "E": + description = words[2]; + Load.add(new Event(description, words[3])); + if(done == true){ + Load.get(i).setDone(); + } + i++; + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + List.setList(Load); + } + } + + public static void saveList() { + Load = List.getList(); + String home = System.getProperty("user.home"); + java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); + //if exist + boolean directoryExists = java.nio.file.Files.exists(path); + if (!directoryExists) { + try { + System.out.println("File created at : " + path); + Files.createDirectory(Paths.get(home,"data")); + Files.createFile(path); + } catch (IOException e) { + System.out.println("Error saving file"); + e.printStackTrace(); + } + } + String save = ""; + for (int i = 0; i < Load.size(); i++) { + String type = Load.get(i).getType(); + try { + switch (type) { + case "T": + save += Load.get(i).getType() + "|" + + Load.get(i).getDone() + "|" + + Load.get(i).getDescription() + + System.lineSeparator(); + break; + + case "D" : + + case "E": + save += Load.get(i).getType() + "|" + + Load.get(i).getDone() + "|" + + Load.get(i).getDescription() + "|" + + Load.get(i).getTiming() + + System.lineSeparator(); + break; + + default: break; + } + writeToFile(path + "", save); + } catch (IOException e) {} + } + } + + private static void writeToFile(String filePath, String textToAdd) throws IOException { + FileWriter fw = new FileWriter(filePath); + fw.write(textToAdd); + fw.close(); + } + +} diff --git a/src/main/java/app/UI.java b/src/main/java/app/UI.java new file mode 100644 index 00000000..9c5ce0d3 --- /dev/null +++ b/src/main/java/app/UI.java @@ -0,0 +1,83 @@ +package app; + +import task.Task; +import task.TaskCommands; + +import java.util.ArrayList; +import java.util.Scanner; + +import static app.Storage.loadList; + +public class UI { + private Parser parser; + private ArrayList List = new ArrayList<>(); + + public void run(){ + dukeLogo(); + loadList(); + String line; + Scanner in = new Scanner(System.in); + + while(true) { + line = in.nextLine(); + newLine(); + String command = line.split(" ")[0]; + String commandUpper = command.toUpperCase(); + try { + Parser.validInput(commandUpper); + } catch (NullPointerException e){ + System.out.println("Please enter a valid input"); + } + try { + Parser.parseCommand(line); + } catch (DukeException e) { + System.out.println("Please enter a valid input"); + instructions(); + } catch (NullPointerException e){ + System.out.println("Please enter a valid input"); + instructions(); + } catch (ArrayIndexOutOfBoundsException e){ + System.out.println("Please enter a valid input"); + instructions(); + } catch (IndexOutOfBoundsException e) { + System.out.println("Please enter a valid input"); + instructions(); + } + newLine(); + } + } + + private static void dukeLogo () { + String logo = " ____ _ \n" + + "| _ \\ _ _| | _____ \n" + + "| | | | | | | |/ / _ \\\n" + + "| |_| | |_| | < __/\n" + + "|____/ \\__,_|_|\\_\\___|\n"; + System.out.println("Hello from\n" + logo); + //Hello command + System.out.println("Hello, I'm Duke\n" + "What tasks can I serve you?"); + newLine(); + } + + public static void endDuke () { + System.out.println("\tBye! Thanks for visiting The Duke!"); + Storage.saveList(); + System.exit(0); + } + public static void newLine () { + System.out.println("________________________________________________"); + } + + public static void instructions () { + System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + + "\n\tevent [description] /at [time]\n\t" + + "todo [description]\n\t" + + "deadline [description] /by [time]\n\t" + + "done [number] - to mark task as completed\n\t" + + "list - to show all tasks\n\t" + + "delete [number] - to delete a task\n\t" + + "save - to save task list\n\t" + + "bye - to end DUKE"); + newLine(); + } + } \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/task/Deadline.java similarity index 55% rename from src/main/java/Deadline.java rename to src/main/java/task/Deadline.java index 156f9970..188547f1 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/task/Deadline.java @@ -1,13 +1,17 @@ +package task; + public class Deadline extends Task { protected String by; public Deadline(String description, String by) { super(description); - this.by = by; + super.type("D"); + super.timing(by); + super.isDone = false; } @Override public String printTask() { - return "[D]" + super.printTask() + " (by: " + by + ")"; + return super.printTask() + " (by: " + super.timing + ")"; } } diff --git a/src/main/java/Event.java b/src/main/java/task/Event.java similarity index 52% rename from src/main/java/Event.java rename to src/main/java/task/Event.java index 69a65b22..8e725a10 100644 --- a/src/main/java/Event.java +++ b/src/main/java/task/Event.java @@ -1,14 +1,16 @@ -public class Event extends Task { +package task; - protected String at; +public class Event extends Task { public Event(String description, String ends) { super(description); - this.at = ends; + super.type("E"); + super.timing(ends); + super.isDone = false; } @Override public String printTask() { - return "[E]" + super.printTask() + " (at: " + at + ")"; + return super.printTask() + " (at: " + super.timing + ")"; } } diff --git a/src/main/java/task/List.java b/src/main/java/task/List.java new file mode 100644 index 00000000..71bf3642 --- /dev/null +++ b/src/main/java/task/List.java @@ -0,0 +1,30 @@ +package task; + +import app.Storage; + +import java.util.ArrayList; + +import static task.TaskCommands.printCount; + +public class List extends Task{ + private static ArrayList List = new ArrayList<>(); + + public static void setList(ArrayList Other) { + List = Other; + } + + public static ArrayList getList(){ + return List; + } + + public static void addList(Task t){ + List.add(t); + System.out.println("\tGot it. I've added this task:"); + printCount(); + Storage.saveList(); + } + public static int getSize(){ + return List.size(); + } +} + diff --git a/src/main/java/task/Task.java b/src/main/java/task/Task.java new file mode 100644 index 00000000..ae0469bd --- /dev/null +++ b/src/main/java/task/Task.java @@ -0,0 +1,39 @@ +package task; + +public class Task { + protected String description; + protected boolean isDone; + protected String type; + protected String timing; + + public Task(){} + + public Task(String description) { + this.description = description; + } + + public void type(String type){ + this.type = type; + } + public void timing (String timing){ + this.timing = timing; + } + public void isDone(Boolean isDone) {this.isDone = isDone; } + //set done + public void setDone() { + this.isDone = true; + } + + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X + } + public String getDone() { return (isDone ? "true" : "false");} //to save done status + public String getDescription() { + return description; + } + public String getType() { return type; } + public String getTiming() { return timing; } + public String printTask() { + return "[" + getType() + "]" + "[" + getStatusIcon() + "] " + getDescription(); + } +} diff --git a/src/main/java/task/TaskCommands.java b/src/main/java/task/TaskCommands.java new file mode 100644 index 00000000..68097eb9 --- /dev/null +++ b/src/main/java/task/TaskCommands.java @@ -0,0 +1,60 @@ +package task; + +import app.Storage; +import task.List; + +import java.util.ArrayList; + +public class TaskCommands extends Task { + + private ArrayList Temp = new ArrayList<>(); + + public static void addTodo(String description){ + List.addList(new Todo(description)); + } + public static void addEvent(String description, String at){ + List.addList(new Event(description, at)); + } + + public static void addDeadline(String description, String by){ + List.addList(new Deadline(description, by)); + } + + public static void printCount(){ + System.out.println("\tNow you have " + List.getSize() + " tasks in the list."); + } + public static void printList() { + ArrayList Temp = List.getList(); + if(Temp.size() == 0){ + System.out.println("\tThere are no items in your list"); + return; + } + System.out.println("\tHere are the tasks in your list:"); + for (int i=0; i Temp = List.getList(); + System.out.println("\t\t" + Temp.get(ref)); + } + + public static void setDone(int ref) { + ArrayList Temp = List.getList(); + Temp.get(ref).setDone(); + System.out.println("\tNice! I've marked this task as done:"); + System.out.println("\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } + + public static void deleteTask(int ref){ + System.out.println("\tNoted. I've removed this task: "); + ArrayList Temp = List.getList(); + System.out.println("\t\t" + Temp.get(ref).printTask()); + Temp.remove(ref); + List.setList(Temp); + } + + } + diff --git a/src/main/java/Todo.java b/src/main/java/task/Todo.java similarity index 60% rename from src/main/java/Todo.java rename to src/main/java/task/Todo.java index 3126bd5f..ae04cdbf 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/task/Todo.java @@ -1,12 +1,16 @@ +package task; + public class Todo extends Task { public Todo(String description) { super(description); + super.type("T"); + super.isDone = false; } @Override public String printTask() { - return "[T]" + super.printTask() ; + return super.printTask() ; } } diff --git a/src/main/text-ui-test/ACTUAL.TXT b/src/main/text-ui-test/ACTUAL.TXT index ebb16a09..99ca25ab 100644 --- a/src/main/text-ui-test/ACTUAL.TXT +++ b/src/main/text-ui-test/ACTUAL.TXT @@ -7,17 +7,24 @@ Hello from Hello, I'm Duke What can I do for you? + ________________________________________________ -added: dance -________________________________________________ -added: sing -________________________________________________ -added: act -________________________________________________ + +Got it. I've added this task: + [null][ ] dance + +Got it. I've added this task: + [null][ ] sing + +Got it. I've added this task: + [null][ ] act Here are the tasks in your list: -1. [ ] dance -2. [ ] sing -3. [ ] act +1. [null][ ] dance +2. [null][ ] sing +3. [null][ ] act Nice! I've marked this task as done: [X] sing + +Got it. I've added this task: + [null][ ] done 2 Bye! Thanks for visiting The Duke! From 59f4671e03a4e84d0cf56138589c8db65ef61e79 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Wed, 17 Nov 2021 07:23:43 +0800 Subject: [PATCH 12/18] Level-8, Gradle --- src/main/java/Duke.java | 11 +- src/main/java/app/DateTime.java | 93 +++++++++++++++ src/main/java/app/DukeException.java | 3 + src/main/java/app/Parser.java | 153 ++++++++++++++++++++---- src/main/java/app/Storage.java | 169 ++++++++++++++++++++++++--- src/main/java/app/UI.java | 61 ++++++++-- src/main/java/task/Deadline.java | 27 ++++- src/main/java/task/Event.java | 16 ++- src/main/java/task/List.java | 24 ++++ src/main/java/task/Task.java | 87 +++++++++++++- src/main/java/task/TaskCommands.java | 122 ++++++++++++++++--- src/main/java/task/Todo.java | 14 ++- 12 files changed, 694 insertions(+), 86 deletions(-) create mode 100644 src/main/java/app/DateTime.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index bb7a0e4f..0f111350 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,11 +1,3 @@ -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Scanner; -import java.io.FileReader; -import java.io.BufferedReader; -import java.io.IOException; - -import app.DukeException; import app.Storage; import task.TaskCommands; import app.UI; @@ -16,6 +8,9 @@ public class Duke { private TaskCommands tasks; private UI ui; + /** @param args to create program to run + * Creating a new UI in main Duke & running + */ public static void main(String[] args) { UI ui = new UI(); ui.run(); diff --git a/src/main/java/app/DateTime.java b/src/main/java/app/DateTime.java new file mode 100644 index 00000000..a36a5963 --- /dev/null +++ b/src/main/java/app/DateTime.java @@ -0,0 +1,93 @@ +package app; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.util.Locale; + +public class DateTime { + /** + * To validate user input String date + * @param date Takes a String input date + * verifying if date matches "yyyy-mm-dd" format + * @return true if matches accurate format + * @return false if does not match accurate format + */ + public static boolean isValidDate (String date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); + boolean valid = false; + /** + * parse date with format + * must be exact with format + * if true, set + * @param valid as true + */ + try { + sdf.parse(date); + sdf.setLenient(false); + valid = true; + } catch (ParseException e){ + valid = false; + } + return valid; + } + + /** + * To valid user input String time + * @param time takes a String input time + * verifying if time matches "hh:mm" format + * @return true if matches format + * @return false if does not match format + */ + public static boolean isValidTime (String time) { + SimpleDateFormat sdf = new SimpleDateFormat("hh:mm"); + boolean valid = false; + /** + * parse date with format + * must be exact with format + * if true, set + * @param valid as true + */ + try { + sdf.parse(time); + sdf.setLenient(false); + valid = true; + } catch (ParseException e){ + valid = false; + } + return valid; + } + + /** + * Takes user input String date and returns as LocalDate + * @param date parses to LocalDate + * @return date as LocalDate + */ + public static LocalDate toDate(String date){ + LocalDate dt = LocalDate.parse(date); + return dt; + } + /** + * Takes user input String time and returns as LocalTime + * @param time parses to LocalTime + * @return time as LocalTime + */ + public static LocalTime toTime(String time){ + LocalTime dt = LocalTime.parse(time); + return dt; + } + /** + * Takes LocalDate date and returns in a new format + * @param formatter to format date to "dd MMM yyyy" + * @return new date format + */ + public static String toNewDateFormat (LocalDate date){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); + return date.format(formatter); + } + +} diff --git a/src/main/java/app/DukeException.java b/src/main/java/app/DukeException.java index 8b38d290..1551efee 100644 --- a/src/main/java/app/DukeException.java +++ b/src/main/java/app/DukeException.java @@ -1,5 +1,8 @@ package app; +/** + * Creates class exception as DukeException to handle errors + */ public class DukeException extends Exception{ } diff --git a/src/main/java/app/Parser.java b/src/main/java/app/Parser.java index 65258aa3..ffbfcd1b 100644 --- a/src/main/java/app/Parser.java +++ b/src/main/java/app/Parser.java @@ -1,78 +1,185 @@ package app; import task.TaskCommands; + +import java.time.LocalDate; +import java.time.LocalTime; + +import static app.DateTime.*; import static task.TaskCommands.*; -public class Parser { +public class Parser { + /** + * Set enumerations of valid commands + */ public enum validCommands { - LIST, DONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE + LIST, DONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE, ON } - public static boolean validInput (String check){ + /** + * To check if user input String check is valid + * @param checkCommand takes user input as String + * check if checkCommand matches enum + * @return true if match, false if doesn't match + */ + public static boolean validInput (String checkCommand){ for (validCommands a : validCommands.values()){ - if(a.name().equals(check)){ + if(a.name().equals(checkCommand)){ return true; } } return false; } + /** + * Takes user input as String and parse input + * @param userEntry Takes user entry as String + * Creates String timeDescription for Deadline & Event cases + * Creates String description to store description of task + * Creates String command to store first word of String userEntry, which is the command + * Create int size to check length of String userEntry + * String commandUpper to change String command to upper case + * check if user entered only command without description, except for LIST & BYE + * @throws DukeException when error occurs + */ public static void parseCommand(String userEntry) throws DukeException { - String [] userInput = userEntry.split("\\ "); + String timeDescription; + String description; + String command = userEntry.split(" ")[0]; + description = userEntry.replaceFirst(command + " ", ""); int size = userEntry.length(); - String commandLower = userInput[0]; - String commandFirst = commandLower.toUpperCase(); - if(size == 1 && !commandFirst.equals("LIST") && !commandFirst.equals("BYE")){ + String commandUpper = command.toUpperCase(); + if(size == 1 && !commandUpper.equals("LIST") && !commandUpper.equals("BYE")){ throw new DukeException(); } + /** + * switch for commandUpper + */ { - switch (commandFirst){ + switch (commandUpper){ + /** + * LIST - calls TaskCommands.printList() to print existing listing + * break to end command switch + */ case "LIST": TaskCommands.printList(); break; - + /** + * DONE - Get int ref of list = 0, marks task as done by calling TaskCommands.setDone(ref-1) + * break to end command switch + */ case"DONE": int ref = 0; - ref = Integer.valueOf(userInput[1]); + ref = Integer.valueOf(description); TaskCommands.setDone(ref-1); break; - + /** + * DELETE - Get ref of list = 0, finds task and delete by calling TaskCommands.deleteTask(ref-1) + * break to end command switch + */ case"DELETE": ref = 0; - ref = Integer.valueOf(userInput[1]); + ref = Integer.valueOf(description); TaskCommands.deleteTask(ref-1); break; - + /** + * HELP - Calls UI.instructions() + * break to end command switch + */ case"HELP": UI.instructions(); break; - + /** + * BYE - Exits Duke, calls UI.endDuke() + * break to end command switch + */ case"BYE": UI.endDuke(); break; - + /** + * TODO - adds new task todo + * break to end command switch + */ case"TODO": - addTodo(userInput[1]); + addTodo(description); break; - + /** + * EVENT - split String userEntry into time description as String timeDescription + * prints error if cannot split "/at " + * break to end command switch + */ case"EVENT": - if(!userInput[2].equals("/at")){ + timeDescription = userEntry.split("/at ")[1]; + if(description.equals("")){ System.out.println("include /at"); break; } + /** + * split description to remove timeDescription + * add to Event task + */ else{ - addEvent(userInput[1],userInput[3]); + description = description.split(" /")[0]; + addEvent(description,timeDescription); } break; - + /** + * DEADLINE - split String userEntry at "/by " into String timeDescription + * split description to remove timeDescription + * @param date take first part of timeDescription split at "/" + * @param time take second part of timeDescription split at "/" + */ case"DEADLINE": - if(!userInput[2].equals("/by")){ + timeDescription = userEntry.split("/by ")[1]; + description = description.split(" /")[0]; + String date = timeDescription.split(", ")[0]; + String time = timeDescription.split(", ")[1]; + /** + * if only command available, print error + * break command switch + */ + if(description.equals("")){ System.out.println("include /by"); break; } + /** + * if DateTime check on date or time format is false, return error + * print error line + * break command switch + */ + else if(isValidDate(date) == false || isValidTime(time) == false) { + System.out.println("Please use an exact date time, yyyy-mm-dd, hh:mm"); + break; + } + /** + * convert String date to LocalDate date + * convert String time to LocalTime time + * add to Deadline task + */ + else{ + LocalDate dateDate = toDate(date); + LocalTime timeTime = toTime(time); + addDeadline(description, dateDate, timeTime); + } + break; + /** + * ON - check if date is in correct format or if description is empty, return false + * print error line + * break switch + */ + case"ON": + if(isValidDate(description)==false || (description.equals(""))){ + System.out.println("Please use an exact date: yyyy-mm-dd"); + break; + } + /** + * convert String description to LocalDate date + * check if date exists in list and return list + */ else{ - addDeadline(userInput[1],userInput[3]); + LocalDate checkDate = toDate(description); + TaskCommands.printDateList(checkDate); } break; diff --git a/src/main/java/app/Storage.java b/src/main/java/app/Storage.java index bc1d8b4c..1c9cf410 100644 --- a/src/main/java/app/Storage.java +++ b/src/main/java/app/Storage.java @@ -8,100 +8,235 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.ArrayList; +import static app.DateTime.toDate; +import static app.DateTime.toTime; + public class Storage { private static ArrayList Load = new ArrayList<>(); + + /** + * Method to load listing from Duke.txt + * Get path for user hom + * Get path for duke.txt + */ public static void loadList() { String home = System.getProperty("user.home"); java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); - // if exist + /** + * Create boolean to check if path for Duke.txt exists + * Create String description to store Task description + * If directory exists + * read the file using buffered reader + * create int i as a reference point + */ boolean directoryExists = java.nio.file.Files.exists(path); String description; if(directoryExists) { try (BufferedReader br = new BufferedReader(new FileReader(path + ""))) { String sCurrentLine; int i = 0; + /** + * while the line read is not null + * split the line into a String array with delimiter "|" + * create String type to store type of Task in String array index 0 + * create boolean done for String array index 1 + */ while ((sCurrentLine = br.readLine()) != null) { String [] words = sCurrentLine.split("\\|"); String type = words[0]; - boolean done = Boolean.parseBoolean(words[1]); + boolean isDone = Boolean.parseBoolean(words[1]); + /** + * create switch method for Task type + */ switch (type){ + /** + * if type is T + * store String word array index 2 as description + * add Todo as task + * if Task is done, mark as done + * increment i + * break switch + */ case "T": description = words[2]; Load.add(new Todo(description)); - if(done == true){ + if(isDone == true){ Load.get(i).setDone(); } i++; break; + /** + * if type is D + * store String word array index 2 as description + * store String word array index 3 as String date + * store String word array index 4 as String time + * convert String date as LocalDate date + * convert String time as LocalTime time + * add Deadline as task + * if Task is done, mark as done + * increment i + * break switch + */ case "D": description = words[2]; - Load.add(new Deadline(description, words[3])); - if(done == true){ + String date = words[3]; + String time = words[4]; + LocalDate byDate = toDate(date); + LocalTime byTime = toTime(time); + Load.add(new Deadline(description, byDate, byTime)); + if(isDone == true){ Load.get(i).setDone(); } i++; break; + /** + * if type is E + * store String word array index 2 as description + * store String word array index 3 as String timing + * add Deadline as task with description and timing + * if Task is done, mark as done + * increment i + * break switch + */ case "E": description = words[2]; - Load.add(new Event(description, words[3])); - if(done == true){ + String timing = words[3]; + Load.add(new Event(description, timing)); + if(isDone == true){ Load.get(i).setDone(); } i++; break; } } + /** + * if IOException e error occurs, print error tracing + */ } catch (IOException e) { e.printStackTrace(); } + /** + * update ArrayList List as ArrayList Load + */ List.setList(Load); } } + /** + * Method to save current listing + * Copy ArrayList List to ArrayList Load + * get user home path + * Get path of Duke.txt + */ public static void saveList() { Load = List.getList(); String home = System.getProperty("user.home"); java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); - //if exist + /** + * create boolean to check if directory exists + */ boolean directoryExists = java.nio.file.Files.exists(path); + /** + * if directory does not exist + * print out path of file created + * create directory of file + * create file Duke.txt + */ if (!directoryExists) { try { System.out.println("File created at : " + path); Files.createDirectory(Paths.get(home,"data")); Files.createFile(path); + /** + * Catch any IOException errors + * Print out error statement + * Print out trace of errors + */ } catch (IOException e) { System.out.println("Error saving file"); e.printStackTrace(); } } + /** + * Create String save to store data as String + */ String save = ""; + /** + * Create for loop to go through Tasks in ArrayList Load + * Create String type to store Task type + */ for (int i = 0; i < Load.size(); i++) { String type = Load.get(i).getType(); try { + /** + * Create switch method for type of tasks + */ switch (type) { + /** + * for Todo tasks + * Store the following in String save + * Get Task type for index i, add delimiter + * Get done status for index i, add delimiter + * Get description for index i, add delimiter + * Add line separator + * break to next line + */ case "T": save += Load.get(i).getType() + "|" + Load.get(i).getDone() + "|" + Load.get(i).getDescription() + System.lineSeparator(); break; - - case "D" : - - case "E": - save += Load.get(i).getType() + "|" - + Load.get(i).getDone() + "|" - + Load.get(i).getDescription() + "|" - + Load.get(i).getTiming() - + System.lineSeparator(); + /** + * for Event tasks + * Store the following in String save + * Get Task type for index i, add delimiter + * Get done status for index i, add delimiter + * Get description for index i, add delimiter + * Get timing for index i, add delimiter + * Add line separator + * break to next line + */ + case "E" : + save += Load.get(i).getType() + "|" + + Load.get(i).getDone() + "|" + + Load.get(i).getDescription() + "|" + + Load.get(i).getTiming() + "|" + + System.lineSeparator(); + /** + * for Deadline tasks + * Store the following in String save + * Get Task type for index i, add delimiter + * Get done status for index i, add delimiter + * Get description for index i, add delimiter + * Get date for index i, add delimiter + * Get time for index i, add delimiter + * Add line separator + * break to next line + */ + case "D": + save += Load.get(i).getType() + "|" + + Load.get(i).getDone() + "|" + + Load.get(i).getDescription() + "|" + + Load.get(i).getDate() + "|" + + Load.get(i).getTime() + + System.lineSeparator(); break; default: break; } + /** + * write String save to Duke.txt + */ writeToFile(path + "", save); + /** + * Handle IOException errors + */ } catch (IOException e) {} } } diff --git a/src/main/java/app/UI.java b/src/main/java/app/UI.java index 9c5ce0d3..44090a33 100644 --- a/src/main/java/app/UI.java +++ b/src/main/java/app/UI.java @@ -1,7 +1,6 @@ package app; import task.Task; -import task.TaskCommands; import java.util.ArrayList; import java.util.Scanner; @@ -12,35 +11,61 @@ public class UI { private Parser parser; private ArrayList List = new ArrayList<>(); + /** Main function of UI to run program + * dukeLogo - Calling the logo + * loadList - Calling the Storage function to load duke.txt + * line - Creates a String to store user input + * Scanner in - to scan and read user input + */ public void run(){ dukeLogo(); loadList(); String line; Scanner in = new Scanner(System.in); - + /** + * @param while(true) - while there is input from the user + * newLine() - Calls a line break + * @param command Split user line to the first word + * @param commandUpper Convert user input String to uppercase + */ while(true) { line = in.nextLine(); newLine(); String command = line.split(" ")[0]; String commandUpper = command.toUpperCase(); + /** + * @param parser.validInput(commandUpper) passes command String to check booleaan + * @param catch(NullPointerException e) catches null in String + * @param println tells user to input accurately + * @param instructions() print instructions to use Duke + */ try { - Parser.validInput(commandUpper); + parser.validInput(commandUpper); } catch (NullPointerException e){ - System.out.println("Please enter a valid input"); + System.out.println("Please enter a valid input\n"); + instructions(); } + /** + * @param parser.parseCommand(line) passes command String to Parser to do command + * @param catch(NullPointerException e) catches null in String + * @param println tells user to input accurately + * @param instructions() print instructions to use Duke + * @param catch(ArrayIndexOutOfBoundsException e) catches array out of bounds in String + * @param catch(IndexOutOfBoundsException e) catches index out of bounds in String + */ try { - Parser.parseCommand(line); + parser.parseCommand(line); } catch (DukeException e) { - System.out.println("Please enter a valid input"); + System.out.println("Please enter a valid input\n"); instructions(); } catch (NullPointerException e){ - System.out.println("Please enter a valid input"); + System.out.println("Please enter a valid input\n"); instructions(); } catch (ArrayIndexOutOfBoundsException e){ - System.out.println("Please enter a valid input"); + System.out.println("Please enter a valid input\n"); instructions(); } catch (IndexOutOfBoundsException e) { - System.out.println("Please enter a valid input"); + System.out.println("Please enter a valid input\n"); instructions(); } newLine(); @@ -59,25 +84,37 @@ private static void dukeLogo () { newLine(); } + /** + * to end program + * Storage.saveList() - call Storage to save list to duke.txt + * System.exit - exit system safely + */ public static void endDuke () { System.out.println("\tBye! Thanks for visiting The Duke!"); Storage.saveList(); System.exit(0); } - public static void newLine () { + + /** + * newLine() - Prints a new line break + */ + public static void newLine () { System.out.println("________________________________________________"); } + /** + * Prints out instructions to use Duke + */ public static void instructions () { System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + "\n\tevent [description] /at [time]\n\t" + "todo [description]\n\t" + - "deadline [description] /by [time]\n\t" + + "deadline [description] /by yyyy-mm-dd, hh.mm\n\t" + "done [number] - to mark task as completed\n\t" + "list - to show all tasks\n\t" + "delete [number] - to delete a task\n\t" + "save - to save task list\n\t" + + "on yyyy-mm-dd - to check if tasks match date given\n\t" + "bye - to end DUKE"); - newLine(); } } \ No newline at end of file diff --git a/src/main/java/task/Deadline.java b/src/main/java/task/Deadline.java index 188547f1..02e2ab52 100644 --- a/src/main/java/task/Deadline.java +++ b/src/main/java/task/Deadline.java @@ -1,17 +1,38 @@ package task; +import java.time.LocalDate; +import java.time.LocalTime; + +import static app.DateTime.toNewDateFormat; + +/** + * Deadline is inheriting from Task + */ public class Deadline extends Task { protected String by; - public Deadline(String description, String by) { + /** + * Deadline takes in input of String description, LocalDate dDate and LocalTime dTime + * @param description description from Parser that user entered + * @param dDate date from Parser + * @param dTime time from Parser + * The Deadline method stores these tasks in Task + * super.type - Assigns type "D" + * super.isDone - Assigns false to done + */ + public Deadline(String description, LocalDate dDate, LocalTime dTime) { super(description); super.type("D"); - super.timing(by); + super.date = dDate; + super.time = dTime; super.isDone = false; } @Override +/** + * Print Task that has been added to ArrayList + */ public String printTask() { - return super.printTask() + " (by: " + super.timing + ")"; + return super.printTask() + " (by: " + toNewDateFormat(super.date) + ", " + super.time + ")"; } } diff --git a/src/main/java/task/Event.java b/src/main/java/task/Event.java index 8e725a10..0bb25202 100644 --- a/src/main/java/task/Event.java +++ b/src/main/java/task/Event.java @@ -1,14 +1,22 @@ package task; public class Event extends Task { - - public Event(String description, String ends) { + /** + * Deadline takes in input of String description, String at + * @param description description from Parser that user entered + * super.type - Assigns type "E" + * super.timing - Stores String at in task timing + * super.isDone - Assigns false to done + */ + public Event(String description, String at) { super(description); super.type("E"); - super.timing(ends); + super.timing(at); super.isDone = false; } - + /** + * Print Task that has been added to ArrayList + */ @Override public String printTask() { return super.printTask() + " (at: " + super.timing + ")"; diff --git a/src/main/java/task/List.java b/src/main/java/task/List.java index 71bf3642..6e96cb20 100644 --- a/src/main/java/task/List.java +++ b/src/main/java/task/List.java @@ -6,23 +6,47 @@ import static task.TaskCommands.printCount; +/** + * ArrayList List inheriting from Task as the List stores Tasks + */ public class List extends Task{ private static ArrayList List = new ArrayList<>(); + /** + * To allow other ArrayList in other classes to set into main ArrayList List + * @param Other + */ public static void setList(ArrayList Other) { List = Other; } + /** + * To return ArrayList List to other ArrayList in other classes + * @return ArrayList List + */ public static ArrayList getList(){ return List; } + /** + * Method to add Task to list + * using ArrayList.add method + * Print line to note task has been added + * Print number of items in list + * Saves list into storage + * @param t - Tasks + */ public static void addList(Task t){ List.add(t); System.out.println("\tGot it. I've added this task:"); printCount(); Storage.saveList(); } + + /** + * Method to return List size in int + * @return int size of List + */ public static int getSize(){ return List.size(); } diff --git a/src/main/java/task/Task.java b/src/main/java/task/Task.java index ae0469bd..99a8c267 100644 --- a/src/main/java/task/Task.java +++ b/src/main/java/task/Task.java @@ -1,38 +1,119 @@ package task; +import java.time.LocalDate; +import java.time.LocalTime; + +/** + * Creates what is in a Task + * creates String description - description of task + * creates boolean isDone - if the task is done + * creates String type - what type of task is it (Todo, Deadline, Event) + * creates LocalDate date - stores date for Deadline + * creates LocalTime time - stores time for Deadline + */ public class Task { protected String description; protected boolean isDone; protected String type; protected String timing; + protected LocalDate date; + protected LocalTime time; public Task(){} + /** + * Modify basic Task + * @param description description of the task + */ public Task(String description) { this.description = description; } + /** + * Modify type of task + * @param type type of task assigned + */ public void type(String type){ this.type = type; } + /** + * Modify timing of Event + * @param timing timing of Event + */ public void timing (String timing){ this.timing = timing; } + /** + * Modify status of task + * @param isDone if task is completed + */ public void isDone(Boolean isDone) {this.isDone = isDone; } - //set done + + /** + * Modify date of task to be completed by + * @param date date of task to be completed by + */ + public void date (LocalDate date){this.date = date; } + /** + * Modify time of task to be completed by + * @param time date of task to be completed by + */ + public void time (LocalTime time){this.time = time; } + + /** + * Method to set task as done + */ public void setDone() { this.isDone = true; } + /** + * Method to get status of isDone + * @return "X" if true, "" if false + */ public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } - public String getDone() { return (isDone ? "true" : "false");} //to save done status + + /** + * Retrieve done status of isDone + * @return true or false + */ + public String getDone() { return (isDone ? "true" : "false");} + + /** + * Retrieve description + * @return description of task + */ public String getDescription() { return description; } + + /** + * retrieve type of Task + * @return type of task + */ public String getType() { return type; } - public String getTiming() { return timing; } + /** + * retrieve Timing of Event + * @return timing + */ + public String getTiming() {return timing; } + /** + * retrieve Date of Deadline + * @return date + */ + public LocalDate getDate() { return date; } + /** + * retrieve Time of Deadline + * @return time + */ + public LocalTime getTime() { return time; } + + /** + * prints tasks out + * @return format of task with type, status and description of Task + */ public String printTask() { return "[" + getType() + "]" + "[" + getStatusIcon() + "] " + getDescription(); } diff --git a/src/main/java/task/TaskCommands.java b/src/main/java/task/TaskCommands.java index 68097eb9..a81696ad 100644 --- a/src/main/java/task/TaskCommands.java +++ b/src/main/java/task/TaskCommands.java @@ -1,53 +1,147 @@ package task; -import app.Storage; -import task.List; - +import java.time.LocalDate; +import java.time.LocalTime; import java.util.ArrayList; -public class TaskCommands extends Task { +import static app.DateTime.toNewDateFormat; +/** + * TaskCommands inherits from Task + */ +public class TaskCommands extends Task { + /** + * Creates a Temporary ArrayList + */ private ArrayList Temp = new ArrayList<>(); + /** + * Method to add to Todo + * @param description takes String description and adds to Todo + */ public static void addTodo(String description){ List.addList(new Todo(description)); } + /** + * Method to add to Event + * @param description takes String description and adds to Event + * @param at Takes String at and adds to Event (timing) + */ public static void addEvent(String description, String at){ List.addList(new Event(description, at)); } - - public static void addDeadline(String description, String by){ - List.addList(new Deadline(description, by)); + /** + * Method to add to Deadline + * @param description takes description and adds to Deadline + * @param byDate takes LocalDate date and adds to Deadline (date of deadline) + * @param byTime takes LocalDate time and adds to Deadline (time of deadline) + */ + public static void addDeadline(String description, LocalDate byDate, LocalTime byTime){ + List.addList(new Deadline(description, byDate, byTime)); } + /** + * prints out number of tasks in list + */ public static void printCount(){ System.out.println("\tNow you have " + List.getSize() + " tasks in the list."); } - public static void printList() { + + /** + * Method prints out list + * if list size is empty, print out error + * return + */ + public static void printList() { ArrayList Temp = List.getList(); if(Temp.size() == 0){ System.out.println("\tThere are no items in your list"); return; } - System.out.println("\tHere are the tasks in your list:"); + /** + * print out tasks in list line + * print out tasks using a loop, number the list items + */ + System.out.println("\tHere are the tasks in your list:"); for (int i=0; i Temp = List.getList(); - System.out.println("\t\t" + Temp.get(ref)); + ArrayList Placeholder = new ArrayList<>(); + LocalDate listDate; + /** + * if Temp is empty, print error + */ + if(Temp.size() == 0){ + System.out.println("\tThere are no items in your list"); + return; + } + /** + * Using for loop, check each item in our listing + * if the Task in the list matches "D" (Deadline) + * Get date from that Task + * Compare date from listing listDate with user input date checkDate + * if dates are equal, add to Placeholder ArrayList + */ + for (int i=0; i Temp = List.getList(); Temp.get(ref).setDone(); System.out.println("\tNice! I've marked this task as done:"); - System.out.println("\t" + Temp.get(ref).printTask()); + System.out.println("\t\t" + Temp.get(ref).printTask()); List.setList(Temp); } - + /** + * Method to delete Task + * @param ref gets index from user + * Print delete statement + * Copy ArrayList List from List class to ArrayList Temp + * Print Task to be removed from Temp ArrayList + * Delete Task from Temp + * Update main ArrayList List in List class + */ public static void deleteTask(int ref){ System.out.println("\tNoted. I've removed this task: "); ArrayList Temp = List.getList(); diff --git a/src/main/java/task/Todo.java b/src/main/java/task/Todo.java index ae04cdbf..98d8b6f4 100644 --- a/src/main/java/task/Todo.java +++ b/src/main/java/task/Todo.java @@ -1,13 +1,23 @@ package task; +/** + * Todo is inheriting from Task + */ public class Todo extends Task { - + /** + * Deadline takes in input of String description + * @param description description from Parser that user entered + * super.type - Assigns type "T" + * super.isDone - Assigns false to done + */ public Todo(String description) { super(description); super.type("T"); super.isDone = false; } - + /** + * Print Task that has been added to ArrayList + */ @Override public String printTask() { return super.printTask() ; From ac485433623ecd059edea4aef065017475cc39f3 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 18 Nov 2021 02:09:31 +0800 Subject: [PATCH 13/18] Level-8 JUnit for Todo & DateTime --- build.gradle | 24 ++++++++++++---- src/main/java/app/DateTime.java | 30 ++++++++----------- src/main/java/app/Parser.java | 16 ++++++++++- src/main/java/app/Storage.java | 7 ++--- src/main/java/{ => duke}/Duke.java | 10 +++---- src/main/java/task/Task.java | 2 ++ src/main/java/task/TaskCommands.java | 15 ++++++++++ src/test/java/app/DateTimeTest.java | 43 ++++++++++++++++++++++++++++ src/test/java/task/TodoTest.java | 24 ++++++++++++++++ 9 files changed, 137 insertions(+), 34 deletions(-) rename src/main/java/{ => duke}/Duke.java (58%) create mode 100644 src/test/java/app/DateTimeTest.java create mode 100644 src/test/java/task/TodoTest.java diff --git a/build.gradle b/build.gradle index 20c0521c..ffb4d09c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ plugins { id 'java' id 'application' - id 'checkstyle' id 'com.github.johnrengelman.shadow' version '5.1.0' } @@ -10,10 +9,20 @@ repositories { } dependencies { + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' + implementation 'org.junit.jupiter:junit-jupiter:5.8.1' 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' } - +sourceSets { + test { + java { + srcDirs = ['src/test/java'] + } + } +} test { useJUnitPlatform() @@ -28,8 +37,13 @@ test { } } +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' +} + application { - mainClassName = "seedu.duke.Duke" + mainClassName = "duke.Duke" } shadowJar { @@ -37,9 +51,9 @@ shadowJar { archiveClassifier = null } -checkstyle { +/*checkstyle { toolVersion = '8.29' -} +}*/ run{ standardInput = System.in diff --git a/src/main/java/app/DateTime.java b/src/main/java/app/DateTime.java index a36a5963..63aea6b7 100644 --- a/src/main/java/app/DateTime.java +++ b/src/main/java/app/DateTime.java @@ -3,29 +3,24 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; -import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.Locale; public class DateTime { /** * To validate user input String date * @param date Takes a String input date * verifying if date matches "yyyy-mm-dd" format - * @return true if matches accurate format - * @return false if does not match accurate format + * @return returns true if matches accurate format + * returns false if does not match accurate format + * parse date with format + * must be exact with format + * if true, set + * return valid as true */ public static boolean isValidDate (String date) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); - boolean valid = false; - /** - * parse date with format - * must be exact with format - * if true, set - * @param valid as true - */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + boolean valid; try { sdf.parse(date); sdf.setLenient(false); @@ -40,12 +35,11 @@ public static boolean isValidDate (String date) { * To valid user input String time * @param time takes a String input time * verifying if time matches "hh:mm" format - * @return true if matches format - * @return false if does not match format + * @return true if matches format, false if does not match format */ public static boolean isValidTime (String time) { - SimpleDateFormat sdf = new SimpleDateFormat("hh:mm"); - boolean valid = false; + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + boolean valid; /** * parse date with format * must be exact with format @@ -82,7 +76,7 @@ public static LocalTime toTime(String time){ } /** * Takes LocalDate date and returns in a new format - * @param formatter to format date to "dd MMM yyyy" + * formatter to format date to "dd MMM yyyy" * @return new date format */ public static String toNewDateFormat (LocalDate date){ diff --git a/src/main/java/app/Parser.java b/src/main/java/app/Parser.java index ffbfcd1b..9da853b3 100644 --- a/src/main/java/app/Parser.java +++ b/src/main/java/app/Parser.java @@ -4,6 +4,7 @@ import java.time.LocalDate; import java.time.LocalTime; +import java.time.format.DateTimeParseException; import static app.DateTime.*; import static task.TaskCommands.*; @@ -14,7 +15,7 @@ public class Parser { * Set enumerations of valid commands */ public enum validCommands { - LIST, DONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE, ON + LIST, DONE, UNDONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE, ON } /** @@ -74,6 +75,15 @@ public static void parseCommand(String userEntry) throws DukeException { ref = Integer.valueOf(description); TaskCommands.setDone(ref-1); break; + /** + * UNDONE - Get int ref of list, marks task as undone + * break to end command switch + */ + case"UNDONE": + ref = 0; + ref = Integer.valueOf(description); + TaskCommands.setUnDone(ref-1); + break; /** * DELETE - Get ref of list = 0, finds task and delete by calling TaskCommands.deleteTask(ref-1) * break to end command switch @@ -158,9 +168,13 @@ else if(isValidDate(date) == false || isValidTime(time) == false) { * add to Deadline task */ else{ + try{ LocalDate dateDate = toDate(date); LocalTime timeTime = toTime(time); addDeadline(description, dateDate, timeTime); + } catch (DateTimeParseException e){ + System.out.println("Please enter in yyyy-mm-dd, hh:mm"); + } } break; /** diff --git a/src/main/java/app/Storage.java b/src/main/java/app/Storage.java index 1c9cf410..7145b916 100644 --- a/src/main/java/app/Storage.java +++ b/src/main/java/app/Storage.java @@ -97,16 +97,14 @@ public static void loadList() { /** * if type is E * store String word array index 2 as description - * store String word array index 3 as String timing - * add Deadline as task with description and timing + * add Deadline as task with description and word array index 3 * if Task is done, mark as done * increment i * break switch */ case "E": description = words[2]; - String timing = words[3]; - Load.add(new Event(description, timing)); + Load.add(new Event(description, words[3])); if(isDone == true){ Load.get(i).setDone(); } @@ -208,6 +206,7 @@ public static void saveList() { Load.get(i).getDescription() + "|" + Load.get(i).getTiming() + "|" + System.lineSeparator(); + break; /** * for Deadline tasks * Store the following in String save diff --git a/src/main/java/Duke.java b/src/main/java/duke/Duke.java similarity index 58% rename from src/main/java/Duke.java rename to src/main/java/duke/Duke.java index 0f111350..5ef8c548 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/duke/Duke.java @@ -1,18 +1,16 @@ -import app.Storage; -import task.TaskCommands; +package duke; + import app.UI; public class Duke { - private Storage storage; - private TaskCommands tasks; - private UI ui; + private static UI ui; /** @param args to create program to run * Creating a new UI in main Duke & running */ public static void main(String[] args) { - UI ui = new UI(); + ui = new UI(); ui.run(); } diff --git a/src/main/java/task/Task.java b/src/main/java/task/Task.java index 99a8c267..5baa1bcb 100644 --- a/src/main/java/task/Task.java +++ b/src/main/java/task/Task.java @@ -67,6 +67,8 @@ public void setDone() { this.isDone = true; } + public void setUnDone() {this.isDone = false; } + /** * Method to get status of isDone * @return "X" if true, "" if false diff --git a/src/main/java/task/TaskCommands.java b/src/main/java/task/TaskCommands.java index a81696ad..f68c885e 100644 --- a/src/main/java/task/TaskCommands.java +++ b/src/main/java/task/TaskCommands.java @@ -133,6 +133,21 @@ public static void setDone(int ref) { System.out.println("\t\t" + Temp.get(ref).printTask()); List.setList(Temp); } + /** + * Method to set Task as done + * @param ref gets index from user + * Retrieve Task from List and set as not done + * Print out line to set as not done + * Print out Task that is set as not done + * Update main ArrayList List in List class + */ + public static void setUnDone(int ref) { + ArrayList Temp = List.getList(); + Temp.get(ref).setUnDone(); + System.out.println("\tOk! I've marked this task as not done:"); + System.out.println("\t\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } /** * Method to delete Task * @param ref gets index from user diff --git a/src/test/java/app/DateTimeTest.java b/src/test/java/app/DateTimeTest.java new file mode 100644 index 00000000..eafdb2f3 --- /dev/null +++ b/src/test/java/app/DateTimeTest.java @@ -0,0 +1,43 @@ +package app; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.RepeatedTest; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DateTimeTest { + DateTime dateTime; + String date = "2021-11-11"; + String time = "05:00"; + + @BeforeEach + void setUp() { + dateTime = new DateTime(); + } + @org.junit.jupiter.api.Test + @DisplayName("Dates should return true") + void testIsValidDate() { + assertEquals(true, dateTime.isValidDate(date), + "Correct date should work"); + } + + @org.junit.jupiter.api.Test + @DisplayName("Time should return true") + void isValidTime() { + assertEquals(true, dateTime.isValidTime(time), + "Correct time should work"); + } + + @org.junit.jupiter.api.Test + void toDate() { + } + + @org.junit.jupiter.api.Test + void toTime() { + } + + @org.junit.jupiter.api.Test + void toNewDateFormat() { + } +} \ No newline at end of file diff --git a/src/test/java/task/TodoTest.java b/src/test/java/task/TodoTest.java new file mode 100644 index 00000000..fb5236f4 --- /dev/null +++ b/src/test/java/task/TodoTest.java @@ -0,0 +1,24 @@ +package task; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TodoTest { + + Todo todo; + String description = "having lunch"; + + @BeforeEach + void setUp(){ + todo = new Todo(description); + } + @Test + @DisplayName("Should print correct entries") + void printTask() { + assertEquals("[T][ ] having lunch", todo.printTask(), + "should match output"); + } +} \ No newline at end of file From 4aa2784b8cf404993c0987d2c5400012d5bfc155 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 18 Nov 2021 06:49:23 +0800 Subject: [PATCH 14/18] Level-9 & Individual Feature --- .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../7.1/dependencies-accessors/gc.properties | 0 .../.gradle/7.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes src/main/.gradle/7.1/gc.properties | 0 src/main/.gradle/checksums/checksums.lock | Bin 0 -> 17 bytes src/main/.gradle/vcs-1/gc.properties | 0 src/main/java/app/Parser.java | 33 ++++++++++++++---- src/main/java/app/Storage.java | 21 +++++++---- src/main/java/app/UI.java | 2 ++ src/main/java/task/Deadline.java | 2 ++ src/main/java/task/Event.java | 3 ++ src/main/java/task/Find.java | 29 +++++++++++++++ src/main/java/task/Priority.java | 31 ++++++++++++++++ src/main/java/task/Task.java | 13 ++++++- src/main/java/task/TaskCommands.java | 16 +++++++++ src/main/java/task/Todo.java | 5 ++- .../out/production/main/app/DateTime.class | Bin 0 -> 1938 bytes .../production/main/app/DukeException.class | Bin 0 -> 275 bytes .../main/app/Parser$validCommands.class | Bin 0 -> 1374 bytes src/main/out/production/main/app/Parser.class | Bin 0 -> 3969 bytes .../out/production/main/app/Storage.class | Bin 0 -> 6061 bytes src/main/out/production/main/app/UI.class | Bin 0 -> 3373 bytes .../out/production/main/task/Deadline.class | Bin 0 -> 1310 bytes src/main/out/production/main/task/Event.class | Bin 0 -> 1060 bytes src/main/out/production/main/task/List.class | Bin 0 -> 1271 bytes src/main/out/production/main/task/Task.class | Bin 0 -> 2503 bytes .../production/main/task/TaskCommands.class | Bin 0 -> 3855 bytes src/main/out/production/main/task/Todo.class | Bin 0 -> 480 bytes .../java/production/main/app/DateTime.class | Bin 0 -> 1950 bytes .../production/main/app/DukeException.class | Bin 0 -> 275 bytes .../main/app/Parser$validCommands.class | Bin 0 -> 1527 bytes .../java/production/main/app/Parser.class | Bin 0 -> 4748 bytes .../java/production/main/app/Storage.class | Bin 0 -> 6410 bytes src/test/java/production/main/app/UI.class | Bin 0 -> 3488 bytes src/test/java/production/main/duke/Duke.class | Bin 0 -> 456 bytes .../java/production/main/task/Deadline.class | Bin 0 -> 1344 bytes .../java/production/main/task/Event.class | Bin 0 -> 1094 bytes src/test/java/production/main/task/Find.class | Bin 0 -> 1926 bytes src/test/java/production/main/task/List.class | Bin 0 -> 1271 bytes .../main/task/Priority$validPriority.class | Bin 0 -> 1243 bytes .../java/production/main/task/Priority.class | Bin 0 -> 897 bytes src/test/java/production/main/task/Task.class | Bin 0 -> 2865 bytes .../production/main/task/TaskCommands.class | Bin 0 -> 4397 bytes src/test/java/production/main/task/Todo.class | Bin 0 -> 514 bytes .../java/test/test/app/DateTimeTest.class | Bin 0 -> 1539 bytes src/test/java/test/test/task/TodoTest.class | Bin 0 -> 1011 bytes 47 files changed, 140 insertions(+), 15 deletions(-) create mode 100644 src/main/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 src/main/.gradle/7.1/dependencies-accessors/gc.properties create mode 100644 src/main/.gradle/7.1/fileChanges/last-build.bin create mode 100644 src/main/.gradle/7.1/fileHashes/fileHashes.lock create mode 100644 src/main/.gradle/7.1/gc.properties create mode 100644 src/main/.gradle/checksums/checksums.lock create mode 100644 src/main/.gradle/vcs-1/gc.properties create mode 100644 src/main/java/task/Find.java create mode 100644 src/main/java/task/Priority.java create mode 100644 src/main/out/production/main/app/DateTime.class create mode 100644 src/main/out/production/main/app/DukeException.class create mode 100644 src/main/out/production/main/app/Parser$validCommands.class create mode 100644 src/main/out/production/main/app/Parser.class create mode 100644 src/main/out/production/main/app/Storage.class create mode 100644 src/main/out/production/main/app/UI.class create mode 100644 src/main/out/production/main/task/Deadline.class create mode 100644 src/main/out/production/main/task/Event.class create mode 100644 src/main/out/production/main/task/List.class create mode 100644 src/main/out/production/main/task/Task.class create mode 100644 src/main/out/production/main/task/TaskCommands.class create mode 100644 src/main/out/production/main/task/Todo.class create mode 100644 src/test/java/production/main/app/DateTime.class create mode 100644 src/test/java/production/main/app/DukeException.class create mode 100644 src/test/java/production/main/app/Parser$validCommands.class create mode 100644 src/test/java/production/main/app/Parser.class create mode 100644 src/test/java/production/main/app/Storage.class create mode 100644 src/test/java/production/main/app/UI.class create mode 100644 src/test/java/production/main/duke/Duke.class create mode 100644 src/test/java/production/main/task/Deadline.class create mode 100644 src/test/java/production/main/task/Event.class create mode 100644 src/test/java/production/main/task/Find.class create mode 100644 src/test/java/production/main/task/List.class create mode 100644 src/test/java/production/main/task/Priority$validPriority.class create mode 100644 src/test/java/production/main/task/Priority.class create mode 100644 src/test/java/production/main/task/Task.class create mode 100644 src/test/java/production/main/task/TaskCommands.class create mode 100644 src/test/java/production/main/task/Todo.class create mode 100644 src/test/java/test/test/app/DateTimeTest.class create mode 100644 src/test/java/test/test/task/TodoTest.class diff --git a/src/main/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock b/src/main/.gradle/7.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..e22601313b4736e64907d10a2c56d9b75dbcef4e GIT binary patch literal 17 TcmZR68g-@b@t>`a7@z Check = new ArrayList<>(); + ArrayList Temp = List.getList(); + for(int i=0; i Temp = List.getList(); + Temp.get(ref).priority = priority; + if(priority == 0){ + System.out.println("\tOk! I've removed the priority"); + } + else { + System.out.println("\tOk! I've updated the priority"); + } + System.out.println("\t\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } + + + } diff --git a/src/main/java/task/Todo.java b/src/main/java/task/Todo.java index 98d8b6f4..fa56e57d 100644 --- a/src/main/java/task/Todo.java +++ b/src/main/java/task/Todo.java @@ -1,5 +1,7 @@ package task; +import static task.Priority.printPriority; + /** * Todo is inheriting from Task */ @@ -14,13 +16,14 @@ public Todo(String description) { super(description); super.type("T"); super.isDone = false; + super.priority = 0; } /** * Print Task that has been added to ArrayList */ @Override public String printTask() { - return super.printTask() ; + return super.printTask(); } } diff --git a/src/main/out/production/main/app/DateTime.class b/src/main/out/production/main/app/DateTime.class new file mode 100644 index 0000000000000000000000000000000000000000..25d64fac7111ad83221653f920dc7221b10d4040 GIT binary patch literal 1938 zcmbVNYgZFj6y1077!n83D87mokhXagVyjjp1lxjW+X-Uhq6@wanTw1~CNa5K`-}Ra ze$X%AvTOAR^hee1J2N!HBWs~yt+{j0oU`}7XP+7V`S;!50Pdik#R$GOadQZ_vM_L4 zU%t_oJ0@m_a5sxNRI->ybqEVt+{3pz@|}tAO)Lte=RMz33j&FJVND>p*mkABi0%1u zWv8_%yHA|WCL=k!-Ef*~PS?}>D40~+UQgh(?Q}ZjB}d68UQ1R4PIz`6!A63hbi7Fh|waiw~8YQ~|Q!%+= z_5!q15u9oe?f%i@9|%m~G{0>6mjKWGv_+9CU6y#j7$XriX^#8VV7}*)uh8G%mHgJGJY+<9%c48b0!!+ z592)(5+){17(AZ|(;(mV0m6qqTzHw}Hz<6T!tYYX9K}`1S)rhLN?8~neCnfwf5vu& zcHQG@@Q7ydEi!iLHE%=1^uH+J0aE-HXwxo)X;G(A+pQ7Uktxljh${G>SL4H}KVewq>Q* literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/app/DukeException.class b/src/main/out/production/main/app/DukeException.class new file mode 100644 index 0000000000000000000000000000000000000000..a4c05669cfa57c2c22e5971a98bc5ff24f54a005 GIT binary patch literal 275 zcmZXOyNbeK5QWdgTr|e}6WFPRDJ@oPyi~zPvHy)f`fD}`FqD`AU$03S-61X&Pg z;A74i&M^1K?;n5>nl?(PS*TlR5X`X(RXQP*di@PSpGG@LXm~1=%j|nAleO3e?6kee z7r{m(D%USlPY>!$=y)QI-C1^$^NTOzR7K$z!CpmK;>(39;&0pGQTzx8It)VVBg+T# yy&H&d@BUvz7aBjF7jbizX|i$)4H$zP=*or$i)pf*v&?jg*+2z0D?*j2!Fd9XZaK>U literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/app/Parser$validCommands.class b/src/main/out/production/main/app/Parser$validCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..c340b89b340290fab79b09d607459adaf7b9a3c3 GIT binary patch literal 1374 zcmaJ>YflqV5Ix&2-R-hKDew0iTb`nTk5(+uMXGCyStM!vw3HQ>v|G{#@n>mC#9%ah z_6PWLj5D{5lqhVIIX(BDojEi2wm*Mg{s8a@Z-S8VOv47AD~KpaXc)vMhbJ=!HS)=x zU7)n#e{<0&;;!dbHYD`^r&KC>Kx3(VaH*T1rCOp){s?cV@m#*~@bnJ zw|m^6W6-Q(wUl#qT<*5DepXA|C?!oh<;rfcTv6~^$34DO5glpJ!SvsDusRm8r{e)0 z>KMYPjxi47940tSa+u;U&0&VaEJh`?Uk{gEldusrt_Emx3P@4KO2 zrWL)e!hNiWeVRI{xZ(=@^Z}H)`QZx$K8x+`g2oh2R=@cZa3eqJ=cc`xG5v;c%>=Ud%R96m! zg5RmKzeZO+E7#C!Wm{@!v$BC2I;^ZxL#LHhYv{7FAzJDoptU{%S{$&>A#vyRL2EP` hpc5YvqOR)QKE@MT^WiCC0^=AV)aVTvaSSI0{s0c>5tIM` literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/app/Parser.class b/src/main/out/production/main/app/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..3409639df566d21e5abfee047b7e1eedd19f0f78 GIT binary patch literal 3969 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 literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/app/UI.class b/src/main/out/production/main/app/UI.class new file mode 100644 index 0000000000000000000000000000000000000000..3e9c2fb3a4b6ea8f943e2e06375b5ab9773e5e1c GIT binary patch literal 3373 zcmb7GZFdvL6@J#1z0!J9z=XHZCSwD^uZSior8ael4Gt;-JGG5Vu%nEnv9x%#D|T15 z)w&_1FG&PNSmta4f3aO=Bw!*F@EXXQ00( zgHQzq?7XbivWxL-+CVDrgpq+G`MYvkX6upTX5R<`+0bk*XO^6@C!>0x3=DUZxs;D& zxRqVzFg-(s{!5PML^B3@M@DZEe$FpZ^+4Y7)XjQzLj}un!zE`h?-!+eO9qafH<_uZ z;)Dj$v56}=!u1Aq8gEcRB)hxPD`#)kU3bxUyhsICcZ;ePIlf2X!?E6#`j%?vjKxcy1|@#jP8%7DvK_&nT4WNZv1#Ou6x&sl1Z*&VcEu9UW5c z7u;{0w^rUTlS>Te@ug9Pb%8x#%hxDxq{P zg%sP;bxOkVYW2u6ao@)Kcwl1=<2F9P1KOsGw>3C~fgjQQ zJSD6>AqrxRKmPBDy;!Os$nN-NMOKSxb}W^QLR_L&A#3ev?5tQT6ebE>S}Tw$>{$j5 z&ia1DT*}%F6;=FFc%UD@NaL3_euZBf7{8`m*Pjr%vsIx3V69eUB=q461g+ozRI`o#d$)V93UYI<6n#V*}^4RsYY&Frq6f*RP6- za%-X9RQN$zdJc2RNzgP*ZEiY6hskvt6Qb6UYHbxA+6kwujM}D%xKmPLF>vD3ye_iz z?oQ-X)w-35{F2|fY-LJHmh`de^G6yk!OzHdxjc8?j zug$PTq*zhKE#Yi7qg9nru_8*6dz2l9#L8?mnqWNnLdTm8R-b^C9P6c3%L^NKRgqo1 zjg_<_0|Q!oDe?nZW=BZ7zAPmjzg@NwMymSs5^(%%P9H!*C|PB5IzE#0tY;Q;Wzj#dGVPPn}J`o3YB%50x@wXHrPQvDTWTaXddtKox()on!0A@j9dFy;QcSMC zbdqi7Ws#|FnD~r^lK1_sdW}}*^d&Rr$}m*4lM09YyNe!t>b#>Fs11OhWJoA#b;3uzr2@X zidP+YUBvV#`bqO%Bq?2n0N#$zmI|OLHiM&>wV?s{N z1svj~n#Tf;#s7uo+{f{Fejg|3gZBD8yu|ScXGiJNamoo&LtGz@BRoQ{Uu6s~Fp3wc zahb81!w-l(PxL9g#dpJPT*4aX1^f__k#_jra5?uWeGhN&@i2=$&hJz60j}UNDZUPxA;X`K7ukWy2#8iC(V2v z<&IP2@kv3QXpB_fnnm1%{Tn91rq!n=kJ6~`}l$) zmae1~BI!yxIrzeLCUWcxoCKImoz!o~NgZev)lnJ>2CJ8D9l#RPv5Xf8@ua|d8S=|C z6UZ=7Pquh1E=3lr#{5o<`C{)rUedTmoVLN(*>$Ax4g*pk_Pa#jo2_Z&nI=L;BM2h2 xRFgX2q-vQee0p_L8S0`^rOFOHxk4*?n8Hu_Z&CSo_#=MLf+=#I=Dft8`Y)?`SX2N2 literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/task/Deadline.class b/src/main/out/production/main/task/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..c6b0983d374af994f41c9a5ab167473ac2b0bed1 GIT binary patch literal 1310 zcmaJ>TTc@~6#k}n%3`rnxd|36+Af!RM=65RhGIy4`7Z2T1>kKSL7< zh6jIuKgxJ!yT(ErANI_-pYNPAv%h{{{sgdwN)n@(PvEXTvm-aBIA7lP2v4A8^;wa-fW;Bg@m?ihHeMMewFgafE2J zDZGYjb(AF?hGtoS&U4Mw(hs7|`p+;4WYA{UX3xho}B=_Zs+YmdJ#ya*F z$*LZffg4z1U=;(aSTRtdVFCKF19U%NV2rpB@i&knI!@9V$q_nd&7})4Gab4>*jzqG z#9TQ?)C`{^_RSBvNpuD=qEm=snv%{?f>~s6hqyWTf0AA*+`H{CZM`~_eaFI>1-$>N4xZ(4I}ip*{6ty=F+ zo^baatT|X`$h?wDn%4}Q#o8%9=jDK_lXBgJQk_)BcS^?$6II<347r+A;=@_DA;Kfx z2xuo?(@h>6^HAD2-kdOP88LV@!=q05;9MwEVVG`-s2R$hky_crvC<4FZWyL|B*Yw1 zD#Jptl!SBZ`YddULunB55T2q4WVG&CVSXiOR z&C3ESF)Vj^M^v?Ha`Q==HhGcZ%22oV68OjOp3n{lkF54*3~N^{mFiq~MEt13dWXDe zba>%lmqgaI?ws}Ljov9G!fL>yNRWuHqatFCVVmA^)e1zkHcU(ylM$`|Bpy+F65wA( z@E;qeqG>9lcZ(^iJP7L2h>C+fhV`-gC23<={XY(OVSftyr9g8DkL(OZEsE2$F8N!1 zFh8H_BkgbZG2y3wV)FX{KWoo1N!BAfL)o*KLyiW_TA(mwpy(P!7MsUB@mp_!JX?{5 zF|N2bh=EzZkBt8V&Ly(IH$ta~7s$k!mf5N#WXzn#@&I)mPib}O>@l9>306n}h=kEC H8SecBZioJp literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/task/List.class b/src/main/out/production/main/task/List.class new file mode 100644 index 0000000000000000000000000000000000000000..5eefa95edcd2f580d9aeae5ad491286a53b80242 GIT binary patch literal 1271 zcmZuwZBNrs7(E>uT}ycvhJrBOw}DheMcD*#0wGyMGlJ1?Wot%pYnQGg!QbQu#RP~Z z{s4cJ@!Yn+X7-`?_CEJH=Q;P>=l=Qo^EZGs?5gNRMuCPU6)Kh$JitmEx{8N*q~bAF zRXo8{vG+{InwT>(p38V4AzH8+o`jLYiE(P^P0y<8Tdr%IiEvheQnV_z;Wb@T!c3=} zT){IMpY;O{*$o1^bCzv+8xp!w=|j@zoid^Q15kWW#lxx1f8E$b{#Kic`M1i#Zxm$6=pdpoK1?WT9>h@;T5)Iyw;G% zu#7hvwguG=79zEZNyTp}AGVuIT$mCuYgZraws-@VWeG@vPyQ zH3FRGZM#{H{?4^*ujsj^QDgT6#oNR5rY@4I_J4(lvh0d~{e!+dAt~?FYKC2A7pXof z?=)>;wo$L^MbB}K3QdeRj8ii>OteAMG0nHr%eO?7FqHEER}l=NoB#Bg;~hqH&JyQX z<`U9(KV^iYNCGKF{n1ZA0%Ke$xQlxv65#C{@DD@;xC;WTavMyDa@9&OP94AmKP{+< zaq2;+>^`X{F%?oz_!&U-9FcF#p;H_KSrZ{5NyIc}xF^KCCsGJa5Rth+*N1aNhhi7# zzJh#(`0d$75o1~kaimFFMm=NHtEm*@%YX$ABWo+3#E>3^=D0R8{~ literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/task/Task.class b/src/main/out/production/main/task/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..675a3024c5504cb0aec586ed3e63e97017d8e93a GIT binary patch literal 2503 zcmai$ZFAd15Xb-L2g!DoxOMZ;(gy-0C2>j(r9i2ZKJPFidTs%JU7RRPWNR$a#w5Ss!S^}I_{O<4!DOY0q}XgwJ?lGdy=+_tn=Nlm^P z)+B7VNX_Ua%dymoKze>*gRE=r4p|o)mSaBXA8ebwmfW^UQ}US`vS;x+RA$tk<eM`RUK|EUbX<;1^-~=q0hJ z11Lu+kYMA7FOct2y%ncXpwM*ty|!7mIQer^-)yU6svxHVXNFc`IR%XEpx_(Q=1{2FHVb$R3NW`Np3>ip zpv)Y|j#+b^wp5QTwMR2gNk>tK-HY~4Si8|`j%pH0uHy-x?5V))Fiy)kbUSAF!37c2 zWm~zu=Q@6&kEG$coqm^&vF12tuVzcnGbya!qG5%MAc=RSvtygyY~WZOjVz)$=E&WZ zV7?Wx4^m%^o-IVwq-{4X`s{T)6PO!0Us7xWm;c)i@6naTHzFhZScfF?^F!wVrU%TGkf|{*J>(U9-#KJ)CBo7M zER8=sBGFBh%*w=BSBdq}2`o+>vnDY|lFzyv#+5HGzC!jTv>`4?*7XP~KL{&Nh$}wo zJU$Fjx1vYXKB2X;9fc86brTibrmI{9oG#%-u`w>hrOwm=c(UCH4>r@PZYbP^L zG1G`MAN@a*ZqzW&VYk0Pib>IKe-a^O!{`KG%n8ovxbw3_=T8!yGjV4#(fK+)O?a~& zcivBQzJbpYoO5w!H_`d?LD)-FKW>du`4z_K8KA){x#zq-^5Qe W7KpTopRq;1hHJFW(fS@e_um2sHL}BwHe_3X|PwcG$~oXJ&)J zOKVGumui(>XsPvrmwLBUo1~yV`m6te&*MK*E$Vx|naysJt$ko;<~!dx?|067E;IT2 ze{TH+z zeKw99Oj$lI_H$9>qp;-hLIeeYE+(L%EKhb6l{lV&BMUbU4^>f|kK-b~nBdc;1VXqZ zyI+ptD+z>UF@q9&{XIVbXHFQ4O(aYp!f~ zRmaq@yP3}6NzZT#sSGcpM`_S@*eYAzQ4OKK{xgJ6+c}zUoV3d3RJAl~IvHcONJ(PS z&KkuthGWS(5Qe?H%t7Tm9uTL3!<<>eO*P_k;&NwQEsB3Ff_y~jND7xRf#617Lqj$n#JFQhRv%v zUZ~V~?wIzBY~iF)33%^N#&WI?ur-KojZeZwn`64wA`gicd6pkRESop81^>DIRME(q zdApc19p=n6y)jz|3-?WkdB`yzr{_7dXnOR$ zG^tM=eduTCeg(2LME76>&*->}XNjyfRJvv7ehnQ;QcI%i8b6>UdEMlCezQbj+l|U)fGto>_8} zRyn!AsFK2whF!4}H4QIsCdG%a9_tOxE95$a_nn5uHzb0Iu^m}I=+uL zbo>B6jNnH)evBJBeu6h5_^FPc;pb7jDJH*&;+Hxmg}A-3DJyI4N>1#bHlr^-Yezr*i2j_Bw` zp*fj17@Ah+RY(@*hc#>|83i+Km$Qa9V|jT#xt>w>IAnTQkn7vMR%okTpa-f$iX1EA ziyzmPz5rm|)C{}6vs7Jo(8IGA%&Z!%3Nk|iHEgOut)5n`F>N@h$*7uG?`l);#k&j} zorT;$vKo=>UGs^mQB<)vzy%KVKkCQkxA97BYeqngpVeY!K5LgMY=I2N^WMhkkw1c~fTZ`LHHl13i*tgs~WpkRj+-Ol_{NDVSicN~cBemh|r*HSDS9 z&nnN`1v7Zl`NceLWIfwih+vUvowV&jl`nC9qFgqebkT5KlUaVXF|+`~A8IG~N-di1 z9^Wu{M>UpS1GlRTrL>x;Kh~gME2jog0FgF|#c9q*j@%_y$-4NO`KDpV|JTDVeq#0T z(}}NXc^&XRz*P$d5#ux89lQ=xa+DuK8txqvh-pLhm4aQ)#Dom5(Ao=XX*k z?p9AqANSy1u44EY4hC2w0hWFnt!IhXwv5PHoGoa_)&?9MAIBkub06*xaE|jVIkV$7 zqGtyNmk?_Lw399+70_m1IRK&=K0!z}A4V`5K%U~4W{8j*ZX-^}p(V68!R(`LzrsxV z+AEkFa2Q93MFdjz08fnJlPe?+Di45-Z$n>3$1N&h5gR3THXpA(hbhYMrs0DthJOnp z9bZQ0Lj#NGx(=NfiG*0oLpL8nhkIq~26j`@8$LhKyNFGHMb9EO-@+Dk(q&D1^S}R; z^TO)9eLMx^GfXPlNkcb@*u-a(!IR8mLg}xoEmSdFjgM@df7hsG(eMK_J z)p7ndBJ@5sMbPp-V%on57Q;9`MKuP^#=BEt0x>jKU6=t&Z0p6qt4=Kat2H>sE5f!hAcjUUYsF|=g84{mV|)`%;FTX z+{y8J4i*Zipok|?!c%bY0$jY#KSCCH{}bjF<0lZIO*c-E@m3;irBb0?y;cZj- zf0_71SZ#H=~xOT?)V^CnaDGx!7VaY}CD d9lVXZSPkGfYGp-etO&W5)OA5!zof2T{U05Yiq!xB literal 0 HcmV?d00001 diff --git a/src/main/out/production/main/task/Todo.class b/src/main/out/production/main/task/Todo.class new file mode 100644 index 0000000000000000000000000000000000000000..0ee30885f6e453da608ae05982d35542066d65d1 GIT binary patch literal 480 zcmZvY%}&Bl5QWc_7ARDql^_3&JE)0Wy1=;6xN1xc4GVV#8oXM2Nn1>OD_s~87e0Uw zWt>|H8@)~D&Y64Wn@PXEKRyAR;i!fR+EsMa-8DIEt8Ax&-3s;y<#UmU{DRQ#`48c9 z=*3|&^M-jUlG&g?BIuWL8W9@4NTQp?(>O|la2#{R@#Q3pM`0?IUKREHUSx#2pNH9_ z7s#m`u$o5MBo*^q$VB!1nL{w=JTMQqiO}lx|FhJFa*yAa22 Pfw79*SYZfTg{$=g2(eU$ literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/DateTime.class b/src/test/java/production/main/app/DateTime.class new file mode 100644 index 0000000000000000000000000000000000000000..4d51c645cf2e7a78325acfa92540dd1c0202a2ea GIT binary patch literal 1950 zcmbVNYje{^6g}&gY@rY^CD0H^2#@+fFoi%;LZFZk0>~k)GwGCXinRfOExY!H(qGgs ze1I>3ff;@Pzlj0PN=mIfJO!k&cK7bR=bpXiO8)Ta?Rx-IsF@hVMFW?zm^6{VW&OCK zA5#XVv-ritRm_;UhS@Bxo4A2rwdJOPTL$I?GS@ucQ`ZHOh2p9}YOdu&Tc=kG-zIe%oocEAx($D_&F12<-E^t4_mnwMpP`!G7XA zb1DtTe^jZdj^{s`DLxcPKhr(}f^$K?;m}RV=c=;obh`5P^SW#+ujLam3t9Z^nn?wvVd=+9;!d+mIeNeTQP!f*Ipz=}7az=2-R zJy?4p>l7$v3fr(xZ}L4zw{-)uNd22&LwSv$V!B9Osch+c(r21f;h}z&4uz-Nriwr% z4mkJN>D1(38`7`KnMkl5GVaFF<^Lue9YBubJwE;97Ra^MmmNjreSzsX)vfpT>zXDL zX6RuAr|Oq>>*(?T99cex zX#J5~h6#O)`zJUX;p{l?(IE9C(zGY(HB4g1g5L<&Oi7;;98JcKVvHG%b2s!m8DJ+q z>mUQ;1~-HO<0BGO1gHAY&weZYB9mVv{Y#`UNt#p4cbO!wkjnJ`(m(y3^v~dIRQ($q z6FjO>dV`!@e#vPlp8mT6ZnAc_0vbc1TU4<$S3jY^;2er5?Ez-)2D?YF``f@m{vlX7 v06T|?2yC7yGzBZa?+q-wRNlnEPI@&q;z|tBBE14*GQ7`6ZFwO$($8N2-a)2& literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/DukeException.class b/src/test/java/production/main/app/DukeException.class new file mode 100644 index 0000000000000000000000000000000000000000..a4c05669cfa57c2c22e5971a98bc5ff24f54a005 GIT binary patch literal 275 zcmZXOyNbeK5QWdgTr|e}6WFPRDJ@oPyi~zPvHy)f`fD}`FqD`AU$03S-61X&Pg z;A74i&M^1K?;n5>nl?(PS*TlR5X`X(RXQP*di@PSpGG@LXm~1=%j|nAleO3e?6kee z7r{m(D%USlPY>!$=y)QI-C1^$^NTOzR7K$z!CpmK;>(39;&0pGQTzx8It)VVBg+T# yy&H&d@BUvz7aBjF7jbizX|i$)4H$zP=*or$i)pf*v&?jg*+2z0D?*j2!Fd9XZaK>U literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/Parser$validCommands.class b/src/test/java/production/main/app/Parser$validCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..7a7242adf3ea2fd6d2f1754078f3753829ddaf63 GIT binary patch literal 1527 zcmaJ>YjfLF5IwRL>snSC)lJ$aY3PHrwUaa^P|Cw0O&TkWsjx%j7)0TN;)tM*EqDCr z58@YqIzt&4n11FT@r7Y`ogvQ9MxNQ@vv=?Ap1oK4>!08L1n?2Q%R? zYzl0OY?jz8vsqztkIgEZ5*9UFIGr_%pgvD4(oJc#yD{}UT_}#Jtsg!MTLaSc;rRUI zqL#o>VM%e@1H)V?4o5F`5+q2P1WA@4DH9}d zfIY|4q)Ixncpo1?!+m162>CG+Xulx!8tI>iksPuaS(~Q#2lROu#otFtyk=fs`V|we zp>urdO#H{>u|`q&1fR+}9S%it#Wkeq2N+As*Ips>vn-F7JKb*JGj1Il67vuWn|L^C zM4KTY{QUhpbU$yTUqQV@R*0z!$qBJ0giH##kP$K^#5ROn6p~j$E(w{oM{zU4E}sNm z5q8xcMa~MFv$L{qUf4C;6t*Dj9XluNx^4YIJ*E?ShkQLj&hsY{OnQDM!IbA42`+lR zN^r^ZZF0>JknaisIcEv73FZmth!zNP39frDq4D5G=Va1kff@XWX&TCCSX+2Rz7)1m R5p?h_p-DS*IJmVr`!71XEVBRr literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/Parser.class b/src/test/java/production/main/app/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..8e85a0a194c353a3e58e117b71604202476f69ac GIT binary patch literal 4748 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 literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/Storage.class b/src/test/java/production/main/app/Storage.class new file mode 100644 index 0000000000000000000000000000000000000000..c5864daa99513be4fc11168dc32baf1001a2269d GIT binary patch literal 6410 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 literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/app/UI.class b/src/test/java/production/main/app/UI.class new file mode 100644 index 0000000000000000000000000000000000000000..cff1c0dbefe484b8a6e96418ce41fe955bc5cbdd GIT binary patch literal 3488 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 literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Find.class b/src/test/java/production/main/task/Find.class new file mode 100644 index 0000000000000000000000000000000000000000..5c415d217463c64ccf4689fec580a212bc03f7fd GIT binary patch literal 1926 zcmaJ?%~u;$6#qSv$s}R;Xxf0-O4CZ^qlNg@S_z_U5CH?UCW8G?` z3tf3!=t@1Vy6IXMsi&UfaqYsr|BA;W{$3JF5KfcKd-vUs-`wB5cQSwc`}j8iuVFKZ zq$%_7sre?zmX!`6%$uY z#PR>y>i?@w?pD{h%z69xL3F_hq&!z0GV<1+KT5(|74EJE0x8HRbxAhCbvZAY5LH z0*33=>PjGCR~&n*1#9HBO!!t{UAfill^~Ei1vga8AX;*^YXSoYQ{JiVrG56OxS1A- z5}D*?3DQ$k(%xE@wI){+a{|etUk_|&-qi(3Xu4B6a|k%kwkaQrQ)j zF{9(djO%4~m{X=o;wIKCtmBlxL}FntL{*%p#Y|iHK&Rb*)%R7X0$E#jRK+iceKFjK z*Ku_3WCv+<#y7tmK*EwWy+xL`oJ&x9jSC;=jxouQ!?WDRBDrcJkzMjwaEV_R78pm9*4vySrBCUZqs3zN*cB*pt6HQ4E zLJ}Y1BMy8*Ol5??;I`ay^1f$FweG44rBF#vG5^uA#lzL?tU~)qGx4$RpDi%5-!s>{ z?{7Knhp`1eFKy)qJ0@7$Si$$V>U?;tMbBgVsxk~6-t)W8nzb=nqp~2qa@7e(T7kL4 znRRFm1eW+f9^rng!+)>v9jZ1&URJ9`S2;NocLmNJ;&)VT0>e-D!x^ObAFDrI;M5|` zb%3WVcfsA5cm(lN(>%yE)>Ovu3}vh3fFV4~QvxS(iW&xs9}%S|@a;qcUCX~Ba^n%A zE5E>)jz%sSX=5nbKhAR~4DoRH&q+r7fZm^B zrFt6ZeTd6i?4#I3)aC~mp)PGi?@aE)_CLlkfNo8gzciC5G?Q8MaZSQNH+sk=#q~6L zF-iSJ^ka_aC6?woi*lP0Wpb{O>sQ>rAyZv}1(@`Ij^AN2Pc!Z`GDO_OL|bAFSmI&& z8u%J#DRmL|OFWMezN}LC9Oo!S@d7;tp4dj8*hXm^qiqSXUEUyO@;%4PM1()~XBSgV sWmDIwHeej^1&;lLr1+ch5oV{`eI6U!lg#`M*-3JnuT}ycvhJrBOw}DheMcD*#0wGyMGlJ1?Wot%pYnQGg!QbQu#RP~Z z{s4cJ@!Yn+X7-`?_CEJH=Q;P>=l=Qo^EZGs?5gNRMuCPU6)Kh$JitmEx{8N*q~bAF zRXo8{vG+{InwT>(p38V4AzH8+o`jLYiE(P^P0y<8Tdr%IiEvheQnV_z;Wb@T!c3=} zT){IMpY;O{*$o1^bCzv+8xp!w=|j@zoid^Q15kWW#lxx1f8E$b{#Kic`M1i#Zxm$6=pdpoK1?WT9>h@;T5)Iyw;G% zu#7hvwguG=79zEZNyTp}AGVuIT$mCuYgZraws-@VWeG@vPyQ zH3FRGZM#{H{?4^*ujsj^QDgT6#oNR5rY@4I_J4(lvh0d~{e!+dAt~?FYKC2A7pXof z?=)>;wo$L^MbB}K3QdeRj8ii>OteAMG0nHr%eO?7FqHEER}l=NoB#Bg;~hqH&JyQX z<`U9(KV^iYNCGKF{n1ZA0%Ke$xQlxv65#C{@DD@;xC;WTavMyDa@9&OP94AmKP{+< zaq2;+>^`X{F%?oz_!&U-9FcF#p;H_KSrZ{5NyIc}xF^KCCsGJa5Rth+*N1aNhhi7# zzJh#(`0d$75o1~kaimFFMm=NHtEm*@%YX$ABWo+3#E>3^=D0R8{~ literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Priority$validPriority.class b/src/test/java/production/main/task/Priority$validPriority.class new file mode 100644 index 0000000000000000000000000000000000000000..2af9e2d11a28adaefa1938d1184ad40049302bad GIT binary patch literal 1243 zcmah|?^6FO=(K=REI$*_Hgg+=txY1$7ar#Yf&^>X0-_+G&u*_3w{jJMsTb#vX)=wf zPRA4HVb%4-9&I<8%69qicNQ){PAH@YM#zZ6)E7x%40D^<7Ly;Q~b9Ct6BI7dRX z*r-|cZOe0*?UYh=tpj3?{!K@%XB^k@X`aLXs8%Q>wrME-D~Fm2Rh&K7@>?EJsc{)G zGPU|?x)Nt-s-r~CZ5?F(D|eM1AY5s*yqf*U;of`C-f5m27cfe8)6X}WzK#bb#(7~T zOk}YpF#ex+H8F#SCaz-L#3;u2>zauuhD^lx80KRHLjsXM17^9Tpo^9^p;m9Wq--#r z=xD9Hvv1dYQor0eG`V!?4%qKE>#jn1vCh0x7)><0KpVkNZuu~{0p}sJ|b`eF@K>jiz_ltgC!I*BE3FM zlU~36l@gUUty@)X!>m+;ZA2_G zh#Nt=h#)8~`UCtW{sdRm?@k*e8y&dkbEMa*8YHztU2skgRbQ{(!U65!Apl288fi_qvo{79Y!3#JKI*Pwd&6W z#7Lk#n_itE$l{3Oj>Z9VTV&q}to~8k8igIBxX#eXbKGFsOdv;O^ObdMH3yb^*z5$n zK9n%T9g}&yGaP$;`;jBZNKNZDWraXu*Y<<9EeG|JNFklX4QwV+L7oUb^U1RpQnw#I zpw@dkt;ahwK%kkC1!AGU$2|xXXYOX_6R7n5Grt}Z=U$g<^?&DL1qL61{8Y&aY03<} zCN*gyvhfw-GYtioDD^O?;xg^zc>=PSqZh+Ga*W90x6F=EuYZGLHcs!UTjkORgsQ}s-4=*BhXnN^G>MHX$Ws@1 z(ooM3i=rsR{4Zj}SY5v0;!?{&YK2dfAf8;l>lvic+&orHIC)^j#F wVl85cy;hmOM%=%%*W_PjrsSYQD=CUX+$DMnmbqGxDW4BF1xjfdNZc>{0qiEO)Bpeg literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Task.class b/src/test/java/production/main/task/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..2e6f99feb61e6f83d1340dd0fbe885f16a0e7413 GIT binary patch literal 2865 zcma);-BR3i7{;HlAKBdoXrVw6TTrPki*`X<(LzzWNTDumEtIy>YQt^{fsm}5zzj2< zc@ugCo_JtqN_BeR1$a@8&zpqZ5JGi^{J-B{-jC;>(QP66jJmq#ydN>h<$ zzJRZ=AfsE-EK0K^&Fvh%&Y_yaat?P2T(~REy#l_$eHpFvkoi!>BNdMooT(dbt!Xwq z)3FuwRJZkgy=>|BW_iVHn)c?jf~@JzJGP-f`Bp*NJ7{p2^~_!Fa$eUx&ievGt{Ua4 zQ`4<^F4HzGD+$}HT;_JJ(KMZ==^YThMCy!bo8GK~RB>#L#ucYdgzy%G%7|}34bE zC2HXjpAk_{bC0OZbKP$fI}1IB z4GlHa=}1ctJldA`-HmOd<{euKlCI!f`&1|a1=>a+k~Q5Dml!-N(dnbxDe3f+(Vq8F zHYbZ(fPv@qYh8KDKgP+N@9H~7#j$I;_t5mVIC4GR_9*8kQK5#aIEnl}D+!*c*pwu( zbffK%O?%(jF~aK~__UzcJg0e}VwZQc>Nq=l4Q6D?wvA@R(p}e}qd!L-4H-c_7InLB z8SZFcIQ>Rnj~R-R6OOM(2tgI6qp^jEif&meCO<+dc)Kp2h%d=E1()7@j!N$3rx;L? z7D02A76tn~we9zmx8GCGeosmJJw?vG7mC~mw(oIPX0Nc%l>UJ7f`bl>vd#L7gSgDG z797C)_<%DpF0vKl1)lC;Ul8Nc_#rylgf67GGfekJkf)81`h(LUiFSSn;=o{wIU6#w z!b`Pz1>d%a48|g?Y>SnZt4)%^+kNEUF;+UxDw8#F3QJNbtO33)i1kM3SH3j<3YkM> z+qfWE*CMEV%dI>SB_B16@ep;r72?n#)Hr7sE7ABfe4g;;T-^AF zMC0q2PB6~LjrS9cXK*9ISp6-QupbkRXIn8>_z4nK4whb_i;t*7{S#+7Jog&>Uo`H` iPZ8i?Sb-G2@L&5Sw%Hd5+=2y@-<(y>bDTfmv-U64D(!6m literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/TaskCommands.class b/src/test/java/production/main/task/TaskCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..5dd890371faa96ffc17b51b518bf12438b7d4524 GIT binary patch literal 4397 zcmb7H`+F2u8Ga|b$zC#$3j`=Z7?4YD5U7fhP-sa&(uP2r08+eUvO6V1c4xLTv%%C$ zRcNVNt@d8LLn$g&DJ>xdsjask{11E{|B-4@-|x(9c9U$&)91;~oH^&ayx;qM=Q}6= z`0tH(0DKmIPoo9L6Zm2pH8`F^7rvChm(!@lSJD`TnZQ^YNn{eprjdq~!Xr2#E91@7 z&!v%vBcHD57m|212~UQ80)dz=HbcWH8GSX0sWcwL*W}~tX?z3U6v4;S_!hq1%+cv) z#Bf?xpGe}#X2j)V6i>;_ca!*D65khvr&Ij?K@vYq;+X_~q#-_H7wtPpE@nGEcH7qIH>~r&Z)5-d@oG`Q55jX1+ zY+HyVXF4akhXc=cPV|bi`mE(=Ji8Fst|J~)NR>hwk~Fe+(sBX~o2pn@s3LZ2Op4c2 zv)?kaIYy#k_lGJ6cHZh%!S$Pg)f-wYPmXX|fvp>x5`kIj%OXmTOpZ;7a1{Y%Lqod2 z$b&w&DAAJm$=|f__&Bi?7Lw!pj;O_qcB0 z2cB6tU-Yn%=y(H{6S%75O}v%FHBp&P;<}Cpg}4o=Av+fu|3l#!kVy>x+mEp-+4~04_#U@L6lwprMeO65Hl0uhiIC&;n+36?Ofa2q8MDG<4so1+a+CfSWI1WA%mFja81Ds?2V? zQ|p*#y2oIIsT5sEs}3us)cxlbOw|2l!zS>Kbd5i2SYOVc?M%88R&*YR#k|kV1gN)0# z#pkCuvx~Pljqk>e>(DxGqUP9j#I7O!hLZj?pK^->7V(1DgwJrKhw|9Y`zVmY=ddHP z)f3s$Z=&`X?bXd7G2hM#`oF8fj*cGmDmy!IPh@8=eJP(ekv!JXc^#=Lh71B(s|+oR z0EUJH>Mok(=EH8>8<{-BD{_o(7T-jgCcCbqzKYFu>UJobMkpPDqaN&oANuJr zg}t*Rb}9rw!&T@rSagFzm_~!duA$7~R?csu;=WnM_o7Jm&7kptj%hTVgH9XG&7v)X zB^<0BbFJNBc44|H5EWu7J zWdN%Pek0-U=6f%3NIr$W)!2m3V?WWxDJAs+4Dctp4rjLV>wf+k5c>d26R7zBDed1h zmcj!Vq!^1yyF%eQ3f*EjgHbIV=$sc;YLLu4$}%1sxT0twSA~ zr?F~#ZAk>RY)K(eqf(rIvVnw5#m7 z%%Yh5XPL!^$Qf{uK^-C!hsoj*wBjgP97P*UaymwqGF;7a)#7LrHgYKN->k>s@INIV z&mdsqDzY2`p3kQgJW2OqjDtq3)i+X4dL2W&Ple`AaNV3m@WR@=A8B)^u3STWw*JPwfE7^>^+Ew!tCK` zLXd5Dw`8w#WhpUh$yoC`)*;{JS(5fi#ck&d)(d4ZRd_2^{!bIo8J5ZuEYBwi`Yg-- zso7$q2MjZG3293dQn}b`6`h1Sao+q*w=;=iwd+B2%J3Nc* zY{c1SfwGBEgu4$Rij1}$twz^*{>y%WnR^xMaFLbu8hiJp3Q(IPx}@QS6;PrpoC)bV z!paPL`YnQzX19l64s=C{Y`uo|)^k`aK-o?jE}>qA+=!Ccl9cKxVPdL7nJHCjN;=9K sRjDx?qpKP`jQ99XQ~6K$3*P0iVe{MImO06}3H6**&+n+`8TCB-f7_S(dH?_b literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Todo.class b/src/test/java/production/main/task/Todo.class new file mode 100644 index 0000000000000000000000000000000000000000..a94de81dd5c58620efce1932592a055c07d9ec66 GIT binary patch literal 514 zcmZutO;5r=6r3$>p`{9z4;8=l0yVKm4;U{R6O+aZ4F_%o8eGLLX^RQ}N)Lv_gFnC@ zWqi9KTyzh!Z{E(EdD-uu&o2O%II~egvxIGV?^p!85?Ye(6|rB$0fTwP6P{l)G}^&a z^cwloD4F=ZJmtxx+vzjtH)0$!R05vF5A&B{oQBbGN*y;4qiEWXQZD(bsppS8V<-oC zls)^Q7>h2kah#1(KFhgC*h!iQNex_k$^o0G5R=*}sVG)1 hy~^i5UVm_?D3kRps&R0_56l!FDr=1n1W>Kgq^ay$*iON zu5h?@Bx9mk6J6mJ7pn@wnQWQ7MY~EBi4wPrZLfA zR7AQ;1Z}Nnw)0-ax{e|?bWHq~Cjxhpc?$Z298w>-I^(l*a6<5OgN|$6woQXs3e;vt zcMcT{W%jdyne#KK>FtiT+BKL7B>97x-B*yld@9yl*KqvF(OJ{j{NOQ@25B*f)Y7;d z!2a9QW-B92zga*1j$wMKp|nDFzPVG=X;NG|P=$28b8_0AA Und}OZ?GBRb0-_*CYC@R$36H5Mxc~qF literal 0 HcmV?d00001 diff --git a/src/test/java/test/test/task/TodoTest.class b/src/test/java/test/test/task/TodoTest.class new file mode 100644 index 0000000000000000000000000000000000000000..63e478f2aa6831ad97510b8953852d1a778f350a GIT binary patch literal 1011 zcmZ{iZBG+H6ot>WrEe^@R1gu=6?|!{vc4sTpd_gHslh~Q6GQkgY)3k{-CcKQN&HzR zB1RK`fIrH3rZlyJewf+4Gxt9C%$fQ5>)Q_ikMXDs8%sqjmoSOz1>7hjhnpt2RYctc zjUt+5+{T>(?iR3OA*aJ`XkoIYMe^QlGgxEPm5CRtNUJcgP-`8CL*e=&*mt*etb%=} z2(X)dZRhpmtV}#y%;}y=O!la0TPB*+ ziA3r*k%jr!X`oeKc2uHRwh;uO7Df%LmRe!F?;fOV&pA?B#;%Bz`%JzIW4S539zmsu zI(3_8vatA{f??0)|7^cdN#u)(Od zSin7QB_}HSLVGi*_+D+k=L`pp;0$9E=PU&!8jYV$jCZ=0Wy zJ;uZl@~2rT8;6V8ocD`VIS TB`y+inV>5PuJYqB%;4H@4$kAY literal 0 HcmV?d00001 From da8d533b3344bed0e43f37ed2c5c28503258927c Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Thu, 18 Nov 2021 19:14:08 +0800 Subject: [PATCH 15/18] Level-9, A-CodingStandard, A-CodeQuality --- build.gradle | 6 +- config/checkstyle/checkstyle.xml | 415 ++++++++++++++++++ src/main/java/app/Parser.java | 227 ---------- src/main/java/app/Storage.java | 258 ----------- .../java/{ => com/tic2002}/app/DateTime.java | 25 +- .../{ => com/tic2002}/app/DukeException.java | 4 +- src/main/java/com/tic2002/app/Parser.java | 195 ++++++++ src/main/java/com/tic2002/app/Storage.java | 176 ++++++++ src/main/java/{ => com/tic2002}/app/UI.java | 13 +- .../java/{ => com/tic2002}/duke/Duke.java | 4 +- .../java/{ => com/tic2002}/task/Deadline.java | 12 +- .../java/{ => com/tic2002}/task/Event.java | 9 +- .../java/{ => com/tic2002}/task/Find.java | 3 +- .../java/{ => com/tic2002}/task/List.java | 12 +- .../java/{ => com/tic2002}/task/Priority.java | 15 +- .../java/{ => com/tic2002}/task/Task.java | 4 +- .../java/com/tic2002/task/TaskCommands.java | 185 ++++++++ .../java/{ => com/tic2002}/task/Todo.java | 10 +- src/main/java/task/TaskCommands.java | 185 -------- src/test/java/app/DateTimeTest.java | 1 + .../java/production/main/app/DateTime.class | Bin 1950 -> 0 bytes .../production/main/app/DukeException.class | Bin 275 -> 0 bytes .../main/app/Parser$validCommands.class | Bin 1527 -> 0 bytes .../java/production/main/app/Parser.class | Bin 4748 -> 0 bytes .../java/production/main/app/Storage.class | Bin 6410 -> 0 bytes src/test/java/production/main/app/UI.class | Bin 3488 -> 0 bytes .../main/com/tic2002/app/DateTime.class | Bin 0 -> 2074 bytes .../main/com/tic2002/app/DukeException.class | Bin 0 -> 299 bytes .../tic2002/app/Parser$validCommands.class | Bin 0 -> 1611 bytes .../main/com/tic2002/app/Parser.class | Bin 0 -> 4963 bytes .../main/com/tic2002/app/Storage.class | Bin 0 -> 6857 bytes .../production/main/com/tic2002/app/UI.class | Bin 0 -> 3606 bytes .../main/com/tic2002/duke/Duke.class | Bin 0 -> 504 bytes .../main/com/tic2002/task/Deadline.class | Bin 0 -> 1379 bytes .../main/{ => com/tic2002}/task/Event.class | Bin 1094 -> 1130 bytes .../main/com/tic2002/task/Find.class | Bin 0 -> 1986 bytes .../main/com/tic2002/task/List.class | Bin 0 -> 1391 bytes .../tic2002/task/Priority$validPriority.class | Bin 0 -> 1327 bytes .../main/com/tic2002/task/Priority.class | Bin 0 -> 981 bytes .../main/{ => com/tic2002}/task/Task.class | Bin 2865 -> 2901 bytes .../main/com/tic2002/task/TaskCommands.class | Bin 0 -> 4697 bytes .../main/com/tic2002/task/Todo.class | Bin 0 -> 550 bytes src/test/java/production/main/duke/Duke.class | Bin 456 -> 0 bytes .../java/production/main/task/Deadline.class | Bin 1344 -> 0 bytes src/test/java/production/main/task/Find.class | Bin 1926 -> 0 bytes src/test/java/production/main/task/List.class | Bin 1271 -> 0 bytes .../main/task/Priority$validPriority.class | Bin 1243 -> 0 bytes .../java/production/main/task/Priority.class | Bin 897 -> 0 bytes .../production/main/task/TaskCommands.class | Bin 4397 -> 0 bytes src/test/java/production/main/task/Todo.class | Bin 514 -> 0 bytes src/test/java/task/TodoTest.java | 1 + .../java/test/test/app/DateTimeTest.class | Bin 1539 -> 1563 bytes src/test/java/test/test/task/TodoTest.class | Bin 1011 -> 1035 bytes 53 files changed, 1021 insertions(+), 739 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml delete mode 100644 src/main/java/app/Parser.java delete mode 100644 src/main/java/app/Storage.java rename src/main/java/{ => com/tic2002}/app/DateTime.java (82%) rename src/main/java/{ => com/tic2002}/app/DukeException.java (50%) create mode 100644 src/main/java/com/tic2002/app/Parser.java create mode 100644 src/main/java/com/tic2002/app/Storage.java rename src/main/java/{ => com/tic2002}/app/UI.java (94%) rename src/main/java/{ => com/tic2002}/duke/Duke.java (82%) rename src/main/java/{ => com/tic2002}/task/Deadline.java (83%) rename src/main/java/{ => com/tic2002}/task/Event.java (83%) rename src/main/java/{ => com/tic2002}/task/Find.java (95%) rename src/main/java/{ => com/tic2002}/task/List.java (81%) rename src/main/java/{ => com/tic2002}/task/Priority.java (76%) rename src/main/java/{ => com/tic2002}/task/Task.java (97%) create mode 100644 src/main/java/com/tic2002/task/TaskCommands.java rename src/main/java/{ => com/tic2002}/task/Todo.java (81%) delete mode 100644 src/main/java/task/TaskCommands.java delete mode 100644 src/test/java/production/main/app/DateTime.class delete mode 100644 src/test/java/production/main/app/DukeException.class delete mode 100644 src/test/java/production/main/app/Parser$validCommands.class delete mode 100644 src/test/java/production/main/app/Parser.class delete mode 100644 src/test/java/production/main/app/Storage.class delete mode 100644 src/test/java/production/main/app/UI.class create mode 100644 src/test/java/production/main/com/tic2002/app/DateTime.class create mode 100644 src/test/java/production/main/com/tic2002/app/DukeException.class create mode 100644 src/test/java/production/main/com/tic2002/app/Parser$validCommands.class create mode 100644 src/test/java/production/main/com/tic2002/app/Parser.class create mode 100644 src/test/java/production/main/com/tic2002/app/Storage.class create mode 100644 src/test/java/production/main/com/tic2002/app/UI.class create mode 100644 src/test/java/production/main/com/tic2002/duke/Duke.class create mode 100644 src/test/java/production/main/com/tic2002/task/Deadline.class rename src/test/java/production/main/{ => com/tic2002}/task/Event.class (62%) create mode 100644 src/test/java/production/main/com/tic2002/task/Find.class create mode 100644 src/test/java/production/main/com/tic2002/task/List.class create mode 100644 src/test/java/production/main/com/tic2002/task/Priority$validPriority.class create mode 100644 src/test/java/production/main/com/tic2002/task/Priority.class rename src/test/java/production/main/{ => com/tic2002}/task/Task.class (78%) create mode 100644 src/test/java/production/main/com/tic2002/task/TaskCommands.class create mode 100644 src/test/java/production/main/com/tic2002/task/Todo.class delete mode 100644 src/test/java/production/main/duke/Duke.class delete mode 100644 src/test/java/production/main/task/Deadline.class delete mode 100644 src/test/java/production/main/task/Find.class delete mode 100644 src/test/java/production/main/task/List.class delete mode 100644 src/test/java/production/main/task/Priority$validPriority.class delete mode 100644 src/test/java/production/main/task/Priority.class delete mode 100644 src/test/java/production/main/task/TaskCommands.class delete mode 100644 src/test/java/production/main/task/Todo.class diff --git a/build.gradle b/build.gradle index ffb4d09c..196ae25a 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ dependencies { } application { - mainClassName = "duke.Duke" + mainClassName = "com.tic2002.duke.Duke" } shadowJar { @@ -51,10 +51,6 @@ shadowJar { archiveClassifier = null } -/*checkstyle { - toolVersion = '8.29' -}*/ - run{ standardInput = System.in } diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..2400e011 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,415 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/app/Parser.java b/src/main/java/app/Parser.java deleted file mode 100644 index 55b01a9d..00000000 --- a/src/main/java/app/Parser.java +++ /dev/null @@ -1,227 +0,0 @@ -package app; - -import task.TaskCommands; - -import java.io.IOException; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.format.DateTimeParseException; - -import static app.DateTime.*; -import static task.Find.findWord; -import static task.Priority.isValidPriority; -import static task.TaskCommands.*; - - -public class Parser { - /** - * Set enumerations of valid commands - */ - public enum validCommands { - LIST, DONE, UNDONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE, ON, PRIORITY, FIND - } - - /** - * To check if user input String check is valid - * @param checkCommand takes user input as String - * check if checkCommand matches enum - * @return true if match, false if doesn't match - */ - public static boolean validInput (String checkCommand){ - for (validCommands a : validCommands.values()){ - if(a.name().equals(checkCommand)){ - return true; - } - } - return false; - } - - /** - * Takes user input as String and parse input - * @param userEntry Takes user entry as String - * Creates String timeDescription for Deadline & Event cases - * Creates String description to store description of task - * Creates String command to store first word of String userEntry, which is the command - * Create int size to check length of String userEntry - * String commandUpper to change String command to upper case - * check if user entered only command without description, except for LIST & BYE - * Check if matches validCommands - * @throws DukeException when error occurs - */ - public static void parseCommand(String userEntry) throws DukeException { - String timeDescription; - String description; - String command = userEntry.split(" ")[0]; - description = userEntry.replaceFirst(command + " ", ""); - int size = userEntry.length(); - String commandUpper = command.toUpperCase(); - if(size == 1 && !commandUpper.equals("LIST") && !commandUpper.equals("BYE")){ - throw new DukeException(); - } - if(!validInput(commandUpper)){ - throw new DukeException(); - } - /** - * switch for commandUpper - */ - { - switch (commandUpper){ - /** - * LIST - calls TaskCommands.printList() to print existing listing - * break to end command switch - */ - case "LIST": - TaskCommands.printList(); - break; - /** - * DONE - Get int ref of list = 0, marks task as done by calling TaskCommands.setDone(ref-1) - * break to end command switch - */ - case"DONE": - int ref = Integer.valueOf(description); - TaskCommands.setDone(ref-1); - break; - /** - * UNDONE - Get int ref of list, marks task as undone - * break to end command switch - */ - case"UNDONE": - ref = Integer.valueOf(description); - TaskCommands.setUnDone(ref-1); - break; - /** - * DELETE - Get ref of list = 0, finds task and delete by calling TaskCommands.deleteTask(ref-1) - * break to end command switch - */ - case"DELETE": - ref = Integer.valueOf(description); - TaskCommands.deleteTask(ref-1); - break; - /** - * HELP - Calls UI.instructions() - * break to end command switch - */ - case"HELP": - UI.instructions(); - break; - /** - * BYE - Exits Duke, calls UI.endDuke() - * break to end command switch - */ - case"BYE": - UI.endDuke(); - break; - /** - * TODO - adds new task todo - * break to end command switch - */ - case"TODO": - addTodo(description); - break; - /** - * EVENT - split String userEntry into time description as String timeDescription - * prints error if cannot split "/at " - * break to end command switch - */ - case"EVENT": - timeDescription = userEntry.split("/at ")[1]; - if(description.equals("")){ - System.out.println("include /at"); - break; - } - /** - * split description to remove timeDescription - * add to Event task - */ - else{ - description = description.split(" /")[0]; - addEvent(description,timeDescription); - } - break; - /** - * DEADLINE - split String userEntry at "/by " into String timeDescription - * split description to remove timeDescription - * @param date take first part of timeDescription split at "/" - * @param time take second part of timeDescription split at "/" - */ - case"DEADLINE": - timeDescription = userEntry.split("/by ")[1]; - description = description.split(" /")[0]; - String date = timeDescription.split(", ")[0]; - String time = timeDescription.split(", ")[1]; - /** - * if only command available, print error - * break command switch - */ - if(description.equals("")){ - System.out.println("include /by"); - break; - } - /** - * if DateTime check on date or time format is false, return error - * print error line - * break command switch - */ - else if(!isValidDate(date) || !isValidTime(time)) { - System.out.println("Please use an exact date time, yyyy-mm-dd, hh:mm"); - break; - } - /** - * convert String date to LocalDate date - * convert String time to LocalTime time - * add to Deadline task - */ - else{ - try{ - LocalDate dateDate = toDate(date); - LocalTime timeTime = toTime(time); - addDeadline(description, dateDate, timeTime); - } catch (DateTimeParseException e){ - System.out.println("Please enter in yyyy-mm-dd, hh:mm"); - } - } - break; - /** - * ON - check if date is in correct format or if description is empty, return false - * print error line - * break switch - */ - case"ON": - if(!isValidDate(description) || (description.equals(""))){ - System.out.println("Please use an exact date: yyyy-mm-dd"); - break; - } - /** - * convert String description to LocalDate date - * check if date exists in list and return list - */ - else{ - LocalDate checkDate = toDate(description); - TaskCommands.printDateList(checkDate); - } - break; - case"PRIORITY": - try { - ref = Integer.valueOf(description.split(" ")[0]); - int priority = Integer.valueOf(description.split(" ")[1]); - - if(isValidPriority(priority)){ - updatePriority(ref-1, priority); - } - } catch (NumberFormatException e){ - throw new DukeException(); - } - break; - case"FIND": - findWord(description); - break; - - default: throw new DukeException(); - } - } - } - - } - - - diff --git a/src/main/java/app/Storage.java b/src/main/java/app/Storage.java deleted file mode 100644 index 4be96bb0..00000000 --- a/src/main/java/app/Storage.java +++ /dev/null @@ -1,258 +0,0 @@ -package app; - -import task.*; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; - -import static app.DateTime.toDate; -import static app.DateTime.toTime; - -public class Storage { - - private static ArrayList Load = new ArrayList<>(); - - /** - * Method to load listing from Duke.txt - * Get path for user hom - * Get path for duke.txt - */ - public static void loadList() { - String home = System.getProperty("user.home"); - Path path = Paths.get(home, "data", "duke.txt"); - /** - * Create boolean to check if path for Duke.txt exists - * Create String description to store Task description - * If directory exists - * read the file using buffered reader - * create int i as a reference point - */ - boolean directoryExists = Files.exists(path); - String description; - if(directoryExists) { - try (BufferedReader br = new BufferedReader(new FileReader(path + ""))) { - String sCurrentLine; - int i = 0; - /** - * while the line read is not null - * split the line into a String array with delimiter "|" - * create String type to store type of Task in String array index 0 - * create boolean done for String array index 1 - */ - while ((sCurrentLine = br.readLine()) != null) { - String line = sCurrentLine.split(",")[0]; - int priority = Integer.valueOf(sCurrentLine.split(",")[1]); - String [] words = line.split("\\|"); - String type = words[0]; - boolean isDone = Boolean.parseBoolean(words[1]); - /** - * create switch method for Task type - */ - switch (type){ - /** - * if type is T - * store String word array index 2 as description - * add Todo as task - * if Task is done, mark as done - * increment i - * break switch - */ - case "T": - description = words[2]; - Load.add(new Todo(description)); - Load.get(i).priority(priority); - if(isDone == true){ - Load.get(i).setDone(); - } - i++; - break; - /** - * if type is D - * store String word array index 2 as description - * store String word array index 3 as String date - * store String word array index 4 as String time - * convert String date as LocalDate date - * convert String time as LocalTime time - * add Deadline as task - * if Task is done, mark as done - * increment i - * break switch - */ - case "D": - description = words[2]; - String date = words[3]; - String time = words[4]; - LocalDate byDate = toDate(date); - LocalTime byTime = toTime(time); - Load.add(new Deadline(description, byDate, byTime)); - Load.get(i).priority(priority); - if(isDone == true){ - Load.get(i).setDone(); - } - i++; - break; - /** - * if type is E - * store String word array index 2 as description - * add Deadline as task with description and word array index 3 - * if Task is done, mark as done - * increment i - * break switch - */ - case "E": - description = words[2]; - Load.add(new Event(description, words[3])); - Load.get(i).priority(priority); - if(isDone == true){ - Load.get(i).setDone(); - } - i++; - break; - } - } - /** - * if IOException e error occurs, print error tracing - */ - } catch (IOException e) { - e.printStackTrace(); - } - /** - * update ArrayList List as ArrayList Load - */ - List.setList(Load); - } - } - - /** - * Method to save current listing - * Copy ArrayList List to ArrayList Load - * get user home path - * Get path of Duke.txt - */ - public static void saveList() { - Load = List.getList(); - String home = System.getProperty("user.home"); - java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); - /** - * create boolean to check if directory exists - */ - boolean directoryExists = java.nio.file.Files.exists(path); - /** - * if directory does not exist - * print out path of file created - * create directory of file - * create file Duke.txt - */ - if (!directoryExists) { - try { - System.out.println("File created at : " + path); - Files.createDirectory(Paths.get(home,"data")); - Files.createFile(path); - /** - * Catch any IOException errors - * Print out error statement - * Print out trace of errors - */ - } catch (IOException e) { - System.out.println("Error saving file"); - e.printStackTrace(); - } - } - /** - * Create String save to store data as String - */ - String save = ""; - /** - * Create for loop to go through Tasks in ArrayList Load - * Create String type to store Task type - */ - for (int i = 0; i < Load.size(); i++) { - String type = Load.get(i).getType(); - try { - /** - * Create switch method for type of tasks - */ - switch (type) { - /** - * for Todo tasks - * Store the following in String save - * Get Task type for index i, add delimiter - * Get done status for index i, add delimiter - * Get description for index i, add delimiter - * Add line separator - * break to next line - */ - case "T": - save += Load.get(i).getType() + "|" - + Load.get(i).getDone() + "|" - + Load.get(i).getDescription() + "," - + Load.get(i).getPriority() - + System.lineSeparator(); - break; - /** - * for Event tasks - * Store the following in String save - * Get Task type for index i, add delimiter - * Get done status for index i, add delimiter - * Get description for index i, add delimiter - * Get timing for index i, add delimiter - * Add line separator - * break to next line - */ - case "E" : - save += Load.get(i).getType() + "|" + - Load.get(i).getDone() + "|" + - Load.get(i).getDescription() + "|" + - Load.get(i).getTiming() + "," + - Load.get(i).getPriority() + - System.lineSeparator(); - break; - /** - * for Deadline tasks - * Store the following in String save - * Get Task type for index i, add delimiter - * Get done status for index i, add delimiter - * Get description for index i, add delimiter - * Get date for index i, add delimiter - * Get time for index i, add delimiter - * Add line separator - * break to next line - */ - case "D": - save += Load.get(i).getType() + "|" + - Load.get(i).getDone() + "|" + - Load.get(i).getDescription() + "|" + - Load.get(i).getDate() + "|" + - Load.get(i).getTime() + "," + - Load.get(i).getPriority() + - System.lineSeparator(); - break; - - default: break; - } - /** - * write String save to Duke.txt - */ - writeToFile(path + "", save); - /** - * Handle IOException errors - */ - } catch (IOException e) {} - } - } - - private static void writeToFile(String filePath, String textToAdd) throws IOException { - FileWriter fw = new FileWriter(filePath); - fw.write(textToAdd); - fw.close(); - } - -} diff --git a/src/main/java/app/DateTime.java b/src/main/java/com/tic2002/app/DateTime.java similarity index 82% rename from src/main/java/app/DateTime.java rename to src/main/java/com/tic2002/app/DateTime.java index 63aea6b7..7197f30b 100644 --- a/src/main/java/app/DateTime.java +++ b/src/main/java/com/tic2002/app/DateTime.java @@ -1,4 +1,4 @@ -package app; +package com.tic2002.app; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -27,6 +27,7 @@ public static boolean isValidDate (String date) { valid = true; } catch (ParseException e){ valid = false; + System.out.println("Please use an exact date: yyyy-mm-dd"); } return valid; } @@ -36,16 +37,13 @@ public static boolean isValidDate (String date) { * @param time takes a String input time * verifying if time matches "hh:mm" format * @return true if matches format, false if does not match format + * parse date with format + * must be exact with format + * if true, set & return */ public static boolean isValidTime (String time) { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); boolean valid; - /** - * parse date with format - * must be exact with format - * if true, set - * @param valid as true - */ try { sdf.parse(time); sdf.setLenient(false); @@ -61,27 +59,24 @@ public static boolean isValidTime (String time) { * @param date parses to LocalDate * @return date as LocalDate */ - public static LocalDate toDate(String date){ - LocalDate dt = LocalDate.parse(date); - return dt; + public static LocalDate toDate(String date) { + return LocalDate.parse(date); } /** * Takes user input String time and returns as LocalTime * @param time parses to LocalTime * @return time as LocalTime */ - public static LocalTime toTime(String time){ - LocalTime dt = LocalTime.parse(time); - return dt; + public static LocalTime toTime(String time) { + return LocalTime.parse(time); } /** * Takes LocalDate date and returns in a new format * formatter to format date to "dd MMM yyyy" * @return new date format */ - public static String toNewDateFormat (LocalDate date){ + public static String toNewDateFormat (LocalDate date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); return date.format(formatter); } - } diff --git a/src/main/java/app/DukeException.java b/src/main/java/com/tic2002/app/DukeException.java similarity index 50% rename from src/main/java/app/DukeException.java rename to src/main/java/com/tic2002/app/DukeException.java index 1551efee..ad76b212 100644 --- a/src/main/java/app/DukeException.java +++ b/src/main/java/com/tic2002/app/DukeException.java @@ -1,8 +1,8 @@ -package app; +package com.tic2002.app; /** * Creates class exception as DukeException to handle errors */ -public class DukeException extends Exception{ +public class DukeException extends Exception { } diff --git a/src/main/java/com/tic2002/app/Parser.java b/src/main/java/com/tic2002/app/Parser.java new file mode 100644 index 00000000..a7785362 --- /dev/null +++ b/src/main/java/com/tic2002/app/Parser.java @@ -0,0 +1,195 @@ +package com.tic2002.app; + +import com.tic2002.task.TaskCommands; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeParseException; + +import static com.tic2002.app.DateTime.isValidDate; +import static com.tic2002.app.DateTime.isValidTime; +import static com.tic2002.app.DateTime.toDate; +import static com.tic2002.app.DateTime.toTime; +import static com.tic2002.task.Find.findWord; +import static com.tic2002.task.Priority.isValidPriority; +import static com.tic2002.task.TaskCommands.addEvent; +import static com.tic2002.task.TaskCommands.addTodo; +import static com.tic2002.task.TaskCommands.addDeadline; +import static com.tic2002.task.TaskCommands.updatePriority; + +public class Parser { + /** + * Set enumerations of valid commands + */ + public enum validCommands { + LIST, DONE, UNDONE, DELETE, HELP, BYE, TODO, EVENT, DEADLINE, ON, PRIORITY, FIND + } + + /** + * To check if user input String check is valid + * @param checkCommand takes user input as String + * check if checkCommand matches enum + * @return true if match, false if doesn't match + */ + public static boolean isValidInput (String checkCommand) { + for (validCommands a : validCommands.values()) { + if(a.name().equals(checkCommand)) { + return true; + } + } + return false; + } + + /** + * Takes in input from user and makes sense of input for Event + */ + public static void eventParse(String userEntry, String description){ + String timeDescription = userEntry.split("/at ")[1]; + if(description.equals("")) { + System.out.println("include /at"); + } + else { + description = description.split(" /")[0]; + addEvent(description,timeDescription); + } + } + + /** + * Takes in input from user and makes sense of input for Deadline + */ + public static void deadlineParse(String userEntry, String description){ + String timeDescription = userEntry.split("/by ")[1]; + description = description.split(" /")[0]; + String date = timeDescription.split(", ")[0]; + String time = timeDescription.split(", ")[1]; + + if(description.equals("")) { + System.out.println("include /by"); + } + else if(!isValidDate(date) || !isValidTime(time)) { + System.out.println("Please use an exact date time, yyyy-mm-dd, hh:mm"); + } + else{ + try { + LocalDate dateDate = toDate(date); + LocalTime timeTime = toTime(time); + addDeadline(description, dateDate, timeTime); + } catch (DateTimeParseException e) { + System.out.println("Please enter in yyyy-mm-dd, hh:mm"); + } + } + } + + public static void priorityParse(String description){ + int ref = Integer.parseInt(description.split(" ")[0]); + int priority = Integer.parseInt(description.split(" ")[1]); + if(isValidPriority(priority)) { + updatePriority(ref-1, priority); + } + } + /** + * Takes user input as String and parse input + * @param userEntry Takes user entry as String + * Creates String timeDescription for Deadline & Event cases + * Creates String description to store description of task + * Creates String command to store first word of String userEntry, which is the command + * Create int size to check length of String userEntry + * String commandUpper to change String command to upper case + * check if user entered only command without description, except for LIST & BYE + * Check if matches validCommands + * @throws DukeException when error occurs + * switch for commandUpper + * done - Set task as done + * undone - Set task as not done + * delete - delete a task + * help - prints out instructions + * bye - ends Duke + * todo - creates todo task + * event - creates event + * deadline - creates task with deadline + * on - returns task with matching date + * priority - sets task priority + * find - find tasks that matches user input + */ + public static void parseCommand(String userEntry) throws DukeException { + String timeDescription; + String description; + String command = userEntry.split(" ")[0]; + description = userEntry.replaceFirst(command + " ", ""); + int size = userEntry.length(); + String commandUpper = command.toUpperCase(); + if(size == 1 && !commandUpper.equals("LIST") && !commandUpper.equals("BYE")) { + throw new DukeException(); + } + if(!isValidInput(commandUpper)) { + throw new DukeException(); + } + + switch (commandUpper) { + case "LIST": + TaskCommands.printList(); + break; + + case"DONE": + int ref = Integer.parseInt(description); + TaskCommands.setDone(ref-1); + break; + + case"UNDONE": + ref = Integer.parseInt(description); + TaskCommands.setUnDone(ref-1); + break; + + case"DELETE": + ref = Integer.parseInt(description); + TaskCommands.deleteTask(ref-1); + break; + + case"HELP": + UI.instructions(); + break; + + case"BYE": + UI.endDuke(); + break; + + case"TODO": + addTodo(description); + break; + + case"EVENT": + eventParse(userEntry, description); + break; + + case"DEADLINE": + deadlineParse(userEntry, description); + break; + + case"ON": + if(isValidDate(description) || (!description.equals(""))) { + LocalDate checkDate = toDate(description); + TaskCommands.printDateList(checkDate); + } + break; + + case"PRIORITY": + try { + priorityParse(description); + } catch (NumberFormatException e) { + throw new DukeException(); + } + break; + + case"FIND": + findWord(description); + break; + + default: + throw new DukeException(); + } + } +} + + + + diff --git a/src/main/java/com/tic2002/app/Storage.java b/src/main/java/com/tic2002/app/Storage.java new file mode 100644 index 00000000..f3eddfeb --- /dev/null +++ b/src/main/java/com/tic2002/app/Storage.java @@ -0,0 +1,176 @@ +package com.tic2002.app; + +import com.tic2002.task.Event; +import com.tic2002.task.Task; +import com.tic2002.task.Todo; +import com.tic2002.task.Deadline; +import com.tic2002.task.List; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; + +import static com.tic2002.app.DateTime.toDate; +import static com.tic2002.app.DateTime.toTime; + +public class Storage { + + private static ArrayList Load = new ArrayList<>(); + + /** + * Method to load listing from Duke.txt + * Get path for user hom + * Get path for duke.txt + * run duke.txt over switch to store as tasks in List + */ + public static void loadList() { + String home = System.getProperty("user.home"); + Path path = Paths.get(home, "data", "duke.txt"); + + boolean directoryExists = Files.exists(path); + String description; + if(directoryExists) { + try (BufferedReader br = new BufferedReader(new FileReader(path + ""))) { + String sCurrentLine; + int i = 0; + + while ((sCurrentLine = br.readLine()) != null) { + String line = sCurrentLine.split(",")[0]; + try { + Integer.parseInt(sCurrentLine.split(",")[1]); + } catch (ArrayIndexOutOfBoundsException e){ + System.out.println("Error in file: " + sCurrentLine); + break; + } + int priority = Integer.parseInt(sCurrentLine.split(",")[1]); + String [] words = line.split("\\|"); + String type = words[0]; + boolean isDone = Boolean.parseBoolean(words[1]); + + switch (type) { + case "T": + description = words[2]; + Load.add(new Todo(description)); + Load.get(i).priority(priority); + if (isDone) { + Load.get(i).setDone(); + } + i++; + break; + + case "D": + description = words[2]; + String date = words[3]; + String time = words[4]; + try { + LocalDate byDate = toDate(date); + LocalTime byTime = toTime(time); + Load.add(new Deadline(description, byDate, byTime)); + } catch (DateTimeParseException e) { + System.out.println("Error in file: " + sCurrentLine ); + break; + } + Load.get(i).priority(priority); + if(isDone){ + Load.get(i).setDone(); + } + i++; + break; + + case "E": + description = words[2]; + Load.add(new Event(description, words[3])); + Load.get(i).priority(priority); + if(isDone){ + Load.get(i).setDone(); + } + i++; + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + List.setList(Load); + } + } + + /** + * Method to save current listing + * Copy ArrayList List to ArrayList Load + * get user home path + * Get path of Duke.txt + * print tasks to Duke.txt based on Task variable + */ + public static void saveList() { + Load = List.getList(); + String home = System.getProperty("user.home"); + java.nio.file.Path path = Paths.get(home, "data", "duke.txt"); + + boolean directoryExists = java.nio.file.Files.exists(path); + + if (!directoryExists) { + try { + System.out.println("File created at : " + path); + Files.createDirectory(Paths.get(home,"data")); + Files.createFile(path); + } catch (IOException e) { + System.out.println("Error saving file"); + e.printStackTrace(); + } + } + String save = ""; + for (Task task : Load) { + String type = task.getType(); + try { + switch (type) { + case "T": + save += task.getType() + "|" + + task.getDone() + "|" + + task.getDescription() + "," + + task.getPriority() + + System.lineSeparator(); + break; + + case "E": + save += task.getType() + "|" + + task.getDone() + "|" + + task.getDescription() + "|" + + task.getTiming() + "," + + task.getPriority() + + System.lineSeparator(); + break; + + case "D": + save += task.getType() + "|" + + task.getDone() + "|" + + task.getDescription() + "|" + task.getDate() + "|" + + task.getTime() + "," + + task.getPriority() + + System.lineSeparator(); + break; + + default: + break; + } + writeToFile(path + "", save); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void writeToFile(String filePath, String textToAdd) throws IOException { + FileWriter fw = new FileWriter(filePath); + fw.write(textToAdd); + fw.close(); + } +} diff --git a/src/main/java/app/UI.java b/src/main/java/com/tic2002/app/UI.java similarity index 94% rename from src/main/java/app/UI.java rename to src/main/java/com/tic2002/app/UI.java index c19abfbf..b522cd27 100644 --- a/src/main/java/app/UI.java +++ b/src/main/java/com/tic2002/app/UI.java @@ -1,11 +1,11 @@ -package app; +package com.tic2002.app; -import task.Task; +import com.tic2002.task.Task; import java.util.ArrayList; import java.util.Scanner; -import static app.Storage.loadList; +import static com.tic2002.app.Storage.loadList; public class UI { private Parser parser; @@ -22,6 +22,7 @@ public void run(){ loadList(); String line; Scanner in = new Scanner(System.in); + parser = new Parser(); /** * @param while(true) - while there is input from the user * newLine() - Calls a line break @@ -34,13 +35,13 @@ public void run(){ String command = line.split(" ")[0]; String commandUpper = command.toUpperCase(); /** - * @param parser.validInput(commandUpper) passes command String to check booleaan + * @param parser.validInput(commandUpper) passes command String to check boolean * @param catch(NullPointerException e) catches null in String * @param println tells user to input accurately * @param instructions() print instructions to use Duke */ try { - parser.validInput(commandUpper); + parser.isValidInput(commandUpper); } catch (NullPointerException e){ System.out.println("Please enter a valid input\n"); instructions(); @@ -87,7 +88,7 @@ private static void dukeLogo () { /** * to end program * Storage.saveList() - call Storage to save list to duke.txt - * System.exit - exit system safely + * System.exit() - exit system safely */ public static void endDuke () { System.out.println("\tBye! Thanks for visiting The Duke!"); diff --git a/src/main/java/duke/Duke.java b/src/main/java/com/tic2002/duke/Duke.java similarity index 82% rename from src/main/java/duke/Duke.java rename to src/main/java/com/tic2002/duke/Duke.java index 5ef8c548..d4d1da24 100644 --- a/src/main/java/duke/Duke.java +++ b/src/main/java/com/tic2002/duke/Duke.java @@ -1,6 +1,6 @@ -package duke; +package com.tic2002.duke; -import app.UI; +import com.tic2002.app.UI; public class Duke { diff --git a/src/main/java/task/Deadline.java b/src/main/java/com/tic2002/task/Deadline.java similarity index 83% rename from src/main/java/task/Deadline.java rename to src/main/java/com/tic2002/task/Deadline.java index 7faf71d6..e3b8d490 100644 --- a/src/main/java/task/Deadline.java +++ b/src/main/java/com/tic2002/task/Deadline.java @@ -1,17 +1,15 @@ -package task; +package com.tic2002.task; import java.time.LocalDate; import java.time.LocalTime; -import static app.DateTime.toNewDateFormat; -import static task.Priority.printPriority; +import static com.tic2002.app.DateTime.toNewDateFormat; + /** * Deadline is inheriting from Task */ public class Deadline extends Task { - protected String by; - /** * Deadline takes in input of String description, LocalDate dDate and LocalTime dTime * @param description description from Parser that user entered @@ -20,6 +18,7 @@ public class Deadline extends Task { * The Deadline method stores these tasks in Task * super.type - Assigns type "D" * super.isDone - Assigns false to done + * @Override - print task in deadline format */ public Deadline(String description, LocalDate dDate, LocalTime dTime) { super(description); @@ -31,9 +30,6 @@ public Deadline(String description, LocalDate dDate, LocalTime dTime) { } @Override -/** - * Print Task that has been added to ArrayList - */ public String printTask() { return super.printTask() + " (by: " + toNewDateFormat(super.date) + ", " + super.time + ")"; } diff --git a/src/main/java/task/Event.java b/src/main/java/com/tic2002/task/Event.java similarity index 83% rename from src/main/java/task/Event.java rename to src/main/java/com/tic2002/task/Event.java index 225c3ded..e4687a90 100644 --- a/src/main/java/task/Event.java +++ b/src/main/java/com/tic2002/task/Event.java @@ -1,6 +1,4 @@ -package task; - -import static task.Priority.printPriority; +package com.tic2002.task; public class Event extends Task { /** @@ -9,6 +7,7 @@ public class Event extends Task { * super.type - Assigns type "E" * super.timing - Stores String at in task timing * super.isDone - Assigns false to done + * @Override - print task in Event format */ public Event(String description, String at) { super(description); @@ -17,9 +16,7 @@ public Event(String description, String at) { super.isDone = false; super.priority = 0; } - /** - * Print Task that has been added to ArrayList - */ + @Override public String printTask() { return super.printTask() + " (at: " + super.timing + ")"; diff --git a/src/main/java/task/Find.java b/src/main/java/com/tic2002/task/Find.java similarity index 95% rename from src/main/java/task/Find.java rename to src/main/java/com/tic2002/task/Find.java index f21f9a1d..de2289be 100644 --- a/src/main/java/task/Find.java +++ b/src/main/java/com/tic2002/task/Find.java @@ -1,7 +1,6 @@ -package task; +package com.tic2002.task; import java.util.ArrayList; -import java.util.Locale; public class Find { diff --git a/src/main/java/task/List.java b/src/main/java/com/tic2002/task/List.java similarity index 81% rename from src/main/java/task/List.java rename to src/main/java/com/tic2002/task/List.java index 6e96cb20..30800192 100644 --- a/src/main/java/task/List.java +++ b/src/main/java/com/tic2002/task/List.java @@ -1,10 +1,10 @@ -package task; +package com.tic2002.task; -import app.Storage; +import com.tic2002.app.Storage; import java.util.ArrayList; -import static task.TaskCommands.printCount; +import static com.tic2002.task.TaskCommands.printCount; /** * ArrayList List inheriting from Task as the List stores Tasks @@ -14,7 +14,7 @@ public class List extends Task{ /** * To allow other ArrayList in other classes to set into main ArrayList List - * @param Other + * @param Other references other ArrayList */ public static void setList(ArrayList Other) { List = Other; @@ -30,13 +30,13 @@ public static ArrayList getList(){ /** * Method to add Task to list - * using ArrayList.add method + * using ArrayList.add() method * Print line to note task has been added * Print number of items in list * Saves list into storage * @param t - Tasks */ - public static void addList(Task t){ + public static void addList(Task t) { List.add(t); System.out.println("\tGot it. I've added this task:"); printCount(); diff --git a/src/main/java/task/Priority.java b/src/main/java/com/tic2002/task/Priority.java similarity index 76% rename from src/main/java/task/Priority.java rename to src/main/java/com/tic2002/task/Priority.java index a1adc350..732cf5e1 100644 --- a/src/main/java/task/Priority.java +++ b/src/main/java/com/tic2002/task/Priority.java @@ -1,4 +1,4 @@ -package task; +package com.tic2002.task; public class Priority extends Task { private enum validPriority {NONE(0), LOW(1), MEDIUM(2), HIGH(3); @@ -6,7 +6,6 @@ private enum validPriority {NONE(0), LOW(1), MEDIUM(2), HIGH(3); validPriority(int value) { this.value = value; } - } public static boolean isValidPriority(int input) { @@ -19,12 +18,12 @@ public static boolean isValidPriority(int input) { } public static String printPriority(int value) { switch(value){ - case 1: - return "[LOW]"; - case 2: - return "[MED]"; - case 3: - return "[HIGH]"; + case 1: + return "[LOW]"; + case 2: + return "[MED]"; + case 3: + return "[HIGH]"; } return ""; } diff --git a/src/main/java/task/Task.java b/src/main/java/com/tic2002/task/Task.java similarity index 97% rename from src/main/java/task/Task.java rename to src/main/java/com/tic2002/task/Task.java index 6ff62cbf..0b8d29b9 100644 --- a/src/main/java/task/Task.java +++ b/src/main/java/com/tic2002/task/Task.java @@ -1,9 +1,9 @@ -package task; +package com.tic2002.task; import java.time.LocalDate; import java.time.LocalTime; -import static task.Priority.printPriority; +import static com.tic2002.task.Priority.printPriority; /** * Creates what is in a Task diff --git a/src/main/java/com/tic2002/task/TaskCommands.java b/src/main/java/com/tic2002/task/TaskCommands.java new file mode 100644 index 00000000..77339d46 --- /dev/null +++ b/src/main/java/com/tic2002/task/TaskCommands.java @@ -0,0 +1,185 @@ +package com.tic2002.task; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; + +import static com.tic2002.app.DateTime.toNewDateFormat; + +/** + * TaskCommands inherits from Task + */ +public class TaskCommands extends Task { + /** + * Creates a Temporary ArrayList + */ + private ArrayList Temp = new ArrayList<>(); + + /** + * Method to add to Todo + * @param description takes String description and adds to Todo + */ + public static void addTodo(String description) { + List.addList(new Todo(description)); + } + /** + * Method to add to Event + * @param description takes String description and adds to Event + * @param at Takes String at and adds to Event (timing) + */ + public static void addEvent(String description, String at) { + List.addList(new Event(description, at)); + } + /** + * Method to add to Deadline + * @param description takes description and adds to Deadline + * @param byDate takes LocalDate date and adds to Deadline (date of deadline) + * @param byTime takes LocalDate time and adds to Deadline (time of deadline) + */ + public static void addDeadline(String description, LocalDate byDate, LocalTime byTime) { + List.addList(new Deadline(description, byDate, byTime)); + } + + /** + * prints out number of tasks in list + */ + public static void printCount() { + System.out.println("\tNow you have " + List.getSize() + " tasks in the list."); + } + + /** + * Method prints out list + * if list size is empty, print out error + * return + * + * print out tasks in list line + * print out tasks using a loop, number the list items + */ + public static void printList() { + ArrayList Temp = List.getList(); + if(Temp.size() == 0){ + System.out.println("\tThere are no items in your list"); + return; + } + System.out.println("\tHere are the tasks in your list:"); + for (int i=0; i Temp = List.getList(); + ArrayList Placeholder = new ArrayList<>(); + LocalDate listDate; + if(Temp.size() == 0){ + System.out.println("\tThere are no items in your list"); + return; + } + for (Task task : Temp) { + if (task.getType().equals("D")) { + listDate = task.getDate(); + int result = checkDate.compareTo(listDate); + if (result == 0) { + Placeholder.add(task); + } + } + } + if(Placeholder.size() == 0) { + System.out.println("\tThere are no items in your list that matches " + + toNewDateFormat(checkDate)); + return; + } + + System.out.println("\tThere are " + Placeholder.size() + + " tasks in your list that matches " + + toNewDateFormat(checkDate) + ": " ); + + for (int i=0; i Temp = List.getList(); + Temp.get(ref).setDone(); + System.out.println("\tNice! I've marked this task as done:"); + System.out.println("\t\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } + + /** + * Method to set Task as done + * @param ref gets index from user + * Retrieve Task from List and set as not done + * Print out line to set as not done + * Print out Task that is set as not done + * Update main ArrayList List in List class + */ + public static void setUnDone(int ref) { + ArrayList Temp = List.getList(); + Temp.get(ref).setUnDone(); + System.out.println("\tOk! I've marked this task as not done:"); + System.out.println("\t\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } + + /** + * Method to delete Task + * @param ref gets index from user + * Print delete statement + * Copy ArrayList List from List class to ArrayList Temp + * Print Task to be removed from Temp ArrayList + * Delete Task from Temp + * Update main ArrayList List in List class + */ + public static void deleteTask(int ref) { + System.out.println("\tNoted. I've removed this task: "); + ArrayList Temp = List.getList(); + System.out.println("\t\t" + Temp.get(ref).printTask()); + Temp.remove(ref); + List.setList(Temp); + } + + /** + * To update a priority in a task + * @param ref index of task location in list + * @param priority set priority value + */ + public static void updatePriority(int ref, int priority) { + ArrayList Temp = List.getList(); + Temp.get(ref).priority = priority; + if(priority == 0) { + System.out.println("\tOk! I've removed the priority"); + } + else { + System.out.println("\tOk! I've updated the priority"); + } + System.out.println("\t\t" + Temp.get(ref).printTask()); + List.setList(Temp); + } +} + diff --git a/src/main/java/task/Todo.java b/src/main/java/com/tic2002/task/Todo.java similarity index 81% rename from src/main/java/task/Todo.java rename to src/main/java/com/tic2002/task/Todo.java index fa56e57d..c913a6b6 100644 --- a/src/main/java/task/Todo.java +++ b/src/main/java/com/tic2002/task/Todo.java @@ -1,6 +1,4 @@ -package task; - -import static task.Priority.printPriority; +package com.tic2002.task; /** * Todo is inheriting from Task @@ -11,6 +9,7 @@ public class Todo extends Task { * @param description description from Parser that user entered * super.type - Assigns type "T" * super.isDone - Assigns false to done + * @Override - print task in Todo format */ public Todo(String description) { super(description); @@ -18,12 +17,9 @@ public Todo(String description) { super.isDone = false; super.priority = 0; } - /** - * Print Task that has been added to ArrayList - */ + @Override public String printTask() { return super.printTask(); } - } diff --git a/src/main/java/task/TaskCommands.java b/src/main/java/task/TaskCommands.java deleted file mode 100644 index 64f0007f..00000000 --- a/src/main/java/task/TaskCommands.java +++ /dev/null @@ -1,185 +0,0 @@ -package task; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.ArrayList; - -import static app.DateTime.toNewDateFormat; -import static task.Priority.printPriority; - -/** - * TaskCommands inherits from Task - */ -public class TaskCommands extends Task { - /** - * Creates a Temporary ArrayList - */ - private ArrayList Temp = new ArrayList<>(); - - /** - * Method to add to Todo - * @param description takes String description and adds to Todo - */ - public static void addTodo(String description){ - List.addList(new Todo(description)); - } - /** - * Method to add to Event - * @param description takes String description and adds to Event - * @param at Takes String at and adds to Event (timing) - */ - public static void addEvent(String description, String at){ - List.addList(new Event(description, at)); - } - /** - * Method to add to Deadline - * @param description takes description and adds to Deadline - * @param byDate takes LocalDate date and adds to Deadline (date of deadline) - * @param byTime takes LocalDate time and adds to Deadline (time of deadline) - */ - public static void addDeadline(String description, LocalDate byDate, LocalTime byTime){ - List.addList(new Deadline(description, byDate, byTime)); - } - - /** - * prints out number of tasks in list - */ - public static void printCount(){ - System.out.println("\tNow you have " + List.getSize() + " tasks in the list."); - } - - /** - * Method prints out list - * if list size is empty, print out error - * return - */ - public static void printList() { - ArrayList Temp = List.getList(); - if(Temp.size() == 0){ - System.out.println("\tThere are no items in your list"); - return; - } - /** - * print out tasks in list line - * print out tasks using a loop, number the list items - */ - System.out.println("\tHere are the tasks in your list:"); - for (int i=0; i Temp = List.getList(); - ArrayList Placeholder = new ArrayList<>(); - LocalDate listDate; - /** - * if Temp is empty, print error - */ - if(Temp.size() == 0){ - System.out.println("\tThere are no items in your list"); - return; - } - /** - * Using for loop, check each item in our listing - * if the Task in the list matches "D" (Deadline) - * Get date from that Task - * Compare date from listing listDate with user input date checkDate - * if dates are equal, add to Placeholder ArrayList - */ - for (int i=0; i Temp = List.getList(); - Temp.get(ref).setDone(); - System.out.println("\tNice! I've marked this task as done:"); - System.out.println("\t\t" + Temp.get(ref).printTask()); - List.setList(Temp); - } - /** - * Method to set Task as done - * @param ref gets index from user - * Retrieve Task from List and set as not done - * Print out line to set as not done - * Print out Task that is set as not done - * Update main ArrayList List in List class - */ - public static void setUnDone(int ref) { - ArrayList Temp = List.getList(); - Temp.get(ref).setUnDone(); - System.out.println("\tOk! I've marked this task as not done:"); - System.out.println("\t\t" + Temp.get(ref).printTask()); - List.setList(Temp); - } - /** - * Method to delete Task - * @param ref gets index from user - * Print delete statement - * Copy ArrayList List from List class to ArrayList Temp - * Print Task to be removed from Temp ArrayList - * Delete Task from Temp - * Update main ArrayList List in List class - */ - public static void deleteTask(int ref){ - System.out.println("\tNoted. I've removed this task: "); - ArrayList Temp = List.getList(); - System.out.println("\t\t" + Temp.get(ref).printTask()); - Temp.remove(ref); - List.setList(Temp); - } - - public static void updatePriority(int ref, int priority){ - ArrayList Temp = List.getList(); - Temp.get(ref).priority = priority; - if(priority == 0){ - System.out.println("\tOk! I've removed the priority"); - } - else { - System.out.println("\tOk! I've updated the priority"); - } - System.out.println("\t\t" + Temp.get(ref).printTask()); - List.setList(Temp); - } - - - - } - diff --git a/src/test/java/app/DateTimeTest.java b/src/test/java/app/DateTimeTest.java index eafdb2f3..0bda58d4 100644 --- a/src/test/java/app/DateTimeTest.java +++ b/src/test/java/app/DateTimeTest.java @@ -1,5 +1,6 @@ package app; +import com.tic2002.app.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.RepeatedTest; diff --git a/src/test/java/production/main/app/DateTime.class b/src/test/java/production/main/app/DateTime.class deleted file mode 100644 index 4d51c645cf2e7a78325acfa92540dd1c0202a2ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1950 zcmbVNYje{^6g}&gY@rY^CD0H^2#@+fFoi%;LZFZk0>~k)GwGCXinRfOExY!H(qGgs ze1I>3ff;@Pzlj0PN=mIfJO!k&cK7bR=bpXiO8)Ta?Rx-IsF@hVMFW?zm^6{VW&OCK zA5#XVv-ritRm_;UhS@Bxo4A2rwdJOPTL$I?GS@ucQ`ZHOh2p9}YOdu&Tc=kG-zIe%oocEAx($D_&F12<-E^t4_mnwMpP`!G7XA zb1DtTe^jZdj^{s`DLxcPKhr(}f^$K?;m}RV=c=;obh`5P^SW#+ujLam3t9Z^nn?wvVd=+9;!d+mIeNeTQP!f*Ipz=}7az=2-R zJy?4p>l7$v3fr(xZ}L4zw{-)uNd22&LwSv$V!B9Osch+c(r21f;h}z&4uz-Nriwr% z4mkJN>D1(38`7`KnMkl5GVaFF<^Lue9YBubJwE;97Ra^MmmNjreSzsX)vfpT>zXDL zX6RuAr|Oq>>*(?T99cex zX#J5~h6#O)`zJUX;p{l?(IE9C(zGY(HB4g1g5L<&Oi7;;98JcKVvHG%b2s!m8DJ+q z>mUQ;1~-HO<0BGO1gHAY&weZYB9mVv{Y#`UNt#p4cbO!wkjnJ`(m(y3^v~dIRQ($q z6FjO>dV`!@e#vPlp8mT6ZnAc_0vbc1TU4<$S3jY^;2er5?Ez-)2D?YF``f@m{vlX7 v06T|?2yC7yGzBZa?+q-wRNlnEPI@&q;z|tBBE14*GQ7`6ZFwO$($8N2-a)2& diff --git a/src/test/java/production/main/app/DukeException.class b/src/test/java/production/main/app/DukeException.class deleted file mode 100644 index a4c05669cfa57c2c22e5971a98bc5ff24f54a005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmZXOyNbeK5QWdgTr|e}6WFPRDJ@oPyi~zPvHy)f`fD}`FqD`AU$03S-61X&Pg z;A74i&M^1K?;n5>nl?(PS*TlR5X`X(RXQP*di@PSpGG@LXm~1=%j|nAleO3e?6kee z7r{m(D%USlPY>!$=y)QI-C1^$^NTOzR7K$z!CpmK;>(39;&0pGQTzx8It)VVBg+T# yy&H&d@BUvz7aBjF7jbizX|i$)4H$zP=*or$i)pf*v&?jg*+2z0D?*j2!Fd9XZaK>U diff --git a/src/test/java/production/main/app/Parser$validCommands.class b/src/test/java/production/main/app/Parser$validCommands.class deleted file mode 100644 index 7a7242adf3ea2fd6d2f1754078f3753829ddaf63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1527 zcmaJ>YjfLF5IwRL>snSC)lJ$aY3PHrwUaa^P|Cw0O&TkWsjx%j7)0TN;)tM*EqDCr z58@YqIzt&4n11FT@r7Y`ogvQ9MxNQ@vv=?Ap1oK4>!08L1n?2Q%R? zYzl0OY?jz8vsqztkIgEZ5*9UFIGr_%pgvD4(oJc#yD{}UT_}#Jtsg!MTLaSc;rRUI zqL#o>VM%e@1H)V?4o5F`5+q2P1WA@4DH9}d zfIY|4q)Ixncpo1?!+m162>CG+Xulx!8tI>iksPuaS(~Q#2lROu#otFtyk=fs`V|we zp>urdO#H{>u|`q&1fR+}9S%it#Wkeq2N+As*Ips>vn-F7JKb*JGj1Il67vuWn|L^C zM4KTY{QUhpbU$yTUqQV@R*0z!$qBJ0giH##kP$K^#5ROn6p~j$E(w{oM{zU4E}sNm z5q8xcMa~MFv$L{qUf4C;6t*Dj9XluNx^4YIJ*E?ShkQLj&hsY{OnQDM!IbA42`+lR zN^r^ZZF0>JknaisIcEv73FZmth!zNP39frDq4D5G=Va1kff@XWX&TCCSX+2Rz7)1m R5p?h_p-DS*IJmVr`!71XEVBRr diff --git a/src/test/java/production/main/app/Parser.class b/src/test/java/production/main/app/Parser.class deleted file mode 100644 index 8e85a0a194c353a3e58e117b71604202476f69ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4748 zcma)A33waD75;Z6c~{cLb`%_9;t(a|@D&6G3{ftU$ZibsL2L(1D6p0`@y4L zl&cgJ$9sl%T5!QLI7`=kTJTTCwA};!bk1A;umSFk?84zT>iVZ3T z6>RjNSlBMa7liy$6<<_wnTpF*T%qDh6<4YFl8UQUd|Aac9$bsBcyJvy3G!9JZWiQg zf_&YBZ{VAPTrb#fsra@VH{eDUH+gU~Zc(vC$hWGvRmCmCkESJPP4T#q zS{~EWX@hLhLNjh!izPTJt5!*HE>A=a2_<1OZnX6GbsMP;y*oyUFPwmtXLRn>aoj#xkVtRaSpxsKD@wE%8&X*wR5{}EW zn>7X|y=ajhBhs70E!H3BhOxCS<5(ry@q9DH6b&J>L_>F_3F9(pIw}5+to* zDVAw?1dnPM#!d|*c#QG;HSEG}38l*t2`g=-^klPP^(3O{k|I2=;)fdcV6Oyd*oPl! z_%WW)@DuDLxNuW@2ajl3SA&F!BDF&Oy~bf+8dji5!%y)9RYR>UR4VFh$qhmc;f4-M zoGTi_ZR|Q)L#+~A4XYYj=u!Sf=19 z4L`?z4NnVH&)``N&k6DiJgeY&4KIj*UlimeoI~S)Zuu3wtl<^B%FQw3kywA!@Kdbd zml|FZO0qwo;dT5eHwm)w>10~ztix0ye(m_eP@Jr;Hc@x#LBH@#4RJ` zH{;`-OPKY)@C5U;HT(hZD0o-HAMqy*@8Qo9rjK6Tf=R33FB;w#d*m4{But!9v)1l) zMugR5%IN&qf+1n*>Z4VYJYU%&#H3-x=@%t%T4mKyZJlvlT*+f9bJsb)l+lfGNxvSW zn=z#(3)rr7u5>bH68qdjm2h?5h0aw+4?e($%npg!acrO7%VHLf=+?QW)x%NR(&H9a zn^VZ!cxSxhDI*!v#Vt;yiQ2Z}fLz<@z zE0lqtk<6SJ*W3hIV zpDGIeAz}8ofC^!gaQxBrFoWO0i}=9|I3S5fpL9970DC^Vww1Wc~A<`mSSc(RY zwX6af@i}sC@q|+%jIX4&i+$AyG_or_uaf|KcX5N_XwkzeG6ML9G}6hpjDEN z{TF?>(S~!VPdG)T^gV$KEUWgphEe3GYpI^M3ku*RpMMHxpE?2&gjio15AWN*1^1f^S%#|Mk#dZoN*7!w~L5I_o$Xg97u`BwIu-#gK~ zhq6-c&|BmWLXw|j|2X_puVQ~G{2x5Vc}Du=Qu0GM;lA71$1wNeM)uD*4s6`W{>||H z`_E(l;rdSo#WLH;r+Jdu7ZHo{EQ*1%7)HXSVf^u6>Rq7T#W>RpR zEtpd35rT;nOtl3{skdG!Q|@OZknR(dKQG%7Hj!K+)?T*D*sf;V#CAQ~Ug`(gB5Ze! zpdus1Yez6`7{}MEWvVkeg6SD)^${X}Mp|)%XhudlZ3HtjQeXrpWTYxi&&o(Mt9`SX zAw=y! zu9#+(8SE-|kKn{D@RoZ<5ZIbsmQn8vdJ>x_#`80%2p-OE`dW|~P4*p- z)E!DiO@yTdCN-`1QPZr(-hCKn3PwCTAC70q^x9-qgkDKuCHXXGt&N zZ0S{g8oq^<(z|Gv-b0u4G0vAh!D{JK=&}plvWAFU0#o*3om_^bJO!7?Q?Xv2jt%lm zTrSt(3i(uADKErT@)BGpufQg`8Jp!c+#q-1M!6d|$uZn44`7>oIc}4$#qIJYY?rs< zUiofhNa!VLT-7#-ohrVR;`Ok)Og&`DyHt-@sn^ZS0fZ#gp>;cuM{V`{e_8 z*5Sl+j$`n=qXI8DX5$s^z)Oy5yzHpMYmR!n?wF4^983AlE^>GuCNV}2R-zp$Bg~B$ z-=R?rW^-4XSrdj(f=;Z0mxxrH%ly}fM@1LTr>qO9oL&qUVKpt>jI0wEaO5FA7d|g+ ziEJV+Nx@*k`hOo{y~6~77p#+fdk&*yR#9b^WmS@kRxMnYYbz*2iE z&)cDi`S51da>}_br^z)v=P5Y#AfF!Ldz^z3&xB8Ll5~)96`Ci6pu6Z3nyumKIQdu= oldk1hMi0!KY%$K{$Vb^?X77?S%kek-9Uq|_Ny=4PUBZ_7FGFCyRsaA1 diff --git a/src/test/java/production/main/app/Storage.class b/src/test/java/production/main/app/Storage.class deleted file mode 100644 index c5864daa99513be4fc11168dc32baf1001a2269d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6410 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 diff --git a/src/test/java/production/main/app/UI.class b/src/test/java/production/main/app/UI.class deleted file mode 100644 index cff1c0dbefe484b8a6e96418ce41fe955bc5cbdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3488 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 O*~0}wR)kBYgXjQPDnTUx literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/com/tic2002/app/Parser$validCommands.class b/src/test/java/production/main/com/tic2002/app/Parser$validCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..7a6319fca7cee8f1dbbdf0926b9adfb814f6e9c8 GIT binary patch literal 1611 zcma)6U31e`5IwRLOO_QP41t)B@?{b`fjCJir8o@kdhpN5JZ17BfR!>Wd= zf$Mm}=BbVw1}#422uH_l#;fNA;8g6&kYXv(YcOf$x`!Y9x64ZkJV7J>JXz)y|@Eu+?@eI!udC&0RLjY)Z&0IP+m1ERK5h@$7WtTJ3H`I?fl0 zV;!jCr-sbAdfkU!WVcb>oh2e;*6_E(htxUm#(};>K9oaPxoQF zhA+8vY)H%_=-9-gQ6b7K3E}7OKcIS9E%_Gu8>EF8s*sEjb4tjxkTWSEGeRs)$XOv- zUC22h=dDrPtgs6wfft3%S)<6DuuE22_FWcs#WI9l750gh5q8Zo|D+m|F}-J=8YAO+ zQ!%DpFBN0P^|TmgT~Cj3&h;#E%@UCBA^|yb1nC%;31~!D2{JLRxo@Cw<3@8bsIx#0 fKVgoVGHTWq9+NMDZBztp+#)n+hYA}vH*^02#9>B) literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/com/tic2002/app/Parser.class b/src/test/java/production/main/com/tic2002/app/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..3b662e15fdb582f1e31a3fc32e7b6fa989e7c00e GIT binary patch literal 4963 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 literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/com/tic2002/app/UI.class b/src/test/java/production/main/com/tic2002/app/UI.class new file mode 100644 index 0000000000000000000000000000000000000000..fe5f21a320d6d213f01d2ee25b4d04be16c0b57a GIT binary patch literal 3606 zcmb7GYjfMi6+Mt-frOFRmfvw6t5}L9SuzzRZCc539LsXVTCZBK+LFSo$Q20-1Xuu+ zOjmumY16vyJDqkq)6f3gOk-=3nf`$Ok^YL-JqyqlDYKa=IRtm_-h1}k2k!1a|MSH^ z0K9`gTIj{3iL8Y-Os3I;Z&`d?w=jii6EkVdV$OnzZ=1Mb!Af-IwPZmnE~c<#;WC!> z<2zd6riokHY9)nL3v2jLtL5~{M<%3+brbm%3SHd3l!BAOZN1l~MH4rLatfXa-$cbg zXGI2~3Jjc@%KPO^)7U=KPTFFKwRT{6(#*T2NA#{B|e4ox|pnyHr8Rj?q} zT}ry9{JeCRWZ>v|UDy$ooY26rCVWkOF-z$7pz0YgXe<&|uJnqTnX2o~`HmNlM_U*=jVqamBBCg|Jb%w?X-<^h^f5EWLtuFph4_ zaXtzhuSiyQeR;7`(K+gH85RR=4*fcs=*QWZ&r8o!0S#W5k7RyxT2|r+nfR`ORDq66 z`9)vb$A6~s3femZrl+=bsJWBlg;7w=>u@ln*1TU0^6HwSV{a~IFKBW$1~J5)Ta$5yt1EA zQwY&@gwS=X9H_Th@4pEkN-PjC)UadikrR}k!q&?N|m5U-A8j*_M@Q6_xx#c&HN}r|?r7Kf@;m&QB`W z^#?`vTv_MI!iJD)1kB+9V)Ks@vC`pg&8-5_RoY09_zm%yM zpxegJb&P+3`v!(JtN-U?82`Guczr^Ylv@e)ros=3(sP(sPJ%iywXxyk9VXhX4T?%r z+BGXWv>lFGX|+Wau~JZBK5*i9e@$fQ-Ad$?)tZ%#{DR-SY^4iI7W9kPEEk#enyB$J zR4xw{3WK6lx==1t+t-?2+`HDqkcfOymceFBQ%FY8FOy!R3Rc=>|4cN(lD{pa>n6_V zEw#!%n7UBLN>)0Q%t4GFk92;7Mzqqt*FY>$$(K}qQ#c#-Xq9D@FNuQW9z};CvC@^m z@dGESi4{k;wKcIa+_x|*ZcI$iE=}~a(BABunqAg|k-q7Pt9tNO-(>cK$^N>Np^C&) z5G%bw6tS}H2L-*n;Im|8z%6xsNTKCcdc9WX&vqnqirEDBzkrKbmh0ZDG`oIV<#`k} zh>~7u;N*VO`N$7sk?kwx`m&H5VU2dRFjD1br<&tuvbrx2PRTMm>8ZY?!R}kohg8Z_ zccP?i9_#CG)wd6X71trpb9Io$uHL`W%Hm+;$4!2m{YrP^a7p*7m=Za*g1N;L&advB z%OpC-V`I;Qq)#`C+02ab)wu8F zWwh)>C62;KdJzwfH(F6`<#0+@ZIYD^bw>xQqc7XPWa3x44gJnQ&tBRcZ_D3QnIzT8 zw%25y`K_7w1Md)1zQ0-JWya3xV{qJ+VW`OE&y8H_7)i&Qw&Ilkw8|U7UJ|%S{UpF}!as_RX7txa-3w z_i%ueFY$766f;=HEu4=3Z`bE{@lrg$k27>f2jCtApT{{nLHADK2rXV_pu6!pgMF6n z_YiTAn8W(YgK-A-IxS}~O8gJF!x&a^5d~g$ik#o3ri=Fw@&3Ne`CVG=;0ivb86Bb)_~8Y#P{N&|=9@b=+XWBk8u9 z%@!BaDZe^vGh~jWFQa3IRAaBlpm&0S$53#j@14h!z87AK{+KFdCve5MCqk+6c~OsU zIQM>dZ$wL zHx=bKIF8U+SjcD^Q_OVO9X3%d^TSXzIB|1yd zri|0c=uGd=z#bDjM=|qVM4q%g*98|o}Q2PQh@Lf~@ literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/com/tic2002/task/Deadline.class b/src/test/java/production/main/com/tic2002/task/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..de44c47bc837b50a697b40e893d2e88382c4e894 GIT binary patch literal 1379 zcmaJ>+fEZf82*MHwv@$UrE(G|2-+@(MLbg!rL{^@@B)H~UQOE#EZy!jy91_oK8BB> zi3G!i58y)?|Jl}9?P`<$GynPf53}EYTz&)a5HFL^F_XZoI2#ql_S4IKq+GEDrl8&pA`u7f%gGPz(LvfU!U(R$FIs2U^9+xAPsr3-t@ zkf7RyXUjIRI}GE!33#hzs?K)0my%-7dawAh@S0pQ*cfL1Z-+Sy(YHeV20;6c zD@0SoeIPzcXVzG{05j497l;_k=ZG3B=ZG1RbHo+VJ_nv7L}#E89Y+ik6mt?Im_i0O z=r)a6(q1L4(TRyPt`SGkF-kTpxLwB>2Lf5yc=40 literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Event.class b/src/test/java/production/main/com/tic2002/task/Event.class similarity index 62% rename from src/test/java/production/main/task/Event.class rename to src/test/java/production/main/com/tic2002/task/Event.class index 45ea918c586631f462bf87b0ec332d09882817e1..c3a0c6c05853a140105b43aa2aa2956cb44c0093 100644 GIT binary patch delta 100 zcmX@c@rq-@Qa%Zv$}Wi((C jZ#{=T)S}ZzvA(T-%COXhErhX-FJVz`+fI5=8u1${0884Y$kC6 z7m^soxQR>>5xvP`LQAjc*QAM8lZfLr?Q>CUE+rUuIgU4ym_ja&X>ES9m+7vUxN0IV z5Sw;ASIr1SMn=~JqItjM2=o+O&spBCZa6_vZd9o0E%>&qtjWOD`=&Cg%5EsoU$FgZ zR=M`%#KdG)$#5$>=X#}_K>RM(bw4Nxq(%z&_W~9WH;T zwhtk5RNQnspdwM_W|**RRY`kmN!IEdn3xqvuKL@7?aaBFsDy@|(I_mOM9RWDm=icr zhjq9*6YpA>$AX1Lyl0_+CBkT9QXgz#8FLm^aLvMXyl-OFLJ=PbWD_fXEj*hpmYu*! zOFo{Tu1aN>NpD(rB22qpdWZF;D z#rd)fR-I3`9nW@hqc@pXmi|BK&8*tm3VSD1PL%<^p6BN5x_3bM2M2XbuGyd4Z2`zt!TuPkf82nIbPMl~q?cITLpU&b8q?sy2baXZztS zdinoZ|8#&8j1=E}+-126uEyA7h@a}_e!gQ3C7z>fHRS<3&s_qiaGDwhiyslCC-Cjq zE;^QeMdZd~M3;YoF%^wmGE&AsbQiIQ$P7eN#xBg?5#L3kaQ?zBlHa3uyj9(~{-q%v z?fp5b{8nNJandW?>*<9`>}ui{`?JK1=~7$kv)2v()Ucoio8=Qo~wAFAY9-LpT$EAlVYRciW^}1OUj>{_4^k{<}TYkae1`P?*^v(9tH%tt20Ce}$ zD}=k~rvEe-I`5Iiq+6jok~)X--3u9_QwD)3hP~4ZKnx@F(r_Q6L?pqRSKuEANpKe= zSSL3qAWW}Tf-%wojMLBXb7GA2AW$|z)RUMBsK>nsAbg6@H;SPS(&@_@4-j!eOydFh zq?q@FltN>KNS&eU!zsc8ku!8(K)pcpy0&3NC@g^}l0=lER?L&kg%+tX%-|u#Xn2I# ufPTs&2UMazgZ7o&t(umJZtkk9GhPRPo?p;Eo}(vdPb;98;0YoLA^8uPpe4Wn literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/com/tic2002/task/Priority$validPriority.class b/src/test/java/production/main/com/tic2002/task/Priority$validPriority.class new file mode 100644 index 0000000000000000000000000000000000000000..57bc120eb7ca86b7be00bb35d73e21a03b2be49b GIT binary patch literal 1327 zcmb7D?@!ZE6g_Y4+OCuV6UGmRf}(5#*+39=1BWo(lChag(8W(>R4i_t={gesD;-gc zM#E?SDC2$4pLNRb3XQ5++cjOAGk54^$E;JA(BIS~Pug~DkMtk?N9TM#woAf!uWVX2 zP__>o(`&gzB}YX@OIK^1aw*E8sje1Tr&Uj%Th(qGf^Jl`)^KRz;b^RD{nFl{RrP4Am2P3hMebJV_Zjzgq`Gi-T?a<0XOi^G4AIZ0 zWXAdI0C^f;c-laCT7nQhz9ld?!R4Y@MgWtz0*0#;T_evQy$$vezEeo=C}Nl*tB4%O zPYWE!FB2cH&_i;&YJ`DDlY;P~Qv8 z6xkqUd1nPG`k;Yxg{hJ=M#Vn-jc+6&Mqho16KW3g)Q_{jfuAh!{0rntNRy-!1dgGL zs85zfWQeHW?-x-}L<5Qz+*x3EAt U9}-9kzldS-I-zAO;!k=`4DSlzZQXQOAjuH^~@?nzsE>jGM-+!oL` z`n#6EbVJ(K*6?7*a<x8V?-?zR$9oEfxI-$6wE9D*Ydw}qUVKuwswxDcTbAoJEj0i)hB&5TxP{di z3P=;7(|G#)rSi>359tG)&H9r~ZXl4pbQENC;cT0;5?H>FpRhSU1A$8CKjsw}3+4Y= zDV6`d4)X}{VX04}9!jU3W@OM)BK(!F5TCj6;R6=g+v<^h!u6^NAM3Q$J311hQNO zuK9#MO87^Kz$g(Mjn9=NS2LgQEqR P^660pXw@!+=!483pPI;p literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/task/Task.class b/src/test/java/production/main/com/tic2002/task/Task.class similarity index 78% rename from src/test/java/production/main/task/Task.class rename to src/test/java/production/main/com/tic2002/task/Task.class index 2e6f99feb61e6f83d1340dd0fbe885f16a0e7413..9e8f4818f8f19fab5f51a16b41509ad553a0eff0 100644 GIT binary patch delta 64 zcmdlec2#VHDI=e_PjY^)eo1Dsk%57c{$_JVekNW~WTDCK%u&3O$Re8;G550r09sHI ARsaA1 delta 28 kcmcaAwoz<@DI*iN&t_*vekMlF$??oljJ%tVG550r0C9K+a{vGU diff --git a/src/test/java/production/main/com/tic2002/task/TaskCommands.class b/src/test/java/production/main/com/tic2002/task/TaskCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..d0cfcd3e186ab56bc6ecb28bde92247f44af896d GIT binary patch literal 4697 zcmb7IiF*{~8UIaol07nz7zkGo7RnKlkVRC$4&j8qKOFk(20p)k@hL|}$-EQT0{qsSmDJ5~ebofz_P zWjP}9qY<2l;G}$xg>jFl{#*kTd_gE*ti^uZE00sMabE=Y$M677%i>Ehd>Ic4*F!OU z1z&C8*O>-{M6wZ&MDS<>RGbk*j|=6A2%e1KDG~U3l7#mL#5FUC+Z;z9>oxOkr-Ep|Ib`YXh+`;duf)^Uo3yhD*Gz8Quwi4u)$_xN0X{mn zP`IYcv`lx4f>86i{WR5Wr>Lf`*R+hjk?f%14CsRyQW|>gq@LNYJEp7yqUxs2yn^MG z^>^FZtZt?9v=Y`+sR27>Gl*v2!;EeXCHh^*w1zsxaBa%SCml2Anzkj@yiiM-6hx?G z$Eabs3f5N8QZ6ETt8}v0QgXYYr!tI6!Pe^vyJpr%c!6%$U8B?2SR@W`+jF*Na7-Ac zQ&ME{nqOQ&8R9%6+apfW*l9}H-5_#>LTZ-<@E+;oj>K5km^F-9Jj+$dNP-BsXl(?(pfG?S%6 z!%uLrVzlJd@Kaoh;6-uaB@Hj*6%9YbWeww)&@hQhtg`K4T+wh9QyN~yYhk>u;pccm z!<(22;};r!iMJy7m1y{N1i#U6KyY6j?K6|cig?f3Q6rw!ona#tmnq|<D z?dPY;((kwJk?#h&p09L zowk#egK=G{>Jn`w;RI*2g2V?6E%uh~awfPuG4hhQH5Crpih0{mqPnD#r^n$e%^h(D z8;#O}oIid!7LL7H)fgOmGDgDqlgzTeDOgqPK+_tvhmGJO;&;kUJ;^rbZSNn5CxI&cHbqTaH1f|LaWYCS?n+ zwF=+$EfY{$rciZo0-?)LU-Gzb=2NbW2ww{HwzoEO9 z2SDA+&?YhGDw%j#*GcRO|Eeiqm>_)v1$(9i-wYz%If?q+E#tW195m`^Xb@@nn8%M$ zSCed=$4XL~)FUlTaHRL|ZTS^+boGB>phVjcmRPkfgW znl*%FE8ja9lH^n1TZXmx6n4{FmAg_eKresVG-VT4d-$tE=v~YYqv~BmmH$#%6n)rB zHWrieD#gQOy25aJgIe0tIx8%$7j>wM)hk%6;4E&DuO$i?P)GIR>TxtREFH&&E9wnnuaL6r#pyNKW*s}#I8skoCU93p~;(S*B*;N3*+vqbL*@zQZS2FaBq^(a?E zNb|o8Ot^fXz%iUe7N=n2A-*5RaXbx&H@f4z#m=3+gdwj8 zmoOmUUOIG&Wpf`(^?t19-`F?d^mO6T0uC~438_5@saSYIkwBtMzz2BNES|0VP@X+X zn~%}6$LZM<^z2D`_SA>=?C`W_4+fa67gyM^b%Nb>fFh!;2P(n!EdTe$bIcsO9nYf~ zFQAPFU!hMyH+{G?PI!N=7vSqf;{Yw$YhAZ9yWNE~BmK9OjCnY_GZt zsFlxlAHD*YH(&h3wgrjxr^`zE2-cm-KUC^*iIe3;R@W<>A(uI8#yMLiJdgb$x-IaS zKFHOdeyN;B;=5n7{)`byp;DtVU6y;58e*%-v2_H0p|Nm)$zS9&lc9{d6R zDC2D9CVP0hZ|2RL+4=tY`~q-=a|?M?^QftN$0XQQu&3yL4hK0LG8or9=JJN2Qtvzm zuYorX;*r;t36DqZMvozTD~1t6vBTr&aXuMDi60Ec6mdEt492}6;fk+GvV&fENHXM}ci))8k8&8{O#Upkf-59!sUYK z19|6Ynd)euL0}OUi1mqUbXVPrC7A1IOJv;42eJzE_f&7IJaob$;TF}E2pv>V#zvY; u9k5Axb*hvtkw0yX6n}lZlmoiEgz-iq4a(M_Fi=Zv?DVa#Y-ppYs`3l<5oJIC literal 0 HcmV?d00001 diff --git a/src/test/java/production/main/duke/Duke.class b/src/test/java/production/main/duke/Duke.class deleted file mode 100644 index c873dcf5588c54a4b3cf662b4700cf06007caa6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmZut%TB^j5IxftN=tbZ6nrP{(1l&Pz_`Jfm^8XTNsOxtGv>(LRqCa7#=0^iD>4{jXdPy3|y?i7T{bBkLcxN0~ z(U=Mu5*n>Le=MGaHxc2;>n5=bNA1i)#3LT6|I;Se-6)L*!MRkPmQp-YA`Wa6dD+F< z4hpaw>?+FowI)TTc@~6#k~SEoHG-sa!2Z0o&zL?ZRrd#1vn=}bO_>jAnlDo=~JhnXLExFgo6-{2Z zDUJ{g*G;eHS}kb_hap^7MH!OU%lcT9UDY38_hB&%wWv{9p&AThnQVWL46y@o>ekGX zrLd0tMY5`fr6Z0U11suyfSitpn9%VEQ#u~wiH@gurehj28rF0?#|wthZ6Ty5UEbO= z<*}%H@d(zV$m`g^OUizwSwiQ_9dyY73-HG(+bseXs{3;Yscq2OEUzdWV%P_UDD@~@ zOVWX`6ckdgved^;P<-8cb(w!~DOSYdL44VRkQY2Skb2 zq;T6BN;H_V5RKCoVcvBd(=FKC^Grhar59N@M`uMl+^O59H{S{DUhm$Qq^E%^ffd@z z0QZkQ{_m82yPG;AU=*! zqBlwUOmc|Mw6SynW+Va^2pY@h2pKEq2phq3L=@4!`H|`ql7dEb5@AeH?rF+2gCy>d zl)@}Mx5#RAa$<}u>X*iCs?B_E91~Pi=_V;ANLqSdh$=K&z6>Od3q+0Y2>rki9pOvF tfUo2bfPxV5Q!V z3tf3!=t@1Vy6IXMsi&UfaqYsr|BA;W{$3JF5KfcKd-vUs-`wB5cQSwc`}j8iuVFKZ zq$%_7sre?zmX!`6%$uY z#PR>y>i?@w?pD{h%z69xL3F_hq&!z0GV<1+KT5(|74EJE0x8HRbxAhCbvZAY5LH z0*33=>PjGCR~&n*1#9HBO!!t{UAfill^~Ei1vga8AX;*^YXSoYQ{JiVrG56OxS1A- z5}D*?3DQ$k(%xE@wI){+a{|etUk_|&-qi(3Xu4B6a|k%kwkaQrQ)j zF{9(djO%4~m{X=o;wIKCtmBlxL}FntL{*%p#Y|iHK&Rb*)%R7X0$E#jRK+iceKFjK z*Ku_3WCv+<#y7tmK*EwWy+xL`oJ&x9jSC;=jxouQ!?WDRBDrcJkzMjwaEV_R78pm9*4vySrBCUZqs3zN*cB*pt6HQ4E zLJ}Y1BMy8*Ol5??;I`ay^1f$FweG44rBF#vG5^uA#lzL?tU~)qGx4$RpDi%5-!s>{ z?{7Knhp`1eFKy)qJ0@7$Si$$V>U?;tMbBgVsxk~6-t)W8nzb=nqp~2qa@7e(T7kL4 znRRFm1eW+f9^rng!+)>v9jZ1&URJ9`S2;NocLmNJ;&)VT0>e-D!x^ObAFDrI;M5|` zb%3WVcfsA5cm(lN(>%yE)>Ovu3}vh3fFV4~QvxS(iW&xs9}%S|@a;qcUCX~Ba^n%A zE5E>)jz%sSX=5nbKhAR~4DoRH&q+r7fZm^B zrFt6ZeTd6i?4#I3)aC~mp)PGi?@aE)_CLlkfNo8gzciC5G?Q8MaZSQNH+sk=#q~6L zF-iSJ^ka_aC6?woi*lP0Wpb{O>sQ>rAyZv}1(@`Ij^AN2Pc!Z`GDO_OL|bAFSmI&& z8u%J#DRmL|OFWMezN}LC9Oo!S@d7;tp4dj8*hXm^qiqSXUEUyO@;%4PM1()~XBSgV sWmDIwHeej^1&;lLr1+ch5oV{`eI6U!lg#`M*-3JnuT}ycvhJrBOw}DheMcD*#0wGyMGlJ1?Wot%pYnQGg!QbQu#RP~Z z{s4cJ@!Yn+X7-`?_CEJH=Q;P>=l=Qo^EZGs?5gNRMuCPU6)Kh$JitmEx{8N*q~bAF zRXo8{vG+{InwT>(p38V4AzH8+o`jLYiE(P^P0y<8Tdr%IiEvheQnV_z;Wb@T!c3=} zT){IMpY;O{*$o1^bCzv+8xp!w=|j@zoid^Q15kWW#lxx1f8E$b{#Kic`M1i#Zxm$6=pdpoK1?WT9>h@;T5)Iyw;G% zu#7hvwguG=79zEZNyTp}AGVuIT$mCuYgZraws-@VWeG@vPyQ zH3FRGZM#{H{?4^*ujsj^QDgT6#oNR5rY@4I_J4(lvh0d~{e!+dAt~?FYKC2A7pXof z?=)>;wo$L^MbB}K3QdeRj8ii>OteAMG0nHr%eO?7FqHEER}l=NoB#Bg;~hqH&JyQX z<`U9(KV^iYNCGKF{n1ZA0%Ke$xQlxv65#C{@DD@;xC;WTavMyDa@9&OP94AmKP{+< zaq2;+>^`X{F%?oz_!&U-9FcF#p;H_KSrZ{5NyIc}xF^KCCsGJa5Rth+*N1aNhhi7# zzJh#(`0d$75o1~kaimFFMm=NHtEm*@%YX$ABWo+3#E>3^=D0R8{~ diff --git a/src/test/java/production/main/task/Priority$validPriority.class b/src/test/java/production/main/task/Priority$validPriority.class deleted file mode 100644 index 2af9e2d11a28adaefa1938d1184ad40049302bad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1243 zcmah|?^6FO=(K=REI$*_Hgg+=txY1$7ar#Yf&^>X0-_+G&u*_3w{jJMsTb#vX)=wf zPRA4HVb%4-9&I<8%69qicNQ){PAH@YM#zZ6)E7x%40D^<7Ly;Q~b9Ct6BI7dRX z*r-|cZOe0*?UYh=tpj3?{!K@%XB^k@X`aLXs8%Q>wrME-D~Fm2Rh&K7@>?EJsc{)G zGPU|?x)Nt-s-r~CZ5?F(D|eM1AY5s*yqf*U;of`C-f5m27cfe8)6X}WzK#bb#(7~T zOk}YpF#ex+H8F#SCaz-L#3;u2>zauuhD^lx80KRHLjsXM17^9Tpo^9^p;m9Wq--#r z=xD9Hvv1dYQor0eG`V!?4%qKE>#jn1vCh0x7)><0KpVkNZuu~{0p}sJ|b`eF@K>jiz_ltgC!I*BE3FM zlU~36l@gUUty@)X!>m+;ZA2_G zh#Nt=h#)8~`UCtW{sdRm?@k*e8y&dkbEMa*8YHztU2skgRbQ{(!U65!Apl288fi_qvo{79Y!3#JKI*Pwd&6W z#7Lk#n_itE$l{3Oj>Z9VTV&q}to~8k8igIBxX#eXbKGFsOdv;O^ObdMH3yb^*z5$n zK9n%T9g}&yGaP$;`;jBZNKNZDWraXu*Y<<9EeG|JNFklX4QwV+L7oUb^U1RpQnw#I zpw@dkt;ahwK%kkC1!AGU$2|xXXYOX_6R7n5Grt}Z=U$g<^?&DL1qL61{8Y&aY03<} zCN*gyvhfw-GYtioDD^O?;xg^zc>=PSqZh+Ga*W90x6F=EuYZGLHcs!UTjkORgsQ}s-4=*BhXnN^G>MHX$Ws@1 z(ooM3i=rsR{4Zj}SY5v0;!?{&YK2dfAf8;l>lvic+&orHIC)^j#F wVl85cy;hmOM%=%%*W_PjrsSYQD=CUX+$DMnmbqGxDW4BF1xjfdNZc>{0qiEO)Bpeg diff --git a/src/test/java/production/main/task/TaskCommands.class b/src/test/java/production/main/task/TaskCommands.class deleted file mode 100644 index 5dd890371faa96ffc17b51b518bf12438b7d4524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4397 zcmb7H`+F2u8Ga|b$zC#$3j`=Z7?4YD5U7fhP-sa&(uP2r08+eUvO6V1c4xLTv%%C$ zRcNVNt@d8LLn$g&DJ>xdsjask{11E{|B-4@-|x(9c9U$&)91;~oH^&ayx;qM=Q}6= z`0tH(0DKmIPoo9L6Zm2pH8`F^7rvChm(!@lSJD`TnZQ^YNn{eprjdq~!Xr2#E91@7 z&!v%vBcHD57m|212~UQ80)dz=HbcWH8GSX0sWcwL*W}~tX?z3U6v4;S_!hq1%+cv) z#Bf?xpGe}#X2j)V6i>;_ca!*D65khvr&Ij?K@vYq;+X_~q#-_H7wtPpE@nGEcH7qIH>~r&Z)5-d@oG`Q55jX1+ zY+HyVXF4akhXc=cPV|bi`mE(=Ji8Fst|J~)NR>hwk~Fe+(sBX~o2pn@s3LZ2Op4c2 zv)?kaIYy#k_lGJ6cHZh%!S$Pg)f-wYPmXX|fvp>x5`kIj%OXmTOpZ;7a1{Y%Lqod2 z$b&w&DAAJm$=|f__&Bi?7Lw!pj;O_qcB0 z2cB6tU-Yn%=y(H{6S%75O}v%FHBp&P;<}Cpg}4o=Av+fu|3l#!kVy>x+mEp-+4~04_#U@L6lwprMeO65Hl0uhiIC&;n+36?Ofa2q8MDG<4so1+a+CfSWI1WA%mFja81Ds?2V? zQ|p*#y2oIIsT5sEs}3us)cxlbOw|2l!zS>Kbd5i2SYOVc?M%88R&*YR#k|kV1gN)0# z#pkCuvx~Pljqk>e>(DxGqUP9j#I7O!hLZj?pK^->7V(1DgwJrKhw|9Y`zVmY=ddHP z)f3s$Z=&`X?bXd7G2hM#`oF8fj*cGmDmy!IPh@8=eJP(ekv!JXc^#=Lh71B(s|+oR z0EUJH>Mok(=EH8>8<{-BD{_o(7T-jgCcCbqzKYFu>UJobMkpPDqaN&oANuJr zg}t*Rb}9rw!&T@rSagFzm_~!duA$7~R?csu;=WnM_o7Jm&7kptj%hTVgH9XG&7v)X zB^<0BbFJNBc44|H5EWu7J zWdN%Pek0-U=6f%3NIr$W)!2m3V?WWxDJAs+4Dctp4rjLV>wf+k5c>d26R7zBDed1h zmcj!Vq!^1yyF%eQ3f*EjgHbIV=$sc;YLLu4$}%1sxT0twSA~ zr?F~#ZAk>RY)K(eqf(rIvVnw5#m7 z%%Yh5XPL!^$Qf{uK^-C!hsoj*wBjgP97P*UaymwqGF;7a)#7LrHgYKN->k>s@INIV z&mdsqDzY2`p3kQgJW2OqjDtq3)i+X4dL2W&Ple`AaNV3m@WR@=A8B)^u3STWw*JPwfE7^>^+Ew!tCK` zLXd5Dw`8w#WhpUh$yoC`)*;{JS(5fi#ck&d)(d4ZRd_2^{!bIo8J5ZuEYBwi`Yg-- zso7$q2MjZG3293dQn}b`6`h1Sao+q*w=;=iwd+B2%J3Nc* zY{c1SfwGBEgu4$Rij1}$twz^*{>y%WnR^xMaFLbu8hiJp3Q(IPx}@QS6;PrpoC)bV z!paPL`YnQzX19l64s=C{Y`uo|)^k`aK-o?jE}>qA+=!Ccl9cKxVPdL7nJHCjN;=9K sRjDx?qpKP`jQ99XQ~6K$3*P0iVe{MImO06}3H6**&+n+`8TCB-f7_S(dH?_b diff --git a/src/test/java/production/main/task/Todo.class b/src/test/java/production/main/task/Todo.class deleted file mode 100644 index a94de81dd5c58620efce1932592a055c07d9ec66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmZutO;5r=6r3$>p`{9z4;8=l0yVKm4;U{R6O+aZ4F_%o8eGLLX^RQ}N)Lv_gFnC@ zWqi9KTyzh!Z{E(EdD-uu&o2O%II~egvxIGV?^p!85?Ye(6|rB$0fTwP6P{l)G}^&a z^cwloD4F=ZJmtxx+vzjtH)0$!R05vF5A&B{oQBbGN*y;4qiEWXQZD(bsppS8V<-oC zls)^Q7>h2kah#1(KFhgC*h!iQNex_k$^o0G5R=*}sVG)1 hy~^cXfFBo!xbXH{m@2D0Qi N85y(~7#Nrsv;lsg8s-21 delta 100 zcmbQu)66p=l8Mh}WBPqYMxM>VOluf9IT=_OxEZ(@cqVhOII{`>*@BY;SYlX386+6Q yCvRj)Wt9Q4 Date: Fri, 19 Nov 2021 02:26:32 +0800 Subject: [PATCH 16/18] Improve Individual Feature, A-Assertions --- build.gradle | 1 + src/main/java/com/tic2002/app/DateTime.java | 13 +++++++ src/main/java/com/tic2002/app/Parser.java | 12 +++++- src/main/java/com/tic2002/app/Storage.java | 31 ++++++++++----- src/main/java/com/tic2002/app/UI.java | 38 +++++++++---------- src/main/java/com/tic2002/task/Deadline.java | 11 +++++- src/main/java/com/tic2002/task/Priority.java | 18 ++++++--- .../java/com/tic2002/task/TaskCommands.java | 11 +++++- 8 files changed, 96 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index 196ae25a..9710c77c 100644 --- a/build.gradle +++ b/build.gradle @@ -53,4 +53,5 @@ shadowJar { run{ standardInput = System.in + enableAssertions = true } diff --git a/src/main/java/com/tic2002/app/DateTime.java b/src/main/java/com/tic2002/app/DateTime.java index 7197f30b..0c4669f4 100644 --- a/src/main/java/com/tic2002/app/DateTime.java +++ b/src/main/java/com/tic2002/app/DateTime.java @@ -62,6 +62,7 @@ public static boolean isValidTime (String time) { public static LocalDate toDate(String date) { return LocalDate.parse(date); } + /** * Takes user input String time and returns as LocalTime * @param time parses to LocalTime @@ -70,6 +71,7 @@ public static LocalDate toDate(String date) { public static LocalTime toTime(String time) { return LocalTime.parse(time); } + /** * Takes LocalDate date and returns in a new format * formatter to format date to "dd MMM yyyy" @@ -79,4 +81,15 @@ public static String toNewDateFormat (LocalDate date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy"); return date.format(formatter); } + + public static boolean isWithinThreeDays(LocalDate taskDate) { + LocalDate yesterday = LocalDate.now().minusDays(1); + LocalDate threeDaysAfter = LocalDate.now().plusDays(3); + return taskDate.isAfter(yesterday) && taskDate.isBefore(threeDaysAfter); + } + + public static boolean isOverDue(LocalDate taskDate) { + LocalDate today = LocalDate.now(); + return taskDate.isBefore(today); + } } diff --git a/src/main/java/com/tic2002/app/Parser.java b/src/main/java/com/tic2002/app/Parser.java index a7785362..46cfd4ec 100644 --- a/src/main/java/com/tic2002/app/Parser.java +++ b/src/main/java/com/tic2002/app/Parser.java @@ -87,6 +87,17 @@ public static void priorityParse(String description){ updatePriority(ref-1, priority); } } + + public static boolean isNumber(String input) { + try { + Integer.parseInt(input); + return true; + } catch (NumberFormatException e) { + return false; + } catch (ArrayIndexOutOfBoundsException e) { + return false; + } + } /** * Takes user input as String and parse input * @param userEntry Takes user entry as String @@ -112,7 +123,6 @@ public static void priorityParse(String description){ * find - find tasks that matches user input */ public static void parseCommand(String userEntry) throws DukeException { - String timeDescription; String description; String command = userEntry.split(" ")[0]; description = userEntry.replaceFirst(command + " ", ""); diff --git a/src/main/java/com/tic2002/app/Storage.java b/src/main/java/com/tic2002/app/Storage.java index f3eddfeb..45c637a1 100644 --- a/src/main/java/com/tic2002/app/Storage.java +++ b/src/main/java/com/tic2002/app/Storage.java @@ -18,8 +18,8 @@ import java.time.format.DateTimeParseException; import java.util.ArrayList; -import static com.tic2002.app.DateTime.toDate; -import static com.tic2002.app.DateTime.toTime; +import static com.tic2002.app.DateTime.*; +import static com.tic2002.app.Parser.isNumber; public class Storage { @@ -44,13 +44,9 @@ public static void loadList() { while ((sCurrentLine = br.readLine()) != null) { String line = sCurrentLine.split(",")[0]; - try { - Integer.parseInt(sCurrentLine.split(",")[1]); - } catch (ArrayIndexOutOfBoundsException e){ - System.out.println("Error in file: " + sCurrentLine); - break; - } - int priority = Integer.parseInt(sCurrentLine.split(",")[1]); + String priorityString = sCurrentLine.split(",")[1]; + assert !isNumber(priorityString) : "Error in file: " + sCurrentLine; + int priority = Integer.parseInt(priorityString); String [] words = line.split("\\|"); String type = words[0]; boolean isDone = Boolean.parseBoolean(words[1]); @@ -74,11 +70,26 @@ public static void loadList() { LocalDate byDate = toDate(date); LocalTime byTime = toTime(time); Load.add(new Deadline(description, byDate, byTime)); + + if(isDone){ + Load.get(i).setDone(); + Load.get(i).priority(0); + } + + if(!isDone) { + if (isWithinThreeDays(byDate)) { + Load.get(i).priority(3); + } else if (isOverDue(byDate)) { + Load.get(i).priority(4); + } else { + Load.get(i).priority(priority); + } + } + } catch (DateTimeParseException e) { System.out.println("Error in file: " + sCurrentLine ); break; } - Load.get(i).priority(priority); if(isDone){ Load.get(i).setDone(); } diff --git a/src/main/java/com/tic2002/app/UI.java b/src/main/java/com/tic2002/app/UI.java index b522cd27..85cc0de7 100644 --- a/src/main/java/com/tic2002/app/UI.java +++ b/src/main/java/com/tic2002/app/UI.java @@ -16,6 +16,20 @@ public class UI { * loadList - Calling the Storage function to load duke.txt * line - Creates a String to store user input * Scanner in - to scan and read user input + * while(true) - while there is input from the user + * newLine() - Calls a line break + * command Split user line to the first word + * commandUpper Convert user input String to uppercase + * parser.validInput(commandUpper) passes command String to check boolean + * catch(NullPointerException e) catches null in String + * println tells user to input accurately + * instructions() print instructions to use Duke + * parser.parseCommand(line) passes command String to Parser to do command + * catch(NullPointerException e) catches null in String + * println tells user to input accurately + * instructions() print instructions to use Duke + * catch(ArrayIndexOutOfBoundsException e) catches array out of bounds in String + * catch(IndexOutOfBoundsException e) catches index out of bounds in String */ public void run(){ dukeLogo(); @@ -23,38 +37,22 @@ public void run(){ String line; Scanner in = new Scanner(System.in); parser = new Parser(); - /** - * @param while(true) - while there is input from the user - * newLine() - Calls a line break - * @param command Split user line to the first word - * @param commandUpper Convert user input String to uppercase - */ + while(true) { line = in.nextLine(); newLine(); String command = line.split(" ")[0]; String commandUpper = command.toUpperCase(); - /** - * @param parser.validInput(commandUpper) passes command String to check boolean - * @param catch(NullPointerException e) catches null in String - * @param println tells user to input accurately - * @param instructions() print instructions to use Duke - */ + try { + assert commandUpper != null : "Please enter valid input\n"; parser.isValidInput(commandUpper); } catch (NullPointerException e){ System.out.println("Please enter a valid input\n"); instructions(); } - /** - * @param parser.parseCommand(line) passes command String to Parser to do command - * @param catch(NullPointerException e) catches null in String - * @param println tells user to input accurately - * @param instructions() print instructions to use Duke - * @param catch(ArrayIndexOutOfBoundsException e) catches array out of bounds in String - * @param catch(IndexOutOfBoundsException e) catches index out of bounds in String - */ try { + assert line != null: "Please enter a valid input\n"; parser.parseCommand(line); } catch (DukeException e) { System.out.println("Please enter a valid input\n"); diff --git a/src/main/java/com/tic2002/task/Deadline.java b/src/main/java/com/tic2002/task/Deadline.java index e3b8d490..6b7a0631 100644 --- a/src/main/java/com/tic2002/task/Deadline.java +++ b/src/main/java/com/tic2002/task/Deadline.java @@ -3,7 +3,7 @@ import java.time.LocalDate; import java.time.LocalTime; -import static com.tic2002.app.DateTime.toNewDateFormat; +import static com.tic2002.app.DateTime.*; /** @@ -27,6 +27,15 @@ public Deadline(String description, LocalDate dDate, LocalTime dTime) { super.time = dTime; super.isDone = false; super.priority = 0; + if(isWithinThreeDays(dDate)){ + super.priority = 3; + } + else if(isOverDue(dDate)){ + super.priority = 4; + } + else{ + super.priority = 0; + } } @Override diff --git a/src/main/java/com/tic2002/task/Priority.java b/src/main/java/com/tic2002/task/Priority.java index 732cf5e1..cddaffd7 100644 --- a/src/main/java/com/tic2002/task/Priority.java +++ b/src/main/java/com/tic2002/task/Priority.java @@ -1,29 +1,35 @@ package com.tic2002.task; public class Priority extends Task { - private enum validPriority {NONE(0), LOW(1), MEDIUM(2), HIGH(3); + private enum validPriority {NONE(0), LOW(1), MEDIUM(2), HIGH(3), OVERDUE(4); private int value; validPriority(int value) { this.value = value; } } + /** + * Check if user input is within 1 to 3 + * @param input user input + * @return true and false + */ public static boolean isValidPriority(int input) { - for (validPriority p : validPriority.values()) { - if (p.value == input) { - return true; - } + if(input >= 0 && input <=3){ + return true; } return false; } + public static String printPriority(int value) { - switch(value){ + switch(value) { case 1: return "[LOW]"; case 2: return "[MED]"; case 3: return "[HIGH]"; + case 4: + return "[OVERDUE]"; } return ""; } diff --git a/src/main/java/com/tic2002/task/TaskCommands.java b/src/main/java/com/tic2002/task/TaskCommands.java index 77339d46..9b412ea9 100644 --- a/src/main/java/com/tic2002/task/TaskCommands.java +++ b/src/main/java/com/tic2002/task/TaskCommands.java @@ -4,7 +4,7 @@ import java.time.LocalTime; import java.util.ArrayList; -import static com.tic2002.app.DateTime.toNewDateFormat; +import static com.tic2002.app.DateTime.*; /** * TaskCommands inherits from Task @@ -63,6 +63,14 @@ public static void printList() { } System.out.println("\tHere are the tasks in your list:"); for (int i=0; i Temp = List.getList(); Temp.get(ref).setDone(); + Temp.get(ref).priority(0); System.out.println("\tNice! I've marked this task as done:"); System.out.println("\t\t" + Temp.get(ref).printTask()); List.setList(Temp); From 1b21dcc688fed479c4fd440a27efc784fe0c3163 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Fri, 19 Nov 2021 06:56:23 +0800 Subject: [PATCH 17/18] Code Clean Up --- src/main/java/com/tic2002/app/Parser.java | 8 +-- src/main/java/com/tic2002/app/Storage.java | 6 +- src/main/java/com/tic2002/app/UI.java | 61 +++++++++---------- .../com/tic2002/{app => task}/DateTime.java | 2 +- src/main/java/com/tic2002/task/Deadline.java | 2 +- src/main/java/com/tic2002/task/List.java | 5 +- src/main/java/com/tic2002/task/Priority.java | 15 ++--- src/main/java/com/tic2002/task/Task.java | 2 +- .../java/com/tic2002/task/TaskCommands.java | 8 ++- src/test/java/app/DateTimeTest.java | 2 +- 10 files changed, 51 insertions(+), 60 deletions(-) rename src/main/java/com/tic2002/{app => task}/DateTime.java (99%) diff --git a/src/main/java/com/tic2002/app/Parser.java b/src/main/java/com/tic2002/app/Parser.java index 46cfd4ec..4887f669 100644 --- a/src/main/java/com/tic2002/app/Parser.java +++ b/src/main/java/com/tic2002/app/Parser.java @@ -6,10 +6,10 @@ import java.time.LocalTime; import java.time.format.DateTimeParseException; -import static com.tic2002.app.DateTime.isValidDate; -import static com.tic2002.app.DateTime.isValidTime; -import static com.tic2002.app.DateTime.toDate; -import static com.tic2002.app.DateTime.toTime; +import static com.tic2002.task.DateTime.isValidDate; +import static com.tic2002.task.DateTime.isValidTime; +import static com.tic2002.task.DateTime.toDate; +import static com.tic2002.task.DateTime.toTime; import static com.tic2002.task.Find.findWord; import static com.tic2002.task.Priority.isValidPriority; import static com.tic2002.task.TaskCommands.addEvent; diff --git a/src/main/java/com/tic2002/app/Storage.java b/src/main/java/com/tic2002/app/Storage.java index 45c637a1..01a68bcc 100644 --- a/src/main/java/com/tic2002/app/Storage.java +++ b/src/main/java/com/tic2002/app/Storage.java @@ -18,10 +18,10 @@ import java.time.format.DateTimeParseException; import java.util.ArrayList; -import static com.tic2002.app.DateTime.*; +import static com.tic2002.task.DateTime.*; import static com.tic2002.app.Parser.isNumber; -public class Storage { +public class Storage extends List { private static ArrayList Load = new ArrayList<>(); @@ -45,7 +45,7 @@ public static void loadList() { while ((sCurrentLine = br.readLine()) != null) { String line = sCurrentLine.split(",")[0]; String priorityString = sCurrentLine.split(",")[1]; - assert !isNumber(priorityString) : "Error in file: " + sCurrentLine; + assert isNumber(priorityString) : "Error in file: " + sCurrentLine; int priority = Integer.parseInt(priorityString); String [] words = line.split("\\|"); String type = words[0]; diff --git a/src/main/java/com/tic2002/app/UI.java b/src/main/java/com/tic2002/app/UI.java index 85cc0de7..86c71210 100644 --- a/src/main/java/com/tic2002/app/UI.java +++ b/src/main/java/com/tic2002/app/UI.java @@ -1,15 +1,11 @@ package com.tic2002.app; -import com.tic2002.task.Task; - -import java.util.ArrayList; import java.util.Scanner; import static com.tic2002.app.Storage.loadList; public class UI { private Parser parser; - private ArrayList List = new ArrayList<>(); /** Main function of UI to run program * dukeLogo - Calling the logo @@ -45,7 +41,7 @@ public void run(){ String commandUpper = command.toUpperCase(); try { - assert commandUpper != null : "Please enter valid input\n"; + assert commandUpper == null : "Please enter valid input\n"; parser.isValidInput(commandUpper); } catch (NullPointerException e){ System.out.println("Please enter a valid input\n"); @@ -71,51 +67,50 @@ public void run(){ } } - private static void dukeLogo () { - String logo = " ____ _ \n" + private static void dukeLogo () { + String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - //Hello command - System.out.println("Hello, I'm Duke\n" + "What tasks can I serve you?"); - newLine(); - } + System.out.println("Hello from\n" + logo); + //Hello command + System.out.println("Hello, I'm Duke\n" + "What tasks can I serve you?"); + newLine(); + } /** * to end program * Storage.saveList() - call Storage to save list to duke.txt * System.exit() - exit system safely */ - public static void endDuke () { - System.out.println("\tBye! Thanks for visiting The Duke!"); - Storage.saveList(); - System.exit(0); - } + public static void endDuke () { + System.out.println("\tBye! Thanks for visiting The Duke!"); + Storage.saveList(); + System.exit(0); + } /** * newLine() - Prints a new line break */ - public static void newLine () { + public static void newLine () { System.out.println("________________________________________________"); } /** * Prints out instructions to use Duke */ - public static void instructions () { - System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + - "\n\tevent [description] /at [time]\n\t" + - "todo [description]\n\t" + - "deadline [description] /by yyyy-mm-dd, hh.mm\n\t" + - "done [number] - to mark task as completed\n\t" + - "list - to show all tasks\n\t" + - "delete [number] - to delete a task\n\t" + - "save - to save task list\n\t" + - "on yyyy-mm-dd - to check if tasks match date given\n\t" + - "priority [index] [0(TO REMOVE) / 1(LOW) / 2(MED) / 3(HIGH)] - to set priority\n\t" + - "find [word] - To search for a word\n\t" + - "bye - to end DUKE"); - } - } \ No newline at end of file + public static void instructions () { + System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + + "\n\tevent [description] /at [time]\n\t" + + "todo [description]\n\t" + + "deadline [description] /by yyyy-mm-dd, hh.mm\n\t" + + "done [number] - to mark task as completed\n\t" + + "list - to show all tasks\n\t" + + "delete [number] - to delete a task\n\t" + + "on yyyy-mm-dd - to check if tasks match date given\n\t" + + "priority [index] [0(TO REMOVE) / 1(LOW) / 2(MED) / 3(HIGH)] - to set priority\n\t" + + "find [word] - To search for a word\n\t" + + "bye - to end DUKE"); + } +} \ No newline at end of file diff --git a/src/main/java/com/tic2002/app/DateTime.java b/src/main/java/com/tic2002/task/DateTime.java similarity index 99% rename from src/main/java/com/tic2002/app/DateTime.java rename to src/main/java/com/tic2002/task/DateTime.java index 0c4669f4..b11b77be 100644 --- a/src/main/java/com/tic2002/app/DateTime.java +++ b/src/main/java/com/tic2002/task/DateTime.java @@ -1,4 +1,4 @@ -package com.tic2002.app; +package com.tic2002.task; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/src/main/java/com/tic2002/task/Deadline.java b/src/main/java/com/tic2002/task/Deadline.java index 6b7a0631..d4729d13 100644 --- a/src/main/java/com/tic2002/task/Deadline.java +++ b/src/main/java/com/tic2002/task/Deadline.java @@ -3,7 +3,7 @@ import java.time.LocalDate; import java.time.LocalTime; -import static com.tic2002.app.DateTime.*; +import static com.tic2002.task.DateTime.*; /** diff --git a/src/main/java/com/tic2002/task/List.java b/src/main/java/com/tic2002/task/List.java index 30800192..0166ff6e 100644 --- a/src/main/java/com/tic2002/task/List.java +++ b/src/main/java/com/tic2002/task/List.java @@ -6,10 +6,7 @@ import static com.tic2002.task.TaskCommands.printCount; -/** - * ArrayList List inheriting from Task as the List stores Tasks - */ -public class List extends Task{ +public class List { private static ArrayList List = new ArrayList<>(); /** diff --git a/src/main/java/com/tic2002/task/Priority.java b/src/main/java/com/tic2002/task/Priority.java index cddaffd7..f4f6b76f 100644 --- a/src/main/java/com/tic2002/task/Priority.java +++ b/src/main/java/com/tic2002/task/Priority.java @@ -1,12 +1,7 @@ package com.tic2002.task; public class Priority extends Task { - private enum validPriority {NONE(0), LOW(1), MEDIUM(2), HIGH(3), OVERDUE(4); - private int value; - validPriority(int value) { - this.value = value; - } - } + private enum validPriority {LOW, MEDIUM, HIGH, OVERDUE; } /** * Check if user input is within 1 to 3 @@ -23,13 +18,13 @@ public static boolean isValidPriority(int input) { public static String printPriority(int value) { switch(value) { case 1: - return "[LOW]"; + return "[" + validPriority.LOW + "]"; case 2: - return "[MED]"; + return "[" + validPriority.MEDIUM + "]"; case 3: - return "[HIGH]"; + return "[" + validPriority.HIGH + "]"; case 4: - return "[OVERDUE]"; + return "[" + validPriority.OVERDUE + "]"; } return ""; } diff --git a/src/main/java/com/tic2002/task/Task.java b/src/main/java/com/tic2002/task/Task.java index 0b8d29b9..3ad026e7 100644 --- a/src/main/java/com/tic2002/task/Task.java +++ b/src/main/java/com/tic2002/task/Task.java @@ -17,7 +17,7 @@ public class Task { protected String description; protected boolean isDone; protected String type; - protected String timing; + protected String timing; protected LocalDate date; protected LocalTime time; protected int priority; diff --git a/src/main/java/com/tic2002/task/TaskCommands.java b/src/main/java/com/tic2002/task/TaskCommands.java index 9b412ea9..dbc969cf 100644 --- a/src/main/java/com/tic2002/task/TaskCommands.java +++ b/src/main/java/com/tic2002/task/TaskCommands.java @@ -4,7 +4,7 @@ import java.time.LocalTime; import java.util.ArrayList; -import static com.tic2002.app.DateTime.*; +import static com.tic2002.task.DateTime.*; /** * TaskCommands inherits from Task @@ -44,7 +44,11 @@ public static void addDeadline(String description, LocalDate byDate, LocalTime b * prints out number of tasks in list */ public static void printCount() { - System.out.println("\tNow you have " + List.getSize() + " tasks in the list."); + ArrayList Temp = List.getList(); + int ref = -1; + ref += Temp.size(); + System.out.println("\t\t" + Temp.get(ref).printTask() + + "\n\tNow you have " + List.getSize() + " tasks in the list."); } /** diff --git a/src/test/java/app/DateTimeTest.java b/src/test/java/app/DateTimeTest.java index 0bda58d4..e3a2f783 100644 --- a/src/test/java/app/DateTimeTest.java +++ b/src/test/java/app/DateTimeTest.java @@ -1,6 +1,6 @@ package app; -import com.tic2002.app.DateTime; +import com.tic2002.task.DateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.RepeatedTest; From 9e0e8924d615f0e4ca2474118b84929face6e7d3 Mon Sep 17 00:00:00 2001 From: Maynard Wong Date: Fri, 19 Nov 2021 07:18:52 +0800 Subject: [PATCH 18/18] code clean up final --- src/main/java/com/tic2002/app/UI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/tic2002/app/UI.java b/src/main/java/com/tic2002/app/UI.java index 86c71210..671e59a5 100644 --- a/src/main/java/com/tic2002/app/UI.java +++ b/src/main/java/com/tic2002/app/UI.java @@ -41,7 +41,7 @@ public void run(){ String commandUpper = command.toUpperCase(); try { - assert commandUpper == null : "Please enter valid input\n"; + assert commandUpper != null : "Please enter valid input\n"; parser.isValidInput(commandUpper); } catch (NullPointerException e){ System.out.println("Please enter a valid input\n"); @@ -104,7 +104,7 @@ public static void instructions () { System.out.println("DUKE helps you organise your tasks efficiently, please enter as follows:" + "\n\tevent [description] /at [time]\n\t" + "todo [description]\n\t" + - "deadline [description] /by yyyy-mm-dd, hh.mm\n\t" + + "deadline [description] /by yyyy-mm-dd, hh:mm\n\t" + "done [number] - to mark task as completed\n\t" + "list - to show all tasks\n\t" + "delete [number] - to delete a task\n\t" +