From 65f72a8d7407cfc1d4ded97e87a8cbbbe6d16d8b Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Tue, 6 Aug 2019 15:24:53 +0800 Subject: [PATCH 01/46] Add support for Gradle workflow --- build.gradle | 16 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55190 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++++++++++++++++++++ gradlew.bat | 84 +++++++++++ settings.gradle | 1 + 6 files changed, 278 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..e5b8ce7e49 --- /dev/null +++ b/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'application' +} + +group 'seedu.duke' +version '0.1.0' + +repositories { + mavenCentral() +} + +application { + // Change this to your main class. + mainClassName = "seedu.duke.Duke" +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..87b738cbd051603d91cc39de6cb000dd98fe6b02 GIT binary patch literal 55190 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 z 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 \(.*\)$'` + 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"' + +# 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..6d57edc706 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 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" + +@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/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..d1e92fe5db --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'duke' From 0112efe4f745ecd1985e5362f85e8ddc5facb02c Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Mon, 12 Aug 2019 18:09:24 +0800 Subject: [PATCH 02/46] Add sample checkstyle configuration Add toolVersion block in to Gradle code sample to prevent errors. --- config/checkstyle/checkstyle.xml | 257 +++++++++++++++++++++++++++++++ tutorials/gradleTutorial.md | 7 +- 2 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 config/checkstyle/checkstyle.xml diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..b1a57ba6c0 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/gradleTutorial.md b/tutorials/gradleTutorial.md index d16b72179a..fd6b043bf7 100644 --- a/tutorials/gradleTutorial.md +++ b/tutorials/gradleTutorial.md @@ -74,11 +74,16 @@ plugins { id 'application' id 'checkstyle' } + +checkstyle { + toolVersion = '8.23' +} + // ... ``` Checkstyle expects configuration files for checkstyle to be in `./config/checkstyle/` by convention. -For example, you can copy [these files from se-edu/addressbook-level3](https://github.com/se-edu/addressbook-level3/blob/master/config/checkstyle/) to your project. +A sample checkstyle rule configuration is provided in the branch. The plugin adds a few _tasks_ to your project. Run `gradlew checkstyleMain checkstyleTest` to verify that you have set up Checkstyle properly (the command will check your main code and test code against the style rules). From cfd6da79bab287c74d4b7f5666e61e686674fb29 Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Sun, 18 Aug 2019 23:25:53 +0800 Subject: [PATCH 03/46] Change file mode on `gradle` to be executable --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 4fea6fe760a88a976796e328b3cbf98bfa39761b Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 01:26:07 +0800 Subject: [PATCH 04/46] Level 1 Completed --- build.gradle => Duke.gradle | 0 src/main/java/Duke.class | Bin 0 -> 1586 bytes src/main/java/Duke.java | 50 +++++++++++++++++++++++++++++++----- src/main/java/test1.in | 3 +++ src/main/java/test1.out | 17 ++++++++++++ src/main/java/test2.in | 0 src/main/java/test2.out | 0 src/main/java/test3.in | 0 src/main/java/test3.out | 0 src/main/java/test4.in | 0 src/main/java/test4.out | 0 src/main/java/test5.in | 0 src/main/java/test5.out | 0 src/main/java/test6.in | 0 src/main/java/test6.out | 0 15 files changed, 64 insertions(+), 6 deletions(-) rename build.gradle => Duke.gradle (100%) create mode 100644 src/main/java/Duke.class create mode 100644 src/main/java/test1.in create mode 100644 src/main/java/test1.out create mode 100644 src/main/java/test2.in create mode 100644 src/main/java/test2.out create mode 100644 src/main/java/test3.in create mode 100644 src/main/java/test3.out create mode 100644 src/main/java/test4.in create mode 100644 src/main/java/test4.out create mode 100644 src/main/java/test5.in create mode 100644 src/main/java/test5.out create mode 100644 src/main/java/test6.in create mode 100644 src/main/java/test6.out diff --git a/build.gradle b/Duke.gradle similarity index 100% rename from build.gradle rename to Duke.gradle diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..2bd9dab0e01102b24d312e9ae580b00875d1df2f GIT binary patch literal 1586 zcmbtUU0V}J6n-ZO%x1HI1cFu+2SxJ%A=(x{3Plu)M3eXt6;WHC0ajd1cIjr*r}+o{ z3;Y6aTQB&~r+s?epWu!E!^hU1*=z_Pckac^?3r`k_nb5D%s>CV`3t~BJk^mvmSbE; z2w4re7)Eeb!#N$t@HNLbQGAOD9U9K7;er}2YPh6h5Z`H-RBlts=X(v)Ixb^I!xfIJ zYJXP!UsHfT#E`-THOz5b=a^^coU&}on`Q{7(hnFSv(Adi&{ME%vsAAxneIKgR3S^G zDlMB~AoaNLLjEFi6=|>L%ARZ4tCK3QtL(|;mqoee`*Y+O^flV`^7dNYV@RY9j_V8T zb#h#(XzE_ORw${d2+wg)aPK+ej0k&sk_VOoTYM(UaP+}$5pxpj$??S z&rjW_y5hRBq4=oSd9zY+hDAPE6)M8OO%$lqh3C=}%hDEkvEqnljw>2Y{j!16NHX-c zp~~cAn=VJuKnb@L*KGrLaMwT?_o%Z=4Z^&yFvZn|IWFd%HB)$wsF|jM6mpe%D{78o z4=eOD1|DF6VMfsR^b0lIjj$ zQzyi>%S=?ho-34RCyAjdiSyC{s@{D;S~VY(i)QU~YoL{_FU?jLsqnpJ1ZWth%buWT z1BierWz%?q{*KekXzs{tg8e}Y20>$|Z{&zl;7M95*WVGQV4(CCp~X#v3#0MKHabFB z7>#!Zi!JcC&=y}Kx(U5Fwt?6>1WiUM8}Hgc_c~(no-G`D1wE^#Pwy3H$mcwdE?P(F zmD16R7>>fAG`o>T56+Th0)3c9KW3?rIUL3f@+eYSrzol);eV0l7~#-9;uy!^2dW{e zZbp#(-Jqt-YxKtB8|YJWf8nH76t-Su(g51?QRU9gE&r5W`f?vVPZTaWKB2X_Et(*OVf literal 0 HcmV?d00001 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334cc..35b75111d9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,48 @@ +import java.util.Scanner; +import java.lang.StringBuilder; +import java.util.List; +import java.util.ArrayList; + + public class Duke { public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + List lst = new ArrayList<>(); + lst.add("Hello! I'm Duke"); + lst.add("What can I do for you?"); + printInput(lst); + + Scanner sc = new Scanner(System.in); + while (sc.hasNext()) { + + String input = sc.next(); + + if (input.equals("bye")) { + printInput("Bye. Hope to see you again soon!"); + break; + } else { + printInput(input); + } + + } + } + + public static void printInput(String input) { + System.out.println(" ____________________________________________________________"); + System.out.println(String.format(" %s",input)); + System.out.println(" ____________________________________________________________"); + System.out.println(); + + } + + public static void printInput(List lst) { + System.out.println(" ____________________________________________________________"); + for (String input : lst) { + System.out.println(String.format(" %s",input)); + } + + + System.out.println(" ____________________________________________________________"); + System.out.println(); + } } diff --git a/src/main/java/test1.in b/src/main/java/test1.in new file mode 100644 index 0000000000..53883c7fad --- /dev/null +++ b/src/main/java/test1.in @@ -0,0 +1,3 @@ +list +blah +bye \ No newline at end of file diff --git a/src/main/java/test1.out b/src/main/java/test1.out new file mode 100644 index 0000000000..aa01bd3987 --- /dev/null +++ b/src/main/java/test1.out @@ -0,0 +1,17 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + list + ____________________________________________________________ + + ____________________________________________________________ + blah + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ + diff --git a/src/main/java/test2.in b/src/main/java/test2.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test2.out b/src/main/java/test2.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test3.in b/src/main/java/test3.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test3.out b/src/main/java/test3.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test4.in b/src/main/java/test4.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test4.out b/src/main/java/test4.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test5.in b/src/main/java/test5.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test5.out b/src/main/java/test5.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test6.in b/src/main/java/test6.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/test6.out b/src/main/java/test6.out new file mode 100644 index 0000000000..e69de29bb2 From d4e037b3c0d0223df4323a4c167270629a9accb4 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 02:54:00 +0800 Subject: [PATCH 05/46] Level 2 Completed --- src/main/java/Duke.class | Bin 1586 -> 2273 bytes src/main/java/Duke.java | 63 ++++++++++++++++++++++++++---------- src/main/java/test2.in | 4 +++ src/main/java/test2.out | 21 ++++++++++++ src/main/java/test3.in | 7 ++++ src/main/java/test3.out | 40 +++++++++++++++++++++++ src/main/java/test4.in | 8 +++++ src/main/java/test4.out | 50 +++++++++++++++++++++++++++++ src/main/java/test5.in | 3 ++ src/main/java/test5.out | 16 ++++++++++ src/main/java/test6.in | 10 ++++++ src/main/java/test6.out | 67 +++++++++++++++++++++++++++++++++++++++ 12 files changed, 272 insertions(+), 17 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 2bd9dab0e01102b24d312e9ae580b00875d1df2f..f2ec42bb8120ca32b9bfd436d7f8dd5722978385 100644 GIT binary patch literal 2273 zcmbtVU2has7=F%v&Ft=!whJvR6`1m2Kk3pcm3~-03Z)BeK^DP+3e)beUD(c)*;%Bh z;Dw3Ce?VePG$u9S2DvD$i1FGxZ~YNo8)AyjnVD@VG{(f)o%8vg_kEt{yywhsD?j}L z;1E7bAdNl+{RxE7r(z(9{TNj7b^`k_q~LHIM{qO&6~|;TEQ{j_?7|5ZBeFiJVpK&| znxB%zX<3ZPRpTlq5;%jiD&A3WP8#QA|GW(GZW2AXAd8C%-cvCt2QR6(oWT3|Kz2S< za77?CShR}nkU+S#?SepL*v^{*wPQugoT$uBna+7*s>G4VtWmTC8e1=qT{mtSnUY}@ zGC9{NT7?0*uqNjk(>KPAInQ3fRe{7DXWgtdS8)XzS~p(j8*#Biqs@U)#VwXHW5u#d z*9r`Qc&=Em47cJCNz2PdgRgoX@-V3$fD=}pguJHDNIE9EoLzCI&5@#H7e8LPVRlJk z8eT^Wk$5CM97i3;nD^Jzj+&*C-K=L@W_7tj!xW||%EcMO)u#epQ5Xk(d^dz3)xOaN;l`dg7&8_2q*W4N|M>4@;9RP)gdv|U<{W4`Q~3>=a<-Qed>(aw0e zN{ps4J0P$vNVJzGWVR<~jPite+m*+}J34f)TB`$FTH9XDNm_8#jDNs*+Oj-+=FN&x zqMTvdJ0q(=&dQUs3dB!F!gyhr8hR;RB7qn)Zq{H<_ib>m2Pw!lc5#?g)r-&71D425$~pCB~( z7~!#?9`8s+mJto%Vn-?#G?t(|fjapJ@yAF^>|aFkKE7b3^+(c?{%EK-mX0o><^kQ| zExsX$yMMCYj-H3#ux?LBQ=1l1dmoMA-q-@_*st^Yu}E*MAto0}_#wXXk<=uO=2ZO> zQVZDDxrEINs82_hu%$B{;9GcpTT%>p6h~0cw#r`|bx6{MhTW*4Hnr&H$RVUKge~|Q zjrbN@@jb!)fF?Y^PCVo{W0}@JV=p>oSj1P*tzf_RS69%ZU>Ez!|k~xY!8NlsYNuc?Mx%04A?^0tpwACJ=~!-f{4po zlhmXtU($b=^~tLL_GP>#FxIh*9Rl~UhmD;Azhc+8w9x&?ok8S<=YLe!u?~X!n(g!w zAj9AX$iAD`XAgCHlONTC7~wrCwMZiLH)<91JR_DjI1r*iT;8<*#y-IC-`MvNKtI_J zko_Rp579p_@qqnT1S#|4bd^PTu!#aR3w(zTIkr3MDcuygx`aKs$w+(CGWLcL(EnVB sh3CIl*KVx9F#;H7ZX9RWVL~{`)+kOP>nRYI3M9lcBC7HiL6#r-2hC0FXaE2J delta 875 zcmY+D%TE(g6vlsdrZ7W0JjzpEr9At9QdFLzh@zm-76nDYR|+8rAzeT?QS$8 zCQ%PfbeNoVQ^Prf^LcdA<;JAj2|Z5eHR*Fx%>|Qw2X@iHTrwGObD2StD+X7c^C4${ z%^7&zLy#UP3>%CXs2l5>GwPvAW(3HWb9ap{fTUDvo z;)$Qe=U=9$y927#UO5xVBDgXTNbyOu$bhILZ5v(Z*f<;$F%0c zW?C$!xThHO%VV!=o%S2ej2Yawn5IQxICX#Xs-h@EvYbpUM8{{B=I7EDGdyr$K8uGu zatI#(2b)Zcz=2 zc_-jP$t8Re>+DocdB`udT-kv^p5Pjs6WMK{3lmj&}3j9Qe#kkz*?>h6PL3ZC$h@J+jxtMcPMdksp~Uk(|UMvm-1{W zd$dD^BTZ$bm6IduI+5m=uc=-r8$?!9W`02AJ084}`MTthllg1mJ0tyLS M!xI+ut(j%pU(_CvP5=M^ diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 35b75111d9..9399e9ccb7 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,25 +3,33 @@ import java.util.List; import java.util.ArrayList; - public class Duke { public static void main(String[] args) { + List start = new ArrayList<>(); List lst = new ArrayList<>(); - lst.add("Hello! I'm Duke"); - lst.add("What can I do for you?"); - printInput(lst); + + start.add("Hello! I'm Duke"); + start.add("What can I do for you?"); + printStart(start); Scanner sc = new Scanner(System.in); - while (sc.hasNext()) { + while (sc.hasNextLine()) { + + String input = sc.nextLine(); - String input = sc.next(); + switch (input) { + case ("bye"): + printEnd("Bye. Hope to see you again soon!"); + break; - if (input.equals("bye")) { - printInput("Bye. Hope to see you again soon!"); - break; - } else { - printInput(input); - } + case ("list"): + printNumberList(lst); + break; + + default: + printInput(input); + lst.add(input); + } } @@ -29,20 +37,41 @@ public static void main(String[] args) { public static void printInput(String input) { System.out.println(" ____________________________________________________________"); - System.out.println(String.format(" %s",input)); + System.out.println(String.format(" added: %s",input)); System.out.println(" ____________________________________________________________"); System.out.println(); } - public static void printInput(List lst) { + public static void printStart(List start) { System.out.println(" ____________________________________________________________"); - for (String input : lst) { + for (String input : start) { System.out.println(String.format(" %s",input)); } - System.out.println(" ____________________________________________________________"); System.out.println(); - } + } + + public static void printEnd(String input) { + System.out.println(" ____________________________________________________________"); + System.out.println(String.format(" %s",input)); + System.out.println(" ____________________________________________________________"); + System.out.println(); + + } + + + public static void printNumberList(List lst) { + System.out.println(" ____________________________________________________________"); + for (int i = 0; i < lst.size(); i++) { + System.out.println(String.format(" %d. %s",i+1,lst.get(i))); + } + + System.out.println(" ____________________________________________________________"); + System.out.println(); + } + + + } diff --git a/src/main/java/test2.in b/src/main/java/test2.in index e69de29bb2..239c0da5d2 100644 --- a/src/main/java/test2.in +++ b/src/main/java/test2.in @@ -0,0 +1,4 @@ +read book +return book +list +bye \ No newline at end of file diff --git a/src/main/java/test2.out b/src/main/java/test2.out index e69de29bb2..976f46925a 100644 --- a/src/main/java/test2.out +++ b/src/main/java/test2.out @@ -0,0 +1,21 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + added: read book + ____________________________________________________________ + + ____________________________________________________________ + added: return book + ____________________________________________________________ + + ____________________________________________________________ + 1. read book + 2. return book + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ diff --git a/src/main/java/test3.in b/src/main/java/test3.in index e69de29bb2..e7880cbf6d 100644 --- a/src/main/java/test3.in +++ b/src/main/java/test3.in @@ -0,0 +1,7 @@ +read book +return book +buy bread +list +done 1 +list +bye \ No newline at end of file diff --git a/src/main/java/test3.out b/src/main/java/test3.out index e69de29bb2..6d5a27f46a 100644 --- a/src/main/java/test3.out +++ b/src/main/java/test3.out @@ -0,0 +1,40 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + added:[✗] read book + + ____________________________________________________________ + + ____________________________________________________________ + added:[✗] return book + ____________________________________________________________ + + ____________________________________________________________ + added:[✗] buy bread + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[✗] read book + 2.[✗] return book + 3.[✗] buy bread + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [✓] read book + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[✓] read book + 2.[✗] return book + 3.[✗] buy bread + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ diff --git a/src/main/java/test4.in b/src/main/java/test4.in index e69de29bb2..168f22123c 100644 --- a/src/main/java/test4.in +++ b/src/main/java/test4.in @@ -0,0 +1,8 @@ +todo borrow book +list +deadline return book /by Sunday +event project meeting /at Mon 2-4pm +list +done 1 +list +bye \ No newline at end of file diff --git a/src/main/java/test4.out b/src/main/java/test4.out index e69de29bb2..97ecf69e9d 100644 --- a/src/main/java/test4.out +++ b/src/main/java/test4.out @@ -0,0 +1,50 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [T][✗] borrow book + Now you have 1 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✗] borrow book + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [D][✗] return book (by: Sunday) + Now you have 2 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [E][✗] project meeting (at: Mon 2-4pm) + Now you have 3 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✗] borrow book + 2.[D][✗] return book (by: Sunday) + 3.[E][✗] project meeting (at: Mon 2-4pm) + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [✓] borrow book + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✓] borrow book + 2.[D][✗] return book (by: Sunday) + 3.[E][✗] project meeting (at: Mon 2-4pm) + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ diff --git a/src/main/java/test5.in b/src/main/java/test5.in index e69de29bb2..1b194a9ddb 100644 --- a/src/main/java/test5.in +++ b/src/main/java/test5.in @@ -0,0 +1,3 @@ +todo +blah +bye \ No newline at end of file diff --git a/src/main/java/test5.out b/src/main/java/test5.out index e69de29bb2..a30fe2440e 100644 --- a/src/main/java/test5.out +++ b/src/main/java/test5.out @@ -0,0 +1,16 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + ☹ OOPS!!! The description of a todo cannot be empty. + ____________________________________________________________ + + ____________________________________________________________ + ☹ OOPS!!! I'm sorry, but I don't know what that means :-( + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ diff --git a/src/main/java/test6.in b/src/main/java/test6.in index e69de29bb2..272b6eda75 100644 --- a/src/main/java/test6.in +++ b/src/main/java/test6.in @@ -0,0 +1,10 @@ +todo borrow book +list +deadline return book /by Sunday +event project meeting /at Mon 2-4pm +list +done 1 +list +delete 3 +list +bye \ No newline at end of file diff --git a/src/main/java/test6.out b/src/main/java/test6.out index e69de29bb2..1d88e670a4 100644 --- a/src/main/java/test6.out +++ b/src/main/java/test6.out @@ -0,0 +1,67 @@ + ____________________________________________________________ + Hello! I'm Duke + What can I do for you? + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [T][✗] borrow book + Now you have 1 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✗] borrow book + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [D][✗] return book (by: Sunday) + Now you have 2 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Got it. I've added this task: + [E][✗] project meeting (at: Mon 2-4pm) + Now you have 3 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✗] borrow book + 2.[D][✗] return book (by: Sunday) + 3.[E][✗] project meeting (at: Mon 2-4pm) + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [✓] borrow book + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✓] borrow book + 2.[D][✗] return book (by: Sunday) + 3.[E][✗] project meeting (at: Mon 2-4pm) + ____________________________________________________________ + + ____________________________________________________________ + Noted. I've removed this task: + [D][✗] return book (by: Sunday) + Now you have 2 tasks in the list. + ____________________________________________________________ + + ____________________________________________________________ + Nice! I've marked this task as done: + [✓] borrow book + ____________________________________________________________ + + ____________________________________________________________ + Here are the tasks in your list: + 1.[T][✓] borrow book + 2.[E][✗] project meeting (at: Mon 2-4pm) + ____________________________________________________________ + + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ From 1f4003b34f26a5abf79baf1d15900e6809340f6e Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 04:18:14 +0800 Subject: [PATCH 06/46] Completed Lv3 --- src/main/java/Duke.class | Bin 2273 -> 3333 bytes src/main/java/Duke.java | 67 +++++++++++++++++++++++++++------------ src/main/java/Task.class | Bin 0 -> 775 bytes src/main/java/Task.java | 25 +++++++++++++++ 4 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 src/main/java/Task.class create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index f2ec42bb8120ca32b9bfd436d7f8dd5722978385..492ae9d1adc3210e9e32ece2687c3eccc6df09a0 100644 GIT binary patch literal 3333 zcmbtWYgZfB72Q`7nn8?>Edz!ShkHmvChB4BNq8ZVU zrcIlqX&!y2b>gJ&7k#&JS`hJSS3dV!zxJOrtEs#1%zy-DrCqC9OZU#)Id`9Z_BrRy z{O#ZG{T0A*tR=7?Qwq`vL@=e|Tmwe&sEWrDIEwQMGWD3orxQ@|xEwCX;WH{`66nN5 z6_@0ES;ZA;{)CDr>p5SQH-?H?IcF8*5@>}fZ>~wSITiB>Sh%iYK|x+36y&`vT{{gJ zLs1S-DJZFMRd{l}tYR^N&*Eu$vm~#ck*J?j@vNLbpJX&&lFy!3@Pa@z?|K5eCa)Wd z#$egA@`IC>>kSLkXRJBf@X94qpmodRk;!SpT^JsvS$xE@EpL=S-93*B#KxQ)H#AOK zwwW#$X3f&HF`MT~tYBESKuhBX|27^*yRS_E|e8&>U{sN~+N}3F45l2(;e~ zA4(xv#dD6l6HrI8`B0Zc#wnMw=C~zQs6SI)FbAa88a{#JjH9aiL#2|j6nJTzF!Oom zfS&3q=yHdKui#~hcVXV}^sHg)DLv=t*PN2R!+8@0e!+Ln!4xcu4zha-I!zAbk}k00~*d^ zoQcd+2o1;ZaSabkzp^;=@UxPXB7cESb8& zzcmg}SHhRX!n<`DDnOPP>erya+0y^>L!GQD{x=QhUiD;2-i@EiPA!|(8W z>MSckU}rVWL9y)FrlSOsRkM_5mJH7+G2IkyOSK284fkB!tk06`nFWD}?Ahj^gDhvz zZ$xTm8U?m~YuF209>_*$m^a+C`LrjG0sm+qylQVOGA zx2(tKAE@j4Q!*vgh1ry92y9j&gy&P&dL|Gqwcgmi7%AH`=S*f&Sv2xx^V~IgqNZxa z3@zv@I%i5rHb36*pcajiYtnj4Jp`RG+(W;r=LB~N`~iO?psovny#-^z9CPff;a#x2 zd0x4mVSCKMecOmvOD%+ERXODSV6AmXt47w%N>^V@3f_@T@n?a<)z-J{MQ6bbUnc># zaU;u;UsABj^iDd?Lb)iQrR1?VmN#72B;hw}DTEk7|4kTnE^oSrgN?&Ayuu)ARyJ*% zUMiZ~nE#g=3L(afd_Kb}8dgx@0diM-+i?@<_-H#E;OE4CzV!L_k*7B22Y463gZw}d z@-4*i1XuQP7M$yPS0Ucz#uDmoD5I`GzQL}peIo$O1-)=(G0g}!7w zyr@9A4Rz)g>Q|AN>R&;_P2@Rg=_APn0kKyDLa8;}L&tkH4nf zLQ@6J%Q)sQw)l%X+G4Sz73^KczT0S>IkJkjp}MxZ3htqGTV3FL`OfQ-e*}{Mc{Fis zV6Z!}8;!UJyU>9odawr{Lo>x_!6&hohjuH{Xv1T)xPo?E!@Vd`lxNX}m(Y#ZxZ?); zaT5cy2d&~CqDR4~0`)_5Dd<#ivZ?u>Xp2xQzWf5M=s!@f_ZHfd_pV@{oI7HF!Ty9o0TnZnp;6PRT7Sz$x{p5a>jE>Ld^h*WXFYYk;_b1k74&9iV!iEa=!+nf;YA^q@BF<6W0MjGNdcJTIK|>g zvoOw4hcs!O=W2%Iw68|JR3j-qV8#M1Bv*bHg<4!C(-?vJdn@RV4}AP?9PO=MfT$Fp58MPLSv=tl(X?!54Th&xhyu|KfiDPDdkP literal 2273 zcmbtVU2has7=F%v&Ft=!whJvR6`1m2Kk3pcm3~-03Z)BeK^DP+3e)beUD(c)*;%Bh z;Dw3Ce?VePG$u9S2DvD$i1FGxZ~YNo8)AyjnVD@VG{(f)o%8vg_kEt{yywhsD?j}L z;1E7bAdNl+{RxE7r(z(9{TNj7b^`k_q~LHIM{qO&6~|;TEQ{j_?7|5ZBeFiJVpK&| znxB%zX<3ZPRpTlq5;%jiD&A3WP8#QA|GW(GZW2AXAd8C%-cvCt2QR6(oWT3|Kz2S< za77?CShR}nkU+S#?SepL*v^{*wPQugoT$uBna+7*s>G4VtWmTC8e1=qT{mtSnUY}@ zGC9{NT7?0*uqNjk(>KPAInQ3fRe{7DXWgtdS8)XzS~p(j8*#Biqs@U)#VwXHW5u#d z*9r`Qc&=Em47cJCNz2PdgRgoX@-V3$fD=}pguJHDNIE9EoLzCI&5@#H7e8LPVRlJk z8eT^Wk$5CM97i3;nD^Jzj+&*C-K=L@W_7tj!xW||%EcMO)u#epQ5Xk(d^dz3)xOaN;l`dg7&8_2q*W4N|M>4@;9RP)gdv|U<{W4`Q~3>=a<-Qed>(aw0e zN{ps4J0P$vNVJzGWVR<~jPite+m*+}J34f)TB`$FTH9XDNm_8#jDNs*+Oj-+=FN&x zqMTvdJ0q(=&dQUs3dB!F!gyhr8hR;RB7qn)Zq{H<_ib>m2Pw!lc5#?g)r-&71D425$~pCB~( z7~!#?9`8s+mJto%Vn-?#G?t(|fjapJ@yAF^>|aFkKE7b3^+(c?{%EK-mX0o><^kQ| zExsX$yMMCYj-H3#ux?LBQ=1l1dmoMA-q-@_*st^Yu}E*MAto0}_#wXXk<=uO=2ZO> zQVZDDxrEINs82_hu%$B{;9GcpTT%>p6h~0cw#r`|bx6{MhTW*4Hnr&H$RVUKge~|Q zjrbN@@jb!)fF?Y^PCVo{W0}@JV=p>oSj1P*tzf_RS69%ZU>Ez!|k~xY!8NlsYNuc?Mx%04A?^0tpwACJ=~!-f{4po zlhmXtU($b=^~tLL_GP>#FxIh*9Rl~UhmD;Azhc+8w9x&?ok8S<=YLe!u?~X!n(g!w zAj9AX$iAD`XAgCHlONTC7~wrCwMZiLH)<91JR_DjI1r*iT;8<*#y-IC-`MvNKtI_J zko_Rp579p_@qqnT1S#|4bd^PTu!#aR3w(zTIkr3MDcuygx`aKs$w+(CGWLcL(EnVB sh3CIl*KVx9F#;H7ZX9RWVL~{`)+kOP>nRYI3M9lcBC7HiL6#r-2hC0FXaE2J diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9399e9ccb7..1d4ce7d2e3 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,46 +4,56 @@ import java.util.ArrayList; public class Duke { + + public static List lst = new ArrayList<>(); + public static void main(String[] args) { List start = new ArrayList<>(); - List lst = new ArrayList<>(); + start.add("Hello! I'm Duke"); start.add("What can I do for you?"); - printStart(start); + printInput(start); Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { String input = sc.nextLine(); - - switch (input) { - case ("bye"): - printEnd("Bye. Hope to see you again soon!"); - break; - - case ("list"): - printNumberList(lst); - break; - - default: - printInput(input); - lst.add(input); + String[] tokens = input.split(" "); + if (tokens[0].equals("bye")) { + printEnd("Bye. Hope to see you again soon!"); + break; + } else if (tokens[0].equals("list")) { + printNumberList(lst); + } else if (tokens[0].equals("done")) { + doTask(tokens[1]); +// char rawPos = input.charAt(input.length()-1); +// int pos = Integer.parseInt(Character.toString(rawPos)) - 1; +// Task task = lst.get(pos); +// task.doTask(); +// List inst = List.of("Nice! I've marked this task as done: ", +// " "+task.toString()); +// //System.out.println("Nice! I've marked this task as done: "); +// //System.out.println(this); + } else { + Task task = new Task(input); + printInput(task); + lst.add(task); } } } - public static void printInput(String input) { + public static void printInput(Task input) { System.out.println(" ____________________________________________________________"); - System.out.println(String.format(" added: %s",input)); + System.out.println(String.format(" added:%s",input)); System.out.println(" ____________________________________________________________"); System.out.println(); } - public static void printStart(List start) { + public static void printInput(List start) { System.out.println(" ____________________________________________________________"); for (String input : start) { System.out.println(String.format(" %s",input)); @@ -62,16 +72,33 @@ public static void printEnd(String input) { } - public static void printNumberList(List lst) { + public static void printNumberList(List lst) { System.out.println(" ____________________________________________________________"); + System.out.println(" Here are the tasks in your list:"); for (int i = 0; i < lst.size(); i++) { - System.out.println(String.format(" %d. %s",i+1,lst.get(i))); + System.out.println(String.format(" %d.%s",i+1,lst.get(i))); } System.out.println(" ____________________________________________________________"); System.out.println(); } + public static void doTask(String str) { + //char rawPos = input.charAt(input.length()-1); + //int pos = Integer.parseInt(Character.toString(rawPos)) - 1; + int pos = Integer.parseInt(str)-1; + Task task = lst.get(pos); + task.doTask(); + List inst = List.of("Nice! I've marked this task as done: ", + " "+task.toString()); + printInput(inst); + //System.out.println("Nice! I've marked this task as done: "); + //System.out.println(this); + } + + + + } diff --git a/src/main/java/Task.class b/src/main/java/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..ae5b2438fdebd0eea742c7a7db038dd2d3857b18 GIT binary patch literal 775 zcmZuvO>5Lp6g@BBlSyaBw6&wP+EzzrQn7+ADiuL2f>7-uMX1F^CKHGBBPmJ7KjK0J z_ihzhErR|4e}+FqJTH+t+HUU6yZ4-P&wVdHetrE8U| z*K8I#GF-PYgBvEg0`)+kj({hcT*986)_L0bk7OWdv+HU>N~@+!^tgF@im85grX zwrQojddBit;M*cGP)#6 zk_H1cN;Y7z!(ILe++`M}z#-Ikuw3l}bXWh#l2Qs7WxI~^te8-ohbI3RAuobaT9{*& z3c7a)Me?e_6|cq9g%jxQ(ml|24gDL;E!F!B%iq$NYW^|o|JjpdU&Jh<9JEMBa**L^ T|Ey@2H!wr(Hv5-|P%!r!H^GYO literal 0 HcmV?d00001 diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..8f7faf6769 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,25 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public String getStatusIcon() { + return (isDone ? "✓" : "✗" ); + //return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols + } + + public String getDescription() { + return description; + } + public String toString() { + return String.format("[%s] %s", getStatusIcon(), getDescription()); + } + + public void doTask() { + this.isDone = true; + } +} \ No newline at end of file From 066bbbbcac943a911334f19386f2b13e72e465b3 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 04:21:05 +0800 Subject: [PATCH 07/46] Removed comments in Lv 3 --- src/main/java/Duke.java | 12 ------------ src/main/java/Task.java | 4 ++-- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1d4ce7d2e3..d371f0e542 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -27,14 +27,6 @@ public static void main(String[] args) { printNumberList(lst); } else if (tokens[0].equals("done")) { doTask(tokens[1]); -// char rawPos = input.charAt(input.length()-1); -// int pos = Integer.parseInt(Character.toString(rawPos)) - 1; -// Task task = lst.get(pos); -// task.doTask(); -// List inst = List.of("Nice! I've marked this task as done: ", -// " "+task.toString()); -// //System.out.println("Nice! I've marked this task as done: "); -// //System.out.println(this); } else { Task task = new Task(input); printInput(task); @@ -84,16 +76,12 @@ public static void printNumberList(List lst) { } public static void doTask(String str) { - //char rawPos = input.charAt(input.length()-1); - //int pos = Integer.parseInt(Character.toString(rawPos)) - 1; int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); task.doTask(); List inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); printInput(inst); - //System.out.println("Nice! I've marked this task as done: "); - //System.out.println(this); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 8f7faf6769..012b295d92 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -8,8 +8,8 @@ public Task(String description) { } public String getStatusIcon() { - return (isDone ? "✓" : "✗" ); - //return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols + //return (isDone ? "✓" : "✗" ); + return (isDone ? "\u2713" : "\u2718"); } public String getDescription() { From c3431945d50aef1119db51f71a7cec2dd730b38e Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 05:06:35 +0800 Subject: [PATCH 08/46] Extended onto ToDo --- src/main/java/Duke.class | Bin 3333 -> 3478 bytes src/main/java/Duke.java | 29 +++++++++++++++++++++++++---- src/main/java/Task.class | Bin 775 -> 1007 bytes src/main/java/Task.java | 11 +++++++++++ src/main/java/ToDo.class | Bin 0 -> 1068 bytes src/main/java/ToDo.java | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/main/java/ToDo.class create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 492ae9d1adc3210e9e32ece2687c3eccc6df09a0..58da7a011ce9df820bd3d18b8746ab2958574144 100644 GIT binary patch delta 1765 zcmZ8hTYD2#6kTU#(wU?Kl-L&1Ks&aC(6qE%3fO`Q6)2ZpC`F-Yp=mSFl-ghuKopG% zD4?P^S}xx3g7tzZR7whhe7@aan_<6b<0jXoIIB!^BpY&P(u4>R$Ufi7vc z7}zS^yA4FWv^{dsYak}A?L!T=$=P-Z)n_2?gWZoE1_lf~tz%F^Bn<5Ip&!r4@I(1n zfutN#I(8Y@ZD5bwf7ZZWAD+YWaa)1^ez*YSpPL3Gw`QM_fM z9&ejChIdRjcvnDJCf>uafZDUyHgTLVe<`7bO;{zM4aAcv6AQ4=#A=DF#S(*bT8mXC zPT-`8Mm%QX6y6tDYVqf^t94GdYNU01VB$lGQ7-qbrbNn$r)sR#;oY_sjm7MkmFkNp ztyDC*qd~yyI$2gIDNx{YABYZauWjq;w|hz8BYZ3nc70kCd#t^QT~=R|Kp~0zMZe6srj(b&Qz!5?`748sC^Wi*K3X z1_H_q8=OU2Bz#UvRM416q>`zj=*|{9)t87RC*|Qg1K*oCj|(P7@x$mLtxQbx^$yw5 zlr0eig3dZol-Dd5i$~9RqC&lhF~_SP&buV zRxdzFr0ledxKdcw2IqWhj*Gc7omS9#B9|b}yBC&l%*$@_^22x}>neg!xepw7O1-rr z?zDQX^s0cS&htMohJuqYFQ71kq7lq-H;diP2?0%;m%)?~lmxU4rZ#x!74VG1qhMpe zlR;qQ*07ALK*n8r^8h8CdRCy2Srr?kwj!hVr{AmO^LfdSb<`oGy`jqWHt< z{|jXIO(s1$6$DtQ+1 zxQ`Ijx-&>ub#!Wx;5e!kE$Coz#a$vfLw$P3`#$wBjQ9ZhUH?f%(jnV`<*y|5d#NxjLH;G$n}`4J)VXZ9Fpcq z9TNtk1}5eHQw9z@@id;1izD*avoh^-298Sqyo+>Rl4r+synN=jIqkTPDeIW15htvR z;+(n>0c%L{tFK_%I<0urCNx{;l^owm6R+ZwiH&&8#Orv&#G5!RAc{?#!C3)y@W`+U zi?@DPyc=54CZLTTh)$ZQ!+j>&(aep=_!xs8N*wltqX%WWHWN+QV&W~lZEaCon`cbC zBLi+LmY;AWG90P*Mg=lP!iU4vqv5fA)t!SQ!$ZvcE@owLz{DKhGx5Ge^#MM#GPU-y zkMOa8Gm*m^sq#j3d}88Ld}iWvd|~2C%u65vYg+S{eI=P>G>?x@Mkgo2hl0bC`^O{E zbUVH_@QsOYan8hdIKTLdRwNcn?R$j!J$|sJ^po}r^7N9GW%$Ih)o5JO;sRc)$Wdrz zJIZ@&*)xEELux?3o+||#*cyVw1GJmCQ$R21ZT@A53yBN$wD!cNotN)NLo!qpLghX% zXU#dP#i(`7QJk~Qt*N!H%q3*Z!dyUB9NF`zJL}Aj6MuB%>pWY`^^IW z6_f~UFJD2aAl_2`xLe>Vyg?apPqK7Hs`UKouQ%_}r>ZBVD}>Ipn^?UbC48v$e5wG4 zs|lMCYontMR95*D={j1jQ>0`MY$ZO<$ba!qf%t#?TZmvQ`L~jP8~Hyd`E%w{{AUPL zA(HM}c(}@_s@mY86zc>hqgMO%HDy@@z#Ix6GP*ZLueB1FOyz3l5hPsHXwQR}0G}t`bh)5xgi}X$+UBD6+ISemwE$2DL?~8u}-`x&E diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d371f0e542..0ba25900c7 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,4 @@ import java.util.Scanner; -import java.lang.StringBuilder; import java.util.List; import java.util.ArrayList; @@ -28,10 +27,27 @@ public static void main(String[] args) { } else if (tokens[0].equals("done")) { doTask(tokens[1]); } else { - Task task = new Task(input); + Task task = Task.createTask(tokens); + lst.add(task); //because must count so must put first printInput(task); - lst.add(task); + } +// } else if (tokens[0].equals("todo")) { +// +// } else if (tokens[0].equals("deadline")) { +// +// } else if (tokens[0].equals("event")) { +// +// } +// +// +// +// +// } else { +// Task task = new Task(input); +// printInput(task); +// lst.add(task); +// } } @@ -39,7 +55,10 @@ public static void main(String[] args) { public static void printInput(Task input) { System.out.println(" ____________________________________________________________"); - System.out.println(String.format(" added:%s",input)); + + System.out.println(" Got it. I've added this task:"); + System.out.println(String.format(" %s",input)); + System.out.println(" Now you have %d tasks in the list."); System.out.println(" ____________________________________________________________"); System.out.println(); @@ -88,5 +107,7 @@ public static void doTask(String str) { + + } diff --git a/src/main/java/Task.class b/src/main/java/Task.class index ae5b2438fdebd0eea742c7a7db038dd2d3857b18..eda0fc9ea4da50b4f0565ac3d120a487331024f8 100644 GIT binary patch literal 1007 zcmZ`&ZBNrs7(KV`)~<9LR!|hdF`RBi0Ra`9F)nbTPEpDBE#4noo z-LIGk5)=Ia{tSPJ@!WO75KNQj>Am-y^E}VF?a$xeegIg+eG?`oGsxkZ3?&2COArPmw%u@JrWUt?aHA@a z4%#bG=nIIKTs#QEAbuz?Tt1Dhyb#cqqb9NW)gbhrb#@wltL`?oxnp`Q-;Mpc+ujlw zEw7(JUzLZfn61UGxAoNB?NPHEe$1`7(|+Q~HiycU(`+4c0y!dA`X@5tC>eyUH>0Gu zT9%EPwW!nb{KtW8E+bE-!tRqLa8kMD#-{JZ7A|Ad!k7$;SfW=NH%+?2oQ9xNLyW^*%@d(8 z=bf(*&eT2>N8N||nOg!E7;O@P6k{40=#({>FJh!8P$gYRoTJX!+5u7@U^s_J?}Y6rA1r*vsYe;hmbq7%v)QGzzg0v=u~bQeB#qt4N3mK{VLfDcFT8M6kED z5D`J`{Ta3v{sZy7AYwD~_RY@h?3cQ4fR2frw$%(`k$bkt$KfaRX z^MH0fsjQf=ksx0h4(aq7-y&s$SP*CG4=`@v_~sof-@2!j1P9n-If-eS6{NSV=(~ce z5^_R`m=i2Ykn9t`z9w(8bS(VcT_1M@^1f}oK(&qfBb=yh5+$N1xc}|!4#+)&BB39@ V8My)%a;X@ogGC(#W@(lv{Q&zZGFt!u diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 012b295d92..e2d4391058 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,6 +7,17 @@ public Task(String description) { this.isDone = false; } + public static Task createTask(String [] tokens) { + if (tokens[0].equals("todo")) { + return ToDo.createToDo(tokens); +// } else if (tokens[0].equals("deadline")) { +// return Deadline.createDeadLine(tokens); +// } else if (tokens[0].equals("event")) { +// return Event.createEvent(tokens); + } + return null; + } + public String getStatusIcon() { //return (isDone ? "✓" : "✗" ); return (isDone ? "\u2713" : "\u2718"); diff --git a/src/main/java/ToDo.class b/src/main/java/ToDo.class new file mode 100644 index 0000000000000000000000000000000000000000..6b524c07caa684a7e9fa8ade91067022e3a08ad5 GIT binary patch literal 1068 zcmZuvO-~bH5Psh6w!7VKDXt(O9~KZPTcL=kV1Yz!OiZdC+Gr}_u(T^#K6ab!*0Try zfd^ya$qQFalp2Zr0Dp!De}su2GwntQ^fL3l@67YeGxN^(KVOdkEMZlHfk_3IHAt9Z zb4A6pf(##LG{i6&Cu6F}s<_I>Sru~%avYjxb4|kt78G0;h^;uT6RZjJXNud_3oEy4 zxm&qX;5+VCe&&gQe9x=d0;!_o+K-xho3>xJHh1YotNOMT*k!Na2@Ge}yTFSa%nKw- zfmPjkXw^e#a?1|rDQGqxR6SRqFEeu%tzc20hcXLxqv|{Lz~NLi@H*m1dd(|ajU9nV zhJ|V+ujyCq`wokXbLBa1NXL2f2@ITW?rziBt=T?@(>iY8rhrIOyA0GZhG8AIutelP z-o0+yH#(Mao9e8WH`b>b8|kTrK<_c_+ljAYYz&QW8=kHm8z;c&DC;zR}LcYsqV4T**p!EZJ z!6PNxPqzu$If-A*YzyKeodhnBvUUim(n6#tua1~Ua_v0^ zv*yUc0pzDyBg*cTB=-OQ%$gi+zaJu2$sRyyLH$4sQoGI=@pCm53DU>YPms>tMeOJ8vAG@7MeLOMkApcx%A U< Date: Thu, 22 Aug 2019 09:17:22 +0800 Subject: [PATCH 09/46] Completed Lv 4 --- src/main/java/Deadline.class | Bin 0 -> 1204 bytes src/main/java/Deadline.java | 39 ++++++++++++++++++++++++++++++++++ src/main/java/Duke.class | Bin 3478 -> 3499 bytes src/main/java/Duke.java | 20 ++---------------- src/main/java/Event.class | Bin 0 -> 1192 bytes src/main/java/Event.java | 40 +++++++++++++++++++++++++++++++++++ src/main/java/Task.class | Bin 1007 -> 1223 bytes src/main/java/Task.java | 8 +++---- src/main/java/ToDo.class | Bin 1068 -> 816 bytes src/main/java/ToDo.java | 11 ---------- src/main/java/test3.out | 16 +++++++------- src/main/java/test4.out | 20 +++++++++--------- src/main/java/test6.out | 22 +++++++++---------- 13 files changed, 114 insertions(+), 62 deletions(-) create mode 100644 src/main/java/Deadline.class create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.class create mode 100644 src/main/java/Event.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..6ef12c931786c48e3715434f42b32354745e5179 GIT binary patch literal 1204 zcmZuv-%}D%6#g#z3lIcX$t+DQQCL9IiWD@>oMxKPX2Pk+@nM0@Sw$dNn(@7Vq8@wk zwPp&NoP6o6f2IGxX|i({7&91_bM8I&JKsIuIrrzEZzlleao-IUH(YRGQbEWK0aH#) zyD^3^-$b0y6h!$l<|a_wi5Ue6zP!oJEH`r;eoMh^2GKJ24F)x{tH03`CB3|p$XYeC zypv{-7tOM1-D8*zcOQ30BF~8KL8VA^zKmHmHX8eRqqeE%OBCrZ)C}D+)(pK^qBDl^ z@Kz6sOb0;Md$X2a*jv}DHid#a3X%-Uj$v)uH4lX&-3$y)tI|@y;LcVWwSw``z1ukSGo_Grolj*hfIkCE^J z2w`qz<8?zX)fq0pTKA_TFA1Pmt46uV5bwp))z)@H_)w_*G#9H;e^jWHX|A+iGwOw! zS+z_akY815`?|%j(1ZD3b)9OuE=yyA-l$5iox#B;L@SZj)MK*4w2M+)Am67&kHECp z7dSrI@XKWT?IR~7B5~8tg%Mn7C;lQLg)sGF2)QGOnYLe#Ziq=yOiBSsI}wW?kkSIu zTuL61RjCR29fktpdnn=|L?J20HV!cu=ZGeh=W*4^-CKzrp8bexJl~EV!dwgFPDVw&{MlHw(btdiEpl<}0#Uf?PU7$pl#K|Z6f ztYB1u(E1nyeq%zx*b0+R;X5Vyj6bio@G&1Lq{IhEI};5Y;zHG!sPQ!1ceNi2F)v|BZw{ukEQNx?rgJ#V5V-VYicSpVP+*1bRiMm__Ln|{R`F$ zLKi_kn47t zGnfxCz=FvlOD3}{d(Y<~hIrw@OPyB+uMOT9tax8Thjog#FD2wj3V>83}-dKo68euXl9=WNOUcy6FdJogDzKeiA!Zuh?mkX%)iUkAWMXY5&Ey5$7$r@jHa1bJsgEjX#HwgxOE+p;ty({X zdZFM#@L3gCwNUIr6vU-p#BU%{@QiM97w4XH?mhp<`RJ{Ak0;^*mn~*&f+y`pCE%9D zZJPz|IE=IC&|)bJ%O-a%?pdsa{reUVY#y>27LO#`_)$0dpHp>t!AqA{Jau`^8$BFt zC0*XKuCRy0lbs#SE}6V@dC!N<#b`OAf5qB*J=TmHbKPY{B0s6qW@7WaSvG2A);P!! zAW3Y8g2}jvwL{J%Flh`Velr*$&QT^%)a2g+G0C8+zuWoh7O77p`@R477XF4jDe4l3 zFeQ#*$=Gh`WH>~L!|WHjF&et+q*ED1yR^-S;u#r9vWjm6Qz2wduQ)@+e|V7|yr$r_ z@Hxf-j#FV$_H#n2llrSuQ#t*|@%$bUgY=1rQ!;cKk250TECtT#itDHIBHE~X#cc{o z7Fr5fi+x|%*D<{4wa=9Fsyi~;qrev!xFGSOIO>q%lKAP+WQI0ZnC7bf>CW%HF3xW- Wz$|;{3hhmy?UG|o{Lky@U7f%5on21= diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0ba25900c7..a44754e294 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -28,26 +28,10 @@ public static void main(String[] args) { doTask(tokens[1]); } else { Task task = Task.createTask(tokens); - lst.add(task); //because must count so must put first + lst.add(task); printInput(task); } -// } else if (tokens[0].equals("todo")) { -// -// } else if (tokens[0].equals("deadline")) { -// -// } else if (tokens[0].equals("event")) { -// -// } -// -// -// -// -// } else { -// Task task = new Task(input); -// printInput(task); -// lst.add(task); -// } } @@ -58,7 +42,7 @@ public static void printInput(Task input) { System.out.println(" Got it. I've added this task:"); System.out.println(String.format(" %s",input)); - System.out.println(" Now you have %d tasks in the list."); + System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); System.out.println(" ____________________________________________________________"); System.out.println(); diff --git a/src/main/java/Event.class b/src/main/java/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..39b9c654523ed0604eaf4e1ec76d48ee3bbaf426 GIT binary patch literal 1192 zcmZuwT~ks~6kUh=$rS}rGD{OG6fPiXMGAgp*-R7KOgI%eK3w7ETty(b_zU_I_1KHA zHB;E+@^&(3*R1k( zhC!aQ%9g#rFcIlI?uqcd8wXL_5=_ z84TAWhMguCW$>LdKi%3f3&b`lDHvU1@(H{rB%kr;)fPTVo*F zYEE%l;q-gmp5_jBJytaLSXKDlWT*S$`EKHIU-N*D!cAT$yM2!}%{mX$H>#PhQP-R? z@Q97{lj_y|&QYJD@a$Ex(@%~s>hn+c-GxHitB=SsOEv zYym7B6I)J>NiH>mqRfO~C4FZ#)MWb6s_a#nGB@)6QhJosc5JsJ=K%LTetbw~V7NEt z{*Y(KJQ%2fbXiOa*6;*#@@b0XsY;dxAx&W|S@5*Hy4b}qlu@z~_C~W8g__x6{25#3 zM!65Tkv=vy;gR^pz{Aq3p7<)WPeGG@TB?z_;$WFRH4HTBs|q_imbN5nHYM44ZS^$J>Ouq@(Zj?Fi}EGv?a0d zFRc9o*ksu9u&uC$9fe)&c?djIJ?y(U zP?W7P9CE(y;^_Y7OEf}Xw99FfG?GYZEWrracm3PG#xa^MPBcz&7Cwn;dkKWN zhu@+fPOP?{p#Fdbn+51+vj*7+1kzY0%!GAW64|gL3xgc;9HIOraRgZt$cC{;a30_V zV?>5xNKp$}!UQB?jGiWKg93RHB1J?RW-inu%RFKQLVIqSfu$}%6#Lgf#eKrO!j diff --git a/src/main/java/Task.java b/src/main/java/Task.java index e2d4391058..46890f85e7 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -10,10 +10,10 @@ public Task(String description) { public static Task createTask(String [] tokens) { if (tokens[0].equals("todo")) { return ToDo.createToDo(tokens); -// } else if (tokens[0].equals("deadline")) { -// return Deadline.createDeadLine(tokens); -// } else if (tokens[0].equals("event")) { -// return Event.createEvent(tokens); + } else if (tokens[0].equals("deadline")) { + return Deadline.createDeadline(tokens); + } else if (tokens[0].equals("event")) { + return Event.createEvent(tokens); } return null; } diff --git a/src/main/java/ToDo.class b/src/main/java/ToDo.class index 6b524c07caa684a7e9fa8ade91067022e3a08ad5..48e2a29d2e7f3a8a4d91d27fcd2a366246f5d296 100644 GIT binary patch delta 410 zcmZ8cyG{a85IwUCyUTic2G^7oz z>L|&!EMd*WIyQ7{-gK{uhUePeWHcTUl9lS=iF4^R&YbbEF=yL;o-$e#F@oiPkd+pQ zq9Ra5jX*_0pzC&Afn}Djsg$e364-*JV_RSc4QX(urv$Z9J@((Jy&E15Jlk`;i|Kyf z9TOrvcLvk`WOVM0BoX`n2fw8p>_s>%pn~{*jB$~t5+_u+YPI?U=#D!=oKYrc7D4C; zA%Udy`>)Co#r=d@?k%w@pnSp9q0lF?taE_BtxbMM>`28!!DpB~wRVpMyBFXh>_>!W Qtj+IezdpG=#hikbALP$Ki2wiq literal 1068 zcmZuvO-~bH5Psh6w!7VKDXt(O9~KZPTcL=kV1Yz!OiZdC+Gr}_u(T^#K6ab!*0Try zfd^ya$qQFalp2Zr0Dp!De}su2GwntQ^fL3l@67YeGxN^(KVOdkEMZlHfk_3IHAt9Z zb4A6pf(##LG{i6&Cu6F}s<_I>Sru~%avYjxb4|kt78G0;h^;uT6RZjJXNud_3oEy4 zxm&qX;5+VCe&&gQe9x=d0;!_o+K-xho3>xJHh1YotNOMT*k!Na2@Ge}yTFSa%nKw- zfmPjkXw^e#a?1|rDQGqxR6SRqFEeu%tzc20hcXLxqv|{Lz~NLi@H*m1dd(|ajU9nV zhJ|V+ujyCq`wokXbLBa1NXL2f2@ITW?rziBt=T?@(>iY8rhrIOyA0GZhG8AIutelP z-o0+yH#(Mao9e8WH`b>b8|kTrK<_c_+ljAYYz&QW8=kHm8z;c&DC;zR}LcYsqV4T**p!EZJ z!6PNxPqzu$If-A*YzyKeodhnBvUUim(n6#tua1~Ua_v0^ zv*yUc0pzDyBg*cTB=-OQ%$gi+zaJu2$sRyyLH$4sQoGI=@pCm53DU>YPms>tMeOJ8vAG@7MeLOMkApcx%A U< Date: Thu, 22 Aug 2019 09:18:24 +0800 Subject: [PATCH 10/46] Completed Lv 4 --- src/main/java/Task.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 46890f85e7..710e740afb 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -19,7 +19,6 @@ public static Task createTask(String [] tokens) { } public String getStatusIcon() { - //return (isDone ? "✓" : "✗" ); return (isDone ? "\u2713" : "\u2718"); } From 5727830fed8d3c20199b7e846a56ba947da35a69 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 12:17:34 +0800 Subject: [PATCH 11/46] Completed Lv 5 --- src/main/java/Duke.class | Bin 3499 -> 5034 bytes src/main/java/Duke.java | 173 ++++++++++++++++++-- src/main/java/InvalidCommandException.class | Bin 0 -> 246 bytes src/main/java/InvalidCommandException.java | 5 + src/main/java/Task.class | Bin 1223 -> 808 bytes src/main/java/Task.java | 20 +-- 6 files changed, 171 insertions(+), 27 deletions(-) create mode 100644 src/main/java/InvalidCommandException.class create mode 100644 src/main/java/InvalidCommandException.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 7809c560ac18ef598236d3c0e215df40a6c33bf4..47ac81d22c5769b929b372c438a5c0d7e932c1bb 100644 GIT binary patch literal 5034 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 C`y^Zd diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a44754e294..dbe498696c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,18 @@ import java.util.Scanner; import java.util.List; import java.util.ArrayList; +import java.util.Arrays; public class Duke { +//potential cases + //Not number when need number + //number but too much + //White space, empty string + //Blanket exceptions + public static List lst = new ArrayList<>(); + final private static String horizontalLine = " ____________________________________________________________"; public static void main(String[] args) { List start = new ArrayList<>(); @@ -24,12 +32,42 @@ public static void main(String[] args) { break; } else if (tokens[0].equals("list")) { printNumberList(lst); + //potential to throw out empty list exception } else if (tokens[0].equals("done")) { - doTask(tokens[1]); + try { + doTask(tokens[1]); + } catch (NumberFormatException error) { + printInput(List.of("☹ Invalid input must be an integer")); + } catch (IllegalArgumentException error2) { + printInput(List.of(error2.getMessage())); + //"Task has already been done" + } catch (IndexOutOfBoundsException error3) { + printInput(List.of("☹ No such task")); + //, IllegalArgumentException, IndexOutOfBoundsException { + } + + + // } catch(ArrayIndexOutOfBoundsException error){ + // System.out.println(horizontalLine); + // //System.out.println(formatText("Huh, what do you wanna do?")); + // System.out.println(horizontalLine); + + // } catch (IllegalArgumentException error2){ + // System.out.println(horizontalLine); + // //System.out.println(formatText("But this task has already been done!")); + // System.out.println(horizontalLine); + + // } catch (IndexOutOfBoundsException error3){ + // System.out.println(horizontalLine); + // //System.out.println(formatText("No such task dude")); + // System.out.println(horizontalLine); + // } + } else { - Task task = Task.createTask(tokens); - lst.add(task); - printInput(task); + //need try catch first, catch means not even a null return + createTask(tokens); + // lst.add(task); + // printInput(task); } @@ -38,60 +76,167 @@ public static void main(String[] args) { } public static void printInput(Task input) { - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(" Got it. I've added this task:"); System.out.println(String.format(" %s",input)); System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(); } public static void printInput(List start) { - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); for (String input : start) { System.out.println(String.format(" %s",input)); } - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(); } public static void printEnd(String input) { - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(String.format(" %s",input)); - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(); } public static void printNumberList(List lst) { - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(" Here are the tasks in your list:"); for (int i = 0; i < lst.size(); i++) { System.out.println(String.format(" %d.%s",i+1,lst.get(i))); } - System.out.println(" ____________________________________________________________"); + System.out.println(horizontalLine); System.out.println(); } - public static void doTask(String str) { + //assumes that its strNum, not white space or empty string, hasnt change before + + public static void doTask(String str) throws NumberFormatException, IllegalArgumentException, IndexOutOfBoundsException { int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); - task.doTask(); + boolean isDoneBefore = task.doTask(); + if (isDoneBefore) { + throw new IllegalArgumentException("Task has already been done"); + } List inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); printInput(inst); } + public static void createTask(String [] tokens) { + Task task = null;//dodge init error + if (tokens[0].equals("todo")) { + try { + checkValidLength(tokens); + task = ToDo.createToDo(tokens); + // } catch (StringIndexOutOfBoundsException error){ + // System.out.println(horizontalLine); + // //System.out.println(formatText("☹ OOPS!!! The description of a todo cannot be empty.")); + // System.out.println("☹ OOPS!!! The description of a todo cannot be empty."); + // System.out.println(horizontalLine); + } catch (IllegalArgumentException error2){//a throw to trigger own catch clause + printInput(List.of(error2.getMessage())); + //printInput(List.of("No deadline detected!")); + // System.out.println(horizontalLine); + // System.out.println("No deadline detected!"); + // System.out.println(horizontalLine); + } + } else if (tokens[0].equals("deadline")) { + try { + //String[] dateSplit = input.split(" /by "); + checkValidLength(tokens); + if (Arrays.asList(tokens).contains("/by")) { + //if (dateSplit.length == 1) { + throw new IllegalArgumentException("Missing deadline"); + } else { + task = Deadline.createDeadline(tokens); + } + } + // } + // String deadlineDesc = dateSplit[0].substring(9); + // checkValidInput("deadline",input);//put the array inside and see if it contains the word deadline + + // addDeadline(deadlineDesc, dateSplit[dateSplit.length - 1]); + // } + // catch (StringIndexOutOfBoundsException error){ + // printInput(List.of("The description of a deadline cannot be empty :(")); + // // System.out.println(horizontalLine); + // // System.out.println(formatText("The description of a deadline cannot be empty :(")); + // // System.out.println(horizontalLine); + // } + catch (IllegalArgumentException error2){//a throw to trigger own catch clause + printInput(List.of(error2.getMessage())); + //printInput(List.of("No deadline detected!")); + // System.out.println(horizontalLine); + // System.out.println("No deadline detected!"); + // System.out.println(horizontalLine); + } + //return Deadline.createDeadline(tokens); + } else if (tokens[0].equals("event")) { + //return Event.createEvent(tokens); + + try { + checkValidLength(tokens); + if (Arrays.asList(tokens).contains("/at")) { + // String[] dateSplit = input.split(" /at "); + // if (dateSplit.length == 1) { + throw new IllegalArgumentException("Missing deadline"); + } else { + task = Event.createEvent(tokens); + } + } + // } + // String deadlineDesc = dateSplit[0].substring(9); + // checkValidInput("deadline",input);//put the array inside and see if it contains the word deadline + + // addDeadline(deadlineDesc, dateSplit[dateSplit.length - 1]); + // } + + + // catch (StringIndexOutOfBoundsException error){ + // printInput(List.of("The description of a deadline cannot be empty :(")); + // // System.out.println(horizontalLine); + // // System.out.println(formatText("The description of a deadline cannot be empty :(")); + // // System.out.println(horizontalLine); + // } + catch (IllegalArgumentException error2){//a throw to trigger own catch clause + printInput(List.of(error2.getMessage())); + //printInput(List.of("No deadline detected!")); + // System.out.println(horizontalLine); + // System.out.println("No deadline detected!"); + // System.out.println(horizontalLine); + } + // System.out.println(horizontalLine); + // System.out.println("No deadline detected!"); + // System.out.println(horizontalLine); + } else { + printInput(List.of("☹ OOPS!!! I'm sorry, but I don't know what that means :-(")); + //printInput(List.of("The description of a deadline cannot be empty :(") + } + if (task != null) { + lst.add(task); + printInput(task); + } + //return null; + } + public static void checkValidLength(String[] tokens) throws IllegalArgumentException { + if (tokens.length == 1) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a todo cannot be empty.",tokens[0])); + //throw new IllegalArgumentException("Missing task"); + } + } } diff --git a/src/main/java/InvalidCommandException.class b/src/main/java/InvalidCommandException.class new file mode 100644 index 0000000000000000000000000000000000000000..64a84dc02d565b7803dfbb035b9272b31daf8a23 GIT binary patch literal 246 zcmX^0Z`VEs1_lcTUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oak4WF#UvPAuy#JqI<;F6-u zymV{LFh&Lz=lqmZMh1SL%)C^;(%hufqL9R-9H0nSaDHh~a;jSXJFh2mS+c&TwqaVpgI4f0m?2Wnx^ zq9TIYMbKXgqWdPOHs`!|?!D)p`yRdtt$utxzXDi8&4PiMFe1n+D43WvF=wJ^VBR93 zq+r298jA+X!)9;zSxPcQy@7ww-S$tK{(kS!Kt&dr%i3~><)R6=Hf%&~#1NOatXdn# zgpG`XDwY^T(?9DnB#!-azuxovow_$TJ?eKDc)7AC-?YtQgi-+-gfgO+P+r73Xbxk9 zj%@G(OUhlI-eRB)N~4YyVn!Ty@4+u&I^r6-qu-IFAxRht$`PdKZ9ua(3_6afc!Z8z z7O9KBwm4~%zut{tKag=k`U{K}cOPMTEkP9ao?xjZ?B5cHep%#{FICnlfJ&B7$*y3z k;sKnG#E7(?Xb#;8r1F$2O^0Xb=xmUagT-ieD(Ia424iwF)c^nh literal 1223 zcmZ`&T~8BH5IwiscDKv+!xa?eQ$Dm^6cA8B5Jd`#L47DOLE^*Gu4JKfvEA}Ve9^>r zUojCRCi(;X8U7ICx!ux&)HIpfx%ZrzIWx1r{(S!lU>eVKByb}J6KQEO8Y~_C7}0SP zw=|6E7{j=R+d3vNsbNaP9SwI?+|!AkmS#rc@2i*QiLmpNX17d!0ze31IVk=M z%USV^LU4Yav{&d&5)tB=w7x-DBZmlC$|005yb`!dYmx{=XrqWhWl)W07rN^Kc1agR zOjyc<89qYfBQ)z6(F5tL4PUGIv4*c7hy$`hwH&>S3$*cPAcZ)iC;0UxF+y*g74+09 zP*TYxQ*jyUsi%0#)Jf|r6s9%XJ|kip&A3u3C|2@Sgp381VTIfzTB*K=r-VcpAtZT$ z=785lZ=eAkXAdN_(~L)cAhE7kM@Z(@!#q;CV_f)`-AnW!hG=D?fqIvsR`^VJ^;+`> N7<-V&VIo7g{uhVY@?-!2 diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 710e740afb..7d4a03d975 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -7,17 +7,6 @@ public Task(String description) { this.isDone = false; } - public static Task createTask(String [] tokens) { - if (tokens[0].equals("todo")) { - return ToDo.createToDo(tokens); - } else if (tokens[0].equals("deadline")) { - return Deadline.createDeadline(tokens); - } else if (tokens[0].equals("event")) { - return Event.createEvent(tokens); - } - return null; - } - public String getStatusIcon() { return (isDone ? "\u2713" : "\u2718"); } @@ -29,7 +18,12 @@ public String toString() { return String.format("[%s] %s", getStatusIcon(), getDescription()); } - public void doTask() { - this.isDone = true; + public boolean doTask() { + if (!isDone) { + this.isDone = true; + return false; + } else { + return true; + } } } \ No newline at end of file From c744b57d9ae92bae6649a06253379e5cbbdb7640 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 12:21:42 +0800 Subject: [PATCH 12/46] Cleaned up comments for Duke --- src/main/java/Duke.java | 114 ++++------------------------------------ 1 file changed, 10 insertions(+), 104 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index dbe498696c..fe0fc1fa85 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,12 +5,6 @@ public class Duke { -//potential cases - //Not number when need number - //number but too much - //White space, empty string - //Blanket exceptions - public static List lst = new ArrayList<>(); final private static String horizontalLine = " ____________________________________________________________"; @@ -20,19 +14,18 @@ public static void main(String[] args) { start.add("Hello! I'm Duke"); start.add("What can I do for you?"); - printInput(start); + printInput(start); Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { - String input = sc.nextLine(); + String input = sc.nextLine(); String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { printEnd("Bye. Hope to see you again soon!"); break; } else if (tokens[0].equals("list")) { printNumberList(lst); - //potential to throw out empty list exception } else if (tokens[0].equals("done")) { try { doTask(tokens[1]); @@ -40,35 +33,11 @@ public static void main(String[] args) { printInput(List.of("☹ Invalid input must be an integer")); } catch (IllegalArgumentException error2) { printInput(List.of(error2.getMessage())); - //"Task has already been done" } catch (IndexOutOfBoundsException error3) { printInput(List.of("☹ No such task")); - //, IllegalArgumentException, IndexOutOfBoundsException { } - - - // } catch(ArrayIndexOutOfBoundsException error){ - // System.out.println(horizontalLine); - // //System.out.println(formatText("Huh, what do you wanna do?")); - // System.out.println(horizontalLine); - - // } catch (IllegalArgumentException error2){ - // System.out.println(horizontalLine); - // //System.out.println(formatText("But this task has already been done!")); - // System.out.println(horizontalLine); - - // } catch (IndexOutOfBoundsException error3){ - // System.out.println(horizontalLine); - // //System.out.println(formatText("No such task dude")); - // System.out.println(horizontalLine); - // } - } else { - //need try catch first, catch means not even a null return createTask(tokens); - // lst.add(task); - // printInput(task); - } } @@ -76,13 +45,13 @@ public static void main(String[] args) { } public static void printInput(Task input) { - System.out.println(horizontalLine); + System.out.println(horizontalLine); System.out.println(" Got it. I've added this task:"); - System.out.println(String.format(" %s",input)); + System.out.println(String.format(" %s",input)); System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); - System.out.println(horizontalLine); - System.out.println(); + System.out.println(horizontalLine); + System.out.println(); } @@ -116,8 +85,6 @@ public static void printNumberList(List lst) { System.out.println(); } - //assumes that its strNum, not white space or empty string, hasnt change before - public static void doTask(String str) throws NumberFormatException, IllegalArgumentException, IndexOutOfBoundsException { int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); @@ -131,110 +98,49 @@ public static void doTask(String str) throws NumberFormatException, IllegalArgum } public static void createTask(String [] tokens) { - Task task = null;//dodge init error + Task task = null; if (tokens[0].equals("todo")) { try { checkValidLength(tokens); task = ToDo.createToDo(tokens); - // } catch (StringIndexOutOfBoundsException error){ - // System.out.println(horizontalLine); - // //System.out.println(formatText("☹ OOPS!!! The description of a todo cannot be empty.")); - // System.out.println("☹ OOPS!!! The description of a todo cannot be empty."); - // System.out.println(horizontalLine); - } catch (IllegalArgumentException error2){//a throw to trigger own catch clause + } catch (IllegalArgumentException error2){ printInput(List.of(error2.getMessage())); - //printInput(List.of("No deadline detected!")); - // System.out.println(horizontalLine); - // System.out.println("No deadline detected!"); - // System.out.println(horizontalLine); } } else if (tokens[0].equals("deadline")) { try { - //String[] dateSplit = input.split(" /by "); checkValidLength(tokens); if (Arrays.asList(tokens).contains("/by")) { - //if (dateSplit.length == 1) { throw new IllegalArgumentException("Missing deadline"); } else { task = Deadline.createDeadline(tokens); } - } - // } - // String deadlineDesc = dateSplit[0].substring(9); - // checkValidInput("deadline",input);//put the array inside and see if it contains the word deadline - - // addDeadline(deadlineDesc, dateSplit[dateSplit.length - 1]); - // } - // catch (StringIndexOutOfBoundsException error){ - // printInput(List.of("The description of a deadline cannot be empty :(")); - // // System.out.println(horizontalLine); - // // System.out.println(formatText("The description of a deadline cannot be empty :(")); - // // System.out.println(horizontalLine); - // } - catch (IllegalArgumentException error2){//a throw to trigger own catch clause + } catch (IllegalArgumentException error2){ printInput(List.of(error2.getMessage())); - //printInput(List.of("No deadline detected!")); - // System.out.println(horizontalLine); - // System.out.println("No deadline detected!"); - // System.out.println(horizontalLine); } - - - //return Deadline.createDeadline(tokens); } else if (tokens[0].equals("event")) { - //return Event.createEvent(tokens); - try { checkValidLength(tokens); if (Arrays.asList(tokens).contains("/at")) { - // String[] dateSplit = input.split(" /at "); - // if (dateSplit.length == 1) { throw new IllegalArgumentException("Missing deadline"); } else { task = Event.createEvent(tokens); } - } - // } - // String deadlineDesc = dateSplit[0].substring(9); - // checkValidInput("deadline",input);//put the array inside and see if it contains the word deadline - - // addDeadline(deadlineDesc, dateSplit[dateSplit.length - 1]); - // } - - - // catch (StringIndexOutOfBoundsException error){ - // printInput(List.of("The description of a deadline cannot be empty :(")); - // // System.out.println(horizontalLine); - // // System.out.println(formatText("The description of a deadline cannot be empty :(")); - // // System.out.println(horizontalLine); - // } - catch (IllegalArgumentException error2){//a throw to trigger own catch clause + } catch (IllegalArgumentException error2){ printInput(List.of(error2.getMessage())); - //printInput(List.of("No deadline detected!")); - // System.out.println(horizontalLine); - // System.out.println("No deadline detected!"); - // System.out.println(horizontalLine); } - // System.out.println(horizontalLine); - // System.out.println("No deadline detected!"); - // System.out.println(horizontalLine); - } else { printInput(List.of("☹ OOPS!!! I'm sorry, but I don't know what that means :-(")); - //printInput(List.of("The description of a deadline cannot be empty :(") } if (task != null) { lst.add(task); printInput(task); } - //return null; } public static void checkValidLength(String[] tokens) throws IllegalArgumentException { if (tokens.length == 1) { throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a todo cannot be empty.",tokens[0])); - //throw new IllegalArgumentException("Missing task"); } } From 78e74cb646edb7091a5a05d2b776c432ec91f248 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 12:42:50 +0800 Subject: [PATCH 13/46] Halfway through Lv 6 --- src/main/java/Duke.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index fe0fc1fa85..3f7cbc4c42 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -36,6 +36,16 @@ public static void main(String[] args) { } catch (IndexOutOfBoundsException error3) { printInput(List.of("☹ No such task")); } + } else if (tokens[0].equals("delete")) { + try { + deleteTask(tokens[1]); + } catch (NumberFormatException error) { + printInput(List.of("☹ Invalid input must be an integer")); + } catch (IllegalArgumentException error2) { + printInput(List.of(error2.getMessage())); + } catch (IndexOutOfBoundsException error3) { + printInput(List.of("☹ No such task")); + } } else { createTask(tokens); } @@ -138,6 +148,8 @@ public static void createTask(String [] tokens) { } } + + public static void checkValidLength(String[] tokens) throws IllegalArgumentException { if (tokens.length == 1) { throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a todo cannot be empty.",tokens[0])); From ddf800f194fa4b3a5784b24debfa67f1291e650e Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 14:43:21 +0800 Subject: [PATCH 14/46] Fixed some Exceptions for Level 5 --- src/main/java/Duke.class | Bin 5034 -> 5035 bytes src/main/java/Duke.java | 18 ++++-------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 47ac81d22c5769b929b372c438a5c0d7e932c1bb..f9a011f95ad786e508d16103e82fcb4ceb7b2abf 100644 GIT binary patch delta 503 zcmWNNYfIB{6vsas;#Qd3--)@({QtAHX$j&j!3%aX4N=!cu@akX>TFx)Ht%#1>4Fb3 zei5b^MG%xIh7Tfo6+P~mFQC`Z_sQXKzUQ3p<$HK1yzeiFgbz1<**%%rSSlH}lbPv! z?t-1pXLI&g!j5G$$t5NdGmdl6RPfjBYBZL|afh-8&7Qr&bP-;BSok@idYS;$lu}0- zO&q74a(W2TCp5}QMmWVd70gh{0_Rx9<_Qij)W7BoYgF-G{RhsnMTjrzzY<}G^XyS; zqQ#$rbz-a+UxRiV=@d^l&0=UVM}4VatI#%mYS+Aj7U7*-qKnJsjc?MrCbUaBuIsj2 zN^cmif4-tm(|&y%kh-X@2Dr*?dbz_*2F!g z$4sl0cWs&hA^&@GY7T;qz$a0H02FWwT ztbWcBXI>kNLY8>0wAPf?Ix85S@lKPE>OZr}H(s*KD}E})-`W}m9P_6neq^0O-b%4C N9f2z@uUQF1{sS;aV-^4a delta 520 zcmW-dTT4`76o#LX!R;XFY_(!4bx&%eVH82?#dH9NP!YpUk|{N@M;p)?(LIqJv=WR8 zLiu9SLPLbWB#R6xDu{l9brW3#Rv;Ak3xr;}`PR!?-&*fsG4d?(GU%_WT%CI7G^Z}b z`;xAcObui_r#~~~ITsR6Jf()0=uHeRH~7Ej`07lF74~~+H@#eME#;0Dk;i6iwy=$@ zlo6svXdgQ`Kq&{+X{MYu9NG!f%}#o#WRP79vzKc`7@?YR;XB&A$8NI1)70{qJIsZ6rE z@KD>2sFU{?Gji}meqM80-aB|fT-fEU)O?VdkK+2I#6Ii7Hw<5Rz*lC4=lH<_KY7kC h-te3Eto=_eY*vcgz#nq?E5+;PaB-urz>F1F{{vt+bpikY diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 3f7cbc4c42..71554dfbd8 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -30,17 +30,7 @@ public static void main(String[] args) { try { doTask(tokens[1]); } catch (NumberFormatException error) { - printInput(List.of("☹ Invalid input must be an integer")); - } catch (IllegalArgumentException error2) { - printInput(List.of(error2.getMessage())); - } catch (IndexOutOfBoundsException error3) { - printInput(List.of("☹ No such task")); - } - } else if (tokens[0].equals("delete")) { - try { - deleteTask(tokens[1]); - } catch (NumberFormatException error) { - printInput(List.of("☹ Invalid input must be an integer")); + printInput(List.of("☹ Invalid input, must be an integer!!")); } catch (IllegalArgumentException error2) { printInput(List.of(error2.getMessage())); } catch (IndexOutOfBoundsException error3) { @@ -119,7 +109,7 @@ public static void createTask(String [] tokens) { } else if (tokens[0].equals("deadline")) { try { checkValidLength(tokens); - if (Arrays.asList(tokens).contains("/by")) { + if (!Arrays.asList(tokens).contains("/by")) { throw new IllegalArgumentException("Missing deadline"); } else { task = Deadline.createDeadline(tokens); @@ -130,7 +120,7 @@ public static void createTask(String [] tokens) { } else if (tokens[0].equals("event")) { try { checkValidLength(tokens); - if (Arrays.asList(tokens).contains("/at")) { + if (!Arrays.asList(tokens).contains("/at")) { throw new IllegalArgumentException("Missing deadline"); } else { task = Event.createEvent(tokens); @@ -152,7 +142,7 @@ public static void createTask(String [] tokens) { public static void checkValidLength(String[] tokens) throws IllegalArgumentException { if (tokens.length == 1) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a todo cannot be empty.",tokens[0])); + throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); } } From 0ef8fe433494ddef2b08818cf4449eb422237ba9 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 15:03:44 +0800 Subject: [PATCH 15/46] Level 6 Completed --- src/main/java/Duke.java | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 71554dfbd8..16019d8e5d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -36,6 +36,14 @@ public static void main(String[] args) { } catch (IndexOutOfBoundsException error3) { printInput(List.of("☹ No such task")); } + } else if (tokens[0].equals("delete")) { + try { + deleteTask(tokens[1]); + } catch (NumberFormatException error) { + printInput(List.of("☹ Invalid input must be an integer")); + } catch (IndexOutOfBoundsException error3) { + printInput(List.of("☹ No such task")); + } } else { createTask(tokens); } @@ -47,7 +55,18 @@ public static void main(String[] args) { public static void printInput(Task input) { System.out.println(horizontalLine); - System.out.println(" Got it. I've added this task:"); + System.out.println(" Got it. I've added this task: "); + System.out.println(String.format(" %s",input)); + System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); + System.out.println(horizontalLine); + System.out.println(); + + } + + public static void printDeletion(Task input) { + System.out.println(horizontalLine); + + System.out.println(" Noted. I've removed this task: "); System.out.println(String.format(" %s",input)); System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); System.out.println(horizontalLine); @@ -138,6 +157,12 @@ public static void createTask(String [] tokens) { } } + public static void deleteTask(String str) throws NumberFormatException, IndexOutOfBoundsException { + int pos = Integer.parseInt(str)-1; + Task task = lst.get(pos); + lst.remove(task); + printDeletion(task); + } public static void checkValidLength(String[] tokens) throws IllegalArgumentException { From 01d9a4e591e2ea609152a9faf830e311524dc6fa Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 22 Aug 2019 15:07:22 +0800 Subject: [PATCH 16/46] Edited Test Cases for Level 6 --- src/main/java/Duke.class | Bin 5035 -> 5551 bytes src/main/java/test6.out | 11 +++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index f9a011f95ad786e508d16103e82fcb4ceb7b2abf..e531c63fba4e839ae825ff2d94c47f076a00d407 100644 GIT binary patch delta 2843 zcmb_edwf&n8GgQ;lb+M`#I~V7APp^{rG}=JYC8nVRpe46ElMd`P)15(36_L4rybpt zh@#^%6?YWH3ks+isB?u`T0rb>Z0P0`H|KEEjX8I7_nV^7JztX2Zu8G2zkJvCeZS{@ z-uHXIJneg~BJtAsBgX+u5hENZhpC~%0UJymojF*A&+6FVz<6|N_*^zVkDDFPaf@s= z$|j-XRtIXZNylxnzg@>>DSn5JJG0q;K~A>l*ed&N8n)~BqBMJ#hPxf`;2tf39XjsS z@g*r?>9|k!_sgSpYIs1$gAVM%LpmPT@rZ^;k8XmyCXy~>n+!UFk2ijAv-(P+3`!|Miqh#whf#v2BHj5iJZ1g8ar*T7r&sesbb z6*llQnn@~U-Zh8_sBJvez!EeXSS#(Sp;(kcZHQR!D-Fuqc*mNd`jnsJwAHFkoh6VZ zahVi}N&WF>9_;fjjCKawA|Y=iy1v8ouIq@K-j=X880CT)ZVk5^h+?IIU*L>&Kn-O7 z(!je?x6~R?ON7@NXCJ5h3h!C-?3MF>jo)bat%2X+_fl#(Pw>i5L(B|^CVCh8I>X-f z@VZ!MIOH|gMB-jE7{95O4!(~+82F>~`A_(>wZp!&;4k>AfxqGJ^l2%Dq)%^JAK1r| z&xlo+#v6MWSI1=M4;yWhhlGU4{@iMXU9Zcsvqq^v6|jdp!%>scIaNVZ z6Lv#n3C(&XYqqlms|}&!lz|XdAIjI>v#BCmI1YW3-6`@(eA;hKc%lUPwc^M3jnOSUCaHWX7U~l&y zhUn%%;Ci-Msl_ZBy8$aXrl@!q3fIBJ$aPkUZflm)D|T3`oCPa3xK*XvHL?eJyD-_U zs@1(1l|)Oe-R15@VK1~KnriKCdk@A8&gXHncyKZ$r9U>M?@Q}@lPICcIO{QIp;nR{ zXy}IB>UX-`2hoRP7!BE76Di~8y{*6rj!&WzFXIxt&hZ<# zl$WB00iJ|U)0-+7=TNR;l?MGBd>U#r1Phupj1Fk-XhDMN6 zSZQmKhiNFqbj-#K)L|wXILekea{)~v9k)R^DHK)zcQjWL%{-!+Pc#dNp^o2$M6(D9 zNlutCk*T$X6Eb(9m29#2W!PGhiJgDgF@qq6 zhwPK0G7@$=b{!Ek^ATB29#$~zZjk=7m}dOn$dzaf& zdE!x5$$V&5{hmHdwjo2rW+9RTuMM-2$&WM_CBy&(*|snuiPadxgqX>cn2S~f=m-p^`q$@b_Yh8k)`wO{3_?)cVRE)Xps01?N$CnqAWl zWBQA(8C;xs1hc>-o?WZDRbKP%1TCa-`QhNWjTEdy0iOXkpN%3`QXkrRG2^IaKN%*o zxg!P70dXEap<$|^2I!B%OYWggwtPe~C1^WWWl9|r0Y59w6{(6*M96dayE2eWz>;7u zRGB-Z)ZCQRq>R)&*Ze*#u;HPMH+9k*?kx-?vFtyT>!k8k|E0X>6O{v0c2l`*=;$0* zeY(6=oIpO=WU||BxVEAf4OWG#I3cU-MvP^MXgZ)3!_lis^X>)qIddpNrnJ8(ZNe(&RVH^+PM z0QS@CXYnu&659rX3^m2R8;w@W)4}vXv;UK*neDo9EC@%yb)^M zHJRe6RLgrHgCq|~C)Y(OO#69(575*zDK`{|qSOg0ZFy+%GwCktdv_;A@;qB+v8L^KXueRMr3h delta 2368 zcmai#3wRXO6~}*fXEt*)85EWP2_cXKA!LI_g9t*PNEM>p2ohA{i)_q_i*XZ^C5T#9 zEItt1V#jK+)>c}ZT0{hDvH>4xtyZcQ`>wTbYv1puR7lUA3vrR&}=ftcN+hj9q!V6 z*ySU9RI^2Mx5LMbXJ2!VdGq5g_i~>(|AY~@7O|51&Et~}4`@E6c~J9dbMzTw`H;gl zmzjK4^Eq?j!Cy#4(x$I_-=1a!O6PkXP0rHwb&0d#% zJgIrg*gvg##&1>!%lA7xt8lxz)0ynKnXWZiMd7r>@?_67b89a0mqtp|bACFq%`dTL zSmsxS^%RKMrtg?ldafM>k>SS-SZcR4bQP+HBGLuPlJAB3C1zz-M=Bpkralqqi zysS_a9|?}}Dh-{pJ$f>2WnH9DeWd2mYwg?WtsYM>>;o z_>;$<`HK)x*S5~%uRJeao6CCE%V^)9j_&fhlL{q(~j3mS=s!L`a{^{{A-u7Fa z1=eL;zGsK?R>bBI|K4+-+pDz0I|4-EPxNY3#BcPTP?mqhOXMo0Gmx$*G~}WJlXQ%cw@NG# z1Kt*Kg8$+Pt8&xWPA!jdGA)98Dususak#`mAEw%&&f(JH3mr-l4rNOm%DuO-4S_=Y zaLnXFCYJ1`B39MUWV4YL78J5l66{ zDs!ryk<4H+r?WtszmYQ}g|h=RS4dzcS$7B;OV-6l(ZmOtu1M4laS`5u($*na%R;i^;Vrp&U3RO+^$optoRfEPQ6(6V05wY_ zBTJbe?K5B2v!!Vgl80qdWTu`94IeReh|@wg+C?REECjoWoE5}0FP`UgyS+h*Vi?7K zW;RXl=ZyK~TN$yBvXe%5aL}(z(dRQos~*DWy`T zi1<^R4!AHKo*-=4hH7%d2lW`;&*#TE|o{s{Mn!JKV^k+XCB|x3fdKaDYwY Date: Wed, 28 Aug 2019 00:08:30 +0800 Subject: [PATCH 17/46] Implemented Enums for Exceptions --- -diff | 0 diff | 0 src/main/java/Duke.class | Bin 5551 -> 5711 bytes src/main/java/Duke.java | 24 +++++++++-------- src/main/java/DukeException$1.class | Bin 0 -> 734 bytes src/main/java/DukeException.class | Bin 0 -> 1120 bytes src/main/java/DukeException.java | 30 +++++++++++++++++++++ src/main/java/DukeExceptionType.class | Bin 0 -> 956 bytes src/main/java/DukeExceptionType.java | 3 +++ src/main/java/InvalidCommandException.java | 5 ---- src/main/java/Task.class | Bin 808 -> 808 bytes src/main/java/Task.java | 1 + 12 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 -diff create mode 100644 diff create mode 100644 src/main/java/DukeException$1.class create mode 100644 src/main/java/DukeException.class create mode 100644 src/main/java/DukeException.java create mode 100644 src/main/java/DukeExceptionType.class create mode 100644 src/main/java/DukeExceptionType.java delete mode 100644 src/main/java/InvalidCommandException.java diff --git a/-diff b/-diff new file mode 100644 index 0000000000..e69de29bb2 diff --git a/diff b/diff new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index e531c63fba4e839ae825ff2d94c47f076a00d407..de4fd7871ec511e14893d5c723fbf88d38887a3a 100644 GIT binary patch literal 5711 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 literal 5551 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 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 16019d8e5d..24513dad62 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -22,7 +22,7 @@ public static void main(String[] args) { String input = sc.nextLine(); String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { - printEnd("Bye. Hope to see you again soon!"); + printOneLine("Bye. Hope to see you again soon!"); break; } else if (tokens[0].equals("list")) { printNumberList(lst); @@ -30,19 +30,21 @@ public static void main(String[] args) { try { doTask(tokens[1]); } catch (NumberFormatException error) { - printInput(List.of("☹ Invalid input, must be an integer!!")); + printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); + } catch (IllegalArgumentException error2) { - printInput(List.of(error2.getMessage())); + printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } catch (IndexOutOfBoundsException error3) { - printInput(List.of("☹ No such task")); + printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); } } else if (tokens[0].equals("delete")) { try { deleteTask(tokens[1]); } catch (NumberFormatException error) { - printInput(List.of("☹ Invalid input must be an integer")); + printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); } catch (IndexOutOfBoundsException error3) { - printInput(List.of("☹ No such task")); + printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); + } } else { createTask(tokens); @@ -84,7 +86,7 @@ public static void printInput(List start) { System.out.println(); } - public static void printEnd(String input) { + public static void printOneLine(String input) { System.out.println(horizontalLine); System.out.println(String.format(" %s",input)); System.out.println(horizontalLine); @@ -123,7 +125,7 @@ public static void createTask(String [] tokens) { checkValidLength(tokens); task = ToDo.createToDo(tokens); } catch (IllegalArgumentException error2){ - printInput(List.of(error2.getMessage())); + printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else if (tokens[0].equals("deadline")) { try { @@ -134,7 +136,7 @@ public static void createTask(String [] tokens) { task = Deadline.createDeadline(tokens); } } catch (IllegalArgumentException error2){ - printInput(List.of(error2.getMessage())); + printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else if (tokens[0].equals("event")) { try { @@ -145,10 +147,10 @@ public static void createTask(String [] tokens) { task = Event.createEvent(tokens); } } catch (IllegalArgumentException error2){ - printInput(List.of(error2.getMessage())); + printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else { - printInput(List.of("☹ OOPS!!! I'm sorry, but I don't know what that means :-(")); + printOneLine(new DukeException("Command doesn't exist",DukeExceptionType.INVALIDCOMMAND).getMessage()); } if (task != null) { diff --git a/src/main/java/DukeException$1.class b/src/main/java/DukeException$1.class new file mode 100644 index 0000000000000000000000000000000000000000..88415ff73ef656ed3f353904b885d751b2e04ccd GIT binary patch literal 734 zcmZvaZEMp|6vzL!&6+mLwrq2=&Z*PYt@U9;K@k)ov}p}(Qdq)#u~%t&S+m8Yb06&y?ZWKyU2og zxhc#o89OrWFl;xRw?XDlEN|NARjNIZnnw+>62p5 zu#F>qK!>j0H?$pkXNBIKX?3w85uu7DER$a$`hYS;K=&Ki5i3?IaJrl6#eJ9jg)XV0APJ16Hm^W)dI?*Nvu9zz`W2QdsDMQRWaFcm`@ z4+oLJbPO}dL@^shHj12y%ttY2qhO%sUu?%kZ4j^Y%X;8;>14!BZOx4i*jX5|(YOI9LUBYwhQUuY6}` zw~|Vwcxk4|Lq7;k@_fIod5ItRYDV+A@{jrPq0n5Ltto{H`RZJTVaA|K>PR%a1MaC- zTjzPR9csQWxlrWMvL=I6iXmwtw|ySAtA|{RuxoLwGmKxOzY#Ebg|D21S~f{pzpV*yA*JURca7>aGEy|D zM;8fu-3)ejG#ZLwGF>_LboG$*PWMz{CX&H=Q(_po=D_xY15b%Ycd|-I(dCHKWub92 z+LP5s_9(_^AE&<@Eb;(D+1xo;Hva|Ir*8NS+T-1$0rbO03{isI#H~xkV T+@o)V@+6QXE7rBhNJf7H(D4Dw literal 0 HcmV?d00001 diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 0000000000..aa3658cd4f --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,30 @@ +public class DukeException extends Exception { + + protected DukeExceptionType type; + + public DukeException(String error, DukeExceptionType type){ + super(error); + this.type = type; + } + + public void printError(){ + String horizontalLine = " ____________________________________________________________"; + System.out.println(horizontalLine); + System.out.println(horizontalLine); + } + + public String getMessage() { + switch (type) { + case INVALIDCOMMAND: + return "☹ OOPS!!! I'm sorry, but I don't know what that means :-("; + case NOTINTEGER: + return "☹ Invalid input, must be an integer!!"; + case MISSINGTASK: + return "☹ No such task"; + case GENERALMISTAKE: + return super.getMessage(); + default: + return "Unknown error! Please try again."; + } + } +} diff --git a/src/main/java/DukeExceptionType.class b/src/main/java/DukeExceptionType.class new file mode 100644 index 0000000000000000000000000000000000000000..fd826bdf2fe6ad67f57a3582dac89592150d1aad GIT binary patch literal 956 zcmZuvZBNrs6n<{ktzB2xD?<TL@_ZLAuLdrg{@0yC0YE`&AJpvx9o-JztWM2 z(P;SWk20QnLttiWlk@bPd(L^Db9(>${qY;XYwU(0ET%*H0 z&v>dL$?=(r6vu593mgjyo-@o>%+pe}a&%a))k@|OL$Z1_`sf;;T5fOXb$$DD&n+@& zX5Frswox`t7$UWbWmU|wU9yg;L)kEmlTwv}cInt)P&TOJTf<^Vy_?xAbm4SH?tmek z$`+7zrS%UCTbb&abKw*^j^8d=!@lRYi`m(9d!FwN z_c`5kNhN#A5VpLw?+izMVhCh-MBQt3ZmKpXiVS~rzBhwppRdU3j`}V4jmLGSrEmKoTR6^Z>DCJ`rWg2;&}> zz_3i-BSQXYW3X?Kt`Yb`9>aaIA#p}ar%@l==1U@~CFI<91g{}a=SzGmkVOAg1n32n zTz=&Wp|4ZT*C--k9V$s#zai<7NdDMAAvY3A;0o#`!otyH;Y5U^2Zb{yocWM&qRKBS r3XJKhG~_WNRwFpZoYe@85w$MC?i6Um3lg_WtP(2;BS!j19qm literal 0 HcmV?d00001 diff --git a/src/main/java/DukeExceptionType.java b/src/main/java/DukeExceptionType.java new file mode 100644 index 0000000000..a38cb466aa --- /dev/null +++ b/src/main/java/DukeExceptionType.java @@ -0,0 +1,3 @@ +public enum DukeExceptionType { + INVALIDCOMMAND,NOTINTEGER,MISSINGTASK,GENERALMISTAKE +} diff --git a/src/main/java/InvalidCommandException.java b/src/main/java/InvalidCommandException.java deleted file mode 100644 index bac74ac50c..0000000000 --- a/src/main/java/InvalidCommandException.java +++ /dev/null @@ -1,5 +0,0 @@ -public class InvalidCommandException extends Exception { - public InvalidCommandException(String s){ - super(s); - } -} \ No newline at end of file diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 0714cf5fbce03f5bb79604bb564de59fa4457f6f..ce611c215c46217b253b1833fa6ce7c167e5d2dd 100644 GIT binary patch delta 46 zcmZ3%wt{WLB_>AU$(NZ-6~r0X86+5Z7$h0^7^E4*7#J9s85sE(7#U=MOeO|d0L}6R Ang9R* delta 46 zcmZ3%wt{WLB_>9p$(NZ-6~q|W8N?ZQ7$g|@7^E1)7#J9s85sE(7#U=MOeO|d0L^3t Al>h($ diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 7d4a03d975..9eca4762ef 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,6 +14,7 @@ public String getStatusIcon() { public String getDescription() { return description; } + public String toString() { return String.format("[%s] %s", getStatusIcon(), getDescription()); } From 4a97ec288f13eaa1322040a891738a83e80a238b Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Wed, 28 Aug 2019 02:03:01 +0800 Subject: [PATCH 18/46] Implemented simple Enums for Commands and Tasks --- data/duke.txt | 0 src/main/java/AddDeadlineCommand.class | Bin 0 -> 464 bytes src/main/java/AddDeadlineCommand.java | 14 ++++++++++++++ src/main/java/AddEventCommand.class | Bin 0 -> 449 bytes src/main/java/AddEventCommand.java | 15 +++++++++++++++ src/main/java/AddToDoCommand.class | Bin 0 -> 392 bytes src/main/java/AddToDoCommand.java | 14 ++++++++++++++ src/main/java/Command.class | Bin 0 -> 314 bytes src/main/java/Command.java | 7 +++++++ src/main/java/CommandType.class | Bin 0 -> 1090 bytes src/main/java/CommandType.java | 4 ++++ src/main/java/Deadline.class | Bin 1204 -> 1280 bytes src/main/java/Deadline.java | 2 ++ src/main/java/DeleteCommand.class | Bin 0 -> 328 bytes src/main/java/DeleteCommand.java | 13 +++++++++++++ src/main/java/DoneCommand.class | Bin 0 -> 322 bytes src/main/java/DoneCommand.java | 13 +++++++++++++ src/main/java/Duke.class | Bin 5711 -> 5821 bytes src/main/java/Duke.java | 12 +++++++++++- src/main/java/DukeException$1.class | Bin 734 -> 734 bytes src/main/java/DukeException.class | Bin 1120 -> 1120 bytes src/main/java/DukeExceptionType.class | Bin 956 -> 956 bytes src/main/java/Event.class | Bin 1192 -> 1265 bytes src/main/java/Event.java | 2 ++ src/main/java/ExitCommand.class | Bin 0 -> 389 bytes src/main/java/ExitCommand.java | 11 +++++++++++ src/main/java/ListCommand.class | Bin 0 -> 375 bytes src/main/java/ListCommand.java | 11 +++++++++++ src/main/java/NullCommand.class | Bin 0 -> 375 bytes src/main/java/NullCommand.java | 11 +++++++++++ src/main/java/Task.class | Bin 808 -> 914 bytes src/main/java/Task.java | 8 +++++++- src/main/java/TaskType.class | Bin 0 -> 818 bytes src/main/java/TaskType.java | 3 +++ src/main/java/ToDo.class | Bin 816 -> 888 bytes src/main/java/ToDo.java | 2 ++ 36 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 data/duke.txt create mode 100644 src/main/java/AddDeadlineCommand.class create mode 100755 src/main/java/AddDeadlineCommand.java create mode 100644 src/main/java/AddEventCommand.class create mode 100755 src/main/java/AddEventCommand.java create mode 100644 src/main/java/AddToDoCommand.class create mode 100755 src/main/java/AddToDoCommand.java create mode 100644 src/main/java/Command.class create mode 100755 src/main/java/Command.java create mode 100644 src/main/java/CommandType.class create mode 100644 src/main/java/CommandType.java create mode 100644 src/main/java/DeleteCommand.class create mode 100755 src/main/java/DeleteCommand.java create mode 100644 src/main/java/DoneCommand.class create mode 100755 src/main/java/DoneCommand.java create mode 100644 src/main/java/ExitCommand.class create mode 100755 src/main/java/ExitCommand.java create mode 100644 src/main/java/ListCommand.class create mode 100755 src/main/java/ListCommand.java create mode 100644 src/main/java/NullCommand.class create mode 100755 src/main/java/NullCommand.java create mode 100644 src/main/java/TaskType.class create mode 100644 src/main/java/TaskType.java diff --git a/data/duke.txt b/data/duke.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/AddDeadlineCommand.class b/src/main/java/AddDeadlineCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..b1cde021786540e0284c2497941096441fd6d370 GIT binary patch literal 464 zcmZWlT}uK%6g{)6PWzQ+seOMuWn1KHPzd501dA_9@1wKGn!Cof2K}r833})U^rNCX zn?bM)b7t*`0bJqO1jnX1Uu+6cvcT;uHR#D{C`E7&l>-FD=tpx<2e1RPMbUlp=`6$f=wr* z$J#;v>WVD1~VC3N?EiGq8vMDaD_R|xAU5^@ws)grwLsn+Pmut9kZ)gRfJ BUkU&K literal 0 HcmV?d00001 diff --git a/src/main/java/AddDeadlineCommand.java b/src/main/java/AddDeadlineCommand.java new file mode 100755 index 0000000000..e0c72a83a2 --- /dev/null +++ b/src/main/java/AddDeadlineCommand.java @@ -0,0 +1,14 @@ +public class AddDeadlineCommand extends Command { + + String task; + String date; + Deadline deadlineTask; + + public AddDeadlineCommand(String task, String date){ + this.commandType = CommandType.ADDDEADLINE; + this.task = task; + this.date = date; + } + + +} diff --git a/src/main/java/AddEventCommand.class b/src/main/java/AddEventCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..36f268640b5b7c0de7be3a085b682f70cd0aa7e3 GIT binary patch literal 449 zcmZWl%T5A85Uk-f%svDW*7xfqu12mV8WI9{+HhgRePB0aksS;!Bz~4A#KeOi;71vI zRt`qend)?Rb=Ay#eSdrcxW$X{K!!8CUPkoQ>n&{ zelm~L_>N|QOhN_`E<=_0DUW+yUC^*_AE_v5GF;R*cQ-qi1JY~H0@5pakqUc@co@!o zIh<0*=+74OQTPz)qS^|A)TBL&W2u50eKQL-4mpl29OJ~osfHqi1p|T<|E)0a^)f@Y zuC2{=?Y}&cMX}ZCbO+s@&tQ9hCiEm}V0eWkz9Ri?Bph v6Pc9jxbI-@8!{_o-K!OH?)3`!*OXr-bdV<$$dQ^!Q6{Y#=`d_lKZD8-tvOl& literal 0 HcmV?d00001 diff --git a/src/main/java/AddEventCommand.java b/src/main/java/AddEventCommand.java new file mode 100755 index 0000000000..7db3e6688c --- /dev/null +++ b/src/main/java/AddEventCommand.java @@ -0,0 +1,15 @@ +import java.io.IOException; + +public class AddEventCommand extends Command{ + + String task; + String date; + Event eventTask; + + public AddEventCommand(String task, String date){ + this.commandType = CommandType.ADDEVENT; + this.task = task; + this.date = date; + } + +} diff --git a/src/main/java/AddToDoCommand.class b/src/main/java/AddToDoCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..9f095cd80810122969b9406ac63c80379450db15 GIT binary patch literal 392 zcmZXQO-sW-5Qg7LW48I|S8DzC;H^fmCqYnz(%>oBLxcBi6H2s6B&LEtOQ8rJ`~m(b zaW?j#$g&SRGw(aI%;(qp2Y_=NS}@Qt;i79|1Dgsxfh~b;f?mqUdx9I>$tO8j$ZS5C zltq%wF9`KA_w%r-8$rl#&KZ|UmXue7UjM)4_?8=v@+c;>f+UM?mgzJuLOES<#+u~I zVisQ~D(DWQNOc_LX)3emR84naV@F`u!5;P<94H9X3C+J^f>_%KwZ58ZujBCffqRRg z?}uZ5OlSnZ3jBF{_A^fDaKvjcctILp9>WAoSWMz$!(lc!I%9>>bi6l^_X=%=ns>5- Y{!&SsOcy%SWLj*r(XPxb&S_|W1E*R|O8@`> literal 0 HcmV?d00001 diff --git a/src/main/java/AddToDoCommand.java b/src/main/java/AddToDoCommand.java new file mode 100755 index 0000000000..229d25712c --- /dev/null +++ b/src/main/java/AddToDoCommand.java @@ -0,0 +1,14 @@ +import java.io.IOException; +import java.text.Normalizer; + +public class AddToDoCommand extends Command{ + + String task; + ToDo toDoTask; + + public AddToDoCommand(String task){ + this.commandType = CommandType.ADDTODO; + this.task = task; + } + +} diff --git a/src/main/java/Command.class b/src/main/java/Command.class new file mode 100644 index 0000000000000000000000000000000000000000..e6a96379b0f2e4af3c3fe01fa54ee8df522bcecb GIT binary patch literal 314 zcmZ9H&1%9x6ot>tZ;kPEbYbXz5(kNxL_#d|trQ9c7kz*}lz0+^ zs*5>u?>XPS%>12>zW|1K@?fD=gNe3_j*CY@J<5_qrOV)Js|Ahe2Xd%DkLpxr8P(xaZ_#fU N`#aPo)Szdec?SLBIDY^D literal 0 HcmV?d00001 diff --git a/src/main/java/Command.java b/src/main/java/Command.java new file mode 100755 index 0000000000..179ee583d2 --- /dev/null +++ b/src/main/java/Command.java @@ -0,0 +1,7 @@ +public abstract class Command { + CommandType commandType; + + public CommandType getCommandType() { + return commandType; + } +} diff --git a/src/main/java/CommandType.class b/src/main/java/CommandType.class new file mode 100644 index 0000000000000000000000000000000000000000..87e10602ae2b6915d60a542cd12d54c06bcf4b8a GIT binary patch literal 1090 zcmZuvZBNrs6n^g3t#_rc^8U_vQ#Vi$6+t(Fxz=P!vwi3wHhwCjl98=5VA^)Nr5jorUbs^m=>7jm=T!cNC|w!F)MJ3V@}|{|S!U?93(ZEu3l1tD zKloV&P8n;@DpeSI=&xzzO}kjK7!!hgirSf}*xwL)cop`HtFF0Iv z+O1k}n9bZiB3BD)?Jb6p{}dN9dkhJub{Kf=PK$a+(?a37YW?!9RM!bs&}rmuwBMrT zXil@!s`_tg!kf{xxE0||$GrGp3p(<6P3!B*>qw)ZV+qST#xbE|QiLfHrbU<$Atl1B z2y>XA4PMVH+%Uwd^=3c^52Z6*PRsj8ezi^J*1Lx;)V<^5Y**RU%5HYe?yS+J7^9n) z*clhr077ynkqk;Cj}pnIL~<&T%t|D`fH5KFr%nnISj0Ur+$T0qC>|{Y`-;dpqMwN| zJfIktIr=QLp3GH!M5@|=vh)qHb0~M~BVv=u) z3sb+zq*QMShA7J z!cl|&q_d(S-9c9g(c`$W5WS8Y50P|SHAKJT@(_cLYmhWdK-#Et3U)n`MuUi9j%bVs ME(Tl0W2vqE1ExM5-H!WS^} z25wxLsDaifB(<_{b%2K?LPkb_v;aWX{@;D#YG1x1P(?q zrnE~Ep$iiQ8$}m6l$0@UV?yGxQYT#|P1(32aaF0;6qFTQSLxFdH{L${V9ZF&#!{>f zWO36&ANnQcJlsOX!#pYi*?33Gj(f;rK|r5)vgctDw>?y`Bp^lv>}q3k`}xzIhKF;= ztHgo$oe2Fq%DAgwM8Q2Q$G^nNn7zKa`)qyhMMG6CEmUjEYi#7!{<~)djF$|@f%c=B zB5goGQ-e`6sIx!uG_5lII;9^L+7My!09yDN`T>kjN!1w@V+~+)9}ZleZt{09h_js@ zzZsXz*gb?9wPDpd@_u2>D92lRzad+&<5&7%)7dEbZVS%F8&kYL`CbacBV&6?IS!GE z3N3g={%xH4$bK5s?K4Od)4V@}E*_uv_Yw2x;WPGPlGYrVEt1nJIXz(P5og=N5DyT* zI$_9?7?w?#GWmo6{va=rn-|tGGRGt*)RH@thA5c=Gu(%!W)aCOR^n7id?upWU?nL9 va(>$ShD@Y~Ep*i*gQB}0nG}Bg3wn|!!%3HPvhjdiM!Cg+ea^Fwh711yiTPUf delta 620 zcmXYtJ8u(F5QV?Hue-b6#1Am9*oh5J0=qUL0Za&l1VlxE0!xJLcqBz6goLQ5Ou-*O z`wwWSkU$DHBq9w3g1Fy>n61&B|)cuW~8k5Qnqp zs@ATusIccAzl^xdQp6RmDpW(^-`sq(@pS9iW<-Ojh$=_2FDkAqo69u=lLl5;&3>y} z*_QRaABbX5ScY9PM{*exJSw+D>bAr}oD5NM`xDm3y#1Kqc>d($it13lfa9DP4gL}$ zEj=%GvC|>W?NPjw+;zH+({-zEyytAZ&35d9;|}n$ANE9FuXif`0KNX&RqqbIbz;-A zU<$hgX)+*e%Ri*>L8vW^h$WE$WB3wF6va(R^p|N$HY=Xy#nrM@Zit^XnYbr!518Ny zH9?rcJCL%csp&qp&W}>?ho+{!s=R%Q`{GfV-HqJUB}xl!yp3hFs9cMe7aM}IeL=Iq xm3$PYDv|e+5=y<#lyj2FoaO&oTjFC{6t;w?DLfV@{{c0iP22zg diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 3cd167c29c..fc63052dce 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -7,6 +7,7 @@ public class Deadline extends Task { public Deadline(String description, String time) { super(description); this.time = time; + this.type = TaskType.DEADLINE; } public static Deadline createDeadline(String [] tokens) { @@ -32,6 +33,7 @@ public String getTime() { return this.time; } + @Override public String toString() { return String.format("[D][%s] %s(by: %s)", getStatusIcon(), getDescription(), getTime()); diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..52f2f7fe90822755464bb6843b19191d38737a8c GIT binary patch literal 328 zcmY*VO-sW-6r7i)+2*6Rjo)lOC@5aq2!-Iq;5}{ju+k(_TG5}SPy`SD0DqJ? zsXZvm&f6Jg_U+rR?~hLaL-aj3=(y;j=c0+QhFyg{g?&NOl(~Ku$VA{=nbIt;1@>Ta zcF!`ZaxLg2rqs8qVyYKuHl0)P?yA*drf*D5!m*y~r5;s9k(K%RL-v#faB-k;7~lxU z0ZwXAXbIZ?yaKgN2^xdCqrc_p%Oh`g#&Hs-F=NRe{gSrXZ?oElQ;y?sP~m2i%}MwG skBU!r0gDUhMemU44b~cssK18&y0Het5H_(zbQ$sZQ$E9OY8G~W0N%?-Uj>_}$^z z1CM^0Ye8dVtR63lsh&@==@XUczFf>_`qnto9F$h~%c96^e*T!fW(h(ZC>$m@!f}EV z2MRSoyyXCk?7zsFaLPdfjwswLSl@)@5tW#% o2agMArJs=W1KtXiw6lW0Tw4=j8$Pi{3>k^|M=`^7Y94m}0Gx0*g#Z8m literal 0 HcmV?d00001 diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java new file mode 100755 index 0000000000..d2c749f055 --- /dev/null +++ b/src/main/java/DoneCommand.java @@ -0,0 +1,13 @@ +import java.io.IOException; +import java.text.Format; + +public class DoneCommand extends Command{ + + int index; + + public DoneCommand(int index){ + this.commandType = CommandType.DONE; + this.index = index; + } + +} diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index de4fd7871ec511e14893d5c723fbf88d38887a3a..dbc3097c789177d10e12aca8bba70a61e7439549 100644 GIT binary patch literal 5821 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 N{RaCI-_!j2=10IguQ&hz literal 5711 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 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 24513dad62..660978b18e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -22,7 +22,8 @@ public static void main(String[] args) { String input = sc.nextLine(); String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { - printOneLine("Bye. Hope to see you again soon!"); + //printOneLine("Bye. Hope to see you again soon!"); + printOneLine(new ExitCommand()); break; } else if (tokens[0].equals("list")) { printNumberList(lst); @@ -86,6 +87,7 @@ public static void printInput(List start) { System.out.println(); } + //may remove soon public static void printOneLine(String input) { System.out.println(horizontalLine); System.out.println(String.format(" %s",input)); @@ -94,6 +96,14 @@ public static void printOneLine(String input) { } + public static void printOneLine(Command command) { + System.out.println(horizontalLine); + System.out.println(String.format(" %s",command)); + System.out.println(horizontalLine); + System.out.println(); + + } + public static void printNumberList(List lst) { System.out.println(horizontalLine); diff --git a/src/main/java/DukeException$1.class b/src/main/java/DukeException$1.class index 88415ff73ef656ed3f353904b885d751b2e04ccd..deb4167baa349ad0563581c85fcebf13afffb830 100644 GIT binary patch delta 13 Ucmcb|dXII(R3=8j$e!~ delta 43 ucmaFB@qlB)c4k&S20;e?$$OaNL^T;S7_@;<4+sr`(3HW9!F;kliy;8qPY5vp diff --git a/src/main/java/DukeExceptionType.class b/src/main/java/DukeExceptionType.class index fd826bdf2fe6ad67f57a3582dac89592150d1aad..aecbf370307a3ff0ae795eef62b3e460556ca825 100644 GIT binary patch delta 31 hcmdnPzK4CoQf6@`1``HG1||jt1_mIh%%B3MRRLUy1HS+O delta 31 hcmdnPzK4CoQf6^x1``HG1||jt1_mIh%%B3MRRLU}1Hb?P diff --git a/src/main/java/Event.class b/src/main/java/Event.class index 39b9c654523ed0604eaf4e1ec76d48ee3bbaf426..0ee6bee029704e8ae788328a02c50056a24ab7a0 100644 GIT binary patch delta 692 zcmXw0O-~b16g{t zam|d)eVDBdtff==u&``Y1`MNOrcD39c<~WcKV_DyR=?%xHX^~B@Zh$+TJoGW?A7%6)*O3XV22M_ z@tCnE7{+sq5P>mRCmevKF`{!Yb@x*W_=~JYW?orGh##?CB^!_?gDIo$nLKUL0@tNv zWfGxP>t+HOFJ}EfycPD_=xMYJirz-cr0^QwkP!Z=%Rkngc%ID1ImJA^=NSv(!av$n BU8Vp4 delta 622 zcmXX?O-~b16g_X|&Aj=7mTIjC1uC}aOe=y|5k=6%#DKW4i8!t_>eh{hZ8!V@Gk?Ii z!NibYqOF0*#)XOh#JF-xjCk(Y%$sxXyYJkSbMJ5ez5npX-~B@Xi?|h_glQi>&KcAL z*l2i|2~fp(xm@rN8zho81Cm-EE*i{AdP!hTU|#5#4Hn)!+0j=F+F7XXhGkrhZ~`Y4 zD%o4Bl0+zDQNf;l`Z~fjEJe7E8wzSl!MU^b;w7t7m=xBjY*)plWx3oGm=IXOYW7pD zWsj}zU7wx-1xxgqY36JrR(MNTw;97Y=|jcM&#*q`^wY%Q{K}R34Y4@T`xC;$Ke diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 2d07f99505..c29242cd25 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -7,6 +7,7 @@ public class Event extends Task { public Event(String description, String time) { super(description); this.time = time; + this.type = TaskType.EVENT; } public static Event createEvent(String [] tokens) { @@ -33,6 +34,7 @@ public String getTime() { return this.time; } + @Override public String toString() { return String.format("[E][%s] %s(at: %s)", getStatusIcon(), getDescription(), getTime()); diff --git a/src/main/java/ExitCommand.class b/src/main/java/ExitCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..b498e3fedc07855116893865a815338a09ee69a5 GIT binary patch literal 389 zcmYk2T}uK%6o%i~-S$J*kIc&IX1r4oy$y;k5~D!6QKH*Xhh@T@5nZGGR~1CiML(b) z6`fTH88|cNnfJVN&iwp-eFHehX$~$*0m|49u!o9|0}oXXhYaqe(ki)Pup7+>2B&AH zlA$zETHdeXv0RMAct*re%rIFf9WhiJ&B2p+7TuZ9QFlWx7;;0iT1@1P%H-w#i%NPX zj)k6fGI0nGzK5d_$EbxkL5+c5r?SIu&0O-t@THVIH7hP6p)_9_qw5U$9Ulg7>qvZi z8l`i3&FMehjTj1p9ZDVLCz}Q`5$ZI!OTPhFASd_~1IpU#90*&VV6AspAF$tu(?Ar9 iuqoPbXywU)Oc8D?&uC}aZN+*0FL2i=GcORcQ2YZ~K}vi8 literal 0 HcmV?d00001 diff --git a/src/main/java/ExitCommand.java b/src/main/java/ExitCommand.java new file mode 100755 index 0000000000..fa6a35773f --- /dev/null +++ b/src/main/java/ExitCommand.java @@ -0,0 +1,11 @@ +public class ExitCommand extends Command { + + public ExitCommand(){ + this.commandType = CommandType.EXIT; + } + + public String toString() { + return "Bye. Hope to see you again soon!"; + } +} + diff --git a/src/main/java/ListCommand.class b/src/main/java/ListCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..6fd5fd1e7265517c63c8ba7646f10e2548838b32 GIT binary patch literal 375 zcmYk1%}T>S6ot=CVt$(R$5^%MChpoIb}J}u3Zf9)B)Cu8v`k4Rk|qV;N(B*I_y9hX zc+&4)!hV!8LJUpljfepx+27id%x(A3PDXaW;zy zZC}Xvu}mj%9!8UdiCJVpkqfyXbo&E;8LgvH63NAAORouyAS?4}d?zY<#}}(&oTX_b zXP1@PfdSLNk%MFO9Gsv>aPQ+J$-HH`D!h4?d-GBf?43@6QD-o(PvOfm=WG5$5E7dH z4&^`C)9sU$3Fkbj&hrBbI0+`J#nr{82Att1X!s801L_-d9)Yz5l~skt%jN_Qg;RH) V@lMsPtG)g==o@6QHkm1C{Q;adMkoLP literal 0 HcmV?d00001 diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java new file mode 100755 index 0000000000..2a06390fc1 --- /dev/null +++ b/src/main/java/ListCommand.java @@ -0,0 +1,11 @@ +public class ListCommand extends Command { + + public ListCommand(){ + this.commandType = CommandType.LIST; + } + + @Override + public String toString() { + return "Hello just for fun"; + } +} diff --git a/src/main/java/NullCommand.class b/src/main/java/NullCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..ede525616d26857cb1a06d802fe26a2c53c58871 GIT binary patch literal 375 zcmYk1%}T>S6ot=iVt$(R$5^%MChpoIb}J}u3gRMU)9OBL(~>foku(u}D-}d=;RESe^E$+v(rg1s|@DVY4Y;K`Fi*e1cXMg zL-`NRZ2M$s!a0v>@ccjxoCJ&2=IUZo1Mc7xGHkj4W`~#XTMkN3M literal 0 HcmV?d00001 diff --git a/src/main/java/NullCommand.java b/src/main/java/NullCommand.java new file mode 100755 index 0000000000..dfc0f9d51e --- /dev/null +++ b/src/main/java/NullCommand.java @@ -0,0 +1,11 @@ +public class NullCommand extends Command{ + + public NullCommand(){ + this.commandType = CommandType.NULL; + } + + @Override + public String toString() { + return "Hello just for fun"; + } +} diff --git a/src/main/java/Task.class b/src/main/java/Task.class index ce611c215c46217b253b1833fa6ce7c167e5d2dd..e64c0034f977f07ca67e5527331d601069a40acb 100644 GIT binary patch delta 517 zcmZ8dyG{Z@6g{)-GQ+xnEFur(*s-Co9D#!s4XYZ~6xJ0g3RMZu zW}~KI!^R>uCF-NSrfUwaFM9&^Y3JPZW0X# zQN$d?G3y`!*RP9OG>e>ryoPNw{d3W)n`H(n4j6)|4XjM<379r=7y?Pm5mWxRC=KV? zbEyI(Q6a)F2Ak(;WVDJWd9ol|-V@A676RI)uL5HPI0;cpcgeaNr!;g6J6ddo*-pzi31IdQ)$?^%X0VzUAL5PM14zN{fl#6hK#T5lLloSXdBsc&) zEk{9&w;(h#_M7p%@vVFerk_7=9{^5q6hUGmL<^f1h6;tkmcq8gPQ<~kg;9ha_9XV} z^W*yFtp1vc1Cxl$q>VC0j3h>i%*@3&S;k6?+`<@#=3dN4D3~C*%zcCpGraC_rm0%RLx7O)QYh+-wJs_rWI@i#XSjDz+IxVn{U?qb*npssTj=sE;lvk` z<%R7;)aKjiRtsCkS^qD4(li2c9r*8%Gq-$!s%9Q3tX>h>CF0+b4sWX%G`Ux9Q7-!T VxH{)=`|Lkxs<;p-jcZNM^0;-tk&tay3ILV(&?%n1fgZDtPuvG{g7BF;)k@xl9{E_HUs}F z?ZAnm?6ZHAcwgq$lTB!=PG@JNf8*{^ZpeB&XBrFeojv*|Lt>CWE})ZCY3d_x?FW>R;}@L|4C}ge?4G){zzv5r zdph>RVcl3DZ}_1<-Dg<71$kt288Ws%4BcroCSpOFYrY`i1{}l z(goz|Zsi>5uQ$jaP)5Ky6l{>a6!nfo^3(hYsaKN4b0}xX#DOZsK{gJwR2<~ezX&JJ j=+}GF3|YIEnjvSOfz8{g)Py(Mp%wxzn{MJ^oZI>b4C;%6`8k|1_8du#AiV^ugcXsMxQprX>Gn4#*=_aBf>2}wZHru`; Td|-wCr}CzYHb+q~hsXZ_)ki@o delta 415 zcmXYsyG{aO5QV>gciCN*MJ`@gaaF(zy6c5d*=R*+Y%n2Pn%G%T_yAb=0){ux!WJ#S zNaO*05TC)Ac$pvhi!*2DKbdpp(;nEZ_n+4Za74pnjiR5E>bF#_6jSoqqvWvfbHJe% zTwGuEAJn*Ki@km(3Rxytkgg`?hEzL>N2n)ZilU$nB~wy3q?u=7roX|G4RA8XNJf~a z)^Qk3tjl|XI0~CXtWI1^>2hnR$KQ`Q(!VnAS)DO<5)W}kxC2>XOpVsWK-;-wr1vS4 zr7FBGA)69&QGR`lZ#)M>eGy6!Id>MPApw;rf?_)LhL@PpkW4$Vr1N^4%8Z7?-Le?^0 diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index e62bfd80e3..d1b99921b2 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -4,6 +4,7 @@ public class ToDo extends Task{ public ToDo(String description) { super(description); + this.type = TaskType.TODO; } public static ToDo createToDo(String [] tokens) { @@ -16,6 +17,7 @@ public static ToDo createToDo(String [] tokens) { return new ToDo(builder.toString()); } + @Override public String toString() { return String.format("[T][%s] %s", getStatusIcon(), getDescription()); } From 507c93b5d8aa203830ca3bac89d70e05b077224a Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Wed, 4 Sep 2019 04:08:30 +0800 Subject: [PATCH 19/46] Add DateTime support --- src/main/java/Deadline.class | Bin 1280 -> 1736 bytes src/main/java/Deadline.java | 14 ++++++++++++++ src/main/java/Event.class | Bin 1265 -> 1721 bytes src/main/java/Event.java | 10 ++++++++++ 4 files changed, 24 insertions(+) diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index 6a826fbc5e277e76e4e1040e48547338280a1586..29f57874dd0e83d923e956d401f61bd4a50a7ef3 100644 GIT binary patch literal 1736 zcma)7U2_^$7=8{cyMUX7l3*IOhBQsWXR)=7Dd}fIVq$^Df=y|RGYf1ZEnmXMF_+Hx zC-l;r+^Syvw)2SXJmKZ_nh~<=XpQR;pJbyJqNIWFT9vQ+yfsj zdXT^ea&*a!%U)c-hhAL4RVkU*@R5cEFTA+sM$(IEEXv7sH*RRSDTlYb)VuA*9Suuz zxGYIZk`<}Gs^Mb+#j4ay0e||5@wJht8ugt-&T3WaJBtGDvSFEddwrs_E|nAMM#-qA zx=U13uUG07>!!e5s2`?5+rgQ3sJNFT3k&#OgWoGYF-w+?M{>uOBq2#Y$2QB7H`-7C zrQOTV`TvY#)eg%tTLPm4iXspg&=s-=+|pQnugP+{Q!95;>GkXi3z6=L*;$HZFMAq~ zHw=p=n5Kn6Xr1B?%JM(n5v`Nq{uUN+HDxgbHcx{ue`&OG=2yFBy<{%_9}C?c>o-8# z&X5dQC7e-hzmbzpMHa)4s9-dkX1y#BKkZ5PK=$`=w?&9Q#9rsov3A?*CD~2GoTtoo zsa5H=m)dDRfolVhPuH#IP5*(x6t9j6-cb%dJP!7VT~4k*$nGNza`r8paFNeOqDK&s z*Z~}oU*J4|;&&ZG%|>GJV`v9(@57Z;e&()m?wf{(xKrGB9&XYhVhr;d8^Iac9fzMf zW7HbO3w5E?v!P&1hAy7LF!)2QBl25;dAZ>76D6U{2~iZbsC zxFXM$@{dSH0bLD5Y0*q*i&m5z<#6WKFhF_xFcPY8g zwTC>`B}DC5XQ7_pEL0718oZrX2;fglG4R_$eT9)%%$ShJxf}R7a;m@;`4tZ7il8w- zwS@^%-WsGq%5K?Pfl2?U`a8x7&d4DGxq?FWcCO$e8_yl%>}!x=))@RV^5H5w;R<1* IoI4Qv8_{Wwl>h($ delta 725 zcmZ8e-EI;=7(KJ>?(8mGezpZli&E55T|fjCE45N9)*o8aNR!It(vk*?#8_hD6<+uP z&Ax#*-l|E#NNi%f(D(x0^#y!`#AVi^99aVH;48(vUU~M@9sfHDo!i2sdX?Q(nVWj%&ibE}$UbhG?JXxXB=Qn$H^y z*6K6om6L5b?VW73^Rn6ASzu822NgHQa$$zCYRB2yU2|S+IQ3S8qsXz~uCq!gf?Fm+ z2y-l&xQ&vDC6wF~7E4EPhryGrzc#UqyC%xG$G~P7v~t7QZZ+Et6X%dH5y7OpBH7Uu z5!@FrBj5oZ61@#)Z`b`MO$G!16Lfz|W%tPQqwA&701T4gL7q%LokNLQ2arDwcTI^J?Ey5JnGSV{ZVZ)`z+}vTLcwa$!oA z3ra|_59RH5DB2++ET8MPl)o@*0tx|+xj^1V@zclOw;+9YS3V+RG_YkPo jWHP~OO(A1dKVw|*XG8wJ;lz`~e2%7=r0jXBNx1M2ZaQjv diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index fc63052dce..ea3019ca37 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,15 +1,29 @@ import java.lang.StringBuilder; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.LocalDateTime; public class Deadline extends Task { private String time; + private LocalDateTime dateTime; + public Deadline(String description, String time) { super(description); this.time = time; this.type = TaskType.DEADLINE; + DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); + try { + this.dateTime = LocalDateTime.parse(time, f); + } catch (DateTimeParseException e) { + } } + + + + public static Deadline createDeadline(String [] tokens) { StringBuilder description = new StringBuilder(); StringBuilder time = new StringBuilder(); diff --git a/src/main/java/Event.class b/src/main/java/Event.class index 0ee6bee029704e8ae788328a02c50056a24ab7a0..36cf24cf1757ab8fb00ac47c721271495cc829e4 100644 GIT binary patch literal 1721 zcma)6TT@$A7+pI#mvDNxG!Q8**iZ^2A!!5^Y3NNLNNtj06QL>M%pp0&wB%xP(y@=u z_$Tzy7hcto%h<6mzWG=D2OURT`y^Ow;*7cM>$lhUt@V9-|Nhr6F99sza|0uY^k0Rz{4NEn#FqMY3D;iisTa(LUI-5no3)UhOo z%d%OKO;Vb#>i9@NaY|)dz@K_zJ+tC_R%JJyb?T+c?xKLNXgPMy-5+V~OXGN|TCnz3 z+FLZ!Zj>q|=a#^9s1v1gCA>ke%he*i_NPh}JJT%h*!7&Xv&WU*tYa0PrmdPg*RiJK zuE4oM-KM|fGrQsljE1(lpr+j2MI9dt=)1PlihC#&?zAN{r`lpEU}US!dcj^TN%w{e za!qPs;%(eBaS@kvq)eodF>xOm23;)1)9Ltgeu8Uj<+6!&e4^uli7av^MlnVuTs2*_ z9#`vS%ZZ=rwQkiLcJix&U2{s+ioo!jx-T_Ldqul0-G3_Jja!b14Q!fth`fLZ3aD<7 zCL#z+tIN#ZR&sl5vaubUY=kT)!7eN?@EZC4&J(*poJaD+mTW?@`3&1kMb2tG{g?Hr zGFSeS#H!25vFieZU2-81=u!zX?>^})_q;}_)#OGplcVIR(>0co;<$S~)yM0WLwpLf z&<(1U({B3y6B^N4+IH3~o!4X<1UAotFMnaxv-X!wyHc~fFZ*NHQ)d*+p zHQo@Um5#;mBN|w>nq4Uh#Lh<2zJZ;k+b#~`_p-!!SDa?!Zb8;jALlD}qfjrk3rlMi zp1}1k$Y+yw8cpXt!8qTF5k5*Det8kx5$l`10wGI}ZIH9C;f2b6Dl&5f5s4na6Zr|= z11Ns=7+NM0jU7WjfNvjaLiv%WhIwuRJ;WX7xhwFo?IlJZ->rU}r{7`tX){EtK};e* z8!#5n2^SO{13D($-&F`5J%Uh^m}-af2gB28-gp5ce}r?XcAuWfDD#RkuLjh}OQrZd z5|My9m(WHuzj=t>Z!r{5zJsppL-Ecl(ab&uW76UfeVZ|VzwEwI#s0}}v4}kHuD`%Q ze&!J8qx>Ji{{!8&I3>shxIktjWOI>hE|JA3`Ho?l+RakEn`F2|LihNzKj7X&?i6@8 zCD$ovCp@m{nATymenJ3$Vw}Y92<;X6Ur{k3?{b^?7<-yPjrvcHULT3})e+_dOrad(Ly--JgHH9RV1{V+DTnJJEsxCqfAGRYZoW zKt$AmK?OaC@y(C}aT&Mya#*3D5eM$bxXYLKxJYnupNEgi7-JAjV_RqNrZ=@6End`0 z8}Y1JHA)-f4AO*AGR!H4P`J_EXo)Nn++2B`;5=!gq-W~eYkD=Otrf}AQmE>hsi$`I zlF85&UTKn_w!Cz3Yu3~XTT5ESN|uq7K~{M~H*;3C{&1u*oxx$2PitpTvgLZUpf4Ew zY{kMI;vKrsfe9A^xFTcHg(*zCFoS7^j{p0gtsBL4y~-0FFxcao>B21LT$o3Sf%P(o z7OV?>2=b__#NtY7b)~8roj!;t8#T)qq{KH1o>YQ z&Z}uSY#c$l%YJ%47;Jo`v=V4dqafKyy9C+oq`hkN08Aa+gH8Pm`yPZ(R@OD{qa46N z?~4-(J?(_)#C3F?Vf-S$OcAw1i1`CZ=`+0)%?JrWNQePZJrdSGAgKn#k)+fqdF6dL z-oYOb-a{64A=nebU}hJ-7?0S8^LfmxaP?MXyC*+lD$lp2+$RKLK+OJPzxsJO*e0 diff --git a/src/main/java/Event.java b/src/main/java/Event.java index c29242cd25..34522ca9a8 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,13 +1,23 @@ import java.lang.StringBuilder; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.LocalDateTime; public class Event extends Task { private String time; + private LocalDateTime dateTime; + public Event(String description, String time) { super(description); this.time = time; this.type = TaskType.EVENT; + DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); + try { + this.dateTime = LocalDateTime.parse(time, f); + } catch (DateTimeParseException e) { + } } public static Event createEvent(String [] tokens) { From bd9e3a9ca81c91b9cb96b4ce928782d855e9885a Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 9 Sep 2019 19:30:15 +0800 Subject: [PATCH 20/46] Clean up some comments --- src/main/java/Duke.class | Bin 5821 -> 5831 bytes src/main/java/Duke.java | 2 +- src/main/java/Storage$1.class | Bin 0 -> 607 bytes src/main/java/Storage.class | Bin 0 -> 3413 bytes src/main/java/Task.class | Bin 914 -> 915 bytes src/main/java/Task.java | 2 +- 6 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/main/java/Storage$1.class create mode 100644 src/main/java/Storage.class diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index dbc3097c789177d10e12aca8bba70a61e7439549..76e0308aa7ea79058d5142e850bd33ee582827e0 100644 GIT binary patch delta 273 zcmYL^y-EW?9K`=)^!Bp;qwyo=qDIfpXc27FYa5$9!O1Oh;_ZUFNUX$Gu(~48A%~5i zpcaCa4`AUF_z2>rvY29qAI!{C_q{7WejlHSsE56Kc@s=P6nDWf!s084uB#y=V;an; zVFonmOlp{hqy%Oeb2rMk_zTnSs0T wEfQ;3FF)l7K|J2QUF5uv-D1QK=#>51pxWN@UnKz>*uf^X=*9bxK(AhJe*ua*NdN!< delta 270 zcmYL^ze>Y!9K`QzP12v=*7~QmRja8Qi%4%& zEU1IvBZz}f;3J6XMr(afMf5DSLTHY>t;RtYE2esB>+d9)y0Duk|O7`fb_wrcWCA@SZUN$Q4ms(r-Q3cZF4%=wrCHD@9*IaLZgD5$I diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 660978b18e..e52b4e17fb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -119,7 +119,7 @@ public static void printNumberList(List lst) { public static void doTask(String str) throws NumberFormatException, IllegalArgumentException, IndexOutOfBoundsException { int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); - boolean isDoneBefore = task.doTask(); + boolean isDoneBefore = task.setDone(); if (isDoneBefore) { throw new IllegalArgumentException("Task has already been done"); } diff --git a/src/main/java/Storage$1.class b/src/main/java/Storage$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c8b1e11f2a84bc43322cc0cf13d3a591afe61bd2 GIT binary patch literal 607 zcmYjO%Wl&^6g`tTp4d3l(3XbsDiG2HBr1>)NFXHCxFRBP7PiWwtBEs8+!{}1JFU9u znm=I;NC+X+58$H^cdS5=Msv?O_ciy8`rR5p^m0S=(?tx95*z%sjpic zw>h>LR$IYoTtu^>IBta^KMK!|B}3()&rp9AC2<-TuNkVH?mmODt0v@J8N{jd=O4y0 z3&l7gr4bY&I-(K_ZU<_fMRG6JPA4c-CZ_W7p*Rtg?WIwo@;IFiWie9|j=R*#mwEA4 zwVqJp zewxZ`HxYR*a|U-=VKhFJQNh3$(e!}j?BMv>haMT+y*#B!>Ws^7+ zNx34uv!3^+H|YBwL(SXw{LtN^Pq64ynA_AdX+(;H2HDHR&QT=1Rr}u!arP(4@_^$!_B*o{_C!g$kQx`Hyf3UxE3alV|wv cfZhGW?jpWH}<3Dn}Fv z*&Gv?_LCtgg=bWx{HTQK$1IKuq~*j?Vat9_#R(Pje#Ee#Vo~-d{TRW0vf=0;?w8F; zfm13TD8qyJydTYYNZ?^VTJZ(hoR+6d34Bo=c}Cz%estlHGW6lgesthbKOVzZRD4z7 zaXCLLny|*udDcmz&8cHr9ca(Qbu}jQnxI_Qs9|LBn<_Xkz@J^ zy(eMz?B~2sfhyMz==PL?K$e!&Q8{0dIb{|Nm^~Ib96){_nPe=7xM?m1bz|#u+`xfHHter4ZmcTO#HkXz!Qn7l% zOwZ`HbjXM)6<5$$O4+PY0=B>jfq6PJZA_#MYbs`&X?;@qAt&beX-!pWX0RlwpoL@+ z`uKSE__FrwS#s4MGw0HALu$vM=8o!?QB+VqWLS38kWRBS?85~GwN8B3E1+QjcWbx{ zAK?zg@s~3DHGCNT8lJ_s1)kIJ9eh{A_waoUKfpx|&tr+Cf&wL| z;SydH_>qPm<0n+%$gPpq@Kao7Oh?Q?Q^QMAP8~G#@g$?Jz`O5+k+L;h!OKM4-!D9+ z;T3uKRb(_QV?{y5;M}xPh^&I=|p9b-QnRP_qp38w0yRi&HVa&j-==ySrB^U zIFtj#5?DxIEHt8n5vb$Ozg(ybw5f#y(0 z#=?_wCL8h^Iv~t?mfUWp%uS^wN0YK%Yc`qSPHm;Kxdce_(Ob(NT2~%7XBUSj?qO9V zQajs=<#K0*!yP47iE!F7l`U^HCQOGL$LI7UH}%KqLYw7g&{VK#-JZG1+YymO=@84X z2ThqJm06)YTx4l0KDHp3XP|I-R>VP*f~L~^4wcL`>vC*laaNug9y&A-2@mcajz$ND z28oEsEnF0BFX7=5j1qJ;IoA9YB-gz0q-pWAz)iHnl33dkn@`yBDHi$`nWS08Tu10n zF=^P@sYZO{iPT5UkI7@E#}g?%$y6mbuMB(63dhZqg7ugx+<2;OX2*FrWb59dWg9cx zL{_YrF{|f*?8{yr3U-%pL2-EUxV*JC(*Ai_kN7a?<*Nm7^FhFx%#lkLZKr1ihl0J% zco1IpEZtoBC`Vy<$O$xeE<@>Dg==gX?yK;0c3p*+bKh9kGQ?G=FOf;X$Jo|8Thvmp z8dcc9Umb#6m79H>3dn6AVlNNs&+QoLdd~bef9tx;9bC?tjeKqao1mfzwYVMKxC6Vf8GCs0CrGJ*>pe6IxC9~s z(Rb*NAujtU-i+a#?FTsH-NTkDDho8Aj6DD73e;o}h=x3&>no^z6B~v?p6$IJ*DkMA zrtU@Z$i3WX`^y>j%^vr|C)p1)|FwUC{k8^Apgx0*=ds1T%e#ai=eIfYdXJn}bKc<0 zecoN(I`1XQO!AX|((?`ccJPaCT|r~7FXY}H*yOO6HTW`U8g1}hCgt{CQA`mT+%ei9 zBxQ52T1=srgQE@VScB?_WmC8_rQOc6T#o;DePuLV#vHfxDRDh}~t?^yd z3&h@m>pz5rz{tO4bO;cEga4w<(wiQFshRyDjOHL?w4Q0^Ql|g#} zEgSP_>FD)1VCh`C@lT1(Vw{|WhWlvg{e148LJuCmc0QjaPAa8NbpovpNSX?&dv62TgH-q=lIcdhqsCSAircN@B!cJ*f!=S z^Y+-7hux0Yn0Ey`V=MSz2D@n6hn8?46u9&M;cE{CcK>g_HBankP5@_6!5HtvSz7-D z6X7iXM{$l8KFL@=4GYg;p8Y9YV8%X+)40f$=ZS=i{4L=H{-oE+;dvK31-jbWT8doe Y#t{---0CyzWkma!kbvJAaZs)P7Xd3ikN^Mx literal 0 HcmV?d00001 diff --git a/src/main/java/Task.class b/src/main/java/Task.class index e64c0034f977f07ca67e5527331d601069a40acb..c94c79807b9ec8eeca237eaab2e6d282e2596ef0 100644 GIT binary patch delta 21 ccmbQlKAC-kHX{dnacYT6eqQQkBgO Date: Tue, 10 Sep 2019 09:09:18 +0800 Subject: [PATCH 21/46] Implement Ui --- src/main/java/Duke.class | Bin 5831 -> 4104 bytes src/main/java/Duke.java | 129 ++++++++++---------------------------- src/main/java/Parser.java | 0 src/main/java/Ui.class | Bin 0 -> 2986 bytes src/main/java/Ui.java | 100 +++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 95 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Ui.class create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 76e0308aa7ea79058d5142e850bd33ee582827e0..7d9f5a0bd5c12533696e07a14de595137bbf277b 100644 GIT binary patch literal 4104 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 WGP*^Xs1S3B^=s@)e9!Rj>;DC$F|o)1 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index e52b4e17fb..6e5c54c245 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,50 +1,50 @@ -import java.util.Scanner; import java.util.List; import java.util.ArrayList; import java.util.Arrays; + public class Duke { + private Ui ui; public static List lst = new ArrayList<>(); - final private static String horizontalLine = " ____________________________________________________________"; - public static void main(String[] args) { - List start = new ArrayList<>(); + public Duke() { + this.ui = new Ui(); + } + + public void run() { - start.add("Hello! I'm Duke"); - start.add("What can I do for you?"); - printInput(start); + ui.printWelcomeMessage(); - Scanner sc = new Scanner(System.in); - while (sc.hasNextLine()) { + while (ui.hasInputs()) { - String input = sc.nextLine(); + String input = ui.readCommand(); String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { //printOneLine("Bye. Hope to see you again soon!"); - printOneLine(new ExitCommand()); + ui.printOneLine(new ExitCommand()); break; } else if (tokens[0].equals("list")) { - printNumberList(lst); + ui.printNumberList(lst); } else if (tokens[0].equals("done")) { try { doTask(tokens[1]); } catch (NumberFormatException error) { - printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); + ui.printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); } catch (IllegalArgumentException error2) { - printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); + ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } catch (IndexOutOfBoundsException error3) { - printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); + ui.printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); } } else if (tokens[0].equals("delete")) { try { deleteTask(tokens[1]); } catch (NumberFormatException error) { - printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); + ui.printOneLine(new DukeException("Must be integer",DukeExceptionType.NOTINTEGER).getMessage()); } catch (IndexOutOfBoundsException error3) { - printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); + ui.printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); } } else { @@ -55,68 +55,12 @@ public static void main(String[] args) { } - public static void printInput(Task input) { - System.out.println(horizontalLine); - - System.out.println(" Got it. I've added this task: "); - System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); - System.out.println(horizontalLine); - System.out.println(); - - } - - public static void printDeletion(Task input) { - System.out.println(horizontalLine); - - System.out.println(" Noted. I've removed this task: "); - System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); - System.out.println(horizontalLine); - System.out.println(); - - } - public static void printInput(List start) { - System.out.println(horizontalLine); - for (String input : start) { - System.out.println(String.format(" %s",input)); - } - - System.out.println(horizontalLine); - System.out.println(); - } - - //may remove soon - public static void printOneLine(String input) { - System.out.println(horizontalLine); - System.out.println(String.format(" %s",input)); - System.out.println(horizontalLine); - System.out.println(); - - } - - public static void printOneLine(Command command) { - System.out.println(horizontalLine); - System.out.println(String.format(" %s",command)); - System.out.println(horizontalLine); - System.out.println(); - - } - - - public static void printNumberList(List lst) { - System.out.println(horizontalLine); - System.out.println(" Here are the tasks in your list:"); - for (int i = 0; i < lst.size(); i++) { - System.out.println(String.format(" %d.%s",i+1,lst.get(i))); - } - - System.out.println(horizontalLine); - System.out.println(); + public static void main(String[] args) { + new Duke().run(); } - public static void doTask(String str) throws NumberFormatException, IllegalArgumentException, IndexOutOfBoundsException { + public void doTask(String str) throws IllegalArgumentException, IndexOutOfBoundsException { int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); boolean isDoneBefore = task.setDone(); @@ -125,63 +69,58 @@ public static void doTask(String str) throws NumberFormatException, IllegalArgum } List inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); - printInput(inst); + ui.printInput(inst); } - public static void createTask(String [] tokens) { + public void createTask(String [] tokens) { Task task = null; if (tokens[0].equals("todo")) { try { - checkValidLength(tokens); + ui.checkValidLength(tokens); task = ToDo.createToDo(tokens); } catch (IllegalArgumentException error2){ - printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); + ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else if (tokens[0].equals("deadline")) { try { - checkValidLength(tokens); + ui.checkValidLength(tokens); if (!Arrays.asList(tokens).contains("/by")) { throw new IllegalArgumentException("Missing deadline"); } else { task = Deadline.createDeadline(tokens); } } catch (IllegalArgumentException error2){ - printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); + ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else if (tokens[0].equals("event")) { try { - checkValidLength(tokens); + ui.checkValidLength(tokens); if (!Arrays.asList(tokens).contains("/at")) { throw new IllegalArgumentException("Missing deadline"); } else { task = Event.createEvent(tokens); } } catch (IllegalArgumentException error2){ - printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); + ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); } } else { - printOneLine(new DukeException("Command doesn't exist",DukeExceptionType.INVALIDCOMMAND).getMessage()); + ui.printOneLine(new DukeException("Command doesn't exist",DukeExceptionType.INVALIDCOMMAND).getMessage()); } if (task != null) { - lst.add(task); - printInput(task); + lst.add(task); + ui.printInput(task, lst); } } - public static void deleteTask(String str) throws NumberFormatException, IndexOutOfBoundsException { + public void deleteTask(String str) throws NumberFormatException, IndexOutOfBoundsException { int pos = Integer.parseInt(str)-1; Task task = lst.get(pos); lst.remove(task); - printDeletion(task); - } + ui.printDeletion(task, lst); + } - public static void checkValidLength(String[] tokens) throws IllegalArgumentException { - if (tokens.length == 1) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); - } - } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class new file mode 100644 index 0000000000000000000000000000000000000000..822d1741edeee879d9778311776b04c6da347f57 GIT binary patch literal 2986 zcmb_dOH&kA6#jY!>0xN(DZUUJkO+)|8sGRvg)zfJ2SGGZo0;p-GSf|ZdQi+eF^Ng` zsbrVR#!VK9m4L*G$vV4iv&_%1QZe7{ZiWG=Y~oaLy1DnAr-?>M9?3>NF^@fQUu8;Jx1k$%PPhq7?0u#CL*{R z!8H}HN70NoBDgNSZ$xnuhTNZwASGAQmFR_#=9Y>~1XB^15!{wr(<-tN!MtMt-`t1YW|-yS)-l zMbgYzhFfrWsAX-xWB%zAo`01W_^ikZ*R)AjeaBi+tCFsfnjSP}yt}Ee73^H?c8YaNMz8xL5ucgkl}-cG^R7c+V^_*rUFQzA9Z@|o#`urltH zg2s+(FJh9ZqUY|W#EiT!YZFb{1t%rWo3d!?WwTq#LqiO^6x4cBDHVW<84Yj3kq&tc zo#@iwVvmLb_L041|I?0R%=y5p2She&x9IVmIsI&5TBw-Sa0hpZaD2*ebxKQ*>uFoR zWjp$uT{x*>KaOaa!#yhTvZ>&d&fksy@l)}ZhPOf0w#iU>zwPR#+f7KbLO0TBk=ETQ zGq1bU)lr=?^1O7todne^_sj6)ZIN;{yn}bC0MBR0z9TW~QwAfoGYli-b<<)zp=VjR zZVm6@eH9;Q_z)jS6eM;>aMl&+0E8oQ_UuX+8t&s`4WCGQKgEL;Nc_%a!Ms2cX1n(` zARJzZe=>a$3jsPFn4_$>elLi6v%(ohSYN-r5Av5K$jmlOL^471iuQQCrj zO?x{zpu%>6eYOl>M2?~&0AJipU$V>sczv2B@N&vGXE4B#((u8EE$zgmj4w7P$7$ZY z$3En2jW4yIHz?wkD>8z#sk3rI58smQ9WR}rfd`q2m_?Esmxip@!%O7TM-3=rMoHJ| zaU4J-kc^O&tV|W`qJA{}hu+FDE9O?QI>*i7ZUGYS@w_ZiN7yD>s zs#V_V_p7{X>Gx_8*Z_0Ntojo~CKgbUh}A_GQ5nK`tWNV^x?=OFT1MH3b@XrK7kwjY zv55q1#&%jZ3Jx%q#PAMp5$1F75!Tn$%%fI5>w;%}*)M3A2*;9-u_0J$^p|!mVxxk` z*i^C=oSw(#WeCks8N8VgbkwjGZD_>_+Vj|f1nY5-yCEDRq{IIWY0FE7)JaG&LfSprr6p6`;5}{2|Gr@juW-7qf105 zmC;p_WeG!R?ba%guaT1ka0**-nrxh5Tb%XcpL}WY`x$?L@#Bntf$UIQe q65c0~ETH{Y*#Lfl*Lyd+&I;YYHW*%tFqCb~3vbf2G5k5t{rtb|TbSJd literal 0 HcmV?d00001 diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..4d48f98a27 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,100 @@ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class Ui { + + final private static String horizontalLine = " ____________________________________________________________"; + + Scanner sc = new Scanner(System.in); + + public boolean hasInputs() { + return sc.hasNextLine(); + } + + public String readCommand(){ + return sc.nextLine(); + } + + + public void printWelcomeMessage() { + List start = new ArrayList<>(); + start.add("Hello! I'm Duke"); + start.add("What can I do for you?"); + this.printInput(start); + } + + + public void printInput(Task input, List lst) { + System.out.println(horizontalLine); + + System.out.println(" Got it. I've added this task: "); + System.out.println(String.format(" %s",input)); + System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); + System.out.println(horizontalLine); + System.out.println(); + + } + + public void printDeletion(Task input, List lst) { + System.out.println(horizontalLine); + + System.out.println(" Noted. I've removed this task: "); + System.out.println(String.format(" %s",input)); + System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); + System.out.println(horizontalLine); + System.out.println(); + + } + + public void printInput(List start) { + System.out.println(horizontalLine); + for (String input : start) { + System.out.println(String.format(" %s",input)); + } + + System.out.println(horizontalLine); + System.out.println(); + } + + //may remove soon + public void printOneLine(String input) { + System.out.println(horizontalLine); + System.out.println(String.format(" %s",input)); + System.out.println(horizontalLine); + System.out.println(); + + } + + public void printOneLine(Command command) { + System.out.println(horizontalLine); + System.out.println(String.format(" %s",command)); + System.out.println(horizontalLine); + System.out.println(); + + } + + + public void printNumberList(List lst) { + System.out.println(horizontalLine); + System.out.println(" Here are the tasks in your list:"); + for (int i = 0; i < lst.size(); i++) { + System.out.println(String.format(" %d.%s",i+1, lst.get(i))); + } + + System.out.println(horizontalLine); + System.out.println(); + } + + + + + public void checkValidLength(String[] tokens) throws IllegalArgumentException { + if (tokens.length == 1) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); + } + } + + +} From 09255b2069d31046c9fdae46fa5fede5cd3eb5f5 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Wed, 11 Sep 2019 22:47:28 +0800 Subject: [PATCH 22/46] Implement Parser with Commands --- src/main/java/AddDeadlineCommand.class | Bin 464 -> 1165 bytes src/main/java/AddDeadlineCommand.java | 28 +++-- src/main/java/AddEventCommand.class | Bin 449 -> 1141 bytes src/main/java/AddEventCommand.java | 26 +++-- src/main/java/AddToDoCommand.class | Bin 392 -> 755 bytes src/main/java/AddToDoCommand.java | 19 ++-- src/main/java/Command.class | Bin 314 -> 1461 bytes src/main/java/Command.java | 25 +++++ src/main/java/DeleteCommand.class | Bin 328 -> 1456 bytes src/main/java/DeleteCommand.java | 24 ++++- src/main/java/DoneCommand.class | Bin 322 -> 2239 bytes src/main/java/DoneCommand.java | 31 +++++- src/main/java/Duke.class | Bin 4104 -> 1239 bytes src/main/java/Duke.java | 108 ++------------------ src/main/java/DukeException$1.class | Bin 734 -> 734 bytes src/main/java/DukeException.class | Bin 1120 -> 856 bytes src/main/java/DukeException.java | 6 -- src/main/java/ExitCommand.class | Bin 389 -> 491 bytes src/main/java/ExitCommand.java | 8 +- src/main/java/InvalidCommandException.class | Bin 246 -> 0 bytes src/main/java/ListCommand.class | Bin 375 -> 514 bytes src/main/java/ListCommand.java | 6 +- src/main/java/NullCommand.class | Bin 375 -> 624 bytes src/main/java/NullCommand.java | 9 +- src/main/java/Parser.class | Bin 0 -> 997 bytes src/main/java/Parser.java | 22 ++++ src/main/java/Storage$1.class | Bin 607 -> 0 bytes src/main/java/Storage.class | Bin 3413 -> 0 bytes src/main/java/Ui.class | Bin 2986 -> 3513 bytes src/main/java/Ui.java | 29 +++--- 30 files changed, 192 insertions(+), 149 deletions(-) delete mode 100644 src/main/java/InvalidCommandException.class create mode 100644 src/main/java/Parser.class delete mode 100644 src/main/java/Storage$1.class delete mode 100644 src/main/java/Storage.class diff --git a/src/main/java/AddDeadlineCommand.class b/src/main/java/AddDeadlineCommand.class index b1cde021786540e0284c2497941096441fd6d370..38d22aac9d0de1e3ed6b90afb70e199a8a465a66 100644 GIT binary patch literal 1165 zcmZuxYg5xu5Ir}oq)kJqMJ(W>fTDc>^@XBAw9ul(fFBAt=%?E>c0$v%lO_)Q6@P^~ zA|NyR-5=$+>BB-{I^AsU-aUKn*}eJm_vbGF3wR?Tf~g=vxD~{0OncrP33rhQAQ?gm zX%RC4%t{DgPDDnc_&o{t@xTi{l<)}iA|5jgIQ6P-H5rCKsJr|V&zRh*WQvY$SQUlB zi-u)5OAJ>N7sQj>4E~jRS!Wnh4NKo}YbD*@AY-Gpzv{tA zo`V;;A|fXvk5w73uq@)Wi~`me#Ey8RUCyoQrwaHIo;smUd~?4+2MlF%xm-S*Qwtk; z%1}=QN&S%4ZbW-;q;-mx-dWq``!p~Eyy;2LFny+{Z%ezn<|xVj4l#s#812M>R<|5( zc+)r1=}l|;x)AUC);m+_og~nmEP~Z+ojZDOA%2EWH%aYoptJdCG#P{~g9fHSlkOC( zhD#?IOSC7VpL=o}lXQV1boChhsr6)iygbBlTqD<`rqI)?97}zNaD>5)^z1Rh0^ZHcrhj0lpJ0qW8KZ7cLO)c6A&kVqUBBg1Dt;f$^ZZW literal 464 zcmZWlT}uK%6g{)6PWzQ+seOMuWn1KHPzd501dA_9@1wKGn!Cof2K}r833})U^rNCX zn?bM)b7t*`0bJqO1jnX1Uu+6cvcT;uHR#D{C`E7&l>-FD=tpx<2e1RPMbUlp=`6$f=wr* z$J#;v>WVD1~VC3N?EiGq8vMDaD_R|xAU5^@ws)grwLsn+Pmut9kZ)gRfJ BUkU&K diff --git a/src/main/java/AddDeadlineCommand.java b/src/main/java/AddDeadlineCommand.java index e0c72a83a2..270fd6cb05 100755 --- a/src/main/java/AddDeadlineCommand.java +++ b/src/main/java/AddDeadlineCommand.java @@ -1,14 +1,30 @@ +import java.util.Arrays; +import java.util.List; + public class AddDeadlineCommand extends Command { - String task; - String date; - Deadline deadlineTask; - public AddDeadlineCommand(String task, String date){ + String [] tokens; + + public AddDeadlineCommand(String [] tokens) { + this.tokens = tokens; this.commandType = CommandType.ADDDEADLINE; - this.task = task; - this.date = date; } + public static AddDeadlineCommand addDeadlineIfValid(String [] tokens) { + if (!Arrays.asList(tokens).contains("/by")) { + throw new IllegalArgumentException("Missing deadline"); + } else { + return new AddDeadlineCommand(tokens); + } + } + + public void execute(List lst, Ui ui) throws DukeException { + Deadline task = Deadline.createDeadline(tokens); + lst.add(task); + ui.printInput(task, lst); + } + + } diff --git a/src/main/java/AddEventCommand.class b/src/main/java/AddEventCommand.class index 36f268640b5b7c0de7be3a085b682f70cd0aa7e3..40269d47bbb0ab44b5dd7d016a50aec9bb2e15bf 100644 GIT binary patch literal 1141 zcmZuwYg5xe6g^1`Y12?jc@z}op?yP04$l5h^!F$fnV5lhBhDomJ{2AU|Y{ zr0XKUmxm-|738q4;5Akyyit(Hh5*Tvja17zHT@F0FV1xddGX?5i>?;PWV5+aZmUS! zwM!8aJyh=K-`N;(`MWY_EQ=jdhxD>GS6sl%l{&uL-P6mqn&>W!fba!ICoxcNnl>|d zyA69Kaog=2;zQTE*M|HWJ#H&;mX^+J-J6YHVRF7*bE9-6AGM$WaoeEwXi-Pod9&rv z1;*l?`gc=KlrTjPB|=Y3ppR-z)<-_cPj;AQix6p0EO`tenL2`){083<{9kF2o(b6~ z{A2@UgEaU<4beY_Q4eCng#@OOC+Laxo_mgdkbj>cv_tU97lIL8$S|b< zVH*7eGk`Ig5igE-12@U#)KvQOlVi#65Kqvzm6|_ASj79e`P2{ecM}{TiZLQLN+*nA UoD%&6cMG@46EQ*lr0Y%n0}?0#VE_OC literal 449 zcmZWl%T5A85Uk-f%svDW*7xfqu12mV8WI9{+HhgRePB0aksS;!Bz~4A#KeOi;71vI zRt`qend)?Rb=Ay#eSdrcxW$X{K!!8CUPkoQ>n&{ zelm~L_>N|QOhN_`E<=_0DUW+yUC^*_AE_v5GF;R*cQ-qi1JY~H0@5pakqUc@co@!o zIh<0*=+74OQTPz)qS^|A)TBL&W2u50eKQL-4mpl29OJ~osfHqi1p|T<|E)0a^)f@Y zuC2{=?Y}&cMX}ZCbO+s@&tQ9hCiEm}V0eWkz9Ri?Bph v6Pc9jxbI-@8!{_o-K!OH?)3`!*OXr-bdV<$$dQ^!Q6{Y#=`d_lKZD8-tvOl& diff --git a/src/main/java/AddEventCommand.java b/src/main/java/AddEventCommand.java index 7db3e6688c..a862d02712 100755 --- a/src/main/java/AddEventCommand.java +++ b/src/main/java/AddEventCommand.java @@ -1,15 +1,27 @@ -import java.io.IOException; +import java.util.Arrays; +import java.util.List; public class AddEventCommand extends Command{ - String task; - String date; - Event eventTask; + String [] tokens; - public AddEventCommand(String task, String date){ + public AddEventCommand(String [] tokens) { + this.tokens = tokens; this.commandType = CommandType.ADDEVENT; - this.task = task; - this.date = date; + } + + public static AddEventCommand addEventIfValid(String [] tokens) { + if (!Arrays.asList(tokens).contains("/at")) { + throw new IllegalArgumentException("Missing deadline"); + } else { + return new AddEventCommand(tokens); + } + } + + public void execute(List lst, Ui ui) throws DukeException { + Event task = Event.createEvent(tokens); + lst.add(task); + ui.printInput(task, lst); } } diff --git a/src/main/java/AddToDoCommand.class b/src/main/java/AddToDoCommand.class index 9f095cd80810122969b9406ac63c80379450db15..16bc1d3cc0aa3907d4566227d12fb15cae63f9a3 100644 GIT binary patch literal 755 zcmZuv+iuf95IyUJZj-p_B{ZQFD0gh9X}C&At}0axNR_PSA#Rc2$+1__Hi;cMYg9f9 zM7cfi0elo@x zhTO{#=+mTacJIB&a!R1$HzL+Q(g;S0P45gkNgq})b zLT$~Xb{*H74(+|a=w6h>zIZLu=W6>w;6|P3AR3RoFxW|((V^p^jxs77k8~I?byzSt znmV@8;@HvA#$%2rI-cSgL-l_WYGOvmu+&M0;-XxJf{`{*nZ?}?6RLslcRFsj)1_?Z zp8)At@$<6sykc4?b??W*QzAcXUMjGY1_@uyW^*ARJ?{kp!}?64Y-rv7sqmF;zGcvk zCDBi4i0Uw$B#L3f$km&lgn2^0VUhj|z-W?rN+E=ZwU{>=Sn)L~V za}+<)B~6~}8j55&*_5h;6(V9}S5e3)Y}(U|hV>cRH(WVtw!ULQ!<+3^^9%Sq(K6Aj YWbissuMx0FbTwQhPs2L-^~`Jh0qIDg761SM delta 232 zcmW-a%WA>^5Jk_#n3zXvj7D1@6me4`xD!fSM8Ty?f52rZ=)!!2+mJ7@Ac70QZU3fp zUz~(t4s&PjW&Wy%%H-$&as}QPxL7nCLYfX$S_LATwoOMc)6M=%2(x+XrIzlNyLG9p z)mrBd!TL lst, Ui ui) throws DukeException { + ToDo task = ToDo.createToDo(tokens); + lst.add(task); + ui.printInput(task, lst); + } + + } diff --git a/src/main/java/Command.class b/src/main/java/Command.class index e6a96379b0f2e4af3c3fe01fa54ee8df522bcecb..8495968d5f29fce81117ba9cbf2d084fe3cd7937 100644 GIT binary patch literal 1461 zcmZ`(Yg5xu5IwgoBuztGf{1Tu8+EPV7h2&ZzA;FS3_*3*(pu>pD zjDGhwIgXpq2?gti-0atPay8`Y>P*4z16mXv*Ww@)Wx?|SfuW^PR zZF+C3GIUQ`j^#};#B=#NLt@%B36;?-hgba7W!|jm%Qkt^4eqr?5+s*DKqc@EZulO7 z2XfjQ{hdDUdzL+}S?ivvEm~^8FU@Qie9g05XPqHgwHl7@`ArHreK2HFtLf`2>Qodu zU^Kbz@uF$A@+iNm>$YVwoXWl2z0cO2#(33hT24cavZEq~ z>o*NPYX$YmEz+?daT!N&RK{TpkRqOIx(uSpb<-wQ7`pg7?szh0Fe~E$=7_)Kukffc zhW-}Wpy~2;=bSglH%J5lWf>3gC}7tF%*&`?LBL}fPXdxORaSFLZYwrG(dkneRn!D5 z%BbTRb+h8zb_>EFL{>HwJQQGI`3*NbBHZ5thT%O-*|vE@w~Nh&ze>flP4+wnqHWnFIK2qecC@L z>TIr^veo$xz+m)ZixxxHc+HKKaBej2G`!aghdWLW1++=J%S>Mjf9vZum7-9yO09{A zdZ6fg&S*IE9qF}yUD3XGa|g=OHu{1TV_`L8NRizG30V@Mm(uCOIg(|9b}ET7OM*Ni jN$Qm1ORD%Rp;Jiw#)yE?flMZ>shh||3ZrQYiSvH}jDTSx delta 168 zcmdnWy^Bfe)W2Q(7#J8V7=*bPSQz*@8JHOa*ck-b8H6S#W>2nRl;L1!;NW3kWni0Z z%OqREq6k#L0@T0=#6UqH$pmBr)c{FOAWs%ZgXOfgGcaxhE93%_Y+yl<6gLA8kVI9w Tg@I`Uno?GvB3_^v69XRra3KxP diff --git a/src/main/java/Command.java b/src/main/java/Command.java index 179ee583d2..c51de7f540 100755 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -1,7 +1,32 @@ +import java.util.List; + public abstract class Command { CommandType commandType; public CommandType getCommandType() { return commandType; } + + public abstract void execute(List lst, Ui ui) throws DukeException; + + public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { + List validCommands = List.of("todo", "deadline", "event"); + + if (!validCommands.contains(tokens[0])) { + throw new DukeException("Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); + } + Ui.checkValidLength(tokens); + + if (tokens[0].equals("todo")) { + return new AddToDoCommand(tokens); + } else if (tokens[0].equals("deadline")) { + return AddDeadlineCommand.addDeadlineIfValid(tokens); + } else if (tokens[0].equals("event")) { + return AddEventCommand.addEventIfValid(tokens); + } else { + return new NullCommand(); + } + } } + + diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class index 52f2f7fe90822755464bb6843b19191d38737a8c..43d2741acd0f802431761899a9d3ef22759b4db1 100644 GIT binary patch literal 1456 zcmZuxZC4ss5PmKq7nbz}jM!8gNn;v7jcs1qv{=(b(QdLp6Oh!TZMrTuxDgi4ayQ5P zqJC{WjV8@GZ9n%%^>pq+4OkC{*}Jnd&ph+Y?Ed}F?|%Teg{K;3kclCSTnrqG$}DME z##Id~_>|)_jXc*lu5;Xo;${q=;|mQMZpHB>zT(KM>#EB5nqw`B+bZH46>?{cg& zj5=;z95670A+qYYj$C61XN+u(F6-^OV3;r+SCstLuJEeXZj(GywkIqpHbhfMVLYo@ zO{dPVka=Q0w_aE)P0MYpRHWy)jeOSZMXk46Ez7Ov8OAEoviFNtrw^tT4s6kpPTTD= zaB(1PUs8>kOb^VLPIJX{x-xHWJ9$MbR&g4xC4G;g=1)hhnpLa2pIf{smW>G)Qe4{)Bt&~Xp2m@(%uvHelU1bxDC0-kUDexR3$OUJm{Gr+OfQ@FkHzn-5=r5 z*3dR4hJ@?Y)=K57QK}ZU3J+-u&HqIZ*~}SmX9TMD#{*&~3r4CmL_o;M4lHtc_qnho zAxAvXYQG?%h8XuBXCISp9a?!AtO;#1!}&~a8BZ^AAbruORE*MA^-kqJgGPmmqT96^ z1b;3wSib)rG3Wt$*%j(_JVoNam#v12^i7zd?+2qltufgVI@7L_ouj*(2+Q7?-F8Rre)jDrPqpbH5?{7ULoOg^AMQ@>@)X@Mvjy@d$}uFjHCz7)%}F95Fb; z^bu080v>bJL$c4~0(Gb)8YhubB+wkOn2aGwOH GEB^wKx=R57 delta 159 zcmW-Z%?`mp6h_Z9)#-EwRsSTCHar7+?5)K{qB~{dMPy#Y+QM2ql(@CHCpYK2_j}lP zF#mj?FJQ$qA);+a=@=ShHM*Lfrhl)Ney56sVW1g0MvNVk8k$(q+?40?R<5sAb-bMX oKG@F4 lst, Ui ui) throws DukeException { + try { + Task task = lst.get(index); + lst.remove(task); + ui.printDeletion(task, lst); + } catch (IndexOutOfBoundsException error3) { + ui.printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); + } + } + + } diff --git a/src/main/java/DoneCommand.class b/src/main/java/DoneCommand.class index e352bd2de8a51436288295e1e0fcfd14eb435f2b..3122b0353d319a34beee2549c29807a0d89f8bac 100644 GIT binary patch literal 2239 zcmaJ?YgZFj6x|mBlMI6)C@4P4s8~aMV6|E?NQ)3KH6+$VE!u~}G7QOnROZs!!D;8`isIaYl}uRAW}2yCT|MMu{{QbuXEEE#J@k;rt*bVpU7FBNat=_ z>2ZqqT?I=Fv7%M64dJ`wJNj?msa(nMYU$|!!=M%&-!=KXB|{$w1$0)%tKm5ADY&oU zJ-n~s134VUF%2K$fdYEH43nWR1e1s{+ITnHwm9>S+c3mVMwIQGU*n;5e9`xWzRY#Y z7QDh;1!WB!E0VCHp$dyMm%(dTMU5og-631A^NLZQaVvg<+u=F$gv&zj{ zt37kvu81nbaK|Pk`b0RJR&f}jO~dtg))ovyL6g1E+jL?QFI2d_t(q^CviVYGA#;mi zZ|)@ziZj`Pu7jh@ySu_$`)9{Pr>n5M%1uE;ipPcQ%$7>`{v%Fei3+EEA{q82!%V?B zRq-i4BNAO_bov@bjn1rX8se@csxU#s0U58dXEM|+vY<{6MQ@lX{5^0fpo>3tsv=+Kxb9rr1Q!QljnOieC z0+eQM(5?BoY~`;R#&%0?*=tUX2bWem^LfJ*j=Q1YTe=r>j#KlSM4h#5?#|W?&*LP= z58(s@j`pd!PS;(Xdt+^2I+S%Fc*ybsP_|G9_wdykC>hp0pqMr4^`a$sTETa8>|e^S zQ)~>c{J$Svh6;VJ07ieh7-{ULIbDG?o}kr5bkPq;q_)9Qo9KFs?$n{jh&&=A^$d-J zh|s9e7)2jq7@)6F3@4E!prm*}ZzRQ7>Ir&Mk@HW`8!1mcgR*pJ8_}O~&!8?1_H9Dj zM*s6xAVU}?hOQR-FnS2PhdAQsC+=bT!tJL$$I03YMqiB>QZ$bcQlZ|3-)y3H^lR2wlHuhG8Fj{{m+nC8XVll-sgk+$UO9v*zpAWuk@TA>Dj`8 zhd7r%-3ssECMekcEgas$k%t&*n+fyECPsH&JZj}Ri7AZGzLO|YtnDnODSF@_<#7o6 zaG2g7A(2NZL!Ca`qqsogPtt0NN^q6l+@yJticq3VEYebDdlZpBaa=*1{fz_YR-h<2 uqY#`a7$F@JLm?q12+)OdB*km3*?D|LPbttB_y%8605@nIrFD+}i~j(eKrA`{ delta 167 zcmXYp%MQU%6h+r9dVAZ8w%#P7VruF!=0_w9+m3yPTwh~AVrcGn#HkpZm7TRu_9J~Td1l3>)P;f25J?vc6-{v-tuJkb6lDMa diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java index d2c749f055..32c819ddf4 100755 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/DoneCommand.java @@ -1,5 +1,4 @@ -import java.io.IOException; -import java.text.Format; +import java.util.List; public class DoneCommand extends Command{ @@ -10,4 +9,32 @@ public DoneCommand(int index){ this.index = index; } + public static DoneCommand createDoneIfValid(String [] tokens) throws DukeException { + try { + Ui.checkValidLength(tokens); + int index = Integer.parseInt(tokens[1])-1; + return new DoneCommand(index); + } catch (NumberFormatException error) { + throw new DukeException("Must be integer", DukeExceptionType.NOTINTEGER); + } + } + + + @Override + public void execute(List lst, Ui ui) throws DukeException { + try { + Task task = lst.get(index); + boolean isDoneBefore = task.setDone(); + if (isDoneBefore) { + throw new IllegalArgumentException("Task has already been done"); + } + List inst = List.of("Nice! I've marked this task as done: ", + " "+task.toString()); + ui.printInput(inst); + } catch (IndexOutOfBoundsException error3) { + ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); + } catch (IllegalArgumentException error2) { + ui.printOneLine(new DukeException(error2.getMessage(), DukeExceptionType.GENERALMISTAKE).getMessage()); + } + } } diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 7d9f5a0bd5c12533696e07a14de595137bbf277b..dd8d9dd68bc1c7b4fbe7a52643260c33838c237a 100644 GIT binary patch literal 1239 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 inst = List.of("Nice! I've marked this task as done: ", - " "+task.toString()); - ui.printInput(inst); - } - - public void createTask(String [] tokens) { - Task task = null; - if (tokens[0].equals("todo")) { - try { - ui.checkValidLength(tokens); - task = ToDo.createToDo(tokens); - } catch (IllegalArgumentException error2){ - ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); - } - } else if (tokens[0].equals("deadline")) { - try { - ui.checkValidLength(tokens); - if (!Arrays.asList(tokens).contains("/by")) { - throw new IllegalArgumentException("Missing deadline"); - } else { - task = Deadline.createDeadline(tokens); - } - } catch (IllegalArgumentException error2){ - ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); - } - } else if (tokens[0].equals("event")) { - try { - ui.checkValidLength(tokens); - if (!Arrays.asList(tokens).contains("/at")) { - throw new IllegalArgumentException("Missing deadline"); - } else { - task = Event.createEvent(tokens); - } - } catch (IllegalArgumentException error2){ - ui.printOneLine(new DukeException(error2.getMessage(),DukeExceptionType.GENERALMISTAKE).getMessage()); - } - } else { - ui.printOneLine(new DukeException("Command doesn't exist",DukeExceptionType.INVALIDCOMMAND).getMessage()); - } - - if (task != null) { - lst.add(task); - ui.printInput(task, lst); - } - } - - public void deleteTask(String str) throws NumberFormatException, IndexOutOfBoundsException { - int pos = Integer.parseInt(str)-1; - Task task = lst.get(pos); - lst.remove(task); - ui.printDeletion(task, lst); - } - - - } diff --git a/src/main/java/DukeException$1.class b/src/main/java/DukeException$1.class index deb4167baa349ad0563581c85fcebf13afffb830..be691700374acfda63ecb2c045b34908285bdcfd 100644 GIT binary patch delta 13 Ucmcb|dXII(R3=95$ycy&iI=b{66-S2Jam-2c)Opm)44P8iH@|8+3To&Og;POFaL$sy5?Zk+g?gMx j*g1VJ#d1X$LtH7PBFS8BMQg0fA4#4Q3DO`SdAa=u^hzIL delta 607 zcmbu4&rTCj6vlt|cG{T^(^9759~7ygSY~P~inWLfH>@Dhgv71s0u=+T8H9On)dBoXd%j337+oj`j=cxCg_9odKj5d;Fm>3GpliKV4yMAY{KX}>M ze*bo~voAfvgOOo&D}UJ?cAjQhw@1lNe}COj|3};4=7#nL;|05USdn8eIGGz&1=V%V zDbMN_W7UDFC_ckPt*_YQeEhs}HGe8m#Kp%GCugDNc^R_)wo7 zid!^+2r5!g66&8WkT^>~QRI)RI>B zj;o~_#a1y?JK?>2kiFRIX)n~q2H{W#$F~gr)pDffR?i~CvB%)u=y4=%ydbOb-#QNm z(oBN>uboWW<$Zwz)CC%-a~ujZkxkxeh5ThaQGctGkJAc+Gt>;l`9eqbVx_K?F><`l zvHl=~6gYCof>8>%@aVlJO)mBH$um+<1avH=4~J5alBWW7h60L24mOB4f2i~gS3fz_ delta 218 zcmaFO+{&zU>ff$?3=9kw3{qSSYz+LI3<3;-oD8fCLL3aj>@`Fo? zGV{_I8ALQReXSX67jr=jZ1sGBR+xR%Dhq=jY}o=A|$)utQms1sIJdM={#kFf*_K sAve$|K&1>kK#~*aPH7;`2&9>XST+DDMg}e*$p#kU0Ft~w9uor}0PJ2VWB>pF diff --git a/src/main/java/ExitCommand.java b/src/main/java/ExitCommand.java index fa6a35773f..b7bbe83d5d 100755 --- a/src/main/java/ExitCommand.java +++ b/src/main/java/ExitCommand.java @@ -1,11 +1,15 @@ +import java.util.List; + + public class ExitCommand extends Command { public ExitCommand(){ this.commandType = CommandType.EXIT; } - public String toString() { - return "Bye. Hope to see you again soon!"; + @Override + public void execute(List lst, Ui ui) throws DukeException { + ui.printByeMessage(); } } diff --git a/src/main/java/InvalidCommandException.class b/src/main/java/InvalidCommandException.class deleted file mode 100644 index 64a84dc02d565b7803dfbb035b9272b31daf8a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmX^0Z`VEs1_lcTUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oak4WF#UvPAuy#JqI<;F6-u zymV{LFh&Lz=lqmZMh1SL%)C^;(%hufqL9R-9H0nSaDHh~a;jSXJFh2mS+c&TwqaVpgI$aD52(J9t$oUEPAM8iDQ{#r3m)#xg5y0 z(UPIQ8$F8`(K1?fTan6j7{w~wyJPUK25s5bs+Z;*s|@aqdP;>h8M&I1uG8pNff$?3=9kw3{qSSYz+LI3<3;-oD8fCLL3aj>@`Fo? zGV{_I8ALQReX ekY)tZ%t9<1fD|JG7m#EF3vmKTULcQ&fe!%IMI{{o diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java index 2a06390fc1..e51db4d5da 100755 --- a/src/main/java/ListCommand.java +++ b/src/main/java/ListCommand.java @@ -1,3 +1,5 @@ +import java.util.List; + public class ListCommand extends Command { public ListCommand(){ @@ -5,7 +7,7 @@ public ListCommand(){ } @Override - public String toString() { - return "Hello just for fun"; + public void execute(List lst, Ui ui) throws DukeException { + ui.printNumberList(lst); } } diff --git a/src/main/java/NullCommand.class b/src/main/java/NullCommand.class index ede525616d26857cb1a06d802fe26a2c53c58871..75797fd0d49ad2f81deb5ba9eefc799e14c51f51 100644 GIT binary patch literal 624 zcmZuuU27Ua6g{IG*VT>DnASG^$ZDHbrRZy6B@na$VX`e~gg#Dmkg4k^>#ig}D?$-k zXy5yzO7BK#(>C*P=iD>*+;eB<$Ima{0K7#t0}BrxYE*#rk674i%XvvQ(nno6cQ>``6say%_vlUldDDO z@(bn0;>^3Np`3?mrWXuWPmQ$*qktqw|4LfCFBTK`9awE^8dO@A7%1n9AmrD#+3<~9fH`WmdhLgF)$H^kG> z6mv*YOwpg4q(~E+!ya+5@|f88boVQakNZ0-q}DLM6S0w|Xs5QwQ#1%0C=g0upK$RO G9sB|eG>QEH delta 218 zcmXAiK?;Ik5QX2brv7GDW@bfTK~Qbn2JIuLT_JAgTQ8f4Tt8fbD-uoSe<-pp0AWSgajc+X%>rkl_|`CjD5 zd++Zq&ezdcfvUjP(Sf6*3x~m6?V>1g!~B@JL6W*b9v3sVwlSmvnOXq>3=|~t;>89_ ljXVP)QG`TOrB6oG%MWt lst , Ui ui) throws DukeException { + throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } + + } diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..0ce098b07805e513ecb92287ccf83686ccea81e5 GIT binary patch literal 997 zcmZ{iZEw<06vzLUr&~&q4b3C+ z!zLx#HQXNAY)(HgJ{Tq2a9X9h=UPsyoY$+JcH3~wGDEWN8O_5zqwB|UY%r)hM@`Z7 ztd7&;xXE#gq&t3Tu268ufdhJa>*PZ`cOXC_02 z)t2*bXaqHCIvBxh(-np%q_+ER->@x{ip@0}@jM zqK5pu1*mimgCjykMlny7tk7)@3hiwiTlD=Y64*l$=g2dG$S=%uoKL4x)NFXHCxFRBP7PiWwtBEs8+!{}1JFU9u znm=I;NC+X+58$H^cdS5=Msv?O_ciy8`rR5p^m0S=(?tx95*z%sjpic zw>h>LR$IYoTtu^>IBta^KMK!|B}3()&rp9AC2<-TuNkVH?mmODt0v@J8N{jd=O4y0 z3&l7gr4bY&I-(K_ZU<_fMRG6JPA4c-CZ_W7p*Rtg?WIwo@;IFiWie9|j=R*#mwEA4 zwVqJp zewxZ`HxYR*a|U-=VKhFJQNh3$(e!}j?BMv>haMT+y*#B!>Ws^7+ zNx34uv!3^+H|YBwL(SXw{LtN^Pq64ynA_AdX+(;H2HDHR&QT=1Rr}u!arP(4@_^$!_B*o{_C!g$kQx`Hyf3UxE3alV|wv cfZhGW?jpWH}<3Dn}Fv z*&Gv?_LCtgg=bWx{HTQK$1IKuq~*j?Vat9_#R(Pje#Ee#Vo~-d{TRW0vf=0;?w8F; zfm13TD8qyJydTYYNZ?^VTJZ(hoR+6d34Bo=c}Cz%estlHGW6lgesthbKOVzZRD4z7 zaXCLLny|*udDcmz&8cHr9ca(Qbu}jQnxI_Qs9|LBn<_Xkz@J^ zy(eMz?B~2sfhyMz==PL?K$e!&Q8{0dIb{|Nm^~Ib96){_nPe=7xM?m1bz|#u+`xfHHter4ZmcTO#HkXz!Qn7l% zOwZ`HbjXM)6<5$$O4+PY0=B>jfq6PJZA_#MYbs`&X?;@qAt&beX-!pWX0RlwpoL@+ z`uKSE__FrwS#s4MGw0HALu$vM=8o!?QB+VqWLS38kWRBS?85~GwN8B3E1+QjcWbx{ zAK?zg@s~3DHGCNT8lJ_s1)kIJ9eh{A_waoUKfpx|&tr+Cf&wL| z;SydH_>qPm<0n+%$gPpq@Kao7Oh?Q?Q^QMAP8~G#@g$?Jz`O5+k+L;h!OKM4-!D9+ z;T3uKRb(_QV?{y5;M}xPh^&I=|p9b-QnRP_qp38w0yRi&HVa&j-==ySrB^U zIFtj#5?DxIEHt8n5vb$Ozg(ybw5f#y(0 z#=?_wCL8h^Iv~t?mfUWp%uS^wN0YK%Yc`qSPHm;Kxdce_(Ob(NT2~%7XBUSj?qO9V zQajs=<#K0*!yP47iE!F7l`U^HCQOGL$LI7UH}%KqLYw7g&{VK#-JZG1+YymO=@84X z2ThqJm06)YTx4l0KDHp3XP|I-R>VP*f~L~^4wcL`>vC*laaNug9y&A-2@mcajz$ND z28oEsEnF0BFX7=5j1qJ;IoA9YB-gz0q-pWAz)iHnl33dkn@`yBDHi$`nWS08Tu10n zF=^P@sYZO{iPT5UkI7@E#}g?%$y6mbuMB(63dhZqg7ugx+<2;OX2*FrWb59dWg9cx zL{_YrF{|f*?8{yr3U-%pL2-EUxV*JC(*Ai_kN7a?<*Nm7^FhFx%#lkLZKr1ihl0J% zco1IpEZtoBC`Vy<$O$xeE<@>Dg==gX?yK;0c3p*+bKh9kGQ?G=FOf;X$Jo|8Thvmp z8dcc9Umb#6m79H>3dn6AVlNNs&+QoLdd~bef9tx;9bC?tjeKqao1mfzwYVMKxC6Vf8GCs0CrGJ*>pe6IxC9~s z(Rb*NAujtU-i+a#?FTsH-NTkDDho8Aj6DD73e;o}h=x3&>no^z6B~v?p6$IJ*DkMA zrtU@Z$i3WX`^y>j%^vr|C)p1)|FwUC{k8^Apgx0*=ds1T%e#ai=eIfYdXJn}bKc<0 zecoN(I`1XQO!AX|((?`ccJPaCT|r~7FXY}H*yOO6HTW`U8g1}hCgt{CQA`mT+%ei9 zBxQ52T1=srgQE@VScB?_WmC8_rQOc6T#o;DePuLV#vHfxDRDh}~t?^yd z3&h@m>pz5rz{tO4bO;cEga4w<(wiQFshRyDjOHL?w4Q0^Ql|g#} zEgSP_>FD)1VCh`C@lT1(Vw{|WhWlvg{e148LJuCmc0QjaPAa8NbpovpNSX?&dv62TgH-q=lIcdhqsCSAircN@B!cJ*f!=S z^Y+-7hux0Yn0Ey`V=MSz2D@n6hn8?46u9&M;cE{CcK>g_HBankP5@_6!5HtvSz7-D z6X7iXM{$l8KFL@=4GYg;p8Y9YV8%X+)40f$=ZS=i{4L=H{-oE+;dvK31-jbWT8doe Y#t{---0CyzWkma!kbvJAaZs)P7Xd3ikN^Mx diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index 822d1741edeee879d9778311776b04c6da347f57..b236c241af7ce224c3b75d4791d300d7d8986027 100644 GIT binary patch delta 1617 zcmZuxX;WKO7=F&Z3HKyi3yqXg(Dt%61PZj20;P>~VQmlugi>1SEjh$s$fd~ziyN+W zU$0B+*4C|BJC2Nspkw{+7eD$7Vaz z0BFK>Kk_i7Vc3V`81X~F2_JGWDt9NPIi+FD4~`*@)7j|9JshT=7-ytlTtk#Y_%VSP z$GseJ4U>Ls$9)_L$)55f2}_<&bDWh(DjOZ>OG|5OnBkb^xS!*kJe%WqK>B{rkB9Iu z$0Ho`9FNMQ$2cD6ctUQUl;$Z7=Q*DCqXy4#JiBmZn6c-aKiGgXs?;6GnNG!%_Tf3v zBhqOzCKxumNLwmprPi>5U}VyqHER=QGFIDmZd^>;aVzPZS87!a&pY2J6>1}zoL`mv z!WVSBh?jIU;$IGbM{#2`T-^M!{-qrCQ-j|0>PNS#tmP@#-F_LR}p6L*jChH;89^l6Y(Tv?G>{kY3ukDpV4vD zl2}$$B!n#_cumLWa2QI~%g~ibh?wd8;yE_hh;D}9?-!Ph-rl}};^JbXJZ+3yQ&VO# zYNW*3nRrU14XU$+u84(_-eu1!}=I*U5~m} zdcOzr{gq3W8ctRxjOKxCvs0~=&F?2nz7W6*4}65T;D9_O#GsYY%0pkn zyNImov}cftEEku)4kAo;1Ge_%f7rRiyJICXope%6it7BV?JSob^C>>Ch2CgBHe)N@ zzW_V1jWn$|M9gOA3tr&V^Y#YG-VTlI?Zn=JT)Jl|WgbQe+G!U-IS$jQf+M6px~3k> zPzFgEB4rivt4XaF;9-QLhrB(kcQKft`Wi5-KBsP@rlF)jgpb zp3A7H3aNXRu}i^46n>AIkwC5I2jq>Y1P?4>%eSceafMhdiBp-(-T!0C929pLSBBvP sjqxY~IEgZxq9Gom^iLxS)2)vV@Lqn0xax_<8d7uhl`pa1{> delta 1050 zcmZuv$xake6g}0|biJ-F#vmXFDl;^*jG~OnWGh1>gDBVvD99ktpyGh@fN}K}?u>~$ z<3gfwj2JgAOpHtaLHz<^jOP_Zh+%W;)xGE3bMJlcZNk&og)e{JEdwaWeG}1WG|=Qm zGg?eIaKMdl_|)m3f-C)gku8z zialWBI07nvLg1u|40=$BSvZID z@{yh(icw+V0_No>y~TCW!X;G6NN1yd8CPVVGbdsJR}EaVa2+>PGDkjiW`*9wEep3* z%{#a&zdAehdsvhYLi*#psL~KM8kh^@&jv@v@|%N0(}CdRw5)awhlj1leIql$7f)QR zS{`ae-T7BPxLUx*@(IFyGUKgV@%xy;DVDU4f!ZgSw?p7tMMzc zUn1lcT+evcpcF1U9!e}k5pff?@%%q_Bze15otbH(Ctc;dJ0ne1j6sNv0n32(pQ_AZzkKLkMwHT$X{F}9w#p+P6W@Q0o#XCWgciH(E@$Zq+8 start) { System.out.println(); } - //may remove soon public void printOneLine(String input) { System.out.println(horizontalLine); System.out.println(String.format(" %s",input)); @@ -67,15 +65,6 @@ public void printOneLine(String input) { } - public void printOneLine(Command command) { - System.out.println(horizontalLine); - System.out.println(String.format(" %s",command)); - System.out.println(horizontalLine); - System.out.println(); - - } - - public void printNumberList(List lst) { System.out.println(horizontalLine); System.out.println(" Here are the tasks in your list:"); @@ -89,12 +78,22 @@ public void printNumberList(List lst) { + public void printByeMessage() { + this.printOneLine("Bye. Hope to see you again soon!"); + } + + public void printErrorMessage(Exception e) { + this.printOneLine(e.getMessage()); + } - public void checkValidLength(String[] tokens) throws IllegalArgumentException { - if (tokens.length == 1) { + public static void checkValidLength(String[] tokens) throws IllegalArgumentException { + List group1 = List.of("todo", "deadline", "event"); + List group2 = List.of("done", "delete"); + if (tokens.length == 1 && group1.contains(tokens[0])) { throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); + } else if (tokens.length == 1 && group2.contains(tokens[0])) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); } } - - } + From aac4f4dc7be35ed724fd338279a838e612811c92 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 12 Sep 2019 00:06:16 +0800 Subject: [PATCH 23/46] Implement TaskList --- src/main/java/AddDeadlineCommand.class | Bin 1165 -> 1128 bytes src/main/java/AddDeadlineCommand.java | 10 +++++--- src/main/java/AddEventCommand.class | Bin 1141 -> 1104 bytes src/main/java/AddEventCommand.java | 9 ++++--- src/main/java/AddToDoCommand.class | Bin 755 -> 674 bytes src/main/java/AddToDoCommand.java | 11 +++------ src/main/java/Command.class | Bin 1461 -> 1401 bytes src/main/java/Command.java | 2 +- src/main/java/DeleteCommand.class | Bin 1456 -> 1358 bytes src/main/java/DeleteCommand.java | 13 ++++------ src/main/java/DoneCommand.class | Bin 2239 -> 2184 bytes src/main/java/DoneCommand.java | 5 ++-- src/main/java/Duke.class | Bin 1239 -> 1130 bytes src/main/java/Duke.java | 10 +++----- src/main/java/ExitCommand.class | Bin 491 -> 431 bytes src/main/java/ExitCommand.java | 6 ++--- src/main/java/ListCommand.class | Bin 514 -> 448 bytes src/main/java/ListCommand.java | 8 +++--- src/main/java/NullCommand.class | Bin 624 -> 564 bytes src/main/java/NullCommand.java | 6 +---- src/main/java/TaskList.class | Bin 0 -> 874 bytes src/main/java/TaskList.java | 33 +++++++++++++++++++++++++ src/main/java/Ui.class | Bin 3513 -> 3438 bytes src/main/java/Ui.java | 16 ++++++------ 24 files changed, 76 insertions(+), 53 deletions(-) create mode 100644 src/main/java/TaskList.class create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/AddDeadlineCommand.class b/src/main/java/AddDeadlineCommand.class index 38d22aac9d0de1e3ed6b90afb70e199a8a465a66..d6242860cce8189fc13466841e58f1897ee0d8f7 100644 GIT binary patch delta 382 zcmXw#+e!jq6otQkM)+sO(K0KnwDU>L?0nG9Wk->M>aGjRE`~rQ4eBAfhJg$}D>fSzti9MD>(=}<_TRr>-+(!?7L9b9c|$&_UJZvVMAFq}QiS1z(nrJBwjIqB%Jz{*^ootLXlsaTQB zxF;eWowW(jB$>0BCuNf+C0VdpWJ#bWPj4j4HY=>U_hLb;xnCmOx^A;UMzU$M#kOR} zW|zH(h!zuT#{W}+nJ*L$OEmzce`)Fz+L5DB%9l>Dx>GD)DL44%)`{Iq{lI77!BkW0 z!|Q(No6~;$G!Rm>ZK^6A5kk;T2O2H)?sOG_=GY_J3%*=D@r2*adBPn&l?bZSu(CZW L6j9r$v_{ttWN1HO delta 398 zcmYk2*)9WN7>1v}(_}j1Z&k%!`_=_xSEjaFOC!X3IznWSMwm(*xC93>mqKg@F2I#I za1G)wCyu@+-}}D#zPz8IJ7e?X`|Tabux=8i!=QprgD$$u)ML_1B1E!+6ltBl5d9`0 z26QY_>4PRi441_blTpTW#_u lst, Ui ui) throws DukeException { + @Override + public void execute(TaskList taskList, Ui ui) throws DukeException { Deadline task = Deadline.createDeadline(tokens); - lst.add(task); - ui.printInput(task, lst); + taskList.addToList(task); + ui.printInput(task, taskList); } + + } diff --git a/src/main/java/AddEventCommand.class b/src/main/java/AddEventCommand.class index 40269d47bbb0ab44b5dd7d016a50aec9bb2e15bf..86caa40a11a4cf9d087a154b70f10a99fe6b9ae5 100644 GIT binary patch delta 404 zcmXYt+b%;<5Qe|Cw`A=utF2O0QD<6Jbyn1&t+Pf*io{)$?V>?7l=qOngxiLQxbOh3 zyo_7195R{7Kl9J|)A?`?-oIYofE0N}6TKc9>GROfzz-T!3^D95(nyq;WYi(9a2S&$ zl;Ot}NhTDNOevKUG)q#N1r{|+EK1UvWmW`s zvRIX@YSzfq9z=Q~EAVGrcjNA?T+LlwUKY!)riGv+r&(u1vZ>i(Te73sW$!UyMMT#5 znVB!$R0W=*>lUv5@!v8_v15UCR1&Dlb*Wt4DOYYyX3IbOxA3Wb=#?~>3q3}fP_-9( z^TLbINXYmd=2JEzgdj{O7OlUpvrP#EN1w1>@b1SG&-lg?@n`&X6Bo1@+x(l;YFfA9 UrQMtpqRYe^4Bu@uVz5QeHx*Yt761SM delta 442 zcmZ9I+fEZv6o$XuX)@F4v*Q~Y-(?-}ixA56v=*O@qMbXVfp`j)fjlscZfU8=in&#o`K zc5X#sRu9%TTAsVpZ0k%aLO lst, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException { Event task = Event.createEvent(tokens); - lst.add(task); - ui.printInput(task, lst); + taskList.addToList(task); + ui.printInput(task, taskList); } + + } diff --git a/src/main/java/AddToDoCommand.class b/src/main/java/AddToDoCommand.class index 16bc1d3cc0aa3907d4566227d12fb15cae63f9a3..53b2317a2af8fcaa00469070abe67b7f703cb425 100644 GIT binary patch delta 320 zcmXw!%Syvw6okLTrhoIBR(tV&ua{oZYPB1oD+L!q5QNr!u_{4Gi;duGlrG)*27(lE z;RE*NQ$H(Q2dXEr5ocPm>A$Yovl1qem5{^S2+hk_z+wb>EXi2L z3dbtPnqRq!W>l+f-`K{$b2^59mowHGq*JHm+TNhoWXO;6mecq4t*YI>HV;gz=9pUD ze=F!43S>k$3JO$c3X0G;bOj}pIW`p-*y7k$u!G7l%5JN%|Ba)G3?aMGU`YL~>ez0} zIKF5%FFjK`XAo)*gWT;ou6O8m2UMR`e?^Q*AAYiv9*0QBN@NLA#K=z}gc!ZWq$pC% z6dxfxBYdQnUoauytW?&Yz#oWWh?7qSWpNsl2-?$>Nm5=Uei}1`1f&S31C;pz3*$w^ diff --git a/src/main/java/AddToDoCommand.java b/src/main/java/AddToDoCommand.java index 0a81aa11b6..c2a5542116 100755 --- a/src/main/java/AddToDoCommand.java +++ b/src/main/java/AddToDoCommand.java @@ -1,5 +1,3 @@ -import java.util.List; - public class AddToDoCommand extends Command{ String [] tokens; @@ -10,12 +8,11 @@ public AddToDoCommand(String [] tokens) { } - - public void execute(List lst, Ui ui) throws DukeException { + @Override + public void execute(TaskList taskList, Ui ui) throws DukeException { ToDo task = ToDo.createToDo(tokens); - lst.add(task); - ui.printInput(task, lst); + taskList.addToList(task); + ui.printInput(task, taskList); } - } diff --git a/src/main/java/Command.class b/src/main/java/Command.class index 8495968d5f29fce81117ba9cbf2d084fe3cd7937..6e398c85f6cb23526c50cbc432cfd3cb268acce3 100644 GIT binary patch delta 333 zcmW-cxlRI67)H;KiFde6K#YpU!UdGY1;q`;jn#$06=r{tP9c-KO2%wGLkK}1v`=fVuD@4-jjVd9*kL4yK`eTJKc;`Yi8ng4OzUu zy1wl;op#5KYZW~!$hi+%&d5_RDN=Gjv_y8_0AFTkx^b=NFqe?ra{4?rP kB1BoC>Wp&9n99M2{zF(02?YZGs6IRjHLZX%D)tcl184LyTmS$7 delta 370 zcmYk2NlpS$6h%*wiofbpialyfY_LIWQ0y%`1QE5cMKp0#3C3VYqTmu7OBlKU7hs$? zZ~^YYWjHVz>NETTVEKBMM38I3Pl3T3y2c0wb)(sa6xr=b=y=} lst, Ui ui) throws DukeException; + public abstract void execute(TaskList taskList, Ui ui) throws DukeException; public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class index 43d2741acd0f802431761899a9d3ef22759b4db1..4d6535569106b0334c8af9a28f135a5ad1118bca 100644 GIT binary patch delta 612 zcmY+A$!-%t6h%)vP0HOaJ08HnfdmpJJ8g%VgoF@6f=$4fDHt3;A`&fRplxJZZ21P% zOBO8IuwasrK;i>f@Ckeh;+07js8m<4?!EQuzWNaRLQ0tXboVMSRtN?)Utab`Wf~9&2)p zh3~EM_*G4nYvx>2T-V&-rsfv6HS637vys_&-N<*jr)jY9c_Wgt9!9qlSU6Aoo;fY| zq|UDu2H_Sg5*Bc1+4<}2|& zJNxYVC_T)pIZ_pAWFkyRI5S90MoEg071j(hCeM^4u!*9GG!&`Ke_0NQ5aHlo@XuMt delta 740 zcmZ8fT~iWK7=F&Ode~(_z<@9kG%FB@N=p;eQnN_JO2M!XXUiRC4VDHMr)HYry32-{ z{zA8X4UIL^bnQjg{hFrtXcy+idG_7sJnzSI&iSQ&aJBdUeER`l5}PVQh$~27Q~^g) zKuSd#7gS_$k>ip|%w>)-j&UchD7cCV6)GlOxP~c?toY_c#x%!_6SG2bT_|n{a*ku3 zp~tkgjF${7&(NDQt+%h=%!cBHZGBhIv~07MDVRHUwoo#&i86z-YE~`XZZ!>t=y6r9 zu%_=k&(3tbEIBoR1&*5<7I90%Z2>0{=E!TfgC&lFhGi5P+zUp{u#Ndfy{=nZ8U}Ex z(_)JwD;ne z^bmST)dx3eg7DF+@FPZSFIbsV&Je{i)mCW@;|z6+5c7&MMTha^=oiR)@JRTHzG5=H z2d{+nR65y(?>$1r)OV;AfBz?(_zHIyfi8j{sS-+5CQ7X&h(QKvRAI+MhJs`!LTr>Q e#V8u1-5Bk1NShq~{v#8O5G~;>)jM|(o&O8tczjy` diff --git a/src/main/java/DeleteCommand.java b/src/main/java/DeleteCommand.java index 436f8eb349..eae718f730 100755 --- a/src/main/java/DeleteCommand.java +++ b/src/main/java/DeleteCommand.java @@ -1,5 +1,3 @@ -import java.util.List; - public class DeleteCommand extends Command { int index; @@ -19,15 +17,14 @@ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeExc } } - public void execute(List lst, Ui ui) throws DukeException { + @Override + public void execute(TaskList taskList, Ui ui) throws DukeException { try { - Task task = lst.get(index); - lst.remove(task); - ui.printDeletion(task, lst); + Task task = taskList.getTaskAt(index+1); + taskList.removeFromList(task); + ui.printDeletion(task, taskList); } catch (IndexOutOfBoundsException error3) { ui.printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); } } - - } diff --git a/src/main/java/DoneCommand.class b/src/main/java/DoneCommand.class index 3122b0353d319a34beee2549c29807a0d89f8bac..2a464fd4aac4577bdfc790360297c1475d0e1516 100644 GIT binary patch delta 827 zcmYk4$xl;J6vltAeQ?{y1KMhVGFT|646Wh-G6>43XhA?waimHaL@3%Os0%SBCNA8V zXJU+rTh@Xp1`>%|7w-Hs^gnPo7mYFL{mwmK&v))QU*5L=nSbT;&&`iO3r{V=9P)CQ zBVH6oH8fcqpxNRWEs9o4m^MYb;<$$nFP)sQusCTEqst;nx1z^GuZ5335B-`t6_Dm< z^N2I3dkrbhc^KB(5v?5!X!g8TjB0XBG5+G^t1^FWd@PZkkI$tu?eX!s_PPrS`CU|8 za+ZxqQ-le{Wt%HpwYjFDk}8|)+)zx~B)Dmi*PB{Q_M{dT5{pwd5vrXpMt|^@%@j$U zPut8eYct1fr_t5xjxg^myXvd&uwdZpPNg#G%)P|YU@|kCno1YuvgjdYv&3EHd~)^G zN|XC6*gRm~<{?P~_4hRcQ%`T;(P2I2_8LL&OfsXhu8e`VcA#!&KWD^z<3!v6=bQP~ zSXzIc(`bakVwfRE77}#JT}BtIalYn8s`d&Oz!X%19`f*tcb4Ej_T!SO64kMytBS}G zERd=~@};H-KgFW06*d<`-1Jf>cT;*>a_VW&dSSkcGFReEL;ZV9b23Z8P%KMfvl%pB zlfQ*;BH-U3upQVX^zKc9@PVSXoMRIeu!C|R zrY6CN$fv~+y=)cc4=NQ= zIZfK+JQoy;28)HvKyh+1UASn{%qr`V+T9>-hD&xlW-?Az;j-JC8S&m(s=RWjL%Kc!<5Oibnd& zi(PF!b2q6q)+cvJx6q11kk9TuL87|8+$Obdl*sBOD!xk?hMcvuOOMrpe4$DzAh$O9 z64x7Q9L(WMc2ror$rW@xr1~BH(Lmr8OFjf@1rEMtDZFM`PgQ%UszTjUI+N}1Fh&E* zXQ_Whb%llsE1nWcmgjLHt(+zNC-YoBiELe*(EOc}<#4b@{C-&|SWXS~)Y2gN6*6X6 zauM00FkLeKR*B*wLZ4)Y#ZQS0BQi>s7VL2waeb#*<5NEwuEVL(nhq^|r3r}={@_1S h#Dw9XQ^Z(5?``0g+_pqFxlLJquwP=2#0fbEegTE^mDB(L diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java index 32c819ddf4..ee206fffea 100755 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/DoneCommand.java @@ -21,9 +21,9 @@ public static DoneCommand createDoneIfValid(String [] tokens) throws DukeExcepti @Override - public void execute(List lst, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException { try { - Task task = lst.get(index); + Task task = taskList.getTaskAt(index+1); boolean isDoneBefore = task.setDone(); if (isDoneBefore) { throw new IllegalArgumentException("Task has already been done"); @@ -37,4 +37,5 @@ public void execute(List lst, Ui ui) throws DukeException { ui.printOneLine(new DukeException(error2.getMessage(), DukeExceptionType.GENERALMISTAKE).getMessage()); } } + } diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index dd8d9dd68bc1c7b4fbe7a52643260c33838c237a..cf36a64db3bc0e4d587a33047d5f6462802adc9b 100644 GIT binary patch delta 676 zcmYLH%Tg0T6g@o|=uD>}FMJY3qXwKrqVW*~0fQI~4n9g*xE!riY9ysqK-}gVsI2e< z#ElCqNh~R?a%+`qcYc6>;6^>2gkp2UJF|J@C z;~hY__+Vg5Ts86;&?u3$T|ha@K-Y2(nrfT$osJ~V*JS3)p+DCos6pwKR(jB_PJK@w-I@)I0} ziq1+J8&HEIqlKk~GgkfwJO6QQoPGDad)_@~XMcu%*tM^}KYj*ASadi=!XoM5 zBViLIWvaA+O9n1GWau}I0f#}Z7`SS4jUh*1*kZ(D)EpeM$U1T?VIXHQ?hrSV^9o

4FRSpE$`v(2#C=wLUd&W0UMb^x<%)Fd1@Gx%ZEk&d@2BEP0w1S~b_{)D)Q1OfhXSqq)IN&1u>!W;Ju%(%ir5Ou(nowVVrKfQlA=H`u;Jv@x=GK7L|8I zp2254NM)P*P_!Sg9R#EnpMqzF>Blb>M3TFx6z|a@*ROXCuFI~8r)>;kg?p<2SW4d9qdEGN!JPQpzAbj65JxTwg1gEtyG=J z*8Z1m@f~G|oZNJ{HVR{W42lPYvxo`CB~`QdkUt|iha~AJ9inQhF)mSOWHT%6E|J&- ztbs|3?y!^>=sEJ lst = new ArrayList<>(); + private TaskList taskList; public Duke() { this.ui = new Ui(); + this.taskList = new TaskList(); } public void run() { @@ -19,7 +15,7 @@ public void run() { try { String input = ui.readCommand(); Command command = Parser.parse(input); - command.execute(lst, this.ui); + command.execute(taskList, this.ui); if (command.getCommandType().equals(CommandType.EXIT)) { break; } diff --git a/src/main/java/ExitCommand.class b/src/main/java/ExitCommand.class index 2d74c81cfaba6a362db8e1103761347faf575eff..f92b7a65a142d3fb7912befc44d1e7e86b043c8c 100644 GIT binary patch delta 151 zcmaFOyq;O*)W2Q(7#J8V7! lst, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException { ui.printByeMessage(); } + } diff --git a/src/main/java/ListCommand.class b/src/main/java/ListCommand.class index 43fa2535cdcce7ad53d8f05478999ef400c64c28..ab1e8797fd71a4578a81870f552ee7296369d818 100644 GIT binary patch delta 165 zcmZo-Il!!P>ff$?3=9kw42oO~Yz%^&3_=XToD8fCB3ulj3}WmI;_M6(6ID!<1T}m@ z5{t8aGK)*BeL^#>HNzMgxLhleQwvHm^Yeff$?3=9kw49Z*#Yz)Gj3?dAooD8fCVq6U33=-@NlI#pp6ID!j#Wj4g z63Y_xOG`3y^e4tk=}R**a0X|l=Ovbu7Ns&W$Ro@9WEPj$_=F@DXItA@`-Em%Ylcm% zQWuutVUT5z<6)3zkYi_1;9*c?P@1@tuaK7eQ7A7NBFe8Q2*Zfg}$D^W+vr fWkqhFvv?SIfv#l%it{n>16fQA0zkGPm?Z=NkwGSL diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java index e51db4d5da..8e04ddd7af 100755 --- a/src/main/java/ListCommand.java +++ b/src/main/java/ListCommand.java @@ -1,5 +1,3 @@ -import java.util.List; - public class ListCommand extends Command { public ListCommand(){ @@ -7,7 +5,9 @@ public ListCommand(){ } @Override - public void execute(List lst, Ui ui) throws DukeException { - ui.printNumberList(lst); + public void execute(TaskList taskList, Ui ui) throws DukeException { + ui.printNumberList(taskList); } + + } diff --git a/src/main/java/NullCommand.class b/src/main/java/NullCommand.class index 75797fd0d49ad2f81deb5ba9eefc799e14c51f51..74a85f9220584d319d49e27960f8cbec67af8367 100644 GIT binary patch delta 144 zcmWlSI|{-;00k#;WwV<_jep}WQ6rirji86H^a9p4f+tyW6$`QO0G`B3Jb}0t1CN2n ze8g20&+q*K>{x0PEk&D-BA_ej1@sjIVvS%Z8A-;r*vM$LKO8S7dyefb3nzvti6JGi ouWdLp%vl&TS($t9sN%kYkSZQE>iFf_&t0M6qQbd9k=s7aADvGU=l}o! delta 202 zcmdnO@_|MF)W2Q(7#J8V7&N#TI2lAa8N?XGIT<(@B-j}wIT)lk8KfCxxENR%WZ4YMP2Yxra(mL=+!mSpDWPt20i;SA19&r2*RElOo%kVlsE$t*6h@d-&R&bGF* z_6g0j)(o52q|U9t!=T8Z#KWM>pfqudIkyTAgDQg>4+9s2`owSV1lfSLu`_T3-N4Ae j$H33PJozi5mMjm00MMB%Krt2uK_H8XK?uke2D3x}&6*_@ diff --git a/src/main/java/NullCommand.java b/src/main/java/NullCommand.java index 49e3c276af..c81c851d21 100755 --- a/src/main/java/NullCommand.java +++ b/src/main/java/NullCommand.java @@ -1,6 +1,3 @@ -import java.util.List; - - public class NullCommand extends Command{ public NullCommand(){ @@ -8,9 +5,8 @@ public NullCommand(){ } @Override - public void execute(List lst , Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException { throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } - } diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class new file mode 100644 index 0000000000000000000000000000000000000000..824667d32e86d6edb99667204750f0e0b1b7afec GIT binary patch literal 874 zcmZ`%-%HzI6g^)Wn|?9YI_K26&brMmsXywYP!VJx2xWU{ndn<;Ly2n}NK--oraf%1 zRoGzcd4JT{xy^<}yO;ajU+124Z}RK+w;urZv1elzB?}ui43so%yb$lDm{%4yYO zZNatRDdZA=@Sz?K5{0GurGMpDhe_D29>uYLE$NzqZiJn_pA6$bp*XGQpx)$=+97+h z2Vp-<4iz%4_g=w#6Saw&uZR8M?XcGh;-=r~GNb)=yBVdt+D-8SusT7KW|v)W8W%a% zr&lIaXigDHN8C!gCtf;VAs+|5=qfmlqh3lPbdB(af~faI!EQvu_#!wCMdO@|kiK2H zi-Q6d6c(r4$bo}72Ni5N*v1am7Nmn+NmNnfmH&-WD2xYm{eGwVu5}q)P-2G1;Q8Hj z--%MqJ7<*|rOGw#L*?M taskList; + + public TaskList(){ + this.taskList = new ArrayList<>(); + } + + + public void addToList(Task task) { + this.taskList.add(task); + } + + public ArrayList getList(){ + return this.taskList; + } + + public Task getTaskAt(int index){ + return this.taskList.get(index - 1); + } + + public void removeFromList(Task task) { + this.taskList.remove(task); + } + + public int getSize(){ + return this.taskList.size(); + } + + +} diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index b236c241af7ce224c3b75d4791d300d7d8986027..ae7b4d7bb921320d672d32d0e34670ef630644fc 100644 GIT binary patch delta 799 zcmY*XNlz3(6#lAbhOVh;m_>0xLlhy78V629!-%ZPu;UC0$~Mp~j^K81Tdo}98r2D;B?|t7_Uv<~Z74tdc?|;5}17H)L z2`omdj-77oLYshwb~n7(t*SjLbm-_5;ArLO@}LFX96f>%aYg9W(Z^v5SlG+a&#_NO zLLe9WIR*p9}g(8m{ZOVc;fi$xF^q=55?Da2H_%_i$f+aK;={cp&p#1r;@j z=$JO}5Ty)GJ7uOAxM{`B!9>zxa9N{P(l+o2k7;bCR4>D{1})oC%_jz)%5$z>7MYoM zwJ{%8=9Mo7z2CB(m6-rrKp|~fFE1EDPmI1m zE3F#PDBsb#jYQfB*o0>J&6wQU0f9~g(1m<-qXa#KjKf4?1_qJ0OKPjGv}N;=lj0<-8<*&#++;7{g2mg0PMjt z1#1zJ(P~8-jw_JRZiO8kM%8JAsEjTJ91)Ig8(PrA5mN}!YY_Tm#5pttCy?Mc$&r-N zub>1294P}ms346YqkoFywDD!whFVl*jHt^P;TYvO!!c&`&T^bHw9hNJfN_qC91|Rq zM(YyCWsWOGnWb>;?U!1oI~a~-27JN(*l5fM?theiA?63Ab&Lf>))Zz9;LuoRW7uQmnuBn*CQx$U}V(DcK z^Epc!lgt@WDqnS(5}M9X+Um9B zu%1EmC~mQ2EvWFL3^mw-Aj)x&FcJ=dp&AFM`kU)fesgy_{n$Y~5Ak;X!K*?*%qWv3 zHKb&N^bK|ywTp1CLh4AG&MN}8==MegR=2ngdD&j*ISL$wFR{kRn<<<26>nQ{`@!aP z7!UsHVC^~=qW}W{4_DuXe2{H8iFP=2UraY4z`G0s|JE(ph*N& zx2=WlBt)yjXcl9%j?fIZ65$Aria9mAza0uX;6Nv~A_^b6NU|Go#Fm9sNZ;X;(L#@# PbO1AHdFTx<-{G;JM~AIW diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 3b4cf8d2be..32abd1175c 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -25,23 +25,23 @@ public void printWelcomeMessage() { } - public void printInput(Task input, List lst) { + public void printInput(Task input, TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Got it. I've added this task: "); System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); + System.out.println(String.format(" Now you have %d tasks in the list.", taskList.getSize())); System.out.println(horizontalLine); System.out.println(); } - public void printDeletion(Task input, List lst) { + public void printDeletion(Task input, TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Noted. I've removed this task: "); System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.",lst.size())); + System.out.println(String.format(" Now you have %d tasks in the list.",taskList.getSize())); System.out.println(horizontalLine); System.out.println(); @@ -65,11 +65,13 @@ public void printOneLine(String input) { } - public void printNumberList(List lst) { + public void printNumberList(TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Here are the tasks in your list:"); - for (int i = 0; i < lst.size(); i++) { - System.out.println(String.format(" %d.%s",i+1, lst.get(i))); + for (int i = 0; i < taskList.getSize(); i++) { + //may run into error for our taskList index + //System.out.println(String.format(" %d.%s",i+1, lst.get(i))); + System.out.println(String.format(" %d.%s",i+1, taskList.getTaskAt(i+1))); } System.out.println(horizontalLine); From ebc91fa0e711e810b2a49b6efeb1326ca11f2994 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 12 Sep 2019 09:13:36 +0800 Subject: [PATCH 24/46] Implement Storage --- data/duke.txt | 2 + src/main/java/AddDeadlineCommand.class | Bin 1128 -> 1155 bytes src/main/java/AddDeadlineCommand.java | 3 +- src/main/java/AddEventCommand.class | Bin 1104 -> 1131 bytes src/main/java/AddEventCommand.java | 4 +- src/main/java/AddToDoCommand.class | Bin 674 -> 701 bytes src/main/java/AddToDoCommand.java | 6 +- src/main/java/Command.class | Bin 1401 -> 1432 bytes src/main/java/Command.java | 5 +- src/main/java/DeleteCommand.class | Bin 1358 -> 1397 bytes src/main/java/DeleteCommand.java | 8 ++- src/main/java/DoneCommand.class | Bin 2184 -> 2263 bytes src/main/java/DoneCommand.java | 9 ++- src/main/java/Duke.class | Bin 1130 -> 1530 bytes src/main/java/Duke.java | 13 ++-- src/main/java/DukeException$1.class | Bin 734 -> 841 bytes src/main/java/DukeException.class | Bin 856 -> 924 bytes src/main/java/DukeException.java | 4 ++ src/main/java/DukeExceptionType.class | Bin 956 -> 1067 bytes src/main/java/DukeExceptionType.java | 2 +- src/main/java/ExitCommand.class | Bin 431 -> 458 bytes src/main/java/ExitCommand.java | 4 +- src/main/java/ListCommand.class | Bin 448 -> 475 bytes src/main/java/ListCommand.java | 6 +- src/main/java/NullCommand.class | Bin 564 -> 591 bytes src/main/java/NullCommand.java | 4 +- src/main/java/Parser.class | Bin 997 -> 1682 bytes src/main/java/Parser.java | 12 ++++ src/main/java/Storage$1.class | Bin 0 -> 607 bytes src/main/java/Storage.class | Bin 0 -> 3550 bytes src/main/java/Storage.java | 91 +++++++++++++++++++++++++ src/main/java/Task.class | Bin 915 -> 1128 bytes src/main/java/Task.java | 9 +++ src/main/java/TaskList.class | Bin 874 -> 1535 bytes src/main/java/TaskList.java | 30 ++++++-- src/main/java/Ui.class | Bin 3438 -> 2801 bytes src/main/java/Ui.java | 13 +--- 37 files changed, 190 insertions(+), 35 deletions(-) create mode 100644 src/main/java/Storage$1.class create mode 100644 src/main/java/Storage.class create mode 100644 src/main/java/Storage.java diff --git a/data/duke.txt b/data/duke.txt index e69de29bb2..8a82318e20 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1,2 @@ +1 / ToDo / ✓ / borrow book +2 / Deadline / ✘ / return book / Sunday diff --git a/src/main/java/AddDeadlineCommand.class b/src/main/java/AddDeadlineCommand.class index d6242860cce8189fc13466841e58f1897ee0d8f7..2b84b83b4386dcab17ffe8b5ee77a7585458e9ff 100644 GIT binary patch delta 261 zcmWlUOELpN0EWL#hMw-}5J{B^#xq_c7;nLNC4?j%xkBvN*r~Fxast)Yuv2A`g#$Q& zBUrcsrL+6K`ZwSI?LVv5=U?XoD08LBGN}ldQWTl)(u`)7IiLA}hy_W>XHny`Bw5yO zk2Nc-YSviSY_KWWdTD)m+mf=4L@C-a43LxT8umyG`y`SB!y!k4bbRwDIW|p12_$hPhu6sL|e&i$iwrRU!z znYwUXa;4}yuDMYR9JdVpuOzQ&=0$Rv2oo}Pjr~`)Z}Q}spiIG6qFy>3URA3y6$>2M{4% zK#mCb0Aj38x>ZT_hx%5X_rKRSpvskIfJvW#DW8z(UYpU(GN&j9RG616C>Aw}CCRdO zJkqSNs##-Qv%#ih>!I_R-j-BtD9V)`Lykeou3?YZuum*GFdT9u@S>zEIX2X&+pdVk ziG3Eup;JSHrle(Pb0#@ATySZ>L@CJMCih8na~HL*Uw*}t$SBhIES`gT9v_Q%iLJ5c6E6EN?QBI~ih;-6a5ER%D|rzlVqR$Nv!E^ETN zw*H2u#HMD8ZOsn5!roK+OYO%wRVW@9Mo9~0!yy&J5f!0oIOar=EOiFLso{(;epJ=4 zrWgsMsQJ+C59)WlUZ)=!#uyjsh6YWcWjNSmK9{F^#*&;2d~|legR7Jwq9eAfiXMCW#EU=BAy{ox~x9OIia_OzjyA Ivbs!iKQGS}Bme*a delta 169 zcmWm8$qj-)0EOXy2skhfO5AtF4Ha?YqIFn-)p#a!U<=+%qyURDj<+xG^1rw9aMI8B zRRCvB3XhhDOWUJE_phF!&p0)h>S9rl8X4Jz21II0K(OtcId!l`Kh875mXENmo9$jb+J-n-OVqm5jw2>+XYy zr8X=!$y&6qCE2#vAt%XO?6NKhqzZ)tXT@1|E-viL!rzu=_bm1~kQ`bZaqNDHp@#Z% z`__(^ocKm=_3o^AbyIRKU&5YRA*=Fs`MOwsnej%2Fx-L>Yc~x+CtV1-b@wVfx>655 zdI`GE#(h43qJ}1F2~tl)KPI8kEX`zefGn-rwvAId=+pOpjBkRHP;+(lKf$n;k7(LM F|1TxSHt7HW delta 331 zcmW-c$xZ@M5Jk^xI=<%7(#EJrOq@U&6bGD8oSI1yQB=T%D-t#?kZ;gGAnn5cVCTZ6 z3%^JcLwvZYO6pW@)p-m2sMgou{R7C*R7?{0GeN>4X|ZCl8X!t)Sk@%#78`yxNh>V2 z6x-}5cG;6;6hZbC2V@n897&E9i=36GU{j>zc_Qha*_>0h zndU-LvALuwxw5&YBnZ0gcD-BZ=DVFv>#055(zIrC!>#1brcT2fh*aM-9N{w>kNtaJ zLI|JtY$n6f6wES*U|#E)x?A{JVA19n@b>Pd+Z6@95mmlAhc0Vu5c>o2V=b5f diff --git a/src/main/java/Command.java b/src/main/java/Command.java index c24282f6a8..b303a11d93 100755 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -1,3 +1,4 @@ +import java.io.IOException; import java.util.List; public abstract class Command { @@ -7,7 +8,7 @@ public CommandType getCommandType() { return commandType; } - public abstract void execute(TaskList taskList, Ui ui) throws DukeException; + public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException ; public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); @@ -15,7 +16,7 @@ public static Command createAddCommandIfValid(String[] tokens) throws DukeExcept if (!validCommands.contains(tokens[0])) { throw new DukeException("Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); } - Ui.checkValidLength(tokens); + Parser.checkValidLength(tokens); if (tokens[0].equals("todo")) { return new AddToDoCommand(tokens); diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class index 4d6535569106b0334c8af9a28f135a5ad1118bca..711bb351de92a328d01d8c2b97ed75a99d63a45f 100644 GIT binary patch delta 392 zcmWlV&u&st9E87fL4I&NSSbmuShWciZMDVPDp&zUN-O>Y+M-sfmROox4HrdX*zpYJ zZru9_?p(Ong==5Lt?}H=B=gNICi7eW)stWUzW)FUyw;@1#<;}g7{X#8OPVWO)hx3j zn-MQ0Ia0(C~=I{-Ns3KQT0D8qUxXb_~1h8QMG* zo*ACA@BdNxm2=IjfJq_q&ivA1MUELi7o@jn1yI$i(( delta 353 zcmWlVOD{uF6otQY+dA!WN*jsRqai8vtT(M{i`J{&MNu7zlH7rc#K6qVoICM9%nVG4 zfuG=Cn2K|=la;;KT7$jTuliOGUw?1!K$@DOo&Ep`1_DS1T^LdfGolzJDH&6S8JA2* zCjCqWm}W+ym{rV?av|;7=Or0G3$C1X<(y0AC5r-|-KbyQ3q(oKl(if7UH<9e#px7@ z_>yEaUnufvZ`5QU9zDmvFTihT5L$F6+B zsiw-AKo)PVug@EGr(oqgR>gjOw4`vJJs&|IUYck&p+fkbD{nch4HGoeVwz|*FNB;= p?`Y5!bkj$_v%y zi$6eFK8YGFtnvf=0pI)rU#;>%#oJirL*IM*^xe*>UMl=rnEmo+{WE|TEbH)Kp9A~R z?P%HVg8gP3^Qi%>} zK-NYvQ6*c$U#V5zorJldkk!aKkVh&z$vUtLyCGB7ceSHeWNn3=Yyo9Ck&i;UyHJWE z)Do&f8evr9r&yuhI-NSyi+VzSQKd?Lo~M{6TjzfVMVZW@$W%9x9Tt7f;9wEgs=19@BpP;;IoaKxgnT`Y?(X delta 770 zcmYk4Sx-|@6otRr+xE1Vi$Im340b?8pa>2OML`7wl|jG}XOuFCr3iJv0mLEkRd3?E zF@y&nj2NrI#2=tPz`x)V&%QY9qlxk1taHw~d+oE<&i$JAByZvK&(%*r6OS!IZ1=N+ zoqiO%G}K#cqrsw)CPmy5rdhFDvByV?pH}u-SnRW?VZTL;HbuLS4vSn4_~_JBS3sI~ zXVF8i?$xI_;-g<{2efuDpxL8ZF{sI7isMh8zfva@Cl#lhZX;SBWk_+_<_u?T&S?k} zu{qBL#YLN8E*WHXq^1(>sbq3^YQ!c=xwB++=3llMA))W1He-z2OmO9ytHX>k>GZg& zYOj(s$Zbod(zEHA;pyH)dOS5Uo8x85N6KcJYl<10S<*Jwx#29i8Ur_V$6F+A=9sj( zO~P4ol{*z?{OyG4F`RjK)V#x8=cW6*_nz*t=)CY$8V{W>o_EG0XVKdi49QFkS&~E0 zl(RS%+~j=oMkAYr3*Z)1fCQ7gDW6o<8UI?tO$*^ISeE2{?vnLkxWGGywt}pfxYbX$0 zq4+)78A>vgE))Dqi>7RajsHHpk>1cioT5K_zc_NCeYT1}D3&B8;;>YFmPz)IWDbj? z&>VF#hz5xlmq9cO-7DvQF*+dfQ3 inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); ui.printInput(inst); + + } catch (IndexOutOfBoundsException error3) { ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); } catch (IllegalArgumentException error2) { diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index cf36a64db3bc0e4d587a33047d5f6462802adc9b..bddac7ade854ff09accb3a301910fdc68d0abca3 100644 GIT binary patch literal 1530 zcmZuxTT@e46#h;KIppL30&>&Zsv?UM`9@nzlD+G~A#?fuVxfBg;M8ukr*fCU|k24Yx9Vj5W; zR|fF8fqs0U^e=T>RmwF3NnBT!8wPT?sS=hHSytqhfv>P);5JqjSxaIa8wSbOI=<17 zS21^Vd}}a&K@nTWriNJPXo%a}PENx>ApCvX@dFKpU2My=>we&Rq9QdU?LteWHF49a zJHfJszVys})>w7Rj2O0^y1X0KcBNMoyH#3@^@EaZ1ddzxb=+mR7uGcl76MV)-xQ4~ zO2-x})PzINMEbG4Cw>!FRn#k1A@H1fC8tg>3U26?FRr#KY z3%E#ZI(V4)4&N(J!Nf;6ucK&U8~05-z$Ft8v18&99_#qQ#Em2vRZO$a#Q+#YtxbkPEbPr8j321dJFj0&E;k|=12s`y63rG7mTUiA-b2xzPOvy{62s_ zzHTl*rI^~vh;wfvkER|7?VnJ4!hb{~zmYkHmU)HP&N2Fq5U1F`GnzPteuM!k$(_uf z7-+&!>=>ydn3T+y7<|EO4WE*pL4wpk94QRLWFLdbVhGo%U8X0&GbfQ|G#9mf{_pIx zkG?ys7H?vx#fG0F*OE@zvoA5SIj0V5Sw`oY82baKn;3tN#34ox-~4MU*K8A0hi_iL zVC4~9#S$jke3BN`UzR-qqtG!%&p45qAVQPKV2bhlMTyuF&SIIJZ&1z?xePOsi0j$g vI%ZSR7;z4erg09RwTHM&u0Tw^!Zh(a)5O^mRMbBUB5x4&w^5jKOsuiO6D`qw(=Pw01``Sb6WZ@@IqHK#}_CN(a}AaSM? zS2QPjLCU7n7BUvDYOayhT<3;`T#%dG(gL>?cNBU1W?FGqOP{2L8AZXtZB!lnrS+=# zfx5R>+i%DBe@qSgUN?3e!Y}IHX07b)u6Y~V6~(<))G4ftGA6|Js$rNBp{)t6RNbo^ zPIJaE%a~z~qTxOd6!V6MEGQls7I|!V!jfXy@RX9F%u35~^AoE)6B!GQTE#GK+efy% zH(qwz+j*5;-Po#Z)?2&o$Or8!I@!3K1=+^6SVpoRLWNGA7d{ z{GP!sLv02+#5za6O16~l5^Hvjz8{F-D0w+gq;I2=v0`!3q^C9en-1w~O&@>uj( z?j1gqRxJFe)#=vSovz2KVU2aeFe8Qy%7#t0df)lXw)P#xu3}HIPr0A7K5G`HdUjEX z>dk8XIyx0?o;1$?GzjG^BWGGcR`+VdXOuv4OzeXpY0&D2cBMGL9*}&-@#~K`=dq?l z12^_3-2S~?XjizRL4qc?+)3Ju%L+GMlx9MDh`I6PTX7{@F}1E$NUEX5&eQ MCCQX*OG^^?zY0k$R{#J2 delta 260 zcmY+7J5mBs5Jk@n18-({$S9)xKO%zsLWbih)o`W7$yAP*tg^)C~>8-TGGZU+}n+txJw;agY4@RwsFy!lC>K#EJY9CZrli diff --git a/src/main/java/DukeException.class b/src/main/java/DukeException.class index e4a565f9c0db4b9b28fe0bac6d611488ccf947e8..72a5ae1f8274d8854f1e1c72cb12dd70f8b4de83 100644 GIT binary patch delta 407 zcmYjM%}N4M7(H_x=iV77vs+g7J6e{`m>GiTMhK!_pce>Ah(Z_DGTgTdw>?3$xJ4zj z@Bw;)cD+e-W@yoc@BcgBIrqzXkloLpj|qS__B>2s#f6Vm7g?-%SVy2xR46HI#KTR6 zvci_awnRmuDiPkdzw;WAj~r%v)UYE__pyt{sAk<(=doZRcX)nz7W4<#L2q!=KP?v7 zIzG9&_}>~mS(Bkp3c!LLA7dt%Ys}Kmv5Huy7&Bosh85P{AfA);JbgA9IY>jogCc~~ zf55xs5ODN@RQL+<4!izHOeaAD4r7@%tk6ZYI;}}->9o;~(b9xtD5G7YJ)<**BY~K; zL?#MCgTkAbMvJmL6x`)>pZo_XV38XxWJ3sHi}(kH1ipl2Mw=3|1cIV1#gs3negW6Z BE*1a) delta 315 zcmW-bJx;?w6ofyo?d;l^#2CU)ejpGC#(_vsAk%Otdc+x!TTVb_5CVxJ2jB$hxCvr5 zE6v-dnKznwv8zt~^Y^_3YOYc?7$l?&6Ea3AV-6ihj)~*gizkk$<+Sd^fm~H{FyeRJ!ea^Xx_}|Xx> zSjxl(HWl~^7bnf)xS%V-`kn@o@Sn{ck|@)_w57NBeSWo?6AVBN!w)2!6Q+STKJBLsdB7a zG!<`Hv=nbz1d6vzwx7;V$6sCTU|QwdE<5aM_(yl6{P_MNFK#byu7?jr?$Tl4GE2|J zr{U66&{7c4CfBpN_!$@(1b{py20;Lso)U)u delta 113 zcmX@byq;O*)W2Q(7#J8V7!WOFg_0!?LMU}WF} LVtyc-i9rAWAc+ps diff --git a/src/main/java/ExitCommand.java b/src/main/java/ExitCommand.java index a1a802e48f..0928265bc0 100755 --- a/src/main/java/ExitCommand.java +++ b/src/main/java/ExitCommand.java @@ -1,3 +1,5 @@ +import java.io.IOException; + public class ExitCommand extends Command { public ExitCommand(){ @@ -5,7 +7,7 @@ public ExitCommand(){ } @Override - public void execute(TaskList taskList, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { ui.printByeMessage(); } diff --git a/src/main/java/ListCommand.class b/src/main/java/ListCommand.class index ab1e8797fd71a4578a81870f552ee7296369d818..ba9e8cddaba051a79a4fddc24af619d8c7e4ccd4 100644 GIT binary patch delta 132 zcmX@We4AP2)W2Q(7#J8V7?imf*cgO38H5=`I2l+OM7bEm7{u8bB-j}wC#r<9NU<|W zPpncGmf>NLWsu`xkY|u%XHei_P-IY=xJ8RwI4iL%Q9m3 delta 115 zcmcc3e1KWy)W2Q(7#J8V7!|w< diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java index 8e04ddd7af..0e0a5ca18c 100755 --- a/src/main/java/ListCommand.java +++ b/src/main/java/ListCommand.java @@ -1,3 +1,5 @@ +import java.io.IOException; + public class ListCommand extends Command { public ListCommand(){ @@ -5,9 +7,7 @@ public ListCommand(){ } @Override - public void execute(TaskList taskList, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { ui.printNumberList(taskList); } - - } diff --git a/src/main/java/NullCommand.class b/src/main/java/NullCommand.class index 74a85f9220584d319d49e27960f8cbec67af8367..8d3214628b97c54864b0df3d1b4da8f77c858525 100644 GIT binary patch delta 177 zcmX|*I}QO+07cJZc;3uJ{Qv)dH;D$dC^QsSFhM~u3Pf!O6I)R!EI^~P3tJFV>Fznr zxi{^lS76SQS@wI)jt(9Yqr=#0N%46sQ>@~ delta 149 zcmX@lvV}$e)W2Q(7#J8V7}U5JI2nXF8AKRFIT<(@#Ml|cIT$2386+8`xENR%q}dr{ z*coIe>IYA3Rp*xDVUTA~;9*c?P?)&gTv>^SL772?hk=Vhm63tluQVseIX^cyF)xLY pfgQ@4tj>6ilNo3b3j;R;>tr@2BcL?`K$}?@7{OQ&$Yx>?0suEn7BK(- diff --git a/src/main/java/NullCommand.java b/src/main/java/NullCommand.java index c81c851d21..3316f4eede 100755 --- a/src/main/java/NullCommand.java +++ b/src/main/java/NullCommand.java @@ -1,3 +1,5 @@ +import java.io.IOException; + public class NullCommand extends Command{ public NullCommand(){ @@ -5,7 +7,7 @@ public NullCommand(){ } @Override - public void execute(TaskList taskList, Ui ui) throws DukeException { + public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class index 0ce098b07805e513ecb92287ccf83686ccea81e5..e3516d3a512ae78db481a86da835f6d397601214 100644 GIT binary patch literal 1682 zcma)7T~`xV6x}xonPD;*9V8$YIfl!5A*cxTs(T zvohWn^9K^<6r=_Ip@d5c2F3Ct1()%$jCloD@QH#luFAM3QC+Un3JEl5Is$Fq;}Y(us9=+mg#wZsMom88_n?147qm1y2Tt9`K*qPQY8bezU{7elpwpO+z$D#pd7MEa3jKxV1bug>q$QprX-p^QwA51!JVxd@ z(p&qG_5>s!LW2Y;5tNA_dHMiq^gPsiKDI|-c8^#S(Y_@pv>t#&3N#wWA>%BmxJdXs zGPnj6D;UBWvUraoGf4f7aS2meHcNp*cmn6>VjaYJ6lg7K{EbMGG;{5^c0$t*Fl=ZU zZRh|e*Gex_zvA3%qN`DSxr2Q0ZoR0LXNc@Acgd)8QQ2{A(K1ZKY#54UL;HR8E delta 339 zcmWlT%PvDv6o$WjdfBJDr$KKxloq9`b-z>BNKBeAG1oc+i6CtU^%(5OFf=nTm3R+h zFCb!_o$R&Nzy5!%^}nRPb@S`*{R7zM)G)-POVLnb%4IstGn%p?9`V`#@G|QTm=YA`@sxW8$cJSD{eYo#x)->zZR|P*!MxlzD4UbK>6p_|b;K}73 zd#P%bU5`EX74e(kF6afChQ|Sinj?>6PK3C)?sS8WEjbz6aVqvxmET^ShRTc2LGd0w z2Zh{`n6*FAd@d)wxFF;w$TKX8to387!Yx|+F^`wSzZw2F!2vhwkeYU diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 2a09fd0c12..3a84bdd37b 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,3 +1,5 @@ +import java.util.List; + public class Parser { public static Command parse(String input) throws DukeException, IllegalArgumentException { String[] tokens = input.split(" "); @@ -13,6 +15,16 @@ public static Command parse(String input) throws DukeException, IllegalArgumentE return Command.createAddCommandIfValid(tokens); } } + + public static void checkValidLength(String[] tokens) throws IllegalArgumentException { + List group1 = List.of("todo", "deadline", "event"); + List group2 = List.of("done", "delete"); + if (tokens.length == 1 && group1.contains(tokens[0])) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); + } else if (tokens.length == 1 && group2.contains(tokens[0])) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); + } + } } diff --git a/src/main/java/Storage$1.class b/src/main/java/Storage$1.class new file mode 100644 index 0000000000000000000000000000000000000000..23e295207c0f32600f0be3a57fadbabbcc3c793c GIT binary patch literal 607 zcmYjOU279T6g`t{cCzcnu5Gokezh9Yqy>wDC@6w7TMQ<~Ab~hDY z{5w9YAR^Kq;ExjTEYS$V+;h(TntSKh?;n={o@39(4QyDbqiGSksp%%iElqCg>kh|V zjxC0@R`5P9qS;WKw?dJhh9Ax)L*=;7P=6UEaT*t|7^XJeU# zVw{lD2nrFMQi%n(12xYgc^GS_6BH^FQ~BsbTnNhc(kM}RoKAa;+75QmVc68!`-w=W`@Rb1(d;mm$;8Vtl{x6@uwAqntVOfdV`|(_ zQ<)tkBF|;c;4UkS#wRi=82BQZ9)C|J9vVpWGh&q!e&{18!q8%FyC?V4F6p) aNCbthVvVdprGV?DvW|OX?ee_@-1;A3{dLp; literal 0 HcmV?d00001 diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class new file mode 100644 index 0000000000000000000000000000000000000000..de9730dec5a1e2b39df7e09daa191b89051bb324 GIT binary patch literal 3550 zcmbVOYgAlU75?tL&M@2rm;hn&oKR?ZlVD0yplK5b76U_cNGPQ>y_vazf#F^{_X43t zQ=_eIwOUQpqOsL#r6xYo*bGT%lla!UmcR8^*XmFI_*Y#`;&<-MBtw|xa>;O>d!K#2 z^XE!z^4Q7E+vSeikFoW43 z5j`!Je@5U$0M+7hct*(44vhNo zylh{PW?qyPd$qDxix>R(vPAq9ftLinD)2Q0YM)`~sqUm^S-Pdbb1ae66|C)_&}OyP zgxT85ai;>moIj}9;|hWqSyD5`TBCLq;02dyj&Oy4B+P!!+D&#%Z{uKVj&R znW>|CYDhaOxAG)SEv{gFU43TZjGaif?oFk%`Tm4u)AX9Ct;Hq>wCU`E!2aVgecDc# zh9&T_f}&_*%+Tza6pd{yY^AGzNV6t8_t09YIjg7UQVCm++Ga`{Qd z1>u6y+ZN^7N{^YTDb1Et4ViK$1se*{kU=5v4S~}N0#S1&71QM^x*?0EMe?qoIHFtj zfG%mWRP4hmDjvpOs^z;y3c6M7!9xnxIf9iZP*8SfHX75Uqve`!s`wVZt>RTIsQ4s4 zrQ$pIu7b_^wj-w9Yt9()+g#HRJu{Pf-nh7*jtd{th@aVTM#cB=nl%49LnPnSuq2xs ze;+?k@dkcKmrIUR{0MKV_%Rj*-cs=soKmfjCmCES(pd0gNeVA1@a~`04cm{)Dz4xa1@3Tb zSj95lRq-CqN-SoNsp6_+!2RKw(<-h>Zua52f`&uJq+!k(VViivaoyHqwjO^d95tti zgMlATSmC*pX^gd~_!VALAZ`a$sY8L2B!fpMxKIXaCgN&#=KRI{>Kn|XG{c+Y#XfST zQJ<=#t22t6+_9fYLc*_;!C01!yjt+}qc`KQcJfJ9sG4L)87NbeMg01=6B`qQvZ%QIlbyGKX;m zGc@Os=eYX}S)7DW6P-)gv2k7Er2&>N2@p&-pc+=M`noSbZ_m;N8h_k8Z_M3Fnep>8g3l)~C2eMru@_)|?Xt z@N4{rtSXF68IEjZS5bH^PHB^Rw`s&QdpKc_vuD|wVe_UwP}jFQF8-I9>^-~E-(KfR z%o3BBqCZ0tLN2Lth_a}j_<#3ajjte@O1Za_xOZ*rjU`Qs;Jns!GC|L8FAz`l1@pzv z6d--_8|2fUn$eP^P+0VoDYKxEodQ@Hmg>;n=z(0A3;b4IGk;J}b0-}W#;iH1XFrV@ z*Y#>Krt-YNpSXL!X->{eD|j^@dv;OgetSeS;z`}A$!K=229h_kVxbJ_0_ypMRRsyXruNuqoK`-}SJKkETvOZ(RKGOXc+VDP!wl;RlQlogVf&ICinE zY*>QQ(0CE9hGn=%8kgX?2=CjJDA>lETd#3Sb70vO9)=$W`4Aw z6>AAfZhJ2`14=m?L^)q#8(D|Bc>^lZjP=y4;-f2sN2s+4?i(l<@Co>$1Sh2O86;h%{eDrGf>#!OnUG*HP8s zxqwi}lg5TLHnyDQD&Scbg~iRXk>vrFBTXUCC2W$Kn`O1-61H9;ets&qEn@I)X~=UO z)oI-0Xw_u3>I-Srrg5*MwLPolUc5C*dh4XaGR#e21N&R)sxY6R+j!c0_-L)g2swQm z+Y#q@40V_wmnk%1j(naZ_ov9|i=2CjyuOS!zE*beg>fI=L_6NX{d^g;G4*!y2%Wgh zC-!@I&|yCW-wl)rtP>dgNb+8_x%S`SzssTCLvnJ&ALJb0Kdc!!ibdM}g!+%hV0{`5 z15KW`h^yVhC}}*$X~#`&Z2#+X>{ol-r=Di}@U{>39A~?;ImlBtFQCTV?pef^=3t96 ztnkQTNprB(8T!2Ko(fOKPds4ePe%PFmM)ef%h)l}q^r%dDmqQIo{rDaJ Xh~G2I<~U!@2tQ7(d8huIQ-A(H!Ypwi literal 0 HcmV?d00001 diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..482f262f68 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,91 @@ +import java.io.*; +import java.util.Scanner; +import java.util.ArrayList; + +public class Storage{ + + private File file; + private String filePath; + + Storage(String filePath){ + this.filePath = filePath; + this.file = new File(filePath); + } + + ArrayList load() throws DukeException, IOException { + ArrayList taskList = new ArrayList<>(); + try { + Scanner sc = new Scanner(file); + while (sc.hasNext()) { + String line = sc.nextLine(); + taskList.add(formatFileToTask(line)); + } + return taskList; + } catch (FileNotFoundException e) { + throw new DukeException("Load failed", DukeExceptionType.FILENOTFOUND); + } + } + + + void overwriteStorage(ArrayList taskList) throws IOException{ + FileWriter fw = new FileWriter(this.file); + for (Task task: taskList){ + switch (task.getType()) { + case TODO: + fw.write(Task.getTaskID(task) + " / " + + "ToDo" + " / " + + task.getStatusIcon() + " / " + + task.getDescription() + + System.lineSeparator()); + break; + case DEADLINE: + fw.write(Task.getTaskID(task) + " / " + + "Deadline" + " / " + + task.getStatusIcon() + " / " + + task.getDescription() + " / " + + ((Deadline) task).getTime() + + System.lineSeparator()); + break; + case EVENT: + fw.write(Task.getTaskID(task) + " / " + + "Event" + " / " + + task.getStatusIcon() + " / " + + task.getDescription() + " / " + + ((Event) task).getTime() + + System.lineSeparator()); + break; + default: + } + } + fw.close(); + } + + + private Task formatFileToTask(String line) throws DukeException{ + String[] tokens = line.split(" / "); + switch(tokens[1]){ + case "ToDo": + ToDo toDoTask = new ToDo(tokens[3]); + if (tokens[2].equals("\u2713")){ + toDoTask.setDone(); + } + return toDoTask; + case "Deadline": + Deadline deadlineTask = new Deadline(tokens[3], tokens[4]); + if (tokens[2].equals("\u2713")){ + deadlineTask.setDone(); + } + return deadlineTask; + case "Event": + Event eventTask = new Event(tokens[3], tokens[4]); + if (tokens[2].equals("\u2713")){ + eventTask.setDone(); + } + return eventTask; + default: + throw new DukeException("Unknown task detected? Something is wrong.", DukeExceptionType.TASKNOTFOUND); + } + } + + +} \ No newline at end of file diff --git a/src/main/java/Task.class b/src/main/java/Task.class index c94c79807b9ec8eeca237eaab2e6d282e2596ef0..1041abec50f86a4fc11525272cad71a7164666eb 100644 GIT binary patch delta 599 zcmYjN$xZ@65PdzM(+mwN3JACWE^LaTs30yeF+>uM#=8eJ#v|PM0uN-)`UM``;=zL- z;7@qkhLE~>qI~f ze)Fa{s^pShJ~nbP_HrWIG5T~pql7>dv&5KPGLp?Wxe%+g;-$+6eE>i81m?7h$~>cB z9LvAK`@}>*myJ7QkjP1iG5g*~rbkK$i*%VV)QQP^3cZVC`!*usku5?l-B&D6?w=B; zvV>))=FF4oj%Hn8+eIjL4YF2$bJBbvdJM=5mGYNNS3kLHHcg@nyTlVcq Y^4cz6pz`ksJPs?|H46|DIg$qQe<~e8?EnA( delta 405 zcmZ8cyH3ME5S;TF?qXdGaX7$$6PtG&aCkHnG&HH;Gx!loy6Ap^hAssaMMTY)@D+&J z2+0VYG`rfFo!R@c!Q6g+zb^pX;5vcDK?e?p0!ISJ7AF>`79)c?;b1IqmS7L(2F+|b zoxMD(Ntmc61eIrfTsU-*I;>&cp@%Fi)VP~t$Dt6o#8uGIV-r{OvCP$oWr1BRJIl&7 z)>SC6xhDOeTjO8tg-&PGAj#0rd2;3Y&Kye=PF zriWef29din{F;(mMaJP@$LPPKr)co&_@qa^bhxow?{Otb8HxzD}lo^zh3KYo4r24DtHV@M*W;aUt4Q>RNdJ4LVo94cm+w<)0+=Aghrz=%*mzT073Zwd^`OL6dmNGuOACn!BOwc-8V2 zor+bc1m`M?$x>LA?DzB~n$8sd;ujVLKUBkbtmN#u>(;U@7RH5vz)Z-k8tBGd1!tSw zuz?PoF>nrD2JT@&!+iq}uxMZj%e*3iG4K!z1|Fec;4!iWo}kF5^QVJ?4j*^htZd{~ z);6tm3J+S@POh+0H`y0JK~Y`@-&=TrC(81fSCkt*9KzBq_pNJtRz1|)^w#rYQ)~ea@CIATnBni_&mS;j{{RA37Dg>J59Pl}WI#xsLi|ip<_*ZMt{_;uq-OdrJ zi(I;KfxT4%4e~!k69QH#?i8N*^`E#1#I*XszOer=cO$sOQG|?!ek7!2zgn)L?K||- zwE}#(&bh#LBEC;*$T>DY@BspFl6T~UkHh3Wf;gM@vf(I8N$Dqgl?EMGkPdashon*s zq-tpYpE(&ioTam44WJpu0;NNo#hf+)t-<)n^+|swxEsSbNAYEZRODXTLyd9u_3461 Lre0-A1QWjjl8Pe^ literal 874 zcmZ`%-%HzI6g^)Wn|?9YI_K26&brMmsXywYP!VJx2xWU{ndn<;Ly2n}NK--oraf%1 zRoGzcd4JT{xy^<}yO;ajU+124Z}RK+w;urZv1elzB?}ui43so%yb$lDm{%4yYO zZNatRDdZA=@Sz?K5{0GurGMpDhe_D29>uYLE$NzqZiJn_pA6$bp*XGQpx)$=+97+h z2Vp-<4iz%4_g=w#6Saw&uZR8M?XcGh;-=r~GNb)=yBVdt+D-8SusT7KW|v)W8W%a% zr&lIaXigDHN8C!gCtf;VAs+|5=qfmlqh3lPbdB(af~faI!EQvu_#!wCMdO@|kiK2H zi-Q6d6c(r4$bo}72Ni5N*v1am7Nmn+NmNnfmH&-WD2xYm{eGwVu5}q)P-2G1;Q8Hj z--%MqJ7<*|rOGw#L*?M taskList; + protected Storage storage; - public TaskList(){ + public TaskList(Storage storage){ this.taskList = new ArrayList<>(); + this.storage = storage; } + public TaskList(ArrayList list, Storage storage){ + this.taskList = list; + this.storage = storage; + } - public void addToList(Task task) { + public void addToList(Task task) throws IOException { this.taskList.add(task); + this.storage.overwriteStorage(taskList); } public ArrayList getList(){ @@ -21,13 +29,27 @@ public Task getTaskAt(int index){ return this.taskList.get(index - 1); } - public void removeFromList(Task task) { - this.taskList.remove(task); + + public void removeFromList(Task task) throws IOException { + boolean isRemoved = this.taskList.remove(task); + if (isRemoved) { + this.storage.overwriteStorage(taskList); + } + } + + public void setDoneInList(int index) throws IOException { + this.taskList.get(index - 1).setDone(); + this.storage.overwriteStorage(taskList); } public int getSize(){ return this.taskList.size(); } + public int getTaskID(Task task) { + return taskList.indexOf(task) + 1; + } + } + diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index ae7b4d7bb921320d672d32d0e34670ef630644fc..0dec63b9bd7eab28d67c20dec15983ef9eea5a8e 100644 GIT binary patch delta 920 zcmZvbNmCP16otP|Lb}swWspIzN&_J>4+1L4q$ooe6afJhhcF3guk zI4q>JSh#TE(v55XgcKVWlx2BeunNm^bKiUCo_o)G=XQV3SW8*>^6TR#ppxe%$u#OT zd1$7^#6i$QJgsWirb4?;hlxR>!BH>A=rlNP3ZqLEbnEmOoG|I7&!FGnq|Pamot!op zFge3nlXIL``H;b&svq)FMfR|YBRZo77YxP>#uay6F<*%8V7Pi;4&-SV# zt-OFjjl_x2Y^Y==IzCy_JrtUn8j0v!wzxvXqJU|OJn}7~lv>PCW>-0L3v^~Ju5wKy zwQnpG^+}m8=o=3EM#B-`TzID5qJsSvbIjX|&Q|wziyPG1-<-|Po7}SfuEK2#7Pq;h zbJyY?_f@{o9(3hxdB8)9M@sB5i}njwk8_D9_Npu3tD#ossl_wOG?F$i9gL1dLeX%< zHr=D~TQ~9c@#*OMDfhfqOr{u+EVFTt!ESQU$c>#6B+Ba~dIb|VBo^7PjqHVD!PKZA z4i_H5ODI)YL42}mvKsjxh+Dz^R`wdI!X3jciF+uM_#d|Z?jLr7@X9xoCDS6BqH1?| zassMjs^~+Cd@QLXk|y`x&MwlWrh>gn!G7r((2DIJo`AmZ50YgnWWfyRG6d;XWWO={ z1#x-(S(Vbwi{mHpI#ugp!vO&tR7)%IH`Xxdt^P~8R;26LK|OvBidhZ9sgskEe&rpE z8I>g*Xq4DQf_%am@{Af;8)&1Ib~@>h-vY5wgp;&&@lum!F}DTw%LSC5dVZ3Bh3sY7 rZrHgofG)AMTaZIBZDnad3e;#k`33fpWu*(&St`9ChSgP z@D<-6h^XTOe1fR>z$z&%30lTSm1UKGe)-{_zdow`rNr{~kTNM`Yxj2dx#!&5ef#$Q zwe-)#%#Z(kF$bU?A8RN_4@Ykd_n=Qh2>mfE!M$p>TbTilJsJdh1O`j73qt~XHDZ`b zFwBt^urx@F2;>AtIcyCpF($B2LmuNA9JtCqA+TTR3#Dj6XHi*?V^UyB;68zA#XcZ# zzl!~Uh6nMGz{3JF0*@%!qXLf!Jg%lsDDx!8QvwGyq;N>!>2s$m7(48L&%Wy|%Z|$I zzFsqLTW!+Gd7})=lDpf+%qg=jZ#ucUF0WuaxpZ|e#}NjtX*w$>Jll1OwCHjt3t8E0 z=OqL0u~SN=<5txBr$WmT&*(UcXVv zB3@z$_1FxJ27UbX;dE?><7FMMAme-Cmhf?$@aMv{*S)IaHN4L8hK@J!mh#v8m%`Q8 zoWv;|Z>toi@s7VS(j9&m@A-!#RWq%~aGcTcJ{lMzo@==b!jh(yw;kGgR8C39)A0d5 zB)8=%ti+Oe=}85Cq~k1nhRTJaWb%2LGxOUDxyf;o{#O)+n}0oi!RYAd?5e1!FuF&j zVaei5wqOS}Gu#owG^&b5)^r@#Glr!h$0xi4DOIElLvpcL(cJNI)3J<#+&^g-WYMr4 zPv&GH#SjlRGwIp+x{N0arsozIu3Z4z?4rj|76AUwk-<-!qtk31RoES2XiYA<;Ev%j znf22DNBnQ1%Z(s|3YKQrbQPH*?O03_S=aGQ+bN=gdb6CKO$Z5Wz(!DUf>jw=Y6r49 zVbm>TH~YVrteV+En0iG(6cNM-Ph+d{5@OKEXcRS{A^JH=&eEJgDM|ud#kvg*WUs>J zpIpH%Bi`+oGn1#4a#B|R7+=G-_~-cw-iU1~lK%@IAf#SY@$K`7B^2^4A=I{{+U)-! z`Uq)`-B@`C#VSSUZ!F7dp`al^~`P#MwpEk-TlbdPlYEmoHSWn`+WS-gc6yQ_N|J zMYZjt6#W#YgF@2&DdZVK!ZgbG>iC*?au(HX@tXMBS=6@I%tcOO_1c>7h6`91!U-h4 zM5;et7x@b1{b7Q;X0h} group1 = List.of("todo", "deadline", "event"); - List group2 = List.of("done", "delete"); - if (tokens.length == 1 && group1.contains(tokens[0])) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); - } else if (tokens.length == 1 && group2.contains(tokens[0])) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); - } - } + + } From 84492fb3fa827daebfa91527c6c51b1b0d35504f Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 12 Sep 2019 10:27:49 +0800 Subject: [PATCH 25/46] More OOP --- data/duke.txt | 2 -- src/main/java/DoneCommand.java | 2 +- src/main/java/Duke.class | Bin 1530 -> 1535 bytes src/main/java/Duke.java | 8 ++++---- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 8a82318e20..e69de29bb2 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,2 +0,0 @@ -1 / ToDo / ✓ / borrow book -2 / Deadline / ✘ / return book / Sunday diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java index 557466b675..e4ff9fdd01 100755 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/DoneCommand.java @@ -29,7 +29,7 @@ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException if (isDoneBefore) { throw new IllegalArgumentException("Task has already been done"); } - taskList.setDoneInList(this.index+1);//not sure if supported + taskList.setDoneInList(this.index+1); List inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index bddac7ade854ff09accb3a301910fdc68d0abca3..6364927f4b46bdb726d82bd9c31dd8a25c0089a5 100644 GIT binary patch delta 568 zcmZ9J&2JJ>6vcmU7#WxWT98soYopc=I)DgTTdbH^qfHH{32M@~8XH1tD;k1sT16gl}fvJ^g_5P=`_KchDX?62AKO;va=3|?1@@&PHKjr)G#_GV^~ZRp+r=kCB}JSg5sPaD{BAZAA0Id zR6KN#*bd91-B>Mmz<53HdykNK-XrmW;~vQ!f_)PG;Ze<}avqcY;nzJejk8FViN9+~ z5I;^?u17F~gw!NcqL`HcHj|=HbCuUK(w5=6B)u*FwkC9LG=WiGG00ngV(St(D`OS7 pAkJq+P#_=}L=Q=?C#D8uJf{D>LriEmB`v2V!rXte7lqTf_#2vKTg(6e delta 542 zcmZ9J%}*0i6vcmUI`p+OQ$9*5og$Dxh0+$S^#h95M582_R!qPJiHWI3jlr)FSj)cR~QQvwMITaAB%e}a1#*89Z7#Ld0$o^#)Q=bqPff4bMc{5m`a=2>?*Ls@gd z!J-_;r=qzS|GiQoy;w0 zve|sR-e|sAZ9aPOM6(>ss9GwgusDlvd%?CUs$B3{#O8tK1zSP&zpA`&2pW>AFux2F;=|;BTb~o$;{0zM)Ksbf diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 49009993c2..391800359b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -6,10 +6,9 @@ public class Duke { private TaskList taskList; private Storage storage; - - public Duke() throws DukeException, IOException { + public Duke(String filePath) throws DukeException, IOException { this.ui = new Ui(); - this.storage = new Storage("/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt"); + this.storage = new Storage(filePath); this.taskList = new TaskList(this.storage.load(), this.storage); Task.setTaskList(taskList); } @@ -31,7 +30,8 @@ public void run() throws IOException { } public static void main(String[] args) throws DukeException, IOException { - new Duke().run(); + new Duke("/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt") + .run(); } } From 2a0dc5ab77c83c32740a7e082adba8f0208a1af0 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 12 Sep 2019 13:45:29 +0800 Subject: [PATCH 26/46] Make packages and gradle for compilation --- build.gradle | 51 ++++++++++++++++++ data/duke.txt | 1 + src/main/java/AddDeadlineCommand.class | Bin 1155 -> 0 bytes src/main/java/AddEventCommand.class | Bin 1131 -> 0 bytes src/main/java/AddToDoCommand.class | Bin 701 -> 0 bytes src/main/java/Command.class | Bin 1432 -> 0 bytes src/main/java/CommandType.class | Bin 1090 -> 0 bytes src/main/java/Deadline.class | Bin 1736 -> 0 bytes src/main/java/DeleteCommand.class | Bin 1397 -> 0 bytes src/main/java/DoneCommand.class | Bin 2263 -> 0 bytes src/main/java/Duke.class | Bin 1535 -> 1738 bytes src/main/java/Duke.java | 11 ++++ src/main/java/DukeException$1.class | Bin 841 -> 0 bytes src/main/java/DukeException.class | Bin 924 -> 0 bytes src/main/java/DukeExceptionType.class | Bin 1067 -> 0 bytes src/main/java/Event.class | Bin 1721 -> 0 bytes src/main/java/ExitCommand.class | Bin 458 -> 0 bytes src/main/java/ListCommand.class | Bin 475 -> 0 bytes src/main/java/NullCommand.class | Bin 591 -> 0 bytes src/main/java/NullCommand.java | 14 ----- src/main/java/Parser.class | Bin 1682 -> 0 bytes src/main/java/Storage$1.class | Bin 607 -> 0 bytes src/main/java/Storage.class | Bin 3550 -> 0 bytes src/main/java/Task.class | Bin 1128 -> 0 bytes src/main/java/TaskList.class | Bin 1535 -> 0 bytes src/main/java/TaskType.class | Bin 818 -> 0 bytes src/main/java/ToDo.class | Bin 888 -> 0 bytes src/main/java/Ui.class | Bin 2801 -> 0 bytes .../commands}/AddDeadlineCommand.java | 10 ++++ .../{ => duke/commands}/AddEventCommand.java | 10 ++++ .../{ => duke/commands}/AddToDoCommand.java | 9 ++++ src/main/java/duke/commands/Command.class | Bin 0 -> 1659 bytes .../java/{ => duke/commands}/Command.java | 11 +++- src/main/java/duke/commands/CommandType.class | Bin 0 -> 1174 bytes .../java/{ => duke/commands}/CommandType.java | 2 + .../{ => duke/commands}/DeleteCommand.java | 13 ++++- src/main/java/duke/commands/DoneCommand.class | Bin 0 -> 2464 bytes .../java/{ => duke/commands}/DoneCommand.java | 15 +++++- src/main/java/duke/commands/ExitCommand.class | Bin 0 -> 556 bytes .../java/{ => duke/commands}/ExitCommand.java | 8 +++ src/main/java/duke/commands/ListCommand.class | Bin 0 -> 583 bytes .../java/{ => duke/commands}/ListCommand.java | 10 ++++ src/main/java/duke/commands/NullCommand.java | 22 ++++++++ src/main/java/duke/core/Parser.class | Bin 0 -> 1830 bytes src/main/java/{ => duke/core}/Parser.java | 10 ++++ src/main/java/duke/core/Storage$1.class | Bin 0 -> 671 bytes src/main/java/duke/core/Storage.class | Bin 0 -> 3783 bytes src/main/java/{ => duke/core}/Storage.java | 29 +++++++--- src/main/java/duke/core/TaskList.class | Bin 0 -> 1672 bytes src/main/java/{ => duke/core}/TaskList.java | 5 ++ src/main/java/duke/core/Ui.class | Bin 0 -> 2863 bytes src/main/java/{ => duke/core}/Ui.java | 5 ++ .../java/duke/errors/DukeException$1.class | Bin 0 -> 913 bytes src/main/java/duke/errors/DukeException.class | Bin 0 -> 1007 bytes .../java/{ => duke/errors}/DukeException.java | 4 +- .../java/duke/errors/DukeExceptionType.class | Bin 0 -> 1139 bytes .../{ => duke/errors}/DukeExceptionType.java | 2 + src/main/java/duke/tasks/Deadline.class | Bin 0 -> 1791 bytes src/main/java/{ => duke/tasks}/Deadline.java | 2 + src/main/java/duke/tasks/Event.class | Bin 0 -> 1776 bytes src/main/java/{ => duke/tasks}/Event.java | 5 ++ src/main/java/duke/tasks/Task.class | Bin 0 -> 1202 bytes src/main/java/{ => duke/tasks}/Task.java | 4 ++ src/main/java/duke/tasks/TaskType.class | Bin 0 -> 884 bytes src/main/java/{ => duke/tasks}/TaskType.java | 2 + src/main/java/duke/tasks/ToDo.class | Bin 0 -> 943 bytes src/main/java/{ => duke/tasks}/ToDo.java | 4 +- tutorials/gradleTutorial.md | 2 +- 68 files changed, 234 insertions(+), 27 deletions(-) create mode 100644 build.gradle delete mode 100644 src/main/java/AddDeadlineCommand.class delete mode 100644 src/main/java/AddEventCommand.class delete mode 100644 src/main/java/AddToDoCommand.class delete mode 100644 src/main/java/Command.class delete mode 100644 src/main/java/CommandType.class delete mode 100644 src/main/java/Deadline.class delete mode 100644 src/main/java/DeleteCommand.class delete mode 100644 src/main/java/DoneCommand.class delete mode 100644 src/main/java/DukeException$1.class delete mode 100644 src/main/java/DukeException.class delete mode 100644 src/main/java/DukeExceptionType.class delete mode 100644 src/main/java/Event.class delete mode 100644 src/main/java/ExitCommand.class delete mode 100644 src/main/java/ListCommand.class delete mode 100644 src/main/java/NullCommand.class delete mode 100755 src/main/java/NullCommand.java delete mode 100644 src/main/java/Parser.class delete mode 100644 src/main/java/Storage$1.class delete mode 100644 src/main/java/Storage.class delete mode 100644 src/main/java/Task.class delete mode 100644 src/main/java/TaskList.class delete mode 100644 src/main/java/TaskType.class delete mode 100644 src/main/java/ToDo.class delete mode 100644 src/main/java/Ui.class rename src/main/java/{ => duke/commands}/AddDeadlineCommand.java (85%) rename src/main/java/{ => duke/commands}/AddEventCommand.java (84%) rename src/main/java/{ => duke/commands}/AddToDoCommand.java (77%) create mode 100644 src/main/java/duke/commands/Command.class rename src/main/java/{ => duke/commands}/Command.java (77%) create mode 100644 src/main/java/duke/commands/CommandType.class rename src/main/java/{ => duke/commands}/CommandType.java (80%) rename src/main/java/{ => duke/commands}/DeleteCommand.java (75%) create mode 100644 src/main/java/duke/commands/DoneCommand.class rename src/main/java/{ => duke/commands}/DoneCommand.java (83%) create mode 100644 src/main/java/duke/commands/ExitCommand.class rename src/main/java/{ => duke/commands}/ExitCommand.java (72%) create mode 100644 src/main/java/duke/commands/ListCommand.class rename src/main/java/{ => duke/commands}/ListCommand.java (69%) create mode 100755 src/main/java/duke/commands/NullCommand.java create mode 100644 src/main/java/duke/core/Parser.class rename src/main/java/{ => duke/core}/Parser.java (85%) create mode 100644 src/main/java/duke/core/Storage$1.class create mode 100644 src/main/java/duke/core/Storage.class rename src/main/java/{ => duke/core}/Storage.java (83%) create mode 100644 src/main/java/duke/core/TaskList.class rename src/main/java/{ => duke/core}/TaskList.java (96%) create mode 100644 src/main/java/duke/core/Ui.class rename src/main/java/{ => duke/core}/Ui.java (97%) create mode 100644 src/main/java/duke/errors/DukeException$1.class create mode 100644 src/main/java/duke/errors/DukeException.class rename src/main/java/{ => duke/errors}/DukeException.java (92%) create mode 100644 src/main/java/duke/errors/DukeExceptionType.class rename src/main/java/{ => duke/errors}/DukeExceptionType.java (84%) create mode 100644 src/main/java/duke/tasks/Deadline.class rename src/main/java/{ => duke/tasks}/Deadline.java (98%) create mode 100644 src/main/java/duke/tasks/Event.class rename src/main/java/{ => duke/tasks}/Event.java (98%) create mode 100644 src/main/java/duke/tasks/Task.class rename src/main/java/{ => duke/tasks}/Task.java (95%) create mode 100644 src/main/java/duke/tasks/TaskType.class rename src/main/java/{ => duke/tasks}/TaskType.java (70%) create mode 100644 src/main/java/duke/tasks/ToDo.class rename src/main/java/{ => duke/tasks}/ToDo.java (92%) diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..672fddf63c --- /dev/null +++ b/build.gradle @@ -0,0 +1,51 @@ +plugins { + id 'java' + id 'application' +// id 'com.github.johnrengelman.shadow' version '5.1.0' +// id 'org.openjfx.javafxplugin' version '0.0.7' +// id 'checkstyle' +} + + + + +// shadowJar { +// archiveBaseName = "duke" +// archiveVersion = "0.1.1" +// archiveClassifier = null +// archiveAppendix = null +// } + +// group 'seedu.duke' +// version '0.1.1' + +// repositories { +// mavenCentral() +// } + +// checkstyle { +// toolVersion = '8.23' +// } + +// javafx { +// version = "11.0.2" +// modules = [ 'javafx.controls', 'javafx.fxml' ] +// } + +application { + mainClassName = 'Duke' + run { + standardInput = System.in + } +} + + + + +// dependencies { +// testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' +// } + +// test { +// useJUnitPlatform(); +// } \ No newline at end of file diff --git a/data/duke.txt b/data/duke.txt index e69de29bb2..8b13789179 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1 @@ + diff --git a/src/main/java/AddDeadlineCommand.class b/src/main/java/AddDeadlineCommand.class deleted file mode 100644 index 2b84b83b4386dcab17ffe8b5ee77a7585458e9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmZuxX>$@m5PbuYg=IMciAlV2Xp|!fUePEqih(F`Lq3G0D*9XDRjYBcOtk}BHrJ{fyxs+r#JobHm^k$O?oGN$ccZy_*l8Ze!kr4?w1#5UC;jMx^)+M}C zpkjkT>e4}MWLs4+P$SxIM7L7;%>l1F=5XQfW)%~EC=+!LK=DMS@ z(b#~>dJyl=`Mc_KCh_(ZM6g;za9i{plV|$rC8@m)G@G}l5(Xcsv1oPr@pa_WmW^v$ zC!y3y?snd+w`k00H`m7VY~~m-i8FG6DPP5@%(_~!e<0d;oXh+jv@a(g@2de zl`jP2YC{Go1qdNXVB=I^f>zX*gLnDogh$1&L1H-H=jI0=zMqM b^mj3V0A)uh{|04w2<0Yj5#l7RT$uU?c?JjT diff --git a/src/main/java/AddEventCommand.class b/src/main/java/AddEventCommand.class deleted file mode 100644 index 90f9076138e3f848773e5f39da2023e8b4899b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmZuwZBr6a6n++zU6utAG_9=E(s)tn&9X3y1Pfd7gUF2a=?WXOvg|Uj>*!zUS5%WP zU(Ggz@K5Zh@65qSQRjR zF`J@cXmw`f+I6Q%-Tf~vAiAM+tysn7MRco4b2j)y^inGI2B9YY-5*!00AQRm-%Q&Sf>4 z=#kYq#D_k=CpX^4peq^9vaK;&^L7)Ln4BM1-6*vroohlskW^Q;x-^1avA81fZR;e9 z7RlN!nk|RAi+j-vK_x4gqIVLd7beh;v_aNS-*jDMM`^bRA1#WdP9UVxNARV-!GDB- zujHgxLNoseK=k1=!e@|nV!;#0zt0fbA$a8r z!T4Or2&DiKT0;agjO(-`UL5fTZqgx6ZHZjG@<{4Ce5VMP((}iN%+05dG1Sj)jQEWs XOh9o$n4qixq1?i4LcBveA140+KQaGv diff --git a/src/main/java/AddToDoCommand.class b/src/main/java/AddToDoCommand.class deleted file mode 100644 index c866512c44ed58a420161a720e716a2674da7b80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 zcmZuv+iuf95IyUJZ0)$0)TLa?ty~kQX($(|QV>#AgH*|C9_sdmC)Zh3OBy>$98^9F zL<{NzAHYW;&L#m0>VwBKb9Tr9+8_5|5bL%SMAl zz161L+v;?pEXcOAUN25N>!vpsE*`sZP?mV&qKcXeA2o@(i#0SP)?GC5RAR%$GdvfV z`4Eo+hu2wir+pz?sG45O)2irW-^{fY1W`L^lOwzUP^@w?X?Ak1 zXxisg$w0-qnglDCsu&uO^)tU!60l=4zEO<+M82_X*1jfXpWDfI(*B63H%0$STsy!j zH*WJS2!51{)}rrXmUfQOOU4%e75^)QUq6NAe@5XH#ZOFfnY4>2(n?xGWn+Ovg0{j! yL$Qg%_{5U`1=crQ*{wIuP+Du$&mjM2nJ32rFR#EO?;@*9Wbv>>#;c4hEdK&-;E@IZ diff --git a/src/main/java/Command.class b/src/main/java/Command.class deleted file mode 100644 index 160a133d795101aca7cbc9a926082e7d2eeab81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1432 zcma)6Yg5xu5IwgP64KC?AmCdb0xc+2e4)ihr6841P)Zf~6p~8`gaq4^!JneP0v$$B zX7szi$#L9-PACs&{LtIGd(WQTvv+fU{rUa_z$o5IXh*Uc=P)Q@NW={hHzVl7u(zZH z+!ArS86&tOLBw4N_i$gr1B?oIC?SeR64Drx@EA`7Je8mzDd3ra3`0bBHa0ZdD16xD z3@z&Tk(p*_8Z&LveZtU?NER8wZe1in63G)(0^jC( z)g^FiLM>>Ob=9o6X?4L&d(6_rw$3+Q)3GZ8o-=gnWv;nAV;D8s+)7ciOoQQSVo6=o zwzQO`*`?IHTQ==dI!Hz}x6HemzCNRE`n3rd7m%d{^G>y_^GVYySFVu`dqgtMdkWs`Nx}1E~vT6_pA=t%_8Zf)O z#&wsW&3BnjDmPnKTh#YfUDHZ=?PlmXip*ISFKJe$T&ix6#JZ@Ev%)ZysB80Kmh}I4 zl82xmC*6psJGQHtc7>XC25a&i&BU>$9u8wPmoH}2Ty}hRW+s!TJ8V-=p@=c)qaj z6A2Rc?Z&`v-8q1=xQ8~cxR9@77!le>At6rkTd9~f3{XQx$VyW?CaD$E)QlpPxI|j7 Y6FP$MZ}bZ2>x{+f)bx|K0iQVW7k52bp#T5? diff --git a/src/main/java/CommandType.class b/src/main/java/CommandType.class deleted file mode 100644 index 87e10602ae2b6915d60a542cd12d54c06bcf4b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmZuvZBNrs6n^g3t#_rc^8U_vQ#Vi$6+t(Fxz=P!vwi3wHhwCjl98=5VA^)Nr5jorUbs^m=>7jm=T!cNC|w!F)MJ3V@}|{|S!U?93(ZEu3l1tD zKloV&P8n;@DpeSI=&xzzO}kjK7!!hgirSf}*xwL)cop`HtFF0Iv z+O1k}n9bZiB3BD)?Jb6p{}dN9dkhJub{Kf=PK$a+(?a37YW?!9RM!bs&}rmuwBMrT zXil@!s`_tg!kf{xxE0||$GrGp3p(<6P3!B*>qw)ZV+qST#xbE|QiLfHrbU<$Atl1B z2y>XA4PMVH+%Uwd^=3c^52Z6*PRsj8ezi^J*1Lx;)V<^5Y**RU%5HYe?yS+J7^9n) z*clhr077ynkqk;Cj}pnIL~<&T%t|D`fH5KFr%nnISj0Ur+$T0qC>|{Y`-;dpqMwN| zJfIktIr=QLp3GH!M5@|=vh)qHb0~M~BVv=u) z3sb+zq*QMShA7J z!cl|&q_d(S-9c9g(c`$W5WS8Y50P|SHAKJT@(_cLYmhWdK-#Et3U)n`MuUi9j%bVs ME(Tl0W2vqE1Eyvw)2SXJmKZ_nh~<=XpQR;pJbyJqNIWFT9vQ+yfsj zdXT^ea&*a!%U)c-hhAL4RVkU*@R5cEFTA+sM$(IEEXv7sH*RRSDTlYb)VuA*9Suuz zxGYIZk`<}Gs^Mb+#j4ay0e||5@wJht8ugt-&T3WaJBtGDvSFEddwrs_E|nAMM#-qA zx=U13uUG07>!!e5s2`?5+rgQ3sJNFT3k&#OgWoGYF-w+?M{>uOBq2#Y$2QB7H`-7C zrQOTV`TvY#)eg%tTLPm4iXspg&=s-=+|pQnugP+{Q!95;>GkXi3z6=L*;$HZFMAq~ zHw=p=n5Kn6Xr1B?%JM(n5v`Nq{uUN+HDxgbHcx{ue`&OG=2yFBy<{%_9}C?c>o-8# z&X5dQC7e-hzmbzpMHa)4s9-dkX1y#BKkZ5PK=$`=w?&9Q#9rsov3A?*CD~2GoTtoo zsa5H=m)dDRfolVhPuH#IP5*(x6t9j6-cb%dJP!7VT~4k*$nGNza`r8paFNeOqDK&s z*Z~}oU*J4|;&&ZG%|>GJV`v9(@57Z;e&()m?wf{(xKrGB9&XYhVhr;d8^Iac9fzMf zW7HbO3w5E?v!P&1hAy7LF!)2QBl25;dAZ>76D6U{2~iZbsC zxFXM$@{dSH0bLD5Y0*q*i&m5z<#6WKFhF_xFcPY8g zwTC>`B}DC5XQ7_pEL0718oZrX2;fglG4R_$eT9)%%$ShJxf}R7a;m@;`4tZ7il8w- zwS@^%-WsGq%5K?Pfl2?U`a8x7&d4DGxq?FWcCO$e8_yl%>}!x=))@RV^5H5w;R<1* IoI4Qv8_{Wwl>h($ diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class deleted file mode 100644 index 711bb351de92a328d01d8c2b97ed75a99d63a45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1397 zcmZ`(Yje{^6g}%WUQ1RUc8DpYfGL66&a35BTBo!jaZ(l8rr1fF(g%vXI3ls+k=9K3 zMSO)!ahNjGe(#TBxGTGjGo<6uwX}Edx#yle(m(J1{0qPx{H`O5YZ^X9UIRx#g`$o* z%XFV{4LjVk+)$RRO}A9o;<(44*Zpqbh;>)-$eh4lRLu>X!z#y`fil(&Y^ZP+ zA8~wVz{K|)_YGL65RDVHs_Z<&rDOj6f!F<@ZOi`{s3 zs(~6FD8L^$9vY~lVPF$P|3?EqVVmK~aTimmU+c=+lY4&GYlcI}M%B-SU1v8ZNd^Ny zE6hju#lWxljf5HqN{11lx&D$_8>$}3s}oEOb~T=NNUp?M*(x{6G=w#@PDhe*`lmD4 z_P`E85im?TyTaLvPS+A%OYSmcPd#JmlpdZbQi37bQ9!0A8K(26Sc5E=J|Snnzh131 z%xa^&QGQ6%Ss&~m!ueC+PT8m=NdD_02CXHedRieu8d*Ft7@>^^qU}Eu>w(`^c2miI zO4Y|UT@tKAW|om-$fv|=u;JLEk=hlrUN@^7jg|U+aw>JJh%mHUB>kCu;X?r!j0m^p z3H6Hok4js(OfPwsJ_w91@-oE{x+lX@oS~;%h|v#77mvV-hlst#NO9&h;;(3t;bV#! z#3^!$Nu;1*lD+~OF5n^+Du~CFQ4q7mHyAC(ufIVe-duhQzCCk<WZkQ7ZbNu09O i`y9=8o+ezN-iirFY?~uJ6;Vl0p^hsAG)t)%uD%C!XgR?E diff --git a/src/main/java/DoneCommand.class b/src/main/java/DoneCommand.class deleted file mode 100644 index a8f995354b293b276f9878b664ee1108f67eaa40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2263 zcmaJ@>2}jb7`>A?k*z4rMxbF8ArvPpp|sGJP)c@O9GhYjn$QKso;bp`WUO(Tbl>*} zXrF+;C8s1DIH&yYGj+RTyNNltJw6&qGjs2J_s%z;{QF-Ie*^F`el%g@g$Q26*$51r z)6GjJ2VOC89%BYBnCyAgz(oVEg>fl@aZH#nF=^ryrc9i~w1Js0W=(YCvhIw9@w)E6 z(#sW+9k_}&OpM~1fm9f2O>kWk%p7EtvFLc&F@esMax(cjr&K30r`IyFq+H(%1Pr+*GZm%zqw%y8bQSU@MI#SkFIiTL_?N(1h=+K$V@+oK!1*Ht1?cC5%-I?_tfrx`p@g zfrSt8k-(9LAa!CSD=N7>;a9wD(4g5$_;ygqtW?*t@Ud3=36zCTb%dWG&&{lFI3JdrYU`VcWIC2e zPtQ(Yqqg`{GZ=8R30;$k+JHz-D(%-eqloY@R*wTIj6f=#v;s70@joIYzOz0r=IJv; zQOd8KNP%6^;ipxZ_#9u5)V77do}!cIne{S`y5Xu7J_XA06i?`LO%ya?6L_X-Y(=?+ z(OLj4{<6TiMtE}Rw#@K&?`%Q6r%t#HrfjpsYNBFZsX{G%b(Wn8)s&fwrBboPYUpT}Bi@Dm0IUaYHZTlviL$@VDU z&Z31spl4(YVq^m?_t84C?><8J*vTYf+lvs}Fxv<^_-X298^JL|3Dgv~IHDDLy&W5{w$S;w8c08OlcA-`z8h`Cc9EkSo#^36FZQ4h z!|ZK`;Kw9_5k7~AG`WU8Y;tf78 zQtnO8Dp8ykei)%YVH-Fp{wAW;fMMX2!G8q8zyK}j?yq{%&Sg!U=9WHBPz%oB8{V}` SU*S7^&G6!U5A%JFSK=Q55i+R& diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 6364927f4b46bdb726d82bd9c31dd8a25c0089a5..7bce5caa654653bfc85e31ca6b040831ddffd790 100644 GIT binary patch delta 613 zcmZ`$%}N4M6#lMh7LA&vnOIr&H}-dHRWukx6i6-tEuvO~Uc^#I?u`Ac+6EC+Ll4j+ zv}@b87iiT(^Z-$J9L*7GbNS9ad_U)$@4h$R-L34;6zZpp<~7dfen}zdF;x9DQ_>BB zkfV416qW{^^~-Zga#AIXVvHcz{>vH~SBp%-B&H-xAVDzD?wZ%++!t-sjB}0a^uhId zJTGTX)H9XVjZ&Fza;{!lQ51)9Q&mYG5Cj@@E3i&;;w9+QnPDM&fQalMnqRJ?tNwO? zJ(cT>6L@MCAZS^a)oPJu4PL4im1K)wsi@V0PPeoM5NirIg*qDqUUtFqbwlV)JI$M! zt~y2$`?jX=7n#u%&Ry07b5#Dv*J=xIduw?+%Wo)~>)t+0=Llkd2RA>v-oqid5k>$* zh#`U%3}X#Z^TU0!I0CP@Vi0jeF^(~DvpFQNDh{}gS)?$H4a{Ii;53rvqh~k1fL<&@ T!jkv{y5SP4G6<-sTv+}A^G&eQ delta 407 zcmYL^%SyvQ7=_Qow6#sr(qg^0rLAD9NOYwb6{H}Fvk=<4aMi(v5bcd*s&?fAh@i|% zxOL$J2(Ekpm%fTlFzW97m-C(fe>c9ghx=8Pwmh3)lC$8FdI2X$(PpG&KN0YO&s>Kf zNgqF+OG?YrQ9w~n8b1>qRV?W!qarEdja(B$94fCnWs_d8D`t(j*R}S2pN&JjO(UCK zJ0(!VBmymP_-`hGVN%hVIJ=FXFh6j7g4i$=1civ$WqsFbaNp~@c8%5ty&mg#!doLL zm2=~qkGS+?&Hr!0Ps7x->+oo`IUdTTjQNKN8xp0}2STVh#h~Iv{mdt!B83bzEI`Kw z3~V7So?>@vStO7{7E_o*9z{%J1vA*hEVi+TUCd)odJd#MLQ%Bi$E7los7Oi`%K+j~ Mq{jq-B`XE%-&kW{Q2+n{ diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 391800359b..2701d81ad5 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,14 @@ +import duke.commands.Command; +import duke.commands.CommandType; + +import duke.core.Storage; +import duke.core.Ui; +import duke.core.TaskList; +import duke.core.Parser; + +import duke.errors.DukeException; +import duke.tasks.Task; + import java.io.IOException; public class Duke { diff --git a/src/main/java/DukeException$1.class b/src/main/java/DukeException$1.class deleted file mode 100644 index 3a5fc6156e596d1ae2a0f0833642acd6cec31856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 zcmZvaZBNrs6vzK}E9)K#3{XHsnKEHhWa3jyG$zf~&1P$7XvG)2vFmPFp|(rgp?)G? ztBEnj@Bw`5_c5M3G|M7MbN=Ud?s>TP_Wu0+{S3epJj~+?)^aG|YL2{hf!AbQ7qB5r zNtheL+!SV0Mp?!d!+P0z=OymIaE9f^=!9$UT|P{_Ft9%iIYa7DXUINteJ}8m=M3pe z^?*UDhkaU{?|1<>M{j#PvYnn!ky$Ho+!N~cm-ALQid^3G#Ny&q|J`Hf)S(_);QC?g z1xE%?24P>uHVrg+oV*C*L`FqH6}J`4Vot#w>?pX4U4}JLUGtsbsAh)N$Q?92?)SAQ z3L^zIk#1yU5Ve*mc_t}*}s diff --git a/src/main/java/DukeException.class b/src/main/java/DukeException.class deleted file mode 100644 index 72a5ae1f8274d8854f1e1c72cb12dd70f8b4de83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 924 zcmZuv>rN9v6#ix@-EAqi1ymGu7K^=7AS6V@kQh+Xgj-VdkH4nvSk|_)&F(D7EBFLH zgTJa#iT>~bd<-ANc&71^MkYCPIp=)md~?qE{`2cM01vR1#yA#I$l!Jg6S$McU2q4U zgGC4Tj4|tA$-#XGIU9K!1sg?%OjRiv?sP;H$%rALFM5(;W`8$s%O|fJvZwt(ose>i zA^FHxzTRfY=l5TUGqKVUsVy-KO)0;O^ZhRK=l4#YC#+}RH!HC!jX`2bge z<}ZU-H3zOIWFA)WXUdRJT!vu~di=N}MI^ZnFSuw4Usb3+LnWZL{p-r#-cjv`ys~Qy zb651wG;1MSJNI?tlq#Mb0+|6|uwGOdrmryALD=+_=rD}r3srbDgyS@n)O}NZx>wQQx&$khKf!uGaG#@nVqi*Q6gJXu2tqac4SX{Q1nhmlNbw`A&q!3> z5oU9M29k6xk>p8ABo&f%k_~sX?AR`Eo9??~eKJ`vNf#**@xdzbUdJRh ui1jA%-6rc}O23PF+#rt>>{ZLM5|;VE`~ZFvx9Cg|!wCX{IGY=-Dd!iEXVG#1 diff --git a/src/main/java/DukeExceptionType.class b/src/main/java/DukeExceptionType.class deleted file mode 100644 index 8ad35f1bc44c9ed29f84d0145c9bdb2c31113ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmZuvZBNr+6g|(@tz9YaW4wzZ$Oa0cqUaXF0);e;E}?^D@l%kWN3B zS@A@}Fym7VBaF{9j54lh7-M{{VVv=WidBIg%Ra~#tj&$$?rz@R6c{XQHs5*X`-*qk z@M}To!>N}Q(CuQ$vP36wR&k#j z8Z5h|>I}`>HywfG>yD%1=Wey>oe8AUna&DjqxQxV=q>nxXE#p{y?V(#tWrjmrNy@b zbLqmdd+sh(-QZ}+Y1IATD4Xd#F6Re+V~xkPmspttfrR591#Y8RrwP$CXS7_U`mbuX zrN|7LC%Fzo*7yLOTC-m9wtV)PYCGaZc57gQ?{(6^OS}^3Z&MkVM%KU#W(^D>Wnh@Y z2!~M)V;shjqD#5mJ-ZT!RjRdsMkmvm7RSZIW3SR6dn>J*->AB0XW16n%>n-3HM_n{ z?0y~G7-!{Lz?2X zsZV5**T)}F$^&Zj650h4lIV&gU6L3vNxCKJiA&NeNuMf7za#^iB!hkNpVTiJ()%ha sA-bG$EJU|cj)&-V%4&#yr>un-bS@xnjp}5NE!t!*f@`}O%*))uUuB5Zk^lez diff --git a/src/main/java/Event.class b/src/main/java/Event.class deleted file mode 100644 index 36cf24cf1757ab8fb00ac47c721271495cc829e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1721 zcma)6TT@$A7+pI#mvDNxG!Q8**iZ^2A!!5^Y3NNLNNtj06QL>M%pp0&wB%xP(y@=u z_$Tzy7hcto%h<6mzWG=D2OURT`y^Ow;*7cM>$lhUt@V9-|Nhr6F99sza|0uY^k0Rz{4NEn#FqMY3D;iisTa(LUI-5no3)UhOo z%d%OKO;Vb#>i9@NaY|)dz@K_zJ+tC_R%JJyb?T+c?xKLNXgPMy-5+V~OXGN|TCnz3 z+FLZ!Zj>q|=a#^9s1v1gCA>ke%he*i_NPh}JJT%h*!7&Xv&WU*tYa0PrmdPg*RiJK zuE4oM-KM|fGrQsljE1(lpr+j2MI9dt=)1PlihC#&?zAN{r`lpEU}US!dcj^TN%w{e za!qPs;%(eBaS@kvq)eodF>xOm23;)1)9Ltgeu8Uj<+6!&e4^uli7av^MlnVuTs2*_ z9#`vS%ZZ=rwQkiLcJix&U2{s+ioo!jx-T_Ldqul0-G3_Jja!b14Q!fth`fLZ3aD<7 zCL#z+tIN#ZR&sl5vaubUY=kT)!7eN?@EZC4&J(*poJaD+mTW?@`3&1kMb2tG{g?Hr zGFSeS#H!25vFieZU2-81=u!zX?>^})_q;}_)#OGplcVIR(>0co;<$S~)yM0WLwpLf z&<(1U({B3y6B^N4+IH3~o!4X<1UAotFMnaxv-X!wyHc~fFZ*NHQ)d*+p zHQo@Um5#;mBN|w>nq4Uh#Lh<2zJZ;k+b#~`_p-!!SDa?!Zb8;jALlD}qfjrk3rlMi zp1}1k$Y+yw8cpXt!8qTF5k5*Det8kx5$l`10wGI}ZIH9C;f2b6Dl&5f5s4na6Zr|= z11Ns=7+NM0jU7WjfNvjaLiv%WhIwuRJ;WX7xhwFo?IlJZ->rU}r{7`tX){EtK};e* z8!#5n2^SO{13D($-&F`5J%Uh^m}-af2gB28-gp5ce}r?XcAuWfDD#RkuLjh}OQrZd z5|My9m(WHuzj=t>Z!r{5zJsppL-Ecl(ab&uW76UfeVZ|VzwEwI#s0}}v4}kHuD`%Q ze&!J8qx>Ji{{!8&I3>shxIktjWOI>hE|JA3`Ho?l+RakEn`F2|LihNzKj7X&?i6@8 zCD$ovCp@m{nATymenJ3$Vw}Y92<;X6Ur{k3?{b^?7<-yPjrPj`sc7mZLgRo`wWGk^5o!AxQQ2JiLvCXkV)U6*) zTyZHAcd--8uBlAb)CNH08}iYpNW&V!&`QuJ@h zQ9x@TLsci#m|?)Ie}L6rp}awTA)cO0H4l|)3L1H{3O zJ3_Qw-1eS1U(dbs_5JY);2b9=(pbx)g7qv6Y?#=@7RNTn4nz7v1~R&2NYxud2E7}O z1w+x6fw+zRk(fE|=z$b27Q%}o`YP9L$DL1XIgdK_Kz0;nUN1Z`jbs?iId(brNa~02 z%o8_K(Iw^XhQ99x;)(bRVyLJe zwPo1u-6hoA%I`c)DOk6AeTPsxp>`<3Th6jHX#+_sPiHcSmOHBf2udv47}9J8-J^Om z&{)V&%~IF;?E$O#4%U2u_KMUq>2w8D3rJBlpc9)Tin3u5p~xD&)oHqQ`Ud@OT=R_IY!6)jzj zvCQ{zM-4(9_#=)j%CCZG*imOXM)Pjud9|S5mwxx?hrE*(GRSh+7D^~v_=+;aVm-Q5 zf4VS~8~&a2bl0ANCHvA-a-{5VII(3!W1=W2SIs?CLsn2q!cMjVEGLUEr7)U diff --git a/src/main/java/NullCommand.java b/src/main/java/NullCommand.java deleted file mode 100755 index 3316f4eede..0000000000 --- a/src/main/java/NullCommand.java +++ /dev/null @@ -1,14 +0,0 @@ -import java.io.IOException; - -public class NullCommand extends Command{ - - public NullCommand(){ - this.commandType = CommandType.NULL; - } - - @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); - } - -} diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class deleted file mode 100644 index e3516d3a512ae78db481a86da835f6d397601214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcma)7T~`xV6x}xonPD;*9V8$YIfl!5A*cxTs(T zvohWn^9K^<6r=_Ip@d5c2F3Ct1()%$jCloD@QH#luFAM3QC+Un3JEl5Is$Fq;}Y(us9=+mg#wZsMom88_n?147qm1y2Tt9`K*qPQY8bezU{7elpwpO+z$D#pd7MEa3jKxV1bug>q$QprX-p^QwA51!JVxd@ z(p&qG_5>s!LW2Y;5tNA_dHMiq^gPsiKDI|-c8^#S(Y_@pv>t#&3N#wWA>%BmxJdXs zGPnj6D;UBWvUraoGf4f7aS2meHcNp*cmn6>VjaYJ6lg7K{EbMGG;{5^c0$t*Fl=ZU zZRh|e*Gex_zvA3%qN`DSxr2Q0ZoR0LXNc@Acgd)8QQ2{A(K1ZKY#54UL;HR8E diff --git a/src/main/java/Storage$1.class b/src/main/java/Storage$1.class deleted file mode 100644 index 23e295207c0f32600f0be3a57fadbabbcc3c793c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmYjOU279T6g`t{cCzcnu5Gokezh9Yqy>wDC@6w7TMQ<~Ab~hDY z{5w9YAR^Kq;ExjTEYS$V+;h(TntSKh?;n={o@39(4QyDbqiGSksp%%iElqCg>kh|V zjxC0@R`5P9qS;WKw?dJhh9Ax)L*=;7P=6UEaT*t|7^XJeU# zVw{lD2nrFMQi%n(12xYgc^GS_6BH^FQ~BsbTnNhc(kM}RoKAa;+75QmVc68!`-w=W`@Rb1(d;mm$;8Vtl{x6@uwAqntVOfdV`|(_ zQ<)tkBF|;c;4UkS#wRi=82BQZ9)C|J9vVpWGh&q!e&{18!q8%FyC?V4F6p) aNCbthVvVdprGV?DvW|OX?ee_@-1;A3{dLp; diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class deleted file mode 100644 index de9730dec5a1e2b39df7e09daa191b89051bb324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3550 zcmbVOYgAlU75?tL&M@2rm;hn&oKR?ZlVD0yplK5b76U_cNGPQ>y_vazf#F^{_X43t zQ=_eIwOUQpqOsL#r6xYo*bGT%lla!UmcR8^*XmFI_*Y#`;&<-MBtw|xa>;O>d!K#2 z^XE!z^4Q7E+vSeikFoW43 z5j`!Je@5U$0M+7hct*(44vhNo zylh{PW?qyPd$qDxix>R(vPAq9ftLinD)2Q0YM)`~sqUm^S-Pdbb1ae66|C)_&}OyP zgxT85ai;>moIj}9;|hWqSyD5`TBCLq;02dyj&Oy4B+P!!+D&#%Z{uKVj&R znW>|CYDhaOxAG)SEv{gFU43TZjGaif?oFk%`Tm4u)AX9Ct;Hq>wCU`E!2aVgecDc# zh9&T_f}&_*%+Tza6pd{yY^AGzNV6t8_t09YIjg7UQVCm++Ga`{Qd z1>u6y+ZN^7N{^YTDb1Et4ViK$1se*{kU=5v4S~}N0#S1&71QM^x*?0EMe?qoIHFtj zfG%mWRP4hmDjvpOs^z;y3c6M7!9xnxIf9iZP*8SfHX75Uqve`!s`wVZt>RTIsQ4s4 zrQ$pIu7b_^wj-w9Yt9()+g#HRJu{Pf-nh7*jtd{th@aVTM#cB=nl%49LnPnSuq2xs ze;+?k@dkcKmrIUR{0MKV_%Rj*-cs=soKmfjCmCES(pd0gNeVA1@a~`04cm{)Dz4xa1@3Tb zSj95lRq-CqN-SoNsp6_+!2RKw(<-h>Zua52f`&uJq+!k(VViivaoyHqwjO^d95tti zgMlATSmC*pX^gd~_!VALAZ`a$sY8L2B!fpMxKIXaCgN&#=KRI{>Kn|XG{c+Y#XfST zQJ<=#t22t6+_9fYLc*_;!C01!yjt+}qc`KQcJfJ9sG4L)87NbeMg01=6B`qQvZ%QIlbyGKX;m zGc@Os=eYX}S)7DW6P-)gv2k7Er2&>N2@p&-pc+=M`noSbZ_m;N8h_k8Z_M3Fnep>8g3l)~C2eMru@_)|?Xt z@N4{rtSXF68IEjZS5bH^PHB^Rw`s&QdpKc_vuD|wVe_UwP}jFQF8-I9>^-~E-(KfR z%o3BBqCZ0tLN2Lth_a}j_<#3ajjte@O1Za_xOZ*rjU`Qs;Jns!GC|L8FAz`l1@pzv z6d--_8|2fUn$eP^P+0VoDYKxEodQ@Hmg>;n=z(0A3;b4IGk;J}b0-}W#;iH1XFrV@ z*Y#>Krt-YNpSXL!X->{eD|j^@dv;OgetSeS;z`}A$!K=229h_kVxbJ_0_ypMRRsyXruNuqoK`-}SJKkETvOZ(RKGOXc+VDP!wl;RlQlogVf&ICinE zY*>QQ(0CE9hGn=%8kgX?2=CjJDA>lETd#3Sb70vO9)=$W`4Aw z6>AAfZhJ2`14=m?L^)q#8(D|Bc>^lZjP=y4;-f2sN2s+4?i(l<@Co>$1Sh2O86;h%{eDrGf>#!OnUG*HP8s zxqwi}lg5TLHnyDQD&Scbg~iRXk>vrFBTXUCC2W$Kn`O1-61H9;ets&qEn@I)X~=UO z)oI-0Xw_u3>I-Srrg5*MwLPolUc5C*dh4XaGR#e21N&R)sxY6R+j!c0_-L)g2swQm z+Y#q@40V_wmnk%1j(naZ_ov9|i=2CjyuOS!zE*beg>fI=L_6NX{d^g;G4*!y2%Wgh zC-!@I&|yCW-wl)rtP>dgNb+8_x%S`SzssTCLvnJ&ALJb0Kdc!!ibdM}g!+%hV0{`5 z15KW`h^yVhC}}*$X~#`&Z2#+X>{ol-r=Di}@U{>39A~?;ImlBtFQCTV?pef^=3t96 ztnkQTNprB(8T!2Ko(fOKPds4ePe%PFmM)ef%h)l}q^r%dDmqQIo{rDaJ Xh~G2I<~U!@2tQ7(d8huIQ-A(H!Ypwi diff --git a/src/main/java/Task.class b/src/main/java/Task.class deleted file mode 100644 index 1041abec50f86a4fc11525272cad71a7164666eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmZuw+fEZv6kVq??M$cB7Aqj4+*G6;6i`sX0>(&8NUA=Rm>}_CC?gpzE$IvTZR5AZYm5aZf21uBwB_CDwA%UWxnGr#_P{|R6kcPy9~O(TaZVy=oAGcj&r z!o)QL*DW4QikY%7h#L~WY2g;84a_KH*1VwB^mjtPQCBEbHr(g#_?BB=AFqZ@zrJ2p zNcq7+qwXoFCklG_Vuwqsvg8JvOI$O-47slOL3nU3Ybl)d>wY+|&{h1uZ|O0c-D|9| zS-#@ey@$Kot6p=-UESh|vF?S^T){4u+M%)xR6{r14Hj!cxRc=%C}){d+kD{eMEwlh zR>-k(pVi1WE)@dQf=;8v`ajaZgr1olKw^{S< z`=TH%8Dm1t#u=1t3qN`jimH2P&vG}31V13}e1&pG_mOb4eP|zeq|i%SU_&X=*&q#h zs~JYl;e4w>AH8Bm()kSi{b5-uI?T~>NVI}AMK7s&rfRQY7LxCfETp6;5n;te1q|@S zK*GLj@UKuZ;Z}!su*7k&ZYEtgOr1b70_!Ol$saJ6HRlV`)n%Q|s(wS}cy%wcFXB=Q zXpW48YKKsL1Iy7l6m3u6JLDSArJphxow?{Otb8HxzD}lo^zh3KYo4r24DtHV@M*W;aUt4Q>RNdJ4LVo94cm+w<)0+=Aghrz=%*mzT073Zwd^`OL6dmNGuOACn!BOwc-8V2 zor+bc1m`M?$x>LA?DzB~n$8sd;ujVLKUBkbtmN#u>(;U@7RH5vz)Z-k8tBGd1!tSw zuz?PoF>nrD2JT@&!+iq}uxMZj%e*3iG4K!z1|Fec;4!iWo}kF5^QVJ?4j*^htZd{~ z);6tm3J+S@POh+0H`y0JK~Y`@-&=TrC(81fSCkt*9KzBq_pNJtRz1|)^w#rYQ)~ea@CIATnBni_&mS;j{{RA37Dg>J59Pl}WI#xsLi|ip<_*ZMt{_;uq-OdrJ zi(I;KfxT4%4e~!k69QH#?i8N*^`E#1#I*XszOer=cO$sOQG|?!ek7!2zgn)L?K||- zwE}#(&bh#LBEC;*$T>DY@BspFl6T~UkHh3Wf;gM@vf(I8N$Dqgl?EMGkPdashon*s zq-tpYpE(&ioTam44WJpu0;NNo#hf+)t-<)n^+|swxEsSbNAYEZRODXTLyd9u_3461 Lre0-A1QWjjl8Pe^ diff --git a/src/main/java/TaskType.class b/src/main/java/TaskType.class deleted file mode 100644 index 3c9a4274e35122b8e3a40d90926f5f1c1d2bf3ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 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 validCommands = List.of("todo", "deadline", "event"); if (!validCommands.contains(tokens[0])) { - throw new DukeException("Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); + throw new DukeException("commands.Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); } Parser.checkValidLength(tokens); diff --git a/src/main/java/duke/commands/CommandType.class b/src/main/java/duke/commands/CommandType.class new file mode 100644 index 0000000000000000000000000000000000000000..831d1dfe8a53d3ad377c88be051cb135dff4cc6a GIT binary patch literal 1174 zcmaJs`zz&QE6g<%I5RX(WtJu;og~!5dbHp^- z+!hf#95Vu+aKr^Z<(L(i=9m+h;g}crjAKFIF2|z4=PLFX)U08Yibj!P#yaY}byJl_ zz3zBNtyHeND7}B@rWrWJnFnT}#4tch!^|31zF;yaR^BFO*f1@#B)CzO?!vxh5i?)q zX;)o2$XffR%@BXxw@modsdd~I!(1ZSKT^pxj$DQztLnLhPW{krmYl;Hc~qIA_=X{s zuuhy)CslL2R4JGc9-gVxE>ErZ z)HA(KJ=3SyE)7+)8=YpweOVQ{qdf!P5W00NiECfhk;My!*nh7_M*=w=t60+!!?cbW zVdBEf3Nt6nyf6#GEMl7B*7anBQif2a*6>KiSR&ceMe*>&t+Yw%R_{P^HK)}|_k>*y z_wTIfy-j*(Q}mi6dodvmAS87XNuWg1D3N4JB&8BbtVGfaM5o0xD3gK+R&W~(cZe+! zicj;wJ|l2};74K%cgcq3UXbDwNM6MUq*ohJR=*&00p(_VKui(=nSUNZ`T=!yEq;#h zryI%dktcw4aBPt6iuy?+#rNSGl=6rgJO@8RL=sJrWIz%Xu-e+0yF<_TNJ_hY_*vF7vR(%ZHW$t6tE=S2VPC&j% a`wZ;5C5;*p^F5)C1L!uE!hP}uu=xkM@aj?k literal 0 HcmV?d00001 diff --git a/src/main/java/CommandType.java b/src/main/java/duke/commands/CommandType.java similarity index 80% rename from src/main/java/CommandType.java rename to src/main/java/duke/commands/CommandType.java index ebd6a855f2..8385cfbaf0 100644 --- a/src/main/java/CommandType.java +++ b/src/main/java/duke/commands/CommandType.java @@ -1,3 +1,5 @@ +package duke.commands; + public enum CommandType { ADDTODO, ADDEVENT, ADDDEADLINE, LIST, DELETE, DONE, NULL, EXIT } diff --git a/src/main/java/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java similarity index 75% rename from src/main/java/DeleteCommand.java rename to src/main/java/duke/commands/DeleteCommand.java index d7c3f6af1f..e530634b07 100755 --- a/src/main/java/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -1,5 +1,16 @@ +package duke.commands; + import java.io.IOException; +import duke.core.TaskList; +import duke.core.Ui; +import duke.core.Parser; + +import duke.errors.DukeException; +import duke.errors.DukeExceptionType; + +import duke.tasks.Task; + public class DeleteCommand extends Command { int index; @@ -27,7 +38,7 @@ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException taskList.removeFromList(task); ui.printDeletion(task, taskList); } catch (IndexOutOfBoundsException error3) { - ui.printOneLine(new DukeException("No such task",DukeExceptionType.MISSINGTASK).getMessage()); + ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); } } diff --git a/src/main/java/duke/commands/DoneCommand.class b/src/main/java/duke/commands/DoneCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..2c6bdda294577495f5b0048b009e97de8e365260 GIT binary patch literal 2464 zcmai0X?N2`6um>7$WfGLfdo=E0ZB;=i7AD!gi^9N!NsvDHlYb!P~?d%Y)eKOr%CsH z{{ihU;A_b#2?x$8-}{@oy^%~TifNCJ#?sTg`|i8*=8b;;>)~$z&f-TEI$mkVDV%PH zf^j*VQR&4w73VRb;DSn)R~1}T@LCj?+A)bK6)L7xjA2H_C=v>0qnK0Cjmy%QjN)}^ zztT$)G99>zH&n!NO+hw_oCLTo0T!h3hV)vHwl@_lGPGKDp06>mBtzQ;%eKTthRASo zWP$#sojhmgN?A5f*DA~0%^AyOvhNF^aVdXNBlNCozUB#i znd_D9~AMkU-v;lu0id zo^F(Bsq*U-gxh+aH(+g0q9jZy+?&s>41Ve9qW~fFOw1)Az#jw+-WjXO= zCPbrUSQh)gmbxA(w_c?Jip*rv35LB-YOY?*p*d8|9cED2flGHI@>Rq2xJv?>MQ)b- z?ULelK~R15H{CSErY9_*UmFb3ssu{fv=)8CP4*h?;QfBoX2lk;Qq!4SGM!7zC9YBJ z2I)L+Hl=i`Ntpj}l2W!8xR3=nNlbT9D+yd0i$%za$A#RL45a?ja}pw`&icHhEjK-B zAe^AJNaT@cMNsiMz93LtXAHY5Mv2;uZ5rZ+C5m+C3BwlDTwZFDSQ9jc7yNao39B3r z2<&iH7{l;f0Y)L^uvZF6_JYN{CzZMnVk6 z9-uWAIr#u>k^F^6P!{)YA^J<|5!A)rjtyvA=zQ!G=_90e@{#EMXr*xS7XyKrd=6~j z;P#7qe!7=1jR6XO2}>kNkjxa_frRNG`aMLupXloJ)e@txl2M!>wd3>w^fLLJCGS(1 zACSYoeE;=O{hT)0O@Q)*^uU literal 0 HcmV?d00001 diff --git a/src/main/java/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java similarity index 83% rename from src/main/java/DoneCommand.java rename to src/main/java/duke/commands/DoneCommand.java index e4ff9fdd01..3722ed11df 100755 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -1,6 +1,19 @@ +package duke.commands; + import java.io.IOException; import java.util.List; + +import duke.core.TaskList; +import duke.core.Ui; +import duke.core.Parser; + +import duke.errors.DukeException; +import duke.errors.DukeExceptionType; + +import duke.tasks.Task; + + public class DoneCommand extends Command{ int index; @@ -27,7 +40,7 @@ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException Task task = taskList.getTaskAt(index+1); boolean isDoneBefore = task.setDone(); if (isDoneBefore) { - throw new IllegalArgumentException("Task has already been done"); + throw new IllegalArgumentException("core.tasks.Task has already been done"); } taskList.setDoneInList(this.index+1); diff --git a/src/main/java/duke/commands/ExitCommand.class b/src/main/java/duke/commands/ExitCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..f9e1843176bf9668bca814d7520d5c48460c9fae GIT binary patch literal 556 zcmZ9J%TB^T6o&sPg>tEa0xIGS6B8uFZcQ*QL`+Cf7Z&5Tl!+OUmh@uau{2Q=7e0Uw zWjuu<)mfa(`OkdkHecT#p8$@rpGE?!DdbT|A&z1iYgkvXp`gT&I1!fcP8nj=!&?Tq zY4CN z3EOfNY$_;|bYuID$uC5ZG1nRkuW1j5hSfiMFrEw*3X%%8RBU5M#V&Rf?5U_A$xsSQ zPG7rP1Z61xjfE-a40jycakX=5`L`j4d{9smw${FmsQ;>jne@qs+Lc>(ZJnV!A2jSF z@}|L%F=zA45OuMquArrk9ASB96Mo5E*SP02S)6_*I1*^XNRmyFSD*TTT6+hpy+C?J z?3r|0AlYTa$Sy&qTLxKDGf;^L$O?HuG+uv$ygwh^SD_%PU{}Q+$}09zR&b!=5EX{vvgQ1? zqxq-|x!<*=+p-<)l1Ba+h#@N*YQoamw?6bwm!(qgaZ2NcI_++cp|o0bIf?I1 zlObU&_E}KWwNHIPrcP~Px(iq30t|(Jt*i}b=PoDW(uY8VO_wO+Y1vWLD@etC7aZD?)2doNypV{qoq5b;^^ZLGMFZ0GV&f C(uJD< literal 0 HcmV?d00001 diff --git a/src/main/java/ListCommand.java b/src/main/java/duke/commands/ListCommand.java similarity index 69% rename from src/main/java/ListCommand.java rename to src/main/java/duke/commands/ListCommand.java index 0e0a5ca18c..2684e7e865 100755 --- a/src/main/java/ListCommand.java +++ b/src/main/java/duke/commands/ListCommand.java @@ -1,5 +1,15 @@ +package duke.commands; + import java.io.IOException; + +import java.util.List; + +import duke.core.TaskList; +import duke.core.Ui; + +import duke.errors.DukeException; + public class ListCommand extends Command { public ListCommand(){ diff --git a/src/main/java/duke/commands/NullCommand.java b/src/main/java/duke/commands/NullCommand.java new file mode 100755 index 0000000000..8ec5f83ebb --- /dev/null +++ b/src/main/java/duke/commands/NullCommand.java @@ -0,0 +1,22 @@ +package duke.commands; + +import java.io.IOException; + +import duke.core.TaskList; +import duke.core.Ui; + +import duke.errors.DukeException; +import duke.errors.DukeExceptionType; + +public class NullCommand extends Command{ + + public NullCommand(){ + this.commandType = CommandType.NULL; + } + + @Override + public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + throw new DukeException("Invalid commands.Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); + } + +} diff --git a/src/main/java/duke/core/Parser.class b/src/main/java/duke/core/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..83d3923f985da87cb639e4d84289847d72c131e3 GIT binary patch literal 1830 zcma)7+g96F5Z%W%mXJjZB0wNbD$-nhAvmRJn$$^J0;JH|fyUG=O>eSvFbcBdN^(~6 zC(Tp))>rZpNVAf@_cQt(ZCB^W#u)GeUiP_c&6(M=XLS76e}B9Ma1%8JXD}nV+BRrmT^bMT^XOGkj1BBm>0u62@5h7 zB`gVV_Z5ueGa1VgRv41EZPyO(GQ>04Dnnwyvp7S#WV`%9t5M_rx>0io8E6`QKyyA* zdTcx~3Xb8{3zg8f-Fh)wvRd1`V0w*);aWjqp}iG*HxVc?59NQ{!w;paWjAtJ82~w3%qT>~><(vGzEl8!-1Sx-3Fj8?2=NXtT zp{(KoRwE$v$(@U0=`mF z#n%$PQL%w<$yMlC9)oOg!*WPM(v3giZm8lBz7xauDt-`rE*yxs;yAo+IP-qJ)gaTZ zJPg)Uci`ntyp_4e7rEwvc6L^sH2CrE^L!_1v1Os^*jGN895_wheVFO#W`1$W@<%vgx^@VY^h=|a(@OyeE8WyL2BCaw({-=*C-niNS!ZyO4GSB=19m1St`eiXb_^ z2Q}Icb@!)s2u$yg*H{!c2Zh#YNEn8O5lqo|38T1*)AUa>eBbv5{(UO+ZhW2o}oO_%24VUw|_}nXu z#qbw?@#$@DU;*EdD zYZXL9_5=J;;(NlhhzQ|*pXdE}&dGCr{QPzf;0f;PxPr|VnrOEOU6pi8!!=2+%Wy-( zwuW7XZOeNb6~S!8Ppz<=3#;JyJhyy`{<~AbP&*zlG@k`=ltjgIhI+Sm#Go9cAvKqW zQ6k*(%|v8ApTtyI@(LczN$rB`URq{>IE-Y|@QO6!Q*rNvpK;oDk|0j=D4C8#F-t=Y zH|Z!>`NJJF_ zOO!7YdyhIH;PF?m^Y8j+)IQ0t{soFM{s84wMOC7W1=WbE75zx-Ev#b`4YbMb4&{A3 w#3RZzER(QW$=`=bcm?WfjXI-00SXmCqpMh>tdJD2QB~HlLs_rxOTcXY0!~hjApigX literal 0 HcmV?d00001 diff --git a/src/main/java/duke/core/Storage.class b/src/main/java/duke/core/Storage.class new file mode 100644 index 0000000000000000000000000000000000000000..3e0ef8c975ae84239c38076305bfc8c449ccfa98 GIT binary patch literal 3783 zcmbVPZCD&v6@F*g-C34NAR9>81``%UL>oqA9P*<8qoVVmjKh9-@qmoa`r*S7(Hs?x>gV(^ zF&C8)lcD)=ybxm;_oEnb854eN6yjb?7GV%aMU#**RfrDgew4%TV;T>MFHPL;}xNuTTpYq{LehlHuqIt}R$Hn_AK0M*WlQN$2 zV+Tfkcv`%l5o(?l4Zmu{R}G%=;j6;pugQ2$#@A(hLxR$)>zdh>P%TTdB)E^q6Pkqe zeG}@88jc&`9`@TM_{8{r)gG4+NY5oyeJmWY&A2|sd2dHtkK3IR%4*k6*BzwdE+a<8 z#eH#I8%Rza)660DnApmlFw~fYTWagl3zK#{5#DW@>ReykvZ;Dq#8#t|{pxgPfq(Cb zs5WiK4c(G)T0&tYKBlX7(xkHb{8~EtV#!G@Y^&C!6&_;S-buwJ#*AjpnsHl;*oLW& zaeaBl`c+2M9hC7+2@QE?^C=e|mmD|DDb*GL4jE!o2{rk^S!0`wZ^`(!1b@Uxno&(C zV4N~GHjBVWC>qc#yI&JHS_<~yc?I`jH^p+}CMLQRbmCqK8=Z-jeo5G{JQ|6rf(c^H z83kwY9R=UTyn;{TGYVe7_as#2>K-uc9wVv8J`RS2paZgInuckGy9s#CTu~pRTyi*V40AK-@yUcryZm{p-uuz*(;{1~svIH%wzcwNCy@iPVI zg|%;BUd9ClZ(^Pi*kc&BWt-}Bzh;jcF{{{%w|uy$AcaK*m(WFAa@2QgYAiv1D!7b! zAFc?wC9260**l}@whwPBcn8l*D5wfoDY%Mj3f{%*B=eBbZ7BG;fXkOvC&A+^TjdKS zso=x;(+Yke(B6YzlE4S_N!^&$s{~i8Vw$Z*Z7p_hRm7O03(U2uxK%Z48v0nXf?we! zhS0GtYM2_cF+<}L2T~_P2aioqMb^(;vCz&eE12fJgE_%UN5tVuFQcJSEk#GyCN{BI z-YH!R=u)j<|Aq|Jvn51~$>XXupq-#KlsQC%baq5RkWiXU+?8deK#j3Btf(nzhuX#Z zO2_qlgd3Wh7CF8&-CSNn&#|t65|RJ7PeRI5VYAYF&mNRqf%pJx8K1F71UA8HkrCGZ&wjKU|Em&)1UYjbGEpUp%s_i||gkjN8 zk2Rf$lQ-M*FtaXiM*5g!gi;)~UhScznjoCA#n>4l&+_TXV=+ms4DF8W%O;PE--=@R zo`leH!pHR)gQsdb@6%!IQKKvtb29$O-TMq&sC!Wb`9Li@KQ}jQ}VHi?B*=u9p#rLNAMM(7x7vZX3LcvJGBHS0@d4n?&_OcC74hXWn6@}Q0GE{J; z2cP6kRp@z8%lY5+>F~$g%Ij_e{AAx7~6Tfti}D5 zszAYYl*;hR@Ri@BDwm8lb|J~s*Gma6wHD)3*vD@d`Y6(mfwTkC2xmPUzq*8t8N*Ba z8&W76Xu6C|60aaH^WzqYCu@0|`vQVNcM7+ru(|m)t^yw8Bk?KVvzgD`e2z2*-Iq`y zBr8R;1i^LX2vNQ6E}(JKu#7+<^ztiWvK2xDyk!)Ff4A`G3Jl+=El3%TpYCmZW)(ggHa1 zyuc8@!g##OfS>2sn+$u3I9?`_?@+TqKM3!2Y>=^0#^6T+_wve`e}aE52YSJ}Eb#j| z#(NxFGDorqyN?R~))1&mp}xP--7?^6b(19x=QvFD0@Uq)ew^=WcfqNL`Mz)42c0MQ z-q{qO*G*>;Drj{tU`tb=+3A+KMYp&q5O%s=PpiAkosJV7O#cYhSMcfJb7ToSMjE{> zi`d!bY4o%NTAX!-K~D;w7!G>QFQHn@H_8;*)#l9=@uqOcaL`MUnvX?V+vHpkIfXli zgEB?P^}8 load() throws DukeException, IOException { + public ArrayList load() throws DukeException, IOException { ArrayList taskList = new ArrayList<>(); try { Scanner sc = new Scanner(file); @@ -27,20 +42,20 @@ ArrayList load() throws DukeException, IOException { } - void overwriteStorage(ArrayList taskList) throws IOException{ + public void overwriteStorage(ArrayList taskList) throws IOException{ FileWriter fw = new FileWriter(this.file); for (Task task: taskList){ switch (task.getType()) { case TODO: fw.write(Task.getTaskID(task) + " / " + - "ToDo" + " / " + + "tasks.ToDo" + " / " + task.getStatusIcon() + " / " + task.getDescription() + System.lineSeparator()); break; case DEADLINE: fw.write(Task.getTaskID(task) + " / " + - "Deadline" + " / " + + "tasks.Deadline" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + ((Deadline) task).getTime() + @@ -48,7 +63,7 @@ void overwriteStorage(ArrayList taskList) throws IOException{ break; case EVENT: fw.write(Task.getTaskID(task) + " / " + - "Event" + " / " + + "tasks.Event" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + ((Event) task).getTime() + @@ -61,7 +76,7 @@ void overwriteStorage(ArrayList taskList) throws IOException{ } - private Task formatFileToTask(String line) throws DukeException{ + private Task formatFileToTask(String line) throws DukeException { String[] tokens = line.split(" / "); switch(tokens[1]){ case "ToDo": diff --git a/src/main/java/duke/core/TaskList.class b/src/main/java/duke/core/TaskList.class new file mode 100644 index 0000000000000000000000000000000000000000..6097ea0c52b6c965fae7ff9d925d261a14234026 GIT binary patch literal 1672 zcmaJ>Sx*yT6g|@p3@y`EksVQ7>7opZxD`-j(Q1{45{*7Nv?Cdoj+sss{U`nhA2iXL zXkvW!HyPu(Gb0onOw(__=bU@)ZGZm$`W?V^JWL`3L&IbeF&GJ?aY=^DvYkre3Z`Xs zRl_xzuP2ef4O!ikp{QX-!>ocX&una#?S`kIue@QtGL5EZZyEEhYrc`=qJl)lUay;8 z)3p?2qu$JvYt2o|5Tu5&%CR`dFs(-;@_L}9cnrmA;DMZRB9s)BL`8rDUApi-pR$FxflX^q3ZOMw%+8nK+J;r7M*+X>7^Rin()bB7;W+Ebb`RU4Ev%S(rr_uv zL)fe&ps((0*Y>R4qru3oDvF_T8Y=j#(m`R;_d%KD2NIOSmqlW=;TJ)(>osd<<;5Wi zOE|?}d4_)hF@9($Xo|l(235S}I>EDk3~(Ie?grv~3H0T^K*@hY?CBT8KSRwIKBMC! zFBA-M>|r taskList; diff --git a/src/main/java/duke/core/Ui.class b/src/main/java/duke/core/Ui.class new file mode 100644 index 0000000000000000000000000000000000000000..47e46d6b1c75407e720eafe2d09dd349a7d2881e GIT binary patch literal 2863 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 Uk2MD3#Bzh35T}_L?t2jV8*^Ht;Q#;t literal 0 HcmV?d00001 diff --git a/src/main/java/Deadline.java b/src/main/java/duke/tasks/Deadline.java similarity index 98% rename from src/main/java/Deadline.java rename to src/main/java/duke/tasks/Deadline.java index ea3019ca37..b8192d7058 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/duke/tasks/Deadline.java @@ -1,3 +1,5 @@ +package duke.tasks; + import java.lang.StringBuilder; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; diff --git a/src/main/java/duke/tasks/Event.class b/src/main/java/duke/tasks/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..c61a4a6a9fe736e4df7e2610b261f7981ea875a8 GIT binary patch literal 1776 zcma)7TT>cm7=Aukc5$;F0#ZX;BWhGY2sLeq!JMjMO@qV+sv*|Stgx{}1qw^1x$I2; zM0?pAZ`({gOf$_*?($dq4>FzF=UcE^p)+OSeZRwddfvnG=C9vg0hqy8Is%AwqaRnh z5yuB|HSNJQ9ar$7j*sxMJV|J{u3<)pjvF2%b&O$FZf<&TOT%rsyrWa@t_PoJn3KzS zNfsnYN%2Jup9&~;Y1b0)rk|S6%=nI3-il}KTB*D>E8r=bwv}`41I>FW98XsY=FURv ziel=`Qn_T`7MKjRTWLQDuhQ#$rAV)R=~CIsGGBRko#@^$u3k#m2T3x6S%?J?;q3YWPe*+p_E?gn>}FU5y~^N)xbvo~<-$ z1#7V+BheirS7llZT*iF^@8UfTX#>m17UDJ-Aq;AEm)veUG1*>Y8DrJGe^Cg&Tly-_%O}hU=z!f)b1FKjw z@CbPU5ftb@586NkVW}|8ny#ld*2n7`!SQ;?w3B3EYMeTGu=&&~(BxyOu`WqSk}t6# zk)38U$DIC4@g!fP{|Rl;L26qy0bhq=3HUp-ifjzuIlsB*Ro23tT1{ng)H+*a8J4_e z2P(EB)?InBV%qe|WX^PQ(5!!_TKp3*tu^b=-s+5_DoZA?cGmd(*JdqiebcbY1#9;I zcxbg@y94@mg=7{~nlpFm=hD=y*KGJP1excSN^~TUmyCc*ag@@Ej8$Q17 z25=F6N=TUir7mHd-bX1BK-V!36b=0v#+>gJ2o2qWrp7VR3g-`or%}BA5_jw_ z-@C=$@#|Pb>O1Ez(Vw3>z{Mzkhw%PPw@pk*^m08!WS5!6VWJBX)d-(aOcKO2{{?O_ z=s6DSeT4ClH;)iS0Wk;b1k__fS2av((3@W&fIl%p;CF@k7JYA-F(HS&1$>B{B5+53 zMVAak&?ulfhts5dr;rADcE?c#hP^)ZcMRlRkpuX%d4=qqY~D>am_5R!QzN~sF_0jZ O>+FOC%}jCMh3MZH+@8?@ literal 0 HcmV?d00001 diff --git a/src/main/java/Event.java b/src/main/java/duke/tasks/Event.java similarity index 98% rename from src/main/java/Event.java rename to src/main/java/duke/tasks/Event.java index 34522ca9a8..92b38162e2 100644 --- a/src/main/java/Event.java +++ b/src/main/java/duke/tasks/Event.java @@ -1,8 +1,13 @@ +package duke.tasks; + + import java.lang.StringBuilder; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.LocalDateTime; + + public class Event extends Task { private String time; diff --git a/src/main/java/duke/tasks/Task.class b/src/main/java/duke/tasks/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..74dbf046bf5ff2ff81cb5952486486ceb1d7e52c GIT binary patch literal 1202 zcmZ`&%Wl(96r3A7vEw>PF?~@e^a+VunnDY-qz@q~q)Gu6sgO#=!c9%(KH@5NkoXQZ zfY`I?f>!|{!3Xded;%PC##NSy)n%pZ1))G!45|8cH$up&>^AS! zyl{~%^8b<*9+Ba$ze$E%*{it^8haaVebw36WkuU^LrEjhn=kx_KSN93^CQ6`_6vUTElIDEO#!S^g<8)*a9*K{1#cD&=TOzNDu0vEa$z zSRl}OJmABPZMPbl7{EmnLo&=`!9+KDG%T99f;^3FIk{5}{!Yv}sXz79ukSfL%egjZ zwSL0bn77o{Yb)YAbq&-ZUP7JMSLMSQqc@HjWlqYRmZF(;@VL>(c#f-SB=`V1`wN6U zeu#vv971`|l0ZMB#fE^%m|=@7pB%rO$AxBt0cJr&(*6YX-O;vGRJ0iB9HZo#VV2Mw zp~@@hR`M;9R!VM4L|pNv9$aEYL&ChH@&6Li_GX8ZWQkU?eu9RNpi@XjWPO&F{0@Ch zu|FeSSyP#e%2#x>?v@lI7;O?QP?40{DW$%KVXHJnIZzLdw8p*+Q|AcX8Kp0mBi#x_ zmPU-<9!{Az^i_W}9KTaU7kx=GX~OL$gh`{qciaVUXIbdW%7+TeW)Q zsA)0C+nrkDjb$^eyq!~&Ja_!a4H@q1#ypI4I6QV4vJEeAo6%X%9krdFPZ>EbZoOwP z^u~#E?wGz43`~1G@`6Fdm`7Rl0&l!eqGl8w86Ad{?F|BF9F2%W)Okj!_Wi$Ar70#W zh|a1rY4&L#sy&QGefPD;wWj|~YL5%mu*BzI(C`d<3`;X6s-Xx|!vm~o$RejRP=Mw?8H!FQ*$l^qnxQOu=r(_5ZDvgBSGl8TvQUL6Iu} z$dicJlMW!a%G=-wq_B(?Fx;bPlRRJQ1ndihD~O*cq9-PsjL$^E7qNPS7vij%m&#v} zxPo*SFYrM?i0@yANE?vLyK9$7e!g@0L&^wv1O@A4uSLBhk$ly@L+a*b@e;}fQgNV4 xaj*~vS|Se8$sdFhC-fJ((gX{3H!(rlz5u(WQ;CH4ULrLDu1PoWm~sL({{Z)gv0nfH literal 0 HcmV?d00001 diff --git a/src/main/java/TaskType.java b/src/main/java/duke/tasks/TaskType.java similarity index 70% rename from src/main/java/TaskType.java rename to src/main/java/duke/tasks/TaskType.java index 619ae50099..610b363a85 100644 --- a/src/main/java/TaskType.java +++ b/src/main/java/duke/tasks/TaskType.java @@ -1,3 +1,5 @@ +package duke.tasks; + public enum TaskType { EVENT, TODO, DEADLINE } diff --git a/src/main/java/duke/tasks/ToDo.class b/src/main/java/duke/tasks/ToDo.class new file mode 100644 index 0000000000000000000000000000000000000000..2b2e477d1f0c8b3599a3a02489f06e210f8838b6 GIT binary patch literal 943 zcmZuvU2hUm5Iq+b7S`oMYAsZ(pwhywbSr+fLHl5di3!RBL__B5!TkPQB z(CoDho9Et?QNS$*mZD}Bc*%$(K}e0-VI$)lrZNsg^k1z?^T=qqGHxRw;|>xc?#j4_ z-GxHbCd0~nY4X%w4T!c-tCT9F@qdEMq9lsoPO`jNF1TMG42*u8A-`-QXB3*X$ffNV zE~)DdoyRS!&k&}2$#7b>IdDzxm}}{;=KdF!eXP3-drQFPM>^G@xMV^|(?&&UCjl=Q zp9)mW{{%vP3}0Dz zkW@~E_FKeNC0Q83|6GlU{P)Jg-u?crDm*&zpCC|IM+lA~y{8JE3DyQgI)?}?O!OjH zC&FnuZ_%wlWY;Jv!}Al82!Z`Tl6cTc%-HM@M@AX(*g4-<$aSwWqCKt)^b1!%Bf@c} OJ^813WY@{(!KFV-Nzo1f literal 0 HcmV?d00001 diff --git a/src/main/java/ToDo.java b/src/main/java/duke/tasks/ToDo.java similarity index 92% rename from src/main/java/ToDo.java rename to src/main/java/duke/tasks/ToDo.java index d1b99921b2..b650d571b8 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/duke/tasks/ToDo.java @@ -1,6 +1,8 @@ +package duke.tasks; + import java.lang.StringBuilder; -public class ToDo extends Task{ +public class ToDo extends Task { public ToDo(String description) { super(description); diff --git a/tutorials/gradleTutorial.md b/tutorials/gradleTutorial.md index 08292b118d..335012a526 100644 --- a/tutorials/gradleTutorial.md +++ b/tutorials/gradleTutorial.md @@ -36,7 +36,7 @@ As a developer, you write a _build file_ that describes the project. A build fil mainClassName = "seedu.duke.Duke" } ``` -1. To check if Gradle has been added to the project correctly, open a terminal window, navigate to the root directory of your project and run the command `gradlew run`. This should result in Gradle running the main method of your project. +1. To check if Gradle has been added to the project correctly, open a terminal window, navigate to the root directory of your project and run the command `./gradlew run`. This should result in Gradle running the main method of your project. :bulb: Simply run the command `gradlew {taskName}` in the terminal and Gradle will run the task! Here are some example commands: * `gradlew tasks` (or `gradlew tasks --all`): shows a list of tasks available From 291cd7c2fb02e8833227e9c749c08e1350dad56f Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Sat, 14 Sep 2019 19:05:26 +0800 Subject: [PATCH 27/46] Reimplement Level 8 Logic --- build.gradle | 39 ----- data/duke.txt | 4 +- .../duke/commands/AddDeadlineCommand.java | 20 +-- .../java/duke/commands/AddEventCommand.java | 22 +-- src/main/java/duke/commands/Command.java | 27 +--- src/main/java/duke/commands/DoneCommand.java | 2 +- src/main/java/duke/core/Parser.java | 139 +++++++++++++++++- src/main/java/duke/core/Storage.java | 6 +- src/main/java/duke/tasks/Deadline.java | 33 ----- src/main/java/duke/tasks/Event.java | 35 +---- 10 files changed, 164 insertions(+), 163 deletions(-) diff --git a/build.gradle b/build.gradle index 672fddf63c..8df27807c7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,51 +1,12 @@ plugins { id 'java' id 'application' -// id 'com.github.johnrengelman.shadow' version '5.1.0' -// id 'org.openjfx.javafxplugin' version '0.0.7' -// id 'checkstyle' } - - -// shadowJar { -// archiveBaseName = "duke" -// archiveVersion = "0.1.1" -// archiveClassifier = null -// archiveAppendix = null -// } - -// group 'seedu.duke' -// version '0.1.1' - -// repositories { -// mavenCentral() -// } - -// checkstyle { -// toolVersion = '8.23' -// } - -// javafx { -// version = "11.0.2" -// modules = [ 'javafx.controls', 'javafx.fxml' ] -// } - application { mainClassName = 'Duke' run { standardInput = System.in } } - - - - -// dependencies { -// testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' -// } - -// test { -// useJUnitPlatform(); -// } \ No newline at end of file diff --git a/data/duke.txt b/data/duke.txt index 8b13789179..89ece0df99 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1 +1,3 @@ - +1 / ToDo / ✓ / 1 +2 / Deadline / ✓ / 1 / 12th of DECEMBER 1212, 12:12pm +3 / Deadline / ✘ / 1 2 3 4 5 / 12th of DECEMBER 1212, 12:12pm diff --git a/src/main/java/duke/commands/AddDeadlineCommand.java b/src/main/java/duke/commands/AddDeadlineCommand.java index f94fb7d35c..d0bf0fad2a 100755 --- a/src/main/java/duke/commands/AddDeadlineCommand.java +++ b/src/main/java/duke/commands/AddDeadlineCommand.java @@ -1,7 +1,6 @@ package duke.commands; import java.io.IOException; -import java.util.Arrays; import duke.core.TaskList; @@ -14,24 +13,21 @@ public class AddDeadlineCommand extends Command { - String [] tokens; + private String description; + private String time; - public AddDeadlineCommand(String [] tokens) { - this.tokens = tokens; + public AddDeadlineCommand(String description, String time) { + this.description = description; + this.time = time; this.commandType = CommandType.ADDDEADLINE; } - public static AddDeadlineCommand addDeadlineIfValid(String [] tokens) { - if (!Arrays.asList(tokens).contains("/by")) { - throw new IllegalArgumentException("Missing deadline"); - } else { - return new AddDeadlineCommand(tokens); - } - } + + @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - Deadline task = Deadline.createDeadline(tokens); + Deadline task = new Deadline(this.description,this.time); taskList.addToList(task); ui.printInput(task, taskList); } diff --git a/src/main/java/duke/commands/AddEventCommand.java b/src/main/java/duke/commands/AddEventCommand.java index 1234791de5..c2d374d16c 100755 --- a/src/main/java/duke/commands/AddEventCommand.java +++ b/src/main/java/duke/commands/AddEventCommand.java @@ -1,7 +1,6 @@ package duke.commands; import java.io.IOException; -import java.util.Arrays; import duke.core.TaskList; @@ -13,28 +12,23 @@ public class AddEventCommand extends Command{ - String [] tokens; - public AddEventCommand(String [] tokens) { - this.tokens = tokens; - this.commandType = CommandType.ADDEVENT; - } - public static AddEventCommand addEventIfValid(String [] tokens) { - if (!Arrays.asList(tokens).contains("/at")) { - throw new IllegalArgumentException("Missing deadline"); - } else { - return new AddEventCommand(tokens); - } + private String description; + private String time; + + public AddEventCommand(String description, String time) { + this.description = description; + this.time = time; + this.commandType = CommandType.ADDEVENT; } public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - Event task = Event.createEvent(tokens); + Event task = new Event(this.description,this.time); taskList.addToList(task); ui.printInput(task, taskList); } - } diff --git a/src/main/java/duke/commands/Command.java b/src/main/java/duke/commands/Command.java index 89b75ea888..5abbec5287 100755 --- a/src/main/java/duke/commands/Command.java +++ b/src/main/java/duke/commands/Command.java @@ -1,12 +1,8 @@ package duke.commands; import java.io.IOException; -import java.util.List; - import duke.errors.DukeException; -import duke.errors.DukeExceptionType; -import duke.core.Parser; import duke.core.TaskList; import duke.core.Ui; @@ -17,26 +13,9 @@ public CommandType getCommandType() { return commandType; } - public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException ; - - public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { - List validCommands = List.of("todo", "deadline", "event"); - - if (!validCommands.contains(tokens[0])) { - throw new DukeException("commands.Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); - } - Parser.checkValidLength(tokens); - - if (tokens[0].equals("todo")) { - return new AddToDoCommand(tokens); - } else if (tokens[0].equals("deadline")) { - return AddDeadlineCommand.addDeadlineIfValid(tokens); - } else if (tokens[0].equals("event")) { - return AddEventCommand.addEventIfValid(tokens); - } else { - return new NullCommand(); - } - } + public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException; + } + diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index 3722ed11df..74be93dbdf 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -40,7 +40,7 @@ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException Task task = taskList.getTaskAt(index+1); boolean isDoneBefore = task.setDone(); if (isDoneBefore) { - throw new IllegalArgumentException("core.tasks.Task has already been done"); + throw new IllegalArgumentException("Task has already been done"); } taskList.setDoneInList(this.index+1); diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index 760c7a9204..08b0747f7b 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -5,24 +5,40 @@ import duke.commands.ListCommand; import duke.commands.DoneCommand; import duke.commands.DeleteCommand; +import duke.commands.NullCommand; +import duke.commands.AddToDoCommand; +import duke.commands.AddDeadlineCommand; +import duke.commands.AddEventCommand; import duke.errors.DukeException; +import duke.errors.DukeExceptionType; import java.util.List; +import java.lang.StringBuilder; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.LocalDateTime; +import java.util.Arrays; public class Parser { + + private static String[] responses = new String[]{"/by","/at"}; + public static Command parse(String input) throws DukeException, IllegalArgumentException { String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { return new ExitCommand(); } else if (tokens[0].equals("list")) { return new ListCommand(); - } else if (tokens[0].equals("done")) { + } + checkValidLength(tokens); + + if (tokens[0].equals("done")) { return DoneCommand.createDoneIfValid(tokens); } else if (tokens[0].equals("delete")) { return DeleteCommand.createDeleteIfValid(tokens); } else { - return Command.createAddCommandIfValid(tokens); + return Parser.createAddCommandIfValid(tokens); } } @@ -35,6 +51,125 @@ public static void checkValidLength(String[] tokens) throws IllegalArgumentExcep throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); } } + + + public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { + List validCommands = List.of("todo", "deadline", "event"); + + if (!validCommands.contains(tokens[0])) { + throw new DukeException("Command doesn't exist", DukeExceptionType.INVALIDCOMMAND); + } + if (tokens[0].equals("todo")) { + return new AddToDoCommand(tokens); + } else if (tokens[0].equals("deadline")) { + return createDateCommandIfValid(tokens,0); + } else if (tokens[0].equals("event")) { + return createDateCommandIfValid(tokens,1); + } else { + return new NullCommand(); + } + } + + + public static String parseDateTime(String dateTimeString) throws DukeException { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); + LocalDateTime dateAndTime = LocalDateTime.parse(dateTimeString, formatter); + + + int year = dateAndTime.getYear(); + String month = dateAndTime.getMonth().toString(); + int day = dateAndTime.getDayOfMonth(); + int hour = dateAndTime.getHour(); + int minute = dateAndTime.getMinute(); + + StringBuffer dateTime = new StringBuffer(); + + dateTime.append(getIntegerOrdinal(day)); + dateTime.append(" of "); + dateTime.append(month); + dateTime.append(" "); + dateTime.append(year); + dateTime.append(", "); + dateTime.append((hour > 12 ? hour - 12 : hour == 0 ? 12 : hour)); + if (minute != 0) { + dateTime.append(":"); + dateTime.append(minute); + } + if (hour < 12) { + dateTime.append("am"); + } else { + dateTime.append("pm"); + } + + return dateTime.toString(); + } catch (DateTimeParseException exception) { + //put it as general mistake first + throw new DukeException(dateTimeString + " is not in valid dd/MM/yyyy HHmm format.", + DukeExceptionType.GENERALMISTAKE); + } + } + + private static String getIntegerOrdinal(int integer) { + int remainderHundred = integer % 100; + if (remainderHundred > 9 && remainderHundred < 21) { + return integer + "th"; + } else { + int remainderTen = integer % 10; + switch (remainderTen) { + case 1: + return integer + "st"; + case 2: + return integer + "nd"; + case 3: + return integer + "rd"; + default: + return integer + "th"; + } + } + } + + + public static Command createDateCommandIfValid(String [] tokens, int mode) throws DukeException { + List lst = Arrays.asList(tokens); + String key = responses[mode]; + if (!lst.contains(key)) { + throw new IllegalArgumentException("Missing deadline"); + } + + int index = lst.indexOf(key); + int argLength = tokens.length - index - 1; + + if (argLength == 2) { + String dateTimeString = tokens[index+1] + " " + tokens[index+2]; + String correctDate = Parser.parseDateTime(dateTimeString); + StringBuilder builder = new StringBuilder(); + for (int i = 1; i < index ; i++) { + String curr = tokens[i]; + builder.append(curr); + if (i==index-1) { + break; + } + builder.append(" "); + } + return createDateCommand(mode,builder,correctDate); + } else { + throw new DukeException("Please input a date in dd/MM/yyyy HHmm format.", + DukeExceptionType.GENERALMISTAKE); + } + + } + + public static Command createDateCommand(int mode,StringBuilder builder, String correctDate) { + if (mode==0) { + return new AddDeadlineCommand(builder.toString(),correctDate); + } else { + return new AddEventCommand(builder.toString(),correctDate); + } + } + + + } diff --git a/src/main/java/duke/core/Storage.java b/src/main/java/duke/core/Storage.java index 2f131b47da..42355dc29e 100644 --- a/src/main/java/duke/core/Storage.java +++ b/src/main/java/duke/core/Storage.java @@ -48,14 +48,14 @@ public void overwriteStorage(ArrayList taskList) throws IOException{ switch (task.getType()) { case TODO: fw.write(Task.getTaskID(task) + " / " + - "tasks.ToDo" + " / " + + "ToDo" + " / " + task.getStatusIcon() + " / " + task.getDescription() + System.lineSeparator()); break; case DEADLINE: fw.write(Task.getTaskID(task) + " / " + - "tasks.Deadline" + " / " + + "Deadline" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + ((Deadline) task).getTime() + @@ -63,7 +63,7 @@ public void overwriteStorage(ArrayList taskList) throws IOException{ break; case EVENT: fw.write(Task.getTaskID(task) + " / " + - "tasks.Event" + " / " + + "Event" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + ((Event) task).getTime() + diff --git a/src/main/java/duke/tasks/Deadline.java b/src/main/java/duke/tasks/Deadline.java index b8192d7058..bbde33d850 100644 --- a/src/main/java/duke/tasks/Deadline.java +++ b/src/main/java/duke/tasks/Deadline.java @@ -1,50 +1,17 @@ package duke.tasks; -import java.lang.StringBuilder; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.time.LocalDateTime; - public class Deadline extends Task { private String time; - private LocalDateTime dateTime; - public Deadline(String description, String time) { super(description); this.time = time; this.type = TaskType.DEADLINE; - DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); - try { - this.dateTime = LocalDateTime.parse(time, f); - } catch (DateTimeParseException e) { - } } - - - public static Deadline createDeadline(String [] tokens) { - StringBuilder description = new StringBuilder(); - StringBuilder time = new StringBuilder(); - StringBuilder builder = description; - boolean isDescription = true; - for (int i = 1; i < tokens.length - 1 ; i++) { - String curr = tokens[i]; - if (curr.equals("/by")) { - isDescription = !isDescription; - builder = time; - } else { - builder.append(tokens[i]); - builder.append(" "); - } - } - builder.append(tokens[tokens.length-1]); - return new Deadline(description.toString(),time.toString()); - } - public String getTime() { return this.time; } diff --git a/src/main/java/duke/tasks/Event.java b/src/main/java/duke/tasks/Event.java index 92b38162e2..c251288af3 100644 --- a/src/main/java/duke/tasks/Event.java +++ b/src/main/java/duke/tasks/Event.java @@ -1,48 +1,15 @@ package duke.tasks; - -import java.lang.StringBuilder; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.time.LocalDateTime; - - - public class Event extends Task { private String time; - private LocalDateTime dateTime; + public Event(String description, String time) { super(description); this.time = time; this.type = TaskType.EVENT; - DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); - try { - this.dateTime = LocalDateTime.parse(time, f); - } catch (DateTimeParseException e) { - } - } - - public static Event createEvent(String [] tokens) { - StringBuilder description = new StringBuilder(); - StringBuilder time = new StringBuilder(); - StringBuilder builder = description; - boolean isDescription = true; - for (int i = 1; i < tokens.length - 1 ; i++) { - String curr = tokens[i]; - if (curr.equals("/at")) { - isDescription = !isDescription; - builder = time; - } else { - - builder.append(tokens[i]); - builder.append(" "); - } - } - builder.append(tokens[tokens.length-1]); - return new Event(description.toString(),time.toString()); } public String getTime() { From 1da67cbffc8d158063a6c37e79c21d72722be392 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 16 Sep 2019 02:37:46 +0800 Subject: [PATCH 28/46] JUnit Testing for Parser only --- build.gradle | 12 +++ data/duke.txt | 3 - src/main/java/Duke.java | 2 +- .../java/duke/commands/AddToDoCommand.java | 2 +- .../java/duke/commands/DeleteCommand.java | 6 +- src/main/java/duke/commands/DoneCommand.java | 5 +- src/main/java/duke/core/Parser.java | 35 +++---- src/main/java/duke/core/Storage.java | 2 - src/main/java/duke/core/TaskList.java | 4 +- src/test/java/duke/core/ParserTest.java | 93 +++++++++++++++++++ 10 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 src/test/java/duke/core/ParserTest.java diff --git a/build.gradle b/build.gradle index 8df27807c7..4db30d2203 100644 --- a/build.gradle +++ b/build.gradle @@ -10,3 +10,15 @@ application { standardInput = System.in } } + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' +} + +test { + useJUnitPlatform(); +} \ No newline at end of file diff --git a/data/duke.txt b/data/duke.txt index 89ece0df99..e69de29bb2 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,3 +0,0 @@ -1 / ToDo / ✓ / 1 -2 / Deadline / ✓ / 1 / 12th of DECEMBER 1212, 12:12pm -3 / Deadline / ✘ / 1 2 3 4 5 / 12th of DECEMBER 1212, 12:12pm diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2701d81ad5..b1f74ea3fd 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -29,7 +29,7 @@ public void run() throws IOException { while (ui.hasInputs()) { try { String input = ui.readCommand(); - Command command = Parser.parse(input); + Command command = Parser.parseCommand(input); command.execute(taskList, this.ui); if (command.getCommandType().equals(CommandType.EXIT)) { break; diff --git a/src/main/java/duke/commands/AddToDoCommand.java b/src/main/java/duke/commands/AddToDoCommand.java index 6574511d9b..2ff67030ee 100755 --- a/src/main/java/duke/commands/AddToDoCommand.java +++ b/src/main/java/duke/commands/AddToDoCommand.java @@ -11,7 +11,7 @@ public class AddToDoCommand extends Command{ - String [] tokens; + private String [] tokens; public AddToDoCommand(String [] tokens) { this.tokens = tokens; diff --git a/src/main/java/duke/commands/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java index e530634b07..5ba39fd843 100755 --- a/src/main/java/duke/commands/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -13,16 +13,15 @@ public class DeleteCommand extends Command { - int index; + private int index; - public DeleteCommand(int index){ + private DeleteCommand(int index){ this.commandType = CommandType.DELETE; this.index = index; } public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeException { try { - Parser.checkValidLength(tokens); int index = Integer.parseInt(tokens[1])-1; return new DeleteCommand(index); } catch (NumberFormatException error) { @@ -31,7 +30,6 @@ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeExc } @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { try { Task task = taskList.getTaskAt(index+1); diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index 74be93dbdf..247ff59a5f 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -16,16 +16,15 @@ public class DoneCommand extends Command{ - int index; + private int index; - public DoneCommand(int index){ + private DoneCommand(int index){ this.commandType = CommandType.DONE; this.index = index; } public static DoneCommand createDoneIfValid(String [] tokens) throws DukeException { try { - Parser.checkValidLength(tokens); int index = Integer.parseInt(tokens[1])-1; return new DoneCommand(index); } catch (NumberFormatException error) { diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index 08b0747f7b..5f9956474c 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -24,7 +24,7 @@ public class Parser { private static String[] responses = new String[]{"/by","/at"}; - public static Command parse(String input) throws DukeException, IllegalArgumentException { + public static Command parseCommand(String input) throws DukeException, IllegalArgumentException { String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { return new ExitCommand(); @@ -42,7 +42,7 @@ public static Command parse(String input) throws DukeException, IllegalArgumentE } } - public static void checkValidLength(String[] tokens) throws IllegalArgumentException { + private static void checkValidLength(String[] tokens) throws IllegalArgumentException { List group1 = List.of("todo", "deadline", "event"); List group2 = List.of("done", "delete"); if (tokens.length == 1 && group1.contains(tokens[0])) { @@ -53,7 +53,7 @@ public static void checkValidLength(String[] tokens) throws IllegalArgumentExcep } - public static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { + private static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); if (!validCommands.contains(tokens[0])) { @@ -83,9 +83,9 @@ public static String parseDateTime(String dateTimeString) throws DukeException { int hour = dateAndTime.getHour(); int minute = dateAndTime.getMinute(); - StringBuffer dateTime = new StringBuffer(); + StringBuilder dateTime = new StringBuilder(); - dateTime.append(getIntegerOrdinal(day)); + dateTime.append(getFormattedDay(day)); dateTime.append(" of "); dateTime.append(month); dateTime.append(" "); @@ -104,33 +104,32 @@ public static String parseDateTime(String dateTimeString) throws DukeException { return dateTime.toString(); } catch (DateTimeParseException exception) { - //put it as general mistake first throw new DukeException(dateTimeString + " is not in valid dd/MM/yyyy HHmm format.", DukeExceptionType.GENERALMISTAKE); } } - private static String getIntegerOrdinal(int integer) { - int remainderHundred = integer % 100; + private static String getFormattedDay(int day) { + int remainderHundred = day % 100; if (remainderHundred > 9 && remainderHundred < 21) { - return integer + "th"; + return day + "th"; } else { - int remainderTen = integer % 10; + int remainderTen = day % 10; switch (remainderTen) { case 1: - return integer + "st"; + return day + "st"; case 2: - return integer + "nd"; + return day + "nd"; case 3: - return integer + "rd"; + return day + "rd"; default: - return integer + "th"; + return day + "th"; } } } - public static Command createDateCommandIfValid(String [] tokens, int mode) throws DukeException { + private static Command createDateCommandIfValid(String[] tokens, int mode) throws DukeException { List lst = Arrays.asList(tokens); String key = responses[mode]; if (!lst.contains(key)) { @@ -144,6 +143,10 @@ public static Command createDateCommandIfValid(String [] tokens, int mode) throw String dateTimeString = tokens[index+1] + " " + tokens[index+2]; String correctDate = Parser.parseDateTime(dateTimeString); StringBuilder builder = new StringBuilder(); + if (index -1 <=0) { + throw new DukeException("Please input task description", + DukeExceptionType.GENERALMISTAKE); + } for (int i = 1; i < index ; i++) { String curr = tokens[i]; builder.append(curr); @@ -160,7 +163,7 @@ public static Command createDateCommandIfValid(String [] tokens, int mode) throw } - public static Command createDateCommand(int mode,StringBuilder builder, String correctDate) { + private static Command createDateCommand(int mode, StringBuilder builder, String correctDate) { if (mode==0) { return new AddDeadlineCommand(builder.toString(),correctDate); } else { diff --git a/src/main/java/duke/core/Storage.java b/src/main/java/duke/core/Storage.java index 42355dc29e..d0fa4f4ae5 100644 --- a/src/main/java/duke/core/Storage.java +++ b/src/main/java/duke/core/Storage.java @@ -20,10 +20,8 @@ public class Storage{ private File file; - private String filePath; public Storage(String filePath){ - this.filePath = filePath; this.file = new File(filePath); } diff --git a/src/main/java/duke/core/TaskList.java b/src/main/java/duke/core/TaskList.java index 9cd1ea0495..70c10e4a19 100644 --- a/src/main/java/duke/core/TaskList.java +++ b/src/main/java/duke/core/TaskList.java @@ -9,7 +9,7 @@ public class TaskList { private ArrayList taskList; - protected Storage storage; + private Storage storage; public TaskList(Storage storage){ this.taskList = new ArrayList<>(); @@ -47,7 +47,7 @@ public void setDoneInList(int index) throws IOException { this.storage.overwriteStorage(taskList); } - public int getSize(){ + int getSize(){ return this.taskList.size(); } diff --git a/src/test/java/duke/core/ParserTest.java b/src/test/java/duke/core/ParserTest.java new file mode 100644 index 0000000000..4f7c264dba --- /dev/null +++ b/src/test/java/duke/core/ParserTest.java @@ -0,0 +1,93 @@ +package duke.core; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import duke.core.Parser; +import duke.errors.DukeException; + +import duke.commands.Command; +import duke.commands.ExitCommand; +import duke.commands.ListCommand; +import duke.commands.DoneCommand; +import duke.commands.DeleteCommand; +import duke.commands.NullCommand; +import duke.commands.AddToDoCommand; +import duke.commands.AddDeadlineCommand; +import duke.commands.AddEventCommand; + + +class ParserTest { + + @Test + void parseDateTime_validInput_success() { + try { + assertEquals("2nd of DECEMBER 1212, 12pm", + Parser.parseDateTime("02/12/1212 1200")); + assertEquals("12th of DECEMBER 1212, 12:13am", + Parser.parseDateTime("12/12/1212 0013")); + assertEquals("23rd of FEBRUARY 2019, 11:12pm", + Parser.parseDateTime("23/02/2019 2312")); + assertEquals("1st of FEBRUARY 2019, 12am", + Parser.parseDateTime("01/02/2019 0000")); + } catch (DukeException e) { + fail("Should not have thrown exception"); + } + } + + @Test + public void parseDateTime_invalidInput_exceptionThrown() { + assertThrows(DukeException.class, () -> Parser.parseDateTime("1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12/12/1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12pm")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("Hello")); + } + + @Test + public void parseDateTime_validLookingInvalidNumbers_exceptionThrown() { + assertThrows(DukeException.class, () -> Parser.parseDateTime("0/12/1212 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("-1/12/1212 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("/12/1212 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("99/12/1212 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12/13/1212 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12/12/999 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12/12/0 1212")); + assertThrows(DukeException.class, () -> Parser.parseDateTime("12/12/0 00")); + } + + + + @Test + public void parseCommand_missingParameter_exceptionThrown() { + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("todo ")); + + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("deadline ")); + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("deadline task")); + assertThrows(DukeException.class, () -> Parser.parseCommand("deadline /by time")); + + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("event ")); + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("event task ")); + assertThrows(DukeException.class, () -> Parser.parseCommand("event /at time")); + + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("done ")); + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("delete ")); + } + + + @Test + public void parseCommand_extraArgumentForNoArgumentCommands_success() { + try { + assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); + assertTrue(Parser.parseCommand("list a") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye a") instanceof ExitCommand); + } catch (DukeException ex) { + fail("Should return a command ignoring the extra arguments"); + } + } + +} \ No newline at end of file From 52b843d7362f9ac04281e9fab7077dcf77fb706c Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 16 Sep 2019 13:29:33 +0800 Subject: [PATCH 29/46] Wrote JavaDoc --- build.gradle | 23 +++++- data/duke.txt | 1 + src/main/java/Duke.java | 27 +++++-- .../duke/commands/AddDeadlineCommand.java | 34 +++++--- .../java/duke/commands/AddEventCommand.java | 33 ++++++-- .../java/duke/commands/AddToDoCommand.java | 20 ++++- src/main/java/duke/commands/Command.java | 32 ++++++++ src/main/java/duke/commands/CommandType.java | 3 + .../java/duke/commands/DeleteCommand.java | 24 +++++- src/main/java/duke/commands/DoneCommand.java | 29 ++++++- src/main/java/duke/commands/ExitCommand.java | 13 ++++ src/main/java/duke/commands/ListCommand.java | 16 +++- src/main/java/duke/commands/NullCommand.java | 15 +++- src/main/java/duke/core/Parser.java | 35 ++++++++- src/main/java/duke/core/Storage.java | 37 +++++++-- src/main/java/duke/core/TaskList.java | 65 +++++++++++++++- src/main/java/duke/core/Ui.java | 77 ++++++++++++++++--- src/main/java/duke/errors/DukeException.java | 8 +- .../java/duke/errors/DukeExceptionType.java | 4 + src/main/java/duke/tasks/Deadline.java | 34 ++++++-- src/main/java/duke/tasks/Event.java | 35 +++++++-- src/main/java/duke/tasks/Task.java | 56 +++++++++++++- src/main/java/duke/tasks/TaskType.java | 4 +- src/main/java/duke/tasks/ToDo.java | 24 ++++++ src/test/java/duke/core/TaskListTest.java | 40 ++++++++++ 25 files changed, 610 insertions(+), 79 deletions(-) create mode 100644 src/test/java/duke/core/TaskListTest.java diff --git a/build.gradle b/build.gradle index 4db30d2203..0683419b1e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,24 @@ plugins { id 'java' id 'application' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + + + + +shadowJar { + archiveBaseName = "duke" + archiveVersion = "0.1.0" + archiveClassifier = null + archiveAppendix = null +} + +group 'seedu.duke' +version '0.1.0' + +repositories { + mavenCentral() } @@ -11,9 +29,6 @@ application { } } -repositories { - mavenCentral() -} dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' @@ -21,4 +36,4 @@ dependencies { test { useJUnitPlatform(); -} \ No newline at end of file +} diff --git a/data/duke.txt b/data/duke.txt index e69de29bb2..bfafa4f3ed 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1 @@ +1 / ToDo / ✘ / 1 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b1f74ea3fd..4368fe9881 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -11,20 +11,32 @@ import java.io.IOException; + +/** + * The driver class to run user interface of Duke + */ public class Duke { private Ui ui; private TaskList taskList; - private Storage storage; - public Duke(String filePath) throws DukeException, IOException { + /** + * constructor which initialises tasklist + * @throws DukeException if storage cannot be loaded + */ + private Duke(String filePath) throws DukeException, IOException { this.ui = new Ui(); - this.storage = new Storage(filePath); - this.taskList = new TaskList(this.storage.load(), this.storage); + Storage storage = new Storage(filePath); + this.taskList = new TaskList(storage.load(), storage); Task.setTaskList(taskList); } - public void run() throws IOException { + /** + * run method which contains the logic of the application. It takes in user input + * and parses the command. The command is executed accordingly + * based on their type. + */ + private void run() throws IOException { ui.printWelcomeMessage(); while (ui.hasInputs()) { try { @@ -40,6 +52,11 @@ public void run() throws IOException { } } + /** + * Main method to drive the application + * @param args Placeholder + * @throws DukeException for any exceptions that arise when running the application + */ public static void main(String[] args) throws DukeException, IOException { new Duke("/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt") .run(); diff --git a/src/main/java/duke/commands/AddDeadlineCommand.java b/src/main/java/duke/commands/AddDeadlineCommand.java index d0bf0fad2a..04b7e9469e 100755 --- a/src/main/java/duke/commands/AddDeadlineCommand.java +++ b/src/main/java/duke/commands/AddDeadlineCommand.java @@ -10,26 +10,40 @@ import duke.tasks.Deadline; -public class AddDeadlineCommand extends Command { +/** + * Represents a command which contains an execute method that adds a deadline task to the task list. + * The AddDeadlineCommand object requires the parameters of the task that is to be + * added to the list. + */ +public class AddDeadlineCommand extends Command { private String description; - private String time; - - public AddDeadlineCommand(String description, String time) { + private String date; + + /** + * Initialises the add command which contains the parameters of the task to be created + * @param description deadline description + * @param date date description + */ + public AddDeadlineCommand(String description, String date) { this.description = description; - this.time = time; + this.date = date; this.commandType = CommandType.ADDDEADLINE; } - - - + /** + * Adds the deadline task to the task list and prints the result. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @throws IOException Thrown when the new task cannot be added to the file. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - Deadline task = new Deadline(this.description,this.time); + Deadline task = new Deadline(this.description,this.date); taskList.addToList(task); - ui.printInput(task, taskList); + ui.printAddMessage(task, taskList); } diff --git a/src/main/java/duke/commands/AddEventCommand.java b/src/main/java/duke/commands/AddEventCommand.java index c2d374d16c..70f7fd4fe0 100755 --- a/src/main/java/duke/commands/AddEventCommand.java +++ b/src/main/java/duke/commands/AddEventCommand.java @@ -10,24 +10,41 @@ import duke.tasks.Event; -public class AddEventCommand extends Command{ - +/** + * Represents a command which contains an execute method that adds a event task to the task list. + * The AddEventCommand object requires the parameters of the task that is to be + * added to the list. + */ +public class AddEventCommand extends Command{ private String description; - private String time; + private String date; - public AddEventCommand(String description, String time) { + + /** + * Initialises the add command which contains the parameters of the task to be created + * Constructor to creating a command for adding an event task + * @param description event description + * @param date date description + */ + public AddEventCommand(String description, String date) { this.description = description; - this.time = time; + this.date = date; this.commandType = CommandType.ADDEVENT; } - + /** + * Adds the event task to the task list and prints the result. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @throws IOException Thrown when the new task cannot be added to the file. + */ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - Event task = new Event(this.description,this.time); + Event task = new Event(this.description,this.date); taskList.addToList(task); - ui.printInput(task, taskList); + ui.printAddMessage(task, taskList); } diff --git a/src/main/java/duke/commands/AddToDoCommand.java b/src/main/java/duke/commands/AddToDoCommand.java index 2ff67030ee..babbf9018e 100755 --- a/src/main/java/duke/commands/AddToDoCommand.java +++ b/src/main/java/duke/commands/AddToDoCommand.java @@ -9,21 +9,39 @@ import duke.tasks.ToDo; + +/** + * Represents a command which contains an execute method that adds a to-do task to the task list. + * The AddToDoCommand object requires the parameters of the task that is to be + * added to the list. + */ public class AddToDoCommand extends Command{ private String [] tokens; + /** + * Initialises the add command which contains the parameters of the task to be created + * @param tokens user input split by space, required for creating a to-do task + */ + public AddToDoCommand(String [] tokens) { this.tokens = tokens; this.commandType = CommandType.ADDTODO; } + /** + * Adds the to-do task to the task list and prints the result. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @throws IOException Thrown when the new task cannot be added to the file. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { ToDo task = ToDo.createToDo(tokens); taskList.addToList(task); - ui.printInput(task, taskList); + ui.printAddMessage(task, taskList); } } diff --git a/src/main/java/duke/commands/Command.java b/src/main/java/duke/commands/Command.java index 5abbec5287..046c25ae51 100755 --- a/src/main/java/duke/commands/Command.java +++ b/src/main/java/duke/commands/Command.java @@ -6,13 +6,45 @@ import duke.core.TaskList; import duke.core.Ui; +/** + * abstract class Command that represents an action by the user + */ + +/** + * Base class for the other commands. Specifies the abstract method that is required to be implemented + * by the children commands. + */ public abstract class Command { CommandType commandType; + + + + /** + * getter for type of command + * @return type of command + */ public CommandType getCommandType() { return commandType; } + + /** + * Executes what the command is suppose to do. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @param storage The main storage of the application. + * @throws DukeException Occurs when parts of the command cannot be executed. + */ + + + /** + * + * @param taskList list containing current tasks + * @param ui user interface + * @throws DukeException throws exception with error message in case anything goes wrong + */ public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException; } diff --git a/src/main/java/duke/commands/CommandType.java b/src/main/java/duke/commands/CommandType.java index 8385cfbaf0..6fc3b8580c 100644 --- a/src/main/java/duke/commands/CommandType.java +++ b/src/main/java/duke/commands/CommandType.java @@ -1,5 +1,8 @@ package duke.commands; +/** + * Represents the different command types + */ public enum CommandType { ADDTODO, ADDEVENT, ADDDEADLINE, LIST, DELETE, DONE, NULL, EXIT } diff --git a/src/main/java/duke/commands/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java index 5ba39fd843..4158896c39 100755 --- a/src/main/java/duke/commands/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -4,22 +4,37 @@ import duke.core.TaskList; import duke.core.Ui; -import duke.core.Parser; import duke.errors.DukeException; import duke.errors.DukeExceptionType; import duke.tasks.Task; +/** + * Represents a command which contains an execute method that deletes a task to the task list. + * The DeleteCommand object requires the task number of the task in the list that is to be + * deleted from the list. + */ + public class DeleteCommand extends Command { private int index; + + /** + * Initialises the command which contains the index of the task to be deleted + * @param index the index of the task to be deleted + */ private DeleteCommand(int index){ this.commandType = CommandType.DELETE; this.index = index; } + /** + * Service for creating a delete command that checks for number formatting errors + * @param tokens user input split by space, required for creating a delete command + * @throws DukeException Thrown when the parameters does not specify the index of the task + */ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeException { try { int index = Integer.parseInt(tokens[1])-1; @@ -29,6 +44,13 @@ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeExc } } + /** + * Deletes the specified task from the task list and prints the result. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @throws IOException Thrown when the task cannot be removed from the file. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { try { diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index 247ff59a5f..ffacc02ddd 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -6,7 +6,6 @@ import duke.core.TaskList; import duke.core.Ui; -import duke.core.Parser; import duke.errors.DukeException; import duke.errors.DukeExceptionType; @@ -14,15 +13,35 @@ import duke.tasks.Task; +/** + * Represents a command which contains an execute method that marks a task in the task list as done. + * The DoneCommand object requires the task number of the task that is to be marked in the list. + */ public class DoneCommand extends Command{ private int index; + /** + * Constructor for creating a done command + * @param index The index of the task that is going to be marked done + */ + + /** + * Initialises the command which contains the index of the task + * to be marked as done + * @param index the index of the task to be deleted + */ private DoneCommand(int index){ this.commandType = CommandType.DONE; this.index = index; } + + /** + * Service for creating a done command that checks for number formatting errors + * @param tokens user input split by space, required for creating a done command + * @throws DukeException Thrown when the parameters does not specify the index of the task + */ public static DoneCommand createDoneIfValid(String [] tokens) throws DukeException { try { int index = Integer.parseInt(tokens[1])-1; @@ -32,7 +51,12 @@ public static DoneCommand createDoneIfValid(String [] tokens) throws DukeExcepti } } - + /** + * Executes by marking a particular task as done and prints to the user + * @param taskList list containing current tasks + * @param ui user interface + * @throws IOException Thrown when the file update fails. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { try { @@ -47,7 +71,6 @@ public void execute(TaskList taskList, Ui ui) throws DukeException, IOException " "+task.toString()); ui.printInput(inst); - } catch (IndexOutOfBoundsException error3) { ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); } catch (IllegalArgumentException error2) { diff --git a/src/main/java/duke/commands/ExitCommand.java b/src/main/java/duke/commands/ExitCommand.java index 961b82380d..8bf3ce6f03 100755 --- a/src/main/java/duke/commands/ExitCommand.java +++ b/src/main/java/duke/commands/ExitCommand.java @@ -8,12 +8,25 @@ import duke.errors.DukeException; +/** + * Represents a command which contains an execute method to exit the application. + */ public class ExitCommand extends Command { + + + /** + * Initialises the exit command + */ public ExitCommand(){ this.commandType = CommandType.EXIT; } + /** + * Prints the exit message. + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { ui.printByeMessage(); diff --git a/src/main/java/duke/commands/ListCommand.java b/src/main/java/duke/commands/ListCommand.java index 2684e7e865..bb415da96a 100755 --- a/src/main/java/duke/commands/ListCommand.java +++ b/src/main/java/duke/commands/ListCommand.java @@ -2,20 +2,30 @@ import java.io.IOException; - -import java.util.List; - import duke.core.TaskList; import duke.core.Ui; import duke.errors.DukeException; + +/** + * Represents a command which contains an execute method that lists the tasks in the task list. + */ public class ListCommand extends Command { + /** + * Initialises the list command + */ public ListCommand(){ this.commandType = CommandType.LIST; } + /** + * Lists all the tasks in the task list and prints them out. + * + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { ui.printNumberList(taskList); diff --git a/src/main/java/duke/commands/NullCommand.java b/src/main/java/duke/commands/NullCommand.java index 8ec5f83ebb..68c5d4c047 100755 --- a/src/main/java/duke/commands/NullCommand.java +++ b/src/main/java/duke/commands/NullCommand.java @@ -8,15 +8,28 @@ import duke.errors.DukeException; import duke.errors.DukeExceptionType; +/** + * Represents a command that is invalid + */ public class NullCommand extends Command{ + /** + * Initialises the null command + */ public NullCommand(){ this.commandType = CommandType.NULL; } + /** + * Throws an exception which tells + * the user that the input command is not valid + * @param taskList The main task list of the application. + * @param ui The main user interface of the application. + * @throws DukeException Thrown when the command does not exist + */ @Override public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { - throw new DukeException("Invalid commands.Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); + throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } } diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index 5f9956474c..e73794927a 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -20,10 +20,21 @@ import java.time.LocalDateTime; import java.util.Arrays; +/** + * Represents a class that takes in user inputs and translates them into different commands. + */ public class Parser { private static String[] responses = new String[]{"/by","/at"}; + /** + * Takes in user input and convert it into a command which performs a set of + * instructions on the task list and ui. + * + * @param input String that contains user input + * @return A command that execute a set of instructions. + * @throws DukeException Thrown when there is a Duke exception. + */ public static Command parseCommand(String input) throws DukeException, IllegalArgumentException { String[] tokens = input.split(" "); if (tokens[0].equals("bye")) { @@ -42,6 +53,14 @@ public static Command parseCommand(String input) throws DukeException, IllegalAr } } + /** + * Throws an exception which tells + * the user that the input command is not valid, by checking the length of command + * the user that the input lacks information based on each case + * + * @param tokens User input split by space + * @throws IllegalArgumentException Thrown when the length of the command is not sufficient + */ private static void checkValidLength(String[] tokens) throws IllegalArgumentException { List group1 = List.of("todo", "deadline", "event"); List group2 = List.of("done", "delete"); @@ -52,7 +71,7 @@ private static void checkValidLength(String[] tokens) throws IllegalArgumentExce } } - + // helper method to check if user input can still be a valid to-do, deadline or event task private static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); @@ -71,6 +90,16 @@ private static Command createAddCommandIfValid(String[] tokens) throws DukeExcep } + + /** + * Takes in a string and tries to parse input string as Date and Time in dd/MM/yyyy HHmm, + * converting it into a more readable format + * eg. dd/MM/yyyy HHmm(e.g. 11/12/1111 1111 -> 11th of DECEMBER 1111, 11:11am) + * + * @param dateTimeString String to be parsed, and converted, if possible + * @return The formatted date and time, if it can be formatted + * @throws DukeException Thrown when the input cannot be formatted + */ public static String parseDateTime(String dateTimeString) throws DukeException { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); @@ -109,6 +138,7 @@ public static String parseDateTime(String dateTimeString) throws DukeException { } } + // helper method to attach a prefix to a day private static String getFormattedDay(int day) { int remainderHundred = day % 100; if (remainderHundred > 9 && remainderHundred < 21) { @@ -129,6 +159,8 @@ private static String getFormattedDay(int day) { } + // helper method to check if the given date and time of a deadline or event task + // can be recognised as a DateTime format. private static Command createDateCommandIfValid(String[] tokens, int mode) throws DukeException { List lst = Arrays.asList(tokens); String key = responses[mode]; @@ -163,6 +195,7 @@ private static Command createDateCommandIfValid(String[] tokens, int mode) throw } + //helper method to create the correct kind of DateTime Command private static Command createDateCommand(int mode, StringBuilder builder, String correctDate) { if (mode==0) { return new AddDeadlineCommand(builder.toString(),correctDate); diff --git a/src/main/java/duke/core/Storage.java b/src/main/java/duke/core/Storage.java index d0fa4f4ae5..f278a63d3a 100644 --- a/src/main/java/duke/core/Storage.java +++ b/src/main/java/duke/core/Storage.java @@ -15,17 +15,33 @@ - - +/** + * Represents the storage of the application. Provides methods that to overwrite + * the contents of the file and loading data from the file. + */ public class Storage{ private File file; + + /** + * Initialises the Storage with the filepath of the file + * + * @param filePath String of the directory the file is in. + */ public Storage(String filePath){ this.file = new File(filePath); } - public ArrayList load() throws DukeException, IOException { + + /** + * Reads the data stored in the file, after which the date would be used + * to generate a ArrayList that would be returned. + * + * @return An ArrayList of tasks. + * @throws DukeException Thrown when the file does not exist. + */ + public ArrayList load() throws DukeException { ArrayList taskList = new ArrayList<>(); try { Scanner sc = new Scanner(file); @@ -40,7 +56,13 @@ public ArrayList load() throws DukeException, IOException { } - public void overwriteStorage(ArrayList taskList) throws IOException{ + /** + * Overwrites the data in the file by writing to the file. + * + * @param taskList Current task list stored in the application. + * @throws IOException Thrown when writing to file fails. + */ + void overwriteStorage(ArrayList taskList) throws IOException{ FileWriter fw = new FileWriter(this.file); for (Task task: taskList){ switch (task.getType()) { @@ -56,7 +78,7 @@ public void overwriteStorage(ArrayList taskList) throws IOException{ "Deadline" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + - ((Deadline) task).getTime() + + ((Deadline) task).getDate() + System.lineSeparator()); break; case EVENT: @@ -64,7 +86,7 @@ public void overwriteStorage(ArrayList taskList) throws IOException{ "Event" + " / " + task.getStatusIcon() + " / " + task.getDescription() + " / " + - ((Event) task).getTime() + + ((Event) task).getDate() + System.lineSeparator()); break; default: @@ -73,7 +95,8 @@ public void overwriteStorage(ArrayList taskList) throws IOException{ fw.close(); } - + //helper method to convert the written format of the task in the file + //into a Task to be loaded back into storage private Task formatFileToTask(String line) throws DukeException { String[] tokens = line.split(" / "); switch(tokens[1]){ diff --git a/src/main/java/duke/core/TaskList.java b/src/main/java/duke/core/TaskList.java index 70c10e4a19..085005bc4f 100644 --- a/src/main/java/duke/core/TaskList.java +++ b/src/main/java/duke/core/TaskList.java @@ -5,36 +5,81 @@ import duke.tasks.Task; - +/** + * Represents the task list used to store the tasks. Provides methods to add a task to the list, + * getting a List, getting a task using the index and removing + * a task based on the index specified, getting the size of the list, + * setting the done status of a task and getting the ID of a task + */ public class TaskList { private ArrayList taskList; private Storage storage; + /** + * Initialises the TaskList, creates an ArrayList to store the tasks, + * and holds a reference to the main storage + * + * @param storage The main storage of the application. + */ public TaskList(Storage storage){ this.taskList = new ArrayList<>(); this.storage = storage; } + + /** + * Initialises the TaskList, with a given ArrayList to store the tasks, + * and holds a reference to the main storage + * + * @param list list to initialise with + * @param storage The main storage of the application. + */ public TaskList(ArrayList list, Storage storage){ this.taskList = list; this.storage = storage; } + + /** + * Adds a task to the task list. + * + * @param task Task to be added. + * @throws IOException Thrown when writing to file fails. + */ public void addToList(Task task) throws IOException { this.taskList.add(task); this.storage.overwriteStorage(taskList); } + + /** + * Returns a ArrayList of type Task. + * + * @return An ArrayList of tasks. + */ public ArrayList getList(){ return this.taskList; } + + /** + * Returns a task at specified index. + * + * @param index Index of task to be retrieved. + * @return Task of the corresponding index. + */ public Task getTaskAt(int index){ return this.taskList.get(index - 1); } + /** + * Removes a task from the list using its reference + * + * @param task Task to be removed. + * @throws IOException Thrown when writing to file fails. + */ public void removeFromList(Task task) throws IOException { boolean isRemoved = this.taskList.remove(task); if (isRemoved) { @@ -42,15 +87,31 @@ public void removeFromList(Task task) throws IOException { } } + + /** + * Sets task at specified index to done + * + * @param index Index of task to be set as done + * @throws IOException Thrown when writing to file fails. + */ public void setDoneInList(int index) throws IOException { this.taskList.get(index - 1).setDone(); this.storage.overwriteStorage(taskList); } - int getSize(){ + /** + * Returns the number of tasks in current list + * @return number of tasks in current list + */ + int getNumTasks(){ return this.taskList.size(); } + /** + * Returns the position of the specified task in current list + * + * @return position of the specified task in current list + */ public int getTaskID(Task task) { return taskList.indexOf(task) + 1; } diff --git a/src/main/java/duke/core/Ui.java b/src/main/java/duke/core/Ui.java index 7202fa4f29..bd9f915219 100644 --- a/src/main/java/duke/core/Ui.java +++ b/src/main/java/duke/core/Ui.java @@ -5,23 +5,41 @@ import java.util.Scanner; import duke.tasks.Task; -import duke.core.TaskList; + +/** + * Represents the user interface of the application. Provides methods for reading input + * and printing output to the console. + */ public class Ui { final private static String horizontalLine = " ____________________________________________________________"; - Scanner sc = new Scanner(System.in); + private Scanner sc = new Scanner(System.in); + + /** + * Checks if there are inputs to be read + * + * @return true if there are inputs, false otherwise + */ public boolean hasInputs() { return sc.hasNextLine(); } + + /** + * Reads from standard input and returns it. + * + * @return String which consists of user input. + */ public String readCommand(){ return sc.nextLine(); } - + /** + * Prints the welcome message of the application. + */ public void printWelcomeMessage() { List start = new ArrayList<>(); start.add("Hello! I'm Duke"); @@ -30,28 +48,47 @@ public void printWelcomeMessage() { } - public void printInput(Task input, TaskList taskList) { + + /** + * Prints a message when a task is added. + * + * @param task Task that was added. + * @param taskList Task list where the Task is stored. + */ + public void printAddMessage(Task task, TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Got it. I've added this task: "); - System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.", taskList.getSize())); + System.out.println(String.format(" %s",task)); + System.out.println(String.format(" Now you have %d tasks in the list.", taskList.getNumTasks())); System.out.println(horizontalLine); System.out.println(); } - public void printDeletion(Task input, TaskList taskList) { + /** + * Prints out the message when a task is deleted. + * + * @param task Task that was deleted. + * @param taskList Task list that the Task was removed from. + */ + public void printDeletion(Task task, TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Noted. I've removed this task: "); - System.out.println(String.format(" %s",input)); - System.out.println(String.format(" Now you have %d tasks in the list.",taskList.getSize())); + System.out.println(String.format(" %s",task)); + System.out.println(String.format(" Now you have %d tasks in the list.",taskList.getNumTasks())); System.out.println(horizontalLine); System.out.println(); } + + /** + * Prints a list of string in the correct format + * + * @param start List of Strings which needs to be printed sequentially + */ public void printInput(List start) { System.out.println(horizontalLine); for (String input : start) { @@ -62,6 +99,11 @@ public void printInput(List start) { System.out.println(); } + /** + * Prints a single line of input in the correct format + * + * @param input String to be printed + */ public void printOneLine(String input) { System.out.println(horizontalLine); System.out.println(String.format(" %s",input)); @@ -70,10 +112,16 @@ public void printOneLine(String input) { } + + /** + * Prints the list of tasks. + * + * @param taskList List of tasks stored in the application. + */ public void printNumberList(TaskList taskList) { System.out.println(horizontalLine); System.out.println(" Here are the tasks in your list:"); - for (int i = 0; i < taskList.getSize(); i++) { + for (int i = 0; i < taskList.getNumTasks(); i++) { System.out.println(String.format(" %d.%s",i+1, taskList.getTaskAt(i+1))); } @@ -82,11 +130,18 @@ public void printNumberList(TaskList taskList) { } - + /** + * Prints the exit message. + */ public void printByeMessage() { this.printOneLine("Bye. Hope to see you again soon!"); } + + /** + * Prints out the exception. + * @param e Exception object whose message is to be printed out + */ public void printErrorMessage(Exception e) { this.printOneLine(e.getMessage()); } diff --git a/src/main/java/duke/errors/DukeException.java b/src/main/java/duke/errors/DukeException.java index c928ecd267..bfa828c67e 100644 --- a/src/main/java/duke/errors/DukeException.java +++ b/src/main/java/duke/errors/DukeException.java @@ -1,8 +1,12 @@ package duke.errors; + +/** + * Represents an Exception class in Duke. + */ public class DukeException extends Exception { - protected DukeExceptionType type; + private DukeExceptionType type; public DukeException(String error, DukeExceptionType type){ super(error); @@ -22,7 +26,7 @@ public String getMessage() { case FILENOTFOUND: return "File not found!!"; case TASKNOTFOUND: - return "core.tasks.Task not found!!"; + return "Task not found!!"; default: return "Unknown error! Please try again."; } diff --git a/src/main/java/duke/errors/DukeExceptionType.java b/src/main/java/duke/errors/DukeExceptionType.java index b71f6d67ae..f07c08f1e2 100644 --- a/src/main/java/duke/errors/DukeExceptionType.java +++ b/src/main/java/duke/errors/DukeExceptionType.java @@ -1,5 +1,9 @@ package duke.errors; +/** + * Represents different Exception types + */ + public enum DukeExceptionType { INVALIDCOMMAND,NOTINTEGER,MISSINGTASK,GENERALMISTAKE, FILENOTFOUND, TASKNOTFOUND } diff --git a/src/main/java/duke/tasks/Deadline.java b/src/main/java/duke/tasks/Deadline.java index bbde33d850..b6733d9212 100644 --- a/src/main/java/duke/tasks/Deadline.java +++ b/src/main/java/duke/tasks/Deadline.java @@ -1,24 +1,42 @@ package duke.tasks; +/** + * Represents a deadline task in the application. + * A deadline provides the getter methods to its date. + */ public class Deadline extends Task { - private String time; + private String date; - public Deadline(String description, String time) { + /** + * Initialises an deadline task with the description and date and time of the deadline task. + * + * @param description Deadline description + * @param date Date description + */ + public Deadline(String description, String date) { super(description); - this.time = time; + this.date = date; this.type = TaskType.DEADLINE; } - - - public String getTime() { - return this.time; + /** + * Returns a string containing the date and time of a deadline task + * + * @return String containing the date and time of a deadline task. + */ + public String getDate() { + return this.date; } + /** + * Returns A string that includes the task type, description and date of the deadline task. + * + * @return String that includes the task type, description and date of the deadline task. + */ @Override public String toString() { return String.format("[D][%s] %s(by: %s)", getStatusIcon(), - getDescription(), getTime()); + getDescription(), getDate()); } } \ No newline at end of file diff --git a/src/main/java/duke/tasks/Event.java b/src/main/java/duke/tasks/Event.java index c251288af3..a927b0c9aa 100644 --- a/src/main/java/duke/tasks/Event.java +++ b/src/main/java/duke/tasks/Event.java @@ -1,24 +1,43 @@ package duke.tasks; -public class Event extends Task { - - private String time; +/** + * Represents an event task in the application. + * An event provides the getter methods to its date. + */ +public class Event extends Task { + private String date; - public Event(String description, String time) { + /** + * Initialises an deadline task with the description and date and time of the event task. + * + * @param description Event description + * @param date Date description + */ + public Event(String description, String date) { super(description); - this.time = time; + this.date = date; this.type = TaskType.EVENT; } - public String getTime() { - return this.time; + /** + * Returns a string containing the date and time of a event task + * + * @return String containing the date and time of a event task. + */ + public String getDate() { + return this.date; } + /** + * Returns A string that includes the task type, description and date of the event task. + * + * @return String that includes the task type, description and date of the event task. + */ @Override public String toString() { return String.format("[E][%s] %s(at: %s)", getStatusIcon(), - getDescription(), getTime()); + getDescription(), getDate()); } } \ No newline at end of file diff --git a/src/main/java/duke/tasks/Task.java b/src/main/java/duke/tasks/Task.java index b0f47fa66d..2b808b075f 100644 --- a/src/main/java/duke/tasks/Task.java +++ b/src/main/java/duke/tasks/Task.java @@ -2,34 +2,76 @@ import duke.core.TaskList; + + +/** + * Represents a task in the application. A task has two private fields, the description of the task and + * the state of completion of the task. The type of task is package-private andd taskList is a + * class attribute. The Task class provides the getters to type, description, the task list as well as + * getting the icon (tick and cross) which corresponds to the isDone field. Task class also + * supports a setDone method which sets isDone field to true and a setTaskList method which sets + * taskList field to the main task list of the application. + */ public abstract class Task { - protected String description; - protected boolean isDone; - protected TaskType type; + private String description; + private boolean isDone; + TaskType type; public static TaskList taskList; + + /** + * Initialises a Task that has a default isDone field of false. + * + * @param description Description of the task. + */ public Task(String description) { this.description = description; this.isDone = false; } + /** + * Returns the type of Task + * + * @return TaskType + */ public TaskType getType() { return type; } + /** + * Returns a tick or a cross depending on the field isDone. + * + * @return Icon which shows a tick or a cross. + */ public String getStatusIcon() { return (isDone ? "\u2713" : "\u2718"); } + /** + * Returns the description of the task. + * + * @return String that represents the description of the task. + */ public String getDescription() { return description; } + /** + * Returns a string that includes the status icon and the description of the task. + * + * @return String with status icon and description of task. + */ public String toString() { return String.format("[%s] %s", getStatusIcon(), getDescription()); } + + /** + * Sets the boolean isDone to true and returns the previous status of the task + * + * @return Previous boolean value of isDone. + */ public boolean setDone() { if (!isDone) { this.isDone = true; @@ -39,10 +81,18 @@ public boolean setDone() { } } + /** + * Initialises a reference to the task list of the application in the Task class + */ public static void setTaskList(TaskList taskList) { Task.taskList = taskList; } + /** + * Returns the position of the specified task in current list + * + * @return Position of the specified task in current list + */ public static int getTaskID(Task task) { return Task.taskList.getTaskID(task); } diff --git a/src/main/java/duke/tasks/TaskType.java b/src/main/java/duke/tasks/TaskType.java index 610b363a85..21323f4461 100644 --- a/src/main/java/duke/tasks/TaskType.java +++ b/src/main/java/duke/tasks/TaskType.java @@ -1,5 +1,7 @@ package duke.tasks; - +/** + * Represents different task types + */ public enum TaskType { EVENT, TODO, DEADLINE } diff --git a/src/main/java/duke/tasks/ToDo.java b/src/main/java/duke/tasks/ToDo.java index b650d571b8..dbfdacd4ae 100644 --- a/src/main/java/duke/tasks/ToDo.java +++ b/src/main/java/duke/tasks/ToDo.java @@ -2,13 +2,31 @@ import java.lang.StringBuilder; + +/** + * Represents a Todo task in the application. + * A Todo provides a factory method to create itself. + */ + public class ToDo extends Task { + /** + * Initialises a todo task with the description of the task. + * + * @param description ToDo description + */ public ToDo(String description) { super(description); this.type = TaskType.TODO; } + + /** + * Creates a ToDo task from the parameters provided for a ToDo task + * + * @return A ToDo task + * @param tokens User input split by space + */ public static ToDo createToDo(String [] tokens) { StringBuilder builder = new StringBuilder(); for (int i = 1; i < tokens.length - 1 ; i++) { @@ -19,6 +37,12 @@ public static ToDo createToDo(String [] tokens) { return new ToDo(builder.toString()); } + + /** + * Returns A string that includes the type task and the toString of Task. + * + * @return String that adds the type of the task to the toString method of Task. + */ @Override public String toString() { return String.format("[T][%s] %s", getStatusIcon(), getDescription()); diff --git a/src/test/java/duke/core/TaskListTest.java b/src/test/java/duke/core/TaskListTest.java new file mode 100644 index 0000000000..342a289a8e --- /dev/null +++ b/src/test/java/duke/core/TaskListTest.java @@ -0,0 +1,40 @@ +package duke.core; + +import duke.errors.DukeException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import duke.tasks.Task; + +import duke.commands.Command; + + + + +class TaskListTest { + + @Test + void getSize_validInput_success() { + try { + TaskList tasks = new TaskList(new ArrayList()); + Command todo = Parser.parseCommand("todo "); + Command deadline = Parser.parseCommand("deadline task /by 12/12/1212 0013"); + Command event = Parser.parseCommand("event task /at 12/12/1212 0013"); + assertEquals(2, tasks.getSize()); + Command delete = Parser.parseCommand("delete 1"); + assertEquals(1, tasks.getSize()); + } catch (DukeException e) { + System.out.println(e.getMessage()); + fail(); + } + } + +} \ No newline at end of file From 9afd5cf7714f65227c0c6ffce22badbb94eebaef Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 16 Sep 2019 13:32:43 +0800 Subject: [PATCH 30/46] Fixed JavaDoc --- src/main/java/duke/tasks/ToDo.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/duke/tasks/ToDo.java b/src/main/java/duke/tasks/ToDo.java index dbfdacd4ae..2dd37b0eaf 100644 --- a/src/main/java/duke/tasks/ToDo.java +++ b/src/main/java/duke/tasks/ToDo.java @@ -8,6 +8,8 @@ * A Todo provides a factory method to create itself. */ + + public class ToDo extends Task { /** From e51dc4f79d52183317e7d7830e55559549874992 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 16 Sep 2019 16:43:44 +0800 Subject: [PATCH 31/46] Implement Find Command --- data/duke.txt | 6 ++ src/main/java/Duke.java | 1 + .../duke/commands/AddDeadlineCommand.java | 5 +- .../java/duke/commands/AddToDoCommand.java | 6 +- src/main/java/duke/commands/Command.java | 18 +--- src/main/java/duke/commands/CommandType.java | 2 +- .../java/duke/commands/DeleteCommand.java | 2 +- src/main/java/duke/commands/DoneCommand.java | 6 +- src/main/java/duke/commands/ExitCommand.java | 3 +- src/main/java/duke/commands/FindCommand.java | 53 +++++++++++ src/main/java/duke/commands/ListCommand.java | 2 +- src/main/java/duke/commands/NullCommand.java | 3 +- src/main/java/duke/core/Parser.java | 94 ++++++++++++------- src/main/java/duke/core/Storage.java | 1 - src/main/java/duke/core/TaskList.java | 12 +++ src/main/java/duke/core/Ui.java | 17 ++++ src/main/java/duke/errors/DukeException.java | 2 + .../java/duke/errors/DukeExceptionType.java | 2 +- src/test/java/duke/core/ParserTest.java | 52 ++++++++-- src/test/java/duke/core/TaskListTest.java | 16 ---- 20 files changed, 215 insertions(+), 88 deletions(-) create mode 100644 src/main/java/duke/commands/FindCommand.java diff --git a/data/duke.txt b/data/duke.txt index bfafa4f3ed..816cb2a26a 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1 +1,7 @@ 1 / ToDo / ✘ / 1 +2 / ToDo / ✘ / 1 2 3 45 +3 / Deadline / ✘ / 45 / 12th of DECEMBER 1212, 12:12pm +4 / Deadline / ✘ / 1 / 1 +5 / Deadline / ✘ / 1 / 1 2 3 +6 / Deadline / ✘ / 1 / 1 +7 / Deadline / ✓ / 1 / 1 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4368fe9881..a92903dbf9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -54,6 +54,7 @@ private void run() throws IOException { /** * Main method to drive the application + * * @param args Placeholder * @throws DukeException for any exceptions that arise when running the application */ diff --git a/src/main/java/duke/commands/AddDeadlineCommand.java b/src/main/java/duke/commands/AddDeadlineCommand.java index 04b7e9469e..fc2fdcd596 100755 --- a/src/main/java/duke/commands/AddDeadlineCommand.java +++ b/src/main/java/duke/commands/AddDeadlineCommand.java @@ -6,8 +6,6 @@ import duke.core.TaskList; import duke.core.Ui; -import duke.errors.DukeException; - import duke.tasks.Deadline; @@ -23,6 +21,7 @@ public class AddDeadlineCommand extends Command { /** * Initialises the add command which contains the parameters of the task to be created + * * @param description deadline description * @param date date description */ @@ -40,7 +39,7 @@ public AddDeadlineCommand(String description, String date) { * @throws IOException Thrown when the new task cannot be added to the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws IOException { Deadline task = new Deadline(this.description,this.date); taskList.addToList(task); ui.printAddMessage(task, taskList); diff --git a/src/main/java/duke/commands/AddToDoCommand.java b/src/main/java/duke/commands/AddToDoCommand.java index babbf9018e..e12322e558 100755 --- a/src/main/java/duke/commands/AddToDoCommand.java +++ b/src/main/java/duke/commands/AddToDoCommand.java @@ -5,8 +5,6 @@ import duke.core.TaskList; import duke.core.Ui; -import duke.errors.DukeException; - import duke.tasks.ToDo; @@ -21,9 +19,9 @@ public class AddToDoCommand extends Command{ /** * Initialises the add command which contains the parameters of the task to be created + * * @param tokens user input split by space, required for creating a to-do task */ - public AddToDoCommand(String [] tokens) { this.tokens = tokens; this.commandType = CommandType.ADDTODO; @@ -38,7 +36,7 @@ public AddToDoCommand(String [] tokens) { * @throws IOException Thrown when the new task cannot be added to the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws IOException { ToDo task = ToDo.createToDo(tokens); taskList.addToList(task); ui.printAddMessage(task, taskList); diff --git a/src/main/java/duke/commands/Command.java b/src/main/java/duke/commands/Command.java index 046c25ae51..821a02f2c8 100755 --- a/src/main/java/duke/commands/Command.java +++ b/src/main/java/duke/commands/Command.java @@ -6,10 +6,6 @@ import duke.core.TaskList; import duke.core.Ui; -/** - * abstract class Command that represents an action by the user - */ - /** * Base class for the other commands. Specifies the abstract method that is required to be implemented * by the children commands. @@ -17,9 +13,6 @@ public abstract class Command { CommandType commandType; - - - /** * getter for type of command * @return type of command @@ -28,22 +21,13 @@ public CommandType getCommandType() { return commandType; } - /** * Executes what the command is suppose to do. * * @param taskList The main task list of the application. * @param ui The main user interface of the application. - * @param storage The main storage of the application. * @throws DukeException Occurs when parts of the command cannot be executed. - */ - - - /** - * - * @param taskList list containing current tasks - * @param ui user interface - * @throws DukeException throws exception with error message in case anything goes wrong + * @throws IOException Thrown when the file update fails. */ public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException; diff --git a/src/main/java/duke/commands/CommandType.java b/src/main/java/duke/commands/CommandType.java index 6fc3b8580c..aa3b460f1c 100644 --- a/src/main/java/duke/commands/CommandType.java +++ b/src/main/java/duke/commands/CommandType.java @@ -4,6 +4,6 @@ * Represents the different command types */ public enum CommandType { - ADDTODO, ADDEVENT, ADDDEADLINE, LIST, DELETE, DONE, NULL, EXIT + ADDTODO, ADDEVENT, ADDDEADLINE, LIST, DELETE, DONE, NULL, EXIT, FIND } diff --git a/src/main/java/duke/commands/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java index 4158896c39..cadf4bee96 100755 --- a/src/main/java/duke/commands/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -52,7 +52,7 @@ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeExc * @throws IOException Thrown when the task cannot be removed from the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws IOException { try { Task task = taskList.getTaskAt(index+1); taskList.removeFromList(task); diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index ffacc02ddd..8dd37375dc 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -23,12 +23,14 @@ public class DoneCommand extends Command{ /** * Constructor for creating a done command + * * @param index The index of the task that is going to be marked done */ /** * Initialises the command which contains the index of the task * to be marked as done + * * @param index the index of the task to be deleted */ private DoneCommand(int index){ @@ -39,6 +41,7 @@ private DoneCommand(int index){ /** * Service for creating a done command that checks for number formatting errors + * * @param tokens user input split by space, required for creating a done command * @throws DukeException Thrown when the parameters does not specify the index of the task */ @@ -53,12 +56,13 @@ public static DoneCommand createDoneIfValid(String [] tokens) throws DukeExcepti /** * Executes by marking a particular task as done and prints to the user + * * @param taskList list containing current tasks * @param ui user interface * @throws IOException Thrown when the file update fails. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws IOException { try { Task task = taskList.getTaskAt(index+1); boolean isDoneBefore = task.setDone(); diff --git a/src/main/java/duke/commands/ExitCommand.java b/src/main/java/duke/commands/ExitCommand.java index 8bf3ce6f03..803d1ddf05 100755 --- a/src/main/java/duke/commands/ExitCommand.java +++ b/src/main/java/duke/commands/ExitCommand.java @@ -24,11 +24,12 @@ public ExitCommand(){ /** * Prints the exit message. + * * @param taskList The main task list of the application. * @param ui The main user interface of the application. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) { ui.printByeMessage(); } diff --git a/src/main/java/duke/commands/FindCommand.java b/src/main/java/duke/commands/FindCommand.java new file mode 100644 index 0000000000..340cdd7c6b --- /dev/null +++ b/src/main/java/duke/commands/FindCommand.java @@ -0,0 +1,53 @@ +package duke.commands; + +import java.util.List; + +import duke.core.TaskList; +import duke.core.Ui; +import duke.errors.DukeException; +import duke.errors.DukeExceptionType; +import duke.tasks.Task; + + + +/** + * Represents a command which contains an execute method that finds tasks with the matching keyword. + */ +public class FindCommand extends Command { + + private String keyword; + + /** + * Initialises the find command + */ + private FindCommand(String keyword) { + this.keyword = keyword; + this.commandType = CommandType.FIND; + } + + /** + * Service for creating a find command that checks for multiple keywords + * @param tokens user input split by space, required for creating a find command + * @throws DukeException Thrown when the parameters contains multiple keywords + */ + public static FindCommand createFindCommandIfValid(String[] tokens) throws DukeException{ + if (tokens.length > 2) { + throw new DukeException("Must be a single keyword", DukeExceptionType.NOTSINGLEWORD); + } + return new FindCommand(tokens[1]); + } + + /** + * Executes by storing all tasks with descriptions containing the keyword + * and prints to the user + * @param taskList list containing current tasks + * @param ui user interface + */ + public void execute(TaskList taskList, Ui ui) { + List resultList = taskList.findTasks(this.keyword); + ui.printFindResults(resultList); + } + + +} + diff --git a/src/main/java/duke/commands/ListCommand.java b/src/main/java/duke/commands/ListCommand.java index bb415da96a..4181ef477f 100755 --- a/src/main/java/duke/commands/ListCommand.java +++ b/src/main/java/duke/commands/ListCommand.java @@ -27,7 +27,7 @@ public ListCommand(){ * @param ui The main user interface of the application. */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) { ui.printNumberList(taskList); } } diff --git a/src/main/java/duke/commands/NullCommand.java b/src/main/java/duke/commands/NullCommand.java index 68c5d4c047..9d59c9b257 100755 --- a/src/main/java/duke/commands/NullCommand.java +++ b/src/main/java/duke/commands/NullCommand.java @@ -23,12 +23,13 @@ public NullCommand(){ /** * Throws an exception which tells * the user that the input command is not valid + * * @param taskList The main task list of the application. * @param ui The main user interface of the application. * @throws DukeException Thrown when the command does not exist */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws DukeException { throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index e73794927a..c4ad2df6ef 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -9,6 +9,7 @@ import duke.commands.AddToDoCommand; import duke.commands.AddDeadlineCommand; import duke.commands.AddEventCommand; +import duke.commands.FindCommand; import duke.errors.DukeException; import duke.errors.DukeExceptionType; @@ -26,6 +27,7 @@ public class Parser { private static String[] responses = new String[]{"/by","/at"}; + private static int[] startingIndex = new int[]{9,6}; /** * Takes in user input and convert it into a command which performs a set of @@ -48,8 +50,12 @@ public static Command parseCommand(String input) throws DukeException, IllegalAr return DoneCommand.createDoneIfValid(tokens); } else if (tokens[0].equals("delete")) { return DeleteCommand.createDeleteIfValid(tokens); + } else if (tokens[0].equals("find")) { + return FindCommand.createFindCommandIfValid(tokens); } else { - return Parser.createAddCommandIfValid(tokens); + System.out.println(tokens[0]); + //return Parser.createAddCommandIfValid(tokens); + return Parser.createAddCommandIfValid(tokens, input); } } @@ -68,11 +74,16 @@ private static void checkValidLength(String[] tokens) throws IllegalArgumentExce throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); } else if (tokens.length == 1 && group2.contains(tokens[0])) { throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); + } else if (tokens.length == 1 && tokens[0].equals("find")) { + throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires keyword input.",tokens[0])); } } // helper method to check if user input can still be a valid to-do, deadline or event task - private static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { + + +// private static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { + private static Command createAddCommandIfValid(String[] tokens, String fullCommand) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); if (!validCommands.contains(tokens[0])) { @@ -81,16 +92,14 @@ private static Command createAddCommandIfValid(String[] tokens) throws DukeExcep if (tokens[0].equals("todo")) { return new AddToDoCommand(tokens); } else if (tokens[0].equals("deadline")) { - return createDateCommandIfValid(tokens,0); + return createDateCommandIfValid(tokens,fullCommand,0); } else if (tokens[0].equals("event")) { - return createDateCommandIfValid(tokens,1); + return createDateCommandIfValid(tokens,fullCommand,1); } else { return new NullCommand(); } } - - /** * Takes in a string and tries to parse input string as Date and Time in dd/MM/yyyy HHmm, * converting it into a more readable format @@ -161,46 +170,65 @@ private static String getFormattedDay(int day) { // helper method to check if the given date and time of a deadline or event task // can be recognised as a DateTime format. - private static Command createDateCommandIfValid(String[] tokens, int mode) throws DukeException { + private static Command createDateCommandIfValid(String[] tokens, String fullCommand, int mode) throws DukeException { List lst = Arrays.asList(tokens); String key = responses[mode]; if (!lst.contains(key)) { - throw new IllegalArgumentException("Missing deadline"); + throw new IllegalArgumentException("Missing deadline keyword!!"); } int index = lst.indexOf(key); - int argLength = tokens.length - index - 1; - - if (argLength == 2) { - String dateTimeString = tokens[index+1] + " " + tokens[index+2]; - String correctDate = Parser.parseDateTime(dateTimeString); - StringBuilder builder = new StringBuilder(); - if (index -1 <=0) { - throw new DukeException("Please input task description", - DukeExceptionType.GENERALMISTAKE); - } - for (int i = 1; i < index ; i++) { - String curr = tokens[i]; - builder.append(curr); - if (i==index-1) { - break; - } - builder.append(" "); - } - return createDateCommand(mode,builder,correctDate); - } else { - throw new DukeException("Please input a date in dd/MM/yyyy HHmm format.", - DukeExceptionType.GENERALMISTAKE); + checkTaskDescription(index); + String[] datedTaskSplit = fullCommand.split(" " + key + " "); + checkDeadline(datedTaskSplit); + String description = datedTaskSplit[0].substring(startingIndex[mode]); + String dateTime = datedTaskSplit[1]; + if (isDate(dateTime)) { + String dateTimeString = tokens[index + 1] + " " + tokens[index + 2]; + dateTime = Parser.parseDateTime(dateTimeString); } + return createDateCommand(mode, description, dateTime); } + + + //helper method to create the correct kind of DateTime Command - private static Command createDateCommand(int mode, StringBuilder builder, String correctDate) { + private static Command createDateCommand(int mode, String description, String correctDate) { if (mode==0) { - return new AddDeadlineCommand(builder.toString(),correctDate); + return new AddDeadlineCommand(description,correctDate); } else { - return new AddEventCommand(builder.toString(),correctDate); + return new AddEventCommand(description,correctDate); + } + } + + private static boolean isDate(String dateDescription){ + String[] dateSplit = dateDescription.split(" "); + if (dateSplit.length != 2){ + return false; + } else if (!dateSplit[0].contains("/") || + dateSplit[0].chars().filter(ch -> ch == '/').count() != 2) { + return false; + } + return true; + } + + private static void checkTaskDescription(int index) throws DukeException { + if (index -1 <=0) { + throw new DukeException("Please input task description", + DukeExceptionType.GENERALMISTAKE); + } + + } + + private static void checkDeadline(String [] datedTaskSplit) { + if (datedTaskSplit.length > 2) { + throw new IllegalArgumentException("Multiple keyword detected!!"); + } + + if (datedTaskSplit.length < 2) { + throw new IllegalArgumentException("Please insert a deadline!!!"); } } diff --git a/src/main/java/duke/core/Storage.java b/src/main/java/duke/core/Storage.java index f278a63d3a..f044a89b7e 100644 --- a/src/main/java/duke/core/Storage.java +++ b/src/main/java/duke/core/Storage.java @@ -8,7 +8,6 @@ import duke.tasks.ToDo; import duke.tasks.Deadline; import duke.tasks.Event; -import duke.tasks.TaskType; import duke.errors.DukeException; import duke.errors.DukeExceptionType; diff --git a/src/main/java/duke/core/TaskList.java b/src/main/java/duke/core/TaskList.java index 085005bc4f..b1a7be926b 100644 --- a/src/main/java/duke/core/TaskList.java +++ b/src/main/java/duke/core/TaskList.java @@ -1,5 +1,6 @@ package duke.core; +import java.util.List; import java.io.IOException; import java.util.ArrayList; @@ -101,6 +102,7 @@ public void setDoneInList(int index) throws IOException { /** * Returns the number of tasks in current list + * * @return number of tasks in current list */ int getNumTasks(){ @@ -116,6 +118,16 @@ public int getTaskID(Task task) { return taskList.indexOf(task) + 1; } + public List findTasks(String word) { + ArrayList lst= new ArrayList<>(); + for (Task task: taskList) { + if (task.getDescription().contains(word)) { + lst.add(task); + } + } + return lst; + } + } diff --git a/src/main/java/duke/core/Ui.java b/src/main/java/duke/core/Ui.java index bd9f915219..3d9a7bef5f 100644 --- a/src/main/java/duke/core/Ui.java +++ b/src/main/java/duke/core/Ui.java @@ -130,6 +130,22 @@ public void printNumberList(TaskList taskList) { } + /** + * Prints the list of tasks. + * + * @param lst List of tasks with matching keyword + */ + public void printFindResults(List lst) { + System.out.println(horizontalLine); + System.out.println(" Here are the matching tasks in your list:"); + for (int i = 0; i < lst.size(); i++) { + System.out.println(String.format(" %d.%s",i+1, lst.get(i))); + } + System.out.println(horizontalLine); + System.out.println(); + } + + /** * Prints the exit message. */ @@ -140,6 +156,7 @@ public void printByeMessage() { /** * Prints out the exception. + * * @param e Exception object whose message is to be printed out */ public void printErrorMessage(Exception e) { diff --git a/src/main/java/duke/errors/DukeException.java b/src/main/java/duke/errors/DukeException.java index bfa828c67e..73db076436 100644 --- a/src/main/java/duke/errors/DukeException.java +++ b/src/main/java/duke/errors/DukeException.java @@ -27,6 +27,8 @@ public String getMessage() { return "File not found!!"; case TASKNOTFOUND: return "Task not found!!"; + case NOTSINGLEWORD: + return "Must be a single keyword"; default: return "Unknown error! Please try again."; } diff --git a/src/main/java/duke/errors/DukeExceptionType.java b/src/main/java/duke/errors/DukeExceptionType.java index f07c08f1e2..fbc4a5feaa 100644 --- a/src/main/java/duke/errors/DukeExceptionType.java +++ b/src/main/java/duke/errors/DukeExceptionType.java @@ -5,5 +5,5 @@ */ public enum DukeExceptionType { - INVALIDCOMMAND,NOTINTEGER,MISSINGTASK,GENERALMISTAKE, FILENOTFOUND, TASKNOTFOUND + INVALIDCOMMAND,NOTINTEGER,MISSINGTASK,GENERALMISTAKE, FILENOTFOUND, TASKNOTFOUND, NOTSINGLEWORD } diff --git a/src/test/java/duke/core/ParserTest.java b/src/test/java/duke/core/ParserTest.java index 4f7c264dba..2aa246a8d2 100644 --- a/src/test/java/duke/core/ParserTest.java +++ b/src/test/java/duke/core/ParserTest.java @@ -20,9 +20,15 @@ import duke.commands.AddDeadlineCommand; import duke.commands.AddEventCommand; - +/** + * Class to test certain functionality of the Parser class + */ class ParserTest { + /** + * Test that the parseDateTime method can convert into + * formatted date and time when a valid input is given + */ @Test void parseDateTime_validInput_success() { try { @@ -39,16 +45,24 @@ void parseDateTime_validInput_success() { } } + /** + * Test that the parseDateTime method throws an exception + * when it tries to parse and format an invalid input + */ @Test - public void parseDateTime_invalidInput_exceptionThrown() { + void parseDateTime_invalidInput_exceptionThrown() { assertThrows(DukeException.class, () -> Parser.parseDateTime("1212")); assertThrows(DukeException.class, () -> Parser.parseDateTime("12/12/1212")); assertThrows(DukeException.class, () -> Parser.parseDateTime("12pm")); assertThrows(DukeException.class, () -> Parser.parseDateTime("Hello")); } + /** + * Test that the parseDateTime method throws an exception when the input + * is potentially valid but cannot be formatted to the expected format + */ @Test - public void parseDateTime_validLookingInvalidNumbers_exceptionThrown() { + void parseDateTime_validLookingInvalidNumbers_exceptionThrown() { assertThrows(DukeException.class, () -> Parser.parseDateTime("0/12/1212 1212")); assertThrows(DukeException.class, () -> Parser.parseDateTime("-1/12/1212 1212")); assertThrows(DukeException.class, () -> Parser.parseDateTime("/12/1212 1212")); @@ -60,9 +74,12 @@ public void parseDateTime_validLookingInvalidNumbers_exceptionThrown() { } - + /** + * Test that the parseCommand method throws the expected Exceptions when the it tries to parse a input + * as a command, but the required arguments are not provided + */ @Test - public void parseCommand_missingParameter_exceptionThrown() { + void parseCommand_missingParameter_exceptionThrown() { assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("todo ")); assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("deadline ")); @@ -73,13 +90,18 @@ public void parseCommand_missingParameter_exceptionThrown() { assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("event task ")); assertThrows(DukeException.class, () -> Parser.parseCommand("event /at time")); + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("event task /at ")); + assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("done ")); assertThrows(IllegalArgumentException.class, () -> Parser.parseCommand("delete ")); } - + /** + * Test that the parseCommand method ignores extra input when attempting to parse commands + * which require 0 arguments. + */ @Test - public void parseCommand_extraArgumentForNoArgumentCommands_success() { + void parseCommand_extraArgumentForNoArgumentCommands_success() { try { assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); @@ -90,4 +112,20 @@ public void parseCommand_extraArgumentForNoArgumentCommands_success() { } } + /** + * Test that the parseCommand method properly still return an valid AddCommand + * even when the deadline is not in recognisable dateTime format + */ + @Test + void parseCommand_nonParseableTimeForDeadlineOrEvent_success() { + try { + assertTrue(Parser.parseCommand("deadline task /by time") instanceof AddDeadlineCommand); + assertTrue(Parser.parseCommand("event task /at time") instanceof AddEventCommand); + } catch (DukeException ex) { + fail("Should return without formatting the time argument into dd/MM/yyyy HHmm"); + } + } + + + } \ No newline at end of file diff --git a/src/test/java/duke/core/TaskListTest.java b/src/test/java/duke/core/TaskListTest.java index 342a289a8e..d37f3458b6 100644 --- a/src/test/java/duke/core/TaskListTest.java +++ b/src/test/java/duke/core/TaskListTest.java @@ -21,20 +21,4 @@ class TaskListTest { - @Test - void getSize_validInput_success() { - try { - TaskList tasks = new TaskList(new ArrayList()); - Command todo = Parser.parseCommand("todo "); - Command deadline = Parser.parseCommand("deadline task /by 12/12/1212 0013"); - Command event = Parser.parseCommand("event task /at 12/12/1212 0013"); - assertEquals(2, tasks.getSize()); - Command delete = Parser.parseCommand("delete 1"); - assertEquals(1, tasks.getSize()); - } catch (DukeException e) { - System.out.println(e.getMessage()); - fail(); - } - } - } \ No newline at end of file From 95d033ab8fbad628d9400d8100526f81b8fe9f60 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Tue, 17 Sep 2019 22:38:20 +0800 Subject: [PATCH 32/46] Implement Level 9 and fixed some Javadoc --- src/main/java/Duke.java | 15 ++++++++++----- .../java/duke/commands/AddDeadlineCommand.java | 4 ---- src/main/java/duke/commands/AddEventCommand.java | 3 +-- src/main/java/duke/commands/DeleteCommand.java | 2 +- src/main/java/duke/commands/DoneCommand.java | 6 ------ src/main/java/duke/commands/ExitCommand.java | 2 -- src/main/java/duke/commands/ListCommand.java | 2 -- src/main/java/duke/commands/NullCommand.java | 1 - src/main/java/duke/core/Parser.java | 9 +-------- src/main/java/duke/core/TaskList.java | 12 +++++++++--- src/main/java/duke/errors/DukeException.java | 4 ++++ src/main/java/duke/errors/DukeExceptionType.java | 1 - src/main/java/duke/tasks/TaskType.java | 2 ++ src/main/java/duke/tasks/ToDo.java | 5 +---- 14 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a92903dbf9..5a70923684 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -11,18 +11,22 @@ import java.io.IOException; - /** - * The driver class to run user interface of Duke + * The driver class to run user interface of Duke. Duke provides commands to add different tasks, + * list out tasks, marking tasks as done, deleting tasks and storing the tasks into a file for + * retrieval after reboot */ public class Duke { private Ui ui; private TaskList taskList; + /** - * constructor which initialises tasklist - * @throws DukeException if storage cannot be loaded + * Initialises a new Duke application. + * @param filePath String of the directory the file is in. + * @throws IOException Thrown when writing to file fails. + * @throws DukeException Thrown when parts of the command cannot be executed. */ private Duke(String filePath) throws DukeException, IOException { this.ui = new Ui(); @@ -56,7 +60,8 @@ private void run() throws IOException { * Main method to drive the application * * @param args Placeholder - * @throws DukeException for any exceptions that arise when running the application + * @throws IOException Thrown when writing to file fails. + * @throws DukeException Thrown when exceptions that arise when running the application */ public static void main(String[] args) throws DukeException, IOException { new Duke("/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt") diff --git a/src/main/java/duke/commands/AddDeadlineCommand.java b/src/main/java/duke/commands/AddDeadlineCommand.java index fc2fdcd596..54fad2f255 100755 --- a/src/main/java/duke/commands/AddDeadlineCommand.java +++ b/src/main/java/duke/commands/AddDeadlineCommand.java @@ -45,8 +45,4 @@ public void execute(TaskList taskList, Ui ui) throws IOException { ui.printAddMessage(task, taskList); } - - - - } diff --git a/src/main/java/duke/commands/AddEventCommand.java b/src/main/java/duke/commands/AddEventCommand.java index 70f7fd4fe0..030667cb61 100755 --- a/src/main/java/duke/commands/AddEventCommand.java +++ b/src/main/java/duke/commands/AddEventCommand.java @@ -6,7 +6,6 @@ import duke.core.TaskList; import duke.core.Ui; -import duke.errors.DukeException; import duke.tasks.Event; @@ -41,7 +40,7 @@ public AddEventCommand(String description, String date) { * @param ui The main user interface of the application. * @throws IOException Thrown when the new task cannot be added to the file. */ - public void execute(TaskList taskList, Ui ui) throws DukeException, IOException { + public void execute(TaskList taskList, Ui ui) throws IOException { Event task = new Event(this.description,this.date); taskList.addToList(task); ui.printAddMessage(task, taskList); diff --git a/src/main/java/duke/commands/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java index cadf4bee96..07de4007ae 100755 --- a/src/main/java/duke/commands/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -32,7 +32,7 @@ private DeleteCommand(int index){ /** * Service for creating a delete command that checks for number formatting errors - * @param tokens user input split by space, required for creating a delete command + * @param tokens User input split by space, required for creating a delete command * @throws DukeException Thrown when the parameters does not specify the index of the task */ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeException { diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index 8dd37375dc..aab42e1793 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -21,12 +21,6 @@ public class DoneCommand extends Command{ private int index; - /** - * Constructor for creating a done command - * - * @param index The index of the task that is going to be marked done - */ - /** * Initialises the command which contains the index of the task * to be marked as done diff --git a/src/main/java/duke/commands/ExitCommand.java b/src/main/java/duke/commands/ExitCommand.java index 803d1ddf05..18158c0738 100755 --- a/src/main/java/duke/commands/ExitCommand.java +++ b/src/main/java/duke/commands/ExitCommand.java @@ -13,8 +13,6 @@ */ public class ExitCommand extends Command { - - /** * Initialises the exit command */ diff --git a/src/main/java/duke/commands/ListCommand.java b/src/main/java/duke/commands/ListCommand.java index 4181ef477f..01b087f75b 100755 --- a/src/main/java/duke/commands/ListCommand.java +++ b/src/main/java/duke/commands/ListCommand.java @@ -1,11 +1,9 @@ package duke.commands; -import java.io.IOException; import duke.core.TaskList; import duke.core.Ui; -import duke.errors.DukeException; /** diff --git a/src/main/java/duke/commands/NullCommand.java b/src/main/java/duke/commands/NullCommand.java index 9d59c9b257..80b92383f8 100755 --- a/src/main/java/duke/commands/NullCommand.java +++ b/src/main/java/duke/commands/NullCommand.java @@ -1,6 +1,5 @@ package duke.commands; -import java.io.IOException; import duke.core.TaskList; import duke.core.Ui; diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index c4ad2df6ef..b142023fdc 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -54,7 +54,6 @@ public static Command parseCommand(String input) throws DukeException, IllegalAr return FindCommand.createFindCommandIfValid(tokens); } else { System.out.println(tokens[0]); - //return Parser.createAddCommandIfValid(tokens); return Parser.createAddCommandIfValid(tokens, input); } } @@ -80,9 +79,6 @@ private static void checkValidLength(String[] tokens) throws IllegalArgumentExce } // helper method to check if user input can still be a valid to-do, deadline or event task - - -// private static Command createAddCommandIfValid(String[] tokens) throws DukeException, IllegalArgumentException { private static Command createAddCommandIfValid(String[] tokens, String fullCommand) throws DukeException, IllegalArgumentException { List validCommands = List.of("todo", "deadline", "event"); @@ -190,10 +186,7 @@ private static Command createDateCommandIfValid(String[] tokens, String fullComm return createDateCommand(mode, description, dateTime); } - - - - + //helper method to create the correct kind of DateTime Command private static Command createDateCommand(int mode, String description, String correctDate) { if (mode==0) { diff --git a/src/main/java/duke/core/TaskList.java b/src/main/java/duke/core/TaskList.java index b1a7be926b..9c22556819 100644 --- a/src/main/java/duke/core/TaskList.java +++ b/src/main/java/duke/core/TaskList.java @@ -33,7 +33,7 @@ public TaskList(Storage storage){ * Initialises the TaskList, with a given ArrayList to store the tasks, * and holds a reference to the main storage * - * @param list list to initialise with + * @param list List to initialise with * @param storage The main storage of the application. */ public TaskList(ArrayList list, Storage storage){ @@ -103,7 +103,7 @@ public void setDoneInList(int index) throws IOException { /** * Returns the number of tasks in current list * - * @return number of tasks in current list + * @return Number of tasks in current list */ int getNumTasks(){ return this.taskList.size(); @@ -112,12 +112,18 @@ int getNumTasks(){ /** * Returns the position of the specified task in current list * - * @return position of the specified task in current list + * @return Position of the specified task in current list */ public int getTaskID(Task task) { return taskList.indexOf(task) + 1; } + + /** + * Returns a list of tasks containing the specific keyword + * + * @return List of tasks containing the specific keyword + */ public List findTasks(String word) { ArrayList lst= new ArrayList<>(); for (Task task: taskList) { diff --git a/src/main/java/duke/errors/DukeException.java b/src/main/java/duke/errors/DukeException.java index 73db076436..59aded7651 100644 --- a/src/main/java/duke/errors/DukeException.java +++ b/src/main/java/duke/errors/DukeException.java @@ -13,6 +13,10 @@ public DukeException(String error, DukeExceptionType type){ this.type = type; } + /** + * Specifies the message to be printed based on different Exception types + * @return String which is the message of the exception. + */ public String getMessage() { switch (type) { case INVALIDCOMMAND: diff --git a/src/main/java/duke/errors/DukeExceptionType.java b/src/main/java/duke/errors/DukeExceptionType.java index fbc4a5feaa..b545b211e2 100644 --- a/src/main/java/duke/errors/DukeExceptionType.java +++ b/src/main/java/duke/errors/DukeExceptionType.java @@ -3,7 +3,6 @@ /** * Represents different Exception types */ - public enum DukeExceptionType { INVALIDCOMMAND,NOTINTEGER,MISSINGTASK,GENERALMISTAKE, FILENOTFOUND, TASKNOTFOUND, NOTSINGLEWORD } diff --git a/src/main/java/duke/tasks/TaskType.java b/src/main/java/duke/tasks/TaskType.java index 21323f4461..73f8a36b6c 100644 --- a/src/main/java/duke/tasks/TaskType.java +++ b/src/main/java/duke/tasks/TaskType.java @@ -1,4 +1,6 @@ package duke.tasks; + + /** * Represents different task types */ diff --git a/src/main/java/duke/tasks/ToDo.java b/src/main/java/duke/tasks/ToDo.java index 2dd37b0eaf..65def76848 100644 --- a/src/main/java/duke/tasks/ToDo.java +++ b/src/main/java/duke/tasks/ToDo.java @@ -7,11 +7,8 @@ * Represents a Todo task in the application. * A Todo provides a factory method to create itself. */ - - - public class ToDo extends Task { - + /** * Initialises a todo task with the description of the task. * From d961b46fd6f12cadf8bd7257b56d39c7488b3cdf Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Tue, 17 Sep 2019 23:03:15 +0800 Subject: [PATCH 33/46] Edit build.gradle --- build.gradle | 10 +++++++++ src/test/java/duke/core/ParserTest.java | 30 +++++++++++++------------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 0683419b1e..b47052c0b2 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,8 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'org.openjfx.javafxplugin' version '0.0.7' + id 'checkstyle' } @@ -21,6 +23,14 @@ repositories { mavenCentral() } +checkstyle { + toolVersion = '8.23' +} + +javafx { + version = "11.0.2" + modules = [ 'javafx.controls', 'javafx.fxml' ] +} application { mainClassName = 'Duke' diff --git a/src/test/java/duke/core/ParserTest.java b/src/test/java/duke/core/ParserTest.java index 2aa246a8d2..afa2aa8595 100644 --- a/src/test/java/duke/core/ParserTest.java +++ b/src/test/java/duke/core/ParserTest.java @@ -97,35 +97,37 @@ void parseCommand_missingParameter_exceptionThrown() { } /** - * Test that the parseCommand method ignores extra input when attempting to parse commands - * which require 0 arguments. + * Test that the parseCommand method properly still return an valid AddCommand + * even when the deadline is not in recognisable dateTime format */ @Test - void parseCommand_extraArgumentForNoArgumentCommands_success() { + void parseCommand_nonParseableTimeForDeadlineOrEvent_success() { try { - assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); - assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); - assertTrue(Parser.parseCommand("list a") instanceof ListCommand); - assertTrue(Parser.parseCommand("bye a") instanceof ExitCommand); + assertTrue(Parser.parseCommand("deadline task /by time") instanceof AddDeadlineCommand); + assertTrue(Parser.parseCommand("event task /at time") instanceof AddEventCommand); } catch (DukeException ex) { - fail("Should return a command ignoring the extra arguments"); + fail("Should return without formatting the time parameter into dd/MM/yyyy HHmm"); } } /** - * Test that the parseCommand method properly still return an valid AddCommand - * even when the deadline is not in recognisable dateTime format + * Test that the parseCommand method ignores extra input when attempting to parse commands + * which do not require arguments. */ @Test - void parseCommand_nonParseableTimeForDeadlineOrEvent_success() { + void parseCommand_extraArgumentForNoArgumentCommands_success() { try { - assertTrue(Parser.parseCommand("deadline task /by time") instanceof AddDeadlineCommand); - assertTrue(Parser.parseCommand("event task /at time") instanceof AddEventCommand); + assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); + assertTrue(Parser.parseCommand("list a") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye a") instanceof ExitCommand); } catch (DukeException ex) { - fail("Should return without formatting the time argument into dd/MM/yyyy HHmm"); + fail("Should return a command ignoring the extra arguments"); } } + + } \ No newline at end of file From 7fd6178f1d7464a3fd6be0f4bff78a261b289958 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Tue, 17 Sep 2019 23:03:15 +0800 Subject: [PATCH 34/46] Edit build.gradle --- build.gradle | 10 +++++++++ src/test/java/duke/core/ParserTest.java | 30 +++++++++++++------------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index 0683419b1e..b47052c0b2 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,8 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'org.openjfx.javafxplugin' version '0.0.7' + id 'checkstyle' } @@ -21,6 +23,14 @@ repositories { mavenCentral() } +checkstyle { + toolVersion = '8.23' +} + +javafx { + version = "11.0.2" + modules = [ 'javafx.controls', 'javafx.fxml' ] +} application { mainClassName = 'Duke' diff --git a/src/test/java/duke/core/ParserTest.java b/src/test/java/duke/core/ParserTest.java index 2aa246a8d2..afa2aa8595 100644 --- a/src/test/java/duke/core/ParserTest.java +++ b/src/test/java/duke/core/ParserTest.java @@ -97,35 +97,37 @@ void parseCommand_missingParameter_exceptionThrown() { } /** - * Test that the parseCommand method ignores extra input when attempting to parse commands - * which require 0 arguments. + * Test that the parseCommand method properly still return an valid AddCommand + * even when the deadline is not in recognisable dateTime format */ @Test - void parseCommand_extraArgumentForNoArgumentCommands_success() { + void parseCommand_nonParseableTimeForDeadlineOrEvent_success() { try { - assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); - assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); - assertTrue(Parser.parseCommand("list a") instanceof ListCommand); - assertTrue(Parser.parseCommand("bye a") instanceof ExitCommand); + assertTrue(Parser.parseCommand("deadline task /by time") instanceof AddDeadlineCommand); + assertTrue(Parser.parseCommand("event task /at time") instanceof AddEventCommand); } catch (DukeException ex) { - fail("Should return a command ignoring the extra arguments"); + fail("Should return without formatting the time parameter into dd/MM/yyyy HHmm"); } } /** - * Test that the parseCommand method properly still return an valid AddCommand - * even when the deadline is not in recognisable dateTime format + * Test that the parseCommand method ignores extra input when attempting to parse commands + * which do not require arguments. */ @Test - void parseCommand_nonParseableTimeForDeadlineOrEvent_success() { + void parseCommand_extraArgumentForNoArgumentCommands_success() { try { - assertTrue(Parser.parseCommand("deadline task /by time") instanceof AddDeadlineCommand); - assertTrue(Parser.parseCommand("event task /at time") instanceof AddEventCommand); + assertTrue(Parser.parseCommand("list 1") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye 1") instanceof ExitCommand); + assertTrue(Parser.parseCommand("list a") instanceof ListCommand); + assertTrue(Parser.parseCommand("bye a") instanceof ExitCommand); } catch (DukeException ex) { - fail("Should return without formatting the time argument into dd/MM/yyyy HHmm"); + fail("Should return a command ignoring the extra arguments"); } } + + } \ No newline at end of file From 53571f86e56975079f8f56f934c1082682e7c2b5 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Wed, 18 Sep 2019 23:36:01 +0800 Subject: [PATCH 35/46] Implement JavaFX --- build.gradle | 2 +- data/duke.txt | 16 +-- src/main/java/DialogBox.java | 99 ++++++++++++++++ src/main/java/Duke.java | 44 ++----- src/main/java/Launcher.java | 10 ++ src/main/java/Main.java | 34 ++++++ src/main/java/MainWindow.java | 72 ++++++++++++ src/main/java/Response.java | 23 ++++ .../duke/commands/AddDeadlineCommand.java | 4 +- .../java/duke/commands/AddEventCommand.java | 4 +- .../java/duke/commands/AddToDoCommand.java | 4 +- src/main/java/duke/commands/Command.java | 2 +- .../java/duke/commands/DeleteCommand.java | 6 +- src/main/java/duke/commands/DoneCommand.java | 8 +- src/main/java/duke/commands/ExitCommand.java | 4 +- src/main/java/duke/commands/FindCommand.java | 4 +- src/main/java/duke/commands/ListCommand.java | 4 +- src/main/java/duke/commands/NullCommand.java | 2 +- src/main/java/duke/core/Parser.java | 6 +- src/main/java/duke/core/Ui.java | 108 ++++++++++-------- src/main/java/duke/errors/DukeException.java | 6 +- src/main/resources/images/DaDuke.png | Bin 0 -> 32657 bytes src/main/resources/images/DaUser.png | Bin 0 -> 37794 bytes src/main/resources/view/DialogBox.fxml | 17 +++ src/main/resources/view/MainWindow.fxml | 19 +++ tutorials/javaFxTutorialPart2.md | 1 + tutorials/javaFxTutorialPart3.md | 1 + 27 files changed, 386 insertions(+), 114 deletions(-) create mode 100644 src/main/java/DialogBox.java create mode 100644 src/main/java/Launcher.java create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/MainWindow.java create mode 100644 src/main/java/Response.java create mode 100644 src/main/resources/images/DaDuke.png create mode 100644 src/main/resources/images/DaUser.png create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/build.gradle b/build.gradle index b47052c0b2..36c65611ca 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ javafx { } application { - mainClassName = 'Duke' + mainClassName = 'Launcher' run { standardInput = System.in } diff --git a/data/duke.txt b/data/duke.txt index 816cb2a26a..56f4ff0ae8 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,7 +1,9 @@ -1 / ToDo / ✘ / 1 -2 / ToDo / ✘ / 1 2 3 45 -3 / Deadline / ✘ / 45 / 12th of DECEMBER 1212, 12:12pm -4 / Deadline / ✘ / 1 / 1 -5 / Deadline / ✘ / 1 / 1 2 3 -6 / Deadline / ✘ / 1 / 1 -7 / Deadline / ✓ / 1 / 1 +1 / ToDo / ? / 1 +2 / ToDo / ? / 1 +3 / ToDo / ? / 1 +4 / ToDo / ? / 1 +5 / ToDo / ? / 23 +6 / ToDo / ? / 23 +7 / ToDo / ? / 23 +8 / ToDo / ? / 1 +9 / Deadline / ? / 1 / 1 diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java new file mode 100644 index 0000000000..d794009231 --- /dev/null +++ b/src/main/java/DialogBox.java @@ -0,0 +1,99 @@ +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.*; + +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; + +import java.io.IOException; + +import javafx.geometry.Insets; +import javafx.geometry.Pos; + +import java.util.Collections; + + +public class DialogBox extends HBox { + + @FXML + private Label dialog; + @FXML + private ImageView displayPicture; + + + private DialogBox(String text, Image img) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); + fxmlLoader.setController(this); + fxmlLoader.setRoot(this); + fxmlLoader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + dialog.setText(text); + + displayPicture.setImage(img); + displayPicture.setClip(new Circle(50, 50, 50));//img set to circle + dialog.setPadding(new Insets(10, 10, 10, 10)); + + } + + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + Collections.reverse(tmp); + getChildren().setAll(tmp); + setAlignment(Pos.TOP_LEFT); + } + + public static DialogBox getUserDialog(String text, Image img) { + DialogBox user = new DialogBox(text, img); + + // sets the background to a blue rounded corner box + user.setBackground( + new Background( + new BackgroundFill( + Color.rgb(0,0, 100), + new CornerRadii(10), + new Insets(5,37.5,5,37.5)))); + return user; + } + + //sets the background to green or red depending on error status + public static DialogBox getDukeDialog(String text, Image img, int errorStatus) { + DialogBox duke = new DialogBox(text, img); + + Color[] colours = new Color[]{Color.rgb(0,100, 0), + Color.rgb(100,0,0)}; + Color correctColor = colours[errorStatus]; + duke.setBackground( + new Background( + new BackgroundFill( + correctColor, + new CornerRadii(10), + new Insets(5,37.5,5,37.5)))); + + + duke.flip(); + + return duke; + } + + + + + +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5a70923684..1ce3054da2 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -11,6 +11,8 @@ import java.io.IOException; + + /** * The driver class to run user interface of Duke. Duke provides commands to add different tasks, * list out tasks, marking tasks as done, deleting tasks and storing the tasks into a file for @@ -24,48 +26,26 @@ public class Duke { /** * Initialises a new Duke application. - * @param filePath String of the directory the file is in. * @throws IOException Thrown when writing to file fails. * @throws DukeException Thrown when parts of the command cannot be executed. */ - private Duke(String filePath) throws DukeException, IOException { + public Duke() throws DukeException, IOException { + String filePath = "/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt"; this.ui = new Ui(); Storage storage = new Storage(filePath); this.taskList = new TaskList(storage.load(), storage); Task.setTaskList(taskList); } - /** - * run method which contains the logic of the application. It takes in user input - * and parses the command. The command is executed accordingly - * based on their type. - */ - private void run() throws IOException { - ui.printWelcomeMessage(); - while (ui.hasInputs()) { - try { - String input = ui.readCommand(); - Command command = Parser.parseCommand(input); - command.execute(taskList, this.ui); - if (command.getCommandType().equals(CommandType.EXIT)) { - break; - } - } catch (IllegalArgumentException | DukeException error2 ) { - ui.printErrorMessage(error2); - } + Response getResponse(String input) { + try { + Command c = Parser.parseCommand(input); + return new Response(c.execute(taskList, ui),false); + } catch (IllegalArgumentException | DukeException | IOException error2) { + return new Response(ui.printErrorMessage(error2),true); } } - /** - * Main method to drive the application - * - * @param args Placeholder - * @throws IOException Thrown when writing to file fails. - * @throws DukeException Thrown when exceptions that arise when running the application - */ - public static void main(String[] args) throws DukeException, IOException { - new Duke("/Users/isaac/Desktop/CS2103T+CS2101/CS2103T/duke/data/duke.txt") - .run(); - } - + } + diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java new file mode 100644 index 0000000000..11dbf00c62 --- /dev/null +++ b/src/main/java/Launcher.java @@ -0,0 +1,10 @@ +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class Launcher { + public static void main(String[] args) { + Application.launch(Main.class, args); + } +} \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000000..622c55ee3c --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,34 @@ +import duke.errors.DukeException; +import javafx.application.Application; +import javafx.stage.Stage; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; + + + +import java.io.IOException; + +public class Main extends Application { + + @Override + public void start(Stage stage) throws DukeException { + try { + Duke duke = new Duke(); + + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + + fxmlLoader.getController().setDuke(duke); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} + + + diff --git a/src/main/java/MainWindow.java b/src/main/java/MainWindow.java new file mode 100644 index 0000000000..b31ca31918 --- /dev/null +++ b/src/main/java/MainWindow.java @@ -0,0 +1,72 @@ +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Dialog; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; + +import duke.core.Ui; + + +/** + * Controller for MainWindow. Provides the layout for the other controls. + */ +public class MainWindow extends AnchorPane { + @FXML + private ScrollPane scrollPane; + @FXML + private VBox dialogContainer; + @FXML + private TextField userInput; + @FXML + private Button sendButton; + + private Duke duke; + + private Image userImage = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); + + private Ui ui = new Ui(); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + } + + + public void setDuke(Duke d) { + duke = d; + dialogContainer.getChildren().add(DialogBox.getDukeDialog(ui.printWelcomeMessage(), dukeImage, 0)); + } + + /** + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + @FXML + private void handleUserInput() { + String input = userInput.getText(); + Response response = duke.getResponse(input); + int mode = booleanToInteger(response.getErrorStatus()); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(input, userImage), + DialogBox.getDukeDialog(response.getMessage(), dukeImage,mode) + ); + if (input.equals("bye")) { + Platform.exit(); + System.exit(0); + } + userInput.clear(); + } + + private int booleanToInteger(boolean isTrue) { + if (isTrue) { + return 1; + } else { + return 0; + } + } +} diff --git a/src/main/java/Response.java b/src/main/java/Response.java new file mode 100644 index 0000000000..184b4558ab --- /dev/null +++ b/src/main/java/Response.java @@ -0,0 +1,23 @@ +class Response { + + private String message; + private boolean isError; + + Response(String message, boolean isError) { + this.message = message; + this.isError = isError; + } + + + String getMessage() { + return message; + } + + boolean getErrorStatus() { + return isError; + } + + + + +} diff --git a/src/main/java/duke/commands/AddDeadlineCommand.java b/src/main/java/duke/commands/AddDeadlineCommand.java index 54fad2f255..0edbbbb47a 100755 --- a/src/main/java/duke/commands/AddDeadlineCommand.java +++ b/src/main/java/duke/commands/AddDeadlineCommand.java @@ -39,10 +39,10 @@ public AddDeadlineCommand(String description, String date) { * @throws IOException Thrown when the new task cannot be added to the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws IOException { + public String execute(TaskList taskList, Ui ui) throws IOException { Deadline task = new Deadline(this.description,this.date); taskList.addToList(task); - ui.printAddMessage(task, taskList); + return ui.printAddMessage(task, taskList); } } diff --git a/src/main/java/duke/commands/AddEventCommand.java b/src/main/java/duke/commands/AddEventCommand.java index 030667cb61..d32b8846ad 100755 --- a/src/main/java/duke/commands/AddEventCommand.java +++ b/src/main/java/duke/commands/AddEventCommand.java @@ -40,10 +40,10 @@ public AddEventCommand(String description, String date) { * @param ui The main user interface of the application. * @throws IOException Thrown when the new task cannot be added to the file. */ - public void execute(TaskList taskList, Ui ui) throws IOException { + public String execute(TaskList taskList, Ui ui) throws IOException { Event task = new Event(this.description,this.date); taskList.addToList(task); - ui.printAddMessage(task, taskList); + return ui.printAddMessage(task, taskList); } diff --git a/src/main/java/duke/commands/AddToDoCommand.java b/src/main/java/duke/commands/AddToDoCommand.java index e12322e558..09b56582fc 100755 --- a/src/main/java/duke/commands/AddToDoCommand.java +++ b/src/main/java/duke/commands/AddToDoCommand.java @@ -36,10 +36,10 @@ public AddToDoCommand(String [] tokens) { * @throws IOException Thrown when the new task cannot be added to the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws IOException { + public String execute(TaskList taskList, Ui ui) throws IOException { ToDo task = ToDo.createToDo(tokens); taskList.addToList(task); - ui.printAddMessage(task, taskList); + return ui.printAddMessage(task, taskList); } } diff --git a/src/main/java/duke/commands/Command.java b/src/main/java/duke/commands/Command.java index 821a02f2c8..a765d1e219 100755 --- a/src/main/java/duke/commands/Command.java +++ b/src/main/java/duke/commands/Command.java @@ -29,7 +29,7 @@ public CommandType getCommandType() { * @throws DukeException Occurs when parts of the command cannot be executed. * @throws IOException Thrown when the file update fails. */ - public abstract void execute(TaskList taskList, Ui ui) throws DukeException, IOException; + public abstract String execute(TaskList taskList, Ui ui) throws DukeException, IOException; } diff --git a/src/main/java/duke/commands/DeleteCommand.java b/src/main/java/duke/commands/DeleteCommand.java index 07de4007ae..c2c124c87e 100755 --- a/src/main/java/duke/commands/DeleteCommand.java +++ b/src/main/java/duke/commands/DeleteCommand.java @@ -52,13 +52,13 @@ public static DeleteCommand createDeleteIfValid(String [] tokens) throws DukeExc * @throws IOException Thrown when the task cannot be removed from the file. */ @Override - public void execute(TaskList taskList, Ui ui) throws IOException { + public String execute(TaskList taskList, Ui ui) throws IOException { try { Task task = taskList.getTaskAt(index+1); taskList.removeFromList(task); - ui.printDeletion(task, taskList); + return ui.printDeletion(task, taskList); } catch (IndexOutOfBoundsException error3) { - ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); + return ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); } } diff --git a/src/main/java/duke/commands/DoneCommand.java b/src/main/java/duke/commands/DoneCommand.java index aab42e1793..1453b915d2 100755 --- a/src/main/java/duke/commands/DoneCommand.java +++ b/src/main/java/duke/commands/DoneCommand.java @@ -56,7 +56,7 @@ public static DoneCommand createDoneIfValid(String [] tokens) throws DukeExcepti * @throws IOException Thrown when the file update fails. */ @Override - public void execute(TaskList taskList, Ui ui) throws IOException { + public String execute(TaskList taskList, Ui ui) throws IOException { try { Task task = taskList.getTaskAt(index+1); boolean isDoneBefore = task.setDone(); @@ -67,12 +67,12 @@ public void execute(TaskList taskList, Ui ui) throws IOException { List inst = List.of("Nice! I've marked this task as done: ", " "+task.toString()); - ui.printInput(inst); + return ui.printInput(inst); } catch (IndexOutOfBoundsException error3) { - ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); + return ui.printOneLine(new DukeException("No such task", DukeExceptionType.MISSINGTASK).getMessage()); } catch (IllegalArgumentException error2) { - ui.printOneLine(new DukeException(error2.getMessage(), DukeExceptionType.GENERALMISTAKE).getMessage()); + return ui.printOneLine(new DukeException(error2.getMessage(), DukeExceptionType.GENERALMISTAKE).getMessage()); } } diff --git a/src/main/java/duke/commands/ExitCommand.java b/src/main/java/duke/commands/ExitCommand.java index 18158c0738..5efaa072c6 100755 --- a/src/main/java/duke/commands/ExitCommand.java +++ b/src/main/java/duke/commands/ExitCommand.java @@ -27,8 +27,8 @@ public ExitCommand(){ * @param ui The main user interface of the application. */ @Override - public void execute(TaskList taskList, Ui ui) { - ui.printByeMessage(); + public String execute(TaskList taskList, Ui ui) { + return ui.printByeMessage(); } } diff --git a/src/main/java/duke/commands/FindCommand.java b/src/main/java/duke/commands/FindCommand.java index 340cdd7c6b..2f351d83c9 100644 --- a/src/main/java/duke/commands/FindCommand.java +++ b/src/main/java/duke/commands/FindCommand.java @@ -43,9 +43,9 @@ public static FindCommand createFindCommandIfValid(String[] tokens) throws DukeE * @param taskList list containing current tasks * @param ui user interface */ - public void execute(TaskList taskList, Ui ui) { + public String execute(TaskList taskList, Ui ui) { List resultList = taskList.findTasks(this.keyword); - ui.printFindResults(resultList); + return ui.printFindResults(resultList); } diff --git a/src/main/java/duke/commands/ListCommand.java b/src/main/java/duke/commands/ListCommand.java index 01b087f75b..94f9e96971 100755 --- a/src/main/java/duke/commands/ListCommand.java +++ b/src/main/java/duke/commands/ListCommand.java @@ -25,7 +25,7 @@ public ListCommand(){ * @param ui The main user interface of the application. */ @Override - public void execute(TaskList taskList, Ui ui) { - ui.printNumberList(taskList); + public String execute(TaskList taskList, Ui ui) { + return ui.printNumberList(taskList); } } diff --git a/src/main/java/duke/commands/NullCommand.java b/src/main/java/duke/commands/NullCommand.java index 80b92383f8..30aa975acc 100755 --- a/src/main/java/duke/commands/NullCommand.java +++ b/src/main/java/duke/commands/NullCommand.java @@ -28,7 +28,7 @@ public NullCommand(){ * @throws DukeException Thrown when the command does not exist */ @Override - public void execute(TaskList taskList, Ui ui) throws DukeException { + public String execute(TaskList taskList, Ui ui) throws DukeException { throw new DukeException("Invalid Command! Please try again.", DukeExceptionType.INVALIDCOMMAND); } diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index b142023fdc..241edc8aa1 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -70,11 +70,11 @@ private static void checkValidLength(String[] tokens) throws IllegalArgumentExce List group1 = List.of("todo", "deadline", "event"); List group2 = List.of("done", "delete"); if (tokens.length == 1 && group1.contains(tokens[0])) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! The description of a %s cannot be empty.",tokens[0])); + throw new IllegalArgumentException(String.format("OOPS!!! The description of a %s cannot be empty.",tokens[0])); } else if (tokens.length == 1 && group2.contains(tokens[0])) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires integer.",tokens[0])); + throw new IllegalArgumentException(String.format("OOPS!!! %s command requires integer.",tokens[0])); } else if (tokens.length == 1 && tokens[0].equals("find")) { - throw new IllegalArgumentException(String.format("☹ OOPS!!! %s command requires keyword input.",tokens[0])); + throw new IllegalArgumentException(String.format("OOPS!!! %s command requires keyword input.",tokens[0])); } } diff --git a/src/main/java/duke/core/Ui.java b/src/main/java/duke/core/Ui.java index 3d9a7bef5f..97f24607ee 100644 --- a/src/main/java/duke/core/Ui.java +++ b/src/main/java/duke/core/Ui.java @@ -13,8 +13,6 @@ */ public class Ui { - final private static String horizontalLine = " ____________________________________________________________"; - private Scanner sc = new Scanner(System.in); @@ -40,29 +38,30 @@ public String readCommand(){ /** * Prints the welcome message of the application. */ - public void printWelcomeMessage() { + public String printWelcomeMessage() { List start = new ArrayList<>(); start.add("Hello! I'm Duke"); start.add("What can I do for you?"); - this.printInput(start); + return this.printInput(start); } - - /** * Prints a message when a task is added. * * @param task Task that was added. * @param taskList Task list where the Task is stored. */ - public void printAddMessage(Task task, TaskList taskList) { - System.out.println(horizontalLine); + public String printAddMessage(Task task, TaskList taskList) { + StringBuilder builder = new StringBuilder(); + + appendWithNewline(builder,"Got it. I've added this task: "); + appendWithNewline(builder,task.toString()); + appendWithNewline(builder, + String.format("Now you have %d tasks in the list.",taskList.getNumTasks())); + + return builder.toString(); + - System.out.println(" Got it. I've added this task: "); - System.out.println(String.format(" %s",task)); - System.out.println(String.format(" Now you have %d tasks in the list.", taskList.getNumTasks())); - System.out.println(horizontalLine); - System.out.println(); } @@ -72,14 +71,14 @@ public void printAddMessage(Task task, TaskList taskList) { * @param task Task that was deleted. * @param taskList Task list that the Task was removed from. */ - public void printDeletion(Task task, TaskList taskList) { - System.out.println(horizontalLine); + public String printDeletion(Task task, TaskList taskList) { - System.out.println(" Noted. I've removed this task: "); - System.out.println(String.format(" %s",task)); - System.out.println(String.format(" Now you have %d tasks in the list.",taskList.getNumTasks())); - System.out.println(horizontalLine); - System.out.println(); + StringBuilder builder = new StringBuilder(); + appendWithNewline(builder,"Noted. I've removed this task: "); + appendWithNewline(builder, + String.format("Now you have %d tasks in the list.",taskList.getNumTasks())); + + return builder.toString(); } @@ -89,14 +88,14 @@ public void printDeletion(Task task, TaskList taskList) { * * @param start List of Strings which needs to be printed sequentially */ - public void printInput(List start) { - System.out.println(horizontalLine); + public String printInput(List start) { + StringBuilder builder = new StringBuilder(); for (String input : start) { - System.out.println(String.format(" %s",input)); + appendWithNewline(builder,input); } - System.out.println(horizontalLine); - System.out.println(); + return builder.toString(); + } /** @@ -104,11 +103,11 @@ public void printInput(List start) { * * @param input String to be printed */ - public void printOneLine(String input) { - System.out.println(horizontalLine); - System.out.println(String.format(" %s",input)); - System.out.println(horizontalLine); - System.out.println(); + public String printOneLine(String input) { + StringBuilder builder = new StringBuilder(); + appendWithNewline(builder,input); + + return builder.toString(); } @@ -118,15 +117,18 @@ public void printOneLine(String input) { * * @param taskList List of tasks stored in the application. */ - public void printNumberList(TaskList taskList) { - System.out.println(horizontalLine); - System.out.println(" Here are the tasks in your list:"); + + + public String printNumberList(TaskList taskList) { + + StringBuilder builder = new StringBuilder(); + appendWithNewline(builder, "Here are the tasks in your list:"); for (int i = 0; i < taskList.getNumTasks(); i++) { - System.out.println(String.format(" %d.%s",i+1, taskList.getTaskAt(i+1))); + appendWithNewline(builder, + String.format("%d.%s",i+1, taskList.getTaskAt(i+1))); } - System.out.println(horizontalLine); - System.out.println(); + return builder.toString(); } @@ -135,35 +137,47 @@ public void printNumberList(TaskList taskList) { * * @param lst List of tasks with matching keyword */ - public void printFindResults(List lst) { - System.out.println(horizontalLine); - System.out.println(" Here are the matching tasks in your list:"); + public String printFindResults(List lst) { + + StringBuilder builder = new StringBuilder(); + + + builder.append("Here are the matching tasks in your list:"); + builder.append("\n"); for (int i = 0; i < lst.size(); i++) { - System.out.println(String.format(" %d.%s",i+1, lst.get(i))); + appendWithNewline(builder, + String.format("%d.%s",i+1, lst.get(i))); } - System.out.println(horizontalLine); - System.out.println(); + + return builder.toString(); } /** * Prints the exit message. */ - public void printByeMessage() { - this.printOneLine("Bye. Hope to see you again soon!"); + public String printByeMessage() { + + return this.printOneLine("Bye. Hope to see you again soon!"); } + /** * Prints out the exception. * * @param e Exception object whose message is to be printed out */ - public void printErrorMessage(Exception e) { - this.printOneLine(e.getMessage()); + public String printErrorMessage(Exception e) { + return this.printOneLine(e.getMessage()); + } + + + private void appendWithNewline(StringBuilder builder, String msg) { + builder.append(msg); + builder.append("\n"); } - } diff --git a/src/main/java/duke/errors/DukeException.java b/src/main/java/duke/errors/DukeException.java index 59aded7651..5e00dcb915 100644 --- a/src/main/java/duke/errors/DukeException.java +++ b/src/main/java/duke/errors/DukeException.java @@ -20,11 +20,11 @@ public DukeException(String error, DukeExceptionType type){ public String getMessage() { switch (type) { case INVALIDCOMMAND: - return "☹ OOPS!!! I'm sorry, but I don't know what that means :-("; + return "OOPS!!! I'm sorry, but I don't know what that means :-("; case NOTINTEGER: - return "☹ Invalid input, must be an integer!!"; + return "Invalid input, must be an integer!!"; case MISSINGTASK: - return "☹ No such task"; + return "No such task"; case GENERALMISTAKE: return super.getMessage(); case FILENOTFOUND: diff --git a/src/main/resources/images/DaDuke.png b/src/main/resources/images/DaDuke.png new file mode 100644 index 0000000000000000000000000000000000000000..d893658717e29b50b4ceedada235d9f75835a118 GIT binary patch literal 32657 zcmV)5K*_&}P)Zf>Tg`t%N;{PE9Y2%-o7`CdniQG#9szpJX+ zcrVK`zK7pG^!n{1T{qo3os(XNkTqW0IXIfGihv^wpO4cHg6YjrzS7VYZJZVWev% z!fK9RcD(ntf zCxMCmC7oRZecuOe6J~p&f5@?I;U2zE;O2T?Vy_8UZ1S4i=b>l%q0jeYAI+i(>K zsIun-!&|SPodfa+5u7Z5yhtd`XRjxuF+Ww~1H4xg)(?GXYLo{q2VPiixh(3*`0iyFHj`V{p-_+Q4jWKC=o6ohr zW)q;Nb7IxtY}qD4RyBpAMv`rR!YytU)sgEIa8F)wX(O<=RwjYY+sLdy0`5o0>=a zd(GePvuhIc}2|`2Y7OgN%4u~XV>q*3e$65qJ;}bK0Li-Wh%~iQn_FhV_*O6|& z$E%S!>BN;~l+|jbw5B2<783HDuPYE-T1Z)&EZTFhZGIj)nseO*|7}7`Vz4%vMl&l& z!c*D(>n3|ulhD`D1FzG)Tik79GgrpJ#HE0O)y{gM#c%L1=xtu`A<9oj(;}Q6cpHb= zIjOSNTO3vD|G|N_tH+^nj?I`D4+@;j;9`s4!*lY>X2_|khHWO LGkWs%c&z?S( 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 z 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 KMNUMnLSTa5`eeEQ literal 0 HcmV?d00001 diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..e127a30a10 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..435f3ce0d8 --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + - + - \ No newline at end of file + + diff --git a/src/test/java/duke/core/ParserTest.java b/src/test/java/duke/core/ParserTest.java index afa2aa8595..52fc13503f 100644 --- a/src/test/java/duke/core/ParserTest.java +++ b/src/test/java/duke/core/ParserTest.java @@ -38,8 +38,6 @@ void parseDateTime_validInput_success() { Parser.parseDateTime("12/12/1212 0013")); assertEquals("23rd of FEBRUARY 2019, 11:12pm", Parser.parseDateTime("23/02/2019 2312")); - assertEquals("1st of FEBRUARY 2019, 12am", - Parser.parseDateTime("01/02/2019 0000")); } catch (DukeException e) { fail("Should not have thrown exception"); } @@ -126,8 +124,4 @@ void parseCommand_extraArgumentForNoArgumentCommands_success() { } } - - - - } \ No newline at end of file From cd3fa9faf1c40e56e78fe43210a623171a18a213 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Thu, 26 Sep 2019 19:12:18 +0800 Subject: [PATCH 41/46] Add Ui and User Guide --- data/duke.txt | 9 +- docs/README.md | 123 +++++++++++++++++++++++++--- docs/Ui.png | Bin 0 -> 255535 bytes src/main/java/duke/core/Parser.java | 5 ++ 4 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 docs/Ui.png diff --git a/data/duke.txt b/data/duke.txt index 7ba5328654..189d9fc5a5 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,6 +1,3 @@ -1 / ToDo / 1 / 1 -2 / Event / 0 / 1 / 12th of DECEMBER 1212, 12:12pm -3 / ToDo / 0 / 1 -4 / ToDo / 0 / wjrnwebfnjhdf jdnfjndfjndfjndjfndjfndjfndjnfjdnfjdnfjndjfndjfndjfndjnfjdnfjndjfndjfnjdfndjnfjdfjndjfndjfndjnfjdnfjnddjf -5 / Deadline / 0 / 1 / 1st of FEBRUARY 2019, 12am -6 / Deadline / 0 / 1 / Mon +1 / ToDo / 0 / read book +2 / Deadline / 1 / homework / 12th of DECEMBER 1212, 12:12pm +3 / Event / 0 / jogging with friends / Wednesday diff --git a/docs/README.md b/docs/README.md index fd44069597..ac527353a6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,20 +1,123 @@ # User Guide -## Features +[1. Introduction](#Introduction) +[2. Quick Start](#Quick-Start) +[3. Features](#Features) +[4. FAQ](#FAQ) +[5. Command Summary](#Command-Summary) -### Feature 1 -Description of feature. +## 1. Introduction -## Usage +Duke is for those who prefer to use a desktop app for managing tasks. +More importantly, DukeBot is optimized for those who prefer to work with a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). Enjoy! -### `Keyword` - Describe action -Describe action and its outcome. +## 2. Quick Start +1. Ensure you have Java 11 or above installed in your Computer. -Example of usage: +2. Download the latest duke-0.2.0.jar [here](https://github.com/qweiping31415/duke/releases) -`keyword (optional arguments)` +## 3. Features -Expected outcome: +### 3.1. Viewing help +Shows a simple user guide to command formats. +Format: `help` -`outcome` + +### 3.2. Adding a task: `todo`, `deadline`, `event` +Adds a task to the list + + +##### 3.2.1. Adding a ToDo Task: `todo` +Adds a ToDo task to the list +Format: `todo TASK_DESCRIPTION` +Examples: +* `todo homework` +* `todo read book` + +##### 3.2.2. Adding a Deadline Task: `deadline` +Adds a Deadline task to the list +Format: `deadline TASK_DESCRIPTION /by DUE_DATETIME` +Examples: +* `deadline do homework /by 3pm` +* `deadline do homework /by Monday` + +> ###### **Formatted date and time**: +> If `DUE_DATETIME` is entered in the `DD/MM/YYYY HHMM` format, it will automatically be converted to a more readable format. +> +>Example: +>`deadline do homework /by 12/12/1212 1212` + +##### 3.2.3. Adding a Event Task: `event` +Adds an Event task to Duke +Format: `event TASK_DESCRIPTION /by DUE_DATETIME` +Example: +* `event consultation /at 3pm` +* `event consultation /at Monday` + +> ###### **Formatted date and time**: +> If `DUE_DATETIME` is entered in the `DD/MM/YYYY HHMM` format, it will automatically be converted to a more readable format. +> +>Example: +>`event consultation /at 12/12/1212 1212` + + +### 3.3. Finding tasks by keyword: `find` +Finds tasks whose descriptions contain an exact match of the given keyword. + +Format: `find KEYWORD` +Example: +* `find homework` + + +### 3.4. Marking a task as done: -- `done` +Marks the specified task in the list as done. + +Format: `done INDEX` +* Marks the tasks at the specified INDEX. +* The index refers to the index number shown in the displayed task list. +* The index must be a positive integer 1, 2, 3, …​ + + +### 3.5. Deleting a task: -- `delete` +Deletes the specified task from the list. +Format: `delete INDEX` +* Deletes the tasks at the specified INDEX. +* The index refers to the index number shown in the displayed task list. +* The index must be a positive integer 1, 2, 3, …​ + + +### 3.6. Listing all tasks : -- `list` +Shows a list of all tasks in the list. +Format: `list` + + +### 3.7. Exiting the program: -- `bye` +Exits the program. +Format: `bye` + + +## 4. FAQ +* None + + +## 5. Command Summary +* Add : `CODE_NAME TASK_DESCRIPTION [ADDITIONAL_KEYWORD] [DUE_DATETIME]` +e.g. `todo homework` +e.g. `deadline do homework /by 3pm` +e.g. `event consultation /at 12/12/1212 1212` + +* Find : `find KEYWORD` +e.g. `find homework` + +* Delete : `delete INDEX` +e.g. `delete 3` + +* Done : `done INDEX` +e.g. `done 3` + +* List : `list` + +* Help : `help` + +* Exit : `bye` diff --git a/docs/Ui.png b/docs/Ui.png new file mode 100644 index 0000000000000000000000000000000000000000..24ebc022609375d83a11fd38bdfee6b9d28bb268 GIT binary patch literal 255535 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νVP`7rQcjUq%)67 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

wHAVy)latL$tuLXZT_bWUX5Sn6dNQn&k^?0DCt@ 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�v-I<;w2Jxg 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 |QCdSLu}gRfiZ>M&IC81? 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 d2jMlSeQ>i70Y7jT^LY9;gs zvLAl!>rAV+UXJkrs*Jv)=Fi!qW=H3i`$0f!wa7giam4w&HP*##*f7KxQb)6AWNe@E zmFjr8t^nd!0&FfXF6@3~1=*mr&++`;V&LEA-NGcKC{GWM{`CrJ{kEenQOUxJ=a~^4SLu`&}03a&}z-Nun zD)7bJz8K%OHPzaN27D!IkudTQQ#Ej+YYc-ylV9hNv2+yupr#PbRHT9=h!!CT;n6g{ z`56jPRd8}C;ezyNir8HNitpv4Ulg+QW=?PMHB3u@+XImUACUzD-r_c!J#Um81Tz0u z4y!rgmB2E7f!UnDI5z8n!uzH2^c^;s7y5LeS$s1=aW5ut0p-eW}hLbgNoa)&)Vpo#Hb{i5r_EH z-U72G!8OO-?Rn5LRfr+9zX_GfYb6GUS-X5a6w33V@vhF>4n^rg?KBtq_Y&>yaHLuA} z6k|>Ai$N-&Ii^+dh$JSqA!-|``DyE=eCy4U)q?Z9uKf^Afx%pKH$6W z`LAb4vCqZ~>Q7eh)%lyjkH$2^YUA_}T3x998794NJM<gX((^hzB0b)+O$`0(MhK8_FSq70(_};QHm7xAHyL-1j#dwv9DUsXh%n{mvl8XL)gao zYxWEK)hYhAPof~HSs@k$At@hzRFk}aKaP=Ex(2HuhgB`DdzQ`*wb}iym=PceZxx1` zp8w$D(GJyPzMe6}&bIbJJ5f}XKqCcoR?CA*FNNY9{k?m#ak!sC<0&`oIl=i_vsC&A zMF`B7_ZrdlrWvkyC-ROTKf6&D5c$(pSPUfEtCxThxi>wY4#tfS^kh)SK76X~4Wrjk z(b9rT!lqT9=nKOp<4ei){N(P-P5Am#N>XW_CGycu$9^`QpK0>F8@RmC^XJ^W{#7s2 zh=Wzvb)a|{7H-%t1>Xl1m4bn7mb{;=9HfF}w#ZWIHaW4n_hKA>IKp&vg4&iQ%^}7&56}5v94b9#Gjkj6cWqAfy zPB!e#FuGKs#&kuK8ejAA4E9?!w1W?;g!*Vp8a7`rt31sxjb25W9HNgu?LYARWlc*P zu=yFV2Tr}~8B(9!3d_0elR7PzFw=T1YPfPgz;QeT%n)b;o6)HOHAaSA&0QY*W@M+DT6(8iz)FUIst(4@mHE100+fuQ zM8|=5JAz5y)D#lBF5iwX@+!sI?V$TewHgw$KH8Z%AcI0}F_1jaAv&@wG)?SUwp4c- zKRcQr)$lhrLkPBZ?2Gup!I9FP7Z~e${ww4Dk0ow#mRQ2RLz%g(=U0xTy?{t-33qD> z>2zA*wV3ldbJ7!>L;0cr-v*?{p(eCYGnp=28aT3|J}~V4ng`$I;31$qf=6cJT1V~7 z#R{;6gO#)r|E3Ta!~96&O~|$3V;QZU^B31|71qwu^qKf*!cA1*%Mng|!tmgSfyiIX za6{pc@V2ZQk8fa+UI})CC!dkK{pAY`L${{AA092N@vd&(9)C$_JaHYF8~Qdnrkw(7 z!c}WK9z&jUrTz6dfMk3W*ga<{NpCF^WtG;UvbK07IIg)$gE%4jr%NuKIS!c(L4&jV zeN@EQlb5HTKgv&lAPYSFq&e?b_-^0^A9EHzT;DI|B}EEuC5=$Tg$n|!*D;R<`~G5i z#Z^tGI-NfZq&I$90@4H%3$tV$CN2GMloVgg*U;HCDUIR35SM-x3LgYlZ;mnw%>Fbl z{^dq$LOP8dj**t^{x?DK)?TW!fi&~Y+JwtU{~IsJ=l`$Uil_~%{>90(mHhw(gn9yQ z9)$ei9=&F1pR1_cLde|Dwi?6toFv^$r>y0fj%J4w;ZHv|wp9%_`@Xn|~Sl zOb(_H@Ju;#Mer9*F1SN}2_DznZIPOL94k?h`BPzDuP^|uL66s$>y5`*Bkd8W0(KrW z2*~D0d={||{kDm@Kh@;I>SvcA8+yFsQG3S?CYj@JG;1@^?IDE3C@)UcR}7>6CoT4- z0SZ5i1c(aGyUqO1%J4_=UtE3_FmIUKZM;Hcw@SZuuz_K|d;3U<%ZrtZ8hradQO`eU literal 0 HcmV?d00001 diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index af24e0b0bc..77c68773ff 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -103,6 +103,9 @@ private static Command createAddCommandIfValid(String[] tokens, String fullComma * @return The formatted date and time, if it can be formatted * @throws DukeException Thrown when the input cannot be formatted */ + + //@@author qweiping31415-reused + //Reused from @briyanii with minor modifications public static String parseDateTime(String dateTimeString) throws DukeException { assert dateTimeString != null; try { @@ -162,8 +165,10 @@ private static String getFormattedDay(int day) { } } } + //@@author + // helper method to check if the given date and time of a deadline or event task // can be recognised as a DateTime format. private static Command createDateCommandIfValid(String[] tokens, String fullCommand, int mode) From 40f8bcf9d8f0a142d86909fad7a573823b2e4b93 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Sat, 28 Sep 2019 15:24:46 +0800 Subject: [PATCH 42/46] Fix Storage issues and cross platform --- build.gradle | 32 +++++++++---- src/main/java/DialogBox.java | 3 ++ src/main/java/Duke.java | 9 ++-- src/main/java/Main.java | 1 + src/main/java/MainWindow.java | 3 ++ .../java/duke/commands/AddToDoCommand.java | 3 -- src/main/java/duke/core/Parser.java | 7 ++- src/main/java/duke/core/Storage.java | 45 ++++++++++++++++--- src/main/java/duke/core/TaskList.java | 2 +- 9 files changed, 75 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index 36c65611ca..a577bacfa6 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '5.1.0' - id 'org.openjfx.javafxplugin' version '0.0.7' id 'checkstyle' } @@ -11,13 +10,13 @@ plugins { shadowJar { archiveBaseName = "duke" - archiveVersion = "0.1.0" + archiveVersion = "0.2.0" archiveClassifier = null archiveAppendix = null } group 'seedu.duke' -version '0.1.0' +version '0.2.0' repositories { mavenCentral() @@ -27,10 +26,6 @@ checkstyle { toolVersion = '8.23' } -javafx { - version = "11.0.2" - modules = [ 'javafx.controls', 'javafx.fxml' ] -} application { mainClassName = 'Launcher' @@ -41,9 +36,28 @@ application { dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' -} + String javaFxVersion = '11.0.2' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-media', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-media', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-media', version: javaFxVersion, classifier: 'linux' + testImplementation 'org.junit.jupiter:junit-jupiter:5.5.0' + } test { useJUnitPlatform(); } + + + diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java index a133ff3c3b..49eda03543 100644 --- a/src/main/java/DialogBox.java +++ b/src/main/java/DialogBox.java @@ -24,6 +24,9 @@ * This control represents a dialog box consisting of an ImageView to represent the speaker's face and a label * containing text from the speaker. */ + +//Some design for DialogBox.fxml +//adapted from https://github.com/calvincxz/duke/blob/master/src/main/resources/view/DialogBox.fxml public class DialogBox extends HBox { @FXML diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d9f677a2cc..d98b68e31a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -12,7 +12,6 @@ import java.io.IOException; - /** * The driver class to run user interface of Duke. Duke provides commands to add different tasks, * list out tasks, marking tasks as done, deleting tasks and storing the tasks into a file for @@ -26,15 +25,13 @@ public class Duke { /** * Initialises a new Duke application. - * @throws IOException Thrown when writing to file fails. * @throws DukeException Thrown when parts of the command cannot be executed. */ - Duke() throws DukeException, IOException { - String filePath = "./data/duke.txt"; - this.ui = new Ui(); - Storage storage = new Storage(filePath); + Duke() throws DukeException { + Storage storage = Storage.createStorageIfRequired(); this.taskList = new TaskList(storage.load(), storage); Task.setTaskList(taskList); + this.ui = new Ui(); } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d45568b5d0..35a848aded 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -4,6 +4,7 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; + import java.io.IOException; /** diff --git a/src/main/java/MainWindow.java b/src/main/java/MainWindow.java index b31ca31918..95766d6d94 100644 --- a/src/main/java/MainWindow.java +++ b/src/main/java/MainWindow.java @@ -14,6 +14,9 @@ /** * Controller for MainWindow. Provides the layout for the other controls. */ + +//Some design for MainWindow.fxml +//adapted from https://github.com/calvincxz/duke/blob/master/src/main/resources/view/MainWindow.fxml public class MainWindow extends AnchorPane { @FXML private ScrollPane scrollPane; diff --git a/src/main/java/duke/commands/AddToDoCommand.java b/src/main/java/duke/commands/AddToDoCommand.java index b462bf1fd9..ed2fbcc5d8 100755 --- a/src/main/java/duke/commands/AddToDoCommand.java +++ b/src/main/java/duke/commands/AddToDoCommand.java @@ -29,7 +29,6 @@ public AddToDoCommand(String [] tokens) { } - /** * Adds the to-do task to the task list and prints the result. * @@ -40,9 +39,7 @@ public AddToDoCommand(String [] tokens) { @Override public String execute(TaskList taskList, Ui ui) throws IOException { ToDo task = ToDo.createToDo(tokens); - DukeAssertions.assertNotNull(taskList,ui); - taskList.addToList(task); return ui.printAddMessage(task, taskList); } diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index 77c68773ff..a221fc33e1 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -48,7 +48,6 @@ public static Command parseCommand(String input) throws DukeException, IllegalAr } else if (tokens[0].equals("find")) { return FindCommand.createFindCommandIfValid(tokens); } else { - System.out.println(tokens[0]); return Parser.createAddCommandIfValid(tokens, input); } } @@ -105,14 +104,14 @@ private static Command createAddCommandIfValid(String[] tokens, String fullComma */ //@@author qweiping31415-reused - //Reused from @briyanii with minor modifications + //Reused from https://github.com/briyanii/duke/blob/master/src/main/java/duke/command/Parser.java + // with minor modifications public static String parseDateTime(String dateTimeString) throws DukeException { assert dateTimeString != null; try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HHmm"); LocalDateTime dateAndTime = LocalDateTime.parse(dateTimeString, formatter); - int year = dateAndTime.getYear(); String month = dateAndTime.getMonth().toString(); int day = dateAndTime.getDayOfMonth(); @@ -168,7 +167,7 @@ private static String getFormattedDay(int day) { //@@author - + // helper method to check if the given date and time of a deadline or event task // can be recognised as a DateTime format. private static Command createDateCommandIfValid(String[] tokens, String fullCommand, int mode) diff --git a/src/main/java/duke/core/Storage.java b/src/main/java/duke/core/Storage.java index 00464ae34b..3ec1af2f21 100644 --- a/src/main/java/duke/core/Storage.java +++ b/src/main/java/duke/core/Storage.java @@ -1,6 +1,7 @@ package duke.core; import java.io.*; +import java.nio.file.Paths; import java.util.Scanner; import java.util.ArrayList; @@ -14,25 +15,54 @@ + /** - * Represents the storage of the application. Provides methods that to overwrite - * the contents of the file and loading data from the file. + * Represents the storage of the application. Provides methods that create a storage, + * overwrite the contents of the file and loading data from the file. */ public class Storage{ private File file; + /** + * Initialises the Storage with the file + * + * @param file File Object + */ + private Storage(File file) { + this.file = file; + } /** - * Initialises the Storage with the file path of the file + * Creates a Storage for the application + * It creates a new directory with a new text file if there is no existing file * - * @param filePath String of the directory the file is in. + * @return Storage for the application */ - public Storage(String filePath){ - this.file = new File(filePath); + public static Storage createStorageIfRequired() { + String path = System.getProperty("user.home"); + path += File.separator + "DukeData"; + File customDir = new File(path); + if (!customDir.exists()) { + customDir.mkdirs(); + } + + path += File.separator + "data.txt"; + File file = new File(path); + + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return new Storage(file); } + /** * Reads the data stored in the file, after which the date would be used * to generate a ArrayList that would be returned. @@ -43,7 +73,7 @@ public Storage(String filePath){ public ArrayList load() throws DukeException { ArrayList taskList = new ArrayList<>(); try { - Scanner sc = new Scanner(file); + Scanner sc = new Scanner(this.file); while (sc.hasNext()) { String line = sc.nextLine(); taskList.add(formatFileToTask(line)); @@ -63,6 +93,7 @@ public ArrayList load() throws DukeException { */ void overwriteStorage(ArrayList taskList) throws IOException{ assert (this.file != null); + FileWriter fw = new FileWriter(this.file); for (Task task: taskList){ switch (task.getType()) { diff --git a/src/main/java/duke/core/TaskList.java b/src/main/java/duke/core/TaskList.java index 9c22556819..01378a6760 100644 --- a/src/main/java/duke/core/TaskList.java +++ b/src/main/java/duke/core/TaskList.java @@ -28,7 +28,6 @@ public TaskList(Storage storage){ this.storage = storage; } - /** * Initialises the TaskList, with a given ArrayList to store the tasks, * and holds a reference to the main storage @@ -51,6 +50,7 @@ public TaskList(ArrayList list, Storage storage){ public void addToList(Task task) throws IOException { this.taskList.add(task); this.storage.overwriteStorage(taskList); + } From 6d606b1630d4440cf012378c399d21ac599eeaba Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Sat, 28 Sep 2019 15:43:28 +0800 Subject: [PATCH 43/46] Update UG --- docs/README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/README.md b/docs/README.md index ac527353a6..68dbdc0eb0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,10 @@ # User Guide -[1. Introduction](#Introduction) -[2. Quick Start](#Quick-Start) -[3. Features](#Features) -[4. FAQ](#FAQ) -[5. Command Summary](#Command-Summary) +[1. Introduction](README.md#Introduction) +[2. Quick Start](README.md#Quick-Start) +[3. Features](README.md#Features) +[4. FAQ](README.md#FAQ) +[5. Command Summary](README.md#Command-Summary) ## 1. Introduction @@ -31,6 +31,7 @@ Adds a task to the list ##### 3.2.1. Adding a ToDo Task: `todo` Adds a ToDo task to the list Format: `todo TASK_DESCRIPTION` + Examples: * `todo homework` * `todo read book` @@ -38,6 +39,7 @@ Examples: ##### 3.2.2. Adding a Deadline Task: `deadline` Adds a Deadline task to the list Format: `deadline TASK_DESCRIPTION /by DUE_DATETIME` + Examples: * `deadline do homework /by 3pm` * `deadline do homework /by Monday` @@ -51,6 +53,7 @@ Examples: ##### 3.2.3. Adding a Event Task: `event` Adds an Event task to Duke Format: `event TASK_DESCRIPTION /by DUE_DATETIME` + Example: * `event consultation /at 3pm` * `event consultation /at Monday` @@ -70,7 +73,7 @@ Example: * `find homework` -### 3.4. Marking a task as done: -- `done` +### 3.4. Marking a task as done: `done` Marks the specified task in the list as done. Format: `done INDEX` @@ -79,7 +82,7 @@ Format: `done INDEX` * The index must be a positive integer 1, 2, 3, …​ -### 3.5. Deleting a task: -- `delete` +### 3.5. Deleting a task: `delete` Deletes the specified task from the list. Format: `delete INDEX` * Deletes the tasks at the specified INDEX. @@ -87,12 +90,12 @@ Format: `delete INDEX` * The index must be a positive integer 1, 2, 3, …​ -### 3.6. Listing all tasks : -- `list` +### 3.6. Listing all tasks : `list` Shows a list of all tasks in the list. Format: `list` -### 3.7. Exiting the program: -- `bye` +### 3.7. Exiting the program: `bye` Exits the program. Format: `bye` From 731c14fda26bc96de4f996136d5f0bf127fe246e Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Sat, 28 Sep 2019 15:56:46 +0800 Subject: [PATCH 44/46] Add Ui.png to UG --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index 68dbdc0eb0..3d0786fcd2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,6 +17,8 @@ More importantly, DukeBot is optimized for those who prefer to work with a Comma 2. Download the latest duke-0.2.0.jar [here](https://github.com/qweiping31415/duke/releases) +![Ui.png](Ui.png) + ## 3. Features ### 3.1. Viewing help From dcb45d8a10f9489d9f59cf9dc009847d7534e56d Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Sun, 29 Sep 2019 18:27:07 +0800 Subject: [PATCH 45/46] Fix Whitespace Bug --- src/main/java/duke/core/Parser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/duke/core/Parser.java b/src/main/java/duke/core/Parser.java index a221fc33e1..0c3c2783ed 100644 --- a/src/main/java/duke/core/Parser.java +++ b/src/main/java/duke/core/Parser.java @@ -32,7 +32,9 @@ public class Parser { */ public static Command parseCommand(String input) throws DukeException, IllegalArgumentException { String[] tokens = input.split(" "); - if (tokens[0].equals("bye")) { + if (tokens.length == 0) { + return new NullCommand(); + } else if (tokens[0].equals("bye")) { return new ExitCommand(); } else if (tokens[0].equals("list")) { return new ListCommand(); From 0f67b45fbe5a15e27dd1f274ba65aaccbb90a092 Mon Sep 17 00:00:00 2001 From: Isaac Quek Date: Mon, 30 Sep 2019 21:10:46 +0800 Subject: [PATCH 46/46] Update UG --- build.gradle | 4 ++-- docs/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index a577bacfa6..57da0fa3b3 100644 --- a/build.gradle +++ b/build.gradle @@ -10,13 +10,13 @@ plugins { shadowJar { archiveBaseName = "duke" - archiveVersion = "0.2.0" + archiveVersion = "0.2.1" archiveClassifier = null archiveAppendix = null } group 'seedu.duke' -version '0.2.0' +version '0.2.1' repositories { mavenCentral() diff --git a/docs/README.md b/docs/README.md index 3d0786fcd2..4176e6a514 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ More importantly, DukeBot is optimized for those who prefer to work with a Comma ## 2. Quick Start 1. Ensure you have Java 11 or above installed in your Computer. -2. Download the latest duke-0.2.0.jar [here](https://github.com/qweiping31415/duke/releases) +2. Download the latest duke-0.2.1.jar [here](https://github.com/qweiping31415/duke/releases) ![Ui.png](Ui.png)