From d8398594b7bc43da5eb865321c5a50cec4b3923d Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/73] Add Gradle support --- build.gradle | 46 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 337 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..20c0521cc7 --- /dev/null +++ b/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'application' + id 'checkstyle' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +checkstyle { + toolVersion = '8.29' +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From ab74434a63f88922dfd43150d82feb821e488df1 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 19:34:48 +0800 Subject: [PATCH 02/73] Level-1: Added Greet, Echo, Exit functions for Duke --- src/main/java/Duke.java | 58 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334cc..05277becc2 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,56 @@ +import java.util.Scanner; + public class Duke { + private static int lv = 1; + private static String[] features = {"Nothing", "Greet, Echo, Exit"}; + private static String[] featuresCombined; + private static boolean canExit = false; + + /** + * This function takes an input string and formats it by including horizontal lines above + * and below the input string + * + * @param str + * @return the original string sandwiched between two horizontal lines + */ + public static String sandwich(String str) { + return "____________________________________________________________\n" + + str + "\n" + + "____________________________________________________________"; + } + public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + // commented out logo +// String logo = " ____ _ \n" +// + "| _ \\ _ _| | _____ \n" +// + "| | | | | | | |/ / _ \\\n" +// + "| |_| | |_| | < __/\n" +// + "|____/ \\__,_|_|\\_\\___|\n"; +// System.out.println("Hello from\n" + logo); + // Welcome message + String welcome = "Hello! I'm Duke: Level " + lv + "\n" + + "What would you like to do today?\n" + + "My current features are: " + features[lv]; + + + System.out.println(sandwich(welcome)); + + // Goodbye message + String goodbye = "Thank you for using Duke: Level " + lv + "\n" + + "See you soon!"; + + // Scanner to read user inputs + Scanner scanner = new Scanner(System.in); + while (!canExit) { + String userInput = scanner.nextLine(); + if (userInput.equals("bye")) { + canExit = true; + System.out.println(sandwich(goodbye)); + } else { + System.out.println(sandwich("You have entered: " + userInput)); + } + } } + + } From c8163cff1815e677531a9fcdb91d90ec720ede29 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 19:35:46 +0800 Subject: [PATCH 03/73] Included gitignore file, ignore all files with .class extension --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f69985ef1f..9348a01c9c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.txt text-ui-test/EXPECTED-UNIX.TXT +*.class From 7f6a9e457c55158d82ebfa53f518c7dc7b9f1967 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 20:25:55 +0800 Subject: [PATCH 04/73] Level-2: Added Add, List functions for Duke --- src/main/java/Duke.java | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 05277becc2..d937179e5e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,9 +1,9 @@ import java.util.Scanner; +import java.util.ArrayList; public class Duke { - private static int lv = 1; - private static String[] features = {"Nothing", "Greet, Echo, Exit"}; - private static String[] featuresCombined; + private static int lv = 2; + private static String[] features = {"", "Greet, Echo, Exit", ", Add, List"}; private static boolean canExit = false; /** @@ -27,11 +27,17 @@ public static void main(String[] args) { // + "| |_| | |_| | < __/\n" // + "|____/ \\__,_|_|\\_\\___|\n"; // System.out.println("Hello from\n" + logo); + + // populating featuresCombined so each level has all elements of levels before it + StringBuilder featuresCombined = new StringBuilder(); + for (int count = 0; count <= lv; count++) { + featuresCombined.append(features[count]); + } + // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" + "What would you like to do today?\n" - + "My current features are: " + features[lv]; - + + "My current features are: " + featuresCombined; System.out.println(sandwich(welcome)); @@ -41,16 +47,29 @@ public static void main(String[] args) { // Scanner to read user inputs Scanner scanner = new Scanner(System.in); + + // storing userInput + ArrayList inputs = new ArrayList<>(); + while (!canExit) { String userInput = scanner.nextLine(); - if (userInput.equals("bye")) { + if (userInput.equals("bye")) { // user inputs 'bye', set canExit to true and Exit canExit = true; System.out.println(sandwich(goodbye)); - } else { - System.out.println(sandwich("You have entered: " + userInput)); + } else { // user inputs 'list' or something else + if (userInput.equals("list")) { // user inputs 'list', return all text stored + StringBuilder userInputsList = new StringBuilder(); + for (int i = 0; i < inputs.size() - 1; i++) { // new line except for last item + userInputsList.append(i + 1).append(". ").append(inputs.get(i)).append("\n"); + } + userInputsList.append(inputs.size()).append(". ") + .append(inputs.get(inputs.size() - 1)); + System.out.println(sandwich(userInputsList.toString())); + } else { // store userInput, tell user their input has been added + inputs.add(userInput); + System.out.println(sandwich("added: " + userInput)); + } } } } - - } From 073b8bc3df5237ec1d626ef6cd82d19059a0a3c9 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 20:44:02 +0800 Subject: [PATCH 05/73] Created a Task class to represent tasks added by user --- src/main/java/Task.java | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..d7bf8dccdc --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,34 @@ +/** + * This class encapsulates a Task object. + */ + +public class Task { + protected String description; + protected boolean isDone; + + /** + * Creates a task with the specified description, isDone false by default. + * + * @param description + */ + public Task(String description) { + this.description = description; + this.isDone = false; + } + + /** + * Getter method for status using isDone + * + * @return an icon 'X' if complete, space if otherwise + */ + public String getStatusIcon() { + return (isDone ? "X" : " "); // mark done task with X + } + + /** + * Setter method for isDone of a Task object + */ + public void markAsDone() { + this.isDone = true; + } +} From 94a2613dcc2b45ac7d13d88e7f728991db07621c Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 20:53:51 +0800 Subject: [PATCH 06/73] Changed Duke.java to represent userInputs as an ArrayList of Task objects instead of an ArrayList of String(s) --- src/main/java/Duke.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d937179e5e..fef837bce6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,9 +2,10 @@ import java.util.ArrayList; public class Duke { - private static int lv = 2; - private static String[] features = {"", "Greet, Echo, Exit", ", Add, List"}; + private static int lv = 3; + private static String[] features = {"", "Greet, Echo, Exit", ", Add, List", ", Mark as Done"}; private static boolean canExit = false; + private static ArrayList taskArrayList = new ArrayList<>(); /** * This function takes an input string and formats it by including horizontal lines above @@ -48,7 +49,7 @@ public static void main(String[] args) { // Scanner to read user inputs Scanner scanner = new Scanner(System.in); - // storing userInput + // storing userInput (no longer used) ArrayList inputs = new ArrayList<>(); while (!canExit) { @@ -59,15 +60,16 @@ public static void main(String[] args) { } else { // user inputs 'list' or something else if (userInput.equals("list")) { // user inputs 'list', return all text stored StringBuilder userInputsList = new StringBuilder(); - for (int i = 0; i < inputs.size() - 1; i++) { // new line except for last item - userInputsList.append(i + 1).append(". ").append(inputs.get(i)).append("\n"); + for (int i = 0; i < taskArrayList.size() - 1; i++) { // new line except for last item + userInputsList.append(i + 1).append(". ").append(taskArrayList.get(i).description).append("\n"); } - userInputsList.append(inputs.size()).append(". ") - .append(inputs.get(inputs.size() - 1)); + userInputsList.append(taskArrayList.size()).append(". ") + .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item System.out.println(sandwich(userInputsList.toString())); } else { // store userInput, tell user their input has been added - inputs.add(userInput); - System.out.println(sandwich("added: " + userInput)); + inputs.add(userInput); // no longer used + taskArrayList.add(new Task(userInput)); + System.out.println(sandwich("Task added: " + userInput)); } } } From 29a7b4324b0ad0ca49e26dcea94f379ab569f7d4 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 20:55:29 +0800 Subject: [PATCH 07/73] Removed deprecated code representing userInputs as an ArrayList of String(s) --- src/main/java/Duke.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index fef837bce6..0e9bb916ed 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -49,9 +49,6 @@ public static void main(String[] args) { // Scanner to read user inputs Scanner scanner = new Scanner(System.in); - // storing userInput (no longer used) - ArrayList inputs = new ArrayList<>(); - while (!canExit) { String userInput = scanner.nextLine(); if (userInput.equals("bye")) { // user inputs 'bye', set canExit to true and Exit @@ -67,7 +64,6 @@ public static void main(String[] args) { .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item System.out.println(sandwich(userInputsList.toString())); } else { // store userInput, tell user their input has been added - inputs.add(userInput); // no longer used taskArrayList.add(new Task(userInput)); System.out.println(sandwich("Task added: " + userInput)); } From 86734d8832d4e2c4708e86f0762caf7748b4b3ba Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 21:38:13 +0800 Subject: [PATCH 08/73] Updated scanner to read userInput by using next() instead of nextLine() --- src/main/java/Duke.java | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0e9bb916ed..f3302209ef 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -50,17 +50,33 @@ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (!canExit) { - String userInput = scanner.nextLine(); - if (userInput.equals("bye")) { // user inputs 'bye', set canExit to true and Exit + String userInput = scanner.next(); + if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit canExit = true; System.out.println(sandwich(goodbye)); - } else { // user inputs 'list' or something else - if (userInput.equals("list")) { // user inputs 'list', return all text stored + } else { // user inputs "done", "list" or something else + if (userInput.equals("done")) { // first input is done, check second input for integer + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + taskArrayList.get(taskNum - 1).markAsDone(); + System.out.println(sandwich("Congratulations! You finished task " + + taskNum + + ": [X] " + + taskArrayList.get(taskNum - 1).description)); + } + } else if (userInput.equals("list")) { // user inputs 'list', return all text stored StringBuilder userInputsList = new StringBuilder(); for (int i = 0; i < taskArrayList.size() - 1; i++) { // new line except for last item - userInputsList.append(i + 1).append(". ").append(taskArrayList.get(i).description).append("\n"); + userInputsList.append(i + 1).append(".") + .append("[") + .append(taskArrayList.get(i).getStatusIcon()) + .append("] ") + .append(taskArrayList.get(i).description).append("\n"); // formatted for nicer look } - userInputsList.append(taskArrayList.size()).append(". ") + userInputsList.append(taskArrayList.size()).append(".") + .append("[") + .append(taskArrayList.get(taskArrayList.size() - 1).getStatusIcon()) + .append("] ") .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item System.out.println(sandwich(userInputsList.toString())); } else { // store userInput, tell user their input has been added From 0704af36340774ccb560b9254ed737b6252d0399 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 21:39:15 +0800 Subject: [PATCH 09/73] Level-3: Added Mark as Done function for Duke --- src/main/java/Duke.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index f3302209ef..49f9289481 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,16 +2,16 @@ import java.util.ArrayList; public class Duke { - private static int lv = 3; - private static String[] features = {"", "Greet, Echo, Exit", ", Add, List", ", Mark as Done"}; + private static final int lv = 3; + private static final String[] features = {"", "Greet, Echo, Exit", ", Add, List", ", Mark as Done"}; private static boolean canExit = false; - private static ArrayList taskArrayList = new ArrayList<>(); + private static final ArrayList taskArrayList = new ArrayList<>(); /** * This function takes an input string and formats it by including horizontal lines above * and below the input string * - * @param str + * @param str input string to be sandwiched * @return the original string sandwiched between two horizontal lines */ public static String sandwich(String str) { From 840767df40fbccecd3e25bee88832c83193432bd Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 23:28:33 +0800 Subject: [PATCH 10/73] Added field for task type and getter method for task type icon --- src/main/java/Task.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index d7bf8dccdc..775af2b654 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -5,15 +5,18 @@ public class Task { protected String description; protected boolean isDone; + protected String taskType; /** * Creates a task with the specified description, isDone false by default. * - * @param description + * @param description description of task + * @param taskType type of task (todo/deadline/event) */ - public Task(String description) { + public Task(String description, String taskType) { this.description = description; this.isDone = false; + this.taskType = taskType; } /** @@ -25,6 +28,17 @@ public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } + /** + * Getter method for type of task using taskType. + * + * @return an icon representing the type of the task (T, D, E) + */ + public String getTypeIcon() { + return (this.taskType == "todo" ? "T" : + this.taskType == "deadline" ? "D" : + this.taskType == "event" ? "E" : "NONE"); + } + /** * Setter method for isDone of a Task object */ From bdeaad48c5bc3000b6319ad38782e8db5f06e2b9 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 18 Aug 2021 23:35:54 +0800 Subject: [PATCH 11/73] Updated instantiation of Task objects to include a taskType parameter --- src/main/java/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 49f9289481..cfefd716d1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -80,7 +80,7 @@ public static void main(String[] args) { .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item System.out.println(sandwich(userInputsList.toString())); } else { // store userInput, tell user their input has been added - taskArrayList.add(new Task(userInput)); + taskArrayList.add(new Task(userInput, "old")); System.out.println(sandwich("Task added: " + userInput)); } } From a7922725358ee1394bd307557813b7e4d1d15272 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 00:25:05 +0800 Subject: [PATCH 12/73] Abstracted out logic for beautifying task and list --- src/main/java/Duke.java | 131 ++++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 25 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index cfefd716d1..72f9b5928d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,8 +2,13 @@ import java.util.ArrayList; public class Duke { - private static final int lv = 3; - private static final String[] features = {"", "Greet, Echo, Exit", ", Add, List", ", Mark as Done"}; + private static final int lv = 4; + private static final String[] features = { + "", + "Greet, Echo, Exit", + ", Add, List", + ", Mark as Done", + ", ToDos, Events, Deadlines"}; private static boolean canExit = false; private static final ArrayList taskArrayList = new ArrayList<>(); @@ -20,6 +25,53 @@ public static String sandwich(String str) { + "____________________________________________________________"; } + /** + * This function takes the user's input list and beautifies it for display. + * + * @param taskArrayList the user's input list to be beautified + * @return the beautified string to display + */ + public static String listBeautify(ArrayList taskArrayList) { + System.out.println("lB reach"); + StringBuilder listBeautified = new StringBuilder(); + for (int i = 0; i < taskArrayList.size(); i++) { + listBeautified.append(i + 1).append(".") + .append("[") + .append(taskArrayList.get(i).getTypeIcon()) + .append("]") + .append("[") + .append(taskArrayList.get(i).getStatusIcon()) + .append("] ") + .append(taskArrayList.get(i).description); + if (i < taskArrayList.size() - 1) { // new line except for last item + listBeautified.append("\n"); + } + } + return listBeautified.toString(); + } + + /** + * This function takes a task object and beautifies it for display. + * + * @param task the task to be beautified + * @param index the index of the task in the task list + * @return the beautified string to display + */ + public static String taskBeautify(Task task, int index) { + System.out.println("tB reach"); + StringBuilder taskBeautified = new StringBuilder(); + taskBeautified.append(index).append(".") + .append("[") + .append(task.getTypeIcon()) + .append("]") + .append("[") + .append(task.getStatusIcon()) + .append("] ") + .append(taskArrayList.get(index - 1).description); + System.out.println("tB finish"); + return taskBeautified.toString(); + } + public static void main(String[] args) { // commented out logo // String logo = " ____ _ \n" @@ -54,35 +106,64 @@ public static void main(String[] args) { if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit canExit = true; System.out.println(sandwich(goodbye)); - } else { // user inputs "done", "list" or something else - if (userInput.equals("done")) { // first input is done, check second input for integer + } else { // check first input + if (userInput.equals("list")) { // user inputs 'list', return all text stored + System.out.println(sandwich(listBeautify(taskArrayList))); + } else if (userInput.equals("done")) { // first input is done, check second input for integer if (scanner.hasNextInt()) { int taskNum = scanner.nextInt(); taskArrayList.get(taskNum - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You finished task " - + taskNum - + ": [X] " - + taskArrayList.get(taskNum - 1).description)); + System.out.println(sandwich("Congratulations! You have finished this task: " + + taskBeautify(taskArrayList.get(taskNum - 1), taskNum))); } - } else if (userInput.equals("list")) { // user inputs 'list', return all text stored - StringBuilder userInputsList = new StringBuilder(); - for (int i = 0; i < taskArrayList.size() - 1; i++) { // new line except for last item - userInputsList.append(i + 1).append(".") - .append("[") - .append(taskArrayList.get(i).getStatusIcon()) - .append("] ") - .append(taskArrayList.get(i).description).append("\n"); // formatted for nicer look + } else { + switch (userInput) { + case "todo": + String taskName = scanner.next(); + Task newest = new Task(taskName, "todo"); + taskArrayList.add(newest); + System.out.println(sandwich("New task added: \n" + + taskBeautify(newest, taskArrayList.size()) + + "\n You now have " + + taskArrayList.size() + + " items in your task list.")); + break; + case "deadline": + + break; + case "event": + + break; } - userInputsList.append(taskArrayList.size()).append(".") - .append("[") - .append(taskArrayList.get(taskArrayList.size() - 1).getStatusIcon()) - .append("] ") - .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item - System.out.println(sandwich(userInputsList.toString())); - } else { // store userInput, tell user their input has been added - taskArrayList.add(new Task(userInput, "old")); - System.out.println(sandwich("Task added: " + userInput)); } +// if (userInput.equals("done")) { // first input is done, check second input for integer +// if (scanner.hasNextInt()) { +// int taskNum = scanner.nextInt(); +// taskArrayList.get(taskNum - 1).markAsDone(); +// System.out.println(sandwich("Congratulations! You finished task " +// + taskNum +// + ": [X] " +// + taskArrayList.get(taskNum - 1).description)); +// } +// } else if (userInput.equals("list")) { // user inputs 'list', return all text stored +// StringBuilder userInputsList = new StringBuilder(); +// for (int i = 0; i < taskArrayList.size() - 1; i++) { // new line except for last item +// userInputsList.append(i + 1).append(".") +// .append("[") +// .append(taskArrayList.get(i).getStatusIcon()) +// .append("] ") +// .append(taskArrayList.get(i).description).append("\n"); // formatted for nicer look +// } +// userInputsList.append(taskArrayList.size()).append(".") +// .append("[") +// .append(taskArrayList.get(taskArrayList.size() - 1).getStatusIcon()) +// .append("] ") +// .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item +// System.out.println(sandwich(userInputsList.toString())); +// } else { // store userInput, tell user their input has been added +// taskArrayList.add(new Task(userInput, "old")); +// System.out.println(sandwich("Task added: " + userInput)); +// } } } } From 132716211d4df0a44071dfc6489db78e5fe14f43 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 00:40:16 +0800 Subject: [PATCH 13/73] Updated scanner to use nextLine after first command has been checked --- src/main/java/Duke.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 72f9b5928d..844b062222 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -41,7 +41,7 @@ public static String listBeautify(ArrayList taskArrayList) { .append("]") .append("[") .append(taskArrayList.get(i).getStatusIcon()) - .append("] ") + .append("]") .append(taskArrayList.get(i).description); if (i < taskArrayList.size() - 1) { // new line except for last item listBeautified.append("\n"); @@ -66,7 +66,7 @@ public static String taskBeautify(Task task, int index) { .append("]") .append("[") .append(task.getStatusIcon()) - .append("] ") + .append("]") .append(taskArrayList.get(index - 1).description); System.out.println("tB finish"); return taskBeautified.toString(); @@ -119,8 +119,8 @@ public static void main(String[] args) { } else { switch (userInput) { case "todo": - String taskName = scanner.next(); - Task newest = new Task(taskName, "todo"); + String todoName = scanner.nextLine(); + Task newest = new Task(todoName, "todo"); taskArrayList.add(newest); System.out.println(sandwich("New task added: \n" + taskBeautify(newest, taskArrayList.size()) @@ -129,6 +129,8 @@ public static void main(String[] args) { + " items in your task list.")); break; case "deadline": + scanner.useDelimiter("\\s*/by\\s*"); + String deadlineName = scanner.next(); break; case "event": From 541a1dd10152c25c0b62e157ea7ce265844b8f16 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 00:57:30 +0800 Subject: [PATCH 14/73] Added constructor for Task that took in an additional string as reminder field --- src/main/java/Task.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 775af2b654..bbb024e015 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -6,6 +6,7 @@ public class Task { protected String description; protected boolean isDone; protected String taskType; + protected String reminder; /** * Creates a task with the specified description, isDone false by default. @@ -19,6 +20,20 @@ public Task(String description, String taskType) { this.taskType = taskType; } + /** + * Creates a task with the specified description, isDone false by default. + * Overloaded constructor method that includes reminder, to be used for deadline and event tasks. + * + * @param description description of task + * @param taskType type of task (todo/deadline/event) + */ + public Task(String description, String taskType, String reminder) { + this.description = description; + this.isDone = false; + this.taskType = taskType; + this.reminder = reminder; + } + /** * Getter method for status using isDone * @@ -39,6 +54,14 @@ public String getTypeIcon() { this.taskType == "event" ? "E" : "NONE"); } + /** + * Getter method for task reminder + * + * @return the string reminder for the task + */ + public String getReminder() { + return this.reminder; + } /** * Setter method for isDone of a Task object */ From c48c98d3599e28401af9930959da739161af7990 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 00:58:54 +0800 Subject: [PATCH 15/73] Updated todo and deadline cases to be recognizable as userInput --- src/main/java/Duke.java | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 844b062222..0cc45a7540 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -32,7 +32,6 @@ public static String sandwich(String str) { * @return the beautified string to display */ public static String listBeautify(ArrayList taskArrayList) { - System.out.println("lB reach"); StringBuilder listBeautified = new StringBuilder(); for (int i = 0; i < taskArrayList.size(); i++) { listBeautified.append(i + 1).append(".") @@ -58,7 +57,6 @@ public static String listBeautify(ArrayList taskArrayList) { * @return the beautified string to display */ public static String taskBeautify(Task task, int index) { - System.out.println("tB reach"); StringBuilder taskBeautified = new StringBuilder(); taskBeautified.append(index).append(".") .append("[") @@ -68,7 +66,6 @@ public static String taskBeautify(Task task, int index) { .append(task.getStatusIcon()) .append("]") .append(taskArrayList.get(index - 1).description); - System.out.println("tB finish"); return taskBeautified.toString(); } @@ -120,10 +117,10 @@ public static void main(String[] args) { switch (userInput) { case "todo": String todoName = scanner.nextLine(); - Task newest = new Task(todoName, "todo"); - taskArrayList.add(newest); + Task newestTodo = new Task(todoName, "todo"); + taskArrayList.add(newestTodo); System.out.println(sandwich("New task added: \n" - + taskBeautify(newest, taskArrayList.size()) + + taskBeautify(newestTodo, taskArrayList.size()) + "\n You now have " + taskArrayList.size() + " items in your task list.")); @@ -131,10 +128,27 @@ public static void main(String[] args) { case "deadline": scanner.useDelimiter("\\s*/by\\s*"); String deadlineName = scanner.next(); - + System.out.println("dN: " + deadlineName); + String deadlineReminder = scanner.nextLine(); + System.out.println("dR: " + deadlineReminder); + Task newestDeadline = new Task(deadlineName, "deadline"); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New task added: \n" + + taskBeautify(newestDeadline, taskArrayList.size()) + + "\n You now have " + + taskArrayList.size() + + " items in your task list.")); break; case "event": - + scanner.useDelimiter("\\s*/at\\s*"); + String eventName = scanner.nextLine(); + Task newestEvent = new Task(eventName, "deadline"); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New task added: \n" + + taskBeautify(newestEvent, taskArrayList.size()) + + "\n You now have " + + taskArrayList.size() + + " items in your task list.")); break; } } From 57a57d32eb8ffc2c7c30c89a435290747f56375b Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 12:51:53 +0800 Subject: [PATCH 16/73] Added task reminder for Deadline tasks --- src/main/java/Duke.java | 50 ++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0cc45a7540..db88f6705c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -66,6 +66,17 @@ public static String taskBeautify(Task task, int index) { .append(task.getStatusIcon()) .append("]") .append(taskArrayList.get(index - 1).description); + + // if task has reminder, append reminder to the end of string + if (task.taskType == "deadline") { + taskBeautified.append(" (by: ") + .append(task.getReminder()) + .append(")"); + } else if (task.taskType == "event") { + taskBeautified.append(" (at: ") + .append(task.getReminder()) + .append(")"); + } return taskBeautified.toString(); } @@ -127,17 +138,18 @@ public static void main(String[] args) { break; case "deadline": scanner.useDelimiter("\\s*/by\\s*"); - String deadlineName = scanner.next(); - System.out.println("dN: " + deadlineName); - String deadlineReminder = scanner.nextLine(); - System.out.println("dR: " + deadlineReminder); - Task newestDeadline = new Task(deadlineName, "deadline"); + String[] tokens = scanner.nextLine().split("\\s*/by\\s*"); + System.out.println("token length: " + tokens.length); + String deadlineName = tokens[0]; + String deadlineReminder = tokens[1]; + Task newestDeadline = new Task(deadlineName, "deadline", deadlineReminder); taskArrayList.add(newestDeadline); System.out.println(sandwich("New task added: \n" + taskBeautify(newestDeadline, taskArrayList.size()) + "\n You now have " + taskArrayList.size() + " items in your task list.")); + scanner.reset(); break; case "event": scanner.useDelimiter("\\s*/at\\s*"); @@ -152,34 +164,6 @@ public static void main(String[] args) { break; } } -// if (userInput.equals("done")) { // first input is done, check second input for integer -// if (scanner.hasNextInt()) { -// int taskNum = scanner.nextInt(); -// taskArrayList.get(taskNum - 1).markAsDone(); -// System.out.println(sandwich("Congratulations! You finished task " -// + taskNum -// + ": [X] " -// + taskArrayList.get(taskNum - 1).description)); -// } -// } else if (userInput.equals("list")) { // user inputs 'list', return all text stored -// StringBuilder userInputsList = new StringBuilder(); -// for (int i = 0; i < taskArrayList.size() - 1; i++) { // new line except for last item -// userInputsList.append(i + 1).append(".") -// .append("[") -// .append(taskArrayList.get(i).getStatusIcon()) -// .append("] ") -// .append(taskArrayList.get(i).description).append("\n"); // formatted for nicer look -// } -// userInputsList.append(taskArrayList.size()).append(".") -// .append("[") -// .append(taskArrayList.get(taskArrayList.size() - 1).getStatusIcon()) -// .append("] ") -// .append(taskArrayList.get(taskArrayList.size() - 1).description); // no \n for last item -// System.out.println(sandwich(userInputsList.toString())); -// } else { // store userInput, tell user their input has been added -// taskArrayList.add(new Task(userInput, "old")); -// System.out.println(sandwich("Task added: " + userInput)); -// } } } } From 5b64f0e0d0219d57ae7a1d43b04cc930e31f7347 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 12:55:01 +0800 Subject: [PATCH 17/73] Removed unnecesary use of delimiter for Deadline tasks --- src/main/java/Duke.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index db88f6705c..9289517ab9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -137,11 +137,10 @@ public static void main(String[] args) { + " items in your task list.")); break; case "deadline": - scanner.useDelimiter("\\s*/by\\s*"); - String[] tokens = scanner.nextLine().split("\\s*/by\\s*"); - System.out.println("token length: " + tokens.length); - String deadlineName = tokens[0]; - String deadlineReminder = tokens[1]; + // scanner.useDelimiter("\\s*/by\\s*"); + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; Task newestDeadline = new Task(deadlineName, "deadline", deadlineReminder); taskArrayList.add(newestDeadline); System.out.println(sandwich("New task added: \n" @@ -149,10 +148,11 @@ public static void main(String[] args) { + "\n You now have " + taskArrayList.size() + " items in your task list.")); - scanner.reset(); + // scanner.reset(); break; case "event": scanner.useDelimiter("\\s*/at\\s*"); + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); String eventName = scanner.nextLine(); Task newestEvent = new Task(eventName, "deadline"); taskArrayList.add(newestEvent); From 213d350ac9a3139f4937a2316ae07aeaeac59704 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 13:01:19 +0800 Subject: [PATCH 18/73] Updated listBeautify to use taskBeautify method --- src/main/java/Duke.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9289517ab9..de7ff46265 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -34,14 +34,7 @@ public static String sandwich(String str) { public static String listBeautify(ArrayList taskArrayList) { StringBuilder listBeautified = new StringBuilder(); for (int i = 0; i < taskArrayList.size(); i++) { - listBeautified.append(i + 1).append(".") - .append("[") - .append(taskArrayList.get(i).getTypeIcon()) - .append("]") - .append("[") - .append(taskArrayList.get(i).getStatusIcon()) - .append("]") - .append(taskArrayList.get(i).description); + listBeautified.append(taskBeautify(taskArrayList.get(i), (i + 1))); if (i < taskArrayList.size() - 1) { // new line except for last item listBeautified.append("\n"); } From ff40331bed3806444827a7b534857fd5d54203a9 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 13:02:16 +0800 Subject: [PATCH 19/73] Level-4: Added ToDos, Events, Deadlines functions for Duke --- src/main/java/Duke.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index de7ff46265..b082297423 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -123,33 +123,31 @@ public static void main(String[] args) { String todoName = scanner.nextLine(); Task newestTodo = new Task(todoName, "todo"); taskArrayList.add(newestTodo); - System.out.println(sandwich("New task added: \n" + System.out.println(sandwich("New todo task added: \n" + taskBeautify(newestTodo, taskArrayList.size()) + "\n You now have " + taskArrayList.size() + " items in your task list.")); break; case "deadline": - // scanner.useDelimiter("\\s*/by\\s*"); String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); String deadlineName = deadlineTokens[0]; String deadlineReminder = deadlineTokens[1]; Task newestDeadline = new Task(deadlineName, "deadline", deadlineReminder); taskArrayList.add(newestDeadline); - System.out.println(sandwich("New task added: \n" + System.out.println(sandwich("New deadline task added: \n" + taskBeautify(newestDeadline, taskArrayList.size()) + "\n You now have " + taskArrayList.size() + " items in your task list.")); - // scanner.reset(); break; case "event": - scanner.useDelimiter("\\s*/at\\s*"); String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - String eventName = scanner.nextLine(); - Task newestEvent = new Task(eventName, "deadline"); + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + Task newestEvent = new Task(eventName, "event", eventReminder); taskArrayList.add(newestEvent); - System.out.println(sandwich("New task added: \n" + System.out.println(sandwich("New event task added: \n" + taskBeautify(newestEvent, taskArrayList.size()) + "\n You now have " + taskArrayList.size() From 23a78542f9b11645cc7a9430abfbb926cfb43044 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 13:40:47 +0800 Subject: [PATCH 20/73] Updated to use Inheritance to support multiple task types (ToDo, Event, Deadline) --- src/main/java/Deadline.java | 14 ++++++++++++++ src/main/java/Duke.java | 20 +++++++++++--------- src/main/java/Event.java | 14 ++++++++++++++ src/main/java/Task.java | 30 ++++++++++++------------------ src/main/java/ToDo.java | 11 +++++++++++ 5 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 0000000000..2de70b7540 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task { + + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b082297423..64193e0d23 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -34,7 +34,9 @@ public static String sandwich(String str) { public static String listBeautify(ArrayList taskArrayList) { StringBuilder listBeautified = new StringBuilder(); for (int i = 0; i < taskArrayList.size(); i++) { - listBeautified.append(taskBeautify(taskArrayList.get(i), (i + 1))); + listBeautified.append(i + 1) + .append(".") + .append(taskArrayList.get(i).toString()); if (i < taskArrayList.size() - 1) { // new line except for last item listBeautified.append("\n"); } @@ -115,28 +117,28 @@ public static void main(String[] args) { int taskNum = scanner.nextInt(); taskArrayList.get(taskNum - 1).markAsDone(); System.out.println(sandwich("Congratulations! You have finished this task: " - + taskBeautify(taskArrayList.get(taskNum - 1), taskNum))); + + taskArrayList.get(taskNum - 1).toString())); } } else { switch (userInput) { case "todo": String todoName = scanner.nextLine(); - Task newestTodo = new Task(todoName, "todo"); + Task newestTodo = new ToDo(todoName); taskArrayList.add(newestTodo); System.out.println(sandwich("New todo task added: \n" - + taskBeautify(newestTodo, taskArrayList.size()) + + newestTodo + "\n You now have " + taskArrayList.size() - + " items in your task list.")); + + " item(s) in your task list.")); break; case "deadline": String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); String deadlineName = deadlineTokens[0]; String deadlineReminder = deadlineTokens[1]; - Task newestDeadline = new Task(deadlineName, "deadline", deadlineReminder); + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); taskArrayList.add(newestDeadline); System.out.println(sandwich("New deadline task added: \n" - + taskBeautify(newestDeadline, taskArrayList.size()) + + newestDeadline + "\n You now have " + taskArrayList.size() + " items in your task list.")); @@ -145,10 +147,10 @@ public static void main(String[] args) { String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); String eventName = eventTokens[0]; String eventReminder = eventTokens[1]; - Task newestEvent = new Task(eventName, "event", eventReminder); + Task newestEvent = new Event(eventName, eventReminder); taskArrayList.add(newestEvent); System.out.println(sandwich("New event task added: \n" - + taskBeautify(newestEvent, taskArrayList.size()) + + newestEvent + "\n You now have " + taskArrayList.size() + " items in your task list.")); diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 0000000000..cc2daae3d7 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,14 @@ +public class Event extends Task { + + protected String at; + + public Event(String description, String at) { + super(description); + this.at = at; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (at: " + at + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index bbb024e015..8329aa3f08 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -10,28 +10,12 @@ public class Task { /** * Creates a task with the specified description, isDone false by default. + * @param description description of task * - * @param description description of task - * @param taskType type of task (todo/deadline/event) */ - public Task(String description, String taskType) { + public Task(String description) { this.description = description; this.isDone = false; - this.taskType = taskType; - } - - /** - * Creates a task with the specified description, isDone false by default. - * Overloaded constructor method that includes reminder, to be used for deadline and event tasks. - * - * @param description description of task - * @param taskType type of task (todo/deadline/event) - */ - public Task(String description, String taskType, String reminder) { - this.description = description; - this.isDone = false; - this.taskType = taskType; - this.reminder = reminder; } /** @@ -62,10 +46,20 @@ public String getTypeIcon() { public String getReminder() { return this.reminder; } + /** * Setter method for isDone of a Task object */ public void markAsDone() { this.isDone = true; } + + /** + * Returns string representation of Task. + * + * @return string representation of Task + */ + public String toString() { + return ("[" + getStatusIcon() + "]" + description); + } } diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 0000000000..25be5ee3c2 --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,11 @@ +public class ToDo extends Task { + + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} \ No newline at end of file From 20904d18f55555215c0d109e75f5cc37df02b1d4 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 16:20:31 +0800 Subject: [PATCH 21/73] Fixed bug where type of Event was displayed as [D] --- src/main/java/Event.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index cc2daae3d7..3503fbe049 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -9,6 +9,6 @@ public Event(String description, String at) { @Override public String toString() { - return "[D]" + super.toString() + " (at: " + at + ")"; + return "[E]" + super.toString() + " (at: " + at + ")"; } } \ No newline at end of file From abba5bca21b262e56258078402304501e8541e73 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 16:29:43 +0800 Subject: [PATCH 22/73] A-TextUiTesting: Used the input/output redirection technique to semi-automate the testing of Duke --- src/main/java/Duke.java | 10 +++++----- text-ui-test/EXPECTED.TXT | 38 ++++++++++++++++++++++++++++++++------ text-ui-test/input.txt | 6 ++++++ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 64193e0d23..6102b29a04 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -125,7 +125,7 @@ public static void main(String[] args) { String todoName = scanner.nextLine(); Task newestTodo = new ToDo(todoName); taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added: \n" + System.out.println(sandwich("New todo task added:\n" + newestTodo + "\n You now have " + taskArrayList.size() @@ -137,11 +137,11 @@ public static void main(String[] args) { String deadlineReminder = deadlineTokens[1]; Task newestDeadline = new Deadline(deadlineName, deadlineReminder); taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added: \n" + System.out.println(sandwich("New deadline task added:\n" + newestDeadline + "\n You now have " + taskArrayList.size() - + " items in your task list.")); + + " item(s) in your task list.")); break; case "event": String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); @@ -149,11 +149,11 @@ public static void main(String[] args) { String eventReminder = eventTokens[1]; Task newestEvent = new Event(eventName, eventReminder); taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added: \n" + System.out.println(sandwich("New event task added:\n" + newestEvent + "\n You now have " + taskArrayList.size() - + " items in your task list.")); + + " item(s) in your task list.")); break; } } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e7..b7d48bf6de 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,33 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| +____________________________________________________________ +Hello! I'm Duke: Level 4 +What would you like to do today? +My current features are: Greet, Echo, Exit, Add, List, Mark as Done, ToDos, Events, Deadlines +____________________________________________________________ +____________________________________________________________ +New todo task added: +[T][ ] Clean room + You now have 1 item(s) in your task list. +____________________________________________________________ +____________________________________________________________ +New deadline task added: +[D][ ] CS2103 ip week 2 (by: tonight) + You now have 2 item(s) in your task list. +____________________________________________________________ +____________________________________________________________ +New event task added: +[E][ ] watch national address by PM Lee (at: 8pm Friday) + You now have 3 item(s) in your task list. +____________________________________________________________ +____________________________________________________________ +Congratulations! You have finished this task: [T][X] Clean room +____________________________________________________________ +____________________________________________________________ +1.[T][X] Clean room +2.[D][ ] CS2103 ip week 2 (by: tonight) +3.[E][ ] watch national address by PM Lee (at: 8pm Friday) +____________________________________________________________ +____________________________________________________________ +Thank you for using Duke: Level 4 +See you soon! +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb2..19759e08a3 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,6 @@ +todo Clean room +deadline CS2103 ip week 2 /by tonight +event watch national address by PM Lee /at 8pm Friday +done 1 +list +bye From 582d81470d3a00510e7d54203d151b53a4cc71c2 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 17:20:42 +0800 Subject: [PATCH 23/73] Removed deprecated method TaskBeautify() from Duke --- src/main/java/Duke.java | 142 ++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 80 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 6102b29a04..28a9c690ec 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -44,37 +44,6 @@ public static String listBeautify(ArrayList taskArrayList) { return listBeautified.toString(); } - /** - * This function takes a task object and beautifies it for display. - * - * @param task the task to be beautified - * @param index the index of the task in the task list - * @return the beautified string to display - */ - public static String taskBeautify(Task task, int index) { - StringBuilder taskBeautified = new StringBuilder(); - taskBeautified.append(index).append(".") - .append("[") - .append(task.getTypeIcon()) - .append("]") - .append("[") - .append(task.getStatusIcon()) - .append("]") - .append(taskArrayList.get(index - 1).description); - - // if task has reminder, append reminder to the end of string - if (task.taskType == "deadline") { - taskBeautified.append(" (by: ") - .append(task.getReminder()) - .append(")"); - } else if (task.taskType == "event") { - taskBeautified.append(" (at: ") - .append(task.getReminder()) - .append(")"); - } - return taskBeautified.toString(); - } - public static void main(String[] args) { // commented out logo // String logo = " ____ _ \n" @@ -106,57 +75,70 @@ public static void main(String[] args) { while (!canExit) { String userInput = scanner.next(); - if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit - canExit = true; - System.out.println(sandwich(goodbye)); - } else { // check first input - if (userInput.equals("list")) { // user inputs 'list', return all text stored - System.out.println(sandwich(listBeautify(taskArrayList))); - } else if (userInput.equals("done")) { // first input is done, check second input for integer - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - taskArrayList.get(taskNum - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You have finished this task: " - + taskArrayList.get(taskNum - 1).toString())); - } - } else { - switch (userInput) { - case "todo": - String todoName = scanner.nextLine(); - Task newestTodo = new ToDo(todoName); - taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" - + newestTodo - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - case "deadline": - String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); - String deadlineName = deadlineTokens[0]; - String deadlineReminder = deadlineTokens[1]; - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" - + newestDeadline - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - case "event": - String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - String eventName = eventTokens[0]; - String eventReminder = eventTokens[1]; - Task newestEvent = new Event(eventName, eventReminder); - taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added:\n" - + newestEvent - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; + try { + if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit + canExit = true; + System.out.println(sandwich(goodbye)); + } else { // check first input + if (userInput.equals("list")) { // user inputs 'list', return all text stored + System.out.println(sandwich(listBeautify(taskArrayList))); + } else if (userInput.equals("done")) { // first input is done, check second input for integer + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + taskArrayList.get(taskNum - 1).markAsDone(); + System.out.println(sandwich("Congratulations! You have finished this task: " + + taskArrayList.get(taskNum - 1).toString())); + } else throw new DukeException("unspecified task to mark as done"); + + } else { + switch (userInput) { + case "todo": + if (scanner.hasNextLine()) { + String todoName = scanner.nextLine(); + Task newestTodo = new ToDo(todoName); + taskArrayList.add(newestTodo); + System.out.println(sandwich("New todo task added:\n" + + newestTodo + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + } else throw new DukeException("No task description"); + case "deadline": + if (scanner.hasNextLine()) { + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New deadline task added:\n" + + newestDeadline + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + } else throw new DukeException("No task description"); + case "event": + if (scanner.hasNextLine()) { + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + Task newestEvent = new Event(eventName, eventReminder); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New event task added:\n" + + newestEvent + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + } else throw new DukeException("No task description"); + default: + throw new DukeException("Unknown Input"); // unknown input + } } } + } catch (DukeException e) { + System.err.println(e); // print out } } } From 0e724a62d3b212e35fba10c0d57c3e5c0836eacf Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 17:23:42 +0800 Subject: [PATCH 24/73] Added DukeException to handle errors in Duke regarding invalid user inputs --- src/main/java/Duke.java | 2 +- src/main/java/DukeException.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 28a9c690ec..121afd4fa7 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -138,7 +138,7 @@ public static void main(String[] args) { } } } catch (DukeException e) { - System.err.println(e); // print out + e.printStackTrace(); // print stack trace for e } } } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 0000000000..0731bad9dd --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,6 @@ +public class DukeException extends Exception { + + public DukeException(String errorMessage) { + super(errorMessage); + } +} From f854a11b957c71c0e88ba82f411ad5543a194c14 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 17:50:17 +0800 Subject: [PATCH 25/73] Level-5: Added exceptions for unknown and incomplete user inputs --- src/main/java/Duke.java | 88 ++++++++++++++++++-------------- src/main/java/DukeException.java | 7 +++ 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 121afd4fa7..017a6fcecb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,13 +2,15 @@ import java.util.ArrayList; public class Duke { - private static final int lv = 4; + private static final int lv = 5; private static final String[] features = { "", "Greet, Echo, Exit", ", Add, List", ", Mark as Done", - ", ToDos, Events, Deadlines"}; + ", ToDos, Events, Deadlines", + ", Handle Errors" + }; private static boolean canExit = false; private static final ArrayList taskArrayList = new ArrayList<>(); @@ -93,45 +95,53 @@ public static void main(String[] args) { } else { switch (userInput) { case "todo": - if (scanner.hasNextLine()) { - String todoName = scanner.nextLine(); - Task newestTodo = new ToDo(todoName); - taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" - + newestTodo - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - } else throw new DukeException("No task description"); + String todoName = scanner.nextLine(); + if (todoName.trim().equals("")) { + throw new DukeException("No task description"); + } + Task newestTodo = new ToDo(todoName); + taskArrayList.add(newestTodo); + System.out.println(sandwich("New todo task added:\n" + + newestTodo + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + case "deadline": - if (scanner.hasNextLine()) { - String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); - String deadlineName = deadlineTokens[0]; - String deadlineReminder = deadlineTokens[1]; - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" - + newestDeadline - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - } else throw new DukeException("No task description"); + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + if (deadlineTokens.length == 0) { + throw new DukeException("No task description"); + } else if (deadlineTokens.length == 1) { + throw new DukeException("No task deadline"); + } + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New deadline task added:\n" + + newestDeadline + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; case "event": - if (scanner.hasNextLine()) { - String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - String eventName = eventTokens[0]; - String eventReminder = eventTokens[1]; - Task newestEvent = new Event(eventName, eventReminder); - taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added:\n" - + newestEvent - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - } else throw new DukeException("No task description"); + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); + if (eventTokens.length == 0) { + throw new DukeException("No task description"); + } else if (eventTokens.length == 1) { + throw new DukeException("No task duration"); + } + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + Task newestEvent = new Event(eventName, eventReminder); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New event task added:\n" + + newestEvent + + "\n You now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; default: throw new DukeException("Unknown Input"); // unknown input } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index 0731bad9dd..adf029b033 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -1,6 +1,13 @@ public class DukeException extends Exception { + private static String msg; public DukeException(String errorMessage) { super(errorMessage); + msg = errorMessage; + } + + @Override + public String toString() { + return ("Oh No! I do not understand your input due to the following problem:\n" + msg); } } From 153032a5260634980e28409f369cdf4cadff77a7 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 18:29:18 +0800 Subject: [PATCH 26/73] Level-6: Added Delete function to Duke, tasks stored in ArrayList --- src/main/java/Duke.java | 141 +++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 61 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 017a6fcecb..a023cebfe9 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,14 +2,15 @@ import java.util.ArrayList; public class Duke { - private static final int lv = 5; + private static final int lv = 6; private static final String[] features = { "", "Greet, Echo, Exit", ", Add, List", ", Mark as Done", ", ToDos, Events, Deadlines", - ", Handle Errors" + ", Handle Errors", + ", Delete" }; private static boolean canExit = false; private static final ArrayList taskArrayList = new ArrayList<>(); @@ -79,72 +80,90 @@ public static void main(String[] args) { String userInput = scanner.next(); try { if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit + System.out.println("boo"); canExit = true; System.out.println(sandwich(goodbye)); } else { // check first input - if (userInput.equals("list")) { // user inputs 'list', return all text stored - System.out.println(sandwich(listBeautify(taskArrayList))); - } else if (userInput.equals("done")) { // first input is done, check second input for integer - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - taskArrayList.get(taskNum - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You have finished this task: " - + taskArrayList.get(taskNum - 1).toString())); - } else throw new DukeException("unspecified task to mark as done"); - - } else { - switch (userInput) { - case "todo": - String todoName = scanner.nextLine(); - if (todoName.trim().equals("")) { - throw new DukeException("No task description"); - } - Task newestTodo = new ToDo(todoName); - taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" - + newestTodo - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - - case "deadline": - String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); - if (deadlineTokens.length == 0) { - throw new DukeException("No task description"); - } else if (deadlineTokens.length == 1) { - throw new DukeException("No task deadline"); + switch (userInput) { + case "list": // user inputs 'list', return all text stored + System.out.println(sandwich(listBeautify(taskArrayList))); + break; + case "done": // first input is done, check second input for integer + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + if (taskNum > taskArrayList.size()) { + throw new DukeException("No such task"); } - String deadlineName = deadlineTokens[0]; - String deadlineReminder = deadlineTokens[1]; - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" - + newestDeadline - + "\n You now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - case "event": - String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - if (eventTokens.length == 0) { - throw new DukeException("No task description"); - } else if (eventTokens.length == 1) { - throw new DukeException("No task duration"); + taskArrayList.get(taskNum - 1).markAsDone(); + System.out.println(sandwich("Congratulations! You have finished this task: " + + taskArrayList.get(taskNum - 1).toString())); + } else throw new DukeException("unspecified task to mark as done"); + break; + case "delete": + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + if (taskNum > taskArrayList.size()) { + throw new DukeException("No such task"); } - String eventName = eventTokens[0]; - String eventReminder = eventTokens[1]; - Task newestEvent = new Event(eventName, eventReminder); - taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added:\n" - + newestEvent - + "\n You now have " + System.out.println(sandwich("Got it, I have deleted this task: " + + taskArrayList.get(taskNum - 1).toString() + + "\nYou now have " + taskArrayList.size() + " item(s) in your task list.")); - break; - default: - throw new DukeException("Unknown Input"); // unknown input - } + // actual logic of deletion + taskArrayList.remove(taskNum - 1); + } else throw new DukeException("unspecified task to delete"); + break; + case "todo": + String todoName = scanner.nextLine(); + if (todoName.trim().equals("")) { + throw new DukeException("No task description"); + } + Task newestTodo = new ToDo(todoName); + taskArrayList.add(newestTodo); + System.out.println(sandwich("New todo task added:\n" + + newestTodo + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + + case "deadline": + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + if (deadlineTokens.length == 0) { + throw new DukeException("No task description"); + } else if (deadlineTokens.length == 1) { + throw new DukeException("No task deadline"); + } + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New deadline task added:\n" + + newestDeadline + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + case "event": + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); + if (eventTokens.length == 0) { + throw new DukeException("No task description"); + } else if (eventTokens.length == 1) { + throw new DukeException("No task duration"); + } + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + Task newestEvent = new Event(eventName, eventReminder); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New event task added:\n" + + newestEvent + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + default: + throw new DukeException("Unknown Input"); // unknown input } } } catch (DukeException e) { From 287a6b45ce8c1fc52424dbd8034570059f7df674 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 19 Aug 2021 18:43:10 +0800 Subject: [PATCH 27/73] Updated text-ui-test to work with Duke Level-6 --- src/main/java/Duke.java | 1 - text-ui-test/EXPECTED.TXT | 23 +++++++++++++++-------- text-ui-test/input.txt | 2 ++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a023cebfe9..41132ece87 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -80,7 +80,6 @@ public static void main(String[] args) { String userInput = scanner.next(); try { if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit - System.out.println("boo"); canExit = true; System.out.println(sandwich(goodbye)); } else { // check first input diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index b7d48bf6de..5b55810c47 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,22 +1,22 @@ ____________________________________________________________ -Hello! I'm Duke: Level 4 +Hello! I'm Duke: Level 6 What would you like to do today? -My current features are: Greet, Echo, Exit, Add, List, Mark as Done, ToDos, Events, Deadlines +My current features are: Greet, Echo, Exit, Add, List, Mark as Done, ToDos, Events, Deadlines, Handle Errors, Delete ____________________________________________________________ ____________________________________________________________ New todo task added: [T][ ] Clean room - You now have 1 item(s) in your task list. +You now have 1 item(s) in your task list. ____________________________________________________________ ____________________________________________________________ New deadline task added: [D][ ] CS2103 ip week 2 (by: tonight) - You now have 2 item(s) in your task list. +You now have 2 item(s) in your task list. ____________________________________________________________ ____________________________________________________________ New event task added: [E][ ] watch national address by PM Lee (at: 8pm Friday) - You now have 3 item(s) in your task list. +You now have 3 item(s) in your task list. ____________________________________________________________ ____________________________________________________________ Congratulations! You have finished this task: [T][X] Clean room @@ -27,7 +27,14 @@ ____________________________________________________________ 3.[E][ ] watch national address by PM Lee (at: 8pm Friday) ____________________________________________________________ ____________________________________________________________ -Thank you for using Duke: Level 4 -See you soon! +Got it, I have deleted this task: [E][ ] watch national address by PM Lee (at: 8pm Friday) +You now have 3 item(s) in your task list. +____________________________________________________________ ____________________________________________________________ - +1.[T][X] Clean room +2.[D][ ] CS2103 ip week 2 (by: tonight) +____________________________________________________________ +____________________________________________________________ +Thank you for using Duke: Level 6 +See you soon! +____________________________________________________________ \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 19759e08a3..23d8269869 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -3,4 +3,6 @@ deadline CS2103 ip week 2 /by tonight event watch national address by PM Lee /at 8pm Friday done 1 list +delete 3 +list bye From a008ab88f179d2b831f4f3b5b6cc01a8ca2c9026 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 18:11:51 +0800 Subject: [PATCH 28/73] Change indentation for switch case to follow module coding standards --- src/main/java/Duke.java | 148 ++++++++++++++++++++-------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 41132ece87..b6f67e4a15 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -84,85 +84,85 @@ public static void main(String[] args) { System.out.println(sandwich(goodbye)); } else { // check first input switch (userInput) { - case "list": // user inputs 'list', return all text stored - System.out.println(sandwich(listBeautify(taskArrayList))); - break; - case "done": // first input is done, check second input for integer - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - if (taskNum > taskArrayList.size()) { - throw new DukeException("No such task"); - } - taskArrayList.get(taskNum - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You have finished this task: " - + taskArrayList.get(taskNum - 1).toString())); - } else throw new DukeException("unspecified task to mark as done"); - break; - case "delete": - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - if (taskNum > taskArrayList.size()) { - throw new DukeException("No such task"); - } - System.out.println(sandwich("Got it, I have deleted this task: " - + taskArrayList.get(taskNum - 1).toString() - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - // actual logic of deletion - taskArrayList.remove(taskNum - 1); - } else throw new DukeException("unspecified task to delete"); - break; - case "todo": - String todoName = scanner.nextLine(); - if (todoName.trim().equals("")) { - throw new DukeException("No task description"); + case "list": // user inputs 'list', return all text stored + System.out.println(sandwich(listBeautify(taskArrayList))); + break; + case "done": // first input is done, check second input for integer + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + if (taskNum > taskArrayList.size()) { + throw new DukeException("No such task"); } - Task newestTodo = new ToDo(todoName); - taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" - + newestTodo - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - - case "deadline": - String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); - if (deadlineTokens.length == 0) { - throw new DukeException("No task description"); - } else if (deadlineTokens.length == 1) { - throw new DukeException("No task deadline"); + taskArrayList.get(taskNum - 1).markAsDone(); + System.out.println(sandwich("Congratulations! You have finished this task: " + + taskArrayList.get(taskNum - 1).toString())); + } else throw new DukeException("unspecified task to mark as done"); + break; + case "delete": + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + if (taskNum > taskArrayList.size()) { + throw new DukeException("No such task"); } - String deadlineName = deadlineTokens[0]; - String deadlineReminder = deadlineTokens[1]; - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" - + newestDeadline + System.out.println(sandwich("Got it, I have deleted this task: " + + taskArrayList.get(taskNum - 1).toString() + "\nYou now have " + taskArrayList.size() + " item(s) in your task list.")); - break; - case "event": - String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - if (eventTokens.length == 0) { - throw new DukeException("No task description"); - } else if (eventTokens.length == 1) { - throw new DukeException("No task duration"); - } - String eventName = eventTokens[0]; - String eventReminder = eventTokens[1]; - Task newestEvent = new Event(eventName, eventReminder); - taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added:\n" - + newestEvent - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - default: - throw new DukeException("Unknown Input"); // unknown input + // actual logic of deletion + taskArrayList.remove(taskNum - 1); + } else throw new DukeException("unspecified task to delete"); + break; + case "todo": + String todoName = scanner.nextLine(); + if (todoName.trim().equals("")) { + throw new DukeException("No task description"); + } + Task newestTodo = new ToDo(todoName); + taskArrayList.add(newestTodo); + System.out.println(sandwich("New todo task added:\n" + + newestTodo + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + + case "deadline": + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + if (deadlineTokens.length == 0) { + throw new DukeException("No task description"); + } else if (deadlineTokens.length == 1) { + throw new DukeException("No task deadline"); + } + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New deadline task added:\n" + + newestDeadline + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + case "event": + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); + if (eventTokens.length == 0) { + throw new DukeException("No task description"); + } else if (eventTokens.length == 1) { + throw new DukeException("No task duration"); + } + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + Task newestEvent = new Event(eventName, eventReminder); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New event task added:\n" + + newestEvent + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + default: + throw new DukeException("Unknown Input"); // unknown input } } } catch (DukeException e) { From f2e7526fe7cfdb6d49d9e7f600685d83a72f93e3 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 18:35:10 +0800 Subject: [PATCH 29/73] Add duke.txt with relative filePath --- data/duke.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/duke.txt diff --git a/data/duke.txt b/data/duke.txt new file mode 100644 index 0000000000..e69de29bb2 From 1a95507aecebb897a5c444611ef9b750a5a77317 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 18:36:53 +0800 Subject: [PATCH 30/73] Update Duke with filePath to duke.txt --- src/main/java/Duke.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b6f67e4a15..2d480479b5 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,8 @@ import java.util.Scanner; import java.util.ArrayList; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; public class Duke { private static final int lv = 6; @@ -10,10 +13,12 @@ public class Duke { ", Mark as Done", ", ToDos, Events, Deadlines", ", Handle Errors", - ", Delete" + ", Delete", + ", Save" }; private static boolean canExit = false; private static final ArrayList taskArrayList = new ArrayList<>(); + private static final String dukeFilePath = "data/duke.txt"; /** * This function takes an input string and formats it by including horizontal lines above @@ -76,6 +81,9 @@ public static void main(String[] args) { // Scanner to read user inputs Scanner scanner = new Scanner(System.in); + // File to store user's added tasks to the hard disk + File dukeFile = new File(dukeFilePath); + while (!canExit) { String userInput = scanner.next(); try { From 51f6c23cdbd8f135ef9984f6b98cf6053da9e174 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 20:14:55 +0800 Subject: [PATCH 31/73] Handle creation of folder and file if not already present --- src/main/java/Duke.java | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2d480479b5..5eaa7db460 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,8 +4,9 @@ import java.io.FileWriter; import java.io.IOException; + public class Duke { - private static final int lv = 6; + private static final int lv = 7; private static final String[] features = { "", "Greet, Echo, Exit", @@ -21,7 +22,7 @@ public class Duke { private static final String dukeFilePath = "data/duke.txt"; /** - * This function takes an input string and formats it by including horizontal lines above + * This method takes an input string and formats it by including horizontal lines above * and below the input string * * @param str input string to be sandwiched @@ -34,7 +35,7 @@ public static String sandwich(String str) { } /** - * This function takes the user's input list and beautifies it for display. + * This method takes the user's input list and beautifies it for display. * * @param taskArrayList the user's input list to be beautified * @return the beautified string to display @@ -52,7 +53,22 @@ public static String listBeautify(ArrayList taskArrayList) { return listBeautified.toString(); } - public static void main(String[] args) { + /** + * This method appends to the file instead of overwrites. + * + * @param filePath the path to the file to append to + * @param textToAppend the text to append + * @throws IOException if filePath does not exist + */ + + private static void appendToFile(String filePath, String textToAppend) throws IOException { + FileWriter fw = new FileWriter(filePath, true); // create a FileWriter in append mode + fw.write(textToAppend); + fw.close(); + } + + + public static void main(String[] args) throws IOException { // commented out logo // String logo = " ____ _ \n" // + "| _ \\ _ _| | _____ \n" @@ -74,6 +90,18 @@ public static void main(String[] args) { System.out.println(sandwich(welcome)); + // load the data from the hard disk for dukeFile + File dukeFile = new File(dukeFilePath); + + // creates directory if it does not exist + if (dukeFile.mkdir()) { + System.out.println("folder: 'data/' has been created"); + } + // creates file if it does not exist + if (dukeFile.createNewFile()) { + System.out.println("'duke.txt' has been created in the 'data/' folder "); + } + // Goodbye message String goodbye = "Thank you for using Duke: Level " + lv + "\n" + "See you soon!"; @@ -81,9 +109,6 @@ public static void main(String[] args) { // Scanner to read user inputs Scanner scanner = new Scanner(System.in); - // File to store user's added tasks to the hard disk - File dukeFile = new File(dukeFilePath); - while (!canExit) { String userInput = scanner.next(); try { From 685755bf1f92affda8920a97b6fcda0fe956b5cb Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 21:31:14 +0800 Subject: [PATCH 32/73] Add functinality to write to duke.txt --- data/duke.txt | 5 +++++ src/main/java/Duke.java | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index e69de29bb2..6f72f04b7c 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1,5 @@ +____________________________________________________________ +1.[T][ ] test 1 +2.[D][ ] test 2 (by: tmr) +3.[E][ ] task 3 (at: tna) +____________________________________________________________ \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5eaa7db460..36532dc567 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,7 +4,10 @@ import java.io.FileWriter; import java.io.IOException; - +/** + * This class encapsulates a Duke chat-bot. + * + */ public class Duke { private static final int lv = 7; private static final String[] features = { @@ -19,7 +22,7 @@ public class Duke { }; private static boolean canExit = false; private static final ArrayList taskArrayList = new ArrayList<>(); - private static final String dukeFilePath = "data/duke.txt"; + private static final String dukeFilePath = "./data/duke.txt"; /** * This method takes an input string and formats it by including horizontal lines above @@ -53,6 +56,33 @@ public static String listBeautify(ArrayList taskArrayList) { return listBeautified.toString(); } + /** + * This method copies the contents of the file from filePath into an output file. + * + * @param filePath the file path to the file from which to copy from + * @param target the target string to which to copy the contents of the file + * @throws IOException if filePath does not exist + */ + private static void copyFileContents(String filePath, String target) throws IOException { + File f = new File(filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + StringBuilder targetBuilder = new StringBuilder(target); + while (s.hasNext()) { + targetBuilder.append(s.nextLine()); + } + } + + /** + * This method parses the string copied from duke.txt and converts them into task objects + * into the taskArrayList/ + * + * @param + * @param + */ + private static void parse() { + + } + /** * This method appends to the file instead of overwrites. * @@ -67,7 +97,6 @@ private static void appendToFile(String filePath, String textToAppend) throws IO fw.close(); } - public static void main(String[] args) throws IOException { // commented out logo // String logo = " ____ _ \n" @@ -79,6 +108,7 @@ public static void main(String[] args) throws IOException { // populating featuresCombined so each level has all elements of levels before it StringBuilder featuresCombined = new StringBuilder(); + // copyFileContents(dukeFilePath, temp); for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } @@ -112,8 +142,10 @@ public static void main(String[] args) throws IOException { while (!canExit) { String userInput = scanner.next(); try { - if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit + if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; + String temp = sandwich(listBeautify(taskArrayList)); + appendToFile(dukeFilePath, temp); // append temp.toString() to dukeFile System.out.println(sandwich(goodbye)); } else { // check first input switch (userInput) { @@ -159,7 +191,6 @@ public static void main(String[] args) throws IOException { + taskArrayList.size() + " item(s) in your task list.")); break; - case "deadline": String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); if (deadlineTokens.length == 0) { From 8688ae6a3ad2e2b4f9447c23b092d2e2ea3f8549 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 21:39:37 +0800 Subject: [PATCH 33/73] Add skeletal method for copying from duke.txt and parsing it --- src/main/java/Duke.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 36532dc567..9d21936c14 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,4 @@ +import java.sql.Array; import java.util.Scanner; import java.util.ArrayList; import java.io.File; @@ -21,7 +22,7 @@ public class Duke { ", Save" }; private static boolean canExit = false; - private static final ArrayList taskArrayList = new ArrayList<>(); + private static ArrayList taskArrayList = new ArrayList<>(); private static final String dukeFilePath = "./data/duke.txt"; /** @@ -76,11 +77,12 @@ private static void copyFileContents(String filePath, String target) throws IOEx * This method parses the string copied from duke.txt and converts them into task objects * into the taskArrayList/ * - * @param - * @param + * @param toParse the string to parse + * @return a taskArrayList made up of tasks */ - private static void parse() { + private static ArrayList parse(String toParse) { + return new ArrayList<>(); } /** @@ -108,7 +110,9 @@ public static void main(String[] args) throws IOException { // populating featuresCombined so each level has all elements of levels before it StringBuilder featuresCombined = new StringBuilder(); - // copyFileContents(dukeFilePath, temp); + String toParse = ""; + copyFileContents(dukeFilePath, toParse); + taskArrayList = parse(toParse); for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } @@ -152,6 +156,9 @@ public static void main(String[] args) throws IOException { case "list": // user inputs 'list', return all text stored System.out.println(sandwich(listBeautify(taskArrayList))); break; + case "tal": // user inputs 'list', return taskArrayList as it is + System.out.println(taskArrayList); + break; case "done": // first input is done, check second input for integer if (scanner.hasNextInt()) { int taskNum = scanner.nextInt(); From b12e45e00ca4cb4207b6362e1b64be713a5dd421 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 21:54:14 +0800 Subject: [PATCH 34/73] Updated constructor of various task types --- src/main/java/Deadline.java | 2 +- src/main/java/Event.java | 2 +- src/main/java/ToDo.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 2de70b7540..cbddca9011 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -9,6 +9,6 @@ public Deadline(String description, String by) { @Override public String toString() { - return "[D]" + super.toString() + " (by: " + by + ")"; + return "D | " + super.toString() + by; } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 3503fbe049..f286e688ae 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -9,6 +9,6 @@ public Event(String description, String at) { @Override public String toString() { - return "[E]" + super.toString() + " (at: " + at + ")"; + return "E | " + super.toString() + at; } } \ No newline at end of file diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 25be5ee3c2..0388a2732c 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -6,6 +6,6 @@ public ToDo(String description) { @Override public String toString() { - return "[T]" + super.toString(); + return "T | " + super.toString(); } } \ No newline at end of file From 845d1b17b88cf9c7763853b7ab0ccc556f0a9ec3 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 22:03:31 +0800 Subject: [PATCH 35/73] Revert constructor of various task types --- src/main/java/Deadline.java | 2 +- src/main/java/Event.java | 2 +- src/main/java/ToDo.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index cbddca9011..2de70b7540 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -9,6 +9,6 @@ public Deadline(String description, String by) { @Override public String toString() { - return "D | " + super.toString() + by; + return "[D]" + super.toString() + " (by: " + by + ")"; } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index f286e688ae..3503fbe049 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -9,6 +9,6 @@ public Event(String description, String at) { @Override public String toString() { - return "E | " + super.toString() + at; + return "[E]" + super.toString() + " (at: " + at + ")"; } } \ No newline at end of file diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java index 0388a2732c..25be5ee3c2 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/ToDo.java @@ -6,6 +6,6 @@ public ToDo(String description) { @Override public String toString() { - return "T | " + super.toString(); + return "[T]" + super.toString(); } } \ No newline at end of file From 6da91b12d1b60f0c049e0f35f307d9f0291cbbab Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 26 Aug 2021 23:56:25 +0800 Subject: [PATCH 36/73] Add parse method to convert duke.txt to taskArrayList --- src/main/java/Duke.java | 97 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 12 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9d21936c14..8a345c344e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,4 +1,3 @@ -import java.sql.Array; import java.util.Scanner; import java.util.ArrayList; import java.io.File; @@ -7,7 +6,6 @@ /** * This class encapsulates a Duke chat-bot. - * */ public class Duke { private static final int lv = 7; @@ -61,7 +59,7 @@ public static String listBeautify(ArrayList taskArrayList) { * This method copies the contents of the file from filePath into an output file. * * @param filePath the file path to the file from which to copy from - * @param target the target string to which to copy the contents of the file + * @param target the target string to which to copy the contents of the file * @throws IOException if filePath does not exist */ private static void copyFileContents(String filePath, String target) throws IOException { @@ -69,8 +67,11 @@ private static void copyFileContents(String filePath, String target) throws IOEx Scanner s = new Scanner(f); // create a Scanner using the File as the source StringBuilder targetBuilder = new StringBuilder(target); while (s.hasNext()) { - targetBuilder.append(s.nextLine()); + targetBuilder.append(s.nextLine()).append("\n"); } + System.out.println("after while: \n" + targetBuilder); + System.out.println("parse result: \n" + parse(targetBuilder.toString())); + taskArrayList = parse(targetBuilder.toString()); } /** @@ -81,14 +82,74 @@ private static void copyFileContents(String filePath, String target) throws IOEx * @return a taskArrayList made up of tasks */ private static ArrayList parse(String toParse) { + ArrayList result = new ArrayList<>(); + Scanner ps = new Scanner(toParse); // passes whole file into the scanner +// [[T][ ] 1, [E][ ] 2 (at: 2), [D][ ] 3 (by: 3)] + while (ps.hasNextLine()) { + System.out.println("has nextline"); + String nLine = ps.nextLine(); // parse one line at a time + int ref = 3; // reference point + char taskType = nLine.charAt(ref); + boolean isDone = nLine.charAt(ref + 3) == 'X'; + int strLength = nLine.length(); + switch (taskType) { + case 'T': + String todoName = nLine.substring(ref + 6, strLength); + Task newestTodo = new ToDo(todoName); + if (isDone) { + newestTodo.markAsDone(); + } + result.add(newestTodo); + break; + case 'D': + String deadlineInfo = nLine.substring(ref + 6, strLength); + String[] arrD = deadlineInfo.split("\\(by: ", 2); + String deadlineName = arrD[0]; + String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + result.add(newestDeadline); + if (isDone) { + newestDeadline.markAsDone(); + } + break; + case 'E': + String eventInfo = nLine.substring(ref + 6, strLength); + String[] arrE = eventInfo.split("\\(at: ", 2); + String eventName = arrE[0]; + String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); + Task newestEvent = new Event(eventName, eventReminder); + result.add(newestEvent); + if (isDone) { + newestEvent.markAsDone(); + } + break; + default: + System.out.println("Unknown input"); + break; + } + } + System.out.println("result is: " + result); + return result; + } + + /** + * This method overwrites the file. + * + * @param filePath the path to the file to append to + * @param textToAppend the text to append + * @throws IOException if filePath does not exist + */ - return new ArrayList<>(); + private static void overwriteFile(String filePath, String textToAppend) throws IOException { + FileWriter fw = new FileWriter(filePath, false); // create a FileWriter in append mode + fw.write(textToAppend); + fw.close(); } /** * This method appends to the file instead of overwrites. * - * @param filePath the path to the file to append to + * @param filePath the path to the file to append to * @param textToAppend the text to append * @throws IOException if filePath does not exist */ @@ -110,17 +171,22 @@ public static void main(String[] args) throws IOException { // populating featuresCombined so each level has all elements of levels before it StringBuilder featuresCombined = new StringBuilder(); - String toParse = ""; - copyFileContents(dukeFilePath, toParse); - taskArrayList = parse(toParse); for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } + // parsing duke.txt + String toParse = ""; + copyFileContents(dukeFilePath, toParse); + taskArrayList = parse(toParse); + System.out.println("tal tstr: " + taskArrayList.toString()); + // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" + "What would you like to do today?\n" - + "My current features are: " + featuresCombined; + + "My current features are: " + featuresCombined + "\n" + + "Here are your tasks: " + "\n" + + sandwich(listBeautify(taskArrayList)); System.out.println(sandwich(welcome)); @@ -140,6 +206,11 @@ public static void main(String[] args) throws IOException { String goodbye = "Thank you for using Duke: Level " + lv + "\n" + "See you soon!"; + // TESTING DELETE BEFORE COMMIT! + // ArrayList test = new ArrayList(Integer.parseInt(" + // [[T][ ] t1, [D][ ] t2 (by: tt2), [E][ ] t3 (at: now)] + // ")); + // Scanner to read user inputs Scanner scanner = new Scanner(System.in); @@ -148,8 +219,10 @@ public static void main(String[] args) throws IOException { try { if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; - String temp = sandwich(listBeautify(taskArrayList)); - appendToFile(dukeFilePath, temp); // append temp.toString() to dukeFile + String temp = listBeautify(taskArrayList); + String tal = taskArrayList.toString(); + // appendToFile(dukeFilePath, temp); // append temp.toString() to dukeFile + overwriteFile(dukeFilePath, temp); // append temp.toString() to dukeFile System.out.println(sandwich(goodbye)); } else { // check first input switch (userInput) { From 54b588f5032e9bd75ff35332e5cca9776ab15ecd Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 00:18:42 +0800 Subject: [PATCH 37/73] Fix bug where parse() was called twice incorrectly --- src/main/java/Duke.java | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 8a345c344e..7ccc185d3f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -56,27 +56,29 @@ public static String listBeautify(ArrayList taskArrayList) { } /** - * This method copies the contents of the file from filePath into an output file. + * This method copies the contents of the file from filePath and + * converts them into Task objects into the taskArrayList with the + * help of the parse() method. * * @param filePath the file path to the file from which to copy from - * @param target the target string to which to copy the contents of the file * @throws IOException if filePath does not exist */ - private static void copyFileContents(String filePath, String target) throws IOException { + private static void copyFileContents(String filePath) throws IOException { File f = new File(filePath); // create a File for the given file path Scanner s = new Scanner(f); // create a Scanner using the File as the source - StringBuilder targetBuilder = new StringBuilder(target); + StringBuilder targetBuilder = new StringBuilder(); while (s.hasNext()) { targetBuilder.append(s.nextLine()).append("\n"); } System.out.println("after while: \n" + targetBuilder); System.out.println("parse result: \n" + parse(targetBuilder.toString())); taskArrayList = parse(targetBuilder.toString()); + System.out.println("tal in copy is: " + taskArrayList); } /** * This method parses the string copied from duke.txt and converts them into task objects - * into the taskArrayList/ + * into the taskArrayList. * * @param toParse the string to parse * @return a taskArrayList made up of tasks @@ -94,7 +96,7 @@ private static ArrayList parse(String toParse) { int strLength = nLine.length(); switch (taskType) { case 'T': - String todoName = nLine.substring(ref + 6, strLength); + String todoName = nLine.substring(ref + 5, strLength); Task newestTodo = new ToDo(todoName); if (isDone) { newestTodo.markAsDone(); @@ -102,7 +104,7 @@ private static ArrayList parse(String toParse) { result.add(newestTodo); break; case 'D': - String deadlineInfo = nLine.substring(ref + 6, strLength); + String deadlineInfo = nLine.substring(ref + 5, strLength); String[] arrD = deadlineInfo.split("\\(by: ", 2); String deadlineName = arrD[0]; String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); @@ -113,7 +115,7 @@ private static ArrayList parse(String toParse) { } break; case 'E': - String eventInfo = nLine.substring(ref + 6, strLength); + String eventInfo = nLine.substring(ref + 5, strLength); String[] arrE = eventInfo.split("\\(at: ", 2); String eventName = arrE[0]; String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); @@ -177,9 +179,9 @@ public static void main(String[] args) throws IOException { // parsing duke.txt String toParse = ""; - copyFileContents(dukeFilePath, toParse); - taskArrayList = parse(toParse); - System.out.println("tal tstr: " + taskArrayList.toString()); + copyFileContents(dukeFilePath); +// taskArrayList = parse(toParse); +// System.out.println("tal tstr: " + taskArrayList.toString()); // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" From d0a5a2e684b50383a2476cd64b69850480e3bfb0 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 00:20:35 +0800 Subject: [PATCH 38/73] Level-7: Add Save and Load duke.txt for Duke --- data/duke.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/data/duke.txt b/data/duke.txt index 6f72f04b7c..8d392bd9ab 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,5 +1,4 @@ -____________________________________________________________ -1.[T][ ] test 1 -2.[D][ ] test 2 (by: tmr) -3.[E][ ] task 3 (at: tna) -____________________________________________________________ \ No newline at end of file +1.[T][ ] 1 +2.[T][ ] 2 +3.[D][ ] 3 (by: 333) +4.[T][ ] 4 \ No newline at end of file From bfb6cadf4d52d67a9ad3eeab95ef90eebb953cfc Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 13:39:27 +0800 Subject: [PATCH 39/73] Update Deadline and Event to parse task description as string of date --- src/main/java/Deadline.java | 7 ++++++- src/main/java/Event.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 2de70b7540..9a505bea52 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,14 +1,19 @@ +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { protected String by; + protected LocalDate date; public Deadline(String description, String by) { super(description); this.by = by; + this.date = LocalDate.parse(by); } @Override public String toString() { - return "[D]" + super.toString() + " (by: " + by + ")"; + return "[D]" + super.toString() + " (by: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 3503fbe049..553bb5efe2 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,14 +1,19 @@ +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Event extends Task { protected String at; + protected LocalDate date; public Event(String description, String at) { super(description); this.at = at; + this.date = LocalDate.parse(at); } @Override public String toString() { - return "[E]" + super.toString() + " (at: " + at + ")"; + return "[E]" + super.toString() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; } } \ No newline at end of file From 609beb1b30808f82d6a357ec3ec2c24d30cfd115 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 14:28:02 +0800 Subject: [PATCH 40/73] Level-8: Add Dates and Times functionality to Duke --- src/main/java/Deadline.java | 2 +- src/main/java/Duke.java | 202 ++++++++++++++++++++++++++++++++++-- src/main/java/Event.java | 2 +- 3 files changed, 195 insertions(+), 11 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 9a505bea52..688ea01877 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -14,6 +14,6 @@ public Deadline(String description, String by) { @Override public String toString() { - return "[D]" + super.toString() + " (by: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; + return "[D]" + super.toString() + " (by: " + date.format(DateTimeFormatter.ofPattern("yyyy MM dd")) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5eaa7db460..75fa841ccc 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -4,7 +4,9 @@ import java.io.FileWriter; import java.io.IOException; - +/** + * This class encapsulates a Duke chat-bot. + */ public class Duke { private static final int lv = 7; private static final String[] features = { @@ -18,8 +20,8 @@ public class Duke { ", Save" }; private static boolean canExit = false; - private static final ArrayList taskArrayList = new ArrayList<>(); - private static final String dukeFilePath = "data/duke.txt"; + private static ArrayList taskArrayList = new ArrayList<>(); + private static final String dukeFilePath = "./data/duke.txt"; /** * This method takes an input string and formats it by including horizontal lines above @@ -53,10 +55,116 @@ public static String listBeautify(ArrayList taskArrayList) { return listBeautified.toString(); } + /** + * This method copies the contents of the file from filePath and + * converts them into Task objects into the taskArrayList with the + * help of the parse() method. + * + * @param filePath the file path to the file from which to copy from + * @throws IOException if filePath does not exist + */ + private static void copyFileContents(String filePath) throws IOException { + File f = new File(filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + StringBuilder targetBuilder = new StringBuilder(); + while (s.hasNext()) { + targetBuilder.append(s.nextLine()).append("\n"); + } + taskArrayList = parse(targetBuilder.toString()); + } + + /** + * This method parses the string copied from duke.txt and converts them into task objects + * into the taskArrayList. + * + * @param toParse the string to parse + * @return a taskArrayList made up of tasks + */ + private static ArrayList parse(String toParse) { + ArrayList result = new ArrayList<>(); + Scanner ps = new Scanner(toParse); // passes whole file into the scanner +// [[T][ ] 1, [E][ ] 2 (at: 2), [D][ ] 3 (by: 3)] + while (ps.hasNextLine()) { + String nLine = ps.nextLine(); // parse one line at a time + int ref = 3; // reference point + char taskType = nLine.charAt(ref); + boolean isDone = nLine.charAt(ref + 3) == 'X'; + int strLength = nLine.length(); + switch (taskType) { + case 'T': + String todoName = nLine.substring(ref + 5, strLength); + Task newestTodo = new ToDo(todoName); + if (isDone) { + newestTodo.markAsDone(); + } + result.add(newestTodo); + break; + case 'D': + String deadlineInfo = nLine.substring(ref + 5, strLength); + String[] arrD = deadlineInfo.split("\\(by: ", 2); + String deadlineName = arrD[0]; + String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); + deadlineReminder = parseDate(deadlineReminder); + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + result.add(newestDeadline); + if (isDone) { + newestDeadline.markAsDone(); + } + break; + case 'E': + String eventInfo = nLine.substring(ref + 5, strLength); + String[] arrE = eventInfo.split("\\(at: ", 2); + String eventName = arrE[0]; + String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); + eventReminder = parseDate(eventReminder); + Task newestEvent = new Event(eventName, eventReminder); + result.add(newestEvent); + if (isDone) { + newestEvent.markAsDone(); + } + break; + default: + System.out.println("Unknown input"); + break; + } + } + System.out.println("result is: " + result); + return result; + } + + /** + * Parses input string in the format "yyyy MM dd" and returns it in the format + * "YYYY-MM-DD". + * + * @param input string in format "MMM d yyyy" + * @return string in format "YYYY-MM-DD" + */ + private static String parseDate(String input) { + String year = input.substring(0, 4); + String month = input.substring(5, 7); + String day = input.substring(8, 10); + + return year + "-" + month + "-" + day; + } + + /** + * This method overwrites the file. + * + * @param filePath the path to the file to append to + * @param textToAppend the text to append + * @throws IOException if filePath does not exist + */ + + private static void overwriteFile(String filePath, String textToAppend) throws IOException { + FileWriter fw = new FileWriter(filePath, false); // create a FileWriter in append mode + fw.write(textToAppend); + fw.close(); + } + /** * This method appends to the file instead of overwrites. * - * @param filePath the path to the file to append to + * @param filePath the path to the file to append to * @param textToAppend the text to append * @throws IOException if filePath does not exist */ @@ -67,6 +175,70 @@ private static void appendToFile(String filePath, String textToAppend) throws IO fw.close(); } + /** + * Validates input string to ensure it follows the valid format YYYY-MM-DD, and is a valid date. + * + * @param input the string to be validated + * @return true if the string is a valid date + */ + private static boolean isValidDate(String input) { + String[] splitInputs = input.split("-"); + boolean isLeapYear; + String year = splitInputs[0]; + String month = splitInputs[1]; + String day = splitInputs[2]; + int maxDay; + + if (splitInputs.length != 3) { + return false; + } + + // check year + if (year.length() != 4 || !year.matches("\\d+")) { + return false; + } else { + isLeapYear = (Integer.parseInt(year) % 4 == 0); + } + + // check month + if (month.length() != 2 || !month.matches("\\d+")) { + return false; + } else { + switch (Integer.parseInt(month)) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + maxDay = 31; + break; + case 4: + case 6: + case 9: + case 11: + maxDay = 30; + break; + case 2: + if (isLeapYear) { + maxDay = 29; + } else { + maxDay = 28; + } + break; + default: + return false; + } + } + + // check day + if (day.length() != 2 || !day.matches("\\d+")) { + return false; + } else { + return Integer.parseInt(day) <= maxDay; + } + } public static void main(String[] args) throws IOException { // commented out logo @@ -83,10 +255,15 @@ public static void main(String[] args) throws IOException { featuresCombined.append(features[count]); } + // parsing duke.txt + copyFileContents(dukeFilePath); + // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" + "What would you like to do today?\n" - + "My current features are: " + featuresCombined; + + "My current features are: " + featuresCombined + "\n" + + "Here are your tasks: " + "\n" + + sandwich(listBeautify(taskArrayList)); System.out.println(sandwich(welcome)); @@ -112,8 +289,10 @@ public static void main(String[] args) throws IOException { while (!canExit) { String userInput = scanner.next(); try { - if (userInput.equals("bye")) { // user inputs "bye, set canExit to true and Exit + if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; + String temp = listBeautify(taskArrayList); + overwriteFile(dukeFilePath, temp); // append temp.toString() to dukeFile System.out.println(sandwich(goodbye)); } else { // check first input switch (userInput) { @@ -140,7 +319,7 @@ public static void main(String[] args) throws IOException { System.out.println(sandwich("Got it, I have deleted this task: " + taskArrayList.get(taskNum - 1).toString() + "\nYou now have " - + taskArrayList.size() + + (taskArrayList.size() - 1) + " item(s) in your task list.")); // actual logic of deletion taskArrayList.remove(taskNum - 1); @@ -159,7 +338,6 @@ public static void main(String[] args) throws IOException { + taskArrayList.size() + " item(s) in your task list.")); break; - case "deadline": String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); if (deadlineTokens.length == 0) { @@ -169,6 +347,9 @@ public static void main(String[] args) throws IOException { } String deadlineName = deadlineTokens[0]; String deadlineReminder = deadlineTokens[1]; + if (!isValidDate(deadlineReminder)) { + throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); + } Task newestDeadline = new Deadline(deadlineName, deadlineReminder); taskArrayList.add(newestDeadline); System.out.println(sandwich("New deadline task added:\n" @@ -186,6 +367,9 @@ public static void main(String[] args) throws IOException { } String eventName = eventTokens[0]; String eventReminder = eventTokens[1]; + if (!isValidDate(eventReminder)) { + throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); + } Task newestEvent = new Event(eventName, eventReminder); taskArrayList.add(newestEvent); System.out.println(sandwich("New event task added:\n" @@ -203,4 +387,4 @@ public static void main(String[] args) throws IOException { } } } -} +} \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 553bb5efe2..b40bd19c72 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -14,6 +14,6 @@ public Event(String description, String at) { @Override public String toString() { - return "[E]" + super.toString() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; + return "[E]" + super.toString() + " (at: " + date.format(DateTimeFormatter.ofPattern("yyyy MM dd")) + ")"; } } \ No newline at end of file From ee37691c619eb7698953f155200fe4bfe8d3d75a Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 14:28:42 +0800 Subject: [PATCH 41/73] Increment Duke display level --- src/main/java/Duke.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 75fa841ccc..caba676bac 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -8,7 +8,7 @@ * This class encapsulates a Duke chat-bot. */ public class Duke { - private static final int lv = 7; + private static final int lv = 8; private static final String[] features = { "", "Greet, Echo, Exit", @@ -17,7 +17,8 @@ public class Duke { ", ToDos, Events, Deadlines", ", Handle Errors", ", Delete", - ", Save" + ", Save", + ", Dates and Times" }; private static boolean canExit = false; private static ArrayList taskArrayList = new ArrayList<>(); From 9e9109a28df903be4b12727027ab63bc1411c264 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Fri, 27 Aug 2021 14:44:30 +0800 Subject: [PATCH 42/73] Add skeletal classes for more OOP --- src/main/java/Parser.java | 2 ++ src/main/java/Storage.java | 2 ++ src/main/java/TaskList.java | 2 ++ src/main/java/Ui.java | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/TaskList.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..4d27fe15e5 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,2 @@ +public class Parser { +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..14d3059133 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,2 @@ +public class Storage { +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..1e7aed1c05 --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,2 @@ +public class TaskList { +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..30d98a7015 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,2 @@ +public class Ui { +} From 7d0c2ff4c6ac816c5f37ba3f1c4f84254b79f85a Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Tue, 31 Aug 2021 13:49:56 +0800 Subject: [PATCH 43/73] Update skeletal class files to make Duke more OOP --- data/duke.txt | 4 - src/main/java/Duke.java | 385 +++------------------------------- src/main/java/DukeParser.java | 106 ++++++++++ src/main/java/Parser.java | 2 - src/main/java/Storage.java | 57 +++++ src/main/java/TaskList.java | 184 ++++++++++++++++ src/main/java/Ui.java | 150 +++++++++++++ 7 files changed, 521 insertions(+), 367 deletions(-) create mode 100644 src/main/java/DukeParser.java delete mode 100644 src/main/java/Parser.java diff --git a/data/duke.txt b/data/duke.txt index 8d392bd9ab..e69de29bb2 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,4 +0,0 @@ -1.[T][ ] 1 -2.[T][ ] 2 -3.[D][ ] 3 (by: 333) -4.[T][ ] 4 \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a84c1954b9..5037016ef0 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -20,279 +20,26 @@ public class Duke { ", Save", ", Dates and Times" }; - private static boolean canExit = false; private static ArrayList taskArrayList = new ArrayList<>(); private static final String dukeFilePath = "./data/duke.txt"; - - /** - * This method takes an input string and formats it by including horizontal lines above - * and below the input string - * - * @param str input string to be sandwiched - * @return the original string sandwiched between two horizontal lines - */ - public static String sandwich(String str) { - return "____________________________________________________________\n" - + str + "\n" - + "____________________________________________________________"; - } - - /** - * This method takes the user's input list and beautifies it for display. - * - * @param taskArrayList the user's input list to be beautified - * @return the beautified string to display - */ - public static String listBeautify(ArrayList taskArrayList) { - StringBuilder listBeautified = new StringBuilder(); - for (int i = 0; i < taskArrayList.size(); i++) { - listBeautified.append(i + 1) - .append(".") - .append(taskArrayList.get(i).toString()); - if (i < taskArrayList.size() - 1) { // new line except for last item - listBeautified.append("\n"); - } - } - return listBeautified.toString(); - } - - /** - * This method copies the contents of the file from filePath and - * converts them into Task objects into the taskArrayList with the - * help of the parse() method. - * - * @param filePath the file path to the file from which to copy from - * @throws IOException if filePath does not exist - */ - private static void copyFileContents(String filePath) throws IOException { - File f = new File(filePath); // create a File for the given file path - Scanner s = new Scanner(f); // create a Scanner using the File as the source - StringBuilder targetBuilder = new StringBuilder(); - while (s.hasNext()) { - targetBuilder.append(s.nextLine()).append("\n"); - } - - taskArrayList = parse(targetBuilder.toString()); - } - - /** - * This method parses the string copied from duke.txt and converts them into task objects - * into the taskArrayList. - * - * @param toParse the string to parse - * @return a taskArrayList made up of tasks - */ - private static ArrayList parse(String toParse) { - ArrayList result = new ArrayList<>(); - Scanner ps = new Scanner(toParse); // passes whole file into the scanner -// [[T][ ] 1, [E][ ] 2 (at: 2), [D][ ] 3 (by: 3)] - while (ps.hasNextLine()) { - String nLine = ps.nextLine(); // parse one line at a time - int ref = 3; // reference point - char taskType = nLine.charAt(ref); - boolean isDone = nLine.charAt(ref + 3) == 'X'; - int strLength = nLine.length(); - switch (taskType) { - case 'T': - String todoName = nLine.substring(ref + 5, strLength); - Task newestTodo = new ToDo(todoName); - if (isDone) { - newestTodo.markAsDone(); - } - result.add(newestTodo); - break; - case 'D': - String deadlineInfo = nLine.substring(ref + 5, strLength); - String[] arrD = deadlineInfo.split("\\(by: ", 2); - String deadlineName = arrD[0]; - String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); - deadlineReminder = parseDate(deadlineReminder); - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - result.add(newestDeadline); - if (isDone) { - newestDeadline.markAsDone(); - } - break; - case 'E': - String eventInfo = nLine.substring(ref + 5, strLength); - String[] arrE = eventInfo.split("\\(at: ", 2); - String eventName = arrE[0]; - String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); - eventReminder = parseDate(eventReminder); - Task newestEvent = new Event(eventName, eventReminder); - result.add(newestEvent); - if (isDone) { - newestEvent.markAsDone(); - } - break; - default: - System.out.println("Unknown input"); - break; - } - } - System.out.println("result is: " + result); - return result; - } - - /** -<<<<<<< HEAD -======= - * Parses input string in the format "yyyy MM dd" and returns it in the format - * "YYYY-MM-DD". - * - * @param input string in format "MMM d yyyy" - * @return string in format "YYYY-MM-DD" - */ - private static String parseDate(String input) { - String year = input.substring(0, 4); - String month = input.substring(5, 7); - String day = input.substring(8, 10); - - return year + "-" + month + "-" + day; - } - - /** ->>>>>>> branch-Level-8 - * This method overwrites the file. - * - * @param filePath the path to the file to append to - * @param textToAppend the text to append - * @throws IOException if filePath does not exist - */ - - private static void overwriteFile(String filePath, String textToAppend) throws IOException { - FileWriter fw = new FileWriter(filePath, false); // create a FileWriter in append mode - fw.write(textToAppend); - fw.close(); - } - - /** - * This method appends to the file instead of overwrites. - * - * @param filePath the path to the file to append to - * @param textToAppend the text to append - * @throws IOException if filePath does not exist - */ - - private static void appendToFile(String filePath, String textToAppend) throws IOException { - FileWriter fw = new FileWriter(filePath, true); // create a FileWriter in append mode - fw.write(textToAppend); - fw.close(); - } - - /** - * Validates input string to ensure it follows the valid format YYYY-MM-DD, and is a valid date. - * - * @param input the string to be validated - * @return true if the string is a valid date - */ - private static boolean isValidDate(String input) { - String[] splitInputs = input.split("-"); - boolean isLeapYear; - String year = splitInputs[0]; - String month = splitInputs[1]; - String day = splitInputs[2]; - int maxDay; - - if (splitInputs.length != 3) { - return false; - } - - // check year - if (year.length() != 4 || !year.matches("\\d+")) { - return false; - } else { - isLeapYear = (Integer.parseInt(year) % 4 == 0); - } - - // check month - if (month.length() != 2 || !month.matches("\\d+")) { - return false; - } else { - switch (Integer.parseInt(month)) { - case 1: - case 3: - case 5: - case 7: - case 8: - case 10: - case 12: - maxDay = 31; - break; - case 4: - case 6: - case 9: - case 11: - maxDay = 30; - break; - case 2: - if (isLeapYear) { - maxDay = 29; - } else { - maxDay = 28; - } - break; - default: - return false; - } - } - - // check day - if (day.length() != 2 || !day.matches("\\d+")) { - return false; - } else { - return Integer.parseInt(day) <= maxDay; + private Storage storage; + private TaskList tasks; + private Ui ui; + + public Duke(String dukeFilePath) { + ui = new Ui(); + storage = new Storage(dukeFilePath); + try { + tasks = new TaskList(storage.load()); + } catch (DukeException | IOException e) { + ui.showLoadingError(); + tasks = new TaskList(); } } - public static void main(String[] args) throws IOException { - // commented out logo -// String logo = " ____ _ \n" -// + "| _ \\ _ _| | _____ \n" -// + "| | | | | | | |/ / _ \\\n" -// + "| |_| | |_| | < __/\n" -// + "|____/ \\__,_|_|\\_\\___|\n"; -// System.out.println("Hello from\n" + logo); - - // populating featuresCombined so each level has all elements of levels before it - StringBuilder featuresCombined = new StringBuilder(); - for (int count = 0; count <= lv; count++) { - featuresCombined.append(features[count]); - } - - // parsing duke.txt - copyFileContents(dukeFilePath); - - // Welcome message - String welcome = "Hello! I'm Duke: Level " + lv + "\n" - + "What would you like to do today?\n" - + "My current features are: " + featuresCombined + "\n" - + "Here are your tasks: " + "\n" - + sandwich(listBeautify(taskArrayList)); - - System.out.println(sandwich(welcome)); - - // load the data from the hard disk for dukeFile - File dukeFile = new File(dukeFilePath); - - // creates directory if it does not exist - if (dukeFile.mkdir()) { - System.out.println("folder: 'data/' has been created"); - } - // creates file if it does not exist - if (dukeFile.createNewFile()) { - System.out.println("'duke.txt' has been created in the 'data/' folder "); - } - - // Goodbye message - String goodbye = "Thank you for using Duke: Level " + lv + "\n" - + "See you soon!"; - - // TESTING DELETE BEFORE COMMIT! - // ArrayList test = new ArrayList(Integer.parseInt(" - // [[T][ ] t1, [D][ ] t2 (by: tt2), [E][ ] t3 (at: now)] - // ")); - + public void run() throws IOException { + ui.showWelcome(); + boolean canExit = false; // Scanner to read user inputs Scanner scanner = new Scanner(System.in); @@ -301,103 +48,19 @@ public static void main(String[] args) throws IOException { try { if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; - String temp = listBeautify(taskArrayList); - overwriteFile(dukeFilePath, temp); // append temp.toString() to dukeFile - System.out.println(sandwich(goodbye)); + String temp = tasks.listBeautify(taskArrayList); + storage.overwriteFile(dukeFilePath, temp); + ui.showGoodbye(); } else { // check first input - switch (userInput) { - case "list": // user inputs 'list', return all text stored - System.out.println(sandwich(listBeautify(taskArrayList))); - break; - case "tal": // user inputs 'list', return taskArrayList as it is - System.out.println(taskArrayList); - break; - case "done": // first input is done, check second input for integer - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - if (taskNum > taskArrayList.size()) { - throw new DukeException("No such task"); - } - taskArrayList.get(taskNum - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You have finished this task: " - + taskArrayList.get(taskNum - 1).toString())); - } else throw new DukeException("unspecified task to mark as done"); - break; - case "delete": - if (scanner.hasNextInt()) { - int taskNum = scanner.nextInt(); - if (taskNum > taskArrayList.size()) { - throw new DukeException("No such task"); - } - System.out.println(sandwich("Got it, I have deleted this task: " - + taskArrayList.get(taskNum - 1).toString() - + "\nYou now have " - + (taskArrayList.size() - 1) - + " item(s) in your task list.")); - // actual logic of deletion - taskArrayList.remove(taskNum - 1); - } else throw new DukeException("unspecified task to delete"); - break; - case "todo": - String todoName = scanner.nextLine(); - if (todoName.trim().equals("")) { - throw new DukeException("No task description"); - } - Task newestTodo = new ToDo(todoName); - taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" - + newestTodo - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - case "deadline": - String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); - if (deadlineTokens.length == 0) { - throw new DukeException("No task description"); - } else if (deadlineTokens.length == 1) { - throw new DukeException("No task deadline"); - } - String deadlineName = deadlineTokens[0]; - String deadlineReminder = deadlineTokens[1]; - if (!isValidDate(deadlineReminder)) { - throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); - } - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); - taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" - + newestDeadline - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - case "event": - String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); - if (eventTokens.length == 0) { - throw new DukeException("No task description"); - } else if (eventTokens.length == 1) { - throw new DukeException("No task duration"); - } - String eventName = eventTokens[0]; - String eventReminder = eventTokens[1]; - if (!isValidDate(eventReminder)) { - throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); - } - Task newestEvent = new Event(eventName, eventReminder); - taskArrayList.add(newestEvent); - System.out.println(sandwich("New event task added:\n" - + newestEvent - + "\nYou now have " - + taskArrayList.size() - + " item(s) in your task list.")); - break; - default: - throw new DukeException("Unknown Input"); // unknown input - } + ui.handleInput(scanner, userInput, tasks); } - } catch (DukeException e) { + } catch (DukeException | IOException e) { e.printStackTrace(); // print stack trace for e } } } + + public static void main(String[] args) throws IOException, DukeException { + new Duke("data/duke.txt").run(); + } } \ No newline at end of file diff --git a/src/main/java/DukeParser.java b/src/main/java/DukeParser.java new file mode 100644 index 0000000000..2bb240b9f4 --- /dev/null +++ b/src/main/java/DukeParser.java @@ -0,0 +1,106 @@ +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class DukeParser { + private String filePath; + + public DukeParser(String dukeFilePath) { + this.filePath = dukeFilePath; + } + + /** + * This method copies the contents of the file from filePath and + * converts them into Task objects into the taskArrayList with the + * help of the parse() method. + * + * @return taskArrayList the ArrayList to copy the information to + * @throws IOException if filePath does not exist + */ + public ArrayList copyFileContents() throws IOException { + File f = new File(this.filePath); // create a File for the given file path + Scanner s = new Scanner(f); // create a Scanner using the File as the source + StringBuilder targetBuilder = new StringBuilder(); + while (s.hasNext()) { + targetBuilder.append(s.nextLine()).append("\n"); + } + + return parse(targetBuilder.toString()); + } + + /** + * This method parses the string copied from duke.txt and converts them into task objects + * into the taskArrayList. + * + * @param toParse the string to parse + * @return a taskArrayList made up of tasks + */ + public static ArrayList parse(String toParse) { + ArrayList result = new ArrayList<>(); + Scanner ps = new Scanner(toParse); // passes whole file into the scanner +// [[T][ ] 1, [E][ ] 2 (at: 2), [D][ ] 3 (by: 3)] + while (ps.hasNextLine()) { + String nLine = ps.nextLine(); // parse one line at a time + int ref = 3; // reference point + char taskType = nLine.charAt(ref); + boolean isDone = nLine.charAt(ref + 3) == 'X'; + int strLength = nLine.length(); + switch (taskType) { + case 'T': + String todoName = nLine.substring(ref + 5, strLength); + Task newestTodo = new ToDo(todoName); + if (isDone) { + newestTodo.markAsDone(); + } + result.add(newestTodo); + break; + case 'D': + String deadlineInfo = nLine.substring(ref + 5, strLength); + String[] arrD = deadlineInfo.split("\\(by: ", 2); + String deadlineName = arrD[0]; + String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); + deadlineReminder = parseDate(deadlineReminder); + Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + result.add(newestDeadline); + if (isDone) { + newestDeadline.markAsDone(); + } + break; + case 'E': + String eventInfo = nLine.substring(ref + 5, strLength); + String[] arrE = eventInfo.split("\\(at: ", 2); + String eventName = arrE[0]; + String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); + eventReminder = parseDate(eventReminder); + Task newestEvent = new Event(eventName, eventReminder); + result.add(newestEvent); + if (isDone) { + newestEvent.markAsDone(); + } + break; + default: + System.out.println("Unknown input"); + break; + } + } + System.out.println("result is: " + result); + return result; + } + + /** + * Parses input string in the format "yyyy MM dd" and returns it in the format + * "YYYY-MM-DD". + * + * @param input string in format "MMM d yyyy" + * @return string in format "YYYY-MM-DD" + */ + public static String parseDate(String input) { + String year = input.substring(0, 4); + String month = input.substring(5, 7); + String day = input.substring(8, 10); + + return year + "-" + month + "-" + day; + } + +} diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java deleted file mode 100644 index 4d27fe15e5..0000000000 --- a/src/main/java/Parser.java +++ /dev/null @@ -1,2 +0,0 @@ -public class Parser { -} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 14d3059133..b08b93c436 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -1,2 +1,59 @@ +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.io.File; + public class Storage { + private static ArrayList taskArrayList = new ArrayList<>(); + private final String filePath; + + public Storage(String dukeFilePath) { + this.filePath = dukeFilePath; + } + + public ArrayList load() throws IOException { + // load the data from the hard disk for dukeFile + File dukeFile = new File(filePath); + + // creates directory if it does not exist + if (dukeFile.mkdir()) { + System.out.println("folder: 'data/' has been created"); + } + // creates file if it does not exist + if (dukeFile.createNewFile()) { + System.out.println("'duke.txt' has been created in the 'data/' folder "); + } + + DukeParser p = new DukeParser(filePath); + return p.copyFileContents(); + } + + /** + * This method overwrites the file. + * + * @param filePath the path to the file to append to + * @param textToAppend the text to append + * @throws IOException if filePath does not exist + */ + + public void overwriteFile(String filePath, String textToAppend) throws IOException { + FileWriter fw = new FileWriter(filePath, false); // create a FileWriter in append mode + fw.write(textToAppend); + fw.close(); + } + + /** + * This method appends to the file instead of overwrites. + * + * @param filePath the path to the file to append to + * @param textToAppend the text to append + * @throws IOException if filePath does not exist + */ + + public void appendToFile(String filePath, String textToAppend) throws IOException { + FileWriter fw = new FileWriter(filePath, true); // create a FileWriter in append mode + fw.write(textToAppend); + fw.close(); + } + } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 1e7aed1c05..33b22093c5 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,2 +1,186 @@ +import java.util.ArrayList; + public class TaskList { + private ArrayList taskArrayList; + + public TaskList() { + this.taskArrayList = new ArrayList<>(); + } + + public TaskList(ArrayList taskArrayList) throws DukeException { + this.taskArrayList = taskArrayList; + } + + /** + * This method takes an input string and formats it by including horizontal lines above + * and below the input string + * + * @param str input string to be sandwiched + * @return the original string sandwiched between two horizontal lines + */ + public static String sandwich(String str) { + return "____________________________________________________________\n" + + str + "\n" + + "____________________________________________________________"; + } + + /** + * This method takes the user's input list and beautifies it for display. + * + * @param taskArrayList the user's input list to be beautified + * @return the beautified string to display + */ + public String listBeautify(ArrayList taskArrayList) { + StringBuilder listBeautified = new StringBuilder(); + for (int i = 0; i < taskArrayList.size(); i++) { + listBeautified.append(i + 1) + .append(".") + .append(taskArrayList.get(i).toString()); + if (i < taskArrayList.size() - 1) { // new line except for last item + listBeautified.append("\n"); + } + } + return listBeautified.toString(); + } + + /** + * Validates input string to ensure it follows the valid format YYYY-MM-DD, and is a valid date. + * + * @param input the string to be validated + * @return true if the string is a valid date + */ + public boolean isValidDate(String input) { + String[] splitInputs = input.split("-"); + if (splitInputs.length != 3) { + return false; + } + boolean isLeapYear; + String year = splitInputs[0]; + String month = splitInputs[1]; + String day = splitInputs[2]; + int maxDay; + + // check year + if (year.length() != 4 || !year.matches("\\d+")) { + return false; + } else { + isLeapYear = (Integer.parseInt(year) % 4 == 0); + } + + // check month + if (month.length() != 2 || !month.matches("\\d+")) { + return false; + } else { + switch (Integer.parseInt(month)) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + maxDay = 31; + break; + case 4: + case 6: + case 9: + case 11: + maxDay = 30; + break; + case 2: + if (isLeapYear) { + maxDay = 29; + } else { + maxDay = 28; + } + break; + default: + return false; + } + } + + // check day + if (day.length() != 2 || !day.matches("\\d+")) { + return false; + } else { + return Integer.parseInt(day) <= maxDay; + } + } + + /** + * Adds a task into the task list. + * + * @param type the type of task to be added + * @param name the name of task to be added + * @param description the description of the task + * @throws DukeException + */ + public void addTask(String type, String name, String description) throws DukeException { + switch (type) { + case "todo": + if (name.trim().equals("")) { + throw new DukeException("No task name"); + } + Task newestTodo = new ToDo(name); + taskArrayList.add(newestTodo); + System.out.println(sandwich("New todo task added:\n" + + newestTodo + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + case "deadline": + if (!isValidDate(description)) { + throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); + } + Task newestDeadline = new Deadline(name, description); + taskArrayList.add(newestDeadline); + System.out.println(sandwich("New deadline task added:\n" + + newestDeadline + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + case "event": + if (!isValidDate(description)) { + throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); + } + Task newestEvent = new Event(name, description); + taskArrayList.add(newestEvent); + System.out.println(sandwich("New deadline task added:\n" + + newestEvent + + "\nYou now have " + + taskArrayList.size() + + " item(s) in your task list.")); + break; + default: + throw new DukeException("Unknown task type"); + } + } + + public void listTasks() { + System.out.println(sandwich(listBeautify(taskArrayList))); + } + + public void finishTask(int index) throws DukeException { + if (index > taskArrayList.size()) { + throw new DukeException("This task index is not in the task list!"); + } + taskArrayList.get(index - 1).markAsDone(); + System.out.println(sandwich("Congratulations! You have finished this task: " + + taskArrayList.get(index - 1).toString())); + } + + public void deleteTask(int index) throws DukeException { + if (index > taskArrayList.size()) { + throw new DukeException("This task index is not in the task list!"); + } + System.out.println(sandwich("Got it, I have deleted this task: " + + taskArrayList.get(index - 1).toString() + + "\nYou now have " + + (taskArrayList.size() - 1) + + " item(s) in your task list.")); + // actual logic of deletion + taskArrayList.remove(index - 1); + } } diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 30d98a7015..0b417ddd8d 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -1,2 +1,152 @@ +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + public class Ui { + private static final int lv = 8; + private static final String[] features = { + "", + "Greet, Echo, Exit", + ", Add, List", + ", Mark as Done", + ", ToDos, Events, Deadlines", + ", Handle Errors", + ", Delete", + ", Save", + ", Dates and Times" + }; + private static ArrayList taskArrayList = new ArrayList<>(); + private static final String dukeFilePath = "./data/duke.txt"; + + public Ui() { + + } + + /** + * This method takes an input string and formats it by including horizontal lines above + * and below the input string + * + * @param str input string to be sandwiched + * @return the original string sandwiched between two horizontal lines + */ + public static String sandwich(String str) { + return "____________________________________________________________\n" + + str + "\n" + + "____________________________________________________________"; + } + + /** + * This method takes the user's input list and beautifies it for display. + * + * @param taskArrayList the user's input list to be beautified + * @return the beautified string to display + */ + public static String listBeautify(ArrayList taskArrayList) { + StringBuilder listBeautified = new StringBuilder(); + for (int i = 0; i < taskArrayList.size(); i++) { + listBeautified.append(i + 1) + .append(".") + .append(taskArrayList.get(i).toString()); + if (i < taskArrayList.size() - 1) { // new line except for last item + listBeautified.append("\n"); + } + } + return listBeautified.toString(); + } + + /** + * Shows the welcome message when user runs Duke. + */ + public void showWelcome() throws IOException { + // populating featuresCombined so each level has all elements of levels before it + StringBuilder featuresCombined = new StringBuilder(); + for (int count = 0; count <= lv; count++) { + featuresCombined.append(features[count]); + } + + // parsing duke.txt + DukeParser dp = new DukeParser(dukeFilePath); + taskArrayList = dp.copyFileContents(); + + // Welcome message + String welcome = "Hello! I'm Duke: Level " + lv + "\n" + + "What would you like to do today?\n" + + "My current features are: " + featuresCombined + "\n" + + "Here are your tasks: " + "\n" + + sandwich(listBeautify(taskArrayList)); + + System.out.println(sandwich(welcome)); + } + + /** + * Shows the goodbye message when user exits Duke. + */ + public void showGoodbye() throws IOException { + // Goodbye message + String goodbye = "Thank you for using Duke: Level " + lv + "\n" + + "See you soon!"; + + System.out.println(sandwich(goodbye)); + } + + /** + * Reads user's inputs and responds to it accordingly. + * + * @param userInput the information entered by the user after the command + */ + public void handleInput(Scanner scanner, String userInput, TaskList tasks) throws DukeException { + switch (userInput) { + case "list": // user inputs 'list', return all text stored + tasks.listTasks(); + break; + case "done": // first input is done, check second input for integer + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + tasks.finishTask(taskNum); + } else throw new DukeException("unspecified task to mark as done"); + break; + case "delete": + if (scanner.hasNextInt()) { + int taskNum = scanner.nextInt(); + tasks.deleteTask(taskNum); + } else throw new DukeException("unspecified task to delete"); + break; + case "todo": + String todoName = scanner.nextLine(); + if (todoName.trim().equals("")) { + throw new DukeException("No task description"); + } + tasks.addTask("todo", todoName, ""); + break; + case "deadline": + String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); + if (deadlineTokens.length == 0) { + throw new DukeException("No task description"); + } else if (deadlineTokens.length == 1) { + throw new DukeException("No task deadline"); + } + String deadlineName = deadlineTokens[0]; + String deadlineReminder = deadlineTokens[1]; + tasks.addTask("deadline", deadlineName, deadlineReminder); + break; + case "event": + String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); + if (eventTokens.length == 0) { + throw new DukeException("No task description"); + } else if (eventTokens.length == 1) { + throw new DukeException("No task duration"); + } + String eventName = eventTokens[0]; + String eventReminder = eventTokens[1]; + tasks.addTask("event", eventName, eventReminder); + break; + default: + throw new DukeException("Unknown Input"); // unknown input + } + } + + public void showLoadingError() { + System.out.println("Loading error: duke.txt could not be loaded"); + } + } From 6415efd4cce4f7abfc8c0a039eb716d36705d2af Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Tue, 31 Aug 2021 20:06:04 +0800 Subject: [PATCH 44/73] Put all classes into cs2103.duke package --- src/main/java/{ => cs2103/duke}/Deadline.java | 2 ++ src/main/java/{ => cs2103/duke}/Duke.java | 2 ++ src/main/java/{ => cs2103/duke}/DukeException.java | 2 ++ src/main/java/{ => cs2103/duke}/DukeParser.java | 2 ++ src/main/java/{ => cs2103/duke}/Event.java | 2 ++ src/main/java/{ => cs2103/duke}/Storage.java | 2 ++ src/main/java/{ => cs2103/duke}/Task.java | 2 ++ src/main/java/{ => cs2103/duke}/TaskList.java | 2 ++ src/main/java/{ => cs2103/duke}/ToDo.java | 2 ++ src/main/java/{ => cs2103/duke}/Ui.java | 2 ++ 10 files changed, 20 insertions(+) rename src/main/java/{ => cs2103/duke}/Deadline.java (95%) rename src/main/java/{ => cs2103/duke}/Duke.java (98%) rename src/main/java/{ => cs2103/duke}/DukeException.java (93%) rename src/main/java/{ => cs2103/duke}/DukeParser.java (99%) rename src/main/java/{ => cs2103/duke}/Event.java (95%) rename src/main/java/{ => cs2103/duke}/Storage.java (98%) rename src/main/java/{ => cs2103/duke}/Task.java (98%) rename src/main/java/{ => cs2103/duke}/TaskList.java (99%) rename src/main/java/{ => cs2103/duke}/ToDo.java (90%) rename src/main/java/{ => cs2103/duke}/Ui.java (99%) diff --git a/src/main/java/Deadline.java b/src/main/java/cs2103/duke/Deadline.java similarity index 95% rename from src/main/java/Deadline.java rename to src/main/java/cs2103/duke/Deadline.java index 688ea01877..0d43d481c9 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/cs2103/duke/Deadline.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/Duke.java b/src/main/java/cs2103/duke/Duke.java similarity index 98% rename from src/main/java/Duke.java rename to src/main/java/cs2103/duke/Duke.java index 5037016ef0..538a5d5846 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.util.Scanner; import java.util.ArrayList; import java.io.File; diff --git a/src/main/java/DukeException.java b/src/main/java/cs2103/duke/DukeException.java similarity index 93% rename from src/main/java/DukeException.java rename to src/main/java/cs2103/duke/DukeException.java index adf029b033..1d534f2d89 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/cs2103/duke/DukeException.java @@ -1,3 +1,5 @@ +package cs2103.duke; + public class DukeException extends Exception { private static String msg; diff --git a/src/main/java/DukeParser.java b/src/main/java/cs2103/duke/DukeParser.java similarity index 99% rename from src/main/java/DukeParser.java rename to src/main/java/cs2103/duke/DukeParser.java index 2bb240b9f4..000f5ea0e3 100644 --- a/src/main/java/DukeParser.java +++ b/src/main/java/cs2103/duke/DukeParser.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.io.File; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/Event.java b/src/main/java/cs2103/duke/Event.java similarity index 95% rename from src/main/java/Event.java rename to src/main/java/cs2103/duke/Event.java index b40bd19c72..73285e51b3 100644 --- a/src/main/java/Event.java +++ b/src/main/java/cs2103/duke/Event.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/Storage.java b/src/main/java/cs2103/duke/Storage.java similarity index 98% rename from src/main/java/Storage.java rename to src/main/java/cs2103/duke/Storage.java index b08b93c436..23f3e49a09 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/cs2103/duke/Storage.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/Task.java b/src/main/java/cs2103/duke/Task.java similarity index 98% rename from src/main/java/Task.java rename to src/main/java/cs2103/duke/Task.java index 8329aa3f08..0d4f4fdeb0 100644 --- a/src/main/java/Task.java +++ b/src/main/java/cs2103/duke/Task.java @@ -1,3 +1,5 @@ +package cs2103.duke; + /** * This class encapsulates a Task object. */ diff --git a/src/main/java/TaskList.java b/src/main/java/cs2103/duke/TaskList.java similarity index 99% rename from src/main/java/TaskList.java rename to src/main/java/cs2103/duke/TaskList.java index 33b22093c5..40672767af 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.util.ArrayList; public class TaskList { diff --git a/src/main/java/ToDo.java b/src/main/java/cs2103/duke/ToDo.java similarity index 90% rename from src/main/java/ToDo.java rename to src/main/java/cs2103/duke/ToDo.java index 25be5ee3c2..1c03d0f61b 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/cs2103/duke/ToDo.java @@ -1,3 +1,5 @@ +package cs2103.duke; + public class ToDo extends Task { public ToDo(String description) { diff --git a/src/main/java/Ui.java b/src/main/java/cs2103/duke/Ui.java similarity index 99% rename from src/main/java/Ui.java rename to src/main/java/cs2103/duke/Ui.java index 0b417ddd8d..ac6f568c6e 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -1,3 +1,5 @@ +package cs2103.duke; + import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; From 1195f8d2f7687dea091b4ecfe239e1e1e786704f Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Tue, 31 Aug 2021 22:05:40 +0800 Subject: [PATCH 45/73] Add JUnit Tests for Duke --- data/duke.txt | 3 ++ src/main/data/duke.txt | 0 src/main/java/cs2103/duke/Duke.java | 25 ++++------------ src/main/java/cs2103/duke/DukeParser.java | 1 - src/main/java/cs2103/duke/Storage.java | 5 +++- src/main/java/cs2103/duke/Task.java | 2 +- src/main/java/cs2103/duke/TaskList.java | 25 ++++++++-------- src/main/java/cs2103/duke/Ui.java | 32 ++++++++------------ src/test/java/TaskListTest.java | 36 +++++++++++++++++++++++ 9 files changed, 75 insertions(+), 54 deletions(-) create mode 100644 src/main/data/duke.txt create mode 100644 src/test/java/TaskListTest.java diff --git a/data/duke.txt b/data/duke.txt index e69de29bb2..36f0f65726 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -0,0 +1,3 @@ +____________________________________________________________ +1.[T][ ] test1 +____________________________________________________________ \ No newline at end of file diff --git a/src/main/data/duke.txt b/src/main/data/duke.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index 538a5d5846..3afad0f283 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -2,26 +2,12 @@ import java.util.Scanner; import java.util.ArrayList; -import java.io.File; -import java.io.FileWriter; import java.io.IOException; /** * This class encapsulates a Duke chat-bot. */ public class Duke { - private static final int lv = 8; - private static final String[] features = { - "", - "Greet, Echo, Exit", - ", Add, List", - ", Mark as Done", - ", ToDos, Events, Deadlines", - ", Handle Errors", - ", Delete", - ", Save", - ", Dates and Times" - }; private static ArrayList taskArrayList = new ArrayList<>(); private static final String dukeFilePath = "./data/duke.txt"; private Storage storage; @@ -34,13 +20,13 @@ public Duke(String dukeFilePath) { try { tasks = new TaskList(storage.load()); } catch (DukeException | IOException e) { - ui.showLoadingError(); + System.out.println(ui.showLoadingError()); tasks = new TaskList(); } } public void run() throws IOException { - ui.showWelcome(); + System.out.println(ui.showWelcome()); boolean canExit = false; // Scanner to read user inputs Scanner scanner = new Scanner(System.in); @@ -50,11 +36,12 @@ public void run() throws IOException { try { if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; - String temp = tasks.listBeautify(taskArrayList); + // store task list + String temp = tasks.listTasks(); storage.overwriteFile(dukeFilePath, temp); - ui.showGoodbye(); + System.out.println(ui.showGoodbye()); } else { // check first input - ui.handleInput(scanner, userInput, tasks); + System.out.println(ui.handleInput(scanner, userInput, tasks)); } } catch (DukeException | IOException e) { e.printStackTrace(); // print stack trace for e diff --git a/src/main/java/cs2103/duke/DukeParser.java b/src/main/java/cs2103/duke/DukeParser.java index 000f5ea0e3..5a810a5706 100644 --- a/src/main/java/cs2103/duke/DukeParser.java +++ b/src/main/java/cs2103/duke/DukeParser.java @@ -86,7 +86,6 @@ public static ArrayList parse(String toParse) { break; } } - System.out.println("result is: " + result); return result; } diff --git a/src/main/java/cs2103/duke/Storage.java b/src/main/java/cs2103/duke/Storage.java index 23f3e49a09..6dcae73f2f 100644 --- a/src/main/java/cs2103/duke/Storage.java +++ b/src/main/java/cs2103/duke/Storage.java @@ -1,9 +1,10 @@ package cs2103.duke; +import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; -import java.io.File; + public class Storage { private static ArrayList taskArrayList = new ArrayList<>(); @@ -19,10 +20,12 @@ public ArrayList load() throws IOException { // creates directory if it does not exist if (dukeFile.mkdir()) { + // dukeFile.mkdir(); System.out.println("folder: 'data/' has been created"); } // creates file if it does not exist if (dukeFile.createNewFile()) { + // dukeFile.createNewFile(); System.out.println("'duke.txt' has been created in the 'data/' folder "); } diff --git a/src/main/java/cs2103/duke/Task.java b/src/main/java/cs2103/duke/Task.java index 0d4f4fdeb0..32b3d8b2fc 100644 --- a/src/main/java/cs2103/duke/Task.java +++ b/src/main/java/cs2103/duke/Task.java @@ -62,6 +62,6 @@ public void markAsDone() { * @return string representation of Task */ public String toString() { - return ("[" + getStatusIcon() + "]" + description); + return ("[" + getStatusIcon() + "] " + description); } } diff --git a/src/main/java/cs2103/duke/TaskList.java b/src/main/java/cs2103/duke/TaskList.java index 40672767af..1ceb7136d8 100644 --- a/src/main/java/cs2103/duke/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -115,9 +115,10 @@ public boolean isValidDate(String input) { * @param type the type of task to be added * @param name the name of task to be added * @param description the description of the task + * @return string representing the newly added task * @throws DukeException */ - public void addTask(String type, String name, String description) throws DukeException { + public String addTask(String type, String name, String description) throws DukeException { switch (type) { case "todo": if (name.trim().equals("")) { @@ -125,64 +126,62 @@ public void addTask(String type, String name, String description) throws DukeExc } Task newestTodo = new ToDo(name); taskArrayList.add(newestTodo); - System.out.println(sandwich("New todo task added:\n" + return (sandwich("New todo task added:\n" + newestTodo + "\nYou now have " + taskArrayList.size() + " item(s) in your task list.")); - break; case "deadline": if (!isValidDate(description)) { throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); } Task newestDeadline = new Deadline(name, description); taskArrayList.add(newestDeadline); - System.out.println(sandwich("New deadline task added:\n" + return (sandwich("New deadline task added:\n" + newestDeadline + "\nYou now have " + taskArrayList.size() + " item(s) in your task list.")); - break; case "event": if (!isValidDate(description)) { throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); } Task newestEvent = new Event(name, description); taskArrayList.add(newestEvent); - System.out.println(sandwich("New deadline task added:\n" + return (sandwich("New deadline task added:\n" + newestEvent + "\nYou now have " + taskArrayList.size() + " item(s) in your task list.")); - break; default: throw new DukeException("Unknown task type"); } } - public void listTasks() { - System.out.println(sandwich(listBeautify(taskArrayList))); + public String listTasks() { + return (sandwich(listBeautify(taskArrayList))); } - public void finishTask(int index) throws DukeException { + public String finishTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); } taskArrayList.get(index - 1).markAsDone(); - System.out.println(sandwich("Congratulations! You have finished this task: " + return (sandwich("Congratulations! You have finished this task: " + taskArrayList.get(index - 1).toString())); } - public void deleteTask(int index) throws DukeException { + public String deleteTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); } - System.out.println(sandwich("Got it, I have deleted this task: " + String deleteMessage = (sandwich("Got it, I have deleted this task: " + taskArrayList.get(index - 1).toString() + "\nYou now have " + (taskArrayList.size() - 1) + " item(s) in your task list.")); // actual logic of deletion taskArrayList.remove(index - 1); + return deleteMessage; } } diff --git a/src/main/java/cs2103/duke/Ui.java b/src/main/java/cs2103/duke/Ui.java index ac6f568c6e..8f7e2a92f3 100644 --- a/src/main/java/cs2103/duke/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -59,7 +59,7 @@ public static String listBeautify(ArrayList taskArrayList) { /** * Shows the welcome message when user runs Duke. */ - public void showWelcome() throws IOException { + public String showWelcome() throws IOException { // populating featuresCombined so each level has all elements of levels before it StringBuilder featuresCombined = new StringBuilder(); for (int count = 0; count <= lv; count++) { @@ -77,18 +77,18 @@ public void showWelcome() throws IOException { + "Here are your tasks: " + "\n" + sandwich(listBeautify(taskArrayList)); - System.out.println(sandwich(welcome)); + return (sandwich(welcome)); } /** * Shows the goodbye message when user exits Duke. */ - public void showGoodbye() throws IOException { + public String showGoodbye() throws IOException { // Goodbye message String goodbye = "Thank you for using Duke: Level " + lv + "\n" + "See you soon!"; - System.out.println(sandwich(goodbye)); + return (sandwich(goodbye)); } /** @@ -96,30 +96,26 @@ public void showGoodbye() throws IOException { * * @param userInput the information entered by the user after the command */ - public void handleInput(Scanner scanner, String userInput, TaskList tasks) throws DukeException { + public String handleInput(Scanner scanner, String userInput, TaskList tasks) throws DukeException { switch (userInput) { case "list": // user inputs 'list', return all text stored - tasks.listTasks(); - break; + return tasks.listTasks(); case "done": // first input is done, check second input for integer if (scanner.hasNextInt()) { int taskNum = scanner.nextInt(); - tasks.finishTask(taskNum); + return tasks.finishTask(taskNum); } else throw new DukeException("unspecified task to mark as done"); - break; case "delete": if (scanner.hasNextInt()) { int taskNum = scanner.nextInt(); - tasks.deleteTask(taskNum); + return tasks.deleteTask(taskNum); } else throw new DukeException("unspecified task to delete"); - break; case "todo": String todoName = scanner.nextLine(); if (todoName.trim().equals("")) { throw new DukeException("No task description"); } - tasks.addTask("todo", todoName, ""); - break; + return tasks.addTask("todo", todoName, ""); case "deadline": String[] deadlineTokens = scanner.nextLine().split("\\s*/by\\s*"); if (deadlineTokens.length == 0) { @@ -129,8 +125,7 @@ public void handleInput(Scanner scanner, String userInput, TaskList tasks) throw } String deadlineName = deadlineTokens[0]; String deadlineReminder = deadlineTokens[1]; - tasks.addTask("deadline", deadlineName, deadlineReminder); - break; + return tasks.addTask("deadline", deadlineName, deadlineReminder); case "event": String[] eventTokens = scanner.nextLine().split("\\s*/at\\s*"); if (eventTokens.length == 0) { @@ -140,15 +135,14 @@ public void handleInput(Scanner scanner, String userInput, TaskList tasks) throw } String eventName = eventTokens[0]; String eventReminder = eventTokens[1]; - tasks.addTask("event", eventName, eventReminder); - break; + return tasks.addTask("event", eventName, eventReminder); default: throw new DukeException("Unknown Input"); // unknown input } } - public void showLoadingError() { - System.out.println("Loading error: duke.txt could not be loaded"); + public String showLoadingError() { + return ("Loading error: duke.txt could not be loaded"); } } diff --git a/src/test/java/TaskListTest.java b/src/test/java/TaskListTest.java new file mode 100644 index 0000000000..ccd7268557 --- /dev/null +++ b/src/test/java/TaskListTest.java @@ -0,0 +1,36 @@ +package cs2103.duke.test; + +import cs2103.duke.DukeException; +import cs2103.duke.TaskList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TaskListTest { + @Test + public void dummyTest() { + assertEquals(2, 2); + } + + @Test + public void testAddTodo() throws DukeException { + TaskList tl = new TaskList(); + assertEquals("____________________________________________________________\n" + + "New todo task added:\n" + + "[T][ ] test1\n" + + "You now have 1 item(s) in your task list.\n" + + "____________________________________________________________", + tl.addTask("todo", "test1", "")); + } + + @Test + public void testAddDeadline() throws DukeException { + TaskList tl = new TaskList(); + assertEquals("____________________________________________________________\n" + + "New deadline task added:\n" + + "[D][ ] ms3 (by: 2021 07 20)\n" + + "You now have 1 item(s) in your task list.\n" + + "____________________________________________________________", + tl.addTask("deadline", "ms3", "2021-07-20")); + } +} From 9a5e6fcb8350f6ef53f3ce3163aa08c2e78597b9 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Tue, 31 Aug 2021 23:30:04 +0800 Subject: [PATCH 46/73] Update duke.txt initialisation to enable use of .jar files --- data/duke.txt | 6 ++--- src/main/data/duke.txt | 0 src/main/java/META-INF/MANIFEST.MF | 3 +++ src/main/java/cs2103/duke/Duke.java | 16 +++++++---- src/main/java/cs2103/duke/Storage.java | 26 +++++++++++++----- src/main/java/cs2103/duke/Task.java | 2 +- src/main/java/cs2103/duke/TaskList.java | 5 ++-- src/main/java/cs2103/duke/Ui.java | 35 ++++++------------------- src/test/java/TaskListTest.java | 4 +-- 9 files changed, 50 insertions(+), 47 deletions(-) delete mode 100644 src/main/data/duke.txt create mode 100644 src/main/java/META-INF/MANIFEST.MF diff --git a/data/duke.txt b/data/duke.txt index 36f0f65726..82611e34b4 100644 --- a/data/duke.txt +++ b/data/duke.txt @@ -1,3 +1,3 @@ -____________________________________________________________ -1.[T][ ] test1 -____________________________________________________________ \ No newline at end of file +1.[T][ ] 1 +2.[E][ ] 2 (at: 2022 02 02) +3.[D][ ] 3 (by: 2021 10 10) \ No newline at end of file diff --git a/src/main/data/duke.txt b/src/main/data/duke.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..6fd745921d --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: cs2103.duke.Duke + diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index 3afad0f283..5e0ed37fb7 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -1,5 +1,6 @@ package cs2103.duke; +import java.io.File; import java.util.Scanner; import java.util.ArrayList; import java.io.IOException; @@ -9,13 +10,13 @@ */ public class Duke { private static ArrayList taskArrayList = new ArrayList<>(); - private static final String dukeFilePath = "./data/duke.txt"; + private static String dukeFilePath; private Storage storage; private TaskList tasks; private Ui ui; public Duke(String dukeFilePath) { - ui = new Ui(); + this.dukeFilePath = dukeFilePath; storage = new Storage(dukeFilePath); try { tasks = new TaskList(storage.load()); @@ -23,6 +24,7 @@ public Duke(String dukeFilePath) { System.out.println(ui.showLoadingError()); tasks = new TaskList(); } + ui = new Ui(tasks); } public void run() throws IOException { @@ -37,7 +39,8 @@ public void run() throws IOException { if (userInput.equals("bye")) { // user inputs "bye", set canExit to true and Exit canExit = true; // store task list - String temp = tasks.listTasks(); + String temp = tasks.listBeautify(); + System.out.println("temp is: " + temp); storage.overwriteFile(dukeFilePath, temp); System.out.println(ui.showGoodbye()); } else { // check first input @@ -49,7 +52,10 @@ public void run() throws IOException { } } - public static void main(String[] args) throws IOException, DukeException { - new Duke("data/duke.txt").run(); + public static void main(String[] args) throws IOException { + String dukeFilePath = "./data/duke.txt"; + Storage s = new Storage(dukeFilePath); + s.initialize(); + new Duke(dukeFilePath).run(); } } \ No newline at end of file diff --git a/src/main/java/cs2103/duke/Storage.java b/src/main/java/cs2103/duke/Storage.java index 6dcae73f2f..fcb7280283 100644 --- a/src/main/java/cs2103/duke/Storage.java +++ b/src/main/java/cs2103/duke/Storage.java @@ -14,12 +14,17 @@ public Storage(String dukeFilePath) { this.filePath = dukeFilePath; } - public ArrayList load() throws IOException { - // load the data from the hard disk for dukeFile - File dukeFile = new File(filePath); - + /** + * Checks the dukeFilePath for the existence of duke.txt, if the file or the folder containing it + * does not exist, create them. + */ + public void initialize() throws IOException { + String dukeFileDirectoryPath = "./data"; + String dukeFilePath = "./data/duke.txt"; + File dukeFileDirectory = new File(dukeFileDirectoryPath); + File dukeFile = new File(dukeFilePath); // creates directory if it does not exist - if (dukeFile.mkdir()) { + if (dukeFileDirectory.mkdir()) { // dukeFile.mkdir(); System.out.println("folder: 'data/' has been created"); } @@ -28,7 +33,16 @@ public ArrayList load() throws IOException { // dukeFile.createNewFile(); System.out.println("'duke.txt' has been created in the 'data/' folder "); } - + } + /** + * Loads the data stored in duke.txt into a taskArrayList. + * @return the taskArrayList representation of the data stored in duke.txt, if any. + * @throws IOException + */ + public ArrayList load() throws IOException { + // initialize + initialize(); + // load the data from the hard disk for dukeFile DukeParser p = new DukeParser(filePath); return p.copyFileContents(); } diff --git a/src/main/java/cs2103/duke/Task.java b/src/main/java/cs2103/duke/Task.java index 32b3d8b2fc..0d4f4fdeb0 100644 --- a/src/main/java/cs2103/duke/Task.java +++ b/src/main/java/cs2103/duke/Task.java @@ -62,6 +62,6 @@ public void markAsDone() { * @return string representation of Task */ public String toString() { - return ("[" + getStatusIcon() + "] " + description); + return ("[" + getStatusIcon() + "]" + description); } } diff --git a/src/main/java/cs2103/duke/TaskList.java b/src/main/java/cs2103/duke/TaskList.java index 1ceb7136d8..f9a4e653f8 100644 --- a/src/main/java/cs2103/duke/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -29,10 +29,9 @@ public static String sandwich(String str) { /** * This method takes the user's input list and beautifies it for display. * - * @param taskArrayList the user's input list to be beautified * @return the beautified string to display */ - public String listBeautify(ArrayList taskArrayList) { + public String listBeautify() { StringBuilder listBeautified = new StringBuilder(); for (int i = 0; i < taskArrayList.size(); i++) { listBeautified.append(i + 1) @@ -159,7 +158,7 @@ public String addTask(String type, String name, String description) throws DukeE } public String listTasks() { - return (sandwich(listBeautify(taskArrayList))); + return (sandwich(listBeautify())); } public String finishTask(int index) throws DukeException { diff --git a/src/main/java/cs2103/duke/Ui.java b/src/main/java/cs2103/duke/Ui.java index 8f7e2a92f3..735adbb6e5 100644 --- a/src/main/java/cs2103/duke/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -17,11 +17,10 @@ public class Ui { ", Save", ", Dates and Times" }; - private static ArrayList taskArrayList = new ArrayList<>(); - private static final String dukeFilePath = "./data/duke.txt"; - - public Ui() { + private static TaskList taskArrayList; + public Ui(TaskList tasks) { + this.taskArrayList = tasks; } /** @@ -37,24 +36,6 @@ public static String sandwich(String str) { + "____________________________________________________________"; } - /** - * This method takes the user's input list and beautifies it for display. - * - * @param taskArrayList the user's input list to be beautified - * @return the beautified string to display - */ - public static String listBeautify(ArrayList taskArrayList) { - StringBuilder listBeautified = new StringBuilder(); - for (int i = 0; i < taskArrayList.size(); i++) { - listBeautified.append(i + 1) - .append(".") - .append(taskArrayList.get(i).toString()); - if (i < taskArrayList.size() - 1) { // new line except for last item - listBeautified.append("\n"); - } - } - return listBeautified.toString(); - } /** * Shows the welcome message when user runs Duke. @@ -65,17 +46,17 @@ public String showWelcome() throws IOException { for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } - - // parsing duke.txt - DukeParser dp = new DukeParser(dukeFilePath); - taskArrayList = dp.copyFileContents(); +// +// // parsing duke.txt +// DukeParser dp = new DukeParser(dukeFilePath); +// taskArrayList = dp.copyFileContents(); // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" + "What would you like to do today?\n" + "My current features are: " + featuresCombined + "\n" + "Here are your tasks: " + "\n" - + sandwich(listBeautify(taskArrayList)); + + sandwich(taskArrayList.listBeautify()); return (sandwich(welcome)); } diff --git a/src/test/java/TaskListTest.java b/src/test/java/TaskListTest.java index ccd7268557..d50d1f639b 100644 --- a/src/test/java/TaskListTest.java +++ b/src/test/java/TaskListTest.java @@ -17,7 +17,7 @@ public void testAddTodo() throws DukeException { TaskList tl = new TaskList(); assertEquals("____________________________________________________________\n" + "New todo task added:\n" - + "[T][ ] test1\n" + + "[T][ ]test1\n" + "You now have 1 item(s) in your task list.\n" + "____________________________________________________________", tl.addTask("todo", "test1", "")); @@ -28,7 +28,7 @@ public void testAddDeadline() throws DukeException { TaskList tl = new TaskList(); assertEquals("____________________________________________________________\n" + "New deadline task added:\n" - + "[D][ ] ms3 (by: 2021 07 20)\n" + + "[D][ ]ms3 (by: 2021 07 20)\n" + "You now have 1 item(s) in your task list.\n" + "____________________________________________________________", tl.addTask("deadline", "ms3", "2021-07-20")); From c276a323c3e31bb83aadb64934ad0c8818ec7554 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 1 Sep 2021 00:15:33 +0800 Subject: [PATCH 47/73] Add complete JavaDoc for all classes in Duke --- src/main/java/cs2103/duke/Deadline.java | 3 ++ src/main/java/cs2103/duke/Duke.java | 1 - src/main/java/cs2103/duke/DukeException.java | 3 ++ src/main/java/cs2103/duke/DukeParser.java | 16 +++--- src/main/java/cs2103/duke/Event.java | 3 ++ src/main/java/cs2103/duke/Storage.java | 25 +++++---- src/main/java/cs2103/duke/Task.java | 18 +++---- src/main/java/cs2103/duke/TaskList.java | 55 +++++++++++++++----- src/main/java/cs2103/duke/ToDo.java | 3 ++ src/main/java/cs2103/duke/Ui.java | 36 ++++++++----- src/test/java/TaskListTest.java | 4 ++ 11 files changed, 118 insertions(+), 49 deletions(-) diff --git a/src/main/java/cs2103/duke/Deadline.java b/src/main/java/cs2103/duke/Deadline.java index 0d43d481c9..f578cbcede 100644 --- a/src/main/java/cs2103/duke/Deadline.java +++ b/src/main/java/cs2103/duke/Deadline.java @@ -3,6 +3,9 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +/** + * This class encapsulates a Deadline Task object, which inherits from the Task class. + */ public class Deadline extends Task { protected String by; diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index 5e0ed37fb7..4e4148b1d4 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -1,6 +1,5 @@ package cs2103.duke; -import java.io.File; import java.util.Scanner; import java.util.ArrayList; import java.io.IOException; diff --git a/src/main/java/cs2103/duke/DukeException.java b/src/main/java/cs2103/duke/DukeException.java index 1d534f2d89..32442b5633 100644 --- a/src/main/java/cs2103/duke/DukeException.java +++ b/src/main/java/cs2103/duke/DukeException.java @@ -1,5 +1,8 @@ package cs2103.duke; +/** + * This class encapsulates the exception thrown when the user enters an erroneous input. + */ public class DukeException extends Exception { private static String msg; diff --git a/src/main/java/cs2103/duke/DukeParser.java b/src/main/java/cs2103/duke/DukeParser.java index 5a810a5706..cd4e339126 100644 --- a/src/main/java/cs2103/duke/DukeParser.java +++ b/src/main/java/cs2103/duke/DukeParser.java @@ -5,6 +5,10 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * This class encapsulates the parsing of duke.txt to convert the contents of the file + * into an ArrayList. + */ public class DukeParser { private String filePath; @@ -17,8 +21,8 @@ public DukeParser(String dukeFilePath) { * converts them into Task objects into the taskArrayList with the * help of the parse() method. * - * @return taskArrayList the ArrayList to copy the information to - * @throws IOException if filePath does not exist + * @return TaskArrayList the ArrayList to copy the information to. + * @throws IOException If filePath does not exist. */ public ArrayList copyFileContents() throws IOException { File f = new File(this.filePath); // create a File for the given file path @@ -35,8 +39,8 @@ public ArrayList copyFileContents() throws IOException { * This method parses the string copied from duke.txt and converts them into task objects * into the taskArrayList. * - * @param toParse the string to parse - * @return a taskArrayList made up of tasks + * @param toParse The string to parse. + * @return A taskArrayList made up of tasks. */ public static ArrayList parse(String toParse) { ArrayList result = new ArrayList<>(); @@ -93,8 +97,8 @@ public static ArrayList parse(String toParse) { * Parses input string in the format "yyyy MM dd" and returns it in the format * "YYYY-MM-DD". * - * @param input string in format "MMM d yyyy" - * @return string in format "YYYY-MM-DD" + * @param input String in format "MMM d yyyy". + * @return String in format "YYYY-MM-DD". */ public static String parseDate(String input) { String year = input.substring(0, 4); diff --git a/src/main/java/cs2103/duke/Event.java b/src/main/java/cs2103/duke/Event.java index 73285e51b3..6f34873a0b 100644 --- a/src/main/java/cs2103/duke/Event.java +++ b/src/main/java/cs2103/duke/Event.java @@ -3,6 +3,9 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +/** + * This class encapsulates an Event Task object, which inherits from the Task class. + */ public class Event extends Task { protected String at; diff --git a/src/main/java/cs2103/duke/Storage.java b/src/main/java/cs2103/duke/Storage.java index fcb7280283..f419e25d7b 100644 --- a/src/main/java/cs2103/duke/Storage.java +++ b/src/main/java/cs2103/duke/Storage.java @@ -5,7 +5,10 @@ import java.io.IOException; import java.util.ArrayList; - +/** + * This class encapsulates a Storage object which saves the tasks that have been added by the user, it also + * performs the initialization for the duke.txt and its parent folder, if they are not already present. + */ public class Storage { private static ArrayList taskArrayList = new ArrayList<>(); private final String filePath; @@ -17,6 +20,8 @@ public Storage(String dukeFilePath) { /** * Checks the dukeFilePath for the existence of duke.txt, if the file or the folder containing it * does not exist, create them. + * + * @throws IOException If an invalid input is detected. */ public void initialize() throws IOException { String dukeFileDirectoryPath = "./data"; @@ -34,10 +39,12 @@ public void initialize() throws IOException { System.out.println("'duke.txt' has been created in the 'data/' folder "); } } + /** * Loads the data stored in duke.txt into a taskArrayList. - * @return the taskArrayList representation of the data stored in duke.txt, if any. - * @throws IOException + * + * @return The taskArrayList representation of the data stored in duke.txt, if any. + * @throws IOException If an invalid input is detected. */ public ArrayList load() throws IOException { // initialize @@ -50,9 +57,9 @@ public ArrayList load() throws IOException { /** * This method overwrites the file. * - * @param filePath the path to the file to append to - * @param textToAppend the text to append - * @throws IOException if filePath does not exist + * @param filePath The path to the file to append to. + * @param textToAppend The text to append. + * @throws IOException If filePath does not exist. */ public void overwriteFile(String filePath, String textToAppend) throws IOException { @@ -64,9 +71,9 @@ public void overwriteFile(String filePath, String textToAppend) throws IOExcepti /** * This method appends to the file instead of overwrites. * - * @param filePath the path to the file to append to - * @param textToAppend the text to append - * @throws IOException if filePath does not exist + * @param filePath The path to the file to append to. + * @param textToAppend The text to append. + * @throws IOException If filePath does not exist. */ public void appendToFile(String filePath, String textToAppend) throws IOException { diff --git a/src/main/java/cs2103/duke/Task.java b/src/main/java/cs2103/duke/Task.java index 0d4f4fdeb0..4560687383 100644 --- a/src/main/java/cs2103/duke/Task.java +++ b/src/main/java/cs2103/duke/Task.java @@ -11,9 +11,9 @@ public class Task { protected String reminder; /** - * Creates a task with the specified description, isDone false by default. - * @param description description of task + * Creates a task with the specified description, isDone is false by default. * + * @param description description of task. */ public Task(String description) { this.description = description; @@ -21,9 +21,9 @@ public Task(String description) { } /** - * Getter method for status using isDone + * Getter method for status using isDone. * - * @return an icon 'X' if complete, space if otherwise + * @return A letter 'X' if task is complete, an empty space if otherwise. */ public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X @@ -32,7 +32,7 @@ public String getStatusIcon() { /** * Getter method for type of task using taskType. * - * @return an icon representing the type of the task (T, D, E) + * @return A letter representing the type of the task (T, D, E). */ public String getTypeIcon() { return (this.taskType == "todo" ? "T" : @@ -41,16 +41,16 @@ public String getTypeIcon() { } /** - * Getter method for task reminder + * Getter method for task reminder. * - * @return the string reminder for the task + * @return The string reminder for the task. */ public String getReminder() { return this.reminder; } /** - * Setter method for isDone of a Task object + * Setter method for isDone of a Task object. */ public void markAsDone() { this.isDone = true; @@ -59,7 +59,7 @@ public void markAsDone() { /** * Returns string representation of Task. * - * @return string representation of Task + * @return String representation of Task. */ public String toString() { return ("[" + getStatusIcon() + "]" + description); diff --git a/src/main/java/cs2103/duke/TaskList.java b/src/main/java/cs2103/duke/TaskList.java index f9a4e653f8..fd805b3422 100644 --- a/src/main/java/cs2103/duke/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -2,23 +2,35 @@ import java.util.ArrayList; +/** + * This class encapsulates a TaskList object, which represents all the tasks added by a user. + */ public class TaskList { private ArrayList taskArrayList; + /** + * This constructor instantiates a new Tasklist with no tasks inside. + */ public TaskList() { this.taskArrayList = new ArrayList<>(); } + /** + * This constructor instantiates a new TaskList with tasks provided by the input taskArrayList. + * + * @param taskArrayList The ArrayList containing the tasks with which to instantiate the new TaskList object. + * @throws DukeException If an invalid input is detected. + */ public TaskList(ArrayList taskArrayList) throws DukeException { this.taskArrayList = taskArrayList; } /** * This method takes an input string and formats it by including horizontal lines above - * and below the input string + * and below the input string. * - * @param str input string to be sandwiched - * @return the original string sandwiched between two horizontal lines + * @param str Input string to be sandwiched. + * @return The original string sandwiched between two horizontal lines. */ public static String sandwich(String str) { return "____________________________________________________________\n" @@ -29,7 +41,7 @@ public static String sandwich(String str) { /** * This method takes the user's input list and beautifies it for display. * - * @return the beautified string to display + * @return The beautified string to display. */ public String listBeautify() { StringBuilder listBeautified = new StringBuilder(); @@ -47,8 +59,8 @@ public String listBeautify() { /** * Validates input string to ensure it follows the valid format YYYY-MM-DD, and is a valid date. * - * @param input the string to be validated - * @return true if the string is a valid date + * @param input The string to be validated. + * @return True if the string is a valid date. */ public boolean isValidDate(String input) { String[] splitInputs = input.split("-"); @@ -111,11 +123,11 @@ public boolean isValidDate(String input) { /** * Adds a task into the task list. * - * @param type the type of task to be added - * @param name the name of task to be added - * @param description the description of the task - * @return string representing the newly added task - * @throws DukeException + * @param type The type of task to be added. + * @param name The name of task to be added. + * @param description The description of the task. + * @return String representing the newly added task. + * @throws DukeException if the user input is invalid. */ public String addTask(String type, String name, String description) throws DukeException { switch (type) { @@ -157,10 +169,22 @@ public String addTask(String type, String name, String description) throws DukeE } } + /** + * This method lists all tasks in the TaskList. + * + * @return A string representing all tasks in the TaskList. + */ public String listTasks() { return (sandwich(listBeautify())); } + /** + * This method marks a task as finished, and returns a string informing the user of the change. + * + * @param index The index of the task to be marked, the first task will have an index of 1. + * @return A string informing the user of the change. + * @throws DukeException If the user specified an invalid index. + */ public String finishTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); @@ -170,11 +194,18 @@ public String finishTask(int index) throws DukeException { + taskArrayList.get(index - 1).toString())); } + /** + * This method removes a task from the TaskList, and lets the user know which task was removed. + * + * @param index The index of the task to be deleted, the first task will have an index of 1. + * @return A string informing the user of the deletion. + * @throws DukeException If the user specified an invalid index. + */ public String deleteTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); } - String deleteMessage = (sandwich("Got it, I have deleted this task: " + String deleteMessage = (sandwich("Got it, I have deleted this task: " + taskArrayList.get(index - 1).toString() + "\nYou now have " + (taskArrayList.size() - 1) diff --git a/src/main/java/cs2103/duke/ToDo.java b/src/main/java/cs2103/duke/ToDo.java index 1c03d0f61b..7e3ed98d21 100644 --- a/src/main/java/cs2103/duke/ToDo.java +++ b/src/main/java/cs2103/duke/ToDo.java @@ -1,5 +1,8 @@ package cs2103.duke; +/** + * This class encapsulates a Todo Task object, which inherits from the Task class. + */ public class ToDo extends Task { public ToDo(String description) { diff --git a/src/main/java/cs2103/duke/Ui.java b/src/main/java/cs2103/duke/Ui.java index 735adbb6e5..72d35b059b 100644 --- a/src/main/java/cs2103/duke/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -1,9 +1,12 @@ package cs2103.duke; import java.io.IOException; -import java.util.ArrayList; import java.util.Scanner; +/** + * This class encapsulates an Ui object, which abstracts the user interactions with Duke out of + * the Duke class. + */ public class Ui { private static final int lv = 8; private static final String[] features = { @@ -25,10 +28,10 @@ public Ui(TaskList tasks) { /** * This method takes an input string and formats it by including horizontal lines above - * and below the input string + * and below the input string. * - * @param str input string to be sandwiched - * @return the original string sandwiched between two horizontal lines + * @param str Input string to be sandwiched. + * @return The original string sandwiched between two horizontal lines. */ public static String sandwich(String str) { return "____________________________________________________________\n" @@ -38,18 +41,16 @@ public static String sandwich(String str) { /** - * Shows the welcome message when user runs Duke. + * Shows the welcome message when the user runs Duke. + * + * @return The welcome message to the user. */ - public String showWelcome() throws IOException { + public String showWelcome() { // populating featuresCombined so each level has all elements of levels before it StringBuilder featuresCombined = new StringBuilder(); for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } -// -// // parsing duke.txt -// DukeParser dp = new DukeParser(dukeFilePath); -// taskArrayList = dp.copyFileContents(); // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" @@ -62,7 +63,9 @@ public String showWelcome() throws IOException { } /** - * Shows the goodbye message when user exits Duke. + * Shows the goodbye message when the user exits Duke. + * + * @return The goodbye message to the user. */ public String showGoodbye() throws IOException { // Goodbye message @@ -75,7 +78,11 @@ public String showGoodbye() throws IOException { /** * Reads user's inputs and responds to it accordingly. * - * @param userInput the information entered by the user after the command + * @param scanner The scanner object used to read user inputs. + * @param userInput The information entered by the user after the command. + * @param tasks The Tasklist object containing all currently present tasks. + * @return The string representing the task added by the user. + * @throws DukeException If user enters an invalid input. */ public String handleInput(Scanner scanner, String userInput, TaskList tasks) throws DukeException { switch (userInput) { @@ -122,6 +129,11 @@ public String handleInput(Scanner scanner, String userInput, TaskList tasks) thr } } + /** + * Alert the user if the duke.txt could not be loaded. + * + * @return A string alerting the user of the error. + */ public String showLoadingError() { return ("Loading error: duke.txt could not be loaded"); } diff --git a/src/test/java/TaskListTest.java b/src/test/java/TaskListTest.java index d50d1f639b..9c3ece10be 100644 --- a/src/test/java/TaskListTest.java +++ b/src/test/java/TaskListTest.java @@ -6,6 +6,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +/** + * This class encapsulates the testing for TaskList in the Duke package, + * the names of the test methods are meant to be self-explanatory. + */ public class TaskListTest { @Test public void dummyTest() { From 5524ba8f40f0bef1e0df51c63e48b5c39625513e Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 1 Sep 2021 00:21:15 +0800 Subject: [PATCH 48/73] Remove unnecessary use of the 'this' keyword --- src/main/java/cs2103/duke/TaskList.java | 2 +- src/main/java/cs2103/duke/Ui.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/cs2103/duke/TaskList.java b/src/main/java/cs2103/duke/TaskList.java index f9a4e653f8..6298398381 100644 --- a/src/main/java/cs2103/duke/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -6,7 +6,7 @@ public class TaskList { private ArrayList taskArrayList; public TaskList() { - this.taskArrayList = new ArrayList<>(); + taskArrayList = new ArrayList<>(); } public TaskList(ArrayList taskArrayList) throws DukeException { diff --git a/src/main/java/cs2103/duke/Ui.java b/src/main/java/cs2103/duke/Ui.java index 735adbb6e5..f136da2a8a 100644 --- a/src/main/java/cs2103/duke/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -20,7 +20,7 @@ public class Ui { private static TaskList taskArrayList; public Ui(TaskList tasks) { - this.taskArrayList = tasks; + taskArrayList = tasks; } /** @@ -46,10 +46,6 @@ public String showWelcome() throws IOException { for (int count = 0; count <= lv; count++) { featuresCombined.append(features[count]); } -// -// // parsing duke.txt -// DukeParser dp = new DukeParser(dukeFilePath); -// taskArrayList = dp.copyFileContents(); // Welcome message String welcome = "Hello! I'm Duke: Level " + lv + "\n" From c72dbd81546834b8ef83be17567288faa2b77228 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 1 Sep 2021 01:18:46 +0800 Subject: [PATCH 49/73] Level-9: Add find function for Duke --- src/main/java/cs2103/duke/Deadline.java | 7 ++-- src/main/java/cs2103/duke/DukeParser.java | 6 ++-- src/main/java/cs2103/duke/Event.java | 7 ++-- src/main/java/cs2103/duke/Task.java | 11 ++++-- src/main/java/cs2103/duke/TaskList.java | 44 ++++++++++++++++++----- src/main/java/cs2103/duke/ToDo.java | 8 +++-- src/main/java/cs2103/duke/Ui.java | 13 ++++--- src/test/java/TaskListTest.java | 12 +++++++ 8 files changed, 83 insertions(+), 25 deletions(-) diff --git a/src/main/java/cs2103/duke/Deadline.java b/src/main/java/cs2103/duke/Deadline.java index 0d43d481c9..52eaa8b93a 100644 --- a/src/main/java/cs2103/duke/Deadline.java +++ b/src/main/java/cs2103/duke/Deadline.java @@ -4,12 +4,13 @@ import java.time.format.DateTimeFormatter; public class Deadline extends Task { - + protected int index; protected String by; protected LocalDate date; - public Deadline(String description, String by) { - super(description); + public Deadline(int index, String description, String by) { + super(index, description); + this.index = index; this.by = by; this.date = LocalDate.parse(by); } diff --git a/src/main/java/cs2103/duke/DukeParser.java b/src/main/java/cs2103/duke/DukeParser.java index 5a810a5706..fe29e0da13 100644 --- a/src/main/java/cs2103/duke/DukeParser.java +++ b/src/main/java/cs2103/duke/DukeParser.java @@ -51,7 +51,7 @@ public static ArrayList parse(String toParse) { switch (taskType) { case 'T': String todoName = nLine.substring(ref + 5, strLength); - Task newestTodo = new ToDo(todoName); + Task newestTodo = new ToDo(result.size(), todoName); if (isDone) { newestTodo.markAsDone(); } @@ -63,7 +63,7 @@ public static ArrayList parse(String toParse) { String deadlineName = arrD[0]; String deadlineReminder = arrD[1].substring(0, arrD[1].length() - 1); deadlineReminder = parseDate(deadlineReminder); - Task newestDeadline = new Deadline(deadlineName, deadlineReminder); + Task newestDeadline = new Deadline(result.size(), deadlineName, deadlineReminder); result.add(newestDeadline); if (isDone) { newestDeadline.markAsDone(); @@ -75,7 +75,7 @@ public static ArrayList parse(String toParse) { String eventName = arrE[0]; String eventReminder = arrE[1].substring(0, arrE[1].length() - 1); eventReminder = parseDate(eventReminder); - Task newestEvent = new Event(eventName, eventReminder); + Task newestEvent = new Event(result.size(), eventName, eventReminder); result.add(newestEvent); if (isDone) { newestEvent.markAsDone(); diff --git a/src/main/java/cs2103/duke/Event.java b/src/main/java/cs2103/duke/Event.java index 73285e51b3..45eedc5c33 100644 --- a/src/main/java/cs2103/duke/Event.java +++ b/src/main/java/cs2103/duke/Event.java @@ -4,12 +4,13 @@ import java.time.format.DateTimeFormatter; public class Event extends Task { - + protected int index; protected String at; protected LocalDate date; - public Event(String description, String at) { - super(description); + public Event(int index, String description, String at) { + super(index, description); + this.index = index; this.at = at; this.date = LocalDate.parse(at); } diff --git a/src/main/java/cs2103/duke/Task.java b/src/main/java/cs2103/duke/Task.java index 0d4f4fdeb0..e521018a8b 100644 --- a/src/main/java/cs2103/duke/Task.java +++ b/src/main/java/cs2103/duke/Task.java @@ -5,6 +5,7 @@ */ public class Task { + protected int index; protected String description; protected boolean isDone; protected String taskType; @@ -12,14 +13,20 @@ public class Task { /** * Creates a task with the specified description, isDone false by default. - * @param description description of task * + * @param index Index of the task, starting from 0. + * @param description description of task */ - public Task(String description) { + public Task(int index, String description) { + this.index = index; this.description = description; this.isDone = false; } + public int getIndex() { + return index; + } + /** * Getter method for status using isDone * diff --git a/src/main/java/cs2103/duke/TaskList.java b/src/main/java/cs2103/duke/TaskList.java index f9a4e653f8..da55ba6d1a 100644 --- a/src/main/java/cs2103/duke/TaskList.java +++ b/src/main/java/cs2103/duke/TaskList.java @@ -34,7 +34,7 @@ public static String sandwich(String str) { public String listBeautify() { StringBuilder listBeautified = new StringBuilder(); for (int i = 0; i < taskArrayList.size(); i++) { - listBeautified.append(i + 1) + listBeautified.append(taskArrayList.get(i).getIndex() + 1) .append(".") .append(taskArrayList.get(i).toString()); if (i < taskArrayList.size() - 1) { // new line except for last item @@ -111,8 +111,8 @@ public boolean isValidDate(String input) { /** * Adds a task into the task list. * - * @param type the type of task to be added - * @param name the name of task to be added + * @param type the type of task to be added + * @param name the name of task to be added * @param description the description of the task * @return string representing the newly added task * @throws DukeException @@ -123,7 +123,7 @@ public String addTask(String type, String name, String description) throws DukeE if (name.trim().equals("")) { throw new DukeException("No task name"); } - Task newestTodo = new ToDo(name); + Task newestTodo = new ToDo(taskArrayList.size(), name); taskArrayList.add(newestTodo); return (sandwich("New todo task added:\n" + newestTodo @@ -134,7 +134,7 @@ public String addTask(String type, String name, String description) throws DukeE if (!isValidDate(description)) { throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); } - Task newestDeadline = new Deadline(name, description); + Task newestDeadline = new Deadline(taskArrayList.size(), name, description); taskArrayList.add(newestDeadline); return (sandwich("New deadline task added:\n" + newestDeadline @@ -145,7 +145,7 @@ public String addTask(String type, String name, String description) throws DukeE if (!isValidDate(description)) { throw new DukeException("Invalid Date, please follow the format YYYY-MM-DD"); } - Task newestEvent = new Event(name, description); + Task newestEvent = new Event(taskArrayList.size(), name, description); taskArrayList.add(newestEvent); return (sandwich("New deadline task added:\n" + newestEvent @@ -166,7 +166,7 @@ public String finishTask(int index) throws DukeException { throw new DukeException("This task index is not in the task list!"); } taskArrayList.get(index - 1).markAsDone(); - return (sandwich("Congratulations! You have finished this task: " + return (sandwich("Congratulations! You have finished this task:\n" + taskArrayList.get(index - 1).toString())); } @@ -174,7 +174,7 @@ public String deleteTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); } - String deleteMessage = (sandwich("Got it, I have deleted this task: " + String deleteMessage = (sandwich("Got it, I have deleted this task:\n" + taskArrayList.get(index - 1).toString() + "\nYou now have " + (taskArrayList.size() - 1) @@ -183,4 +183,32 @@ public String deleteTask(int index) throws DukeException { taskArrayList.remove(index - 1); return deleteMessage; } + + /** + * This method finds all tasks matching a keyword entered by the user. + * + * @param keyword The keyword to match tasks to. + * @return All tasks matching the keyword. + * @throws DukeException If keyword is invalid. + */ + public String findTasks(String keyword) throws DukeException { + // if 'keyword' contains more than one word or any spaces + if (keyword.trim().split("\\s+").length > 1) { + throw new DukeException("Invalid keyword, please enter only one keyword without blanks"); + } else { + ArrayList subList = new ArrayList<>(); + for (Task task : taskArrayList) { // for each task in the taskArrayList + if (task.description.contains(keyword)) { // add task to subList if contains keyword + subList.add(task); + } + } + if (subList.isEmpty()) { + return ("No matches found for keyword: " + keyword.trim()); + } + TaskList matchedTaskList = new TaskList(subList); + return sandwich("Here are the matching tasks in your list:\n" + + matchedTaskList.listBeautify() + ); + } + } } diff --git a/src/main/java/cs2103/duke/ToDo.java b/src/main/java/cs2103/duke/ToDo.java index 1c03d0f61b..de3f5cca6e 100644 --- a/src/main/java/cs2103/duke/ToDo.java +++ b/src/main/java/cs2103/duke/ToDo.java @@ -1,9 +1,13 @@ package cs2103.duke; public class ToDo extends Task { + protected int index; + protected String description; - public ToDo(String description) { - super(description); + public ToDo(int index, String description) { + super(index, description); + this.index = index; + this.description = description; } @Override diff --git a/src/main/java/cs2103/duke/Ui.java b/src/main/java/cs2103/duke/Ui.java index 735adbb6e5..fafc512913 100644 --- a/src/main/java/cs2103/duke/Ui.java +++ b/src/main/java/cs2103/duke/Ui.java @@ -5,17 +5,18 @@ import java.util.Scanner; public class Ui { - private static final int lv = 8; + private static final int lv = 9; private static final String[] features = { "", "Greet, Echo, Exit", - ", Add, List", + ", Add, List\n", ", Mark as Done", ", ToDos, Events, Deadlines", - ", Handle Errors", + ", Handle Errors\n", ", Delete", ", Save", - ", Dates and Times" + ", Dates and Times", + ", Find\n" }; private static TaskList taskArrayList; @@ -117,6 +118,10 @@ public String handleInput(Scanner scanner, String userInput, TaskList tasks) thr String eventName = eventTokens[0]; String eventReminder = eventTokens[1]; return tasks.addTask("event", eventName, eventReminder); + case "find": + if (scanner.hasNext()) { + return tasks.findTasks(scanner.nextLine()); + } else throw new DukeException("unspecified keyword to search for"); default: throw new DukeException("Unknown Input"); // unknown input } diff --git a/src/test/java/TaskListTest.java b/src/test/java/TaskListTest.java index d50d1f639b..8ad5506249 100644 --- a/src/test/java/TaskListTest.java +++ b/src/test/java/TaskListTest.java @@ -33,4 +33,16 @@ public void testAddDeadline() throws DukeException { + "____________________________________________________________", tl.addTask("deadline", "ms3", "2021-07-20")); } + + @Test + public void testFindTask() throws DukeException { + TaskList tl = new TaskList(); + tl.addTask("todo", "test1", ""); + tl.addTask("deadline", "ms3", "2021-07-20"); + assertEquals("____________________________________________________________\n" + + "Here are the matching tasks in your list:\n" + + "1.[T][ ]test1\n" + + "____________________________________________________________", + tl.findTasks("test")); + } } From d6af729817e0d53572d77a0f4fed33837591a93d Mon Sep 17 00:00:00 2001 From: "Wang Guanlin (Joseph)" <77196048+WangGLJoseph@users.noreply.github.com> Date: Wed, 1 Sep 2021 23:05:33 +0800 Subject: [PATCH 50/73] Update README.md --- README.md | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 8715d4d915..7dcf596812 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,26 @@ -# Duke project template +# Duke v0.9.0 +> *"Be not afraid of growing slowly, be afraid of standing still."* - Chinese proverb -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. +Duke offers you a: +- Hassle free +- Text based +- Minimalist +and completely **offline** experience of planning your tasks! -## Setting up in Intellij +## Setting up Duke +1. Download it [here](https://github.com/WangGLJoseph/ip/releases/download/A-Jar/ip.jar) +2. Double-click to run it +3. Add your tasks +4. Enjoy **mastery** over your tasks 😜 -Prerequisites: JDK 11, update Intellij to the most recent version. - -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 1. If there are any further prompts, accept the defaults. -1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
- In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: +A snippet of the workings of controlling your tasks. Behold, you've got the power! ``` - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| + public String finishTask(int index) throws DukeException { + if (index > taskArrayList.size()) { + throw new DukeException("This task index is not in the task list!"); + } + taskArrayList.get(index - 1).markAsDone(); + return (sandwich("Congratulations! You have finished this task: " + + taskArrayList.get(index - 1).toString())); + } ``` From 613f9ce330e7eb073fc8c864ece1217a611b4f64 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Thu, 2 Sep 2021 22:15:31 +0800 Subject: [PATCH 51/73] Add DukeLauncher as part of JavaFX basics --- build.gradle | 14 +++++++++++++ src/main/java/cs2103/duke/Duke.java | 23 ++++++++++++++++++--- src/main/java/cs2103/duke/DukeLauncher.java | 12 +++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cs2103/duke/DukeLauncher.java diff --git a/build.gradle b/build.gradle index 20c0521cc7..1ce991c762 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,20 @@ repositories { } dependencies { + String javaFxVersion = '11' + + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' } diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index 2c74c60a31..622a476261 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -2,16 +2,24 @@ import java.util.Scanner; import java.io.IOException; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.stage.Stage; /** * This class encapsulates a Duke chat-bot. */ -public class Duke { - private final String dukeFilePath; - private final Storage storage; +public class Duke extends Application { + private String dukeFilePath; + private Storage storage; private TaskList tasks; private Ui ui; + public Duke() { + + } + public Duke(String dukeFilePath) { this.dukeFilePath = dukeFilePath; storage = new Storage(dukeFilePath); @@ -24,6 +32,15 @@ public Duke(String dukeFilePath) { ui = new Ui(tasks); } + @Override + public void start(Stage stage) { + Label helloWorld = new Label("Hello World!"); // Creating a new Label control + Scene scene = new Scene(helloWorld); // Setting the scene to be our Label + + stage.setScene(scene); // Setting the stage to show our screen + stage.show(); // Render the stage. + } + public void run() { System.out.println(ui.showWelcome()); boolean canExit = false; diff --git a/src/main/java/cs2103/duke/DukeLauncher.java b/src/main/java/cs2103/duke/DukeLauncher.java new file mode 100644 index 0000000000..fca8322601 --- /dev/null +++ b/src/main/java/cs2103/duke/DukeLauncher.java @@ -0,0 +1,12 @@ +package cs2103.duke; + +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class DukeLauncher { + public static void main(String[] args) { + Application.launch(Duke.class, args); + } +} From 60e607ad441ed0dfdc07e61d3deab8fbe2bda488 Mon Sep 17 00:00:00 2001 From: "Wang Guanlin (Joseph)" <77196048+WangGLJoseph@users.noreply.github.com> Date: Tue, 7 Sep 2021 00:28:30 +0800 Subject: [PATCH 52/73] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7dcf596812..1d787288e3 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,16 @@ Duke offers you a: - Minimalist and completely **offline** experience of planning your tasks! +## Duke's features +- [x] Adding and saving tasks +- [ ] GUI (coming soon!) +- [ ] Mystery features 😜 + ## Setting up Duke 1. Download it [here](https://github.com/WangGLJoseph/ip/releases/download/A-Jar/ip.jar) 2. Double-click to run it 3. Add your tasks -4. Enjoy **mastery** over your tasks 😜 +4. Enjoy **mastery** over your tasks 😆 A snippet of the workings of controlling your tasks. Behold, you've got the power! ``` From 379ba30feba2b8e7146c46c1a5e9a034479619c2 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 8 Sep 2021 20:57:23 +0800 Subject: [PATCH 53/73] Extract GUI logic out of Duke and into Main --- src/main/java/cs2103/duke/Duke.java | 16 +-- src/main/java/cs2103/duke/DukeLauncher.java | 2 +- src/main/java/cs2103/duke/Main.java | 105 ++++++++++++++++++++ 3 files changed, 108 insertions(+), 15 deletions(-) create mode 100644 src/main/java/cs2103/duke/Main.java diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index 622a476261..c4a55b2589 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -2,15 +2,12 @@ import java.util.Scanner; import java.io.IOException; -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.stage.Stage; /** * This class encapsulates a Duke chat-bot. */ -public class Duke extends Application { +public class Duke { + private String dukeFilePath; private Storage storage; private TaskList tasks; @@ -32,15 +29,6 @@ public Duke(String dukeFilePath) { ui = new Ui(tasks); } - @Override - public void start(Stage stage) { - Label helloWorld = new Label("Hello World!"); // Creating a new Label control - Scene scene = new Scene(helloWorld); // Setting the scene to be our Label - - stage.setScene(scene); // Setting the stage to show our screen - stage.show(); // Render the stage. - } - public void run() { System.out.println(ui.showWelcome()); boolean canExit = false; diff --git a/src/main/java/cs2103/duke/DukeLauncher.java b/src/main/java/cs2103/duke/DukeLauncher.java index fca8322601..a4b1e90965 100644 --- a/src/main/java/cs2103/duke/DukeLauncher.java +++ b/src/main/java/cs2103/duke/DukeLauncher.java @@ -7,6 +7,6 @@ */ public class DukeLauncher { public static void main(String[] args) { - Application.launch(Duke.class, args); + Application.launch(Main.class, args); } } diff --git a/src/main/java/cs2103/duke/Main.java b/src/main/java/cs2103/duke/Main.java new file mode 100644 index 0000000000..ce537e1c5e --- /dev/null +++ b/src/main/java/cs2103/duke/Main.java @@ -0,0 +1,105 @@ +package cs2103.duke; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class Main extends Application { + + private ScrollPane scrollPane; + private VBox dialogContainer; + private TextField userInput; + private Button enterButton; + private Scene scene; + + public Main() { + + } + + @Override + public void start(Stage stage) { + + // The container for the content of the chat to scroll. + scrollPane = new ScrollPane(); + dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + // The sections for user interaction. + userInput = new TextField(); + enterButton = new Button("Enter"); + + AnchorPane mainLayout = new AnchorPane(); + mainLayout.getChildren().addAll(scrollPane, userInput, enterButton); + + // Set and render the stage. + scene = new Scene(mainLayout); + stage.setScene(scene); + stage.show(); + + // Format the window to look as expected + stage.setTitle("Duke"); + stage.setResizable(false); + stage.setMinHeight(800.0); + stage.setMinWidth(600.0); + + mainLayout.setPrefSize(600.0, 800.0); + + scrollPane.setPrefSize(565, 755); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(530.0); + + enterButton.setPrefWidth(70.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(enterButton, 1.0); + AnchorPane.setRightAnchor(enterButton, 1.0); + + AnchorPane.setLeftAnchor(userInput, 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + // Handle mouse click on enter button + enterButton.setOnMouseClicked((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + + // Handle pressing enter key in the text field + userInput.setOnAction((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + } + + /** + * Iteration 1: + * Creates a label with the specified text and adds it to the dialog container. + * + * @param text String containing text to add + * @return a label with the specified text that has word wrap enabled. + */ + private Label getDialogLabel(String text) { + Label textToAdd = new Label(text); + textToAdd.setWrapText(true); + + return textToAdd; + } + + public static void main(String[] args) { + + } +} From 1ac4e8faf3c9d96289a3f4038e827b16d6c96845 Mon Sep 17 00:00:00 2001 From: "Wang Guanlin (Joseph)" <77196048+WangGLJoseph@users.noreply.github.com> Date: Wed, 8 Sep 2021 22:07:24 +0800 Subject: [PATCH 54/73] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d787288e3..5d916655ae 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ and completely **offline** experience of planning your tasks! 4. Enjoy **mastery** over your tasks 😆 A snippet of the workings of controlling your tasks. Behold, you've got the power! - ``` + ```java public String finishTask(int index) throws DukeException { if (index > taskArrayList.size()) { throw new DukeException("This task index is not in the task list!"); From 40f61c651f1cf89614bb8ca986dcf3e6b665dcd8 Mon Sep 17 00:00:00 2001 From: WangGLJoseph Date: Wed, 8 Sep 2021 22:49:21 +0800 Subject: [PATCH 55/73] Create new package for controllers --- src/main/java/cs2103/duke/Duke.java | 109 ++++++++++++++++- src/main/java/cs2103/duke/DukeLauncher.java | 2 +- src/main/java/cs2103/duke/Main.java | 111 +++--------------- .../cs2103/duke/controllers/DialogBox.java | 47 ++++++++ .../cs2103/duke/controllers/MainWindow.java | 56 +++++++++ src/main/resources/images/TheDuke.png | Bin 0 -> 89180 bytes src/main/resources/images/TheUser.png | Bin 0 -> 236999 bytes src/main/resources/view/DialogBox.fxml | 16 +++ src/main/resources/view/MainWindow.fxml | 19 +++ 9 files changed, 266 insertions(+), 94 deletions(-) create mode 100644 src/main/java/cs2103/duke/controllers/DialogBox.java create mode 100644 src/main/java/cs2103/duke/controllers/MainWindow.java create mode 100644 src/main/resources/images/TheDuke.png create mode 100644 src/main/resources/images/TheUser.png create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/src/main/java/cs2103/duke/Duke.java b/src/main/java/cs2103/duke/Duke.java index c4a55b2589..cc79d0ca87 100644 --- a/src/main/java/cs2103/duke/Duke.java +++ b/src/main/java/cs2103/duke/Duke.java @@ -1,17 +1,38 @@ package cs2103.duke; +import cs2103.duke.controllers.DialogBox; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + import java.util.Scanner; import java.io.IOException; /** * This class encapsulates a Duke chat-bot. */ -public class Duke { +public class Duke extends Application { private String dukeFilePath; private Storage storage; private TaskList tasks; private Ui ui; + private ScrollPane scrollPane; + private VBox dialogContainer; + private TextField userInput; + private Button enterButton; + private Scene scene; + private Image user = new Image(this.getClass().getResourceAsStream("/images/TheUser.png")); + private Image duke = new Image(this.getClass().getResourceAsStream("/images/TheDuke.png")); public Duke() { @@ -29,6 +50,92 @@ public Duke(String dukeFilePath) { ui = new Ui(tasks); } + @Override + public void start(Stage stage) { + + // The container for the content of the chat to scroll. + scrollPane = new ScrollPane(); + dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + // The sections for user interaction. + userInput = new TextField(); + enterButton = new Button("Enter"); + + AnchorPane mainLayout = new AnchorPane(); + mainLayout.getChildren().addAll(scrollPane, userInput, enterButton); + + // Set and render the stage. + scene = new Scene(mainLayout); + stage.setScene(scene); + stage.show(); + + // Format the window to look as expected + stage.setTitle("Duke"); + stage.setResizable(false); + stage.setMinHeight(800.0); + stage.setMinWidth(600.0); + + mainLayout.setPrefSize(600.0, 800.0); + + scrollPane.setPrefSize(565, 755); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(530.0); + + enterButton.setPrefWidth(70.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(enterButton, 1.0); + AnchorPane.setRightAnchor(enterButton, 1.0); + + AnchorPane.setLeftAnchor(userInput, 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + // Handle mouse click on enter button + enterButton.setOnMouseClicked((event) -> { + handleUserInput(); + }); + + // Handle pressing enter key in the text field + userInput.setOnAction((event) -> { + handleUserInput(); + }); + } + + /** + * Iteration 3: + * 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. Duke's image is placed on the left to + * differentiate between user input and Duke’s output. + */ + private void handleUserInput() { + Label userText = new Label(userInput.getText()); + Label dukeText = new Label(getResponse(userInput.getText())); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(userText, new ImageView(user)), + DialogBox.getDukeDialog(dukeText, new ImageView(duke)) + ); + userInput.clear(); + } + + /** + * Generate a response given an input from user. + * + * @param input The user input received. + * @return A string representing the response to the user. + */ + public String getResponse(String input) { + return "I sense greatness in you, user: \n" + input; + } + public void run() { System.out.println(ui.showWelcome()); boolean canExit = false; diff --git a/src/main/java/cs2103/duke/DukeLauncher.java b/src/main/java/cs2103/duke/DukeLauncher.java index a4b1e90965..fca8322601 100644 --- a/src/main/java/cs2103/duke/DukeLauncher.java +++ b/src/main/java/cs2103/duke/DukeLauncher.java @@ -7,6 +7,6 @@ */ public class DukeLauncher { public static void main(String[] args) { - Application.launch(Main.class, args); + Application.launch(Duke.class, args); } } diff --git a/src/main/java/cs2103/duke/Main.java b/src/main/java/cs2103/duke/Main.java index ce537e1c5e..b6c79c97d2 100644 --- a/src/main/java/cs2103/duke/Main.java +++ b/src/main/java/cs2103/duke/Main.java @@ -1,105 +1,32 @@ package cs2103.duke; +import java.io.IOException; import javafx.application.Application; +import javafx.fxml.FXMLLoader; import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; import javafx.stage.Stage; -public class Main extends Application { - - private ScrollPane scrollPane; - private VBox dialogContainer; - private TextField userInput; - private Button enterButton; - private Scene scene; +import cs2103.duke.controllers.MainWindow; - public Main() { +/** + * A GUI for Duke using FXML. + */ +public class Main extends Application { - } + private Duke duke = new Duke(); @Override public void start(Stage stage) { - - // The container for the content of the chat to scroll. - scrollPane = new ScrollPane(); - dialogContainer = new VBox(); - scrollPane.setContent(dialogContainer); - - // The sections for user interaction. - userInput = new TextField(); - enterButton = new Button("Enter"); - - AnchorPane mainLayout = new AnchorPane(); - mainLayout.getChildren().addAll(scrollPane, userInput, enterButton); - - // Set and render the stage. - scene = new Scene(mainLayout); - stage.setScene(scene); - stage.show(); - - // Format the window to look as expected - stage.setTitle("Duke"); - stage.setResizable(false); - stage.setMinHeight(800.0); - stage.setMinWidth(600.0); - - mainLayout.setPrefSize(600.0, 800.0); - - scrollPane.setPrefSize(565, 755); - scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); - - scrollPane.setVvalue(1.0); - scrollPane.setFitToWidth(true); - - dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); - - userInput.setPrefWidth(530.0); - - enterButton.setPrefWidth(70.0); - - AnchorPane.setTopAnchor(scrollPane, 1.0); - - AnchorPane.setBottomAnchor(enterButton, 1.0); - AnchorPane.setRightAnchor(enterButton, 1.0); - - AnchorPane.setLeftAnchor(userInput, 1.0); - AnchorPane.setBottomAnchor(userInput, 1.0); - - // Handle mouse click on enter button - enterButton.setOnMouseClicked((event) -> { - dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); - userInput.clear(); - }); - - // Handle pressing enter key in the text field - userInput.setOnAction((event) -> { - dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); - userInput.clear(); - }); - } - - /** - * Iteration 1: - * Creates a label with the specified text and adds it to the dialog container. - * - * @param text String containing text to add - * @return a label with the specified text that has word wrap enabled. - */ - private Label getDialogLabel(String text) { - Label textToAdd = new Label(text); - textToAdd.setWrapText(true); - - return textToAdd; - } - - public static void main(String[] args) { - + try { + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + fxmlLoader.getController().setDuke(duke); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } } -} +} \ No newline at end of file diff --git a/src/main/java/cs2103/duke/controllers/DialogBox.java b/src/main/java/cs2103/duke/controllers/DialogBox.java new file mode 100644 index 0000000000..241e751a6a --- /dev/null +++ b/src/main/java/cs2103/duke/controllers/DialogBox.java @@ -0,0 +1,47 @@ +package cs2103.duke.controllers; + +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.HBox; + +public class DialogBox extends HBox { + + private Label text; + private ImageView displayPicture; + + public DialogBox(Label l, ImageView iv) { + text = l; + displayPicture = iv; + + text.setWrapText(true); + displayPicture.setFitWidth(100.0); + displayPicture.setFitHeight(100.0); + + this.setAlignment(Pos.TOP_RIGHT); + this.getChildren().addAll(text, displayPicture); + } + + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + this.setAlignment(Pos.TOP_LEFT); + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + FXCollections.reverse(tmp); + this.getChildren().setAll(tmp); + } + + public static DialogBox getUserDialog(Label l, ImageView iv) { + return new DialogBox(l, iv); + } + + public static DialogBox getDukeDialog(Label l, ImageView iv) { + var db = new DialogBox(l, iv); + db.flip(); + return db; + } +} diff --git a/src/main/java/cs2103/duke/controllers/MainWindow.java b/src/main/java/cs2103/duke/controllers/MainWindow.java new file mode 100644 index 0000000000..a695879b93 --- /dev/null +++ b/src/main/java/cs2103/duke/controllers/MainWindow.java @@ -0,0 +1,56 @@ +package cs2103.duke.controllers; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +import cs2103.duke.Duke; + +/** + * Controller for cs2103.duke.controllers.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/TheUser.png")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/TheDuke.png")); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + } + + public void setDuke(Duke d) { + duke = d; + } + + /** + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. Duke's image is placed on the left to + * differentiate between user input and Duke’s output. + */ + @FXML + private void handleUserInput() { + Label userText = new Label(userInput.getText()); + Label dukeText = new Label(duke.getResponse(userInput.getText())); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(userText, new ImageView(userImage)), + DialogBox.getDukeDialog(dukeText, new ImageView(dukeImage)) + ); + userInput.clear(); + } +} \ No newline at end of file diff --git a/src/main/resources/images/TheDuke.png b/src/main/resources/images/TheDuke.png new file mode 100644 index 0000000000000000000000000000000000000000..c61e87fb6f1d453b1fe4f657279e9b8a686073be GIT binary patch literal 89180 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
o0+y0<` zA^k;K1LQwZQSDOb9M>~j`EgOp-|8xEnM0XsL;Y&pOvv*}{SV_)$cjk@38YTnN@~a$ z1gR$+55lU+k~0+4{*^L{L$Y8gsnF9wVchz0Op2U=3Pmd#5<|GpDwdmq7U0I5M-`ij z3lTUxA3{IR=~9uvrlNwxa!1WRj!>}GIR5}WdU5&C)RvnMU^3*B>-u|ARNR(1jW)JK z*k(V^`86YUq*7y7JwMO#rjE4*Sb6k6%9gK`EQaL!=kxt3k5j4>M9AZ|O*Bz z`Ri8c!>}rnT~DmO9mjP%EhU>Pz~r=+a+Wb~Z&Ibig>T4w_)B8r6OQG}Ie$5w;&AUNx zKk1#+2lbLvAAmi3SJQFpqE;;}ww)^iM)@>tCP(8q%e|8^{7IwR)R$29P<=nI#Q5$H zgfsd6LD}bj&o%w)gXmTw`TC5E=D$F+zYxeGxY$-8sgRJx6|`9j2;CG39Bw_G7<3(l zTCG!N(JqZO-1!Sf_z3VRlKOVDiB!9$#WT!*f+&$(l;4B%%%HFLd9N?=x5OK(xtr}1 zG=W{huGEe-!yIjnB}l>d3!2_4Qr^Zc%V3gNT4pGGrQAX*I1RTYfOZPGB%eW?o|Vq( zaR3GfQZwH_oowUW#jEai<`vub@ZD!0Fbx-9-TkPxpxaN2gA;p0d!S>~wM3BC9guROcZ5_{jhx z0y>h!@s199_QKHa2>V6}AGyyQau{IOWGT2U$Z{`@O$>bf;m&c-{{UF@`d2#cc&U;n znBKAR6P>7kcmpdTJTjd94o{(~+7o_b-!|gS zk}>lhdJJQphqgT`rQ%?I3_1Ca%Zzezc+G9OMf+`YjC>?SlH>rHOoS|jF9QNh2Z4mdSj zz>% literal 0 HcmV?d00001 diff --git a/src/main/resources/images/TheUser.png b/src/main/resources/images/TheUser.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a080f2b4bd534e44d4042655ed03497a74334b GIT binary patch literal 236999 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 z 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 + + + + + + + + + + + + + \ 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..bd369e2a80 --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +