From 68c58c12c1d631736a4b25500248a2956171496f Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/43] Add Gradle support --- build.gradle | 41 +++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 332 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..885198fcfa --- /dev/null +++ b/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'java' + id 'application' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From 03523ec89e823ff5457b647df22a4e395641da7a Mon Sep 17 00:00:00 2001 From: lzq Date: Sat, 5 Aug 2023 15:24:02 +0800 Subject: [PATCH 02/43] Bump gradle and lib version --- build.gradle | 9 +- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 281 ++++++++++++++--------- gradlew.bat | 195 ++++++++-------- 5 files changed, 273 insertions(+), 216 deletions(-) diff --git a/build.gradle b/build.gradle index 885198fcfa..a388517ae1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' } repositories { @@ -9,8 +9,8 @@ repositories { } 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' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' } test { @@ -28,12 +28,13 @@ test { } application { - mainClassName = "seedu.duke.Duke" + mainClass.set("seedu.duke.Duke") } shadowJar { archiveBaseName = "duke" archiveClassifier = null + dependsOn("distZip", "distTar") } run{ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 43723 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 delta 38942 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b7c8c5dbf5..66c01cfeba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d95..fcb6fca147 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,110 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # 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 +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac 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"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # 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 - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,87 +129,120 @@ 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. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + 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 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 +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac 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 +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # 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 +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # 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\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg 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" +# 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"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9cce..6689b85bee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,103 +1,92 @@ -@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 +@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=. +@rem This is normally unused +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% equ 0 goto execute + +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 execute + +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 + +: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 %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 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! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 81a9c537afe8492675eb253968939364d65db091 Mon Sep 17 00:00:00 2001 From: aureliony <39163684+aureliony@users.noreply.github.com> Date: Tue, 16 Jul 2024 23:35:06 +0800 Subject: [PATCH 03/43] build.gradle: Prevent generating a second JAR file In build.gradle, the dependencies on distZip and/or distTar causes the shadowJar task to generate a second JAR file for which the mainClass.set("seedu.duke.Duke") does not take effect. Hence, this additional JAR file cannot be run. For this product, there is no need to generate a second JAR file to begin with. Let's remove this dependency from the build.gradle to prevent the shadowJar task from generating the extra JAR file. --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index a388517ae1..c361f9811e 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,6 @@ application { shadowJar { archiveBaseName = "duke" archiveClassifier = null - dependsOn("distZip", "distTar") } run{ From e16b98a04970618b0176a61f850e70a00b2e7156 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 23 Jan 2025 16:55:02 +0800 Subject: [PATCH 04/43] hewwo kitty has been bown uwu --- src/main/java/Duke.java | 10 ---------- src/main/java/HewwoKitty.java | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/Duke.java create mode 100644 src/main/java/HewwoKitty.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334cc..0000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java new file mode 100644 index 0000000000..6c59e836e2 --- /dev/null +++ b/src/main/java/HewwoKitty.java @@ -0,0 +1,18 @@ +public class HewwoKitty { + public static void main(String[] args) { + String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + + "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + + "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + + "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + + "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" + + "⠀⠀⠈⣷⣀⡀⠀⠘⠿⠇⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠿⠟⠀⠀⠀⠲⣾⠦⢤⠀\n" + + "⠀⠀⠋⠙⣧⣀⡀⠀⠀⠀⠀⠀⠀⠘⠦⠼⠃⠀⠀⠀⠀⠀⠀⠀⢤⣼⣏⠀⠀⠀\n" + + "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + + "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; + System.out.println(logo); + System.out.println("Hewwo! I'm Hewwo Kitty!"); + System.out.println("I'm just a chatbot uwuwuuwuwuwuwuwuw"); + } +} From f2a3189d457048c2bc7c1aed84c5f4ce7923f170 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 23 Jan 2025 17:35:09 +0800 Subject: [PATCH 05/43] wevew one compweted! weehee --- src/main/java/HewwoKitty.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 6c59e836e2..536bda636e 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -1,3 +1,5 @@ +import java.util.Scanner; + public class HewwoKitty { public static void main(String[] args) { String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + @@ -12,7 +14,20 @@ public static void main(String[] args) { "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; System.out.println(logo); - System.out.println("Hewwo! I'm Hewwo Kitty!"); - System.out.println("I'm just a chatbot uwuwuuwuwuwuwuwuw"); + System.out.println("hewwo! i'm hewwo kitty!"); + System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); + + boolean run = true; + while (run) { + Scanner userInput = new Scanner(System.in); + String userString = userInput.nextLine(); + String exitString = "bye"; + if (userString.equals(exitString)) { + run = false; + System.out.println("goodbwye! uwu"); + } else { + System.out.println(userString); + } + } } } From 3df24425f8ebc5d25f94738bf0a863b66b890825 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 23 Jan 2025 21:45:20 +0800 Subject: [PATCH 06/43] uwu wist has been upwoaded --- src/main/java/HewwoKitty.java | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 536bda636e..51e4be25cf 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -1,3 +1,4 @@ +import java.util.ArrayList; import java.util.Scanner; public class HewwoKitty { @@ -14,20 +15,36 @@ public static void main(String[] args) { "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; System.out.println(logo); + System.out.println("*************************************************"); System.out.println("hewwo! i'm hewwo kitty!"); System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); + System.out.println("*************************************************"); boolean run = true; + ArrayList items = new ArrayList<>(); while (run) { Scanner userInput = new Scanner(System.in); String userString = userInput.nextLine(); - String exitString = "bye"; - if (userString.equals(exitString)) { + if (userString.equals("bye")) { run = false; + System.out.println("*************************************************"); System.out.println("goodbwye! uwu"); + System.out.println("*************************************************"); } else { - System.out.println(userString); + if (userString.equals("list")) { + System.out.println("*************************************************"); + for (int i = 1; i < items.size() + 1; i++) { + System.out.println(i + ". " + items.get(i-1) + "\n"); + } + System.out.println("*************************************************"); + } else { + System.out.println("*************************************************"); + System.out.println("added: " + userString); + System.out.println("*************************************************"); + items.add(userString); + } } + } } } From 64b3076c02180169c17ca022e100e6f44eeae748 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Mon, 3 Feb 2025 17:09:13 +0800 Subject: [PATCH 07/43] Add feature to mark and unmark tasks as done --- src/main/java/HewwoKitty.java | 56 +++++++++++++++++++---------------- src/main/java/Task.java | 37 +++++++++++++++++++++++ src/main/java/TaskList.java | 34 +++++++++++++++++++++ 3 files changed, 101 insertions(+), 26 deletions(-) create mode 100644 src/main/java/Task.java create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 51e4be25cf..7c8d961d0e 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -3,6 +3,35 @@ public class HewwoKitty { public static void main(String[] args) { + printStart(); + + boolean run = true; + TaskList taskList = new TaskList(); + while (run) { + Scanner userInput = new Scanner(System.in); + String userString = userInput.nextLine(); + if (userString.equals("bye")) { + run = false; + System.out.println("*************************************************"); + System.out.println("goodbwye! uwu"); + System.out.println("*************************************************"); + } else { + if (userString.equals("list")) { + System.out.print(taskList); + } else if (userString.split(" ")[0].equals("mark")){ + int taskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.markDone(taskNum); + } else if (userString.split(" ")[0].equals("unmark")) { + int taskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.unmarkDone(taskNum); + } else { + taskList.addTask(userString); + } + } + } + } + + public static void printStart() { String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + @@ -19,32 +48,7 @@ public static void main(String[] args) { System.out.println("hewwo! i'm hewwo kitty!"); System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); System.out.println("*************************************************"); + } - boolean run = true; - ArrayList items = new ArrayList<>(); - while (run) { - Scanner userInput = new Scanner(System.in); - String userString = userInput.nextLine(); - if (userString.equals("bye")) { - run = false; - System.out.println("*************************************************"); - System.out.println("goodbwye! uwu"); - System.out.println("*************************************************"); - } else { - if (userString.equals("list")) { - System.out.println("*************************************************"); - for (int i = 1; i < items.size() + 1; i++) { - System.out.println(i + ". " + items.get(i-1) + "\n"); - } - System.out.println("*************************************************"); - } else { - System.out.println("*************************************************"); - System.out.println("added: " + userString); - System.out.println("*************************************************"); - items.add(userString); - } - } - } - } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..9d5902086d --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,37 @@ +public class Task { + private boolean isDone; + private String message; + + public Task(String message) { + this.message = message; + this.isDone = false; + } + + public void markAsDone() { + this.isDone = true; + System.out.println("*************************************************"); + System.out.println("hewwo kitty is so pwoud of youw fow compweting this task!"); + System.out.println("[X]" + this.message); + System.out.println("*************************************************"); + } + + public void unmarkAsDone() { + this.isDone = false; + System.out.println("*************************************************"); + System.out.println("this task has been mawked as not done :("); + System.out.println("[ ]" + this.message); + System.out.println("*************************************************"); + } + + private String printStatus() { + if (this.isDone) { + return "[X]"; + } + return "[ ]"; + } + + @Override + public String toString() { + return this.printStatus() + this.message; + } +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..4ab96a9bef --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,34 @@ +import java.util.ArrayList; + +public class TaskList { + private ArrayList tasks; + + public TaskList() { + this.tasks = new ArrayList(); + } + + public void markDone(int i) { + this.tasks.get(i-1).markAsDone(); + } + + public void unmarkDone(int i) { + this.tasks.get(i-1).unmarkAsDone(); + } + + public void addTask(String message) { + this.tasks.add(new Task(message)); + System.out.println("*************************************************"); + System.out.println("added: " + message); + System.out.println("*************************************************"); + } + + @Override + public String toString() { + String s = ""; + for (int i = 0; i < this.tasks.size(); i++) { + int currTask = i+1; + s += currTask + ". " + this.tasks.get(i).toString() + "\n"; + } + return s; + } +} From b35bb7f6680485116b71126992d1fffd59bd7274 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Mon, 3 Feb 2025 20:00:40 +0800 Subject: [PATCH 08/43] Add todo, deadline and events --- src/main/java/Deadline.java | 14 ++++++++++++++ src/main/java/Event.java | 15 +++++++++++++++ src/main/java/HewwoKitty.java | 12 +++++++----- src/main/java/Task.java | 20 ++++++++++---------- src/main/java/TaskList.java | 15 ++++++++++++--- src/main/java/Todo.java | 11 +++++++++++ 6 files changed, 69 insertions(+), 18 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..e7d6a2651f --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task { + private String deadline; + + public Deadline(String message) { + super(message.split("/")[0]); + this.deadline = message.split("/")[1].split(" ",2)[1]; + } + + @Override + public String toString() { + return "[D]" + super.toString() + "(by: " + deadline + ")"; + } + +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 0000000000..bd533ec17a --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,15 @@ +public class Event extends Task { + private String fromDate; + private String toDate; + + public Event(String message) { + super(message.split("/")[0]); + this.fromDate = message.split("/")[1].split(" ", 2)[1]; + this.toDate = message.split("/")[2].split(" ", 2)[1]; + } + + @Override + public String toString() { + return "[E]" + super.toString() + "(from: " + this.fromDate + "to: " + this.toDate + ")"; + } +} diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 7c8d961d0e..5a7795b5f5 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -12,9 +12,7 @@ public static void main(String[] args) { String userString = userInput.nextLine(); if (userString.equals("bye")) { run = false; - System.out.println("*************************************************"); - System.out.println("goodbwye! uwu"); - System.out.println("*************************************************"); + printBye(); } else { if (userString.equals("list")) { System.out.print(taskList); @@ -24,7 +22,7 @@ public static void main(String[] args) { } else if (userString.split(" ")[0].equals("unmark")) { int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.unmarkDone(taskNum); - } else { + } else { // add tasks taskList.addTask(userString); } } @@ -50,5 +48,9 @@ public static void printStart() { System.out.println("*************************************************"); } - + public static void printBye() { + System.out.println("*************************************************"); + System.out.println("goodbwye! uwu"); + System.out.println("*************************************************"); + } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 9d5902086d..fd9765b9da 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,9 +1,9 @@ -public class Task { +public abstract class Task { private boolean isDone; - private String message; + private String description; - public Task(String message) { - this.message = message; + public Task(String description) { + this.description = description; this.isDone = false; } @@ -11,7 +11,7 @@ public void markAsDone() { this.isDone = true; System.out.println("*************************************************"); System.out.println("hewwo kitty is so pwoud of youw fow compweting this task!"); - System.out.println("[X]" + this.message); + System.out.println("[X]" + this.description); System.out.println("*************************************************"); } @@ -19,19 +19,19 @@ public void unmarkAsDone() { this.isDone = false; System.out.println("*************************************************"); System.out.println("this task has been mawked as not done :("); - System.out.println("[ ]" + this.message); + System.out.println("[ ]" + this.description); System.out.println("*************************************************"); } - private String printStatus() { + private String printIsDone() { if (this.isDone) { - return "[X]"; + return "[X] "; } - return "[ ]"; + return "[ ] "; } @Override public String toString() { - return this.printStatus() + this.message; + return this.printIsDone() + this.description; } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 4ab96a9bef..7270c694dd 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -15,10 +15,19 @@ public void unmarkDone(int i) { this.tasks.get(i-1).unmarkAsDone(); } - public void addTask(String message) { - this.tasks.add(new Task(message)); + public void addTask(String userString) { + Task t; + if (userString.contains("todo")) { + t = new Todo(userString.split(" ", 2)[1]); + } else if (userString.contains("deadline")) { + t = new Deadline(userString.split(" ", 2)[1]); + } else { + t = new Event(userString.split(" ", 2)[1]); + } + this.tasks.add(t); System.out.println("*************************************************"); - System.out.println("added: " + message); + System.out.println("i've added youw new task: \n" + t); + System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); System.out.println("*************************************************"); } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 0000000000..1bb0260037 --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,11 @@ +public class Todo extends Task { + public Todo(String message) { + super(message); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } + +} From 62bd9c90e15124b89fae208e286a82822f720f26 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Tue, 4 Feb 2025 22:23:35 +0800 Subject: [PATCH 09/43] add error checking for invalid commands --- src/main/java/HewwoKitty.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 5a7795b5f5..956f1849d8 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -22,8 +22,10 @@ public static void main(String[] args) { } else if (userString.split(" ")[0].equals("unmark")) { int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.unmarkDone(taskNum); - } else { // add tasks + } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks taskList.addTask(userString); + } else { + System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); } } } From f54a7897099fb5f19a50f76143ce0eb3a410b2d9 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Tue, 4 Feb 2025 23:05:56 +0800 Subject: [PATCH 10/43] Add error handling for blank descriptions of todos --- src/main/java/meow.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/meow.java diff --git a/src/main/java/meow.java b/src/main/java/meow.java new file mode 100644 index 0000000000..588f58fd55 --- /dev/null +++ b/src/main/java/meow.java @@ -0,0 +1,4 @@ +package PACKAGE_NAME; + +public class meow { +} From eb298971215001b843aa6864fa71e3d5baf37207 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Wed, 5 Feb 2025 21:24:00 +0800 Subject: [PATCH 11/43] add delete from task list --- src/main/java/HewwoKitty.java | 8 +++++++- src/main/java/TaskList.java | 28 ++++++++++++++++++++-------- src/main/java/meow.java | 5 +++-- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 956f1849d8..dc8d7a3353 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -23,9 +23,15 @@ public static void main(String[] args) { int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.unmarkDone(taskNum); } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks - taskList.addTask(userString); + try { + taskList.addTask(userString); + } catch (Exception e) { + + } } else { + System.out.println("*************************************************"); System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); + System.out.println("*************************************************"); } } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 7270c694dd..baf9b5a2d1 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -16,28 +16,40 @@ public void unmarkDone(int i) { } public void addTask(String userString) { - Task t; + Task t = null; if (userString.contains("todo")) { - t = new Todo(userString.split(" ", 2)[1]); + String temp = userString.replaceFirst("todo", ""); + if (!temp.equals("")) { + t = new Todo(userString.split(" ", 2)[1]); + } else { + System.out.println("*************************************************"); + System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); + System.out.println("*************************************************"); + } } else if (userString.contains("deadline")) { t = new Deadline(userString.split(" ", 2)[1]); } else { t = new Event(userString.split(" ", 2)[1]); } - this.tasks.add(t); - System.out.println("*************************************************"); - System.out.println("i've added youw new task: \n" + t); - System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); - System.out.println("*************************************************"); + if (!(t == null)) { //if not null, add to list + this.tasks.add(t); + System.out.println("*************************************************"); + System.out.println("i've added youw new task: \n" + t); + System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); + System.out.println("*************************************************"); + } + + } @Override public String toString() { + String border = "*************************************************\n"; String s = ""; for (int i = 0; i < this.tasks.size(); i++) { int currTask = i+1; s += currTask + ". " + this.tasks.get(i).toString() + "\n"; } - return s; + return border + s + border; } } diff --git a/src/main/java/meow.java b/src/main/java/meow.java index 588f58fd55..8e25186de7 100644 --- a/src/main/java/meow.java +++ b/src/main/java/meow.java @@ -1,4 +1,5 @@ -package PACKAGE_NAME; - public class meow { + public static void main(String[] args) { + + } } From da547f879de1a59c12e4161f3669e80dc2a7c149 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Wed, 5 Feb 2025 21:25:19 +0800 Subject: [PATCH 12/43] Add delete from TaskList --- src/main/java/HewwoKitty.java | 9 ++++----- src/main/java/TaskList.java | 8 +++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index dc8d7a3353..056238790d 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -23,11 +23,10 @@ public static void main(String[] args) { int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.unmarkDone(taskNum); } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks - try { - taskList.addTask(userString); - } catch (Exception e) { - - } + taskList.addTask(userString); + } else if (userString.contains("delete")) { + int i = Integer.parseInt(userString.split(" ")[1]); + taskList.removeTask(i); } else { System.out.println("*************************************************"); System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index baf9b5a2d1..eb962ad241 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -38,8 +38,14 @@ public void addTask(String userString) { System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); System.out.println("*************************************************"); } + } - + public void removeTask(int i) { + System.out.println("*************************************************"); + System.out.println("i've wemoved youw task: \n" + this.tasks.get(i-1).toString()); + this.tasks.remove(i-1); + System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); + System.out.println("*************************************************"); } @Override From e3c50897d384ca93e959aa92a8215ee3e6bdc75a Mon Sep 17 00:00:00 2001 From: reaneechua Date: Wed, 5 Feb 2025 21:49:01 +0800 Subject: [PATCH 13/43] Add some input test cases --- src/main/java/Deadline.class | Bin 0 -> 1002 bytes src/main/java/Event.class | Bin 0 -> 1076 bytes src/main/java/HewwoKitty.class | Bin 0 -> 2878 bytes src/main/java/HewwoKitty.java | 5 +++-- src/main/java/Task.class | Bin 0 -> 1585 bytes src/main/java/TaskList.class | Bin 0 -> 2788 bytes src/main/java/Todo.class | Bin 0 -> 735 bytes src/main/java/meow.class | Bin 0 -> 253 bytes text-ui-test/input.txt | 7 +++++++ text-ui-test/runtest.bat | 2 +- 10 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Deadline.class create mode 100644 src/main/java/Event.class create mode 100644 src/main/java/HewwoKitty.class create mode 100644 src/main/java/Task.class create mode 100644 src/main/java/TaskList.class create mode 100644 src/main/java/Todo.class create mode 100644 src/main/java/meow.class diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..ef7b602ba69364252cc52b8cbd7c7e0bd4dd657e GIT binary patch literal 1002 zcmaJ=+iuf95IvKN?YeGLOiL-3Hi5KFQfMH6Km;K{s)|Yh9umPr#lt39wQgKHvNx6T zCwvA-&`N#a1NbP!xG@lj#e-*O#%Io+*`59V_LF3n5|Df41gMEE+#$^F?|h(AXY@2rWy12Y=*x!hb%lEGs6+NbB|H@po+R*2 z@1JmzI_^dt-zOCR^yhddeqY8HIo@wqbd?{BbUfgDZTfzHI3QSio+pEbE5cB+h>w#Z zVvh0Qz7k%~m0@vQSf5rlk@>5zJsQXa_~e1T?HtLjs!#S7Q#6F@wj3qvIvx_%r}|6M zMp*qn4h4P;CO-p0DjFyDQtb1XvCVPx0vXN#h02yqr%0u1XGq6>re3~A&PjQ+r&_ThgKjo@!+;*%bLbj;#S%} z;b(v}Hfaz10DctWrj4MG2t{(PkB^Vfy}thO^ZYx2Ej%%>XyOW%Ow8h{fos9!`V36m z2!`bVzL_KH9UTQ7D-6abPxiOD5)8S<5g+l2!`*{QQ+c*~P-D=PoUCfkY}Z!L85W9B zUg;e}sxG^vl4;nkcr)y`h1cS3hY&-_i5$axu@v3RU^eB@>xf-Dpqo1*;i~n(3j?d@ zxNBh*MGF~Z3CIVtk_8KM7A^$CCCoEqUr4EZpVIM>A(=3Xg=YGNG~s_*{JM^+5#{WQ;%q@l#H*ylY_mu`ov z_qIBu$XDD|KEtaR`KXO35>sIv4}v;uFckhIZo4Dd6X8uy9PILrlHRe7$8_-xDSN{K zgSF?n!mB&n_XXMdJZ&q~n3Vh_ce{@83zLntsIw{LuZ^wafrz0`SMqK9NOV+fI=4`w z&K;*|D^b(2#jp~|FU}jo^8b0bMXzO+-bsQ!>a=l0%{Km1k0T3)i!}Ry6fuC!@>-6a zB9W|~AsNQ0YA%&NMLJde1}((WQ<(mhHd0&Am?IfLqoZ`>VPFF@v_g#?9#ck=BI1?L tV3bct?gaWdk?`fWhBju*5p#jC1TNzd{Y^q2ViQ#?kupe|QF08oe*uA`3hMv> literal 0 HcmV?d00001 diff --git a/src/main/java/HewwoKitty.class b/src/main/java/HewwoKitty.class new file mode 100644 index 0000000000000000000000000000000000000000..d537b67357c532a4df4c0a882ca2697ea3215b3d GIT binary patch literal 2878 zcmb7G-)|IE6#k~&?F`G7LQ5&76s8FD2Zc)cSz16TA{7c~5d{>T?vCxY+nusI+qG{H z31WD_s4*53o$iwEBZ_28EW(S4i4Xn-KHbE`7ax5wihg(YXKQP4cQSMDx#xc8eCM3G zXMTM0?IQsDVEeEIoy)KbyEW|bVK4Tn*zbcEohrJd{D2QCy5+4$!$BXmp2CUUMpxSs5%*nn5W`ngJ$%sF&L)AGiHP$3f8n-JUL=a z7#(3FGSo3(M?;aJZn?2?z%~M-{l>Vfui|wDzHzSFlt*m^nmai%Nhsfd6^{nYV&Ip4=gU{n(0T73cl9fQ!^EE~|LMk2i6NSZ9sc=*duwu&Z2W;&v$9F%U2! z5i{z?TXjF?!D~rTkanTq$13D|mBBZ#z=u;{512O%6>Ds(;lB>6JlH^^Hdgz*=A5$Vp^Iy1B=0xgx zVb^@5_U-q3~G^BnZAPY9%aP|1s z6kZ&@e!S?~eKE~K&R&cL6^OWCyPPVh8h^*#kI34V#k)zF>@`KuzQ}l-jU)%UHn)ker3eu?42HoV!~u@IZH+TVkCiys`0ch?JWbbA6HKnD0?; z!|aRL=8zec?a+wEOimXV%6HU0s>tSZ)RJ60Eq#)mFWZo^GA&?5Y##lj(opJ3@30Xa zAW1V4FkM2b5e&+P$^B7t%$hLe1Wo*`*ut+8zyn40T;5waYvfbm)7v%+=P*LpKpoyN_g zUhR^4Ytjf%uP%eNw^7GYy*sMpXdOpW@VD1{GH6JnhobeaXfb<@X*5WZ8%R<1ogO$b(li~z9-&KMEDsSAg~d?K*w)H`yHF`7q&1_ThUI7>*0HXMn#2Jh59EN zRBW$lZf?}{KTuajUv?Dody$^X{BEn(PmoGm2@}bzDL3C#A}?0K22ulwmSZ=`?IDT1 ybaWq`+0VM@q9J}^Wvc@RX-NL+O9S`JqOjGhL7<0GJIL4^Vhj!wMA literal 0 HcmV?d00001 diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 056238790d..59f0f0ccde 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -3,12 +3,13 @@ public class HewwoKitty { public static void main(String[] args) { - printStart(); + //printStart(); + System.out.println("HewwoKitty"); boolean run = true; TaskList taskList = new TaskList(); + Scanner userInput = new Scanner(System.in); while (run) { - Scanner userInput = new Scanner(System.in); String userString = userInput.nextLine(); if (userString.equals("bye")) { run = false; diff --git a/src/main/java/Task.class b/src/main/java/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..a7d740ef56c6e95e1b6a05d1d49c6f47caddb395 GIT binary patch literal 1585 zcmb7E>2A|N5dJm^v6H$7Zo^ToErgPWLbnYywwC-~+;DO@pp6b@Pdd>T)+vBfQ zk5^Tz-IJP>W$H5=C*+`vtS!rxe47Xjat(&sJF zYsea>S6^vfqlxh=1sltx_seImxH0?{cd#D^Y}_(HW%3ybh;D0)k2c@Rs@~?R^aCwh z3`y0cja($Tr}>1S~pccM}l!|s-7$g=XQLO=C%ot^?M zd>t^%k2*7>hHSbaqy(eo(ukztoDpZm!io{%K0|&>0ndM@8Zti5QIRX6s#T|NVU3RW zno^B!n~vtH@5@fPDS|*!6D z_7+2wMYCD)v@BUzXE-|4->BLc4*okXHAlaPDf(+9=%z0ve4@{W><;>e_2IyiDo7w zF#_aCfJN#tVLr9En+s%3H{(=w@&nTD*hkm-NRC7(#sre|ypLqqk1P(-4f3!o%aVnn#b>zfSVLr{rv*=EC@C}?TOQUQUl0zlDk{oN$6Qx>GRLz?A!psR z*BHTd9dDR;6K|P#8}I0NS54kCsn8GUcwbF!n7FAzv-e52)NAPYKp}jn6_*S1}2+ZFk@d9U)05g3nV-f)ZaXX3(-qDdUhe z9Yg~k;}eF>_U;8?(OjghqMI*Rjwo1?PQZ|5Fow2yJ|{+9C&lG?Th7wRliZQCzxM9n zeyACRuxDSVDx~Wo!LXHZEypcbv%EmQm=Ev8tQqc1b16yhk=!l^v)w0G@GpQey%lP^ zY6P$*nMiPhP;MCOx0u0jxQ1z>I`TEqLX3VGuYphvP%Wteso_&~GHx^MSUC>1v*6B& z^3@o`{{&A-H&@i~742lgb?5R~D%^zQh}>v~d!C@Ad|OGYj1e64liW#XgtsFwj8`+O zkgPJCDrQ9u^~yqBs_trtQJ%?6+EUPC`8C7Ns{PgC#<1n_dg!7TcNe{gj2=I_x2f-; zSsi-mS!C*xr*;oXo}x#Qu52{*-UI8skGc!@5W0)-FTQO*wd+U&WEF;nM(CtHKvseE z9$KrT)%Cr0v8mr(x)A|+@m=IZqY)}V==1-kM7*HnMhw2@4k$aF9E1zuS%>WK|d zV#&T}LkY%r7^6XSO$p|yJ*r##J=*SL-G#nrV|@ut;l1~;K6wWnzakoKE}=#Bt>s?L z?_jVmy1_>xyS7TZjbztyADb#=?aA1m7*czVmC$j%0yVaX%|y)ipw>(1T*Q_oiSJwO zuMR4*<51r$%`|JF0JT!P0iE<+Gf3YwhtZA^bRa>JvxH#7!gXw;*JnF!VFzwget)10 z|3ulnOS#=oNKr)o!JvkSh64}KR=2rnh$41yIpleYno35Zg771W+qy`86#r#;m)hQA zw!-|av{QkAib|)V+D?*wDw3n*_#|zHsaG;c9c~bXdeR(@Zkvd%Nrr|y%g{e!XJ`2G z!EmfKtR$UFl|+QL1Ie2qcIV%}`(k~Iw0HbW2tf$9P*H+D6+^Vm2>EFyPa7$C12jH> zxF42A)IEewF`++uKqNz?pa6#O1@#6|`wU;=bBg*|np;Hh9Ldi6?M1(R#c#Rarv3x? Cdy?A# literal 0 HcmV?d00001 diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class new file mode 100644 index 0000000000000000000000000000000000000000..edeec708605c75cefbe6ed585e870bf91e6124b4 GIT binary patch literal 735 zcmaJ<%TB^T6g?NQt+fii-!DYtBhjS`j0;JOCa4RDE{ux-CR(U7q#aEB6F);&CNBH{ zKgxIuL@^MXbmrbO=iJxK=hyoOfCFS*3}Q51QsWFv*qF32MX(Ni<(nhI)K;M;9>snj z)ZKp3guc4VZC??Rd0mx+RKZvBqWMskVM&w&MjWHtG{WT8cCVP=7IibM$P+)N50!LP z@5L!RSg<{~7$&5TwKkCnMdMtWdtHrE7N#A{c$mc;Cyzz(CZf8Fc`UGfQ@SO>%!8=Q zyjB%qu6=XQR%C=S5n;1mBfaI>Sd5db60*O2`|45GWvBgi^b=7rI()K`;b9fDt~VP5 z?@TEf<^vH$l2bl+r|iUN_j4*#HIPxZEzI?n(S`gGmYy225B;W#e_5`{iph14z7rxZ zf}rRdnX|D@*y!o6Uu}ft|9MzLlAllfCBU3LI>4GF wBYfRId}52wcixbA#{ls1qp?~i4uc+J35;N+6^XFK`Ij+=H2V&-#`quq2HXX>qyPW_ literal 0 HcmV?d00001 diff --git a/src/main/java/meow.class b/src/main/java/meow.class new file mode 100644 index 0000000000000000000000000000000000000000..2dba4b192a47fd802d1c972ed035d9ae8c42257f GIT binary patch literal 253 zcmZ9Gy$%6E6ot=S`@>pRB~d7JC@2*~BT)&(ibgfdL`LjvvROQrN}})p9!lItqEi>~6M+~w%N;@_BK qfiXDTUB0z>5>Kap2i ACTUAL.TXT +java -classpath ..\bin HewwoKitty < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT From ddcb75ceae5abbd1d430dd2781c9540013dbc0bf Mon Sep 17 00:00:00 2001 From: reaneechua Date: Mon, 17 Feb 2025 05:48:50 +0800 Subject: [PATCH 14/43] Add feature to save tasks to file called hewwo.txt --- .gitignore | 1 + data/hewwoTasks.txt | 4 ++++ src/main/java/HewwoKitty.java | 29 +++++++++++++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 data/hewwoTasks.txt diff --git a/.gitignore b/.gitignore index 2873e189e1..1afe9d80ec 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT +/.class diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt new file mode 100644 index 0000000000..cc9696d9b4 --- /dev/null +++ b/data/hewwoTasks.txt @@ -0,0 +1,4 @@ +************************************************* +1. [T][ ] eat bread +2. [D][ ] die (by: Tues) +************************************************* diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 59f0f0ccde..4e27f8344b 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -1,18 +1,19 @@ import java.util.ArrayList; import java.util.Scanner; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; public class HewwoKitty { public static void main(String[] args) { - //printStart(); - System.out.println("HewwoKitty"); - - boolean run = true; + printStart(); + boolean isRunning = true; TaskList taskList = new TaskList(); Scanner userInput = new Scanner(System.in); - while (run) { + while (isRunning) { String userString = userInput.nextLine(); if (userString.equals("bye")) { - run = false; + isRunning = false; printBye(); } else { if (userString.equals("list")) { @@ -20,14 +21,18 @@ public static void main(String[] args) { } else if (userString.split(" ")[0].equals("mark")){ int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.markDone(taskNum); + writeToFile(taskList); } else if (userString.split(" ")[0].equals("unmark")) { int taskNum = Integer.parseInt(userString.split(" ")[1]); taskList.unmarkDone(taskNum); + writeToFile(taskList); } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks taskList.addTask(userString); + writeToFile(taskList); } else if (userString.contains("delete")) { int i = Integer.parseInt(userString.split(" ")[1]); taskList.removeTask(i); + writeToFile(taskList); } else { System.out.println("*************************************************"); System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); @@ -61,4 +66,16 @@ public static void printBye() { System.out.println("goodbwye! uwu"); System.out.println("*************************************************"); } + + public static void writeToFile(TaskList tasks) { + File file = new File("./data/hewwoTasks.txt"); + file.getParentFile().mkdirs(); + + try (FileWriter writer = new FileWriter(file, false)) { + writer.write(tasks.toString()); + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while writing to the file: " + e.getMessage()); + } + } } From f600cad39a272b14a93893bfd8a98cab99aff22a Mon Sep 17 00:00:00 2001 From: reaneechua Date: Mon, 17 Feb 2025 06:02:02 +0800 Subject: [PATCH 15/43] Add date formatting for Deadlines --- data/hewwoTasks.txt | 3 +-- src/main/java/Deadline.java | 14 +++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index cc9696d9b4..faa05ed563 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,4 +1,3 @@ ************************************************* -1. [T][ ] eat bread -2. [D][ ] die (by: Tues) +1. [D][ ] die (by: Oct 15 2019) ************************************************* diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index e7d6a2651f..45a97692ed 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,14 +1,22 @@ +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { - private String deadline; + private LocalDate deadline; public Deadline(String message) { super(message.split("/")[0]); - this.deadline = message.split("/")[1].split(" ",2)[1]; + String dateEntered = message.split("/")[1].split(" ",2)[1]; + this.deadline = LocalDate.parse(dateEntered); } @Override public String toString() { - return "[D]" + super.toString() + "(by: " + deadline + ")"; + return "[D]" + super.toString() + "(by: " + this.printDeadline() + ")"; + } + + private String printDeadline() { + return this.deadline.format(DateTimeFormatter.ofPattern("MMM d yyyy")); } } From d5f1ca8bcfc006afe7f78df87abaf01fca5959a8 Mon Sep 17 00:00:00 2001 From: reaneechua <156237866+reaneechua@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:05:39 +0800 Subject: [PATCH 16/43] Delete src/main/java/Deadline.class --- src/main/java/Deadline.class | Bin 1002 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/Deadline.class diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class deleted file mode 100644 index ef7b602ba69364252cc52b8cbd7c7e0bd4dd657e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1002 zcmaJ=+iuf95IvKN?YeGLOiL-3Hi5KFQfMH6Km;K{s)|Yh9umPr#lt39wQgKHvNx6T zCwvA-&`N#a1NbP!xG@lj#e-*O#%Io+*`59V_LF3n5|Df41gMEE+#$^F?|h(AXY@2rWy12Y=*x!hb%lEGs6+NbB|H@po+R*2 z@1JmzI_^dt-zOCR^yhddeqY8HIo@wqbd?{BbUfgDZTfzHI3QSio+pEbE5cB+h>w#Z zVvh0Qz7k%~m0@vQSf5rlk@>5zJsQXa_~e1T?HtLjs!#S7Q#6F@wj3qvIvx_%r}|6M zMp*qn4h4P;CO-p0DjFyDQtb1XvCVPx0vXN#h02yqr%0u1XGq6>re Date: Mon, 17 Feb 2025 06:05:47 +0800 Subject: [PATCH 17/43] Delete src/main/java/Event.class --- src/main/java/Event.class | Bin 1076 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/Event.class diff --git a/src/main/java/Event.class b/src/main/java/Event.class deleted file mode 100644 index 31636c1f21c98cf1b5a66a345c8d2c7184670929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmaJ=U2oGc6g}=ol4Th!Wn+wwQJ`aO2P>3~A&PjQ+r&_ThgKjo@!+;*%bLbj;#S%} z;b(v}Hfaz10DctWrj4MG2t{(PkB^Vfy}thO^ZYx2Ej%%>XyOW%Ow8h{fos9!`V36m z2!`bVzL_KH9UTQ7D-6abPxiOD5)8S<5g+l2!`*{QQ+c*~P-D=PoUCfkY}Z!L85W9B zUg;e}sxG^vl4;nkcr)y`h1cS3hY&-_i5$axu@v3RU^eB@>xf-Dpqo1*;i~n(3j?d@ zxNBh*MGF~Z3CIVtk_8KM7A^$CCCoEqUr4EZpVIM>A(=3Xg=YGNG~s_*{JM^+5#{WQ;%q@l#H*ylY_mu`ov z_qIBu$XDD|KEtaR`KXO35>sIv4}v;uFckhIZo4Dd6X8uy9PILrlHRe7$8_-xDSN{K zgSF?n!mB&n_XXMdJZ&q~n3Vh_ce{@83zLntsIw{LuZ^wafrz0`SMqK9NOV+fI=4`w z&K;*|D^b(2#jp~|FU}jo^8b0bMXzO+-bsQ!>a=l0%{Km1k0T3)i!}Ry6fuC!@>-6a zB9W|~AsNQ0YA%&NMLJde1}((WQ<(mhHd0&Am?IfLqoZ`>VPFF@v_g#?9#ck=BI1?L tV3bct?gaWdk?`fWhBju*5p#jC1TNzd{Y^q2ViQ#?kupe|QF08oe*uA`3hMv> From 341c4daeaa0efbaac6d816cb5c194005e3d0457a Mon Sep 17 00:00:00 2001 From: reaneechua <156237866+reaneechua@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:05:56 +0800 Subject: [PATCH 18/43] Delete src/main/java/HewwoKitty.class --- src/main/java/HewwoKitty.class | Bin 2878 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/HewwoKitty.class diff --git a/src/main/java/HewwoKitty.class b/src/main/java/HewwoKitty.class deleted file mode 100644 index d537b67357c532a4df4c0a882ca2697ea3215b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2878 zcmb7G-)|IE6#k~&?F`G7LQ5&76s8FD2Zc)cSz16TA{7c~5d{>T?vCxY+nusI+qG{H z31WD_s4*53o$iwEBZ_28EW(S4i4Xn-KHbE`7ax5wihg(YXKQP4cQSMDx#xc8eCM3G zXMTM0?IQsDVEeEIoy)KbyEW|bVK4Tn*zbcEohrJd{D2QCy5+4$!$BXmp2CUUMpxSs5%*nn5W`ngJ$%sF&L)AGiHP$3f8n-JUL=a z7#(3FGSo3(M?;aJZn?2?z%~M-{l>Vfui|wDzHzSFlt*m^nmai%Nhsfd6^{nYV&Ip4=gU{n(0T73cl9fQ!^EE~|LMk2i6NSZ9sc=*duwu&Z2W;&v$9F%U2! z5i{z?TXjF?!D~rTkanTq$13D|mBBZ#z=u;{512O%6>Ds(;lB>6JlH^^Hdgz*=A5$Vp^Iy1B=0xgx zVb^@5_U-q3~G^BnZAPY9%aP|1s z6kZ&@e!S?~eKE~K&R&cL6^OWCyPPVh8h^*#kI34V#k)zF>@`KuzQ}l-jU)%UHn)ker3eu?42HoV!~u@IZH+TVkCiys`0ch?JWbbA6HKnD0?; z!|aRL=8zec?a+wEOimXV%6HU0s>tSZ)RJ60Eq#)mFWZo^GA&?5Y##lj(opJ3@30Xa zAW1V4FkM2b5e&+P$^B7t%$hLe1Wo*`*ut+8zyn40T;5waYvfbm)7v%+=P*LpKpoyN_g zUhR^4Ytjf%uP%eNw^7GYy*sMpXdOpW@VD1{GH6JnhobeaXfb<@X*5WZ8%R<1ogO$b(li~z9-&KMEDsSAg~d?K*w)H`yHF`7q&1_ThUI7>*0HXMn#2Jh59EN zRBW$lZf?}{KTuajUv?Dody$^X{BEn(PmoGm2@}bzDL3C#A}?0K22ulwmSZ=`?IDT1 ybaWq`+0VM@q9J}^Wvc@RX-NL+O9S`JqOjGhL7<0GJIL4^Vhj!wMA From 7211b6401a42993edb3bc1e57ab326a45d6186fb Mon Sep 17 00:00:00 2001 From: reaneechua <156237866+reaneechua@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:06:06 +0800 Subject: [PATCH 19/43] Delete src/main/java/Task.class --- src/main/java/Task.class | Bin 1585 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/Task.class diff --git a/src/main/java/Task.class b/src/main/java/Task.class deleted file mode 100644 index a7d740ef56c6e95e1b6a05d1d49c6f47caddb395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1585 zcmb7E>2A|N5dJm^v6H$7Zo^ToErgPWLbnYywwC-~+;DO@pp6b@Pdd>T)+vBfQ zk5^Tz-IJP>W$H5=C*+`vtS!rxe47Xjat(&sJF zYsea>S6^vfqlxh=1sltx_seImxH0?{cd#D^Y}_(HW%3ybh;D0)k2c@Rs@~?R^aCwh z3`y0cja($Tr}>1S~pccM}l!|s-7$g=XQLO=C%ot^?M zd>t^%k2*7>hHSbaqy(eo(ukztoDpZm!io{%K0|&>0ndM@8Zti5QIRX6s#T|NVU3RW zno^B!n~vtH@5@fPDS|*!6D z_7+2wMYCD)v@BUzXE-|4->BLc4*okXHAlaPDf(+9=%z0ve4@{W><;>e_2IyiDo7w zF#_aCfJN#tVLr9En+s%3H{(=w@&nTD*hkm-NRC7(#sre|ypLqqk1P(-4f3!o Date: Mon, 17 Feb 2025 06:06:20 +0800 Subject: [PATCH 20/43] Delete src/main/java/meow.java --- src/main/java/meow.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/main/java/meow.java diff --git a/src/main/java/meow.java b/src/main/java/meow.java deleted file mode 100644 index 8e25186de7..0000000000 --- a/src/main/java/meow.java +++ /dev/null @@ -1,5 +0,0 @@ -public class meow { - public static void main(String[] args) { - - } -} From d4914d36c88ee27cb469dca9829e07be5033d412 Mon Sep 17 00:00:00 2001 From: reaneechua <156237866+reaneechua@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:06:28 +0800 Subject: [PATCH 21/43] Delete src/main/java/meow.class --- src/main/java/meow.class | Bin 253 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/meow.class diff --git a/src/main/java/meow.class b/src/main/java/meow.class deleted file mode 100644 index 2dba4b192a47fd802d1c972ed035d9ae8c42257f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmZ9Gy$%6E6ot=S`@>pRB~d7JC@2*~BT)&(ibgfdL`LjvvROQrN}})p9!lItqEi>~6M+~w%N;@_BK qfiXDTUB0z>5>Kap2i Date: Mon, 17 Feb 2025 06:06:36 +0800 Subject: [PATCH 22/43] Delete src/main/java/TaskList.class --- src/main/java/TaskList.class | Bin 2788 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/TaskList.class diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class deleted file mode 100644 index 57c58e51a910a63bb01a8f2e5a54d7bc3f4f5cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2788 zcmb7GS#uLd5dOxJwd-ZUMz%577}lIVgdKAQEaG5n2y!eSv4H?N7)yh_Sl$)dkrk0U zkdT`kFFD@w!c(e}R1j6BDwU@^%aVnn#b>zfSVLr{rv*=EC@C}?TOQUQUl0zlDk{oN$6Qx>GRLz?A!psR z*BHTd9dDR;6K|P#8}I0NS54kCsn8GUcwbF!n7FAzv-e52)NAPYKp}jn6_*S1}2+ZFk@d9U)05g3nV-f)ZaXX3(-qDdUhe z9Yg~k;}eF>_U;8?(OjghqMI*Rjwo1?PQZ|5Fow2yJ|{+9C&lG?Th7wRliZQCzxM9n zeyACRuxDSVDx~Wo!LXHZEypcbv%EmQm=Ev8tQqc1b16yhk=!l^v)w0G@GpQey%lP^ zY6P$*nMiPhP;MCOx0u0jxQ1z>I`TEqLX3VGuYphvP%Wteso_&~GHx^MSUC>1v*6B& z^3@o`{{&A-H&@i~742lgb?5R~D%^zQh}>v~d!C@Ad|OGYj1e64liW#XgtsFwj8`+O zkgPJCDrQ9u^~yqBs_trtQJ%?6+EUPC`8C7Ns{PgC#<1n_dg!7TcNe{gj2=I_x2f-; zSsi-mS!C*xr*;oXo}x#Qu52{*-UI8skGc!@5W0)-FTQO*wd+U&WEF;nM(CtHKvseE z9$KrT)%Cr0v8mr(x)A|+@m=IZqY)}V==1-kM7*HnMhw2@4k$aF9E1zuS%>WK|d zV#&T}LkY%r7^6XSO$p|yJ*r##J=*SL-G#nrV|@ut;l1~;K6wWnzakoKE}=#Bt>s?L z?_jVmy1_>xyS7TZjbztyADb#=?aA1m7*czVmC$j%0yVaX%|y)ipw>(1T*Q_oiSJwO zuMR4*<51r$%`|JF0JT!P0iE<+Gf3YwhtZA^bRa>JvxH#7!gXw;*JnF!VFzwget)10 z|3ulnOS#=oNKr)o!JvkSh64}KR=2rnh$41yIpleYno35Zg771W+qy`86#r#;m)hQA zw!-|av{QkAib|)V+D?*wDw3n*_#|zHsaG;c9c~bXdeR(@Zkvd%Nrr|y%g{e!XJ`2G z!EmfKtR$UFl|+QL1Ie2qcIV%}`(k~Iw0HbW2tf$9P*H+D6+^Vm2>EFyPa7$C12jH> zxF42A)IEewF`++uKqNz?pa6#O1@#6|`wU;=bBg*|np;Hh9Ldi6?M1(R#c#Rarv3x? Cdy?A# From a276fc2570edaa3fbc3b0cdde921c402e4aaea40 Mon Sep 17 00:00:00 2001 From: reaneechua <156237866+reaneechua@users.noreply.github.com> Date: Mon, 17 Feb 2025 06:06:43 +0800 Subject: [PATCH 23/43] Delete src/main/java/Todo.class --- src/main/java/Todo.class | Bin 735 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/Todo.class diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class deleted file mode 100644 index edeec708605c75cefbe6ed585e870bf91e6124b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmaJ<%TB^T6g?NQt+fii-!DYtBhjS`j0;JOCa4RDE{ux-CR(U7q#aEB6F);&CNBH{ zKgxIuL@^MXbmrbO=iJxK=hyoOfCFS*3}Q51QsWFv*qF32MX(Ni<(nhI)K;M;9>snj z)ZKp3guc4VZC??Rd0mx+RKZvBqWMskVM&w&MjWHtG{WT8cCVP=7IibM$P+)N50!LP z@5L!RSg<{~7$&5TwKkCnMdMtWdtHrE7N#A{c$mc;Cyzz(CZf8Fc`UGfQ@SO>%!8=Q zyjB%qu6=XQR%C=S5n;1mBfaI>Sd5db60*O2`|45GWvBgi^b=7rI()K`;b9fDt~VP5 z?@TEf<^vH$l2bl+r|iUN_j4*#HIPxZEzI?n(S`gGmYy225B;W#e_5`{iph14z7rxZ zf}rRdnX|D@*y!o6Uu}ft|9MzLlAllfCBU3LI>4GF wBYfRId}52wcixbA#{ls1qp?~i4uc+J35;N+6^XFK`Ij+=H2V&-#`quq2HXX>qyPW_ From 30f78b973294b176770bc8f6f926ce19e742d520 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Tue, 18 Feb 2025 19:21:00 +0800 Subject: [PATCH 24/43] Add Ui, Parser and Sotrage classes --- data/hewwoTasks.txt | 3 +- src/main/java/HewwoKitty.java | 72 +++-------------------------------- src/main/java/Parser.java | 40 +++++++++++++++++++ src/main/java/Storage.java | 17 +++++++++ src/main/java/Ui.java | 32 ++++++++++++++++ 5 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/Ui.java diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index faa05ed563..c08dfb91cb 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,3 +1,4 @@ ************************************************* -1. [D][ ] die (by: Oct 15 2019) +1. [D][ ] (by: Oct 15 2020) +2. [E][ ] cry (from: 4pm to: 6pm) ************************************************* diff --git a/src/main/java/HewwoKitty.java b/src/main/java/HewwoKitty.java index 4e27f8344b..c908b4ed93 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/HewwoKitty.java @@ -6,76 +6,14 @@ public class HewwoKitty { public static void main(String[] args) { - printStart(); boolean isRunning = true; TaskList taskList = new TaskList(); - Scanner userInput = new Scanner(System.in); - while (isRunning) { - String userString = userInput.nextLine(); - if (userString.equals("bye")) { - isRunning = false; - printBye(); - } else { - if (userString.equals("list")) { - System.out.print(taskList); - } else if (userString.split(" ")[0].equals("mark")){ - int taskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.markDone(taskNum); - writeToFile(taskList); - } else if (userString.split(" ")[0].equals("unmark")) { - int taskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.unmarkDone(taskNum); - writeToFile(taskList); - } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks - taskList.addTask(userString); - writeToFile(taskList); - } else if (userString.contains("delete")) { - int i = Integer.parseInt(userString.split(" ")[1]); - taskList.removeTask(i); - writeToFile(taskList); - } else { - System.out.println("*************************************************"); - System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); - System.out.println("*************************************************"); - } - } - } - } - - public static void printStart() { - String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + - "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + - "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + - "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + - "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + - "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + - "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" + - "⠀⠀⠈⣷⣀⡀⠀⠘⠿⠇⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠿⠟⠀⠀⠀⠲⣾⠦⢤⠀\n" + - "⠀⠀⠋⠙⣧⣀⡀⠀⠀⠀⠀⠀⠀⠘⠦⠼⠃⠀⠀⠀⠀⠀⠀⠀⢤⣼⣏⠀⠀⠀\n" + - "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + - "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; - System.out.println(logo); - System.out.println("*************************************************"); - System.out.println("hewwo! i'm hewwo kitty!"); - System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); - System.out.println("*************************************************"); - } + Parser parser = new Parser(); - public static void printBye() { - System.out.println("*************************************************"); - System.out.println("goodbwye! uwu"); - System.out.println("*************************************************"); - } - - public static void writeToFile(TaskList tasks) { - File file = new File("./data/hewwoTasks.txt"); - file.getParentFile().mkdirs(); - - try (FileWriter writer = new FileWriter(file, false)) { - writer.write(tasks.toString()); - writer.close(); - } catch (IOException e) { - System.out.println("An error occurred while writing to the file: " + e.getMessage()); + Ui.printStart(); + while (isRunning) { + isRunning = parser.parseCommands(taskList); } + Ui.printBye(); } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..5a3e77371d --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,40 @@ +import java.util.Scanner; + +public class Parser { + private Scanner scanner; + private String userInput = ""; + + public Parser() { + this.scanner = new Scanner(System.in); + } + + public boolean parseCommands(TaskList taskList) { + this.userInput = this.scanner.nextLine(); //if input isn't valid, return false + String userString = this.userInput; + if (userString.equals("bye")) { + return false; + } else { + if (userString.equals("list")) { + System.out.print(taskList); + } else if (userString.split(" ")[0].equals("mark")){ + int taskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.markDone(taskNum); + Storage.writeToFile(taskList); + } else if (userString.split(" ")[0].equals("unmark")) { + int taskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.unmarkDone(taskNum); + Storage.writeToFile(taskList); + } else if (userString.contains("todo") || userString.contains("deadline") || userString.contains("event")) { // add tasks + taskList.addTask(userString); + Storage.writeToFile(taskList); + } else if (userString.contains("delete")) { + int i = Integer.parseInt(userString.split(" ")[1]); + taskList.removeTask(i); + Storage.writeToFile(taskList); + } else { + Ui.printInvalidCommand(); + } + } + return true; + } +} diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..e62dab3a7b --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,17 @@ +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class Storage { + public static void writeToFile(TaskList tasks) { + File file = new File("./data/hewwoTasks.txt"); + file.getParentFile().mkdirs(); + + try (FileWriter writer = new FileWriter(file, false)) { + writer.write(tasks.toString()); + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while writing to the file: " + e.getMessage()); + } + } +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..7518ef591e --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,32 @@ +public class Ui { + public static void printStart() { + String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + + "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + + "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + + "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + + "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" + + "⠀⠀⠈⣷⣀⡀⠀⠘⠿⠇⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠿⠟⠀⠀⠀⠲⣾⠦⢤⠀\n" + + "⠀⠀⠋⠙⣧⣀⡀⠀⠀⠀⠀⠀⠀⠘⠦⠼⠃⠀⠀⠀⠀⠀⠀⠀⢤⣼⣏⠀⠀⠀\n" + + "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + + "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; + System.out.println(logo); + System.out.println("*************************************************"); + System.out.println("hewwo! i'm hewwo kitty!"); + System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); + System.out.println("*************************************************"); + } + + public static void printBye() { + System.out.println("*************************************************"); + System.out.println("goodbwye! uwu"); + System.out.println("*************************************************"); + } + + public static void printInvalidCommand() { + System.out.println("*************************************************"); + System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); + System.out.println("*************************************************"); + } +} From df05bfe40d82cf4e393215dbbb958c225352618d Mon Sep 17 00:00:00 2001 From: reaneechua Date: Sun, 23 Feb 2025 00:44:17 +0800 Subject: [PATCH 25/43] Add classes into packages --- data/hewwoTasks.txt | 4 ++-- src/main/java/{ => hewwokitty}/HewwoKitty.java | 10 +++++----- src/main/java/{ => hewwokitty/parser}/Parser.java | 5 +++++ src/main/java/{ => hewwokitty/storage}/Storage.java | 3 +++ src/main/java/{ => hewwokitty/task}/Deadline.java | 3 +++ src/main/java/{ => hewwokitty/task}/Event.java | 2 ++ src/main/java/{ => hewwokitty/task}/Task.java | 2 ++ src/main/java/{ => hewwokitty/task}/TaskList.java | 2 ++ src/main/java/{ => hewwokitty/task}/Todo.java | 2 ++ src/main/java/{ => hewwokitty/ui}/Ui.java | 8 ++++++++ 10 files changed, 34 insertions(+), 7 deletions(-) rename src/main/java/{ => hewwokitty}/HewwoKitty.java (72%) rename src/main/java/{ => hewwokitty/parser}/Parser.java (92%) rename src/main/java/{ => hewwokitty/storage}/Storage.java (89%) rename src/main/java/{ => hewwokitty/task}/Deadline.java (92%) rename src/main/java/{ => hewwokitty/task}/Event.java (94%) rename src/main/java/{ => hewwokitty/task}/Task.java (97%) rename src/main/java/{ => hewwokitty/task}/TaskList.java (98%) rename src/main/java/{ => hewwokitty/task}/Todo.java (88%) rename src/main/java/{ => hewwokitty/ui}/Ui.java (87%) diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index c08dfb91cb..f4fc4870c0 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,4 +1,4 @@ ************************************************* -1. [D][ ] (by: Oct 15 2020) -2. [E][ ] cry (from: 4pm to: 6pm) +1. [D][X] die (by: Aug 3 2019) +2. [T][ ] cry ************************************************* diff --git a/src/main/java/HewwoKitty.java b/src/main/java/hewwokitty/HewwoKitty.java similarity index 72% rename from src/main/java/HewwoKitty.java rename to src/main/java/hewwokitty/HewwoKitty.java index c908b4ed93..4d706fb469 100644 --- a/src/main/java/HewwoKitty.java +++ b/src/main/java/hewwokitty/HewwoKitty.java @@ -1,8 +1,8 @@ -import java.util.ArrayList; -import java.util.Scanner; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +package hewwokitty; + +import hewwokitty.task.TaskList; +import hewwokitty.parser.Parser; +import hewwokitty.ui.Ui; public class HewwoKitty { public static void main(String[] args) { diff --git a/src/main/java/Parser.java b/src/main/java/hewwokitty/parser/Parser.java similarity index 92% rename from src/main/java/Parser.java rename to src/main/java/hewwokitty/parser/Parser.java index 5a3e77371d..cfb5fb37b5 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -1,4 +1,9 @@ +package hewwokitty.parser; + import java.util.Scanner; +import hewwokitty.task.TaskList; +import hewwokitty.storage.Storage; +import hewwokitty.ui.Ui; public class Parser { private Scanner scanner; diff --git a/src/main/java/Storage.java b/src/main/java/hewwokitty/storage/Storage.java similarity index 89% rename from src/main/java/Storage.java rename to src/main/java/hewwokitty/storage/Storage.java index e62dab3a7b..8a8e8c6391 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/hewwokitty/storage/Storage.java @@ -1,6 +1,9 @@ +package hewwokitty.storage; + import java.io.File; import java.io.FileWriter; import java.io.IOException; +import hewwokitty.task.TaskList; public class Storage { public static void writeToFile(TaskList tasks) { diff --git a/src/main/java/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java similarity index 92% rename from src/main/java/Deadline.java rename to src/main/java/hewwokitty/task/Deadline.java index 45a97692ed..30b9f18421 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -1,5 +1,8 @@ +package hewwokitty.task; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import hewwokitty.ui.Ui; public class Deadline extends Task { private LocalDate deadline; diff --git a/src/main/java/Event.java b/src/main/java/hewwokitty/task/Event.java similarity index 94% rename from src/main/java/Event.java rename to src/main/java/hewwokitty/task/Event.java index bd533ec17a..4066e70511 100644 --- a/src/main/java/Event.java +++ b/src/main/java/hewwokitty/task/Event.java @@ -1,3 +1,5 @@ +package hewwokitty.task; + public class Event extends Task { private String fromDate; private String toDate; diff --git a/src/main/java/Task.java b/src/main/java/hewwokitty/task/Task.java similarity index 97% rename from src/main/java/Task.java rename to src/main/java/hewwokitty/task/Task.java index fd9765b9da..c0dd9b8def 100644 --- a/src/main/java/Task.java +++ b/src/main/java/hewwokitty/task/Task.java @@ -1,3 +1,5 @@ +package hewwokitty.task; + public abstract class Task { private boolean isDone; private String description; diff --git a/src/main/java/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java similarity index 98% rename from src/main/java/TaskList.java rename to src/main/java/hewwokitty/task/TaskList.java index eb962ad241..0bf7cdf0f8 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -1,3 +1,5 @@ +package hewwokitty.task; + import java.util.ArrayList; public class TaskList { diff --git a/src/main/java/Todo.java b/src/main/java/hewwokitty/task/Todo.java similarity index 88% rename from src/main/java/Todo.java rename to src/main/java/hewwokitty/task/Todo.java index 1bb0260037..61e9c48e07 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/hewwokitty/task/Todo.java @@ -1,3 +1,5 @@ +package hewwokitty.task; + public class Todo extends Task { public Todo(String message) { super(message); diff --git a/src/main/java/Ui.java b/src/main/java/hewwokitty/ui/Ui.java similarity index 87% rename from src/main/java/Ui.java rename to src/main/java/hewwokitty/ui/Ui.java index 7518ef591e..aea40b79ae 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -1,3 +1,5 @@ +package hewwokitty.ui; + public class Ui { public static void printStart() { String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + @@ -29,4 +31,10 @@ public static void printInvalidCommand() { System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); System.out.println("*************************************************"); } + + public static void printInvalidDate() { + System.out.println("*************************************************"); + System.out.println("date and time entewed shouwd be in yyyy-MM-dd HHmm Date: Wed, 26 Feb 2025 19:58:25 +0800 Subject: [PATCH 26/43] Add load data from file hewwoTasks.txt, and some OOP fixes --- data/hewwoTasks.txt | 3 +- src/main/java/data/hewwoTasks.txt | 4 + src/main/java/hewwokitty/HewwoKitty.class | Bin 0 -> 649 bytes src/main/java/hewwokitty/HewwoKitty.java | 3 +- src/main/java/hewwokitty/parser/Parser.class | Bin 0 -> 2011 bytes src/main/java/hewwokitty/parser/Parser.java | 51 ++++++----- .../java/hewwokitty/storage/Storage.class | Bin 0 -> 3211 bytes src/main/java/hewwokitty/storage/Storage.java | 80 +++++++++++++++++- src/main/java/hewwokitty/task/Deadline.class | Bin 0 -> 1658 bytes src/main/java/hewwokitty/task/Deadline.java | 19 +++-- src/main/java/hewwokitty/task/Event.class | Bin 0 -> 1087 bytes src/main/java/hewwokitty/task/Event.java | 13 ++- src/main/java/hewwokitty/task/Task.class | Bin 0 -> 1896 bytes src/main/java/hewwokitty/task/Task.java | 15 ++++ src/main/java/hewwokitty/task/TaskList.class | Bin 0 -> 3703 bytes src/main/java/hewwokitty/task/TaskList.java | 54 +++++++++--- src/main/java/hewwokitty/task/Todo.class | Bin 0 -> 860 bytes src/main/java/hewwokitty/task/Todo.java | 5 ++ src/main/java/hewwokitty/ui/Ui.class | Bin 0 -> 2146 bytes src/main/java/hewwokitty/ui/Ui.java | 8 +- 20 files changed, 206 insertions(+), 49 deletions(-) create mode 100644 src/main/java/data/hewwoTasks.txt create mode 100644 src/main/java/hewwokitty/HewwoKitty.class create mode 100644 src/main/java/hewwokitty/parser/Parser.class create mode 100644 src/main/java/hewwokitty/storage/Storage.class create mode 100644 src/main/java/hewwokitty/task/Deadline.class create mode 100644 src/main/java/hewwokitty/task/Event.class create mode 100644 src/main/java/hewwokitty/task/Task.class create mode 100644 src/main/java/hewwokitty/task/TaskList.class create mode 100644 src/main/java/hewwokitty/task/Todo.class create mode 100644 src/main/java/hewwokitty/ui/Ui.class diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index f4fc4870c0..8ca2f94695 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,4 +1,3 @@ ************************************************* -1. [D][X] die (by: Aug 3 2019) -2. [T][ ] cry +1. [D][ ] die (by: Oct 10 2019) ************************************************* diff --git a/src/main/java/data/hewwoTasks.txt b/src/main/java/data/hewwoTasks.txt new file mode 100644 index 0000000000..5d7b4f66fa --- /dev/null +++ b/src/main/java/data/hewwoTasks.txt @@ -0,0 +1,4 @@ +E|1|sleep|6pm|8pm +D|1|drugs|2019-10-10 +D|0|meow |2018-08-08 +T|0|sleep diff --git a/src/main/java/hewwokitty/HewwoKitty.class b/src/main/java/hewwokitty/HewwoKitty.class new file mode 100644 index 0000000000000000000000000000000000000000..1e7620f82c4348f7cf4aacac6340eb7305409b2e GIT binary patch literal 649 zcmZ{i%}(1u5Xb-Pm@IV`LXw73Ahe_(B&e;AJ%BhA2_X?aq|i!jPn%?wF2Q!R-W2gD zeS)5QDN&JlfId)cr0pb% zWZX*`YK@0!%`XhoS@VZ;g;h+`mvoN@f}%iH(5gnBk)K+>0Q*G&iIB}_o33RRMT%Xi zrdFSP-QOI;+rLEa^9B5aF{YM&K)ikPoBn~H|No7_9mmT!b&>_ic_f%8$}GJlB33bn Z6_n{%6^cN$-Ze^$qr{ODBv{T6l^dC6lk)%o literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/HewwoKitty.java b/src/main/java/hewwokitty/HewwoKitty.java index 4d706fb469..c705c9d5d1 100644 --- a/src/main/java/hewwokitty/HewwoKitty.java +++ b/src/main/java/hewwokitty/HewwoKitty.java @@ -1,5 +1,6 @@ package hewwokitty; +import hewwokitty.storage.Storage; import hewwokitty.task.TaskList; import hewwokitty.parser.Parser; import hewwokitty.ui.Ui; @@ -7,7 +8,7 @@ public class HewwoKitty { public static void main(String[] args) { boolean isRunning = true; - TaskList taskList = new TaskList(); + TaskList taskList = Storage.readFromFile(); Parser parser = new Parser(); Ui.printStart(); diff --git a/src/main/java/hewwokitty/parser/Parser.class b/src/main/java/hewwokitty/parser/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..01f6917fe17f21dde1d83f9c3ca4393168f7ef7f GIT binary patch literal 2011 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 G(CNQU7^?*U literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java index 30b9f18421..0338be7542 100644 --- a/src/main/java/hewwokitty/task/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -2,15 +2,25 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + import hewwokitty.ui.Ui; public class Deadline extends Task { private LocalDate deadline; - public Deadline(String message) { - super(message.split("/")[0]); - String dateEntered = message.split("/")[1].split(" ",2)[1]; - this.deadline = LocalDate.parse(dateEntered); + public Deadline(String description, String dateEntered) { + super(description); + try { + this.deadline = LocalDate.parse(dateEntered); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException(""); + } + } + + @Override + public String writeToFile() { + return "D|" + super.writeToFile() + "|" + this.deadline + "\n"; } @Override @@ -21,5 +31,4 @@ public String toString() { private String printDeadline() { return this.deadline.format(DateTimeFormatter.ofPattern("MMM d yyyy")); } - } diff --git a/src/main/java/hewwokitty/task/Event.class b/src/main/java/hewwokitty/task/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..eb06b1f0ec1115bdbee0fa4a821f9389c6894c4f GIT binary patch literal 1087 zcma)5U2hUW6g>mT!ggEgO088}Tcrxy57d|##rPn$QG@ybsSk}01B_+MvO{(U2#G($ zpP@;cCVlV+_@j(>Sz^)M7&FP8x%ZxX=FH5UA3x8(19*&wI-RaQH3F`WSC7qvt3&~XLwSK;{GR6 zI$%guWt(=&)ofS18}ypOYw)H+k-3p)E76eqcHrfUr6?n5RWj7Ypx5QVYl#r9?+t~k zb_4YW=5gDAjyVHHU@pUCSbQO+@|DN?Z-wf}wx3JmP6h=7o49M>3d{`dF)Ve&Xe7I~ zQsc7Xez!c~B{_e`8k6;xaNifC^~Mf0My zbp~c_pCV!HoFe&+V$^SB%}G9kOT?$s$Po(*+HuNYO&AGhogrnNQ2hy#=LE;s-yCVe uf+|_iqA_*pi#jb@m!}=_RG+{Sc4*d#VGCt!V+GgAU!cqlirt*pTfYELFAIYJ literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/Event.java b/src/main/java/hewwokitty/task/Event.java index 4066e70511..55369ef0ab 100644 --- a/src/main/java/hewwokitty/task/Event.java +++ b/src/main/java/hewwokitty/task/Event.java @@ -4,10 +4,15 @@ public class Event extends Task { private String fromDate; private String toDate; - public Event(String message) { - super(message.split("/")[0]); - this.fromDate = message.split("/")[1].split(" ", 2)[1]; - this.toDate = message.split("/")[2].split(" ", 2)[1]; + public Event(String message, String fromDate, String toDate) { + super(message); + this.fromDate = fromDate; + this.toDate = toDate; + } + + @Override + public String writeToFile() { + return "E|" + super.writeToFile() + "|" + this.fromDate + "|" + this.toDate + "\n"; } @Override diff --git a/src/main/java/hewwokitty/task/Task.class b/src/main/java/hewwokitty/task/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..3c7c7ffa82844abd9c51baf1a24882df4d561832 GIT binary patch literal 1896 zcmb7F?QRoC6g^`*_S)Gbut^#Sfo{?e9FyQuQocfIAv7gz0<=!~DB{P)9^%FJj^!O= zS?Ytd@4ydQ6)N$A2k1jpJ+td3j%=aUE8RPD=gd9#V`lu<-|yZ7xPm7+ILK#l9Lq)& zvN(?w3#&O?K+(dd4pD0sK6fCDzGC5Oj<{~>+RKP8E<&4+O3Ff(>I1>-r#eGW&yh$^iM~dWYt@}2&eMPgOmbeCGC}KJ6^NL zGumnSTJEZt#NL;BCnDYobi}zOU}+U6MEa6yx5_dGXLr4@cEMzAV+M0Jrty)DNlayM z%f@YN2wW`u-(LoIYMzbR| ztL^G4L7E}W3mm(xln!;vYwk#0Rh4iejZF*R*tiR3ls~|_RWEe+qzv4K*Qv>h%W0sr zTVa>o>v;>`vPVxJKXZ+8pSduljH7KEAH%h)K~3bwe#1EVXKLVLEP^uZj;$FIjf!HF%CDBOgc20-31c^&p4)co4@a1ZEmu zO>U^5?CD3ou5uJ=FVLaD(y&7~?2wpL=_x6GraYJ58pI4eTM0q<)gdJRX@3Uan?n95 zuy|N8KX|EXvUj24q&B^>R;_LZk9fbfm8!Lyyb4=EAX^)CFAOC!{iQ#Mo{#t>-1UM= zU51PC#`VF-`YcB_?sl7U2>fXuK5p-Ne{Fg$HoSVh#Cx`$!DE551NjY$P2kLjajAK} zPv!wj@Z+_MM!bX67N4^joS;0(*`){pOcefvD4c(TL?QVG$=|pnFiYtmMVX(Kcm-<2sWQm!yJR%Hl{NvEGC+fS4GAk9hA%#!953Fb(1nlxt^Kd*K# z`^(fO`!PnH{1s_u^tEHZrXdj(Z=8P+z&y*hz_KlJ1X_ft;KG5ArCvqG3vVMo%zhj& zPT~%vBZfRtd|x;=ZCj%@yrVJiNa|Jc6{r2ID`Z_|!;1g1X1U|+P}YgK=EnwE*BI_n iJQttQb}5pVBY8cNU;G0gFPQ%T literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/Task.java b/src/main/java/hewwokitty/task/Task.java index c0dd9b8def..ca2a813e83 100644 --- a/src/main/java/hewwokitty/task/Task.java +++ b/src/main/java/hewwokitty/task/Task.java @@ -9,6 +9,10 @@ public Task(String description) { this.isDone = false; } + public void markAsDoneFile() { + this.isDone = true; + } + public void markAsDone() { this.isDone = true; System.out.println("*************************************************"); @@ -32,6 +36,17 @@ private String printIsDone() { return "[ ] "; } + public String writeToFile() { + return this.getMarkAsInt() + "|" + this.description; + } + + private int getMarkAsInt() { + if (this.isDone) { + return 1; + } + return 0; + } + @Override public String toString() { return this.printIsDone() + this.description; diff --git a/src/main/java/hewwokitty/task/TaskList.class b/src/main/java/hewwokitty/task/TaskList.class new file mode 100644 index 0000000000000000000000000000000000000000..7a97d95e7c99c51fb6de79b5567d9f603b6f4078 GIT binary patch literal 3703 zcmb7GTXY-68U98W?|Qw79VIqVf)mjsjxVwWCUJ`GIwW>Xlt|`cha^y1*4D<}Sl%_# z%EI&lloaTdLJKA7owm4K+5)9=>zvce3lDwn=|f+74)1+#59bv3n_bzKEtLl8?99&0 zfBEMBzkhcA^5M!K035@+8oDv6;4TdTjMgKL)AB8;;EaYkoRv*VMOwok#$# zuZsIrjLX*v73UP(uOWi-8ZO|XiU$-tsG$X)R`8I9-S~_&`q_Fs3`51FhACts^gkn~ ztq25WrK4vhwbLK>fHiZ5wVOX9{%Jk{L|Rn8l(qYq{=XLK;gFR z?LLC6VNWN<-JE4l4@mKCOY>g9^St3psPnSulOQ#ec6mnChudz)!mEr4=A=S}~+XZ&k2(OMFBy>EE zCj@rYilUAual4K$NdqFL<0)Lx@nt;CIJr*7(eVtPC60_~WU>q@vuQ4vwkrj{B0z3b zTlLg>(XZgEI=V2eaQlkGl1HX0sl<%h(-_Y?*JgeY29pA$90=IR3+@FFM zbbK5A0!=3!$IZJrV?J%VGfpPoScmVZcu~ho_^ytZ@wAGoa&S$@FixoWo*aB%#}Dv? zjvwMjI)03w=y(M`)p4g3_?Z;=xj^s71=XpkcvUJdsrZHLU#k(MwLBBKmtBvRcTZk6 zr`%0bYb=Rua3JZLIm2~wtc_`t(#_<31Yr}AUK5J3;aILC% zu) z9*L9NGmSY0-LKWn(*laOnJf?4*YSqH&DP-sGe!qyCbsAliZRamq~W@iI{!2!gLpEQiQBSvFnZsNH9|9d3RyO0KFR=- zWaLoD_6C~|(shOh1f%uI8bGSUQ5%{NJu#uxCQ9-KjRXlo;LHu7xFM4Y-jt`tTLK3+ zjt0wKaAwW&hs)>2s4>M;U{S$4EXI`M%ogSa^rUT@x#6sl&zmI7%ayRoHv9wfv|(qm zX8xeBI8cqOVrG-##NxbJL%g!C*A9Vd6T?O}J5C-9DEN)Qp{o7W!X~iqqvdc5FHqgQ z*a%)<_*rCsD@Os`29@vphO#}vnOk|4;kOM!eX{v?ewQJKvAzpCn1)d*F0QuPk> z`(6Wsym2*fYnMd2D^g#A7VPa0MMM2{fj%Wl?+tIzBY*eu38HUil>Nc*d%0`uNA`vO zeu4dwXkA1vVcS)-1^bjG#5msWjax!;+{AICH?9l!Db333)cGSH`I8%p@;Sk$NCe>$ znnJz(;b=IrgDTh1bRCh4(eN^MrkC){@33nLPi~fL_E3*eL%xN2*Nv#x(Q>gnsxIRu z>Ylwpt@^T|@P;AnI(E}geNSzJh&#|1Q@{*uR3< z+KeY9^AUh#!Xb^PUNBF7Kq?4%H!S;oie9DWP^2Rj*^v$owU)#13J$e~9_|apn?rJ@ zb?qEr@H&C?m7rK!{aaVOYlTd}29AA9j4ab2?qjsZS>_X@);S(m+sG;Wn!QG7zr@@46}f40+(tu}I5+LJm%Vn*YhAA`dhOzW0mE!+xc~qF literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index 0bf7cdf0f8..e9175a618a 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -1,6 +1,7 @@ package hewwokitty.task; import java.util.ArrayList; +import hewwokitty.ui.Ui; public class TaskList { private ArrayList tasks; @@ -19,21 +20,34 @@ public void unmarkDone(int i) { public void addTask(String userString) { Task t = null; - if (userString.contains("todo")) { - String temp = userString.replaceFirst("todo", ""); - if (!temp.equals("")) { - t = new Todo(userString.split(" ", 2)[1]); - } else { - System.out.println("*************************************************"); - System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); - System.out.println("*************************************************"); - } - } else if (userString.contains("deadline")) { - t = new Deadline(userString.split(" ", 2)[1]); - } else { - t = new Event(userString.split(" ", 2)[1]); + String message; + String command = userString.split(" ")[0]; + String temp; + + switch (command) { + case "todo": + temp = userString.split(" ",2)[1]; + if (!temp.equals("")) { + t = new Todo(temp); + } else { + Ui.printInvalidDescription(); + } + break; + case "deadline": + temp = userString.split(" ",2)[1]; + message = temp.split("/")[0]; + String date = temp.split("/")[1].split(" ",2)[1]; + t = new Deadline(message, date); + break; + case "event": + temp = userString.split(" ",2)[1]; + message = temp.split("/")[0]; + String fromDate = temp.split("/")[1].split(" ",2)[1]; + String toDate = temp.split("/")[2].split(" ",2)[1]; + t = new Event(message, fromDate, toDate); + break; } - if (!(t == null)) { //if not null, add to list + if (t != null) { this.tasks.add(t); System.out.println("*************************************************"); System.out.println("i've added youw new task: \n" + t); @@ -50,6 +64,18 @@ public void removeTask(int i) { System.out.println("*************************************************"); } + public void addTaskFromFile(Task task) { + this.tasks.add(task); + } + + public String writeToFile() { + String s = ""; + for (Task t : tasks) { + s = s + t.writeToFile(); + } + return s; + } + @Override public String toString() { String border = "*************************************************\n"; diff --git a/src/main/java/hewwokitty/task/Todo.class b/src/main/java/hewwokitty/task/Todo.class new file mode 100644 index 0000000000000000000000000000000000000000..01823fd68842c608f53b01fb5dc18c22bbf3b097 GIT binary patch literal 860 zcmaJfgc5PcKUI5kdFLO&=Ug_g7=L28a1f;bSV0x7^D791)Ln`G6vc6TFt($Hg)NO{X5V|WGdnlGXV(DUpy9&718XW3PHb6ky8^a^K4aiC6H^{<3{TMs0m+zFKYJU;Kq*cZKsGxsNPV5F~) z0~>AB>dSmW(dbl*;CA&m?#mRu>g$0%vIRX9vFgD?iLm}&Ym=B*j6O*-)Ptm4z>^}L zdU%Fi4{InD@tkW7M!eVgx&w+u!jQgp8f9e`tg&qbvfEcj(?!gczp%BWREwCt$UkY!3y(uWGLO? zi9J4VTp>4OG5osYSfpi=-INS`e#UZ3_%e%>nU}*l4(9xqc!er<@Q~v*KG|Tk&0G8E E4774gPW%;!->khKu2QS)jy!MQy!U&b^ZfU}f9?~} z8+1NThiTfRnK3#+ujJ_@&6;$|BxX|4q|+w7YSNrZXL58lNAm`au5g!&w+$LzSiEk~ z$YsxV3_5a!yUvHLdc|pcVpTT4$!|8eD^`Wo5C)mi$2)ECCnNHGcgxz~_GPbLw_Mwx zV_ELIPP5wJn}U0;K@)u^meA0vUaL`c-s9R%?ixS8Zf#lP^dcQGhW}A=J6*xH3ZvD@ zFtY-oRB~U*pOt*5!kbFVOBLQx@_`C=Rlim~gDX|%iIQK(E7Avq{6Wd@^a=s`jh63u zu%p6zs&gYn2%(<(l!g97b-v1;_0a)NZ}&LCJrzEV%)pNw6~O#2Q7C&V{4&w%hYs&5 znVuy=F#*k89e(GI3ZC@B*AYBc;iH~R_*X2voq^Vle32YH2hnx;w(5Ymp_AU(S791= z3?2NI#+%94a~ME!cjDxr40}m2^Gde_s*IrSMzxOX0DgbP4=~dw^Q|tphW=H_?@{*H zYk5oOD;51wNt8Q{F7Arha4#~*04QPJkGg1A1!%`K*XSxV6C8h*voN-+Tt7`Ulzr0xu)A*pW-`mcK@kPR)LB;+aOTag@YO>%K?{jlKL1Jywz zcNek&0U$o5u0M0MFiwk9%F)s|oug%gE|mW7gSoTj_`X+Ue7?>il6}sFXcrBd)2#JY zQ!tBF*DO)-1Z(+tqaRJ+HRy27^X!V>c8dDcpf@>Nv-~ZGxgO)TWBJU7GHZJ+-(kXU zbGOEX$C_4~U0l!%X4Ne2vX$2idfmq0^D+2*Og`p)2Ft>;Jyx}RcV4iH!<_mioXe

<0EjrAK7^4#J?9dO}3QG)9F)^ivv&M3)Lf zAKa(m(nA`-Ryfq#M|*oN!%qQcDW|Ofa)RI9&U4u%>V05uD!Q-ETCDgtV1FjRg3)EuDB0O~BD<^lEcV5k=c VK$QTs1gLX>T1F9$A?P7G{vY8sl7;{P literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index aea40b79ae..80cbbfcc58 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -32,9 +32,15 @@ public static void printInvalidCommand() { System.out.println("*************************************************"); } + public static void printInvalidDescription() { + System.out.println("*************************************************"); + System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); + System.out.println("*************************************************"); + } + public static void printInvalidDate() { System.out.println("*************************************************"); - System.out.println("date and time entewed shouwd be in yyyy-MM-dd HHmm Date: Thu, 27 Feb 2025 00:15:10 +0800 Subject: [PATCH 27/43] Create test cases for JUnit --- build.gradle | 5 ++-- data/hewwoTasks.txt | 4 +-- src/main/java/hewwokitty/HewwoKitty.class | Bin 649 -> 0 bytes src/main/java/hewwokitty/parser/Parser.class | Bin 2011 -> 0 bytes .../java/hewwokitty/storage/Storage.class | Bin 3211 -> 0 bytes src/main/java/hewwokitty/storage/Storage.java | 10 +++++-- src/main/java/hewwokitty/task/Deadline.class | Bin 1658 -> 0 bytes src/main/java/hewwokitty/task/Event.class | Bin 1087 -> 0 bytes src/main/java/hewwokitty/task/Task.class | Bin 1896 -> 0 bytes src/main/java/hewwokitty/task/TaskList.class | Bin 3703 -> 0 bytes src/main/java/hewwokitty/task/TaskList.java | 3 +++ src/main/java/hewwokitty/task/Todo.class | Bin 860 -> 0 bytes src/main/java/hewwokitty/ui/Ui.class | Bin 2146 -> 0 bytes src/main/java/hewwokitty/ui/Ui.java | 21 +++++++-------- .../java/hewwokitty/storage/StorageTest.java | 25 ++++++++++++++++++ .../java/hewwokitty/task/TaskListTest.java | 16 +++++++++++ 16 files changed, 65 insertions(+), 19 deletions(-) delete mode 100644 src/main/java/hewwokitty/HewwoKitty.class delete mode 100644 src/main/java/hewwokitty/parser/Parser.class delete mode 100644 src/main/java/hewwokitty/storage/Storage.class delete mode 100644 src/main/java/hewwokitty/task/Deadline.class delete mode 100644 src/main/java/hewwokitty/task/Event.class delete mode 100644 src/main/java/hewwokitty/task/Task.class delete mode 100644 src/main/java/hewwokitty/task/TaskList.class delete mode 100644 src/main/java/hewwokitty/task/Todo.class delete mode 100644 src/main/java/hewwokitty/ui/Ui.class create mode 100644 src/test/java/hewwokitty/storage/StorageTest.java create mode 100644 src/test/java/hewwokitty/task/TaskListTest.java diff --git a/build.gradle b/build.gradle index c361f9811e..2a1ade257c 100644 --- a/build.gradle +++ b/build.gradle @@ -28,12 +28,13 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("hewwokitty.HewwoKitty") } shadowJar { - archiveBaseName = "duke" + archiveBaseName = "hewwokitty" archiveClassifier = null + archiveFileName = "hewwokitty.jar" } run{ diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index 8ca2f94695..687d14690c 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,3 +1 @@ -************************************************* -1. [D][ ] die (by: Oct 10 2019) -************************************************* +T|0|cry diff --git a/src/main/java/hewwokitty/HewwoKitty.class b/src/main/java/hewwokitty/HewwoKitty.class deleted file mode 100644 index 1e7620f82c4348f7cf4aacac6340eb7305409b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmZ{i%}(1u5Xb-Pm@IV`LXw73Ahe_(B&e;AJ%BhA2_X?aq|i!jPn%?wF2Q!R-W2gD zeS)5QDN&JlfId)cr0pb% zWZX*`YK@0!%`XhoS@VZ;g;h+`mvoN@f}%iH(5gnBk)K+>0Q*G&iIB}_o33RRMT%Xi zrdFSP-QOI;+rLEa^9B5aF{YM&K)ikPoBn~H|No7_9mmT!b&>_ic_f%8$}GJlB33bn Z6_n{%6^cN$-Ze^$qr{ODBv{T6l^dC6lk)%o diff --git a/src/main/java/hewwokitty/parser/Parser.class b/src/main/java/hewwokitty/parser/Parser.class deleted file mode 100644 index 01f6917fe17f21dde1d83f9c3ca4393168f7ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2011 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 G(CNQU7^?*U diff --git a/src/main/java/hewwokitty/task/Event.class b/src/main/java/hewwokitty/task/Event.class deleted file mode 100644 index eb06b1f0ec1115bdbee0fa4a821f9389c6894c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcma)5U2hUW6g>mT!ggEgO088}Tcrxy57d|##rPn$QG@ybsSk}01B_+MvO{(U2#G($ zpP@;cCVlV+_@j(>Sz^)M7&FP8x%ZxX=FH5UA3x8(19*&wI-RaQH3F`WSC7qvt3&~XLwSK;{GR6 zI$%guWt(=&)ofS18}ypOYw)H+k-3p)E76eqcHrfUr6?n5RWj7Ypx5QVYl#r9?+t~k zb_4YW=5gDAjyVHHU@pUCSbQO+@|DN?Z-wf}wx3JmP6h=7o49M>3d{`dF)Ve&Xe7I~ zQsc7Xez!c~B{_e`8k6;xaNifC^~Mf0My zbp~c_pCV!HoFe&+V$^SB%}G9kOT?$s$Po(*+HuNYO&AGhogrnNQ2hy#=LE;s-yCVe uf+|_iqA_*pi#jb@m!}=_RG+{Sc4*d#VGCt!V+GgAU!cqlirt*pTfYELFAIYJ diff --git a/src/main/java/hewwokitty/task/Task.class b/src/main/java/hewwokitty/task/Task.class deleted file mode 100644 index 3c7c7ffa82844abd9c51baf1a24882df4d561832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmb7F?QRoC6g^`*_S)Gbut^#Sfo{?e9FyQuQocfIAv7gz0<=!~DB{P)9^%FJj^!O= zS?Ytd@4ydQ6)N$A2k1jpJ+td3j%=aUE8RPD=gd9#V`lu<-|yZ7xPm7+ILK#l9Lq)& zvN(?w3#&O?K+(dd4pD0sK6fCDzGC5Oj<{~>+RKP8E<&4+O3Ff(>I1>-r#eGW&yh$^iM~dWYt@}2&eMPgOmbeCGC}KJ6^NL zGumnSTJEZt#NL;BCnDYobi}zOU}+U6MEa6yx5_dGXLr4@cEMzAV+M0Jrty)DNlayM z%f@YN2wW`u-(LoIYMzbR| ztL^G4L7E}W3mm(xln!;vYwk#0Rh4iejZF*R*tiR3ls~|_RWEe+qzv4K*Qv>h%W0sr zTVa>o>v;>`vPVxJKXZ+8pSduljH7KEAH%h)K~3bwe#1EVXKLVLEP^uZj;$FIjf!HF%CDBOgc20-31c^&p4)co4@a1ZEmu zO>U^5?CD3ou5uJ=FVLaD(y&7~?2wpL=_x6GraYJ58pI4eTM0q<)gdJRX@3Uan?n95 zuy|N8KX|EXvUj24q&B^>R;_LZk9fbfm8!Lyyb4=EAX^)CFAOC!{iQ#Mo{#t>-1UM= zU51PC#`VF-`YcB_?sl7U2>fXuK5p-Ne{Fg$HoSVh#Cx`$!DE551NjY$P2kLjajAK} zPv!wj@Z+_MM!bX67N4^joS;0(*`){pOcefvD4c(TL?QVG$=|pnFiYtmMVX(Kcm-<2sWQm!yJR%Hl{NvEGC+fS4GAk9hA%#!953Fb(1nlxt^Kd*K# z`^(fO`!PnH{1s_u^tEHZrXdj(Z=8P+z&y*hz_KlJ1X_ft;KG5ArCvqG3vVMo%zhj& zPT~%vBZfRtd|x;=ZCj%@yrVJiNa|Jc6{r2ID`Z_|!;1g1X1U|+P}YgK=EnwE*BI_n iJQttQb}5pVBY8cNU;G0gFPQ%T diff --git a/src/main/java/hewwokitty/task/TaskList.class b/src/main/java/hewwokitty/task/TaskList.class deleted file mode 100644 index 7a97d95e7c99c51fb6de79b5567d9f603b6f4078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3703 zcmb7GTXY-68U98W?|Qw79VIqVf)mjsjxVwWCUJ`GIwW>Xlt|`cha^y1*4D<}Sl%_# z%EI&lloaTdLJKA7owm4K+5)9=>zvce3lDwn=|f+74)1+#59bv3n_bzKEtLl8?99&0 zfBEMBzkhcA^5M!K035@+8oDv6;4TdTjMgKL)AB8;;EaYkoRv*VMOwok#$# zuZsIrjLX*v73UP(uOWi-8ZO|XiU$-tsG$X)R`8I9-S~_&`q_Fs3`51FhACts^gkn~ ztq25WrK4vhwbLK>fHiZ5wVOX9{%Jk{L|Rn8l(qYq{=XLK;gFR z?LLC6VNWN<-JE4l4@mKCOY>g9^St3psPnSulOQ#ec6mnChudz)!mEr4=A=S}~+XZ&k2(OMFBy>EE zCj@rYilUAual4K$NdqFL<0)Lx@nt;CIJr*7(eVtPC60_~WU>q@vuQ4vwkrj{B0z3b zTlLg>(XZgEI=V2eaQlkGl1HX0sl<%h(-_Y?*JgeY29pA$90=IR3+@FFM zbbK5A0!=3!$IZJrV?J%VGfpPoScmVZcu~ho_^ytZ@wAGoa&S$@FixoWo*aB%#}Dv? zjvwMjI)03w=y(M`)p4g3_?Z;=xj^s71=XpkcvUJdsrZHLU#k(MwLBBKmtBvRcTZk6 zr`%0bYb=Rua3JZLIm2~wtc_`t(#_<31Yr}AUK5J3;aILC% zu) z9*L9NGmSY0-LKWn(*laOnJf?4*YSqH&DP-sGe!qyCbsAliZRamq~W@iI{!2!gLpEQiQBSvFnZsNH9|9d3RyO0KFR=- zWaLoD_6C~|(shOh1f%uI8bGSUQ5%{NJu#uxCQ9-KjRXlo;LHu7xFM4Y-jt`tTLK3+ zjt0wKaAwW&hs)>2s4>M;U{S$4EXI`M%ogSa^rUT@x#6sl&zmI7%ayRoHv9wfv|(qm zX8xeBI8cqOVrG-##NxbJL%g!C*A9Vd6T?O}J5C-9DEN)Qp{o7W!X~iqqvdc5FHqgQ z*a%)<_*rCsD@Os`29@vphO#}vnOk|4;kOM!eX{v?ewQJKvAzpCn1)d*F0QuPk> z`(6Wsym2*fYnMd2D^g#A7VPa0MMM2{fj%Wl?+tIzBY*eu38HUil>Nc*d%0`uNA`vO zeu4dwXkA1vVcS)-1^bjG#5msWjax!;+{AICH?9l!Db333)cGSH`I8%p@;Sk$NCe>$ znnJz(;b=IrgDTh1bRCh4(eN^MrkC){@33nLPi~fL_E3*eL%xN2*Nv#x(Q>gnsxIRu z>Ylwpt@^T|@P;AnI(E}geNSzJh&#|1Q@{*uR3< z+KeY9^AUh#!Xb^PUNBF7Kq?4%H!S;oie9DWP^2Rj*^v$owU)#13J$e~9_|apn?rJ@ zb?qEr@H&C?m7rK!{aaVOYlTd}29AA9j4ab2?qjsZS>_X@);S(m+sG;Wn!QG7zr@@46}f40+(tu}I5+LJm%Vn*YhAA`dhOzW0mE!+xc~qF diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index e9175a618a..bb8e6aa296 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -10,6 +10,9 @@ public TaskList() { this.tasks = new ArrayList(); } + public int getSize() { + return this.tasks.size(); + } public void markDone(int i) { this.tasks.get(i-1).markAsDone(); } diff --git a/src/main/java/hewwokitty/task/Todo.class b/src/main/java/hewwokitty/task/Todo.class deleted file mode 100644 index 01823fd68842c608f53b01fb5dc18c22bbf3b097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmaJfgc5PcKUI5kdFLO&=Ug_g7=L28a1f;bSV0x7^D791)Ln`G6vc6TFt($Hg)NO{X5V|WGdnlGXV(DUpy9&718XW3PHb6ky8^a^K4aiC6H^{<3{TMs0m+zFKYJU;Kq*cZKsGxsNPV5F~) z0~>AB>dSmW(dbl*;CA&m?#mRu>g$0%vIRX9vFgD?iLm}&Ym=B*j6O*-)Ptm4z>^}L zdU%Fi4{InD@tkW7M!eVgx&w+u!jQgp8f9e`tg&qbvfEcj(?!gczp%BWREwCt$UkY!3y(uWGLO? zi9J4VTp>4OG5osYSfpi=-INS`e#UZ3_%e%>nU}*l4(9xqc!er<@Q~v*KG|Tk&0G8E E4774gPW%;!->khKu2QS)jy!MQy!U&b^ZfU}f9?~} z8+1NThiTfRnK3#+ujJ_@&6;$|BxX|4q|+w7YSNrZXL58lNAm`au5g!&w+$LzSiEk~ z$YsxV3_5a!yUvHLdc|pcVpTT4$!|8eD^`Wo5C)mi$2)ECCnNHGcgxz~_GPbLw_Mwx zV_ELIPP5wJn}U0;K@)u^meA0vUaL`c-s9R%?ixS8Zf#lP^dcQGhW}A=J6*xH3ZvD@ zFtY-oRB~U*pOt*5!kbFVOBLQx@_`C=Rlim~gDX|%iIQK(E7Avq{6Wd@^a=s`jh63u zu%p6zs&gYn2%(<(l!g97b-v1;_0a)NZ}&LCJrzEV%)pNw6~O#2Q7C&V{4&w%hYs&5 znVuy=F#*k89e(GI3ZC@B*AYBc;iH~R_*X2voq^Vle32YH2hnx;w(5Ymp_AU(S791= z3?2NI#+%94a~ME!cjDxr40}m2^Gde_s*IrSMzxOX0DgbP4=~dw^Q|tphW=H_?@{*H zYk5oOD;51wNt8Q{F7Arha4#~*04QPJkGg1A1!%`K*XSxV6C8h*voN-+Tt7`Ulzr0xu)A*pW-`mcK@kPR)LB;+aOTag@YO>%K?{jlKL1Jywz zcNek&0U$o5u0M0MFiwk9%F)s|oug%gE|mW7gSoTj_`X+Ue7?>il6}sFXcrBd)2#JY zQ!tBF*DO)-1Z(+tqaRJ+HRy27^X!V>c8dDcpf@>Nv-~ZGxgO)TWBJU7GHZJ+-(kXU zbGOEX$C_4~U0l!%X4Ne2vX$2idfmq0^D+2*Og`p)2Ft>;Jyx}RcV4iH!<_mioXe

<0EjrAK7^4#J?9dO}3QG)9F)^ivv&M3)Lf zAKa(m(nA`-Ryfq#M|*oN!%qQcDW|Ofa)RI9&U4u%>V05uD!Q-ETCDgtV1FjRg3)EuDB0O~BD<^lEcV5k=c VK$QTs1gLX>T1F9$A?P7G{vY8sl7;{P diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index 80cbbfcc58..d1dc2ea384 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -2,21 +2,18 @@ public class Ui { public static void printStart() { - String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + - "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + - "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + - "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + - "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + - "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + - "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" + - "⠀⠀⠈⣷⣀⡀⠀⠘⠿⠇⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠿⠟⠀⠀⠀⠲⣾⠦⢤⠀\n" + - "⠀⠀⠋⠙⣧⣀⡀⠀⠀⠀⠀⠀⠀⠘⠦⠼⠃⠀⠀⠀⠀⠀⠀⠀⢤⣼⣏⠀⠀⠀\n" + - "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + - "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; + String logo = + ".__ __ .__ __ __ \n" + + "| |__ ______ _ ____ _ ______ | | _|__|/ |__/ |_ ___.__.\n" + + "| | \\_/ __ \\ \\/ \\/ /\\ \\/ \\/ / _ \\| |/ / \\ __\\ __< | |\n" + + "| Y \\ ___/\\ / \\ ( <_> ) <| || | | | \\___ |\n" + + "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" + + " \\/ \\/ \\/ \\/ \n"; + System.out.println(logo); System.out.println("*************************************************"); System.out.println("hewwo! i'm hewwo kitty!"); - System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuw"); + System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuwuwuwuwuuwuwuw"); System.out.println("*************************************************"); } diff --git a/src/test/java/hewwokitty/storage/StorageTest.java b/src/test/java/hewwokitty/storage/StorageTest.java new file mode 100644 index 0000000000..4a31d75345 --- /dev/null +++ b/src/test/java/hewwokitty/storage/StorageTest.java @@ -0,0 +1,25 @@ +package hewwokitty.storage; + +import hewwokitty.task.TaskList; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StorageTest { + @BeforeEach + void setup() { + TaskList tasks = new TaskList(); + tasks.addTask("todo cry"); + Storage.writeToFile(tasks); + } + + @Test + public void testReadFromFile() { + TaskList tasks = new TaskList(); + tasks.addTask("todo cry"); + Storage.writeToFile(tasks); + + TaskList tasks2 = Storage.readFromFile(); + assertEquals(tasks.getSize(), tasks2.getSize()); + } +} diff --git a/src/test/java/hewwokitty/task/TaskListTest.java b/src/test/java/hewwokitty/task/TaskListTest.java new file mode 100644 index 0000000000..b6d1ba9eae --- /dev/null +++ b/src/test/java/hewwokitty/task/TaskListTest.java @@ -0,0 +1,16 @@ +package hewwokitty.task; + +import java.util.ArrayList; + +import hewwokitty.storage.Storage; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TaskListTest { + @Test + public void testAddTask() { + TaskList taskList = new TaskList(); + taskList.addTask("todo cry"); + assertEquals(taskList.getSize(), 1); + } +} From 899821e43eaf2505eee1b80226401fc2dc8c496a Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 00:18:07 +0800 Subject: [PATCH 28/43] Add JUnit tests for TaskList and Storage --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1afe9d80ec..38cb70c5ea 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT -/.class +.class From 2f95648fa905fe10c5cf1e9b60c0beae34b49590 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 00:20:05 +0800 Subject: [PATCH 29/43] Add JUnit tests for TaskList and Storage --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 38cb70c5ea..1afe9d80ec 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT -.class +/.class From da7e32a0d6a50887855f2fed7e9f2ec3dbfb7bf7 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 04:23:15 +0800 Subject: [PATCH 30/43] Add Javadocs for all public methods --- src/main/java/hewwokitty/parser/Parser.java | 12 ++++++ src/main/java/hewwokitty/storage/Storage.java | 13 ++++++ src/main/java/hewwokitty/task/Deadline.java | 18 ++++++++- src/main/java/hewwokitty/task/Event.java | 18 +++++++++ src/main/java/hewwokitty/task/Task.java | 29 ++++++++++++++ src/main/java/hewwokitty/task/TaskList.java | 40 +++++++++++++++++++ src/main/java/hewwokitty/task/Todo.java | 15 +++++++ src/main/java/hewwokitty/ui/Ui.java | 20 ++++++++++ 8 files changed, 164 insertions(+), 1 deletion(-) diff --git a/src/main/java/hewwokitty/parser/Parser.java b/src/main/java/hewwokitty/parser/Parser.java index 83d116d1aa..d50a468fba 100644 --- a/src/main/java/hewwokitty/parser/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -5,14 +5,26 @@ import hewwokitty.storage.Storage; import hewwokitty.ui.Ui; +/** + * Parser parses user input + * Allows user to interact with the chatbot + */ public class Parser { private Scanner scanner; private String userInput = ""; + /** + * Returns a Parser object that reads input from the user + */ public Parser() { this.scanner = new Scanner(System.in); } + /** + * Returns a boolean value indicating whether a command is valid and has been executed + * @param taskList - TaskList from main that consists of Tasks that have been added by the user + * @return false if command user input is "bye", else true + */ public boolean parseCommands(TaskList taskList) { this.userInput = this.scanner.nextLine(); String userString = this.userInput.toLowerCase(); diff --git a/src/main/java/hewwokitty/storage/Storage.java b/src/main/java/hewwokitty/storage/Storage.java index 005decb24b..875368f20f 100644 --- a/src/main/java/hewwokitty/storage/Storage.java +++ b/src/main/java/hewwokitty/storage/Storage.java @@ -13,7 +13,16 @@ import hewwokitty.task.Event; import hewwokitty.task.Deadline; +/** + * Responsible for writing Tasks to and reading Tasks from file + * The created file is located at "data/hewwoTasks.txt" by default + */ public class Storage { + /** + * Saves all the files in a given TaskList to file + * File is located at data/hewwoTasks.txt + * @param tasks TaskList generated by user + */ public static void writeToFile(TaskList tasks) { File file = new File("./data/hewwoTasks.txt"); file.getParentFile().mkdirs(); @@ -26,6 +35,10 @@ public static void writeToFile(TaskList tasks) { } } + /** + * Reads all the tasks saved in data/hewwoTasks.txt and converts them to a TaskList + * @return All tasks in data/hewwoTasks.txt as a TaskList + */ public static TaskList readFromFile() { File file = new File("./data/hewwoTasks.txt"); TaskList taskList = new TaskList(); diff --git a/src/main/java/hewwokitty/task/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java index 0338be7542..251f83e1a3 100644 --- a/src/main/java/hewwokitty/task/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -3,12 +3,19 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; - import hewwokitty.ui.Ui; +/** + * Represents a type of Task that needs to be completed before a certain date + */ public class Deadline extends Task { private LocalDate deadline; + /** + * Returns a Deadline object + * @param description A string describing what the Deadline is for + * @param dateEntered A string in the format yyyy-MM-dd for when the task should be completed + */ public Deadline(String description, String dateEntered) { super(description); try { @@ -18,11 +25,20 @@ public Deadline(String description, String dateEntered) { } } + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Deadline, isDone, + * the deadline description and when it is due + */ @Override public String writeToFile() { return "D|" + super.writeToFile() + "|" + this.deadline + "\n"; } + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Deadline information to the user + */ @Override public String toString() { return "[D]" + super.toString() + "(by: " + this.printDeadline() + ")"; diff --git a/src/main/java/hewwokitty/task/Event.java b/src/main/java/hewwokitty/task/Event.java index 55369ef0ab..2010c85965 100644 --- a/src/main/java/hewwokitty/task/Event.java +++ b/src/main/java/hewwokitty/task/Event.java @@ -1,20 +1,38 @@ package hewwokitty.task; +/** + * Represents a type of Task that is an event carried out over a time period + */ public class Event extends Task { private String fromDate; private String toDate; + /** + * Returns an Event object + * @param message A string describing what the Event is about + * @param fromDate A string representing when the Event starts + * @param toDate A string representing when the Event ends + */ public Event(String message, String fromDate, String toDate) { super(message); this.fromDate = fromDate; this.toDate = toDate; } + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Event, isDone, + * fromDate and toDate + */ @Override public String writeToFile() { return "E|" + super.writeToFile() + "|" + this.fromDate + "|" + this.toDate + "\n"; } + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Event information to the user + */ @Override public String toString() { return "[E]" + super.toString() + "(from: " + this.fromDate + "to: " + this.toDate + ")"; diff --git a/src/main/java/hewwokitty/task/Task.java b/src/main/java/hewwokitty/task/Task.java index ca2a813e83..e85cfe4677 100644 --- a/src/main/java/hewwokitty/task/Task.java +++ b/src/main/java/hewwokitty/task/Task.java @@ -1,18 +1,33 @@ package hewwokitty.task; +/** + * Represents the task that user wants to keep track of, as an Object + */ public abstract class Task { private boolean isDone; private String description; + /** + * Returns a Task object containing the description + * @param description A String describing what the task is for + */ public Task(String description) { this.description = description; this.isDone = false; } + /** + * Marks a Task as completed when loading from file + * Does not print the Task completion message + */ public void markAsDoneFile() { this.isDone = true; } + /** + * Marks a Task as completed based on user input + * Prints a completion message + */ public void markAsDone() { this.isDone = true; System.out.println("*************************************************"); @@ -21,6 +36,10 @@ public void markAsDone() { System.out.println("*************************************************"); } + /** + * Unmarks a Task as completed + * Prints an incompletion message + */ public void unmarkAsDone() { this.isDone = false; System.out.println("*************************************************"); @@ -36,6 +55,11 @@ private String printIsDone() { return "[ ] "; } + /** + * Formats a string into the format meant to save to file + * The string displays isDone as 0 or 1 if it has been completed + * @return A String that has been formatted with isDone and the Task description + */ public String writeToFile() { return this.getMarkAsInt() + "|" + this.description; } @@ -47,6 +71,11 @@ private int getMarkAsInt() { return 0; } + /** + * Formats a string into the format that is displayed to the user + * The String displays isDone and the Task description + * @return A String to display the Task information to the user + */ @Override public String toString() { return this.printIsDone() + this.description; diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index bb8e6aa296..226db6f5fc 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -3,24 +3,48 @@ import java.util.ArrayList; import hewwokitty.ui.Ui; +/** + * A list of Task objects + */ public class TaskList { private ArrayList tasks; + /** + * Returns an empty TaskList + */ public TaskList() { this.tasks = new ArrayList(); } + /** + * Get the number of Tasks in a TaskList + * @return An int with the number of Tasks in the TaskList + */ public int getSize() { return this.tasks.size(); } + + /** + * Marks Task as done at a given order in the TaskList + * @param i An int representing the order of the Task in TaskList + */ public void markDone(int i) { this.tasks.get(i-1).markAsDone(); } + /** + * Unmarks Task as done at a given order in the TaskList + * @param i An int representing the order of the Task in TaskList + */ public void unmarkDone(int i) { this.tasks.get(i-1).unmarkAsDone(); } + /** + * Adds a Task to the TaskList based on the user specifications + * Checks user input and creates a Todo, Deadline or Event object accordingly + * @param userString A String that consists of the user input + */ public void addTask(String userString) { Task t = null; String message; @@ -59,6 +83,10 @@ public void addTask(String userString) { } } + /** + * Removes a Task from TaskList + * @param i An integer representing the order of the Task in the TaskList + */ public void removeTask(int i) { System.out.println("*************************************************"); System.out.println("i've wemoved youw task: \n" + this.tasks.get(i-1).toString()); @@ -67,10 +95,18 @@ public void removeTask(int i) { System.out.println("*************************************************"); } + /** + * Adds each Task in the data/hewwoTasks.txt file to a TaskList + * @param task A Task read from the data file + */ public void addTaskFromFile(Task task) { this.tasks.add(task); } + /** + * Formats all the Tasks in the TaskList to be written to an output file + * @return All the Tasks in TaskList as a String + */ public String writeToFile() { String s = ""; for (Task t : tasks) { @@ -79,6 +115,10 @@ public String writeToFile() { return s; } + /** + * Formats all the Taks in the TaskList to be displayed to the user + * @return All the Tasks in TaskList as a String + */ @Override public String toString() { String border = "*************************************************\n"; diff --git a/src/main/java/hewwokitty/task/Todo.java b/src/main/java/hewwokitty/task/Todo.java index ae10f4b236..4a65dd7fc9 100644 --- a/src/main/java/hewwokitty/task/Todo.java +++ b/src/main/java/hewwokitty/task/Todo.java @@ -1,15 +1,30 @@ package hewwokitty.task; +/** + * Represents a type of Task with a description + */ public class Todo extends Task { + /** + * Returns a Todo object + * @param message A string describing what the Todo is about + */ public Todo(String message) { super(message); } + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Todo, isDone and description + */ @Override public String writeToFile() { return "T|" + super.writeToFile() + "\n"; } + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Todo information to the user + */ @Override public String toString() { return "[T]" + super.toString(); diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index d1dc2ea384..2e27d443f5 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -1,6 +1,12 @@ package hewwokitty.ui; +/** + * Consists of all the interface text displayed to the user + */ public class Ui { + /** + * Displays the starting message upon launching the chatbot + */ public static void printStart() { String logo = ".__ __ .__ __ __ \n" + @@ -17,24 +23,38 @@ public static void printStart() { System.out.println("*************************************************"); } + /** + * Displays the closing message when user ends the chatbot + */ public static void printBye() { System.out.println("*************************************************"); System.out.println("goodbwye! uwu"); System.out.println("*************************************************"); } + /** + * Displays a message to the user when their command is not recognised + */ public static void printInvalidCommand() { System.out.println("*************************************************"); System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); System.out.println("*************************************************"); } + /** + * Displays a message to the user telling them that they have entered an invalid + * description for a Todo object + */ public static void printInvalidDescription() { System.out.println("*************************************************"); System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); System.out.println("*************************************************"); } + /** + * Displays a message to the user telling them that they have entered a date + * in an invalid format for a Deadline object + */ public static void printInvalidDate() { System.out.println("*************************************************"); System.out.println("date and time entewed shouwd be in yyyy-MM-dd Date: Thu, 27 Feb 2025 04:46:23 +0800 Subject: [PATCH 31/43] Add feature to find a task in tasklist by keyword --- src/main/java/data/hewwoTasks.txt | 5 +++-- src/main/java/hewwokitty/HewwoKitty.class | Bin 0 -> 649 bytes src/main/java/hewwokitty/parser/Parser.class | Bin 0 -> 2089 bytes src/main/java/hewwokitty/parser/Parser.java | 3 +++ src/main/java/hewwokitty/storage/Storage.class | Bin 0 -> 3328 bytes src/main/java/hewwokitty/task/Deadline.class | Bin 0 -> 1658 bytes src/main/java/hewwokitty/task/Event.class | Bin 0 -> 1088 bytes src/main/java/hewwokitty/task/Event.java | 2 +- src/main/java/hewwokitty/task/Task.class | Bin 0 -> 1956 bytes src/main/java/hewwokitty/task/Task.java | 7 +++++++ src/main/java/hewwokitty/task/TaskList.class | Bin 0 -> 4170 bytes src/main/java/hewwokitty/task/TaskList.java | 15 +++++++++++++++ src/main/java/hewwokitty/task/Todo.class | Bin 0 -> 860 bytes src/main/java/hewwokitty/ui/Ui.class | Bin 0 -> 1555 bytes 14 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/main/java/hewwokitty/HewwoKitty.class create mode 100644 src/main/java/hewwokitty/parser/Parser.class create mode 100644 src/main/java/hewwokitty/storage/Storage.class create mode 100644 src/main/java/hewwokitty/task/Deadline.class create mode 100644 src/main/java/hewwokitty/task/Event.class create mode 100644 src/main/java/hewwokitty/task/Task.class create mode 100644 src/main/java/hewwokitty/task/TaskList.class create mode 100644 src/main/java/hewwokitty/task/Todo.class create mode 100644 src/main/java/hewwokitty/ui/Ui.class diff --git a/src/main/java/data/hewwoTasks.txt b/src/main/java/data/hewwoTasks.txt index 5d7b4f66fa..1daac2144f 100644 --- a/src/main/java/data/hewwoTasks.txt +++ b/src/main/java/data/hewwoTasks.txt @@ -1,4 +1,5 @@ -E|1|sleep|6pm|8pm +E|0|sleep|6pm|8pm D|1|drugs|2019-10-10 D|0|meow |2018-08-08 -T|0|sleep +T|0|help +E|0|do drugs |5pm |7pm diff --git a/src/main/java/hewwokitty/HewwoKitty.class b/src/main/java/hewwokitty/HewwoKitty.class new file mode 100644 index 0000000000000000000000000000000000000000..1e7620f82c4348f7cf4aacac6340eb7305409b2e GIT binary patch literal 649 zcmZ{i%}(1u5Xb-Pm@IV`LXw73Ahe_(B&e;AJ%BhA2_X?aq|i!jPn%?wF2Q!R-W2gD zeS)5QDN&JlfId)cr0pb% zWZX*`YK@0!%`XhoS@VZ;g;h+`mvoN@f}%iH(5gnBk)K+>0Q*G&iIB}_o33RRMT%Xi zrdFSP-QOI;+rLEa^9B5aF{YM&K)ikPoBn~H|No7_9mmT!b&>_ic_f%8$}GJlB33bn Z6_n{%6^cN$-Ze^$qr{ODBv{T6l^dC6lk)%o literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/parser/Parser.class b/src/main/java/hewwokitty/parser/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..487308880f0a569ece2318ffbb0550ca2e46a73d GIT binary patch literal 2089 zcmaJ?+jA3D82_Cn&2F|!8@7$K$fZD`Y10sBOF-IEpcIX?rP^{Ab(hiVTFRGd%j>4E_Q7?)c=J556#dXBT9VYLaul^PThC-+tGVpB{dH zAHYt$t6(#FW$cKe4H*eLqu7NP6oj!`?DUCMzk=-;kg-R|K{4%>u}{eTGKORvkTERd zpo|w~yd)zl<7L5eNWln31#C>gVT>zy1+OZYz@%6m5z|o##}pjL389=6(sT#x3A+Q;U`=@H#4f2yyqpn!Jtgo6(`3J8iKEGT<|$th0!WHkz|011UeX2 zKI4dlH&y7E62P2_EofJf2Ul?hM8#TF6fmvAz*+KRYJm=BV3IQ?Swo_zJ2T{I#qt+n z*UsAva-QpXll)|;<+I!(WF*f`?$Sp1jA7+f6k$oQRg`c}yuy)CR^g%|VOGT)<|Qns zcnjxMyp4Gk7jThbqi4Mro&T%X4IHV9QVE(_0H=mlqjo42vP|r{1vBUM&!u>qW|bb7I*8 zQ3|{WBL;1Gq03scx@qJO=%O-_jvNie`C#OY)!(mquUM+h>3zv=9}1E~sGaNR+u zis)#UrqotZ7wR6X$%Io?s9zEleSW18y>;fAQ13tZz4bSeSHLd*L2?r5KffdSGrDhm zN-~F@$ODoNGSdf1eo*_P^D)V<*M)yMPV#z6TTw;*N4OHogcor>r8Rh}6BeqO(qf*P zs}<_$l(y1SCnG`~OKF;?4ogBEOlggtnvsRNEu}SiYJ1E>x2CkXr>}~6@K{QF&eNqB z;p5>OWDW3zH$%h(Jv4UE7^HE6MmaFvqxEN@o42tlSw-_AN))UrTEg8+Se>a&#wl>m zCzr5h5l4e3kz_nl#ajQQKiO5qI)A-wx3q-TMI?e~DH*4fZ155F0=;n&ktJ*j-vnbW zyTC4EJ=Kaxw1YJ?uSFf!QM%W&UTk0)Y+?gwV|%fMjiQ}RAi<8&f5u6=Jqze!MWom{ zY-KKb*aCXl1?(io9qcMH>>75l_pzIOh(7iS`q_01u+K5b7O|Jzz<%}>hOv#_*oLNu j;%eVcKUVL38XDAI7Hw%cBw@YOBK<`cGISHR20ecR+N1A# literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/parser/Parser.java b/src/main/java/hewwokitty/parser/Parser.java index d50a468fba..6b11f87adf 100644 --- a/src/main/java/hewwokitty/parser/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -59,6 +59,9 @@ public boolean parseCommands(TaskList taskList) { taskList.removeTask(deleteTaskNum); Storage.writeToFile(taskList); break; + case "find": + taskList.findTasks(userString); + break; default: Ui.printInvalidCommand(); break; diff --git a/src/main/java/hewwokitty/storage/Storage.class b/src/main/java/hewwokitty/storage/Storage.class new file mode 100644 index 0000000000000000000000000000000000000000..2561814659366b10ff1ae3643c2346a0f4499004 GIT binary patch literal 3328 zcma)8Yj7J^75=XESb4R!6Zz37uPV>_5nGAVI#h1cBz`n*{A%RJwUbgd(#G0Y-c_Vk zWcNX#Ewq$JDJ`@qX@N2w&p?<-7)EC5nJ_R+fAEX{{9*XRKYr5zV!peQZ6#6|G;{CW zd-j}jzjN+)j`mM?KD!Oz7=EteFit2q8NewObr_J-pqz#j469J^q>5&omQN#cdP>0= z6&gkrjMZZt6Dk@p8KSc(70=+Df@x`RLb`ZX!HkMF%*yG!oGt|LoQfE}ET`ucd_@YM zk{dmMi*ii_kPN_35yd41b1Dun(ObF6;R`LKASK~ezmw`XZ1OwN2+Q#f?fg5H8bsKNu{+Xn$#UV z>cW?pb3M+YBXv3DaaBVBivpoat7#c}R_ZKicmywKcu{Je1TEmaWgq^;pSnS&~LgS_oD86;EoL*CuJwnJA9%gyuF-Vt09#*=QgCq z1$L~Hxk1}1H>Fy*s!_=hAFY9_TC-XrZJWp*+0HhbY`AuhCV>?EST>lS2<+c18`HXK z&l}~|TDs?9J;C}~Qt&gzJ!;$Y`3(E%i0m%|X`L)(8a}ART=r4wWv6v3nKp9!ONRZ` zuqz~Y8BQ%_j2h~d_p_ewY8L}~Ivr=b?pN@Mz=5jxYGD)D{lE3Fhkvby`F{;~A>{uG z=cC;1;wrfMI#(cW@j>8W&VE@A|9`*+J|9{V+#DBtoKwgN?jZoz|{{HKrd zE8{RB9OD|oNeuEsqt1oYgCGyz0hM|o?B@I+_9H?Y8QX5^?xXe|3}G*(_~sb3ABKO8 zFFgvH71SyGk`W5DHLl(b5e2SP`2ymUg2pBW{UtnF3fl8LLvCVLKHmuX%qp5^R?sra zNLxRIuj}S2+Gd!(2gVrCwrk>LF5z(z^LqLM-J$J8?C|u){Cr}nc6xhb$}*Z_YFA9= zXLmSwGwhG4b$!9GTEv6DBxp=gsMv}zu?^#5A0|W(CPhD< z7AJ64oW?m3C#qRID-6tt46(h4^WrUB5O3o-@jepbI+EfOToRvRj?o+uw_y_focIG$ z;*YrOR>Qk!`44uuh0y$O1QfKbp#$|L0e1>w3gOEhz%tpj#)7MQ>FUJTG43!4+=!+o zZTlnt!pVPPe2v**snxlq)keMzZx&lwcu%o)*U^MuXXOslM~cd3)X*8~aXIYs-tgR@ upmYa~ZdF*UPn*!LxG{Mkf)pQjm7c)ITvhtGj-TQqUeeRt2e?1W5&tjzbrxIz literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/Deadline.class b/src/main/java/hewwokitty/task/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..9244c9286fa5a7bf02c645e4d555618b01b8491c GIT binary patch literal 1658 zcmaJ>TTc@~6#j-ww=7%0%1uB-1%!gsJ4zA7RupZ4q>aW9ABJ{-wcDM#I~7U%A^rnj zHBlg#=(|5kJ=+$$lw#A&&Ya74?&sIY|&QYK$8w8UkO5Id6uyizJ`2q(igETV+cif8jF zUM#;g++k?naZDvLa>?`rx+f-2LXw+GRtyqEkqoQEKezR?EICtHIf_IrJsgH z1CJ0lkicVx{%x_dBlD(GyHUm6eDo+L%1%8iLwqt`^Ykc7Jq>E*Rpx9h{C_oOXf1lN zQ;+zy;@jLwi?=0VXGN@9mAdB8v4khoA&C#{1JfD$3Oq03(#~@A(p1}Ya}~Fh%MkM; zAM2eu$cE)_Ur)Sd6C1m8BW#l4?x|S*&TI%&scG3{UGZ291nv^nMDl!<$ zwk@2v#a&lW0Y3VZR>i2a>Qip#Ea8q;6dO#mZy=8;W_F9Bf%v*les$xG$f{$pRUzWs zveGp8F%7E>V<+Nk#J~JAKK3^B-@G*A+-=nA4v}&Kxa2mdx?IIIDKTLAA`i{Cr&S#{t&TQ zLzjkg^as<>q7x47hN|Up!eS)b5!pvD@)ga8XahbIg~o=?K$&})PTCc8dfxhV^vE9C z4{6<;(3vJ=S}j$bv8tVrXCoXsK*t_B>&;xFGz^o0CS1UC`g*P|BZX(=`UJf@h%-sF INco)k3x$xYTL1t6 literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/task/Event.class b/src/main/java/hewwokitty/task/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..d10dfd4dd8e292c19f88787590e5c6e15b6cdd97 GIT binary patch literal 1088 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 E2QcT)XaE2J literal 0 HcmV?d00001 diff --git a/src/main/java/hewwokitty/ui/Ui.class b/src/main/java/hewwokitty/ui/Ui.class new file mode 100644 index 0000000000000000000000000000000000000000..1622199abf23673aea64dd82296763e254125f3f GIT binary patch literal 1555 zcmb7^?M@Rx6o$_L(xrl60YMZz#gBd{Y)}#-6n=;?F@7cpiLuFM+8xUv-6idmO_N@N zH={o^@rM`SMH%0jR;ba`IJ=!W^UiyonMr5%`;V{Ri0D48rfGsMd$ce{SLkY*7HP?& zYaX#jS&x=Iy6({pk8Y;uR*G_hMoT)an)-r1tdcp*)e}bb%&?_^=uT{LkV%&e?VM=cGH#9VY~?Fav0#(*U9MZ~$A!cWzf( z7oe+-z+4V|C|u^UZ(sj3u%NOfK!gpe4T5f6LTm>tf#0|>Fp+6X&&!-=E(P0Muwu#D z?eEuHb}Iz|EkwWD-!3Bn07w^DHSpo-U@53=1VT5(?Y5J)ZoBZl#>IbBJTJe7i&c=aCk~qscS7#UUdu>cR3!0S7JnV5GOUkNlkE6Iev#_m^h5NDw8N@xT09qkFnCev<;-Kg*e8HbI(TC;fah&RLIQ( z%o*A&;M*uG&!4Y^A(wpQOu3!Ajr%R_?`cT(*!xE^s`)P~hpLKu)+g<@n?}`fP2&~@ zW}i8;j{R5NYuQk;zKPrT7a4cT-MOO(dHHUln`PG^x3*c>r!0-*t6|G1348HSPocMn zR-ips{6gX*0znshCTks|%&GM)4LR%W%+S+MG+g{lBWN<`dhKYhP4($#z$Hond!B}A zn$k1_>?|$NC0eFAD$+bAnm(Oq3lrILxgYQS6`P?E7?%hiKx~Hr$^tbr7&SHkl>;gd uQ~{_WP_u(k=>e!UpzZ>752$sZE)7PVAAs5fssz*)P}}$u=CJ7@n*Rv{JxPoJ literal 0 HcmV?d00001 From 9fa2bf9987398845fea6c6540abc62ed79a05f9d Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 15:24:21 +0800 Subject: [PATCH 32/43] Fix code to comply with checkstyle --- src/main/java/hewwokitty/HewwoKitty.class | Bin 649 -> 0 bytes src/main/java/hewwokitty/parser/Parser.class | Bin 2089 -> 0 bytes src/main/java/hewwokitty/storage/Storage.class | Bin 3328 -> 0 bytes src/main/java/hewwokitty/task/Deadline.class | Bin 1658 -> 0 bytes src/main/java/hewwokitty/task/Event.class | Bin 1088 -> 0 bytes src/main/java/hewwokitty/task/Task.class | Bin 1956 -> 0 bytes src/main/java/hewwokitty/task/TaskList.class | Bin 4170 -> 0 bytes src/main/java/hewwokitty/task/Todo.class | Bin 860 -> 0 bytes src/main/java/hewwokitty/ui/Ui.class | Bin 1555 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/hewwokitty/HewwoKitty.class delete mode 100644 src/main/java/hewwokitty/parser/Parser.class delete mode 100644 src/main/java/hewwokitty/storage/Storage.class delete mode 100644 src/main/java/hewwokitty/task/Deadline.class delete mode 100644 src/main/java/hewwokitty/task/Event.class delete mode 100644 src/main/java/hewwokitty/task/Task.class delete mode 100644 src/main/java/hewwokitty/task/TaskList.class delete mode 100644 src/main/java/hewwokitty/task/Todo.class delete mode 100644 src/main/java/hewwokitty/ui/Ui.class diff --git a/src/main/java/hewwokitty/HewwoKitty.class b/src/main/java/hewwokitty/HewwoKitty.class deleted file mode 100644 index 1e7620f82c4348f7cf4aacac6340eb7305409b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmZ{i%}(1u5Xb-Pm@IV`LXw73Ahe_(B&e;AJ%BhA2_X?aq|i!jPn%?wF2Q!R-W2gD zeS)5QDN&JlfId)cr0pb% zWZX*`YK@0!%`XhoS@VZ;g;h+`mvoN@f}%iH(5gnBk)K+>0Q*G&iIB}_o33RRMT%Xi zrdFSP-QOI;+rLEa^9B5aF{YM&K)ikPoBn~H|No7_9mmT!b&>_ic_f%8$}GJlB33bn Z6_n{%6^cN$-Ze^$qr{ODBv{T6l^dC6lk)%o diff --git a/src/main/java/hewwokitty/parser/Parser.class b/src/main/java/hewwokitty/parser/Parser.class deleted file mode 100644 index 487308880f0a569ece2318ffbb0550ca2e46a73d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2089 zcmaJ?+jA3D82_Cn&2F|!8@7$K$fZD`Y10sBOF-IEpcIX?rP^{Ab(hiVTFRGd%j>4E_Q7?)c=J556#dXBT9VYLaul^PThC-+tGVpB{dH zAHYt$t6(#FW$cKe4H*eLqu7NP6oj!`?DUCMzk=-;kg-R|K{4%>u}{eTGKORvkTERd zpo|w~yd)zl<7L5eNWln31#C>gVT>zy1+OZYz@%6m5z|o##}pjL389=6(sT#x3A+Q;U`=@H#4f2yyqpn!Jtgo6(`3J8iKEGT<|$th0!WHkz|011UeX2 zKI4dlH&y7E62P2_EofJf2Ul?hM8#TF6fmvAz*+KRYJm=BV3IQ?Swo_zJ2T{I#qt+n z*UsAva-QpXll)|;<+I!(WF*f`?$Sp1jA7+f6k$oQRg`c}yuy)CR^g%|VOGT)<|Qns zcnjxMyp4Gk7jThbqi4Mro&T%X4IHV9QVE(_0H=mlqjo42vP|r{1vBUM&!u>qW|bb7I*8 zQ3|{WBL;1Gq03scx@qJO=%O-_jvNie`C#OY)!(mquUM+h>3zv=9}1E~sGaNR+u zis)#UrqotZ7wR6X$%Io?s9zEleSW18y>;fAQ13tZz4bSeSHLd*L2?r5KffdSGrDhm zN-~F@$ODoNGSdf1eo*_P^D)V<*M)yMPV#z6TTw;*N4OHogcor>r8Rh}6BeqO(qf*P zs}<_$l(y1SCnG`~OKF;?4ogBEOlggtnvsRNEu}SiYJ1E>x2CkXr>}~6@K{QF&eNqB z;p5>OWDW3zH$%h(Jv4UE7^HE6MmaFvqxEN@o42tlSw-_AN))UrTEg8+Se>a&#wl>m zCzr5h5l4e3kz_nl#ajQQKiO5qI)A-wx3q-TMI?e~DH*4fZ155F0=;n&ktJ*j-vnbW zyTC4EJ=Kaxw1YJ?uSFf!QM%W&UTk0)Y+?gwV|%fMjiQ}RAi<8&f5u6=Jqze!MWom{ zY-KKb*aCXl1?(io9qcMH>>75l_pzIOh(7iS`q_01u+K5b7O|Jzz<%}>hOv#_*oLNu j;%eVcKUVL38XDAI7Hw%cBw@YOBK<`cGISHR20ecR+N1A# diff --git a/src/main/java/hewwokitty/storage/Storage.class b/src/main/java/hewwokitty/storage/Storage.class deleted file mode 100644 index 2561814659366b10ff1ae3643c2346a0f4499004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3328 zcma)8Yj7J^75=XESb4R!6Zz37uPV>_5nGAVI#h1cBz`n*{A%RJwUbgd(#G0Y-c_Vk zWcNX#Ewq$JDJ`@qX@N2w&p?<-7)EC5nJ_R+fAEX{{9*XRKYr5zV!peQZ6#6|G;{CW zd-j}jzjN+)j`mM?KD!Oz7=EteFit2q8NewObr_J-pqz#j469J^q>5&omQN#cdP>0= z6&gkrjMZZt6Dk@p8KSc(70=+Df@x`RLb`ZX!HkMF%*yG!oGt|LoQfE}ET`ucd_@YM zk{dmMi*ii_kPN_35yd41b1Dun(ObF6;R`LKASK~ezmw`XZ1OwN2+Q#f?fg5H8bsKNu{+Xn$#UV z>cW?pb3M+YBXv3DaaBVBivpoat7#c}R_ZKicmywKcu{Je1TEmaWgq^;pSnS&~LgS_oD86;EoL*CuJwnJA9%gyuF-Vt09#*=QgCq z1$L~Hxk1}1H>Fy*s!_=hAFY9_TC-XrZJWp*+0HhbY`AuhCV>?EST>lS2<+c18`HXK z&l}~|TDs?9J;C}~Qt&gzJ!;$Y`3(E%i0m%|X`L)(8a}ART=r4wWv6v3nKp9!ONRZ` zuqz~Y8BQ%_j2h~d_p_ewY8L}~Ivr=b?pN@Mz=5jxYGD)D{lE3Fhkvby`F{;~A>{uG z=cC;1;wrfMI#(cW@j>8W&VE@A|9`*+J|9{V+#DBtoKwgN?jZoz|{{HKrd zE8{RB9OD|oNeuEsqt1oYgCGyz0hM|o?B@I+_9H?Y8QX5^?xXe|3}G*(_~sb3ABKO8 zFFgvH71SyGk`W5DHLl(b5e2SP`2ymUg2pBW{UtnF3fl8LLvCVLKHmuX%qp5^R?sra zNLxRIuj}S2+Gd!(2gVrCwrk>LF5z(z^LqLM-J$J8?C|u){Cr}nc6xhb$}*Z_YFA9= zXLmSwGwhG4b$!9GTEv6DBxp=gsMv}zu?^#5A0|W(CPhD< z7AJ64oW?m3C#qRID-6tt46(h4^WrUB5O3o-@jepbI+EfOToRvRj?o+uw_y_focIG$ z;*YrOR>Qk!`44uuh0y$O1QfKbp#$|L0e1>w3gOEhz%tpj#)7MQ>FUJTG43!4+=!+o zZTlnt!pVPPe2v**snxlq)keMzZx&lwcu%o)*U^MuXXOslM~cd3)X*8~aXIYs-tgR@ upmYa~ZdF*UPn*!LxG{Mkf)pQjm7c)ITvhtGj-TQqUeeRt2e?1W5&tjzbrxIz diff --git a/src/main/java/hewwokitty/task/Deadline.class b/src/main/java/hewwokitty/task/Deadline.class deleted file mode 100644 index 9244c9286fa5a7bf02c645e4d555618b01b8491c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmaJ>TTc@~6#j-ww=7%0%1uB-1%!gsJ4zA7RupZ4q>aW9ABJ{-wcDM#I~7U%A^rnj zHBlg#=(|5kJ=+$$lw#A&&Ya74?&sIY|&QYK$8w8UkO5Id6uyizJ`2q(igETV+cif8jF zUM#;g++k?naZDvLa>?`rx+f-2LXw+GRtyqEkqoQEKezR?EICtHIf_IrJsgH z1CJ0lkicVx{%x_dBlD(GyHUm6eDo+L%1%8iLwqt`^Ykc7Jq>E*Rpx9h{C_oOXf1lN zQ;+zy;@jLwi?=0VXGN@9mAdB8v4khoA&C#{1JfD$3Oq03(#~@A(p1}Ya}~Fh%MkM; zAM2eu$cE)_Ur)Sd6C1m8BW#l4?x|S*&TI%&scG3{UGZ291nv^nMDl!<$ zwk@2v#a&lW0Y3VZR>i2a>Qip#Ea8q;6dO#mZy=8;W_F9Bf%v*les$xG$f{$pRUzWs zveGp8F%7E>V<+Nk#J~JAKK3^B-@G*A+-=nA4v}&Kxa2mdx?IIIDKTLAA`i{Cr&S#{t&TQ zLzjkg^as<>q7x47hN|Up!eS)b5!pvD@)ga8XahbIg~o=?K$&})PTCc8dfxhV^vE9C z4{6<;(3vJ=S}j$bv8tVrXCoXsK*t_B>&;xFGz^o0CS1UC`g*P|BZX(=`UJf@h%-sF INco)k3x$xYTL1t6 diff --git a/src/main/java/hewwokitty/task/Event.class b/src/main/java/hewwokitty/task/Event.class deleted file mode 100644 index d10dfd4dd8e292c19f88787590e5c6e15b6cdd97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcma)5U2hUW6g>mT!ggEQEwxr{rAjMoKTu<06yt+PQw{0^q&_r03^0~0utRnS2#G($ zpP@;cCVlV+_@j(>Sz^&8#!PZ&=H7G9oSC`z$Ir{}0G{BHjwG%pk-(~NZur|ZlS1qM zYQqG>x`vE~O@_oLS9V`Qs&Z}Tq{t9gGKj{X+m5YXFg(qLasT7V zA2GyAvPmbUDz+ou^}BW9)_A=`p1GlGD^ZgNw!cf~@?l2Os$`&xL9fcb+YkXpR=5g16jyVH{ZWDhMB;9hLx5W4rSX` zYE)3%YZu16BscvyrG)YO82hSF*%ni|kHX+<4B9LY+~B)6H|#!P1V zL)!n~2ivK3#t;1g{ZXC1dv}FkGLD6rcW>W)_Icj--FG*C|MTuI02_Fcgo)(@&LFGI zN&;7KRmZg?a`-~Wb(2sxbgY|TYTVRuGfB8xCL-8UUtgJs;%g1xXt>P~cf1|pat8K< zAywmEwd1sOdN5!Gsr)cSstb!T+8k>Zu?Q~I%;Dyqj-}iZU&?44o*{TicS{8OvcO7 zt~U1Ub|{?cbsWhnB49Hpj6GkW=t`fw$e>FRWJo$?(d|@u08UhFuW?P4!N3gW3{2w_ z17|U%;f{doMZw>6?9K+2z@AZV$aHQ;8j%RtoYWGC9W{KxkUvzucbJ4S^ zqSfwkN#(a>oj{U8nrE22BZTy1$8PU&Sr;`g9micA_Y4&A9Yf|AYt?PfI^^87T6V9& zYZgsiA*~u6yLBt0<31hQ(}QQ08mwoQfdyRFQBp*E2Ig^I$G)08V3_g)_T$Z|IC82! z6w67YJUD#8t5nwkSGn&=-l9^AE-g$4XYPpHLv?6Wc5b(*vCjG&r`-&if3i(CiHG<; zh?6nQwCn~i2)Am>M~+(*aX?q^0On(^+BIF1< z;hyc*n%r9mHs*&T8}OXkSn0R<2>8=>;c+7BlD8Es$G0c4! z7n`RCOTB0j`loB>f6*PJF+uO!49=1LlxC|w0!U~71k0|xK_nY}gXnLx#4t;;;Jn-w`v%-Xg9>Ef|&LJLo{@R?8=m&mvB=OGKN&IF{)N%F+#8p=bXJ$yg&~ zROW*+i9wm<2W3`CW{qTSkjy&CY>>z%#ZRw5nEg79D*JJYI{GW(X6m(RsDefOI#1A# z3y_C~EhMo`#R7R)lJJ+e4bH67G^a#;0%!d>!-Gx(846?qwtP@%K`lIFA2LaXFk^X-Oj^S<5w E7n9?ltqBq+_xZxcftu-$;M2~lD@2{t4l4P;_Xtcm3rM;cj} z@(7R;p5f8blJremTp(?Mf(%YeOCNmj-PMowqigZs?{;Oa;_f>mKc&*3wdTI&o^#LH zXP+}ypME~|5rAFzvyK+@sW_mc0)3U(frD~%NH%w==+~iQKsI-4xJO494$J0@Ic7HJJUiXonaP;rJ$BY>7pUyFhaA((Wh{Zla(g;@QdU0i4%?nL z-Yk_h53p(9P1#6??bzOKfly8DJpxLXo1~Vi9^0|{aw8|L%z$|^%@uXX^7`!uIpW5I zfHq=ghPz#d3rbBwit0IMZcR0lNqGj1t_dtko6b;kzn8I{p?0}_X}@O<4)>a){sAhU zp@xh#;*ME?TvbuSo{T%P$Cf6A3%J?9i&Be- z8+ZvX8~7$V2%P68T?603D>N)=naMO!XSl5~%kkvKZwru9rCNQlUFcNt9RsiWikk)2 zEea_ho-7erVuF=oF~F-F3aJmoZ0s zEidIJvsDrNSi@@ueuAHB_?hfqH?R+THB89K&kekR3kKfATLv!U7Y2TbUm3VlZg^X6 zct@b+%i2??Yj{@*|60R)vVUKoj{aM5laH6O;v=Rvm?9bD9;2O&+fIDk&E?~H#(k4+ zpn$ywCh>uW4-HI7$4cOxp$UEV$>B5nz{%6rptoRYhH%k23MD)%V|s3e9LNSq#q^T7 zl9*52Ko^r#mx0XU9s@fK*GF*;J6{5$jCOOv}}*x?6$Il8GF>TU8lUYrMAk zr8`Skq-=;aWML@Avz|4=7j90%9Z1=3^Fe7R-LuRQ!X4!L!ev%K-Ynl1Unt*CJ(C z&s10cLo`EW;-->Vebxg+mfr}HM{)eg!fHHA>Iy-aZZ2a;DGudL6QU_D^zsZzT%(c@ zjS$#(O;%i^%4JOD1zgt#UB@$Rhp}Hj|DdjvndxT&TF#)=F7XP}Bk54sXPS!N%EI-r zz?Ql4Vmo8*uvPqy2K3rv4ziMrtN0_o<~^=EoEsG|5{_eKy3%GgYw_Gy=bu~D5tQe> zrjtxt*)4%!d#R7}Ru%{jjE`Dnw$CpOGj*g?MVFaQ_mffWD*hy}wZy-2wh3(f;(ge} zYhMd*VuF`0ewo?tyv(`ZIOyr zH5Mtrc#9|UcZg32t*Jfiw}d~*Tw>q7QTf{u_BX{M(WM0}yNGR}R&@e#&a3?SYDLbg zIj{ETk#MWJN_~?uzvCl+(xDiiPCj{B5H4W3($W@=g`-i5Ttf8~tT-AAPhw^71kQhe zRTFq@;l98$Lms zj8Q`Y>kq$+>!KS9*vP(N3fF_z0XZ&4e2T#;uK2rTJSrf0bISL62WL0JAn(qRb1#qw z7y0&eGUyEk_cG%&Nn}38?f45X{Qp2VKEodTlUJU9VXx4U5F4;h)S*{2p-=3>0dXr1 ziv2hwj^i$2VStjr5$MxYsj1kZqD$rf2X^uyIjgFSbvKQC;?aWvsRLUTX% z;si~&gOCI%w2cNx6LhJuUWR9J0t}%NDemT-u_$wz5(;ISqS2nfkS)CpA7ZOuDAseZ zO@L|GSKnB`_9@f=JrmQP)xS-NAdstx5a2R7MzIlRm|ht)AnOCa3>E*u5+BUORZ@Z9 zkJ)pd;Hgq_ceJ)A8to13-cW?$HEi9WoM=@VRw;6Y`l z+TLhGUqhqsZJRPLZIsqX5u!FVrWQeJk)r^mHZ7(V&=_M9H(kW)n6fG&7if7i(59S= z(DY9k@R-6}A(RE&FqaW6%md&_T5+BZJjH7IG}hr6Y{0W5?{oZ9{5+200x9q!L;n&+ z@UrjJW`w4(ZH}eVxuT0Ig|PD~BNajql~=MBWp<=UvZ0BFOvrciP!dXAU&)V?tGB2>ku>DqR6PrkkKS(pu!?-o$A0hX4Wzy4q6FWmYZV^p5cI}@V=5m*t-&e>}WL*=8JDeti?ts z6BCZJ#?P84f99Q&jl-m;V?yok(tLHT1G(H?TI5s=jE-hD>b&W$*1=>qfRK| zSaRiWtCg1=>G*<-oL8A8kp|5nI` zINrQLZq8)*ew$-0A{CZ=DH-_uoaxr^RVFDhM-JOKT2v-H#|diK$9=Z9II_cRm4$rp E2QcT)XaE2J diff --git a/src/main/java/hewwokitty/ui/Ui.class b/src/main/java/hewwokitty/ui/Ui.class deleted file mode 100644 index 1622199abf23673aea64dd82296763e254125f3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmb7^?M@Rx6o$_L(xrl60YMZz#gBd{Y)}#-6n=;?F@7cpiLuFM+8xUv-6idmO_N@N zH={o^@rM`SMH%0jR;ba`IJ=!W^UiyonMr5%`;V{Ri0D48rfGsMd$ce{SLkY*7HP?& zYaX#jS&x=Iy6({pk8Y;uR*G_hMoT)an)-r1tdcp*)e}bb%&?_^=uT{LkV%&e?VM=cGH#9VY~?Fav0#(*U9MZ~$A!cWzf( z7oe+-z+4V|C|u^UZ(sj3u%NOfK!gpe4T5f6LTm>tf#0|>Fp+6X&&!-=E(P0Muwu#D z?eEuHb}Iz|EkwWD-!3Bn07w^DHSpo-U@53=1VT5(?Y5J)ZoBZl#>IbBJTJe7i&c=aCk~qscS7#UUdu>cR3!0S7JnV5GOUkNlkE6Iev#_m^h5NDw8N@xT09qkFnCev<;-Kg*e8HbI(TC;fah&RLIQ( z%o*A&;M*uG&!4Y^A(wpQOu3!Ajr%R_?`cT(*!xE^s`)P~hpLKu)+g<@n?}`fP2&~@ zW}i8;j{R5NYuQk;zKPrT7a4cT-MOO(dHHUln`PG^x3*c>r!0-*t6|G1348HSPocMn zR-ips{6gX*0znshCTks|%&GM)4LR%W%+S+MG+g{lBWN<`dhKYhP4($#z$Hond!B}A zn$k1_>?|$NC0eFAD$+bAnm(Oq3lrILxgYQS6`P?E7?%hiKx~Hr$^tbr7&SHkl>;gd uQ~{_WP_u(k=>e!UpzZ>752$sZE)7PVAAs5fssz*)P}}$u=CJ7@n*Rv{JxPoJ From b8cfce9e641a7bace9a67dcc4b2857be3b1dba9e Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 17:37:05 +0800 Subject: [PATCH 33/43] Create GUI for chatbot --- src/main/java/hewwokitty/HewwoKittyGUI.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/hewwokitty/HewwoKittyGUI.java diff --git a/src/main/java/hewwokitty/HewwoKittyGUI.java b/src/main/java/hewwokitty/HewwoKittyGUI.java new file mode 100644 index 0000000000..bedc9bdcd2 --- /dev/null +++ b/src/main/java/hewwokitty/HewwoKittyGUI.java @@ -0,0 +1,4 @@ +package hewwokitty; + +public class HewwoKittyGUI { +} From d5fd0f43d35feecfdd179e8a2bc4a8af807a89cb Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 18:20:21 +0800 Subject: [PATCH 34/43] Add assertions to TaskList and Parser Assertions were mainly used to ensure that important fields were not null --- .gitignore | 1 + build.gradle | 30 +- config/checkstyle/checkstyle.xml | 434 ++++++++++++++++++ config/checkstyle/suppressions.xml | 10 + data/hewwoTasks.txt | 1 + src/main/java/hewwokitty/HewwoKitty.java | 11 +- src/main/java/hewwokitty/HewwoKittyGUI.java | 100 +++- src/main/java/hewwokitty/parser/Parser.java | 85 ++-- src/main/java/hewwokitty/storage/Storage.java | 74 +-- src/main/java/hewwokitty/task/Deadline.java | 1 + src/main/java/hewwokitty/task/Event.java | 3 +- src/main/java/hewwokitty/task/TaskList.java | 57 +-- src/main/java/hewwokitty/ui/Ui.java | 12 +- 13 files changed, 702 insertions(+), 117 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml create mode 100644 config/checkstyle/suppressions.xml diff --git a/.gitignore b/.gitignore index 1afe9d80ec..2fd69ea852 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /.gradle/ /build/ src/main/resources/docs/ +gradle/ # MacOS custom attributes files created by Finder .DS_Store diff --git a/build.gradle b/build.gradle index 2a1ade257c..ad32b0caf4 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,13 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '7.1.2' +// id 'checkstyle' + id 'org.openjfx.javafxplugin' version '0.0.13' +} +javafx { + version = '17.0.7' + modules = ['javafx.controls', 'javafx.fxml'] } - repositories { mavenCentral() } @@ -11,8 +16,27 @@ repositories { dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' + + String javaFxVersion = '17.0.7' + + 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' } +//checkstyle { +// toolVersion = '10.2' +//} + test { useJUnitPlatform() @@ -28,7 +52,7 @@ test { } application { - mainClass.set("hewwokitty.HewwoKitty") + mainClass.set("hewwokitty.HewwoKittyGUI") } shadowJar { @@ -40,3 +64,5 @@ shadowJar { run{ standardInput = System.in } + + diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..eb761a9b9a --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000000..39efb6e4ac --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index 687d14690c..ea5f4379b7 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1 +1,2 @@ T|0|cry +T|0|sleep diff --git a/src/main/java/hewwokitty/HewwoKitty.java b/src/main/java/hewwokitty/HewwoKitty.java index c705c9d5d1..896955fb2b 100644 --- a/src/main/java/hewwokitty/HewwoKitty.java +++ b/src/main/java/hewwokitty/HewwoKitty.java @@ -1,19 +1,26 @@ package hewwokitty; +import hewwokitty.parser.Parser; import hewwokitty.storage.Storage; import hewwokitty.task.TaskList; -import hewwokitty.parser.Parser; import hewwokitty.ui.Ui; +import java.util.Scanner; + +/** + * Main chatbot class + */ public class HewwoKitty { public static void main(String[] args) { boolean isRunning = true; TaskList taskList = Storage.readFromFile(); Parser parser = new Parser(); + Scanner sc = new Scanner(System.in); Ui.printStart(); while (isRunning) { - isRunning = parser.parseCommands(taskList); + String userInput = sc.nextLine(); + isRunning = parser.parseCommands(userInput, taskList); } Ui.printBye(); } diff --git a/src/main/java/hewwokitty/HewwoKittyGUI.java b/src/main/java/hewwokitty/HewwoKittyGUI.java index bedc9bdcd2..0b8a57f9f9 100644 --- a/src/main/java/hewwokitty/HewwoKittyGUI.java +++ b/src/main/java/hewwokitty/HewwoKittyGUI.java @@ -1,4 +1,102 @@ package hewwokitty; -public class HewwoKittyGUI { +import hewwokitty.parser.Parser; +import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; +import hewwokitty.ui.Ui; +import javafx.application.Application; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +/** + * JavaFX GUI for HewwoKitty chatbot. + */ +public class HewwoKittyGUI extends Application { + private TaskList taskList; + private Parser parser; + private TextArea chatArea; + private TextField userInput; + private ByteArrayOutputStream outputStream; + + /** + * Function for the initial creation of the GUI + * @param primaryStage A Stage + */ + @Override + public void start(Stage primaryStage) { + taskList = Storage.readFromFile(); + parser = new Parser(); + + primaryStage.setTitle("HewwoKitty Chatbot"); + + chatArea = new TextArea(); + chatArea.setEditable(false); + chatArea.setWrapText(true); + + ScrollPane scrollPane = new ScrollPane(chatArea); + scrollPane.setFitToWidth(true); + scrollPane.setFitToHeight(true); + + userInput = new TextField(); + userInput.setPromptText("Type your message..."); + + Button sendButton = new Button("Send"); + sendButton.setOnAction(e -> handleUserInput()); + + VBox layout = new VBox(10, scrollPane, userInput, sendButton); + layout.setPadding(new Insets(10)); + + primaryStage.setScene(new Scene(layout, 400, 500)); + primaryStage.show(); + + captureSystemOutput(); + Ui.printStart(); + appendCapturedOutput(); + } + + private void handleUserInput() { + String input = userInput.getText().trim(); + if (!input.isEmpty()) { + appendToChat("You: " + input); + + // Ensure only user input is passed to the parser + boolean isRunning = parser.parseCommands(input, taskList); + appendCapturedOutput(); + userInput.clear(); + + if (!isRunning) { + appendToChat("HewwoKitty: hewwo kitty is cwosing uwu~"); + System.exit(0); + } + } + } + + private void appendToChat(String message) { + chatArea.appendText(message + "\n"); + } + + private void captureSystemOutput() { + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + } + + private void appendCapturedOutput() { + String output = outputStream.toString().trim(); + if (!output.isEmpty()) { + appendToChat(output); + outputStream.reset(); + } + } + + public static void main(String[] args) { + launch(args); + } } diff --git a/src/main/java/hewwokitty/parser/Parser.java b/src/main/java/hewwokitty/parser/Parser.java index 6b11f87adf..2e80aefe0f 100644 --- a/src/main/java/hewwokitty/parser/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -1,8 +1,9 @@ package hewwokitty.parser; import java.util.Scanner; -import hewwokitty.task.TaskList; + import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; import hewwokitty.ui.Ui; /** @@ -10,61 +11,63 @@ * Allows user to interact with the chatbot */ public class Parser { - private Scanner scanner; private String userInput = ""; /** * Returns a Parser object that reads input from the user */ public Parser() { - this.scanner = new Scanner(System.in); + } /** * Returns a boolean value indicating whether a command is valid and has been executed - * @param taskList - TaskList from main that consists of Tasks that have been added by the user + * @param userInput String containing input from the user + * @param taskList TaskList from main that consists of Tasks that have been added by the user * @return false if command user input is "bye", else true */ - public boolean parseCommands(TaskList taskList) { - this.userInput = this.scanner.nextLine(); + public boolean parseCommands(String userInput, TaskList taskList) { + assert userInput != null : "User input should not be null"; + assert taskList != null : "TaskList should not be null"; + this.userInput = userInput; String userString = this.userInput.toLowerCase(); switch (userString.split(" ", 2)[0]) { - case "bye": - return false; - case "list": - System.out.print(taskList); - break; - case "mark": - int markTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.markDone(markTaskNum); - Storage.writeToFile(taskList); - break; - case "unmark": - int unmarkTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.unmarkDone(unmarkTaskNum); - Storage.writeToFile(taskList); - break; - case "todo": - case "deadline": - case "event": - try { - taskList.addTask(userString); - Storage.writeToFile(taskList); - } catch (IllegalArgumentException e) { - Ui.printInvalidDate(); - } - break; - case "delete": - int deleteTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.removeTask(deleteTaskNum); + case "bye": + return false; + case "list": + System.out.print(taskList); + break; + case "mark": + int markTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.markDone(markTaskNum); + Storage.writeToFile(taskList); + break; + case "unmark": + int unmarkTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.unmarkDone(unmarkTaskNum); + Storage.writeToFile(taskList); + break; + case "todo": + case "deadline": + case "event": + try { + taskList.addTask(userString); Storage.writeToFile(taskList); - break; - case "find": - taskList.findTasks(userString); - break; - default: - Ui.printInvalidCommand(); - break; + } catch (IllegalArgumentException e) { + Ui.printInvalidDate(); + } + break; + case "delete": + int deleteTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.removeTask(deleteTaskNum); + Storage.writeToFile(taskList); + break; + case "find": + taskList.findTasks(userString); + break; + default: + Ui.printInvalidCommand(); + break; } return true; } diff --git a/src/main/java/hewwokitty/storage/Storage.java b/src/main/java/hewwokitty/storage/Storage.java index 875368f20f..deb847c019 100644 --- a/src/main/java/hewwokitty/storage/Storage.java +++ b/src/main/java/hewwokitty/storage/Storage.java @@ -1,17 +1,17 @@ package hewwokitty.storage; -import java.util.Scanner; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; +import java.util.Scanner; + +import hewwokitty.task.Event; +import hewwokitty.task.Deadline; import hewwokitty.task.TaskList; import hewwokitty.task.Task; import hewwokitty.task.Todo; -import hewwokitty.task.Event; -import hewwokitty.task.Deadline; /** * Responsible for writing Tasks to and reading Tasks from file @@ -63,38 +63,38 @@ public static TaskList readFromFile() { } switch (command) { - case "T": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|", 2)[1]; - t = new Todo(message); - if (isMarked) { - t.markAsDoneFile(); - } - break; - case "D": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|")[1]; - String byDate = temp.split("\\|")[2]; - t = new Deadline(message, byDate); - if (isMarked) { - t.markAsDoneFile(); - } - break; - case "E": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|")[1]; - String fromDate = temp.split("\\|")[2]; - String toDate = temp.split("\\|")[3]; - t = new Event(message, fromDate, toDate); - if (isMarked) { - t.markAsDoneFile(); - } - break; - default: - break; + case "T": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|", 2)[1]; + t = new Todo(message); + if (isMarked) { + t.markAsDoneFile(); + } + break; + case "D": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|")[1]; + String byDate = temp.split("\\|")[2]; + t = new Deadline(message, byDate); + if (isMarked) { + t.markAsDoneFile(); + } + break; + case "E": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|")[1]; + String fromDate = temp.split("\\|")[2]; + String toDate = temp.split("\\|")[3]; + t = new Event(message, fromDate, toDate); + if (isMarked) { + t.markAsDoneFile(); + } + break; + default: + break; } if (t != null) { taskList.addTaskFromFile(t); diff --git a/src/main/java/hewwokitty/task/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java index 251f83e1a3..401cd3fb0b 100644 --- a/src/main/java/hewwokitty/task/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -3,6 +3,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; + import hewwokitty.ui.Ui; /** diff --git a/src/main/java/hewwokitty/task/Event.java b/src/main/java/hewwokitty/task/Event.java index a47abb2b40..a272edae5b 100644 --- a/src/main/java/hewwokitty/task/Event.java +++ b/src/main/java/hewwokitty/task/Event.java @@ -21,8 +21,7 @@ public Event(String message, String fromDate, String toDate) { /** * Formats a string into the format meant to save to file - * @return A String that has been formatted with the type Event, isDone, - * fromDate and toDate + * @return A String that has been formatted with the type Event, isDone, fromDate and toDate */ @Override public String writeToFile() { diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index a2aced8ba2..7165892c2b 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -29,7 +29,7 @@ public int getSize() { * @param i An int representing the order of the Task in TaskList */ public void markDone(int i) { - this.tasks.get(i-1).markAsDone(); + this.tasks.get(i - 1).markAsDone(); } /** @@ -37,7 +37,7 @@ public void markDone(int i) { * @param i An int representing the order of the Task in TaskList */ public void unmarkDone(int i) { - this.tasks.get(i-1).unmarkAsDone(); + this.tasks.get(i - 1).unmarkAsDone(); } /** @@ -46,33 +46,34 @@ public void unmarkDone(int i) { * @param userString A String that consists of the user input */ public void addTask(String userString) { + assert userString != null; Task t = null; String message; String command = userString.split(" ")[0]; String temp; switch (command) { - case "todo": - temp = userString.split(" ",2)[1]; - if (!temp.equals("")) { - t = new Todo(temp); - } else { - Ui.printInvalidDescription(); - } - break; - case "deadline": - temp = userString.split(" ",2)[1]; - message = temp.split("/")[0]; - String date = temp.split("/")[1].split(" ",2)[1]; - t = new Deadline(message, date); - break; - case "event": - temp = userString.split(" ",2)[1]; - message = temp.split("/")[0]; - String fromDate = temp.split("/")[1].split(" ",2)[1]; - String toDate = temp.split("/")[2].split(" ",2)[1]; - t = new Event(message, fromDate, toDate); - break; + case "todo": + temp = userString.split(" " , 2)[1]; + if (!temp.equals("")) { + t = new Todo(temp); + } else { + Ui.printInvalidDescription(); + } + break; + case "deadline": + temp = userString.split(" " , 2)[1]; + message = temp.split("/")[0]; + String date = temp.split("/")[1].split(" " , 2)[1]; + t = new Deadline(message, date); + break; + case "event": + temp = userString.split(" ",2)[1]; + message = temp.split("/")[0]; + String fromDate = temp.split("/")[1].split(" " , 2)[1]; + String toDate = temp.split("/")[2].split(" " , 2)[1]; + t = new Event(message, fromDate, toDate); + break; } if (t != null) { this.tasks.add(t); @@ -89,8 +90,8 @@ public void addTask(String userString) { */ public void removeTask(int i) { System.out.println("*************************************************"); - System.out.println("i've wemoved youw task: \n" + this.tasks.get(i-1).toString()); - this.tasks.remove(i-1); + System.out.println("i've wemoved youw task: \n" + this.tasks.get(i - 1).toString()); + this.tasks.remove(i - 1); System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); System.out.println("*************************************************"); } @@ -124,12 +125,16 @@ public String toString() { String border = "*************************************************\n"; String s = ""; for (int i = 0; i < this.tasks.size(); i++) { - int currTask = i+1; + int currTask = i + 1; s += currTask + ". " + this.tasks.get(i).toString() + "\n"; } return border + s + border; } + /** + * Finds a Task in TaskList that contains the keyword entered by the user + * @param userString A String representing user input + */ public void findTasks(String userString) { String border = "*************************************************\n"; String title = "hewe awe the matching tasks in youw wist!\n"; diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index 2e27d443f5..03ef4ab969 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -9,12 +9,12 @@ public class Ui { */ public static void printStart() { String logo = - ".__ __ .__ __ __ \n" + - "| |__ ______ _ ____ _ ______ | | _|__|/ |__/ |_ ___.__.\n" + - "| | \\_/ __ \\ \\/ \\/ /\\ \\/ \\/ / _ \\| |/ / \\ __\\ __< | |\n" + - "| Y \\ ___/\\ / \\ ( <_> ) <| || | | | \\___ |\n" + - "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" + - " \\/ \\/ \\/ \\/ \n"; + ".__ __ .__ __ __ \n" + + "| |__ ______ _ ____ _ ______ | | _|__|/ |__/ |_ ___.__.\n" + + "| | \\_/ __ \\ \\/ \\/ /\\ \\/ \\/ / _ \\| |/ / \\ __\\ __< | |\n" + + "| Y \\ ___/\\ / \\ ( <_> ) <| || | | | \\___ |\n" + + "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" + + " \\/ \\/ \\/ \\/ \n"; System.out.println(logo); System.out.println("*************************************************"); From 3e96e83281595409bd98abe88057d42af09519fe Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 18:54:34 +0800 Subject: [PATCH 35/43] Amend code quality Added more thorough exception handling, and cleaned up the code --- .gitignore | 38 +- CONTRIBUTORS.md | 18 +- README.md | 52 +- build.gradle | 136 +-- config/checkstyle/checkstyle.xml | 868 +++++++++--------- config/checkstyle/suppressions.xml | 20 +- data/hewwoTasks.txt | 2 +- docs/README.md | 58 +- gradle/wrapper/gradle-wrapper.properties | 14 +- src/main/java/hewwokitty/HewwoKitty.java | 54 +- src/main/java/hewwokitty/HewwoKittyGUI.java | 204 ++-- src/main/java/hewwokitty/parser/Parser.java | 154 ++-- src/main/java/hewwokitty/storage/Storage.java | 230 ++--- src/main/java/hewwokitty/task/Deadline.java | 102 +- src/main/java/hewwokitty/task/Event.java | 78 +- src/main/java/hewwokitty/task/Task.java | 180 ++-- src/main/java/hewwokitty/task/TaskList.java | 313 ++++--- src/main/java/hewwokitty/task/Todo.java | 66 +- src/main/java/hewwokitty/ui/Ui.java | 136 +-- .../java/hewwokitty/storage/StorageTest.java | 50 +- .../java/hewwokitty/task/TaskListTest.java | 32 +- text-ui-test/EXPECTED.TXT | 14 +- text-ui-test/input.txt | 12 +- text-ui-test/runtest.bat | 42 +- text-ui-test/runtest.sh | 74 +- 25 files changed, 1486 insertions(+), 1461 deletions(-) diff --git a/.gitignore b/.gitignore index 2fd69ea852..d7a2c1593f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,19 @@ -# IDEA files -/.idea/ -/out/ -/*.iml - -# Gradle build files -/.gradle/ -/build/ -src/main/resources/docs/ -gradle/ - -# MacOS custom attributes files created by Finder -.DS_Store -*.iml -bin/ - -/text-ui-test/ACTUAL.TXT -text-ui-test/EXPECTED-UNIX.TXT -/.class +# IDEA files +/.idea/ +/out/ +/*.iml + +# Gradle build files +/.gradle/ +/build/ +src/main/resources/docs/ +gradle/ + +# MacOS custom attributes files created by Finder +.DS_Store +*.iml +bin/ + +/text-ui-test/ACTUAL.TXT +text-ui-test/EXPECTED-UNIX.TXT +/.class diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8e359a0145..419450f2f6 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,9 +1,9 @@ -# Contributors - -Display | Name | Github Profile | Homepage ----|:---:|:---:|:---: -![](https://avatars0.githubusercontent.com/u/22460123?s=100) | Jeffry Lum | [Github](https://github.com/j-lum/) | [Homepage](https://se.kasugano.moe) -![](https://avatars0.githubusercontent.com/u/1673303?s=100) | Damith C. Rajapakse | [Github](https://github.com/damithc/) | [Homepage](https://www.comp.nus.edu.sg/~damithch/) -# I would like to join this list. How can I help the project - -For more information, please refer to our [contributor's guide](https://oss-generic.github.io/process/). +# Contributors + +Display | Name | Github Profile | Homepage +---|:---:|:---:|:---: +![](https://avatars0.githubusercontent.com/u/22460123?s=100) | Jeffry Lum | [Github](https://github.com/j-lum/) | [Homepage](https://se.kasugano.moe) +![](https://avatars0.githubusercontent.com/u/1673303?s=100) | Damith C. Rajapakse | [Github](https://github.com/damithc/) | [Homepage](https://www.comp.nus.edu.sg/~damithch/) +# I would like to join this list. How can I help the project + +For more information, please refer to our [contributor's guide](https://oss-generic.github.io/process/). diff --git a/README.md b/README.md index af0309a9ef..406b2cda32 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,26 @@ -# Duke project template - -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. - -## Setting up in Intellij - -Prerequisites: JDK 17, 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 17** (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. -1. 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: - ``` - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` - -**Warning:** Keep the `src\main\java` folder as the root folder for Java files (i.e., don't rename those folders or move Java files to another folder outside of this folder path), as this is the default location some tools (e.g., Gradle) expect to find Java files. +# Duke project template + +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. + +## Setting up in Intellij + +Prerequisites: JDK 17, 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 17** (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. +1. 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: + ``` + Hello from + ____ _ + | _ \ _ _| | _____ + | | | | | | | |/ / _ \ + | |_| | |_| | < __/ + |____/ \__,_|_|\_\___| + ``` + +**Warning:** Keep the `src\main\java` folder as the root folder for Java files (i.e., don't rename those folders or move Java files to another folder outside of this folder path), as this is the default location some tools (e.g., Gradle) expect to find Java files. diff --git a/build.gradle b/build.gradle index ad32b0caf4..a6e5e85203 100644 --- a/build.gradle +++ b/build.gradle @@ -1,68 +1,68 @@ -plugins { - id 'java' - id 'application' - id 'com.github.johnrengelman.shadow' version '7.1.2' -// id 'checkstyle' - id 'org.openjfx.javafxplugin' version '0.0.13' -} -javafx { - version = '17.0.7' - modules = ['javafx.controls', 'javafx.fxml'] -} -repositories { - mavenCentral() -} - -dependencies { - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' - - String javaFxVersion = '17.0.7' - - 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' -} - -//checkstyle { -// toolVersion = '10.2' -//} - -test { - useJUnitPlatform() - - testLogging { - events "passed", "skipped", "failed" - - showExceptions true - exceptionFormat "full" - showCauses true - showStackTraces true - showStandardStreams = false - } -} - -application { - mainClass.set("hewwokitty.HewwoKittyGUI") -} - -shadowJar { - archiveBaseName = "hewwokitty" - archiveClassifier = null - archiveFileName = "hewwokitty.jar" -} - -run{ - standardInput = System.in -} - - +plugins { + id 'java' + id 'application' + id 'com.github.johnrengelman.shadow' version '7.1.2' +// id 'checkstyle' + id 'org.openjfx.javafxplugin' version '0.0.13' +} +javafx { + version = '17.0.7' + modules = ['javafx.controls', 'javafx.fxml'] +} +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' + + String javaFxVersion = '17.0.7' + + 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' +} + +//checkstyle { +// toolVersion = '10.2' +//} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClass.set("hewwokitty.HewwoKittyGUI") +} + +shadowJar { + archiveBaseName = "hewwokitty" + archiveClassifier = null + archiveFileName = "hewwokitty.jar" +} + +run{ + standardInput = System.in +} + + diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index eb761a9b9a..60e677779e 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -1,434 +1,434 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml index 39efb6e4ac..b18688d2f1 100644 --- a/config/checkstyle/suppressions.xml +++ b/config/checkstyle/suppressions.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index ea5f4379b7..3fdb98fc03 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,2 +1,2 @@ T|0|cry -T|0|sleep +T|1|drugs diff --git a/docs/README.md b/docs/README.md index 47b9f984f7..50e71cbaaf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,30 +1,30 @@ -# Duke User Guide - -// Update the title above to match the actual product name - -// Product screenshot goes here - -// Product intro goes here - -## Adding deadlines - -// Describe the action and its outcome. - -// Give examples of usage - -Example: `keyword (optional arguments)` - -// A description of the expected outcome goes here - -``` -expected output -``` - -## Feature ABC - -// Feature details - - -## Feature XYZ - +# Duke User Guide + +// Update the title above to match the actual product name + +// Product screenshot goes here + +// Product intro goes here + +## Adding deadlines + +// Describe the action and its outcome. + +// Give examples of usage + +Example: `keyword (optional arguments)` + +// A description of the expected outcome goes here + +``` +expected output +``` + +## Feature ABC + +// Feature details + + +## Feature XYZ + // Feature details \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 66c01cfeba..38b1a5087f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/main/java/hewwokitty/HewwoKitty.java b/src/main/java/hewwokitty/HewwoKitty.java index 896955fb2b..f0906ad989 100644 --- a/src/main/java/hewwokitty/HewwoKitty.java +++ b/src/main/java/hewwokitty/HewwoKitty.java @@ -1,27 +1,27 @@ -package hewwokitty; - -import hewwokitty.parser.Parser; -import hewwokitty.storage.Storage; -import hewwokitty.task.TaskList; -import hewwokitty.ui.Ui; - -import java.util.Scanner; - -/** - * Main chatbot class - */ -public class HewwoKitty { - public static void main(String[] args) { - boolean isRunning = true; - TaskList taskList = Storage.readFromFile(); - Parser parser = new Parser(); - Scanner sc = new Scanner(System.in); - - Ui.printStart(); - while (isRunning) { - String userInput = sc.nextLine(); - isRunning = parser.parseCommands(userInput, taskList); - } - Ui.printBye(); - } -} +package hewwokitty; + +import hewwokitty.parser.Parser; +import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; +import hewwokitty.ui.Ui; + +import java.util.Scanner; + +/** + * Main chatbot class + */ +public class HewwoKitty { + public static void main(String[] args) { + boolean isRunning = true; + TaskList taskList = Storage.readFromFile(); + Parser parser = new Parser(); + Scanner sc = new Scanner(System.in); + + Ui.printStart(); + while (isRunning) { + String userInput = sc.nextLine(); + isRunning = parser.processUserCommands(userInput, taskList); + } + Ui.printBye(); + } +} diff --git a/src/main/java/hewwokitty/HewwoKittyGUI.java b/src/main/java/hewwokitty/HewwoKittyGUI.java index 0b8a57f9f9..867a685472 100644 --- a/src/main/java/hewwokitty/HewwoKittyGUI.java +++ b/src/main/java/hewwokitty/HewwoKittyGUI.java @@ -1,102 +1,102 @@ -package hewwokitty; - -import hewwokitty.parser.Parser; -import hewwokitty.storage.Storage; -import hewwokitty.task.TaskList; -import hewwokitty.ui.Ui; -import javafx.application.Application; -import javafx.geometry.Insets; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; - -/** - * JavaFX GUI for HewwoKitty chatbot. - */ -public class HewwoKittyGUI extends Application { - private TaskList taskList; - private Parser parser; - private TextArea chatArea; - private TextField userInput; - private ByteArrayOutputStream outputStream; - - /** - * Function for the initial creation of the GUI - * @param primaryStage A Stage - */ - @Override - public void start(Stage primaryStage) { - taskList = Storage.readFromFile(); - parser = new Parser(); - - primaryStage.setTitle("HewwoKitty Chatbot"); - - chatArea = new TextArea(); - chatArea.setEditable(false); - chatArea.setWrapText(true); - - ScrollPane scrollPane = new ScrollPane(chatArea); - scrollPane.setFitToWidth(true); - scrollPane.setFitToHeight(true); - - userInput = new TextField(); - userInput.setPromptText("Type your message..."); - - Button sendButton = new Button("Send"); - sendButton.setOnAction(e -> handleUserInput()); - - VBox layout = new VBox(10, scrollPane, userInput, sendButton); - layout.setPadding(new Insets(10)); - - primaryStage.setScene(new Scene(layout, 400, 500)); - primaryStage.show(); - - captureSystemOutput(); - Ui.printStart(); - appendCapturedOutput(); - } - - private void handleUserInput() { - String input = userInput.getText().trim(); - if (!input.isEmpty()) { - appendToChat("You: " + input); - - // Ensure only user input is passed to the parser - boolean isRunning = parser.parseCommands(input, taskList); - appendCapturedOutput(); - userInput.clear(); - - if (!isRunning) { - appendToChat("HewwoKitty: hewwo kitty is cwosing uwu~"); - System.exit(0); - } - } - } - - private void appendToChat(String message) { - chatArea.appendText(message + "\n"); - } - - private void captureSystemOutput() { - outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - } - - private void appendCapturedOutput() { - String output = outputStream.toString().trim(); - if (!output.isEmpty()) { - appendToChat(output); - outputStream.reset(); - } - } - - public static void main(String[] args) { - launch(args); - } -} +package hewwokitty; + +import hewwokitty.parser.Parser; +import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; +import hewwokitty.ui.Ui; +import javafx.application.Application; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +/** + * JavaFX GUI for HewwoKitty chatbot. + */ +@SuppressWarnings("checkstyle:AbbreviationAsWordInName") +public class HewwoKittyGUI extends Application { + private TaskList taskList; + private Parser parser; + private TextArea chatArea; + private TextField userInput; + private ByteArrayOutputStream outputStream; + + /** + * Function for the initial creation of the GUI + * @param primaryStage A Stage + */ + @Override + public void start(Stage primaryStage) { + taskList = Storage.readFromFile(); + parser = new Parser(); + + primaryStage.setTitle("HewwoKitty Chatbot"); + + chatArea = new TextArea(); + chatArea.setEditable(false); + chatArea.setWrapText(true); + + ScrollPane scrollPane = new ScrollPane(chatArea); + scrollPane.setFitToWidth(true); + scrollPane.setFitToHeight(true); + + userInput = new TextField(); + userInput.setPromptText("Type your message..."); + + Button sendButton = new Button("Send"); + sendButton.setOnAction(e -> handleUserInput()); + + VBox layout = new VBox(10, scrollPane, userInput, sendButton); + layout.setPadding(new Insets(10)); + + primaryStage.setScene(new Scene(layout, 400, 500)); + primaryStage.show(); + + captureSystemOutput(); + Ui.printStart(); + appendCapturedOutput(); + } + + private void handleUserInput() { + String input = userInput.getText().trim(); + if (!input.isEmpty()) { + appendToChat("You: " + input); + + boolean isRunning = parser.processUserCommands(input, taskList); + appendCapturedOutput(); + userInput.clear(); + + if (!isRunning) { + appendToChat("hewwo kitty is cwosing uwu~"); + System.exit(0); + } + } + } + + private void appendToChat(String message) { + chatArea.appendText(message + "\n"); + } + + private void captureSystemOutput() { + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + } + + private void appendCapturedOutput() { + String output = outputStream.toString().trim(); + if (!output.isEmpty()) { + appendToChat(output); + outputStream.reset(); + } + } + + public static void main(String[] args) { + launch(args); + } +} diff --git a/src/main/java/hewwokitty/parser/Parser.java b/src/main/java/hewwokitty/parser/Parser.java index 2e80aefe0f..75b2029a7d 100644 --- a/src/main/java/hewwokitty/parser/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -1,74 +1,80 @@ -package hewwokitty.parser; - -import java.util.Scanner; - -import hewwokitty.storage.Storage; -import hewwokitty.task.TaskList; -import hewwokitty.ui.Ui; - -/** - * Parser parses user input - * Allows user to interact with the chatbot - */ -public class Parser { - private String userInput = ""; - - /** - * Returns a Parser object that reads input from the user - */ - public Parser() { - - } - - /** - * Returns a boolean value indicating whether a command is valid and has been executed - * @param userInput String containing input from the user - * @param taskList TaskList from main that consists of Tasks that have been added by the user - * @return false if command user input is "bye", else true - */ - public boolean parseCommands(String userInput, TaskList taskList) { - assert userInput != null : "User input should not be null"; - assert taskList != null : "TaskList should not be null"; - this.userInput = userInput; - String userString = this.userInput.toLowerCase(); - switch (userString.split(" ", 2)[0]) { - case "bye": - return false; - case "list": - System.out.print(taskList); - break; - case "mark": - int markTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.markDone(markTaskNum); - Storage.writeToFile(taskList); - break; - case "unmark": - int unmarkTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.unmarkDone(unmarkTaskNum); - Storage.writeToFile(taskList); - break; - case "todo": - case "deadline": - case "event": - try { - taskList.addTask(userString); - Storage.writeToFile(taskList); - } catch (IllegalArgumentException e) { - Ui.printInvalidDate(); - } - break; - case "delete": - int deleteTaskNum = Integer.parseInt(userString.split(" ")[1]); - taskList.removeTask(deleteTaskNum); - Storage.writeToFile(taskList); - break; - case "find": - taskList.findTasks(userString); - break; - default: - Ui.printInvalidCommand(); - break; - } - return true; - } -} +package hewwokitty.parser; + +import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; +import hewwokitty.ui.Ui; + +/** + * Parser parses user input + * Allows user to interact with the chatbot + */ +public class Parser { + private String userInput = ""; + + /** + * Returns a Parser object that reads input from the user + */ + public Parser() { + + } + + /** + * Returns a boolean value indicating whether a command is valid and has been executed + * @param userInput String containing input from the user + * @param taskList TaskList from main that consists of Tasks that have been added by the user + * @return false if command user input is "bye", else true + */ + public boolean processUserCommands(String userInput, TaskList taskList) { + assert userInput != null : "User input should not be null"; + assert taskList != null : "TaskList should not be null"; + this.userInput = userInput; + String userString = this.userInput.toLowerCase(); + switch (userString.split(" ", 2)[0]) { + case "bye": + return false; + case "list": + System.out.print(taskList); + break; + case "mark": + try { + int markTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.markDone(markTaskNum); + Storage.writeToFile(taskList); + } catch (IllegalArgumentException e) { + Ui.printInvalidTaskNumber(); + } + break; + case "unmark": + try { + int unmarkTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.unmarkDone(unmarkTaskNum); + Storage.writeToFile(taskList); + } catch (IllegalArgumentException e) { + Ui.printInvalidTaskNumber(); + } + break; + case "todo": + case "deadline": + case "event": + try { + taskList.addTask(userString); + Storage.writeToFile(taskList); + } catch (IllegalArgumentException e) { + Ui.printInvalidDate(); + } + break; + case "delete": + int deleteTaskNum = Integer.parseInt(userString.split(" ")[1]); + taskList.removeTask(deleteTaskNum); + Storage.writeToFile(taskList); + break; + case "find": + taskList.findTasks(userString); + break; + default: + Ui.printInvalidCommand(); + break; + } + return true; + } +} diff --git a/src/main/java/hewwokitty/storage/Storage.java b/src/main/java/hewwokitty/storage/Storage.java index deb847c019..f793e9c234 100644 --- a/src/main/java/hewwokitty/storage/Storage.java +++ b/src/main/java/hewwokitty/storage/Storage.java @@ -1,115 +1,115 @@ -package hewwokitty.storage; - - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Scanner; - -import hewwokitty.task.Event; -import hewwokitty.task.Deadline; -import hewwokitty.task.TaskList; -import hewwokitty.task.Task; -import hewwokitty.task.Todo; - -/** - * Responsible for writing Tasks to and reading Tasks from file - * The created file is located at "data/hewwoTasks.txt" by default - */ -public class Storage { - /** - * Saves all the files in a given TaskList to file - * File is located at data/hewwoTasks.txt - * @param tasks TaskList generated by user - */ - public static void writeToFile(TaskList tasks) { - File file = new File("./data/hewwoTasks.txt"); - file.getParentFile().mkdirs(); - - try (FileWriter writer = new FileWriter(file, false)) { - writer.write(tasks.writeToFile()); - writer.close(); - } catch (IOException e) { - System.out.println("an ewwow occuwwed whiwe wwiting to the fiwe: " + e.getMessage()); - } - } - - /** - * Reads all the tasks saved in data/hewwoTasks.txt and converts them to a TaskList - * @return All tasks in data/hewwoTasks.txt as a TaskList - */ - public static TaskList readFromFile() { - File file = new File("./data/hewwoTasks.txt"); - TaskList taskList = new TaskList(); - if (!file.exists()) { - return taskList; - } - - try (Scanner scanner = new Scanner(file)) { - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - Task t = null; - String marked; - String command; - String temp; - boolean isMarked = false; - String message; - try { - command = line.split("\\|")[0]; - temp = line.split("\\|", 2)[1]; - } catch (Exception e) { - return taskList; - } - - switch (command) { - case "T": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|", 2)[1]; - t = new Todo(message); - if (isMarked) { - t.markAsDoneFile(); - } - break; - case "D": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|")[1]; - String byDate = temp.split("\\|")[2]; - t = new Deadline(message, byDate); - if (isMarked) { - t.markAsDoneFile(); - } - break; - case "E": - marked = temp.split("\\|")[0]; - isMarked = checkMarked(marked); - message = temp.split("\\|")[1]; - String fromDate = temp.split("\\|")[2]; - String toDate = temp.split("\\|")[3]; - t = new Event(message, fromDate, toDate); - if (isMarked) { - t.markAsDoneFile(); - } - break; - default: - break; - } - if (t != null) { - taskList.addTaskFromFile(t); - } - } - } catch (FileNotFoundException e) { - return taskList; - } - return taskList; - } - - private static boolean checkMarked(String s) { - if (s.equals("1")) { - return true; - } - return false; - } -} +package hewwokitty.storage; + + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; + +import hewwokitty.task.Event; +import hewwokitty.task.Deadline; +import hewwokitty.task.TaskList; +import hewwokitty.task.Task; +import hewwokitty.task.Todo; + +/** + * Responsible for writing Tasks to and reading Tasks from file + * The created file is located at "data/hewwoTasks.txt" by default + */ +public class Storage { + /** + * Saves all the files in a given TaskList to file + * File is located at data/hewwoTasks.txt + * @param tasks TaskList generated by user + */ + public static void writeToFile(TaskList tasks) { + File file = new File("./data/hewwoTasks.txt"); + file.getParentFile().mkdirs(); + + try (FileWriter writer = new FileWriter(file, false)) { + writer.write(tasks.writeToFile()); + writer.close(); + } catch (IOException e) { + System.out.println("an ewwow occuwwed whiwe wwiting to the fiwe: " + e.getMessage()); + } + } + + /** + * Reads all the tasks saved in data/hewwoTasks.txt and converts them to a TaskList + * @return All tasks in data/hewwoTasks.txt as a TaskList + */ + public static TaskList readFromFile() { + File file = new File("./data/hewwoTasks.txt"); + TaskList taskList = new TaskList(); + if (!file.exists()) { + return taskList; + } + + try (Scanner scanner = new Scanner(file)) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + Task t = null; + String marked; + String command; + String temp; + boolean isMarked = false; + String message; + try { + command = line.split("\\|")[0]; + temp = line.split("\\|", 2)[1]; + } catch (Exception e) { + return taskList; + } + + switch (command) { + case "T": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|", 2)[1]; + t = new Todo(message); + if (isMarked) { + t.markAsDoneFile(); + } + break; + case "D": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|")[1]; + String byDate = temp.split("\\|")[2]; + t = new Deadline(message, byDate); + if (isMarked) { + t.markAsDoneFile(); + } + break; + case "E": + marked = temp.split("\\|")[0]; + isMarked = checkMarked(marked); + message = temp.split("\\|")[1]; + String fromDate = temp.split("\\|")[2]; + String toDate = temp.split("\\|")[3]; + t = new Event(message, fromDate, toDate); + if (isMarked) { + t.markAsDoneFile(); + } + break; + default: + break; + } + if (t != null) { + taskList.addTaskFromFile(t); + } + } + } catch (FileNotFoundException e) { + return taskList; + } + return taskList; + } + + private static boolean checkMarked(String s) { + if (s.equals("1")) { + return true; + } + return false; + } +} diff --git a/src/main/java/hewwokitty/task/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java index 401cd3fb0b..8ace45822c 100644 --- a/src/main/java/hewwokitty/task/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -1,51 +1,51 @@ -package hewwokitty.task; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; - -import hewwokitty.ui.Ui; - -/** - * Represents a type of Task that needs to be completed before a certain date - */ -public class Deadline extends Task { - private LocalDate deadline; - - /** - * Returns a Deadline object - * @param description A string describing what the Deadline is for - * @param dateEntered A string in the format yyyy-MM-dd for when the task should be completed - */ - public Deadline(String description, String dateEntered) { - super(description); - try { - this.deadline = LocalDate.parse(dateEntered); - } catch (DateTimeParseException e) { - throw new IllegalArgumentException(""); - } - } - - /** - * Formats a string into the format meant to save to file - * @return A String that has been formatted with the type Deadline, isDone, - * the deadline description and when it is due - */ - @Override - public String writeToFile() { - return "D|" + super.writeToFile() + "|" + this.deadline + "\n"; - } - - /** - * Formats a string into the format that is displayed to the user - * @return A String to display the Deadline information to the user - */ - @Override - public String toString() { - return "[D]" + super.toString() + "(by: " + this.printDeadline() + ")"; - } - - private String printDeadline() { - return this.deadline.format(DateTimeFormatter.ofPattern("MMM d yyyy")); - } -} +package hewwokitty.task; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +import hewwokitty.ui.Ui; + +/** + * Represents a type of Task that needs to be completed before a certain date + */ +public class Deadline extends Task { + private LocalDate deadline; + + /** + * Returns a Deadline object + * @param description A string describing what the Deadline is for + * @param dateEntered A string in the format yyyy-MM-dd for when the task should be completed + */ + public Deadline(String description, String dateEntered) { + super(description); + try { + this.deadline = LocalDate.parse(dateEntered); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException(""); + } + } + + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Deadline, isDone, + * the deadline description and when it is due + */ + @Override + public String writeToFile() { + return "D|" + super.writeToFile() + "|" + this.deadline + "\n"; + } + + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Deadline information to the user + */ + @Override + public String toString() { + return "[D]" + super.toString() + "(by: " + this.printDeadline() + ")"; + } + + private String printDeadline() { + return this.deadline.format(DateTimeFormatter.ofPattern("MMM d yyyy")); + } +} diff --git a/src/main/java/hewwokitty/task/Event.java b/src/main/java/hewwokitty/task/Event.java index a272edae5b..097eec78f3 100644 --- a/src/main/java/hewwokitty/task/Event.java +++ b/src/main/java/hewwokitty/task/Event.java @@ -1,39 +1,39 @@ -package hewwokitty.task; - -/** - * Represents a type of Task that is an event carried out over a time period - */ -public class Event extends Task { - private String fromDate; - private String toDate; - - /** - * Returns an Event object - * @param message A string describing what the Event is about - * @param fromDate A string representing when the Event starts - * @param toDate A string representing when the Event ends - */ - public Event(String message, String fromDate, String toDate) { - super(message); - this.fromDate = fromDate; - this.toDate = toDate; - } - - /** - * Formats a string into the format meant to save to file - * @return A String that has been formatted with the type Event, isDone, fromDate and toDate - */ - @Override - public String writeToFile() { - return "E|" + super.writeToFile() + "|" + this.fromDate + "|" + this.toDate + "\n"; - } - - /** - * Formats a string into the format that is displayed to the user - * @return A String to display the Event information to the user - */ - @Override - public String toString() { - return "[E]" + super.toString() + "(from: " + this.fromDate + " to: " + this.toDate + ")"; - } -} +package hewwokitty.task; + +/** + * Represents a type of Task that is an event carried out over a time period + */ +public class Event extends Task { + private String fromDate; + private String toDate; + + /** + * Returns an Event object + * @param message A string describing what the Event is about + * @param fromDate A string representing when the Event starts + * @param toDate A string representing when the Event ends + */ + public Event(String message, String fromDate, String toDate) { + super(message); + this.fromDate = fromDate; + this.toDate = toDate; + } + + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Event, isDone, fromDate and toDate + */ + @Override + public String writeToFile() { + return "E|" + super.writeToFile() + "|" + this.fromDate + "|" + this.toDate + "\n"; + } + + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Event information to the user + */ + @Override + public String toString() { + return "[E]" + super.toString() + "(from: " + this.fromDate + " to: " + this.toDate + ")"; + } +} diff --git a/src/main/java/hewwokitty/task/Task.java b/src/main/java/hewwokitty/task/Task.java index 248ad45f4e..757a3d4953 100644 --- a/src/main/java/hewwokitty/task/Task.java +++ b/src/main/java/hewwokitty/task/Task.java @@ -1,90 +1,90 @@ -package hewwokitty.task; - -/** - * Represents the task that user wants to keep track of, as an Object - */ -public abstract class Task { - private boolean isDone; - private String description; - - /** - * Returns a Task object containing the description - * @param description A String describing what the task is for - */ - public Task(String description) { - this.description = description; - this.isDone = false; - } - - /** - * Returns the description of the Task - * @return A String containing the task description - */ - public String getDescription() { - return this.description; - } - /** - * Marks a Task as completed when loading from file - * Does not print the Task completion message - */ - public void markAsDoneFile() { - this.isDone = true; - } - - /** - * Marks a Task as completed based on user input - * Prints a completion message - */ - public void markAsDone() { - this.isDone = true; - System.out.println("*************************************************"); - System.out.println("hewwo kitty is so pwoud of youw fow compweting this task!"); - System.out.println("[X]" + this.description); - System.out.println("*************************************************"); - } - - /** - * Unmarks a Task as completed - * Prints an incompletion message - */ - public void unmarkAsDone() { - this.isDone = false; - System.out.println("*************************************************"); - System.out.println("this task has been mawked as not done :("); - System.out.println("[ ]" + this.description); - System.out.println("*************************************************"); - } - - private String printIsDone() { - if (this.isDone) { - return "[X] "; - } - return "[ ] "; - } - - /** - * Formats a string into the format meant to save to file - * The string displays isDone as 0 or 1 if it has been completed - * @return A String that has been formatted with isDone and the Task description - */ - public String writeToFile() { - return this.getMarkAsInt() + "|" + this.description; - } - - private int getMarkAsInt() { - if (this.isDone) { - return 1; - } - return 0; - } - - /** - * Formats a string into the format that is displayed to the user - * The String displays isDone and the Task description - * @return A String to display the Task information to the user - */ - @Override - public String toString() { - return this.printIsDone() + this.description; - } -} +package hewwokitty.task; + +/** + * Represents the task that user wants to keep track of, as an Object + */ +public abstract class Task { + private boolean isDone; + private String description; + + /** + * Returns a Task object containing the description + * @param description A String describing what the task is for + */ + public Task(String description) { + this.description = description; + this.isDone = false; + } + + /** + * Returns the description of the Task + * @return A String containing the task description + */ + public String getDescription() { + return this.description; + } + /** + * Marks a Task as completed when loading from file + * Does not print the Task completion message + */ + public void markAsDoneFile() { + this.isDone = true; + } + + /** + * Marks a Task as completed based on user input + * Prints a completion message + */ + public void markAsDone() { + this.isDone = true; + System.out.println("*************************************************"); + System.out.println("hewwo kitty is so pwoud of youw fow compweting this task!"); + System.out.println("[X]" + this.description); + System.out.println("*************************************************"); + } + + /** + * Unmarks a Task as completed + * Prints an incompletion message + */ + public void unmarkAsDone() { + this.isDone = false; + System.out.println("*************************************************"); + System.out.println("this task has been mawked as not done :("); + System.out.println("[ ]" + this.description); + System.out.println("*************************************************"); + } + + private String printIsDone() { + if (this.isDone) { + return "[X] "; + } + return "[ ] "; + } + + /** + * Formats a string into the format meant to save to file + * The string displays isDone as 0 or 1 if it has been completed + * @return A String that has been formatted with isDone and the Task description + */ + public String writeToFile() { + return this.getMarkAsInt() + "|" + this.description; + } + + private int getMarkAsInt() { + if (this.isDone) { + return 1; + } + return 0; + } + + /** + * Formats a string into the format that is displayed to the user + * The String displays isDone and the Task description + * @return A String to display the Task information to the user + */ + @Override + public String toString() { + return this.printIsDone() + this.description; + } +} diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index 7165892c2b..267289cb56 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -1,152 +1,161 @@ -package hewwokitty.task; - -import java.util.ArrayList; -import hewwokitty.ui.Ui; - -/** - * A list of Task objects - */ -public class TaskList { - private ArrayList tasks; - - /** - * Returns an empty TaskList - */ - public TaskList() { - this.tasks = new ArrayList(); - } - - /** - * Get the number of Tasks in a TaskList - * @return An int with the number of Tasks in the TaskList - */ - public int getSize() { - return this.tasks.size(); - } - - /** - * Marks Task as done at a given order in the TaskList - * @param i An int representing the order of the Task in TaskList - */ - public void markDone(int i) { - this.tasks.get(i - 1).markAsDone(); - } - - /** - * Unmarks Task as done at a given order in the TaskList - * @param i An int representing the order of the Task in TaskList - */ - public void unmarkDone(int i) { - this.tasks.get(i - 1).unmarkAsDone(); - } - - /** - * Adds a Task to the TaskList based on the user specifications - * Checks user input and creates a Todo, Deadline or Event object accordingly - * @param userString A String that consists of the user input - */ - public void addTask(String userString) { - assert userString != null; - Task t = null; - String message; - String command = userString.split(" ")[0]; - String temp; - - switch (command) { - case "todo": - temp = userString.split(" " , 2)[1]; - if (!temp.equals("")) { - t = new Todo(temp); - } else { - Ui.printInvalidDescription(); - } - break; - case "deadline": - temp = userString.split(" " , 2)[1]; - message = temp.split("/")[0]; - String date = temp.split("/")[1].split(" " , 2)[1]; - t = new Deadline(message, date); - break; - case "event": - temp = userString.split(" ",2)[1]; - message = temp.split("/")[0]; - String fromDate = temp.split("/")[1].split(" " , 2)[1]; - String toDate = temp.split("/")[2].split(" " , 2)[1]; - t = new Event(message, fromDate, toDate); - break; - } - if (t != null) { - this.tasks.add(t); - System.out.println("*************************************************"); - System.out.println("i've added youw new task: \n" + t); - System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); - System.out.println("*************************************************"); - } - } - - /** - * Removes a Task from TaskList - * @param i An integer representing the order of the Task in the TaskList - */ - public void removeTask(int i) { - System.out.println("*************************************************"); - System.out.println("i've wemoved youw task: \n" + this.tasks.get(i - 1).toString()); - this.tasks.remove(i - 1); - System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); - System.out.println("*************************************************"); - } - - /** - * Adds each Task in the data/hewwoTasks.txt file to a TaskList - * @param task A Task read from the data file - */ - public void addTaskFromFile(Task task) { - this.tasks.add(task); - } - - /** - * Formats all the Tasks in the TaskList to be written to an output file - * @return All the Tasks in TaskList as a String - */ - public String writeToFile() { - String s = ""; - for (Task t : tasks) { - s = s + t.writeToFile(); - } - return s; - } - - /** - * Formats all the Taks in the TaskList to be displayed to the user - * @return All the Tasks in TaskList as a String - */ - @Override - public String toString() { - String border = "*************************************************\n"; - String s = ""; - for (int i = 0; i < this.tasks.size(); i++) { - int currTask = i + 1; - s += currTask + ". " + this.tasks.get(i).toString() + "\n"; - } - return border + s + border; - } - - /** - * Finds a Task in TaskList that contains the keyword entered by the user - * @param userString A String representing user input - */ - public void findTasks(String userString) { - String border = "*************************************************\n"; - String title = "hewe awe the matching tasks in youw wist!\n"; - String s = border + title; - String keyword = userString.split(" ",2)[1]; - int count = 1; - for (Task t : this.tasks) { - if (t.getDescription().contains(keyword)) { - s = s + count + "." + t.toString() + "\n"; - count++; - } - } - System.out.print(s + border); - } -} +package hewwokitty.task; + +import java.util.ArrayList; + +import hewwokitty.ui.Ui; + +/** + * A list of Task objects + */ +public class TaskList { + private ArrayList tasks; + + /** + * Returns an empty TaskList + */ + public TaskList() { + this.tasks = new ArrayList(); + } + + /** + * Get the number of Tasks in a TaskList + * @return An int with the number of Tasks in the TaskList + */ + public int getSize() { + return this.tasks.size(); + } + + /** + * Marks Task as done at a given order in the TaskList + * @param i An int representing the order of the Task in TaskList + */ + public void markDone(int i) { + try { + this.tasks.get(i - 1).markAsDone(); + } catch (IndexOutOfBoundsException e) { + throw new IllegalArgumentException(""); + } + } + + /** + * Unmarks Task as done at a given order in the TaskList + * @param i An int representing the order of the Task in TaskList + */ + public void unmarkDone(int i) { + try { + this.tasks.get(i - 1).unmarkAsDone(); + } catch (IndexOutOfBoundsException e) { + throw new IllegalArgumentException(""); + } + } + + /** + * Adds a Task to the TaskList based on the user specifications + * Checks user input and creates a Todo, Deadline or Event object accordingly + * @param userString A String that consists of the user input + */ + public void addTask(String userString) { + assert userString != null; + Task t = null; + String message; + String command = userString.split(" ")[0]; + String temp; + + switch (command) { + case "todo": + temp = userString.split(" " , 2)[1]; + if (!temp.equals("")) { + t = new Todo(temp); + } else { + Ui.printInvalidDescription(); + } + break; + case "deadline": + temp = userString.split(" " , 2)[1]; + message = temp.split("/")[0]; + String date = temp.split("/")[1].split(" " , 2)[1]; + t = new Deadline(message, date); + break; + case "event": + temp = userString.split(" ",2)[1]; + message = temp.split("/")[0]; + String fromDate = temp.split("/")[1].split(" " , 2)[1]; + String toDate = temp.split("/")[2].split(" " , 2)[1]; + t = new Event(message, fromDate, toDate); + break; + } + if (t != null) { + this.tasks.add(t); + System.out.println("*************************************************"); + System.out.println("i've added youw new task: \n" + t); + System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); + System.out.println("*************************************************"); + } + } + + /** + * Removes a Task from TaskList + * @param i An integer representing the order of the Task in the TaskList + */ + public void removeTask(int i) { + System.out.println("*************************************************"); + System.out.println("i've wemoved youw task: \n" + this.tasks.get(i - 1).toString()); + this.tasks.remove(i - 1); + System.out.println("you now hawve " + this.tasks.size() + " tasks, ganbatte"); + System.out.println("*************************************************"); + } + + /** + * Adds each Task in the data/hewwoTasks.txt file to a TaskList + * @param task A Task read from the data file + */ + public void addTaskFromFile(Task task) { + this.tasks.add(task); + } + + /** + * Formats all the Tasks in the TaskList to be written to an output file + * @return All the Tasks in TaskList as a String + */ + public String writeToFile() { + String s = ""; + for (Task t : tasks) { + s = s + t.writeToFile(); + } + return s; + } + + /** + * Formats all the Taks in the TaskList to be displayed to the user + * @return All the Tasks in TaskList as a String + */ + @Override + public String toString() { + String border = "*************************************************\n"; + String s = ""; + for (int i = 0; i < this.tasks.size(); i++) { + int currTask = i + 1; + s += currTask + ". " + this.tasks.get(i).toString() + "\n"; + } + return border + s + border; + } + + /** + * Finds a Task in TaskList that contains the keyword entered by the user + * @param userString A String representing user input + */ + public void findTasks(String userString) { + String border = "*************************************************\n"; + String title = "hewe awe the matching tasks in youw wist!\n"; + String s = border + title; + String keyword = userString.split(" ",2)[1]; + int count = 1; + for (Task t : this.tasks) { + if (t.getDescription().contains(keyword)) { + s = s + count + "." + t.toString() + "\n"; + count++; + } + } + System.out.print(s + border); + } +} diff --git a/src/main/java/hewwokitty/task/Todo.java b/src/main/java/hewwokitty/task/Todo.java index 4a65dd7fc9..72659e932d 100644 --- a/src/main/java/hewwokitty/task/Todo.java +++ b/src/main/java/hewwokitty/task/Todo.java @@ -1,33 +1,33 @@ -package hewwokitty.task; - -/** - * Represents a type of Task with a description - */ -public class Todo extends Task { - /** - * Returns a Todo object - * @param message A string describing what the Todo is about - */ - public Todo(String message) { - super(message); - } - - /** - * Formats a string into the format meant to save to file - * @return A String that has been formatted with the type Todo, isDone and description - */ - @Override - public String writeToFile() { - return "T|" + super.writeToFile() + "\n"; - } - - /** - * Formats a string into the format that is displayed to the user - * @return A String to display the Todo information to the user - */ - @Override - public String toString() { - return "[T]" + super.toString(); - } - -} +package hewwokitty.task; + +/** + * Represents a type of Task with a description + */ +public class Todo extends Task { + /** + * Returns a Todo object + * @param message A string describing what the Todo is about + */ + public Todo(String message) { + super(message); + } + + /** + * Formats a string into the format meant to save to file + * @return A String that has been formatted with the type Todo, isDone and description + */ + @Override + public String writeToFile() { + return "T|" + super.writeToFile() + "\n"; + } + + /** + * Formats a string into the format that is displayed to the user + * @return A String to display the Todo information to the user + */ + @Override + public String toString() { + return "[T]" + super.toString(); + } + +} diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index 03ef4ab969..1819af710c 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -1,63 +1,73 @@ -package hewwokitty.ui; - -/** - * Consists of all the interface text displayed to the user - */ -public class Ui { - /** - * Displays the starting message upon launching the chatbot - */ - public static void printStart() { - String logo = - ".__ __ .__ __ __ \n" - + "| |__ ______ _ ____ _ ______ | | _|__|/ |__/ |_ ___.__.\n" - + "| | \\_/ __ \\ \\/ \\/ /\\ \\/ \\/ / _ \\| |/ / \\ __\\ __< | |\n" - + "| Y \\ ___/\\ / \\ ( <_> ) <| || | | | \\___ |\n" - + "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" - + " \\/ \\/ \\/ \\/ \n"; - - System.out.println(logo); - System.out.println("*************************************************"); - System.out.println("hewwo! i'm hewwo kitty!"); - System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuwuwuwuwuuwuwuw"); - System.out.println("*************************************************"); - } - - /** - * Displays the closing message when user ends the chatbot - */ - public static void printBye() { - System.out.println("*************************************************"); - System.out.println("goodbwye! uwu"); - System.out.println("*************************************************"); - } - - /** - * Displays a message to the user when their command is not recognised - */ - public static void printInvalidCommand() { - System.out.println("*************************************************"); - System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); - System.out.println("*************************************************"); - } - - /** - * Displays a message to the user telling them that they have entered an invalid - * description for a Todo object - */ - public static void printInvalidDescription() { - System.out.println("*************************************************"); - System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); - System.out.println("*************************************************"); - } - - /** - * Displays a message to the user telling them that they have entered a date - * in an invalid format for a Deadline object - */ - public static void printInvalidDate() { - System.out.println("*************************************************"); - System.out.println("date and time entewed shouwd be in yyyy-MM-dd ) <| || | | | \\___ |\n" + + "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" + + " \\/ \\/ \\/ \\/ \n"; + + System.out.println(logo); + System.out.println("*************************************************"); + System.out.println("hewwo! i'm hewwo kitty!"); + System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuwuwuwuwuuwuwuw"); + System.out.println("*************************************************"); + } + + /** + * Displays the closing message when user ends the chatbot + */ + public static void printBye() { + System.out.println("*************************************************"); + System.out.println("goodbwye! uwu"); + System.out.println("*************************************************"); + } + + /** + * Displays a message to the user when their command is not recognised + */ + public static void printInvalidCommand() { + System.out.println("*************************************************"); + System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); + System.out.println("*************************************************"); + } + + /** + * Displays a message to the user telling them that they have entered an invalid + * description for a Todo object + */ + public static void printInvalidDescription() { + System.out.println("*************************************************"); + System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); + System.out.println("*************************************************"); + } + + /** + * Displays a message to the user telling them that they have entered a date + * in an invalid format for a Deadline object + */ + public static void printInvalidDate() { + System.out.println("*************************************************"); + System.out.println("date and time entewed shouwd be in yyyy-MM-dd ACTUAL.TXT - -REM compare the output to the expected output -FC ACTUAL.TXT EXPECTED.TXT +@ECHO OFF + +REM create bin directory if it doesn't exist +if not exist ..\bin mkdir ..\bin + +REM delete output from previous run +if exist ACTUAL.TXT del ACTUAL.TXT + +REM compile the code into the bin folder +javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java +IF ERRORLEVEL 1 ( + echo ********** BUILD FAILURE ********** + exit /b 1 +) +REM no error here, errorlevel == 0 + +REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT +java -classpath ..\bin HewwoKitty < input.txt > ACTUAL.TXT + +REM compare the output to the expected output +FC ACTUAL.TXT EXPECTED.TXT diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index c9ec870033..cf8a36c1c2 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -1,38 +1,38 @@ -#!/usr/bin/env bash - -# create bin directory if it doesn't exist -if [ ! -d "../bin" ] -then - mkdir ../bin -fi - -# delete output from previous run -if [ -e "./ACTUAL.TXT" ] -then - rm ACTUAL.TXT -fi - -# compile the code into the bin folder, terminates if error occurred -if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java -then - echo "********** BUILD FAILURE **********" - exit 1 -fi - -# run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ../bin Duke < input.txt > ACTUAL.TXT - -# convert to UNIX format -cp EXPECTED.TXT EXPECTED-UNIX.TXT -dos2unix ACTUAL.TXT EXPECTED-UNIX.TXT - -# compare the output to the expected output -diff ACTUAL.TXT EXPECTED-UNIX.TXT -if [ $? -eq 0 ] -then - echo "Test result: PASSED" - exit 0 -else - echo "Test result: FAILED" - exit 1 +#!/usr/bin/env bash + +# create bin directory if it doesn't exist +if [ ! -d "../bin" ] +then + mkdir ../bin +fi + +# delete output from previous run +if [ -e "./ACTUAL.TXT" ] +then + rm ACTUAL.TXT +fi + +# compile the code into the bin folder, terminates if error occurred +if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java +then + echo "********** BUILD FAILURE **********" + exit 1 +fi + +# run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT +java -classpath ../bin Duke < input.txt > ACTUAL.TXT + +# convert to UNIX format +cp EXPECTED.TXT EXPECTED-UNIX.TXT +dos2unix ACTUAL.TXT EXPECTED-UNIX.TXT + +# compare the output to the expected output +diff ACTUAL.TXT EXPECTED-UNIX.TXT +if [ $? -eq 0 ] +then + echo "Test result: PASSED" + exit 0 +else + echo "Test result: FAILED" + exit 1 fi \ No newline at end of file From 900c3ae2967be51d919ed6ba7f3dcc33785d3aaa Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 19:17:57 +0800 Subject: [PATCH 36/43] Add extension to allow for partial keyword searches --- data/hewwoTasks.txt | 2 +- src/main/java/hewwokitty/task/TaskList.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index 3fdb98fc03..00d10ab68d 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,2 +1,2 @@ T|0|cry -T|1|drugs +T|0|die diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index 267289cb56..573743a9a5 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -146,16 +146,21 @@ public String toString() { */ public void findTasks(String userString) { String border = "*************************************************\n"; - String title = "hewe awe the matching tasks in youw wist!\n"; - String s = border + title; + String title; + String s = ""; String keyword = userString.split(" ",2)[1]; int count = 1; for (Task t : this.tasks) { - if (t.getDescription().contains(keyword)) { + if (t.getDescription().toLowerCase().contains(keyword)) { s = s + count + "." + t.toString() + "\n"; count++; } } - System.out.print(s + border); + if (count == 1) { + title = "sowwy pookie, i couwdn't fiwnd any matches :3\n"; + } else { + title = "hewe awe the matching tasks in youw wist!\n"; + } + System.out.print(border + title + s + border); } } From 5e7833421c8027e90d51b25b6b5dad78604f2a2c Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 19:24:11 +0800 Subject: [PATCH 37/43] Added assertions --- src/main/java/hewwokitty/parser/Parser.java | 4 ++-- src/main/java/hewwokitty/task/TaskList.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/hewwokitty/parser/Parser.java b/src/main/java/hewwokitty/parser/Parser.java index 2e80aefe0f..834d384382 100644 --- a/src/main/java/hewwokitty/parser/Parser.java +++ b/src/main/java/hewwokitty/parser/Parser.java @@ -27,8 +27,8 @@ public Parser() { * @return false if command user input is "bye", else true */ public boolean parseCommands(String userInput, TaskList taskList) { - assert userInput != null : "User input should not be null"; - assert taskList != null : "TaskList should not be null"; + assert userInput != null : "usew input should not be nuww"; + assert taskList != null : "TaskList should not be nuww"; this.userInput = userInput; String userString = this.userInput.toLowerCase(); switch (userString.split(" ", 2)[0]) { diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index 7165892c2b..2ae51a17f8 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -136,6 +136,7 @@ public String toString() { * @param userString A String representing user input */ public void findTasks(String userString) { + assert userString != null : "usew input should not be nuww"; String border = "*************************************************\n"; String title = "hewe awe the matching tasks in youw wist!\n"; String s = border + title; From 507ca9c8d00e8a81dce36f79e56071ca7f006e69 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 19:24:53 +0800 Subject: [PATCH 38/43] Fix minor issues with structure --- src/main/java/hewwokitty/task/TaskList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index 267289cb56..dd74fa8f33 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -126,7 +126,7 @@ public String writeToFile() { } /** - * Formats all the Taks in the TaskList to be displayed to the user + * Formats all the Tasks in the TaskList to be displayed to the user * @return All the Tasks in TaskList as a String */ @Override From 96aa3a6cfde956f7ecfe3f8f8a16e7f3ade2ce09 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 19:28:04 +0800 Subject: [PATCH 39/43] Add assertions for findTask in TaskList --- src/main/java/hewwokitty/task/TaskList.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index dd74fa8f33..7a244642fb 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -146,16 +146,21 @@ public String toString() { */ public void findTasks(String userString) { String border = "*************************************************\n"; - String title = "hewe awe the matching tasks in youw wist!\n"; - String s = border + title; + String title; + String s = ""; String keyword = userString.split(" ",2)[1]; int count = 1; for (Task t : this.tasks) { - if (t.getDescription().contains(keyword)) { + if (t.getDescription().toLowerCase().contains(keyword)) { s = s + count + "." + t.toString() + "\n"; count++; } } - System.out.print(s + border); + if (count == 1) { + title = "sowwy pookie, i couwdn't fiwnd any matches :3\n"; + } else { + title = "hewe awe the matching tasks in youw wist!\n"; + } + System.out.print(border + title + s + border); } } From 368fd765b65842b65266f4fb2171d8c78aa36ae9 Mon Sep 17 00:00:00 2001 From: reaneechua Date: Thu, 27 Feb 2025 19:50:15 +0800 Subject: [PATCH 40/43] Update readme --- docs/README.md | 60 ++++++++++++++++++++++++------------------------- docs/img.png | Bin 0 -> 32089 bytes docs/img_1.png | Bin 0 -> 32089 bytes 3 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 docs/img.png create mode 100644 docs/img_1.png diff --git a/docs/README.md b/docs/README.md index 50e71cbaaf..7f6e822732 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,30 +1,30 @@ -# Duke User Guide - -// Update the title above to match the actual product name - -// Product screenshot goes here - -// Product intro goes here - -## Adding deadlines - -// Describe the action and its outcome. - -// Give examples of usage - -Example: `keyword (optional arguments)` - -// A description of the expected outcome goes here - -``` -expected output -``` - -## Feature ABC - -// Feature details - - -## Feature XYZ - -// Feature details \ No newline at end of file +# HewwoKitty Usew Guide UwU + +![img.png](img.png) + +## Managing Tasks + +hewwokitty can hewp you keep twack of many twypes of tasks! + +**how to use!** + 1. todo [description] + 1. creates a Todo task +2. deadline [description] /by [date in yyyy-MM-dd] + 1. creates a Deadline task +3. event [description] /from [start date] /to [end date] + 1. creates an Event task +4. list + 1. lists all tasks +5. mark [task number] and unmark [task number] + 1. marks a task as complete/incomplete based on the order in the list +6. delete [task number] + 1. removes a task from the list based on the order in the lsit +7. find [keyword] + 1. summarises a list of tasks that contain that keyword + 2. partial searches are possible e.g searching "cry" will also return tasks that are about "crying" + +## Some Exceptions +hewwokitty stwuggwes with some exceptions, hewe is what **NOT** to enter +1. do not leave any fields blank +2. dates which are not in yyyy-MM-dd will not be accepted +3. meowmeowmeowmeowmeow (i am a cat) diff --git a/docs/img.png b/docs/img.png new file mode 100644 index 0000000000000000000000000000000000000000..3d6b176101addbee615158d7610af16949947dcb GIT binary patch literal 32089 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�Y=1} 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�Y=1} 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 Date: Thu, 27 Feb 2025 20:44:44 +0800 Subject: [PATCH 41/43] Improve GUI to have asymmetric text between bot and user --- data/hewwoTasks.txt | 2 +- docs/README.md | 2 +- docs/Ui.png | Bin 0 -> 61211 bytes docs/img.png | Bin 32089 -> 0 bytes docs/img_1.png | Bin 32089 -> 0 bytes src/main/java/hewwokitty/HewwoKittyGUI.java | 45 +++++++++++++++----- src/main/java/hewwokitty/task/Task.java | 6 +-- src/main/java/hewwokitty/task/TaskList.java | 10 +---- src/main/java/hewwokitty/ui/Ui.java | 31 ++++++-------- 9 files changed, 51 insertions(+), 45 deletions(-) create mode 100644 docs/Ui.png delete mode 100644 docs/img.png delete mode 100644 docs/img_1.png diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index 00d10ab68d..2f01e0dd9d 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,2 +1,2 @@ T|0|cry -T|0|die +D|0|homework |2025-01-01 diff --git a/docs/README.md b/docs/README.md index 7f6e822732..ceb07df1b5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # HewwoKitty Usew Guide UwU -![img.png](img.png) +![Ui.png](Ui.png) ## Managing Tasks diff --git a/docs/Ui.png b/docs/Ui.png new file mode 100644 index 0000000000000000000000000000000000000000..6919b20c6ffaee003967b4285e9919260d9255b4 GIT binary patch literal 61211 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 literal 0 HcmV?d00001 diff --git a/docs/img.png b/docs/img.png deleted file mode 100644 index 3d6b176101addbee615158d7610af16949947dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32089 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�Y=1} zsp98NaiyBZft!kN!A}MBfV+&$W+0TrAn~4-7Y2SVFIQa26^nZXWWzxvIt^UbON~ma!?;p)0s*FbxN6E1mr4Q^Y*pc8GpBP%r1@-06#ZG+r^;FRx z)WS@w?`&$=)vg>^()>3mt6Uiu|AHB1291hOB-Olae9n<(N&EK7a;IrlX(nr@YX(6f zbRXhTBkUzqMRcSQP-;aI+Y#Y9znULE>?c%Ad?KvY)A~qrPtZ09^>$i3GkzbKm2Qa> z*RI8`BaGspbrK!WsQ)Er;ACF7v!iVfv&yH3G#LetSa+Ncu4cFx(dXpQv)h5=(nbzW z6_Gn`;%n;>Glf@i`ukK&+HD1<=YrSW>%r{a>ey%)JVvrr7kn}42;a^iaFl|4 zBfI*#(MrnL3(1(#Z+)^gooJ?y3UVj721YweIft@wKG|en%-V&k1At6)`o37MQaSl_ z*?pUM{s%rd9PSw|jbcGAu0%r`9|G>ksRj3Hd{JcLhPd4bOSJ`jER|Wzf|&dw%>nmY zLe9S?9)+LpDwv4!w#DGfYN86U$RaCg_hk|Jo#j*e z_BJSWkAb#}kA!)z86gAlSBHqpsR8)i0UOU`TjN!P_e4bvJC-??p8NPUq^H1EYx$k% zVBwQF>v5T)U@|xLs@#M@hv0sG05%tM&d+b>ppqb>Zx3x$^VJDkL8vvqCh8ms$Eg!z zy~=3RFL5#m|KbN4&VG`L1+g?BgHVt5Gr=A`z0V!If>EXJE$LU4RE2h{k1HDoir&MW zcmd#!*1O!H<;<&gq{?C|4MLOSCe@9wp8@dQ?iuVpUdGF=g>q@rc6g>zC2azL#uWFf z6qlZPe(frAWOVcs45V!{GcgeQB?17KK7l|d&tO%;yy3?*u~9FzaE`8m3J{EKW>geL zGCB(;0%mLAk)J|R^$5ULu6AJIXnaOp(p|XP?u-2i_}w|fXd=i=o+mfwrqh% zay;xqSF}N6tV9vYrGhwe7(6E`{~lvjpqe?Nkl6prB_I0gHayq~F?Q*;Nx| zB>=dqScz>P@Q|lTx8RTRB5zh~%*u-3L@*9EP{q+&66X*g{%=E=z%O-;n$JS+F7)ai zea{zyCV{u!qIvIL0Rc|yh9o&M1Uf%T@;-ZG1s_~~)^}lp<@rUF)&r5s)d%Ji(CHFt zB!tej^LK23$2NWiCf0ktNcdXMEH;+c9xQcRWIO-zPea$GuxaMPVH$kFgUbzIMQ`-j zT-m2nMWq`w2K0lj%#RBeqOOkIJ@PXp;IKLgQHw=eh}U+ul!W87#VPg`%(u5N=wWn? zoc-=SWXbM@6lpyxd*28s=1N3}+)q9}Yw11?TC|seTE{Y*0utBy1YX?Dd?x0*Rf6cJzR?ge`$V~v{rqm(UJB*+!2%4@WHP4jeuBe7OQe`rMA^i zwA`gI6-|>h=NZ-2d!KQ~dnyczZ{db&NEr50ML3kV2PgY^HkX|O)OhUmW9<~vaD(Df zV03_`()kJ0QZLrj)LhlreSSkXQ2Bl!ijkdIjaX>uZg3) zUEy^R$|!e-GE=`412Dj62;i4~f}qD=;%udm4e#7em$UFP4*);jvrpCywF?a@jkZGR z@@eTH^BNtrs3AU^4tP1ul|vWkOmnH!foq3%d~9tpwcp)4pOeRv4e#cFtp8OuR7~?@ zWhTX-rK5KDa{-7nrV=R(@CBH>s~j8v9eugg)EDI;N-j5x);W_>x2myaIU+KkcVU`#03rAUhOi8i_Okpg_Mb9fxk^d}5*Q*4_@=tB zg;Aa5bz$JKUi*&n9qpmtFg<79!+>}VKys0AtL5Vezq{}dg`1K7zMArp(AfZYAp91^ zSYPW20yGAJK!uyghg*e*h3!L37O0+khHhavAl9VqayhuhE0j!|hW`Lz6er>GN%;Mq zCNh7kM?mucl=CRSRVU-a+2WT}Bur&G{B9#2iFAq-4&CQ769ibG+}sqQX#?fh`UZ-_ zmoOA`N9NTbF$MHdnaQF;y+HGe-?M-rX=CRc{Xie8Oh7>vlc^?Xm1zm!i}GtKPR5-q zA!4@|8}u~YjK|22W6_p-=qIU=nyB3As4;MdoTfuV z0EqWE%DXo;cS3h@P7Y|vjc%L>mKDlsJY?L6dlGPuLJTv_TyB&{u@O&u(t_(M+XOz1wMmy3ttj4E9X(m@B7Mqbd z5j{Q_JdPdBQ&%5ppOYmn(-t!jZx{nzcDKx)jsEtLFN56dz(#vClL$S)Mf3s}A#a25 zdQd0eBE)H$`))BPQ2d)e!6mA`C79g| zIMx}SS+;t|@+7D8=I+=&9MG(*xQ^<%SX%;)2K{P`*@I8`G)FV9@w75RVIK7>n3 zLIv5oOVy`Sgd8n!qCe6RXi5)JINBQl@dA?qb}Bm&Kfi6`!avh5XJQfYNXu2$sE_;_ zeSsB5m{NGu%|Hu79q4=LTF7}d#{BRe8P?1gf28VyCa;mjhsz zU|(-+>-4uW0I**%4Ugp7bq|Z3$PuB>fKujy14bn$uScBBlmH~V*bj8A$5dKHBIVHi zi^n^3h|eJpcs2S%p`BVWZ6cJd$`+KDK<)g47Y=$IzP0URVE~Cl+GpFw zcN*xyTb2lJS_%R%qaa8r2_{$p6TO2u`m5|*ZWS?q^V;$9=QdeW#Gr4%Re00n~5yvC*hz*2Yn+YqnMDC%ZrL z8+%oF#6i{pjQz#h{U8eCUi4Ae2A$(g9j9!@!ESC2Il0cM*TokLf!6RDKj)u8isvy< zC7oy`xxa!4xclb`Gj~0KuH&FzBn%T_y$xn4s?PDbCyk!v3L6RR=z#EnzvpAY1ThKuxP}w=*5{P^S}Bt`I~5^ zJUgPwn@}5Ej`sUEi*i+91}KepC_(*WYg7Jl_p*O~R$Y zH}x3eWRm8Iu!UN*27NaU&wkPrLRdeq=%e2+g>9ULKY3e128HBo-9=UC%^=S}r?0N- zdVXEotP~_iCZVKVE~eoBR2A~Cs)6(7;z1KIhrj=yEtvk(rJkB!WczEVHU;j<+^6zs zCAd}dG=H>X9tl$Y;SYWbpb*t_AmUs2V%vV14d8qvxP< z0PN?yQ~})pPv5I~GvD6mwQnFmOLgC%hLq2~{q~pt=O(_6FoHbdBhZ82+|#3xhMlno z%ZFZl|5&tG16H)s?wyZ*`0Zz?V5g$~W*bh6_q-A7=M0J$rx|4IX=i7}Ea2Deb&JRX z4UtKN{opF+1zK%fM9fF#TI$e2zz8eSn}2@iVp3X)`t}9~2ft07Z7^SnUzA-pzoyy^ zShmgS$<75Zh$8((UF>E-`l}TN`(nGp=XKq8q8{aCYx8b&wrV9PSFK%?BlA24{T zqS{@7^K+hb9zltZg|ISsMP(O3CvWx?y4K)cFz^|fKTi=JqI0L6)m7OVdR z+8;PYj6_7ArZ3a2O-Y)G(XEvS?)P%DO8rRNN;ziqAZ{XOrS{Y3ZDyw@2QT}bpFFq5 zICPu3vENShQ0&eWjb79A()(@wv%f^2mPgh0&rX&cyaDjng0s(>RMI|Df(c@!u*8__ zwT75qh4H;pZMA~4zvlEOt#9&j-2nV!66GlY zc)D8jeGKEdOYGCAXr=yNC$Ft2i5GI!r6yLIrfX(6$WK)?cWX{dT+sM$ zR=&f^G{;AqwxLKyCT;qL+q%vhT}hjeEKQvFNGFK;aXz0(f=Vj{So%!Rq^;ZxR zQkQtHv?_9Ait($Jw;EG5(omIp+fcmkZ}Z1~e#D=24iUpNm#Ym^mAwS19~Y#WlJ&Q- z95hSuCTdOkfqE$w)I53&bGQ*6_l3?UUcvB~7Y?|lyCoT<)$tBR>t3?%YSDOFpGdt{ z$4>lq_-O#wEtW9BKh4N_e7|HDF3mUfvF~rXr)PBIp0*A(JiT_28nb(A=|#h(i7`QR z{2IjQB?;$@;I3P3cWB(xYpx9kl_~Wr9#_y~dTNsoR`xhDh*fG&(_cTXm3-asl(RZ0 z(c$ryZKDofh+=Scm(INuEDA24=o;G^J=2LK78w^Ci+BQwWIQc zvW_YD+{p^xosya#AK`i`cLv+yjCP0U@wTO{I2-8u5zGp&EOh4cYT{3yrl&XS?)dX_IldeSi9AGHFrLP6?@f6%JcTg!9GiOQ7F-;Ykwq6c5jWXEe}XFU8QnvL>uY=bu?dovPP^jY~ z-V#m~w-i>i3whEI!pT7-@wXtfgvO z3u0F@5o%4QA-$%rR3VDgs=N=Djj{)oe0-=v#J+ zlIv{GxZErXh*8OhQ=7uR98;A&JXF~;BJF-0W_6n~<@}6_t;93C1TLpezHZY}(L}Ct zprA9^RIiaUYhH;RM#4+9dAuuOp+i6J4DdjQxXhl7H!|$o8IgE!%tU(D-FxI&R>O~j$&1Py4>l{TFN&lWNN%l(YKckk{`l}& z9e7vonoqQY@;`c9fmZRAZ;=HfE}beIIBrB~;f^`IUPVG9)Tg5+?qI!YyYEnc`mG@; zcF6Wb{&GhZm5V`Ju{dUvemLfpZUpyW3cauC(fPsq{73v+H`Nv)_ztl|;+1XY&y=Rr zG!0RK{sIxi(1UY0pte#OX2wKNTkyCDU+a^PBTk28d7T}(Tc($f9d|b} ztqj^WBgoxdLlq4Cf<}7)7#toXy~_zodM5jei5@7YyBs%O&S;(R&{)w z8myoVV=-+2X6tY!oaU&tUkxZ+^BrniUo~!|QvB8gdQ<}URbAxTu#c(M)mNSDX8n`K z*5RMNHVv=MJAC%y*NzDnBldQSw(?fNQd` zKGiR7K!45XDcJ^+RJ8N!`pfUcnNeHrPYyTVf8<}2^5`t}PIG5D+7->W`>I%2O(`|N zHHE-nJ6%D#r8gr#9$T%^@R z-On&RJvABZvcE$x@KT29zjLSIY1jYP-jzl*d8J_;T0jwErEC(GDO2mzCAa|sA&giZ z>%v$Ea3ch*KpU1Q`u|yaTxKYTzIZPLDn0~sW zB;`09o>0(M9YC&(7G-QL_0Jgnh(n6bOJ0t2dUTn&YQ$^9`#bLcfm4@wO47~1@Uj?_ z%D;taw@xi0=!Wt@itDjHNh?hkD(lnpNrFeGpL7!lJ6R%P;I(A7&Ut(fiZTq#GuC27 zWLhIK7^5sYmmnK?$T;3u=u8;pJCBFEQ+%n3$O$^d3i!M|e-!k+w4U5L{A##cocp)< zv;0VDU(f9BOyqAf=qc_S+GG)f?94q7X6hDBFKgQ=g` zIw{q+^X^2~<1Om%7~d!3FMA}*Z#5#wT6R?Q_LHM^%nHynGbyMFB_HChH8v4(mX-qJ z+wBCZp>%RZ#`Wk>QWy6TOhyT`_K!f@Qic!P^C$KBna7PD=)1uP+ZS*dnL^*W7S7*v zj5D&I8-;}LGo#zJj;UH9cT(~&oz_`O^LTV+tLxeU^m585-YXo<+#Iv6Yb6M%{c2CX zgUk9{hY;>n8&M417@>$*w!6wd1CXSgQHSTLN$Tj!<{|3^Ao`YHEr<;4WzM0$U0FBu zcKA|JUo}SxEYwqyXZq@~@r*_A?O6HW2?w{tqYqXPoUaBnrVo^c?jt@2(kj<|FrwTx z@o=KNr9S&UyEQ+5-&J?>9nfeeR;?|Q^XT8A5;b9NNt(~C;a-nUcN_YWp6|>gny32& zt6ZD7(P5vT!6@-e{M!CHP(md)BwnPUItCuF`@T6Y94Iyq?#~}=xF0=6Z%T+ub#vBi z+IdxAEtyxDW&OAz6etkO9SWyofd6rg=We6LpLS4RrC)#f1-wQdxZwzv&F{(%#y}KC z#NPPJwf*h5@PQT_+5&WqXvKA?!Auv`YN($=VZ3a&y9QW@{i(L>lF$(Hhe(5KL-e7A zx^nYN8~B4Jm3~{T%==Z!;sX!VL)Se?K4ccpk4yGL)UJ@j9hP3qOLdxvO8Dc%h{Lk! z(SAB-m?8pkdL7;T zb_U-XXn2jXb_Eau%PU->Z^JG8dxhnf~GdL5O_LlMtcpvdnSp)o*H02kI5))}3Uw(Ej|IXQD;58OGNw8_oec@BL& z-jfZ)H@Jy|omJ3Z4>HBL%Vn`a2{G)*Ro;9_4K$V5FK$y+&LUOkT5EWi+dNoparq+M zU@A=&e?(4%CK{TBP*Mys+fhQm+fPm1!AH)TY!AZF$avmpSH55w8JU^FfpqL8Bs0%t zK}an2;1j~y@U5r5UUEUY9HNgO=Gnot2@xh zhf6UCHnG~y7t{z6A(`v}_ahXY$9->R7HNa^ecnFvFdEa40W%x%@?1{ota0s69||z5 z^}0?`xp2sACgp6BwiwK~5fqU8~sT4$@8rZOS952?o z&Kq^Dq0vfC-|YK)Ps^P58l5Kw?65xu^GJ|7PLDxYFyt{H{F~oPn|uBVXs1M|m60f> z;QH<@o>_{8u^aom+4FA_Rt^@LaZ=#jInhngvp*jI?WSE>wQG&DjLL>N;2kyKDo3(J z+fQX5=*60Cvm*O$rJXAiz1~PYT zt^+KnZo*tBu^KZ5OsOt&QbE=UA-f$q#RF6`fm!NW7*y;QgE;&iZ*pvzSXOG1V7u>eUGBfRwoM$9OWflc6^mJv9&0*`c%PMozQTMQ?$Ip>&W@kezzLMVI) zR;0)eOk~P*wsVb_Fw1m=AkQ z&nYi?Tv8@F&hPH1)f$#uSnD(nKT<`ouEVuk2(yEf%{cX5f@Nf~)K(~J)@{^KbJRY= z+OXeVINq4MH7}~i=CH#^N7rOGN&1T`%~ZndzapJV*14oW1f*rix?byYK!cpZV8rKN z2yeOuSww0FpFH-^NOpj`nK#vJR7A039j1n*F6FU-&{BQzTJ!D|J28)YV5dl(TFq zUsk}VQIs(vx-!{&bF>xG?01`4B`4Nh^0cgb*@^`gA2y*!1liz|WG93Oe681rwO89| zPr>=UnPmD=c@P_cerjJ1>5POV7=DWe%f$+xs*{@KA3{zkswYfiCYtH=b~B#Ds#)Dd zJ=1#@@YuJC*M+CZlZB$)2os2V+?LI&B-qmGl=(stqSt1urj(T`+9tlSbBEhvVx$u3fVYD7&-`YlJni zxdhv>s*y|5HjCP83I%EzwNle8EH>@gHmu{n3n5dUWqGjZyhxKbx{JO|GwUszJ3&l4 zSe6Q~({+S?8f_K$IOPj2bt$)~XN9Uf!lb9Xb|sIKQOx?p(a>VI!mRh}88d5Eo?~ zsdMNJJ|HM(jJEp;i<9YQl3L|?DFUm0OPdW0!wM=Uh%)=T9Rq==O`fNEZnCIHC-}HQ zGHpo*URi=`JwY`NQsDy9=$i|UrFuWX%sWo~^y!H@9b@QXk+8;SY|D5(At_eYEoF^g4<0;Y z#U@eskE`(DK1Sgv!DXCTQCFEbDhuu^*^hORXB0Ul>oA1j#81m8H{+X0j4vC{NS`$Y zuoH**Pu>)zr63Y6ZIRW zq_*(p^NeH1eLG7|nEXcC)Ti{Vp36lOV=y4AjUQIAewaiCPmuyxOV^(U8g>xQ#o~WZ zeevibs?)3~+tTa5B5j;Y-1kl|ae%vR#%(SXM7wFkAGr{BL(Ci>uX||K&n^oUQ8qPT zSZqA=5BDa3g7MYl4QBCUkvcO&5Yc6&Ycodx$>`Lc!Z(#tjtj};#x7g9wObNE<3pNu zWoh}CNoHhc%R72oqQK{mQx2nMj_-rps;z*4I&^;NyH-WuzHh(wRems6xOmlH_z;gf zdtxS( zcu`Zs+*(16x9Y> z1p%27K?VtsfV7|@gfUU3Kp8>^5FiO5^MAhq6kE^j?YZ}!?_1ycXR%m;?00AHXWq~A zd-mlcR)>^7QT=4ek|oOK-|auPWXVS=OP2iO!beNNf4(3*T(x8gcAfeDZ;ywZ8tVxk z)3(LV;))%-!-TZMxgB~{x81#Ly0YqS9qzcf%52q%6U+4qzy7@7r1#;?o?V;%W9KiW z|M8`lm;Sy&wjfSV|38j=dm}E>V(V9#?MGHPooL(gQBikL`PfsA0DI^9GvPNcQ$ndJ zf=UKAWCIm>#%(xdH>aU~EF~g{sH}z-K9i5*n%L?GAUkZ{)3$^;Y0F;|KEncovrSi`oc78 zAHSXEW!;;>yZ&-;e#k)esqpcVcEwC5Us}s~)`wUelw3rV8>hd_B@X0LwU(^0nz}wK z`8INVZqyZ6UF}Ie#)&UfT2i|?@-sa08BqiJXlDvq&POMl<>y$(r%hdP+fNZDQ`V+pX!b`5Y-8FnlFTL7m6#3s%Q-hJ+Jh|2u9Hk{EoxnbL(P8!q3e~bidyNbIop*Ph%GSZM z4!0!AXA=(z{r3bpit*QlRzB7{4}Zj*nMLG$;{jX9_-8vW+ln z9wEa$@Ki|1^6c@bKmxli3Z@yd&R8}(kbxJMS zRa?46=oEG@IiX_u#ny~L9og?X={zPetRpYIkcfXE7I6XfM%*HY-O`IysF5>|GYrX7 z@hy;S4&4PC#t9o*+R|oA-Mz9m_$JLeVESQ-B^DxE(fuktm>r5g& zHMn=}5EnW1>&lGvi6-BO`n6>JBfF`gR=i-GAo%F@0}Kv!fsqnefI=WI^y`^k_4#37 zZy8%V4)LAk-Ba3Xuoth4CaWL?IscpW?``nG&RhCBAa3M8mP7@H^`&So8P>q^T8ByN8_+JWG2#2gq%o0MT;Fp)Uin#I;ta|*2x$g z(!qt^kV#BAq1Jjc{Ogv<2H+w5?62AfDU-`6pPCMBw!Ykor;HrX`FR>vD`fL3nWj2n zqBgu{rd-yVMAjp5$l~;kLZyL-fxV)RNny-SJPK}{9yxxrO4LD2AZgJ{L)(2Xi(b%onNC^@uKR|3r?!eL;}Z`( zk3&m-A4!U2C8bBh5k{R){9SHnR%WvwDF25!i+$7JyFsqC+J~(%cia%%J4eYrN$AMX z8;(3_uK=;+!f&gPm#vWxy&P#zAc8$=nufI+s4NeVo@s&Qn9G0+I}colS29ppQhjw! z?@G3NIYC2Dx(St7t<&*JEV~M3eWpAuV%!TIH$5O5K+4vK&GyG;NNQ%Y5&WEyvB%Ve zR-C+0OI*0g^vU-WPlV}5mi5?)0DN2>Syn?!0*fAHaxND_!)vgY7j#VN8Ly`3=c}ap(&Rzkw}YrT%VHGrE7taBCboq?u}b8G9mMj zkR)wGN^RQh$O%aCW271uGBBmyU0-CvMp#d9v#~hvM8q|NN8N#KmMvQHDXl{+NwH6P zE1$}gH&7%EM@8B@j(M1w8BgdFLoIJCmqzMT!IwDuD@1Gbt!S0PTD@NzO}?UQiN5vh zVxJkP9(e5ES2)Bi1Lk=+4=B6nTU1w3-G_i!7cjJ$y`+MOfoglV)Kx?E7;iSM;OMnT z*KiScAQ6cWNf~nKCevBu@0Zr6<7Y49FOhkfItN&lysZOm$nu>te5wieEjz%ULg*Q0&0BOxW zl?z0_9x0o8NQ}^sk5OgYUStX^jVIb|tmCfheC?8S+b0SCQ-C8#2MNQF|Cz|DQqT3~qC%OVivmH+Xj(sQkkCG#);ijv>WPsq-+s zJT@W|a}uxN#AUd+R!rpJp~wwkzpuovNeyf@Z{gF?T0=n9dU#t0>q&E(!=CJio-*G_aH|RJ_O|meq=AGz>AXHejU<|MC4P4Q z4MGxfrxm=2OBWAbw@zsFXW`RkZ=!`aN1Dyx@ghyUh?kAj$mCA@kcGpWki=plcHHZz zY#ma^d((Gv@mgxg!5b7ZioQ!rM?(NS%5Dob@F~HO%;5BlM1--0+PAHEpcSn~3JpXV zVs~(gR|V#9#o#cnWnFj0fek>SBw`pjNqWN%$m5gX25S27OCoTGutE2DMh z*EB1tG{Z*jAF{9jmi_R+F!z_ahuSGgm4ja&6^Y9L4W%Fc5Gir&oxZh61MjQ;U42hD zr>bSDUP}wOIci+1QZsMejA7(}VfspIlU*FvX1p_ zQ0KZ|2*K=vvV$NFa=sy7sm#JyayOYG;;$R{NxG?0ryB_ju(FH|Xa+eG6DICrXjb)o zsB@{+*mT^(I&S8*8-A1Y`agu?O180qH`qs&T*^so^+)o|ke_P=Hh|~ zaD#wD$a%X>rk}0P&}({(myV72%4d8tHsDNSAQB&vi7c)?m_Da|b&gYrK&eD5TZeyjki@*dCuuJv1kvt-oi&Zkvl3LjN3I_0A-% zBrUuq?`sy033uRfZGLUz;~9p!rWe^J8f5ZKcSt#sCwh@ACV?$t4rGQ74rC5YhZ=Si z6Ii&iD#l@s*|iOPDzr+)HssXk@={odQ0cb~$Q?*B>w_P$(;*9onYySq3i+U8 z4Dun%L`+(3)Rh zt7j?D#*vS$L-z3?$4=t49tOsL1bF}6O-MADqV~+dg*ldN@Ywtsl5xHGna)C&`t|ek zZ`hv4vtF?wd}i!&YfO|R1k9|Q9IrJ0>4VI((DSY5yV#I4ym<(W@<>xmH$S;~>y<7x zNdT* zXmGT7JM;g&Uwn(~-v^yezkW;b)@yI2QL$0OJMl__?f`2ZUM|G9xF(^#K%Ia7^`hN* zJop3QEYA+??cC`{M+F}!>j_F$5PNRC>h3>q;QDJLKjBc)As}tR8GAUDHjCzs{{s=9 zJU^%Y1UhC(sEgMd@&`U8cPkEy3mOG|yX}j2xzjxe0`>V9{}u3}b1&Vq0}F3o-d>by zcr&>A%Im)z40bemhZ?aFivFP2=%QrC-^xP#PYk974OCxTeQJ$&4@v(Y&YcmybNQ2P zv0!)K|H$!Htnk9n$*y=M?bN_yfxMPOhn9Sw{N{s4{!1>HPgW@_#ywJp_V$_@Y4A7p zb{53?G)Lcf1K(b!_RZNTpAE^Y3bs3z?q6cIRf^a%+ZUaotY)xZh&L=5;}o`vzweOs zp1K*TlF5s-<4fm~L;>I!dpJ+z3_FR=WVq#t`bv2Sn-WTyookxe<|>9Qb}kcCo$~VR zKs6M>fat&Cp?IP~=Y>4nu_9>v=Or;GMA%Z7`h=0vE}yt*q_5{|hD)a4POh}7Y71B0 zf+Z!4is6b~4*yygb?XGbM&%LNfRPn<9Dg-PtOFiM_Crl8@4-FF(_x1><#5hjps-jAvfCWE8fm!Y-VSmr6}%_{rP6x;JKW%lm#@mOkE9cF1gV>Y?oc z6==n3vYyvPec17*!FRf%dF4GiiXm;qrE0JpW+D-FNx8g5eQzSAJ(G7~jz-d9tn?W{Jb?7qj zywfFBNbn=obLuCL6!%JqcN}9ETgcvG2_+( zEAndILr!n*Vs8DDA-l(m+tMMmaPdff%l#A4@k+~b^;MSCs*1(oV{Aiv+7rvp;l=Fv zCqo`Xfr5xlOss1)NOTwuq9{Zqf9ZRO2q@$OZ)N^xL-ZP%S;;;>s~GiN80nAIN~mkq zQ%q_T0OeyKUfput!c~05v-b&r2O=Q+DxyrBdN;@95&ngVV&r)Pm2D4cMoX4^jd3`I zM8+BW0RxY_)H`lzYf~eppSQfaJAAaEdm`A=%9!=Q{WW{n%}~X2gYRRS-aON+8jowf zvUb%}j0Dc+Pa*@ha%p|SCFmUJe$H}{ zMocEgoD#H#X2+x{>}>UMXrU1)7-8IqgWxFpgM9`5$KuF4uyhLN3ATPKN{eV_m^nam zpywpokS2rzL9^%-g~z9IC?4IdY!$w-USoD?gk~oDmn~Ri_B3W~*AYRN0jHHcgGDP> zO=NPdluZ>z_CgNiaaeXAaJtKNRSzSY-fOgDPOuR{W3N{9K#2(%)6x=?(w()Be{;oIn1?Yuroy%NU~+ zGVN8o){$2(iSc#c(2O8mgJ=>z{^PP8mr8vZngu@}pnJ4%D+rDS{&xqNI>vZ1lgV|r z@k-ffhH~46qPyjDa-3L3W(AxhbaN7cotxZ%CB(H-?a)Bl6$0u2w%>empgr=QE-$*w z;R{su0V;>&Q&Q(~4PboXrnhJOb+u7r7d8pug0&tZCFr(`R4}PdbPNg;P)^0P@VO-qfs=t= zJGTQf;-2sCY1+J&UE{d@e{4c5zdXiyNPM9YPSgBo)(?q}~!`={=!0{6L!4i;&+nx)|9rXG>4%l^7 zuM`J(U|rbciH3h^>iMYjQPV~cVof*bB*q+L>yYbJnNVtcrpuSINop~1Kh^K)$1Su1 z#|+!YBgTAFN?;Elu9q=|6LGDTn>^f-1t@=?pj%2{>(T_r3G6vJd5%HRZ4Hye+b~ed zK}-1TP&!nJ3KKSsi$opPTR{E%Jj;Yi2qN)o@!lxv-@`Ed1q78Znt;)777<%Z1s3QQ|v zr^BsMD*cG(oGMlqLng4Wel0u7ssQF&vW;YgqM{+1weckcu19N7Bt5h^N5AO^J*U7M zTPI7i=&W1oiH#*$C6{7QtATVniR52`9IpciE1=iHZrt$LpupcRYacW#AHM6A4r)Sr z4j3S;bna?YnZrP!DTN(zw>Xu7fuvuz9pmZch%cmMUn}*GabVmhv}Jjt=)XBl=$gxm ze*@{yl~pWD-=85F9Z3tHxSW+W&egy1j!KOA*M;4)nOBLw`z;{9IQ2%GA;;*F_}IIv z)P0~XUXda^kQ&tK(Q<3MW4dkGh%v?#*8=GUom+YQ8hdxrFsPS9i0g4XNSiu~J#0YQ33h;klZ!KweaXA;-u<8D1PJ8o?Lfo`y|R8& zL}qT>;l>uIlCph^>CSSQh@F8c95F6QMYfaTO|4i$Z>~pMU?j_=^NJ~8vHh(qeh%NX z!=UL1drv!tFz$FoI`&On0))Q-80yqy@I>KEVrUwuz z;E#fI+$%-5$!NW?l-HI)_93ydMlL9+T+)o3?RQ53S+!)st9)GI+XRv%t;v+5&v*OR9{}0I;J~Kc%>5<$SaQsX zKM?LA%(!9RR0YbK*#X1D9~i-+A@=olQJN?CMu^*)^PA{;Wpu>t z9WH1~M@P(5c5fJEztp8(u|fz3-FyCp)e|cwNLxiBIz_XC#uKW(qj7*x_cceh&5M7V z(2Ur1a)1Y%3j#I76aaHkShsf6xZxJj`WQPr*JI9H+?Z$ZSi`)Jrh(K4h`$x#NxYij z!LCy8I13H`Ustr;v^%x7Ao&12hb6gB_s;hhr7`sIglR5F#ZNvAgvg%FAz50I5iCqT zkRZJ|39`^HV3Y0u_nVtVr8mE0bAb8c?{%|>_j=j~rrvGR3hRNU5L$9sTadViFj0A7 z9jn5}<~q?jOv4Lntv@d*$1K?-pW*ZPyj&Jnzj(0$0HO8s?PcAcWuosmjmD_?T!K>F z?x^h~E1}S(psRUcTUaCle~cx`Ba)3r_aqvaB|aVjOO_ea-trJT#3m7->9gK9eL6hw zmb9D>Z;erD|T${uizJ}?eqn9;nzZjC)b`$2-s@rFFqCa!5^);%8g8=9B`{Ahtc z&6Xi(0E1UU`HuSxw@h#bduMjYX98Eu7FWBrz_c?5I*qDRZbqJ}3zO4DX+Y*kqvA;W z4(J@tIM5-Acw>#B*b1^P;I((pUqV^Vc^j%Yg|RYQ3hOo1I)Wz3nFsCASWNqHZXQA5 zKHQHkgp^aJtDXG5Eyjvx+%8)!&^{znvxdRzxD&L{hK?Y)~IR0&-3a-5F{o zfzAnYLc5@mYr|7OeTl%x%d9))rg)U}PT*LA3hBStvh~!|&m$n5Nj%RG(aO@3K*6^K z0-U%XWqms$Wa70Nd)~=!U{Kjv;&Cq&eKQv61VWV+1G7(8lRuTt_{xLy>|EqdqhV4) zJzpOH6o8)>i`b$n2hTAKgq>Of;bIN~#uV$Beut)GJV^>7v7+wYIZaRhO}rRqA>Z%-YGg z*`=Up_{wN!Oex*#&&=x~+lf`fQx#`{k-EC5Uovs&>!jB|gpeEQi8#qX3jp7&Q9xOa zOgtG#aHmLT;#!FWd|vS`7pOkJXgd(lpjX%we6S(toygHbO)W;0{W(I^l6a7XF@ehW z02*WHz{3~2bJGNs+F_h5%Wz6Ht&bUIinW^4aS%%APTOjy`U0t$SoCf;`m`vZv~XG<4KF(MwB_1 zp@>qovnh2?hBbE7rlqTQrqmseow=N_d-(PytZxraE^SF~jmZHuTa&w_`)FbzZU?3+ zl0G0(6^ov~8n^;DiURz|Etyj$2rIA!f@6^o-=UK*qhUa58Wd=gy{pYAr~WL?&q)!) z8C$P8ZiYk{s2rckGOXG>mvv0V&b)59tev)|u~DDyv{D0jgrnCn_SpnM7oC*f#y%w= zjZ|`*;_7b6o?qfQBe3uXQ?asa3y}rISeg>hbh#I*itB{GZb(-Yh|vm+j6v!59Vg$z zx5%O$j67_I!<=qw;^UQW0yAJohq2g2Rwzyx5n~T9Nt(%!U7)e`|705Q`3(Y3bO~)O zq+A#3-3Io$Dxe(Kt&BIT0$1FX4*6uLlr{W&ahp{flq}J=e?z1y0QyO6B{pew9axR} z+`F@Qv+>Bi=yU-Eu%OY9p}xJ#jy!#H1S-m%;^*2Oh}8%>$rDm>h*37Ec%BQa{s6Y$ zM*qLKFawqL4nDAV`8IUO_|QPwwjQK81y}fC@zQ`CHoroXPJczWuG4e_rh`3Q)oE8S zXLI_d08#A6OaVW$ho zf+|Hq2ofX<3P}P*pL)em{#Z-W2g{(7XG)HCZkhzcbVQ?e6jkLR2=lbat>Qfe3(cAliLJrxu7Ha?|I@4Qe>9U{|)Hb=VGi4lh#d03ipf>!Ln0t9p;z zmD|csjpxmqpvhO~)E}O+SA#Vf4O|)FwOJ?9dMpilKF>s7mQB{e4|$)!q>7-8k*uCW zKp%~Om%CbuOhGZAWhe=)sS(`m-vYsMQUSmVs0+K45h*^v38Pn}=MhL-I>B*J?^ZBH z+;g<^_M==8`MY{jg ziSXTnSKWJ3Lx=CQJlDpnV@h&CRshhZ17jf*Q{;Or;LRLx#B}!rOd^Z`2whn5LkL3C z34(~@4Gi1Q|OORi6?jf4?zDmW@I>H}6j&-O?>|qoyeiZji=cFu$%i zwBPPjsB3#iF37zAVYQ`i7BmHubw%|!N&O}N2!O{+P}sSE_o$>}5~t(XA{nXv{^fYo zeg=#MScwHHZHvkVRXYs88JhmtHkD(9r?%V9dzz4Q1}ZOK&PAv>RfJaJK5NQXRqeS2 zZRx-oG03e6XX21taDC4FDVo@$%iOKT|Gg(hJIZRlR#F z%WW11pjNwwZfufsyuDu+ef=Zmh$xi1`*zl!?f6D4l9P$l5zCx3Md7aYb1_17#%rU! zI+<_-5#rt^?5EdMMKw#e*|3<6Oy|4r*&0t;nIx+m69KnyKvWyM2t=n3IT+E4 zdUPpSK*<*bvqbzV3g$YotBAZhxjl{A-n$yb0kM%wo_?akK(Rf|WSTnOz0Ipf5#D^^ zI#9iTyO*pX?2++mtd?X5{)6aLHZelt$_|$|gyE71XolF)P)OR&4lgtx7k)pEZQ;u* zG!07~xDWNMl3g3u%e$Kzi)adDxARf23je;}<8%@d5TX(Hj`lS9LMR%>c4Vlg;$*@V zwMN6YUD65cyObTly`gT$!&1q2>(HgGVk#$tCf=h}#unY|Wsp1^$~qZw-kwx9Pfi>` z0HW){j=P5n{5#vz4z)3Zd_0MJAn~p~0wU{&om{H?DTNl@QN9^FnMBzEf*Na`{Uz6 zbkJ+pmZOI>RspbaXiGP)W5U)BwF*0+#<=u_Er}pxU%LSal{J-Az>{&sn@lOhh;D*s zqi^nATEUFqhvZJ~olbE&TN-TYbFO6gs8*>nZ$Q0 z<+_3lQz2lYf($$fdD_1sSD%vO`S+-R?Eh(HdVyovLEtbB6+=#fW%nty@eoqfvZ;Y65Rh`o`XT9d{YW_5Z7MhYr0% zH|-9Z+4Ct+3iRbY6~TwZ910FPfo<9iL9ezFo_uvT4+06|MeW(?WmV(eEl}=H;V!>U za{3GkCy!n)#dwFKu9dQR9TU zsl3@IfM(>mHo9&3gP7hu)CGxY!JL>jLt^T{r7Yw+U%UxDr`%a~v3SU_tAS{8#8oHU zp7-23@|zbW1zuh3YsIK+A^}jfOIp@*s7r_~iSOz-$xY5J#pLm;UUd`=>)!l>I5%dD zL*hKIlJ1Z=7YNIw7v;w_k67LWEe0Jya&JLPP$b%WAV{Ak$;$Qa@x2e&2=o?Ip`j4RR=UZMe0mY*7mID>4&c`z!)SbFvRA`U{}^xCo%Kw1zrq z0A^_3Nocd919cgfbxmZ9OURvd2jiIc~Ef>JgGYVTO) zz=%U_4@Wdaq64esg!=dbnh8j{XVFYL5oG~3^X5ASIQRYWrt)MT(q`kn3rgwG(b)5R z-CDQ(+4#sXz11wT02Dq(P@FKkzz$ox0~NuX1kegl!o!$P1N{h=xHfPoJj66tyhWod z?>-P{6y1A_^V_k8G-?s!9nY~gToZ*X3(%dJ(~m14fqYptT$YLJr;NdlH$a^gQ%Tz? z@>cOPDhDKk2r)qUF{rXa%Id>^-pJXp&_F5h9IxiN`vu^x=a>+`5J;AoQ$7)2HB$jc znL0J!D?t<8Yn8X7>8@?Gs7l9p;g#WTG`o{KJ-Mu@0(UBFQOW904j!U>g8Wk>g5rd;PBM zxMG?}01~q{e9lSNfeZ}9;vSIh9rU1Ed)UK@i{NX?dq_%v0 z0lUKvt#OmQ<9RyKnj!e@_%>344VrR*`9?r&?of-~4K4nOfMDfMarW?sw4QW$<@Ez- zJed=hb23mPn;aR}a18B|e@IIOYbL9?Rs=$?TKH zR=KFK2cnqkcys{fXt%Dj?xltK0VJ;21e*HAIZqcBj=zea|iI58ge;-7y0rY3IyA>?KNrAHu` zdKM_>f6RW!<0j9lQ!QBi z&8g%n8X!F1fWwNnfa1ZU1PdhPGIgplbgsj*8bBhQ%`LR@^GB6#mUnCCXS6Do@B7a3 z_e?xlujsPiZM~bE@}`Ons<}U5j*Enr5edvju_9}`V*!Fk-nx8I`~V=Dm$kYLqVKg4X72f1@e8iprH2?rhNvQP#C$e0%JhH zqEgsa_Viv?1v$nca&V=Uz6t_6W4;HTh>4U7-F+0zD8H_>zH*-K6kr)RazFN9p67d? z0ojH#-tZH&p?RisF%7474~ySW<&nShbEpB!yZgzmPGDPaq`WDz>iwIX5zd=eGk%sD}RZ+$o(=_{j)dul!7>gJV+F4 z3wdX4lA0H!dEt8jiPNsc`g!(eQGsiIHSdf@ASa|icR`ir(;7o~28h}Y98&k+KN#@R zWolj|SRg9-Y8q@;v=c2xzB+AMC^~Pyu`}uh&Z!ql;fbdFcLS=u7h-UH}@q@b+JB zTmGK_4F9XkNCrtNC^z>vkiq}zSN(N1;cv|h&@<~4AUr_-c9($#Zv8U=c!9Jo3aa~Q z$!F^`2o}_>rijg^MBeNJUM1)fYvo!bTK~KLsW_B6?=n!)+w{M(0*>5;(@PoK(y*T) z_mkbIk}K&r{Rc~F%U7l8dhwgil@&$#v?%?fpfp5P)p5+!FWjrFv+I^mkI&Vt-3I1E z|1jV3@vhbTzIzt`(R}Fxh-E^>Dw6G zSTY&=((Skf-7Qo6SHBL=cL~(di`CR$fkxg}C0=%r1qcD=_v!1$ZnZytxa{dk!A(N2 z2Hk(|CzU(*r?8g2(DY$^y(Vhc#8wo?m@qK^!{jLbL;J#%b<{DZzp%2g(!XdmnOi*Q(#{L-qx| zSq^xU+T=9f40WyjPF7Ff-cp=g<_B8HV?W*8;4W`tSdhG{0=j#%QJOHvxt4 z|NdW~F-ozD(eK-Q{O(m$?CA!f;OU_kH~T>~@}oqgEaVA5_}AXib=$`x3%ShLAbLdt z`^nr-lTZveQ5T>wKglt-Z;W=<;Ht;pavJa_brF9oD{7*yYg@;hqo$em-;dS&#Fp)V zrjKt$q4^{qG)t6A#{jXkt0HvSk;tQ%9&#(+mdKvDNg#%y%7}s34mJs!$<90V?|5XP z`z5upZ|`sa#_#<*yQ^A|{KuAeYND8U93qfplWlbopbzwm9a(^U_W%B0^Je40l&jyp z^j5&H$N&Cc3(Onv>Vz+DKYK8`eDR;{egE(Mnf0=-`o+zy(et7K>E_)hf7oW$cwaSC zmwn{d|McFnHlW^5bt0$Yni&kOx=zsNsFns&CRZ`QIFiZaownSnWYu^Adb=+mLf-t$Op5QC@UIF06DZ?09PkGB%fUnl`a_Zw0%~AzLoK zzObZYy2+){N_gQ*x2O5`kAK|py|#7Qa?t1-{&bm6<)?L>paof#mT$kZsLQ8f`^#iQ zo$os$I9Ue=r0Tik*w+v)Wv5Hsl_R!)o>$lCo__}mmShV*r>yeu!BnJ*Eu%KSC+b2F zJ-);WG~+KU_rY1(?V2dit8@`SsCSL^R_$rON%#B)2Nu%@%36RZ1>#WHXx`P8m`=MCEo^c%u65 z&wMJU>Lx)&ZsQ>JId+_|CyeL*jE@2JW}QJ?aH@=BJ+E6E%o|_!?X|QFy^wqp@oap7 z=2=VufhVT<6yVLgmd^KP1DZc5OP+~V0!^Z2wc1GG^GT@u?gY9E`vFMdqk{b$gjrnxgQl9zE6E(!||H!BU}k3tFcn26@E`;k7S zATxCpiR3V#gwM1LD%PC=q_~5pLN}LO?NC-34AlZ{6<3*6L$@5CLKuNBb~vp$k3zg^ z6r>Uzwbqm+b5P;P;Cx0|P@by#vkxxmfRO!53alXd6Tmv?zJPuut=YY^v-L>LY2t>E zz9<+70;VH`k$@>`4r~_dW1(r&w|CxU?peQk{cyj>g^P(p7x+Nmq6;q~pG3GhDpf1iEfy+3SmDbti@D-tTP*ys3H{1i-F>zg_H=lX(w9PcYynnK!B7VG$k5GbEV*n!$*#4(T&|+W z`@qMb7gi2Jt-bYqsiHU#8_H_rm5<5R9A0RcrC!! zn8~=1dYtR66e1y%_)mN`J$4&zmB_~0bk)+OOZO4*rr|+Pm}%krZc(nuK(T�Y=1} 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 ) <| || | | | \\___ |\n" - + "|___| /\\___ >\\/\\_/ \\/\\_/ \\____/|__|_ \\__||__| |__| / ____|\n" - + " \\/ \\/ \\/ \\/ \n"; + String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" + + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + + "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + + "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + + "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + + "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" + + "⠀⠀⠈⣷⣀⡀⠀⠘⠿⠇⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠿⠟⠀⠀⠀⠲⣾⠦⢤⠀\n" + + "⠀⠀⠋⠙⣧⣀⡀⠀⠀⠀⠀⠀⠀⠘⠦⠼⠃⠀⠀⠀⠀⠀⠀⠀⢤⣼⣏⠀⠀⠀\n" + + "⠀⠀⢀⠴⠚⠻⢧⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠞⠉⠉⠓⠀⠀\n" + + "⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠶⠶⠶⣶⣤⣴⡶⠶⠶⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀"; System.out.println(logo); - System.out.println("*************************************************"); System.out.println("hewwo! i'm hewwo kitty!"); System.out.println("i'm just a chatbot uwuwuuwuwuwuwuwuwuwuwuwuuwuwuw"); - System.out.println("*************************************************"); } /** * Displays the closing message when user ends the chatbot */ public static void printBye() { - System.out.println("*************************************************"); System.out.println("goodbwye! uwu"); - System.out.println("*************************************************"); } /** * Displays a message to the user when their command is not recognised */ public static void printInvalidCommand() { - System.out.println("*************************************************"); System.out.println("i hawve no ideaw what youwe twying to say :( twy again <3"); - System.out.println("*************************************************"); } /** @@ -46,9 +45,7 @@ public static void printInvalidCommand() { * description for a Todo object */ public static void printInvalidDescription() { - System.out.println("*************************************************"); System.out.println("descwiptwion of a todo cawn't be empty! twy again :3"); - System.out.println("*************************************************"); } /** @@ -56,18 +53,14 @@ public static void printInvalidDescription() { * in an invalid format for a Deadline object */ public static void printInvalidDate() { - System.out.println("*************************************************"); System.out.println("date and time entewed shouwd be in yyyy-MM-dd Date: Thu, 27 Feb 2025 21:41:31 +0800 Subject: [PATCH 42/43] Edit final --- build.gradle | 4 +++- data/hewwoTasks.txt | 1 - src/main/java/hewwokitty/HewwoKitty.java | 4 ++-- src/main/java/hewwokitty/HewwoKittyGUI.java | 13 +++++++------ src/main/java/hewwokitty/task/Deadline.java | 5 +---- src/main/java/hewwokitty/task/TaskList.java | 10 ++++++++-- src/main/java/hewwokitty/ui/Ui.java | 6 +++--- src/test/java/hewwokitty/storage/StorageTest.java | 6 ++++-- src/test/java/hewwokitty/task/TaskListTest.java | 4 +--- 9 files changed, 29 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index a6e5e85203..5e8bd16470 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,8 @@ dependencies { String javaFxVersion = '17.0.7' + implementation 'org.openjfx:javafx-controls:17' + implementation 'org.openjfx:javafx-fxml:17' 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' @@ -34,7 +36,7 @@ dependencies { } //checkstyle { -// toolVersion = '10.2' +// toolVersion = '10.2' //} test { diff --git a/data/hewwoTasks.txt b/data/hewwoTasks.txt index 2f01e0dd9d..687d14690c 100644 --- a/data/hewwoTasks.txt +++ b/data/hewwoTasks.txt @@ -1,2 +1 @@ T|0|cry -D|0|homework |2025-01-01 diff --git a/src/main/java/hewwokitty/HewwoKitty.java b/src/main/java/hewwokitty/HewwoKitty.java index f0906ad989..d2a4cb03dc 100644 --- a/src/main/java/hewwokitty/HewwoKitty.java +++ b/src/main/java/hewwokitty/HewwoKitty.java @@ -1,12 +1,12 @@ package hewwokitty; +import java.util.Scanner; + import hewwokitty.parser.Parser; import hewwokitty.storage.Storage; import hewwokitty.task.TaskList; import hewwokitty.ui.Ui; -import java.util.Scanner; - /** * Main chatbot class */ diff --git a/src/main/java/hewwokitty/HewwoKittyGUI.java b/src/main/java/hewwokitty/HewwoKittyGUI.java index 2e6e4a4b77..c480fc4aaa 100644 --- a/src/main/java/hewwokitty/HewwoKittyGUI.java +++ b/src/main/java/hewwokitty/HewwoKittyGUI.java @@ -1,12 +1,10 @@ package hewwokitty; -import hewwokitty.parser.Parser; -import hewwokitty.storage.Storage; -import hewwokitty.task.TaskList; -import hewwokitty.ui.Ui; import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; @@ -15,8 +13,11 @@ import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import javafx.stage.Stage; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; + +import hewwokitty.parser.Parser; +import hewwokitty.storage.Storage; +import hewwokitty.task.TaskList; +import hewwokitty.ui.Ui; /** * JavaFX GUI for HewwoKitty chatbot. diff --git a/src/main/java/hewwokitty/task/Deadline.java b/src/main/java/hewwokitty/task/Deadline.java index 8ace45822c..acbc222cdd 100644 --- a/src/main/java/hewwokitty/task/Deadline.java +++ b/src/main/java/hewwokitty/task/Deadline.java @@ -4,8 +4,6 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import hewwokitty.ui.Ui; - /** * Represents a type of Task that needs to be completed before a certain date */ @@ -28,8 +26,7 @@ public Deadline(String description, String dateEntered) { /** * Formats a string into the format meant to save to file - * @return A String that has been formatted with the type Deadline, isDone, - * the deadline description and when it is due + * @return A String that has been formatted with the type Deadline, isDone, and the deadline description and when it is due */ @Override public String writeToFile() { diff --git a/src/main/java/hewwokitty/task/TaskList.java b/src/main/java/hewwokitty/task/TaskList.java index a908a0db19..02965d5fe3 100644 --- a/src/main/java/hewwokitty/task/TaskList.java +++ b/src/main/java/hewwokitty/task/TaskList.java @@ -77,12 +77,15 @@ public void addTask(String userString) { t = new Deadline(message, date); break; case "event": - temp = userString.split(" ",2)[1]; + temp = userString.split(" " , 2)[1]; message = temp.split("/")[0]; String fromDate = temp.split("/")[1].split(" " , 2)[1]; String toDate = temp.split("/")[2].split(" " , 2)[1]; t = new Event(message, fromDate, toDate); break; + default: + t = null; + break; } if (t != null) { this.tasks.add(t); @@ -127,6 +130,9 @@ public String writeToFile() { */ @Override public String toString() { + if (this.getSize() == 0) { + return "you hawve no tasks fow me to wist!"; + } String s = ""; for (int i = 0; i < this.tasks.size(); i++) { int currTask = i + 1; @@ -142,7 +148,7 @@ public String toString() { public void findTasks(String userString) { String title; String s = ""; - String keyword = userString.split(" ",2)[1]; + String keyword = userString.split(" " , 2)[1]; int count = 1; for (Task t : this.tasks) { if (t.getDescription().toLowerCase().contains(keyword)) { diff --git a/src/main/java/hewwokitty/ui/Ui.java b/src/main/java/hewwokitty/ui/Ui.java index 78767c812d..c57da2307d 100644 --- a/src/main/java/hewwokitty/ui/Ui.java +++ b/src/main/java/hewwokitty/ui/Ui.java @@ -10,9 +10,9 @@ public class Ui { @SuppressWarnings("checkstyle:Regexp") public static void printStart() { String logo = "⠀⠀⠀⠀⢀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣠⠾⠛⠶⣄⢀⣠⣤⠴⢦⡀⠀⠀⠀⠀\n" - + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" - + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" - + "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + + "⠀⠀⠀⢠⡿⠉⠉⠉⠛⠶⠶⠖⠒⠒⣾⠋⠀⢀⣀⣙⣯⡁⠀⠀⠀⣿⠀⠀⠀⠀\n" + + "⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠀⠀⢯⣼⠋⠉⠙⢶⠞⠛⠻⣆⠀⠀⠀\n" + + "⠀⠀⠀⢸⣧⠆⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⣤⡤⢿⡀⠀⢀⣼⣷⠀⠀⣽⠀⠀⠀\n" + "⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⢏⡉⠁⣠⡾⣇⠀⠀⠀\n" + "⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠋⠉⠀⢻⡀⠀⠀\n" + "⣀⣠⣼⣧⣤⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠐⠖⢻⡟⠓⠒\n" diff --git a/src/test/java/hewwokitty/storage/StorageTest.java b/src/test/java/hewwokitty/storage/StorageTest.java index 598a3278cd..e86b41f3f9 100644 --- a/src/test/java/hewwokitty/storage/StorageTest.java +++ b/src/test/java/hewwokitty/storage/StorageTest.java @@ -1,9 +1,11 @@ package hewwokitty.storage; -import hewwokitty.task.TaskList; +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; + +import hewwokitty.task.TaskList; public class StorageTest { @BeforeEach diff --git a/src/test/java/hewwokitty/task/TaskListTest.java b/src/test/java/hewwokitty/task/TaskListTest.java index 399e525701..6942abce35 100644 --- a/src/test/java/hewwokitty/task/TaskListTest.java +++ b/src/test/java/hewwokitty/task/TaskListTest.java @@ -1,10 +1,8 @@ package hewwokitty.task; -import java.util.ArrayList; +import static org.junit.jupiter.api.Assertions.assertEquals; -import hewwokitty.storage.Storage; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; public class TaskListTest { @Test From 5b93b66a54fa1478b2512d1ebbb9265cfb042a3f Mon Sep 17 00:00:00 2001 From: reaneechua Date: Sat, 1 Mar 2025 20:56:14 +0800 Subject: [PATCH 43/43] Add Launcher class to fix JavaFX issues --- build.gradle | 15 ++------------- src/main/java/hewwokitty/Launcher.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 src/main/java/hewwokitty/Launcher.java diff --git a/build.gradle b/build.gradle index 5e8bd16470..52631abcac 100644 --- a/build.gradle +++ b/build.gradle @@ -2,13 +2,8 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '7.1.2' -// id 'checkstyle' - id 'org.openjfx.javafxplugin' version '0.0.13' -} -javafx { - version = '17.0.7' - modules = ['javafx.controls', 'javafx.fxml'] } + repositories { mavenCentral() } @@ -19,8 +14,6 @@ dependencies { String javaFxVersion = '17.0.7' - implementation 'org.openjfx:javafx-controls:17' - implementation 'org.openjfx:javafx-fxml:17' 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' @@ -35,10 +28,6 @@ dependencies { implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' } -//checkstyle { -// toolVersion = '10.2' -//} - test { useJUnitPlatform() @@ -54,7 +43,7 @@ test { } application { - mainClass.set("hewwokitty.HewwoKittyGUI") + mainClass.set("hewwokitty.Launcher") } shadowJar { diff --git a/src/main/java/hewwokitty/Launcher.java b/src/main/java/hewwokitty/Launcher.java new file mode 100644 index 0000000000..37d8e998d6 --- /dev/null +++ b/src/main/java/hewwokitty/Launcher.java @@ -0,0 +1,10 @@ +package hewwokitty; + +import javafx.application.Application; + +public class Launcher { + public static void main(String[] args) { + assert args != null : "Application arguments should not be null"; + Application.launch(HewwoKittyGUI.class, args); + } +}