From e1431528ca471cc4b6fe9a62e007c2288dba6002 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Thu, 2 Mar 2023 12:29:56 +0800 Subject: [PATCH 001/364] theme added Yay --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000000..a25eb13c93 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: minima From 109fff0e6a8a7096b68d1bb80abb8b349fa1f39c Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Thu, 2 Mar 2023 12:50:03 +0800 Subject: [PATCH 002/364] Updated theme --- docs/_config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index a25eb13c93..4103809e29 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1,2 @@ -theme: minima +theme: minimal + From 929eea7dbb65842e25a37ddb8142d36e50a97561 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Thu, 2 Mar 2023 17:28:36 +0800 Subject: [PATCH 003/364] Update About Us --- docs/AboutUs.md | 14 +++++++------- docs/team/johndoe.md | 6 ------ docs/team/nafisazizir.md | 12 ++++++++++++ 3 files changed, 19 insertions(+), 13 deletions(-) delete mode 100644 docs/team/johndoe.md create mode 100644 docs/team/nafisazizir.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..7779134491 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:----------------:|:----------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index ab75b391b8..0000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,6 +0,0 @@ -# John Doe - Project Portfolio Page - -## Overview - - -### Summary of Contributions diff --git a/docs/team/nafisazizir.md b/docs/team/nafisazizir.md new file mode 100644 index 0000000000..cf318d77b7 --- /dev/null +++ b/docs/team/nafisazizir.md @@ -0,0 +1,12 @@ +# Nafis Aziiz Riza - Project Portfolio Page + +## Overview + + +### Summary of Contributions + +Computer science student in my sophomore year with a growth mindset and four years of experience +in team leadership. I am excited to apply my skills and knowledge to tackle complex problems and +drive meaningful business insights. My diverse skillset allows me to adapt quickly to new +environments and tackle a wide range of data challenges. I am always eager to learn and grow as a +data professional. \ No newline at end of file From 7e3f255e9cf4962e18baafc4bb64974a08f4846b Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 2 Mar 2023 20:22:04 +0800 Subject: [PATCH 004/364] Yan Ming's AboutUs.md --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..e60601714f 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:-------------:|:---------------------------------------:|:---------: +![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 70360b5da9e6495b774c03f3d5c2efd345fb6dc7 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 2 Mar 2023 20:25:20 +0800 Subject: [PATCH 005/364] Add AboutUs --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..8af9949c81 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:------------------:|:------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://media.licdn.com/dms/image/D5603AQF2s1tiv0c2ew/profile-displayphoto-shrink_800_800/0/1670660917709?e=2147483647&v=beta&t=h-DKn-98g-1YqwOPRXoE9b2kKwHC30KLOwezkv9zPEY) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From b04b57748225c6d1a511a464f6f1f01d046584c4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 2 Mar 2023 20:28:08 +0800 Subject: [PATCH 006/364] Ym's aboutUs.md update --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index e60601714f..88ee79feaa 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:-------------:|:---------------------------------------:|:---------: -![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:-------------:|:----------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png)) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 418bc442d2d78377040c7ac16bd0829788e08572 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 2 Mar 2023 20:39:16 +0800 Subject: [PATCH 007/364] edit --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 88ee79feaa..f5add90a06 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -4,6 +4,6 @@ Display | Name | Github Profile | Portfolio --------|:-------------:|:----------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png)) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](docs/team/johndoe.md) +![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 4b776020b31b17aa4432e6f6d8489c97f4810603 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 2 Mar 2023 20:44:29 +0800 Subject: [PATCH 008/364] Aviel's About Us --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 8af9949c81..d418821036 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -3,7 +3,7 @@ Display | Name | Github Profile | Portfolio --------|:------------------:|:------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://media.licdn.com/dms/image/D5603AQF2s1tiv0c2ew/profile-displayphoto-shrink_800_800/0/1670660917709?e=2147483647&v=beta&t=h-DKn-98g-1YqwOPRXoE9b2kKwHC30KLOwezkv9zPEY) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) +![](https://via.placeholder.com/100.png?text=Photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) ![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 6a33477aed1b73e839bafd7af26b6526a1a8bd8b Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Thu, 2 Mar 2023 20:45:48 +0800 Subject: [PATCH 009/364] Update _config.yml --- docs/_config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index 4103809e29..88342ad3f3 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,2 +1,4 @@ -theme: minimal +#Build Settings + +theme: minima From 0ad6b527ee0046c76603d73625c22df9eb69e472 Mon Sep 17 00:00:00 2001 From: aviel <87851671+avielcx@users.noreply.github.com> Date: Thu, 2 Mar 2023 20:46:58 +0800 Subject: [PATCH 010/364] Update AboutUs.md --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 61049fdd86..4161df48cd 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -3,7 +3,7 @@ Display | Name | Github Profile | Portfolio --------|:----------------:|:----------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) -![](https://media.licdn.com/dms/image/D5603AQF2s1tiv0c2ew/profile-displayphoto-shrink_800_800/0/1670660917709?e=2147483647&v=beta&t=h-DKn-98g-1YqwOPRXoE9b2kKwHC30KLOwezkv9zPEY) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) +![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) ![](https://i.kym-cdn.com/photos/images/original/002/507/103/eaf.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 3c96fa16eca1021296402e742bfae1a393b678ff Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Thu, 2 Mar 2023 21:03:42 +0800 Subject: [PATCH 011/364] added some memes --- src/main/java/seedu/duke/Duke.class | Bin 0 -> 1234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/java/seedu/duke/Duke.class diff --git a/src/main/java/seedu/duke/Duke.class b/src/main/java/seedu/duke/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..db6bd33b650dae70e17766b13dca23169359d65c GIT binary patch literal 1234 zcmaJ=>rN9v6#k}Mwp~|><&J_20+x%c;03jKqlQ3I)TBgWByNUwgoW*H)14(Y>4W$h z@&gh~d;lNHc&1xz8yaV_XU=}-GUqnGeqa6su!apC*D)N&NCKl6OA$7qV-mOHFf~jm za9W3kJBrMtz%Zd-gU=w(nU+#ha9t~+rnyd5wx!pUZ_C`b?IoK;`!;cQP1le%FpmX>{te%k zfvoWIj*v%wF-Z1eF^(kz_pq$NGH@R&45_^%E=?yetCWiA@sfDSaHF1WC>__z7r5t% zih)%;P2=kEs1y z+$*{wn28KCR|9H6+6;HAWzj*s^+iOz&a`IPaFOM%n|GwhXn4&qdnLb4u`x{kUk_6- z=;f;wqgPFDjcC7m{&X@rdloLhz7s=}Otd!wkw6Lq#4FX$=%Nj*ree7>bS++@8#qS~ z@u^-qe?a?qhWG^%I|MDAL%+nex<=FQIC%zi@{^?9j}h`eO*gDykg!3L#V~~DbsdHb UUSb_%7^nX}lH8<7Zq@1RAL&atpa1{> literal 0 HcmV?d00001 From 6e2db859bee72715773b41dd80820fd39e8e08b3 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Thu, 2 Mar 2023 21:07:24 +0800 Subject: [PATCH 012/364] make memes --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..f84b7dc07b 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +| Display | Name | Github Profile | Portfolio | +| ----------------------------------------------------------------------------- | :-------------------: | :-----------------------------------------: | :----------------------------------------------: | +| ![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) | +| ![Cats: exists](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](https://i.redd.it/oemztncmsib61.png) | From 7015171a65bdedafb21dab5ccfac167ca1228eb3 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 2 Mar 2023 21:30:36 +0800 Subject: [PATCH 013/364] Updated display --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index d356ce03dd..74be179e12 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -4,7 +4,7 @@ Display | Name | Github Profile | Portfoli --------|:----------------:|:----------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) ![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) -![](https://via.placeholder.com/100.png?text=photo) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) +![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 0d57dcd9b947d9f2b515482817696ff585e8651a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 3 Mar 2023 00:25:20 +0800 Subject: [PATCH 014/364] add description about Thomas in AboutUs.md --- docs/AboutUs.md | 14 +++++++------- docs/team/thomas.md | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 docs/team/thomas.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 3e1e1c18ac..c858f5f386 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----------------:|:----------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) -![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) -![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](https://i.redd.it/oemztncmsib61.png) +Display | Name | Github Profile | Portfolio +--------|:----------------------:|:-------------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) +![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) +![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) +![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](docs/team/thomas.md) +![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](https://i.redd.it/oemztncmsib61.png) diff --git a/docs/team/thomas.md b/docs/team/thomas.md new file mode 100644 index 0000000000..9d89bcfe19 --- /dev/null +++ b/docs/team/thomas.md @@ -0,0 +1,6 @@ +# Thomas Joseph Lee Alba - Project Portfolio Page +just like my head this page do be empty +## Overview + + +### Summary of Contributions \ No newline at end of file From 31dcb0b0dbc319f1dec9c3a0bf1ba969a9c35c86 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 16:05:03 +0800 Subject: [PATCH 015/364] Add Expense class --- .../java/seedu/duke/data/expense/Expense.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/seedu/duke/data/expense/Expense.java diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java new file mode 100644 index 0000000000..34c7d265e6 --- /dev/null +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -0,0 +1,26 @@ +package seedu.duke.data.expense; + +public class Expense { + private String description; + private String date; // to change to timestamp in the future + private float value; + + public Expense(String description, String date, float value) { + this.description = description; + this.date = date; + this.value = value; + } + + public String getDescription() { + return description; + } + + public String getDate() { + return date; + } + + public float getValue() { + return value; + } + +} \ No newline at end of file From c334d74d221497913386545faa659b8aaa81ddaa Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 16:17:32 +0800 Subject: [PATCH 016/364] Add expense list --- .../java/seedu/duke/data/expense/Expense.java | 3 ++ .../seedu/duke/data/expense/ExpenseList.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/seedu/duke/data/expense/ExpenseList.java diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java index 34c7d265e6..e6808faa0c 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -23,4 +23,7 @@ public float getValue() { return value; } + public String toString() { + return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue() ; + } } \ No newline at end of file diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java new file mode 100644 index 0000000000..eb616eba66 --- /dev/null +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -0,0 +1,33 @@ +package seedu.duke.data.expense; + +import java.util.ArrayList; + +public class ExpenseList { + private ArrayList expenseList; + private int expenseCount; + + public ExpenseList() { + expenseList = new ArrayList(); + expenseCount = 0; + } + + public ArrayList getExpenseList() { + return expenseList; + } + + public int getExpenseCount() { + return expenseCount; + } + + public void addExpense(Expense expense) { + expenseList.add(expense); + expenseCount++; + } + + public void printExpenseList() { + for (int i = 1; i <= expenseCount; i++) { + Expense expense = expenseList.get(i - 1); + System.out.println(i + ". " + expense.toString()); + } + } +} From 60ad8e7373859cd8a0fa080eb16de810450c3bf2 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 16:46:51 +0800 Subject: [PATCH 017/364] Update Duke.java to run empty command loop until 'bye' is written --- src/main/java/seedu/duke/Duke.java | 34 +++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 5c74e68d59..13364b9439 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -3,19 +3,47 @@ import java.util.Scanner; public class Duke { + + public static final String DIVIDER = "____________________________________________________________\n"; + /** * Main entry-point for the java.duke.Duke application. */ public static void main(String[] args) { + greet(); + runCommandLoopUntilExitCommand(); + exit(); + } + + private static void greet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - + System.out.println("What can I do for you today?"); + System.out.println(DIVIDER); + } + + private static void runCommandLoopUntilExitCommand() { Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); + String line = in.nextLine(); + + // continuously reads input from command line until command 'bye' is inputted + while (!line.equalsIgnoreCase("bye")) { + System.out.println(DIVIDER); + runCommand(line); + System.out.println(DIVIDER); + line = in.nextLine(); + } + } + + private static void runCommand(String line) { + // + } + + private static void exit() { + System.out.println("Bye!"); } } From 4fd291215b29904ba86e316f870d6484e9a3c44c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 16:51:47 +0800 Subject: [PATCH 018/364] Update Expense.java file with newline at end of file --- src/main/java/seedu/duke/data/expense/Expense.java | 4 ++-- src/main/java/seedu/duke/data/expense/ExpenseList.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java index e6808faa0c..2439247a52 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -24,6 +24,6 @@ public float getValue() { } public String toString() { - return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue() ; + return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue(); } -} \ No newline at end of file +} diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index eb616eba66..b68de6e876 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -6,6 +6,7 @@ public class ExpenseList { private ArrayList expenseList; private int expenseCount; + public ExpenseList() { expenseList = new ArrayList(); expenseCount = 0; From 4bfced6fc7c7b13ff73ea1a2498c572a0b20234c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 17:08:08 +0800 Subject: [PATCH 019/364] Update EXPECTED.TXT and input.txt to match the changes made in main --- text-ui-test/EXPECTED.TXT | 6 ++++-- text-ui-test/input.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..2c5fc40689 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -5,5 +5,7 @@ Hello from | |_| | |_| | < __/ |____/ \__,_|_|\_\___| -What is your name? -Hello James Gosling +What can I do for you today? +____________________________________________________________ + +Bye! \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..0abaeaa993 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -James Gosling \ No newline at end of file +bye \ No newline at end of file From a525f0e8a9a82f9191e3b11dd11c358293343bb5 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 17:15:10 +0800 Subject: [PATCH 020/364] Update EXPECTED.TXT with newline at end of file --- text-ui-test/EXPECTED.TXT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 2c5fc40689..75ab6aba56 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -8,4 +8,4 @@ Hello from What can I do for you today? ____________________________________________________________ -Bye! \ No newline at end of file +Bye! From f7c236de196b056375f4ea1577a6248a297a555f Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 17:25:53 +0800 Subject: [PATCH 021/364] Update Expense.java and ExpenseList.java to use spaces instead of tabs --- .../java/seedu/duke/data/expense/Expense.java | 50 ++++++++--------- .../seedu/duke/data/expense/ExpenseList.java | 56 +++++++++---------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java index 2439247a52..ead5a5925e 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -1,29 +1,29 @@ package seedu.duke.data.expense; public class Expense { - private String description; - private String date; // to change to timestamp in the future - private float value; - - public Expense(String description, String date, float value) { - this.description = description; - this.date = date; - this.value = value; - } - - public String getDescription() { - return description; - } - - public String getDate() { - return date; - } - - public float getValue() { - return value; - } - - public String toString() { - return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue(); - } + private String description; + private String date; // to change to timestamp in the future + private float value; + + public Expense(String description, String date, float value) { + this.description = description; + this.date = date; + this.value = value; + } + + public String getDescription() { + return description; + } + + public String getDate() { + return date; + } + + public float getValue() { + return value; + } + + public String toString() { + return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue(); + } } diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index b68de6e876..770d508032 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -3,32 +3,32 @@ import java.util.ArrayList; public class ExpenseList { - private ArrayList expenseList; - private int expenseCount; - - - public ExpenseList() { - expenseList = new ArrayList(); - expenseCount = 0; - } - - public ArrayList getExpenseList() { - return expenseList; - } - - public int getExpenseCount() { - return expenseCount; - } - - public void addExpense(Expense expense) { - expenseList.add(expense); - expenseCount++; - } - - public void printExpenseList() { - for (int i = 1; i <= expenseCount; i++) { - Expense expense = expenseList.get(i - 1); - System.out.println(i + ". " + expense.toString()); - } - } + private ArrayList expenseList; + private int expenseCount; + + + public ExpenseList() { + expenseList = new ArrayList(); + expenseCount = 0; + } + + public ArrayList getExpenseList() { + return expenseList; + } + + public int getExpenseCount() { + return expenseCount; + } + + public void addExpense(Expense expense) { + expenseList.add(expense); + expenseCount++; + } + + public void printExpenseList() { + for (int i = 1; i <= expenseCount; i++) { + Expense expense = expenseList.get(i - 1); + System.out.println(i + ". " + expense.toString()); + } + } } From 20fd49f5dffbf5db0d57a2fedc4d0ec817b8bd2b Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 9 Mar 2023 20:10:05 +0800 Subject: [PATCH 022/364] Exit test, ExpenseList count test --- src/test/java/seedu/duke/ExitTest.java | 33 +++++++++++++++++++ .../duke/data/expense/ExpenseListTest.java | 17 ++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/test/java/seedu/duke/ExitTest.java create mode 100644 src/test/java/seedu/duke/data/expense/ExpenseListTest.java diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java new file mode 100644 index 0000000000..f68e744a87 --- /dev/null +++ b/src/test/java/seedu/duke/ExitTest.java @@ -0,0 +1,33 @@ +package seedu.duke; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.*; + +class ExitTest { + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @Test + void ExitUnderTest_bye_expectBye() { + System.out.println("Bye!"); + + assertEquals("Bye!", outputStreamCaptor.toString().trim()); + + } + + @BeforeEach + public void tearDown() { + System.setOut(standardOut); + } +} \ No newline at end of file diff --git a/src/test/java/seedu/duke/data/expense/ExpenseListTest.java b/src/test/java/seedu/duke/data/expense/ExpenseListTest.java new file mode 100644 index 0000000000..a78e307314 --- /dev/null +++ b/src/test/java/seedu/duke/data/expense/ExpenseListTest.java @@ -0,0 +1,17 @@ +package seedu.duke.data.expense; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ExpenseListTest { + + @Test + void getExpenseCount_one_expectOne() { + + Expense expenseOne = new Expense("beach party","23 may 2023", 50); + ExpenseList list = new ExpenseList(); + list.addExpense(expenseOne); + assertEquals(1,list.getExpenseCount()); + } +} \ No newline at end of file From 7cf04f69407ada74f853a16407520c979a9749c7 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 9 Mar 2023 21:37:24 +0800 Subject: [PATCH 023/364] Update test file --- src/test/java/seedu/duke/ExitTest.java | 5 +---- .../java/seedu/duke/data/expense/ExpenseListTest.java | 10 ++++------ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java index f68e744a87..995f36a1e1 100644 --- a/src/test/java/seedu/duke/ExitTest.java +++ b/src/test/java/seedu/duke/ExitTest.java @@ -1,12 +1,9 @@ package seedu.duke; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import java.io.ByteArrayOutputStream; import java.io.PrintStream; - -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class ExitTest { diff --git a/src/test/java/seedu/duke/data/expense/ExpenseListTest.java b/src/test/java/seedu/duke/data/expense/ExpenseListTest.java index a78e307314..43b0b369ce 100644 --- a/src/test/java/seedu/duke/data/expense/ExpenseListTest.java +++ b/src/test/java/seedu/duke/data/expense/ExpenseListTest.java @@ -1,17 +1,15 @@ package seedu.duke.data.expense; - import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class ExpenseListTest { @Test void getExpenseCount_one_expectOne() { - Expense expenseOne = new Expense("beach party","23 may 2023", 50); + Expense expenseOne = new Expense("beach party", "23 may 2023", 50); ExpenseList list = new ExpenseList(); list.addExpense(expenseOne); - assertEquals(1,list.getExpenseCount()); + assertEquals(1, list.getExpenseCount()); } -} \ No newline at end of file +} From 6f43d70db458c8030711044967de8ad8d7ea1fdb Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 9 Mar 2023 21:40:14 +0800 Subject: [PATCH 024/364] parser update --- src/main/java/seedu/duke/Duke.java | 10 ++++-- src/main/java/seedu/duke/Parser.java | 35 +++++++++++++++++++ .../seedu/duke/data/expense/ExpenseList.java | 8 ++--- 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/main/java/seedu/duke/Parser.java diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 13364b9439..ee653a5f2c 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,5 +1,5 @@ package seedu.duke; - +import seedu.duke.Parser; import java.util.Scanner; public class Duke { @@ -40,7 +40,13 @@ private static void runCommandLoopUntilExitCommand() { } private static void runCommand(String line) { - // + String command = line; + try { + Parser.parseCommand(command); + } catch (Exception e) { + System.out.println("Command not recognized"); + } + } private static void exit() { diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java new file mode 100644 index 0000000000..773e8b2074 --- /dev/null +++ b/src/main/java/seedu/duke/Parser.java @@ -0,0 +1,35 @@ +package seedu.duke; +import seedu.duke.data.expense.Expense; +import seedu.duke.data.expense.ExpenseList; + +public class Parser { + public static void parseCommand(String line) { + String[] input = line.split(" ", 2); + switch(input[0]) { + case "expense": + try { + addExpenses(input[1]); + } catch (Exception e) { + System.out.println("FORMAT: expense /de DESCRIPTION /da DATE /va VALUE"); + } + break; + case "list": + try { + ExpenseList.printExpenseList(); + } catch (Exception e) { + System.out.println("Can't print expense list"); + } + break; + default: + System.out.println("Command not recognized"); + } + } + private static void addExpenses(String input) { + String expenseDescription = input.substring(input.indexOf("/de") + 3, input.indexOf("/da")).trim(); + String expenseDate = input.substring(input.indexOf("/da") + 3, input.indexOf("/va")).trim(); + String expenseValue = input.substring(input.indexOf("/va") + 3).trim(); + Expense expense = new Expense(expenseDescription, expenseDate, Float.parseFloat(expenseValue)); + ExpenseList.addExpense(expense); + System.out.println("Expense added"); + } +} diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index 770d508032..33b71d80fb 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -3,8 +3,8 @@ import java.util.ArrayList; public class ExpenseList { - private ArrayList expenseList; - private int expenseCount; + private static ArrayList expenseList; + private static int expenseCount; public ExpenseList() { @@ -20,12 +20,12 @@ public int getExpenseCount() { return expenseCount; } - public void addExpense(Expense expense) { + public static void addExpense(Expense expense) { expenseList.add(expense); expenseCount++; } - public void printExpenseList() { + public static void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Expense expense = expenseList.get(i - 1); System.out.println(i + ". " + expense.toString()); From 1836d2d8989a1512c259817c3994555ca86427a6 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 9 Mar 2023 22:18:13 +0800 Subject: [PATCH 025/364] Update test file --- src/test/java/seedu/duke/ExitTest.java | 5 ++- src/test/java/seedu/duke/ExitTest.java.rej | 36 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/test/java/seedu/duke/ExitTest.java.rej diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java index 995f36a1e1..a8be267661 100644 --- a/src/test/java/seedu/duke/ExitTest.java +++ b/src/test/java/seedu/duke/ExitTest.java @@ -1,8 +1,11 @@ package seedu.duke; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + import java.io.ByteArrayOutputStream; import java.io.PrintStream; + import static org.junit.jupiter.api.Assertions.assertEquals; class ExitTest { @@ -16,7 +19,7 @@ public void setUp() { } @Test - void ExitUnderTest_bye_expectBye() { + void Exit_bye_expectBye() { System.out.println("Bye!"); assertEquals("Bye!", outputStreamCaptor.toString().trim()); diff --git a/src/test/java/seedu/duke/ExitTest.java.rej b/src/test/java/seedu/duke/ExitTest.java.rej new file mode 100644 index 0000000000..e9866b77d7 --- /dev/null +++ b/src/test/java/seedu/duke/ExitTest.java.rej @@ -0,0 +1,36 @@ +diff a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java (rejected hunks) +@@ -0,0 +1,33 @@ ++package seedu.duke; ++ ++import org.junit.jupiter.api.BeforeEach; ++import org.junit.jupiter.api.Test; ++ ++import java.io.ByteArrayOutputStream; ++import java.io.PrintStream; ++ ++import static org.junit.jupiter.api.Assertions.*; ++ ++class ExitTest { ++ ++ private final PrintStream standardOut = System.out; ++ private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); ++ ++ @BeforeEach ++ public void setUp() { ++ System.setOut(new PrintStream(outputStreamCaptor)); ++ } ++ ++ @Test ++ void ExitUnderTest_bye_expectBye() { ++ System.out.println("Bye!"); ++ ++ assertEquals("Bye!", outputStreamCaptor.toString().trim()); ++ ++ } ++ ++ @BeforeEach ++ public void tearDown() { ++ System.setOut(standardOut); ++ } ++} +\ No newline at end of file From 42729022b235e6a06ee7b56ebfb88c7d91530c97 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 9 Mar 2023 22:21:35 +0800 Subject: [PATCH 026/364] Update test file --- src/test/java/seedu/duke/ExitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java index a8be267661..aa08f5cf8a 100644 --- a/src/test/java/seedu/duke/ExitTest.java +++ b/src/test/java/seedu/duke/ExitTest.java @@ -19,7 +19,7 @@ public void setUp() { } @Test - void Exit_bye_expectBye() { + void exit_bye_expectBye() { System.out.println("Bye!"); assertEquals("Bye!", outputStreamCaptor.toString().trim()); From 898d4ae7b503674c46876b901bde0374055b6259 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 9 Mar 2023 22:29:09 +0800 Subject: [PATCH 027/364] Update test file --- src/test/java/seedu/duke/ExitTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java index aa08f5cf8a..cfbb0a7aea 100644 --- a/src/test/java/seedu/duke/ExitTest.java +++ b/src/test/java/seedu/duke/ExitTest.java @@ -25,9 +25,4 @@ void exit_bye_expectBye() { assertEquals("Bye!", outputStreamCaptor.toString().trim()); } - - @BeforeEach - public void tearDown() { - System.setOut(standardOut); - } -} \ No newline at end of file +} From d48dcb0292319d655aaa5a851e6c9b6890b338c7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 9 Mar 2023 23:12:38 +0800 Subject: [PATCH 028/364] Added parser and junit test for expense descrption --- src/main/java/seedu/duke/Parser.java | 30 ++++++++----------- .../java/seedu/duke/data/expense/Expense.java | 8 ++--- .../seedu/duke/data/expense/ExpenseList.java | 10 +++---- src/test/java/seedu/duke/ExpenseTest.java | 14 +++++++++ 4 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 src/test/java/seedu/duke/ExpenseTest.java diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 773e8b2074..3ae365332a 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -5,31 +5,27 @@ public class Parser { public static void parseCommand(String line) { String[] input = line.split(" ", 2); - switch(input[0]) { + switch(input[0].trim()) { case "expense": - try { - addExpenses(input[1]); - } catch (Exception e) { - System.out.println("FORMAT: expense /de DESCRIPTION /da DATE /va VALUE"); - } + addExpenses(input[1]); break; case "list": - try { - ExpenseList.printExpenseList(); - } catch (Exception e) { - System.out.println("Can't print expense list"); - } + ExpenseList.printExpenseList(); break; default: System.out.println("Command not recognized"); } } private static void addExpenses(String input) { - String expenseDescription = input.substring(input.indexOf("/de") + 3, input.indexOf("/da")).trim(); - String expenseDate = input.substring(input.indexOf("/da") + 3, input.indexOf("/va")).trim(); - String expenseValue = input.substring(input.indexOf("/va") + 3).trim(); - Expense expense = new Expense(expenseDescription, expenseDate, Float.parseFloat(expenseValue)); - ExpenseList.addExpense(expense); - System.out.println("Expense added"); + try { + String expenseDescription = input.substring(input.indexOf("/de") + 3, input.indexOf("/da")).trim(); + String expenseDate = input.substring(input.indexOf("/da") + 3, input.indexOf("/va")).trim(); + float expenseValue = Float.parseFloat(input.substring(input.indexOf("/va") + 3).trim()); + Expense exp = new Expense(expenseDescription, expenseDate, expenseValue); + ExpenseList.addExpense(exp); + System.out.println("Expense added"); + } catch (Exception e) { + System.out.println("Trouble adding expenses"); + } } } diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java index ead5a5925e..0835b8bec5 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -1,9 +1,9 @@ package seedu.duke.data.expense; public class Expense { - private String description; - private String date; // to change to timestamp in the future - private float value; + protected String description; + protected String date; // to change to timestamp in the future + protected float value; public Expense(String description, String date, float value) { this.description = description; @@ -24,6 +24,6 @@ public float getValue() { } public String toString() { - return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue(); + return "Expense: " + getDescription() + " | Date: " + getDate() + " | Value: " + getValue(); } } diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index 33b71d80fb..246cc1530e 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -3,12 +3,12 @@ import java.util.ArrayList; public class ExpenseList { - private static ArrayList expenseList; - private static int expenseCount; - - + private static ArrayList expenseList = new ArrayList<>(); + private static int expenseCount = 0; + + public ExpenseList() { - expenseList = new ArrayList(); + expenseList = new ArrayList<>(); expenseCount = 0; } diff --git a/src/test/java/seedu/duke/ExpenseTest.java b/src/test/java/seedu/duke/ExpenseTest.java new file mode 100644 index 0000000000..07dee2e171 --- /dev/null +++ b/src/test/java/seedu/duke/ExpenseTest.java @@ -0,0 +1,14 @@ +package seedu.duke; + +import org.junit.jupiter.api.Test; +import seedu.duke.data.expense.Expense; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ExpenseTest { + @Test + void getExpenseDescription_expected() { + String test = "public transport"; + Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + assertEquals("public transport", exp.getDescription()); + } +} From 315d91801bd0ef89812350eb30aec4cd2c61141c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 9 Mar 2023 23:19:43 +0800 Subject: [PATCH 029/364] Added parser and junit test for expense descrption --- src/main/java/seedu/duke/Duke.java | 1 - src/main/java/seedu/duke/Parser.java | 1 + src/test/java/seedu/duke/ExpenseTest.java | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index ee653a5f2c..101cff3563 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,5 +1,4 @@ package seedu.duke; -import seedu.duke.Parser; import java.util.Scanner; public class Duke { diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 3ae365332a..743794eeba 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -29,3 +29,4 @@ private static void addExpenses(String input) { } } } + diff --git a/src/test/java/seedu/duke/ExpenseTest.java b/src/test/java/seedu/duke/ExpenseTest.java index 07dee2e171..27ecc168fc 100644 --- a/src/test/java/seedu/duke/ExpenseTest.java +++ b/src/test/java/seedu/duke/ExpenseTest.java @@ -12,3 +12,4 @@ void getExpenseDescription_expected() { assertEquals("public transport", exp.getDescription()); } } + From 365489ab6a86ad405d3d176f5c88264c1ba62e51 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 9 Mar 2023 23:23:32 +0800 Subject: [PATCH 030/364] Add splitLine class in Main.java to identify command and arguments --- src/main/java/seedu/duke/Duke.java | 31 ++++++++++++++++--- .../seedu/duke/data/expense/ExpenseList.java | 5 +++ src/test/java/seedu/duke/DukeTest.java | 15 +++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 13364b9439..4d5a7f6b2a 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,5 +1,10 @@ package seedu.duke; +import seedu.duke.data.expense.ExpenseList; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; public class Duke { @@ -10,8 +15,9 @@ public class Duke { * Main entry-point for the java.duke.Duke application. */ public static void main(String[] args) { + ExpenseList expenseList = new ExpenseList(); greet(); - runCommandLoopUntilExitCommand(); + runCommandLoopUntilExitCommand(expenseList); exit(); } @@ -26,24 +32,39 @@ private static void greet() { System.out.println(DIVIDER); } - private static void runCommandLoopUntilExitCommand() { + private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { Scanner in = new Scanner(System.in); String line = in.nextLine(); // continuously reads input from command line until command 'bye' is inputted while (!line.equalsIgnoreCase("bye")) { System.out.println(DIVIDER); - runCommand(line); + runCommand(line, expenseList); System.out.println(DIVIDER); line = in.nextLine(); } } - private static void runCommand(String line) { - // + public static void runCommand(String line, ExpenseList expenseList) { + List lineParts = splitLine(line); + String command = lineParts.get(0); + List arguments = lineParts.subList(1, lineParts.size()); + + switch (command) { + default: + System.out.println("Command not found"); + break; + } + } + + public static ArrayList splitLine(String line) { + ArrayList lineParts = new ArrayList(); + lineParts.addAll(Arrays.asList(line.split(" /"))); + return lineParts; } private static void exit() { System.out.println("Bye!"); } + } diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index 770d508032..1fd26c840d 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -1,6 +1,7 @@ package seedu.duke.data.expense; import java.util.ArrayList; +import java.util.List; public class ExpenseList { private ArrayList expenseList; @@ -25,6 +26,10 @@ public void addExpense(Expense expense) { expenseCount++; } + public void addExpense(List args) { + + } + public void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Expense expense = expenseList.get(i - 1); diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java index 2dda5fd651..1a1137540c 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/seedu/duke/DukeTest.java @@ -1,12 +1,27 @@ package seedu.duke; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + class DukeTest { @Test public void sampleTest() { assertTrue(true); } + + @Test + public void splitLine_testScenario_expectedBehaviour() { + List expectedOutput = new ArrayList(); + expectedOutput.add("add expense"); + expectedOutput.add("de breakfast"); + expectedOutput.add("da 01/02/23"); + expectedOutput.add("v 3.50"); + + assertEquals(expectedOutput, new Duke().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); + } } From d99a82c1abe22a94e743ebed6b4c7ed7f7224a1a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 10 Mar 2023 00:37:26 +0800 Subject: [PATCH 031/364] Updated parseCommand class to match what is in the team's repo --- src/main/java/seedu/duke/Duke.java | 23 +++------- src/main/java/seedu/duke/Parser.java | 44 +++++++++++++++++++ .../java/seedu/duke/data/expense/Expense.java | 2 +- .../seedu/duke/data/expense/ExpenseList.java | 13 ++---- src/test/java/seedu/duke/DukeTest.java | 16 +------ src/test/java/seedu/duke/ParserTest.java | 20 +++++++++ 6 files changed, 75 insertions(+), 43 deletions(-) create mode 100644 src/main/java/seedu/duke/Parser.java create mode 100644 src/test/java/seedu/duke/ParserTest.java diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 4d5a7f6b2a..d33587d581 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,10 +1,6 @@ package seedu.duke; import seedu.duke.data.expense.ExpenseList; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Scanner; public class Duke { @@ -46,23 +42,14 @@ private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { } public static void runCommand(String line, ExpenseList expenseList) { - List lineParts = splitLine(line); - String command = lineParts.get(0); - List arguments = lineParts.subList(1, lineParts.size()); - - switch (command) { - default: - System.out.println("Command not found"); - break; + String command = line; + try { + Parser.parseCommand(command, expenseList); + } catch (Exception e) { + System.out.println("Command not recognized"); } } - public static ArrayList splitLine(String line) { - ArrayList lineParts = new ArrayList(); - lineParts.addAll(Arrays.asList(line.split(" /"))); - return lineParts; - } - private static void exit() { System.out.println("Bye!"); } diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java new file mode 100644 index 0000000000..40146b5239 --- /dev/null +++ b/src/main/java/seedu/duke/Parser.java @@ -0,0 +1,44 @@ +package seedu.duke; +import seedu.duke.data.expense.Expense; +import seedu.duke.data.expense.ExpenseList; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Parser { + public static void parseCommand(String line, ExpenseList expenseList) { + List lineParts = splitLine(line); + String command = lineParts.get(0); + List arguments = lineParts.subList(1, lineParts.size()); + switch(command) { + case "add expense": + addExpenses(arguments, expenseList); + break; + case "list": + ExpenseList.printExpenseList(); + break; + default: + System.out.println("Command not recognized"); + } + } + + public static ArrayList splitLine(String line) { + ArrayList lineParts = new ArrayList(); + lineParts.addAll(Arrays.asList(line.split(" /"))); + return lineParts; + } + + private static void addExpenses(List arguments, ExpenseList expenseList) { + try { + String expenseDescription = arguments.get(0).substring(2).trim(); + String expenseDate = arguments.get(1).substring(2).trim(); + float expenseValue = Float.parseFloat(arguments.get(2).substring(1).trim()); + Expense exp = new Expense(expenseDescription, expenseDate, expenseValue); + ExpenseList.addExpense(exp); + System.out.println("Expense added"); + } catch (Exception e) { + System.out.println("Trouble adding expenses"); + } + } +} diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/expense/Expense.java index ead5a5925e..13d5d7f40c 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/expense/Expense.java @@ -24,6 +24,6 @@ public float getValue() { } public String toString() { - return "Expense - " + getDescription() + " - Date - " + getDate() + " - value: - " + getValue(); + return "Expense - " + getDescription() + " | Date - " + getDate() + " | value - " + getValue(); } } diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/expense/ExpenseList.java index 1fd26c840d..33b71d80fb 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/expense/ExpenseList.java @@ -1,11 +1,10 @@ package seedu.duke.data.expense; import java.util.ArrayList; -import java.util.List; public class ExpenseList { - private ArrayList expenseList; - private int expenseCount; + private static ArrayList expenseList; + private static int expenseCount; public ExpenseList() { @@ -21,16 +20,12 @@ public int getExpenseCount() { return expenseCount; } - public void addExpense(Expense expense) { + public static void addExpense(Expense expense) { expenseList.add(expense); expenseCount++; } - public void addExpense(List args) { - - } - - public void printExpenseList() { + public static void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Expense expense = expenseList.get(i - 1); System.out.println(i + ". " + expense.toString()); diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/DukeTest.java index 1a1137540c..f352cb8d1b 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/seedu/duke/DukeTest.java @@ -1,27 +1,13 @@ package seedu.duke; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; - import org.junit.jupiter.api.Test; -import java.util.ArrayList; -import java.util.List; - class DukeTest { @Test public void sampleTest() { assertTrue(true); } - @Test - public void splitLine_testScenario_expectedBehaviour() { - List expectedOutput = new ArrayList(); - expectedOutput.add("add expense"); - expectedOutput.add("de breakfast"); - expectedOutput.add("da 01/02/23"); - expectedOutput.add("v 3.50"); - - assertEquals(expectedOutput, new Duke().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); - } + } diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java new file mode 100644 index 0000000000..ce516bdadb --- /dev/null +++ b/src/test/java/seedu/duke/ParserTest.java @@ -0,0 +1,20 @@ +package seedu.duke; + +import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ParserTest { + @Test + public void splitLine_testScenario_expectedBehaviour() { + List expectedOutput = new ArrayList(); + expectedOutput.add("add expense"); + expectedOutput.add("de breakfast"); + expectedOutput.add("da 01/02/23"); + expectedOutput.add("v 3.50"); + + assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); + } +} From ef0000b4ffcfee7978a6418789726c07c7f7af7e Mon Sep 17 00:00:00 2001 From: Thomas Alba <88082961+thomasjlalba@users.noreply.github.com> Date: Fri, 10 Mar 2023 00:46:55 +0800 Subject: [PATCH 032/364] Update Duke.java update to allow merged conflicts to run --- src/main/java/seedu/duke/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index b1c0cecdaf..788fee17e6 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -35,7 +35,7 @@ private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { // continuously reads input from command line until command 'bye' is inputted while (!line.equalsIgnoreCase("bye")) { System.out.println(DIVIDER); - runCommand(line, expenseList); + runCommand(line); System.out.println(DIVIDER); line = in.nextLine(); } From a3bb4bd105f3677a77b0b15cd8b574af3d16c767 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 10 Mar 2023 08:38:12 +0800 Subject: [PATCH 033/364] added a parser test and 2 expense test --- build.gradle | 1 + src/main/java/seedu/duke/Duke.java | 1 + src/main/java/seedu/duke/Parser.java | 2 +- src/test/java/seedu/duke/ExpenseTest.java | 14 ++++++++++++ src/test/java/seedu/duke/ParserTest.java | 27 +++++++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d5e548e85f..18b3706977 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + testImplementation('org.junit.platform:junit-platform-launcher:1.5.2') testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 788fee17e6..2e8640e148 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -39,6 +39,7 @@ private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { System.out.println(DIVIDER); line = in.nextLine(); } + in.close(); } private static void runCommand(String line) { diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 05eaed15a0..69d26bfd3c 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -28,7 +28,7 @@ public static ArrayList splitLine(String line) { return lineParts; } - private static void addExpenses(List arguments) { + public static void addExpenses(List arguments) { try { String expenseDescription = arguments.get(0).substring(2).trim(); String expenseDate = arguments.get(1).substring(2).trim(); diff --git a/src/test/java/seedu/duke/ExpenseTest.java b/src/test/java/seedu/duke/ExpenseTest.java index 27ecc168fc..1a8f1da79a 100644 --- a/src/test/java/seedu/duke/ExpenseTest.java +++ b/src/test/java/seedu/duke/ExpenseTest.java @@ -11,5 +11,19 @@ void getExpenseDescription_expected() { Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); assertEquals("public transport", exp.getDescription()); } + + @Test + void getExpenseDate_expected() { + String test = "1st apr 2023"; + Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + assertEquals("1st apr 2023", exp.getDate()); + } + + @Test + void getExpenseValue_expected() { + float test = (float) 1.50; + Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + assertEquals((float) 1.50, exp.getValue()); + } } diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index ce516bdadb..cca4a54869 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -1,10 +1,15 @@ package seedu.duke; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; public class ParserTest { @Test @@ -17,4 +22,26 @@ public void splitLine_testScenario_expectedBehaviour() { assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); } + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @Test + public void parseCommand_badInput_exceptionThrown() throws Exception{ + String badInput = "add expenses /de breakfast /da 01/02/23 /v 3.50"; + new Parser().parseCommand(badInput); + assertEquals("Command not recognized", outputStreamCaptor.toString().trim()); + + } + + @AfterEach + public void tearDown() { + System.setOut(standardOut); + } + } From 1b6dbc7763c37dd933a19886a3b8aa532a88dad8 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Fri, 10 Mar 2023 09:04:49 +0800 Subject: [PATCH 034/364] Add 1 Expense Test --- src/test/java/seedu/duke/ExpenseTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/seedu/duke/ExpenseTest.java b/src/test/java/seedu/duke/ExpenseTest.java index 1a8f1da79a..9e103bce81 100644 --- a/src/test/java/seedu/duke/ExpenseTest.java +++ b/src/test/java/seedu/duke/ExpenseTest.java @@ -25,5 +25,12 @@ void getExpenseValue_expected() { Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); assertEquals((float) 1.50, exp.getValue()); } + + @Test + void getValue_expected() { + Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + String expected = "Expense - public transport | Date - 1st apr 2023 | value - 1.5"; + assertEquals(expected, exp.toString()); + } } From 50244f9668ee42efb1fd838f9391f266ecd552ac Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Fri, 10 Mar 2023 09:20:58 +0800 Subject: [PATCH 035/364] Fix checkstyle, delete unused imports and change the order of variable instantiation --- src/test/java/seedu/duke/ParserTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index cca4a54869..07383880dd 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -7,11 +7,13 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class ParserTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); @@ -23,9 +25,6 @@ public void splitLine_testScenario_expectedBehaviour() { assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); } - private final PrintStream standardOut = System.out; - private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - @BeforeEach public void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); From af65d12ba6309f4102bcf90487782303f5fde804 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 10 Mar 2023 14:53:47 +0800 Subject: [PATCH 036/364] clean up syntax to pass checkstyle test --- src/test/java/seedu/duke/ParserTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index cca4a54869..6a8d4ab328 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -7,11 +7,14 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class ParserTest { + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); @@ -23,8 +26,6 @@ public void splitLine_testScenario_expectedBehaviour() { assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); } - private final PrintStream standardOut = System.out; - private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @BeforeEach public void setUp() { From 6e6139c706ad56ee64cf0a62d7f9853a8f6c1de7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sat, 11 Mar 2023 22:11:05 +0800 Subject: [PATCH 037/364] added record class --- .../java/seedu/duke/data/expense/Record.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/seedu/duke/data/expense/Record.java diff --git a/src/main/java/seedu/duke/data/expense/Record.java b/src/main/java/seedu/duke/data/expense/Record.java new file mode 100644 index 0000000000..5d5f596808 --- /dev/null +++ b/src/main/java/seedu/duke/data/expense/Record.java @@ -0,0 +1,46 @@ +package seedu.duke.data.expense; + +public class Record { + protected String category; + protected String description; + protected String date; + protected float value; + + /** + * Generic constructor for Record class. + * @param category string of record category, i.e. expense or income + * @param description string of record description + * @param date string of record date + * @param value float of record amount + */ + public Record(String category, String description, String date, float value) { + this.category = category; + this.description = description; + this.date = date; + this.value = value; + + } + + public String getCategory() { + return category; + } + + public String getDescription() { + return description; + } + + public String getDate() { + return date; + } + + public float getValue() { + return value; + } + + public String toString() { + return "Category - " + getCategory() + + "| Description - " + getDescription() + + "| Date - " + getDate() + + "| Value - " + getValue(); + } +} From d9d81770a3b6389efe8aff7466e3552964abcd4d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sat, 11 Mar 2023 22:45:14 +0800 Subject: [PATCH 038/364] Naming cleanup + Junit testing --- .../java/seedu/duke/{Duke.java => ChChing.java} | 4 ++-- src/main/java/seedu/duke/Parser.java | 4 ++-- .../seedu/duke/data/{expense => }/Expense.java | 2 +- .../duke/data/{expense => }/ExpenseList.java | 2 +- .../seedu/duke/data/{expense => }/Record.java | 4 ++-- .../duke/{DukeTest.java => ChChingTest.java} | 2 +- .../duke/data/{expense => }/ExpenseListTest.java | 2 +- .../java/seedu/duke/{ => data}/ExpenseTest.java | 4 ++-- src/test/java/seedu/duke/data/RecordTest.java | 15 +++++++++++++++ 9 files changed, 27 insertions(+), 12 deletions(-) rename src/main/java/seedu/duke/{Duke.java => ChChing.java} (96%) rename src/main/java/seedu/duke/data/{expense => }/Expense.java (95%) rename src/main/java/seedu/duke/data/{expense => }/ExpenseList.java (95%) rename src/main/java/seedu/duke/data/{expense => }/Record.java (90%) rename src/test/java/seedu/duke/{DukeTest.java => ChChingTest.java} (90%) rename src/test/java/seedu/duke/data/{expense => }/ExpenseListTest.java (92%) rename src/test/java/seedu/duke/{ => data}/ExpenseTest.java (94%) create mode 100644 src/test/java/seedu/duke/data/RecordTest.java diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/ChChing.java similarity index 96% rename from src/main/java/seedu/duke/Duke.java rename to src/main/java/seedu/duke/ChChing.java index 2e8640e148..ab5716780e 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/ChChing.java @@ -1,9 +1,9 @@ package seedu.duke; -import seedu.duke.data.expense.ExpenseList; +import seedu.duke.data.ExpenseList; import java.util.Scanner; -public class Duke { +public class ChChing { public static final String DIVIDER = "____________________________________________________________\n"; diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 69d26bfd3c..e09a2a9a87 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -1,6 +1,6 @@ package seedu.duke; -import seedu.duke.data.expense.Expense; -import seedu.duke.data.expense.ExpenseList; +import seedu.duke.data.Expense; +import seedu.duke.data.ExpenseList; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/seedu/duke/data/expense/Expense.java b/src/main/java/seedu/duke/data/Expense.java similarity index 95% rename from src/main/java/seedu/duke/data/expense/Expense.java rename to src/main/java/seedu/duke/data/Expense.java index d1e3fd978f..4dfe4a47cf 100644 --- a/src/main/java/seedu/duke/data/expense/Expense.java +++ b/src/main/java/seedu/duke/data/Expense.java @@ -1,4 +1,4 @@ -package seedu.duke.data.expense; +package seedu.duke.data; public class Expense { protected String description; diff --git a/src/main/java/seedu/duke/data/expense/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java similarity index 95% rename from src/main/java/seedu/duke/data/expense/ExpenseList.java rename to src/main/java/seedu/duke/data/ExpenseList.java index 1b63c32735..606bc5359c 100644 --- a/src/main/java/seedu/duke/data/expense/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -1,4 +1,4 @@ -package seedu.duke.data.expense; +package seedu.duke.data; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/data/expense/Record.java b/src/main/java/seedu/duke/data/Record.java similarity index 90% rename from src/main/java/seedu/duke/data/expense/Record.java rename to src/main/java/seedu/duke/data/Record.java index 5d5f596808..3df6b22f8f 100644 --- a/src/main/java/seedu/duke/data/expense/Record.java +++ b/src/main/java/seedu/duke/data/Record.java @@ -1,4 +1,4 @@ -package seedu.duke.data.expense; +package seedu.duke.data; public class Record { protected String category; @@ -8,7 +8,7 @@ public class Record { /** * Generic constructor for Record class. - * @param category string of record category, i.e. expense or income + * @param category string of record category, accepts "income" or "expense" * @param description string of record description * @param date string of record date * @param value float of record amount diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/ChChingTest.java similarity index 90% rename from src/test/java/seedu/duke/DukeTest.java rename to src/test/java/seedu/duke/ChChingTest.java index f352cb8d1b..65d1b756a2 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/seedu/duke/ChChingTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; -class DukeTest { +class ChChingTest { @Test public void sampleTest() { assertTrue(true); diff --git a/src/test/java/seedu/duke/data/expense/ExpenseListTest.java b/src/test/java/seedu/duke/data/ExpenseListTest.java similarity index 92% rename from src/test/java/seedu/duke/data/expense/ExpenseListTest.java rename to src/test/java/seedu/duke/data/ExpenseListTest.java index 43b0b369ce..ddfeacc426 100644 --- a/src/test/java/seedu/duke/data/expense/ExpenseListTest.java +++ b/src/test/java/seedu/duke/data/ExpenseListTest.java @@ -1,4 +1,4 @@ -package seedu.duke.data.expense; +package seedu.duke.data; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/seedu/duke/ExpenseTest.java b/src/test/java/seedu/duke/data/ExpenseTest.java similarity index 94% rename from src/test/java/seedu/duke/ExpenseTest.java rename to src/test/java/seedu/duke/data/ExpenseTest.java index 9e103bce81..74699fb1ef 100644 --- a/src/test/java/seedu/duke/ExpenseTest.java +++ b/src/test/java/seedu/duke/data/ExpenseTest.java @@ -1,7 +1,7 @@ -package seedu.duke; +package seedu.duke.data; import org.junit.jupiter.api.Test; -import seedu.duke.data.expense.Expense; +import seedu.duke.data.Expense; import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { diff --git a/src/test/java/seedu/duke/data/RecordTest.java b/src/test/java/seedu/duke/data/RecordTest.java new file mode 100644 index 0000000000..e09f8e0ccb --- /dev/null +++ b/src/test/java/seedu/duke/data/RecordTest.java @@ -0,0 +1,15 @@ +package seedu.duke.data; + +import org.junit.jupiter.api.Test; +import seedu.duke.data.Record; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +public class RecordTest { + + @Test + void getRecordCategory_expected() { + String test = "income"; + Record record = new Record("income", "tuition", "1st apr 2023", (float) 40); + assertEquals("income", record.getCategory()); + } +} From 36c70b3be29df016160ce545322c051a97082442 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Sat, 11 Mar 2023 23:18:45 +0800 Subject: [PATCH 039/364] Update RecordTest.java --- src/test/java/seedu/duke/data/RecordTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/seedu/duke/data/RecordTest.java b/src/test/java/seedu/duke/data/RecordTest.java index e09f8e0ccb..65b3ae812e 100644 --- a/src/test/java/seedu/duke/data/RecordTest.java +++ b/src/test/java/seedu/duke/data/RecordTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.Test; import seedu.duke.data.Record; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; public class RecordTest { @Test From 8cba92bafb6f6c4046bb55b231ce708dfad05bf7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sat, 11 Mar 2023 23:23:49 +0800 Subject: [PATCH 040/364] Removed un-needed imports for clean code --- src/test/java/seedu/duke/data/ExpenseTest.java | 1 - src/test/java/seedu/duke/data/RecordTest.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/seedu/duke/data/ExpenseTest.java b/src/test/java/seedu/duke/data/ExpenseTest.java index 74699fb1ef..49d531b263 100644 --- a/src/test/java/seedu/duke/data/ExpenseTest.java +++ b/src/test/java/seedu/duke/data/ExpenseTest.java @@ -1,7 +1,6 @@ package seedu.duke.data; import org.junit.jupiter.api.Test; -import seedu.duke.data.Expense; import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { diff --git a/src/test/java/seedu/duke/data/RecordTest.java b/src/test/java/seedu/duke/data/RecordTest.java index e09f8e0ccb..b86ff21af2 100644 --- a/src/test/java/seedu/duke/data/RecordTest.java +++ b/src/test/java/seedu/duke/data/RecordTest.java @@ -1,9 +1,8 @@ package seedu.duke.data; import org.junit.jupiter.api.Test; -import seedu.duke.data.Record; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; + public class RecordTest { @Test From 9f2204ceeb51cf7a2ebac1d8f6be63c2e4bbab9d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sat, 11 Mar 2023 23:37:04 +0800 Subject: [PATCH 041/364] cleanup RecordTest and ExpenseTest by removing un-needed imports --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 18b3706977..afd2e0db83 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ test { } application { - mainClass = "seedu.duke.Duke" + mainClass = "seedu.duke.ChChing" } shadowJar { From 65e0f97a73a270d1c73ce6521c22e24cf659309f Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 12 Mar 2023 14:54:32 +0800 Subject: [PATCH 042/364] Add Income, IncomeList, Expense, ExpenseList, RecordList classes. Make Record and RecordList classes abstract classes --- docs/team/aviel.md | 7 ++++ src/main/java/seedu/duke/data/Expense.java | 27 +++------------ .../java/seedu/duke/data/ExpenseList.java | 33 ++++-------------- src/main/java/seedu/duke/data/Income.java | 12 +++++++ src/main/java/seedu/duke/data/IncomeList.java | 11 ++++++ src/main/java/seedu/duke/data/Record.java | 5 ++- src/main/java/seedu/duke/data/RecordList.java | 34 +++++++++++++++++++ 7 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 docs/team/aviel.md create mode 100644 src/main/java/seedu/duke/data/Income.java create mode 100644 src/main/java/seedu/duke/data/IncomeList.java create mode 100644 src/main/java/seedu/duke/data/RecordList.java diff --git a/docs/team/aviel.md b/docs/team/aviel.md new file mode 100644 index 0000000000..0038aea46a --- /dev/null +++ b/docs/team/aviel.md @@ -0,0 +1,7 @@ +# Eng Chen Xi, Aviel - Project Portfolio Page + +## Overview + + +### Summary of Contributions + diff --git a/src/main/java/seedu/duke/data/Expense.java b/src/main/java/seedu/duke/data/Expense.java index 4dfe4a47cf..b9bcd6c867 100644 --- a/src/main/java/seedu/duke/data/Expense.java +++ b/src/main/java/seedu/duke/data/Expense.java @@ -1,29 +1,12 @@ package seedu.duke.data; -public class Expense { - protected String description; - protected String date; // to change to timestamp in the future - protected float value; - - public Expense(String description, String date, float value) { +public class Expense extends Record { + + public Expense(String category, String description, String date, float value) { + this.category = category; this.description = description; this.date = date; this.value = value; } - - public String getDescription() { - return description; - } - - public String getDate() { - return date; - } - - public float getValue() { - return value; - } - - public String toString() { - return "Expense - " + getDescription() + " | Date - " + getDate() + " | value - " + getValue(); - } + } diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java index 606bc5359c..ef7a256c5d 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -2,33 +2,12 @@ import java.util.ArrayList; -public class ExpenseList { +public class ExpenseList extends RecordList{ - private static ArrayList expenseList = new ArrayList<>(); - private static int expenseCount = 0; - - public ExpenseList() { - expenseList = new ArrayList<>(); - expenseCount = 0; - } - - public ArrayList getExpenseList() { - return expenseList; - } - - public int getExpenseCount() { - return expenseCount; - } - - public static void addExpense(Expense expense) { - expenseList.add(expense); - expenseCount++; - } - - public static void printExpenseList() { - for (int i = 1; i <= expenseCount; i++) { - Expense expense = expenseList.get(i - 1); - System.out.println(i + ". " + expense.toString()); - } + ExpenseList(){ + recordList = new ArrayList<>(); + recordCount = 0; } + + } diff --git a/src/main/java/seedu/duke/data/Income.java b/src/main/java/seedu/duke/data/Income.java new file mode 100644 index 0000000000..6564e16611 --- /dev/null +++ b/src/main/java/seedu/duke/data/Income.java @@ -0,0 +1,12 @@ +package seedu.duke.data; + +public class Income extends Record{ + public Income(String category, String description, String date, float value) { + this.category = category; + this.description = description; + this.date = date; + this.value = value; + } + + +} diff --git a/src/main/java/seedu/duke/data/IncomeList.java b/src/main/java/seedu/duke/data/IncomeList.java new file mode 100644 index 0000000000..2fc9b07db8 --- /dev/null +++ b/src/main/java/seedu/duke/data/IncomeList.java @@ -0,0 +1,11 @@ +package seedu.duke.data; + +import java.util.ArrayList; + +public class IncomeList extends RecordList{ + + IncomeList(){ + recordList = new ArrayList<>(); + recordCount = 0; + } +} diff --git a/src/main/java/seedu/duke/data/Record.java b/src/main/java/seedu/duke/data/Record.java index 3df6b22f8f..e4419d0fdb 100644 --- a/src/main/java/seedu/duke/data/Record.java +++ b/src/main/java/seedu/duke/data/Record.java @@ -1,6 +1,6 @@ package seedu.duke.data; -public class Record { +public abstract class Record { protected String category; protected String description; protected String date; @@ -13,6 +13,9 @@ public class Record { * @param date string of record date * @param value float of record amount */ + public Record(){ + + } public Record(String category, String description, String date, float value) { this.category = category; this.description = description; diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java new file mode 100644 index 0000000000..add4855f5d --- /dev/null +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -0,0 +1,34 @@ +package seedu.duke.data; + +import java.util.ArrayList; + +public abstract class RecordList { + + protected ArrayList recordList = new ArrayList<>(); + protected int recordCount = 0; + + public RecordList() { + recordList = new ArrayList<>(); + recordCount = 0; + } + + public ArrayList getRecordList() { + return recordList; + } + + public int getRecordCount() { + return recordCount; + } + + public void addRecord(Record record) { + recordList.add(record); + recordCount++; + } + + public void printExpenseList() { + for (int i = 1; i <= recordCount; i++) { + Record record = recordList.get(i - 1); + System.out.println(i + ". " + record.toString()); + } + } +} From f92772ba0e9b33ee36a47813059b51aecd2c86c7 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 12 Mar 2023 15:09:04 +0800 Subject: [PATCH 043/364] Add private getBalance method for RecordList class. Its child classes will not inherit. --- src/main/java/seedu/duke/data/RecordList.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index add4855f5d..4162155704 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -4,6 +4,7 @@ public abstract class RecordList { + private int balance; protected ArrayList recordList = new ArrayList<>(); protected int recordCount = 0; @@ -20,12 +21,19 @@ public int getRecordCount() { return recordCount; } + public int getBalance(){ + for(int i = 0; i Date: Sun, 12 Mar 2023 15:39:17 +0800 Subject: [PATCH 044/364] RecordList class no longer abstract --- src/main/java/seedu/duke/data/RecordList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index 4162155704..b4054b18b8 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -2,7 +2,7 @@ import java.util.ArrayList; -public abstract class RecordList { +public class RecordList { private int balance; protected ArrayList recordList = new ArrayList<>(); From a0a839b18aacf32d8510ef6309df061cf6f10d1d Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 12 Mar 2023 16:37:10 +0800 Subject: [PATCH 045/364] create UI, and storage class, delete Duke.class --- src/main/java/seedu/duke/Duke.class | Bin 1234 -> 0 bytes src/main/java/seedu/duke/Storage.java | 31 ++++++++++ src/main/java/seedu/duke/Ui.java | 86 ++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) delete mode 100644 src/main/java/seedu/duke/Duke.class create mode 100644 src/main/java/seedu/duke/Storage.java create mode 100644 src/main/java/seedu/duke/Ui.java diff --git a/src/main/java/seedu/duke/Duke.class b/src/main/java/seedu/duke/Duke.class deleted file mode 100644 index db6bd33b650dae70e17766b13dca23169359d65c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1234 zcmaJ=>rN9v6#k}Mwp~|><&J_20+x%c;03jKqlQ3I)TBgWByNUwgoW*H)14(Y>4W$h z@&gh~d;lNHc&1xz8yaV_XU=}-GUqnGeqa6su!apC*D)N&NCKl6OA$7qV-mOHFf~jm za9W3kJBrMtz%Zd-gU=w(nU+#ha9t~+rnyd5wx!pUZ_C`b?IoK;`!;cQP1le%FpmX>{te%k zfvoWIj*v%wF-Z1eF^(kz_pq$NGH@R&45_^%E=?yetCWiA@sfDSaHF1WC>__z7r5t% zih)%;P2=kEs1y z+$*{wn28KCR|9H6+6;HAWzj*s^+iOz&a`IPaFOM%n|GwhXn4&qdnLb4u`x{kUk_6- z=;f;wqgPFDjcC7m{&X@rdloLhz7s=}Otd!wkw6Lq#4FX$=%Nj*ree7>bS++@8#qS~ z@u^-qe?a?qhWG^%I|MDAL%+nex<=FQIC%zi@{^?9j}h`eO*gDykg!3L#V~~DbsdHb UUSb_%7^nX}lH8<7Zq@1RAL&atpa1{> diff --git a/src/main/java/seedu/duke/Storage.java b/src/main/java/seedu/duke/Storage.java new file mode 100644 index 0000000000..12ec501909 --- /dev/null +++ b/src/main/java/seedu/duke/Storage.java @@ -0,0 +1,31 @@ +package seedu.duke; + +import seedu.duke.data.Record; +import seedu.duke.data.RecordList; + +import java.io.File; +import java.util.ArrayList; + +/** + * Model a class to handle storage for the program. + */ +public class Storage { + private final File file; + + /** + * Build constructor for the Storage class. + * @param filepath the filepath of the storage. + */ + Storage(String filepath) { + String dirname = filepath.substring(0, filepath.lastIndexOf("/")); + File dir = new File(dirname); + dir.mkdirs(); + this.file = new File(filepath); + } + + public ArrayList load(){ + } + + public void save(RecordList records) { + } + diff --git a/src/main/java/seedu/duke/Ui.java b/src/main/java/seedu/duke/Ui.java new file mode 100644 index 0000000000..e840b4b7d2 --- /dev/null +++ b/src/main/java/seedu/duke/Ui.java @@ -0,0 +1,86 @@ +package seedu.duke; + +import seedu.duke.data.RecordList; +import seedu.duke.data.Record; + +import java.util.Scanner; + +public class Ui { + + public String readCommand() { + Scanner input = new Scanner((System.in)); + String fullCommand = input.nextLine(); + return fullCommand; + } + + public void showLine() { + System.out.println(" ____________________________________________________________"); + } + + public void showWelcome() { + showLine(); + System.out.println(" Hello! I'm ChChing."); + System.out.println(" What can I do for you?"); + showLine(); + } + + public void showGoodbye() { + System.out.println(" Bye. Hope to see you again soon!"); + } + + public void showAdded(RecordList records, Record record) { + System.out.println(" Got it. I've added this record:"); + System.out.println(" " + record); + System.out.println(" Now you have " + records.getRecordCount() + " records in the list."); + } + + public void showDelete(RecordList records, Record record) { + System.out.println(" Noted. I've removed this record:"); + System.out.println(" " + record); + System.out.println(" Now you have " + records.getRecordCount() + " records in the list."); + } + + public void showAllRecords(RecordList records) { + System.out.println(" Here are the records in your list:"); + + for (int i = 0; i < records.getRecordCount(); i++) { + System.out.println(" " + (i+1) + ". " + records.get(i)); + } + } + + public void showBalance() { + System.out.println(" Current balance:"); + System.out.println(" SGD 0.00"); + } + + + public void showHelp() { + System.out.println(" ADD RECORDS:"); + System.out.println(" add expense /c /de /da /v "); + System.out.println(" add income"); + System.out.println(); + System.out.println(" SHOW ALL RECORDS:"); + System.out.println(" list"); + System.out.println(); + System.out.println(" EDIT RECORDS:"); + System.out.println(" edit expense /c /de /da /v "); + System.out.println(" edit income "); + System.out.println(); + System.out.println(" DELETE RECORDS:"); + System.out.println(" delete expense "); + System.out.println(" delete income "); + System.out.println(); + System.out.println(" SHOW BALANCE:"); + System.out.println(" balance"); + System.out.println(); + System.out.println(" SHOW HELP:"); + System.out.println(" help"); + System.out.println(); + System.out.println(" EXIT THE PROGRAM:"); + System.out.println(" exit"); + } + + public void showError(String message) { + System.out.println(" " + message); + } +} From 2786d97bc8c055a43521781013d30f09ffd39178 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 12 Mar 2023 19:33:03 +0800 Subject: [PATCH 046/364] Add sortArguments to categorize each argument --- src/main/java/seedu/duke/Parser.java | 45 +++++++++++++++---- .../java/seedu/duke/data/ExpenseList.java | 2 +- src/main/java/seedu/duke/data/RecordList.java | 8 ++-- src/test/java/seedu/duke/ParserTest.java | 21 ++++++++- .../java/seedu/duke/data/ExpenseListTest.java | 6 +-- .../java/seedu/duke/data/ExpenseTest.java | 10 ++--- 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index e09a2a9a87..225419c3c8 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -3,19 +3,24 @@ import seedu.duke.data.ExpenseList; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; public class Parser { + + public static final String FIELD_DEMARCATION = " /"; + public static void parseCommand(String line) { List lineParts = splitLine(line); String command = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); + HashMap argumentsByField = sortArguments(arguments); switch(command) { case "add expense": - addExpenses(arguments); + addExpenses(argumentsByField); break; case "list": - ExpenseList.printExpenseList(); + ExpenseList.printRecordList(); break; default: System.out.println("Command not recognized"); @@ -24,17 +29,39 @@ public static void parseCommand(String line) { public static ArrayList splitLine(String line) { ArrayList lineParts = new ArrayList(); - lineParts.addAll(Arrays.asList(line.split(" /"))); + lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); return lineParts; } - public static void addExpenses(List arguments) { + public static HashMap sortArguments(List arguments) { + HashMap argumentsByField = new HashMap(); + int argumentsCount = arguments.size(); + + // split each argument according to their field and their value, and add into hashmap accordingly + // Hashmap's key is its field, value is the value of the field + for (int i = 0; i < argumentsCount; i++) { + String argument = arguments.get(i); + String[] fieldAndValue = argument.split(" ", 2); + try { + String field = fieldAndValue[0].trim(); + String value = fieldAndValue[1].trim(); + argumentsByField.put(field, value); + } catch (NullPointerException e) { + System.out.println("Error: arguments not inputted correctly/missing a value"); + } + } + return argumentsByField; + } + + public static void addExpenses(HashMap argumentsByField) { try { - String expenseDescription = arguments.get(0).substring(2).trim(); - String expenseDate = arguments.get(1).substring(2).trim(); - float expenseValue = Float.parseFloat(arguments.get(2).substring(1).trim()); - Expense exp = new Expense(expenseDescription, expenseDate, expenseValue); - ExpenseList.addExpense(exp); + String expenseCategory = argumentsByField.get("c"); + String expenseDescription = argumentsByField.get("de"); + String expenseDate = argumentsByField.get("da"); + float expenseValue = Float.parseFloat(argumentsByField.get("va")); + + Expense exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); + ExpenseList.addRecord(exp); System.out.println("Expense added"); } catch (Exception e) { System.out.println("Trouble adding expenses"); diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java index ef7a256c5d..5052801ee4 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -4,7 +4,7 @@ public class ExpenseList extends RecordList{ - ExpenseList(){ + public ExpenseList() { recordList = new ArrayList<>(); recordCount = 0; } diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index b4054b18b8..8798f0b8df 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -5,8 +5,8 @@ public class RecordList { private int balance; - protected ArrayList recordList = new ArrayList<>(); - protected int recordCount = 0; + protected static ArrayList recordList = new ArrayList<>(); + protected static int recordCount = 0; public RecordList() { recordList = new ArrayList<>(); @@ -28,12 +28,12 @@ public int getBalance(){ return balance; } - public void addRecord(Record record) { + public static void addRecord(Record record) { recordList.add(record); recordCount++; } - public void printRecordList() { + public static void printRecordList() { for (int i = 1; i <= recordCount; i++) { Record record = recordList.get(i - 1); System.out.println(i + ". " + record.toString()); diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index f688e13c05..52a7b2638a 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -18,13 +19,31 @@ public class ParserTest { public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); expectedOutput.add("add expense"); + expectedOutput.add("ca meal"); expectedOutput.add("de breakfast"); expectedOutput.add("da 01/02/23"); expectedOutput.add("v 3.50"); assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); } - + + @Test + public void sortArguments_testScenario_expectedBehaviour() { + List input = new ArrayList(); + input.add("add expense"); + input.add("ca meal"); + input.add("de breakfast"); + input.add("da 01/02/23"); + input.add("v 3.50"); + + HashMap expectedOutput = new HashMap(); + expectedOutput.put("ca", "meal"); + expectedOutput.put("de", "breakfast"); + expectedOutput.put("da", "01/02/23"); + expectedOutput.put("v", "3.50"); + + assertEquals(expectedOutput, new Parser().sortArguments(input)); + } @BeforeEach public void setUp() { diff --git a/src/test/java/seedu/duke/data/ExpenseListTest.java b/src/test/java/seedu/duke/data/ExpenseListTest.java index ddfeacc426..07576c1d39 100644 --- a/src/test/java/seedu/duke/data/ExpenseListTest.java +++ b/src/test/java/seedu/duke/data/ExpenseListTest.java @@ -7,9 +7,9 @@ class ExpenseListTest { @Test void getExpenseCount_one_expectOne() { - Expense expenseOne = new Expense("beach party", "23 may 2023", 50); + Expense expenseOne = new Expense("entertainment", "beach party", "23 may 2023", 50); ExpenseList list = new ExpenseList(); - list.addExpense(expenseOne); - assertEquals(1, list.getExpenseCount()); + list.addRecord(expenseOne); + assertEquals(1, list.getRecordCount()); } } diff --git a/src/test/java/seedu/duke/data/ExpenseTest.java b/src/test/java/seedu/duke/data/ExpenseTest.java index 49d531b263..affac79bb9 100644 --- a/src/test/java/seedu/duke/data/ExpenseTest.java +++ b/src/test/java/seedu/duke/data/ExpenseTest.java @@ -7,28 +7,28 @@ public class ExpenseTest { @Test void getExpenseDescription_expected() { String test = "public transport"; - Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); assertEquals("public transport", exp.getDescription()); } @Test void getExpenseDate_expected() { String test = "1st apr 2023"; - Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); assertEquals("1st apr 2023", exp.getDate()); } @Test void getExpenseValue_expected() { float test = (float) 1.50; - Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); assertEquals((float) 1.50, exp.getValue()); } @Test void getValue_expected() { - Expense exp = new Expense("public transport", "1st apr 2023", (float) 1.50); - String expected = "Expense - public transport | Date - 1st apr 2023 | value - 1.5"; + Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); + String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | value - 1.5"; assertEquals(expected, exp.toString()); } } From f74fe36c8e6fd123ae4b7abdb1fc087c250781f0 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 12 Mar 2023 19:54:37 +0800 Subject: [PATCH 047/364] Add JUnit testing for sortArguments method in Parser.java class Also fixed the bugs to let the code run --- src/main/java/seedu/duke/ChChing.java | 2 +- src/main/java/seedu/duke/Parser.java | 2 +- src/test/java/seedu/duke/ParserTest.java | 21 ++++++++++++------- src/test/java/seedu/duke/data/RecordTest.java | 14 ------------- 4 files changed, 16 insertions(+), 23 deletions(-) delete mode 100644 src/test/java/seedu/duke/data/RecordTest.java diff --git a/src/main/java/seedu/duke/ChChing.java b/src/main/java/seedu/duke/ChChing.java index ab5716780e..69e33975ef 100644 --- a/src/main/java/seedu/duke/ChChing.java +++ b/src/main/java/seedu/duke/ChChing.java @@ -47,7 +47,7 @@ private static void runCommand(String line) { try { Parser.parseCommand(command); } catch (Exception e) { - System.out.println("Command not recognized"); + System.out.println("Error: Command not recognized"); } } diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 225419c3c8..bfa1f3f915 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -23,7 +23,7 @@ public static void parseCommand(String line) { ExpenseList.printRecordList(); break; default: - System.out.println("Command not recognized"); + System.out.println("Command not recognized, please enter a valid command!"); } } diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index 52a7b2638a..e97b0c298f 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -14,7 +14,12 @@ public class ParserTest { private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); @@ -24,13 +29,12 @@ public void splitLine_testScenario_expectedBehaviour() { expectedOutput.add("da 01/02/23"); expectedOutput.add("v 3.50"); - assertEquals(expectedOutput, new Parser().splitLine("add expense /de breakfast /da 01/02/23 /v 3.50")); + assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); } @Test public void sortArguments_testScenario_expectedBehaviour() { List input = new ArrayList(); - input.add("add expense"); input.add("ca meal"); input.add("de breakfast"); input.add("da 01/02/23"); @@ -44,10 +48,13 @@ public void sortArguments_testScenario_expectedBehaviour() { assertEquals(expectedOutput, new Parser().sortArguments(input)); } - - @BeforeEach - public void setUp() { - System.setOut(new PrintStream(outputStreamCaptor)); + + @Test + public void sortArguments_emptyInput_returnsEmptyHashMap() { + List input = new ArrayList(); + + HashMap expectedOutput = new HashMap(); + assertEquals(expectedOutput, new Parser().sortArguments(input)); } @Test diff --git a/src/test/java/seedu/duke/data/RecordTest.java b/src/test/java/seedu/duke/data/RecordTest.java deleted file mode 100644 index b86ff21af2..0000000000 --- a/src/test/java/seedu/duke/data/RecordTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package seedu.duke.data; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class RecordTest { - - @Test - void getRecordCategory_expected() { - String test = "income"; - Record record = new Record("income", "tuition", "1st apr 2023", (float) 40); - assertEquals("income", record.getCategory()); - } -} From 3e52ab944de940e640eb6b2ad5f2545c4f55a027 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 12 Mar 2023 20:14:32 +0800 Subject: [PATCH 048/364] Fix bugs that resulted in JUnit test failing --- src/main/java/seedu/duke/data/Record.java | 6 +++--- src/main/java/seedu/duke/data/RecordList.java | 3 ++- src/test/java/seedu/duke/ParserTest.java | 4 ++-- src/test/java/seedu/duke/data/ExpenseTest.java | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/seedu/duke/data/Record.java b/src/main/java/seedu/duke/data/Record.java index e4419d0fdb..c355f846e9 100644 --- a/src/main/java/seedu/duke/data/Record.java +++ b/src/main/java/seedu/duke/data/Record.java @@ -42,8 +42,8 @@ public float getValue() { public String toString() { return "Category - " + getCategory() + - "| Description - " + getDescription() + - "| Date - " + getDate() + - "| Value - " + getValue(); + " | Description - " + getDescription() + + " | Date - " + getDate() + + " | Value - " + getValue(); } } diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index 8798f0b8df..a61bbc7c9b 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -4,9 +4,10 @@ public class RecordList { - private int balance; protected static ArrayList recordList = new ArrayList<>(); protected static int recordCount = 0; + private int balance; + public RecordList() { recordList = new ArrayList<>(); diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/seedu/duke/ParserTest.java index e97b0c298f..553787fc75 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/seedu/duke/ParserTest.java @@ -58,10 +58,10 @@ public void sortArguments_emptyInput_returnsEmptyHashMap() { } @Test - public void parseCommand_badInput_exceptionThrown() throws Exception{ + public void parseCommand_badInput_exceptionThrown(){ String badInput = "add expenses /de breakfast /da 01/02/23 /v 3.50"; new Parser().parseCommand(badInput); - assertEquals("Command not recognized", outputStreamCaptor.toString().trim()); + assertEquals("Command not recognized, please enter a valid command!", outputStreamCaptor.toString().trim()); } diff --git a/src/test/java/seedu/duke/data/ExpenseTest.java b/src/test/java/seedu/duke/data/ExpenseTest.java index affac79bb9..b5970dc465 100644 --- a/src/test/java/seedu/duke/data/ExpenseTest.java +++ b/src/test/java/seedu/duke/data/ExpenseTest.java @@ -28,7 +28,7 @@ void getExpenseValue_expected() { @Test void getValue_expected() { Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); - String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | value - 1.5"; + String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.5"; assertEquals(expected, exp.toString()); } } From 077b300e3c38b3dd38b2b1cc93e5f4e7e3a4420f Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 12 Mar 2023 20:25:41 +0800 Subject: [PATCH 049/364] Delete Storage.java --- src/main/java/seedu/duke/Storage.java | 31 --------------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/main/java/seedu/duke/Storage.java diff --git a/src/main/java/seedu/duke/Storage.java b/src/main/java/seedu/duke/Storage.java deleted file mode 100644 index 12ec501909..0000000000 --- a/src/main/java/seedu/duke/Storage.java +++ /dev/null @@ -1,31 +0,0 @@ -package seedu.duke; - -import seedu.duke.data.Record; -import seedu.duke.data.RecordList; - -import java.io.File; -import java.util.ArrayList; - -/** - * Model a class to handle storage for the program. - */ -public class Storage { - private final File file; - - /** - * Build constructor for the Storage class. - * @param filepath the filepath of the storage. - */ - Storage(String filepath) { - String dirname = filepath.substring(0, filepath.lastIndexOf("/")); - File dir = new File(dirname); - dir.mkdirs(); - this.file = new File(filepath); - } - - public ArrayList load(){ - } - - public void save(RecordList records) { - } - From 97c0009a5f5c0ed44f0896637d11ce4079fedd8b Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 12 Mar 2023 20:36:50 +0800 Subject: [PATCH 050/364] Fix Compile Error in showAllRecords method in Ui class --- src/main/java/seedu/duke/Ui.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/seedu/duke/Ui.java b/src/main/java/seedu/duke/Ui.java index e840b4b7d2..1cfc9a8e50 100644 --- a/src/main/java/seedu/duke/Ui.java +++ b/src/main/java/seedu/duke/Ui.java @@ -43,9 +43,7 @@ public void showDelete(RecordList records, Record record) { public void showAllRecords(RecordList records) { System.out.println(" Here are the records in your list:"); - for (int i = 0; i < records.getRecordCount(); i++) { - System.out.println(" " + (i+1) + ". " + records.get(i)); - } + records.printRecordList(); } public void showBalance() { From 46f5dac35eb30669388a59fcbfda89428004f8af Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 12 Mar 2023 21:48:30 +0800 Subject: [PATCH 051/364] Changing parser for incomeList and expenseList methods --- src/main/java/seedu/duke/Parser.java | 37 ++++++++++++++++--- .../java/seedu/duke/data/ExpenseList.java | 15 ++++++-- src/main/java/seedu/duke/data/IncomeList.java | 13 +++++-- src/main/java/seedu/duke/data/RecordList.java | 2 +- 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index bfa1f3f915..98b621bd7d 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -1,6 +1,6 @@ package seedu.duke; -import seedu.duke.data.Expense; -import seedu.duke.data.ExpenseList; +import seedu.duke.data.*; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -9,18 +9,28 @@ public class Parser { public static final String FIELD_DEMARCATION = " /"; - + public static void parseCommand(String line) { List lineParts = splitLine(line); String command = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); switch(command) { + case "add income": + addIncomes(argumentsByField); + break; case "add expense": addExpenses(argumentsByField); break; + case "list incomes": + IncomeList.printIncomeList(); + break; + case "list expenses": + ExpenseList.printExpenseList(); + break; case "list": - ExpenseList.printRecordList(); + IncomeList.printIncomeList(); + ExpenseList.printExpenseList(); break; default: System.out.println("Command not recognized, please enter a valid command!"); @@ -58,13 +68,30 @@ public static void addExpenses(HashMap argumentsByField) { String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); String expenseDate = argumentsByField.get("da"); - float expenseValue = Float.parseFloat(argumentsByField.get("va")); + float expenseValue = Float.parseFloat(argumentsByField.get("v")); Expense exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); ExpenseList.addRecord(exp); + RecordList.addRecord(exp); System.out.println("Expense added"); } catch (Exception e) { System.out.println("Trouble adding expenses"); } } + + public static void addIncomes(HashMap argumentsByField) { + try { + String incomeCategory = argumentsByField.get("c"); + String incomeDescription = argumentsByField.get("de"); + String incomeDate = argumentsByField.get("da"); + float incomeValue = Float.parseFloat(argumentsByField.get("v")); + + Income inc = new Income(incomeCategory, incomeDescription, incomeDate, incomeValue); + IncomeList.addRecord(inc); + RecordList.addRecord(inc); + System.out.println("Income added"); + } catch (Exception e) { + System.out.println("Trouble adding income"); + } + } } diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java index 5052801ee4..ebc528c371 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -4,10 +4,17 @@ public class ExpenseList extends RecordList{ + protected static ArrayList expenseList = new ArrayList<>(); + protected static int expenseCount = 0; + public ExpenseList() { - recordList = new ArrayList<>(); - recordCount = 0; + expenseList = new ArrayList<>(); + expenseCount = 0; + } + public static void printExpenseList() { + for (int i = 1; i <= expenseCount; i++) { + Record record = expenseList.get(i - 1); + System.out.println(i + ". " + record.toString()); + } } - - } diff --git a/src/main/java/seedu/duke/data/IncomeList.java b/src/main/java/seedu/duke/data/IncomeList.java index 2fc9b07db8..b21bd69a13 100644 --- a/src/main/java/seedu/duke/data/IncomeList.java +++ b/src/main/java/seedu/duke/data/IncomeList.java @@ -3,9 +3,16 @@ import java.util.ArrayList; public class IncomeList extends RecordList{ - + protected static ArrayList incomeList = new ArrayList<>(); + protected static int incomeCount = 0; IncomeList(){ - recordList = new ArrayList<>(); - recordCount = 0; + incomeList = new ArrayList<>(); + incomeCount = 0; + } + public static void printIncomeList() { + for (int i = 1; i <= incomeCount; i++) { + Record record = incomeList.get(i - 1); + System.out.println(i + ". " + record.toString()); + } } } diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index a61bbc7c9b..6300d1269c 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -14,7 +14,7 @@ public RecordList() { recordCount = 0; } - public ArrayList getRecordList() { + public static ArrayList getRecordList() { return recordList; } From e8b7ebe447338a1ff5fe82e6030dafde63c056cc Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 12 Mar 2023 22:01:00 +0800 Subject: [PATCH 052/364] implement add and list functionality for incomeList and ExpenseList --- src/main/java/seedu/duke/ChChing.java | 3 +++ src/main/java/seedu/duke/Parser.java | 8 ++++---- src/main/java/seedu/duke/data/ExpenseList.java | 9 +++++++-- src/main/java/seedu/duke/data/IncomeList.java | 10 +++++++--- src/main/java/seedu/duke/data/RecordList.java | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/duke/ChChing.java b/src/main/java/seedu/duke/ChChing.java index 69e33975ef..cf72be035e 100644 --- a/src/main/java/seedu/duke/ChChing.java +++ b/src/main/java/seedu/duke/ChChing.java @@ -1,6 +1,8 @@ package seedu.duke; import seedu.duke.data.ExpenseList; +import seedu.duke.data.IncomeList; + import java.util.Scanner; public class ChChing { @@ -12,6 +14,7 @@ public class ChChing { */ public static void main(String[] args) { ExpenseList expenseList = new ExpenseList(); + IncomeList incomeList = new IncomeList(); greet(); runCommandLoopUntilExitCommand(expenseList); exit(); diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 98b621bd7d..89c8f52c59 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -22,10 +22,10 @@ public static void parseCommand(String line) { case "add expense": addExpenses(argumentsByField); break; - case "list incomes": + case "list income": IncomeList.printIncomeList(); break; - case "list expenses": + case "list expense": ExpenseList.printExpenseList(); break; case "list": @@ -71,7 +71,7 @@ public static void addExpenses(HashMap argumentsByField) { float expenseValue = Float.parseFloat(argumentsByField.get("v")); Expense exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); - ExpenseList.addRecord(exp); + ExpenseList.addExpense(exp); RecordList.addRecord(exp); System.out.println("Expense added"); } catch (Exception e) { @@ -87,7 +87,7 @@ public static void addIncomes(HashMap argumentsByField) { float incomeValue = Float.parseFloat(argumentsByField.get("v")); Income inc = new Income(incomeCategory, incomeDescription, incomeDate, incomeValue); - IncomeList.addRecord(inc); + IncomeList.addIncome(inc); RecordList.addRecord(inc); System.out.println("Income added"); } catch (Exception e) { diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java index ebc528c371..ab665d9132 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -4,13 +4,18 @@ public class ExpenseList extends RecordList{ - protected static ArrayList expenseList = new ArrayList<>(); - protected static int expenseCount = 0; + protected static ArrayList expenseList; + protected static int expenseCount; public ExpenseList() { expenseList = new ArrayList<>(); expenseCount = 0; } + public static void addExpense(Expense expense) { + expenseList.add(expense); + expenseCount++; + } + public static void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Record record = expenseList.get(i - 1); diff --git a/src/main/java/seedu/duke/data/IncomeList.java b/src/main/java/seedu/duke/data/IncomeList.java index b21bd69a13..c653a8b41d 100644 --- a/src/main/java/seedu/duke/data/IncomeList.java +++ b/src/main/java/seedu/duke/data/IncomeList.java @@ -3,12 +3,16 @@ import java.util.ArrayList; public class IncomeList extends RecordList{ - protected static ArrayList incomeList = new ArrayList<>(); - protected static int incomeCount = 0; - IncomeList(){ + protected static ArrayList incomeList; + protected static int incomeCount; + public IncomeList(){ incomeList = new ArrayList<>(); incomeCount = 0; } + public static void addIncome(Income income) { + incomeList.add(income); + incomeCount++; + } public static void printIncomeList() { for (int i = 1; i <= incomeCount; i++) { Record record = incomeList.get(i - 1); diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/seedu/duke/data/RecordList.java index 6300d1269c..afd7061e70 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/seedu/duke/data/RecordList.java @@ -2,7 +2,7 @@ import java.util.ArrayList; -public class RecordList { +public abstract class RecordList { protected static ArrayList recordList = new ArrayList<>(); protected static int recordCount = 0; From 43a42d9d05a67871c2e5fdbc41a3d77c00c6cae4 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Sun, 12 Mar 2023 22:06:40 +0800 Subject: [PATCH 053/364] Update Parser.java --- src/main/java/seedu/duke/Parser.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 89c8f52c59..a69e6c2be0 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -1,5 +1,9 @@ package seedu.duke; -import seedu.duke.data.*; +import seedu.duke.data.Expense; +import seedu.duke.data.ExpenseList; +import seedu.duke.data.Income; +import seedu.duke.data.IncomeList; +import seedu.duke.data.RecordList; import java.util.ArrayList; import java.util.Arrays; From 8e5411eb5355f84df4c428ebc7785aafee428c39 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 12 Mar 2023 23:28:07 +0800 Subject: [PATCH 054/364] implement edit function --- src/main/java/seedu/duke/Parser.java | 63 +++++++++++++++++++ src/main/java/seedu/duke/Ui.java | 2 +- .../java/seedu/duke/data/ExpenseList.java | 16 ++++- src/main/java/seedu/duke/data/IncomeList.java | 15 +++++ 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index a69e6c2be0..1bbd5d618f 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -1,4 +1,5 @@ package seedu.duke; +import seedu.duke.Ui; import seedu.duke.data.Expense; import seedu.duke.data.ExpenseList; import seedu.duke.data.Income; @@ -33,9 +34,20 @@ public static void parseCommand(String line) { ExpenseList.printExpenseList(); break; case "list": + System.out.println("Income:"); IncomeList.printIncomeList(); + System.out.println("Expenses:"); ExpenseList.printExpenseList(); break; + case "edit income": + editIncomes(argumentsByField); + break; + case "edit expense": + editExpenses(argumentsByField); + break; + case "help": + Ui.showHelp(); + break; default: System.out.println("Command not recognized, please enter a valid command!"); } @@ -98,4 +110,55 @@ public static void addIncomes(HashMap argumentsByField) { System.out.println("Trouble adding income"); } } + + public static void editExpenses(HashMap argumentsByField) { + try { + int index = Integer.parseInt(argumentsByField.get("i")); + String updateCategory = null; + String updateDescription = null; + String updateDate = null; + float updateValue = 0; + if(argumentsByField.containsKey("c")) { + updateCategory = argumentsByField.get("c"); + } + if(argumentsByField.containsKey("de")) { + updateDescription = argumentsByField.get("de"); + } + if(argumentsByField.containsKey("da")) { + updateDate = argumentsByField.get("da"); + } + if(argumentsByField.containsKey("v")) { + updateValue = Float.parseFloat(argumentsByField.get("v")); + } + ExpenseList.editExpense(index, updateCategory, updateDescription, updateDate, updateValue); + System.out.println("Expense modified"); + } catch (Exception e) { + System.out.println("Trouble editing expense"); + } + } + public static void editIncomes(HashMap argumentsByField) { + try { + int index = Integer.parseInt(argumentsByField.get("i")); + String updateCategory = null; + String updateDescription = null; + String updateDate = null; + float updateValue = 0; + if(argumentsByField.containsKey("c")) { + updateCategory = argumentsByField.get("c"); + } + if(argumentsByField.containsKey("de")) { + updateDescription = argumentsByField.get("de"); + } + if(argumentsByField.containsKey("da")) { + updateDate = argumentsByField.get("da"); + } + if(argumentsByField.containsKey("v")) { + updateValue = Float.parseFloat(argumentsByField.get("v")); + } + IncomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); + System.out.println("Income modified"); + } catch (Exception e) { + System.out.println("Trouble editing income"); + } + } } diff --git a/src/main/java/seedu/duke/Ui.java b/src/main/java/seedu/duke/Ui.java index 1cfc9a8e50..bc69718949 100644 --- a/src/main/java/seedu/duke/Ui.java +++ b/src/main/java/seedu/duke/Ui.java @@ -52,7 +52,7 @@ public void showBalance() { } - public void showHelp() { + public static void showHelp() { System.out.println(" ADD RECORDS:"); System.out.println(" add expense /c /de /da /v "); System.out.println(" add income"); diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/seedu/duke/data/ExpenseList.java index ab665d9132..d911913fdf 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/seedu/duke/data/ExpenseList.java @@ -15,7 +15,21 @@ public static void addExpense(Expense expense) { expenseList.add(expense); expenseCount++; } - + public static void editExpense(int i, String category, String description, String date, float value) { + Expense exp = (Expense) expenseList.get(i - 1); + if(!(category == null)) { + exp.category = category; + } + if(!(description == null)) { + exp.description = description; + } + if(!(date == null)) { + exp.date = date; + } + if(!(value == 0)) { + exp.value = value; + } + } public static void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Record record = expenseList.get(i - 1); diff --git a/src/main/java/seedu/duke/data/IncomeList.java b/src/main/java/seedu/duke/data/IncomeList.java index c653a8b41d..9d4636a6f9 100644 --- a/src/main/java/seedu/duke/data/IncomeList.java +++ b/src/main/java/seedu/duke/data/IncomeList.java @@ -13,6 +13,21 @@ public static void addIncome(Income income) { incomeList.add(income); incomeCount++; } + public static void editIncome(int i, String category, String description, String date, float value) { + Income inc = (Income) incomeList.get(i - 1); + if(!(category == null)) { + inc.category = category; + } + if(!(description == null)) { + inc.description = description; + } + if(!(date == null)) { + inc.date = date; + } + if(!(value == 0)) { + inc.value = value; + } + } public static void printIncomeList() { for (int i = 1; i <= incomeCount; i++) { Record record = incomeList.get(i - 1); From 9fb9d4bd66b655783f7f3e93013ace2849ea4849 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Sun, 12 Mar 2023 23:31:09 +0800 Subject: [PATCH 055/364] Update Parser.java --- src/main/java/seedu/duke/Parser.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/seedu/duke/Parser.java index 1bbd5d618f..2dcb441dcc 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/seedu/duke/Parser.java @@ -1,5 +1,4 @@ package seedu.duke; -import seedu.duke.Ui; import seedu.duke.data.Expense; import seedu.duke.data.ExpenseList; import seedu.duke.data.Income; From 75c659bd4ca05ef8f05175c269f4a08278bc972f Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Mon, 13 Mar 2023 11:34:19 +0800 Subject: [PATCH 056/364] fix Storage bug --- src/main/java/seedu/duke/Storage.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/Storage.java b/src/main/java/seedu/duke/Storage.java index 12ec501909..79f79f6e85 100644 --- a/src/main/java/seedu/duke/Storage.java +++ b/src/main/java/seedu/duke/Storage.java @@ -14,6 +14,7 @@ public class Storage { /** * Build constructor for the Storage class. + * * @param filepath the filepath of the storage. */ Storage(String filepath) { @@ -23,9 +24,10 @@ public class Storage { this.file = new File(filepath); } - public ArrayList load(){ + public ArrayList load() { } public void save(RecordList records) { } +} From 3071aa4a4627e0c07ff31ef80208b1c43898d803 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Mon, 13 Mar 2023 12:10:43 +0800 Subject: [PATCH 057/364] refactor the package names --- .../java/{seedu/duke => chching}/ChChing.java | 20 +++++++++---------- .../java/{seedu/duke => chching}/Parser.java | 12 +++++------ .../java/{seedu/duke => chching}/Storage.java | 6 +++--- src/main/java/{seedu/duke => chching}/Ui.java | 6 +++--- .../duke/data => chching/record}/Expense.java | 2 +- .../data => chching/record}/ExpenseList.java | 2 +- .../duke/data => chching/record}/Income.java | 2 +- .../data => chching/record}/IncomeList.java | 2 +- .../duke/data => chching/record}/Record.java | 2 +- .../data => chching/record}/RecordList.java | 2 +- .../{seedu/duke => chching}/ChChingTest.java | 2 +- .../{seedu/duke => chching}/ExitTest.java | 2 +- .../{seedu/duke => chching}/ExitTest.java.rej | 0 .../{seedu/duke => chching}/ParserTest.java | 2 +- .../record}/ExpenseListTest.java | 2 +- .../data => chching/record}/ExpenseTest.java | 2 +- 16 files changed, 33 insertions(+), 33 deletions(-) rename src/main/java/{seedu/duke => chching}/ChChing.java (92%) rename src/main/java/{seedu/duke => chching}/Parser.java (97%) rename src/main/java/{seedu/duke => chching}/Storage.java (87%) rename src/main/java/{seedu/duke => chching}/Ui.java (96%) rename src/main/java/{seedu/duke/data => chching/record}/Expense.java (91%) rename src/main/java/{seedu/duke/data => chching/record}/ExpenseList.java (97%) rename src/main/java/{seedu/duke/data => chching/record}/Income.java (91%) rename src/main/java/{seedu/duke/data => chching/record}/IncomeList.java (97%) rename src/main/java/{seedu/duke/data => chching/record}/Record.java (97%) rename src/main/java/{seedu/duke/data => chching/record}/RecordList.java (97%) rename src/test/java/{seedu/duke => chching}/ChChingTest.java (90%) rename src/test/java/{seedu/duke => chching}/ExitTest.java (96%) rename src/test/java/{seedu/duke => chching}/ExitTest.java.rej (100%) rename src/test/java/{seedu/duke => chching}/ParserTest.java (99%) rename src/test/java/{seedu/duke/data => chching/record}/ExpenseListTest.java (94%) rename src/test/java/{seedu/duke/data => chching/record}/ExpenseTest.java (97%) diff --git a/src/main/java/seedu/duke/ChChing.java b/src/main/java/chching/ChChing.java similarity index 92% rename from src/main/java/seedu/duke/ChChing.java rename to src/main/java/chching/ChChing.java index cf72be035e..834d3fbd70 100644 --- a/src/main/java/seedu/duke/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -1,14 +1,14 @@ -package seedu.duke; +package chching; -import seedu.duke.data.ExpenseList; -import seedu.duke.data.IncomeList; +import chching.record.ExpenseList; +import chching.record.IncomeList; import java.util.Scanner; public class ChChing { - + public static final String DIVIDER = "____________________________________________________________\n"; - + /** * Main entry-point for the java.duke.Duke application. */ @@ -19,7 +19,7 @@ public static void main(String[] args) { runCommandLoopUntilExitCommand(expenseList); exit(); } - + private static void greet() { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" @@ -30,11 +30,11 @@ private static void greet() { System.out.println("What can I do for you today?"); System.out.println(DIVIDER); } - + private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { Scanner in = new Scanner(System.in); String line = in.nextLine(); - + // continuously reads input from command line until command 'bye' is inputted while (!line.equalsIgnoreCase("bye")) { System.out.println(DIVIDER); @@ -44,7 +44,7 @@ private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { } in.close(); } - + private static void runCommand(String line) { String command = line; try { @@ -53,7 +53,7 @@ private static void runCommand(String line) { System.out.println("Error: Command not recognized"); } } - + private static void exit() { System.out.println("Bye!"); } diff --git a/src/main/java/seedu/duke/Parser.java b/src/main/java/chching/Parser.java similarity index 97% rename from src/main/java/seedu/duke/Parser.java rename to src/main/java/chching/Parser.java index 2dcb441dcc..458518c2ca 100644 --- a/src/main/java/seedu/duke/Parser.java +++ b/src/main/java/chching/Parser.java @@ -1,9 +1,9 @@ -package seedu.duke; -import seedu.duke.data.Expense; -import seedu.duke.data.ExpenseList; -import seedu.duke.data.Income; -import seedu.duke.data.IncomeList; -import seedu.duke.data.RecordList; +package chching; +import chching.record.ExpenseList; +import chching.record.Expense; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.RecordList; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/seedu/duke/Storage.java b/src/main/java/chching/Storage.java similarity index 87% rename from src/main/java/seedu/duke/Storage.java rename to src/main/java/chching/Storage.java index 79f79f6e85..122346f917 100644 --- a/src/main/java/seedu/duke/Storage.java +++ b/src/main/java/chching/Storage.java @@ -1,7 +1,7 @@ -package seedu.duke; +package chching; -import seedu.duke.data.Record; -import seedu.duke.data.RecordList; +import chching.record.Record; +import chching.record.RecordList; import java.io.File; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/Ui.java b/src/main/java/chching/Ui.java similarity index 96% rename from src/main/java/seedu/duke/Ui.java rename to src/main/java/chching/Ui.java index bc69718949..aff3262338 100644 --- a/src/main/java/seedu/duke/Ui.java +++ b/src/main/java/chching/Ui.java @@ -1,7 +1,7 @@ -package seedu.duke; +package chching; -import seedu.duke.data.RecordList; -import seedu.duke.data.Record; +import chching.record.Record; +import chching.record.RecordList; import java.util.Scanner; diff --git a/src/main/java/seedu/duke/data/Expense.java b/src/main/java/chching/record/Expense.java similarity index 91% rename from src/main/java/seedu/duke/data/Expense.java rename to src/main/java/chching/record/Expense.java index b9bcd6c867..2b8f906dbe 100644 --- a/src/main/java/seedu/duke/data/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; public class Expense extends Record { diff --git a/src/main/java/seedu/duke/data/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java similarity index 97% rename from src/main/java/seedu/duke/data/ExpenseList.java rename to src/main/java/chching/record/ExpenseList.java index d911913fdf..d0dc35c582 100644 --- a/src/main/java/seedu/duke/data/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/data/Income.java b/src/main/java/chching/record/Income.java similarity index 91% rename from src/main/java/seedu/duke/data/Income.java rename to src/main/java/chching/record/Income.java index 6564e16611..f20d2bcd3f 100644 --- a/src/main/java/seedu/duke/data/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; public class Income extends Record{ public Income(String category, String description, String date, float value) { diff --git a/src/main/java/seedu/duke/data/IncomeList.java b/src/main/java/chching/record/IncomeList.java similarity index 97% rename from src/main/java/seedu/duke/data/IncomeList.java rename to src/main/java/chching/record/IncomeList.java index 9d4636a6f9..e37a7ae71d 100644 --- a/src/main/java/seedu/duke/data/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; import java.util.ArrayList; diff --git a/src/main/java/seedu/duke/data/Record.java b/src/main/java/chching/record/Record.java similarity index 97% rename from src/main/java/seedu/duke/data/Record.java rename to src/main/java/chching/record/Record.java index c355f846e9..6cfb4349bd 100644 --- a/src/main/java/seedu/duke/data/Record.java +++ b/src/main/java/chching/record/Record.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; public abstract class Record { protected String category; diff --git a/src/main/java/seedu/duke/data/RecordList.java b/src/main/java/chching/record/RecordList.java similarity index 97% rename from src/main/java/seedu/duke/data/RecordList.java rename to src/main/java/chching/record/RecordList.java index afd7061e70..0314a8d7b3 100644 --- a/src/main/java/seedu/duke/data/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; import java.util.ArrayList; diff --git a/src/test/java/seedu/duke/ChChingTest.java b/src/test/java/chching/ChChingTest.java similarity index 90% rename from src/test/java/seedu/duke/ChChingTest.java rename to src/test/java/chching/ChChingTest.java index 65d1b756a2..7301688019 100644 --- a/src/test/java/seedu/duke/ChChingTest.java +++ b/src/test/java/chching/ChChingTest.java @@ -1,4 +1,4 @@ -package seedu.duke; +package chching; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; diff --git a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/chching/ExitTest.java similarity index 96% rename from src/test/java/seedu/duke/ExitTest.java rename to src/test/java/chching/ExitTest.java index cfbb0a7aea..a1dc9b5c59 100644 --- a/src/test/java/seedu/duke/ExitTest.java +++ b/src/test/java/chching/ExitTest.java @@ -1,4 +1,4 @@ -package seedu.duke; +package chching; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/seedu/duke/ExitTest.java.rej b/src/test/java/chching/ExitTest.java.rej similarity index 100% rename from src/test/java/seedu/duke/ExitTest.java.rej rename to src/test/java/chching/ExitTest.java.rej diff --git a/src/test/java/seedu/duke/ParserTest.java b/src/test/java/chching/ParserTest.java similarity index 99% rename from src/test/java/seedu/duke/ParserTest.java rename to src/test/java/chching/ParserTest.java index 553787fc75..81ed9cfce9 100644 --- a/src/test/java/seedu/duke/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,4 +1,4 @@ -package seedu.duke; +package chching; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/seedu/duke/data/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java similarity index 94% rename from src/test/java/seedu/duke/data/ExpenseListTest.java rename to src/test/java/chching/record/ExpenseListTest.java index 07576c1d39..26b727f0ef 100644 --- a/src/test/java/seedu/duke/data/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/seedu/duke/data/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java similarity index 97% rename from src/test/java/seedu/duke/data/ExpenseTest.java rename to src/test/java/chching/record/ExpenseTest.java index b5970dc465..7cdd255fea 100644 --- a/src/test/java/seedu/duke/data/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -1,4 +1,4 @@ -package seedu.duke.data; +package chching.record; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; From f945886e311a26035679cc691facf934acecbc9e Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Mon, 13 Mar 2023 12:22:47 +0800 Subject: [PATCH 058/364] modify main method, create command packages, create exception class to handle error --- src/main/java/chching/ChChing.java | 80 +++++++++------------ src/main/java/chching/ChChingException.java | 8 +++ src/main/java/chching/Storage.java | 15 +++- src/main/java/chching/command/Command.java | 20 ++++++ 4 files changed, 75 insertions(+), 48 deletions(-) create mode 100644 src/main/java/chching/ChChingException.java create mode 100644 src/main/java/chching/command/Command.java diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 834d3fbd70..60aeacefa3 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -1,61 +1,47 @@ package chching; +import chching.command.Command; import chching.record.ExpenseList; import chching.record.IncomeList; -import java.util.Scanner; - public class ChChing { - - public static final String DIVIDER = "____________________________________________________________\n"; - - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) { - ExpenseList expenseList = new ExpenseList(); - IncomeList incomeList = new IncomeList(); - greet(); - runCommandLoopUntilExitCommand(expenseList); - exit(); - } - - private static void greet() { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What can I do for you today?"); - System.out.println(DIVIDER); - } - - private static void runCommandLoopUntilExitCommand(ExpenseList expenseList) { - Scanner in = new Scanner(System.in); - String line = in.nextLine(); - - // continuously reads input from command line until command 'bye' is inputted - while (!line.equalsIgnoreCase("bye")) { - System.out.println(DIVIDER); - runCommand(line); - System.out.println(DIVIDER); - line = in.nextLine(); + private Storage storage; + private IncomeList incomes; + private ExpenseList expenses; + private Ui ui; + + public ChChing(String filePath) { + ui = new Ui(); + storage = new Storage(filePath); + try { + this.incomes = new IncomeList(storage.load()); + this.expenses = new ExpenseList(storage.load()); + } catch (ChChingException e) { + ui.showError(e.getMessage()); + this.incomes = new IncomeList(); + this.expenses = new ExpenseList(); } - in.close(); } - private static void runCommand(String line) { - String command = line; - try { - Parser.parseCommand(command); - } catch (Exception e) { - System.out.println("Error: Command not recognized"); + public void run() { + ui.showWelcome(); + boolean isExit = false; + while (!isExit) { + try { + String fullCommand = ui.readCommand(); + ui.showLine(); // show the divider line ("_______") + Command c = Parser.parse(fullCommand); + c.execute(incomes, expenses, ui, storage); + isExit = c.isExit(); + } catch(ChChingException e) { + ui.showError(e.getMessage()); + } finally { + ui.showLine(); + } } } - private static void exit() { - System.out.println("Bye!"); + public static void main(String[] args) { + new ChChing("data/chching.txt").run(); } - } diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java new file mode 100644 index 0000000000..2c4e42d1f1 --- /dev/null +++ b/src/main/java/chching/ChChingException.java @@ -0,0 +1,8 @@ +package chching; + +public class ChChingException extends Exception { + public ChChingException(String message) { + super(message); + } +} + diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 122346f917..e106fd7afb 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -4,7 +4,9 @@ import chching.record.RecordList; import java.io.File; +import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.Scanner; /** * Model a class to handle storage for the program. @@ -24,7 +26,18 @@ public class Storage { this.file = new File(filepath); } - public ArrayList load() { + public ArrayList load() throws ChChingException { + ArrayList records = new ArrayList<>(); + + try { + Scanner reader = new Scanner(file); + reader.close(); + + } catch (FileNotFoundException e) { + throw new ChChingException("Unfortunately, file can't be found. I'll make a new one!"); + } + + return records; } public void save(RecordList records) { diff --git a/src/main/java/chching/command/Command.java b/src/main/java/chching/command/Command.java new file mode 100644 index 0000000000..78d10958ee --- /dev/null +++ b/src/main/java/chching/command/Command.java @@ -0,0 +1,20 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public abstract class Command { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + } + + /** + * Method to indicate to exit the program after executed + * @return boolean. + */ + public boolean isExit() { + return false; + } +} From 2a6c9747d3a0e13eb9261dabf1fe2102813535c3 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Mon, 13 Mar 2023 12:34:21 +0800 Subject: [PATCH 059/364] create Exit and Help Command class, add get() method in the recordList, modify Storage and Ui class --- src/main/java/chching/Storage.java | 5 ++-- src/main/java/chching/Ui.java | 30 ++++++++++++------- .../java/chching/command/ExitCommand.java | 27 +++++++++++++++++ .../java/chching/command/HelpCommand.java | 13 ++++++++ src/main/java/chching/record/RecordList.java | 4 +++ 5 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 src/main/java/chching/command/ExitCommand.java create mode 100644 src/main/java/chching/command/HelpCommand.java diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index e106fd7afb..4f779cb3e3 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -1,5 +1,7 @@ package chching; +import chching.record.ExpenseList; +import chching.record.IncomeList; import chching.record.Record; import chching.record.RecordList; @@ -16,7 +18,6 @@ public class Storage { /** * Build constructor for the Storage class. - * * @param filepath the filepath of the storage. */ Storage(String filepath) { @@ -40,7 +41,7 @@ public ArrayList load() throws ChChingException { return records; } - public void save(RecordList records) { + public void save(IncomeList incomes, ExpenseList expenses) { } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index aff3262338..2a506347a6 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -1,5 +1,7 @@ package chching; +import chching.record.ExpenseList; +import chching.record.IncomeList; import chching.record.Record; import chching.record.RecordList; @@ -28,27 +30,35 @@ public void showGoodbye() { System.out.println(" Bye. Hope to see you again soon!"); } - public void showAdded(RecordList records, Record record) { + public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); - System.out.println(" Now you have " + records.getRecordCount() + " records in the list."); + System.out.println(" Now you have " + incomes.getRecordCount() + " income records,"); + System.out.println(" and " + expenses.getRecordCount() + " expense records in the list."); } - public void showDelete(RecordList records, Record record) { + public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Noted. I've removed this record:"); System.out.println(" " + record); - System.out.println(" Now you have " + records.getRecordCount() + " records in the list."); + System.out.println(" Now you have " + incomes.getRecordCount() + " income records,"); + System.out.println(" and " + expenses.getRecordCount() + " expense records in the list."); } - public void showAllRecords(RecordList records) { - System.out.println(" Here are the records in your list:"); - - records.printRecordList(); + public void showAllRecords(IncomeList incomes, ExpenseList expenses) { + System.out.println(" Here are the incomes in your list:"); + for (int i = 0; i < incomes.getRecordCount(); i++) { + System.out.println(" " + (i+1) + ". " + incomes.get(i)); + } + System.out.println(); + System.out.println(" Here are the expense in your list:"); + for (int i = 0; i < expenses.getRecordCount(); i++) { + System.out.println(" " + (i+1) + ". " + expenses.get(i)); + } } - public void showBalance() { + public void showBalance(double balance) { System.out.println(" Current balance:"); - System.out.println(" SGD 0.00"); + System.out.println(String.format(" SGD %.2f", balance)); } diff --git a/src/main/java/chching/command/ExitCommand.java b/src/main/java/chching/command/ExitCommand.java new file mode 100644 index 0000000000..8dae0e06cb --- /dev/null +++ b/src/main/java/chching/command/ExitCommand.java @@ -0,0 +1,27 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +/** + * model a class to handle the bye command. inherit from Command class. + */ +public class ExitCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + storage.save(incomes, expenses); + ui.showGoodbye(); + } + + /** + * Method to indicate to exit the program after executed + * @return boolean. + */ + @Override + public boolean isExit() { + return true; + } + +} diff --git a/src/main/java/chching/command/HelpCommand.java b/src/main/java/chching/command/HelpCommand.java new file mode 100644 index 0000000000..1b1e5e6984 --- /dev/null +++ b/src/main/java/chching/command/HelpCommand.java @@ -0,0 +1,13 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class HelpCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + ui.showHelp(); + } +} diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index 0314a8d7b3..6590507401 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -40,4 +40,8 @@ public static void printRecordList() { System.out.println(i + ". " + record.toString()); } } + + public static Record get(int index) { + return recordList.get(index); + } } From ea6a8cfe14f602c11a1f9b04679855d626cc976e Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Mon, 13 Mar 2023 20:53:05 +0800 Subject: [PATCH 060/364] Update ChChing.java --- src/main/java/chching/ChChing.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 60aeacefa3..c7bf9d9dbe 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -14,8 +14,8 @@ public ChChing(String filePath) { ui = new Ui(); storage = new Storage(filePath); try { - this.incomes = new IncomeList(storage.load()); - this.expenses = new ExpenseList(storage.load()); + //this.incomes = new IncomeList(storage.load()); + //this.expenses = new ExpenseList(storage.load()); } catch (ChChingException e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); @@ -30,8 +30,9 @@ public void run() { try { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") - Command c = Parser.parse(fullCommand); - c.execute(incomes, expenses, ui, storage); + Parser.parse(fullCommand); + //Command c = Parser.parse(fullCommand); + //c.execute(incomes, expenses, ui, storage); isExit = c.isExit(); } catch(ChChingException e) { ui.showError(e.getMessage()); From 1d24fba581257d66a2d2284095b8c218481862c4 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Mon, 13 Mar 2023 20:54:29 +0800 Subject: [PATCH 061/364] Update ChChing.java --- src/main/java/chching/ChChing.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index c7bf9d9dbe..f0c30e998d 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -30,7 +30,7 @@ public void run() { try { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") - Parser.parse(fullCommand); + Parser.parseCommand(fullCommand); //Command c = Parser.parse(fullCommand); //c.execute(incomes, expenses, ui, storage); isExit = c.isExit(); From 4a47419e2fbab650b973f4365dc3323c1bef0481 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Mon, 13 Mar 2023 20:56:17 +0800 Subject: [PATCH 062/364] Update ChChing.java --- src/main/java/chching/ChChing.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index f0c30e998d..d30d79f559 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -33,7 +33,7 @@ public void run() { Parser.parseCommand(fullCommand); //Command c = Parser.parse(fullCommand); //c.execute(incomes, expenses, ui, storage); - isExit = c.isExit(); + //isExit = c.isExit(); } catch(ChChingException e) { ui.showError(e.getMessage()); } finally { From b8cd0849605b436c66e1a586ae752f3f43fbfcd4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 13 Mar 2023 22:45:36 +0800 Subject: [PATCH 063/364] refactoring and OOP --- src/main/java/chching/ChChing.java | 24 +-- src/main/java/chching/Parser.java | 163 ------------------ .../chching/command/AddExpenseCommand.java | 21 +++ .../chching/command/AddIncomeCommand.java | 21 +++ .../java/chching/command/BalanceCommand.java | 13 ++ .../java/chching/command/ListCommand.java | 13 ++ .../chching/command/ListExpenseCommand.java | 14 ++ .../chching/command/ListIncomeCommand.java | 14 ++ src/main/java/chching/parser/Expenses.java | 49 ++++++ src/main/java/chching/parser/Incomes.java | 47 +++++ src/main/java/chching/parser/Parser.java | 87 ++++++++++ src/main/java/chching/record/ExpenseList.java | 10 +- src/main/java/chching/record/IncomeList.java | 10 +- src/main/java/chching/record/Record.java | 15 ++ src/test/java/chching/ParserTest.java | 1 + 15 files changed, 317 insertions(+), 185 deletions(-) delete mode 100644 src/main/java/chching/Parser.java create mode 100644 src/main/java/chching/command/AddExpenseCommand.java create mode 100644 src/main/java/chching/command/AddIncomeCommand.java create mode 100644 src/main/java/chching/command/BalanceCommand.java create mode 100644 src/main/java/chching/command/ListCommand.java create mode 100644 src/main/java/chching/command/ListExpenseCommand.java create mode 100644 src/main/java/chching/command/ListIncomeCommand.java create mode 100644 src/main/java/chching/parser/Expenses.java create mode 100644 src/main/java/chching/parser/Incomes.java create mode 100644 src/main/java/chching/parser/Parser.java diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index d30d79f559..98abeb73b9 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -1,5 +1,6 @@ package chching; +import chching.parser.Parser; import chching.command.Command; import chching.record.ExpenseList; import chching.record.IncomeList; @@ -13,14 +14,14 @@ public class ChChing { public ChChing(String filePath) { ui = new Ui(); storage = new Storage(filePath); - try { - //this.incomes = new IncomeList(storage.load()); - //this.expenses = new ExpenseList(storage.load()); - } catch (ChChingException e) { - ui.showError(e.getMessage()); - this.incomes = new IncomeList(); - this.expenses = new ExpenseList(); - } +// try { +// this.incomes = new IncomeList(storage.load()); +// this.expenses = new ExpenseList(storage.load()); +// } catch (ChChingException e) { +// ui.showError(e.getMessage()); + this.incomes = new IncomeList(); + this.expenses = new ExpenseList(); +// } } public void run() { @@ -30,10 +31,9 @@ public void run() { try { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") - Parser.parseCommand(fullCommand); - //Command c = Parser.parse(fullCommand); - //c.execute(incomes, expenses, ui, storage); - //isExit = c.isExit(); + Command c = Parser.parse(fullCommand, incomes, expenses); + c.execute(incomes, expenses, ui, storage); + isExit = c.isExit(); } catch(ChChingException e) { ui.showError(e.getMessage()); } finally { diff --git a/src/main/java/chching/Parser.java b/src/main/java/chching/Parser.java deleted file mode 100644 index 458518c2ca..0000000000 --- a/src/main/java/chching/Parser.java +++ /dev/null @@ -1,163 +0,0 @@ -package chching; -import chching.record.ExpenseList; -import chching.record.Expense; -import chching.record.Income; -import chching.record.IncomeList; -import chching.record.RecordList; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -public class Parser { - - public static final String FIELD_DEMARCATION = " /"; - - public static void parseCommand(String line) { - List lineParts = splitLine(line); - String command = lineParts.get(0); - List arguments = lineParts.subList(1, lineParts.size()); - HashMap argumentsByField = sortArguments(arguments); - switch(command) { - case "add income": - addIncomes(argumentsByField); - break; - case "add expense": - addExpenses(argumentsByField); - break; - case "list income": - IncomeList.printIncomeList(); - break; - case "list expense": - ExpenseList.printExpenseList(); - break; - case "list": - System.out.println("Income:"); - IncomeList.printIncomeList(); - System.out.println("Expenses:"); - ExpenseList.printExpenseList(); - break; - case "edit income": - editIncomes(argumentsByField); - break; - case "edit expense": - editExpenses(argumentsByField); - break; - case "help": - Ui.showHelp(); - break; - default: - System.out.println("Command not recognized, please enter a valid command!"); - } - } - - public static ArrayList splitLine(String line) { - ArrayList lineParts = new ArrayList(); - lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); - return lineParts; - } - - public static HashMap sortArguments(List arguments) { - HashMap argumentsByField = new HashMap(); - int argumentsCount = arguments.size(); - - // split each argument according to their field and their value, and add into hashmap accordingly - // Hashmap's key is its field, value is the value of the field - for (int i = 0; i < argumentsCount; i++) { - String argument = arguments.get(i); - String[] fieldAndValue = argument.split(" ", 2); - try { - String field = fieldAndValue[0].trim(); - String value = fieldAndValue[1].trim(); - argumentsByField.put(field, value); - } catch (NullPointerException e) { - System.out.println("Error: arguments not inputted correctly/missing a value"); - } - } - return argumentsByField; - } - - public static void addExpenses(HashMap argumentsByField) { - try { - String expenseCategory = argumentsByField.get("c"); - String expenseDescription = argumentsByField.get("de"); - String expenseDate = argumentsByField.get("da"); - float expenseValue = Float.parseFloat(argumentsByField.get("v")); - - Expense exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); - ExpenseList.addExpense(exp); - RecordList.addRecord(exp); - System.out.println("Expense added"); - } catch (Exception e) { - System.out.println("Trouble adding expenses"); - } - } - - public static void addIncomes(HashMap argumentsByField) { - try { - String incomeCategory = argumentsByField.get("c"); - String incomeDescription = argumentsByField.get("de"); - String incomeDate = argumentsByField.get("da"); - float incomeValue = Float.parseFloat(argumentsByField.get("v")); - - Income inc = new Income(incomeCategory, incomeDescription, incomeDate, incomeValue); - IncomeList.addIncome(inc); - RecordList.addRecord(inc); - System.out.println("Income added"); - } catch (Exception e) { - System.out.println("Trouble adding income"); - } - } - - public static void editExpenses(HashMap argumentsByField) { - try { - int index = Integer.parseInt(argumentsByField.get("i")); - String updateCategory = null; - String updateDescription = null; - String updateDate = null; - float updateValue = 0; - if(argumentsByField.containsKey("c")) { - updateCategory = argumentsByField.get("c"); - } - if(argumentsByField.containsKey("de")) { - updateDescription = argumentsByField.get("de"); - } - if(argumentsByField.containsKey("da")) { - updateDate = argumentsByField.get("da"); - } - if(argumentsByField.containsKey("v")) { - updateValue = Float.parseFloat(argumentsByField.get("v")); - } - ExpenseList.editExpense(index, updateCategory, updateDescription, updateDate, updateValue); - System.out.println("Expense modified"); - } catch (Exception e) { - System.out.println("Trouble editing expense"); - } - } - public static void editIncomes(HashMap argumentsByField) { - try { - int index = Integer.parseInt(argumentsByField.get("i")); - String updateCategory = null; - String updateDescription = null; - String updateDate = null; - float updateValue = 0; - if(argumentsByField.containsKey("c")) { - updateCategory = argumentsByField.get("c"); - } - if(argumentsByField.containsKey("de")) { - updateDescription = argumentsByField.get("de"); - } - if(argumentsByField.containsKey("da")) { - updateDate = argumentsByField.get("da"); - } - if(argumentsByField.containsKey("v")) { - updateValue = Float.parseFloat(argumentsByField.get("v")); - } - IncomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); - System.out.println("Income modified"); - } catch (Exception e) { - System.out.println("Trouble editing income"); - } - } -} diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java new file mode 100644 index 0000000000..e4f2bc36f7 --- /dev/null +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -0,0 +1,21 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.Expense; + +public class AddExpenseCommand extends Command { + private final Expense expense; + + public AddExpenseCommand(Expense expense) { + this.expense = expense; + } + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + expenses.addExpense(expense); + System.out.println("Expense added:"); + System.out.println(expense.toString()); + } +} \ No newline at end of file diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java new file mode 100644 index 0000000000..c1b2591e90 --- /dev/null +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -0,0 +1,21 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.Income; + +public class AddIncomeCommand extends Command { + private final Income income; + + public AddIncomeCommand(Income income) { + this.income = income; + } + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + incomes.addIncome(income); + System.out.println("Income added"); + System.out.println(income.toString()); + } +} diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java new file mode 100644 index 0000000000..22be3f5cc8 --- /dev/null +++ b/src/main/java/chching/command/BalanceCommand.java @@ -0,0 +1,13 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class BalanceCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + + } +} diff --git a/src/main/java/chching/command/ListCommand.java b/src/main/java/chching/command/ListCommand.java new file mode 100644 index 0000000000..bd07bd4773 --- /dev/null +++ b/src/main/java/chching/command/ListCommand.java @@ -0,0 +1,13 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class ListCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + ui.showAllRecords(incomes, expenses); + } +} diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java new file mode 100644 index 0000000000..16a8518f89 --- /dev/null +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -0,0 +1,14 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class ListExpenseCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + System.out.println("Expenses:"); + expenses.printExpenseList(); + } +} diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java new file mode 100644 index 0000000000..564cde7517 --- /dev/null +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -0,0 +1,14 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class ListIncomeCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + System.out.println("Income:"); + incomes.printIncomeList(); + } +} diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java new file mode 100644 index 0000000000..88d5d0d8ae --- /dev/null +++ b/src/main/java/chching/parser/Expenses.java @@ -0,0 +1,49 @@ +package chching.parser; + +import chching.record.Expense; +import chching.record.ExpenseList; + +import java.util.HashMap; + +public class Expenses { + public static Expense parseExpense(HashMap argumentsByField) { + Expense exp = null; + try { + String expenseCategory = argumentsByField.get("c"); + String expenseDescription = argumentsByField.get("de"); + String expenseDate = argumentsByField.get("da"); + float expenseValue = Float.parseFloat(argumentsByField.get("v")); + exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); + } catch (Exception e) { + System.out.println("Trouble adding expenses"); + } + return exp; + } + + public static Expense parseUpdateExpense(HashMap argumentsByField, ExpenseList expenseList) { + Expense exp = null; + try { + int index = Integer.parseInt(argumentsByField.get("i")); + exp = (Expense) expenseList.get(index - 1); + if (argumentsByField.containsKey("c")) { + String updateCategory = argumentsByField.get("c"); + exp.setCategory(updateCategory); + } + if (argumentsByField.containsKey("de")) { + String updateDescription = argumentsByField.get("de"); + exp.setDescription(updateDescription); + } + if (argumentsByField.containsKey("da")) { + String updateDate = argumentsByField.get("da"); + exp.setDate(updateDate); + } + if (argumentsByField.containsKey("v")) { + float updateValue = Float.parseFloat(argumentsByField.get("v")); + exp.setValue(updateValue); + } + } catch (Exception e) { + System.out.println("Trouble editing expense"); + } + return exp; + } +} diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java new file mode 100644 index 0000000000..045013248d --- /dev/null +++ b/src/main/java/chching/parser/Incomes.java @@ -0,0 +1,47 @@ +package chching.parser; + +import chching.record.IncomeList; + +import java.util.HashMap; + +public class Incomes { + public static chching.record.Income parseIncome(HashMap argumentsByField) { + chching.record.Income inc = null; + try { + String incomeCategory = argumentsByField.get("c"); + String incomeDescription = argumentsByField.get("de"); + String incomeDate = argumentsByField.get("da"); + float incomeValue = Float.parseFloat(argumentsByField.get("v")); + inc = new chching.record.Income(incomeCategory, incomeDescription, incomeDate, incomeValue); + } catch (Exception e) { + System.out.println("Trouble adding income"); + } + return inc; + } + + public static void editIncome(HashMap argumentsByField, IncomeList incomeList) { + try { + int index = Integer.parseInt(argumentsByField.get("i")); + String updateCategory = null; + String updateDescription = null; + String updateDate = null; + float updateValue = 0; + if (argumentsByField.containsKey("c")) { + updateCategory = argumentsByField.get("c"); + } + if (argumentsByField.containsKey("de")) { + updateDescription = argumentsByField.get("de"); + } + if (argumentsByField.containsKey("da")) { + updateDate = argumentsByField.get("da"); + } + if (argumentsByField.containsKey("v")) { + updateValue = Float.parseFloat(argumentsByField.get("v")); + } + incomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); + System.out.println("Income modified"); + } catch (Exception e) { + System.out.println("Trouble editing income"); + } + } +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java new file mode 100644 index 0000000000..b20abf44de --- /dev/null +++ b/src/main/java/chching/parser/Parser.java @@ -0,0 +1,87 @@ +package chching.parser; +import chching.record.ExpenseList; +import chching.record.Expense; +import chching.record.Income; +import chching.record.IncomeList; +import chching.command.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class Parser { + + public static final String FIELD_DEMARCATION = " /"; + + public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList) { + List lineParts = splitLine(line); + String instruction = lineParts.get(0); + List arguments = lineParts.subList(1, lineParts.size()); + HashMap argumentsByField = sortArguments(arguments); + Command command = new ExitCommand(); + switch(instruction) { + case "add income": + Income income = Incomes.parseIncome(argumentsByField); + command = new AddIncomeCommand(income); + break; + case "add expense": + Expense expense = Expenses.parseExpense(argumentsByField); + command = new AddExpenseCommand(expense); + break; + case "list income": + command = new ListIncomeCommand(); + break; + case "list expense": + command = new ListExpenseCommand(); + break; + case "list": + command = new ListCommand(); + break; + case "edit income": + Incomes.editIncome(argumentsByField, incomeList); + break; + case "edit expense": + Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); + command = new EditExpenseCommand(updatedExpense); + + break; + case "exit": + command = new ExitCommand(); + break; + case "help": + command = new HelpCommand(); + break; + default: + System.out.println("Command not recognized, please enter a valid command!"); + } + return command; + } + + public static ArrayList splitLine(String line) { + ArrayList lineParts = new ArrayList(); + lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); + return lineParts; + } + + public static HashMap sortArguments(List arguments) { + HashMap argumentsByField = new HashMap(); + int argumentsCount = arguments.size(); + + // split each argument according to their field and their value, and add into hashmap accordingly + // Hashmap's key is its field, value is the value of the field + for (int i = 0; i < argumentsCount; i++) { + String argument = arguments.get(i); + String[] fieldAndValue = argument.split(" ", 2); + try { + String field = fieldAndValue[0].trim(); + String value = fieldAndValue[1].trim(); + argumentsByField.put(field, value); + } catch (NullPointerException e) { + System.out.println("Error: arguments not inputted correctly/missing a value"); + } + } + return argumentsByField; + } + +} diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index d0dc35c582..1f3be43902 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -4,18 +4,18 @@ public class ExpenseList extends RecordList{ - protected static ArrayList expenseList; - protected static int expenseCount; + protected ArrayList expenseList; + protected int expenseCount; public ExpenseList() { expenseList = new ArrayList<>(); expenseCount = 0; } - public static void addExpense(Expense expense) { + public void addExpense(Expense expense) { expenseList.add(expense); expenseCount++; } - public static void editExpense(int i, String category, String description, String date, float value) { + public void editExpense(int i, String category, String description, String date, float value) { Expense exp = (Expense) expenseList.get(i - 1); if(!(category == null)) { exp.category = category; @@ -30,7 +30,7 @@ public static void editExpense(int i, String category, String description, Strin exp.value = value; } } - public static void printExpenseList() { + public void printExpenseList() { for (int i = 1; i <= expenseCount; i++) { Record record = expenseList.get(i - 1); System.out.println(i + ". " + record.toString()); diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index e37a7ae71d..e4b893876c 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -3,17 +3,17 @@ import java.util.ArrayList; public class IncomeList extends RecordList{ - protected static ArrayList incomeList; - protected static int incomeCount; + protected ArrayList incomeList; + protected int incomeCount; public IncomeList(){ incomeList = new ArrayList<>(); incomeCount = 0; } - public static void addIncome(Income income) { + public void addIncome(Income income) { incomeList.add(income); incomeCount++; } - public static void editIncome(int i, String category, String description, String date, float value) { + public void editIncome(int i, String category, String description, String date, float value) { Income inc = (Income) incomeList.get(i - 1); if(!(category == null)) { inc.category = category; @@ -28,7 +28,7 @@ public static void editIncome(int i, String category, String description, String inc.value = value; } } - public static void printIncomeList() { + public void printIncomeList() { for (int i = 1; i <= incomeCount; i++) { Record record = incomeList.get(i - 1); System.out.println(i + ". " + record.toString()); diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 6cfb4349bd..e91339173f 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -40,6 +40,21 @@ public float getValue() { return value; } + public void setCategory(String category) { + this.category = category; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setDate(String date) { + this.date = date; + } + + public void setValue(float value) { + this.value = value; + } public String toString() { return "Category - " + getCategory() + " | Description - " + getDescription() + diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 81ed9cfce9..ea9c346fa2 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,5 +1,6 @@ package chching; +import chching.parser.Parser; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 32e3ca24ff85ff6f251242776d8487b44b6d51ab Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 13 Mar 2023 23:32:10 +0800 Subject: [PATCH 064/364] code refactoring --- src/main/java/chching/ChChing.java | 18 +++++++++--------- src/main/java/chching/Storage.java | 1 - src/main/java/chching/Ui.java | 1 - .../chching/command/AddExpenseCommand.java | 2 +- .../java/chching/command/BalanceCommand.java | 13 ++++++++++++- src/main/java/chching/parser/Parser.java | 16 +++++++++++++--- src/main/java/chching/record/ExpenseList.java | 15 +++++++++------ src/main/java/chching/record/Income.java | 2 -- src/main/java/chching/record/IncomeList.java | 13 +++++++++---- src/test/java/chching/ParserTest.java | 7 ------- 10 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 98abeb73b9..327d14b64e 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -14,14 +14,14 @@ public class ChChing { public ChChing(String filePath) { ui = new Ui(); storage = new Storage(filePath); -// try { -// this.incomes = new IncomeList(storage.load()); -// this.expenses = new ExpenseList(storage.load()); -// } catch (ChChingException e) { -// ui.showError(e.getMessage()); - this.incomes = new IncomeList(); - this.expenses = new ExpenseList(); -// } + try { + this.incomes = new IncomeList(storage.load()); + this.expenses = new ExpenseList(storage.load()); + } catch (ChChingException e) { + ui.showError(e.getMessage()); + this.incomes = new IncomeList(); + this.expenses = new ExpenseList(); + } } public void run() { @@ -34,7 +34,7 @@ public void run() { Command c = Parser.parse(fullCommand, incomes, expenses); c.execute(incomes, expenses, ui, storage); isExit = c.isExit(); - } catch(ChChingException e) { + } catch (ChChingException e) { ui.showError(e.getMessage()); } finally { ui.showLine(); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 4f779cb3e3..8ab1bb88a6 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -3,7 +3,6 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Record; -import chching.record.RecordList; import java.io.File; import java.io.FileNotFoundException; diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 2a506347a6..bbbdd3172b 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -3,7 +3,6 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Record; -import chching.record.RecordList; import java.util.Scanner; diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index e4f2bc36f7..92270e0e29 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -18,4 +18,4 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto System.out.println("Expense added:"); System.out.println(expense.toString()); } -} \ No newline at end of file +} diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index 22be3f5cc8..eff31d83d8 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -8,6 +8,17 @@ public class BalanceCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { - + double totalIncome = 0; + double totalExpense = 0; + for(int i = 0; i < incomes.size(); i++) { + totalIncome += incomes.get(i).getValue(); + System.out.println(totalIncome); + } + for(int i = 0; i < expenses.size(); i++) { + totalExpense += expenses.get(i).getValue(); + } + double balance = totalIncome - totalExpense; + System.out.println(balance); + ui.showBalance(balance); } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index b20abf44de..0a3acc40d7 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,9 +1,18 @@ package chching.parser; +import chching.command.Command; +import chching.command.AddExpenseCommand; +import chching.command.AddIncomeCommand; +import chching.command.BalanceCommand; +import chching.command.ExitCommand; +import chching.command.HelpCommand; +import chching.command.ListCommand; +import chching.command.ListExpenseCommand; +import chching.command.ListIncomeCommand; import chching.record.ExpenseList; import chching.record.Expense; import chching.record.Income; import chching.record.IncomeList; -import chching.command.*; + import java.util.ArrayList; import java.util.Arrays; @@ -43,8 +52,9 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe break; case "edit expense": Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); - command = new EditExpenseCommand(updatedExpense); - + break; + case "balance": + command = new BalanceCommand(); break; case "exit": command = new ExitCommand(); diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 1f3be43902..ed8cc56169 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -5,15 +5,18 @@ public class ExpenseList extends RecordList{ protected ArrayList expenseList; - protected int expenseCount; - - public ExpenseList() { + public ExpenseList(ArrayList expenseList){ + this.expenseList = expenseList; + } + public ExpenseList(){ expenseList = new ArrayList<>(); - expenseCount = 0; + + } + public int size() { + return expenseList.size(); } public void addExpense(Expense expense) { expenseList.add(expense); - expenseCount++; } public void editExpense(int i, String category, String description, String date, float value) { Expense exp = (Expense) expenseList.get(i - 1); @@ -31,7 +34,7 @@ public void editExpense(int i, String category, String description, String date, } } public void printExpenseList() { - for (int i = 1; i <= expenseCount; i++) { + for (int i = 1; i <= expenseList.size(); i++) { Record record = expenseList.get(i - 1); System.out.println(i + ". " + record.toString()); } diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index f20d2bcd3f..4dac73de38 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -7,6 +7,4 @@ public Income(String category, String description, String date, float value) { this.date = date; this.value = value; } - - } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index e4b893876c..8a35299b62 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -4,14 +4,19 @@ public class IncomeList extends RecordList{ protected ArrayList incomeList; - protected int incomeCount; + public IncomeList(ArrayList incomeList){ + this.incomeList = incomeList; + } public IncomeList(){ incomeList = new ArrayList<>(); - incomeCount = 0; + + } + public int size() { + return incomeList.size(); } public void addIncome(Income income) { incomeList.add(income); - incomeCount++; + } public void editIncome(int i, String category, String description, String date, float value) { Income inc = (Income) incomeList.get(i - 1); @@ -29,7 +34,7 @@ public void editIncome(int i, String category, String description, String date, } } public void printIncomeList() { - for (int i = 1; i <= incomeCount; i++) { + for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); System.out.println(i + ". " + record.toString()); } diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index ea9c346fa2..c449d2dc81 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -58,13 +58,6 @@ public void sortArguments_emptyInput_returnsEmptyHashMap() { assertEquals(expectedOutput, new Parser().sortArguments(input)); } - @Test - public void parseCommand_badInput_exceptionThrown(){ - String badInput = "add expenses /de breakfast /da 01/02/23 /v 3.50"; - new Parser().parseCommand(badInput); - assertEquals("Command not recognized, please enter a valid command!", outputStreamCaptor.toString().trim()); - - } @AfterEach public void tearDown() { From 1f6e9d57d04b8507dde0355aafba1a96fbdcade5 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 13 Mar 2023 23:40:09 +0800 Subject: [PATCH 065/364] refactor code --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index afd2e0db83..d3bda2f79e 100644 --- a/build.gradle +++ b/build.gradle @@ -30,11 +30,11 @@ test { } application { - mainClass = "seedu.duke.ChChing" + mainClass = "java.chching.ChChing" } shadowJar { - archiveBaseName = "duke" + archiveBaseName = "chching" archiveClassifier = null } From 001b225650e07be430b7878b6795a2ac84bf5ee7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 13 Mar 2023 23:48:19 +0800 Subject: [PATCH 066/364] refactoring code --- build.gradle | 2 +- text-ui-test/EXPECTED.TXT | 19 ++++++++----------- text-ui-test/input.txt | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index d3bda2f79e..c829005061 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ test { } application { - mainClass = "java.chching.ChChing" + mainClass = "chching.ChChing" } shadowJar { diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 75ab6aba56..892ed732d1 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,11 +1,8 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - -What can I do for you today? -____________________________________________________________ - -Bye! + Unfortunately, file can't be found. I'll make a new one! + ____________________________________________________________ + Hello! I'm ChChing. + What can I do for you? + ____________________________________________________________ + ____________________________________________________________ + Bye. Hope to see you again soon! + ____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 0abaeaa993..ae3bc0a936 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -bye \ No newline at end of file +exit \ No newline at end of file From b0b98d26759884dccd653ac1cc55a8d19efb79b4 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Tue, 14 Mar 2023 00:37:36 +0800 Subject: [PATCH 067/364] delete unused import --- src/main/java/chching/Ui.java | 1 - src/main/java/chching/record/IncomeList.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 2a506347a6..bbbdd3172b 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -3,7 +3,6 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Record; -import chching.record.RecordList; import java.util.Scanner; diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index e37a7ae71d..a3d1fc1394 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -34,4 +34,4 @@ public static void printIncomeList() { System.out.println(i + ". " + record.toString()); } } -} +} \ No newline at end of file From 79ad95c5d27553ccf9243a6d572b0a8bb1d67f4e Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:25:43 +0800 Subject: [PATCH 068/364] Add load method to the storage, refactor some types from float to double --- data/chching.txt | 0 src/main/java/chching/ChChing.java | 10 ++- src/main/java/chching/Storage.java | 83 +++++++++++++++++-- src/main/java/chching/Ui.java | 5 +- src/main/java/chching/record/Expense.java | 7 +- src/main/java/chching/record/ExpenseList.java | 7 +- src/main/java/chching/record/Income.java | 7 +- src/main/java/chching/record/IncomeList.java | 10 ++- src/main/java/chching/record/Record.java | 13 +-- src/main/java/chching/record/RecordList.java | 12 +-- 10 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 data/chching.txt diff --git a/data/chching.txt b/data/chching.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 327d14b64e..3f95e38bbf 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -12,11 +12,12 @@ public class ChChing { private Ui ui; public ChChing(String filePath) { - ui = new Ui(); - storage = new Storage(filePath); + this.ui = new Ui(); + this.storage = new Storage(filePath); + try { - this.incomes = new IncomeList(storage.load()); - this.expenses = new ExpenseList(storage.load()); + this.incomes = new IncomeList(storage.loadIncomes()); + this.expenses = new ExpenseList(storage.loadExpenses()); } catch (ChChingException e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); @@ -30,6 +31,7 @@ public void run() { while (!isExit) { try { String fullCommand = ui.readCommand(); + System.out.println("nyampe sini cu"); ui.showLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand, incomes, expenses); c.execute(incomes, expenses, ui, storage); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 8ab1bb88a6..d3179c81d6 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -1,11 +1,14 @@ package chching; -import chching.record.ExpenseList; -import chching.record.IncomeList; import chching.record.Record; - +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.Expense; +import chching.record.ExpenseList; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; @@ -26,21 +29,89 @@ public class Storage { this.file = new File(filepath); } - public ArrayList load() throws ChChingException { - ArrayList records = new ArrayList<>(); + public ArrayList loadIncomes() throws ChChingException { + ArrayList incomes = new ArrayList<>(); try { Scanner reader = new Scanner(file); + while (reader.hasNextLine()) { + String line = reader.nextLine(); + String[] extract = line.split("\\|"); + String symbol = extract[0].trim(); + String category = extract[1].trim(); + String description = extract[2].trim(); + String date = extract[3].trim(); + String value = extract[4].trim(); + + if (symbol.equals("I")) { + Income income = new Income(category, description, date, Double.parseDouble(value)); + incomes.add(income); + } + } reader.close(); } catch (FileNotFoundException e) { throw new ChChingException("Unfortunately, file can't be found. I'll make a new one!"); } - return records; + return incomes; + } + + public ArrayList loadExpenses() throws ChChingException { + ArrayList expenses = new ArrayList<>(); + + try { + Scanner reader = new Scanner(file); + while (reader.hasNextLine()) { + String line = reader.nextLine(); + String[] extract = line.split("\\|"); + String symbol = extract[0].trim(); + String category = extract[1].trim(); + String description = extract[2].trim(); + String date = extract[3].trim(); + String value = extract[4].trim(); + + if (symbol.equals("E")) { + Expense expense = new Expense(category, description, date, Double.parseDouble(value)); + expenses.add(expense); + } + } + reader.close(); + + } catch (FileNotFoundException e) { + throw new ChChingException("Unfortunately, file can't be found. I'll make a new one!"); + } + + return expenses; } public void save(IncomeList incomes, ExpenseList expenses) { + try { + file.createNewFile(); + + FileWriter fileWriter = new FileWriter(file); + + for (int i = 0; i < incomes.size(); i++) { + Record income = incomes.get(i); + String line = String.format("I | %s | %s | %s | %.2f", income.getCategory(), + income.getDescription(), income.getDate(), income.getValue()); + fileWriter.write(line); + } + + for (int i = 0; i < expenses.size(); i++) { + Record expense = expenses.get(i); + String line = String.format("E | %s | %s | %s | %.2f", expense.getCategory(), + expense.getDescription(), expense.getDate(), expense.getValue()); + fileWriter.write(line); + } + + fileWriter.flush(); + fileWriter.close(); + + } catch (IOException e) { + System.out.println("An error occurred."); + e.printStackTrace(); + } } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index bbbdd3172b..58bd2f5980 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -10,8 +10,7 @@ public class Ui { public String readCommand() { Scanner input = new Scanner((System.in)); - String fullCommand = input.nextLine(); - return fullCommand; + return input.nextLine(); } public void showLine() { @@ -57,7 +56,7 @@ public void showAllRecords(IncomeList incomes, ExpenseList expenses) { public void showBalance(double balance) { System.out.println(" Current balance:"); - System.out.println(String.format(" SGD %.2f", balance)); + System.out.printf(" SGD %.2f%n", balance); } diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 2b8f906dbe..41806e5d96 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -2,11 +2,8 @@ public class Expense extends Record { - public Expense(String category, String description, String date, float value) { - this.category = category; - this.description = description; - this.date = date; - this.value = value; + public Expense(String category, String description, String date, double value) { + super(category, description, date, value); } } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index ed8cc56169..2caaab2628 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -4,14 +4,17 @@ public class ExpenseList extends RecordList{ - protected ArrayList expenseList; - public ExpenseList(ArrayList expenseList){ + protected ArrayList expenseList; + + public ExpenseList(ArrayList expenseList){ this.expenseList = expenseList; } + public ExpenseList(){ expenseList = new ArrayList<>(); } + public int size() { return expenseList.size(); } diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 4dac73de38..ef30ef4752 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,10 +1,7 @@ package chching.record; public class Income extends Record{ - public Income(String category, String description, String date, float value) { - this.category = category; - this.description = description; - this.date = date; - this.value = value; + public Income(String category, String description, String date, double value) { + super(category, description, date, value); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 51c183015f..6037dc15e7 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -3,21 +3,26 @@ import java.util.ArrayList; public class IncomeList extends RecordList{ - protected ArrayList incomeList; - public IncomeList(ArrayList incomeList){ + protected ArrayList incomeList; + + public IncomeList(ArrayList incomeList){ this.incomeList = incomeList; } + public IncomeList(){ incomeList = new ArrayList<>(); } + public int size() { return incomeList.size(); } + public void addIncome(Income income) { incomeList.add(income); } + public void editIncome(int i, String category, String description, String date, float value) { Income inc = (Income) incomeList.get(i - 1); if(!(category == null)) { @@ -33,6 +38,7 @@ public void editIncome(int i, String category, String description, String date, inc.value = value; } } + public void printIncomeList() { for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index e91339173f..4950d479d5 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -4,19 +4,12 @@ public abstract class Record { protected String category; protected String description; protected String date; - protected float value; + protected double value; - /** - * Generic constructor for Record class. - * @param category string of record category, accepts "income" or "expense" - * @param description string of record description - * @param date string of record date - * @param value float of record amount - */ public Record(){ } - public Record(String category, String description, String date, float value) { + public Record(String category, String description, String date, double value) { this.category = category; this.description = description; this.date = date; @@ -36,7 +29,7 @@ public String getDate() { return date; } - public float getValue() { + public double getValue() { return value; } diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index 6590507401..42e61ea899 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -4,8 +4,8 @@ public abstract class RecordList { - protected static ArrayList recordList = new ArrayList<>(); - protected static int recordCount = 0; + protected ArrayList recordList = new ArrayList<>(); + protected int recordCount = 0; private int balance; @@ -14,7 +14,7 @@ public RecordList() { recordCount = 0; } - public static ArrayList getRecordList() { + public ArrayList getRecordList() { return recordList; } @@ -29,19 +29,19 @@ public int getBalance(){ return balance; } - public static void addRecord(Record record) { + public void addRecord(Record record) { recordList.add(record); recordCount++; } - public static void printRecordList() { + public void printRecordList() { for (int i = 1; i <= recordCount; i++) { Record record = recordList.get(i - 1); System.out.println(i + ". " + record.toString()); } } - public static Record get(int index) { + public Record get(int index) { return recordList.get(index); } } From 8d0023620a909001faf7229a03c7022c4d815b1c Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:29:45 +0800 Subject: [PATCH 069/364] add new line --- src/main/java/chching/record/IncomeList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 6037dc15e7..09a836ad19 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -45,4 +45,4 @@ public void printIncomeList() { System.out.println(i + ". " + record.toString()); } } -} \ No newline at end of file +} From a766bc6f1ab8976497ce674fa10310b89345c151 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:38:22 +0800 Subject: [PATCH 070/364] delete debug curse word :D --- src/main/java/chching/ChChing.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 3f95e38bbf..0dd50cd2ae 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -31,7 +31,6 @@ public void run() { while (!isExit) { try { String fullCommand = ui.readCommand(); - System.out.println("nyampe sini cu"); ui.showLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand, incomes, expenses); c.execute(incomes, expenses, ui, storage); From fd7ae57e7a4180d8879fd45b7868f2d461042e7c Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 14 Mar 2023 10:36:49 +0800 Subject: [PATCH 071/364] Add comment --- src/main/java/chching/record/Record.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 4950d479d5..12a43650b9 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -1,5 +1,6 @@ package chching.record; +// Abstract class that will not be initialized as an object public abstract class Record { protected String category; protected String description; From ab5ba25787c3a7534a54684a8221eeedc7e1cec3 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 14 Mar 2023 20:45:46 +0800 Subject: [PATCH 072/364] Fixed bug where list did not print the list of expenses and income Removed the recordCount in RecordList class --- src/main/java/chching/Ui.java | 10 ++++------ src/main/java/chching/record/RecordList.java | 11 ++++------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 58bd2f5980..ab303fd555 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -44,14 +44,12 @@ public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) public void showAllRecords(IncomeList incomes, ExpenseList expenses) { System.out.println(" Here are the incomes in your list:"); - for (int i = 0; i < incomes.getRecordCount(); i++) { - System.out.println(" " + (i+1) + ". " + incomes.get(i)); - } + incomes.printIncomeList(); + System.out.println(); + System.out.println(" Here are the expense in your list:"); - for (int i = 0; i < expenses.getRecordCount(); i++) { - System.out.println(" " + (i+1) + ". " + expenses.get(i)); - } + expenses.printExpenseList(); } public void showBalance(double balance) { diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index 42e61ea899..d44c2e5f77 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -5,13 +5,11 @@ public abstract class RecordList { protected ArrayList recordList = new ArrayList<>(); - protected int recordCount = 0; private int balance; public RecordList() { recordList = new ArrayList<>(); - recordCount = 0; } public ArrayList getRecordList() { @@ -19,23 +17,22 @@ public ArrayList getRecordList() { } public int getRecordCount() { - return recordCount; + return recordList.size(); } public int getBalance(){ - for(int i = 0; i Date: Tue, 14 Mar 2023 20:49:02 +0800 Subject: [PATCH 073/364] balance and delete --- .../java/chching/command/BalanceCommand.java | 4 +- .../chching/command/DeleteExpenseCommand.java | 20 ++++++++++ .../chching/command/DeleteIncomeCommand.java | 23 +++++++++++ src/main/java/chching/parser/Parser.java | 9 +++++ src/main/java/chching/record/ExpenseList.java | 14 +++++++ src/main/java/chching/record/IncomeList.java | 12 ++++++ src/main/java/chching/record/RecordList.java | 9 +++-- src/test/java/chching/CommandTest.java | 39 +++++++++++++++++++ 8 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 src/main/java/chching/command/DeleteExpenseCommand.java create mode 100644 src/main/java/chching/command/DeleteIncomeCommand.java create mode 100644 src/test/java/chching/CommandTest.java diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index eff31d83d8..b25080af6f 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -12,13 +12,13 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto double totalExpense = 0; for(int i = 0; i < incomes.size(); i++) { totalIncome += incomes.get(i).getValue(); - System.out.println(totalIncome); } for(int i = 0; i < expenses.size(); i++) { totalExpense += expenses.get(i).getValue(); } + System.out.println("totalExpense: " + totalExpense); + System.out.println("totalIncome: " + totalIncome); double balance = totalIncome - totalExpense; - System.out.println(balance); ui.showBalance(balance); } } diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java new file mode 100644 index 0000000000..3650b34d27 --- /dev/null +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -0,0 +1,20 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class DeleteExpenseCommand extends Command { + private final int index; + public DeleteExpenseCommand(int index) { + this.index = index; + } + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + expenses.deleteExpense(index); + System.out.println("Expense deleted, here is the updated list:"); + expenses.printExpenseList(); + } + +} diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java new file mode 100644 index 0000000000..cc37634de1 --- /dev/null +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -0,0 +1,23 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class DeleteIncomeCommand extends Command { + + private final int index; + public DeleteIncomeCommand(int index) { + this.index = index; + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + incomes.deleteIncome(index); + System.out.println("Income deleted, here is the updated list:"); + incomes.printIncomeList(); + } + +} + diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 0a3acc40d7..19c856070a 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,5 +1,7 @@ package chching.parser; import chching.command.Command; +import chching.command.DeleteExpenseCommand; +import chching.command.DeleteIncomeCommand; import chching.command.AddExpenseCommand; import chching.command.AddIncomeCommand; import chching.command.BalanceCommand; @@ -53,6 +55,13 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe case "edit expense": Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); break; + case "delete income": + command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); + break; + case "delete expense": + command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); + break; + case "balance": command = new BalanceCommand(); break; diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 2caaab2628..4d73df12a1 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -18,9 +18,18 @@ public ExpenseList(){ public int size() { return expenseList.size(); } + public void addExpense(Expense expense) { expenseList.add(expense); } + + public void deleteExpense(int i) throws IndexOutOfBoundsException{ + try { + expenseList.remove(i - 1); + } catch (IndexOutOfBoundsException e) { + throw new IndexOutOfBoundsException("There is no expense with this index"); + } + } public void editExpense(int i, String category, String description, String date, float value) { Expense exp = (Expense) expenseList.get(i - 1); if(!(category == null)) { @@ -42,4 +51,9 @@ public void printExpenseList() { System.out.println(i + ". " + record.toString()); } } + + @Override + public Expense get(int i) { + return expenseList.get(i); + } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 09a836ad19..571cd8295c 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -22,6 +22,13 @@ public void addIncome(Income income) { incomeList.add(income); } + public void deleteIncome(int i) throws IndexOutOfBoundsException{ + try { + incomeList.remove(i - 1); + } catch (IndexOutOfBoundsException e) { + throw new IndexOutOfBoundsException("There is no income with this index"); + } + } public void editIncome(int i, String category, String description, String date, float value) { Income inc = (Income) incomeList.get(i - 1); @@ -45,4 +52,9 @@ public void printIncomeList() { System.out.println(i + ". " + record.toString()); } } + + @Override + public Income get(int i) { + return incomeList.get(i); + } } diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index 42e61ea899..7403f7dc39 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -6,7 +6,7 @@ public abstract class RecordList { protected ArrayList recordList = new ArrayList<>(); protected int recordCount = 0; - private int balance; + private double balance; public RecordList() { @@ -22,9 +22,10 @@ public int getRecordCount() { return recordCount; } - public int getBalance(){ - for(int i = 0; i Date: Tue, 14 Mar 2023 20:58:05 +0800 Subject: [PATCH 074/364] Update RecordList.java Fixes the error produced after trying to resolve merge conflict --- src/main/java/chching/record/RecordList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index 94638aeb1c..a9544dfe8e 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -20,7 +20,7 @@ public int getRecordCount() { return recordList.size(); } - public int getBalance(){ + public double getBalance(){ for(int i = 0; i < getRecordCount(); i++){ balance += this.recordList.get(i).value; } From f1c53e1acfce2e764da8681635eb697e5307e7f4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 14 Mar 2023 22:12:59 +0800 Subject: [PATCH 075/364] modified income class and removed edit functionality --- data/chching.txt | 1 + src/main/java/chching/Storage.java | 3 +- src/main/java/chching/Ui.java | 6 +--- src/main/java/chching/parser/Expenses.java | 27 ----------------- src/main/java/chching/parser/Incomes.java | 29 +------------------ src/main/java/chching/parser/Parser.java | 7 ----- src/main/java/chching/record/ExpenseList.java | 16 +--------- src/main/java/chching/record/Income.java | 12 ++++++-- src/main/java/chching/record/IncomeList.java | 16 ---------- 9 files changed, 15 insertions(+), 102 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index e69de29bb2..0ecd2f1c72 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -0,0 +1 @@ +I | null | description | date | 500.00 \ No newline at end of file diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index d3179c81d6..2ead572683 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -38,13 +38,12 @@ public ArrayList loadIncomes() throws ChChingException { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String category = extract[1].trim(); String description = extract[2].trim(); String date = extract[3].trim(); String value = extract[4].trim(); if (symbol.equals("I")) { - Income income = new Income(category, description, date, Double.parseDouble(value)); + Income income = new Income(description, date, Double.parseDouble(value)); incomes.add(income); } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index ab303fd555..5ca4ab3993 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -61,15 +61,11 @@ public void showBalance(double balance) { public static void showHelp() { System.out.println(" ADD RECORDS:"); System.out.println(" add expense /c /de /da /v "); - System.out.println(" add income"); + System.out.println(" add income /de /da /v "); System.out.println(); System.out.println(" SHOW ALL RECORDS:"); System.out.println(" list"); System.out.println(); - System.out.println(" EDIT RECORDS:"); - System.out.println(" edit expense /c /de /da /v "); - System.out.println(" edit income "); - System.out.println(); System.out.println(" DELETE RECORDS:"); System.out.println(" delete expense "); System.out.println(" delete income "); diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 88d5d0d8ae..79ca32e353 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -19,31 +19,4 @@ public static Expense parseExpense(HashMap argumentsByField) { } return exp; } - - public static Expense parseUpdateExpense(HashMap argumentsByField, ExpenseList expenseList) { - Expense exp = null; - try { - int index = Integer.parseInt(argumentsByField.get("i")); - exp = (Expense) expenseList.get(index - 1); - if (argumentsByField.containsKey("c")) { - String updateCategory = argumentsByField.get("c"); - exp.setCategory(updateCategory); - } - if (argumentsByField.containsKey("de")) { - String updateDescription = argumentsByField.get("de"); - exp.setDescription(updateDescription); - } - if (argumentsByField.containsKey("da")) { - String updateDate = argumentsByField.get("da"); - exp.setDate(updateDate); - } - if (argumentsByField.containsKey("v")) { - float updateValue = Float.parseFloat(argumentsByField.get("v")); - exp.setValue(updateValue); - } - } catch (Exception e) { - System.out.println("Trouble editing expense"); - } - return exp; - } } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 045013248d..2aed399840 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -8,40 +8,13 @@ public class Incomes { public static chching.record.Income parseIncome(HashMap argumentsByField) { chching.record.Income inc = null; try { - String incomeCategory = argumentsByField.get("c"); String incomeDescription = argumentsByField.get("de"); String incomeDate = argumentsByField.get("da"); float incomeValue = Float.parseFloat(argumentsByField.get("v")); - inc = new chching.record.Income(incomeCategory, incomeDescription, incomeDate, incomeValue); + inc = new chching.record.Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { System.out.println("Trouble adding income"); } return inc; } - - public static void editIncome(HashMap argumentsByField, IncomeList incomeList) { - try { - int index = Integer.parseInt(argumentsByField.get("i")); - String updateCategory = null; - String updateDescription = null; - String updateDate = null; - float updateValue = 0; - if (argumentsByField.containsKey("c")) { - updateCategory = argumentsByField.get("c"); - } - if (argumentsByField.containsKey("de")) { - updateDescription = argumentsByField.get("de"); - } - if (argumentsByField.containsKey("da")) { - updateDate = argumentsByField.get("da"); - } - if (argumentsByField.containsKey("v")) { - updateValue = Float.parseFloat(argumentsByField.get("v")); - } - incomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); - System.out.println("Income modified"); - } catch (Exception e) { - System.out.println("Trouble editing income"); - } - } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 19c856070a..5c8e00c4ba 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -49,19 +49,12 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe case "list": command = new ListCommand(); break; - case "edit income": - Incomes.editIncome(argumentsByField, incomeList); - break; - case "edit expense": - Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); - break; case "delete income": command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); break; case "delete expense": command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); break; - case "balance": command = new BalanceCommand(); break; diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 4d73df12a1..3fbd68ad71 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -30,21 +30,7 @@ public void deleteExpense(int i) throws IndexOutOfBoundsException{ throw new IndexOutOfBoundsException("There is no expense with this index"); } } - public void editExpense(int i, String category, String description, String date, float value) { - Expense exp = (Expense) expenseList.get(i - 1); - if(!(category == null)) { - exp.category = category; - } - if(!(description == null)) { - exp.description = description; - } - if(!(date == null)) { - exp.date = date; - } - if(!(value == 0)) { - exp.value = value; - } - } + public void printExpenseList() { for (int i = 1; i <= expenseList.size(); i++) { Record record = expenseList.get(i - 1); diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index ef30ef4752..6379f38f10 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,7 +1,15 @@ package chching.record; public class Income extends Record{ - public Income(String category, String description, String date, double value) { - super(category, description, date, value); + public Income(String description, String date, double value) { + this.description = description; + this.date = date; + this.value = value; + } + @Override + public String toString() { + return " Description - " + getDescription() + + " | Date - " + getDate() + + " | Value - " + getValue(); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 571cd8295c..cfc99ed21b 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -30,22 +30,6 @@ public void deleteIncome(int i) throws IndexOutOfBoundsException{ } } - public void editIncome(int i, String category, String description, String date, float value) { - Income inc = (Income) incomeList.get(i - 1); - if(!(category == null)) { - inc.category = category; - } - if(!(description == null)) { - inc.description = description; - } - if(!(date == null)) { - inc.date = date; - } - if(!(value == 0)) { - inc.value = value; - } - } - public void printIncomeList() { for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); From 05e10ba72b187147eddb15a5f16e6cc9da9c2624 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 14 Mar 2023 22:24:58 +0800 Subject: [PATCH 076/364] Add assertions, Add exceptions, Fix logic --- src/main/java/chching/Storage.java | 8 +- src/main/java/chching/parser/Expenses.java | 3 + src/main/java/chching/parser/Incomes.java | 3 + src/main/java/chching/parser/Parser.java | 97 ++++++++++--------- src/main/java/chching/record/ExpenseList.java | 2 +- src/main/java/chching/record/IncomeList.java | 2 +- 6 files changed, 63 insertions(+), 52 deletions(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index d3179c81d6..d5f33197a6 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -29,7 +29,7 @@ public class Storage { this.file = new File(filepath); } - public ArrayList loadIncomes() throws ChChingException { + public ArrayList loadIncomes() { ArrayList incomes = new ArrayList<>(); try { @@ -51,13 +51,13 @@ public ArrayList loadIncomes() throws ChChingException { reader.close(); } catch (FileNotFoundException e) { - throw new ChChingException("Unfortunately, file can't be found. I'll make a new one!"); + System.out.println("Unfortunately, file can't be found. I'll make a new one!"); } return incomes; } - public ArrayList loadExpenses() throws ChChingException { + public ArrayList loadExpenses() { ArrayList expenses = new ArrayList<>(); try { @@ -79,7 +79,7 @@ public ArrayList loadExpenses() throws ChChingException { reader.close(); } catch (FileNotFoundException e) { - throw new ChChingException("Unfortunately, file can't be found. I'll make a new one!"); + System.out.println("Unfortunately, file can't be found. I'll make a new one!"); } return expenses; diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 88d5d0d8ae..7a9697c7ef 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -13,6 +13,7 @@ public static Expense parseExpense(HashMap argumentsByField) { String expenseDescription = argumentsByField.get("de"); String expenseDate = argumentsByField.get("da"); float expenseValue = Float.parseFloat(argumentsByField.get("v")); + assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { System.out.println("Trouble adding expenses"); @@ -24,6 +25,7 @@ public static Expense parseUpdateExpense(HashMap argumentsByFiel Expense exp = null; try { int index = Integer.parseInt(argumentsByField.get("i")); + assert index >= 0 : "index should be greater than or equal to zero"; exp = (Expense) expenseList.get(index - 1); if (argumentsByField.containsKey("c")) { String updateCategory = argumentsByField.get("c"); @@ -39,6 +41,7 @@ public static Expense parseUpdateExpense(HashMap argumentsByFiel } if (argumentsByField.containsKey("v")) { float updateValue = Float.parseFloat(argumentsByField.get("v")); + assert updateValue > 0 : "updateValue has to be greater than zero"; exp.setValue(updateValue); } } catch (Exception e) { diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 045013248d..58f5aa9c8b 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -12,6 +12,7 @@ public static chching.record.Income parseIncome(HashMap argument String incomeDescription = argumentsByField.get("de"); String incomeDate = argumentsByField.get("da"); float incomeValue = Float.parseFloat(argumentsByField.get("v")); + assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new chching.record.Income(incomeCategory, incomeDescription, incomeDate, incomeValue); } catch (Exception e) { System.out.println("Trouble adding income"); @@ -22,6 +23,7 @@ public static chching.record.Income parseIncome(HashMap argument public static void editIncome(HashMap argumentsByField, IncomeList incomeList) { try { int index = Integer.parseInt(argumentsByField.get("i")); + assert index >= 0 : "index should be greater than or equal to zero"; String updateCategory = null; String updateDescription = null; String updateDate = null; @@ -37,6 +39,7 @@ public static void editIncome(HashMap argumentsByField, IncomeLi } if (argumentsByField.containsKey("v")) { updateValue = Float.parseFloat(argumentsByField.get("v")); + assert updateValue > 0 : "updateValue has to be more than 0"; } incomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); System.out.println("Income modified"); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 19c856070a..f8cdc6e80e 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,4 +1,6 @@ package chching.parser; + +import chching.ChChingException; import chching.command.Command; import chching.command.DeleteExpenseCommand; import chching.command.DeleteIncomeCommand; @@ -22,7 +24,7 @@ import java.util.List; public class Parser { - + public static final String FIELD_DEMARCATION = " /"; public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList) { @@ -31,62 +33,65 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); Command command = new ExitCommand(); - switch(instruction) { - case "add income": - Income income = Incomes.parseIncome(argumentsByField); - command = new AddIncomeCommand(income); - break; - case "add expense": - Expense expense = Expenses.parseExpense(argumentsByField); - command = new AddExpenseCommand(expense); - break; - case "list income": - command = new ListIncomeCommand(); - break; - case "list expense": - command = new ListExpenseCommand(); - break; - case "list": - command = new ListCommand(); - break; - case "edit income": - Incomes.editIncome(argumentsByField, incomeList); - break; - case "edit expense": - Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); - break; - case "delete income": - command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); - break; - case "delete expense": - command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); - break; - - case "balance": - command = new BalanceCommand(); - break; - case "exit": - command = new ExitCommand(); - break; - case "help": - command = new HelpCommand(); - break; - default: - System.out.println("Command not recognized, please enter a valid command!"); + try { + switch (instruction) { + case "add income": + Income income = Incomes.parseIncome(argumentsByField); + command = new AddIncomeCommand(income); + break; + case "add expense": + Expense expense = Expenses.parseExpense(argumentsByField); + command = new AddExpenseCommand(expense); + break; + case "list income": + command = new ListIncomeCommand(); + break; + case "list expense": + command = new ListExpenseCommand(); + break; + case "list": + command = new ListCommand(); + break; + case "edit income": + Incomes.editIncome(argumentsByField, incomeList); + break; + case "edit expense": + Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); + break; + case "delete income": + command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); + break; + case "delete expense": + command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); + break; + + case "balance": + command = new BalanceCommand(); + break; + case "exit": + command = new ExitCommand(); + break; + case "help": + command = new HelpCommand(); + break; + default: + System.out.println("Command not recognized, please enter a valid command!"); + } + } catch (Exception e) { } return command; } - + public static ArrayList splitLine(String line) { ArrayList lineParts = new ArrayList(); lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); return lineParts; } - + public static HashMap sortArguments(List arguments) { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); - + // split each argument according to their field and their value, and add into hashmap accordingly // Hashmap's key is its field, value is the value of the field for (int i = 0; i < argumentsCount; i++) { diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 4d73df12a1..dc0b313d9a 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -41,7 +41,7 @@ public void editExpense(int i, String category, String description, String date, if(!(date == null)) { exp.date = date; } - if(!(value == 0)) { + if(value > 0) { exp.value = value; } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 571cd8295c..34410aa8f9 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -41,7 +41,7 @@ public void editIncome(int i, String category, String description, String date, if(!(date == null)) { inc.date = date; } - if(!(value == 0)) { + if(value > 0) { inc.value = value; } } From c28beb9a28aeb2ea7f32689c6e52d25d189adc09 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 14 Mar 2023 22:30:30 +0800 Subject: [PATCH 077/364] Fix bug --- src/main/java/chching/ChChing.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 0dd50cd2ae..0337d649bf 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -18,7 +18,7 @@ public ChChing(String filePath) { try { this.incomes = new IncomeList(storage.loadIncomes()); this.expenses = new ExpenseList(storage.loadExpenses()); - } catch (ChChingException e) { + } catch (Exception e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); this.expenses = new ExpenseList(); From 5143645f046f0b8696dc14b41ebdb980323e6293 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 14 Mar 2023 22:43:28 +0800 Subject: [PATCH 078/364] Exception use example --- src/main/java/chching/command/AddExpenseCommand.java | 7 ++++++- src/main/java/chching/command/AddIncomeCommand.java | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index 92270e0e29..cf8f4dca3e 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -1,5 +1,6 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; @@ -9,7 +10,11 @@ public class AddExpenseCommand extends Command { private final Expense expense; - public AddExpenseCommand(Expense expense) { + public AddExpenseCommand(Expense expense) throws ChChingException { + if(expense.getValue() <= 0) + { + throw new ChChingException("Invalid expense value"); + } this.expense = expense; } @Override diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index c1b2591e90..7cf0a3adba 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -1,5 +1,6 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; @@ -9,7 +10,10 @@ public class AddIncomeCommand extends Command { private final Income income; - public AddIncomeCommand(Income income) { + public AddIncomeCommand(Income income) throws ChChingException { + if(income.getValue() <= 0){ + throw new ChChingException("Invalid income value"); + } this.income = income; } @Override From 266cef3a390aeef20193026a24920d72da406e0b Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 14 Mar 2023 22:59:31 +0800 Subject: [PATCH 079/364] Bug fix for runtest --- text-ui-test/EXPECTED.TXT | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892ed732d1..8f4bec5703 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,4 +1,5 @@ - Unfortunately, file can't be found. I'll make a new one! +Unfortunately, file can't be found. I'll make a new one! +Unfortunately, file can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From 1568875d10368e1b0daa00eac1ccc8d7a70ab396 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 14 Mar 2023 23:11:50 +0800 Subject: [PATCH 080/364] implement InvalidCommand --- .../java/chching/command/InvalidCommand.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/chching/command/InvalidCommand.java diff --git a/src/main/java/chching/command/InvalidCommand.java b/src/main/java/chching/command/InvalidCommand.java new file mode 100644 index 0000000000..6099bf396f --- /dev/null +++ b/src/main/java/chching/command/InvalidCommand.java @@ -0,0 +1,16 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +/** + * model a class to handle the bye command. inherit from Command class. + */ +public class InvalidCommand extends Command { + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + ui.showInvalidMessage(); + } +} From 0458720c8d53739719e59aaa8e1b1221d0616c4c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 14 Mar 2023 23:13:24 +0800 Subject: [PATCH 081/364] change income and invalid command --- src/main/java/chching/Storage.java | 3 +- src/main/java/chching/Ui.java | 9 ++--- .../chching/command/AddExpenseCommand.java | 7 +++- .../chching/command/AddIncomeCommand.java | 6 ++- src/main/java/chching/parser/Expenses.java | 30 --------------- src/main/java/chching/parser/Incomes.java | 38 +++---------------- src/main/java/chching/parser/Parser.java | 14 ++----- src/main/java/chching/record/ExpenseList.java | 16 +------- src/main/java/chching/record/Income.java | 12 +++++- src/main/java/chching/record/IncomeList.java | 16 -------- text-ui-test/EXPECTED.TXT | 3 +- 11 files changed, 38 insertions(+), 116 deletions(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index d5f33197a6..9bc3a6b458 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -38,13 +38,12 @@ public ArrayList loadIncomes() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String category = extract[1].trim(); String description = extract[2].trim(); String date = extract[3].trim(); String value = extract[4].trim(); if (symbol.equals("I")) { - Income income = new Income(category, description, date, Double.parseDouble(value)); + Income income = new Income(description, date, Double.parseDouble(value)); incomes.add(income); } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index ab303fd555..0869613961 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -61,15 +61,11 @@ public void showBalance(double balance) { public static void showHelp() { System.out.println(" ADD RECORDS:"); System.out.println(" add expense /c /de /da /v "); - System.out.println(" add income"); + System.out.println(" add income /de /da /v "); System.out.println(); System.out.println(" SHOW ALL RECORDS:"); System.out.println(" list"); System.out.println(); - System.out.println(" EDIT RECORDS:"); - System.out.println(" edit expense /c /de /da /v "); - System.out.println(" edit income "); - System.out.println(); System.out.println(" DELETE RECORDS:"); System.out.println(" delete expense "); System.out.println(" delete income "); @@ -87,4 +83,7 @@ public static void showHelp() { public void showError(String message) { System.out.println(" " + message); } + public void showInvalidMessage() { + System.out.println("Command is not recognized, use help for valid commands"); + } } diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index 92270e0e29..cf8f4dca3e 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -1,5 +1,6 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; @@ -9,7 +10,11 @@ public class AddExpenseCommand extends Command { private final Expense expense; - public AddExpenseCommand(Expense expense) { + public AddExpenseCommand(Expense expense) throws ChChingException { + if(expense.getValue() <= 0) + { + throw new ChChingException("Invalid expense value"); + } this.expense = expense; } @Override diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index c1b2591e90..7cf0a3adba 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -1,5 +1,6 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; @@ -9,7 +10,10 @@ public class AddIncomeCommand extends Command { private final Income income; - public AddIncomeCommand(Income income) { + public AddIncomeCommand(Income income) throws ChChingException { + if(income.getValue() <= 0){ + throw new ChChingException("Invalid income value"); + } this.income = income; } @Override diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 7a9697c7ef..db5c28b3b8 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -1,7 +1,6 @@ package chching.parser; import chching.record.Expense; -import chching.record.ExpenseList; import java.util.HashMap; @@ -20,33 +19,4 @@ public static Expense parseExpense(HashMap argumentsByField) { } return exp; } - - public static Expense parseUpdateExpense(HashMap argumentsByField, ExpenseList expenseList) { - Expense exp = null; - try { - int index = Integer.parseInt(argumentsByField.get("i")); - assert index >= 0 : "index should be greater than or equal to zero"; - exp = (Expense) expenseList.get(index - 1); - if (argumentsByField.containsKey("c")) { - String updateCategory = argumentsByField.get("c"); - exp.setCategory(updateCategory); - } - if (argumentsByField.containsKey("de")) { - String updateDescription = argumentsByField.get("de"); - exp.setDescription(updateDescription); - } - if (argumentsByField.containsKey("da")) { - String updateDate = argumentsByField.get("da"); - exp.setDate(updateDate); - } - if (argumentsByField.containsKey("v")) { - float updateValue = Float.parseFloat(argumentsByField.get("v")); - assert updateValue > 0 : "updateValue has to be greater than zero"; - exp.setValue(updateValue); - } - } catch (Exception e) { - System.out.println("Trouble editing expense"); - } - return exp; - } } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 58f5aa9c8b..121a9cfcf1 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -1,50 +1,22 @@ package chching.parser; -import chching.record.IncomeList; +import chching.record.Income; import java.util.HashMap; public class Incomes { - public static chching.record.Income parseIncome(HashMap argumentsByField) { - chching.record.Income inc = null; + public static Income parseIncome(HashMap argumentsByField) { + Income inc = null; try { - String incomeCategory = argumentsByField.get("c"); String incomeDescription = argumentsByField.get("de"); String incomeDate = argumentsByField.get("da"); float incomeValue = Float.parseFloat(argumentsByField.get("v")); + inc = new Income(incomeDescription, incomeDate, incomeValue); assert incomeValue > 0 : "incomeValue has to be more than 0"; - inc = new chching.record.Income(incomeCategory, incomeDescription, incomeDate, incomeValue); + inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { System.out.println("Trouble adding income"); } return inc; } - - public static void editIncome(HashMap argumentsByField, IncomeList incomeList) { - try { - int index = Integer.parseInt(argumentsByField.get("i")); - assert index >= 0 : "index should be greater than or equal to zero"; - String updateCategory = null; - String updateDescription = null; - String updateDate = null; - float updateValue = 0; - if (argumentsByField.containsKey("c")) { - updateCategory = argumentsByField.get("c"); - } - if (argumentsByField.containsKey("de")) { - updateDescription = argumentsByField.get("de"); - } - if (argumentsByField.containsKey("da")) { - updateDate = argumentsByField.get("da"); - } - if (argumentsByField.containsKey("v")) { - updateValue = Float.parseFloat(argumentsByField.get("v")); - assert updateValue > 0 : "updateValue has to be more than 0"; - } - incomeList.editIncome(index, updateCategory, updateDescription, updateDate, updateValue); - System.out.println("Income modified"); - } catch (Exception e) { - System.out.println("Trouble editing income"); - } - } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index f8cdc6e80e..102bf4ceb9 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,7 +1,7 @@ package chching.parser; -import chching.ChChingException; import chching.command.Command; +import chching.command.InvalidCommand; import chching.command.DeleteExpenseCommand; import chching.command.DeleteIncomeCommand; import chching.command.AddExpenseCommand; @@ -32,7 +32,7 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); - Command command = new ExitCommand(); + Command command = new InvalidCommand(); try { switch (instruction) { case "add income": @@ -52,19 +52,12 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe case "list": command = new ListCommand(); break; - case "edit income": - Incomes.editIncome(argumentsByField, incomeList); - break; - case "edit expense": - Expense updatedExpense = Expenses.parseUpdateExpense(argumentsByField, expenseList); - break; case "delete income": command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); break; case "delete expense": command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); break; - case "balance": command = new BalanceCommand(); break; @@ -75,9 +68,10 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe command = new HelpCommand(); break; default: - System.out.println("Command not recognized, please enter a valid command!"); + command = new InvalidCommand(); } } catch (Exception e) { + System.out.println("Error receiving command"); } return command; } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index dc0b313d9a..aaf74949bb 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -29,22 +29,8 @@ public void deleteExpense(int i) throws IndexOutOfBoundsException{ } catch (IndexOutOfBoundsException e) { throw new IndexOutOfBoundsException("There is no expense with this index"); } - } - public void editExpense(int i, String category, String description, String date, float value) { - Expense exp = (Expense) expenseList.get(i - 1); - if(!(category == null)) { - exp.category = category; - } - if(!(description == null)) { - exp.description = description; - } - if(!(date == null)) { - exp.date = date; - } - if(value > 0) { - exp.value = value; - } } + public void printExpenseList() { for (int i = 1; i <= expenseList.size(); i++) { Record record = expenseList.get(i - 1); diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index ef30ef4752..6379f38f10 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,7 +1,15 @@ package chching.record; public class Income extends Record{ - public Income(String category, String description, String date, double value) { - super(category, description, date, value); + public Income(String description, String date, double value) { + this.description = description; + this.date = date; + this.value = value; + } + @Override + public String toString() { + return " Description - " + getDescription() + + " | Date - " + getDate() + + " | Value - " + getValue(); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 34410aa8f9..cfc99ed21b 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -30,22 +30,6 @@ public void deleteIncome(int i) throws IndexOutOfBoundsException{ } } - public void editIncome(int i, String category, String description, String date, float value) { - Income inc = (Income) incomeList.get(i - 1); - if(!(category == null)) { - inc.category = category; - } - if(!(description == null)) { - inc.description = description; - } - if(!(date == null)) { - inc.date = date; - } - if(value > 0) { - inc.value = value; - } - } - public void printIncomeList() { for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892ed732d1..8f4bec5703 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,4 +1,5 @@ - Unfortunately, file can't be found. I'll make a new one! +Unfortunately, file can't be found. I'll make a new one! +Unfortunately, file can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From d77fe206e8fc40173ad7fbd68c0a6985b5363e01 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Tue, 14 Mar 2023 23:15:56 +0800 Subject: [PATCH 082/364] Update chching.txt --- data/chching.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/chching.txt b/data/chching.txt index 784f2f7f34..8b13789179 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1 +1 @@ -I | null | description | date | 500.00I | null | test | test | 300.00E | test | test | test | 12.20 \ No newline at end of file + From 37117a96d75e359e13681258b1fda56f2120e4ce Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 14 Mar 2023 23:55:33 +0800 Subject: [PATCH 083/364] Debug storage --- data/chching.txt | 3 ++- src/main/java/chching/Storage.java | 22 ++++++++++------------ src/main/java/chching/parser/Parser.java | 5 +++-- src/main/java/chching/record/Record.java | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index 8b13789179..f3ed557e41 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1 +1,2 @@ - +I | test | test | 500.00 +E | cat | test | test | 300.00 diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 9bc3a6b458..2c4f557c89 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -38,11 +38,10 @@ public ArrayList loadIncomes() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String description = extract[2].trim(); - String date = extract[3].trim(); - String value = extract[4].trim(); - - if (symbol.equals("I")) { + if(symbol.equals("I")) { + String description = extract[1].trim(); + String date = extract[2].trim(); + String value = extract[3].trim(); Income income = new Income(description, date, Double.parseDouble(value)); incomes.add(income); } @@ -65,14 +64,13 @@ public ArrayList loadExpenses() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); + if (symbol.equals("E")) { String category = extract[1].trim(); String description = extract[2].trim(); String date = extract[3].trim(); String value = extract[4].trim(); - - if (symbol.equals("E")) { - Expense expense = new Expense(category, description, date, Double.parseDouble(value)); - expenses.add(expense); + Expense expense = new Expense(category, description, date, Double.parseDouble(value)); + expenses.add(expense); } } reader.close(); @@ -92,15 +90,15 @@ public void save(IncomeList incomes, ExpenseList expenses) { for (int i = 0; i < incomes.size(); i++) { Record income = incomes.get(i); - String line = String.format("I | %s | %s | %s | %.2f", income.getCategory(), - income.getDescription(), income.getDate(), income.getValue()); + String line = String.format("I | %s | %s | %.2f", income.getDescription(), + income.getDate(), income.getValue()) + "\n"; fileWriter.write(line); } for (int i = 0; i < expenses.size(); i++) { Record expense = expenses.get(i); String line = String.format("E | %s | %s | %s | %.2f", expense.getCategory(), - expense.getDescription(), expense.getDate(), expense.getValue()); + expense.getDescription(), expense.getDate(), expense.getValue()) + "\n"; fileWriter.write(line); } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 102bf4ceb9..993148ea9b 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,5 +1,6 @@ package chching.parser; +import chching.ChChingException; import chching.command.Command; import chching.command.InvalidCommand; import chching.command.DeleteExpenseCommand; @@ -70,8 +71,8 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe default: command = new InvalidCommand(); } - } catch (Exception e) { - System.out.println("Error receiving command"); + } catch (ChChingException e) { + System.out.println(e.getMessage()); } return command; } diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 12a43650b9..4d3f2c3eed 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -50,7 +50,7 @@ public void setValue(float value) { this.value = value; } public String toString() { - return "Category - " + getCategory() + + return " Category - " + getCategory() + " | Description - " + getDescription() + " | Date - " + getDate() + " | Value - " + getValue(); From d9ef24ae2d1a54a61f03ba0b505a484c209e3093 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Tue, 14 Mar 2023 23:58:37 +0800 Subject: [PATCH 084/364] fix some Storage bug --- data/chching.txt | 3 ++- src/main/java/chching/Storage.java | 21 +++++++++++---------- src/main/java/chching/Ui.java | 1 + src/main/java/chching/record/Expense.java | 17 ++++++++++++++++- src/main/java/chching/record/Income.java | 5 ++--- src/main/java/chching/record/Record.java | 18 +++--------------- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index 8b13789179..2c049307ec 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1 +1,2 @@ - +I | monthly | today | 100.00 +E | meal | lunch | today | 3.50 diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 9bc3a6b458..e690d0e42e 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -38,9 +38,9 @@ public ArrayList loadIncomes() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String description = extract[2].trim(); - String date = extract[3].trim(); - String value = extract[4].trim(); + String description = extract[1].trim(); + String date = extract[2].trim(); + String value = extract[3].trim(); if (symbol.equals("I")) { Income income = new Income(description, date, Double.parseDouble(value)); @@ -65,12 +65,13 @@ public ArrayList loadExpenses() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String category = extract[1].trim(); - String description = extract[2].trim(); - String date = extract[3].trim(); - String value = extract[4].trim(); if (symbol.equals("E")) { + String category = extract[1].trim(); + String description = extract[2].trim(); + String date = extract[3].trim(); + String value = extract[4].trim(); + Expense expense = new Expense(category, description, date, Double.parseDouble(value)); expenses.add(expense); } @@ -92,14 +93,14 @@ public void save(IncomeList incomes, ExpenseList expenses) { for (int i = 0; i < incomes.size(); i++) { Record income = incomes.get(i); - String line = String.format("I | %s | %s | %s | %.2f", income.getCategory(), - income.getDescription(), income.getDate(), income.getValue()); + String line = String.format("I | %s | %s | %.2f\n", income.getDescription(), + income.getDate(), income.getValue()); fileWriter.write(line); } for (int i = 0; i < expenses.size(); i++) { Record expense = expenses.get(i); - String line = String.format("E | %s | %s | %s | %.2f", expense.getCategory(), + String line = String.format("E | %s | %s | %s | %.2f\n", expense.getCategory(), expense.getDescription(), expense.getDate(), expense.getValue()); fileWriter.write(line); } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 0869613961..5be5da375f 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -83,6 +83,7 @@ public static void showHelp() { public void showError(String message) { System.out.println(" " + message); } + public void showInvalidMessage() { System.out.println("Command is not recognized, use help for valid commands"); } diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 41806e5d96..ef004bf06a 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -1,9 +1,24 @@ package chching.record; public class Expense extends Record { + private final String category; public Expense(String category, String description, String date, double value) { - super(category, description, date, value); + super(description, date, value); + this.category = category; + } + + @Override + public String getCategory() { + return category; + } + + @Override + public String toString() { + return "Category - " + getCategory() + + " | Description - " + getDescription() + + " | Date - " + getDate() + + " | Value - " + String.format("%.2f", getValue()); } } diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 6379f38f10..2698637eec 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -2,10 +2,9 @@ public class Income extends Record{ public Income(String description, String date, double value) { - this.description = description; - this.date = date; - this.value = value; + super(description, date, value); } + @Override public String toString() { return " Description - " + getDescription() + diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 12a43650b9..b47f30be15 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -2,16 +2,14 @@ // Abstract class that will not be initialized as an object public abstract class Record { - protected String category; protected String description; protected String date; protected double value; public Record(){ - } - public Record(String category, String description, String date, double value) { - this.category = category; + + public Record(String description, String date, double value) { this.description = description; this.date = date; this.value = value; @@ -19,7 +17,7 @@ public Record(String category, String description, String date, double value) { } public String getCategory() { - return category; + return ""; } public String getDescription() { @@ -34,10 +32,6 @@ public double getValue() { return value; } - public void setCategory(String category) { - this.category = category; - } - public void setDescription(String description) { this.description = description; } @@ -49,10 +43,4 @@ public void setDate(String date) { public void setValue(float value) { this.value = value; } - public String toString() { - return "Category - " + getCategory() + - " | Description - " + getDescription() + - " | Date - " + getDate() + - " | Value - " + getValue(); - } } From f92fc70638afdd725fe65e84f840966acbd085ba Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 00:00:53 +0800 Subject: [PATCH 085/364] debug storage to read/write income and expense --- src/main/java/chching/Storage.java | 12 ++++++------ src/main/java/chching/command/AddExpenseCommand.java | 3 +-- src/main/java/chching/command/AddIncomeCommand.java | 2 +- src/test/java/chching/record/ExpenseTest.java | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 2c4f557c89..24b600262c 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -65,12 +65,12 @@ public ArrayList loadExpenses() { String[] extract = line.split("\\|"); String symbol = extract[0].trim(); if (symbol.equals("E")) { - String category = extract[1].trim(); - String description = extract[2].trim(); - String date = extract[3].trim(); - String value = extract[4].trim(); - Expense expense = new Expense(category, description, date, Double.parseDouble(value)); - expenses.add(expense); + String category = extract[1].trim(); + String description = extract[2].trim(); + String date = extract[3].trim(); + String value = extract[4].trim(); + Expense expense = new Expense(category, description, date, Double.parseDouble(value)); + expenses.add(expense); } } reader.close(); diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index cf8f4dca3e..cba403d8e2 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -11,8 +11,7 @@ public class AddExpenseCommand extends Command { private final Expense expense; public AddExpenseCommand(Expense expense) throws ChChingException { - if(expense.getValue() <= 0) - { + if(expense.getValue() <= 0) { throw new ChChingException("Invalid expense value"); } this.expense = expense; diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 7cf0a3adba..d75afbbc08 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -11,7 +11,7 @@ public class AddIncomeCommand extends Command { private final Income income; public AddIncomeCommand(Income income) throws ChChingException { - if(income.getValue() <= 0){ + if(income.getValue() <= 0) { throw new ChChingException("Invalid income value"); } this.income = income; diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index 7cdd255fea..cb1c93e642 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -28,7 +28,7 @@ void getExpenseValue_expected() { @Test void getValue_expected() { Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); - String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.5"; + String expected = " Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.5"; assertEquals(expected, exp.toString()); } } From bc4ece54ab42b17c2c24d70c512d34a853a58fa3 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 10:32:20 +0800 Subject: [PATCH 086/364] Fixed bug where money values display with more than 2 d.p. --- src/main/java/chching/Ui.java | 7 +++++-- src/main/java/chching/command/BalanceCommand.java | 5 ++--- src/main/java/chching/record/Expense.java | 8 ++++++++ src/main/java/chching/record/Income.java | 2 +- src/main/java/chching/record/Record.java | 6 ++---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 0869613961..5bd2ef0db6 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -52,9 +52,12 @@ public void showAllRecords(IncomeList incomes, ExpenseList expenses) { expenses.printExpenseList(); } - public void showBalance(double balance) { + public void showBalance(double totalExpense, double totalIncome, double balance) { + System.out.println(" totalExpense: " + String.format("%.02f", totalExpense)); + System.out.println(" totalIncome: " + String.format("%.02f", totalIncome)); + System.out.println(); System.out.println(" Current balance:"); - System.out.printf(" SGD %.2f%n", balance); + System.out.println(" SGD " + String.format("%.02f", balance)); } diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index b25080af6f..c2c481d095 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -16,9 +16,8 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto for(int i = 0; i < expenses.size(); i++) { totalExpense += expenses.get(i).getValue(); } - System.out.println("totalExpense: " + totalExpense); - System.out.println("totalIncome: " + totalIncome); double balance = totalIncome - totalExpense; - ui.showBalance(balance); + + ui.showBalance(totalExpense, totalIncome, balance); } } diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 41806e5d96..cda6e1be82 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -5,5 +5,13 @@ public class Expense extends Record { public Expense(String category, String description, String date, double value) { super(category, description, date, value); } + + @Override + public String toString() { + return " Category - " + getCategory() + + " | Description - " + getDescription() + + " | Date - " + getDate() + + " | Value - " + String.format("%.02f", getValue()); + } } diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 6379f38f10..ab8ae3284d 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -10,6 +10,6 @@ public Income(String description, String date, double value) { public String toString() { return " Description - " + getDescription() + " | Date - " + getDate() + - " | Value - " + getValue(); + " | Value - " + String.format("%.02f", getValue()); } } diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 4d3f2c3eed..ab455a18a6 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -49,10 +49,8 @@ public void setDate(String date) { public void setValue(float value) { this.value = value; } + public String toString() { - return " Category - " + getCategory() + - " | Description - " + getDescription() + - " | Date - " + getDate() + - " | Value - " + getValue(); + return ""; } } From 49aa5e0d208882759db01100ef8fa121a731457a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 10:50:45 +0800 Subject: [PATCH 087/364] fixed bug where add expense contained incorrect/missing fields --- src/main/java/chching/ChChing.java | 2 +- src/main/java/chching/Ui.java | 2 +- src/main/java/chching/command/AddExpenseCommand.java | 12 ++++++++++-- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Parser.java | 5 +++-- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 0337d649bf..7e7929524d 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -32,7 +32,7 @@ public void run() { try { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") - Command c = Parser.parse(fullCommand, incomes, expenses); + Command c = Parser.parse(fullCommand, incomes, expenses, ui); c.execute(incomes, expenses, ui, storage); isExit = c.isExit(); } catch (ChChingException e) { diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 5bd2ef0db6..62b0154ca7 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -87,6 +87,6 @@ public void showError(String message) { System.out.println(" " + message); } public void showInvalidMessage() { - System.out.println("Command is not recognized, use help for valid commands"); + System.out.println(" Command is not recognized, use help for valid commands"); } } diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index cba403d8e2..4f67adc3bd 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -11,8 +11,16 @@ public class AddExpenseCommand extends Command { private final Expense expense; public AddExpenseCommand(Expense expense) throws ChChingException { - if(expense.getValue() <= 0) { - throw new ChChingException("Invalid expense value"); + if (expense == null) { + throw new ChChingException("No fields found"); + } else if (expense.getCategory() == null) { + throw new ChChingException("Missing category field"); + } else if (expense.getDescription() == null) { + throw new ChChingException("Missing description field"); + } else if (expense.getDate() == null) { + throw new ChChingException("Missing date field"); + } else if (expense.getValue() <= 0) { + throw new ChChingException("Invalid/Missing expense value"); } this.expense = expense; } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index db5c28b3b8..a087adb97a 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -15,7 +15,7 @@ public static Expense parseExpense(HashMap argumentsByField) { assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { - System.out.println("Trouble adding expenses"); + System.out.println(" Trouble adding expense value"); } return exp; } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 993148ea9b..8688bd347f 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,6 +1,7 @@ package chching.parser; import chching.ChChingException; +import chching.Ui; import chching.command.Command; import chching.command.InvalidCommand; import chching.command.DeleteExpenseCommand; @@ -28,7 +29,7 @@ public class Parser { public static final String FIELD_DEMARCATION = " /"; - public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList) { + public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList, Ui ui) { List lineParts = splitLine(line); String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); @@ -72,7 +73,7 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe command = new InvalidCommand(); } } catch (ChChingException e) { - System.out.println(e.getMessage()); + ui.showError(e.getMessage()); } return command; } From 9c96bb2d506f2e73e13570deab593b41114b8b78 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 10:54:56 +0800 Subject: [PATCH 088/364] fixed bug where add income contain missing fields gave exits the program with an error --- src/main/java/chching/command/AddIncomeCommand.java | 8 +++++++- src/main/java/chching/parser/Incomes.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index d75afbbc08..b1039ff44e 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -11,7 +11,13 @@ public class AddIncomeCommand extends Command { private final Income income; public AddIncomeCommand(Income income) throws ChChingException { - if(income.getValue() <= 0) { + if (income == null) { + throw new ChChingException("No fields found"); + } else if (income.getDescription() == null) { + throw new ChChingException("Missing description field"); + } else if (income.getDate() == null) { + throw new ChChingException("Missing date field"); + } else if(income.getValue() <= 0) { throw new ChChingException("Invalid income value"); } this.income = income; diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 121a9cfcf1..460dc2f384 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -15,7 +15,7 @@ public static Income parseIncome(HashMap argumentsByField) { assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { - System.out.println("Trouble adding income"); + System.out.println(" Trouble adding income value"); } return inc; } From 32e6c3e1ae690d175d5a3edfe2ff5e4786da42df Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 11:06:54 +0800 Subject: [PATCH 089/364] updated JUnit testing --- src/test/java/chching/record/ExpenseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index cb1c93e642..b68fee22ee 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -28,7 +28,7 @@ void getExpenseValue_expected() { @Test void getValue_expected() { Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); - String expected = " Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.5"; + String expected = " Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.50"; assertEquals(expected, exp.toString()); } } From 69d12b2217022c2c1e91de3edf6c55f921bbf5c9 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 12:17:46 +0800 Subject: [PATCH 090/364] Add JUnit testing for AddExpenseCommand class --- .../command/AddExpenseCommandTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/test/java/chching/command/AddExpenseCommandTest.java diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java new file mode 100644 index 0000000000..297903c5e3 --- /dev/null +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -0,0 +1,75 @@ +package chching.command; + +import chching.record.Expense; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class AddExpenseCommandTest { + @Test + void AddExpenseCommand_nullExpense_exceptionThrown() { + try { + new AddExpenseCommand(null); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("No fields found", e.getMessage()); + } + } + + @Test + void AddExpenseCommand_missingCategoryField_exceptionThrown() { + Expense input = new Expense(null, "public transport", "1st apr 2023", (float) 1.50); + try { + new AddExpenseCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Missing category field", e.getMessage()); + } + } + + @Test + void AddExpenseCommand_missingDescriptionField_exceptionThrown() { + Expense input = new Expense("transport", null, "1st apr 2023", (float) 1.50); + try { + new AddExpenseCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Missing description field", e.getMessage()); + } + } + + @Test + void AddExpenseCommand_missingDateField_exceptionThrown() { + Expense input = new Expense("transport", "public transport", null, (float) 1.50); + try { + new AddExpenseCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Missing date field", e.getMessage()); + } + } + + @Test + void AddExpenseCommand_zeroValueField_exceptionThrown() { + Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) 0); + try { + new AddExpenseCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Invalid/Missing expense value", e.getMessage()); + } + } + + @Test + void AddExpenseCommand_negativeValueField_exceptionThrown() { + Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) -1.50); + try { + new AddExpenseCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Invalid/Missing expense value", e.getMessage()); + } + } + + +} From ba22b3366f29f17f9a3be14d154ea4ebf0e18fb6 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 12:24:28 +0800 Subject: [PATCH 091/364] Add JUnit testing for AddIncomeCommand --- .../chching/command/AddIncomeCommand.java | 2 +- .../command/AddExpenseCommandTest.java | 3 +- .../chching/command/AddIncomeCommandTest.java | 63 +++++++++++++++++++ src/test/java/chching/record/ExpenseTest.java | 1 + 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/test/java/chching/command/AddIncomeCommandTest.java diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index b1039ff44e..8314d66f57 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -18,7 +18,7 @@ public AddIncomeCommand(Income income) throws ChChingException { } else if (income.getDate() == null) { throw new ChChingException("Missing date field"); } else if(income.getValue() <= 0) { - throw new ChChingException("Invalid income value"); + throw new ChChingException("Invalid/Missing income value"); } this.income = income; } diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 297903c5e3..e00a7b15f7 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -2,6 +2,7 @@ import chching.record.Expense; import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; @@ -70,6 +71,4 @@ void AddExpenseCommand_negativeValueField_exceptionThrown() { assertEquals("Invalid/Missing expense value", e.getMessage()); } } - - } diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java new file mode 100644 index 0000000000..e633635aa3 --- /dev/null +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -0,0 +1,63 @@ +package chching.command; + +import chching.record.Income; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class AddIncomeCommandTest { + @Test + void AddIncomeCommand_nullExpense_exceptionThrown() { + try { + new AddIncomeCommand(null); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("No fields found", e.getMessage()); + } + } + + @Test + void AddIncomeCommand_missingDescriptionField_exceptionThrown() { + Income input = new Income(null, "1st apr 2023", (float) 500); + try { + new AddIncomeCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Missing description field", e.getMessage()); + } + } + + @Test + void AddIncomeCommand_missingDateField_exceptionThrown() { + Income input = new Income("salary", null, (float) 500); + try { + new AddIncomeCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Missing date field", e.getMessage()); + } + } + + @Test + void AddIncomeCommand_zeroValueField_exceptionThrown() { + Income input = new Income("salary", "1st apr 2023", (float) 0); + try { + new AddIncomeCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Invalid/Missing income value", e.getMessage()); + } + } + + @Test + void AddIncomeCommand_negativeValueField_exceptionThrown() { + Income input = new Income("salary", "1st apr 2023", (float) -500); + try { + new AddIncomeCommand(input); + fail(); + } catch (Exception e) { + assertEquals("Invalid/Missing income value", e.getMessage()); + } + } +} diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index b68fee22ee..533fc6ffad 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -1,6 +1,7 @@ package chching.record; import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { From dbbadeab065aa2281c761d4a04baf9e1592b3a90 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 12:48:16 +0800 Subject: [PATCH 092/364] Add comments for fail command to make it easier to understand --- .../java/chching/command/AddExpenseCommandTest.java | 10 +++++----- .../java/chching/command/AddIncomeCommandTest.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index e00a7b15f7..0ce61fff31 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -22,7 +22,7 @@ void AddExpenseCommand_missingCategoryField_exceptionThrown() { Expense input = new Expense(null, "public transport", "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Missing category field", e.getMessage()); } @@ -33,7 +33,7 @@ void AddExpenseCommand_missingDescriptionField_exceptionThrown() { Expense input = new Expense("transport", null, "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Missing description field", e.getMessage()); } @@ -44,7 +44,7 @@ void AddExpenseCommand_missingDateField_exceptionThrown() { Expense input = new Expense("transport", "public transport", null, (float) 1.50); try { new AddExpenseCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Missing date field", e.getMessage()); } @@ -55,7 +55,7 @@ void AddExpenseCommand_zeroValueField_exceptionThrown() { Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) 0); try { new AddExpenseCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Invalid/Missing expense value", e.getMessage()); } @@ -66,7 +66,7 @@ void AddExpenseCommand_negativeValueField_exceptionThrown() { Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) -1.50); try { new AddExpenseCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Invalid/Missing expense value", e.getMessage()); } diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index e633635aa3..6cd8728f86 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -22,7 +22,7 @@ void AddIncomeCommand_missingDescriptionField_exceptionThrown() { Income input = new Income(null, "1st apr 2023", (float) 500); try { new AddIncomeCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Missing description field", e.getMessage()); } @@ -33,7 +33,7 @@ void AddIncomeCommand_missingDateField_exceptionThrown() { Income input = new Income("salary", null, (float) 500); try { new AddIncomeCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Missing date field", e.getMessage()); } @@ -44,7 +44,7 @@ void AddIncomeCommand_zeroValueField_exceptionThrown() { Income input = new Income("salary", "1st apr 2023", (float) 0); try { new AddIncomeCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Invalid/Missing income value", e.getMessage()); } @@ -55,7 +55,7 @@ void AddIncomeCommand_negativeValueField_exceptionThrown() { Income input = new Income("salary", "1st apr 2023", (float) -500); try { new AddIncomeCommand(input); - fail(); + fail(); // test should not reach this line } catch (Exception e) { assertEquals("Invalid/Missing income value", e.getMessage()); } From 977794d5db602019f02f697d295180a2f4671314 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 12:52:07 +0800 Subject: [PATCH 093/364] Update naming convention of test methods to pass gradle check --- .../java/chching/command/AddExpenseCommandTest.java | 12 ++++++------ .../java/chching/command/AddIncomeCommandTest.java | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 0ce61fff31..78233610cd 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -8,7 +8,7 @@ public class AddExpenseCommandTest { @Test - void AddExpenseCommand_nullExpense_exceptionThrown() { + void addExpenseCommand_nullExpense_exceptionThrown() { try { new AddExpenseCommand(null); fail(); // test should not reach this line @@ -18,7 +18,7 @@ void AddExpenseCommand_nullExpense_exceptionThrown() { } @Test - void AddExpenseCommand_missingCategoryField_exceptionThrown() { + void addExpenseCommand_missingCategoryField_exceptionThrown() { Expense input = new Expense(null, "public transport", "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); @@ -29,7 +29,7 @@ void AddExpenseCommand_missingCategoryField_exceptionThrown() { } @Test - void AddExpenseCommand_missingDescriptionField_exceptionThrown() { + void addExpenseCommand_missingDescriptionField_exceptionThrown() { Expense input = new Expense("transport", null, "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); @@ -40,7 +40,7 @@ void AddExpenseCommand_missingDescriptionField_exceptionThrown() { } @Test - void AddExpenseCommand_missingDateField_exceptionThrown() { + void addExpenseCommand_missingDateField_exceptionThrown() { Expense input = new Expense("transport", "public transport", null, (float) 1.50); try { new AddExpenseCommand(input); @@ -51,7 +51,7 @@ void AddExpenseCommand_missingDateField_exceptionThrown() { } @Test - void AddExpenseCommand_zeroValueField_exceptionThrown() { + void addExpenseCommand_zeroValueField_exceptionThrown() { Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) 0); try { new AddExpenseCommand(input); @@ -62,7 +62,7 @@ void AddExpenseCommand_zeroValueField_exceptionThrown() { } @Test - void AddExpenseCommand_negativeValueField_exceptionThrown() { + void addExpenseCommand_negativeValueField_exceptionThrown() { Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) -1.50); try { new AddExpenseCommand(input); diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 6cd8728f86..5ed1a98e0c 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -8,7 +8,7 @@ public class AddIncomeCommandTest { @Test - void AddIncomeCommand_nullExpense_exceptionThrown() { + void addIncomeCommand_nullExpense_exceptionThrown() { try { new AddIncomeCommand(null); fail(); // test should not reach this line @@ -18,7 +18,7 @@ void AddIncomeCommand_nullExpense_exceptionThrown() { } @Test - void AddIncomeCommand_missingDescriptionField_exceptionThrown() { + void addIncomeCommand_missingDescriptionField_exceptionThrown() { Income input = new Income(null, "1st apr 2023", (float) 500); try { new AddIncomeCommand(input); @@ -29,7 +29,7 @@ void AddIncomeCommand_missingDescriptionField_exceptionThrown() { } @Test - void AddIncomeCommand_missingDateField_exceptionThrown() { + void addIncomeCommand_missingDateField_exceptionThrown() { Income input = new Income("salary", null, (float) 500); try { new AddIncomeCommand(input); @@ -40,7 +40,7 @@ void AddIncomeCommand_missingDateField_exceptionThrown() { } @Test - void AddIncomeCommand_zeroValueField_exceptionThrown() { + void addIncomeCommand_zeroValueField_exceptionThrown() { Income input = new Income("salary", "1st apr 2023", (float) 0); try { new AddIncomeCommand(input); @@ -51,7 +51,7 @@ void AddIncomeCommand_zeroValueField_exceptionThrown() { } @Test - void AddIncomeCommand_negativeValueField_exceptionThrown() { + void addIncomeCommand_negativeValueField_exceptionThrown() { Income input = new Income("salary", "1st apr 2023", (float) -500); try { new AddIncomeCommand(input); From 042a4d0fbcbb3d0534b1815084ac9aa04e07270f Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:18:46 +0800 Subject: [PATCH 094/364] fix some UI bugs --- src/main/java/chching/Ui.java | 9 +++++---- src/main/java/chching/command/AddIncomeCommand.java | 3 +-- src/main/java/chching/record/Expense.java | 10 +--------- src/main/java/chching/record/ExpenseList.java | 1 - src/main/java/chching/record/Income.java | 2 +- src/test/java/chching/record/ExpenseTest.java | 2 +- 6 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index f48e228707..d8176276f0 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -31,15 +31,16 @@ public void showGoodbye() { public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); - System.out.println(" Now you have " + incomes.getRecordCount() + " income records,"); - System.out.println(" and " + expenses.getRecordCount() + " expense records in the list."); + System.out.println(); + System.out.println(" Now you have " + incomes.size() + " income records,"); + System.out.println(" and " + expenses.size() + " expense records in the list."); } public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Noted. I've removed this record:"); System.out.println(" " + record); - System.out.println(" Now you have " + incomes.getRecordCount() + " income records,"); - System.out.println(" and " + expenses.getRecordCount() + " expense records in the list."); + System.out.println(" Now you have " + incomes.size() + " income records,"); + System.out.println(" and " + expenses.size() + " expense records in the list."); } public void showAllRecords(IncomeList incomes, ExpenseList expenses) { diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index b1039ff44e..ae6725967e 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -25,7 +25,6 @@ public AddIncomeCommand(Income income) throws ChChingException { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { incomes.addIncome(income); - System.out.println("Income added"); - System.out.println(income.toString()); + ui.showAdded(incomes, expenses, income); } } diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 0f8c4fc784..86c2e1f30e 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -12,18 +12,10 @@ public Expense(String category, String description, String date, double value) { public String getCategory() { return category; } - - @Override - public String toString() { - return "Category - " + getCategory() + - " | Description - " + getDescription() + - " | Date - " + getDate() + - " | Value - " + String.format("%.2f", getValue()); - } @Override public String toString() { - return " Category - " + getCategory() + + return "Category - " + getCategory() + " | Description - " + getDescription() + " | Date - " + getDate() + " | Value - " + String.format("%.02f", getValue()); diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index aaf74949bb..86a2be2f76 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -12,7 +12,6 @@ public ExpenseList(ArrayList expenseList){ public ExpenseList(){ expenseList = new ArrayList<>(); - } public int size() { diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 2e8f5ad6d0..29a8bddae8 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -7,7 +7,7 @@ public Income(String description, String date, double value) { @Override public String toString() { - return " Description - " + getDescription() + + return "Description - " + getDescription() + " | Date - " + getDate() + " | Value - " + String.format("%.02f", getValue()); } diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index b68fee22ee..6d128cc03e 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -28,7 +28,7 @@ void getExpenseValue_expected() { @Test void getValue_expected() { Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); - String expected = " Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.50"; + String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.50"; assertEquals(expected, exp.toString()); } } From 7ce7185b6848a28916e70bc12df25696f417962b Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 15 Mar 2023 13:51:55 +0800 Subject: [PATCH 095/364] Exception handling and bug fix --- src/main/java/chching/command/BalanceCommand.java | 1 + src/main/java/chching/command/DeleteExpenseCommand.java | 6 +++++- src/main/java/chching/command/DeleteIncomeCommand.java | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index c2c481d095..e61e5a458e 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -17,6 +17,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto totalExpense += expenses.get(i).getValue(); } double balance = totalIncome - totalExpense; + assert balance <= totalIncome : "Wrong calculations"; ui.showBalance(totalExpense, totalIncome, balance); } diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 3650b34d27..7a65ce4936 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -1,5 +1,6 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; @@ -11,7 +12,10 @@ public DeleteExpenseCommand(int index) { this.index = index; } @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + if(index <0){ + throw new ChChingException("Negative index"); + } expenses.deleteExpense(index); System.out.println("Expense deleted, here is the updated list:"); expenses.printExpenseList(); diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index cc37634de1..7c568f80b5 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -1,10 +1,12 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; import chching.record.ExpenseList; import chching.record.IncomeList; + public class DeleteIncomeCommand extends Command { private final int index; @@ -13,7 +15,10 @@ public DeleteIncomeCommand(int index) { } @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + if(index <0){ + throw new ChChingException("Negative index"); + } incomes.deleteIncome(index); System.out.println("Income deleted, here is the updated list:"); incomes.printIncomeList(); From 2de08cf80c93c348c806c4fa633d7350dafa43de Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Wed, 15 Mar 2023 14:44:24 +0800 Subject: [PATCH 096/364] add assertion --- src/main/java/chching/Ui.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index d8176276f0..a174b8ef73 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -7,7 +7,6 @@ import java.util.Scanner; public class Ui { - public String readCommand() { Scanner input = new Scanner((System.in)); return input.nextLine(); @@ -32,6 +31,7 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); System.out.println(); + assert(incomes.size() > 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } @@ -39,6 +39,8 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Noted. I've removed this record:"); System.out.println(" " + record); + System.out.println(); + assert(expenses.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } @@ -54,6 +56,7 @@ public void showAllRecords(IncomeList incomes, ExpenseList expenses) { } public void showBalance(double totalExpense, double totalIncome, double balance) { + assert(totalExpense >= 0); System.out.println(" totalExpense: " + String.format("%.02f", totalExpense)); System.out.println(" totalIncome: " + String.format("%.02f", totalIncome)); System.out.println(); From 9397fb95fa2c2a6cbf5e4de95d682da02cf289cc Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 15 Mar 2023 14:45:36 +0800 Subject: [PATCH 097/364] Exception Handling, Add BalanceCommandTest, DeleteExpenseCommandTest. DeleteIncomeCommandTest, IncomeTest, IncomeListTest --- .../chching/command/DeleteExpenseCommand.java | 3 ++ .../chching/command/DeleteIncomeCommand.java | 3 ++ .../chching/command/BalanceCommandTest.java | 22 ++++++++++ .../command/DeleteExpenseCommandTest.java | 44 +++++++++++++++++++ .../command/DeleteIncomeCommandTest.java | 43 ++++++++++++++++++ .../java/chching/record/IncomeListTest.java | 14 ++++++ src/test/java/chching/record/IncomeTest.java | 37 ++++++++++++++++ 7 files changed, 166 insertions(+) create mode 100644 src/test/java/chching/command/BalanceCommandTest.java create mode 100644 src/test/java/chching/command/DeleteExpenseCommandTest.java create mode 100644 src/test/java/chching/command/DeleteIncomeCommandTest.java create mode 100644 src/test/java/chching/record/IncomeListTest.java create mode 100644 src/test/java/chching/record/IncomeTest.java diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 7a65ce4936..b540f7091e 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -16,6 +16,9 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto if(index <0){ throw new ChChingException("Negative index"); } + else if(index >= incomes.size()){ + throw new ChChingException("The number is too big"); + } expenses.deleteExpense(index); System.out.println("Expense deleted, here is the updated list:"); expenses.printExpenseList(); diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index 7c568f80b5..c89b357dbd 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -19,6 +19,9 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto if(index <0){ throw new ChChingException("Negative index"); } + else if(index >= incomes.size()){ + throw new ChChingException("The number is too big"); + } incomes.deleteIncome(index); System.out.println("Income deleted, here is the updated list:"); incomes.printIncomeList(); diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java new file mode 100644 index 0000000000..5898697ad2 --- /dev/null +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -0,0 +1,22 @@ +package chching.command; + +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.Income; +import chching.record.IncomeList; + +import static org.junit.jupiter.api.Assertions.*; + +class BalanceCommandTest { + void addDeleteIncome_positiveIntegerWithinSize_Success() { + Income income0 = new Income("salary", "1st apr 2023", 5000); + IncomeList incomes = new IncomeList(); + incomes.addIncome(income0); + Expense expense0 = new Expense("salary", "too much groceries", "1st apr 2023", 500); + ExpenseList expenses = new ExpenseList(); + expenses.addExpense(expense0); + double balance = incomes.getBalance() - expenses.getBalance(); + assertEquals(4500, balance, "Balance calculation is right"); + } + +} \ No newline at end of file diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java new file mode 100644 index 0000000000..69da2a42a0 --- /dev/null +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -0,0 +1,44 @@ +package chching.command; + +import chching.record.Expense; +import chching.record.ExpenseList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class DeleteExpenseCommandTest { + + @Test + void addDeleteIncome_positiveIntegerWithinSize_Success(){ + Expense expense0 = new Expense("groceries","too much groceries","1st apr 2023",500); + ExpenseList expenses = new ExpenseList(); + expenses.addExpense(expense0); + expenses.deleteExpense(0); + assertEquals(0,expenses.size(),"Delete expense working"); + + } + + @Test + void addDeleteIncome_positiveIntegerOutsideSize_Fail() { + Expense expense0 = new Expense("salary", "too much groceries","1st apr 2023", 500); + ExpenseList expenses = new ExpenseList(); + expenses.addExpense(expense0); + try { + expenses.deleteExpense(3); + } catch (Exception e) { + assertEquals("The number is too big", e.getMessage(), "Delete expense with integer outside size is not captured"); + } + } + + @Test + void addDeleteIncome_negativeInteger_Fail() { + Expense expense0 = new Expense("salary", "too much groceries","1st apr 2023", 500); + ExpenseList expenses = new ExpenseList(); + expenses.addExpense(expense0); + try { + expenses.deleteExpense(-5); + } catch (Exception e) { + assertEquals("The number is too big", e.getMessage(), "Delete expense with negative integer is not captured"); + } + } +} \ No newline at end of file diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java new file mode 100644 index 0000000000..bfa6e0ba91 --- /dev/null +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -0,0 +1,43 @@ +package chching.command; + +import chching.record.IncomeList; +import chching.record.Income; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class DeleteIncomeCommandTest { + + @Test + void addDeleteIncome_positiveIntegerWithinSize_Success(){ + Income income0 = new Income("salary","1st apr 2023",5000); + IncomeList incomes = new IncomeList(); + incomes.addIncome(income0); + incomes.deleteIncome(0); + assertEquals(0,incomes.size(),"Delete income working"); + + } + + @Test + void addDeleteIncome_positiveIntegerOutsideSize_Fail() { + Income income0 = new Income("salary", "1st apr 2023", 5000); + IncomeList incomes = new IncomeList(); + incomes.addIncome(income0); + try { + incomes.deleteIncome(3); + } catch (Exception e) { + assertEquals("The number is too big", e.getMessage(), "Delete income with integer outside size is not captured"); + } + } + + void addDeleteIncome_NegativeInteger_Fail() { + Income income0 = new Income("salary", "1st apr 2023", 5000); + IncomeList incomes = new IncomeList(); + incomes.addIncome(income0); + try { + incomes.deleteIncome(-5); + } catch (Exception e) { + assertEquals("Negative index", e.getMessage(), "Delete income with negative integer is not captured"); + } + } +} \ No newline at end of file diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java new file mode 100644 index 0000000000..c2d66f3f2b --- /dev/null +++ b/src/test/java/chching/record/IncomeListTest.java @@ -0,0 +1,14 @@ +package chching.record; + +import static org.junit.jupiter.api.Assertions.*; + +class IncomeListTest { + void getExpenseCount_one_expectOne() { + + Income income0 = new Income("salary", "1st apr 2023", 1000000); + IncomeList list = new IncomeList(); + list.addRecord(income0); + assertEquals(1, list.getRecordCount()); + } + +} \ No newline at end of file diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java new file mode 100644 index 0000000000..1ae3bb1c16 --- /dev/null +++ b/src/test/java/chching/record/IncomeTest.java @@ -0,0 +1,37 @@ +package chching.record; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class IncomeTest { + + @Test + void getIncomeDescription_expected() { + String test = "salary"; + Income income0 = new Income("salary", "1st apr 2023", 1000000); + assertEquals("salary", income0.getDescription()); + } + + @Test + void getIncomeDate_expected() { + String test = "1st apr 2023"; + Income income0 = new Income("salary", "1st apr 2023", 1000000); + assertEquals("1st apr 2023", income0.getDate()); + } + + @Test + void getIncomeValue_expected() { + float test = (float) 1000000; + Income income0 = new Income("salary", "1st apr 2023", 1000000); + assertEquals((float) 1000000, income0.getValue()); + } + + @Test + void getValue_expected() { + Income income0 = new Income("salary", "1st apr 2023", 1000000); + String expected = "Description - salary | Date - 1st apr 2023 | Value - 1000000"; + assertEquals(expected, income0.toString()); + } + +} \ No newline at end of file From a48d5377c41347c062304c292c9a7dfbd168114d Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 15:50:33 +0800 Subject: [PATCH 098/364] Fixed code cosmetics to pass gradle check Updated JUnit Testing in DeleteExpenseCommand and DeleteIncomeCommand classes --- .../chching/command/BalanceCommandTest.java | 10 ++-- .../command/DeleteExpenseCommandTest.java | 54 +++++++++++-------- .../command/DeleteIncomeCommandTest.java | 54 +++++++++++-------- .../java/chching/record/IncomeListTest.java | 7 ++- src/test/java/chching/record/IncomeTest.java | 7 +-- 5 files changed, 81 insertions(+), 51 deletions(-) diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 5898697ad2..cf44b738c3 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -4,11 +4,14 @@ import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.*; class BalanceCommandTest { - void addDeleteIncome_positiveIntegerWithinSize_Success() { + @Test + void addDeleteIncome_positiveIntegerWithinSize_success() { Income income0 = new Income("salary", "1st apr 2023", 5000); IncomeList incomes = new IncomeList(); incomes.addIncome(income0); @@ -18,5 +21,4 @@ void addDeleteIncome_positiveIntegerWithinSize_Success() { double balance = incomes.getBalance() - expenses.getBalance(); assertEquals(4500, balance, "Balance calculation is right"); } - -} \ No newline at end of file +} diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 69da2a42a0..e0938e18d0 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -2,43 +2,55 @@ import chching.record.Expense; import chching.record.ExpenseList; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + class DeleteExpenseCommandTest { + private Expense spending; + private Expense groceries; + private ExpenseList defaultExpenseList; + + @BeforeEach + void setup() { + spending = new Expense("entertainment", "movie", "02/10/23", 10.50); + groceries = new Expense("groceries","too much groceries","1st apr 2023",500); + + + ArrayList expenseList = new ArrayList(); + expenseList.add(spending); + expenseList.add(groceries); + defaultExpenseList = new ExpenseList(expenseList); + } @Test - void addDeleteIncome_positiveIntegerWithinSize_Success(){ - Expense expense0 = new Expense("groceries","too much groceries","1st apr 2023",500); - ExpenseList expenses = new ExpenseList(); - expenses.addExpense(expense0); - expenses.deleteExpense(0); - assertEquals(0,expenses.size(),"Delete expense working"); - + void deleteExpense_positiveIntegerWithinSize_success(){ + int defaultExpenseListSize = defaultExpenseList.size(); + defaultExpenseList.deleteExpense(1); + assertEquals(defaultExpenseListSize - 1,defaultExpenseList.size(),"Delete expense working"); } @Test - void addDeleteIncome_positiveIntegerOutsideSize_Fail() { - Expense expense0 = new Expense("salary", "too much groceries","1st apr 2023", 500); - ExpenseList expenses = new ExpenseList(); - expenses.addExpense(expense0); + void deleteExpense_positiveIntegerOutsideSize_fail() { + String expectedOutput = "There is no expense with this index"; try { - expenses.deleteExpense(3); + defaultExpenseList.deleteExpense(3); } catch (Exception e) { - assertEquals("The number is too big", e.getMessage(), "Delete expense with integer outside size is not captured"); + assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); } } @Test - void addDeleteIncome_negativeInteger_Fail() { - Expense expense0 = new Expense("salary", "too much groceries","1st apr 2023", 500); - ExpenseList expenses = new ExpenseList(); - expenses.addExpense(expense0); + void deleteExpense_negativeInteger_fail() { + String expectedOutput = "There is no expense with this index"; try { - expenses.deleteExpense(-5); + defaultExpenseList.deleteExpense(-5); } catch (Exception e) { - assertEquals("The number is too big", e.getMessage(), "Delete expense with negative integer is not captured"); + assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); } } -} \ No newline at end of file +} diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index bfa6e0ba91..39d78d2aa2 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -2,42 +2,54 @@ import chching.record.IncomeList; import chching.record.Income; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + class DeleteIncomeCommandTest { + private Income salary; + private Income bonus; + private IncomeList defaultIncomeList; + + @BeforeEach + void setup() { + salary = new Income("salary","1st apr 2023",5000); + bonus = new Income("bonus", "5/2/23", 3000); + + ArrayList incomeList = new ArrayList(); + incomeList.add(salary); + incomeList.add(bonus); + defaultIncomeList = new IncomeList(incomeList); + } @Test - void addDeleteIncome_positiveIntegerWithinSize_Success(){ - Income income0 = new Income("salary","1st apr 2023",5000); - IncomeList incomes = new IncomeList(); - incomes.addIncome(income0); - incomes.deleteIncome(0); - assertEquals(0,incomes.size(),"Delete income working"); - + void deleteIncome_positiveIntegerWithinSize_success(){ + int defaultIncomeListSize = defaultIncomeList.size(); + defaultIncomeList.deleteIncome(1); + assertEquals(defaultIncomeListSize - 1, defaultIncomeList.size(),"Delete income working"); } @Test - void addDeleteIncome_positiveIntegerOutsideSize_Fail() { - Income income0 = new Income("salary", "1st apr 2023", 5000); - IncomeList incomes = new IncomeList(); - incomes.addIncome(income0); + void deleteIncome_positiveIntegerOutsideSize_fail() { + String expectedOutput = "There is no income with this index"; try { - incomes.deleteIncome(3); + defaultIncomeList.deleteIncome(3); } catch (Exception e) { - assertEquals("The number is too big", e.getMessage(), "Delete income with integer outside size is not captured"); + assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); } } - void addDeleteIncome_NegativeInteger_Fail() { - Income income0 = new Income("salary", "1st apr 2023", 5000); - IncomeList incomes = new IncomeList(); - incomes.addIncome(income0); + @Test + void deleteIncome_negativeInteger_fail() { + String expectedOutput = "There is no income with this index"; try { - incomes.deleteIncome(-5); + defaultIncomeList.deleteIncome(-5); } catch (Exception e) { - assertEquals("Negative index", e.getMessage(), "Delete income with negative integer is not captured"); + assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); } } -} \ No newline at end of file +} diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index c2d66f3f2b..b117092053 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -1,8 +1,11 @@ package chching.record; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; class IncomeListTest { + @Test void getExpenseCount_one_expectOne() { Income income0 = new Income("salary", "1st apr 2023", 1000000); @@ -11,4 +14,4 @@ void getExpenseCount_one_expectOne() { assertEquals(1, list.getRecordCount()); } -} \ No newline at end of file +} diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 1ae3bb1c16..76bcec5d9c 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -2,7 +2,8 @@ import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + class IncomeTest { @@ -30,8 +31,8 @@ void getIncomeValue_expected() { @Test void getValue_expected() { Income income0 = new Income("salary", "1st apr 2023", 1000000); - String expected = "Description - salary | Date - 1st apr 2023 | Value - 1000000"; + String expected = "Description - salary | Date - 1st apr 2023 | Value - 1000000.00"; assertEquals(expected, income0.toString()); } -} \ No newline at end of file +} From 6e01d36fedddaf46326f1079eb0d883f48f5a311 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 16:12:23 +0800 Subject: [PATCH 099/364] update JUnit testing in BalanceCommandTest class --- .../java/chching/command/BalanceCommand.java | 7 ++- .../chching/command/BalanceCommandTest.java | 46 +++++++++++++++---- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index e61e5a458e..40c9265ed2 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -6,6 +6,11 @@ import chching.record.IncomeList; public class BalanceCommand extends Command { + private double balance; + + public String showBalance() { + return String.format("%.02f", balance); + } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { double totalIncome = 0; @@ -16,7 +21,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto for(int i = 0; i < expenses.size(); i++) { totalExpense += expenses.get(i).getValue(); } - double balance = totalIncome - totalExpense; + balance = totalIncome - totalExpense; assert balance <= totalIncome : "Wrong calculations"; ui.showBalance(totalExpense, totalIncome, balance); diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index cf44b738c3..02802fd323 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -1,24 +1,50 @@ package chching.command; +import chching.Storage; +import chching.Ui; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; - +import static org.junit.jupiter.api.Assertions.fail; class BalanceCommandTest { + private Ui ui; + private Storage storage; + private Income salary; + private Expense groceries; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + + @BeforeEach + void setup() { + ui = new Ui(); + + salary = new Income("salary", "1st apr 2023", 5000); + groceries = new Expense("groceries", "too much groceries", "1st apr 2023", 500); + + ArrayList incomeList = new ArrayList(); + incomeList.add(salary); + defaultIncomeList = new IncomeList(incomeList); + + ArrayList expenseList = new ArrayList(); + expenseList.add(groceries); + defaultExpenseList = new ExpenseList(expenseList); + } @Test - void addDeleteIncome_positiveIntegerWithinSize_success() { - Income income0 = new Income("salary", "1st apr 2023", 5000); - IncomeList incomes = new IncomeList(); - incomes.addIncome(income0); - Expense expense0 = new Expense("salary", "too much groceries", "1st apr 2023", 500); - ExpenseList expenses = new ExpenseList(); - expenses.addExpense(expense0); - double balance = incomes.getBalance() - expenses.getBalance(); - assertEquals(4500, balance, "Balance calculation is right"); + void execute_normalScenario_success() { + String expectedOutput = "4500.00"; + Command command = new BalanceCommand(); + try { + command.execute(defaultIncomeList, defaultExpenseList, ui, storage); + assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); + } catch (Exception e) { + fail(); + } } } From 47d76909a7ba576a575430e50b92e9b9378c1e66 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 18:08:35 +0800 Subject: [PATCH 100/364] Fixed delete expense command in DeleteExpenseCommand class --- .../java/chching/command/DeleteExpenseCommand.java | 6 +++--- .../java/chching/command/DeleteIncomeCommand.java | 10 ++++------ src/main/java/chching/parser/Expenses.java | 14 ++++++++++++++ src/main/java/chching/parser/Parser.java | 11 ++++++----- src/test/java/chching/ParserTest.java | 4 ++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index b540f7091e..47134bfea2 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -13,10 +13,10 @@ public DeleteExpenseCommand(int index) { } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if(index <0){ - throw new ChChingException("Negative index"); + if(index <= 0){ + throw new ChChingException("Negative/Zero index"); } - else if(index >= incomes.size()){ + else if(index > incomes.size()){ throw new ChChingException("The number is too big"); } expenses.deleteExpense(index); diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index c89b357dbd..7c5d3874e0 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -9,23 +9,21 @@ public class DeleteIncomeCommand extends Command { - private final int index; + private int index; public DeleteIncomeCommand(int index) { this.index = index; } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if(index <0){ - throw new ChChingException("Negative index"); + if(index <= 0){ + throw new ChChingException("Negative/Zero index"); } - else if(index >= incomes.size()){ + else if(index > incomes.size()){ throw new ChChingException("The number is too big"); } incomes.deleteIncome(index); System.out.println("Income deleted, here is the updated list:"); incomes.printIncomeList(); } - } - diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index a087adb97a..d3357aa9f2 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -1,5 +1,6 @@ package chching.parser; +import chching.ChChingException; import chching.record.Expense; import java.util.HashMap; @@ -19,4 +20,17 @@ public static Expense parseExpense(HashMap argumentsByField) { } return exp; } + + public static int getIndex(HashMap argumentsByField) throws ChChingException { + int index = -1; + try { + String indexString = argumentsByField.get("no"); + index = Integer.parseInt(indexString); + } catch (NumberFormatException e) { + throw new ChChingException("Index needs to be an integer"); + } catch (NullPointerException e) { + throw new ChChingException("Index not found"); + } + return index; + } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 8688bd347f..4ce538f0ad 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -29,7 +29,7 @@ public class Parser { public static final String FIELD_DEMARCATION = " /"; - public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList, Ui ui) { + public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList, Ui ui) throws ChChingException { List lineParts = splitLine(line); String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); @@ -58,7 +58,8 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); break; case "delete expense": - command = new DeleteExpenseCommand(Integer.parseInt(argumentsByField.get("no"))); + int index = Expenses.getIndex(argumentsByField); + command = new DeleteExpenseCommand(index); break; case "balance": command = new BalanceCommand(); @@ -84,7 +85,7 @@ public static ArrayList splitLine(String line) { return lineParts; } - public static HashMap sortArguments(List arguments) { + public static HashMap sortArguments(List arguments) throws ChChingException { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); @@ -97,8 +98,8 @@ public static HashMap sortArguments(List arguments) { String field = fieldAndValue[0].trim(); String value = fieldAndValue[1].trim(); argumentsByField.put(field, value); - } catch (NullPointerException e) { - System.out.println("Error: arguments not inputted correctly/missing a value"); + } catch (Exception e) { + throw new ChChingException("arguments not inputted correctly or missing a value"); } } return argumentsByField; diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index c449d2dc81..d6456100d2 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -34,7 +34,7 @@ public void splitLine_testScenario_expectedBehaviour() { } @Test - public void sortArguments_testScenario_expectedBehaviour() { + public void sortArguments_testScenario_expectedBehaviour() throws ChChingException { List input = new ArrayList(); input.add("ca meal"); input.add("de breakfast"); @@ -51,7 +51,7 @@ public void sortArguments_testScenario_expectedBehaviour() { } @Test - public void sortArguments_emptyInput_returnsEmptyHashMap() { + public void sortArguments_emptyInput_returnsEmptyHashMap() throws ChChingException { List input = new ArrayList(); HashMap expectedOutput = new HashMap(); From 223b39a452460ea478a72768e2fa3792ccc5d633 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 18:16:55 +0800 Subject: [PATCH 101/364] Fixed delete income command in DeleteIncomeCommand class --- data/chching.txt | 2 -- .../java/chching/command/DeleteExpenseCommand.java | 4 ++-- .../java/chching/command/DeleteIncomeCommand.java | 2 +- src/main/java/chching/parser/Incomes.java | 14 ++++++++++++++ src/main/java/chching/parser/Parser.java | 6 ++++-- .../chching/command/DeleteExpenseCommandTest.java | 4 ++-- .../chching/command/DeleteIncomeCommandTest.java | 4 ++-- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index 2c049307ec..e69de29bb2 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1,2 +0,0 @@ -I | monthly | today | 100.00 -E | meal | lunch | today | 3.50 diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 47134bfea2..0c998496c1 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -13,10 +13,10 @@ public DeleteExpenseCommand(int index) { } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if(index <= 0){ + if(index <= 0) { throw new ChChingException("Negative/Zero index"); } - else if(index > incomes.size()){ + else if(index > incomes.size()) { throw new ChChingException("The number is too big"); } expenses.deleteExpense(index); diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index 7c5d3874e0..bde709fba2 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -19,7 +19,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto if(index <= 0){ throw new ChChingException("Negative/Zero index"); } - else if(index > incomes.size()){ + else if(index > incomes.size()) { throw new ChChingException("The number is too big"); } incomes.deleteIncome(index); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 460dc2f384..5e7ccd9298 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -1,5 +1,6 @@ package chching.parser; +import chching.ChChingException; import chching.record.Income; import java.util.HashMap; @@ -19,4 +20,17 @@ public static Income parseIncome(HashMap argumentsByField) { } return inc; } + + public static int getIndex(HashMap argumentsByField) throws ChChingException { + int index = -1; + try { + String indexString = argumentsByField.get("no"); + index = Integer.parseInt(indexString); + } catch (NumberFormatException e) { + throw new ChChingException("Index needs to be an integer"); + } catch (NullPointerException e) { + throw new ChChingException("Index not found"); + } + return index; + } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 4ce538f0ad..c012fd0d47 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -35,6 +35,7 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); Command command = new InvalidCommand(); + int index; try { switch (instruction) { case "add income": @@ -55,10 +56,11 @@ public static Command parse(String line, IncomeList incomeList, ExpenseList expe command = new ListCommand(); break; case "delete income": - command = new DeleteIncomeCommand(Integer.parseInt(argumentsByField.get("no"))); + index = Incomes.getIndex(argumentsByField); + command = new DeleteIncomeCommand(index); break; case "delete expense": - int index = Expenses.getIndex(argumentsByField); + index = Expenses.getIndex(argumentsByField); command = new DeleteExpenseCommand(index); break; case "balance": diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index e0938e18d0..5dace62a15 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -36,7 +36,7 @@ void deleteExpense_positiveIntegerWithinSize_success(){ @Test void deleteExpense_positiveIntegerOutsideSize_fail() { - String expectedOutput = "There is no expense with this index"; + String expectedOutput = "The number is too big"; try { defaultExpenseList.deleteExpense(3); } catch (Exception e) { @@ -46,7 +46,7 @@ void deleteExpense_positiveIntegerOutsideSize_fail() { @Test void deleteExpense_negativeInteger_fail() { - String expectedOutput = "There is no expense with this index"; + String expectedOutput = "Negative/Zero index"; try { defaultExpenseList.deleteExpense(-5); } catch (Exception e) { diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 39d78d2aa2..e28336fe52 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -35,7 +35,7 @@ void deleteIncome_positiveIntegerWithinSize_success(){ @Test void deleteIncome_positiveIntegerOutsideSize_fail() { - String expectedOutput = "There is no income with this index"; + String expectedOutput = "The number is too big"; try { defaultIncomeList.deleteIncome(3); } catch (Exception e) { @@ -45,7 +45,7 @@ void deleteIncome_positiveIntegerOutsideSize_fail() { @Test void deleteIncome_negativeInteger_fail() { - String expectedOutput = "There is no income with this index"; + String expectedOutput = "Negative/Zero index"; try { defaultIncomeList.deleteIncome(-5); } catch (Exception e) { From 7cbe86e74ab9e89806d5c67aa31c2f870e10bbe3 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 18:26:34 +0800 Subject: [PATCH 102/364] Update JUnit Testing in DeleteIncomeCommandTest class --- .../command/DeleteIncomeCommandTest.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index e28336fe52..ba3356c71e 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -1,5 +1,8 @@ package chching.command; +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Income; import org.junit.jupiter.api.BeforeEach; @@ -8,11 +11,15 @@ import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; class DeleteIncomeCommandTest { + private Ui ui; + private Storage storage; private Income salary; private Income bonus; + private ExpenseList emptyExpenseList; private IncomeList defaultIncomeList; @BeforeEach @@ -27,17 +34,23 @@ void setup() { } @Test - void deleteIncome_positiveIntegerWithinSize_success(){ + void deleteIncome_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); - defaultIncomeList.deleteIncome(1); - assertEquals(defaultIncomeListSize - 1, defaultIncomeList.size(),"Delete income working"); + Command command = new DeleteIncomeCommand(1); + try { + command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + assertEquals(defaultIncomeListSize - 1, defaultIncomeList.size(), "Delete income working"); + } catch (Exception e) { + fail(); // test should not reach here + } } @Test void deleteIncome_positiveIntegerOutsideSize_fail() { String expectedOutput = "The number is too big"; + Command command = new DeleteExpenseCommand(5); try { - defaultIncomeList.deleteIncome(3); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); } @@ -46,8 +59,9 @@ void deleteIncome_positiveIntegerOutsideSize_fail() { @Test void deleteIncome_negativeInteger_fail() { String expectedOutput = "Negative/Zero index"; + Command command = new DeleteExpenseCommand(-1); try { - defaultIncomeList.deleteIncome(-5); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); } From 32f45cc6ed1925f074d1900e61235c6b2565058a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 18:47:17 +0800 Subject: [PATCH 103/364] Update JUnit testing in DeleteExpenseCommandTest class --- .../chching/command/DeleteExpenseCommand.java | 2 +- .../command/DeleteExpenseCommandTest.java | 30 ++++++++++++++----- .../command/DeleteIncomeCommandTest.java | 4 +-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 0c998496c1..5ae54a4204 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -16,7 +16,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto if(index <= 0) { throw new ChChingException("Negative/Zero index"); } - else if(index > incomes.size()) { + else if(index > expenses.size()) { throw new ChChingException("The number is too big"); } expenses.deleteExpense(index); diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 5dace62a15..42af999756 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -1,22 +1,30 @@ package chching.command; +import chching.Storage; +import chching.Ui; import chching.record.Expense; import chching.record.ExpenseList; +import chching.record.IncomeList; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; class DeleteExpenseCommandTest { + private Ui ui; + private Storage storage; private Expense spending; private Expense groceries; private ExpenseList defaultExpenseList; + private IncomeList emptyIncomeList; @BeforeEach void setup() { + ui = new Ui(); spending = new Expense("entertainment", "movie", "02/10/23", 10.50); groceries = new Expense("groceries","too much groceries","1st apr 2023",500); @@ -28,27 +36,35 @@ void setup() { } @Test - void deleteExpense_positiveIntegerWithinSize_success(){ + void execute_positiveIntegerWithinSize_success(){ int defaultExpenseListSize = defaultExpenseList.size(); - defaultExpenseList.deleteExpense(1); - assertEquals(defaultExpenseListSize - 1,defaultExpenseList.size(),"Delete expense working"); + Command command = new DeleteExpenseCommand(1); + try { + command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + assertEquals(defaultExpenseListSize - 1, defaultExpenseList.size(), "Delete expense working"); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); + } } @Test - void deleteExpense_positiveIntegerOutsideSize_fail() { + void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; + Command command = new DeleteExpenseCommand(5); try { - defaultExpenseList.deleteExpense(3); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); } } @Test - void deleteExpense_negativeInteger_fail() { + void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; + Command command = new DeleteExpenseCommand(-1); try { - defaultExpenseList.deleteExpense(-5); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); } diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index ba3356c71e..87c8aecdda 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -46,7 +46,7 @@ void deleteIncome_positiveIntegerWithinSize_success() { } @Test - void deleteIncome_positiveIntegerOutsideSize_fail() { + void deleteIncome_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteExpenseCommand(5); try { @@ -57,7 +57,7 @@ void deleteIncome_positiveIntegerOutsideSize_fail() { } @Test - void deleteIncome_negativeInteger_fail() { + void deleteIncome_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteExpenseCommand(-1); try { From 36ce632e564a34210a09f2cf628064ef5161a70b Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 18:55:07 +0800 Subject: [PATCH 104/364] Fix coding standard violations --- src/main/java/chching/command/DeleteExpenseCommand.java | 5 ++--- src/main/java/chching/command/DeleteIncomeCommand.java | 5 ++--- src/main/java/chching/parser/Parser.java | 7 ++++++- src/test/java/chching/command/DeleteIncomeCommandTest.java | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 5ae54a4204..4335b98845 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -13,10 +13,9 @@ public DeleteExpenseCommand(int index) { } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if(index <= 0) { + if (index <= 0) { throw new ChChingException("Negative/Zero index"); - } - else if(index > expenses.size()) { + } else if (index > expenses.size()) { throw new ChChingException("The number is too big"); } expenses.deleteExpense(index); diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index bde709fba2..8e0119adf7 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -16,10 +16,9 @@ public DeleteIncomeCommand(int index) { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if(index <= 0){ + if (index <= 0){ throw new ChChingException("Negative/Zero index"); - } - else if(index > incomes.size()) { + } else if (index > incomes.size()) { throw new ChChingException("The number is too big"); } incomes.deleteIncome(index); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index c012fd0d47..d31b1de75f 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -29,7 +29,12 @@ public class Parser { public static final String FIELD_DEMARCATION = " /"; - public static Command parse(String line, IncomeList incomeList, ExpenseList expenseList, Ui ui) throws ChChingException { + public static Command parse( + String line, + IncomeList incomeList, + ExpenseList expenseList, + Ui ui + ) throws ChChingException { List lineParts = splitLine(line); String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 87c8aecdda..5484f9fcdd 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -48,7 +48,7 @@ void deleteIncome_positiveIntegerWithinSize_success() { @Test void deleteIncome_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; - Command command = new DeleteExpenseCommand(5); + Command command = new DeleteIncomeCommand(5); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); } catch (Exception e) { @@ -59,7 +59,7 @@ void deleteIncome_positiveIntegerOutsideSize_exceptionThrown() { @Test void deleteIncome_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; - Command command = new DeleteExpenseCommand(-1); + Command command = new DeleteIncomeCommand(-1); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); } catch (Exception e) { From 5aa7c6ad8e52d52346f9f286aad9904c0e2b4b29 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 15 Mar 2023 19:21:37 +0800 Subject: [PATCH 105/364] Update JUnit method names to match coding standards --- data/chching.txt | 0 .../command/AddExpenseCommandTest.java | 30 +++++++++++-------- .../chching/command/AddIncomeCommandTest.java | 15 ++++++---- .../chching/command/BalanceCommandTest.java | 2 +- .../command/DeleteExpenseCommandTest.java | 5 ++-- .../command/DeleteIncomeCommandTest.java | 8 +++-- 6 files changed, 37 insertions(+), 23 deletions(-) delete mode 100644 data/chching.txt diff --git a/data/chching.txt b/data/chching.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 78233610cd..90820d36ea 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -8,67 +8,73 @@ public class AddExpenseCommandTest { @Test - void addExpenseCommand_nullExpense_exceptionThrown() { + void execute_nullExpense_exceptionThrown() { + String expectedOutput = "No fields found"; try { new AddExpenseCommand(null); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("No fields found", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test - void addExpenseCommand_missingCategoryField_exceptionThrown() { + void execute_missingCategoryField_exceptionThrown() { + String expectedOutput = "Missing category field"; Expense input = new Expense(null, "public transport", "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing category field", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test - void addExpenseCommand_missingDescriptionField_exceptionThrown() { + void execute_missingDescriptionField_exceptionThrown() { + String expectedOutput = "Missing description field"; Expense input = new Expense("transport", null, "1st apr 2023", (float) 1.50); try { new AddExpenseCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing description field", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test - void addExpenseCommand_missingDateField_exceptionThrown() { + void execute_missingDateField_exceptionThrown() { + String expectedOutput = "Missing date field"; Expense input = new Expense("transport", "public transport", null, (float) 1.50); try { new AddExpenseCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing date field", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test - void addExpenseCommand_zeroValueField_exceptionThrown() { + void execute_zeroValueField_exceptionThrown() { + String expectedOutput = "Invalid/Missing expense value"; Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) 0); try { new AddExpenseCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Invalid/Missing expense value", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test - void addExpenseCommand_negativeValueField_exceptionThrown() { + void execute_negativeValueField_exceptionThrown() { + String expectedOutput = "Invalid/Missing expense value"; Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) -1.50); try { new AddExpenseCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Invalid/Missing expense value", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } } diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 5ed1a98e0c..904067b217 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -9,55 +9,60 @@ public class AddIncomeCommandTest { @Test void addIncomeCommand_nullExpense_exceptionThrown() { + String expectedOutput = "No fields found"; try { new AddIncomeCommand(null); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("No fields found", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test void addIncomeCommand_missingDescriptionField_exceptionThrown() { + String expectedOutput = "Missing description field"; Income input = new Income(null, "1st apr 2023", (float) 500); try { new AddIncomeCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing description field", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test void addIncomeCommand_missingDateField_exceptionThrown() { + String expectedOutput = "Missing date field"; Income input = new Income("salary", null, (float) 500); try { new AddIncomeCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing date field", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test void addIncomeCommand_zeroValueField_exceptionThrown() { + String expectedOutput = "Invalid/Missing income value"; Income input = new Income("salary", "1st apr 2023", (float) 0); try { new AddIncomeCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Invalid/Missing income value", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } @Test void addIncomeCommand_negativeValueField_exceptionThrown() { + String expectedOutput = "Invalid/Missing income value"; Income input = new Income("salary", "1st apr 2023", (float) -500); try { new AddIncomeCommand(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Invalid/Missing income value", e.getMessage()); + assertEquals(expectedOutput, e.getMessage()); } } } diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 02802fd323..ffa170c0cb 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -44,7 +44,7 @@ void execute_normalScenario_success() { command.execute(defaultIncomeList, defaultExpenseList, ui, storage); assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); } catch (Exception e) { - fail(); + fail(); // test should not reach this line } } } diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 42af999756..373ae83f06 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -43,8 +43,7 @@ void execute_positiveIntegerWithinSize_success(){ command.execute(emptyIncomeList, defaultExpenseList, ui, storage); assertEquals(defaultExpenseListSize - 1, defaultExpenseList.size(), "Delete expense working"); } catch (Exception e) { - System.out.println(e.getMessage()); - fail(); + fail(); // test should not reach this line } } @@ -54,6 +53,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { Command command = new DeleteExpenseCommand(5); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); } @@ -65,6 +65,7 @@ void execute_negativeInteger_exceptionThrown() { Command command = new DeleteExpenseCommand(-1); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); } diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 5484f9fcdd..e9c9839903 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -34,7 +34,7 @@ void setup() { } @Test - void deleteIncome_positiveIntegerWithinSize_success() { + void execute_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); Command command = new DeleteIncomeCommand(1); try { @@ -46,22 +46,24 @@ void deleteIncome_positiveIntegerWithinSize_success() { } @Test - void deleteIncome_positiveIntegerOutsideSize_exceptionThrown() { + void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteIncomeCommand(5); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); } } @Test - void deleteIncome_negativeInteger_exceptionThrown() { + void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteIncomeCommand(-1); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); } From 5740546081e5e2d45b6a29421c1a2bb6b5bf66b6 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:01:31 +0800 Subject: [PATCH 106/364] update user guide --- data/chching.txt | 0 docs/UserGuide.md | 111 +++++++++++++++++++++++++--------- src/main/java/chching/Ui.java | 4 +- 3 files changed, 84 insertions(+), 31 deletions(-) create mode 100644 data/chching.txt diff --git a/data/chching.txt b/data/chching.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/UserGuide.md b/docs/UserGuide.md index abd9fbe891..828e470ddf 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,41 +2,94 @@ ## Introduction -{Give a product intro} +ChChing is a desktop app for tracking spending, and it uses a Command Line Interface (CLI) for managing finances. If you are someone who needs a simple interface to get a better hold of your finances, this app is for you! ## Quick Start -{Give steps to get started quickly} - 1. Ensure that you have Java 11 or above installed. -1. Down the latest version of `Duke` from [here](http://link.to/duke). - -## Features - -{Give detailed description of each feature} - -### Adding a todo: `todo` -Adds a new item to the list of todo items. - -Format: `todo n/TODO_NAME d/DEADLINE` - -* The `DEADLINE` can be in a natural language format. -* The `TODO_NAME` cannot contain punctuation. - -Example of usage: - -`todo n/Write the rest of the User Guide d/next week` - -`todo n/Refactor the User Guide to remove passive voice d/13/04/2020` - -## FAQ - -**Q**: How do I transfer my data to another computer? - -**A**: {your answer here} +2. Down the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). +3. Copy downloaded `ChChing.jar` file to the desired home folder of choice. +4. Open a command terminal and `cd` into the folder mentioned in step 3. +5. Type in the following to run the application: +``` +java -jar ChChing.jar +``` +6. If successful, the following greeting should appear: +``` + ____________________________________________________________ + Hello! I'm ChChing. + What can I do for you? + ____________________________________________________________ +``` +7. Type in desired command to start using the program! List of commands are listed below + +## Features + +### Adding an entry: `add` +Creates a new entry for expenses or income, with respective input formats. + +Format: +
`add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` +
`add income /de DESCRIPTION /da DATE /v VALUE` + +Use case: +* Re-prompts user if any field is not provided properly. +* VALUE will be stored as a positive float. + +Example of usage: +
`add expense /c meal /de breakfast @Technoedge /da 01/02/23 /v 3.50` +
`add income /c salary /de salary /da 01/01/23 /v 500` + +### Listing all expenses and incomes: `list` +Shows a full list of both the expenses and incomes created by the user. Includes the index number, category, description, and value. +
Can view list of expenses/incomes separately as well. + +Format: +
`list` +
`list expense` +
`list income` + +### Deleting an entry: `delete` +Remove an entry from the expense/income list. + +Format: +
`delete expense /in INDEX` +
`delete income /in INDEX` + +Use case: +* INDEX is a positive integer. +* Prompts user if index is out of bounds. + +Example of usage: +
`delete expense /in 1` +
`delete income /in 2` + +### Finding balance of finances: `balance` +Shows users the balance after calculating the difference between income and expenses + +Format: +
`balance` + +### View help: `help` +Shows basic commands executable by the program and the use format for the commands + +Format: +
`help` + +### Saving and loading of data +Record entries are saved in `data/chching.txt` file. This file is updated upon exit. +When reading from the file, entries for income and expenses are stored in their respective arrayList. ## Command Summary {Give a 'cheat sheet' of commands here} -* Add todo `todo n/TODO_NAME d/DEADLINE` +* Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` +* Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` +* List Records: `list` +* List Expenses: `list expense` +* List Incomes: `list income` +* Delete Expense: `delete expense /in INDEX` +* Delete Income: `delete income /in INDEX` +* Show Balance: `balance` +* Show help: `help` diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index a174b8ef73..dfad05ea9a 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -74,8 +74,8 @@ public static void showHelp() { System.out.println(" list"); System.out.println(); System.out.println(" DELETE RECORDS:"); - System.out.println(" delete expense "); - System.out.println(" delete income "); + System.out.println(" delete expense /in "); + System.out.println(" delete income /in "); System.out.println(); System.out.println(" SHOW BALANCE:"); System.out.println(" balance"); From 15ab600ec945cb227a7e346958b4a97cbfd7d4a8 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:02:50 +0800 Subject: [PATCH 107/364] Changed delete command to parse /in --- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index d3357aa9f2..f3cff25078 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -24,7 +24,7 @@ public static Expense parseExpense(HashMap argumentsByField) { public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; try { - String indexString = argumentsByField.get("no"); + String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (NumberFormatException e) { throw new ChChingException("Index needs to be an integer"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 5e7ccd9298..558da085e6 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -24,7 +24,7 @@ public static Income parseIncome(HashMap argumentsByField) { public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; try { - String indexString = argumentsByField.get("no"); + String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (NumberFormatException e) { throw new ChChingException("Index needs to be an integer"); From 53eaafabac75c2f9ff459a7cf38af5651a5dfe11 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:05:16 +0800 Subject: [PATCH 108/364] edit AddExpenseCommand to use ui to print --- src/main/java/chching/command/AddExpenseCommand.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index 4f67adc3bd..e2452c1b99 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -27,7 +27,6 @@ public AddExpenseCommand(Expense expense) throws ChChingException { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { expenses.addExpense(expense); - System.out.println("Expense added:"); - System.out.println(expense.toString()); + ui.showAdded(incomes, expenses, expense); } } From 7e871793919ea36c29bc5cc2c23bc8953946605b Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:08:42 +0800 Subject: [PATCH 109/364] cleanup unused code --- src/test/java/chching/CommandTest.java | 39 -------------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/test/java/chching/CommandTest.java diff --git a/src/test/java/chching/CommandTest.java b/src/test/java/chching/CommandTest.java deleted file mode 100644 index f5926e08a6..0000000000 --- a/src/test/java/chching/CommandTest.java +++ /dev/null @@ -1,39 +0,0 @@ -// package chching; - -// import org.junit.jupiter.api.BeforeEach; -// import org.junit.jupiter.api.Test; - -// import chching.command.BalanceCommand; -// import chching.record.Expense; -// import chching.record.ExpenseList; -// import chching.record.Income; -// import chching.record.IncomeList; - -// import java.io.ByteArrayOutputStream; -// import java.io.PrintStream; - -// import static org.junit.jupiter.api.Assertions.assertEquals; - -// public class CommandTest { -// private final PrintStream standardOut = System.out; -// private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - -// @BeforeEach -// public void setUp() { -// System.setOut(new PrintStream(outputStreamCaptor)); -// } - -// @Test -// public void getBalance_expected() { -// Expense expenseOne = new Expense("entertainment", "beach party", "23 may 2023", 50); -// ExpenseList listE = new ExpenseList(); -// listE.addRecord(expenseOne); - -// Income incomeOne = new Income("entertainment", "beach party", "23 may 2023", 50); -// IncomeList listI = new IncomeList(); -// listI.addRecord(incomeOne); - - -// } -// } - From 81f2f5f9e2005a13c7d7f6602e38c3ea026d420a Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:11:25 +0800 Subject: [PATCH 110/364] standardize ui messages output --- src/main/java/chching/Ui.java | 4 +-- src/test/java/chching/ExitTest.java.rej | 36 ------------------------- 2 files changed, 2 insertions(+), 38 deletions(-) delete mode 100644 src/test/java/chching/ExitTest.java.rej diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index dfad05ea9a..f7f371cb6e 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -57,8 +57,8 @@ public void showAllRecords(IncomeList incomes, ExpenseList expenses) { public void showBalance(double totalExpense, double totalIncome, double balance) { assert(totalExpense >= 0); - System.out.println(" totalExpense: " + String.format("%.02f", totalExpense)); - System.out.println(" totalIncome: " + String.format("%.02f", totalIncome)); + System.out.println(" Total Expense: " + String.format("%.02f", totalExpense)); + System.out.println(" Total Income: " + String.format("%.02f", totalIncome)); System.out.println(); System.out.println(" Current balance:"); System.out.println(" SGD " + String.format("%.02f", balance)); diff --git a/src/test/java/chching/ExitTest.java.rej b/src/test/java/chching/ExitTest.java.rej deleted file mode 100644 index e9866b77d7..0000000000 --- a/src/test/java/chching/ExitTest.java.rej +++ /dev/null @@ -1,36 +0,0 @@ -diff a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java (rejected hunks) -@@ -0,0 +1,33 @@ -+package seedu.duke; -+ -+import org.junit.jupiter.api.BeforeEach; -+import org.junit.jupiter.api.Test; -+ -+import java.io.ByteArrayOutputStream; -+import java.io.PrintStream; -+ -+import static org.junit.jupiter.api.Assertions.*; -+ -+class ExitTest { -+ -+ private final PrintStream standardOut = System.out; -+ private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); -+ -+ @BeforeEach -+ public void setUp() { -+ System.setOut(new PrintStream(outputStreamCaptor)); -+ } -+ -+ @Test -+ void ExitUnderTest_bye_expectBye() { -+ System.out.println("Bye!"); -+ -+ assertEquals("Bye!", outputStreamCaptor.toString().trim()); -+ -+ } -+ -+ @BeforeEach -+ public void tearDown() { -+ System.setOut(standardOut); -+ } -+} -\ No newline at end of file From 506bd971ae684dc684d0d9e7fb28534a87aef0a6 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:17:06 +0800 Subject: [PATCH 111/364] standardize print format for list expense and list income --- src/main/java/chching/command/ListExpenseCommand.java | 2 +- src/main/java/chching/command/ListIncomeCommand.java | 2 +- src/main/java/chching/record/ExpenseList.java | 2 +- src/main/java/chching/record/IncomeList.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index 16a8518f89..8040aafd23 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -8,7 +8,7 @@ public class ListExpenseCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { - System.out.println("Expenses:"); + System.out.println(" Expenses:"); expenses.printExpenseList(); } } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index 564cde7517..fa5bda3549 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -8,7 +8,7 @@ public class ListIncomeCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { - System.out.println("Income:"); + System.out.println(" Income:"); incomes.printIncomeList(); } } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 86a2be2f76..cacde1bc1c 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -33,7 +33,7 @@ public void deleteExpense(int i) throws IndexOutOfBoundsException{ public void printExpenseList() { for (int i = 1; i <= expenseList.size(); i++) { Record record = expenseList.get(i - 1); - System.out.println(i + ". " + record.toString()); + System.out.println(" " + i + ". " + record.toString()); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index cfc99ed21b..952245a7c0 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -33,7 +33,7 @@ public void deleteIncome(int i) throws IndexOutOfBoundsException{ public void printIncomeList() { for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); - System.out.println(i + ". " + record.toString()); + System.out.println(" " + i + ". " + record.toString()); } } From 4d13adbac1126f39a4a300222bb7a87f3267db0d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 21:22:12 +0800 Subject: [PATCH 112/364] standardize AboutUs.md --- docs/AboutUs.md | 8 ++++---- docs/team/clement.md | 6 ++++++ src/main/java/chching/command/InvalidCommand.java | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 docs/team/clement.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index c858f5f386..0bb8b35ca3 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,8 +2,8 @@ Display | Name | Github Profile | Portfolio --------|:----------------------:|:-------------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](docs/team/nafisazizir.md) -![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](docs/team/avielcx.md) +![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) +![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/aviel.md) ![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) -![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](docs/team/thomas.md) -![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](https://i.redd.it/oemztncmsib61.png) +![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomas.md) +![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) diff --git a/docs/team/clement.md b/docs/team/clement.md new file mode 100644 index 0000000000..81c821ca96 --- /dev/null +++ b/docs/team/clement.md @@ -0,0 +1,6 @@ +# Clement Hung - Project Portfolio Page + +## Overview + + +### Summary of Contributions \ No newline at end of file diff --git a/src/main/java/chching/command/InvalidCommand.java b/src/main/java/chching/command/InvalidCommand.java index 6099bf396f..90e83af92f 100644 --- a/src/main/java/chching/command/InvalidCommand.java +++ b/src/main/java/chching/command/InvalidCommand.java @@ -6,7 +6,7 @@ import chching.record.IncomeList; /** - * model a class to handle the bye command. inherit from Command class. + * model a class to handle the invalid command. inherit from Command class. */ public class InvalidCommand extends Command { @Override From 25ae032ca3bf16e2e77193028527afe15069da28 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 15 Mar 2023 21:35:21 +0800 Subject: [PATCH 113/364] Remove magic numbers and exception handling --- src/main/java/chching/parser/Expenses.java | 4 +- src/main/java/chching/parser/Incomes.java | 4 +- src/test/java/chching/CommandTest.java | 39 ------------------- src/test/java/chching/ExitTest.java | 3 +- src/test/java/chching/ExitTest.java.rej | 36 ----------------- src/test/java/chching/ParserTest.java | 23 ++++++----- .../command/AddExpenseCommandTest.java | 23 ++++++++--- .../chching/command/AddIncomeCommandTest.java | 15 +++++-- .../chching/command/BalanceCommandTest.java | 15 ++++++- .../command/DeleteExpenseCommandTest.java | 28 ++++++++++--- .../command/DeleteIncomeCommandTest.java | 25 +++++++++--- .../java/chching/record/ExpenseListTest.java | 10 ++++- src/test/java/chching/record/ExpenseTest.java | 13 +++++-- .../java/chching/record/IncomeListTest.java | 7 +++- src/test/java/chching/record/IncomeTest.java | 12 ++++-- 15 files changed, 134 insertions(+), 123 deletions(-) delete mode 100644 src/test/java/chching/CommandTest.java delete mode 100644 src/test/java/chching/ExitTest.java.rej diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index d3357aa9f2..6c392dd7b4 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -6,7 +6,7 @@ import java.util.HashMap; public class Expenses { - public static Expense parseExpense(HashMap argumentsByField) { + public static Expense parseExpense(HashMap argumentsByField) throws ChChingException{ Expense exp = null; try { String expenseCategory = argumentsByField.get("c"); @@ -16,7 +16,7 @@ public static Expense parseExpense(HashMap argumentsByField) { assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { - System.out.println(" Trouble adding expense value"); + throw new ChChingException("Trouble adding expense value"); } return exp; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 5e7ccd9298..40e5d07265 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -6,7 +6,7 @@ import java.util.HashMap; public class Incomes { - public static Income parseIncome(HashMap argumentsByField) { + public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; try { String incomeDescription = argumentsByField.get("de"); @@ -16,7 +16,7 @@ public static Income parseIncome(HashMap argumentsByField) { assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { - System.out.println(" Trouble adding income value"); + throw new ChChingException("Trouble adding income value"); } return inc; } diff --git a/src/test/java/chching/CommandTest.java b/src/test/java/chching/CommandTest.java deleted file mode 100644 index f5926e08a6..0000000000 --- a/src/test/java/chching/CommandTest.java +++ /dev/null @@ -1,39 +0,0 @@ -// package chching; - -// import org.junit.jupiter.api.BeforeEach; -// import org.junit.jupiter.api.Test; - -// import chching.command.BalanceCommand; -// import chching.record.Expense; -// import chching.record.ExpenseList; -// import chching.record.Income; -// import chching.record.IncomeList; - -// import java.io.ByteArrayOutputStream; -// import java.io.PrintStream; - -// import static org.junit.jupiter.api.Assertions.assertEquals; - -// public class CommandTest { -// private final PrintStream standardOut = System.out; -// private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - -// @BeforeEach -// public void setUp() { -// System.setOut(new PrintStream(outputStreamCaptor)); -// } - -// @Test -// public void getBalance_expected() { -// Expense expenseOne = new Expense("entertainment", "beach party", "23 may 2023", 50); -// ExpenseList listE = new ExpenseList(); -// listE.addRecord(expenseOne); - -// Income incomeOne = new Income("entertainment", "beach party", "23 may 2023", 50); -// IncomeList listI = new IncomeList(); -// listI.addRecord(incomeOne); - - -// } -// } - diff --git a/src/test/java/chching/ExitTest.java b/src/test/java/chching/ExitTest.java index a1dc9b5c59..acb3594bd7 100644 --- a/src/test/java/chching/ExitTest.java +++ b/src/test/java/chching/ExitTest.java @@ -9,6 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class ExitTest { + final static String EXPECTED_STRING = "Bye!"; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -22,7 +23,7 @@ public void setUp() { void exit_bye_expectBye() { System.out.println("Bye!"); - assertEquals("Bye!", outputStreamCaptor.toString().trim()); + assertEquals(EXPECTED_STRING, outputStreamCaptor.toString().trim()); } } diff --git a/src/test/java/chching/ExitTest.java.rej b/src/test/java/chching/ExitTest.java.rej deleted file mode 100644 index e9866b77d7..0000000000 --- a/src/test/java/chching/ExitTest.java.rej +++ /dev/null @@ -1,36 +0,0 @@ -diff a/src/test/java/seedu/duke/ExitTest.java b/src/test/java/seedu/duke/ExitTest.java (rejected hunks) -@@ -0,0 +1,33 @@ -+package seedu.duke; -+ -+import org.junit.jupiter.api.BeforeEach; -+import org.junit.jupiter.api.Test; -+ -+import java.io.ByteArrayOutputStream; -+import java.io.PrintStream; -+ -+import static org.junit.jupiter.api.Assertions.*; -+ -+class ExitTest { -+ -+ private final PrintStream standardOut = System.out; -+ private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); -+ -+ @BeforeEach -+ public void setUp() { -+ System.setOut(new PrintStream(outputStreamCaptor)); -+ } -+ -+ @Test -+ void ExitUnderTest_bye_expectBye() { -+ System.out.println("Bye!"); -+ -+ assertEquals("Bye!", outputStreamCaptor.toString().trim()); -+ -+ } -+ -+ @BeforeEach -+ public void tearDown() { -+ System.setOut(standardOut); -+ } -+} -\ No newline at end of file diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index d6456100d2..e3884b3c72 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -13,6 +13,11 @@ import java.io.PrintStream; public class ParserTest { + final static String ADD_EXPENSE ="add expense"; + final static String CA = "ca meal"; + final static String DE ="de breakfast"; + final static String DA = "da 01/02/23"; + final static String V = "v 3.50"; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -24,11 +29,11 @@ public void setUp() { @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); - expectedOutput.add("add expense"); - expectedOutput.add("ca meal"); - expectedOutput.add("de breakfast"); - expectedOutput.add("da 01/02/23"); - expectedOutput.add("v 3.50"); + expectedOutput.add(ADD_EXPENSE); + expectedOutput.add(CA); + expectedOutput.add(DE); + expectedOutput.add(DA); + expectedOutput.add(V); assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); } @@ -36,10 +41,10 @@ public void splitLine_testScenario_expectedBehaviour() { @Test public void sortArguments_testScenario_expectedBehaviour() throws ChChingException { List input = new ArrayList(); - input.add("ca meal"); - input.add("de breakfast"); - input.add("da 01/02/23"); - input.add("v 3.50"); + input.add(CA); + input.add(DE); + input.add(DA); + input.add(V); HashMap expectedOutput = new HashMap(); expectedOutput.put("ca", "meal"); diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 90820d36ea..7e738f5e95 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -6,7 +6,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; + public class AddExpenseCommandTest { + + final static String CATEGORY = "transport"; + final static String DESCRIPTION = "public transport"; + + final static String DATE = "1st apr 2023"; + final static float EXPENSE_VALUE = (float) 1.50; + final static float ZERO_EXPENSE_VALUE = (float) 0; + final static float NEGATIVE_EXPENSE_VALUE = (float) -1.50; + + + + @Test void execute_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; @@ -21,7 +34,7 @@ void execute_nullExpense_exceptionThrown() { @Test void execute_missingCategoryField_exceptionThrown() { String expectedOutput = "Missing category field"; - Expense input = new Expense(null, "public transport", "1st apr 2023", (float) 1.50); + Expense input = new Expense(null, DESCRIPTION , DATE, EXPENSE_VALUE); try { new AddExpenseCommand(input); fail(); // test should not reach this line @@ -33,7 +46,7 @@ void execute_missingCategoryField_exceptionThrown() { @Test void execute_missingDescriptionField_exceptionThrown() { String expectedOutput = "Missing description field"; - Expense input = new Expense("transport", null, "1st apr 2023", (float) 1.50); + Expense input = new Expense(CATEGORY, null, DATE, EXPENSE_VALUE); try { new AddExpenseCommand(input); fail(); // test should not reach this line @@ -45,7 +58,7 @@ void execute_missingDescriptionField_exceptionThrown() { @Test void execute_missingDateField_exceptionThrown() { String expectedOutput = "Missing date field"; - Expense input = new Expense("transport", "public transport", null, (float) 1.50); + Expense input = new Expense(CATEGORY, DESCRIPTION, null, EXPENSE_VALUE); try { new AddExpenseCommand(input); fail(); // test should not reach this line @@ -57,7 +70,7 @@ void execute_missingDateField_exceptionThrown() { @Test void execute_zeroValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing expense value"; - Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) 0); + Expense input = new Expense(CATEGORY, DESCRIPTION, DATE, ZERO_EXPENSE_VALUE); try { new AddExpenseCommand(input); fail(); // test should not reach this line @@ -69,7 +82,7 @@ void execute_zeroValueField_exceptionThrown() { @Test void execute_negativeValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing expense value"; - Expense input = new Expense("transport", "public transport", "1st apr 2023", (float) -1.50); + Expense input = new Expense(CATEGORY, DESCRIPTION, DATE, NEGATIVE_EXPENSE_VALUE); try { new AddExpenseCommand(input); fail(); // test should not reach this line diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 904067b217..bc3cef81b8 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -7,6 +7,13 @@ import static org.junit.jupiter.api.Assertions.fail; public class AddIncomeCommandTest { + + final static String DESCRIPTION = "salary"; + + final static String DATE = "1st apr 2023"; + final static float INCOME_VALUE = (float) 500; + final static float ZERO_INCOME_VALUE = (float) 0; + final static float NEGATIVE_INCOME_VALUE = (float) -500; @Test void addIncomeCommand_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; @@ -21,7 +28,7 @@ void addIncomeCommand_nullExpense_exceptionThrown() { @Test void addIncomeCommand_missingDescriptionField_exceptionThrown() { String expectedOutput = "Missing description field"; - Income input = new Income(null, "1st apr 2023", (float) 500); + Income input = new Income(null, DATE, INCOME_VALUE); try { new AddIncomeCommand(input); fail(); // test should not reach this line @@ -33,7 +40,7 @@ void addIncomeCommand_missingDescriptionField_exceptionThrown() { @Test void addIncomeCommand_missingDateField_exceptionThrown() { String expectedOutput = "Missing date field"; - Income input = new Income("salary", null, (float) 500); + Income input = new Income(DESCRIPTION, null, INCOME_VALUE); try { new AddIncomeCommand(input); fail(); // test should not reach this line @@ -45,7 +52,7 @@ void addIncomeCommand_missingDateField_exceptionThrown() { @Test void addIncomeCommand_zeroValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing income value"; - Income input = new Income("salary", "1st apr 2023", (float) 0); + Income input = new Income(DESCRIPTION, DATE, ZERO_INCOME_VALUE); try { new AddIncomeCommand(input); fail(); // test should not reach this line @@ -57,7 +64,7 @@ void addIncomeCommand_zeroValueField_exceptionThrown() { @Test void addIncomeCommand_negativeValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing income value"; - Income input = new Income("salary", "1st apr 2023", (float) -500); + Income input = new Income(DESCRIPTION, DATE, NEGATIVE_INCOME_VALUE); try { new AddIncomeCommand(input); fail(); // test should not reach this line diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index ffa170c0cb..055d91a5c8 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -14,6 +14,17 @@ import static org.junit.jupiter.api.Assertions.fail; class BalanceCommandTest { + final static String INCOME_DESCRIPTION = "salary"; + + final static String INCOME_DATE = "1st apr 2023"; + final static float INCOME_VALUE = (float) 5000; + + final static String EXPENSE_CATEGORY = "grocery"; + final static String EXPENSE_DESCRIPTION = "too much groceries"; + + final static String EXPENSE_DATE = "1st apr 2023"; + final static float EXPENSE_VALUE = (float) 500; + private Ui ui; private Storage storage; private Income salary; @@ -25,8 +36,8 @@ class BalanceCommandTest { void setup() { ui = new Ui(); - salary = new Income("salary", "1st apr 2023", 5000); - groceries = new Expense("groceries", "too much groceries", "1st apr 2023", 500); + salary = new Income(INCOME_DESCRIPTION, INCOME_DATE, INCOME_VALUE); + groceries = new Expense(EXPENSE_CATEGORY, EXPENSE_DESCRIPTION, EXPENSE_DATE, EXPENSE_VALUE); ArrayList incomeList = new ArrayList(); incomeList.add(salary); diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 373ae83f06..6a82cc696e 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -15,6 +15,22 @@ class DeleteExpenseCommandTest { + final static int OFFSET = 1; + final static int CORRECT_INDEX = 1; + final static int TOO_LARGE_INDEX = 5; + final static int NEGATIVE_INDEX = -1; + + final static String SPENDING_CATEGORY = "entertainment"; + final static String SPENDING_DESCRIPTION = "movie"; + + final static String SPENDING_DATE = "02/10/23"; + final static float SPENDING_EXPENSE_VALUE = (float) 10.50; + + final static String GROCERIES_CATEGORY = "entertainment"; + final static String GROCERIES_DESCRIPTION = "movie"; + + final static String GROCERIES_DATE = "02/10/23"; + final static float GROCERIES_EXPENSE_VALUE = (float) 500; private Ui ui; private Storage storage; private Expense spending; @@ -25,8 +41,8 @@ class DeleteExpenseCommandTest { @BeforeEach void setup() { ui = new Ui(); - spending = new Expense("entertainment", "movie", "02/10/23", 10.50); - groceries = new Expense("groceries","too much groceries","1st apr 2023",500); + spending = new Expense(SPENDING_CATEGORY, SPENDING_DESCRIPTION , SPENDING_DATE, SPENDING_EXPENSE_VALUE); + groceries = new Expense(GROCERIES_CATEGORY,GROCERIES_DESCRIPTION,GROCERIES_DATE,GROCERIES_EXPENSE_VALUE); ArrayList expenseList = new ArrayList(); @@ -38,10 +54,10 @@ void setup() { @Test void execute_positiveIntegerWithinSize_success(){ int defaultExpenseListSize = defaultExpenseList.size(); - Command command = new DeleteExpenseCommand(1); + Command command = new DeleteExpenseCommand(CORRECT_INDEX); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage); - assertEquals(defaultExpenseListSize - 1, defaultExpenseList.size(), "Delete expense working"); + assertEquals(defaultExpenseListSize - OFFSET, defaultExpenseList.size(), "Delete expense working"); } catch (Exception e) { fail(); // test should not reach this line } @@ -50,7 +66,7 @@ void execute_positiveIntegerWithinSize_success(){ @Test void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; - Command command = new DeleteExpenseCommand(5); + Command command = new DeleteExpenseCommand(TOO_LARGE_INDEX); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage); fail(); // test should not reach this line @@ -62,7 +78,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { @Test void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; - Command command = new DeleteExpenseCommand(-1); + Command command = new DeleteExpenseCommand(NEGATIVE_INDEX); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage); fail(); // test should not reach this line diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index e9c9839903..d800ff91b7 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -15,6 +15,19 @@ class DeleteIncomeCommandTest { + + final static int OFFSET = 1; + final static int CORRECT_INDEX = 1; + final static int TOO_LARGE_INDEX = 5; + final static int NEGATIVE_INDEX = -1; + final static String SALARY_DESCRIPTION = "salary"; + + final static String SALARY_DATE = "1st apr 2023"; + final static float SALARY_INCOME_VALUE = (float) 5000; + final static String BONUS_DESCRIPTION = "salary"; + + final static String BONUS_DATE = "5/2/23"; + final static float BONUS_INCOME_VALUE = (float) 3000; private Ui ui; private Storage storage; private Income salary; @@ -24,8 +37,8 @@ class DeleteIncomeCommandTest { @BeforeEach void setup() { - salary = new Income("salary","1st apr 2023",5000); - bonus = new Income("bonus", "5/2/23", 3000); + salary = new Income(SALARY_DESCRIPTION, SALARY_DATE,SALARY_INCOME_VALUE); + bonus = new Income(BONUS_DESCRIPTION, BONUS_DATE, BONUS_INCOME_VALUE); ArrayList incomeList = new ArrayList(); incomeList.add(salary); @@ -36,10 +49,10 @@ void setup() { @Test void execute_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); - Command command = new DeleteIncomeCommand(1); + Command command = new DeleteIncomeCommand(CORRECT_INDEX); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); - assertEquals(defaultIncomeListSize - 1, defaultIncomeList.size(), "Delete income working"); + assertEquals(defaultIncomeListSize - OFFSET, defaultIncomeList.size(), "Delete income working"); } catch (Exception e) { fail(); // test should not reach here } @@ -48,7 +61,7 @@ void execute_positiveIntegerWithinSize_success() { @Test void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; - Command command = new DeleteIncomeCommand(5); + Command command = new DeleteIncomeCommand(TOO_LARGE_INDEX); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); fail(); // test should not reach this line @@ -60,7 +73,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { @Test void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; - Command command = new DeleteIncomeCommand(-1); + Command command = new DeleteIncomeCommand(NEGATIVE_INDEX); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage); fail(); // test should not reach this line diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 26b727f0ef..add3514298 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -3,13 +3,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class ExpenseListTest { + final static int EXPECTED_SIZE = 1; + final static String CATEGORY = "entertainment"; + final static String DESCRIPTION = "beach party"; + + final static String DATE = "23 may 2023"; + final static float EXPENSE_VALUE = (float) 50; @Test void getExpenseCount_one_expectOne() { - Expense expenseOne = new Expense("entertainment", "beach party", "23 may 2023", 50); + Expense expenseOne = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); ExpenseList list = new ExpenseList(); list.addRecord(expenseOne); - assertEquals(1, list.getRecordCount()); + assertEquals(EXPECTED_SIZE, list.getRecordCount()); } } diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index fc24f8cccb..fafc9c56bf 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -5,30 +5,35 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { + final static String CATEGORY = "transport"; + final static String DESCRIPTION = "public transport"; + + final static String DATE = "1st apr 2023"; + final static float EXPENSE_VALUE = (float) 1.50; @Test void getExpenseDescription_expected() { String test = "public transport"; - Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals("public transport", exp.getDescription()); } @Test void getExpenseDate_expected() { String test = "1st apr 2023"; - Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals("1st apr 2023", exp.getDate()); } @Test void getExpenseValue_expected() { float test = (float) 1.50; - Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals((float) 1.50, exp.getValue()); } @Test void getValue_expected() { - Expense exp = new Expense("transport", "public transport", "1st apr 2023", (float) 1.50); + Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.50"; assertEquals(expected, exp.toString()); } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index b117092053..f7fdddb97f 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -5,10 +5,15 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class IncomeListTest { + + final static String DESCRIPTION = "salary"; + + final static String DATE = "1st apr 2023"; + final static float INCOME_VALUE = (float) 1000000; @Test void getExpenseCount_one_expectOne() { - Income income0 = new Income("salary", "1st apr 2023", 1000000); + Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); IncomeList list = new IncomeList(); list.addRecord(income0); assertEquals(1, list.getRecordCount()); diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 76bcec5d9c..71d7f3d928 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -6,31 +6,35 @@ class IncomeTest { + final static String DESCRIPTION = "salary"; + + final static String DATE = "1st apr 2023"; + final static float INCOME_VALUE = (float) 1000000; @Test void getIncomeDescription_expected() { String test = "salary"; - Income income0 = new Income("salary", "1st apr 2023", 1000000); + Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals("salary", income0.getDescription()); } @Test void getIncomeDate_expected() { String test = "1st apr 2023"; - Income income0 = new Income("salary", "1st apr 2023", 1000000); + Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals("1st apr 2023", income0.getDate()); } @Test void getIncomeValue_expected() { float test = (float) 1000000; - Income income0 = new Income("salary", "1st apr 2023", 1000000); + Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals((float) 1000000, income0.getValue()); } @Test void getValue_expected() { - Income income0 = new Income("salary", "1st apr 2023", 1000000); + Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); String expected = "Description - salary | Date - 1st apr 2023 | Value - 1000000.00"; assertEquals(expected, income0.toString()); } From 1bab90f9cdf817149c13d201c50dee6e9639ebc0 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 15 Mar 2023 21:48:32 +0800 Subject: [PATCH 114/364] Fix bug --- src/test/java/chching/ExitTest.java | 2 +- src/test/java/chching/ParserTest.java | 10 ++++---- .../command/AddExpenseCommandTest.java | 12 +++++----- .../chching/command/AddIncomeCommandTest.java | 10 ++++---- .../chching/command/BalanceCommandTest.java | 14 +++++------ .../command/DeleteExpenseCommandTest.java | 24 +++++++++---------- .../command/DeleteIncomeCommandTest.java | 20 ++++++++-------- .../java/chching/record/ExpenseListTest.java | 11 ++++----- src/test/java/chching/record/ExpenseTest.java | 9 ++++--- .../java/chching/record/IncomeListTest.java | 7 +++--- src/test/java/chching/record/IncomeTest.java | 7 +++--- 11 files changed, 61 insertions(+), 65 deletions(-) diff --git a/src/test/java/chching/ExitTest.java b/src/test/java/chching/ExitTest.java index acb3594bd7..a265a6fce4 100644 --- a/src/test/java/chching/ExitTest.java +++ b/src/test/java/chching/ExitTest.java @@ -9,7 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class ExitTest { - final static String EXPECTED_STRING = "Bye!"; + static final String EXPECTED_STRING = "Bye!"; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index e3884b3c72..ec9ee4ed3b 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -13,11 +13,11 @@ import java.io.PrintStream; public class ParserTest { - final static String ADD_EXPENSE ="add expense"; - final static String CA = "ca meal"; - final static String DE ="de breakfast"; - final static String DA = "da 01/02/23"; - final static String V = "v 3.50"; + static final String ADD_EXPENSE ="add expense"; + static final String CA = "ca meal"; + static final String DE ="de breakfast"; + static final String DA = "da 01/02/23"; + static final String V = "v 3.50"; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 7e738f5e95..b445e9ced2 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -9,13 +9,13 @@ public class AddExpenseCommandTest { - final static String CATEGORY = "transport"; - final static String DESCRIPTION = "public transport"; + static final String CATEGORY = "transport"; + static final String DESCRIPTION = "public transport"; - final static String DATE = "1st apr 2023"; - final static float EXPENSE_VALUE = (float) 1.50; - final static float ZERO_EXPENSE_VALUE = (float) 0; - final static float NEGATIVE_EXPENSE_VALUE = (float) -1.50; + static final String DATE = "1st apr 2023"; + static final float EXPENSE_VALUE = (float) 1.50; + static final float ZERO_EXPENSE_VALUE = (float) 0; + static final float NEGATIVE_EXPENSE_VALUE = (float) -1.50; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index bc3cef81b8..2196a68dda 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -8,12 +8,12 @@ public class AddIncomeCommandTest { - final static String DESCRIPTION = "salary"; + static final String DESCRIPTION = "salary"; - final static String DATE = "1st apr 2023"; - final static float INCOME_VALUE = (float) 500; - final static float ZERO_INCOME_VALUE = (float) 0; - final static float NEGATIVE_INCOME_VALUE = (float) -500; + static final String DATE = "1st apr 2023"; + static final float INCOME_VALUE = (float) 500; + static final float ZERO_INCOME_VALUE = (float) 0; + static final float NEGATIVE_INCOME_VALUE = (float) -500; @Test void addIncomeCommand_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 055d91a5c8..5afe6f96a1 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -14,16 +14,16 @@ import static org.junit.jupiter.api.Assertions.fail; class BalanceCommandTest { - final static String INCOME_DESCRIPTION = "salary"; + static final String INCOME_DESCRIPTION = "salary"; - final static String INCOME_DATE = "1st apr 2023"; - final static float INCOME_VALUE = (float) 5000; + static final String INCOME_DATE = "1st apr 2023"; + static final float INCOME_VALUE = (float) 5000; - final static String EXPENSE_CATEGORY = "grocery"; - final static String EXPENSE_DESCRIPTION = "too much groceries"; + static final String EXPENSE_CATEGORY = "grocery"; + static final String EXPENSE_DESCRIPTION = "too much groceries"; - final static String EXPENSE_DATE = "1st apr 2023"; - final static float EXPENSE_VALUE = (float) 500; + static final String EXPENSE_DATE = "1st apr 2023"; + static final float EXPENSE_VALUE = (float) 500; private Ui ui; private Storage storage; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 6a82cc696e..5bd1906a22 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -15,22 +15,22 @@ class DeleteExpenseCommandTest { - final static int OFFSET = 1; - final static int CORRECT_INDEX = 1; - final static int TOO_LARGE_INDEX = 5; - final static int NEGATIVE_INDEX = -1; + static final int OFFSET = 1; + static final int CORRECT_INDEX = 1; + static final int TOO_LARGE_INDEX = 5; + static final int NEGATIVE_INDEX = -1; - final static String SPENDING_CATEGORY = "entertainment"; - final static String SPENDING_DESCRIPTION = "movie"; + static final String SPENDING_CATEGORY = "entertainment"; + static final String SPENDING_DESCRIPTION = "movie"; - final static String SPENDING_DATE = "02/10/23"; - final static float SPENDING_EXPENSE_VALUE = (float) 10.50; + static final String SPENDING_DATE = "02/10/23"; + static final float SPENDING_EXPENSE_VALUE = (float) 10.50; - final static String GROCERIES_CATEGORY = "entertainment"; - final static String GROCERIES_DESCRIPTION = "movie"; + static final String GROCERIES_CATEGORY = "entertainment"; + static final String GROCERIES_DESCRIPTION = "movie"; - final static String GROCERIES_DATE = "02/10/23"; - final static float GROCERIES_EXPENSE_VALUE = (float) 500; + static final String GROCERIES_DATE = "02/10/23"; + static final float GROCERIES_EXPENSE_VALUE = (float) 500; private Ui ui; private Storage storage; private Expense spending; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index d800ff91b7..9cc7be1d03 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -16,18 +16,18 @@ class DeleteIncomeCommandTest { - final static int OFFSET = 1; - final static int CORRECT_INDEX = 1; - final static int TOO_LARGE_INDEX = 5; - final static int NEGATIVE_INDEX = -1; - final static String SALARY_DESCRIPTION = "salary"; + static final int OFFSET = 1; + static final int CORRECT_INDEX = 1; + static final int TOO_LARGE_INDEX = 5; + static final int NEGATIVE_INDEX = -1; + static final String SALARY_DESCRIPTION = "salary"; - final static String SALARY_DATE = "1st apr 2023"; - final static float SALARY_INCOME_VALUE = (float) 5000; - final static String BONUS_DESCRIPTION = "salary"; + static final String SALARY_DATE = "1st apr 2023"; + static final float SALARY_INCOME_VALUE = (float) 5000; + static final String BONUS_DESCRIPTION = "salary"; - final static String BONUS_DATE = "5/2/23"; - final static float BONUS_INCOME_VALUE = (float) 3000; + static final String BONUS_DATE = "5/2/23"; + static final float BONUS_INCOME_VALUE = (float) 3000; private Ui ui; private Storage storage; private Income salary; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index add3514298..8b95199d9e 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -3,12 +3,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class ExpenseListTest { - final static int EXPECTED_SIZE = 1; - final static String CATEGORY = "entertainment"; - final static String DESCRIPTION = "beach party"; - - final static String DATE = "23 may 2023"; - final static float EXPENSE_VALUE = (float) 50; + static final int EXPECTED_SIZE = 1; + static final String CATEGORY = "entertainment"; + static final String DESCRIPTION = "beach party"; + static final String DATE = "23 may 2023"; + static final float EXPENSE_VALUE = (float) 50; @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index fafc9c56bf..0ef7042081 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -5,11 +5,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { - final static String CATEGORY = "transport"; - final static String DESCRIPTION = "public transport"; - - final static String DATE = "1st apr 2023"; - final static float EXPENSE_VALUE = (float) 1.50; + static final String CATEGORY = "transport"; + static final String DESCRIPTION = "public transport"; + static final String DATE = "1st apr 2023"; + static final float EXPENSE_VALUE = (float) 1.50; @Test void getExpenseDescription_expected() { String test = "public transport"; diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index f7fdddb97f..047c307630 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -6,10 +6,9 @@ class IncomeListTest { - final static String DESCRIPTION = "salary"; - - final static String DATE = "1st apr 2023"; - final static float INCOME_VALUE = (float) 1000000; + static final String DESCRIPTION = "salary"; + static final String DATE = "1st apr 2023"; + static final float INCOME_VALUE = (float) 1000000; @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 71d7f3d928..7dc60db36d 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -6,10 +6,9 @@ class IncomeTest { - final static String DESCRIPTION = "salary"; - - final static String DATE = "1st apr 2023"; - final static float INCOME_VALUE = (float) 1000000; + static final String DESCRIPTION = "salary"; + static final String DATE = "1st apr 2023"; + static final float INCOME_VALUE = (float) 1000000; @Test void getIncomeDescription_expected() { From 064795b826289120a57fb2c296da396bee6a746f Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 15 Mar 2023 22:05:30 +0800 Subject: [PATCH 115/364] standardize code and gitignore data folder --- .gitignore | 1 + src/main/java/chching/Ui.java | 2 +- src/main/java/chching/parser/Expenses.java | 6 ++---- src/main/java/chching/parser/Incomes.java | 6 ++---- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 2873e189e1..b8e62d3ba1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT +/data diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index f7f371cb6e..2d59185fdb 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -92,6 +92,6 @@ public void showError(String message) { } public void showInvalidMessage() { - System.out.println(" Command is not recognized, use help for valid commands"); + System.out.println(" Command is invalid, use help for valid commands"); } } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 3cd50624dd..465359f04c 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -26,10 +26,8 @@ public static int getIndex(HashMap argumentsByField) throws ChCh try { String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); - } catch (NumberFormatException e) { - throw new ChChingException("Index needs to be an integer"); - } catch (NullPointerException e) { - throw new ChChingException("Index not found"); + } catch (Exception e) { + throw new ChChingException("Missing/invalid index"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 7b2c2c1df0..d802cdfb18 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -26,10 +26,8 @@ public static int getIndex(HashMap argumentsByField) throws ChCh try { String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); - } catch (NumberFormatException e) { - throw new ChChingException("Index needs to be an integer"); - } catch (NullPointerException e) { - throw new ChChingException("Index not found"); + } catch (Exception e) { + throw new ChChingException("Missing/invalid index"); } return index; } From 2fb4d4cd02a5d269b65955c484eb3d2b7dbe4c22 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 16 Mar 2023 13:08:26 +0800 Subject: [PATCH 116/364] Add assertion in AddExpenseCommand class --- src/main/java/chching/command/AddExpenseCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index e2452c1b99..c82e19014e 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -26,6 +26,7 @@ public AddExpenseCommand(Expense expense) throws ChChingException { } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + assert expense.getValue() > 0 : "Expense value should be greater than 0"; expenses.addExpense(expense); ui.showAdded(incomes, expenses, expense); } From ae1d50f3c63b327ae932adc20710cb092e87e6fd Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Thu, 16 Mar 2023 13:09:57 +0800 Subject: [PATCH 117/364] add assert in add income command --- src/main/java/chching/command/AddIncomeCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 20845ad94e..2d003ec6fb 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -24,6 +24,7 @@ public AddIncomeCommand(Income income) throws ChChingException { } @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + assert income.getValue() > 0 : "Income value must be positive"; incomes.addIncome(income); ui.showAdded(incomes, expenses, income); } From f986be8870c3f1128f2c04530b90aacb69333d57 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 16 Mar 2023 13:10:19 +0800 Subject: [PATCH 118/364] Added asertion for DeleteExpenseCommand --- src/main/java/chching/command/DeleteExpenseCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 4335b98845..5d32ce88e0 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -18,6 +18,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if (index > expenses.size()) { throw new ChChingException("The number is too big"); } + assert index > 0 : "Index must be a positive integer"; expenses.deleteExpense(index); System.out.println("Expense deleted, here is the updated list:"); expenses.printExpenseList(); From ed2059ffcc6e90af3d48969bb46cfa4e5e497b6f Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 19 Mar 2023 13:05:53 +0800 Subject: [PATCH 119/364] Developer Guide --- docs/DeveloperGuide.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..d38bb25ece 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -8,15 +8,17 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### Delete Income command + ## Product scope ### Target user profile -{Describe the target user profile} +Target users are people who are keen on improving their financial accountability ### Value proposition -{Describe the value proposition: what problem does it solve?} +The value proposition of ChChing is its ability to track income and expenses on a daily basis. ## User Stories From 239f33f9a390d5864853a80020a3201a119203e1 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 19 Mar 2023 16:35:31 +0800 Subject: [PATCH 120/364] try inserting image --- docs/DeveloperGuide.md | 1 + images/UML_class.png | Bin 0 -> 57712 bytes 2 files changed, 1 insertion(+) create mode 100644 images/UML_class.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d38bb25ece..f8f8abbcec 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,6 +7,7 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +![Record Class](/images/UML_class.png) ### Delete Income command diff --git a/images/UML_class.png b/images/UML_class.png new file mode 100644 index 0000000000000000000000000000000000000000..51130e6949f41169f4f1e55975e2886c4fe2930e GIT binary patch literal 57712 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 h@Q(!kf0Y2 Date: Sun, 19 Mar 2023 16:39:26 +0800 Subject: [PATCH 121/364] Add sequence diagram for DeleteIncomeCommand --- docs/DeveloperGuide.md | 1 + images/Sequence_diagram.png | Bin 0 -> 65604 bytes 2 files changed, 1 insertion(+) create mode 100644 images/Sequence_diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f8f8abbcec..2a7bd57a69 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -8,6 +8,7 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} ![Record Class](/images/UML_class.png) +![Record Class](/images/Sequence_diagram.png) ### Delete Income command diff --git a/images/Sequence_diagram.png b/images/Sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..72425358a595850dc5959710fd118a7078c110a6 GIT binary patch literal 65604 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¿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 Date: Tue, 21 Mar 2023 21:37:23 +0800 Subject: [PATCH 122/364] Update DG and UML image --- docs/DeveloperGuide.md | 20 +++++++++++++++++++- images/Record_RecordList_UML_class.png | Bin 0 -> 111016 bytes images/UML_class.png | Bin 57712 -> 0 bytes 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 images/Record_RecordList_UML_class.png delete mode 100644 images/UML_class.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2a7bd57a69..24f499da84 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,25 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} -![Record Class](/images/UML_class.png) + +## Implmentation + +### Record and RecordList + +The main class in our program is the ```Record``` and ```RecordList``` abstract classes, in which ```Income```, ```Expense``` will inherit from ```Record``` and ```IncomeList``` and ```ExpenseList``` will inherit from ```RecordList```. Most commands will act on instances of the ```Income```, ```Expense```,```IncomeList``` and ```ExpenseList``` classes. + +![Record Class](/images/Record_RecordList_UML_class.png) + +### DeleteIncomeCommand + +The proposed DeleteIncomeCommand mechanism is facilitated by ```System```, ```Incomes```, ```UI``` and ```ChChingException```. +The command receives the instruction from ```UI``` and will call the ```execute``` method. +If ```index <= 0```, the command will throw a new ChChingException and print ```"Zero/Negative index"```. +If ```index > incomes.size()```, the command will also throw a new ChChingException and print ```"The number is too big"``` +Entering any of these optional lines will result in early termination of the command. +Or else, the command will continue to delete the entry at the particular index. +Afterwards, the ```execute()``` method will print ```"Income deleted, here is the updated list:"``` and prints the entries in the income list. + ![Record Class](/images/Sequence_diagram.png) ### Delete Income command diff --git a/images/Record_RecordList_UML_class.png b/images/Record_RecordList_UML_class.png new file mode 100644 index 0000000000000000000000000000000000000000..f10bb9ea65e7dfe8ef4ebd5232da51a5db8b3e96 GIT binary patch literal 111016 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®Ij9zjXEL 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 Date: Mon, 27 Mar 2023 22:55:26 +0800 Subject: [PATCH 169/364] Edit code to pass checkstyle --- .../chching/command/ClearCommandTest.java | 12 +++++++---- .../java/chching/command/ListCommandTest.java | 21 +++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/test/java/chching/command/ClearCommandTest.java b/src/test/java/chching/command/ClearCommandTest.java index 381e990d19..4782833152 100644 --- a/src/test/java/chching/command/ClearCommandTest.java +++ b/src/test/java/chching/command/ClearCommandTest.java @@ -2,9 +2,13 @@ import chching.Ui; import chching.Storage; -import chching.record.*; +import chching.record.Income; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; import chching.currency.Converter; import chching.currency.Selector; +import chching.record.TargetStorage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -50,7 +54,7 @@ void setUp() { defaultIncomeList = new IncomeList(incomeList); } @Test - public void execute_ClearAllCommand_success() { + public void execute_clearAllCommand_success() { try { Command command = new ClearAllCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); @@ -60,7 +64,7 @@ public void execute_ClearAllCommand_success() { } } @Test - public void execute_ClearExpenseCommand_success() { + public void execute_clearExpenseCommand_success() { try { Command command = new ClearExpenseCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); @@ -70,7 +74,7 @@ public void execute_ClearExpenseCommand_success() { } } @Test - public void executeClear_IncomeCommand_success() { + public void execute_clearIncomeCommand_success() { try { Command command = new ClearIncomeCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); diff --git a/src/test/java/chching/command/ListCommandTest.java b/src/test/java/chching/command/ListCommandTest.java index 75752d19ac..727fed0631 100644 --- a/src/test/java/chching/command/ListCommandTest.java +++ b/src/test/java/chching/command/ListCommandTest.java @@ -3,18 +3,19 @@ import chching.ChChingException; import chching.Ui; import chching.Storage; -import chching.record.*; +import chching.record.Income; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; import chching.currency.Converter; import chching.currency.Selector; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertTrue; public class ListCommandTest { static final String CATEGORY = "transport"; static final String EXPENSE_DESCRIPTION = "public transport"; @@ -34,16 +35,18 @@ public class ListCommandTest { private Income incomeDemo = new Income(INCOME_DESCRIPTION, DATE, INCOME_VALUE); @Test - void execute_ListCommand_empty_NoException() throws ChChingException { - Command command = new ListCommand(); - assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage)); + void execute_listCommandEmpty_noException() throws ChChingException { + Command command = new ListCommand(); + assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, + storage, selector, converter, targetStorage)); } @Test - void execute_ListCommand_expenseAndIncome_NoException() throws ChChingException { + void execute_listCommandExpenseAndIncome_noException() throws ChChingException { defaultIncomeList.addIncome(incomeDemo); defaultExpenseList.addExpense(expenseDemo); Command command = new ListCommand(); - assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage)); + assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, + storage, selector, converter, targetStorage)); } } From edee8a956f7d0dffba49ceff4969b9fb5f03c0f0 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 28 Mar 2023 10:45:24 +0800 Subject: [PATCH 170/364] J Unit testing for AddTargetCommand and ShowTargetCommand. Documentations --- .../chching/command/AddTargetCommandTest.java | 58 ++++++++++++++ .../chching/command/BalanceCommandTest.java | 9 ++- .../chching/command/ClearCommandTest.java | 27 +++++-- .../command/EditExpenseCommandTest.java | 28 +++++-- .../java/chching/command/ListCommandTest.java | 11 +++ .../command/ShowTargetCommandTest.java | 75 +++++++++++++++++++ 6 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 src/test/java/chching/command/AddTargetCommandTest.java create mode 100644 src/test/java/chching/command/ShowTargetCommandTest.java diff --git a/src/test/java/chching/command/AddTargetCommandTest.java b/src/test/java/chching/command/AddTargetCommandTest.java new file mode 100644 index 0000000000..554108b14a --- /dev/null +++ b/src/test/java/chching/command/AddTargetCommandTest.java @@ -0,0 +1,58 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.Target; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Junit Test for AddTargetCommand + */ +public class AddTargetCommandTest { + + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private Target defaultTarget; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + defaultTarget = new Target(350); + ArrayList expenseList = new ArrayList<>(); + ArrayList incomeList = new ArrayList<>(); + } + + /** + * Junit Test when adding target value + */ + @Test + public void execute_addTargetCommand_success() { + try { + Command command = new AddTargetCommand(defaultTarget); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertTrue(targetStorage.getTarget().getValue() == (double) 350); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 8c1de2a672..86426be949 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -19,7 +19,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - +/** + * Junit Test for BalanceCommand + */ class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); @@ -64,7 +66,10 @@ void setup() { expenseList.add(groceries); defaultExpenseList = new ExpenseList(expenseList); } - + + /** + * Junit Test for when balance is correct + */ @Test void execute_normalScenario_success() { String expectedOutput = "4500.00"; diff --git a/src/test/java/chching/command/ClearCommandTest.java b/src/test/java/chching/command/ClearCommandTest.java index 4782833152..2edbaa1bec 100644 --- a/src/test/java/chching/command/ClearCommandTest.java +++ b/src/test/java/chching/command/ClearCommandTest.java @@ -18,6 +18,9 @@ import static org.junit.jupiter.api.Assertions.assertTrue; +/** + * Junit Test for various Clear commands + */ public class ClearCommandTest { static final String CATEGORY = "transport"; static final String EXPENSE_DESCRIPTION = "public transport"; @@ -53,16 +56,24 @@ void setUp() { incomeList.add(incomeDemo); defaultIncomeList = new IncomeList(incomeList); } + + /** + * Junit Test for clearIncome command to clear income list + */ @Test - public void execute_clearAllCommand_success() { + public void execute_clearIncomeCommand_success() { try { - Command command = new ClearAllCommand(); + Command command = new ClearIncomeCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - assertTrue(defaultExpenseList.size() == 0 && defaultIncomeList.size() == 0); + assertTrue(defaultIncomeList.size() == 0); } catch (Exception e) { System.out.println(e.getMessage()); } } + + /** + * Junit Test for clearExpense command to clear expense list + */ @Test public void execute_clearExpenseCommand_success() { try { @@ -73,12 +84,16 @@ public void execute_clearExpenseCommand_success() { System.out.println(e.getMessage()); } } + + /** + * Junit Test for clearAll command to clear both income and expense lists + */ @Test - public void execute_clearIncomeCommand_success() { + public void execute_clearAllCommand_success() { try { - Command command = new ClearIncomeCommand(); + Command command = new ClearAllCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - assertTrue(defaultIncomeList.size() == 0); + assertTrue(defaultExpenseList.size() == 0 && defaultIncomeList.size() == 0); } catch (Exception e) { System.out.println(e.getMessage()); } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index 71e636c8e2..af4bd17976 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -19,6 +19,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +/** + * Junit Test for EditExpenseCommand + */ public class EditExpenseCommandTest { static final String GROCERIES_CATEGORY = "grocery"; static final String GROCERIES_DESCRIPTION = "too much groceries"; @@ -54,7 +57,10 @@ void setUp() { expenseList.add(groceries); expenses = new ExpenseList(expenseList); } - + + /** + * Junit Test for normal expected edit scenario + */ @Test void execute_normalScenario_success() { try { @@ -77,7 +83,10 @@ void execute_normalScenario_success() { fail(); // test should not reach this line } } - + + /** + * Negative Junit Test for when index is not present + */ @Test void execute_noIndex_exceptionThrown() { try { @@ -95,7 +104,10 @@ void execute_noIndex_exceptionThrown() { assertEquals("Missing/invalid index", e.getMessage()); } } - + + /** + * Negative Junit Test for when index is negative + */ @Test void execute_negativeIndex_exceptionThrown() { try { @@ -114,7 +126,10 @@ void execute_negativeIndex_exceptionThrown() { assertEquals("Negative/Zero index", e.getMessage()); } } - + + /** + * Negative Junit Test for when index is out of bounds + */ @Test void execute_indexOutOfBounds_exceptionThrown() { try { @@ -133,7 +148,10 @@ void execute_indexOutOfBounds_exceptionThrown() { assertEquals("The index is too big", e.getMessage()); } } - + + /** + * Negative Junit Test for when there are no fields + */ @Test void execute_noFields_exceptionThrown() { try { diff --git a/src/test/java/chching/command/ListCommandTest.java b/src/test/java/chching/command/ListCommandTest.java index 727fed0631..630d4544e6 100644 --- a/src/test/java/chching/command/ListCommandTest.java +++ b/src/test/java/chching/command/ListCommandTest.java @@ -16,6 +16,11 @@ import java.time.format.DateTimeFormatter; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + + +/** + * Junit Test for ListCommand + */ public class ListCommandTest { static final String CATEGORY = "transport"; static final String EXPENSE_DESCRIPTION = "public transport"; @@ -34,6 +39,9 @@ public class ListCommandTest { private Expense expenseDemo = new Expense(CATEGORY, EXPENSE_DESCRIPTION, DATE, EXPENSE_VALUE); private Income incomeDemo = new Income(INCOME_DESCRIPTION, DATE, INCOME_VALUE); + /** + * Junit Test when listing an empty list + */ @Test void execute_listCommandEmpty_noException() throws ChChingException { Command command = new ListCommand(); @@ -41,6 +49,9 @@ void execute_listCommandEmpty_noException() throws ChChingException { storage, selector, converter, targetStorage)); } + /** + * Junit Test when listing an income and expense lists + */ @Test void execute_listCommandExpenseAndIncome_noException() throws ChChingException { defaultIncomeList.addIncome(incomeDemo); diff --git a/src/test/java/chching/command/ShowTargetCommandTest.java b/src/test/java/chching/command/ShowTargetCommandTest.java new file mode 100644 index 0000000000..eec25bfccd --- /dev/null +++ b/src/test/java/chching/command/ShowTargetCommandTest.java @@ -0,0 +1,75 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.Target; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Junit Test for ShowTargetCommand + */ +public class ShowTargetCommandTest { + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private Target defaultTarget; + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + String convertedCurrencies; + String EXPECTED_STRING; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + defaultTarget = new Target((double)350); + ArrayList expenseList = new ArrayList<>(); + ArrayList incomeList = new ArrayList<>(); + targetStorage.addTarget(defaultTarget); + System.setOut(new PrintStream(outputStreamCaptor)); + selector.setCurrency("HKD"); + convertedCurrencies = converter.printConverter(350, selector); + EXPECTED_STRING = "Current target: " + 350.0 + " SGD" + convertedCurrencies; + } + + + + /** + * Junit Test to show target + */ + @Test + public void execute_showTargetCommand_success() { + try { + Command command = new ShowTargetCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + // System.out.println(" Current target: " + 350.0 + " SGD" + convertedCurrencies); + assertEquals(EXPECTED_STRING, outputStreamCaptor.toString().trim()); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + +} From 3431f80074283b49c203aa860323bb87785abe26 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 28 Mar 2023 10:56:37 +0800 Subject: [PATCH 171/364] Fix Checkstyle --- src/test/java/chching/command/ShowTargetCommandTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/java/chching/command/ShowTargetCommandTest.java b/src/test/java/chching/command/ShowTargetCommandTest.java index eec25bfccd..25e5c56615 100644 --- a/src/test/java/chching/command/ShowTargetCommandTest.java +++ b/src/test/java/chching/command/ShowTargetCommandTest.java @@ -18,7 +18,6 @@ import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; /** * Junit Test for ShowTargetCommand @@ -35,8 +34,8 @@ public class ShowTargetCommandTest { private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - String convertedCurrencies; - String EXPECTED_STRING; + private String convertedCurrencies; + private String EXPECTED_STRING; @BeforeEach void setUp() { @@ -44,7 +43,7 @@ void setUp() { converter = new Converter(); targetStorage = new TargetStorage(); selector = new Selector(); - defaultTarget = new Target((double)350); + defaultTarget = new Target((double) 350); ArrayList expenseList = new ArrayList<>(); ArrayList incomeList = new ArrayList<>(); targetStorage.addTarget(defaultTarget); @@ -55,7 +54,6 @@ void setUp() { } - /** * Junit Test to show target */ @@ -64,7 +62,6 @@ public void execute_showTargetCommand_success() { try { Command command = new ShowTargetCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - // System.out.println(" Current target: " + 350.0 + " SGD" + convertedCurrencies); assertEquals(EXPECTED_STRING, outputStreamCaptor.toString().trim()); } catch (Exception e) { System.out.println(e.getMessage()); From b0afffa7eb5f3d9e134e9923a481461934185982 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 14:23:14 +0800 Subject: [PATCH 172/364] Add JUnit Testing for methods in EditIncomeCommandTest class --- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- .../command/EditExpenseCommandTest.java | 2 +- .../command/EditIncomeCommandTest.java | 142 ++++++++++++++++++ 4 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 src/test/java/chching/command/EditIncomeCommandTest.java diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 986a935f36..5f10e682b9 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -55,7 +55,7 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/invalid index"); + throw new ChChingException("Missing/Invalid index"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index a5af82f9e9..8da69865e9 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -50,7 +50,7 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/invalid index"); + throw new ChChingException("Missing/Invalid index"); } return index; } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index af4bd17976..c91b88f872 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -101,7 +101,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing/invalid index", e.getMessage()); + assertEquals("Missing/Invalid index", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java new file mode 100644 index 0000000000..e9d25a1a86 --- /dev/null +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -0,0 +1,142 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class EditIncomeCommandTest { + public static final String SALARY_DESCRIPTION = "salary"; + public static final int SALARY_VALUE = 5000; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + public static final LocalDate SALARY_DATE = LocalDate.parse("02-04-2023", FORMATTER); + public static final String DESCRIPTION_VALUE = "bonus"; + public static final String DATE_VALUE = "03-04-2023"; + public static final String VALUE_VALUE = "600"; + public static final String INDEX_FIELD = "in"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_VALUE = "1"; + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList incomes; + private ExpenseList expenseList; + private Income salary; + @BeforeEach + void setUp() { + ui = new Ui(); + + salary = new Income(SALARY_DESCRIPTION, SALARY_DATE, SALARY_VALUE); + + ArrayList incomeList = new ArrayList(); + incomeList.add(salary); + incomes = new IncomeList(incomeList); + } + + @Test + void execute_normalScenario_success() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, INDEX_VALUE); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editIncomeCommand = new EditIncomeCommand(argumentsByField); + editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); + + assertEquals(DESCRIPTION_VALUE, incomes.get(0).getDescription()); + assertEquals(LocalDate.parse(DATE_VALUE, FORMATTER), incomes.get(0).getDate()); + assertEquals(Float.parseFloat(VALUE_VALUE), incomes.get(0).getValue()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } + + @Test + void execute_noIndex_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editIncomeCommand = new EditIncomeCommand(argumentsByField); + editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing/Invalid index", e.getMessage()); + } + } + + @Test + void execute_negativeIndex_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, "-1"); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editIncomeCommand = new EditIncomeCommand(argumentsByField); + editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Negative/Zero index", e.getMessage()); + } + } + + @Test + void execute_indexOutOfBounds_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, "2"); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editIncomeCommand = new EditIncomeCommand(argumentsByField); + editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("The index is too big", e.getMessage()); + } + } + + @Test + void execute_noFields_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, INDEX_VALUE); + + Command editIncomeCommand = new EditIncomeCommand(argumentsByField); + editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("No fields to edit", e.getMessage()); + } + } +} From 4ef1b3703c84788202d76c5446322f0f09b0b44a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 15:12:31 +0800 Subject: [PATCH 173/364] Add JUnit Testing for editIncome method in IncomeList class --- .../java/chching/record/ExpenseListTest.java | 2 +- .../java/chching/record/IncomeListTest.java | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index de793a1aab..d98c21f2c7 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -98,7 +98,7 @@ void editExpense_editDate_success() { assertEquals(expectedOutputDate, expenses.get(0).getDate()); assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); } catch (Exception e) { - fail(); // test should not fail + fail(); // test should not reach this line } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 86cbc47914..13d49d0baf 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -1,11 +1,14 @@ package chching.record; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * Junit Test for IncomeList @@ -16,6 +19,16 @@ class IncomeListTest { static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 1000000; + private Income income; + private IncomeList incomes; + + @BeforeEach + void setUp() { + income = new Income(DESCRIPTION, DATE, INCOME_VALUE); + ArrayList incomeList = new ArrayList(); + incomeList.add(income); + incomes = new IncomeList(incomeList); + } /** * Junit Test to test method that returns the size of IncomeList @@ -29,4 +42,45 @@ void getExpenseCount_one_expectOne() { assertEquals(1, list.getRecordCount()); } + @Test + void editIncome_editDescription_success() { + String expectedOutputDescription = "bonus"; + try { + incomes.editIncome(1, "de", "bonus"); + assertEquals(expectedOutputDescription, incomes.get(0).getDescription()); + assertEquals(DATE, incomes.get(0).getDate()); + assertEquals(INCOME_VALUE, incomes.get(0).getValue()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); + } + } + + @Test + void editIncome_editDate_success() { + LocalDate expectedOutputDate = LocalDate.parse("05-04-2024", FORMATTER); + try { + incomes.editIncome(1, "da", "05-04-2024"); + assertEquals(DESCRIPTION, incomes.get(0).getDescription()); + assertEquals(expectedOutputDate, incomes.get(0).getDate()); + assertEquals(INCOME_VALUE, incomes.get(0).getValue()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } + + @Test + void editIncome_editValue_success() { + float expectedOutputValue = (float) 200000; + try { + incomes.editIncome(1, "v", "200000"); + assertEquals(DESCRIPTION, incomes.get(0).getDescription()); + assertEquals(DATE, incomes.get(0).getDate()); + assertEquals(expectedOutputValue, incomes.get(0).getValue()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } } From bb8ab4c504daa0b8cc92960b273abb25baf98e44 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 15:22:45 +0800 Subject: [PATCH 174/364] Add documentation for JUnit Testing methods in EditIncomeCommandTest and IncomeListTest classes --- .../command/EditExpenseCommandTest.java | 9 +++++- .../command/EditIncomeCommandTest.java | 29 +++++++++++++++++++ .../java/chching/record/IncomeListTest.java | 17 +++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index c91b88f872..fb32c7c6bd 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -47,6 +47,12 @@ public class EditExpenseCommandTest { private ExpenseList expenses; private Expense groceries; + /** + * Set up the test environment. + * creates ExpenseList expenses with one Expense groceries. + * groceries has category GROCERIES_CATEGORY, description GROCERIES_DESCRIPTION, + * date GROCERIES_DATE, value GROCERIES_VALUE. + */ @BeforeEach void setUp() { ui = new Ui(); @@ -59,7 +65,8 @@ void setUp() { } /** - * Junit Test for normal expected edit scenario + * Junit Test for EditExpenseCommand.execute() when the command is valid. + * The category, description, date and value of groceries should be updated. */ @Test void execute_normalScenario_success() { diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index e9d25a1a86..383e175190 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -19,6 +19,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +/** + * Junit Test for EditIncomeCommand + */ public class EditIncomeCommandTest { public static final String SALARY_DESCRIPTION = "salary"; public static final int SALARY_VALUE = 5000; @@ -40,6 +43,12 @@ public class EditIncomeCommandTest { private IncomeList incomes; private ExpenseList expenseList; private Income salary; + + /** + * Set up the test environment. + * creates IncomeList incomes with one Income salary. + * salary has description SALARY_DESCRIPTION, date SALARY_DATE, value SALARY_VALUE. + */ @BeforeEach void setUp() { ui = new Ui(); @@ -51,6 +60,10 @@ void setUp() { incomes = new IncomeList(incomeList); } + /** + * JUnit Test for EditIncomeCommand.execute() when the command is valid. + * The description, date and value of the income should be updated. + */ @Test void execute_normalScenario_success() { try { @@ -72,6 +85,10 @@ void execute_normalScenario_success() { } } + /** + * JUnit Test for EditIncomeCommand.execute() when there is no index given. + * ChChingException should be thrown indicating "Missing/Invalid index". + */ @Test void execute_noIndex_exceptionThrown() { try { @@ -89,6 +106,10 @@ void execute_noIndex_exceptionThrown() { } } + /** + * JUnit Test for EditIncomeCommand.execute() when the index given is negative. + * ChChingException should be thrown indicating "Negative/Zero index". + */ @Test void execute_negativeIndex_exceptionThrown() { try { @@ -107,6 +128,10 @@ void execute_negativeIndex_exceptionThrown() { } } + /** + * JUnit Test for EditIncomeCommand.execute() when the index given more than size of incomes. + * ChChingException should be thrown indicating "The index is too big". + */ @Test void execute_indexOutOfBounds_exceptionThrown() { try { @@ -125,6 +150,10 @@ void execute_indexOutOfBounds_exceptionThrown() { } } + /** + * JUnit Test for EditIncomeCommand.execute() when there are no fields given to be edited. + * ChChingException should be thrown indicating "No fields to edit". + */ @Test void execute_noFields_exceptionThrown() { try { diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 13d49d0baf..547ed463fb 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -22,6 +22,11 @@ class IncomeListTest { private Income income; private IncomeList incomes; + /** + * Set up the test environment. + * creates IncomeList incomes with one Income income. + * income has description DESCRIPTION, date DATE, value INCOME_VALUE. + */ @BeforeEach void setUp() { income = new Income(DESCRIPTION, DATE, INCOME_VALUE); @@ -42,6 +47,10 @@ void getExpenseCount_one_expectOne() { assertEquals(1, list.getRecordCount()); } + /** + * Junit Test to test if editIncome method can edit description of income. + * income should only have its description changed to "bonus" + */ @Test void editIncome_editDescription_success() { String expectedOutputDescription = "bonus"; @@ -56,6 +65,10 @@ void editIncome_editDescription_success() { } } + /** + * Junit Test to test if editIncome method can edit date of income. + * income should only have its date changed to 05-04-2024. + */ @Test void editIncome_editDate_success() { LocalDate expectedOutputDate = LocalDate.parse("05-04-2024", FORMATTER); @@ -70,6 +83,10 @@ void editIncome_editDate_success() { } } + /** + * Junit Test to test if editIncome method can edit value of income. + * income should only have its value changed to 200000. + */ @Test void editIncome_editValue_success() { float expectedOutputValue = (float) 200000; From 939b200d7bd76eb79ba5f82b22d8c73758d57311 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 15:24:37 +0800 Subject: [PATCH 175/364] Update variable name to pass gradlew check's checkstyle --- src/test/java/chching/command/ShowTargetCommandTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/chching/command/ShowTargetCommandTest.java b/src/test/java/chching/command/ShowTargetCommandTest.java index 25e5c56615..347af96ae0 100644 --- a/src/test/java/chching/command/ShowTargetCommandTest.java +++ b/src/test/java/chching/command/ShowTargetCommandTest.java @@ -35,7 +35,7 @@ public class ShowTargetCommandTest { private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); private String convertedCurrencies; - private String EXPECTED_STRING; + private String expectedString; @BeforeEach void setUp() { @@ -50,7 +50,7 @@ void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); selector.setCurrency("HKD"); convertedCurrencies = converter.printConverter(350, selector); - EXPECTED_STRING = "Current target: " + 350.0 + " SGD" + convertedCurrencies; + expectedString = "Current target: " + 350.0 + " SGD" + convertedCurrencies; } @@ -62,7 +62,7 @@ public void execute_showTargetCommand_success() { try { Command command = new ShowTargetCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - assertEquals(EXPECTED_STRING, outputStreamCaptor.toString().trim()); + assertEquals(expectedString, outputStreamCaptor.toString().trim()); } catch (Exception e) { System.out.println(e.getMessage()); } From 2ead7aaf5018400aa124406098275f76148ebcea Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 19:49:23 +0800 Subject: [PATCH 176/364] Update user guide with correct edit record format Update showHelp method in Ui class to add edit records description --- docs/UserGuide.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9c380403a2..4bf00d180d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -54,28 +54,34 @@ Format: Edit an existing expense/income that is currently in the list. Format: -
    `edit expense i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` - +
    `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
    `edit income /i INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]` +
    where [] indicates optional fields. Use case: * Edits the item at the specified INDEX, where INDEX is a positive integer. * At least one of the fields must be provided. +* User inputs desired fields to be edited. * Existing values will be updated to the input values. Example of usage: -`edit expense i/1 d/Lunch @Technoedge v/5.20` +`edit expense /i 1 /de Lunch @Technoedge /v 5.20` +`edit income /i 2 /da 12-12-2022 /v 100` ### Finding an entry: `find` Find an existing expense/income that is currently in the list. Format: -
    `find expense c/CATEGORY de/DESCRIPTION` +
    `find expense /c CATEGORY /de DESCRIPTION` +
    `find income /de DESCRIPTION` Use case: * Shows user the entry that they are looking for. Example of usage: -
    `find expense c/Grocery de/Beef` +
    `find expense /c Grocery /de Beef` +
    `find income /de Salary` + ### Showing the balance: `balance` Shows users the balance he has after calculating the difference of income and expense. @@ -143,17 +149,15 @@ When reading from the file, entries for income and expenses are stored in their ## Command Summary -{Give a 'cheat sheet' of commands here} - * Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` * Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` * List Records: `list` * List Expenses: `list expense` * List Incomes: `list income` -* Edit income list: `edit income i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` -* Edit expense list: `edit expense i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` -* Find income entry: `find income c/CATEGORY de/DESCRIPTION` -* Find expense entry: `find expense c/CATEGORY de/DESCRIPTION` +* Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` +* Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +* Find income entry: `find income /c CATEGORY /de DESCRIPTION` +* Find expense entry: `find expense /c CATEGORY /de DESCRIPTION` * Delete Expense: `delete expense /in INDEX` * Delete Income: `delete income /in INDEX` * Clear income list: `clear income` From c0795db7343f392acd4c77eda1b05a9126643b27 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 19:50:00 +0800 Subject: [PATCH 177/364] Update showHelp method in Ui class to include edit records description --- src/main/java/chching/Ui.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 4c17fdae78..cbaf38bad9 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -100,6 +100,10 @@ public static void showHelp() { System.out.println(" SHOW ALL RECORDS:"); System.out.println(" list"); System.out.println(); + System.out.println(" EDIT RECORDS:"); + System.out.println(" edit expense /in [/c ] [/de ] [/da ] [/v ]"); + System.out.println(" edit income /in [/de ] [/da ] [/v ]"); + System.out.println(); System.out.println(" DELETE RECORDS:"); System.out.println(" delete expense /in "); System.out.println(" delete income /in "); From b3198a7ca30f3cbebce2aee5e20dc926c8294e4e Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 28 Mar 2023 20:00:00 +0800 Subject: [PATCH 178/364] Fix balance bug --- src/main/java/chching/ChChing.java | 3 +++ src/main/java/chching/command/BalanceCommand.java | 6 +++--- src/main/java/chching/parser/TargetParser.java | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index e9c268902f..1c8bcb7a13 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -6,6 +6,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.Target; import chching.record.TargetStorage; public class ChChing { @@ -15,6 +16,7 @@ public class ChChing { private Selector selector; private Converter converter; private TargetStorage targetStorage; + private Target target = new Target(0); private Ui ui; /** @@ -30,6 +32,7 @@ public ChChing(String filePath) { this.selector = new Selector(); this.converter = new Converter(); this.targetStorage = new TargetStorage(); + this.targetStorage.addTarget(target); } catch (Exception e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index ecb04dde31..05e8fa254d 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -49,14 +49,14 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto assert balance <= totalIncome : "Wrong calculations"; String convertedBalance = converter.printConverter(balance, selector); ui.showBalance(totalExpense, totalIncome, balance, convertedBalance); - System.out.println(" Current target:" + currentTarget); System.out.println(); + System.out.println(" Current target:"); System.out.println(" SGD " + String.format("%.02f", currentTarget)); if (balance >= currentTarget) { - System.out.println("Great work! You have met your target goal."); + System.out.println(" Great work! You have met your target goal."); } else { - System.out.println("Balance has not reached your target goal. Keep on pushing!"); + System.out.println(" Balance has not reached your target goal. Keep on pushing!"); } } } diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index 60f80d0c68..197e9190d5 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -18,8 +18,8 @@ public class TargetParser { public static Target parseTarget(HashMap argumentsByField) throws ChChingException { Target targ = null; try { - Double targValue = Double.valueOf(argumentsByField.get("v")); - targ = new Target(targValue); + Double targetValue = Double.valueOf(argumentsByField.get("v")); + targ = new Target(targetValue); } catch (Exception e) { throw new ChChingException("Trouble adding target value"); } From b4b93c70d007de6f205d5907234dbcfbeb05b678 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 20:02:41 +0800 Subject: [PATCH 179/364] update code to pass gradlewcheck --- src/main/java/chching/Ui.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index cbaf38bad9..6160e43cf0 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -101,7 +101,8 @@ public static void showHelp() { System.out.println(" list"); System.out.println(); System.out.println(" EDIT RECORDS:"); - System.out.println(" edit expense /in [/c ] [/de ] [/da ] [/v ]"); + System.out.println(" edit expense /in [/c ] [/de ] [/da ] " + + "[/v ]"); System.out.println(" edit income /in [/de ] [/da ] [/v ]"); System.out.println(); System.out.println(" DELETE RECORDS:"); From 10faa0d503648f80cd223042ff5906350090b6ef Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 20:37:22 +0800 Subject: [PATCH 180/364] Moved images folder into docs folder to allow Github pages to render images --- docs/DeveloperGuide.md | 16 ++++++++-------- .../DeleteIncomeCommand_sequence_diagram.png | Bin .../EditExpenseCommand_sequence_diagram.png | Bin .../EditIncomeCommand_activity_diagram.png | Bin .../EditIncomeCommand_sequence_diagram.png | Bin .../ListExpenseCommand_Sequence_Diagram.png | Bin .../images}/Record_RecordList_UML_class.png | Bin .../SetCurrencyCommand_sequence_diagram.png | Bin {images => docs/images}/SetTargetCommand.png | Bin {images => docs/images}/Target_UML.png | Bin 10 files changed, 8 insertions(+), 8 deletions(-) rename {images => docs/images}/DeleteIncomeCommand_sequence_diagram.png (100%) rename {images => docs/images}/EditExpenseCommand_sequence_diagram.png (100%) rename {images => docs/images}/EditIncomeCommand_activity_diagram.png (100%) rename {images => docs/images}/EditIncomeCommand_sequence_diagram.png (100%) rename {images => docs/images}/ListExpenseCommand_Sequence_Diagram.png (100%) rename {images => docs/images}/Record_RecordList_UML_class.png (100%) rename {images => docs/images}/SetCurrencyCommand_sequence_diagram.png (100%) rename {images => docs/images}/SetTargetCommand.png (100%) rename {images => docs/images}/Target_UML.png (100%) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c05ecbf9d5..e36c918276 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -14,7 +14,7 @@ The main class in our program is the ```Record``` and ```RecordList``` abstract classes, in which ```Income```, ```Expense``` will inherit from ```Record``` and ```IncomeList``` and ```ExpenseList``` will inherit from ```RecordList```. Most commands will act on instances of the ```Income```, ```Expense```,```IncomeList``` and ```ExpenseList``` classes. -![Record Class](../images/Record_RecordList_UML_class.png) +![Record Class](images/Record_RecordList_UML_class.png) ### DeleteIncomeCommand @@ -26,13 +26,13 @@ Entering any of these optional lines will result in early termination of the com Or else, the command will continue to delete the entry at the particular index. Afterwards, the ```execute()``` method will print ```"Income deleted, here is the updated list:"``` and prints the entries in the income list. -![Record Class](../images/DeleteIncomeCommand_sequence_diagram.png) +![Record Class](images/DeleteIncomeCommand_sequence_diagram.png) ### Target and TargetStorage The `Target` and `TargetStorage` class allows users to set a target for their ideal balance. -![Target Class](../images/Target_UML.png) +![Target Class](images/Target_UML.png) ### [Proposed] EditIncomeCommand/EditExpenseCommand The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. @@ -45,13 +45,13 @@ Given below is how the edit income mechanism works at each step: 3. `EditIncomeCommand` will then perform its `execute` method, where for each field to be edited, it will call `editIncome` method from the `ExpenseList` class. This would then update the required income record accordingly. The following sequence diagram shows how the edit income command works: -
    ![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) +
    ![edit income sequence diagram](images/EditIncomeCommand_sequence_diagram.png) The edit expense command works in a similar way, with its sequence diagram as shown: -
    ![edit expense sequence diagram](../images/EditExpenseCommand_sequence_diagram.png) +
    ![edit expense sequence diagram](images/EditExpenseCommand_sequence_diagram.png) The following activity diagram summarises what happens when a user executes edit income command: -
    ![edit income activity diagram](../images/EditIncomeCommand_activity_diagram.png) +
    ![edit income activity diagram](images/EditIncomeCommand_activity_diagram.png)
    Note that edit expense command produces the same activity diagram. **Design Considerations** @@ -75,14 +75,14 @@ The listExpenseCommand is facilitated by ```Parser```, ```ListExpenseCommand``` is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of expenses in ```expenses```. -![ListExpenseCommand](../images/ListExpenseCommand_Sequence_Diagram.png) +![ListExpenseCommand](images/ListExpenseCommand_Sequence_Diagram.png) ### SetTargetCommand The setTargetCommand is facilitated by ```ChChing```, ```Parser```, ```TargetParser```, ```TargetStorage```. When the command receives to set target, the ```parse()``` method of the ```Parser``` object will read in the command and call the ```parseTarget()``` method from the TargetParser class to instantiate a Target object and initializes a target value. Afterwards, ```parse()``` method calls the ```AddTargetCommand``` and instantiate a ```SetTargetCommand``` object and returns to the ```Parser``` object. The ```Parser``` object then returns to ```ChChing```. ```ChChing``` object then runs the ```execute()``` method of the SetTargetCommand object. The method then calls the ```setTarget()``` method of the ```TargetStorage``` object to store the previously initialized ```Target``` object. -![SetTargetCommand UML](../images/SetTargetCommand.png) +![SetTargetCommand UML](images/SetTargetCommand.png) ### SetCurrencyCommand The setCurrencyCommand is facilitated by ```System```, ```Selector```, ```UI``` and ```ExpenseList```. The command receives the instruction from ```UI``` and will call the ```execute``` method. diff --git a/images/DeleteIncomeCommand_sequence_diagram.png b/docs/images/DeleteIncomeCommand_sequence_diagram.png similarity index 100% rename from images/DeleteIncomeCommand_sequence_diagram.png rename to docs/images/DeleteIncomeCommand_sequence_diagram.png diff --git a/images/EditExpenseCommand_sequence_diagram.png b/docs/images/EditExpenseCommand_sequence_diagram.png similarity index 100% rename from images/EditExpenseCommand_sequence_diagram.png rename to docs/images/EditExpenseCommand_sequence_diagram.png diff --git a/images/EditIncomeCommand_activity_diagram.png b/docs/images/EditIncomeCommand_activity_diagram.png similarity index 100% rename from images/EditIncomeCommand_activity_diagram.png rename to docs/images/EditIncomeCommand_activity_diagram.png diff --git a/images/EditIncomeCommand_sequence_diagram.png b/docs/images/EditIncomeCommand_sequence_diagram.png similarity index 100% rename from images/EditIncomeCommand_sequence_diagram.png rename to docs/images/EditIncomeCommand_sequence_diagram.png diff --git a/images/ListExpenseCommand_Sequence_Diagram.png b/docs/images/ListExpenseCommand_Sequence_Diagram.png similarity index 100% rename from images/ListExpenseCommand_Sequence_Diagram.png rename to docs/images/ListExpenseCommand_Sequence_Diagram.png diff --git a/images/Record_RecordList_UML_class.png b/docs/images/Record_RecordList_UML_class.png similarity index 100% rename from images/Record_RecordList_UML_class.png rename to docs/images/Record_RecordList_UML_class.png diff --git a/images/SetCurrencyCommand_sequence_diagram.png b/docs/images/SetCurrencyCommand_sequence_diagram.png similarity index 100% rename from images/SetCurrencyCommand_sequence_diagram.png rename to docs/images/SetCurrencyCommand_sequence_diagram.png diff --git a/images/SetTargetCommand.png b/docs/images/SetTargetCommand.png similarity index 100% rename from images/SetTargetCommand.png rename to docs/images/SetTargetCommand.png diff --git a/images/Target_UML.png b/docs/images/Target_UML.png similarity index 100% rename from images/Target_UML.png rename to docs/images/Target_UML.png From be5f140a49b16d9506fd57ff8d28fce612ed71f0 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 28 Mar 2023 20:49:02 +0800 Subject: [PATCH 181/364] Updated to show table properly on Github Pages --- docs/DeveloperGuide.md | 3 +-- docs/_config.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e36c918276..46ff4bab95 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -93,8 +93,7 @@ Afterwards, the ```execute()``` method will call the ```printSelector()``` metho The ```printSelector()``` method will print all the available currencies in the selector hashmap. The selected currencies will be marked with a ```[X]``` and the unselected currencies will be marked with a ```[ ]```. -
    ![Set Currency Sequence Diagram](../images/SetCurrencyCommand_sequence_diagram.png) - +![SetCurrencyCommand_sequence_diagram.png](images%2FSetCurrencyCommand_sequence_diagram.png) ## Product scope diff --git a/docs/_config.yml b/docs/_config.yml index 88342ad3f3..0d7519b102 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ #Build Settings theme: minima - +markdown: GFM From 62975d83f857d51b41c5031a078ae590d0f53c23 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 28 Mar 2023 21:13:30 +0800 Subject: [PATCH 182/364] implement FindCommand and error handling --- docs/UserGuide.md | 6 +++-- src/main/java/chching/Ui.java | 24 +++++++++++++++++++ .../java/chching/command/FindCommand.java | 22 ++++++++++------- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4bf00d180d..30c03421d5 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -71,9 +71,11 @@ Example of usage: ### Finding an entry: `find` Find an existing expense/income that is currently in the list. +* CATEGORY is either `income` or `expense` + Format: -
    `find expense /c CATEGORY /de DESCRIPTION` -
    `find income /de DESCRIPTION` +
    `find /c CATEGORY /k DESCRIPTION` + Use case: * Shows user the entry that they are looking for. diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 6160e43cf0..cc1369750a 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -90,6 +90,30 @@ public void showMatchedRecord(RecordList records) { System.out.println(" No matching records for those keyword"); } + } + public void showMatchedIncome(IncomeList incomes) { + if (incomes.size() > 0) { + System.out.println(" Here are the matching records in your list:"); + + for (int i = 0; i < incomes.size(); i++) { + System.out.println(" " + (i+1) + ". " + incomes.get(i)); + } + } else { + System.out.println(" No matching records for those keyword"); + } + + } + public void showMatchedExpense(ExpenseList expenses) { + if (expenses.size() > 0) { + System.out.println(" Here are the matching records in your list:"); + + for (int i = 0; i < expenses.size(); i++) { + System.out.println(" " + (i+1) + ". " + expenses.get(i)); + } + } else { + System.out.println(" No matching records for those keyword"); + } + } public static void showHelp() { diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 263aeec43b..edf3f279e2 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -9,6 +9,7 @@ import chching.record.Expense; import chching.record.ExpenseList; import chching.record.TargetStorage; +import chching.ChChingException; /** * model a class to handle the find command. inherit from Command class. @@ -34,29 +35,34 @@ public FindCommand(String category, String keyword) { */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter, TargetStorage targetStorage) { - + Converter converter, TargetStorage targetStorage) throws ChChingException { IncomeList incomesMatched = new IncomeList(); ExpenseList expensesMatched = new ExpenseList(); + if(category == null) { + throw new ChChingException("No category specified"); + } else if(keyword == null) { + throw new ChChingException("No keyword specified"); + } else if(!category.equals("income") && !category.equals("expense")) { + throw new ChChingException("Category must be income or expense"); + } - if (category == "income") { + if (category.equals("income")) { for (int i = 0; i < incomes.size(); i++) { Income income = incomes.get(i); if (income.toString().contains(keyword)) { - incomesMatched.addRecord(income); + incomesMatched.addIncome(income); } } - ui.showMatchedRecord(incomesMatched); + ui.showMatchedIncome(incomesMatched); } else { for (int i = 0; i < expenses.size(); i++) { Expense expense = expenses.get(i); if (expense.toString().contains(keyword)) { - expensesMatched.addRecord(expense); + expensesMatched.addExpense(expense); } } - ui.showMatchedRecord(expensesMatched); + ui.showMatchedExpense(expensesMatched); } } - } From be1372734ebb4b0312a69bb447bee188405332aa Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 28 Mar 2023 21:16:40 +0800 Subject: [PATCH 183/364] implement FindCommand and error handling --- src/main/java/chching/command/FindCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index edf3f279e2..57781675b0 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -43,7 +43,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if(keyword == null) { throw new ChChingException("No keyword specified"); } else if(!category.equals("income") && !category.equals("expense")) { - throw new ChChingException("Category must be income or expense"); + throw new ChChingException("Category specified must be income or expense"); } if (category.equals("income")) { From 4ae1a2f63821f1396eca39ccd4e697eedfef0749 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 28 Mar 2023 21:35:54 +0800 Subject: [PATCH 184/364] Edit sequence diagram for ListExpenseCommand --- docs/DeveloperGuide.md | 3 +++ .../ListExpenseCommand_Sequence_Diagram.puml | 22 ++++++++++++++---- .../ListExpenseCommand_Sequence_Diagram.png | Bin 13041 -> 14475 bytes 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c05ecbf9d5..f75f881ef9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -64,6 +64,9 @@ The following activity diagram summarises what happens when a user executes edit * Pros: Easier to implement. * Cons: Not any easier than having the user to just delete and add new expense/income. +### AddIncomeCommand + + ### ListExpenseCommand The listExpenseCommand is facilitated by ```Parser```, ```ListExpenseCommand``` and ```ExpenseList```. diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml index a8de362d7d..d9c845df3c 100644 --- a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -1,8 +1,22 @@ @startuml -class chching.command.ListExpenseCommand { -+ void execute(IncomeList,ExpenseList,Ui,Storage,Selector,Converter,TargetStorage) -} +participant ":Parser" as Parser +participant ":ListExpenseCommand" as ListExpenseCommand +participant "expenses:ExpenseList" as ExpenseList +activate Parser + +create ListExpenseCommand +Parser -> ListExpenseCommand : ListExpenseCommand(args) +ListExpenseCommand -> ListExpenseCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) + +activate ListExpenseCommand +ListExpenseCommand -> ExpenseList : printExpenseList(selector, converter) + +activate ExpenseList +ExpenseList --> ListExpenseCommand + +deactivate ExpenseList +deactivate ListExpenseCommand +deactivate Parser -chching.command.Command <|-- chching.command.ListExpenseCommand @enduml \ No newline at end of file diff --git a/images/ListExpenseCommand_Sequence_Diagram.png b/images/ListExpenseCommand_Sequence_Diagram.png index a0dae9768f0ff645fa7dca04bc69ad234a829765..e298c337ce0d6730a1358f0d9f13eb95453f949f 100644 GIT binary patch literal 14475 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 Date: Tue, 28 Mar 2023 23:00:25 +0800 Subject: [PATCH 185/364] Add AddIncomeCommand description and UML diagram to DG --- docs/DeveloperGuide.md | 14 +++++--- .../AddIncomeCommand_Sequence_Diagram.puml | 33 ++++++++++++++++++ .../ListExpenseCommand_Sequence_Diagram.puml | 5 +-- images/AddIncomeCommand_Sequence_Diagram.png | Bin 0 -> 18637 bytes 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml create mode 100644 images/AddIncomeCommand_Sequence_Diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f75f881ef9..1cc7adf769 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -65,16 +65,22 @@ The following activity diagram summarises what happens when a user executes edit * Cons: Not any easier than having the user to just delete and add new expense/income. ### AddIncomeCommand - - +The AddIncomeCommand is facilitated by ```Parser```, ```AddIncomeCommand```, ```IncomeList``` and ```Ui```. +1. The user inputs the command to add income. This input is handled by ```parser``` which if successful, returns the ```AddIncomeCommand```. +2. ```AddIncomeCommand``` will call its ```execute``` method +which calls the ```IncomeList``` method ```addIncome``` to add the input into ```incomes```. +3. ```execute``` then calls the ```Ui``` method ```showAdded``` which makes use of ```System``` +to print the ```Income``` added. + +![AddIncomeCommand](../images/AddIncomeCommand_Sequence_Diagram.png) ### ListExpenseCommand The listExpenseCommand is facilitated by ```Parser```, ```ListExpenseCommand``` and ```ExpenseList```. -1. The user inputs the command top list expense. This input is handled by```Parser``` which returns the +1. The user inputs the command to list expense. This input is handled by```Parser``` which returns the ```listExpenseCommand``` if successful. 2. ```ListExpenseCommand``` will then call its ```execute``` method which makes use of ```System``` to print a new line ```"Expenses:"```. -3. The ```expenseList``` method ```printExpenseList``` +3. The ```ExpenseList``` method ```printExpenseList``` is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of expenses in ```expenses```. diff --git a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml new file mode 100644 index 0000000000..0da8a5a5d0 --- /dev/null +++ b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml @@ -0,0 +1,33 @@ +@startuml +participant ":Parser" as Parser +participant ":AddIncomeCommand" as AddIncomeCommand +participant "incomes:IncomeList" as IncomeList +participant ":Ui" as Ui + +activate Parser +create AddIncomeCommand +activate AddIncomeCommand +Parser -> AddIncomeCommand : AddIncomeCommand(income) +AddIncomeCommand -> AddIncomeCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) + +activate AddIncomeCommand + +AddIncomeCommand -> IncomeList : addIncome(income) +activate IncomeList +IncomeList --> AddIncomeCommand +deactivate IncomeList + +AddIncomeCommand -> Ui +activate Ui +Ui -> Ui : showAdded(incomes, expenses, income) +activate Ui +Ui --> AddIncomeCommand +deactivate Ui + + +deactivate AddIncomeCommand +deactivate IncomeList +deactivate Parser +deactivate Ui + +@enduml \ No newline at end of file diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml index d9c845df3c..48424213b7 100644 --- a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -4,17 +4,14 @@ participant ":ListExpenseCommand" as ListExpenseCommand participant "expenses:ExpenseList" as ExpenseList activate Parser - create ListExpenseCommand +activate ListExpenseCommand Parser -> ListExpenseCommand : ListExpenseCommand(args) ListExpenseCommand -> ListExpenseCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) - activate ListExpenseCommand ListExpenseCommand -> ExpenseList : printExpenseList(selector, converter) - activate ExpenseList ExpenseList --> ListExpenseCommand - deactivate ExpenseList deactivate ListExpenseCommand deactivate Parser diff --git a/images/AddIncomeCommand_Sequence_Diagram.png b/images/AddIncomeCommand_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b9685018707e35ea71b1befa01ec7d98a4750816 GIT binary patch literal 18637 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 G=zjr9qR!F) literal 0 HcmV?d00001 From 84fe89afdd4957d1bb626320e387e5cf49d684db Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 29 Mar 2023 11:01:32 +0800 Subject: [PATCH 186/364] update user guide for Find feature --- docs/UserGuide.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 30c03421d5..10149db93a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -71,18 +71,17 @@ Example of usage: ### Finding an entry: `find` Find an existing expense/income that is currently in the list. -* CATEGORY is either `income` or `expense` +* CATEGORY is specified as either `income` or `expense` Format:
      `find /c CATEGORY /k DESCRIPTION` - Use case: * Shows user the entry that they are looking for. Example of usage: -
      `find expense /c Grocery /de Beef` -
      `find income /de Salary` +
      `find /c expense /k beef` +
      `find /c income /k salary` ### Showing the balance: `balance` Shows users the balance he has after calculating the difference of income and expense. @@ -122,6 +121,7 @@ Clear the entire list of incomes and expenses. Format:
      `clear all` + ### Set a target for balance of finances: `add target` Allows users to set a target for their balance. @@ -158,8 +158,7 @@ When reading from the file, entries for income and expenses are stored in their * List Incomes: `list income` * Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` * Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -* Find income entry: `find income /c CATEGORY /de DESCRIPTION` -* Find expense entry: `find expense /c CATEGORY /de DESCRIPTION` +* Find entry: `find income /c CATEGORY /k DESCRIPTION` * Delete Expense: `delete expense /in INDEX` * Delete Income: `delete income /in INDEX` * Clear income list: `clear income` From d50fce11b8127c4f998a0670cc0663ff3614962f Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 29 Mar 2023 12:05:38 +0800 Subject: [PATCH 187/364] Add JUnit testing for execute method for AddExpenseCommand class --- .../command/AddExpenseCommandTest.java | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 1266320410..70a0820e85 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -1,6 +1,14 @@ package chching.command; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -20,8 +28,46 @@ public class AddExpenseCommandTest { static final float EXPENSE_VALUE = (float) 1.50; static final float ZERO_EXPENSE_VALUE = (float) 0; static final float NEGATIVE_EXPENSE_VALUE = (float) -1.50; - - + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList incomes; + private ExpenseList expenses; + private Expense transport; + + /** + * Set up the test environment. + * creates an empty ExpenseList expenses and empty IncomeList incomes. + * transport has category CATEGORY, description DESCRIPTION, + * date DATE, value EXPENSE_VALUE. + */ + @BeforeEach + void setUp() { + ui = new Ui(); + + transport = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); + expenses = new ExpenseList(); + incomes = new IncomeList(); + } + + /** + * Junit Test when there is valid expense input + * to execute successfully and add to expenses + */ + @Test + void execute_normalScenario_success() { + try { + int expensesSize = expenses.getRecordCount(); + AddExpenseCommand command = new AddExpenseCommand(transport); + command.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); + assertEquals(expensesSize + 1, expenses.size()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } /** * Junit Test when there is null field for the expense input From 43aacbc0a27e2031a532744537d0a655b50b2776 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Wed, 29 Mar 2023 12:07:34 +0800 Subject: [PATCH 188/364] add HelpCommand diagram --- .../HelpCommand_sequence_diagram.puml | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/diagrams/HelpCommand_sequence_diagram.puml diff --git a/docs/diagrams/HelpCommand_sequence_diagram.puml b/docs/diagrams/HelpCommand_sequence_diagram.puml new file mode 100644 index 0000000000..d2da7f4dc6 --- /dev/null +++ b/docs/diagrams/HelpCommand_sequence_diagram.puml @@ -0,0 +1,33 @@ +@startuml + +participant ":ChChing" as ChChing +participant "c:Parser" as Parser +participant "c:HelpCommand" as HelpCommand + +[-> ChChing : run() +activate ChChing + +ChChing -> Parser : parse(line, incomes, expenses, ui) +activate Parser + +create HelpCommand +Parser -> HelpCommand : HelpCommand() +activate HelpCommand + +HelpCommand --> Parser +deactivate HelpCommand + +Parser --> ChChing : command +deactivate Parser + +ChChing -> HelpCommand : execute(incomes, expenses, ui, storage) +activate HelpCommand + + +HelpCommand --> ChChing +deactivate HelpCommand + +[<--ChChing +deactivate ChChing + +@enduml \ No newline at end of file From ca5eae746189faf536444d29b2a12552ff5c2620 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 29 Mar 2023 12:15:23 +0800 Subject: [PATCH 189/364] Add JUnit testing to execute method in AddIncomeCommand class --- .../command/AddExpenseCommandTest.java | 2 +- .../chching/command/AddIncomeCommandTest.java | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 70a0820e85..e875002d45 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -60,7 +60,7 @@ void setUp() { void execute_normalScenario_success() { try { int expensesSize = expenses.getRecordCount(); - AddExpenseCommand command = new AddExpenseCommand(transport); + Command command = new AddExpenseCommand(transport); command.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); assertEquals(expensesSize + 1, expenses.size()); } catch (Exception e) { diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 5535c25f8a..df3eed3ea9 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -1,6 +1,14 @@ package chching.command; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.Income; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.time.LocalDate; @@ -20,6 +28,44 @@ public class AddIncomeCommandTest { static final float INCOME_VALUE = (float) 500; static final float ZERO_INCOME_VALUE = (float) 0; static final float NEGATIVE_INCOME_VALUE = (float) -500; + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList incomes; + private ExpenseList expenses; + private Income salary; + + /** + * Set up the test environment. + * creates an empty ExpenseList expenses and empty IncomeList incomes. + * salary has description DESCRIPTION, date DATE, value INCOME_VALUE. + */ + @BeforeEach + void setUp() { + ui = new Ui(); + + salary = new Income(DESCRIPTION, DATE, INCOME_VALUE); + expenses = new ExpenseList(); + incomes = new IncomeList(); + } + + /** + * Junit Test when there is valid income input + * to execute successfully and add to incomes + */ + @Test + void execute_normalScenario_success() { + try { + Command addIncomeCommand = new AddIncomeCommand(salary); + addIncomeCommand.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); + assertEquals(1, incomes.size()); + assertEquals(salary, incomes.get(0)); + } catch (Exception e) { + fail(); + } + } /** * Junit Test when there is a null entry in the income input From 9d5df4ca1fd200b69458b833485b72f7ed354409 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 29 Mar 2023 12:53:04 +0800 Subject: [PATCH 190/364] Add JUnit testing for Parser class --- src/test/java/chching/ParserTest.java | 73 ++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index ec9ee4ed3b..26e98a9140 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -9,6 +9,8 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -18,14 +20,32 @@ public class ParserTest { static final String DE ="de breakfast"; static final String DA = "da 01/02/23"; static final String V = "v 3.50"; + static final String INVALID_INPUT = "invalid"; + static final String CATEGORY_FIELD = "c"; + static final String CATEGORY_VALUE = "meal"; + static final String DESCRIPTION_FIELD = "de"; + static final String DATE_FIELD = "da"; + static final String VALUE_FIELD = "v"; + static final String VALUE_VALUE = "3.50"; + static final String DATE_VALUE = "01/02/23"; + static final String DESCRIPTION_VALUE = "breakfast"; + static final String KEYWORD_FIELD = "k"; + static final String KEYWORD_VALUE = "hello"; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + /** + * Sets up the output stream to capture the output of the system. + */ @BeforeEach public void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); } + /** + * JUnit test for splitLine method. + * Checks if the method splits the input line into the correct format. + */ @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); @@ -38,6 +58,10 @@ public void splitLine_testScenario_expectedBehaviour() { assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); } + /** + * JUnit test for sortArguments method. + * Checks if the arguments are sorted in the expected behaviour. + */ @Test public void sortArguments_testScenario_expectedBehaviour() throws ChChingException { List input = new ArrayList(); @@ -55,6 +79,10 @@ public void sortArguments_testScenario_expectedBehaviour() throws ChChingExcepti assertEquals(expectedOutput, new Parser().sortArguments(input)); } + /** + * JUnit test for sortArguments method. + * Checks if the method returns an empty HashMap if the input is empty. + */ @Test public void sortArguments_emptyInput_returnsEmptyHashMap() throws ChChingException { List input = new ArrayList(); @@ -62,7 +90,50 @@ public void sortArguments_emptyInput_returnsEmptyHashMap() throws ChChingExcepti HashMap expectedOutput = new HashMap(); assertEquals(expectedOutput, new Parser().sortArguments(input)); } - + + /** + * JUnit test for sortArguments method. + * Checks if the method throws an exception if the input is invalid. + */ + @Test + public void sortArguments_invalidInput_throwsException() { + List input = new ArrayList(); + input.add(INVALID_INPUT); + + try { + new Parser().sortArguments(input); + fail(); // the test should not reach this line + } catch (ChChingException e) { + assertEquals("arguments not inputted correctly or missing a value", e.getMessage()); + } + } + + /** + * JUnit test for getCategory method. + * Checks if the method returns the category properly. + */ + @Test + public void getCategory_testScenario_expectedBehaviour() throws ChChingException { + HashMap input = new HashMap(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_VALUE); + input.put(VALUE_FIELD, VALUE_VALUE); + + assertEquals(CATEGORY_VALUE, new Parser().getCategory(input)); + } + + /** + * JUnit test for getKeyword method. + * Checks if the method returns the keyword properly. + */ + @Test + public void getKeyword_normalScenario_expectedBehaviour() throws ChChingException { + HashMap input = new HashMap(); + input.put(KEYWORD_FIELD, KEYWORD_VALUE); + + assertEquals("hello", new Parser().getKeyword(input)); + } @AfterEach public void tearDown() { From f7ca4e9bf7eb7d6e442e81c1dbf3e40e36987969 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 29 Mar 2023 20:06:37 +0800 Subject: [PATCH 191/364] testing jar file --- docs/UserGuide.md | 119 ++++++++++++++++++++++++---------- src/main/java/chching/Ui.java | 27 +++++--- tp.jar | Bin 0 -> 82551 bytes 3 files changed, 104 insertions(+), 42 deletions(-) create mode 100644 tp.jar diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 10149db93a..771648cec9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -11,21 +11,26 @@ ChChing is a desktop app for tracking spending, and it uses a Command Line Inter 3. Copy downloaded `ChChing.jar` file to the desired home folder of choice. 4. Open a command terminal and `cd` into the folder mentioned in step 3. 5. Type in the following to run the application: + ``` java -jar ChChing.jar ``` + 6. If successful, the following greeting should appear: + ``` ____________________________________________________________ Hello! I'm ChChing. What can I do for you? ____________________________________________________________ ``` + 7. Type in desired command to start using the program! List of commands are listed below ## Features ### Adding an entry: `add` + Creates a new entry for expenses or income, with respective input formats. Format: @@ -33,15 +38,17 @@ Format:
      `add income /de DESCRIPTION /da DATE /v VALUE` Use case: -* Re-prompts user if any field is not provided properly. -* VALUE will be stored as a positive float. -* Format for DATE will be dd-MM-yyyy. + +- Re-prompts user if any field is not provided properly. +- VALUE will be stored as a positive float. +- Format for DATE will be dd-MM-yyyy. Example of usage:
      `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50`
      `add income /c salary /de salary /da 22-03-2023 /v 500` ### Listing all expenses and incomes: `list` + Shows a full list of both the expenses and incomes created by the user. Includes the index number, category, description, and value.
      Can view list of expenses/incomes separately as well. @@ -51,45 +58,79 @@ Format:
      `list income` ### Updating an entry: `edit` + Edit an existing expense/income that is currently in the list. Format: -
      `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -
      `edit income /i INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]` +
      `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      `edit income /in INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]`
      where [] indicates optional fields. Use case: -* Edits the item at the specified INDEX, where INDEX is a positive integer. -* At least one of the fields must be provided. -* User inputs desired fields to be edited. -* Existing values will be updated to the input values. + +- Edits the item at the specified INDEX, where INDEX is a positive integer. +- At least one of the fields must be provided. +- User inputs desired fields to be edited. +- Existing values will be updated to the input values. Example of usage: -`edit expense /i 1 /de Lunch @Technoedge /v 5.20` -`edit income /i 2 /da 12-12-2022 /v 100` +`edit expense /in 1 /de Lunch @Technoedge /v 5.20` +`edit income /in 2 /da 12-12-2022 /v 100` + +### Setting currency to be converted: `set currency` + +Setting a currency that the user wants to convert to. So the converted amount will show in the list of expenses and incomes. + +Format: +
      `set currency /cr CURRENCY` + +Use case: + +- show the currency that users want to convert to. + +Example of usage: +
      `set currency /cr HKD` + +### Unset currency to be converted: `unset currency` + +Unset the currency that the user does not want to convert to. + +Format: +
      `unset currency /cr CURRENCY` + +Use case: + +- stop showing the currency that users do not want to convert to. + +Example of usage: +
      `unset currency /cr HKD` ### Finding an entry: `find` + Find an existing expense/income that is currently in the list. -* CATEGORY is specified as either `income` or `expense` +- CATEGORY is specified as either `income` or `expense` Format:
      `find /c CATEGORY /k DESCRIPTION` Use case: -* Shows user the entry that they are looking for. + +- Shows user the entry that they are looking for. Example of usage:
      `find /c expense /k beef`
      `find /c income /k salary` ### Showing the balance: `balance` + Shows users the balance he has after calculating the difference of income and expense. Format:
      `balance` ### Deleting an entry: `delete` + Remove an entry from the expense/income list. Format: @@ -97,74 +138,84 @@ Format:
      `delete income /in INDEX` Use case: -* INDEX is a positive integer. -* Prompts user if index is out of bounds. + +- INDEX is a positive integer. +- Prompts user if index is out of bounds. Example of usage:
      `delete expense /in 1`
      `delete income /in 2` ### Clear entire income list: `clear expense` + Clear the entire list of incomes. Format:
      `clear income` ### Clear entire expense list: `clear income` + Clear the entire list of expenses. Format:
      `clear expense` ### Clear entire both income and expense lists: `clear all` + Clear the entire list of incomes and expenses. Format:
      `clear all` ### Set a target for balance of finances: `add target` + Allows users to set a target for their balance. Format:
      `add target /v VALUE` Use case: -* VALUE is more than or equal to zero + +- VALUE is more than or equal to zero Example of usage:
      `add target 350` + ### Finding balance of finances: `balance` + Shows users the balance after calculating the difference between income and expenses and informs users on whether they have reached their target. Format:
      `balance` ### View help: `help` + Shows basic commands executable by the program and the use format for the commands Format:
      `help` ### Saving and loading of data -Record entries are saved in `data/chching.txt` file. This file is updated upon exit. + +Record entries are saved in `data/chching.txt` file. This file is updated upon exit. When reading from the file, entries for income and expenses are stored in their respective arrayList. ## Command Summary -* Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` -* Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` -* List Records: `list` -* List Expenses: `list expense` -* List Incomes: `list income` -* Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` -* Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -* Find entry: `find income /c CATEGORY /k DESCRIPTION` -* Delete Expense: `delete expense /in INDEX` -* Delete Income: `delete income /in INDEX` -* Clear income list: `clear income` -* Clear expense list: `clear expense` -* Clear both income and expense lists: `clear all` -* Set Target: `add target /v Value` -* Show Target: `show target` -* Show Balance: `balance` -* Show help: `help` +- Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` +- Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` +- List Records: `list` +- List Expenses: `list expense` +- List Incomes: `list income` +- Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` +- Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +- Find entry: `find income /c CATEGORY /k DESCRIPTION` +- Delete Expense: `delete expense /in INDEX` +- Delete Income: `delete income /in INDEX` +- Clear income list: `clear income` +- Clear expense list: `clear expense` +- Clear both income and expense lists: `clear all` +- Set Target: `add target /v Value` +- Show Target: `show target` +- Show Balance: `balance` +- Show help: `help` diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index cc1369750a..6fd4659259 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -37,11 +37,11 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); System.out.println(); - assert(incomes.size() >= 0); + assert (incomes.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } - + public void showEdited(int index, Record record, boolean isExpense) { if (isExpense) { System.out.println(" Got it. I've updated the expense in index " + index + " to"); @@ -84,31 +84,33 @@ public void showMatchedRecord(RecordList records) { System.out.println(" Here are the matching records in your list:"); for (int i = 0; i < records.getRecordCount(); i++) { - System.out.println(" " + (i+1) + ". " + records.get(i)); + System.out.println(" " + (i + 1) + ". " + records.get(i)); } } else { System.out.println(" No matching records for those keyword"); } } + public void showMatchedIncome(IncomeList incomes) { if (incomes.size() > 0) { System.out.println(" Here are the matching records in your list:"); for (int i = 0; i < incomes.size(); i++) { - System.out.println(" " + (i+1) + ". " + incomes.get(i)); + System.out.println(" " + (i + 1) + ". " + incomes.get(i)); } } else { System.out.println(" No matching records for those keyword"); } } + public void showMatchedExpense(ExpenseList expenses) { if (expenses.size() > 0) { System.out.println(" Here are the matching records in your list:"); for (int i = 0; i < expenses.size(); i++) { - System.out.println(" " + (i+1) + ". " + expenses.get(i)); + System.out.println(" " + (i + 1) + ". " + expenses.get(i)); } } else { System.out.println(" No matching records for those keyword"); @@ -128,6 +130,7 @@ public static void showHelp() { System.out.println(" edit expense /in [/c ] [/de ] [/da ] " + "[/v ]"); System.out.println(" edit income /in [/de ] [/da ] [/v ]"); + System.out.println(" Fields with [] are optional"); System.out.println(); System.out.println(" DELETE RECORDS:"); System.out.println(" delete expense /in "); @@ -136,16 +139,23 @@ public static void showHelp() { System.out.println(" SHOW BALANCE:"); System.out.println(" balance"); System.out.println(); - System.out.println(" CONVERT CURRENCY:"); - System.out.println(" convert /cr "); + System.out.println(" SET CURRENCY TO BE DISPLAYED:"); + System.out.println(" set currency /cr "); System.out.println(" Currencies available: HKD, PHP, IDR, MYR, VND"); System.out.println(); + System.out.println(" UNSET CURRENCY TO BE DISPLAYED:"); + System.out.println(" unset currency /cr "); + System.out.println(); System.out.println(" ADD TARGET:"); System.out.println(" add target /v "); System.out.println(); System.out.println(" SHOW TARGET:"); System.out.println(" show target"); System.out.println(); + System.out.println(" FIND AN INCOME/EXPENSE:"); + System.out.println(" find /k /c "); + System.out.println(" eg: find /k food /c expense"); + System.out.println(); System.out.println(" SHOW HELP:"); System.out.println(" help"); System.out.println(); @@ -165,7 +175,8 @@ public void showTargetAdded() { System.out.println(" Target added"); } - public void showListCleared(){ + + public void showListCleared() { System.out.println(" List/s cleared"); } } diff --git a/tp.jar b/tp.jar new file mode 100644 index 0000000000000000000000000000000000000000..74d27128fd88d6504f67807b3fbe98f600088206 GIT binary patch literal 82551 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≥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 Date: Wed, 29 Mar 2023 20:15:45 +0800 Subject: [PATCH 192/364] Add documentation --- src/main/java/chching/currency/Converter.java | 6 ++++++ src/main/java/chching/parser/Expenses.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/chching/currency/Converter.java b/src/main/java/chching/currency/Converter.java index fe6b213949..6d8ec0e42f 100644 --- a/src/main/java/chching/currency/Converter.java +++ b/src/main/java/chching/currency/Converter.java @@ -21,6 +21,12 @@ public double convert(String currency, double amount) { return amount * currencyMap.get(currency); } + /** + * Executes print converter + * + * @param value income value + * @param selector selector + */ public String printConverter(double value, Selector selector) { String result = ""; for (String currency : currencyMap.keySet()) { diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 5f10e682b9..881a7b3e10 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,6 +14,11 @@ public class Expenses { + /** + * Parses a date + * + * @param expenseDateString Input from users + */ public static LocalDate parseDate(String expenseDateString) throws ChChingException { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); @@ -23,6 +28,7 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept throw new ChChingException("Date format should be: dd-MM-yyyy"); } } + /** * Parses an expense into the expenseList * From a5bc806255fccfa8af58c1a380582e150b891be1 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 30 Mar 2023 15:11:57 +0800 Subject: [PATCH 193/364] Update User Guide to reflect changes made in v2.0 --- docs/UserGuide.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 771648cec9..2ad7d2f566 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,12 +8,12 @@ ChChing is a desktop app for tracking spending, and it uses a Command Line Inter 1. Ensure that you have Java 11 or above installed. 2. Down the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). -3. Copy downloaded `ChChing.jar` file to the desired home folder of choice. +3. Copy downloaded `tp.jar` file to the desired home folder of choice. 4. Open a command terminal and `cd` into the folder mentioned in step 3. 5. Type in the following to run the application: ``` -java -jar ChChing.jar +java -jar tp.jar ``` 6. If successful, the following greeting should appear: @@ -85,8 +85,13 @@ Format:
      `set currency /cr CURRENCY` Use case: - - show the currency that users want to convert to. +- List of supported currencies: + * HKD - Hong Kong Dollar + * PHP - Philippine Peso + * IDR - Indonesian Rupiah + * MYR - Malaysian Ringgit + * VND - Vietnamese Dong Example of usage:
      `set currency /cr HKD` @@ -179,7 +184,7 @@ Use case: - VALUE is more than or equal to zero Example of usage: -
      `add target 350` +
      `add target /v 350` ### Finding balance of finances: `balance` From 66e86aaf89d6997117d50f96e28e340bd4c81bd2 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 1 Apr 2023 13:45:46 +0800 Subject: [PATCH 194/364] Update userguide and fix bugs according to PED feedbacks --- docs/UserGuide.md | 78 +++++++++++++------ src/main/java/chching/Storage.java | 4 +- src/main/java/chching/Ui.java | 2 +- src/main/java/chching/parser/Expenses.java | 5 +- src/main/java/chching/parser/Incomes.java | 3 + src/main/java/chching/parser/Parser.java | 2 +- src/test/java/chching/ParserTest.java | 20 +++-- .../command/AddExpenseCommandTest.java | 2 + .../chching/command/AddIncomeCommandTest.java | 1 + .../chching/command/AddTargetCommandTest.java | 2 + .../chching/command/BalanceCommandTest.java | 1 + .../command/DeleteExpenseCommandTest.java | 1 + .../command/DeleteIncomeCommandTest.java | 1 + .../command/ShowTargetCommandTest.java | 1 + 14 files changed, 89 insertions(+), 34 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2ad7d2f566..5cbecf2c86 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,4 +1,26 @@ # User Guide + +* [User Guide](#user-guide) + * [Introduction](#introduction) + * [Quick Start](#quick-start) + * [Features](#features) + * [Adding an entry: `add`](#adding-an-entry--add) + * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) + * [Updating an entry: `edit`](#updating-an-entry--edit) + * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) + * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) + * [Finding an entry: `find`](#finding-an-entry--find) + * [Showing the balance: `balance`](#showing-the-balance--balance) + * [Deleting an entry: `delete`](#deleting-an-entry--delete) + * [Clear entire income list: `clear expense`](#clear-entire-income-list--clear-expense) + * [Clear entire expense list: `clear income`](#clear-entire-expense-list--clear-income) + * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) + * [Set a target for balance of finances: `add target`](#set-a-target-for-balance-of-finances--add-target) + * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) + * [View help: `help`](#view-help--help) + * [Saving and loading of data](#saving-and-loading-of-data) + * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) + ## Introduction @@ -17,6 +39,16 @@ java -jar tp.jar ``` 6. If successful, the following greeting should appear: +
      For first time users: +``` +Unfortunately, income list file can't be found. I'll make a new one! +Unfortunately, expense list can't be found. I'll make a new one! + ____________________________________________________________ + Hello! I'm ChChing. + What can I do for you? + ____________________________________________________________ +``` +
      For current users: ``` ____________________________________________________________ @@ -32,6 +64,7 @@ java -jar tp.jar ### Adding an entry: `add` Creates a new entry for expenses or income, with respective input formats. +
      Income and Expense values can only be at most 1000000. Format:
      `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` @@ -62,7 +95,7 @@ Format: Edit an existing expense/income that is currently in the list. Format: -
      `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      `edit expense /in INDEX [c/ CATEGORY] [de/ DESCRIPTION] [da/ DATE] [v/ VALUE]`
      `edit income /in INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]`
      where [] indicates optional fields. @@ -127,13 +160,6 @@ Example of usage:
      `find /c expense /k beef`
      `find /c income /k salary` -### Showing the balance: `balance` - -Shows users the balance he has after calculating the difference of income and expense. - -Format: -
      `balance` - ### Deleting an entry: `delete` Remove an entry from the expense/income list. @@ -172,19 +198,19 @@ Clear the entire list of incomes and expenses. Format:
      `clear all` -### Set a target for balance of finances: `add target` +### Set a target for balance of finances: `set target` Allows users to set a target for their balance. Format: -
      `add target /v VALUE` +
      `set target /v VALUE` Use case: -- VALUE is more than or equal to zero +- VALUE ranges from negative to postive Example of usage: -
      `add target /v 350` +
      `set target /v 350` ### Finding balance of finances: `balance` @@ -200,27 +226,35 @@ Shows basic commands executable by the program and the use format for the comman Format:
      `help` +### Exit: `exit` +Exit the program + +Format: +
      `exit` ### Saving and loading of data Record entries are saved in `data/chching.txt` file. This file is updated upon exit. When reading from the file, entries for income and expenses are stored in their respective arrayList. -## Command Summary +## Command Summary (Alphabetical Order) - Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` - Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` -- List Records: `list` -- List Expenses: `list expense` -- List Incomes: `list income` -- Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` -- Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -- Find entry: `find income /c CATEGORY /k DESCRIPTION` -- Delete Expense: `delete expense /in INDEX` -- Delete Income: `delete income /in INDEX` - Clear income list: `clear income` - Clear expense list: `clear expense` - Clear both income and expense lists: `clear all` -- Set Target: `add target /v Value` +- Delete Expense: `delete expense /in INDEX` +- Delete Income: `delete income /in INDEX` +- Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` +- Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +- Exit: `exit` +- Find entry: `find income /c CATEGORY /k DESCRIPTION` +- List Records: `list` +- List Expenses: `list expense` +- List Incomes: `list income` +- Set Target: `set target /v Value` - Show Target: `show target` - Show Balance: `balance` +- Set Currency: `set currency /cr CURRENCY` - Show help: `help` +- Unset Currency: `unset currency /cr CURRENCY` diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 1ebfa97135..e978e9ad78 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -51,7 +51,7 @@ public ArrayList loadIncomes() { reader.close(); } catch (FileNotFoundException e) { - System.out.println("Unfortunately, file can't be found. I'll make a new one!"); + System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); } return incomes; @@ -79,7 +79,7 @@ public ArrayList loadExpenses() { reader.close(); } catch (FileNotFoundException e) { - System.out.println("Unfortunately, file can't be found. I'll make a new one!"); + System.out.println("Unfortunately, expense list can't be found. I'll make a new one!"); } return expenses; diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 6fd4659259..0fdd93a660 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -177,6 +177,6 @@ public void showTargetAdded() { } public void showListCleared() { - System.out.println(" List/s cleared"); + System.out.println(" List(s) cleared"); } } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 881a7b3e10..7de82fa9c3 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -42,7 +42,10 @@ public static Expense parseExpense(HashMap argumentsByField) thr String expenseDateString = argumentsByField.get("da"); LocalDate expenseDate = parseDate(expenseDateString); float expenseValue = Float.parseFloat(argumentsByField.get("v")); - assert expenseValue > 0 : "Expense value should be greater than zero"; + if(expenseValue > 1000000){ + throw new ChChingException("Expense value can at most be 1000000"); + } + assert expenseValue > 0: "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { throw new ChChingException("Trouble adding expense value"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 8da69865e9..6e9b73c27b 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -31,6 +31,9 @@ public static Income parseIncome(HashMap argumentsByField) throw String incomeDateString = argumentsByField.get("da"); LocalDate incomeDate = parseDate(incomeDateString); float incomeValue = Float.parseFloat(argumentsByField.get("v")); + if(incomeValue > 1000000){ + throw new ChChingException("Income value can at most be 1000000"); + } assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index c2f31c0cf4..745e130b72 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -126,7 +126,7 @@ public static Command parse( command = new ClearAllCommand(); ui.showListCleared(); break; - case "add target": + case "set target": Target target = TargetParser.parseTarget(argumentsByField); command = new AddTargetCommand(target); ui.showTargetAdded(); diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 26e98a9140..d3f1160529 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,3 +1,5 @@ +/* @@author avielcx, thomasjalba */ + package chching; import chching.parser.Parser; @@ -49,15 +51,19 @@ public void setUp() { @Test public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); + expectedOutputsForExpectedBehaviour(expectedOutput); + + assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); + } + + private static void expectedOutputsForExpectedBehaviour(List expectedOutput) { expectedOutput.add(ADD_EXPENSE); expectedOutput.add(CA); expectedOutput.add(DE); expectedOutput.add(DA); expectedOutput.add(V); - - assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); } - + /** * JUnit test for sortArguments method. * Checks if the arguments are sorted in the expected behaviour. @@ -75,10 +81,10 @@ public void sortArguments_testScenario_expectedBehaviour() throws ChChingExcepti expectedOutput.put("de", "breakfast"); expectedOutput.put("da", "01/02/23"); expectedOutput.put("v", "3.50"); - + assertEquals(expectedOutput, new Parser().sortArguments(input)); } - + /** * JUnit test for sortArguments method. * Checks if the method returns an empty HashMap if the input is empty. @@ -99,7 +105,7 @@ public void sortArguments_emptyInput_returnsEmptyHashMap() throws ChChingExcepti public void sortArguments_invalidInput_throwsException() { List input = new ArrayList(); input.add(INVALID_INPUT); - + try { new Parser().sortArguments(input); fail(); // the test should not reach this line @@ -107,7 +113,7 @@ public void sortArguments_invalidInput_throwsException() { assertEquals("arguments not inputted correctly or missing a value", e.getMessage()); } } - + /** * JUnit test for getCategory method. * Checks if the method returns the category properly. diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index e875002d45..4f47706343 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -1,3 +1,5 @@ +/* @@author avielcx */ + package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index df3eed3ea9..579e4d494f 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -1,3 +1,4 @@ +/* @@author avielcx */ package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/AddTargetCommandTest.java b/src/test/java/chching/command/AddTargetCommandTest.java index 554108b14a..11564a25ba 100644 --- a/src/test/java/chching/command/AddTargetCommandTest.java +++ b/src/test/java/chching/command/AddTargetCommandTest.java @@ -1,3 +1,5 @@ +/* @@author avielcx */ + package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 86426be949..559bbf19d6 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -1,3 +1,4 @@ +/* @@author avielcx */ package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 8477067fd6..0c622e1cb8 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -1,3 +1,4 @@ +/* @@author avielcx */ package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 0e92ca32c6..42328e16af 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -1,3 +1,4 @@ +/* @@author avielcx */ package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/ShowTargetCommandTest.java b/src/test/java/chching/command/ShowTargetCommandTest.java index 347af96ae0..bf3e45bdca 100644 --- a/src/test/java/chching/command/ShowTargetCommandTest.java +++ b/src/test/java/chching/command/ShowTargetCommandTest.java @@ -1,3 +1,4 @@ +/* @@author avielcx */ package chching.command; import chching.Storage; From cf5e7fd1aa07d20f31931c548649e96afe230e4b Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 1 Apr 2023 13:48:55 +0800 Subject: [PATCH 195/364] Update --- src/test/java/chching/ParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index d3f1160529..ed573cd79a 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,4 +1,4 @@ -/* @@author avielcx, thomasjalba */ +/* @@author avielcx*/ package chching; From 0edda1240fdff4fb9e400b4712cc62ec0c87458b Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 1 Apr 2023 13:50:11 +0800 Subject: [PATCH 196/364] Update userguide and fix bugs as per PED feedbacks --- src/test/java/chching/ParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index ed573cd79a..30f8349f8e 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,4 +1,4 @@ -/* @@author avielcx*/ +/* @@author avielcx */ package chching; From 97b7cccce4bb1321bf723c11bfb41730aede5176 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 1 Apr 2023 14:01:44 +0800 Subject: [PATCH 197/364] fix UG --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5cbecf2c86..52dc5ecd87 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -177,7 +177,7 @@ Example of usage:
      `delete expense /in 1`
      `delete income /in 2` -### Clear entire income list: `clear expense` +### Clear entire income list: `clear income` Clear the entire list of incomes. From 30d2180432464d1c10ee34d954b3be4da466ec3a Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 2 Apr 2023 01:24:19 +0800 Subject: [PATCH 198/364] fixed zero income entries issue --- data/chching.txt | 2 +- src/main/java/chching/record/IncomeList.java | 59 +++++++++++--------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index ea27b3127a..98b3299a16 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1,4 +1,4 @@ -I | tuition | 2023-12-12 | 500.00 +I | tuition | 2023-12-12 | 0.01 I | test | 2022-11-11 | 300.00 I | test | 2023-12-12 | 500.00 E | expense | transport | 2023-12-12 | 500.00 diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 51e4e6a99c..8851e33d5e 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -23,7 +23,7 @@ public class IncomeList extends RecordList { public IncomeList(ArrayList incomeList) { this.incomeList = incomeList; } - + /** * Default constructor to instantiate IncomeList objects */ @@ -40,7 +40,7 @@ public void addIncome(Income income) { incomeList.add(income); } - + /** * Method to edit an income in the income list. * Edits a specific field of an income based on the parameters field to value. @@ -51,38 +51,45 @@ public void addIncome(Income income) { * @throws ChChingException If value value is not a non-numeric input. */ public void editIncome(int index, String field, String value) throws ChChingException { - + // change from 1-based indexing to 0-based indexing int indexZeroBased = index - 1; Income income = incomeList.get(indexZeroBased); - + // edit the according field - switch(field) { - case "de": - income.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - income.setDate(date); - break; - case "v": - try { - double amount = Float.parseFloat(value); - income.setValue(amount); - } catch (Exception e) { - throw new ChChingException("Trouble adding income value"); - } - break; - default: - assert false: "No such field to enter here"; - throw new ChChingException("No such field in income"); + switch (field) { + case "de": + income.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + income.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Income must be greater than or equals 0.01"); + } + assert amount > 0.01 : "Income cannot be negative"; + income.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Income value must be a number"); + } + throw new ChChingException(e.getMessage()); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in income"); } } - + /** * Deletes income from an IncomeList * - * @param i index of the income entry + * @param i index of the income entry */ public void deleteIncome(int i) throws IndexOutOfBoundsException { try { @@ -100,7 +107,7 @@ public void printIncomeList(Selector selector, Converter converter) { } } - public void clearIncomeList(){ + public void clearIncomeList() { incomeList.clear(); } From 9f7a69813899aaf9826bbb2e63dc70da7310e879 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 2 Apr 2023 01:36:20 +0800 Subject: [PATCH 199/364] resolve making fields blank during edit command --- data/chching.txt | 2 +- src/main/java/chching/record/Record.java | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index 98b3299a16..fa93b930be 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1,4 +1,4 @@ -I | tuition | 2023-12-12 | 0.01 +I | dick | 2023-12-12 | 0.01 I | test | 2022-11-11 | 300.00 I | test | 2023-12-12 | 500.00 E | expense | transport | 2023-12-12 | 500.00 diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index c9c6e36939..265b0728c0 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -2,6 +2,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import chching.ChChingException; // Abstract class that will not be initialized as an object /** @@ -15,9 +16,9 @@ public abstract class Record { /** * Constructor template for Expense and Income classes * - * @param description String description - * @param date String of the date - * @param value value of the income/expense + * @param description String description + * @param date String of the date + * @param value value of the income/expense */ public Record(String description, LocalDate date, double value) { this.description = description; @@ -47,7 +48,10 @@ public double getValue() { return value; } - public void setDescription(String description) { + public void setDescription(String description) throws ChChingException { + if (description.trim().equals("")) { + throw new ChChingException("Description cannot be empty"); + } this.description = description; } @@ -58,6 +62,7 @@ public void setDate(LocalDate date) { public void setValue(double value) { this.value = value; } + public String toString() { return ""; } From 958df433336e97a9f61d1e3e9523b20691051b0b Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 2 Apr 2023 01:40:38 +0800 Subject: [PATCH 200/364] fixed error message not correctly worded --- src/main/java/chching/record/ExpenseList.java | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 0e37c65585..f4db61403e 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -24,7 +24,7 @@ public class ExpenseList extends RecordList { public ExpenseList(ArrayList expenseList) { this.expenseList = expenseList; } - + /** * Default constructor to instantiate ExpenseList objects */ @@ -39,7 +39,7 @@ public int size() { public void addExpense(Expense expense) { expenseList.add(expense); } - + /** * Method to edit an expense in the expense list. * Edits a specific field of an expense based on the parameters field to value. @@ -50,41 +50,48 @@ public void addExpense(Expense expense) { * @throws ChChingException If value value is not a non-numeric input. */ public void editExpense(int index, String field, String value) throws ChChingException { - + // change from 1-based indexing to 0-based indexing int indexZeroBased = index - 1; Expense expense = expenseList.get(indexZeroBased); - + // edit the according field - switch(field) { - case "c": - expense.setCategory(value); - break; - case "de": - expense.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - expense.setDate(date); - break; - case "v": - try { - double amount = Float.parseFloat(value); - expense.setValue(amount); - } catch (Exception e) { - throw new ChChingException("Trouble adding expense value"); - } - break; - default: - assert false : "No such field to enter here"; - throw new ChChingException("No such field in expense"); + switch (field) { + case "c": + expense.setCategory(value); + break; + case "de": + expense.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + expense.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Expense must be greater than or equals 0.01"); + } + assert amount > 0.01 : "Income cannot be negative"; + expense.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Expense value must be a number"); + } + throw new ChChingException(e.getMessage()); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in expense"); } } - + /** * Deletes expense from an ExpenseList * - * @param i index of the income entry + * @param i index of the income entry */ public void deleteExpense(int i) throws IndexOutOfBoundsException { try { @@ -102,12 +109,10 @@ public void printExpenseList(Selector selector, Converter converter) { } } - public void clearExpenseList(){ + public void clearExpenseList() { expenseList.clear(); } - - @Override public Expense get(int i) { return expenseList.get(i); From 4b065244b0c97731edf47de8a737f1ebef6cc920 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 2 Apr 2023 10:45:47 +0800 Subject: [PATCH 201/364] fixed checkstyle & live conversion --- .vscode/settings.json | 3 ++ data/chching.txt | 2 +- src/main/java/chching/ChChing.java | 3 ++ .../java/chching/api/LiveCurrencyApi.java | 40 ++++++++++++++ .../chching/api/ParameterStringBuilder.java | 24 +++++++++ src/main/java/chching/currency/Converter.java | 15 +++++- src/main/java/chching/currency/Selector.java | 3 +- src/main/java/chching/record/ExpenseList.java | 54 +++++++++---------- src/main/java/chching/record/IncomeList.java | 48 ++++++++--------- 9 files changed, 137 insertions(+), 55 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 src/main/java/chching/api/LiveCurrencyApi.java create mode 100644 src/main/java/chching/api/ParameterStringBuilder.java diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..7ac7fc8272 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.format.settings.url": "eclipse-formatter.xml" +} diff --git a/data/chching.txt b/data/chching.txt index fa93b930be..51d14bb673 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1,4 +1,4 @@ -I | dick | 2023-12-12 | 0.01 +I | dick | 2023-12-12 | 1.00 I | test | 2022-11-11 | 300.00 I | test | 2023-12-12 | 500.00 E | expense | transport | 2023-12-12 | 500.00 diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 1c8bcb7a13..a4ac9644cf 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -1,6 +1,7 @@ package chching; import chching.parser.Parser; +import chching.api.LiveCurrencyApi; import chching.command.Command; import chching.currency.Converter; import chching.currency.Selector; @@ -15,6 +16,7 @@ public class ChChing { private ExpenseList expenses; private Selector selector; private Converter converter; + private LiveCurrencyApi liveCurrencyAPI; private TargetStorage targetStorage; private Target target = new Target(0); private Ui ui; @@ -31,6 +33,7 @@ public ChChing(String filePath) { this.expenses = new ExpenseList(storage.loadExpenses()); this.selector = new Selector(); this.converter = new Converter(); + this.liveCurrencyAPI = new LiveCurrencyApi(selector, converter); this.targetStorage = new TargetStorage(); this.targetStorage.addTarget(target); } catch (Exception e) { diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java new file mode 100644 index 0000000000..d9e804503b --- /dev/null +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -0,0 +1,40 @@ +package chching.api; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.ChChingException; + +public class LiveCurrencyApi { + + public LiveCurrencyApi(Selector selector, Converter converter) throws Exception { + try { + + StringBuilder result = new StringBuilder(); + URL url = new URL("https://v6.exchangerate-api.com/v6/ab8bf379e8c93df65c1d7417/latest/SGD"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(conn.getInputStream()))) { + for (String line; (line = reader.readLine()) != null;) { + result.append(line); + } + } + String temp = result.toString(); + temp = temp.substring(363, temp.length() - 2); + String[] arr = temp.split(","); + for (String s : arr) { + String[] tempArr = s.split(":"); + String countryCode = tempArr[0].substring(3, tempArr[0].length() - 1); + if (selector.containsCurrency(countryCode)) { + converter.setConversionRate(countryCode, Double.parseDouble(tempArr[1].trim())); + } + } + } catch (Exception e) { + throw new ChChingException("Error in retrieving live currency rates"); + } + } +} diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java new file mode 100644 index 0000000000..df1384ee50 --- /dev/null +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -0,0 +1,24 @@ +package chching.api; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Map; + +public class ParameterStringBuilder { + public static String getParamsString(Map params) + throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder(); + + for (Map.Entry entry : params.entrySet()) { + result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); + result.append("="); + result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); + result.append("&"); + } + + String resultString = result.toString(); + return resultString.length() > 0 + ? resultString.substring(0, resultString.length() - 1) + : resultString; + } +} diff --git a/src/main/java/chching/currency/Converter.java b/src/main/java/chching/currency/Converter.java index 6d8ec0e42f..5fc84fd63f 100644 --- a/src/main/java/chching/currency/Converter.java +++ b/src/main/java/chching/currency/Converter.java @@ -17,6 +17,10 @@ public Converter() { currencyMap.put("VND", 17618.54); } + public void setConversionRate(String currency, double rate) { + currencyMap.put(currency, rate); + } + public double convert(String currency, double amount) { return amount * currencyMap.get(currency); } @@ -24,8 +28,8 @@ public double convert(String currency, double amount) { /** * Executes print converter * - * @param value income value - * @param selector selector + * @param value income value + * @param selector selector */ public String printConverter(double value, Selector selector) { String result = ""; @@ -39,4 +43,11 @@ public String printConverter(double value, Selector selector) { return result; } + // for testing + public void printConversionRate() { + for (String currency : currencyMap.keySet()) { + System.out.println(currency + " " + currencyMap.get(currency)); + } + } + } diff --git a/src/main/java/chching/currency/Selector.java b/src/main/java/chching/currency/Selector.java index 4bc144d023..2aabd47506 100644 --- a/src/main/java/chching/currency/Selector.java +++ b/src/main/java/chching/currency/Selector.java @@ -3,7 +3,8 @@ import java.util.HashMap; /** - * Models a class that selects the relevant currency. Inherited from Command class. + * Models a class that selects the relevant currency. Inherited from Command + * class. */ public class Selector { protected HashMap selectedCurrencies; diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index f4db61403e..82106b456a 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -57,34 +57,34 @@ public void editExpense(int index, String field, String value) throws ChChingExc // edit the according field switch (field) { - case "c": - expense.setCategory(value); - break; - case "de": - expense.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - expense.setDate(date); - break; - case "v": - try { - double amount = Double.parseDouble(value); - if (amount < 0.01) { - throw new ChChingException("Expense must be greater than or equals 0.01"); - } - assert amount > 0.01 : "Income cannot be negative"; - expense.setValue(amount); - } catch (Exception e) { - if (e instanceof NumberFormatException) { - throw new ChChingException("Expense value must be a number"); - } - throw new ChChingException(e.getMessage()); + case "c": + expense.setCategory(value); + break; + case "de": + expense.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + expense.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Expense must be greater than or equals 0.01"); } - break; - default: - assert false : "No such field to enter here"; - throw new ChChingException("No such field in expense"); + assert amount > 0.01 : "Income cannot be negative"; + expense.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Expense value must be a number"); + } + throw new ChChingException(e.getMessage()); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in expense"); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 8851e33d5e..52068db1d9 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -58,31 +58,31 @@ public void editIncome(int index, String field, String value) throws ChChingExce // edit the according field switch (field) { - case "de": - income.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - income.setDate(date); - break; - case "v": - try { - double amount = Double.parseDouble(value); - if (amount < 0.01) { - throw new ChChingException("Income must be greater than or equals 0.01"); - } - assert amount > 0.01 : "Income cannot be negative"; - income.setValue(amount); - } catch (Exception e) { - if (e instanceof NumberFormatException) { - throw new ChChingException("Income value must be a number"); - } - throw new ChChingException(e.getMessage()); + case "de": + income.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + income.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Income must be greater than or equals 0.01"); } - break; - default: - assert false : "No such field to enter here"; - throw new ChChingException("No such field in income"); + assert amount > 0.01 : "Income cannot be negative"; + income.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Income value must be a number"); + } + throw new ChChingException(e.getMessage()); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in income"); } } From 39d617442ab31640c77da580c81664ac6d017cdd Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 2 Apr 2023 10:49:09 +0800 Subject: [PATCH 202/364] delete vscode file --- .gitignore | 3 +++ .vscode/settings.json | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index b8e62d3ba1..90c30f73f2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ src/main/resources/docs/ *.iml bin/ +#vscode +/.vscode/ + /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT /data diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7ac7fc8272..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "java.format.settings.url": "eclipse-formatter.xml" -} From 66915f9563511065e7b1db7bba7c4a51826d6523 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 11:25:26 +0800 Subject: [PATCH 203/364] Edit expected output test file --- text-ui-test/EXPECTED.TXT | 4 ++-- text-ui-test/data/chching.txt | 0 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 text-ui-test/data/chching.txt diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 8f4bec5703..9ed7c9605a 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,5 @@ -Unfortunately, file can't be found. I'll make a new one! -Unfortunately, file can't be found. I'll make a new one! +Unfortunately, income list file can't be found. I'll make a new one! +Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? diff --git a/text-ui-test/data/chching.txt b/text-ui-test/data/chching.txt new file mode 100644 index 0000000000..e69de29bb2 From 095e6c8257874d76b790e77bc4b7319b8b486b5a Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 11:29:02 +0800 Subject: [PATCH 204/364] edit (again) expected output test file --- text-ui-test/EXPECTED.TXT | 2 -- 1 file changed, 2 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 9ed7c9605a..b7eded7b3c 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,3 @@ -Unfortunately, income list file can't be found. I'll make a new one! -Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From 7279412b62441cfdfb647be5549784db79ada815 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 2 Apr 2023 11:38:11 +0800 Subject: [PATCH 205/364] Fix bug --- text-ui-test/EXPECTED.TXT | 2 ++ 1 file changed, 2 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index b7eded7b3c..9ed7c9605a 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,3 +1,5 @@ +Unfortunately, income list file can't be found. I'll make a new one! +Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From 1a60a8c9d6cbac2d72a398871393bae0fdcad677 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 11:56:45 +0800 Subject: [PATCH 206/364] edit find command summary, issue #224 --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 52dc5ecd87..0e23ef9313 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -248,7 +248,7 @@ When reading from the file, entries for income and expenses are stored in their - Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` - Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` - Exit: `exit` -- Find entry: `find income /c CATEGORY /k DESCRIPTION` +- Find entry: `find /c CATEGORY /k DESCRIPTION` - List Records: `list` - List Expenses: `list expense` - List Incomes: `list income` From 701b9f6209cbae68d4e48b9292bf4ad07de86076 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 13:05:19 +0800 Subject: [PATCH 207/364] change the implementation Storage from .txt to .json - issue #219 --- build.gradle | 1 + src/main/java/chching/ChChing.java | 2 +- src/main/java/chching/Storage.java | 124 +++++++++++++++++------------ 3 files changed, 76 insertions(+), 51 deletions(-) diff --git a/build.gradle b/build.gradle index c59c8f5308..4146672e2d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ dependencies { testImplementation('org.junit.platform:junit-platform-launcher:1.5.2') 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' + implementation 'com.googlecode.json-simple:json-simple:1.1.1' } test { diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index a4ac9644cf..4730e9ed78 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -66,6 +66,6 @@ public void run() { public static void main(String[] args) { // assert false : "Assertions should be enabled"; - new ChChing("data/chching.txt").run(); + new ChChing("data/chching.json").run(); } } diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index e978e9ad78..bc6d8846bf 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -1,17 +1,19 @@ package chching; - +import java.io.FileReader; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.json.simple.parser.JSONParser; import chching.record.Record; import chching.record.Income; import chching.record.IncomeList; import chching.record.Expense; import chching.record.ExpenseList; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.time.LocalDate; import java.util.ArrayList; -import java.util.Scanner; /** * Models a class to handle storage for the program. @@ -23,7 +25,7 @@ public class Storage { * Build constructor for the Storage class. * @param filepath the filepath of the storage. */ - Storage(String filepath) { + Storage(String filepath){ String dirname = filepath.substring(0, filepath.lastIndexOf("/")); File dir = new File(dirname); dir.mkdirs(); @@ -31,26 +33,32 @@ public class Storage { } public ArrayList loadIncomes() { + // create a JSON parser object + JSONParser parser = new JSONParser(); + ArrayList incomes = new ArrayList<>(); try { - Scanner reader = new Scanner(file); - while (reader.hasNextLine()) { - String line = reader.nextLine(); - String[] extract = line.split("\\|"); - String symbol = extract[0].trim(); - - if (symbol.equals("I")) { - String description = extract[1].trim(); - LocalDate date = LocalDate.parse(extract[2].trim()); - String value = extract[3].trim(); - Income income = new Income(description, date, Double.parseDouble(value)); + // read the JSON file into a JSONObject + Object obj = parser.parse(new FileReader(file)); + JSONArray entries = (JSONArray) obj; + + // loop through the entries and print each one + for (Object entry : entries) { + JSONObject jsonObj = (JSONObject) entry; + String type = (String) jsonObj.get("type"); + String description = (String) jsonObj.get("description"); + String date = (String) jsonObj.get("date"); + Double amount = (Double) jsonObj.get("amount"); + + if (type.equals("I")) { + Income income = new Income(description, LocalDate.parse(date), amount); incomes.add(income); + } } - reader.close(); - } catch (FileNotFoundException e) { + } catch (Exception e) { System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); } @@ -58,60 +66,76 @@ public ArrayList loadIncomes() { } public ArrayList loadExpenses() { + // create a JSON parser object + JSONParser parser = new JSONParser(); + ArrayList expenses = new ArrayList<>(); try { - Scanner reader = new Scanner(file); - while (reader.hasNextLine()) { - String line = reader.nextLine(); - String[] extract = line.split("\\|"); - String symbol = extract[0].trim(); - - if (symbol.equals("E")) { - String category = extract[1].trim(); - String description = extract[2].trim(); - LocalDate date = LocalDate.parse(extract[3].trim()); - String value = extract[4].trim(); - Expense expense = new Expense(category, description, date, Double.parseDouble(value)); + // read the JSON file into a JSONObject + Object obj = parser.parse(new FileReader(file)); + JSONArray entries = (JSONArray) obj; + + // loop through the entries and print each one + for (Object entry : entries) { + JSONObject jsonObj = (JSONObject) entry; + String type = (String) jsonObj.get("type"); + String description = (String) jsonObj.get("description"); + String date = (String) jsonObj.get("date"); + Double amount = (Double) jsonObj.get("amount"); + + if (type.equals("E")) { + String category = (String) jsonObj.get("category"); + Expense expense = new Expense(description, category, LocalDate.parse(date), amount); expenses.add(expense); + } } - reader.close(); - } catch (FileNotFoundException e) { - System.out.println("Unfortunately, expense list can't be found. I'll make a new one!"); + } catch (Exception e) { + System.out.println("Unfortunately, expense list file can't be found. I'll make a new one!"); } return expenses; } public void save(IncomeList incomes, ExpenseList expenses) { - try { - file.createNewFile(); + JSONArray jsonArray = new JSONArray(); - FileWriter fileWriter = new FileWriter(file); + for (int i = 0; i < incomes.size(); i++) { + Record income = incomes.get(i); + JSONObject obj = new JSONObject(); + obj.put("type", "I"); + obj.put("description", income.getDescription()); + obj.put("date", income.getDate().toString()); + obj.put("amount", income.getValue()); - for (int i = 0; i < incomes.size(); i++) { - Record income = incomes.get(i); - String line = String.format("I | %s | %s | %.2f\n", income.getDescription(), - income.getDate(), income.getValue()); - fileWriter.write(line); - } + jsonArray.add(obj); + } - for (int i = 0; i < expenses.size(); i++) { - Record expense = expenses.get(i); - String line = String.format("E | %s | %s | %s | %.2f\n", expense.getCategory(), - expense.getDescription(), expense.getDate(), expense.getValue()); - fileWriter.write(line); - } + for (int i = 0; i < expenses.size(); i++) { + Record expense = expenses.get(i); + JSONObject obj = new JSONObject(); + obj.put("type", "E"); + obj.put("category", expense.getCategory()); + obj.put("description", expense.getDescription()); + obj.put("date", expense.getDate().toString()); + obj.put("amount", expense.getValue()); + + jsonArray.add(obj); + } + + String jsonString = JSONValue.toJSONString(jsonArray); - fileWriter.flush(); - fileWriter.close(); + // write the JSONObject to a file + try (FileWriter file = new FileWriter(this.file)) { + file.write(jsonString); } catch (IOException e) { - System.out.println("An error occurred."); + System.out.println("An error occurred while writing JSON data to file."); e.printStackTrace(); } + } } From a0b1131bfbcc2c9d18fc227924e403027b5e491a Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 13:17:22 +0800 Subject: [PATCH 208/364] edit expected output --- src/main/java/chching/command/FindCommand.java | 3 +++ text-ui-test/EXPECTED.TXT | 2 -- text-ui-test/data/chching.json | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 text-ui-test/data/chching.json diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 57781675b0..6696f1c19f 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -38,10 +38,13 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto Converter converter, TargetStorage targetStorage) throws ChChingException { IncomeList incomesMatched = new IncomeList(); ExpenseList expensesMatched = new ExpenseList(); + if(category == null) { throw new ChChingException("No category specified"); + } else if(keyword == null) { throw new ChChingException("No keyword specified"); + } else if(!category.equals("income") && !category.equals("expense")) { throw new ChChingException("Category specified must be income or expense"); } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 9ed7c9605a..b7eded7b3c 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,3 @@ -Unfortunately, income list file can't be found. I'll make a new one! -Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? diff --git a/text-ui-test/data/chching.json b/text-ui-test/data/chching.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/text-ui-test/data/chching.json @@ -0,0 +1 @@ +[] \ No newline at end of file From 548b56dcad1563642abf4c039dadd1f330d87d2e Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 13:22:51 +0800 Subject: [PATCH 209/364] fix case sensitivity of the find command - issue #214 --- src/main/java/chching/command/FindCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 6696f1c19f..93f2e6e262 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -52,7 +52,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto if (category.equals("income")) { for (int i = 0; i < incomes.size(); i++) { Income income = incomes.get(i); - if (income.toString().contains(keyword)) { + if (income.toString().toLowerCase().contains(keyword.toLowerCase())) { incomesMatched.addIncome(income); } } @@ -61,7 +61,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else { for (int i = 0; i < expenses.size(); i++) { Expense expense = expenses.get(i); - if (expense.toString().contains(keyword)) { + if (expense.toString().toLowerCase().contains(keyword.toLowerCase())) { expensesMatched.addExpense(expense); } } From 7d150759fb41e2debe6e637bf998728ccc1fa90e Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Sun, 2 Apr 2023 13:35:25 +0800 Subject: [PATCH 210/364] handle empty keywords on the find command --- src/main/java/chching/command/FindCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 93f2e6e262..dbc63e7a1e 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -47,6 +47,9 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if(!category.equals("income") && !category.equals("expense")) { throw new ChChingException("Category specified must be income or expense"); + + } else if (keyword.strip() == "") { + throw new ChChingException("No keyword specified"); } if (category.equals("income")) { From 79dd9d0ec42a1c158d7c8fdabd374de3557399da Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 2 Apr 2023 16:55:05 +0800 Subject: [PATCH 211/364] PPP, Code ownership management, add showTarget to UG, add contents to UG and DG, fix bugs --- docs/AboutUs.md | 2 +- docs/DeveloperGuide.md | 22 ++++++++ docs/UserGuide.md | 14 +++-- docs/team/aviel.md | 7 --- docs/team/avielcx.md | 54 +++++++++++++++++++ docs/team/clement.md | 5 +- docs/team/nafisazizir.md | 5 +- docs/team/thomas.md | 5 +- docs/team/yanming.md | 5 +- src/test/java/chching/ParserTest.java | 1 - .../chching/command/AddIncomeCommandTest.java | 1 + .../chching/command/BalanceCommandTest.java | 2 +- 12 files changed, 106 insertions(+), 17 deletions(-) delete mode 100644 docs/team/aviel.md create mode 100644 docs/team/avielcx.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0bb8b35ca3..dff9ddbc76 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -3,7 +3,7 @@ Display | Name | Github Profile | Portfolio --------|:----------------------:|:-------------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) -![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/aviel.md) +![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/avielcx.md) ![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) ![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomas.md) ![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7353c87c9b..b3f350511f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,5 +1,27 @@ # Developer Guide + +* [Developer Guide](#developer-guide) + * [Acknowledgements](#acknowledgements) + * [Design & implementation](#design--implementation) + * [Implementation](#implementation) + * [Record and RecordList](#record-and-recordlist) + * [DeleteIncomeCommand](#deleteincomecommand) + * [Target and TargetStorage](#target-and-targetstorage) + * [[Proposed] EditIncomeCommand/EditExpenseCommand](#proposed-editincomecommandeditexpensecommand) + * [AddIncomeCommand](#addincomecommand) + * [ListExpenseCommand](#listexpensecommand) + * [SetTargetCommand](#settargetcommand) + * [SetCurrencyCommand](#setcurrencycommand) + * [Product scope](#product-scope) + * [Target user profile](#target-user-profile) + * [Value proposition](#value-proposition) + * [User Stories](#user-stories) + * [Non-Functional Requirements](#non-functional-requirements) + * [Glossary](#glossary) + * [Instructions for manual testing](#instructions-for-manual-testing) + + ## Acknowledgements {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0e23ef9313..90de62a7a0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -10,14 +10,15 @@ * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) * [Finding an entry: `find`](#finding-an-entry--find) - * [Showing the balance: `balance`](#showing-the-balance--balance) * [Deleting an entry: `delete`](#deleting-an-entry--delete) - * [Clear entire income list: `clear expense`](#clear-entire-income-list--clear-expense) + * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) * [Clear entire expense list: `clear income`](#clear-entire-expense-list--clear-income) * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) - * [Set a target for balance of finances: `add target`](#set-a-target-for-balance-of-finances--add-target) + * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) + * [See target set: `show target`](#see-target-set--show-target) * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) * [View help: `help`](#view-help--help) + * [Exit: `exit`](#exit--exit) * [Saving and loading of data](#saving-and-loading-of-data) * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) @@ -212,6 +213,13 @@ Use case: Example of usage:
      `set target /v 350` +### See target set: `show target` + +Allows users to see the target they have set. + +Format: +
      `show target` + ### Finding balance of finances: `balance` Shows users the balance after calculating the difference between income and expenses and informs users on whether they have reached their target. diff --git a/docs/team/aviel.md b/docs/team/aviel.md deleted file mode 100644 index 0038aea46a..0000000000 --- a/docs/team/aviel.md +++ /dev/null @@ -1,7 +0,0 @@ -# Eng Chen Xi, Aviel - Project Portfolio Page - -## Overview - - -### Summary of Contributions - diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md new file mode 100644 index 0000000000..73b00f85c4 --- /dev/null +++ b/docs/team/avielcx.md @@ -0,0 +1,54 @@ +# Eng Chen Xi, Aviel - Project Portfolio Page + +## Overview +ChChing is a financial management tool +which allows users to keep track +of their incomes and expenses conveniently. +There is also an option to change currency should users require currency conversion. + +### Summary of Contributions +Given below are my contributions to the project. + +#### Code Contributed: +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=avielcx&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=avielcx&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +#### Project management: +* Managed release of v2.0 on GitHub + +#### Enhancements Implemented: +* Created a balance command to allow users to check their balance when total income deducts total expense. +* Created a clear incomes feature which allow users to clear their income list. +* Created a clear expenses feature which allow users to clear their expense list. +* Created a clear all feature which allow users to clear both income and expense lists. +* Created an AddTarget feature which allow users to set their target. +* Created a ShowTarget feature which allow users to see the target they have set. +* Contributed to tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, +`IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `Parser`, `ExitTest`. + +#### Contributions to the UG: +* Added `Table of Contents` +* Contributed to `Quick Start` portion +* Added documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`, `balance`, `exit`, `Command Summary` + +#### Contributions to the DG: +* Added `Table of Contents` +* Added `Record` and `RecordList` UML class diagrams +* Added `DeleteIncomeCommand` sequence diagram +* Added `Target` and `TargetStorage` UML class diagrams +* Added `SetTargetCommand` sequence diagram +* Added documentation for `Target user profile` +* Added documentation for `Value Proposition` +* Added documentation for `v2.0` of `User Stories` + +#### Contributions to team-based tasks: +* Method documentations +* Assertions enabled +* v2.0 wrap-up +* v2.0 release + +#### Review/monitoring contributions +* PRs reviewed for the following team: [CS2113-W13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/53) +* Contributed to forum discussions: [1](https://github.com/nus-cs2113-AY2223S2/forum/issues/11), [2](https://github.com/nus-cs2113-AY2223S2/forum/issues/16) +* Reported bugs and suggestions for other team in the class: [CS2113-T13-1](https://github.com/avielcx/ped/issues) + + diff --git a/docs/team/clement.md b/docs/team/clement.md index 81c821ca96..93fcd71e06 100644 --- a/docs/team/clement.md +++ b/docs/team/clement.md @@ -1,6 +1,9 @@ # Clement Hung - Project Portfolio Page ## Overview - +ChChing is a financial management tool +which allows users to keep track +of their incomes and expenses conveniently. +There is also an option to change currency should users require currency conversion. ### Summary of Contributions \ No newline at end of file diff --git a/docs/team/nafisazizir.md b/docs/team/nafisazizir.md index cf318d77b7..08eb661e06 100644 --- a/docs/team/nafisazizir.md +++ b/docs/team/nafisazizir.md @@ -1,7 +1,10 @@ # Nafis Aziiz Riza - Project Portfolio Page ## Overview - +ChChing is a financial management tool +which allows users to keep track +of their incomes and expenses conveniently. +There is also an option to change currency should users require currency conversion. ### Summary of Contributions diff --git a/docs/team/thomas.md b/docs/team/thomas.md index 9d89bcfe19..3eefc85528 100644 --- a/docs/team/thomas.md +++ b/docs/team/thomas.md @@ -1,6 +1,9 @@ # Thomas Joseph Lee Alba - Project Portfolio Page just like my head this page do be empty ## Overview - +ChChing is a financial management tool +which allows users to keep track +of their incomes and expenses conveniently. +There is also an option to change currency should users require currency conversion. ### Summary of Contributions \ No newline at end of file diff --git a/docs/team/yanming.md b/docs/team/yanming.md index acf925db10..32d5489712 100644 --- a/docs/team/yanming.md +++ b/docs/team/yanming.md @@ -1,6 +1,9 @@ # Pang Yan Ming - Project Portfolio Page ## Overview - +ChChing is a financial management tool +which allows users to keep track +of their incomes and expenses conveniently. +There is also an option to change currency should users require currency conversion. ### Summary of Contributions \ No newline at end of file diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 30f8349f8e..57373c335d 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -1,5 +1,4 @@ /* @@author avielcx */ - package chching; import chching.parser.Parser; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 579e4d494f..b8b2aeabe6 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -1,4 +1,5 @@ /* @@author avielcx */ + package chching.command; import chching.Storage; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 559bbf19d6..4fdba27b69 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -1,4 +1,4 @@ -/* @@author avielcx */ +/* @@author avielcx, thomasjlalba */ package chching.command; import chching.Storage; From 3b6ad3e63203ec811d0f77cd567cf70c3c483fd1 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 2 Apr 2023 16:58:20 +0800 Subject: [PATCH 212/364] PPP, Code ownership management, add showTarget to UG, add contents to UG and DG, fix bugs --- docs/team/avielcx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 73b00f85c4..cbea1b777b 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -23,7 +23,7 @@ Given below are my contributions to the project. * Created an AddTarget feature which allow users to set their target. * Created a ShowTarget feature which allow users to see the target they have set. * Contributed to tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, -`IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `Parser`, `ExitTest`. +`IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. #### Contributions to the UG: * Added `Table of Contents` From 1784cb86e4eb387ec21df89a1726efaf5b0078c5 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 2 Apr 2023 17:07:21 +0800 Subject: [PATCH 213/364] Fix UG and DG bugs --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b3f350511f..4f186974da 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -3,7 +3,7 @@ * [Developer Guide](#developer-guide) * [Acknowledgements](#acknowledgements) - * [Design & implementation](#design--implementation) + * [Design & implementation](#design-implementation) * [Implementation](#implementation) * [Record and RecordList](#record-and-recordlist) * [DeleteIncomeCommand](#deleteincomecommand) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 90de62a7a0..5ea6e8bca0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,23 +4,23 @@ * [Introduction](#introduction) * [Quick Start](#quick-start) * [Features](#features) - * [Adding an entry: `add`](#adding-an-entry--add) - * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) - * [Updating an entry: `edit`](#updating-an-entry--edit) - * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) - * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) - * [Finding an entry: `find`](#finding-an-entry--find) - * [Deleting an entry: `delete`](#deleting-an-entry--delete) - * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) - * [Clear entire expense list: `clear income`](#clear-entire-expense-list--clear-income) - * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) - * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) - * [See target set: `show target`](#see-target-set--show-target) - * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) - * [View help: `help`](#view-help--help) - * [Exit: `exit`](#exit--exit) + * [Adding an entry: `add`](#adding-an-entry-add) + * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes-list) + * [Updating an entry: `edit`](#updating-an-entry-edit) + * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted-set-currency) + * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted-unset-currency) + * [Finding an entry: `find`](#finding-an-entry-find) + * [Deleting an entry: `delete`](#deleting-an-entry-delete) + * [Clear entire income list: `clear income`](#clear-entire-income-list-clear-income) + * [Clear entire expense list: `clear income`](#clear-entire-expense-list-clear-income) + * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists-clear-all) + * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances-set-target) + * [See target set: `show target`](#see-target-set-show-target) + * [Finding balance of finances: `balance`](#finding-balance-of-finances-balance) + * [View help: `help`](#view-help-help) + * [Exit: `exit`](#exit-exit) * [Saving and loading of data](#saving-and-loading-of-data) - * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) + * [Command Summary (Alphabetical Order)](#command-summary-alphabetical-order) ## Introduction From 0bfda8dd5a2af369393506e90dc4e31278e38705 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 2 Apr 2023 17:14:42 +0800 Subject: [PATCH 214/364] Fix UG bug --- docs/UserGuide.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5ea6e8bca0..e1e17d5a8b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,21 +4,21 @@ * [Introduction](#introduction) * [Quick Start](#quick-start) * [Features](#features) - * [Adding an entry: `add`](#adding-an-entry-add) - * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes-list) - * [Updating an entry: `edit`](#updating-an-entry-edit) - * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted-set-currency) - * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted-unset-currency) - * [Finding an entry: `find`](#finding-an-entry-find) - * [Deleting an entry: `delete`](#deleting-an-entry-delete) - * [Clear entire income list: `clear income`](#clear-entire-income-list-clear-income) - * [Clear entire expense list: `clear income`](#clear-entire-expense-list-clear-income) - * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists-clear-all) - * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances-set-target) - * [See target set: `show target`](#see-target-set-show-target) - * [Finding balance of finances: `balance`](#finding-balance-of-finances-balance) - * [View help: `help`](#view-help-help) - * [Exit: `exit`](#exit-exit) + * [Adding an entry: ```add```](#adding-an-entry-add) + * [Listing all expenses and incomes: ```list```](#listing-all-expenses-and-incomes-list) + * [Updating an entry: ```edit```](#updating-an-entry-edit) + * [Setting currency to be converted: ```set currency```](#setting-currency-to-be-converted-set-currency) + * [Unset currency to be converted: ```unset currency```](#unset-currency-to-be-converted-unset-currency) + * [Finding an entry: ```find```](#finding-an-entry-find) + * [Deleting an entry: ```delete```](#deleting-an-entry-delete) + * [Clear entire income list: ```clear income```](#clear-entire-income-list-clear-income) + * [Clear entire expense list: ```clear income```](#clear-entire-expense-list-clear-income) + * [Clear entire both income and expense lists: ```clear all```](#clear-entire-both-income-and-expense-lists-clear-all) + * [Set a target for balance of finances: ```set target```](#set-a-target-for-balance-of-finances-set-target) + * [See target set: ```show target```](#see-target-set-show-target) + * [Finding balance of finances: ```balance```](#finding-balance-of-finances-balance) + * [View help: ```help```](#view-help-help) + * [Exit: ```exit```](#exit-exit) * [Saving and loading of data](#saving-and-loading-of-data) * [Command Summary (Alphabetical Order)](#command-summary-alphabetical-order) From c665ba442957a3196761fd22881f46e1a95b8f36 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 00:00:45 +0800 Subject: [PATCH 215/364] Added additional checks for incorrect user input. --- src/main/java/chching/parser/Parser.java | 21 +++++++++++++++++---- src/test/java/chching/ParserTest.java | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 745e130b72..fe79d1d7d7 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -172,12 +172,25 @@ public static HashMap sortArguments(List arguments) thro for (int i = 0; i < argumentsCount; i++) { String argument = arguments.get(i); String[] fieldAndValue = argument.split(" ", 2); + String field; + String value; try { - String field = fieldAndValue[0].trim(); - String value = fieldAndValue[1].trim(); - argumentsByField.put(field, value); + field = fieldAndValue[0].trim(); + value = fieldAndValue[1].trim(); } catch (Exception e) { - throw new ChChingException("arguments not inputted correctly or missing a value"); + throw new ChChingException("Arguments not inputted correctly"); + } + + // checks if it is an existing field + boolean isDuplicateField = argumentsByField.containsKey(field); + // check if field/value is empty or just spaces + boolean isEmptyFieldOrValue = field.isBlank() || value.isBlank(); + if (isDuplicateField) { + throw new ChChingException("Duplicate fields detected"); + } else if (isEmptyFieldOrValue) { + throw new ChChingException("Empty value detected or use of \" / \" in value"); + } else { + argumentsByField.put(field, value); } } return argumentsByField; diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 57373c335d..13da1ee715 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -109,7 +109,7 @@ public void sortArguments_invalidInput_throwsException() { new Parser().sortArguments(input); fail(); // the test should not reach this line } catch (ChChingException e) { - assertEquals("arguments not inputted correctly or missing a value", e.getMessage()); + assertEquals("Arguments not inputted correctly", e.getMessage()); } } From 470d3f2492d58587a36876bacddd978b4e0d7970 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Mon, 3 Apr 2023 00:39:39 +0800 Subject: [PATCH 216/364] add PPP, change the implementation of storage using gson library --- build.gradle | 2 +- docs/team/nafisazizir.md | 31 +++++-- src/main/java/chching/Storage.java | 134 +++++++++++++++-------------- 3 files changed, 95 insertions(+), 72 deletions(-) diff --git a/build.gradle b/build.gradle index 4146672e2d..f2f0efe589 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation('org.junit.platform:junit-platform-launcher:1.5.2') 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' - implementation 'com.googlecode.json-simple:json-simple:1.1.1' + implementation 'com.google.code.gson:gson:2.10.1' } test { diff --git a/docs/team/nafisazizir.md b/docs/team/nafisazizir.md index 08eb661e06..f4a6a42f5f 100644 --- a/docs/team/nafisazizir.md +++ b/docs/team/nafisazizir.md @@ -1,4 +1,4 @@ -# Nafis Aziiz Riza - Project Portfolio Page +# Nfais Azizi Riza - Project Portfolio Page ## Overview ChChing is a financial management tool @@ -7,9 +7,28 @@ of their incomes and expenses conveniently. There is also an option to change currency should users require currency conversion. ### Summary of Contributions +Given below are my contributions to the project. + +#### Code Contributed: +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=nafisazizir&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=nafisazizir&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +#### Project management: +* Inputting several github issues + +#### Enhancements Implemented: +* Created the structure of the main program, dividing into package, refactor +* Created a Ui feature which allow any command class to utilize the interface to print the output +* Created a Storage feature which allow user to store the data, and continue updating the data when the program restarted +* Created a Find feature, which allow user to find the records (income/expense) based on the keyword + +#### Contributions to the UG: +* Fix find command feature + +#### Contributions to the DG: +* Added `User Stories` + +#### Review/monitoring contributions +* PRs reviewed for the following team: [CS2113-T13-3](https://github.com/nus-cs2113-AY2223S2/tp/pull/41) +* Reported bugs and suggestions for other team in the class: [CS2113-W15-3](https://github.com/nafisazizir/ped/issues) + -Computer science student in my sophomore year with a growth mindset and four years of experience -in team leadership. I am excited to apply my skills and knowledge to tackle complex problems and -drive meaningful business insights. My diverse skillset allows me to adapt quickly to new -environments and tackle a wide range of data challenges. I am always eager to learn and grow as a -data professional. \ No newline at end of file diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index bc6d8846bf..3a6ac82a3c 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -1,20 +1,24 @@ package chching; -import java.io.FileReader; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; -import org.json.simple.parser.JSONParser; -import chching.record.Record; -import chching.record.Income; -import chching.record.IncomeList; -import chching.record.Expense; + import chching.record.ExpenseList; +import chching.record.Expense; +import chching.record.IncomeList; +import chching.record.Income; +import chching.record.Record; + import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Files; import java.time.LocalDate; import java.util.ArrayList; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonElement; + /** * Models a class to handle storage for the program. */ @@ -33,32 +37,31 @@ public class Storage { } public ArrayList loadIncomes() { - // create a JSON parser object - JSONParser parser = new JSONParser(); - ArrayList incomes = new ArrayList<>(); try { - // read the JSON file into a JSONObject - Object obj = parser.parse(new FileReader(file)); - JSONArray entries = (JSONArray) obj; - - // loop through the entries and print each one - for (Object entry : entries) { - JSONObject jsonObj = (JSONObject) entry; - String type = (String) jsonObj.get("type"); - String description = (String) jsonObj.get("description"); - String date = (String) jsonObj.get("date"); - Double amount = (Double) jsonObj.get("amount"); + // Create a GSON object + Gson gson = new Gson(); + + // Read the JSON file into a string + String json = Files.readString(file.toPath()); + + // Parse the JSON string into a JsonArray + JsonArray entries = gson.fromJson(json, JsonArray.class); + // Loop through the entries and add each income to the list + for (JsonElement entry : entries) { + JsonObject jsonObj = entry.getAsJsonObject(); + String type = jsonObj.get("type").getAsString(); if (type.equals("I")) { - Income income = new Income(description, LocalDate.parse(date), amount); + String description = jsonObj.get("description").getAsString(); + LocalDate date = LocalDate.parse(jsonObj.get("date").getAsString()); + double amount = jsonObj.get("amount").getAsDouble(); + Income income = new Income(description, date, amount); incomes.add(income); - } } - - } catch (Exception e) { + } catch (IOException e) { System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); } @@ -66,68 +69,70 @@ public ArrayList loadIncomes() { } public ArrayList loadExpenses() { - // create a JSON parser object - JSONParser parser = new JSONParser(); - ArrayList expenses = new ArrayList<>(); try { - // read the JSON file into a JSONObject - Object obj = parser.parse(new FileReader(file)); - JSONArray entries = (JSONArray) obj; - - // loop through the entries and print each one - for (Object entry : entries) { - JSONObject jsonObj = (JSONObject) entry; - String type = (String) jsonObj.get("type"); - String description = (String) jsonObj.get("description"); - String date = (String) jsonObj.get("date"); - Double amount = (Double) jsonObj.get("amount"); + // Create a GSON object + Gson gson = new Gson(); + // Read the JSON file into a string + String json = Files.readString(file.toPath()); + + // Parse the JSON string into a JsonArray + JsonArray entries = gson.fromJson(json, JsonArray.class); + + // Loop through the entries and add each income to the list + for (JsonElement entry : entries) { + JsonObject jsonObj = entry.getAsJsonObject(); + String type = jsonObj.get("type").getAsString(); if (type.equals("E")) { - String category = (String) jsonObj.get("category"); - Expense expense = new Expense(description, category, LocalDate.parse(date), amount); + String description = jsonObj.get("description").getAsString(); + String category = jsonObj.get("category").getAsString(); + LocalDate date = LocalDate.parse(jsonObj.get("date").getAsString()); + double amount = jsonObj.get("amount").getAsDouble(); + Expense expense = new Expense(category, description, date, amount); expenses.add(expense); - } } - - } catch (Exception e) { - System.out.println("Unfortunately, expense list file can't be found. I'll make a new one!"); + } catch (IOException e) { + System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); } return expenses; } public void save(IncomeList incomes, ExpenseList expenses) { - JSONArray jsonArray = new JSONArray(); + JsonArray jsonArray = new JsonArray(); for (int i = 0; i < incomes.size(); i++) { Record income = incomes.get(i); - JSONObject obj = new JSONObject(); - obj.put("type", "I"); - obj.put("description", income.getDescription()); - obj.put("date", income.getDate().toString()); - obj.put("amount", income.getValue()); - jsonArray.add(obj); + JsonObject incomeObj = new JsonObject(); + incomeObj.addProperty("type", "I"); + incomeObj.addProperty("description", income.getDescription()); + incomeObj.addProperty("date", income.getDate().toString()); + incomeObj.addProperty("amount", income.getValue()); + + jsonArray.add(incomeObj); } for (int i = 0; i < expenses.size(); i++) { Record expense = expenses.get(i); - JSONObject obj = new JSONObject(); - obj.put("type", "E"); - obj.put("category", expense.getCategory()); - obj.put("description", expense.getDescription()); - obj.put("date", expense.getDate().toString()); - obj.put("amount", expense.getValue()); - - jsonArray.add(obj); + + JsonObject expenseObj = new JsonObject(); + expenseObj.addProperty("type", "E"); + expenseObj.addProperty("category", expense.getCategory()); + expenseObj.addProperty("description", expense.getDescription()); + expenseObj.addProperty("date", expense.getDate().toString()); + expenseObj.addProperty("amount", expense.getValue()); + + jsonArray.add(expenseObj); } - String jsonString = JSONValue.toJSONString(jsonArray); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String jsonString = gson.toJson(jsonArray); - // write the JSONObject to a file + // write the JSON string to a file try (FileWriter file = new FileWriter(this.file)) { file.write(jsonString); @@ -135,7 +140,6 @@ public void save(IncomeList incomes, ExpenseList expenses) { System.out.println("An error occurred while writing JSON data to file."); e.printStackTrace(); } - } } From 46e740143cb52bbc1eeed629efd72437bebd0b62 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 14:06:31 +0800 Subject: [PATCH 217/364] Update parseDate for Expense and Income classes to catch dates that are invalid (i.e. 29-02-2021, etc.) --- src/main/java/chching/parser/Expenses.java | 6 ++++-- src/main/java/chching/parser/Incomes.java | 6 ++++-- src/test/java/chching/command/AddExpenseCommandTest.java | 2 +- src/test/java/chching/command/AddIncomeCommandTest.java | 2 +- src/test/java/chching/command/BalanceCommandTest.java | 2 +- src/test/java/chching/command/ClearCommandTest.java | 2 +- src/test/java/chching/command/DeleteExpenseCommandTest.java | 2 +- src/test/java/chching/command/DeleteIncomeCommandTest.java | 2 +- src/test/java/chching/command/EditExpenseCommandTest.java | 2 +- src/test/java/chching/command/EditIncomeCommandTest.java | 2 +- src/test/java/chching/command/ListCommandTest.java | 2 +- src/test/java/chching/record/ExpenseListTest.java | 2 +- src/test/java/chching/record/ExpenseTest.java | 2 +- src/test/java/chching/record/IncomeListTest.java | 2 +- src/test/java/chching/record/IncomeTest.java | 2 +- 15 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 7de82fa9c3..814cbc9d20 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.time.format.DateTimeFormatter; +import java.time.format.ResolverStyle; import java.util.HashMap; /** @@ -21,11 +22,12 @@ public class Expenses { */ public static LocalDate parseDate(String expenseDateString) throws ChChingException { try { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); LocalDate expenseDate = LocalDate.parse(expenseDateString, formatter); return expenseDate; } catch (DateTimeParseException e) { - throw new ChChingException("Date format should be: dd-MM-yyyy"); + throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 6e9b73c27b..85e402c17f 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -6,16 +6,18 @@ import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.time.format.DateTimeFormatter; +import java.time.format.ResolverStyle; import java.util.HashMap; public class Incomes { public static LocalDate parseDate(String incomeDateString) throws ChChingException { try { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); LocalDate incomeDate = LocalDate.parse(incomeDateString, formatter); return incomeDate; } catch (DateTimeParseException e) { - throw new ChChingException("Date format should be: dd-MM-yyyy"); + throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } } diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 4f47706343..4020d9faad 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -25,7 +25,7 @@ public class AddExpenseCommandTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; static final float ZERO_EXPENSE_VALUE = (float) 0; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index b8b2aeabe6..34aa877cd4 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -25,7 +25,7 @@ public class AddIncomeCommandTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 500; static final float ZERO_INCOME_VALUE = (float) 0; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 4fdba27b69..b10bf5fab0 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -25,7 +25,7 @@ */ class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate INCOME_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 5000; static final String EXPENSE_CATEGORY = "grocery"; diff --git a/src/test/java/chching/command/ClearCommandTest.java b/src/test/java/chching/command/ClearCommandTest.java index 2edbaa1bec..b2e4a32163 100644 --- a/src/test/java/chching/command/ClearCommandTest.java +++ b/src/test/java/chching/command/ClearCommandTest.java @@ -25,7 +25,7 @@ public class ClearCommandTest { static final String CATEGORY = "transport"; static final String EXPENSE_DESCRIPTION = "public transport"; static final String INCOME_DESCRIPTION = "ALLOWANCE"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; static final float INCOME_VALUE = (float) 200; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 0c622e1cb8..b6f665bc0f 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -32,7 +32,7 @@ class DeleteExpenseCommandTest { static final String SPENDING_CATEGORY = "entertainment"; static final String SPENDING_DESCRIPTION = "movie"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate SPENDING_DATE = LocalDate.parse("02-10-2023", FORMATTER); static final float SPENDING_EXPENSE_VALUE = (float) 10.50; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 42328e16af..0490b2814a 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -30,7 +30,7 @@ class DeleteIncomeCommandTest { static final int TOO_LARGE_INDEX = 5; static final int NEGATIVE_INDEX = -1; static final String SALARY_DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate SALARY_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float SALARY_INCOME_VALUE = (float) 5000; static final String BONUS_DESCRIPTION = "salary"; diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index fb32c7c6bd..656030d684 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -25,7 +25,7 @@ public class EditExpenseCommandTest { static final String GROCERIES_CATEGORY = "grocery"; static final String GROCERIES_DESCRIPTION = "too much groceries"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate GROCERIES_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float GROCERIES_VALUE = 500; static final String INDEX_FIELD = "in"; diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index 383e175190..02b6973817 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -25,7 +25,7 @@ public class EditIncomeCommandTest { public static final String SALARY_DESCRIPTION = "salary"; public static final int SALARY_VALUE = 5000; - public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); public static final LocalDate SALARY_DATE = LocalDate.parse("02-04-2023", FORMATTER); public static final String DESCRIPTION_VALUE = "bonus"; public static final String DATE_VALUE = "03-04-2023"; diff --git a/src/test/java/chching/command/ListCommandTest.java b/src/test/java/chching/command/ListCommandTest.java index 630d4544e6..a59d53c07e 100644 --- a/src/test/java/chching/command/ListCommandTest.java +++ b/src/test/java/chching/command/ListCommandTest.java @@ -25,7 +25,7 @@ public class ListCommandTest { static final String CATEGORY = "transport"; static final String EXPENSE_DESCRIPTION = "public transport"; static final String INCOME_DESCRIPTION = "ALLOWANCE"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; static final float INCOME_VALUE = (float) 200; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index d98c21f2c7..6fa8cd0816 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -16,7 +16,7 @@ class ExpenseListTest { static final int EXPECTED_SIZE = 1; static final String CATEGORY = "entertainment"; static final String DESCRIPTION = "beach party"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("23-05-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 50; private Expense expense; diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index 8c44e22b66..3bab49b7ef 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -13,7 +13,7 @@ public class ExpenseTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 547ed463fb..285e067d41 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -16,7 +16,7 @@ class IncomeListTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 1000000; private Income income; diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index c4d2437531..58dfc710c2 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -12,7 +12,7 @@ */ class IncomeTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 1000000; From 50f5374f2c9f525f058ad7708722d032f5773013 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 14:17:49 +0800 Subject: [PATCH 218/364] Update parseDate in Incomes and Expenses class to catch if date inputted is after present date --- src/main/java/chching/parser/Expenses.java | 12 ++++++++---- src/main/java/chching/parser/Incomes.java | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 814cbc9d20..606217b1a4 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -21,14 +21,18 @@ public class Expenses { * @param expenseDateString Input from users */ public static LocalDate parseDate(String expenseDateString) throws ChChingException { + LocalDate expenseDate; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); try { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") - .withResolverStyle(ResolverStyle.STRICT); - LocalDate expenseDate = LocalDate.parse(expenseDateString, formatter); - return expenseDate; + expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } + if (expenseDate.isAfter(LocalDate.now())) { + throw new ChChingException("Date cannot be in the future"); + } + return expenseDate; } /** diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 85e402c17f..c0c475f87a 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -11,14 +11,18 @@ public class Incomes { public static LocalDate parseDate(String incomeDateString) throws ChChingException { + LocalDate incomeDate; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); try { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") - .withResolverStyle(ResolverStyle.STRICT); - LocalDate incomeDate = LocalDate.parse(incomeDateString, formatter); - return incomeDate; + incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } + if (incomeDate.isAfter(LocalDate.now())) { + throw new ChChingException("Date cannot be in the future"); + } + return incomeDate; } /** From 55d3136914b24b3593b049086c2def11faf56106 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 14:39:10 +0800 Subject: [PATCH 219/364] Updated JUnit testing for editExpense and editIncome relating to editing the dates --- .../java/chching/record/ExpenseListTest.java | 34 +++++++++++++++++-- .../java/chching/record/IncomeListTest.java | 32 +++++++++++++++-- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 6fa8cd0816..51363ba41c 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -17,7 +17,7 @@ class ExpenseListTest { static final String CATEGORY = "entertainment"; static final String DESCRIPTION = "beach party"; static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); - static final LocalDate DATE = LocalDate.parse("23-05-2023", FORMATTER); + static final LocalDate DATE = LocalDate.parse("23-05-2021", FORMATTER); static final float EXPENSE_VALUE = (float) 50; private Expense expense; private ExpenseList expenses; @@ -90,9 +90,9 @@ void editExpense_editDescription_success() { */ @Test void editExpense_editDate_success() { - LocalDate expectedOutputDate = LocalDate.parse("23-05-2024", FORMATTER); + LocalDate expectedOutputDate = LocalDate.parse("23-05-2022", FORMATTER); try { - expenses.editExpense(1, "da", "23-05-2024"); + expenses.editExpense(1, "da", "23-05-2022"); assertEquals(CATEGORY, expenses.get(0).getCategory()); assertEquals(DESCRIPTION, expenses.get(0).getDescription()); assertEquals(expectedOutputDate, expenses.get(0).getDate()); @@ -102,6 +102,34 @@ void editExpense_editDate_success() { } } + /** + * Junit Test to test editExpense method with a date that is in the future. + * ChChing exception should be thrown. + */ + @Test + void editExpense_editFutureDate_exceptionThrown() { + try { + expenses.editExpense(1, "da", "05-04-2029"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * Junit Test to test editExpense method with a date that is not possible. + * ChChing exception should be thrown. + */ + @Test + void editExpense_editInvalidDate_exceptionThrown() { + try { + expenses.editExpense(1, "da", "30-02-2022"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + } + } + /** * JUnit test to test method to edit value of expense */ diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 285e067d41..8a67284c13 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -71,9 +71,9 @@ void editIncome_editDescription_success() { */ @Test void editIncome_editDate_success() { - LocalDate expectedOutputDate = LocalDate.parse("05-04-2024", FORMATTER); + LocalDate expectedOutputDate = LocalDate.parse("05-04-2022", FORMATTER); try { - incomes.editIncome(1, "da", "05-04-2024"); + incomes.editIncome(1, "da", "05-04-2022"); assertEquals(DESCRIPTION, incomes.get(0).getDescription()); assertEquals(expectedOutputDate, incomes.get(0).getDate()); assertEquals(INCOME_VALUE, incomes.get(0).getValue()); @@ -83,6 +83,34 @@ void editIncome_editDate_success() { } } + /** + * Junit Test to test editIncome method with a date that is in the future. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editFutureDate_exceptionThrown() { + try { + incomes.editIncome(1, "da", "05-04-2029"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * Junit Test to test editIncome method with a date that is not possible. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editInvalidDate_exceptionThrown() { + try { + incomes.editIncome(1, "da", "31-02-2022"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + } + } + /** * Junit Test to test if editIncome method can edit value of income. * income should only have its value changed to 200000. From e20366ed4581e2ba254efae447dfdc8534bede19 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 14:53:00 +0800 Subject: [PATCH 220/364] update text-ui expected file to pass github check --- text-ui-test/EXPECTED.TXT | 2 ++ 1 file changed, 2 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index b7eded7b3c..2b31dd88c8 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,3 +1,5 @@ +Unfortunately, income list file can't be found. I'll make a new one! +Unfortunately, income list file can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From 3771414f6b17daa811fffe0325d9b6dce492895a Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 15:18:19 +0800 Subject: [PATCH 221/364] updated text-ui-test to pass github check --- text-ui-test/data/chching.json | 1 - text-ui-test/data/chching.txt | 0 2 files changed, 1 deletion(-) delete mode 100644 text-ui-test/data/chching.json delete mode 100644 text-ui-test/data/chching.txt diff --git a/text-ui-test/data/chching.json b/text-ui-test/data/chching.json deleted file mode 100644 index 0637a088a0..0000000000 --- a/text-ui-test/data/chching.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/text-ui-test/data/chching.txt b/text-ui-test/data/chching.txt deleted file mode 100644 index e69de29bb2..0000000000 From 72f3b0742a7f95df13f9f52ff8bbf8a35cb3a401 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 16:28:12 +0800 Subject: [PATCH 222/364] Updated Project Portolio Page for thomas.md --- docs/team/thomas.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/docs/team/thomas.md b/docs/team/thomas.md index 3eefc85528..7a407ec294 100644 --- a/docs/team/thomas.md +++ b/docs/team/thomas.md @@ -1,9 +1,40 @@ # Thomas Joseph Lee Alba - Project Portfolio Page -just like my head this page do be empty ## Overview ChChing is a financial management tool which allows users to keep track of their incomes and expenses conveniently. There is also an option to change currency should users require currency conversion. -### Summary of Contributions \ No newline at end of file +### Summary of Contributions +Given below are my contributions to the project. + +#### Code Contributed: +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=thomasjlalba&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +#### Project management: +* Managed release of v1.0 on GitHub. +* Maintaining the issue tracker with the necessary tags and labels. + +#### Enhancements Implemented: +* Created parser to parse user input into commands and arguments. +* Created an add income command to allow users to add and track their incomes. +* Created an add expense command to allow users to add and track their expenses. +* Created an edit income command to allow users to edit their existing incomes. +* Created an edit expense command to allow users to edit their existing expenses. +* Contributed to JUnit tests for `IncomeList`, `ExpenseList`, `Parser` `AddIncomeCommand`, `AddExpenseCommand`, `BalanceCommand` `EditIncomeCommand`, `EditExpenseCommand` classes. + +#### Contributions to the UG: +* Updated and contributed to the `Quick Start` guide. +* Contributed to the `Command Summary` section. + +#### Contributions to the DG: +* Added implementation details for the edit income command. +* Added implementation details for the edit expense command. + +#### Contributions to team-based tasks: +* Ensuring GitHub's Java CI checks are passing +* Ensure JUnit test code is well written and has consistent format + +#### Review/monitoring contributions +* PRs reviewed for the following team: [CS2113-F10-1](https://github.com/AY2223S2-CS2113-F10-1/tp/pull/55) [CS2113-T14-3](https://github.com/nus-cs2113-AY2223S2/tp/pull/31/files/12c169b4ab991a2d549761120feb1c63c7c3ae72#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b) +* Reported bugs and suggestions for other team in the class: [CS2113-T13-1](https://github.com/thomasjlalba/ped/issues) From bc22139a30173cd10c320af35c71f349d06dc2bb Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 16:54:00 +0800 Subject: [PATCH 223/364] Updated command summary of User Guide --- docs/UserGuide.md | 48 +++++++++++++++++++++++---------------------- docs/team/thomas.md | 10 ++++++---- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e1e17d5a8b..5a48f5a9e9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -76,10 +76,11 @@ Use case: - Re-prompts user if any field is not provided properly. - VALUE will be stored as a positive float. - Format for DATE will be dd-MM-yyyy. +- DATE needs to be a valid date, and it cannot be a date in the future. Example of usage:
      `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` -
      `add income /c salary /de salary /da 22-03-2023 /v 500` +
      `add income /de salary /da 22-03-2023 /v 500` ### Listing all expenses and incomes: `list` @@ -103,7 +104,7 @@ Format: Use case: - Edits the item at the specified INDEX, where INDEX is a positive integer. -- At least one of the fields must be provided. +- At least one of the optional fields must be provided. - User inputs desired fields to be edited. - Existing values will be updated to the input values. @@ -245,24 +246,25 @@ Record entries are saved in `data/chching.txt` file. This file is updated upon e When reading from the file, entries for income and expenses are stored in their respective arrayList. ## Command Summary (Alphabetical Order) - -- Add Expense: `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` -- Add Income: `add income /de DESCRIPTION /da DATE /v VALUE` -- Clear income list: `clear income` -- Clear expense list: `clear expense` -- Clear both income and expense lists: `clear all` -- Delete Expense: `delete expense /in INDEX` -- Delete Income: `delete income /in INDEX` -- Edit income list: `edit income /i INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` -- Edit expense list: `edit expense /i INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -- Exit: `exit` -- Find entry: `find /c CATEGORY /k DESCRIPTION` -- List Records: `list` -- List Expenses: `list expense` -- List Incomes: `list income` -- Set Target: `set target /v Value` -- Show Target: `show target` -- Show Balance: `balance` -- Set Currency: `set currency /cr CURRENCY` -- Show help: `help` -- Unset Currency: `unset currency /cr CURRENCY` +| **Command** | **Format & Examples** | +|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------| +| Add Expense | `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE`
      e.g. `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` | +| Add Income | `add income /de DESCRIPTION /da DATE /v VALUE`
      e.g. `add income /de salary /da 22-03-2023 /v 500` | +| Clear All Lists | `clear all` | +| Clear Expense List | `clear expense` | +| Clear Income List | `clear income` | +| Delete Expense | `delete expense /in INDEX`
      e.g. `delete expense /in 1` | +| Delete Income | `delete income /in INDEX`
      e.g. `delete income /in 2` | +| Edit Expense | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | +| Edit Income | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | +| Exit | `exit` | +| Find | `find /c CATEGORY /k DESCRIPTION`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | +| Help | `help` | +| List All | `list` | +| List Expense List | `list expense` | +| List Income List | `list income` | +| Set Currency | `set currency /cr CURRENCY`
      e.g. `set currency /cr HKD` | +| Set Target | `set target /v VALUE`
      e.g. `set target /v 350` | +| Show Target | `show target` | +| Show Balance | `balance` | +| Unset Currency | `unset currency /cr CURRENCY`
      e.g. `unset currency /cr HKD` | diff --git a/docs/team/thomas.md b/docs/team/thomas.md index 7a407ec294..3381344658 100644 --- a/docs/team/thomas.md +++ b/docs/team/thomas.md @@ -25,6 +25,8 @@ Given below are my contributions to the project. #### Contributions to the UG: * Updated and contributed to the `Quick Start` guide. +* Contributed to the `Updating an entry` feature. +* Contributed to the `Setting currency` feature. * Contributed to the `Command Summary` section. #### Contributions to the DG: @@ -32,9 +34,9 @@ Given below are my contributions to the project. * Added implementation details for the edit expense command. #### Contributions to team-based tasks: -* Ensuring GitHub's Java CI checks are passing -* Ensure JUnit test code is well written and has consistent format +* Ensuring GitHub's Java CI checks are passing. +* Ensure JUnit test code is well written and has consistent format. #### Review/monitoring contributions -* PRs reviewed for the following team: [CS2113-F10-1](https://github.com/AY2223S2-CS2113-F10-1/tp/pull/55) [CS2113-T14-3](https://github.com/nus-cs2113-AY2223S2/tp/pull/31/files/12c169b4ab991a2d549761120feb1c63c7c3ae72#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b) -* Reported bugs and suggestions for other team in the class: [CS2113-T13-1](https://github.com/thomasjlalba/ped/issues) +* PRs reviewed for the following team: [CS2113-F10-1](https://github.com/AY2223S2-CS2113-F10-1/tp/pull/55), [CS2113-T14-3](https://github.com/nus-cs2113-AY2223S2/tp/pull/31/files/12c169b4ab991a2d549761120feb1c63c7c3ae72#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b). +* Reported bugs and suggestions for other team in the class: [CS2113-T13-1](https://github.com/thomasjlalba/ped/issues). From fa5722cde4354398abf80cc53ca3a71dc7eff796 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 16:58:38 +0800 Subject: [PATCH 224/364] Edit formatting issues --- docs/UserGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5a48f5a9e9..96b0f4ed21 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -255,12 +255,12 @@ When reading from the file, entries for income and expenses are stored in their | Clear Income List | `clear income` | | Delete Expense | `delete expense /in INDEX`
      e.g. `delete expense /in 1` | | Delete Income | `delete income /in INDEX`
      e.g. `delete income /in 2` | -| Edit Expense | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | -| Edit Income | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | +| Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | +| Edit Income | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | | Exit | `exit` | | Find | `find /c CATEGORY /k DESCRIPTION`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | | Help | `help` | -| List All | `list` | +| List All Lists | `list` | | List Expense List | `list expense` | | List Income List | `list income` | | Set Currency | `set currency /cr CURRENCY`
      e.g. `set currency /cr HKD` | From ef0d25e9a181048c25fc61b2df59c738e9e33e0c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 3 Apr 2023 17:00:20 +0800 Subject: [PATCH 225/364] Edit spelling error --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 96b0f4ed21..8296d5c393 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -209,7 +209,7 @@ Format: Use case: -- VALUE ranges from negative to postive +- VALUE ranges from negative to positive Example of usage:
      `set target /v 350` From 19463ab4e32014452da1df30128f33561e2df64b Mon Sep 17 00:00:00 2001 From: avielcx Date: Mon, 3 Apr 2023 17:54:11 +0800 Subject: [PATCH 226/364] Update UG and DG --- docs/DeveloperGuide.md | 17 ++++++++++++++++- docs/UserGuide.md | 8 ++++++-- .../chching/command/BalanceCommandTest.java | 3 ++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4f186974da..b5dba6f7c3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -158,7 +158,22 @@ The value proposition of ChChing is its ability to track income and expenses on ## Glossary -* *glossary item* - Definition + + +| Terminology | Definition | +|--------------|------------------------------| +| Income | Debit entry | +| Expense | Credit entry | +| Balance | Net Amount | +| Target | Desired Net Amount | + | Parser | Class to take in inputs | +| UI | Class to interact with users | + + + + + + ## Instructions for manual testing diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8296d5c393..5b5457383e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -30,7 +30,7 @@ ChChing is a desktop app for tracking spending, and it uses a Command Line Inter ## Quick Start 1. Ensure that you have Java 11 or above installed. -2. Down the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). +2. Download the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). 3. Copy downloaded `tp.jar` file to the desired home folder of choice. 4. Open a command terminal and `cd` into the folder mentioned in step 3. 5. Type in the following to run the application: @@ -39,7 +39,7 @@ ChChing is a desktop app for tracking spending, and it uses a Command Line Inter java -jar tp.jar ``` -6. If successful, the following greeting should appear: +6. If successful, the following greetings should appear:
      For first time users: ``` Unfortunately, income list file can't be found. I'll make a new one! @@ -236,16 +236,20 @@ Format:
      `help` ### Exit: `exit` + Exit the program Format:
      `exit` + ### Saving and loading of data Record entries are saved in `data/chching.txt` file. This file is updated upon exit. When reading from the file, entries for income and expenses are stored in their respective arrayList. + ## Command Summary (Alphabetical Order) + | **Command** | **Format & Examples** | |--------------------|--------------------------------------------------------------------------------------------------------------------------------------------| | Add Expense | `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE`
      e.g. `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` | diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index b10bf5fab0..1280e399eb 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -1,4 +1,5 @@ -/* @@author avielcx, thomasjlalba */ +/* @@author avielcx + @@thomasjlalba */ package chching.command; import chching.Storage; From d9fd8b66de3618ed3f5198240467b52b9fe420b8 Mon Sep 17 00:00:00 2001 From: avielcx Date: Mon, 3 Apr 2023 18:02:45 +0800 Subject: [PATCH 227/364] Fix Storage bug --- src/main/java/chching/Storage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 3a6ac82a3c..ae95e2f1ac 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -95,7 +95,7 @@ public ArrayList loadExpenses() { } } } catch (IOException e) { - System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); + System.out.println("Unfortunately, expense list file can't be found. I'll make a new one!"); } return expenses; From 043bacb0e1319278b457e03a8cdf5bbe50cc713c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 3 Apr 2023 19:00:57 +0800 Subject: [PATCH 228/364] added PPP --- docs/team/yanming.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/team/yanming.md b/docs/team/yanming.md index 32d5489712..57fdb3f53c 100644 --- a/docs/team/yanming.md +++ b/docs/team/yanming.md @@ -6,4 +6,45 @@ which allows users to keep track of their incomes and expenses conveniently. There is also an option to change currency should users require currency conversion. -### Summary of Contributions \ No newline at end of file +### Summary of Contributions +Given below are my contributions to the project. + +#### Code Contributed: +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=rayleigh47&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +#### Project management: + +#### Enhancements Implemented: +* Added methods to parser to parse specific fields such as +`income`, `expenses`, `category`, `keyword` and `date`. +* Implemented `Record` class and added to `Income` and `Expense` classes. +* Created list command to allow users to see their recorded entries. +* Created list income command to allow users to see their recorded income entries. +* Created list expense command to allow users to see their recorded expense entries. +* Created invalid command to show users a default invalid message. +* Contributed to add income command to allow users to edit their existing incomes. +* Contributed to add expense command to allow users to edit their existing expenses. +* Contributed to JUnit tests for +`IncomeTest`, `ExpenseTest`, `ListCommandTest`, `ClearCommandTest`. + +#### Contributions to the UG: +* Added initial draft for UG for v1.0 +* Contributed to `add`, `list`, `balance`and `help` feature +* Contributed to `Saving and loading of data` section + +#### Contributions to the DG: +* Added `AddIncomeCommand` sequence diagram +* Added `ListExpenseCommand` sequence diagram +* Added documentation for `AddIncomeCommand` +* Added documentation for `ListExpenseCommand` + +#### Contributions to team-based tasks: +* Setting up of GitHub team organisation and repository +* v1.0 wrap-up +* v1.0 release +* v2.0 wrap-up + +#### Review/monitoring contributions +* PR and DG reviewed for the following team: [CS2113-T13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/79) +* Reported bugs and suggestions for other team in the class: [CS2113-T09-3](https://github.com/rayleigh47/ped/issues) + From 5d24da397175e4572151473a163f72adb4ad11fa Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 4 Apr 2023 14:56:20 +0800 Subject: [PATCH 229/364] Update runtest's expected output to allow Java CI to pass --- text-ui-test/EXPECTED.TXT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 2b31dd88c8..d34d269fa8 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,5 @@ Unfortunately, income list file can't be found. I'll make a new one! -Unfortunately, income list file can't be found. I'll make a new one! +Unfortunately, expense list file can't be found. I'll make a new one! ____________________________________________________________ Hello! I'm ChChing. What can I do for you? From a490ab252906b639614b727b8c91d9b6da63550e Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Tue, 4 Apr 2023 15:39:17 +0800 Subject: [PATCH 230/364] Add Non-functional Requirements in Developer Guide --- docs/DeveloperGuide.md | 23 ++++++++++++++++++++++- docs/team/thomas.md | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b5dba6f7c3..3a0b9a9a25 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -154,7 +154,28 @@ The value proposition of ChChing is its ability to track income and expenses on | v2.0 | user | reset my income/expense lists or both | have a fresh list | ## Non-Functional Requirements -{Give non-functional requirements} +* Domain rules: + * ChChing should not crash under normal circumstances. + * Dates should be in the format of dd/mm/yyyy, it should be a valid date, and it should not be a future date. + * Amount should be a positive number. + +* Constraints: + * Total Expense and Total Income should not exceed 2^31 - 1. + * The '/' should not be used within any of the inputs, unless it is for specifying a category. + +* Technical Requirements: + * ChChing should be able to run on Windows, Mac, or Linux as long as it has Java 11 or above installed. + +* Quality requirements: + * ChChing should be usable to users of all skill and proficiency levels. + +* Others: + * Should user input additional arguments that are not within the scope of the command's input, ChChing would ignore them. +
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50` + * Should the arguments be in the wrong order, ChChing would still be able to parse the arguments correctly.
      However, should the command not be written first, ChChing would not be able to parse the command. +
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry. +
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since command is not written first. + ## Glossary diff --git a/docs/team/thomas.md b/docs/team/thomas.md index 3381344658..7beab722d9 100644 --- a/docs/team/thomas.md +++ b/docs/team/thomas.md @@ -32,6 +32,7 @@ Given below are my contributions to the project. #### Contributions to the DG: * Added implementation details for the edit income command. * Added implementation details for the edit expense command. +* Added Non-Functional Requirements section. #### Contributions to team-based tasks: * Ensuring GitHub's Java CI checks are passing. From 278ee152a2716734a83c7d02e751a598b6d7a9ad Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Tue, 4 Apr 2023 20:02:44 +0800 Subject: [PATCH 231/364] test for currency stuff --- docs/team/clement.md | 25 ++++++++- .../command/SetCurrencyCommandTest.java | 51 ++++++++++++++++++ .../command/UnsetCurrencyCommandTest.java | 52 +++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chching/command/SetCurrencyCommandTest.java create mode 100644 src/test/java/chching/command/UnsetCurrencyCommandTest.java diff --git a/docs/team/clement.md b/docs/team/clement.md index 93fcd71e06..b66045818a 100644 --- a/docs/team/clement.md +++ b/docs/team/clement.md @@ -6,4 +6,27 @@ which allows users to keep track of their incomes and expenses conveniently. There is also an option to change currency should users require currency conversion. -### Summary of Contributions \ No newline at end of file +### Summary of Contributions +Given below are my contributions to the project. + +#### Code Contributed: +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=hyperbola-bear&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + + +#### Project management: +* Creating issues for team members to work on + +#### Enhancements Implemented: +* Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. +* Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. +* Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. +* Created a Selector to allow users to select the currency of interest. +* Created a Converter class to allow users to convert the currency of interest. +* Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. +* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`. + +#### Contributions to the UG: +Added documentation for the feature 'Set Currency', 'Unset Currency'. + +#### Contributions to the DG: +* Added `SetCurrencyCommand` sequence diagram diff --git a/src/test/java/chching/command/SetCurrencyCommandTest.java b/src/test/java/chching/command/SetCurrencyCommandTest.java new file mode 100644 index 0000000000..f6ee9380f2 --- /dev/null +++ b/src/test/java/chching/command/SetCurrencyCommandTest.java @@ -0,0 +1,51 @@ +package chching.command; + + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + + + +public class SetCurrencyCommandTest { + + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private final String currency = "HKD"; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + } + + /** + * Junit Test when setting currency to be displayed + */ + @Test + public void execute_addTargetCommand_success() { + try { + Command command = new SetCurrencyCommand(currency); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertEquals(selector.isSelected(currency), true); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/test/java/chching/command/UnsetCurrencyCommandTest.java b/src/test/java/chching/command/UnsetCurrencyCommandTest.java new file mode 100644 index 0000000000..727fc9ecd1 --- /dev/null +++ b/src/test/java/chching/command/UnsetCurrencyCommandTest.java @@ -0,0 +1,52 @@ +package chching.command; + + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +public class UnsetCurrencyCommandTest { + + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private final String currency = "HKD"; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + } + + /** + * Junit Test when unsetting currency to be displayed + */ + @Test + public void execute_addTargetCommand_success() { + try { + Command command = new SetCurrencyCommand(currency); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertEquals(selector.isSelected(currency), true); + command = new UnsetCurrencyCommand(currency); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertEquals(selector.isSelected(currency), false); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} From 1bdcc06abfaea1d95d2ce153d1f008c6097fb778 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 20:08:10 +0800 Subject: [PATCH 232/364] edit PPP further --- docs/team/yanming.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/team/yanming.md b/docs/team/yanming.md index 57fdb3f53c..177c00b6b0 100644 --- a/docs/team/yanming.md +++ b/docs/team/yanming.md @@ -13,6 +13,7 @@ Given below are my contributions to the project. [RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=rayleigh47&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) #### Project management: +* Setting up of GitHub team organisation and repository #### Enhancements Implemented: * Added methods to parser to parse specific fields such as @@ -28,7 +29,7 @@ Given below are my contributions to the project. `IncomeTest`, `ExpenseTest`, `ListCommandTest`, `ClearCommandTest`. #### Contributions to the UG: -* Added initial draft for UG for v1.0 +* Added v1.0 UG draft * Contributed to `add`, `list`, `balance`and `help` feature * Contributed to `Saving and loading of data` section @@ -39,7 +40,6 @@ Given below are my contributions to the project. * Added documentation for `ListExpenseCommand` #### Contributions to team-based tasks: -* Setting up of GitHub team organisation and repository * v1.0 wrap-up * v1.0 release * v2.0 wrap-up From 31945657b4f065d80f227bea8eeb50ae0d39cb4e Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 4 Apr 2023 20:51:31 +0800 Subject: [PATCH 233/364] Update UG --- docs/UserGuide.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5b5457383e..dd8c9ba20b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -110,7 +110,7 @@ Use case: Example of usage: `edit expense /in 1 /de Lunch @Technoedge /v 5.20` -`edit income /in 2 /da 12-12-2022 /v 100` +
      `edit income /in 2 /da 12-12-2022 /v 100` ### Setting currency to be converted: `set currency` @@ -148,11 +148,13 @@ Example of usage: ### Finding an entry: `find` Find an existing expense/income that is currently in the list. +
      The program will search for the keywords in your entries. +
      Vague keywords will render less specific results. - CATEGORY is specified as either `income` or `expense` Format: -
      `find /c CATEGORY /k DESCRIPTION` +
      `find /c CATEGORY /k KEYWORD` Use case: From 62f96e85b827fab989de38977e5def2aa9b00b75 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 4 Apr 2023 20:55:04 +0800 Subject: [PATCH 234/364] Update UG for "find" --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index dd8c9ba20b..802f162dbd 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -264,7 +264,7 @@ When reading from the file, entries for income and expenses are stored in their | Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | | Edit Income | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | | Exit | `exit` | -| Find | `find /c CATEGORY /k DESCRIPTION`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | +| Find | `find /c CATEGORY /k KEYWORD`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | | Help | `help` | | List All Lists | `list` | | List Expense List | `list expense` | From 337c2185cc4ef02226b5de22e39f354109023c77 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 20:57:06 +0800 Subject: [PATCH 235/364] added char limit to category and description fields --- src/main/java/chching/command/AddExpenseCommand.java | 4 ++++ src/main/java/chching/command/AddIncomeCommand.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index 8eabdf8f60..fe70269091 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -26,8 +26,12 @@ public AddExpenseCommand(Expense expense) throws ChChingException { throw new ChChingException("No fields found"); } else if (expense.getCategory() == null) { throw new ChChingException("Missing category field"); + } else if(expense.getCategory().length() > 30) { + throw new ChChingException("Character limit of 99 for category field exceeded"); } else if (expense.getDescription() == null) { throw new ChChingException("Missing description field"); + } else if(expense.getDescription().length() > 99) { + throw new ChChingException("Character limit of 99 for description field exceeded"); } else if (expense.getDate() == null) { throw new ChChingException("Missing date field"); } else if (expense.getValue() <= 0) { diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 207072c293..7e3eca451e 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -26,6 +26,8 @@ public AddIncomeCommand(Income income) throws ChChingException { throw new ChChingException("No fields found"); } else if (income.getDescription() == null) { throw new ChChingException("Missing description field"); + } else if(income.getDescription().length() > 99) { + throw new ChChingException("Character limit of 99 for description field exceeded"); } else if (income.getDate() == null) { throw new ChChingException("Missing date field"); } else if (income.getValue() <= 0) { From 97aa3e915ccd5d0aaf27cb1e041d02e1362fb6b7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 20:58:26 +0800 Subject: [PATCH 236/364] edit add use case in UG for new char limits --- docs/UserGuide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5b5457383e..b380b48a75 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -74,6 +74,8 @@ Format: Use case: - Re-prompts user if any field is not provided properly. +- CATEGORY has a maximum char limit of 30. +- DESCRIPTION has a maximum char limit of 99. - VALUE will be stored as a positive float. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. From 7a6a9df13dbfc409cf77bf6138c42b57c3c7e631 Mon Sep 17 00:00:00 2001 From: avielcx Date: Tue, 4 Apr 2023 21:10:33 +0800 Subject: [PATCH 237/364] Make file read-only --- src/main/java/chching/Storage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index ae95e2f1ac..ebfe32e735 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -34,6 +34,7 @@ public class Storage { File dir = new File(dirname); dir.mkdirs(); this.file = new File(filepath); + this.file.setReadOnly(); } public ArrayList loadIncomes() { @@ -134,7 +135,9 @@ public void save(IncomeList incomes, ExpenseList expenses) { // write the JSON string to a file try (FileWriter file = new FileWriter(this.file)) { + this.file.setWritable(true); file.write(jsonString); + this.file.setReadOnly(); } catch (IOException e) { System.out.println("An error occurred while writing JSON data to file."); From 39954452ce34f3777282c5c60cc23248863143f7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 21:27:13 +0800 Subject: [PATCH 238/364] added message for empty expense or income list --- src/main/java/chching/Ui.java | 36 +++++++++++++++---- .../chching/command/ListExpenseCommand.java | 7 ++-- .../chching/command/ListIncomeCommand.java | 7 ++-- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 0fdd93a660..1c27836a36 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -61,13 +61,21 @@ public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) } public void showAllRecords(IncomeList incomes, ExpenseList expenses, Selector selector, Converter converter) { - System.out.println(" Here are the incomes in your list:"); - incomes.printIncomeList(selector, converter); - - System.out.println(); - - System.out.println(" Here are the expense in your list:"); - expenses.printExpenseList(selector, converter); + if(incomes.size() == 0 && expenses.size() == 0) { + System.out.println(" Both lists are empty. Start adding!"); + } else if(incomes.size() == 0) { + System.out.println(" Income list is empty. Start adding!"); + System.out.println(); + showExpenseList(expenses, selector, converter); + } else if(expenses.size() == 0) { + showIncomeList(incomes, selector, converter); + System.out.println(); + System.out.println(" Expense list is empty. Start adding!"); + } else { + showIncomeList(incomes, selector, converter); + System.out.println(); + showExpenseList(expenses, selector, converter); + } } public void showBalance(double totalExpense, double totalIncome, double balance, String convertedBalance) { @@ -179,4 +187,18 @@ public void showTargetAdded() { public void showListCleared() { System.out.println(" List(s) cleared"); } + + public void showExpenseList(ExpenseList expenses, Selector selector, Converter converter) { + System.out.println(" Here are the expenses in your list:"); + expenses.printExpenseList(selector, converter); + } + + public void showIncomeList(IncomeList income, Selector selector, Converter converter) { + System.out.println(" Here are the incomes in your list:"); + income.printIncomeList(selector, converter); + } + + public void showEmptyListMessage() { + System.out.println(" The list is empty. Start adding!"); + } } diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index 22969508c3..5784d919c8 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -27,7 +27,10 @@ public class ListExpenseCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - System.out.println(" Expenses:"); - expenses.printExpenseList(selector, converter); + if(expenses.size() == 0) { + ui.showEmptyListMessage(); + } else { + ui.showExpenseList(expenses, selector, converter); + } } } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index 87d7ccf44c..2fd8c438b2 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -27,7 +27,10 @@ public class ListIncomeCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - System.out.println(" Income:"); - incomes.printIncomeList(selector, converter); + if (incomes.size() == 0) { + ui.showEmptyListMessage(); + } else { + ui.showIncomeList(incomes, selector, converter); + } } } From 8ad942188070a83cfed475b7522bde26f5139736 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 21:30:34 +0800 Subject: [PATCH 239/364] clean up ListExpenseCommand and ListIncomeCommand to use Ui --- src/main/java/chching/Ui.java | 16 ++++++++++++---- .../java/chching/command/ListExpenseCommand.java | 4 ---- .../java/chching/command/ListIncomeCommand.java | 4 ---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 1c27836a36..c87eae7034 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -189,13 +189,21 @@ public void showListCleared() { } public void showExpenseList(ExpenseList expenses, Selector selector, Converter converter) { - System.out.println(" Here are the expenses in your list:"); - expenses.printExpenseList(selector, converter); + if(expenses.size() == 0) { + showEmptyListMessage(); + } else { + System.out.println(" Here are the expenses in your list:"); + expenses.printExpenseList(selector, converter); + } } public void showIncomeList(IncomeList income, Selector selector, Converter converter) { - System.out.println(" Here are the incomes in your list:"); - income.printIncomeList(selector, converter); + if(income.size() == 0) { + showEmptyListMessage(); + } else { + System.out.println(" Here are the incomes in your list:"); + income.printIncomeList(selector, converter); + } } public void showEmptyListMessage() { diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index 5784d919c8..d29fd3ef8a 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -27,10 +27,6 @@ public class ListExpenseCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - if(expenses.size() == 0) { - ui.showEmptyListMessage(); - } else { ui.showExpenseList(expenses, selector, converter); - } } } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index 2fd8c438b2..a83e76c8ee 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -27,10 +27,6 @@ public class ListIncomeCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - if (incomes.size() == 0) { - ui.showEmptyListMessage(); - } else { ui.showIncomeList(incomes, selector, converter); - } } } From 7c0f362f818655a9d6c5b2d44187f1d12acf4151 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 21:34:17 +0800 Subject: [PATCH 240/364] resolve merge conflict and gradle check --- src/main/java/chching/command/ListExpenseCommand.java | 2 +- src/main/java/chching/command/ListIncomeCommand.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index d29fd3ef8a..67c2ddf7ca 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -27,6 +27,6 @@ public class ListExpenseCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - ui.showExpenseList(expenses, selector, converter); + ui.showExpenseList(expenses, selector, converter); } } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index a83e76c8ee..8d6e896ae6 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -27,6 +27,6 @@ public class ListIncomeCommand extends Command { @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - ui.showIncomeList(incomes, selector, converter); + ui.showIncomeList(incomes, selector, converter); } } From 0643ca88572f786dedf196f705ed6cc2e5794fd9 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Tue, 4 Apr 2023 21:37:32 +0800 Subject: [PATCH 241/364] fixed incorrect exception message for category field character limit --- src/main/java/chching/command/AddExpenseCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index fe70269091..de37b80f45 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -27,7 +27,7 @@ public AddExpenseCommand(Expense expense) throws ChChingException { } else if (expense.getCategory() == null) { throw new ChChingException("Missing category field"); } else if(expense.getCategory().length() > 30) { - throw new ChChingException("Character limit of 99 for category field exceeded"); + throw new ChChingException("Character limit of 30 for category field exceeded"); } else if (expense.getDescription() == null) { throw new ChChingException("Missing description field"); } else if(expense.getDescription().length() > 99) { From 2ae192009e1aacbbbbfd8d3b3c3417b1e4e0109d Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 10:11:26 +0800 Subject: [PATCH 242/364] Revert Storage class changes --- src/main/java/chching/ChChing.java | 1 - src/main/java/chching/Storage.java | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 4730e9ed78..fc07e1d1ce 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -65,7 +65,6 @@ public void run() { } public static void main(String[] args) { - // assert false : "Assertions should be enabled"; new ChChing("data/chching.json").run(); } } diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index ebfe32e735..e2d9c709dc 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -27,14 +27,14 @@ public class Storage { /** * Build constructor for the Storage class. + * * @param filepath the filepath of the storage. */ - Storage(String filepath){ + Storage(String filepath) { String dirname = filepath.substring(0, filepath.lastIndexOf("/")); File dir = new File(dirname); dir.mkdirs(); this.file = new File(filepath); - this.file.setReadOnly(); } public ArrayList loadIncomes() { @@ -135,9 +135,7 @@ public void save(IncomeList incomes, ExpenseList expenses) { // write the JSON string to a file try (FileWriter file = new FileWriter(this.file)) { - this.file.setWritable(true); file.write(jsonString); - this.file.setReadOnly(); } catch (IOException e) { System.out.println("An error occurred while writing JSON data to file."); From c8e1608c671b741fd61fabba2b6ef72d71ee051a Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 10:18:04 +0800 Subject: [PATCH 243/364] Update PPP --- docs/team/avielcx.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index cbea1b777b..5fb1edae20 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -22,13 +22,14 @@ Given below are my contributions to the project. * Created a clear all feature which allow users to clear both income and expense lists. * Created an AddTarget feature which allow users to set their target. * Created a ShowTarget feature which allow users to see the target they have set. -* Contributed to tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, +* Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, `IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. #### Contributions to the UG: -* Added `Table of Contents` +* Created `Table of Contents` * Contributed to `Quick Start` portion -* Added documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`, `balance`, `exit`, `Command Summary` +* Created documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`, `balance`, `exit` +* Created `Command Summary` #### Contributions to the DG: * Added `Table of Contents` @@ -39,12 +40,15 @@ Given below are my contributions to the project. * Added documentation for `Target user profile` * Added documentation for `Value Proposition` * Added documentation for `v2.0` of `User Stories` +* Added documentation for `Glossary` #### Contributions to team-based tasks: * Method documentations * Assertions enabled +* Ensured GitHub's Java CI checks pass * v2.0 wrap-up * v2.0 release +* v2.1 set-up #### Review/monitoring contributions * PRs reviewed for the following team: [CS2113-W13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/53) From 6eea5ac27a0a926ad39bd298c826bc3889f7dd19 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 10:20:10 +0800 Subject: [PATCH 244/364] tried unicode proof, + currency issues --- build.gradle | 10 ++++++ docs/team/clement.md | 3 +- src/main/java/chching/ChChingException.java | 6 ++++ src/main/java/chching/Ui.java | 5 ++- .../chching/command/SetCurrencyCommand.java | 3 +- .../chching/command/UnsetCurrencyCommand.java | 3 +- src/main/java/chching/currency/Selector.java | 8 +++-- src/main/java/chching/parser/Expenses.java | 5 +++ src/main/java/chching/parser/Incomes.java | 7 ++++- .../java/chching/parser/UnicodeChecker.java | 31 +++++++++++++++++++ 10 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/main/java/chching/parser/UnicodeChecker.java diff --git a/build.gradle b/build.gradle index f2f0efe589..9b46f0c51f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,16 @@ plugins { id 'com.github.johnrengelman.shadow' version '7.1.2' } +compileJava.options.encoding = "UTF-8" +compileTestJava.options.encoding = "UTF-8" + +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} +tasks.withType(Test) { + systemProperty "file.encoding", "UTF-8" +} + repositories { mavenCentral() } diff --git a/docs/team/clement.md b/docs/team/clement.md index b66045818a..f64388d4ea 100644 --- a/docs/team/clement.md +++ b/docs/team/clement.md @@ -19,11 +19,12 @@ Given below are my contributions to the project. #### Enhancements Implemented: * Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. * Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. +* Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. * Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. * Created a Selector to allow users to select the currency of interest. * Created a Converter class to allow users to convert the currency of interest. * Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. -* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`. +* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand` #### Contributions to the UG: Added documentation for the feature 'Set Currency', 'Unset Currency'. diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index bfef272cd5..801d011f39 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -4,8 +4,14 @@ * Models a class for exception thrown */ public class ChChingException extends Exception { + private String message; public ChChingException(String message) { super(message); + this.message = message; + } + + public void printChChingException() { + System.out.println(message); } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 0fdd93a660..187fcf4005 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -7,6 +7,9 @@ import chching.record.Record; import chching.record.RecordList; +import java.io.InputStreamReader; +import java.nio.charset.Charset; +import java.util.Map; import java.util.Scanner; /** @@ -14,7 +17,7 @@ */ public class Ui { public String readCommand() { - Scanner input = new Scanner((System.in)); + Scanner input = new Scanner((new InputStreamReader(System.in, Charset.forName("UTF-8")))); return input.nextLine(); } diff --git a/src/main/java/chching/command/SetCurrencyCommand.java b/src/main/java/chching/command/SetCurrencyCommand.java index f20f35b218..b256f3f3d6 100644 --- a/src/main/java/chching/command/SetCurrencyCommand.java +++ b/src/main/java/chching/command/SetCurrencyCommand.java @@ -38,6 +38,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto throw new ChChingException("Currency not available!"); } selector.setCurrency(currency); - selector.printSelector(); + selector.printSelector(converter); + System.out.println("Displaying " + currency + " now."); } } diff --git a/src/main/java/chching/command/UnsetCurrencyCommand.java b/src/main/java/chching/command/UnsetCurrencyCommand.java index 874cc04939..3959ff934c 100644 --- a/src/main/java/chching/command/UnsetCurrencyCommand.java +++ b/src/main/java/chching/command/UnsetCurrencyCommand.java @@ -37,6 +37,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto throw new ChChingException("Currency not available!"); } selector.unsetCurrency(currency); - selector.printSelector(); + selector.printSelector(converter); + System.out.println("Not displaying " + currency + " now."); } } diff --git a/src/main/java/chching/currency/Selector.java b/src/main/java/chching/currency/Selector.java index 2aabd47506..6f1b9663fa 100644 --- a/src/main/java/chching/currency/Selector.java +++ b/src/main/java/chching/currency/Selector.java @@ -26,10 +26,10 @@ public void unsetCurrency(String currency) { selectedCurrencies.put(currency, false); } - public void printSelector() { + public void printSelector(Converter converter) { for (String currency : selectedCurrencies.keySet()) { String marked = selectedCurrencies.get(currency) ? "[X] " : "[ ] "; - System.out.println(marked + currency); + System.out.println(marked + currency + " " + converter.convert(currency, 1)); } } @@ -40,4 +40,8 @@ public boolean containsCurrency(String currency) { public boolean isSelected(String currency) { return selectedCurrencies.get(currency); } + + public int getSize() { + return selectedCurrencies.size(); + } } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 606217b1a4..41c1caf78a 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,6 +14,7 @@ */ public class Expenses { + private static final String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=,./<>?;':\"[]{}\\|`~ "; /** * Parses a date @@ -45,6 +46,10 @@ public static Expense parseExpense(HashMap argumentsByField) thr try { String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); + String invalidCharacters = expenseDescription.replaceAll(VALID_CHARACTERS, ""); + if (!invalidCharacters.isEmpty()) { + throw new ChChingException("Description contains invalid characters"); + } String expenseDateString = argumentsByField.get("da"); LocalDate expenseDate = parseDate(expenseDateString); float expenseValue = Float.parseFloat(argumentsByField.get("v")); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index c0c475f87a..eac119c59c 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -34,6 +34,10 @@ public static Income parseIncome(HashMap argumentsByField) throw Income inc = null; try { String incomeDescription = argumentsByField.get("de"); + boolean validCharacters = UnicodeChecker.isValidStringInput(incomeDescription); + if (!validCharacters) { + throw new ChChingException("Description contains invalid characters"); + } String incomeDateString = argumentsByField.get("da"); LocalDate incomeDate = parseDate(incomeDateString); float incomeValue = Float.parseFloat(argumentsByField.get("v")); @@ -43,7 +47,8 @@ public static Income parseIncome(HashMap argumentsByField) throw assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { - throw new ChChingException("Trouble adding income value"); + throw new ChChingException("trouble adding income value"); + } return inc; } diff --git a/src/main/java/chching/parser/UnicodeChecker.java b/src/main/java/chching/parser/UnicodeChecker.java new file mode 100644 index 0000000000..319d4f0946 --- /dev/null +++ b/src/main/java/chching/parser/UnicodeChecker.java @@ -0,0 +1,31 @@ +package chching.parser; + + + + +public class UnicodeChecker { + //public static final String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=,./<>?;':\"[]{}\\|`~"; + public static final String VALID_CHARACTERS = "[\\P{ASCII}]"; + public static boolean isValidStringInput(String input) { + for (char c : input.toCharArray()) { + //System.out.println("testing " + c + ": "); + //System.out.print(Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN); + //int i = c; + //System.out.println(" " + i); + if (!(Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN)) { + return false; + } + + } + // System.out.println("testing 观: "); + // System.out.println(Character.UnicodeBlock.of('观') == Character.UnicodeBlock.BASIC_LATIN); + // System.out.println("testing ✄: "); + // System.out.println(Character.UnicodeBlock.of('✄') == Character.UnicodeBlock.BASIC_LATIN); + return true; + // String validString = input.replaceAll(VALID_CHARACTERS, ""); + // System.out.println("validstring: " + validString); + // System.out.println("input: " + input); + // return validString.equals(input); + } +} + From 0b5a5e24d998ed25d36ed1337fbcc8d9cd0057f8 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 10:21:39 +0800 Subject: [PATCH 245/364] Fix bug in PPP --- docs/team/clement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/clement.md b/docs/team/clement.md index b66045818a..77bdf0e849 100644 --- a/docs/team/clement.md +++ b/docs/team/clement.md @@ -26,7 +26,7 @@ Given below are my contributions to the project. * Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`. #### Contributions to the UG: -Added documentation for the feature 'Set Currency', 'Unset Currency'. +Added documentation for the feature `Set Currency`, `Unset Currency`. #### Contributions to the DG: * Added `SetCurrencyCommand` sequence diagram From f8afa127bcf5ea55a82026518b32de7e6c3a2f74 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 10:51:47 +0800 Subject: [PATCH 246/364] Update error handling for add expense command to make error messages more specific --- src/main/java/chching/parser/Expenses.java | 41 ++++++++++++---------- src/main/java/chching/parser/Parser.java | 4 +-- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 606217b1a4..e8d0cf47e5 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,11 +14,11 @@ */ public class Expenses { - + /** * Parses a date * - * @param expenseDateString Input from users + * @param expenseDateString Input from users */ public static LocalDate parseDate(String expenseDateString) throws ChChingException { LocalDate expenseDate; @@ -27,42 +27,45 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); + throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); } return expenseDate; } - + /** * Parses an expense into the expenseList * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ - public static Expense parseExpense(HashMap argumentsByField) throws ChChingException{ + public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { Expense exp = null; + String expenseCategory = argumentsByField.get("c"); + String expenseDescription = argumentsByField.get("de"); + String expenseDateString = argumentsByField.get("da"); + LocalDate expenseDate = parseDate(expenseDateString); + + float expenseValue; try { - String expenseCategory = argumentsByField.get("c"); - String expenseDescription = argumentsByField.get("de"); - String expenseDateString = argumentsByField.get("da"); - LocalDate expenseDate = parseDate(expenseDateString); - float expenseValue = Float.parseFloat(argumentsByField.get("v")); - if(expenseValue > 1000000){ - throw new ChChingException("Expense value can at most be 1000000"); - } - assert expenseValue > 0: "Expense value should be greater than zero"; - exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); + expenseValue = Float.parseFloat(argumentsByField.get("v")); } catch (Exception e) { - throw new ChChingException("Trouble adding expense value"); + throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); } + if (expenseValue > 1000000) { + throw new ChChingException("Expense value can at most be 1000000"); + } else if (expenseValue <= 0) { + throw new ChChingException("Expense value must be greater than 0"); + } + exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); return exp; } - + /** * Gets the index of the entry * - * @param argumentsByField ArrayList of income. + * @param argumentsByField ArrayList of income. */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index fe79d1d7d7..6e0be75790 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -200,7 +200,7 @@ public static String getCategory(HashMap argumentsByField) throw try { category = argumentsByField.get("c"); } catch (Exception e) { - throw new ChChingException("missing/invalid category"); + throw new ChChingException("Missing/invalid category"); } return category; } @@ -209,7 +209,7 @@ public static String getKeyword(HashMap argumentsByField) throws try { keyword = argumentsByField.get("k"); } catch (Exception e) { - throw new ChChingException("missing/invalid keyword"); + throw new ChChingException("Missing/invalid keyword"); } return keyword; } From 4df23ca11c9be62d62862ea791eb9ad217af0d8b Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 10:56:05 +0800 Subject: [PATCH 247/364] Update error message expected for JUnit test --- src/test/java/chching/record/ExpenseListTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 51363ba41c..8cbb032499 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -126,7 +126,7 @@ void editExpense_editInvalidDate_exceptionThrown() { expenses.editExpense(1, "da", "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); } } From 6df614c0cc2b27915cc0913a6a7373a96f059bac Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 11:01:26 +0800 Subject: [PATCH 248/364] fixed my expense parser to stop unicode?? --- src/main/java/chching/Ui.java | 1 - src/main/java/chching/parser/Expenses.java | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 07045ae5ee..a19345b7c6 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -9,7 +9,6 @@ import java.io.InputStreamReader; import java.nio.charset.Charset; -import java.util.Map; import java.util.Scanner; /** diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 41c1caf78a..0a0614d3be 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -19,7 +19,7 @@ public class Expenses { /** * Parses a date * - * @param expenseDateString Input from users + * @param expenseDateString Input from users */ public static LocalDate parseDate(String expenseDateString) throws ChChingException { LocalDate expenseDate; @@ -39,24 +39,24 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept /** * Parses an expense into the expenseList * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ - public static Expense parseExpense(HashMap argumentsByField) throws ChChingException{ + public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { Expense exp = null; try { String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); - String invalidCharacters = expenseDescription.replaceAll(VALID_CHARACTERS, ""); - if (!invalidCharacters.isEmpty()) { + boolean validCharacters = UnicodeChecker.isValidStringInput(expenseDescription); + if (!validCharacters) { throw new ChChingException("Description contains invalid characters"); } String expenseDateString = argumentsByField.get("da"); LocalDate expenseDate = parseDate(expenseDateString); float expenseValue = Float.parseFloat(argumentsByField.get("v")); - if(expenseValue > 1000000){ + if (expenseValue > 1000000) { throw new ChChingException("Expense value can at most be 1000000"); } - assert expenseValue > 0: "Expense value should be greater than zero"; + assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { throw new ChChingException("Trouble adding expense value"); @@ -67,7 +67,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr /** * Gets the index of the entry * - * @param argumentsByField ArrayList of income. + * @param argumentsByField ArrayList of income. */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; From f5e47fd203d659e4f1ffabbad34a592d260fce78 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 11:03:52 +0800 Subject: [PATCH 249/364] oops checkstyle --- src/main/java/chching/parser/Expenses.java | 1 - .../java/chching/parser/UnicodeChecker.java | 23 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 0a0614d3be..d38545d0c1 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,7 +14,6 @@ */ public class Expenses { - private static final String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=,./<>?;':\"[]{}\\|`~ "; /** * Parses a date diff --git a/src/main/java/chching/parser/UnicodeChecker.java b/src/main/java/chching/parser/UnicodeChecker.java index 319d4f0946..df9d512a09 100644 --- a/src/main/java/chching/parser/UnicodeChecker.java +++ b/src/main/java/chching/parser/UnicodeChecker.java @@ -1,26 +1,26 @@ package chching.parser; - - - public class UnicodeChecker { - //public static final String VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=,./<>?;':\"[]{}\\|`~"; public static final String VALID_CHARACTERS = "[\\P{ASCII}]"; + public static boolean isValidStringInput(String input) { for (char c : input.toCharArray()) { - //System.out.println("testing " + c + ": "); - //System.out.print(Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN); - //int i = c; - //System.out.println(" " + i); + // System.out.println("testing " + c + ": "); + // System.out.print(Character.UnicodeBlock.of(c) == + // Character.UnicodeBlock.BASIC_LATIN); + // int i = c; + // System.out.println(" " + i); if (!(Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN)) { return false; } - + } // System.out.println("testing 观: "); - // System.out.println(Character.UnicodeBlock.of('观') == Character.UnicodeBlock.BASIC_LATIN); + // System.out.println(Character.UnicodeBlock.of('观') == + // Character.UnicodeBlock.BASIC_LATIN); // System.out.println("testing ✄: "); - // System.out.println(Character.UnicodeBlock.of('✄') == Character.UnicodeBlock.BASIC_LATIN); + // System.out.println(Character.UnicodeBlock.of('✄') == + // Character.UnicodeBlock.BASIC_LATIN); return true; // String validString = input.replaceAll(VALID_CHARACTERS, ""); // System.out.println("validstring: " + validString); @@ -28,4 +28,3 @@ public static boolean isValidStringInput(String input) { // return validString.equals(input); } } - From 3dab7d75950d96dbf38fe9649fcb277916d30eaa Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 11:04:12 +0800 Subject: [PATCH 250/364] Update error handling for add income command to make error messages more specific --- src/main/java/chching/parser/Expenses.java | 3 ++- src/main/java/chching/parser/Incomes.java | 18 +++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index e8d0cf47e5..bab55062de 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -27,7 +27,7 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -58,6 +58,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr } else if (expenseValue <= 0) { throw new ChChingException("Expense value must be greater than 0"); } + assert expenseValue > 0 : "expenseValue has to be more than 0"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); return exp; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index c0c475f87a..b91ed1ed32 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -17,7 +17,7 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti try { incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -32,19 +32,23 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; - try { String incomeDescription = argumentsByField.get("de"); String incomeDateString = argumentsByField.get("da"); LocalDate incomeDate = parseDate(incomeDateString); - float incomeValue = Float.parseFloat(argumentsByField.get("v")); - if(incomeValue > 1000000){ + + float incomeValue; + try { + incomeValue = Float.parseFloat(argumentsByField.get("v")); + } catch (Exception e) { + throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); + } + if (incomeValue > 1000000){ throw new ChChingException("Income value can at most be 1000000"); + } else if (incomeValue <= 0) { + throw new ChChingException("Income value must be greater than 0"); } assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); - } catch (Exception e) { - throw new ChChingException("Trouble adding income value"); - } return inc; } From 31ba357345a557cc5c51d61c3df0d7bea982a6af Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 11:09:27 +0800 Subject: [PATCH 251/364] Update JUnit test with updated expected message Reformat code to match indentation standards --- src/main/java/chching/parser/Incomes.java | 42 +++++++++---------- .../java/chching/record/ExpenseListTest.java | 2 +- .../java/chching/record/IncomeListTest.java | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index b91ed1ed32..1084f05f2f 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -24,38 +24,38 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti } return incomeDate; } - + /** * Parses an income into the incomeList * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; - String incomeDescription = argumentsByField.get("de"); - String incomeDateString = argumentsByField.get("da"); - LocalDate incomeDate = parseDate(incomeDateString); - - float incomeValue; - try { - incomeValue = Float.parseFloat(argumentsByField.get("v")); - } catch (Exception e) { - throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); - } - if (incomeValue > 1000000){ - throw new ChChingException("Income value can at most be 1000000"); - } else if (incomeValue <= 0) { - throw new ChChingException("Income value must be greater than 0"); - } - assert incomeValue > 0 : "incomeValue has to be more than 0"; - inc = new Income(incomeDescription, incomeDate, incomeValue); + String incomeDescription = argumentsByField.get("de"); + String incomeDateString = argumentsByField.get("da"); + LocalDate incomeDate = parseDate(incomeDateString); + + float incomeValue; + try { + incomeValue = Float.parseFloat(argumentsByField.get("v")); + } catch (Exception e) { + throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); + } + if (incomeValue > 1000000) { + throw new ChChingException("Income value can at most be 1000000"); + } else if (incomeValue <= 0) { + throw new ChChingException("Income value must be greater than 0"); + } + assert incomeValue > 0 : "incomeValue has to be more than 0"; + inc = new Income(incomeDescription, incomeDate, incomeValue); return inc; } - + /** * Gets the index of the entry * - * @param argumentsByField ArrayList of income. + * @param argumentsByField ArrayList of income. */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 8cbb032499..aec344d9e0 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -126,7 +126,7 @@ void editExpense_editInvalidDate_exceptionThrown() { expenses.editExpense(1, "da", "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 8a67284c13..af39b8cd64 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -107,7 +107,7 @@ void editIncome_editInvalidDate_exceptionThrown() { incomes.editIncome(1, "da", "31-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } } From 870042c919e8c95c050237fd5191603c28db664f Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 11:50:28 +0800 Subject: [PATCH 252/364] Change error messages to make it more specific Remove redundant try-catches --- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- src/main/java/chching/parser/Parser.java | 16 ++------- src/test/java/chching/ParserTest.java | 36 +++++++++++++++++++ .../command/EditExpenseCommandTest.java | 2 +- .../command/EditIncomeCommandTest.java | 2 +- 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index bab55062de..330450890d 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -74,7 +74,7 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/Invalid index"); + throw new ChChingException("Index must contain a valid integer only"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 1084f05f2f..318a459851 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -63,7 +63,7 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/Invalid index"); + throw new ChChingException("Index must contain a valid integer only"); } return index; } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 6e0be75790..93f8123a73 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -188,7 +188,7 @@ public static HashMap sortArguments(List arguments) thro if (isDuplicateField) { throw new ChChingException("Duplicate fields detected"); } else if (isEmptyFieldOrValue) { - throw new ChChingException("Empty value detected or use of \" / \" in value"); + throw new ChChingException("Empty detail detected or improper use of \" / \""); } else { argumentsByField.put(field, value); } @@ -197,22 +197,12 @@ public static HashMap sortArguments(List arguments) thro } public static String getCategory(HashMap argumentsByField) throws ChChingException { String category = null; - try { - category = argumentsByField.get("c"); - } catch (Exception e) { - throw new ChChingException("Missing/invalid category"); - } + category = argumentsByField.get("c"); return category; } public static String getKeyword(HashMap argumentsByField) throws ChChingException { String keyword = null; - try { - keyword = argumentsByField.get("k"); - } catch (Exception e) { - throw new ChChingException("Missing/invalid keyword"); - } + keyword = argumentsByField.get("k"); return keyword; } - - } diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 13da1ee715..0f5f09d22c 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -32,6 +32,7 @@ public class ParserTest { static final String DESCRIPTION_VALUE = "breakfast"; static final String KEYWORD_FIELD = "k"; static final String KEYWORD_VALUE = "hello"; + static final String CA_WITH_EMPTY_DETAIL = "ca "; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -112,6 +113,41 @@ public void sortArguments_invalidInput_throwsException() { assertEquals("Arguments not inputted correctly", e.getMessage()); } } + + /** + * JUnit test for sortArguments method. + * Checks if the method throws an exception if the input contains duplicate fields. + */ + @Test + public void sortArguments_duplicateField_throwsException() { + List input = new ArrayList(); + input.add(CA); + input.add(CA); + + try { + new Parser().sortArguments(input); + fail(); // the test should not reach this line + } catch (ChChingException e) { + assertEquals("Duplicate fields detected", e.getMessage()); + } + } + + /** + * JUnit test for sortArguments method. + * Checks if the method throws an exception if the input contains empty detail. + */ + @Test + public void sortArguments_emptyDetail_throwsException() { + List input = new ArrayList(); + input.add(CA_WITH_EMPTY_DETAIL); + + try { + new Parser().sortArguments(input); + fail(); // the test should not reach this line + } catch (ChChingException e) { + assertEquals("Empty detail detected or improper use of \" / \"", e.getMessage()); + } + } /** * JUnit test for getCategory method. diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index 656030d684..adddbb462d 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -108,7 +108,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing/Invalid index", e.getMessage()); + assertEquals("Index must contain a valid integer only", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index 02b6973817..0bf5f55480 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -102,7 +102,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing/Invalid index", e.getMessage()); + assertEquals("Index must contain a valid integer only", e.getMessage()); } } From 21b511bb2dbc1a7d68f275c83567f2cded327567 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 12:26:06 +0800 Subject: [PATCH 253/364] plant uml for set currency and livecurrency api in DG --- docs/DeveloperGuide.md | 196 +++++++++--------- .../SetCurrencyCommand_Sequence_Diagram.puml | 32 +++ .../SetCurrencyCommand_sequence_diagram.png | Bin 23683 -> 28676 bytes 3 files changed, 135 insertions(+), 93 deletions(-) create mode 100644 docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3a0b9a9a25..0abd667934 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,26 +1,27 @@ # Developer Guide -* [Developer Guide](#developer-guide) - * [Acknowledgements](#acknowledgements) - * [Design & implementation](#design-implementation) - * [Implementation](#implementation) - * [Record and RecordList](#record-and-recordlist) - * [DeleteIncomeCommand](#deleteincomecommand) - * [Target and TargetStorage](#target-and-targetstorage) - * [[Proposed] EditIncomeCommand/EditExpenseCommand](#proposed-editincomecommandeditexpensecommand) - * [AddIncomeCommand](#addincomecommand) - * [ListExpenseCommand](#listexpensecommand) - * [SetTargetCommand](#settargetcommand) - * [SetCurrencyCommand](#setcurrencycommand) - * [Product scope](#product-scope) - * [Target user profile](#target-user-profile) - * [Value proposition](#value-proposition) - * [User Stories](#user-stories) - * [Non-Functional Requirements](#non-functional-requirements) - * [Glossary](#glossary) - * [Instructions for manual testing](#instructions-for-manual-testing) - + +- [Developer Guide](#developer-guide) + - [Acknowledgements](#acknowledgements) + - [Design & implementation](#design-implementation) + - [Implementation](#implementation) + - [Record and RecordList](#record-and-recordlist) + - [DeleteIncomeCommand](#deleteincomecommand) + - [Target and TargetStorage](#target-and-targetstorage) + - [[Proposed] EditIncomeCommand/EditExpenseCommand](#proposed-editincomecommandeditexpensecommand) + - [AddIncomeCommand](#addincomecommand) + - [ListExpenseCommand](#listexpensecommand) + - [SetTargetCommand](#settargetcommand) + - [SetCurrencyCommand](#setcurrencycommand) + - [Product scope](#product-scope) + - [Target user profile](#target-user-profile) + - [Value proposition](#value-proposition) + - [User Stories](#user-stories) + - [Non-Functional Requirements](#non-functional-requirements) + - [Glossary](#glossary) + - [Instructions for manual testing](#instructions-for-manual-testing) + ## Acknowledgements @@ -30,23 +31,27 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### ExchangeRateApi + +`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. + ## Implementation -### Record and RecordList +### Record and RecordList -The main class in our program is the ```Record``` and ```RecordList``` abstract classes, in which ```Income```, ```Expense``` will inherit from ```Record``` and ```IncomeList``` and ```ExpenseList``` will inherit from ```RecordList```. Most commands will act on instances of the ```Income```, ```Expense```,```IncomeList``` and ```ExpenseList``` classes. +The main class in our program is the `Record` and `RecordList` abstract classes, in which `Income`, `Expense` will inherit from `Record` and `IncomeList` and `ExpenseList` will inherit from `RecordList`. Most commands will act on instances of the `Income`, `Expense`,`IncomeList` and `ExpenseList` classes. ![Record Class](images/Record_RecordList_UML_class.png) -### DeleteIncomeCommand +### DeleteIncomeCommand -The proposed DeleteIncomeCommand mechanism is facilitated by ```System```, ```Incomes```, ```UI``` and ```ChChingException```. -The command receives the instruction from ```UI``` and will call the ```execute``` method. -If ```index <= 0```, the command will throw a new ChChingException and print ```"Zero/Negative index"```. -If ```index > incomes.size()```, the command will also throw a new ChChingException and print ```"The number is too big"``` +The proposed DeleteIncomeCommand mechanism is facilitated by `System`, `Incomes`, `UI` and `ChChingException`. +The command receives the instruction from `UI` and will call the `execute` method. +If `index <= 0`, the command will throw a new ChChingException and print `"Zero/Negative index"`. +If `index > incomes.size()`, the command will also throw a new ChChingException and print `"The number is too big"` Entering any of these optional lines will result in early termination of the command. Or else, the command will continue to delete the entry at the particular index. -Afterwards, the ```execute()``` method will print ```"Income deleted, here is the updated list:"``` and prints the entries in the income list. +Afterwards, the `execute()` method will print `"Income deleted, here is the updated list:"` and prints the entries in the income list. ![Record Class](images/DeleteIncomeCommand_sequence_diagram.png) @@ -57,11 +62,13 @@ The `Target` and `TargetStorage` class allows users to set a target for their id ![Target Class](images/Target_UML.png) ### [Proposed] EditIncomeCommand/EditExpenseCommand -The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. + +The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. Note that below highlights the implementation of the edit income command, with edit expense command following the same implementation. Given below is how the edit income mechanism works at each step: + 1. The user types in the command for edit income with the necessary arguments given to indicate which income record to edit and what fields to edit for the chosen income record. 2. The line inputted by the user will then be parsed by `Parser`, where it will check if the input contains a valid index with valid fields to edit. If they are valid, it will return `EditIncomeCommand`. Else it will throw a `ChChingException` indicating an error in the input from the user. 3. `EditIncomeCommand` will then perform its `execute` method, where for each field to be edited, it will call `editIncome` method from the `ExpenseList` class. This would then update the required income record accordingly. @@ -79,51 +86,58 @@ The following activity diagram summarises what happens when a user executes edit **Design Considerations**
      The following are the design alternatives we considered for edit income/expense command: -* **Alternative 1 (current choice):** Edit only the specific fields indicated in the input arguments. - * Pros: Easier for the user to input an edit. - * Cons: May introduce more bugs. -* **Alternative 2:** Edit to require user to rewrite all its fields. - * Pros: Easier to implement. - * Cons: Not any easier than having the user to just delete and add new expense/income. +- **Alternative 1 (current choice):** Edit only the specific fields indicated in the input arguments. + - Pros: Easier for the user to input an edit. + - Cons: May introduce more bugs. +- **Alternative 2:** Edit to require user to rewrite all its fields. + - Pros: Easier to implement. + - Cons: Not any easier than having the user to just delete and add new expense/income. ### AddIncomeCommand -The AddIncomeCommand is facilitated by ```Parser```, ```AddIncomeCommand```, ```IncomeList``` and ```Ui```. -1. The user inputs the command to add income. This input is handled by ```parser``` which if successful, returns the ```AddIncomeCommand```. -2. ```AddIncomeCommand``` will call its ```execute``` method -which calls the ```IncomeList``` method ```addIncome``` to add the input into ```incomes```. -3. ```execute``` then calls the ```Ui``` method ```showAdded``` which makes use of ```System``` -to print the ```Income``` added. + +The AddIncomeCommand is facilitated by `Parser`, `AddIncomeCommand`, `IncomeList` and `Ui`. + +1. The user inputs the command to add income. This input is handled by `parser` which if successful, returns the `AddIncomeCommand`. +2. `AddIncomeCommand` will call its `execute` method + which calls the `IncomeList` method `addIncome` to add the input into `incomes`. +3. `execute` then calls the `Ui` method `showAdded` which makes use of `System` + to print the `Income` added. ![AddIncomeCommand](images/AddIncomeCommand_Sequence_Diagram.png) + ### ListExpenseCommand -The listExpenseCommand is facilitated by ```Parser```, ```ListExpenseCommand``` and ```ExpenseList```. -1. The user inputs the command to list expense. This input is handled by```Parser``` which returns the - ```listExpenseCommand``` if successful. -2. ```ListExpenseCommand``` will then call its ```execute``` method - which makes use of ```System``` to print a new line ```"Expenses:"```. -3. The ```ExpenseList``` method ```printExpenseList``` - is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of - expenses in ```expenses```. +The listExpenseCommand is facilitated by `Parser`, `ListExpenseCommand` and `ExpenseList`. + +1. The user inputs the command to list expense. This input is handled by`Parser` which returns the + `listExpenseCommand` if successful. +2. `ListExpenseCommand` will then call its `execute` method + which makes use of `System` to print a new line `"Expenses:"`. +3. The `ExpenseList` method `printExpenseList` + is called, which iterates through the expenseList, `expenses` and prints the index as well as a completed string of + expenses in `expenses`. ![ListExpenseCommand](images/ListExpenseCommand_Sequence_Diagram.png) + ### SetTargetCommand -The setTargetCommand is facilitated by ```ChChing```, ```Parser```, ```TargetParser```, ```TargetStorage```. -When the command receives to set target, the ```parse()``` method of the ```Parser``` object will read in the command and call the ```parseTarget()``` method from the TargetParser class -to instantiate a Target object and initializes a target value. Afterwards, ```parse()``` method calls the ```AddTargetCommand``` and instantiate a ```SetTargetCommand``` object and returns to the ```Parser``` object. -The ```Parser``` object then returns to ```ChChing```. ```ChChing``` object then runs the ```execute()``` method of the SetTargetCommand object. The method then calls the ```setTarget()``` method of the ```TargetStorage``` object to store the previously initialized ```Target``` object. + +The setTargetCommand is facilitated by `ChChing`, `Parser`, `TargetParser`, `TargetStorage`. +When the command receives to set target, the `parse()` method of the `Parser` object will read in the command and call the `parseTarget()` method from the TargetParser class +to instantiate a Target object and initializes a target value. Afterwards, `parse()` method calls the `AddTargetCommand` and instantiate a `SetTargetCommand` object and returns to the `Parser` object. +The `Parser` object then returns to `ChChing`. `ChChing` object then runs the `execute()` method of the SetTargetCommand object. The method then calls the `setTarget()` method of the `TargetStorage` object to store the previously initialized `Target` object. ![SetTargetCommand UML](images/SetTargetCommand.png) + ### SetCurrencyCommand -The setCurrencyCommand is facilitated by ```System```, ```Selector```, ```UI``` and ```ExpenseList```. -The command receives the instruction from ```UI``` and will call the ```execute``` method. -The ```execute()``` method in setCurrencyCommand will then call the ```containsCurrency(currency)``` method from ```Selector```. -If the method returns false, which indicates that the currency is not available, the command will throw a new ChChingException and print ```"Currency not available"```. -If the method returns true, the command will continue to set the currency in the selector hashmap to true. -Afterwards, the ```execute()``` method will call the ```printSelector()``` method from ```Selector```. -The ```printSelector()``` method will print all the available currencies in the selector hashmap. -The selected currencies will be marked with a ```[X]``` and the unselected currencies will be marked with a ```[ ]```. +The setCurrencyCommand is facilitated by `System`, `Selector`, `UI` and `ExpenseList`. +The command receives the instruction from `UI` and will call the `execute` method. +The `execute()` method in setCurrencyCommand will then call the `containsCurrency(currency)` method from `Selector`. +If the method returns false, which indicates that the currency is not available, the command will throw a new ChChingException and print `"Currency not available"`. +If the method returns true, the command will continue to set the currency in the selector hashmap to true. +Afterwards, the `execute()` method will call the `printSelector()` method from `Selector`. +The `printSelector()` method will print all the available currencies in the selector hashmap. +The selected currencies will be marked with a `[X]` and the unselected currencies will be marked with a `[ ]`. ![SetCurrencyCommand_sequence_diagram.png](images%2FSetCurrencyCommand_sequence_diagram.png) ## Product scope @@ -139,7 +153,7 @@ The value proposition of ChChing is its ability to track income and expenses on ## User Stories | Version | As a ... | I want to ... | So that I can ... | -|---------|-----------|-----------------------------------------|-----------------------------------------------------------------------------------------| +| ------- | --------- | --------------------------------------- | --------------------------------------------------------------------------------------- | | v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | | v1.0 | user | add new expense to the records | record all my expenses | | v1.0 | user | add new income to the records | record all my incomes | @@ -152,49 +166,45 @@ The value proposition of ChChing is its ability to track income and expenses on | v2.0 | user | set a target for my balance | improve my financial management | | v2.0 | user | see the target i have set | remind myself of my target | | v2.0 | user | reset my income/expense lists or both | have a fresh list | -## Non-Functional Requirements - -* Domain rules: - * ChChing should not crash under normal circumstances. - * Dates should be in the format of dd/mm/yyyy, it should be a valid date, and it should not be a future date. - * Amount should be a positive number. -* Constraints: - * Total Expense and Total Income should not exceed 2^31 - 1. - * The '/' should not be used within any of the inputs, unless it is for specifying a category. - -* Technical Requirements: - * ChChing should be able to run on Windows, Mac, or Linux as long as it has Java 11 or above installed. +## Non-Functional Requirements -* Quality requirements: - * ChChing should be usable to users of all skill and proficiency levels. +- Domain rules: -* Others: - * Should user input additional arguments that are not within the scope of the command's input, ChChing would ignore them. -
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50` - * Should the arguments be in the wrong order, ChChing would still be able to parse the arguments correctly.
      However, should the command not be written first, ChChing would not be able to parse the command. -
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry. -
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since command is not written first. + - ChChing should not crash under normal circumstances. + - Dates should be in the format of dd/mm/yyyy, it should be a valid date, and it should not be a future date. + - Amount should be a positive number. +- Constraints: -## Glossary + - Total Expense and Total Income should not exceed 2^31 - 1. + - The '/' should not be used within any of the inputs, unless it is for specifying a category. +- Technical Requirements: + - ChChing should be able to run on Windows, Mac, or Linux as long as it has Java 11 or above installed. -| Terminology | Definition | -|--------------|------------------------------| -| Income | Debit entry | -| Expense | Credit entry | -| Balance | Net Amount | -| Target | Desired Net Amount | - | Parser | Class to take in inputs | -| UI | Class to interact with users | +- Quality requirements: + - ChChing should be usable to users of all skill and proficiency levels. +- Others: + - Should user input additional arguments that are not within the scope of the command's input, ChChing would ignore them. +
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50` + - Should the arguments be in the wrong order, ChChing would still be able to parse the arguments correctly.
      However, should the command not be written first, ChChing would not be able to parse the command. +
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry. +
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since command is not written first. +## Glossary - - +| Terminology | Definition | +| ----------- | ---------------------------- | +| Income | Debit entry | +| Expense | Credit entry | +| Balance | Net Amount | +| Target | Desired Net Amount | +| Parser | Class to take in inputs | +| UI | Class to interact with users | ## Instructions for manual testing diff --git a/docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml b/docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml new file mode 100644 index 0000000000..d1422a036e --- /dev/null +++ b/docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml @@ -0,0 +1,32 @@ +@startuml + +participant ":System" as System +participant ":Selector" as Selector +participant ":UI" as UI +participant "SetCurrencyCommand" as SetCurrencyCommand +participant "ChChingException" as ChChingException + +activate UI +UI -> UI:readCommand() +UI -->SetCurrencyCommand: input.nextLine() +deactivate UI + +activate SetCurrencyCommand +SetCurrencyCommand -> SetCurrencyCommand: execute(income,expense,ui,storage,selector,converter,targetStorage) +activate Selector +Selector <- SetCurrencyCommand: selector.containsCurrency(currency) +Selector --> SetCurrencyCommand + +activate ChChingException +SetCurrencyCommand ->ChChingException: ChChingException("currency not available") +deactivate ChChingException + +Selector <- SetCurrencyCommand: selector.printSelector(converter) +deactivate SetCurrencyCommand + +activate System +System <- Selector: System.out.println([x] + currency + converter.convert(currency, 1)) +deactivate System + +deactivate Selector +@enduml \ No newline at end of file diff --git a/docs/images/SetCurrencyCommand_sequence_diagram.png b/docs/images/SetCurrencyCommand_sequence_diagram.png index 1aa29367221d1768544967cf7f543e0f4903ce0f..36741209401677051c08aa76345c63769b70867e 100644 GIT binary patch literal 28676 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 Date: Wed, 5 Apr 2023 13:34:11 +0800 Subject: [PATCH 254/364] Edit error message to make it more specific --- .../chching/command/AddExpenseCommand.java | 10 +--- .../chching/command/AddIncomeCommand.java | 8 +-- src/main/java/chching/parser/Expenses.java | 33 +++++++++-- src/main/java/chching/parser/Incomes.java | 32 ++++++++-- src/main/java/chching/parser/Parser.java | 2 +- .../command/AddExpenseCommandTest.java | 59 ------------------- .../chching/command/AddIncomeCommandTest.java | 59 ------------------- .../command/EditExpenseCommandTest.java | 2 +- .../command/EditIncomeCommandTest.java | 2 +- .../java/chching/{ => parser}/ParserTest.java | 2 +- 10 files changed, 62 insertions(+), 147 deletions(-) rename src/test/java/chching/{ => parser}/ParserTest.java (98%) diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index de37b80f45..0d9421bae3 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -22,18 +22,10 @@ public class AddExpenseCommand extends Command { * @param expense ArrayList of expenses. */ public AddExpenseCommand(Expense expense) throws ChChingException { - if (expense == null) { - throw new ChChingException("No fields found"); - } else if (expense.getCategory() == null) { - throw new ChChingException("Missing category field"); - } else if(expense.getCategory().length() > 30) { + if(expense.getCategory().length() > 30) { throw new ChChingException("Character limit of 30 for category field exceeded"); - } else if (expense.getDescription() == null) { - throw new ChChingException("Missing description field"); } else if(expense.getDescription().length() > 99) { throw new ChChingException("Character limit of 99 for description field exceeded"); - } else if (expense.getDate() == null) { - throw new ChChingException("Missing date field"); } else if (expense.getValue() <= 0) { throw new ChChingException("Invalid/Missing expense value"); } diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 7e3eca451e..3bd32c350f 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -22,14 +22,8 @@ public class AddIncomeCommand extends Command { * @param income ArrayList of income. */ public AddIncomeCommand(Income income) throws ChChingException { - if (income == null) { - throw new ChChingException("No fields found"); - } else if (income.getDescription() == null) { - throw new ChChingException("Missing description field"); - } else if(income.getDescription().length() > 99) { + if(income.getDescription().length() > 99) { throw new ChChingException("Character limit of 99 for description field exceeded"); - } else if (income.getDate() == null) { - throw new ChChingException("Missing date field"); } else if (income.getValue() <= 0) { throw new ChChingException("Invalid/Missing income value"); } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 330450890d..65603ad21d 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -15,6 +15,12 @@ public class Expenses { + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + /** * Parses a date * @@ -41,15 +47,25 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept * @param argumentsByField Input from users */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { + // check if all the fields are present + boolean isCategoryPresent = argumentsByField.containsKey(CATEGORY_FIELD); + boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); + boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); + boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); + boolean isAllPresent = isCategoryPresent && isDescriptionPresent && isDatePresent && isValuePresent; + if (!isAllPresent) { + throw new ChChingException("Missing fields detected"); + } + Expense exp = null; - String expenseCategory = argumentsByField.get("c"); - String expenseDescription = argumentsByField.get("de"); - String expenseDateString = argumentsByField.get("da"); + String expenseCategory = argumentsByField.get(CATEGORY_FIELD); + String expenseDescription = argumentsByField.get(DESCRIPTION_FIELD); + String expenseDateString = argumentsByField.get(DATE_FIELD); LocalDate expenseDate = parseDate(expenseDateString); float expenseValue; try { - expenseValue = Float.parseFloat(argumentsByField.get("v")); + expenseValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); } catch (Exception e) { throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); } @@ -70,8 +86,15 @@ public static Expense parseExpense(HashMap argumentsByField) thr */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; + + // check if all the fields are present + boolean isIndexPresent = argumentsByField.containsKey(INDEX_FIELD); + if (!isIndexPresent) { + throw new ChChingException("Index field not found"); + } + + String indexString = argumentsByField.get(INDEX_FIELD); try { - String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { throw new ChChingException("Index must contain a valid integer only"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 318a459851..3c1da0676d 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -10,6 +10,12 @@ import java.util.HashMap; public class Incomes { + + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static LocalDate parseDate(String incomeDateString) throws ChChingException { LocalDate incomeDate; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") @@ -18,6 +24,8 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); + } catch (NullPointerException e) { + throw new ChChingException("Missing Date"); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -31,14 +39,23 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { + // check if all the fields are present + boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); + boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); + boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); + boolean isAllPresent = isDescriptionPresent && isDatePresent && isValuePresent; + if (!isAllPresent) { + throw new ChChingException("Missing fields detected"); + } + Income inc = null; - String incomeDescription = argumentsByField.get("de"); - String incomeDateString = argumentsByField.get("da"); + String incomeDescription = argumentsByField.get(DESCRIPTION_FIELD); + String incomeDateString = argumentsByField.get(DATE_FIELD); LocalDate incomeDate = parseDate(incomeDateString); float incomeValue; try { - incomeValue = Float.parseFloat(argumentsByField.get("v")); + incomeValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } @@ -59,8 +76,15 @@ public static Income parseIncome(HashMap argumentsByField) throw */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; + + // check if index field is present + boolean isIndexPresent = argumentsByField.containsKey(INDEX_FIELD); + if (!isIndexPresent) { + throw new ChChingException("Index field not found"); + } + + String indexString = argumentsByField.get(INDEX_FIELD); try { - String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { throw new ChChingException("Index must contain a valid integer only"); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 93f8123a73..d7f65e17b5 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -178,7 +178,7 @@ public static HashMap sortArguments(List arguments) thro field = fieldAndValue[0].trim(); value = fieldAndValue[1].trim(); } catch (Exception e) { - throw new ChChingException("Arguments not inputted correctly"); + throw new ChChingException("Arguments not inputted correctly / Missing details"); } // checks if it is an existing field diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 4020d9faad..8b4bc25d01 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -71,65 +71,6 @@ void execute_normalScenario_success() { } } - /** - * Junit Test when there is null field for the expense input - */ - @Test - void execute_nullExpense_exceptionThrown() { - String expectedOutput = "No fields found"; - try { - new AddExpenseCommand(null); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - - /** - * Junit Test when there is missing category for the expense input - */ - @Test - void execute_missingCategoryField_exceptionThrown() { - String expectedOutput = "Missing category field"; - Expense input = new Expense(null, DESCRIPTION , DATE, EXPENSE_VALUE); - try { - new AddExpenseCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - - /** - * Junit Test when there is missing description for the expense input - */ - @Test - void execute_missingDescriptionField_exceptionThrown() { - String expectedOutput = "Missing description field"; - Expense input = new Expense(CATEGORY, null, DATE, EXPENSE_VALUE); - try { - new AddExpenseCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - - /** - * Junit Test when there is missing date for the expense input - */ - @Test - void execute_missingDateField_exceptionThrown() { - String expectedOutput = "Missing date field"; - Expense input = new Expense(CATEGORY, DESCRIPTION, null, EXPENSE_VALUE); - try { - new AddExpenseCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - /** * Junit Test when there is a zeroValue field */ diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 34aa877cd4..d336b81956 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -69,50 +69,6 @@ void execute_normalScenario_success() { } } - /** - * Junit Test when there is a null entry in the income input - */ - @Test - void addIncomeCommand_nullExpense_exceptionThrown() { - String expectedOutput = "No fields found"; - try { - new AddIncomeCommand(null); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - - /** - * Junit Test when there is a missing description in the income input - */ - @Test - void addIncomeCommand_missingDescriptionField_exceptionThrown() { - String expectedOutput = "Missing description field"; - Income input = new Income(null, DATE, INCOME_VALUE); - try { - new AddIncomeCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - - /** - * Junit Test when there is a missing date in the income input - */ - @Test - void addIncomeCommand_missingDateField_exceptionThrown() { - String expectedOutput = "Missing date field"; - Income input = new Income(DESCRIPTION, null, INCOME_VALUE); - try { - new AddIncomeCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } - /** * Junit Test when there is a zeroValue field */ @@ -127,19 +83,4 @@ void addIncomeCommand_zeroValueField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - - /** - * Junit Test when there is a negative value field - */ - @Test - void addIncomeCommand_negativeValueField_exceptionThrown() { - String expectedOutput = "Invalid/Missing income value"; - Income input = new Income(DESCRIPTION, DATE, NEGATIVE_INCOME_VALUE); - try { - new AddIncomeCommand(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals(expectedOutput, e.getMessage()); - } - } } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index adddbb462d..7c4e2c6e9a 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -108,7 +108,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index 0bf5f55480..a1135b6839 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -102,7 +102,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/parser/ParserTest.java similarity index 98% rename from src/test/java/chching/ParserTest.java rename to src/test/java/chching/parser/ParserTest.java index 0f5f09d22c..bc79b2ddf2 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/parser/ParserTest.java @@ -110,7 +110,7 @@ public void sortArguments_invalidInput_throwsException() { new Parser().sortArguments(input); fail(); // the test should not reach this line } catch (ChChingException e) { - assertEquals("Arguments not inputted correctly", e.getMessage()); + assertEquals("Arguments not inputted correctly / Missing details", e.getMessage()); } } From baa98789d9360b04a86b0161b9dceaf634951cbe Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 14:47:24 +0800 Subject: [PATCH 255/364] Add JUnit tests for Incomes and Expenses classes --- src/main/java/chching/parser/Expenses.java | 6 +- src/main/java/chching/parser/Incomes.java | 4 +- .../java/chching/parser/ExpensesTest.java | 212 ++++++++++++++++++ src/test/java/chching/parser/IncomesTest.java | 205 +++++++++++++++++ 4 files changed, 422 insertions(+), 5 deletions(-) create mode 100644 src/test/java/chching/parser/ExpensesTest.java create mode 100644 src/test/java/chching/parser/IncomesTest.java diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 65603ad21d..aefd3d7d88 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -69,8 +69,8 @@ public static Expense parseExpense(HashMap argumentsByField) thr } catch (Exception e) { throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); } - if (expenseValue > 1000000) { - throw new ChChingException("Expense value can at most be 1000000"); + if (expenseValue > 999999.99) { + throw new ChChingException("Expense value cannot be 1000000 or more"); } else if (expenseValue <= 0) { throw new ChChingException("Expense value must be greater than 0"); } @@ -87,7 +87,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; - // check if all the fields are present + // check if all t.he fields are present boolean isIndexPresent = argumentsByField.containsKey(INDEX_FIELD); if (!isIndexPresent) { throw new ChChingException("Index field not found"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 3c1da0676d..95b3df06bb 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -59,8 +59,8 @@ public static Income parseIncome(HashMap argumentsByField) throw } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } - if (incomeValue > 1000000) { - throw new ChChingException("Income value can at most be 1000000"); + if (incomeValue > 999999.99) { + throw new ChChingException("Income value cannot be 1000000 or more"); } else if (incomeValue <= 0) { throw new ChChingException("Income value must be greater than 0"); } diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java new file mode 100644 index 0000000000..10084eda54 --- /dev/null +++ b/src/test/java/chching/parser/ExpensesTest.java @@ -0,0 +1,212 @@ +package chching.parser; + +import chching.record.Expense; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class ExpensesTest { + public static final String CATEGORY_VALUE = "transport"; + public static final String DESCRIPTION_VALUE = "public transport"; + public static final String DATE_STRING = "02-04-2023"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); + public static final String VALUE_STRING = "3.50"; + public static final double VALUE_VALUE = 3.50; + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static final String INDEX_STRING = "1"; + public static final int INDEX_VALUE = 1; + + /** + * JUnit test for parseDate method. + * Tests if parseDate returns the correct LocalDate date if a normal date is input. + */ + @Test + public void parseDate_normalScenario_success() { + try { + assertEquals(DATE_VALUE, Expenses.parseDate(DATE_STRING)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date is input. + */ + @Test + public void parseDate_invalidDate_exceptionThrown() { + try { + Expenses.parseDate("30-02-2023"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date format is input. + */ + @Test + public void parseDate_invalidDateFormat_exceptionThrown() { + try { + Expenses.parseDate("2023-02-30"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if a future date is used. + */ + @Test + public void parseDate_futureDate_exceptionThrown() { + try { + Expenses.parseDate("02-04-2030"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense returns the correct Expense object if a normal input is used. + */ + @Test + public void parseExpense_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Expense output = Expenses.parseExpense(input); + assertEquals(CATEGORY_VALUE, output.getCategory()); + assertEquals(DESCRIPTION_VALUE, output.getDescription()); + assertEquals(DATE_VALUE, output.getDate()); + assertEquals(VALUE_VALUE, output.getValue()); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if a category is not input. + */ + @Test + public void parseExpense_missingCategory_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing fields detected", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value >= 1,000,000. + */ + @Test + public void parseExpense_valueTooLarge_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "1000000.00"); + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + System.out.println(e.getMessage()); + assertEquals("Expense value cannot be 1000000 or more", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value <= 0. + */ + @Test + public void parseExpense_valueTooSmall_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "0"); + + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be greater than 0", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value is not a number. + */ + @Test + public void getIndex_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, INDEX_STRING); + try { + assertEquals(INDEX_VALUE, Expenses.getIndex(input)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if no index in input. + */ + @Test + public void getIndex_missingIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + try { + Expenses.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index field not found", e.getMessage()); + } + } + + /** + * JUnit test for getIndex method. + * Tests if getIndex throws an exception if index is not a number. + */ + @Test + public void getIndex_invalidIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, "2 a"); + try { + Expenses.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index must contain a valid integer only", e.getMessage()); + } + } +} diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java new file mode 100644 index 0000000000..d8817e3095 --- /dev/null +++ b/src/test/java/chching/parser/IncomesTest.java @@ -0,0 +1,205 @@ +package chching.parser; + +import chching.record.Income; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class IncomesTest { + public static final String DESCRIPTION_VALUE = "salary"; + public static final String DATE_STRING = "01-04-2023"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); + public static final String VALUE_STRING = "5000.00"; + public static final double VALUE_VALUE = 5000.00; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static final String INDEX_STRING = "1"; + public static final int INDEX_VALUE = 1; + + /** + * JUnit test for parseDate method. + * Tests if parseDate returns the correct LocalDate date if a normal date is input. + */ + @Test + public void parseDate_normalScenario_success() { + try { + assertEquals(DATE_VALUE, Incomes.parseDate(DATE_STRING)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date is input. + */ + @Test + public void parseDate_invalidDate_exceptionThrown() { + try { + Incomes.parseDate("30-02-2023"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date format is input. + */ + @Test + public void parseDate_invalidDateFormat_exceptionThrown() { + try { + Incomes.parseDate("2023-02-30"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if a future date is used. + */ + @Test + public void parseDate_futureDate_exceptionThrown() { + try { + Incomes.parseDate("02-04-2030"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome returns the correct Income object if a normal input is used. + */ + @Test + public void parseIncome_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Income output = Incomes.parseIncome(input); + assertEquals(DESCRIPTION_VALUE, output.getDescription()); + assertEquals(DATE_VALUE, output.getDate()); + assertEquals(VALUE_VALUE, output.getValue()); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if description is not in input. + */ + @Test + public void parseIncome_missingDescription_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing fields detected", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value >= 1,000,000. + */ + @Test + public void parseIncome_valueTooLarge_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "1000000.00"); + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + System.out.println(e.getMessage()); + assertEquals("Income value cannot be 1000000 or more", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value <= 0. + */ + @Test + public void parseIncome_valueTooSmall_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "0"); + + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be greater than 0", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value is not a number. + */ + @Test + public void getIndex_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, INDEX_STRING); + try { + assertEquals(INDEX_VALUE, Incomes.getIndex(input)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if no index in input. + */ + @Test + public void getIndex_missingIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + try { + Incomes.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index field not found", e.getMessage()); + } + } + + /** + * JUnit test for getIndex method. + * Tests if getIndex throws an exception if index is not a number. + */ + @Test + public void getIndex_invalidIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, "2 a"); + try { + Incomes.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index must contain a valid integer only", e.getMessage()); + } + } +} From 1c2c26e30a39a8ccabb845e7a38f973ffd663017 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 14:49:58 +0800 Subject: [PATCH 256/364] Add documentation for new JUnit classes --- src/test/java/chching/parser/ExpensesTest.java | 3 +++ src/test/java/chching/parser/IncomesTest.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java index 10084eda54..49c0dc6776 100644 --- a/src/test/java/chching/parser/ExpensesTest.java +++ b/src/test/java/chching/parser/ExpensesTest.java @@ -10,6 +10,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +/** + * JUnit test for Expenses class. + */ public class ExpensesTest { public static final String CATEGORY_VALUE = "transport"; public static final String DESCRIPTION_VALUE = "public transport"; diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java index d8817e3095..ba413ab17a 100644 --- a/src/test/java/chching/parser/IncomesTest.java +++ b/src/test/java/chching/parser/IncomesTest.java @@ -10,6 +10,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +/** + * JUnit test for Incomes class. + */ public class IncomesTest { public static final String DESCRIPTION_VALUE = "salary"; public static final String DATE_STRING = "01-04-2023"; From 8038fbd05ef75a48241b8cd5cb22a072052765e4 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 15:20:21 +0800 Subject: [PATCH 257/364] Add other notes section in User Guide --- docs/UserGuide.md | 17 ++++++++++++++--- docs/team/thomas.md | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3507a4bcba..46652b767c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -65,7 +65,7 @@ Unfortunately, expense list can't be found. I'll make a new one! ### Adding an entry: `add` Creates a new entry for expenses or income, with respective input formats. -
      Income and Expense values can only be at most 1000000. +
      Income and Expense values must be less than 1000000. Format:
      `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` @@ -248,9 +248,20 @@ Format: ### Saving and loading of data -Record entries are saved in `data/chching.txt` file. This file is updated upon exit. +Record entries are saved in `data/chching.json` file. This file is updated upon exit. When reading from the file, entries for income and expenses are stored in their respective arrayList. - +The data file is not to be edited manually. + +### Other Notes +* Should additional fields that is not required be added to the input, the program will ignore it. +
      e.g. field "a" with value "1" will be ignored for `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50 /a 1`. +* ChChing will not allow duplicate fields within the same input. +
      e.g. `add expense /c meal /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` will not be allowed since it has duplicate category fields. +* ChChing allows for the fields' order to be changed. +
      e.g. `add expense /de breakfast @Technoedge /c meal /da 22-03-2023 /v 3.50` will add the expense successfully. +* ChChing will allow for duplicate entries to be added. No warning would be raised. +* ChChing will not allow for the user to use '/', unless it is used to specify the field. +
      e.g. `add expense /c meal /de breakfast / lunch /da 22-03-2023 /v 3.50` will be allowed. ## Command Summary (Alphabetical Order) diff --git a/docs/team/thomas.md b/docs/team/thomas.md index 7beab722d9..5da84ec6db 100644 --- a/docs/team/thomas.md +++ b/docs/team/thomas.md @@ -27,6 +27,7 @@ Given below are my contributions to the project. * Updated and contributed to the `Quick Start` guide. * Contributed to the `Updating an entry` feature. * Contributed to the `Setting currency` feature. +* Contributed to the `Other notes` section. * Contributed to the `Command Summary` section. #### Contributions to the DG: From 186e4dd3bcf794de1210141c41521d2bcb675785 Mon Sep 17 00:00:00 2001 From: aviel <87851671+avielcx@users.noreply.github.com> Date: Wed, 5 Apr 2023 15:57:35 +0800 Subject: [PATCH 258/364] Revert "Update error message to make it more specific" --- .../chching/command/AddExpenseCommand.java | 10 +- .../chching/command/AddIncomeCommand.java | 8 +- src/main/java/chching/parser/Expenses.java | 52 +---- src/main/java/chching/parser/Incomes.java | 54 +---- src/main/java/chching/parser/Parser.java | 18 +- .../java/chching/{parser => }/ParserTest.java | 38 +--- .../command/AddExpenseCommandTest.java | 59 +++++ .../chching/command/AddIncomeCommandTest.java | 59 +++++ .../command/EditExpenseCommandTest.java | 2 +- .../command/EditIncomeCommandTest.java | 2 +- .../java/chching/parser/ExpensesTest.java | 215 ------------------ src/test/java/chching/parser/IncomesTest.java | 208 ----------------- .../java/chching/record/ExpenseListTest.java | 2 +- .../java/chching/record/IncomeListTest.java | 2 +- 14 files changed, 168 insertions(+), 561 deletions(-) rename src/test/java/chching/{parser => }/ParserTest.java (79%) delete mode 100644 src/test/java/chching/parser/ExpensesTest.java delete mode 100644 src/test/java/chching/parser/IncomesTest.java diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index 0d9421bae3..de37b80f45 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -22,10 +22,18 @@ public class AddExpenseCommand extends Command { * @param expense ArrayList of expenses. */ public AddExpenseCommand(Expense expense) throws ChChingException { - if(expense.getCategory().length() > 30) { + if (expense == null) { + throw new ChChingException("No fields found"); + } else if (expense.getCategory() == null) { + throw new ChChingException("Missing category field"); + } else if(expense.getCategory().length() > 30) { throw new ChChingException("Character limit of 30 for category field exceeded"); + } else if (expense.getDescription() == null) { + throw new ChChingException("Missing description field"); } else if(expense.getDescription().length() > 99) { throw new ChChingException("Character limit of 99 for description field exceeded"); + } else if (expense.getDate() == null) { + throw new ChChingException("Missing date field"); } else if (expense.getValue() <= 0) { throw new ChChingException("Invalid/Missing expense value"); } diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 3bd32c350f..7e3eca451e 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -22,8 +22,14 @@ public class AddIncomeCommand extends Command { * @param income ArrayList of income. */ public AddIncomeCommand(Income income) throws ChChingException { - if(income.getDescription().length() > 99) { + if (income == null) { + throw new ChChingException("No fields found"); + } else if (income.getDescription() == null) { + throw new ChChingException("Missing description field"); + } else if(income.getDescription().length() > 99) { throw new ChChingException("Character limit of 99 for description field exceeded"); + } else if (income.getDate() == null) { + throw new ChChingException("Missing date field"); } else if (income.getValue() <= 0) { throw new ChChingException("Invalid/Missing income value"); } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 253fdb94fb..d38545d0c1 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,13 +14,7 @@ */ public class Expenses { - - public static final String CATEGORY_FIELD = "c"; - public static final String DESCRIPTION_FIELD = "de"; - public static final String DATE_FIELD = "da"; - public static final String VALUE_FIELD = "v"; - public static final String INDEX_FIELD = "in"; - + /** * Parses a date * @@ -33,40 +27,22 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); } return expenseDate; } - + /** * Parses an expense into the expenseList * * @param argumentsByField Input from users */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { - // check if all the fields are present - boolean isCategoryPresent = argumentsByField.containsKey(CATEGORY_FIELD); - boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); - boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); - boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); - boolean isAllPresent = isCategoryPresent && isDescriptionPresent && isDatePresent && isValuePresent; - if (!isAllPresent) { - throw new ChChingException("Missing fields detected"); - } - Expense exp = null; - String expenseCategory = argumentsByField.get(CATEGORY_FIELD); - String expenseDescription = argumentsByField.get(DESCRIPTION_FIELD); - String expenseDateString = argumentsByField.get(DATE_FIELD); - LocalDate expenseDate = parseDate(expenseDateString); - - float expenseValue; try { - - expenseValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); boolean validCharacters = UnicodeChecker.isValidStringInput(expenseDescription); @@ -82,18 +58,11 @@ public static Expense parseExpense(HashMap argumentsByField) thr assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { - throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); + throw new ChChingException("Trouble adding expense value"); } - if (expenseValue > 999999.99) { - throw new ChChingException("Expense value cannot be 1000000 or more"); - } else if (expenseValue <= 0) { - throw new ChChingException("Expense value must be greater than 0"); - } - assert expenseValue > 0 : "expenseValue has to be more than 0"; - exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); return exp; } - + /** * Gets the index of the entry * @@ -101,18 +70,11 @@ public static Expense parseExpense(HashMap argumentsByField) thr */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; - - // check if all t.he fields are present - boolean isIndexPresent = argumentsByField.containsKey(INDEX_FIELD); - if (!isIndexPresent) { - throw new ChChingException("Index field not found"); - } - - String indexString = argumentsByField.get(INDEX_FIELD); try { + String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Index must contain a valid integer only"); + throw new ChChingException("Missing/Invalid index"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 2da0b6586b..eac119c59c 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -10,12 +10,6 @@ import java.util.HashMap; public class Incomes { - - public static final String DESCRIPTION_FIELD = "de"; - public static final String DATE_FIELD = "da"; - public static final String VALUE_FIELD = "v"; - public static final String INDEX_FIELD = "in"; - public static LocalDate parseDate(String incomeDateString) throws ChChingException { LocalDate incomeDate; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") @@ -23,46 +17,22 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti try { incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); - } catch (NullPointerException e) { - throw new ChChingException("Missing Date"); + throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); } return incomeDate; } - + /** * Parses an income into the incomeList * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { - // check if all the fields are present - boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); - boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); - boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); - boolean isAllPresent = isDescriptionPresent && isDatePresent && isValuePresent; - if (!isAllPresent) { - throw new ChChingException("Missing fields detected"); - } - Income inc = null; - String incomeDescription = argumentsByField.get(DESCRIPTION_FIELD); - String incomeDateString = argumentsByField.get(DATE_FIELD); - LocalDate incomeDate = parseDate(incomeDateString); - - float incomeValue; try { - incomeValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); - } catch (Exception e) { - throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); - } - if (incomeValue > 999999.99) { - throw new ChChingException("Income value cannot be 1000000 or more"); - } else if (incomeValue <= 0) { - throw new ChChingException("Income value must be greater than 0"); String incomeDescription = argumentsByField.get("de"); boolean validCharacters = UnicodeChecker.isValidStringInput(incomeDescription); if (!validCharacters) { @@ -78,31 +48,23 @@ public static Income parseIncome(HashMap argumentsByField) throw inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { throw new ChChingException("trouble adding income value"); + } - assert incomeValue > 0 : "incomeValue has to be more than 0"; - inc = new Income(incomeDescription, incomeDate, incomeValue); return inc; } - + /** * Gets the index of the entry * - * @param argumentsByField ArrayList of income. + * @param argumentsByField ArrayList of income. */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; - - // check if index field is present - boolean isIndexPresent = argumentsByField.containsKey(INDEX_FIELD); - if (!isIndexPresent) { - throw new ChChingException("Index field not found"); - } - - String indexString = argumentsByField.get(INDEX_FIELD); try { + String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Index must contain a valid integer only"); + throw new ChChingException("Missing/Invalid index"); } return index; } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index d7f65e17b5..fe79d1d7d7 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -178,7 +178,7 @@ public static HashMap sortArguments(List arguments) thro field = fieldAndValue[0].trim(); value = fieldAndValue[1].trim(); } catch (Exception e) { - throw new ChChingException("Arguments not inputted correctly / Missing details"); + throw new ChChingException("Arguments not inputted correctly"); } // checks if it is an existing field @@ -188,7 +188,7 @@ public static HashMap sortArguments(List arguments) thro if (isDuplicateField) { throw new ChChingException("Duplicate fields detected"); } else if (isEmptyFieldOrValue) { - throw new ChChingException("Empty detail detected or improper use of \" / \""); + throw new ChChingException("Empty value detected or use of \" / \" in value"); } else { argumentsByField.put(field, value); } @@ -197,12 +197,22 @@ public static HashMap sortArguments(List arguments) thro } public static String getCategory(HashMap argumentsByField) throws ChChingException { String category = null; - category = argumentsByField.get("c"); + try { + category = argumentsByField.get("c"); + } catch (Exception e) { + throw new ChChingException("missing/invalid category"); + } return category; } public static String getKeyword(HashMap argumentsByField) throws ChChingException { String keyword = null; - keyword = argumentsByField.get("k"); + try { + keyword = argumentsByField.get("k"); + } catch (Exception e) { + throw new ChChingException("missing/invalid keyword"); + } return keyword; } + + } diff --git a/src/test/java/chching/parser/ParserTest.java b/src/test/java/chching/ParserTest.java similarity index 79% rename from src/test/java/chching/parser/ParserTest.java rename to src/test/java/chching/ParserTest.java index bc79b2ddf2..13da1ee715 100644 --- a/src/test/java/chching/parser/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -32,7 +32,6 @@ public class ParserTest { static final String DESCRIPTION_VALUE = "breakfast"; static final String KEYWORD_FIELD = "k"; static final String KEYWORD_VALUE = "hello"; - static final String CA_WITH_EMPTY_DETAIL = "ca "; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -110,42 +109,7 @@ public void sortArguments_invalidInput_throwsException() { new Parser().sortArguments(input); fail(); // the test should not reach this line } catch (ChChingException e) { - assertEquals("Arguments not inputted correctly / Missing details", e.getMessage()); - } - } - - /** - * JUnit test for sortArguments method. - * Checks if the method throws an exception if the input contains duplicate fields. - */ - @Test - public void sortArguments_duplicateField_throwsException() { - List input = new ArrayList(); - input.add(CA); - input.add(CA); - - try { - new Parser().sortArguments(input); - fail(); // the test should not reach this line - } catch (ChChingException e) { - assertEquals("Duplicate fields detected", e.getMessage()); - } - } - - /** - * JUnit test for sortArguments method. - * Checks if the method throws an exception if the input contains empty detail. - */ - @Test - public void sortArguments_emptyDetail_throwsException() { - List input = new ArrayList(); - input.add(CA_WITH_EMPTY_DETAIL); - - try { - new Parser().sortArguments(input); - fail(); // the test should not reach this line - } catch (ChChingException e) { - assertEquals("Empty detail detected or improper use of \" / \"", e.getMessage()); + assertEquals("Arguments not inputted correctly", e.getMessage()); } } diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 8b4bc25d01..4020d9faad 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -71,6 +71,65 @@ void execute_normalScenario_success() { } } + /** + * Junit Test when there is null field for the expense input + */ + @Test + void execute_nullExpense_exceptionThrown() { + String expectedOutput = "No fields found"; + try { + new AddExpenseCommand(null); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + + /** + * Junit Test when there is missing category for the expense input + */ + @Test + void execute_missingCategoryField_exceptionThrown() { + String expectedOutput = "Missing category field"; + Expense input = new Expense(null, DESCRIPTION , DATE, EXPENSE_VALUE); + try { + new AddExpenseCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + + /** + * Junit Test when there is missing description for the expense input + */ + @Test + void execute_missingDescriptionField_exceptionThrown() { + String expectedOutput = "Missing description field"; + Expense input = new Expense(CATEGORY, null, DATE, EXPENSE_VALUE); + try { + new AddExpenseCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + + /** + * Junit Test when there is missing date for the expense input + */ + @Test + void execute_missingDateField_exceptionThrown() { + String expectedOutput = "Missing date field"; + Expense input = new Expense(CATEGORY, DESCRIPTION, null, EXPENSE_VALUE); + try { + new AddExpenseCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + /** * Junit Test when there is a zeroValue field */ diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index d336b81956..34aa877cd4 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -69,6 +69,50 @@ void execute_normalScenario_success() { } } + /** + * Junit Test when there is a null entry in the income input + */ + @Test + void addIncomeCommand_nullExpense_exceptionThrown() { + String expectedOutput = "No fields found"; + try { + new AddIncomeCommand(null); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + + /** + * Junit Test when there is a missing description in the income input + */ + @Test + void addIncomeCommand_missingDescriptionField_exceptionThrown() { + String expectedOutput = "Missing description field"; + Income input = new Income(null, DATE, INCOME_VALUE); + try { + new AddIncomeCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + + /** + * Junit Test when there is a missing date in the income input + */ + @Test + void addIncomeCommand_missingDateField_exceptionThrown() { + String expectedOutput = "Missing date field"; + Income input = new Income(DESCRIPTION, null, INCOME_VALUE); + try { + new AddIncomeCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } + /** * Junit Test when there is a zeroValue field */ @@ -83,4 +127,19 @@ void addIncomeCommand_zeroValueField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } + + /** + * Junit Test when there is a negative value field + */ + @Test + void addIncomeCommand_negativeValueField_exceptionThrown() { + String expectedOutput = "Invalid/Missing income value"; + Income input = new Income(DESCRIPTION, DATE, NEGATIVE_INCOME_VALUE); + try { + new AddIncomeCommand(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals(expectedOutput, e.getMessage()); + } + } } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index 7c4e2c6e9a..656030d684 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -108,7 +108,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index field not found", e.getMessage()); + assertEquals("Missing/Invalid index", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index a1135b6839..02b6973817 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -102,7 +102,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index field not found", e.getMessage()); + assertEquals("Missing/Invalid index", e.getMessage()); } } diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java deleted file mode 100644 index 49c0dc6776..0000000000 --- a/src/test/java/chching/parser/ExpensesTest.java +++ /dev/null @@ -1,215 +0,0 @@ -package chching.parser; - -import chching.record.Expense; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -/** - * JUnit test for Expenses class. - */ -public class ExpensesTest { - public static final String CATEGORY_VALUE = "transport"; - public static final String DESCRIPTION_VALUE = "public transport"; - public static final String DATE_STRING = "02-04-2023"; - public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); - public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); - public static final String VALUE_STRING = "3.50"; - public static final double VALUE_VALUE = 3.50; - public static final String CATEGORY_FIELD = "c"; - public static final String DESCRIPTION_FIELD = "de"; - public static final String DATE_FIELD = "da"; - public static final String VALUE_FIELD = "v"; - public static final String INDEX_FIELD = "in"; - public static final String INDEX_STRING = "1"; - public static final int INDEX_VALUE = 1; - - /** - * JUnit test for parseDate method. - * Tests if parseDate returns the correct LocalDate date if a normal date is input. - */ - @Test - public void parseDate_normalScenario_success() { - try { - assertEquals(DATE_VALUE, Expenses.parseDate(DATE_STRING)); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if an invalid date is input. - */ - @Test - public void parseDate_invalidDate_exceptionThrown() { - try { - Expenses.parseDate("30-02-2023"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if an invalid date format is input. - */ - @Test - public void parseDate_invalidDateFormat_exceptionThrown() { - try { - Expenses.parseDate("2023-02-30"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if a future date is used. - */ - @Test - public void parseDate_futureDate_exceptionThrown() { - try { - Expenses.parseDate("02-04-2030"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date cannot be in the future", e.getMessage()); - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense returns the correct Expense object if a normal input is used. - */ - @Test - public void parseExpense_normalScenario_success() { - HashMap input = new HashMap<>(); - input.put(CATEGORY_FIELD, CATEGORY_VALUE); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, VALUE_STRING); - - try { - Expense output = Expenses.parseExpense(input); - assertEquals(CATEGORY_VALUE, output.getCategory()); - assertEquals(DESCRIPTION_VALUE, output.getDescription()); - assertEquals(DATE_VALUE, output.getDate()); - assertEquals(VALUE_VALUE, output.getValue()); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense throws an exception if a category is not input. - */ - @Test - public void parseExpense_missingCategory_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, VALUE_STRING); - - try { - Expenses.parseExpense(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Missing fields detected", e.getMessage()); - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense throws an exception if expense value >= 1,000,000. - */ - @Test - public void parseExpense_valueTooLarge_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(CATEGORY_FIELD, CATEGORY_VALUE); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, "1000000.00"); - try { - Expenses.parseExpense(input); - fail(); // test should not reach this line - } catch (Exception e) { - System.out.println(e.getMessage()); - assertEquals("Expense value cannot be 1000000 or more", e.getMessage()); - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense throws an exception if expense value <= 0. - */ - @Test - public void parseExpense_valueTooSmall_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(CATEGORY_FIELD, CATEGORY_VALUE); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, "0"); - - try { - Expenses.parseExpense(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Expense value must be greater than 0", e.getMessage()); - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense throws an exception if expense value is not a number. - */ - @Test - public void getIndex_normalScenario_success() { - HashMap input = new HashMap<>(); - input.put(INDEX_FIELD, INDEX_STRING); - try { - assertEquals(INDEX_VALUE, Expenses.getIndex(input)); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseExpense method. - * Tests if parseExpense throws an exception if no index in input. - */ - @Test - public void getIndex_missingIndex_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(CATEGORY_FIELD, CATEGORY_VALUE); - try { - Expenses.getIndex(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Index field not found", e.getMessage()); - } - } - - /** - * JUnit test for getIndex method. - * Tests if getIndex throws an exception if index is not a number. - */ - @Test - public void getIndex_invalidIndex_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(INDEX_FIELD, "2 a"); - try { - Expenses.getIndex(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); - } - } -} diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java deleted file mode 100644 index ba413ab17a..0000000000 --- a/src/test/java/chching/parser/IncomesTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package chching.parser; - -import chching.record.Income; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -/** - * JUnit test for Incomes class. - */ -public class IncomesTest { - public static final String DESCRIPTION_VALUE = "salary"; - public static final String DATE_STRING = "01-04-2023"; - public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); - public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); - public static final String VALUE_STRING = "5000.00"; - public static final double VALUE_VALUE = 5000.00; - public static final String DESCRIPTION_FIELD = "de"; - public static final String DATE_FIELD = "da"; - public static final String VALUE_FIELD = "v"; - public static final String INDEX_FIELD = "in"; - public static final String INDEX_STRING = "1"; - public static final int INDEX_VALUE = 1; - - /** - * JUnit test for parseDate method. - * Tests if parseDate returns the correct LocalDate date if a normal date is input. - */ - @Test - public void parseDate_normalScenario_success() { - try { - assertEquals(DATE_VALUE, Incomes.parseDate(DATE_STRING)); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if an invalid date is input. - */ - @Test - public void parseDate_invalidDate_exceptionThrown() { - try { - Incomes.parseDate("30-02-2023"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if an invalid date format is input. - */ - @Test - public void parseDate_invalidDateFormat_exceptionThrown() { - try { - Incomes.parseDate("2023-02-30"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); - } - } - - /** - * JUnit test for parseDate method. - * Tests if parseDate throws an exception if a future date is used. - */ - @Test - public void parseDate_futureDate_exceptionThrown() { - try { - Incomes.parseDate("02-04-2030"); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Date cannot be in the future", e.getMessage()); - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome returns the correct Income object if a normal input is used. - */ - @Test - public void parseIncome_normalScenario_success() { - HashMap input = new HashMap<>(); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, VALUE_STRING); - - try { - Income output = Incomes.parseIncome(input); - assertEquals(DESCRIPTION_VALUE, output.getDescription()); - assertEquals(DATE_VALUE, output.getDate()); - assertEquals(VALUE_VALUE, output.getValue()); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome throws an exception if description is not in input. - */ - @Test - public void parseIncome_missingDescription_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, VALUE_STRING); - - try { - Incomes.parseIncome(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Missing fields detected", e.getMessage()); - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome throws an exception if income value >= 1,000,000. - */ - @Test - public void parseIncome_valueTooLarge_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, "1000000.00"); - try { - Incomes.parseIncome(input); - fail(); // test should not reach this line - } catch (Exception e) { - System.out.println(e.getMessage()); - assertEquals("Income value cannot be 1000000 or more", e.getMessage()); - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome throws an exception if income value <= 0. - */ - @Test - public void parseIncome_valueTooSmall_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - input.put(DATE_FIELD, DATE_STRING); - input.put(VALUE_FIELD, "0"); - - try { - Incomes.parseIncome(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Income value must be greater than 0", e.getMessage()); - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome throws an exception if income value is not a number. - */ - @Test - public void getIndex_normalScenario_success() { - HashMap input = new HashMap<>(); - input.put(INDEX_FIELD, INDEX_STRING); - try { - assertEquals(INDEX_VALUE, Incomes.getIndex(input)); - } catch (Exception e) { - fail(); // test should not reach this line - } - } - - /** - * JUnit test for parseIncome method. - * Tests if parseIncome throws an exception if no index in input. - */ - @Test - public void getIndex_missingIndex_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); - try { - Incomes.getIndex(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Index field not found", e.getMessage()); - } - } - - /** - * JUnit test for getIndex method. - * Tests if getIndex throws an exception if index is not a number. - */ - @Test - public void getIndex_invalidIndex_exceptionThrown() { - HashMap input = new HashMap<>(); - input.put(INDEX_FIELD, "2 a"); - try { - Incomes.getIndex(input); - fail(); // test should not reach this line - } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); - } - } -} diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index aec344d9e0..51363ba41c 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -126,7 +126,7 @@ void editExpense_editInvalidDate_exceptionThrown() { expenses.editExpense(1, "da", "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index af39b8cd64..8a67284c13 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -107,7 +107,7 @@ void editIncome_editInvalidDate_exceptionThrown() { incomes.editIncome(1, "da", "31-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); } } From b69862d589882dd8d5fc61aba8ae75eb96b5eeb4 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 16:10:32 +0800 Subject: [PATCH 259/364] Fix Incomes and Expenses class --- src/main/java/chching/parser/Expenses.java | 10 +++---- src/main/java/chching/parser/Incomes.java | 32 +++++++++++----------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 253fdb94fb..adc593b4f3 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -67,15 +67,15 @@ public static Expense parseExpense(HashMap argumentsByField) thr try { expenseValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); - String expenseCategory = argumentsByField.get("c"); - String expenseDescription = argumentsByField.get("de"); + expenseCategory = argumentsByField.get("c"); + expenseDescription = argumentsByField.get("de"); boolean validCharacters = UnicodeChecker.isValidStringInput(expenseDescription); if (!validCharacters) { throw new ChChingException("Description contains invalid characters"); } - String expenseDateString = argumentsByField.get("da"); - LocalDate expenseDate = parseDate(expenseDateString); - float expenseValue = Float.parseFloat(argumentsByField.get("v")); + expenseDateString = argumentsByField.get("da"); + expenseDate = parseDate(expenseDateString); + expenseValue = Float.parseFloat(argumentsByField.get("v")); if (expenseValue > 1000000) { throw new ChChingException("Expense value can at most be 1000000"); } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 2da0b6586b..9016d90e72 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -59,23 +59,23 @@ public static Income parseIncome(HashMap argumentsByField) throw } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } - if (incomeValue > 999999.99) { - throw new ChChingException("Income value cannot be 1000000 or more"); - } else if (incomeValue <= 0) { - throw new ChChingException("Income value must be greater than 0"); - String incomeDescription = argumentsByField.get("de"); - boolean validCharacters = UnicodeChecker.isValidStringInput(incomeDescription); - if (!validCharacters) { - throw new ChChingException("Description contains invalid characters"); - } - String incomeDateString = argumentsByField.get("da"); - LocalDate incomeDate = parseDate(incomeDateString); - float incomeValue = Float.parseFloat(argumentsByField.get("v")); - if(incomeValue > 1000000){ - throw new ChChingException("Income value can at most be 1000000"); + try { + + if (incomeValue > 999999.99) { + throw new ChChingException("Income value cannot be 1000000 or more"); + } else if (incomeValue <= 0) { + throw new ChChingException("Income value must be greater than 0"); + } else{ + incomeDescription = argumentsByField.get("de"); + incomeDateString = argumentsByField.get("da"); + incomeDate = parseDate(incomeDateString); + incomeValue = Float.parseFloat(argumentsByField.get("v")); + if (incomeValue > 1000000) { + throw new ChChingException("Income value can at most be 1000000"); + } + assert incomeValue > 0 : "incomeValue has to be more than 0"; + inc = new Income(incomeDescription, incomeDate, incomeValue); } - assert incomeValue > 0 : "incomeValue has to be more than 0"; - inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (Exception e) { throw new ChChingException("trouble adding income value"); } From 6a161414109843c1a639f3bdfa0918fdde379f47 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 16:18:43 +0800 Subject: [PATCH 260/364] Add instructions for manual testing section. Included startup, add, edit commands. Also added headers for the rest of the commands. --- docs/DeveloperGuide.md | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0abd667934..355eaf9b7b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -209,3 +209,56 @@ The value proposition of ChChing is its ability to track income and expenses on ## Instructions for manual testing {Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} + +Given below are instructions to test the app manually. + +### Launch and Shutdown +1. Initial launch + 1. Download the jar file and copy into an empty folder. + 2. Open a command prompt in the folder and run the command `java -jar tp.jar`. ChChing should start up. +2. Shutting down + 1. Type `exit` into the command prompt and press enter. ChChing should shut down and update the save file accordingly. + +### Adding an income/expense +1. Adding an income/expense + 1. Test case: +
      For income:`add income /de salary /da 12-12-2022 /v 350` +
      For expense:`add expense /c meal /de food /da 13-12-2022 /v 3.50` +
      Expected: The income/expense should be added to the income/expense list and the balance should be updated accordingly. + 2. Test case: +
      For income: `add income /da 12-12-2022 /v 3.50` +
      For expense: `add expense /de food /v 3.50` +
      Expected: No income is added. Error details shown in the status message. + 3. Other incorrect add income commands to try: +
      no fields/missing fields - `add income` `add expense`. +
      incorrect date format/invalid date/future date - `add income /de ang pao /da 30-02-2022 /v 10` `add expense /c transport /de bus fare /da 31-04-2029 /v 5.30`. +
      negative value/zero value/1000000000 and above value/non-float value - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`. +
      Expected: Similar to previous. + +### Editing an income/expense +1. Editing an income/expense + 1. Prerequisites: List already contains income/expense entry at specified index. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. + 2. Test case: +
      For income: `edit income 1 /de bonus /da 12-12-2022 /v 350` +
      For expense: `edit expense 1 /c meal /de food /da 13-12-2022 /v 3.50` +
      Expected: The income/expense at index 1 should be edited with updated changes should be reflected in list and the balance should be updated accordingly. + 3. Test case: +
      For income: `edit income /in 0 /de toto /da 12-12-2022 /v 100` +
      For expense: `edit expense /in 0 /c meal /de food /da 13-12-2022 /v 3.50` +
      Expected: income/expense will not be edited. Error details shown in the status message. + 4. Other incorrect delete commands to try: +
      negative index/index over income/expense list size - `edit income /in -1 /de toto /da 12-12-2022 /v 100` `edit expense /in 100 /c drinks /de starbucks coffee /da 13-12-2022 /v 9.50`. +
      missing index field/no fields to edit - `edit income` `edit expense`. +
      incorrect date format/invalid date/future date - `edit income 1 /de ang pao /da 30-02-2022 /v 10` `edit expense 1 /c transport /de bus fare /da 31-04-2029 /v 5.30`. +
      negative value/zero value/1000000000 and above value/non-float value - `edit income 1 /de salary /da 12-12-2022 /v -3.50` `edit expense 1 /c transport /de bus fare /da 10-10-2019 /v 0`. +
      Expected: Similar to previous. + +### Deleting an income/expense + +### Listing all income/expense & Viewing balance + +### Finding income/expense + +### Setting target & Unsetting target + +### Setting Currency & Unsetting Currency \ No newline at end of file From bfb540b0ee48f28bebf8bafc8e5e57640f1d707c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 16:35:15 +0800 Subject: [PATCH 261/364] Add delete/clear command to the instructions for manual testing --- docs/DeveloperGuide.md | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 355eaf9b7b..0438a380a0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -237,7 +237,7 @@ Given below are instructions to test the app manually. ### Editing an income/expense 1. Editing an income/expense - 1. Prerequisites: List already contains income/expense entry at specified index. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. + 1. Prerequisites: List already contains income/expense entry at specified index to be edited. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. 2. Test case:
      For income: `edit income 1 /de bonus /da 12-12-2022 /v 350`
      For expense: `edit expense 1 /c meal /de food /da 13-12-2022 /v 3.50` @@ -254,6 +254,32 @@ Given below are instructions to test the app manually.
      Expected: Similar to previous. ### Deleting an income/expense +1. Deleting an income/expense + 1. Prerequisites: List already contains income/expense entry at specified index to be deleted. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. + 2. Test case: +
      For income: `delete income /in 1` +
      For expense: `delete expense /in 1` +
      Expected: The income/expense at index 1 should be deleted from the income/expense list and the balance should be updated accordingly.
      Depending on the index of the deleted income/expense, the index of the other incomes/expenses after it will be updated accordingly. + 3. Test case: +
      For income: `delete income /in 0` +
      For expense: `delete expense /in 0` +
      Expected: income/expense will not be deleted. Error details shown in the status message. + 4. Other incorrect delete commands to try: +
      negative index/index over income/expense list size - `delete income /in -1` `delete expense /in 100`. +
      missing index field - `delete income` `delete expense`. +
      Expected: Similar to previous. + +2. Clearing all incomes/expenses + 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. + 2. Test case: +
      For incomes: `clear income` +
      For expenses: `clear expense` +
      Expected: All incomes/expenses should be deleted from the income/expense list and the balance should be updated accordingly. + +3. Clearing all incomes and expenses + 1. Prerequisites: List already contains income and/or expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. + 2. Test case: `clear all` +
      Expected: All incomes and expenses should be deleted from both the income and expense list and the balance should be updated to 0. ### Listing all income/expense & Viewing balance @@ -261,4 +287,5 @@ Given below are instructions to test the app manually. ### Setting target & Unsetting target -### Setting Currency & Unsetting Currency \ No newline at end of file +### Setting Currency & Unsetting Currency + From 81a644a0541b2295be32c6bc81b05b1c552cf5d7 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 16:53:28 +0800 Subject: [PATCH 262/364] Fix merge conflicts --- src/main/java/chching/parser/Expenses.java | 33 +++++++++-------- src/main/java/chching/parser/Incomes.java | 41 +++++++++------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 2f75d78530..3a4046ee30 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -27,7 +27,7 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -42,25 +42,24 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { Expense exp = null; + String expenseCategory = argumentsByField.get("c"); + String expenseDescription = argumentsByField.get("de"); + String expenseDateString = argumentsByField.get("da"); + LocalDate expenseDate = parseDate(expenseDateString); + + float expenseValue; try { - expenseValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); - expenseCategory = argumentsByField.get("c"); - expenseDescription = argumentsByField.get("de"); - boolean validCharacters = UnicodeChecker.isValidStringInput(expenseDescription); - if (!validCharacters) { - throw new ChChingException("Description contains invalid characters"); - } - expenseDateString = argumentsByField.get("da"); - expenseDate = parseDate(expenseDateString); expenseValue = Float.parseFloat(argumentsByField.get("v")); - if (expenseValue > 1000000) { - throw new ChChingException("Expense value can at most be 1000000"); - } - assert expenseValue > 0 : "Expense value should be greater than zero"; - exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); } catch (Exception e) { - throw new ChChingException("Trouble adding expense value"); + throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); + } + if (expenseValue > 1000000) { + throw new ChChingException("Expense value can at most be 1000000"); + } else if (expenseValue <= 0) { + throw new ChChingException("Expense value must be greater than 0"); } + assert expenseValue > 0 : "expenseValue has to be more than 0"; + exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); return exp; } @@ -75,7 +74,7 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/Invalid index"); + throw new ChChingException("Index must contain a valid integer only"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index ee0868f21b..cf0a565678 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -17,7 +17,7 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti try { incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: dd-MM-yyyy"); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -28,41 +28,34 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti /** * Parses an income into the incomeList * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; + String incomeDescription = argumentsByField.get("de"); + String incomeDateString = argumentsByField.get("da"); + LocalDate incomeDate = parseDate(incomeDateString); + + float incomeValue; try { - incomeValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); + incomeValue = Float.parseFloat(argumentsByField.get("v")); } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } - try { - if (incomeValue > 999999.99) { - throw new ChChingException("Income value cannot be 1000000 or more"); - } else if (incomeValue <= 0) { - throw new ChChingException("Income value must be greater than 0"); - } else{ - incomeDescription = argumentsByField.get("de"); - incomeDateString = argumentsByField.get("da"); - incomeDate = parseDate(incomeDateString); - incomeValue = Float.parseFloat(argumentsByField.get("v")); - if (incomeValue > 1000000) { - throw new ChChingException("Income value can at most be 1000000"); - } - assert incomeValue > 0 : "incomeValue has to be more than 0"; - inc = new Income(incomeDescription, incomeDate, incomeValue); - } - } catch (Exception e) { - throw new ChChingException("trouble adding income value"); + if (incomeValue > 1000000) { + throw new ChChingException("Income value can at most be 1000000"); + } else if (incomeValue <= 0) { + throw new ChChingException("Income value must be greater than 0"); } + assert incomeValue > 0 : "incomeValue has to be more than 0"; + inc = new Income(incomeDescription, incomeDate, incomeValue); return inc; } /** * Gets the index of the entry * - * @param argumentsByField ArrayList of income. + * @param argumentsByField ArrayList of income. */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; @@ -70,8 +63,8 @@ public static int getIndex(HashMap argumentsByField) throws ChCh String indexString = argumentsByField.get("in"); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Missing/Invalid index"); + throw new ChChingException("Index must contain a valid integer only"); } return index; } -} +} \ No newline at end of file From 684172431bbc5f200878b54cd08a9fb9a698b7e5 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 17:05:44 +0800 Subject: [PATCH 263/364] Add list and balance commands to manual testing of Developer Guide --- docs/DeveloperGuide.md | 17 +++++++++++++++++ docs/UserGuide.md | 1 + 2 files changed, 18 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0438a380a0..991344fe7e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -282,6 +282,23 @@ Given below are instructions to test the app manually.
      Expected: All incomes and expenses should be deleted from both the income and expense list and the balance should be updated to 0. ### Listing all income/expense & Viewing balance +1. List all incomes and/or expenses + 1. Prerequisites: Should there be a currency set, it will be shown based on the set currency. Otherwise, records will be displayed in SGD. + 2. Test case: should there be income/expense entries in the list +
      For income: `list income` +
      For expense: `list expense` +
      For both: `list` +
      Expected: All incomes and/or expenses should be listed. Note deleted incomes/expenses will not be shown. + 2. Test case: should there be no income/expense entries in the list +
      For income: `list income` +
      For expense: `list expense` +
      For both: `list` +
      Expected: No income/expense will be listed. Status message will indicate that the list is empty. + +2. View balance + 1. Prerequisites: If the target has not been set by the user, it will be set to 0 by default. should there be no currency set, only SGD will be shown, else it will additionally show the set currency. + 2. Test case: `balance` +
      Expected: The total expense, total income, current balance and current target will be shown. Should the current balance or equal to the current target, it will prompt a good job message, otherwise it will prompt a message that balance has not reached target. ### Finding income/expense diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 46652b767c..d5d06cb825 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -77,6 +77,7 @@ Use case: - CATEGORY has a maximum char limit of 30. - DESCRIPTION has a maximum char limit of 99. - VALUE will be stored as a positive float. +- VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. From 68d1b895b62efe244700eba069e4e2380bce51bd Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 17:14:02 +0800 Subject: [PATCH 264/364] Fix Checkstyle --- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- src/test/java/chching/record/ExpenseListTest.java | 2 +- src/test/java/chching/record/IncomeListTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 3a4046ee30..cc119c5c8e 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -27,7 +27,7 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index cf0a565678..c4ffa87e58 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -17,7 +17,7 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti try { incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 51363ba41c..8cbb032499 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -126,7 +126,7 @@ void editExpense_editInvalidDate_exceptionThrown() { expenses.editExpense(1, "da", "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 8a67284c13..92bfcc67e7 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -107,7 +107,7 @@ void editIncome_editInvalidDate_exceptionThrown() { incomes.editIncome(1, "da", "31-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: dd-MM-yyyy", e.getMessage()); + assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); } } From c43052aaa9d1809fcb6e3e8ce40b09672da6387e Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 17:19:06 +0800 Subject: [PATCH 265/364] Fix checkstyle --- src/main/java/chching/parser/Incomes.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index c4ffa87e58..4f57bc1bf9 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -67,4 +67,5 @@ public static int getIndex(HashMap argumentsByField) throws ChCh } return index; } -} \ No newline at end of file +} + From cbfe03f0d5fc947370d369ece46b8d90ba449d13 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 17:24:56 +0800 Subject: [PATCH 266/364] Fix Junit bug --- src/test/java/chching/command/EditExpenseCommandTest.java | 2 +- src/test/java/chching/command/EditIncomeCommandTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index 656030d684..adddbb462d 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -108,7 +108,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing/Invalid index", e.getMessage()); + assertEquals("Index must contain a valid integer only", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index 02b6973817..0bf5f55480 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -102,7 +102,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Missing/Invalid index", e.getMessage()); + assertEquals("Index must contain a valid integer only", e.getMessage()); } } From bf7d53a3155f709fe9122fdaadbcd854275948fe Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 5 Apr 2023 18:40:16 +0800 Subject: [PATCH 267/364] round value for income and expense to 2dp before adding into respective array list --- src/main/java/chching/parser/Expenses.java | 3 ++- src/main/java/chching/parser/Incomes.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index cc119c5c8e..3e15304299 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -47,9 +47,10 @@ public static Expense parseExpense(HashMap argumentsByField) thr String expenseDateString = argumentsByField.get("da"); LocalDate expenseDate = parseDate(expenseDateString); - float expenseValue; + double expenseValue; try { expenseValue = Float.parseFloat(argumentsByField.get("v")); + expenseValue = Math.round(expenseValue * 100.0) / 100.0; } catch (Exception e) { throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 4f57bc1bf9..5835b25e9b 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -36,9 +36,10 @@ public static Income parseIncome(HashMap argumentsByField) throw String incomeDateString = argumentsByField.get("da"); LocalDate incomeDate = parseDate(incomeDateString); - float incomeValue; + double incomeValue; try { incomeValue = Float.parseFloat(argumentsByField.get("v")); + incomeValue = Math.round(incomeValue * 100.0) / 100.0; } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } From aaf17f7e291b04f61a325800b41e7754de97af80 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 5 Apr 2023 18:42:06 +0800 Subject: [PATCH 268/364] edit entry for add in user guide for value being stored as a 2dp double --- docs/UserGuide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3507a4bcba..80feea0a32 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -76,7 +76,8 @@ Use case: - Re-prompts user if any field is not provided properly. - CATEGORY has a maximum char limit of 30. - DESCRIPTION has a maximum char limit of 99. -- VALUE will be stored as a positive float. +- VALUE will be stored as a positive double. +- VALUE entered by user will be rounded off to the nearest 2 decimal places. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. From c34ff7fa3dac520da516d9b70effa7104c6d3ed4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 5 Apr 2023 18:45:23 +0800 Subject: [PATCH 269/364] update exception message thrown for parsing value --- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 3e15304299..a7ddbb0527 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -52,7 +52,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr expenseValue = Float.parseFloat(argumentsByField.get("v")); expenseValue = Math.round(expenseValue * 100.0) / 100.0; } catch (Exception e) { - throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); + throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); } if (expenseValue > 1000000) { throw new ChChingException("Expense value can at most be 1000000"); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 5835b25e9b..80dd801373 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -41,7 +41,7 @@ public static Income parseIncome(HashMap argumentsByField) throw incomeValue = Float.parseFloat(argumentsByField.get("v")); incomeValue = Math.round(incomeValue * 100.0) / 100.0; } catch (Exception e) { - throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); + throw new ChChingException("Income value must be a valid double that is 2 d.p. or less"); } if (incomeValue > 1000000) { throw new ChChingException("Income value can at most be 1000000"); From 3138901e03e00eb73563ba7cc1d70eed9e8c2e63 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 18:46:57 +0800 Subject: [PATCH 270/364] lower bound checker for add income/expense --- src/main/java/chching/parser/Expenses.java | 6 +-- src/main/java/chching/parser/Incomes.java | 7 ++- src/main/java/chching/record/ExpenseList.java | 54 +++++++++---------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index cc119c5c8e..4405b2dc3a 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -55,10 +55,10 @@ public static Expense parseExpense(HashMap argumentsByField) thr } if (expenseValue > 1000000) { throw new ChChingException("Expense value can at most be 1000000"); - } else if (expenseValue <= 0) { - throw new ChChingException("Expense value must be greater than 0"); + } else if (expenseValue < 0.01) { + throw new ChChingException("Expense value must be greater than or equals 0.01"); } - assert expenseValue > 0 : "expenseValue has to be more than 0"; + assert expenseValue >= 0.01 : "expenseValue has to be more than or equals 0.01"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); return exp; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 4f57bc1bf9..a37ab775bc 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -44,10 +44,10 @@ public static Income parseIncome(HashMap argumentsByField) throw } if (incomeValue > 1000000) { throw new ChChingException("Income value can at most be 1000000"); - } else if (incomeValue <= 0) { - throw new ChChingException("Income value must be greater than 0"); + } else if (incomeValue < 0.01) { + throw new ChChingException("Income value must be greater than or equals 0.01"); } - assert incomeValue > 0 : "incomeValue has to be more than 0"; + assert incomeValue >= 0.01 : "incomeValue has to be more than or equals to 0.01"; inc = new Income(incomeDescription, incomeDate, incomeValue); return inc; } @@ -68,4 +68,3 @@ public static int getIndex(HashMap argumentsByField) throws ChCh return index; } } - diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 82106b456a..3f3719bd75 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -57,34 +57,34 @@ public void editExpense(int index, String field, String value) throws ChChingExc // edit the according field switch (field) { - case "c": - expense.setCategory(value); - break; - case "de": - expense.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - expense.setDate(date); - break; - case "v": - try { - double amount = Double.parseDouble(value); - if (amount < 0.01) { - throw new ChChingException("Expense must be greater than or equals 0.01"); + case "c": + expense.setCategory(value); + break; + case "de": + expense.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + expense.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Expense must be greater than or equals 0.01"); + } + assert amount > 0.01 : "Income must be positive and more than 0"; + expense.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Expense value must be a number"); + } + throw new ChChingException(e.getMessage()); } - assert amount > 0.01 : "Income cannot be negative"; - expense.setValue(amount); - } catch (Exception e) { - if (e instanceof NumberFormatException) { - throw new ChChingException("Expense value must be a number"); - } - throw new ChChingException(e.getMessage()); - } - break; - default: - assert false : "No such field to enter here"; - throw new ChChingException("No such field in expense"); + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in expense"); } } From c5f040b4dd6c0132244c566e6e5712a23d5b9474 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 5 Apr 2023 18:49:00 +0800 Subject: [PATCH 271/364] edit UG --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ae90a36bd6..7f6904c736 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -77,7 +77,7 @@ Use case: - CATEGORY has a maximum char limit of 30. - DESCRIPTION has a maximum char limit of 99. - VALUE entered by user will be rounded off to the nearest 2 decimal places. -- VALUE will be stored as a positive float. +- VALUE will be stored as a positive double. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. From 555e3a509492e9a89aa1c912b378b09227b6f4f7 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 5 Apr 2023 18:50:39 +0800 Subject: [PATCH 272/364] checkstyle --- src/main/java/chching/record/ExpenseList.java | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 3f3719bd75..c2a8403ff1 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -57,34 +57,34 @@ public void editExpense(int index, String field, String value) throws ChChingExc // edit the according field switch (field) { - case "c": - expense.setCategory(value); - break; - case "de": - expense.setDescription(value); - break; - case "da": - LocalDate date = parseDate(value); - expense.setDate(date); - break; - case "v": - try { - double amount = Double.parseDouble(value); - if (amount < 0.01) { - throw new ChChingException("Expense must be greater than or equals 0.01"); - } - assert amount > 0.01 : "Income must be positive and more than 0"; - expense.setValue(amount); - } catch (Exception e) { - if (e instanceof NumberFormatException) { - throw new ChChingException("Expense value must be a number"); - } - throw new ChChingException(e.getMessage()); + case "c": + expense.setCategory(value); + break; + case "de": + expense.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + expense.setDate(date); + break; + case "v": + try { + double amount = Double.parseDouble(value); + if (amount < 0.01) { + throw new ChChingException("Expense must be greater than or equals 0.01"); } - break; - default: - assert false : "No such field to enter here"; - throw new ChChingException("No such field in expense"); + assert amount > 0.01 : "Income must be positive and more than 0"; + expense.setValue(amount); + } catch (Exception e) { + if (e instanceof NumberFormatException) { + throw new ChChingException("Expense value must be a number"); + } + throw new ChChingException(e.getMessage()); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in expense"); } } From 546a5584e6f541a499d570b1bb41b558bd189af3 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 5 Apr 2023 19:04:21 +0800 Subject: [PATCH 273/364] Add JUnit tests for Expenses and Incomes classes from the parser package --- .../java/chching/parser/ExpensesTest.java | 212 ++++++++++++++++++ src/test/java/chching/parser/IncomesTest.java | 204 +++++++++++++++++ 2 files changed, 416 insertions(+) create mode 100644 src/test/java/chching/parser/ExpensesTest.java create mode 100644 src/test/java/chching/parser/IncomesTest.java diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java new file mode 100644 index 0000000000..eb8e816062 --- /dev/null +++ b/src/test/java/chching/parser/ExpensesTest.java @@ -0,0 +1,212 @@ +package chching.parser; + +import chching.record.Expense; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class ExpensesTest { + public static final String CATEGORY_VALUE = "transport"; + public static final String DESCRIPTION_VALUE = "public transport"; + public static final String DATE_STRING = "02-04-2023"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); + public static final String VALUE_STRING = "3.50"; + public static final double VALUE_VALUE = 3.50; + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static final String INDEX_STRING = "1"; + public static final int INDEX_VALUE = 1; + + /** + * JUnit test for parseDate method. + * Tests if parseDate returns the correct LocalDate date if a normal date is input. + */ + @Test + public void parseDate_normalScenario_success() { + try { + assertEquals(DATE_VALUE, Expenses.parseDate(DATE_STRING)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date is input. + */ + @Test + public void parseDate_invalidDate_exceptionThrown() { + try { + Expenses.parseDate("30-02-2023"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date format is input. + */ + @Test + public void parseDate_invalidDateFormat_exceptionThrown() { + try { + Expenses.parseDate("2023-02-30"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if a future date is used. + */ + @Test + public void parseDate_futureDate_exceptionThrown() { + try { + Expenses.parseDate("02-04-2030"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense returns the correct Expense object if a normal input is used. + */ + @Test + public void parseExpense_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Expense output = Expenses.parseExpense(input); + assertEquals(CATEGORY_VALUE, output.getCategory()); + assertEquals(DESCRIPTION_VALUE, output.getDescription()); + assertEquals(DATE_VALUE, output.getDate()); + assertEquals(VALUE_VALUE, output.getValue()); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if a category is not input. + */ + @Test + public void parseExpense_missingCategory_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing fields detected", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value >= 1,000,000. + */ + @Test + public void parseExpense_valueTooLarge_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "1000000.00"); + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + System.out.println(e.getMessage()); + assertEquals("Expense value cannot be 1000000 or more", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value <= 0. + */ + @Test + public void parseExpense_valueTooSmall_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "0"); + + try { + Expenses.parseExpense(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be greater than 0", e.getMessage()); + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if expense value is not a number. + */ + @Test + public void getIndex_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, INDEX_STRING); + try { + assertEquals(INDEX_VALUE, Expenses.getIndex(input)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseExpense method. + * Tests if parseExpense throws an exception if no index in input. + */ + @Test + public void getIndex_missingIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(CATEGORY_FIELD, CATEGORY_VALUE); + try { + Expenses.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index field not found", e.getMessage()); + } + } + + /** + * JUnit test for getIndex method. + * Tests if getIndex throws an exception if index is not a number. + */ + @Test + public void getIndex_invalidIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, "2 a"); + try { + Expenses.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index must contain a valid integer only", e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java new file mode 100644 index 0000000000..5e332ed833 --- /dev/null +++ b/src/test/java/chching/parser/IncomesTest.java @@ -0,0 +1,204 @@ +package chching.parser; +import chching.record.Income; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class IncomesTest { + public static final String DESCRIPTION_VALUE = "salary"; + public static final String DATE_STRING = "01-04-2023"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE_VALUE = LocalDate.parse(DATE_STRING, FORMATTER); + public static final String VALUE_STRING = "5000.00"; + public static final double VALUE_VALUE = 5000.00; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static final String INDEX_STRING = "1"; + public static final int INDEX_VALUE = 1; + + /** + * JUnit test for parseDate method. + * Tests if parseDate returns the correct LocalDate date if a normal date is input. + */ + @Test + public void parseDate_normalScenario_success() { + try { + assertEquals(DATE_VALUE, Incomes.parseDate(DATE_STRING)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date is input. + */ + @Test + public void parseDate_invalidDate_exceptionThrown() { + try { + Incomes.parseDate("30-02-2023"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if an invalid date format is input. + */ + @Test + public void parseDate_invalidDateFormat_exceptionThrown() { + try { + Incomes.parseDate("2023-02-30"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); + } + } + + /** + * JUnit test for parseDate method. + * Tests if parseDate throws an exception if a future date is used. + */ + @Test + public void parseDate_futureDate_exceptionThrown() { + try { + Incomes.parseDate("02-04-2030"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Date cannot be in the future", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome returns the correct Income object if a normal input is used. + */ + @Test + public void parseIncome_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Income output = Incomes.parseIncome(input); + assertEquals(DESCRIPTION_VALUE, output.getDescription()); + assertEquals(DATE_VALUE, output.getDate()); + assertEquals(VALUE_VALUE, output.getValue()); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if description is not in input. + */ + @Test + public void parseIncome_missingDescription_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, VALUE_STRING); + + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing fields detected", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value >= 1,000,000. + */ + @Test + public void parseIncome_valueTooLarge_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "1000000.00"); + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + System.out.println(e.getMessage()); + assertEquals("Income value cannot be 1000000 or more", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value <= 0. + */ + @Test + public void parseIncome_valueTooSmall_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + input.put(DATE_FIELD, DATE_STRING); + input.put(VALUE_FIELD, "0"); + + try { + Incomes.parseIncome(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be greater than 0", e.getMessage()); + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if income value is not a number. + */ + @Test + public void getIndex_normalScenario_success() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, INDEX_STRING); + try { + assertEquals(INDEX_VALUE, Incomes.getIndex(input)); + } catch (Exception e) { + fail(); // test should not reach this line + } + } + + /** + * JUnit test for parseIncome method. + * Tests if parseIncome throws an exception if no index in input. + */ + @Test + public void getIndex_missingIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + try { + Incomes.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index field not found", e.getMessage()); + } + } + + /** + * JUnit test for getIndex method. + * Tests if getIndex throws an exception if index is not a number. + */ + @Test + public void getIndex_invalidIndex_exceptionThrown() { + HashMap input = new HashMap<>(); + input.put(INDEX_FIELD, "2 a"); + try { + Incomes.getIndex(input); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Index must contain a valid integer only", e.getMessage()); + } + } +} \ No newline at end of file From c45d8fc4b74a4dbb4b72376731ce34cc63e25338 Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 5 Apr 2023 19:15:52 +0800 Subject: [PATCH 274/364] Update DG diagrams --- docs/DeveloperGuide.md | 2 +- docs/diagrams/DeleteIncomeCommand.puml | 53 ++++++++++++++ .../diagrams/Record_RecordList_UML_class.puml | 68 ++++++++++++++++++ docs/diagrams/SetTargetCommand.puml | 50 +++++++++++++ docs/diagrams/Target_UML.puml | 24 +++++++ docs/images/DeleteIncomeCommand.png | Bin 0 -> 34503 bytes .../DeleteIncomeCommand_sequence_diagram.png | Bin 89775 -> 0 bytes docs/images/Record_RecordList_UML_class.png | Bin 111016 -> 51299 bytes docs/images/SetTargetCommand.png | Bin 81003 -> 24593 bytes docs/images/Target_UML.png | Bin 41760 -> 7384 bytes 10 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/DeleteIncomeCommand.puml create mode 100644 docs/diagrams/Record_RecordList_UML_class.puml create mode 100644 docs/diagrams/SetTargetCommand.puml create mode 100644 docs/diagrams/Target_UML.puml create mode 100644 docs/images/DeleteIncomeCommand.png delete mode 100644 docs/images/DeleteIncomeCommand_sequence_diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0abd667934..3b24cb1639 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -53,7 +53,7 @@ Entering any of these optional lines will result in early termination of the com Or else, the command will continue to delete the entry at the particular index. Afterwards, the `execute()` method will print `"Income deleted, here is the updated list:"` and prints the entries in the income list. -![Record Class](images/DeleteIncomeCommand_sequence_diagram.png) +![Record Class](images/DeleteIncomeCommand.png) ### Target and TargetStorage diff --git a/docs/diagrams/DeleteIncomeCommand.puml b/docs/diagrams/DeleteIncomeCommand.puml new file mode 100644 index 0000000000..4a94e0f669 --- /dev/null +++ b/docs/diagrams/DeleteIncomeCommand.puml @@ -0,0 +1,53 @@ +@startuml + +participant ":System" as System +participant ":Incomes" as Incomes +participant ":UI" as UI +participant ":DeleteIncomeCommand" as DeleteIncomeCommand +participant ":ChChingException" as ChChingException + +activate UI +UI -> UI:readCommand() +UI -->DeleteIncomeCommand: input.nextLine() +deactivate UI + +activate DeleteIncomeCommand +DeleteIncomeCommand -> DeleteIncomeCommand: execute(income,expense,ui,storage,selector,converter,targetStorage) + +opt index <= 0 + +DeleteIncomeCommand -> ChChingException: ChChingException("Zero/Negative Index") +activate ChChingException +ChChingException --> DeleteIncomeCommand +deactivate ChChingException + +end + +opt index > incomes.size() + +DeleteIncomeCommand -> ChChingException: ChChingException("The number is too big") +activate ChChingException +ChChingException --> DeleteIncomeCommand +deactivate ChChingException + +end + + + +DeleteIncomeCommand -> Incomes: incomes.deleteIncome(index) +activate Incomes +Incomes --> DeleteIncomeCommand +deactivate Incomes +DeleteIncomeCommand -> System: System.out.println("Income deleted, here is the updated list:") +activate System +System --> DeleteIncomeCommand +deactivate System + +DeleteIncomeCommand -> Incomes: incomes.printIncomeList() +activate Incomes +Incomes --> DeleteIncomeCommand +deactivate Incomes + +destroy ChChingException + +@enduml \ No newline at end of file diff --git a/docs/diagrams/Record_RecordList_UML_class.puml b/docs/diagrams/Record_RecordList_UML_class.puml new file mode 100644 index 0000000000..c43591c8d2 --- /dev/null +++ b/docs/diagrams/Record_RecordList_UML_class.puml @@ -0,0 +1,68 @@ +@startuml +'https://plantuml.com/class-diagram + +abstract class RecordList +abstract Record + +IncomeList <|-- RecordList +ExpenseList <|-- RecordList + + +Income <|- Record +Expense <|- Record + +class Record { +# description: String +# date: String +# value: double ++ Record() ++ getCategory(): String ++ getDescription(): String ++ getDate(): String ++ setDescription(): ++ setDate(): ++ setValue(): ++ toString(): String +} + +abstract class RecordList { +# recordList: ArrayList +- balance: double ++ RecordList(): ++ getRecordList(): ArrayList ++ getRecordCount(): ++ getBalance(): double ++ addRecord(Record): ++ printRecordList(): ++ get(int): Record +} + +class Income { + +} + +class Expense { ++ category: String +} + +class IncomeList { +# incomeList: ArrayList ++ IncomeList(): ++ size(): int ++ addIncome(): ++ deleteIncome(): ++ printIncomeList(): +} + +class ExpenseList { +# expenseList: ArrayList ++ ExpenseList(): ++ size(): int ++ addExpense(): ++ deleteExpense(): ++ printExpenseList(): +} + + + +@enduml \ No newline at end of file diff --git a/docs/diagrams/SetTargetCommand.puml b/docs/diagrams/SetTargetCommand.puml new file mode 100644 index 0000000000..40f6bdba34 --- /dev/null +++ b/docs/diagrams/SetTargetCommand.puml @@ -0,0 +1,50 @@ +@startuml + +participant ":ChChing" as ChChing +participant ":Parser" as Parser +participant ":SetTargetCommand" as SetTargetCommand +participant ":TargetParser" as TargetParser +participant ":TargetStorage" as TargetStorage + +[-> ChChing : run() +activate ChChing +ChChing -> Parser: parse(line, incomes expenses) +activate Parser + +Parser -> TargetParser: parseTarget(args) +activate TargetParser +TargetParser --> Parser: Target +deactivate TargetParser + +create SetTargetCommand +Parser -> SetTargetCommand: AddTargetCommand(args) +activate SetTargetCommand + +SetTargetCommand --> Parser + +deactivate SetTargetCommand +Parser -> ChChing +deactivate Parser +ChChing -> SetTargetCommand: execute(incomes, expenses, ui, storage, selector, converter, targetStorage) +activate SetTargetCommand +destroy TargetParser +SetTargetCommand -> TargetStorage: setTarget(value) +activate TargetStorage +TargetStorage --> SetTargetCommand +deactivate TargetStorage + + + +SetTargetCommand --> ChChing +deactivate SetTargetCommand + + + + + + +[<--ChChing +destroy SetTargetCommand +deactivate ChChing + +@enduml \ No newline at end of file diff --git a/docs/diagrams/Target_UML.puml b/docs/diagrams/Target_UML.puml new file mode 100644 index 0000000000..4d81a3bbbf --- /dev/null +++ b/docs/diagrams/Target_UML.puml @@ -0,0 +1,24 @@ +@startuml + + +class Target { +#value + ++Target(): ++getValue(): Double +} + +class TargetStorage { +# targetsList: Target[1] + ++ TargetStorage(): ++ addTarget(): ++ getTarget(): +} + +TargetStorage "1"-> "1" Target + + + + +@enduml \ No newline at end of file diff --git a/docs/images/DeleteIncomeCommand.png b/docs/images/DeleteIncomeCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7c39672b840d1219fe7aa23303d8b511db2352 GIT binary patch literal 34503 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
      8U_Jx=7-lVn@>{5!~) z6YXnib0*+$hfh@Ll=l@?v_6SD(ugMR{aU58b0z)T+bAiA{i6@*F_2qEKHdsaMC1rx zl=mJI=mg}$u^;I)_^?Rd$CVvwW@!5#zMc1rF}U&NHun4C>v|Zq|8V`Mc|pPwh1VTW zPgel4`Psmw#!~{RAwXr4ZcF*+|6)jzKhaioCi9ZGah!*9FW;Q#%n5nl$E~hO*X~)6 zOFid!&Gi^{!FW$!oG#I>cY!$T`P0^7glsrJZOG4{bVlU%=mSnR+S}=+hSft(o$z&I zm4lCx54F;H7uRu(GlyJTD^co$1J(xLr`oJ#h87!DN$`LZnp}pNqoZ@km1@>LQi-PY zAd>H;roFocnQS9plsJ_0hnC??x>yXKJEX#ocW(Xo2y$W7?+dAHBRxxt@kMe`_;rTP zrwTX9@4RX)CwG77LcM$R#>*1YI?j(Azbs9$CgFHXXxjhyZGJ_=QeNZvh3Q?%!~Kok zE4{_GBo1Ukmun65`{*+Ydg+SptT_9$&)b>Rt=sD3QP20pXAJPdRY@zAyRdwI) z2%o*?Da2!ly6US+u&3);BDKcgUvV41FdDpF9sk!ENrqTn6kk2pxG*_p&A04)-w-YT z0QAyl)$LwF#a)Z~5g&l_kS0FC&IiZY(=Q*N<=XqU9Xj7zx%l#GTLbaM5EoV$d-vr` ze(ijH6HnzMgTJ4Ll5i2dd`5Wd;-Tl4pV%>B7vPyA6#IUyZT`H+U?;k{E_CYDpKA7iDx~WKIrjuzgu>(gIOQm0KDekv`*s8UfH-Etv!0~F48lNZCnN|c9d_G9;C!Z zNoM5qJ#RGT34Us~plQpUKg~^L?e>Z`{oC8ewKv+EGOVD^J;+;5qndQF-}piK$-Vi< zn5*N*E>1jB_@gCid#JCEycvKTy+}r-#pr|9U3{&Lb>N(352u**du<{G=K4TpCfC(* zdVzC&602jwOOY=GEPo(xF(_U&5>Cw1Gc(7r;j>N7WVm*j>G#DMTIa#Jr|-ZsTzy2L zQk>V&vU=goLvp^cRJ~NUo~No@rv`_H&civXpkRN~J_`W}*Uj@mC&3RZabVN46_TOq zPaON|{hBP&VZ%QmX|(yQDd~~8o7(r$@%2u2i95m_ErOh*?Iw|l{Tq;=(q{P8YVz2=$PpUda|RwLe6U`*1W;K4&e6w_gcRjCaxeosYM^=HSl1Vm^|Wv?bzLB`oKk4F+j(Iv_LOGzVCmmoa*aKY z_STjB{Jti1*|I0R;_supTCI85%aG!2oammETb*x8-slM9%X9pQeibu)fy2nP-d6#Q zw~a~qJoK8ON!#d4^!>23Go_|t0oR`umC7>H>0!B0{Y{MOy!3N#zvERGR+~@4lq8QT~y-EClp&u+8nASk$givej($+h z$kbHd>P%PH8m2pggxeTmBaYWmd&s~@NlvH0vFaGpFLG`n0&TXBhz?V*rqBkJAqK4AIj*Lp@`gG}sRs-nqTE2}Ehhj(AZ01&0e*K)zi)J42)_OeMH&BqjrtC`? z8Cjcl;zj1Yn3K%?cs11 zt#)Zq6Ft0_o(T_p;v`@`yvU9%XD?C2yi4+6&LO}M)wok;nAdsu@(0(6oJBU(wZE`I z1b*^X!BSJ3m(L9K`>t>h@Fg?70xdm#_O*d!wh$#8(y-|FqQ`V{-G(&3Qe3p{Ob5F< zjpsrOuB(5h|Mob=u9bju=e;f4o^W4J>MAy6H<0)EQLtgaK8b!n@mbYzVJI37`<5(S z%W+#OYC8`HYdXhJ&B!_g8(pw+4l%2C4ii^ChAh|-st3Er1?~Ik9kjVl6=FcFsEh44 zqZFnuLG|7{w5j^7tvTX4vAkWA+eX1p?Tz2Qu%I7F;>>v;p8ZEZIK@YjpDRJzEs@MC zNm=x}{Fi~W2tvFz!b6`Zoj7)fyZ$wXy6p#`+643nN1Ys;5i_pX=2Znr

      xB!&;P`gQCS7{wNmre5iJ{(omc*{WfXja*) z<-vZr6a048mpoOJmDw%qb3nnY?b}|7K42z5H4P@TP+s*9m z@Mss!`2D7%%g2SOW!-+tzBBwu`YAeS_SoCjs$w`OcfxhHruNr2uZ<7oI5u0gNu5qO z{ntuOEoO0~-G3~~bhhTWDYDik$orlmEKz4I-lYmq>p8}@UdPQ(XJG(mE&weM8H zjrPwIFP&G0>DBsUt+PI6=J;8buQtWUeV7dMS}$E+CMXvf-7#g3c=#N)@J}iS*ZS#A zur$_Lt_-)#0&#Q0ReQ5kt2|~t1>^>P9ZivzgkFm86zg`Bf4#Cm>UYJsH?<(!bE-3I zpwHgxBmoxCXEfRXhfs0PdpTBk8?5W)^;(mP-KRdxvdurG?uC=p65ixF&(=_Ej0#h< z$CoR5u-3o8iA{$)!tvMxJOrH-r%5jlZYf@NDmx*SHHB^f1Z)v_IBsg}vu!_GK5fZs z<6BK{>1@@;YP`h^jKaMX8y)SQ&VE1MU*k1g;vicBqY{=d`N%o1)y~6|6MhtYFNPnw zSxb!%gPA63RMnu;AIUs$S<#v)mFB&_Vn96S_;br^i>gqw{a6ZLL)g{3us9| z;9c!VEZd^#Vx<$mwka_>^BXL#guRLD>KiKsUSBe5M1WI%{yeT^rmepvDyy@fv)v-@ zS4P^Es95Iq8k1n64SpWNRL1|fqSN#+alBn2%Pe;uL8q2x93J$o7agCJFC0)KZ9p&Ecy)z6 zGw_Sqbf|-MbTq}Li|7N%+Ooh*nWn~%S+R@r#3$R z#q9no{d@d>A>y-lquke~DMr+f+_~}K;9>&|>NFlKSSWlQjX$BD?3pFbE%bVyN&A?) z)qkPl2Ynn+n=N&;p7+_UurwnsCt%y)e`-mf1BbfYS5{U=vU_jd!1J(Y^YtIji7})9 z2Fp7!2Gy`o3l3v4)y<7?i~$1D(5dOvPR>SCZPf&q`=qy=ohz_-bry3ZfKQJOFov z-;s~_M-C5*FLow+)@wjzmRtl;_vGq;^YrT6!wZ&>-F!_I5nR#H3z1KyHG~`dJK=_u zK7=A+mx?_MGI=$%v=-jWl82VYa9;uTXwR_+hh(=yJS0NYOx_7>zCh4(g06lkGh#bB xMLpUNl?vpecm&~1!AHs$wG-A-`ETx4rFx|Oqelpi21KDQUs97Rl)2{nzW{1aAIJaz literal 0 HcmV?d00001 diff --git a/docs/images/DeleteIncomeCommand_sequence_diagram.png b/docs/images/DeleteIncomeCommand_sequence_diagram.png deleted file mode 100644 index fb5084ce812d74e940186f565ff6d37b617e5914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89775 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

      >BD%Wz+EY499C)7%?T!4P+3$VZZmyxJ`J$Q% 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 literal 111016 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®Ij9zjXEL z)t_2guwO<5=2WBTs4DadMn0%l{7g(vwm0aF_8dA`+U+mkejsE7_H61QCU%i#S*INw zQe5-#o|D=Jp+m~`#$G;k^lI*~+>qJ2^#Q2%Vrw|mLr@#_c(sHNVOOVAV)Nc{!AeQ^ ztj9B7^li_ABhhg_7q4K-cl7$ovvY5+2t{@<6qUVon5o0O*RjXpH_QoACUTAl>)7?9 zW8=G$FE<1RGgd=^JCt$ag+wWwOL)C}9@Ho8ZB|Qm?s9+8l#DBkjmAGfb#BacNrmDH zEp0?zU$}&k-tWAEsXqCG2|L&Z0ZDZwq%NiOV{S7ooO=VGPvXFbJi=Ovoi~i=5{b99 zg}I>E(G};ZNCAFxetN?3V2hNEn=*Q<{YgBwCq8>(i>(H|odBng;@G^0F?9q}Ele#g zV;l#_)N@ev;IpZW=B2o;Kr`$LUuZqGlHz5h>OF;vnC5=y_)D}Xz5P*xEKC=+06}Z`1MnP2i2^&htg>I}gJFGZ*>rumA9rT?I7myY6 zOjGj@SxH8~nI;M|tJn$;=%2f>c?RpBCvj*{qDU%Y2?Ipw-a4=fY zLoehx ztix#qX(@7p2-5iWLe!ZM(>%iJsl;c`$TpR__wWB97Q)WCy~94^xh*2(EW;BE=?M|( zmgZw_4u2f;UG!;0YAP$O|MM!I1-QyPa3%ur^#;LsjVJg7Gw?>xgX| zS1d-rCNU4gw7}B#Mi_~InqsDsmMVi>GT}=i_mqk3euM+4AxI`y<^06eUx{j!uyACHCR{`}?j6DWD~&hZMJ_ zp;V^dIfeCu)u(hqMhFW7>niF72GT6!KkozYC=NxA;#j>UJUoB)_I~>D<5Y49GxhP! z>&etV=gW7hcnfTW(~}5pb=t<}<_5&;PrF7u;?vWs)9d&t^I?mB&m!K!5mizF{rU10 zjivqsA^eHX@&*6CO$6=0|3U@+N>_ym9;<)8o(Qr237z_S$ugvN+ zKP&zwt!rQ$k_Dyk`|~MEzcY{?E8sb>=Qm6Y^wRYqAy2t*0N+&fEckbJuC*=gSm=p`ct=m3d<;&Pei$>wI9$G?J?N2G zSuSs5|Le+eVLtYs_|HrZHvFsl0kyagEM`i8|5!}bW2C7C%uK2e@k3cC{dtVLoTQC* zX`6;NvY!%qA4D;1pR(l#9hypefYpbIM}(i`<~EVPLumrK{%QQ({nvB<_OCdtgT#gp zLB!H+H4@<|=>+206Q}jG_BgHrwOT7(UuVOLYVaD?_ykXRD(S^h)B(oHOOr%7hiCm1 z7HL`c_oDa^2=-s{mD~f54WK+RO6gnqCzI9S)NjkbiMoGf?uTxN8Wr_7k#2$e;L+0I zM9c>e!NtAEY1Fx66Nzegm)npPeZ1M>1xm!xaLE0cqlT(T{=WGG(ofO;ymT9aPbG#)Dwa4_PvKednI~5c^<$`FI^s z`Ug4u%iUqv#Z4~P!-tmD&ItLKWmm(sT}Pb9mLFqKmbtgjiED-xZ-IDU9fPjncKw5{ z`jg}qKS9WUg5tE!)FZh~YhV~@?@jyQ4>%`ea`00}=FPqLfd50@dq7orc5k1@m}u;I z6MKQEU_ro!T_Dj|uot8^8%h%uK?Ny^ubODYhyn^Kc0>-+n@BMRQ4vr;I$}gXr3DcX zj==oxgUS2mu8nl&Gbm7;LYbDrnE_r3SEuj|@EVwl~MUZ{HHS>9Z6#VMt~ zEWW~dM@%(oo|E_d@u3Bm^8V~Dsf$!ZwDdT4F0F8h>MbrTKHd6;ulb(P>qde6)eqq5$T7g}8p{QlYNL4@O_O1ty(AuDhb zr>%_4ixuxKog{qUsE5da>)sw{Q7|d2Q~!6oM)cYLh@d4 ztLP*(e&510%;zV2Zr(FTGAOZJsQmu=akivDsq2ZYCFwc2bjvf|9qB|O!bVO4mBGiN zlQhMzuS~a$3^wcSc8g;|=WE5EyL+tsNrb|b;e(DZ-a7RDO>Mh*`lRH2@2$}o9@11R z!hj7KL^ghEm!Cg>zCrB^?IGgVG7fe98k>x*wg)Gso941t4^MHU9#!m)PFg8{H)rmY zlB>2&h>>)_AM}oH<;8v}iA(Fc)bFwE-7sO`&7wfNDva!UA6hV%VP7Hk-|(vj4%}Zd zY=x@w@Z)e6ujR$|>>W3>+AoE2h9KYu^HAobyIlWXo)0m=s!nkSZ^_IRf{|m{8QjacKT|yy&g-{m$}@VVm<0> zUfbfIl%V9$x}dAr*uF)5HW%|==Iq^A7o=Mq#sic5lMux9A-(syN}HIL!5q(Sl9{vq zbL9)Vf-&Kf5ixv2dDc@MydJw($9)oy;aC32F(!fiJ$w4}($3j61&tX~`m%}1ohJBa zLjCC2!N=7W|ehl0nRBW0(STgh2e+i7zOpIMLs3DU( zWyztA6L?)44)rj3xoLE9B*qG~9ZyE8PjSGsh4v*>8G>cIeb-9+X z?>_>c-Ed^1M>9}1o_^!D~4n|1Q z^ZC~S`z>33KC}4t@UQ*`_c|_%G)!XQh_B%XVrGiv z9;|98{Latb_0!7{9{mKAKsTH-e6D-P0Wzg9iG1f9RAKxiprK`6ZcM#-*Nb#3%!)!& zKsQ}wgw%1iWanyP{Y`2bWC^N~eWc$%7Gc96jgwp~Y1%(;SmC#EJ0yaMBwBLg7eNP4 zG&^c9nR$p}hyNtkq2`bbTGRErkn)vv_#gmK4kLNB0^3#R=U#&to;$a%B+gzeC=4i{ z@jst_Baj9rw~&4{#~y@J#E((~RcbR zPt_1vHY{0kgol8f5|?B4iqzAy|JKMtqa(c}lAUGY1HSgi`1iST=jUY6RU-ZbpfH8&3h z?75K_d$b?5jHtbLCzM9_|AISKpbPPVW=!JiBO2XG+{H(ZTTb!>sF1^e(#=Db{&d$O zaT= z|AYG<{P!0*8VvhT(V968&F?eg-grz(K4>(k)Z9 zo?lA*(OIvd`GzC^miFWxQQXsLB1>DyX7X^nLXyjW4<9;oO_1(Qc8vHc86s|}!Qrl* zK+`Xeb!o7dO1+}VnQ`i7L^1IdH(BHsVSN!fWRu5>14?TADYq5>BfeU`kY6ZNS7LB9 z$f?nh&m`4(tQ!8G>b|R-;^#)nf9_$$?q_p9ml(u8xFmj?MJ+O)<&1^Y`}V6Ftf;U$ zjx1JBKKo02)y)xGL>1{%5CJQ!4&H|=4Ylb0@&nPs#Zz8;ddQd~eW457^H}-gr$2jn z>4-vCnEU%P%U_bW{a>L3{vXd!{+|@~9*&d0{$+yqG7%5s>L0kL6ur7B79(F44h^#Q z=>FYC3{5tV8#3+eiVaN78egaEmb`Pa?xaq;#qwa?^|OEopP<=`<39W_!y~%REMvl$ z&Ta~BO zge?4G&Dj6;vi^paJxpE9;#**U*sB1>vV} zL#9$V2b-izYnJl2{8NB#6}vrW5(@ZZ>Nfai>$-Yg)NJ%KRGI_QEB1W&Ya?BH0iq6P z_?gmqd~T?PK{f|%roIu0*o1-N*C-4l3T;Ca)jVe42dVZ!IiqsOq@EnQMO7IYE1B5j zt0Z$YHxJ;{sc4Z6$(X|hZrSojW)NYH7xJ9x5NcJCNBfMbn>TrWa`Lg%%Unq9fr8xJ zt7|4~NsG-+`Z43ze{P;VY{8&CbM2B>QTuF}#FjXhJD^+s! z%&(?=TF!4)mFdIOMn3Dng=Ld9g12aL*`j4Z_gcx!P>48Nqv_;qb+J&G=Oo>9 z%P*i@{Yx_bXY?JK+mbSFC%(L9_*lsT$TxP`D z+P-0vb6tE@%`gS*geMjU_mcRmQ}Lz^Ia$Xm@jb)&^a*Ai&Gwx!FBNtkT5wn0k6fg< zJ|o~?AL%ctCwv(<5=@AE*4o})AB2;v9YsK&!w%cZ;R)zR+gps?IN%eYE*<93qIYcZ z6=DqW8+AdD?jy5o(N~Kuh9;$Z-ActjLxsjr8k3RU-26jhuTz@6yUdv0INsWi;FHqm zAOVbavz1s+IJ-jq1NoGa4nd%KMG-(IES%+jr8ahZ_C&pOG%-No=$hFGk*`o- z@NyPYCeSmnm=gCg>Br+gpZHXJTZqX?)P-cG%K~$nC6OBQJ|qxOb=CoPabmn|h+C1f zC+gHyN`8aOb~6|Du{G84zExZ*us>e3c7T*!;vZ!UMc4%f<<2y>n<`s#eRGK!7 zkdGhH>1boCG7KyJZe47Mv@4$JV)^gr)lW(`J8&dN#CXB~y~fG$79Q1HjGnj|q9lXm zS`xmZIDB(jZfR)<@|GWvh~1*EMw9*`Rrr#G`1Y((17j?63_BAHR=~~!45W?a%s%Dp zi-spqTM&LwdE$>NZ>(DtyoFVId(RuMQnwx9);pfo5D`I+&$K&3KLlURM_Th9&KK^% zA-26t?oFXh2WQ3c&)>f=O?ERC;R2j_ZOoE$uO2&kn;AEV!WaL}vsxejTBwtaYNQDw z#LY{W?mpeC;vFFa3dPP!->@vjviYB;Mv9ToigBV%E?_&6mk)0p=#g6AvfN9a!gTXk zv|*n4$rX%Q zAW$-Mgr(VMG~^kFd<`(`#@GLI@xCtnY!#3dy$rNNm8%|*8wFfo|X0X z?KisWBaeQfq4gq(T7{m>DJ2*yAo96$ugb=qUBP};t$vONPi+j`lGHEafbJJu`u0TH z!iN3@5;8IXTpwHCrAnM5)}wZ0(7u<+R*Z|>ZagWi$HBV^Dk%czDay?f;JGAhwy18T zQ$c~qGQE^eq(wr*K0hxI4}>>I&q=~e^gK&r?231b<$X7UqLP<$Xu!VG zmK1yt1zMhxO%MGU)bs7d$?e4vq53M`N;>MkjoPQ;O?Esi?EmcNVp6xF)d0_+#)EAg z8eXQ}oIguqvl{5;uSD>!TWxJ*3}XL3dRJyb>WF;4G-6wUdX=B}a|VL=-l<$BGkdU3 zag~AU1@^|44f2+YWM)r3fQO%7g6h^WC!e5u4rbbj4!r`nn$)E$^;6R!b3otz^uvcZfxO6D@dJ-99_0%B zLr3}zXAD>~oQ^h_DIt6$^|>$Z{1!ho!*rdxf5uyZu$4#FRiWCUf$G_KwNN>4%*hAW z&3*b8EcI!Nz4K&uETMN`Zymo3!Le=5_Bp)qHH{=u=To#&13LngM_d!m_H^t;3?;S@ zKs9k8_dFxD>2dJ;QL}e`C#X|=u>9(0xK~oVZ>&lM{k$80ZS z)DJs-@A+cs>T||fo5J_WNj9;u^D_Ni&d29V!gfDa`XVf^H2ADF57uVXbVvOYtU`+n zL7L@=F=vh>m%!&Q>>ktDvVcQ{4{_=tyzs|6_L9yoxr8g0N2og@r*x?jgTd4*8I17E09T8w?Ac&PaJm zJa!xRO|U!~{`iI-)oG=)o=VcBkaHam#-1ox6x!;#eBD2Jbm@-h!AG}QSbR4?^Zi%L z+vFif@6}{^HRi*)57EbF)281q1dSFjP-I!`QG0GFupjxYx5m6U8U9jw*)<*W^%~TM z_O;%$2_u`$o-rJjgJiKiPOCNSD@j^BWoXoiGH51V8gu7b4`67=#+55p6u9)^GFe8q zRI)60XoHqGoud|_oDy%;^SK&b`m-wz7uu)vpgE@BAdX}w|FZVFy-wW(%}@M72UgG_ zv!~C3rebTm0>Mo9whu<}VY(`Bz}H9_*VBCy33cfbK5)3f9+NDMmDr*1i5BoTF(;Cn z@{F5X975;JoJj{?r2EuMrFZtPXD>n^R8JaqSWum85QEpbFi$~RpD;B!ptXUSU2rLM zFz{|D`)S3vdo`jRDfv#`?zcHyR1e9kVAY8`vDhh==Wmz&pVM@qcSWvkzzC=-R?WM$a1qjs3d=T!^`?XH6QNQuB z-1fEcp{VT|w=KT!&`)mj2E^mM6+1(=Pu(|%XHxUob2eABW3^ssyu*^oNgpnk-pWqe zF3(M!5-74RGD}#;)9^l}E6Ac00Sq^hD8j;~N!-&3B&_b}&Yd4`eY-%ul zr2vwl@hmo+FYcN|bx7yruO(rY_|z7bK^}~*Y5(PyUyjzhU`{h%LDmF|ZHVnQ9jLUC zgB9FA?vlAAm)U2RVBDKrwTii-euiRJ4^;=BYUKRe`w_&fpKI+g|P62>#0ov*6@HB-;bK~XOnPOP! zWakWXtb@0Zzzb&BkXOopFDGB2CnzRExhfJU*#kZ zj|x$38Jw!j)QH>PcwMQ=qK*khvC_gX`$YTCyO*&p=ymMr_(Qi3^|&9*S-fb#{J%V4 zB<-Q1WLNMl`m6YvZ5uo?te5Iu#fVMeuRnNvM~qPSHP-u=)sCqm9rtuqJ$UzG`Ms|x zRN4lW38p9>moBatx(T|g=|$jM!8sy8T=}4%ku>D!c!d*_hYyh7_w+?1YhmMv?lKpf zvuWVu1>G-_dn*i77&a`t7WK)j%*O>6E;Fjh&T2>Hy`(YMF+L&c9i1 zy9Y6K*x`+n72`|ByfE?hY4^5lG=dCIX%AlVUIZ3cUkq!SUQFnOI5b}&%d{!+>&Egq z`~JE(YWbx#ae;G0XG9VfE>a+=jwlf4VHLM+z#nLuw?mZ^8jeIILu9SRwRtE!YZsUj zV^Q2I>xg5-H3V*1jLNRMg7AACZXi5#P}<1vG|+okIo-ei@tS&-`n5S_3l64VTJu2R zV;y)sOg4pmFS?~go_uvCXm@jsAq9vHvm9$oKezqr;g;QZTR_n(8e3r%))pEI7Mg-f z%~W_og)SkK#L}7)+U##R_inq&V$QGccQ4H05oslSN0M!_B8q*8_>Jr4E0{l>_M7~~ zENn;SmG*c`Xui$lL-Dlc2=3yrqg%4ob^O=AM4WZ)qdC5MSOzwGoDNoL4!Fy3cLi~p z`P0=+Z^vu5{-RW6TeD@_{w(bS@)Fn}VCZpf+K4XRM0m^hkv;6y1pQBA-oD}ek5IEf zP|&<#-RsZ-4iV|H6`%#wHeL19g?`&o8}Oa;JwH9U)TGa#7jDSMs4)wduQK{V%gX5@ zghWj*%btgE$e6*+1oTJquxsb=lr~5UgAZgG^~ksWrf-j0lWi4;s4xjRJ{2iM%6Yr5 zaj=KFx7)}Z(RYcg`|NeY!5FTaHYnIOHopIOzzyzm!iN??IW1^`^_BWD=7|Go+@RuF z8XB`-o=py{0yVE0Fb!5hak_+|_D2X4-w2n%A)yQ5iE zg2iOzCu$!Sl0Z)a1Kf(%9x$Gew=7Ncm;U%>_3OwitsDgH5cRH?LR_}Wdh2a@%rX6q z%bYoRk4n8eWZ6%jhFi>c@crPJP&#+l%YUP6C&}LIE|F&j9`SBiBTQdk{jJ1eVxF7n zCnlonhT4xyv<_Vh4b8f6JiWgA%?2b(9?aQQFIY>7eeikw_DouVr*vN)s#+4%FF1ExUJ z@A?W;Wi*=Jw6jvjp)DEI_7vdsK1JOwhEt_ofp~-0Cy2t_q9Y3~ZPg4AeDRY@w-YL& zlNL!@z7&la`Io_X$Uy{f>+HQjy710#HI0o66*^}f!TX0T{VY5CG60O&^5lT*!0T4a zynt8R+t-n0Q0AMc4-V=+Q{|tV8n&t=$<-Kt;?ybuF@rv`;`tU3bxR*eDLs2a-KBaS z1jb5d*yTh7%~CeuGQq?mc`hHWxABP_39-RF#nwHN3>#P;CQ4G07Saidsn&M4G-)`0 zZaXs=VYmQIV23`kjD#TS!`z2svF|clwTvx zTGP_!1A#Rn-wY%C3GLy9)z@ZMDa2m*vm~GM$jt{heXDkGeAX^n-;giy zT|*|uC#2W*q^UapSxJc$7B07b$a@ zZcx=Gmn6_7;%HD((sMUYxJA)rC;*xrqI&-fMz~?j$++0$r4qegTSFvy-q*Cw($Z6S zH<23=Hb>;7yfN9iTrvT2B2*t^{w2uVkatzR zY30Iy$m6UnZxakxdKd(m+}zU~@l8-5CIn>7Yn#pKt7-Fi8V$<^XZj7mQLHP-PfmQG zP-OH8H&|S-#YF!1*_j!qK%xtmYpKUtY#sE0n+sX`GMxzltju$&**P#9=|*bR=BX>W zg7wSQ=j?|v4VDcI5R{l`%2I&@0{F-A1BgJsLG)Pxyp#mv0UzAxjt$+X44D4n({ivl z9^tb+Dv4#RG{;jdW_(FN$NTX*yB{mq5ajtJ#KxF3oc@>^`vQx3KF_EsYL=y57u?#c(sot1aVehVcP*Z*{c_&U z7amG)4i3-?J7FlM&*p1YHnxsDbmtJnIk96gJ8q6RMQ>cJ9u!i(iB-iVFUvNGbbHA> z8$G&5JLdTw*dU}+(batHAK0LsUbt=BNvrNb;$bgY~ z*%d}CBJJ+&6O6}`C_K1y0iuI|LP9cc$SQ{w{`}~obvB1bdPE;op3sHwODqmLGq+JW zNV;7pJb+tOylb|OAsu;EP{1+{q#{vI_%KcfP~|Gi{!tRkN+~0APh{KqY5>agqkEO7 zH%bflq3mT6GMC_=w}$(iKbSVXkRx$f#wm5TLUb;y?Y*uDpz>FfyK?+hW9>2=3 z)Hv&?-Dr{dvf0eQr{@h`4h989f3!|fVlxp(Wvom$JMVDFC6nd|m3?rPy@WT^V8gL9C%o|acW zJWGTvmZGRGbt1o*jo`ycgiBv@H*k$t z1qqMK8)g?}BtQSSDSrX(((wC32rS)u_CK9ypW$U}TWP@dA615mg0V?xMASvEAS;Dp z*{6(p1r)n|ivGiqtNwR!t=Z1Wv4^k;3np+2 z{h)y^!VZ#bLYN|>!8UT!r2LWKvE8e zBJsn^W1@~1h<+U48b`ZuofT;#X|ygQ3SX5>Qdc-J@79q1N1hcGk#uZ}EhODT9`lpS zV;Fxrex=hhZfC{w2N4%c0gePp-nA25?wcXDz+h=)KEAbEv$kED9a5f`wY#JGP!Y9q znnTp4p~Hs7Czwx=v^*XF!_?Ax)aMe_RHHJ#CTTa@na?uaU#*w;4{Eiy`?IQ>MdFM4 zhPNPcZ4D>fYbH!1S9!}r63UTdj?bpdnGImNzJ}`z=aLffk8nJJG2x|gzk&a zjLw|W_dMf^&!0bE6z>q|T2kFK*R1;u&42PB50}jUy`b`K_9=iRfL{(iaLVYU3YW`} zb=W^7Req)8VL;xxnf0%fw+(<2U0*xRIk!1ROCqbw(rrSO1u*lg(UEQz{}Pb>-(UZ8 z6dfD9SB&G^X4L)L^c3h+*o^AoF??*mErr&B;+@w_x@E*QwBRrOOq_Jlv9Zg&1nszI zPgH;A)lc${6SNRLzV5o4hTEn%mxxiuGzd=MDCM9WlDo^D7iLN@mp>9KO-fdeL;ZK0jk$sNqCw;7dv z+kqah5SkuKT~v&oLiy`o2AR(D&!DXqI`=-igug?qFeq)OHsgQ*P1Oq3Pc9V~H|cgW z7eF?&SAQ27CO=0*CNb~Cm(`NiJx%gA7wry-)Diwi*hCcmqqN;h+%##kP#75bK%=wOK0tE>>Fy9c)O->AnOqhM$R{@=U*Zll6~ki z`OcbCXJ^{5db2?Xm{2s{_n7us)mJ&PBL{9fzsiaJ@qo~$SWHLXgUCgdDGnQUvaEh`@s;uT?{>8py_6^w*h$6p zBx9_{4K?mTT2nAapKh=LZBSjm=yV#Yys09kDV*>9rO1?67OVjvgd z!PP>gmb%IL#g9GpJ~l>M=08pjG*PemkXVDo9}sAeu9uacAR`=FFvxuzIXdTz=eGHs zd-vBhal8qyJgypDSX#Y9knZk}BQWF7f$GuTXrvS1#T=3#5QDV(8p|KFlml*gAFyth z>b>jxFpvPo*NrdO%v$LMoCMpVVgZh?e7V%o_Cu7C`gh8 zLsc|MDV5q2K7!H3NIN;W4XGsPgZjdvfs(s98KKo$Y7Z_Nj*1S8S8y+HCnVH%E30T8 zhBER*8r3Jr&_$dmmxNnPA06PeI)9lKywNA7+S>1ezUc~Yb>YJ#20ejNrbcc~^GulA z@~$F%I$n@B+uN{XI=`QT)@Q!Gg@pzGap7z$$4TvG(L{sDGQWIwC)vPsYK$}c-(2$* zr=cb3(6zJV+K)?aI|i$EpuAR;A;EuiE4oB$l4(7M+MYi)ChoAe-&+DH=#Lfi6#`oM zdmcV0bb6glP{6Z~XDZEXcJ$>UtP8VR@OwEM4+po@a%$)M)twsRGS5QXkez9AIOCo) zsEps6q`>Ino%4_Ao4YzzUh_5cYpqMDuPLv;)0p`fkjb*+O+d%Pj`Mz?lBeTzgWC82qwtff z9|n$?7_iCl!+wduS8T3 z@+19x>j5p{OORv53PDSc@wQ&cUduWy9gM~#Bc*oXI@oS=JeZi06@J>yQ*C^H z7<2N*zD#O!6$N4MP(Fv;ubLVqrbT)-!PckgVLPSsr{c&hbj<{6kVE(W+)%rBbLuz8 zQZ?qxv6}pbEG_zV#{$e*qFZ*tMSucFAKO5~N3OP7*I-juGsHJtYyyycJ|TeunV{aU zB6+FH!56EuhoC3P75d6Sw#^T~A)}dRT6M|__imM zlwiJvo#XV20ySi^0tgixscd47B1jk%aE^&%*h!NNS7~{RxVdbMoJD}WM7I$shkch_ z1Iyf)9OJXj_}3XrQSFJYdCe924={)U-LZA))Bjb5;ty`{ua$Ke0GKT#^|^scY2Suw zB<#&7ak%pI2K%@x(WlXBw(rj`YKx+m!wyMp**}Z0K=KUf4g{SR(M2q!&A?Jko_%-o z8fPYBsH>Z-(|y#MH4SAA*h(*^*xXvRVffGedmP-FM&sA?D}$fuV$gi*0-z!0`z~kl zjp?&?;bU<{L=_j0XIXiSLvDP_^FkM$%@H)(CL9m--1#4XFPw_F&|_ssj}p5E(^fr zV(zAXL*031)bUt9CiT5%u=_WsIcx(_9=X1IIQ}+nzA%9}!n-=fDi?&S%MW8VrVT%l zM#Y3EJL$!Djbl&DkGQ-KcdYd?8M%I;%WAc>u5!ONL8I(rx2kIxYXS)XVZrKJs_6FN zlIauxiJc!4Om+l(%BoPlK;Yy>`2w)c9F!V!K?I7tUGFAx-$WiINk^WOa@c#Rl28H( zd<+Al(@LVShk_99`_w4Y;`OHPk9^8LR?cdEhZ^vQVp?D?FmFLn9YgV%!UCs!20P~XWKjU ze15HPYn0Gs!v9J0*fnLSNnUg(T;OGX=SM?r+&Cb@NINzjXt3*G6X;JDdUsQEAuU;Q zM`-*vsT={K#1S|4R;%>d@31X2w6t!KLwsu6i|l~ZL{GQijA&!C#Du_{v_w#za2xVA zwRd(dYM2hUF-FO|pSp46&o@(r(i|5xbrBnJ9RQT@ENi^h_SiD=_Rc?l(!4j8t~W7l z((s{W6CMOc5|!6;f8|wy&oRvx5?h13Z@n2chslF^PxNR_3l1*gnMSwB&dv*i8VlmA zF>Tr=#pPJkq!=z=eheihC)gI$5x@l8CC%3K6GXP{S)ONPf|Yx33c+S@V&*bj z-(4hAPcAKR`BJB>K5(;|;!O9>D+#;6pM9ML z6=LA1?|k6cLYLYo+Iazg#rEhOviju^yk>eu2ra4?2t%M)%q&*{K5W)|z|L*L1K9=_ zjb<+);xJqrkiNCHf@zkaLLN*wzfFIbqzU9%(<3Qc>&nyZsb|%3 zG?XLj`o8&fKmRFuuq{4<)uw*726FN#Euu9eYWX8rE10YMd9wXcl)&bLpCy)o4siyiU#>25CbN_+(a zmCTZZQNVCuZrcOE;czOsiEl*la?gy?5p0`cvq$yJe)Du6aZK~xGPap$m6GxbPZFYS z8yU?WY=}6Gk*jZ8tZJ+3D6M7z|bRuLA>L;#BfCZZ0Hj_PbDvQfdh-0ul0`{wj$(s1%**)r> zGba_olo&foDMz8;*)6={{Y14pukuS0^OCeqS^TJV*0OJ#$04x^Aw+IgxT@H}5%e9q$?*tdrxQved$ z(GMC;t!s68W*{pwxxMG1!YhR?(EGx^m%U7r4ir9p&NA#CNKe4@eN|-c^r#{ljPnlD zL!pLK`RYrs{(J?A_f_bYdM1zTMhlj7sY60(y4m77@^rCw+}f+n=kR1b5j#E%+j^`KvhX>iv%uzl(8OEiDJjc7AnoiH5v6HU|2- zK=T2_r8N)#3li0~#bDg2Ajb**)7(^7qxuv*`R|`+JT4lK z?LfKM>RMSxb8NHLYNqjp=fdl1g#^i$$8n(;FX@R_c;4t2 z3Udhz1nsD;>4SZG%G?F>l)5A>Y4LY6ep@|j<~yr7U8sk2H81)?3&IwvsJJ6Q#@3^L z_q#X!ZsG#1(t-!0D)x<&2M?|PZoBgz=`BC|{|}Az|3Sg@K;=8{e8`=#CBetibk6tFY2|;r73Rm5Lm_Gw=rx!QX9zx%uRP zEPZe08BNU5_?vwtP74x@DSS z^%R?TCUtwY)V-Gp)((NUslKB$IS0MBAnfBP@vLo^Smu(jjpA{xc}nOyy;MnW{@BZ$ zXrQaK4n52HH)KqRfO1n7q%JhldG)-(DfdzM3~9f3k4R}f>ZRYF*w)ztd%t;ba_rVQ zPTRLX$V?NA*!TEs2LUz+n+gg%8`lK+TiSlf4zwNKYjHtAtR7d6G}yk z>a9)Taa*1XK>Xoqw=uppZ?q2vdpGK5Z&TiT>I4ERfV9G0IU0Z$^v!Dyl#oGF<52Bu zQlGxsEWf~;9<-n=x^*eXh{e9?f~+XKs}3!oIqn(5CDJr)o@Nc%k;Ychz+*xxK;{EQ zh_q$m*%fnrdPa&gZ!RY3PIVDom(JB?#n49aq@Xx6+DqPL2Ffd!?D#IUZH-nmxYj>b#VhcKhAF1 z$304a3d@JXmrm3~V<$#cTJ7FVmba9TAkIz7yRoy>XH^-y!h>6)K62PF!(9RC8zw61 zAN`Zm)=9?I>QuCTz(&LCDkaPkMLn&Kgk;&gv|aC}%J0zLBZOX63^s*imp4Muz%9r6 zDXQfWiLOXjM0we_2Ms0a2yv_LK7sDd3-io$BGcUk#RmHv1*P-C&x?7$*Qh&9AJ3yP zO%J~5$-)6av9YnL{dJrad9*M+^-$F@HoVWiVBE#GmTjJ|kWUkZa}S^lmJ@_6-b-1B zC&H=)W{~p}z+incIw;e;BFQQoI6Va+hTb@D=2~KO---P5q!KFcYgO8QTBIRzJ(sk~rPWWJ*0UCKML8;FMNVzj|Foum14i!-TgE*TAqx#y@|Q zMh14QvYd|#4vC6(ZcLX7hkyRQ)Ivuh;J^g|9f z19`d()>qbh&a1ECLD5!3-h)q^4Hv+|U()|H1pO-%l7bR|fqciezbkfrSVHB+?wUxz ze0-dQ8+#c~&1|1Xt^5ZJ*Iy08(VH+kL`P67+fDSctCp48X~lHRdkU`HaGQm}rG)=` zYU@z3Dm@b91*ve@JbLg~hZ9uZ$}M970-XB(p#_iHYs-)fxy55-32|X_*3A1{y7t+lK*59janf1;)hsKjG73jE ztLB5f8huxuzAER^4)CDq%Otqb2h9sr=o$ zIey(<{}WY{kIy&f>cRC*)8u)RBx#AL%yCK@neNN4qA`X?p*zrzIqR7XZO~&K?j+&C zr-b2i$a1rEmBSgw*Ln%>zUF2p*#}m~%kA4TmYtb5VZOGfsD-j?-g$eMWF#$gfW}o2 z`HTQ^wXjAqEBNSul*IKR2X3Dmb3T>idHC_7R?Cj;Q$DSc zHX$aB!jz(|qx)ChNB4TGdN)>OW=3wpUP0KXobRJwRJAN*rlRqpM~B2*qvlTv&z*ba zz)Z=Gy@j?Ox+>8(4SRYUEQ)fM#kw2s?BVP9QAmV~Yhz9bmt)Ts{c;>5gOr35-JoNp z4zfgJjs;SGK?&W1D>LhnZ;Go81M+qhMr?i70PUepU+a85DkIN&ys7l^Dn)!E{2c8k34$y<3gH$iSSU1^fnrt#Xw^>e*btf3T3NYy(qRmQV{{uz!z|y* zISd{NEkmMVo8={d11|Ftq?~;iR!lpq8*UI)e4rt9i0914EW_jR2QzRztO+(spLe@- zhrlC}lglo&Pn$pg&a3?nEhqfai_C2(q`Pay0%O@B`W~k=bmMxR5(wjcZ zDE=?nZ+IOzaj7imNoK`HzvuY<3z;D74ZXxI<2;&Zy9ulX5SS7K znCB#7Q?Q-$WvVdoGwnH9LDWPvjC@xOPpkStvfd8P(Md;ZVWx5ZdYXJ_4Cpk;u5sJb zaycs=at6+`hFZ5Ya#ppuY2S{|+R`DtyUb4Q(@|d6A7{A&4Tip6V|qkWHFuXVN_i>* zqq)K-9z>y4UPG&$Xx2miT*lt(qLA@~ubd!&&%84F)I;V;guaZftbYnC;P1o+s%@^2 zlVNuAhOWDpsMUa-W?%#h8o(^dOKg#XFCOvMF(#(mEIB;e{OfPvsi@cN7P&0y7MEN% zGeF&EuWDXR5j7C)jCz?9qepon@Y3e)zDGeW>@8@t(e~jdz+>v;=j=_6;xKiYd0xYR zL{)uj%xMf;f;dT0$_R#rQkTmt%e8Dnz@&^cF$XXG-L7$`cKz|9u@yY1y$lsy|AO|+ zvb}qDjAU{^_|++`LsJqfTVyt)a7_HXb%121mT1uRi!Dxkoiq=kRD&~oB{B^W+6o;j z73<%=&8E%d$gm8-M1!^_JajfID%d1nAk>RX&;_6YH5)lqEjMsRj&0CvsTP_Ep^}7$ z$OixuNK^PDCe!%QM+1s#!pl_-JC`uwYYwL^y8f;_ip=%-jZ8<5kk zH#W|R-xWV6xy$6EjRjs~!i1O|q9MID&S+IYx~qDhit^T}(6*QKZEOrruZU>e1qS?) z;p)0_nYX$u{^SYyHaCd>#~jJvXw$&u*(G#~R|^a6St+`g);vM~tvCP7 z0NcT^I7TQ3FwBf}2yelN!e|47E{oN%ipwLH+g#7F5*dTFOKvxtjKvS#C4(*fu5+GN z-;_>4jM%GnfPufTo8Flv==XQ|OQkosDxb3QbFPifpODlo#TDp0x45|aK^l21^t-3q zPrn=?xo9a?rQ*jIJ)2dA?JbA$_C&j*Tw7SiSuDbW;=T|R>@;Uw$O9x%U;pyjyraTg zGy-^BkeP)CqW>cy-)?di-9`6SU-z{z4Zi)#V%%uS#c>^3ovqqlSA{j1bl(B7JH?}h zx{!;hoQ0uy1CA!%089`r_1i;3%%0$@i{~2!4kj`ljyIE%%(&F{hjl-BpE!YGP-jze zhcD?GIGN3;!4iv8&TO|P2w3^p9^FwADxtROf+Bl zluveg9M6hwTTZPrALCHsY~Dsmf#kvX;Cqdb=LeB@bas?=y3j~p>ecb5V#oIo?$9Wk zKXvTrsP8oMdVf!`V-4b;snZj>N%z0fwkU@;Ay0!P)-Shd%g%EA?_rt=P2Xw=O`_n+ za%+y78O&!{7M9cNq*q()W6QqVvNEudDD@2Ay}u zjJy4>Bid2so#Jj1S^xR9@PGV(tt;ipxwz4Hf(u9BQPoCRteNd3PZ-x$8+Z3uBtEz> zH4E$ARmnWu^6oV8Xe{!pTM7{47 z>^De_)aGSQvz6p^=c>cGYL5*Ca-!2kDnF;Jwka#ulaEkZ0CukV_A8q3YcH)a*zj2N zlB!tVJ^Z?rd?VWZJ7;ONzWS#9MNjPs^D-qG9>+aD_LRE*=(teZg{PhzBu3keTbFd+Y=g$2>5;tBruB0gt;f_N=V698{JyAvk z`D0IoCv?m(79QoE0?-XJEto~g(t-XIOXk0CRB#4NBMdckvXT02Xij^|l%erC8jfx6 zt>R50Cl+JIJN!7WxSg^~5a(pnb3lbOH#Xjtg>QOJmtEvDHj~CxM>}RhO;oZ%&gM0; zzI%bmgTTx)0>92(9ByE;^RHI8Fqb-LXUy%8^_PtJf{m|8LX`3u+;P@jO*hkH`PI?e zRtqK$ZZdd)B5L~mP#^dJgF?4OpS0}h1ORR9RNERkn!Siyzwu1T9Xd)nf(Bjv;UJd@ zf~r2(!Z!6B(p&75^QpGfk0p0ejj_JMo9>iSSKcH$ATj7I@BgGEGU->oGu$yNPk%0B z`AOYB9C5dh3{N@yLr3?#p6HT2zF?3CKsC?-hZo;SJZY!0_4VcllH%;}f4BwQQW+Z( zE2qVWHRgR~S35@ts1T)7-w!+dXTdR;&lCv3@$vCeMfx>zCx;LWCKLzsI0%O&Iaub3 z`jlZ_;^d&OMfsEGg`3r7$QnA$jRvciXLY-wCU2{FxQP08P|pB0sFyb#f5rsuw@#0y zA4R8I%Cch}6orOdOM+$NY8zgW+Rc&-e-VtGXVQvelF+)~quhb=oNwC-}d z5XHvU1As~G<@_p2yMpQCiDdO{`>~uWyP&pd=;1DX zKU1g<-b)z=J8PK0DO=1qEyO6I$%UCrML)c@dS|zb)~wjJ??q}a7<#|_@W?YuGp69( zCULmP)u1_$25!d0#2l6NR@<^?k1k;!-k+xyg(05x}XOaKon;fqZE11 zr%ABE)l86R%N^IR&-p1mxtmyqlNN%)zIZMpZuvZ`8{qz-d-o@jnFEOfZb-GlHq!X# zDao)1$Ee>2-c_zvXcT%nuzS~!0O=1>!F?S6M~js^n4D=Ziavcwu!n~4!Wj0u(q~6}!FNGw&Mhwxj#E>yDgMRv4;?x=bfqq`=Kv)xu-8ru!Ia zt4It6cD42-wln1j7}?Z%+LcZ+wuihc7mOdWoI;?iL&#cSC?ooT2MH?O?9pWM8fCdALeOH$(a1)75a0`2qK=3js=^2=q-a%=$c~ za-o)Kd*i7t2wh^kMIaG5RP8rruXG=sEGw-Sv`=!+xt@R)WKDt6c1o8T*W(U+8`=|8ykmgn>Pl7h6 z*4o3Oe00FAj@FYrXub*x{)-}snm)V6qq^NEz2d#la^f1UM^(J}wd}BEzxc} zi8)Q=>*&e>Vbm`)_%=Z5#fo3ec#|Fa5)d3T%i*)u%9o~as*%=XenV^&%T2qdSbk3|8%H9XcPL}7 z1sOaIFclp^un&?yY2;2am4(=5fgTp zX&XWo5|C9b(lm_(sh`sM`TKF^q}}m-SGz;f@{LU?%=>La4|fqT1o{BoqqsQT?R!bs zf-csaWM?wl&%;rS))d*LlF!P|Jf3~qPR@(nWe&{(mr_iBUbiH7CU!KscVw~g{VO}Vsoomix@W3L6_5{y*hh|YYxFOB z%>c&Xqecl)CLMZucC|)F!3d_5p83wkXoPY@gw&wO&tft{E&viUnB6=N? z6cy5=Fe_ABE{4-bSMrl0LH)#$gd~c1YTdPU51-!BRRJIdnS`ym^DZ8SG5%S@YcL_9 zuo2P$3TjwUNXZRlILW{q5a2WNDPC|ZGjwT)Uj#XZ94tUdE%-Jt8>z?n*1))@tn<~Y zSC@A^t}Ult7Wl7=6Um|1)ul?C6p3OaO5745pSt4O6(5q1mVGV>j=s?NW&si9{Pe2( zq7i?RCCPS-&JuslBwU{k+n) zI`63Mb*8Hq>5Kazu|6(9;!V5&x3@XsX94npe92jjcDz@YFbkig_X6z&<%7WFXkrsz zs}kNLLDtqL-)N%ENi9vPGtzF!;>9A)lSV*fL~#m4?($oVu1aBQ6nPz!9fUriIlR>s z=EsShwnHU*i=GMA30pV3wc@75R+1T&i zZ%Wj(Pj}7tUS=g+gOi6#^tOk*$~gpi2KzVK!t*wXRSUTk?2T^CSVe?G`lP2|&y*C@ z;hqELkA!Rrtwi*fsd0qalP>8p=XF${P3al+U7iraz>E+l`Z(udwFs)_g3{e>s@}_J zy|Ws%0WZVnbRB>b=m&B0 zm6d?H+)v@RlV0(t$CePS0SfcC4_LG0%37Dg2;fg(t;brk|{>Jwk~0)kDU4_HBldrOM$y#x@`t&)@~yz z0K|E~iJs-0QV<&z9!FblHk>}>YT?;|s9*M;i!E_FhSu8iWe#sAP(RN?v)_qrSE7&?>jp) zx~%|2r`$+SQQ+foig+gS=CsWI$P3`=A0GCLuIM;am#2*z>W-n4e8-C z*vpu*r2AM!ZHhgL!*sf5>Z5yNCZTeMdc*dLqWG!Iw7$D5@!C5Xu;xT7r(c#%8V^V& z{MS9D-y~qDw4R+4e1oC0h1n zNoqQR0YBJoTZU9_jVhVcg`W!rTwm-Lwx$iH_h>aBBNIl50H-9{RxfK}TDvzH$JiRacQ(iUB}CyHNl52`w+;LBbeH=1I}CoL-RMw! z!tMQ7or*acBm3*0TN|T$H^M8n%+2_d^)w3a8+4ZV{$b3Yamf|U@wyy_;;TexW5UE# zOr6~|Q5xg)b%e>I@|>P-v}2KSmOH20#SRxU#n5Z2n?eckQld*rBqEDIt?B%BqE0rk<<;zb zXS>>jnBjRdDx24;cni@pt<)l!reWmN!G0Tevt@2-j*vu0n!U4vSHjX))?v3gt*wR= z@3bl!xk=hon_d=^W=t3Fmtuad!AQc}~L zCuXzZZz5baXCCj8f2$_6gPp>J6NeGq=uc*tfFQ(DP;CLjiwR!x(OSZQul=2GG6mYC zgy*{%dzDrWT(*V|*|<|r(X3qjVaz2^T?%7T#QpfC$fr9A7ONPpwg*7^?DdHdbny0& z&h_M;o_nF+NIB*v4r3&`r8}6YA(&l+)wPskY(nPaIoawdoTI^1Sp?^DkY;0- z9vP24O<7H(S5jGHEfyG)-saqn1>m0AB1EWOS4pmm(nwI+Rpt3&O15azuho4z6M2t5TvK%s6;lenj{Z4}v@VPyDi%i}i&=gXwv> zwJzX>^^mtd-z=QrV8>b)zBD(rLWcd^=ul67C>j^v^|l=to#`&AOXL?|@$02a!rp*( zME@f8EC(AGWC zQ+223-!{3mp~XsGpNwsR8%h$kX2K5*{lp&e*dXk3Zp^Vc8wG#xCfKL9zFC(f$2??V zcNAB!^fD96++-o`MMf{XlzH-C=Hd6LF)#Y+Wc%Qgr^c_2=={oK#$zTM}q%*4+~>iYdN@PYsP zznISCF$j_eduIJi|HR2v8!M=_IagrEs8D^IGG=QYTJfBR2-y;Uhe}sa@>U~7chYx$4#Q# zcoYcrHZ$;;tMaLbewtZE><__)1`cxnc%t)USFKU--bAz&!=gxmIgzNra_63&QBRy> z+Y+}w4V7RMAYjJ+g!w}r!;S5?g`egOGdj zBk)C%TpKv{?26}2E5dANCP;^g89cx^RL+yyauH1H&h%HCmo-;i2PLv}U+JMtQ)y_t z-STT*%>27tWmH8$qFjF|+p)5RX@W4hZ4%DSmb!#6`V8b$41^)k#$F~J_ak!f@;mE- zqF!lsyJ0)MDu+9Vqte#9FsWjy6)L%&Dtez7h~`JXbc zykV(dMxs0f-?5#zZ1-gG)Gel40Mx6FA!g7NJ#FR3&0)m(&p4+BM#^% zD!kzZJX>A0dyc3TNWDE9p^`#@r!j6lIdG_47tJcbozQ3g-qCq8Fy__j{OFK~WfwJ7 zb9=`5LF?ehvS~44R`l0)Q1Z{PW+3UmmSA)bnFNsJN)~aR1bg;NEOa@Qh1H+t(qj4i z4X1?jR>JyaT_LWVo<*)pvtetAK1)Ht>$s|};XvZbnpgbV)jnKFUB>y=@?lo5l*Nw& zkG;W91{(zLN%}RHb-S8LT?Mrr%5=ctf<-EmwC+t2^AXe9)yLnjsBEG92Yb?0srY%$ zz}|B#gVkE%QMDN_>-9z=nX+2vhwpWn;0KK)t;ww^*j#X7MVGwV%S9gB{kvh=V9~9s zilOo$DWcYdaExC2JHukqZ7K>I_{8gYpa)x`4?yZGQUyhY9WHpSBNd= z_q&R_N&XX`axep^akBDH4p(0@XC09ZBMTLFSnbno5oL1^QG2_BDS!4633?oSTmkVTi0NH-S zNGJW_Frdg2&dESh|66-k8r9^v zt)raQIvW*4QK)gOfPjoDgdR^&t5U5kLjeVeg3L2AC$>i$8QWt;1SJgM>jM28e(W!#v#Qjo#jK)?MevS?k_&`@{TUt&n{AzW3el-p}6q*?Xf@3Qd)7 zLzegdg-ptm*cS)#x`X9o6#Ibhe?SK_<%vMb;vwVNIJ-{xvbfU zeRimdvVbV{HQo};%od!PP4Vd*eO7I+Y1n(}>zK0C2X-GV9=^X-Cvne?B39*}kIZvf z$cZ(wJ~^{td;Iiw2fY(rRmVp5U74$LfO#fK;ivnL)z+V`P5Gn4wtxlq_eWd%By6_Z z^T+wCH`w?zEXi56IPm)+wPzXh>8wrSQ(R3G)gx=J4f%0L#eRdu&!(Ti#VOE2G+2sx z%uxtl^MgadG*J;LD=Tx3-dTy*f{vcvN-7l$rOz7a;6is}6s!;68UK>^@bIt{KyI&< zm6d-$K-JQSSKr?BV1YHAY1D)%QhYk#Pbr5}h*QU4yae_Th{9iHS3COnWM}`!G1D1I zX0C#zGkyA6&1J1>NKf=)c)oNXzi7j$J1O>(Q*p zE*4xp{XNZSM^Z8L9puL?p?bQkF&6OiJp(fz)vxl3C?rAh=dsL z-Y;XQQP{_*M1;D$Kajv_OW^?>X4^fIMev#!M^Yl1!y&aeR4N#Bic~70RjUjkKx-~e zi-_%ydKw^8SD}w}eS5R*$AOO0VrhM|{U<)t9vcfh+LWmF+bdC^18jn;KtCIf&mP_~cyL+qM`spN-!sxA{n^jl5h zf|yvT)9@rZU#)^)@AIa&L3!=kXv}!rhki$irp?9m6V6TI=RHje{Gi6OTIYLL+yn=r z!9R~NePvH`IWkgS6FZx$Q#hTPCz}MBPwvgMI!RD{GR_%$o$sn5v&iSAeV37kO3Ixy z$Er(fn$za-dc?OQj$hV_&kU@|#to^&UXN&dhz5%mvti>Ffum@Rx;SnWXI7oRP?#|O z<_zi>vI9(u(~oSe1krE}H~jg-A1pcxri`D6+b70bdX>El$}beu$+9t)d4@}{`8l!l%;bm&lJcei8XH`3SY8T~92 zfN=FS_cpucaZZ;Bx?S7MD$nOn-fhchK7*tI1o@cH6j1#IFGO^uD3M4XPoD6LQbnlZ zX1(yC;xbv)QbK_0&+bG^f!V(H)N(`9dsa zf_EZC&dSiq+1YA(3XZe^jn)x1T*n^{z*{0P*p3GjPw2LKo@%p|f)}`#!MJhM)#U(0k>6*6&?NNq zkFQI($cWwy*8t~)-ftC2G(=yKAJv|p4-x1E%+Z)@l_t3T)ixOMi@s$J>aBkpb_s9G z10|*MaK!72V-0Z;E2#~IJttF+aKO#OoyNiUt9HvQZEAUedjDuFay4sqlw~+#Vr0~U zs`}6{2^i+xQ11=R&8xu0{|aksIB*7gt@6})`tl~?t!E~Ly5-s6X&7kzd@uFgioME1 z-CuW<<la3%!%os{~SED;>EOdHdkkrvXFfikzLpeD)Iy-l+ z#>@o=BAil0xAi?6^Rlv*K@}JZJ;6_HXl-4Ma(nZF(YuyuJ|Ky3IErnZ?ro4s4u|hJ zZX>dm$ZU8@aOp3AT-=i5e3)3LDqeMbx$}5xzYW)fPFDprlhruT(m&J=)=Q*wy{2hX zk5~$yTt`QTibh=KR&U+ zM8I~CG%I1ePe{lvFlBRE&=wuFOP?U@8XXg32Fusl+8TtW?c|ua(VGYMGKCMPj`J)< zXhCaHg6INO+T-yZ=3_TljE3g;O`t-q5;J&3Mj4%hX#Il80xc`W2qxE+<}%d9rd^Mf z)zsn;`VTPiQ*_YPnZ4is8Czj+zS1GSlpYHD5!yhra&2-`r2E&M5yKDw7-hj6B_=GgtIc}d(4PCKOSz%?HMrncyThUR$s z^j6Sn9r1WH8cgl21zoFI?a$ns! zRo7VwbnWQxuLrzjCH!y++Zg%vhW7S#2w0Immwv?WuuZn#_kqKgCa!3;IOfjfz{*%b@Y_>gRJWERhnRoZ&-F>5P^M%niaTLe;gq+VX|DR&~@IR z%`UGs7O7}T*@A-qc$>gtGjLz>*GAuk2iR>VA&++juBd1%+GG_aD35{zv2~^IOlIcH zl>p>i1>en2iXVS7c!DGv*)nPu#q%PXCGNd(^a43S0|V0sxbPuYqWx4!-y|pu1y3HF znl5qgEHi=g*c4_zT@3JbaJQ*e>6@crs8RMo!R1&D*hfDOt+u{4{$@m%agm>qqYh{fqHG%{&J?Q!Rwb4DGZtSgR1WR+*S0 zhZxl7;_jU4>T0Hw(`K?kai%jtL=oan2~rADtEjtj*voX7^vip`yo;?#Y#U(vV2hUk z#@N=TgeP#-*|lp8TqHZGv+UfXJnMA3c3#*jj58<40;kmzbak_S05fA64XK}=Ahe3> z#;GB|EpNj6S-vjU^Vkb;mMGS0FxfkB`P8F#(nIeTmQ_q4B9HuXG!AN^Z_feaQK6rC zR9tiU5SVlvl(^h8Hcpa$94JXS9UUF5rxb;DK(%#s`lUlqHZk={2?-peo%o1zE~8TMBr(KH zM{zjF%4{W&M6Rdx1|74N@k|5=CUCi4B{NO7Uiuj$=xY-r#Zjq3D*>yuowDP>J(mbJ zDFF|XN+oa)eGDDYg21V2{9c39j8R)(UkyGk!C|;KjJgI)R`+D*Y{V1Syu|~4*E>(; z*~D--&|>5fF!3XE*LjeB_!y0s(;a%-z6xi#w7Wk6vS!Ap)QXTs@!e!;yJyC^vpdJV zwg_!&Z4G-dOtcC?SvZ7bEfVm|pw<#IQj$5dC<&o!J)CD|N>C9T zvr6a|D3g5vAgDK4kA5bO_#RFfM2vw}K*ne?7L#_cKdMpSs;{J^)U?)Z`asly8_SW- zh{YsDB0b$esRYPD>#1j0?+hJrpF;li7(5&^JRaE?8057(eK*4WgmNKn1_HQalbF^? zmULJfRv%@j9yZ3M4N}zU1c6GoL5_iRI>yJxiA9Afm-}3chy1ShTV+JY#v0I_0|O0~ zs2aB@{|p+68kh-vp$XTnVL8jn(6p(wsYwYfMX?^;XsPL0VgRQMNwIPdmg%$Oj##rq z!uDv{_6H+}Mi{-AHe0i>@uX2|gTMYBXJ_Y^2$r4aBJ|v7t*xOH74tzmnOWp=A4E~Z z_EdLGVhfnXds3Fg8Nc3-3C)%B)WWs97=!SRc=OHwPd`y}b=$#k9nJRaQKBJF@EF3JHwY4?zNUI#B zu_hZ9dTtrM12^ccBDqGH=e+`%U31fBZm=$tLvG6yM($)vhH=Cj-}p^m*@+1yt>y)q zmun;)hv7bgF;M;R;eH0=s&TNdAZ;zG$XeeFtAU`pm!X$oN8kp7(byfz(DO76#7OF! zW(`T}I&o5%Cr@q!6zvAnEgN+#iuJUoy>!F=2_5vR*)1&{3fDpb(Ifp;-$+1-RH9Oe z=W~}e1AWr|I>A9*8yh951ucr=9yoVxmJ7&5`o~hV0XHrkI3-9^^8D*e+jIcy)jZZR zYPoHR@HT9XE&V3Yz5D5u+%jtws#{0C1iq-fOg15{tF29+5JSNO%{Au6$=2FWUjf0M zDIMm{mSlUk0eE_qPY1%-5lO=_0ikv3;1m)j?rZ*pRUmV(d@eoob!-37D{pvl(uMIS zVIkLb5{N80Y=XJj9B;qQ8};)XP7vH;8PzDg}F-i;}~*ZIRy@mlABk8h=U zmP6<{9AL~?hyhny0-H)Ab9isH{ zD*$9gn#^-`55ipOr88IM_t8>Y)`4;l;Xu4;_02MescS=F;{3sah|mn%FVX~S>YWH< zP?U)tYfK*>9ay!Z?$VmfJqd}4k(^GG%eNvH=JgCE;UpoRV2yqsqlIYg<`@=c41Yu= z6Qaqt(8H4TP1+49M_{tCS>=RMxP&z?KFz-8XgN>yms;G+vB#t-M}<=lf%ve!!~`$) zGBh<+Lx@mn#gbwAg8l3+c&Qs`-N?9>X^PTKt$Jabv#}~S#f!+eP8~YE>_t9KZ5%MV zJhTBbjD&wGkEcl@Fui?!7oh$L9Bmvv3s+<<2Fk}l*;Rr|+7`rbP*`dVJ&zU%%RyPcwM|C2i$4o=`Nnghdo#izyv zs}MPaL0cofHFM}LY6+l?Nwk1k9%?B7B}^4Z3BS-_&0qnICOv*86aNGxCcUN!-ws+7 zsL_4QGThrxmq;^Hn<(sxeyE-r)It^bPx7!jEoI@MYj+1~D6Lv`{no85v1@n!n)`h* zl_WwJ&w|LuM_CIwOE4jcO8R2481N;%$OA499^jpWW~dpDNPi);54jTIF7YLR_fc@W zjC`N(*Vw*YeifkQm=9VdTpgtITKV4~I`65m-|P7p+!-zdD*M^9XMCJw28+dFQUk9~ zmNW!^Juu>II^B0zgl1DV*>$)V71loJ^Ttta3>~%BjzA+RM~t&@X*+lBoVA@@G!&oh zMChE+<8xmG+&V(s8W0+Q_b%{#Ce z9*ehy5|rf_hJ?wO6Hss}3$s<)#UYQ;z0@^21@3v@6>~VO;DTQ)M5oTCbt^zhUV&m- zV78}vgI33bHzB~9bUZT-&G0&W9oR3&>ml9x+@CD+9A^{;(*eA2aD4OhvU(C`y9S>x zFk%NFMUu9C0!5}4t5iT5X`Cy5&Gj0Y2pP$a&!cCe&Zh2MOMq*EO9Zd5-LM;d`<57{fq;A*+%H_){LTl+&$Q;1n5r$XS00FN@3 z!n}Z~(DmZ2sGf%j}I7gx7uEEc6R|Y?PVcIfftT4ajZY|6E3{but?o;+}#MC14 z`jqyL4nSEx|6L#U@AtFc(ii^DJy_l)|1{;}ACQ}qzb^dYUC;9W<4Y;pAm$PiglMXb z$sgF}_vJl9yw114hhg-dKZBTXlBOxQNzWwfz{>7bGAeSUhJl(7^ti$XYDwRxUfpg&C z@Nt=p=LM}tDoOaJ3RwnnNS+=?nO7128qG+mkp~s_pP&ebxZQc@Js zQwXS8?#Kx?+JX2><{|f~N{F?!EvB$CE^_vaQ|!`%}TF`W9h? z7f%(GAmK3Z*Hu#%9Zk}o^rukLmURJS>~;dth@b>GP4Y_#388cqm5Qhqxsv?BD%PPJ z7ueO>XiL8aF=rSnT<;=c297|j;D;%m+mj;rd5-0J0vXOcLDeP+`IFEcFd8v`l&<6* zyLYRAkI#X(xeusR=FQfB`=o~2+RNY=#K5;V@_TUz@e|9X^RaLtxFw%gUH4mx&v-3b zv?w>ksA6%Ufg*)+`T{bVK`_uF;2;v4A)g=vdLyF1)5-WUO+c_BlGjucbTu+k#xPGe zSr$7<{>1U0T(0p!po#?5uF}JI!GWdGQUS|pG=w7wwUnp2nKH^I@uD~&Uc`;PWJf4v ze<2AYq0kOt4w8}Oa7IQ(g0R3$EMW5Zhoc|O9z@8~29+ZW|^hiD9g0njS@p1qiWD0VUG@uDFNg^O?4N+?;! zk+30YRE*d5#g{0{?7d_}*6?!BMSxZQdaqIC%kVozsPC;0cIUl_{ys!>F!-&}qEObn z#k_;T$QB|`*b3`IVf-2Ho8&0Z(w11CuFWXEZX)JO{=OmR#jQr}N^VfR6;RoMES{~& zA_|)W-RjT|3zPO8o-&;fRcJI!zB_BV^aIMrH2hHE9Rw^%YIf(&R+t|OB`pZ?!0QN} zAr>dsYgE!Lqy`fhmA8C;^)#`I>{I_}vnYBn8Cgp(75qX~RTb(>J)xN?Y{^xOm!;82 z+>%`R?T5hXM&%MoX6x+U-PZpMzevqSW)u+s9|VCAo+f7O({IV+=7O4U6gK8957H

      1>}DwO8O~^Hjkxb>I0v3>Jl= z9yWjn8cP*?OJRrB!QCgpa%5ZZby5b~dG7-XyA6rEs^`y7UN!Qe!O3UB(4rGZbN`7s zl=K5^1-30rPB-d}d?w!Xy)```l_0u^&>Ij%UI+)cqaLk+ZIBK@Sl(l5G7yt%N{~#> z2BEG#Oo1}!ilyC%h+iZq0(vCaw-C0f!s^S}s(io@4hMLGJVV93cQ}UfeXl(DAeUJ8 z&A;UU|Nor)_bL>7@m__>1@gU>C(H0&7~TuR#`g*tLh!qfP`@``|3-b4I=j?U%giKE z?bA>3tDF4Ito=`(@ISSS>3a%)C_A)w=xS=~YVOeaN=J8>uFft!9d&K(UE10S^hbaG zhc9?|opf;u{^wulWBQN;$JXC|!QaK>l%M|z5AT2eowC3qVtj}4nc3%zj6DwD{3pLv BKDYn? diff --git a/docs/images/SetTargetCommand.png b/docs/images/SetTargetCommand.png index 26973e13a0a88ec7306ccb2de0ff359400d31024..15a9b2061a5b91e892a142ebbe734a4c2522dd9e 100644 GIT binary patch literal 24593 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 literal 81003 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

      i&B?3mp38K>9;LPX+ji P5ldN7O`$~2G~|B($G=nQ literal 41760 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 Date: Wed, 5 Apr 2023 19:49:41 +0800 Subject: [PATCH 275/364] Add and edit error messages to make it more specific. Add JUnit tests to correspond to the new error messages. Changed limit of each expense/income to be less than 1,000,000 --- src/main/java/chching/parser/Expenses.java | 36 +++++++++++---- src/main/java/chching/parser/Incomes.java | 31 +++++++++---- src/main/java/chching/parser/Parser.java | 46 +++++++++++-------- src/test/java/chching/ParserTest.java | 38 ++++++++++++++- .../command/EditExpenseCommandTest.java | 2 +- .../command/EditIncomeCommandTest.java | 2 +- .../java/chching/parser/ExpensesTest.java | 6 +-- src/test/java/chching/parser/IncomesTest.java | 6 +-- .../java/chching/record/ExpenseListTest.java | 2 +- .../java/chching/record/IncomeListTest.java | 2 +- 10 files changed, 122 insertions(+), 49 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index cc119c5c8e..fca27bcd49 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,7 +14,13 @@ */ public class Expenses { - + + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + /** * Parses a date * @@ -27,7 +33,7 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept try { expenseDate = LocalDate.parse(expenseDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (expenseDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -41,20 +47,30 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept * @param argumentsByField Input from users */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { + // check if all the fields are present + boolean isCategoryPresent = argumentsByField.containsKey(CATEGORY_FIELD); + boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); + boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); + boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); + boolean isAllPresent = isCategoryPresent && isDescriptionPresent && isDatePresent && isValuePresent; + if (!isAllPresent) { + throw new ChChingException("Missing fields detected"); + } + Expense exp = null; - String expenseCategory = argumentsByField.get("c"); - String expenseDescription = argumentsByField.get("de"); - String expenseDateString = argumentsByField.get("da"); + String expenseCategory = argumentsByField.get(CATEGORY_FIELD); + String expenseDescription = argumentsByField.get(DESCRIPTION_FIELD); + String expenseDateString = argumentsByField.get(DATE_FIELD); LocalDate expenseDate = parseDate(expenseDateString); float expenseValue; try { - expenseValue = Float.parseFloat(argumentsByField.get("v")); + expenseValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); } catch (Exception e) { throw new ChChingException("Expense value must be a valid float that is 2 d.p. or less"); } - if (expenseValue > 1000000) { - throw new ChChingException("Expense value can at most be 1000000"); + if (expenseValue > 999999.99) { + throw new ChChingException("Expense value must be less than 1000000"); } else if (expenseValue <= 0) { throw new ChChingException("Expense value must be greater than 0"); } @@ -71,10 +87,10 @@ public static Expense parseExpense(HashMap argumentsByField) thr public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; try { - String indexString = argumentsByField.get("in"); + String indexString = argumentsByField.get(INDEX_FIELD); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Index must contain a valid integer only"); + throw new ChChingException("Index field not found"); } return index; } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 4f57bc1bf9..925bf6da8c 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -10,6 +10,12 @@ import java.util.HashMap; public class Incomes { + + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; + public static final String INDEX_FIELD = "in"; + public static LocalDate parseDate(String incomeDateString) throws ChChingException { LocalDate incomeDate; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") @@ -17,7 +23,7 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti try { incomeDate = LocalDate.parse(incomeDateString, formatter); } catch (DateTimeParseException e) { - throw new ChChingException("Date must be valid with format: \"DD-MM-YYYY\""); + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); } if (incomeDate.isAfter(LocalDate.now())) { throw new ChChingException("Date cannot be in the future"); @@ -31,19 +37,28 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { + // check if all the fields are present + boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); + boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); + boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); + boolean isAllPresent = isDescriptionPresent && isDatePresent && isValuePresent; + if (!isAllPresent) { + throw new ChChingException("Missing fields detected"); + } + Income inc = null; - String incomeDescription = argumentsByField.get("de"); - String incomeDateString = argumentsByField.get("da"); + String incomeDescription = argumentsByField.get(DESCRIPTION_FIELD); + String incomeDateString = argumentsByField.get(DATE_FIELD); LocalDate incomeDate = parseDate(incomeDateString); float incomeValue; try { - incomeValue = Float.parseFloat(argumentsByField.get("v")); + incomeValue = Float.parseFloat(argumentsByField.get(VALUE_FIELD)); } catch (Exception e) { throw new ChChingException("Income value must be a valid float that is 2 d.p. or less"); } - if (incomeValue > 1000000) { - throw new ChChingException("Income value can at most be 1000000"); + if (incomeValue > 999999.99) { + throw new ChChingException("Income value must be less than 1000000"); } else if (incomeValue <= 0) { throw new ChChingException("Income value must be greater than 0"); } @@ -60,10 +75,10 @@ public static Income parseIncome(HashMap argumentsByField) throw public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; try { - String indexString = argumentsByField.get("in"); + String indexString = argumentsByField.get(INDEX_FIELD); index = Integer.parseInt(indexString); } catch (Exception e) { - throw new ChChingException("Index must contain a valid integer only"); + throw new ChChingException("Index field not found"); } return index; } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index fe79d1d7d7..8b927c190c 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -36,18 +36,18 @@ import java.util.List; public class Parser { - + public static final String FIELD_DEMARCATION = " /"; - + /** * Method that parses command to the relevant classes to execute * - * @param line User input - * @param incomeList List of incomes - * @param expenseList List of expenses - * @param ui User interface + * @param line User input + * @param incomeList List of incomes + * @param expenseList List of expenses + * @param ui User interface */ - + public static Command parse( String line, IncomeList incomeList, @@ -142,11 +142,11 @@ public static Command parse( } return command; } - + /** * Split the String of user input into relevant partitions * - * @param line User input + * @param line User input * @return An ArrayList of Strings */ public static ArrayList splitLine(String line) { @@ -154,33 +154,37 @@ public static ArrayList splitLine(String line) { lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); return lineParts; } - + /** * Sort the arguments * - * @param arguments arguments + * @param arguments arguments * @return Hashmap of sorted arguments */ - + public static HashMap sortArguments(List arguments) throws ChChingException { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); - + // split each argument according to their field and their value, and add into // hashmap accordingly // Hashmap's key is its field, value is the value of the field for (int i = 0; i < argumentsCount; i++) { String argument = arguments.get(i); String[] fieldAndValue = argument.split(" ", 2); - String field; - String value; + String field = null; + String value = null; try { field = fieldAndValue[0].trim(); value = fieldAndValue[1].trim(); } catch (Exception e) { - throw new ChChingException("Arguments not inputted correctly"); + if (field == null) { + throw new ChChingException("Improper use of \" / \""); + } else { + throw new ChChingException("Arguments not inputted correctly / Missing details"); + } } - + // checks if it is an existing field boolean isDuplicateField = argumentsByField.containsKey(field); // check if field/value is empty or just spaces @@ -188,13 +192,14 @@ public static HashMap sortArguments(List arguments) thro if (isDuplicateField) { throw new ChChingException("Duplicate fields detected"); } else if (isEmptyFieldOrValue) { - throw new ChChingException("Empty value detected or use of \" / \" in value"); + throw new ChChingException("Empty detail detected or improper use of \" / \""); } else { argumentsByField.put(field, value); } } return argumentsByField; } + public static String getCategory(HashMap argumentsByField) throws ChChingException { String category = null; try { @@ -204,6 +209,7 @@ public static String getCategory(HashMap argumentsByField) throw } return category; } + public static String getKeyword(HashMap argumentsByField) throws ChChingException { String keyword = null; try { @@ -213,6 +219,6 @@ public static String getKeyword(HashMap argumentsByField) throws } return keyword; } - - + + } diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 13da1ee715..bc79b2ddf2 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -32,6 +32,7 @@ public class ParserTest { static final String DESCRIPTION_VALUE = "breakfast"; static final String KEYWORD_FIELD = "k"; static final String KEYWORD_VALUE = "hello"; + static final String CA_WITH_EMPTY_DETAIL = "ca "; private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -109,7 +110,42 @@ public void sortArguments_invalidInput_throwsException() { new Parser().sortArguments(input); fail(); // the test should not reach this line } catch (ChChingException e) { - assertEquals("Arguments not inputted correctly", e.getMessage()); + assertEquals("Arguments not inputted correctly / Missing details", e.getMessage()); + } + } + + /** + * JUnit test for sortArguments method. + * Checks if the method throws an exception if the input contains duplicate fields. + */ + @Test + public void sortArguments_duplicateField_throwsException() { + List input = new ArrayList(); + input.add(CA); + input.add(CA); + + try { + new Parser().sortArguments(input); + fail(); // the test should not reach this line + } catch (ChChingException e) { + assertEquals("Duplicate fields detected", e.getMessage()); + } + } + + /** + * JUnit test for sortArguments method. + * Checks if the method throws an exception if the input contains empty detail. + */ + @Test + public void sortArguments_emptyDetail_throwsException() { + List input = new ArrayList(); + input.add(CA_WITH_EMPTY_DETAIL); + + try { + new Parser().sortArguments(input); + fail(); // the test should not reach this line + } catch (ChChingException e) { + assertEquals("Empty detail detected or improper use of \" / \"", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index adddbb462d..7c4e2c6e9a 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -108,7 +108,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index 0bf5f55480..a1135b6839 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -102,7 +102,7 @@ void execute_noIndex_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java index eb8e816062..dea1bf4d02 100644 --- a/src/test/java/chching/parser/ExpensesTest.java +++ b/src/test/java/chching/parser/ExpensesTest.java @@ -139,7 +139,7 @@ public void parseExpense_valueTooLarge_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { System.out.println(e.getMessage()); - assertEquals("Expense value cannot be 1000000 or more", e.getMessage()); + assertEquals("Expense value must be less than 1000000", e.getMessage()); } } @@ -206,7 +206,7 @@ public void getIndex_invalidIndex_exceptionThrown() { Expenses.getIndex(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java index 5e332ed833..c1c9eec7f9 100644 --- a/src/test/java/chching/parser/IncomesTest.java +++ b/src/test/java/chching/parser/IncomesTest.java @@ -132,7 +132,7 @@ public void parseIncome_valueTooLarge_exceptionThrown() { fail(); // test should not reach this line } catch (Exception e) { System.out.println(e.getMessage()); - assertEquals("Income value cannot be 1000000 or more", e.getMessage()); + assertEquals("Income value must be less than 1000000", e.getMessage()); } } @@ -198,7 +198,7 @@ public void getIndex_invalidIndex_exceptionThrown() { Incomes.getIndex(input); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Index must contain a valid integer only", e.getMessage()); + assertEquals("Index field not found", e.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 8cbb032499..aec344d9e0 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -126,7 +126,7 @@ void editExpense_editInvalidDate_exceptionThrown() { expenses.editExpense(1, "da", "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 92bfcc67e7..af39b8cd64 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -107,7 +107,7 @@ void editIncome_editInvalidDate_exceptionThrown() { incomes.editIncome(1, "da", "31-02-2022"); fail(); // test should not reach this line } catch (Exception e) { - assertEquals("Date must be valid with format: \"DD-MM-YYYY\"", e.getMessage()); + assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } } From 4e3d22beec505000faeb09f320cb8c44a1792099 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 6 Apr 2023 00:27:55 +0800 Subject: [PATCH 276/364] Changed value field for adding income and expense to only accept values up to 2 d.p. or less --- src/main/java/chching/parser/DecimalsChecker.java | 14 ++++++++++++++ src/main/java/chching/parser/Expenses.java | 10 +++++++--- src/main/java/chching/parser/Incomes.java | 10 +++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/main/java/chching/parser/DecimalsChecker.java diff --git a/src/main/java/chching/parser/DecimalsChecker.java b/src/main/java/chching/parser/DecimalsChecker.java new file mode 100644 index 0000000000..6e0feb0144 --- /dev/null +++ b/src/main/java/chching/parser/DecimalsChecker.java @@ -0,0 +1,14 @@ +package chching.parser; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DecimalsChecker { + public static boolean isTwoDecimals(String valueString) { + Pattern pattern = Pattern.compile("^\\d+(\\.\\d{1,2})?$"); + Matcher matcher = pattern.matcher(valueString); + boolean isMatch = matcher.matches(); + return isMatch; + + } +} diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 7a879a2d94..dd84816c6c 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -45,12 +45,16 @@ public static Expense parseExpense(HashMap argumentsByField) thr String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); String expenseDateString = argumentsByField.get("da"); + String expenseValueString = argumentsByField.get("v"); + double expenseValue; LocalDate expenseDate = parseDate(expenseDateString); - double expenseValue; + if(!DecimalsChecker.isTwoDecimals(expenseValueString)) { + throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); + } + try { - expenseValue = Float.parseFloat(argumentsByField.get("v")); - expenseValue = Math.round(expenseValue * 100.0) / 100.0; + expenseValue = Double.parseDouble(expenseValueString); } catch (Exception e) { throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); } diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index b987481dbd..3100cbb618 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -34,12 +34,16 @@ public static Income parseIncome(HashMap argumentsByField) throw Income inc = null; String incomeDescription = argumentsByField.get("de"); String incomeDateString = argumentsByField.get("da"); + String incomeValueString = argumentsByField.get("v"); + double incomeValue; LocalDate incomeDate = parseDate(incomeDateString); - double incomeValue; + if(!DecimalsChecker.isTwoDecimals(incomeValueString)) { + throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); + } + try { - incomeValue = Float.parseFloat(argumentsByField.get("v")); - incomeValue = Math.round(incomeValue * 100.0) / 100.0; + incomeValue = Double.parseDouble(incomeValueString); } catch (Exception e) { throw new ChChingException("Income value must be a valid double that is 2 d.p. or less"); } From 93ac636a0d2de4110f1a4792b5cabba4d9d1e41e Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 6 Apr 2023 00:30:38 +0800 Subject: [PATCH 277/364] Update user guide to reflect accepting only 2 d.p. entries for value field --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 7f6904c736..8d946eb9b3 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -66,6 +66,7 @@ Unfortunately, expense list can't be found. I'll make a new one! Creates a new entry for expenses or income, with respective input formats.
      Income and Expense values must be less than 1000000. +
      Income and Expense values must be up to 2 decimal places or less. Format:
      `add expense /c CATEGORY /de DESCRIPTION /da DATE /v VALUE` @@ -76,8 +77,7 @@ Use case: - Re-prompts user if any field is not provided properly. - CATEGORY has a maximum char limit of 30. - DESCRIPTION has a maximum char limit of 99. -- VALUE entered by user will be rounded off to the nearest 2 decimal places. -- VALUE will be stored as a positive double. +- VALUE will be stored as a positive double up to 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. From 4a09c0ca7ae08b56740400df753e48529d4b0fca Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 6 Apr 2023 00:33:42 +0800 Subject: [PATCH 278/364] cleaned up .puml file for AddIncome and ListExpense --- docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml | 4 ++-- docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml index 0da8a5a5d0..c37fbe0d51 100644 --- a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml +++ b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml @@ -11,20 +11,20 @@ Parser -> AddIncomeCommand : AddIncomeCommand(income) AddIncomeCommand -> AddIncomeCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) activate AddIncomeCommand - AddIncomeCommand -> IncomeList : addIncome(income) + activate IncomeList IncomeList --> AddIncomeCommand deactivate IncomeList AddIncomeCommand -> Ui + activate Ui Ui -> Ui : showAdded(incomes, expenses, income) activate Ui Ui --> AddIncomeCommand deactivate Ui - deactivate AddIncomeCommand deactivate IncomeList deactivate Parser diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml index 48424213b7..c5674f9c52 100644 --- a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -4,14 +4,19 @@ participant ":ListExpenseCommand" as ListExpenseCommand participant "expenses:ExpenseList" as ExpenseList activate Parser + create ListExpenseCommand + activate ListExpenseCommand Parser -> ListExpenseCommand : ListExpenseCommand(args) ListExpenseCommand -> ListExpenseCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) + activate ListExpenseCommand ListExpenseCommand -> ExpenseList : printExpenseList(selector, converter) + activate ExpenseList ExpenseList --> ListExpenseCommand + deactivate ExpenseList deactivate ListExpenseCommand deactivate Parser From 3cdc360918496d5ef20d71c710aaccf5ebbf0e48 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 6 Apr 2023 10:22:28 +0800 Subject: [PATCH 279/364] Fix bug where edit expense does not limit value to 999999.99 --- docs/UserGuide.md | 3 +++ src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- src/main/java/chching/record/ExpenseList.java | 7 +++++++ src/main/java/chching/record/IncomeList.java | 7 +++++++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8d946eb9b3..663114c1df 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -78,6 +78,7 @@ Use case: - CATEGORY has a maximum char limit of 30. - DESCRIPTION has a maximum char limit of 99. - VALUE will be stored as a positive double up to 2 decimal places. +- VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be dd-MM-yyyy. - DATE needs to be a valid date, and it cannot be a date in the future. @@ -264,6 +265,8 @@ The data file is not to be edited manually. * ChChing will allow for duplicate entries to be added. No warning would be raised. * ChChing will not allow for the user to use '/', unless it is used to specify the field.
      e.g. `add expense /c meal /de breakfast / lunch /da 22-03-2023 /v 3.50` will be allowed. +* For values that require double/float, ChChing will only allow for 2 decimal places. Furthermore, ChChing will not accept values that does not have a number before the decimal point. +
      e.g. `.01` and `0.001` is not taken as a valid value, but `0.01` is. ## Command Summary (Alphabetical Order) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 855daa70fb..21bc0f8218 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -66,7 +66,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr LocalDate expenseDate = parseDate(expenseDateString); if(!DecimalsChecker.isTwoDecimals(expenseValueString)) { - throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); + throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); } try { expenseValue = Double.parseDouble(expenseValueString); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 170959c42c..b31bb72d88 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -54,7 +54,7 @@ public static Income parseIncome(HashMap argumentsByField) throw LocalDate incomeDate = parseDate(incomeDateString); if(!DecimalsChecker.isTwoDecimals(incomeValueString)) { - throw new ChChingException("Expense value must be a valid double that is 2 d.p. or less"); + throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); } try { incomeValue = Double.parseDouble(incomeValueString); diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index c2a8403ff1..96b5aa2a3f 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import chching.currency.Converter; import chching.currency.Selector; +import chching.parser.DecimalsChecker; import static chching.parser.Expenses.parseDate; @@ -68,10 +69,16 @@ public void editExpense(int index, String field, String value) throws ChChingExc expense.setDate(date); break; case "v": + boolean isTwoDecimalsOrLess = DecimalsChecker.isTwoDecimals(value); + if(!isTwoDecimalsOrLess) { + throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); + } try { double amount = Double.parseDouble(value); if (amount < 0.01) { throw new ChChingException("Expense must be greater than or equals 0.01"); + } else if (amount > 999999.99) { + throw new ChChingException("Expense value must be less than 1000000"); } assert amount > 0.01 : "Income must be positive and more than 0"; expense.setValue(amount); diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 52068db1d9..22a68f2a92 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -6,6 +6,7 @@ import chching.ChChingException; import chching.currency.Converter; import chching.currency.Selector; +import chching.parser.DecimalsChecker; import static chching.parser.Incomes.parseDate; @@ -66,10 +67,16 @@ public void editIncome(int index, String field, String value) throws ChChingExce income.setDate(date); break; case "v": + boolean isTwoDecimalsOrLess = DecimalsChecker.isTwoDecimals(value); + if(!isTwoDecimalsOrLess) { + throw new ChChingException("Income value must be a valid positive double that is 2 d.p. or less"); + } try { double amount = Double.parseDouble(value); if (amount < 0.01) { throw new ChChingException("Income must be greater than or equals 0.01"); + } else if (amount > 999999.99) { + throw new ChChingException("Income value must be less than 1000000"); } assert amount > 0.01 : "Income cannot be negative"; income.setValue(amount); From 6627f7b203675c706a7590edd43096951f9930c4 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 6 Apr 2023 10:40:50 +0800 Subject: [PATCH 280/364] Add JUnit tests for ExpenseList and IncomeList tests Standardise the error messages in add command and edit command --- src/main/java/chching/record/ExpenseList.java | 2 +- src/main/java/chching/record/IncomeList.java | 2 +- .../java/chching/record/ExpenseListTest.java | 98 ++++++++++++++++--- .../java/chching/record/IncomeListTest.java | 92 +++++++++++++++-- 4 files changed, 170 insertions(+), 24 deletions(-) diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 96b5aa2a3f..9e4bb98ce2 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -76,7 +76,7 @@ public void editExpense(int index, String field, String value) throws ChChingExc try { double amount = Double.parseDouble(value); if (amount < 0.01) { - throw new ChChingException("Expense must be greater than or equals 0.01"); + throw new ChChingException("Expense value must be greater than 0"); } else if (amount > 999999.99) { throw new ChChingException("Expense value must be less than 1000000"); } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 22a68f2a92..fb398cc7df 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -74,7 +74,7 @@ public void editIncome(int index, String field, String value) throws ChChingExce try { double amount = Double.parseDouble(value); if (amount < 0.01) { - throw new ChChingException("Income must be greater than or equals 0.01"); + throw new ChChingException("Income value must be greater than 0"); } else if (amount > 999999.99) { throw new ChChingException("Income value must be less than 1000000"); } diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index aec344d9e0..9499face9a 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -13,12 +13,16 @@ * Junit Test for ExpenseList */ class ExpenseListTest { - static final int EXPECTED_SIZE = 1; - static final String CATEGORY = "entertainment"; - static final String DESCRIPTION = "beach party"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); - static final LocalDate DATE = LocalDate.parse("23-05-2021", FORMATTER); - static final float EXPENSE_VALUE = (float) 50; + public static final int EXPECTED_SIZE = 1; + public static final String CATEGORY = "entertainment"; + public static final String DESCRIPTION = "beach party"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE = LocalDate.parse("23-05-2021", FORMATTER); + public static final float EXPENSE_VALUE = (float) 50; + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; private Expense expense; private ExpenseList expenses; @@ -57,7 +61,7 @@ void getExpenseCount_one_expectOne() { void editExpense_editCategory_success() { String expectedOutputCategory = "food and drinks"; try { - expenses.editExpense(1, "c", "food and drinks"); + expenses.editExpense(1, CATEGORY_FIELD, "food and drinks"); System.out.println(expenses.getRecordCount()); assertEquals(expectedOutputCategory, expenses.get(0).getCategory()); assertEquals(DESCRIPTION, expenses.get(0).getDescription()); @@ -75,7 +79,7 @@ void editExpense_editCategory_success() { void editExpense_editDescription_success() { String expectedOutputDescription = "birthday party"; try { - expenses.editExpense(1, "de", "birthday party"); + expenses.editExpense(1, DESCRIPTION_FIELD, "birthday party"); assertEquals(CATEGORY, expenses.get(0).getCategory()); assertEquals(expectedOutputDescription, expenses.get(0).getDescription()); assertEquals(DATE, expenses.get(0).getDate()); @@ -92,7 +96,7 @@ void editExpense_editDescription_success() { void editExpense_editDate_success() { LocalDate expectedOutputDate = LocalDate.parse("23-05-2022", FORMATTER); try { - expenses.editExpense(1, "da", "23-05-2022"); + expenses.editExpense(1, DATE_FIELD, "23-05-2022"); assertEquals(CATEGORY, expenses.get(0).getCategory()); assertEquals(DESCRIPTION, expenses.get(0).getDescription()); assertEquals(expectedOutputDate, expenses.get(0).getDate()); @@ -109,7 +113,7 @@ void editExpense_editDate_success() { @Test void editExpense_editFutureDate_exceptionThrown() { try { - expenses.editExpense(1, "da", "05-04-2029"); + expenses.editExpense(1, DATE_FIELD, "05-04-2029"); fail(); // test should not reach this line } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); @@ -123,7 +127,7 @@ void editExpense_editFutureDate_exceptionThrown() { @Test void editExpense_editInvalidDate_exceptionThrown() { try { - expenses.editExpense(1, "da", "30-02-2022"); + expenses.editExpense(1, DATE_FIELD, "30-02-2022"); fail(); // test should not reach this line } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); @@ -137,7 +141,7 @@ void editExpense_editInvalidDate_exceptionThrown() { void editExpense_editValue_success() { float expectedOutputValue = (float) 100; try { - expenses.editExpense(1, "v", "100"); + expenses.editExpense(1, VALUE_FIELD, "100"); assertEquals(CATEGORY, expenses.get(0).getCategory()); assertEquals(DESCRIPTION, expenses.get(0).getDescription()); assertEquals(DATE, expenses.get(0).getDate()); @@ -146,4 +150,74 @@ void editExpense_editValue_success() { fail(); // test should not fail } } + + /** + * Junit Test to test editExpense method with a value that is negative. + * ChChing exception should be thrown. + */ + @Test + void editExpense_editNegativeValue_exceptionThrown() { + try { + expenses.editExpense(1, VALUE_FIELD, "-100"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * Junit Test to test editExpense method with a value that has more than 2 decimal places. + * ChChing exception should be thrown. + */ + @Test + void editExpense_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { + try { + expenses.editExpense(1, VALUE_FIELD, "100.123"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * Junit Test to test editExpense method with a value that is not a double. + * ChChing exception should be thrown. + */ + @Test + void editExpense_editValueNotDouble_exceptionThrown() { + try { + expenses.editExpense(1, VALUE_FIELD, "abc"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * JUnit Test to test editExpense method with a value that is more than 999999.99 + * ChChing exception should be thrown. + */ + @Test + void editExpense_editValueMoreThan999999d99_exceptionThrown() { + try { + expenses.editExpense(1, VALUE_FIELD, "1000000"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be less than 1000000", e.getMessage()); + } + } + + /** + * JUnit Test to test editExpense method with a value that is less than 0.01 + * ChChing exception should be thrown. + */ + @Test + void editExpense_editValueLessThan0d01_exceptionThrown() { + try { + expenses.editExpense(1, VALUE_FIELD, "0.00"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Expense value must be greater than 0", e.getMessage()); + } + } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index af39b8cd64..559b1db180 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -14,11 +14,13 @@ * Junit Test for IncomeList */ class IncomeListTest { - - static final String DESCRIPTION = "salary"; - static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); - static final float INCOME_VALUE = (float) 1000000; + public static final String DESCRIPTION = "salary"; + public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + public static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); + public static final float INCOME_VALUE = (float) 1000000; + public static final String VALUE_FIELD = "v"; + public static final String DATE_FIELD = "da"; + public static final String DESCRIPTION_FIELD = "de"; private Income income; private IncomeList incomes; @@ -55,7 +57,7 @@ void getExpenseCount_one_expectOne() { void editIncome_editDescription_success() { String expectedOutputDescription = "bonus"; try { - incomes.editIncome(1, "de", "bonus"); + incomes.editIncome(1, DESCRIPTION_FIELD, "bonus"); assertEquals(expectedOutputDescription, incomes.get(0).getDescription()); assertEquals(DATE, incomes.get(0).getDate()); assertEquals(INCOME_VALUE, incomes.get(0).getValue()); @@ -73,7 +75,7 @@ void editIncome_editDescription_success() { void editIncome_editDate_success() { LocalDate expectedOutputDate = LocalDate.parse("05-04-2022", FORMATTER); try { - incomes.editIncome(1, "da", "05-04-2022"); + incomes.editIncome(1, DATE_FIELD, "05-04-2022"); assertEquals(DESCRIPTION, incomes.get(0).getDescription()); assertEquals(expectedOutputDate, incomes.get(0).getDate()); assertEquals(INCOME_VALUE, incomes.get(0).getValue()); @@ -90,7 +92,7 @@ void editIncome_editDate_success() { @Test void editIncome_editFutureDate_exceptionThrown() { try { - incomes.editIncome(1, "da", "05-04-2029"); + incomes.editIncome(1, DATE_FIELD, "05-04-2029"); fail(); // test should not reach this line } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); @@ -104,7 +106,7 @@ void editIncome_editFutureDate_exceptionThrown() { @Test void editIncome_editInvalidDate_exceptionThrown() { try { - incomes.editIncome(1, "da", "31-02-2022"); + incomes.editIncome(1, DATE_FIELD, "31-02-2022"); fail(); // test should not reach this line } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); @@ -119,7 +121,7 @@ void editIncome_editInvalidDate_exceptionThrown() { void editIncome_editValue_success() { float expectedOutputValue = (float) 200000; try { - incomes.editIncome(1, "v", "200000"); + incomes.editIncome(1, VALUE_FIELD, "200000"); assertEquals(DESCRIPTION, incomes.get(0).getDescription()); assertEquals(DATE, incomes.get(0).getDate()); assertEquals(expectedOutputValue, incomes.get(0).getValue()); @@ -128,4 +130,74 @@ void editIncome_editValue_success() { fail(); // test should not reach this line } } + + /** + * Junit Test to test editIncome method with a value that is negative. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editNegativeValue_exceptionThrown() { + try { + incomes.editIncome(1, VALUE_FIELD, "-200000"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * Junit Test to test editIncome method with a value that has more than 2 decimal places. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { + try { + incomes.editIncome(1, VALUE_FIELD, "200000.1234"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * Junit Test to test editIncome method with a value that is not a double. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editValueNotDouble_exceptionThrown() { + try { + incomes.editIncome(1, VALUE_FIELD, "200000.1a"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); + } + } + + /** + * Junit Test to test editIncome method with a value that is more than 999999.99. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editValueMoreThan999999d99_exceptionThrown() { + try { + incomes.editIncome(1, VALUE_FIELD, "1000000.00"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be less than 1000000", e.getMessage()); + } + } + + /** + * Junit Test to test editIncome method with a value that is less than 0.01. + * ChChing exception should be thrown. + */ + @Test + void editIncome_editValueLessThan0d01_exceptionThrown() { + try { + incomes.editIncome(1, VALUE_FIELD, "0.00"); + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Income value must be greater than 0", e.getMessage()); + } + } } From 1bd69cacee2cea11d681a4b3e1fc4e913e582a63 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Thu, 6 Apr 2023 14:18:23 +0800 Subject: [PATCH 281/364] upgrade find command --- src/main/java/chching/Ui.java | 6 ++- .../java/chching/command/FindCommand.java | 49 ++++++++++++------ src/main/java/chching/parser/Parser.java | 50 ++++++++++++++++--- src/main/java/chching/record/ExpenseList.java | 2 +- src/main/java/chching/record/Income.java | 4 ++ src/main/java/chching/record/IncomeList.java | 2 +- src/test/java/chching/ParserTest.java | 49 +++++++++++++++--- 7 files changed, 128 insertions(+), 34 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index a19345b7c6..1fd1e4bce3 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -163,8 +163,10 @@ public static void showHelp() { System.out.println(" show target"); System.out.println(); System.out.println(" FIND AN INCOME/EXPENSE:"); - System.out.println(" find /k /c "); - System.out.println(" eg: find /k food /c expense"); + System.out.println(" find /t [/c category] [/de description] [/da date]"); + System.out.println(" fields with [] are optional"); + System.out.println(" At least one optional field is required"); + System.out.println(" eg: find /t expense /c food /de burger king /da 2020-01-01"); System.out.println(); System.out.println(" SHOW HELP:"); System.out.println(" help"); diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index dbc63e7a1e..97addf1d26 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -9,18 +9,25 @@ import chching.record.Expense; import chching.record.ExpenseList; import chching.record.TargetStorage; + +import java.time.LocalDate; + import chching.ChChingException; /** * model a class to handle the find command. inherit from Command class. */ public class FindCommand extends Command { + private final String type; private final String category; - private final String keyword; + private final String description; + private final LocalDate date; - public FindCommand(String category, String keyword) { + public FindCommand(String type, String category, String description, LocalDate date) { + this.type = type; this.category = category; - this.keyword = keyword; + this.description = description; + this.date = date; } /** @@ -38,24 +45,33 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto Converter converter, TargetStorage targetStorage) throws ChChingException { IncomeList incomesMatched = new IncomeList(); ExpenseList expensesMatched = new ExpenseList(); + Boolean emptyKeyword = true; + if (description != null) { + emptyKeyword = (description.strip() == ""); + } - if(category == null) { - throw new ChChingException("No category specified"); - - } else if(keyword == null) { - throw new ChChingException("No keyword specified"); + if(type == null) { + throw new ChChingException("No type specified"); + + } else if(!type.equals("income") && !type.equals("expense")) { + throw new ChChingException("Type specified must be income or expense"); - } else if(!category.equals("income") && !category.equals("expense")) { - throw new ChChingException("Category specified must be income or expense"); + } else if(type == "income" && (description == null || emptyKeyword) && date == null) { + throw new ChChingException("No description or date specified for Income"); + + } else if (category != null && type.equals("income")) { + throw new ChChingException("Income has no category"); - } else if (keyword.strip() == "") { - throw new ChChingException("No keyword specified"); + } else if (type == "expense" && (description == null || emptyKeyword) && category == null && date == null) { + throw new ChChingException("No description or category or date specified"); } - if (category.equals("income")) { + if (type.equals("income")) { for (int i = 0; i < incomes.size(); i++) { Income income = incomes.get(i); - if (income.toString().toLowerCase().contains(keyword.toLowerCase())) { + if ((description == null + || income.getDescription().toLowerCase().contains(description.toLowerCase())) + && (date == null || income.getDate().equals(date))) { incomesMatched.addIncome(income); } } @@ -64,7 +80,10 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else { for (int i = 0; i < expenses.size(); i++) { Expense expense = expenses.get(i); - if (expense.toString().toLowerCase().contains(keyword.toLowerCase())) { + if ((description == null + || expense.getDescription().toLowerCase().contains(description.toLowerCase())) + && (category == null || expense.getCategory().equals(category)) + && (date == null || expense.getDate().equals(date))) { expensesMatched.addExpense(expense); } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 8b927c190c..eaac81d019 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -30,6 +30,10 @@ import chching.record.IncomeList; import chching.record.Target; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.format.ResolverStyle; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -101,9 +105,11 @@ public static Command parse( command = new UnsetCurrencyCommand(currency); break; case "find": + String type = getType(argumentsByField); String category = getCategory(argumentsByField); - String keyword = getKeyword(argumentsByField); - command = new FindCommand(category, keyword); + String keyword = getDescription(argumentsByField); + LocalDate date = getDate(argumentsByField); + command = new FindCommand(type, category, keyword, date); break; case "balance": command = new BalanceCommand(); @@ -200,6 +206,16 @@ public static HashMap sortArguments(List arguments) thro return argumentsByField; } + public static String getType(HashMap argumentsByField) throws ChChingException { + String type = null; + try { + type = argumentsByField.get("t"); + } catch (Exception e) { + throw new ChChingException("missing/invalid type"); + } + return type; + } + public static String getCategory(HashMap argumentsByField) throws ChChingException { String category = null; try { @@ -210,14 +226,34 @@ public static String getCategory(HashMap argumentsByField) throw return category; } - public static String getKeyword(HashMap argumentsByField) throws ChChingException { - String keyword = null; + public static String getDescription(HashMap argumentsByField) throws ChChingException { + String description = null; try { - keyword = argumentsByField.get("k"); + description = argumentsByField.get("de"); } catch (Exception e) { - throw new ChChingException("missing/invalid keyword"); + throw new ChChingException("missing/invalid description"); + } + return description; + } + + public static LocalDate getDate(HashMap argumentsByField) throws ChChingException { + String dateString = null; + dateString = argumentsByField.get("da"); + LocalDate date = null; + if (dateString == null) { + return date; + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); + try { + date = LocalDate.parse(dateString, formatter); + } catch (DateTimeParseException e) { + throw new ChChingException("Date must be valid and have format: \"DD-MM-YYYY\""); + } + if (date.isAfter(LocalDate.now())) { + throw new ChChingException("Date cannot be in the future"); } - return keyword; + return date; } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 9e4bb98ce2..69f8dad73a 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -80,7 +80,7 @@ public void editExpense(int index, String field, String value) throws ChChingExc } else if (amount > 999999.99) { throw new ChChingException("Expense value must be less than 1000000"); } - assert amount > 0.01 : "Income must be positive and more than 0"; + assert amount >= 0.01 : "Income must be positive and more than 0"; expense.setValue(amount); } catch (Exception e) { if (e instanceof NumberFormatException) { diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 9acf37d3f8..9a5c5f48ba 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -25,4 +25,8 @@ public String toString() { " | Date - " + getDateString() + " | Value - " + String.format("%.02f", getValue()); } + + public String getDescription() { + return super.getDescription(); + } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index fb398cc7df..328c1404b6 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -78,7 +78,7 @@ public void editIncome(int index, String field, String value) throws ChChingExce } else if (amount > 999999.99) { throw new ChChingException("Income value must be less than 1000000"); } - assert amount > 0.01 : "Income cannot be negative"; + assert amount >= 0.01 : "Income cannot be negative"; income.setValue(amount); } catch (Exception e) { if (e instanceof NumberFormatException) { diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index bc79b2ddf2..20e05cf560 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -14,21 +14,26 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.ResolverStyle; public class ParserTest { static final String ADD_EXPENSE ="add expense"; static final String CA = "ca meal"; static final String DE ="de breakfast"; - static final String DA = "da 01/02/23"; + static final String DA = "da 01-02-2023"; static final String V = "v 3.50"; static final String INVALID_INPUT = "invalid"; + static final String TYPE_FIELD = "t"; + static final String TYPE_VALUE = "expense"; static final String CATEGORY_FIELD = "c"; static final String CATEGORY_VALUE = "meal"; static final String DESCRIPTION_FIELD = "de"; static final String DATE_FIELD = "da"; static final String VALUE_FIELD = "v"; static final String VALUE_VALUE = "3.50"; - static final String DATE_VALUE = "01/02/23"; + static final String DATE_VALUE = "01-02-2023"; static final String DESCRIPTION_VALUE = "breakfast"; static final String KEYWORD_FIELD = "k"; static final String KEYWORD_VALUE = "hello"; @@ -53,7 +58,8 @@ public void splitLine_testScenario_expectedBehaviour() { List expectedOutput = new ArrayList(); expectedOutputsForExpectedBehaviour(expectedOutput); - assertEquals(expectedOutput, new Parser().splitLine("add expense /ca meal /de breakfast /da 01/02/23 /v 3.50")); + assertEquals(expectedOutput, + new Parser().splitLine("add expense /ca meal /de breakfast /da 01-02-2023 /v 3.50")); } private static void expectedOutputsForExpectedBehaviour(List expectedOutput) { @@ -79,7 +85,7 @@ public void sortArguments_testScenario_expectedBehaviour() throws ChChingExcepti HashMap expectedOutput = new HashMap(); expectedOutput.put("ca", "meal"); expectedOutput.put("de", "breakfast"); - expectedOutput.put("da", "01/02/23"); + expectedOutput.put("da", "01-02-2023"); expectedOutput.put("v", "3.50"); assertEquals(expectedOutput, new Parser().sortArguments(input)); @@ -149,6 +155,18 @@ public void sortArguments_emptyDetail_throwsException() { } } + /** + * JUnit test for getType method. + * Checks if the method returns the keyword properly. + */ + @Test + public void getType_normalScenario_expectedBehaviour() throws ChChingException { + HashMap input = new HashMap(); + input.put(TYPE_FIELD, TYPE_VALUE); + + assertEquals("expense", new Parser().getType(input)); + } + /** * JUnit test for getCategory method. * Checks if the method returns the category properly. @@ -165,15 +183,30 @@ public void getCategory_testScenario_expectedBehaviour() throws ChChingException } /** - * JUnit test for getKeyword method. + * JUnit test for getDescription method. + * Checks if the method returns the keyword properly. + */ + @Test + public void getDescription_normalScenario_expectedBehaviour() throws ChChingException { + HashMap input = new HashMap(); + input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + + assertEquals("breakfast", new Parser().getDescription(input)); + } + + /** + * JUnit test for getDate method. * Checks if the method returns the keyword properly. */ @Test - public void getKeyword_normalScenario_expectedBehaviour() throws ChChingException { + public void getDate_normalScenario_expectedBehaviour() throws ChChingException { HashMap input = new HashMap(); - input.put(KEYWORD_FIELD, KEYWORD_VALUE); + input.put(DATE_FIELD, DATE_VALUE); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") + .withResolverStyle(ResolverStyle.STRICT); + LocalDate expectedDate = LocalDate.parse(DATE_VALUE, formatter); - assertEquals("hello", new Parser().getKeyword(input)); + assertEquals(expectedDate, new Parser().getDate(input)); } @AfterEach From 4361b80094fc600309c78f3811dffa1b45f32b60 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 6 Apr 2023 22:03:51 +0800 Subject: [PATCH 282/364] Rename PPP file to match github username --- docs/AboutUs.md | 2 +- docs/team/{thomas.md => thomasjlalba.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/team/{thomas.md => thomasjlalba.md} (100%) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index dff9ddbc76..078318bc07 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -5,5 +5,5 @@ Display | Name | Github Profile | ![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) ![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/avielcx.md) ![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) -![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomas.md) +![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomasjlalba.md) ![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) diff --git a/docs/team/thomas.md b/docs/team/thomasjlalba.md similarity index 100% rename from docs/team/thomas.md rename to docs/team/thomasjlalba.md From 025664d544e90bd43f424e31f1d68974b7d739b2 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Thu, 6 Apr 2023 23:19:02 +0800 Subject: [PATCH 283/364] Update Yan Ming's PPP to github name --- docs/AboutUs.md | 2 +- docs/team/{yanming.md => rayleigh47.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/team/{yanming.md => rayleigh47.md} (100%) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 078318bc07..9ddca2e39f 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -4,6 +4,6 @@ Display | Name | Github Profile | --------|:----------------------:|:-------------------------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) ![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/avielcx.md) -![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/yanming.md) +![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/rayleigh47.md) ![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomasjlalba.md) ![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) diff --git a/docs/team/yanming.md b/docs/team/rayleigh47.md similarity index 100% rename from docs/team/yanming.md rename to docs/team/rayleigh47.md From caeda1a8b9ec2af34419ef63ac1005dd1f1c6701 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 7 Apr 2023 01:44:45 +0800 Subject: [PATCH 284/364] update DG, UG and error checking for Find --- docs/DeveloperGuide.md | 49 +++++++++- docs/UserGuide.md | 12 ++- .../FindCommand_Sequence_diagram_UML.puml | 91 ++++++++++++++++++ ...CurrencyCommand_Sequence_Diagram_UML.puml} | 21 +++- ...tCurrencyCommand_Sequence_Diagram_UML.puml | 49 ++++++++++ docs/images/FindCommand_Sequence_Diagram.png | Bin 0 -> 111711 bytes .../SetCurrencyCommand_sequence_diagram.png | Bin 28676 -> 42262 bytes .../UnsetCurrencyCommand_Sequence_Diagram.png | Bin 0 -> 42561 bytes docs/team/{clement.md => hyperbola-bear.md} | 9 +- src/main/java/chching/ChChingException.java | 6 +- src/main/java/chching/Ui.java | 2 +- src/main/java/chching/command/Command.java | 2 +- .../java/chching/command/FindCommand.java | 7 +- src/main/java/chching/parser/Parser.java | 7 +- src/main/java/chching/record/Income.java | 4 - 15 files changed, 231 insertions(+), 28 deletions(-) create mode 100644 docs/diagrams/FindCommand_Sequence_diagram_UML.puml rename docs/diagrams/{SetCurrencyCommand_Sequence_Diagram.puml => SetCurrencyCommand_Sequence_Diagram_UML.puml} (67%) create mode 100644 docs/diagrams/UnsetCurrencyCommand_Sequence_Diagram_UML.puml create mode 100644 docs/images/FindCommand_Sequence_Diagram.png create mode 100644 docs/images/UnsetCurrencyCommand_Sequence_Diagram.png rename docs/team/{clement.md => hyperbola-bear.md} (78%) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index ea0911aa4f..9701c8bdad 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -130,8 +130,9 @@ The `Parser` object then returns to `ChChing`. `ChChing` object then runs the `e ### SetCurrencyCommand -The setCurrencyCommand is facilitated by `System`, `Selector`, `UI` and `ExpenseList`. -The command receives the instruction from `UI` and will call the `execute` method. +The setCurrencyCommand is facilitated by `System`, `Selector`, `UI`, `Parser` and `ExpenseList`. +The command receives the instruction from `UI` and will be parsed by the `parse()` method of the `Parser` object and `getCurrency()` method is called from the `Currency` +which returns the currency that the user wants to set. Then `SetCurrencyCommand` object is instantiated and returned and `execute()` is called. The `execute()` method in setCurrencyCommand will then call the `containsCurrency(currency)` method from `Selector`. If the method returns false, which indicates that the currency is not available, the command will throw a new ChChingException and print `"Currency not available"`. If the method returns true, the command will continue to set the currency in the selector hashmap to true. @@ -140,6 +141,25 @@ The `printSelector()` method will print all the available currencies in the sele The selected currencies will be marked with a `[X]` and the unselected currencies will be marked with a `[ ]`. ![SetCurrencyCommand_sequence_diagram.png](images%2FSetCurrencyCommand_sequence_diagram.png) +### UnsetCurrencyCommand + +The unsetCurrencyCommand works in a similar way to the setCurrencyCommand. +The diagram below shows the sequence diagram for the unsetCurrencyCommand. +![SetCurrencyCommand_sequence_diagram.png](images%2FUnsetCurrencyCommand_sequence_diagram.png) + + +### Find + +The FindCommand is facilitated by `System`, `UI`,`Parser`, `ExpenseList` and `IncomeList`. +The command receives instruction `UI` and the input will be parsed by `Parser` using `getType`,`getCategory`, `getDescription` and `getDate` to get the necessary search fields, before the `FindCommand` is instantiated by `Parser`. +The user can choose to search through incomes on description or date. The user can also choose to search through expenses on description, date or category. +The `execute()` method in `FindCommand` will check if the user is searching for income or expense, and ensure that at least one of the search fields are not empty. +By using a loop, the `execute()` method will then search through the `ExpenseList` or `IncomeList` and selected the expenses/incomes that matches the search fields. +The `execute()` method will then print out the selected expenses/incomes that matches the search fields using `showMatchedExpense()` or `showMatchedIncome()` method from `UI` to `System` +![FindCommand_sequence_diagram.png](images%2FFindCommand_sequence_diagram.png) + + + ## Product scope ### Target user profile @@ -174,6 +194,7 @@ The value proposition of ChChing is its ability to track income and expenses on - ChChing should not crash under normal circumstances. - Dates should be in the format of dd/mm/yyyy, it should be a valid date, and it should not be a future date. - Amount should be a positive number. + - Only characters in the english keyboard should be used. - Constraints: @@ -289,7 +310,7 @@ Given below are instructions to test the app manually.
      For expense: `list expense`
      For both: `list`
      Expected: All incomes and/or expenses should be listed. Note deleted incomes/expenses will not be shown. - 2. Test case: should there be no income/expense entries in the list + 3. Test case: should there be no income/expense entries in the list
      For income: `list income`
      For expense: `list expense`
      For both: `list` @@ -301,8 +322,28 @@ Given below are instructions to test the app manually.
      Expected: The total expense, total income, current balance and current target will be shown. Should the current balance or equal to the current target, it will prompt a good job message, otherwise it will prompt a message that balance has not reached target. ### Finding income/expense - +1. Finding income/expense + 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. + 2. Test case: +
      For income: `find /t income /de bonus` +
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 ` +
      Expected: All income with description containing "bonus" should be listed. All expense with category containing "food", description containing "sushi" and on date "03-03-2023" should be listed. Note deleted incomes/expenses will not be shown. + 3. Test case: Should there be no income/expense entries in the list +
      For income: `find /t income /de bonus` +
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 ` +
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. ### Setting target & Unsetting target + ### Setting Currency & Unsetting Currency +1. Setting program to display currency of interest and not display unwanted currencies + 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. + 2. Test case: +
      For income: `set currency /cr HKD` +
      For expense: `set currency /cr USD` +
      Expected: All income/expense entries, balance and target will be displayed in the SGD as well as any set currencies. + 3. Test case: Program does not support the currency +
      For income: `set currency /cr JPY` +
      For expense: `set currency /cr EUR` +
      Expected: Error message will be shown. No currency will be set. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 663114c1df..e1caac22d6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -153,21 +153,23 @@ Example of usage: ### Finding an entry: `find` Find an existing expense/income that is currently in the list. -
      The program will search for the keywords in your entries. +
      The program will search for the keywords in your entries for category and description +
      The program will search for exact date in entries for date field
      Vague keywords will render less specific results. -- CATEGORY is specified as either `income` or `expense` +- TYPE is specified as either `income` or `expense` Format: -
      `find /c CATEGORY /k KEYWORD` +
      `find /t TYPE [/c CATEGORY] [/de DESCRIPTION] [/da DATE]` +
      fields with [] are optional fields, but at least 1 must be not empty for search to work Use case: - Shows user the entry that they are looking for. Example of usage: -
      `find /c expense /k beef` -
      `find /c income /k salary` +
      `find /t expense /c food /de beef ` +
      `find /t income /de salary /da 03-03-2023 ` ### Deleting an entry: `delete` diff --git a/docs/diagrams/FindCommand_Sequence_diagram_UML.puml b/docs/diagrams/FindCommand_Sequence_diagram_UML.puml new file mode 100644 index 0000000000..3441c1467d --- /dev/null +++ b/docs/diagrams/FindCommand_Sequence_diagram_UML.puml @@ -0,0 +1,91 @@ +@startuml + +participant ":System" as System +participant ":UI" as UI +participant ":Parser" as Parser +participant "FindCommand" as FindCommand +participant "incomes:IncomeList" as IncomeList +participant "incomesMatched:IncomeList" as incomesMatched +participant "expenses:ExpenseList" as ExpenseList +participant "expensesMatched:ExpenseList" as expensesMatched +participant "ChChingException" as ChChingException + + +activate UI +UI -> UI:readCommand() + +UI -->Parser: input.nextLine() +activate Parser +deactivate UI +Parser -> Parser: getType(argumentsByField) +Parser -> Parser: getCategory(argumentsByField) +Parser -> Parser: getDescription(argumentsByField) +Parser -> Parser: getDate(argumentsByField) + + +Parser -> FindCommand: new FindCommand(type,category,description,date) +activate FindCommand +deactivate Parser + +FindCommand -> FindCommand: execute(income,expense,ui,storage,selector,converter,targetStorage) +opt type == "income" + FindCommand->IncomeList: income.getDescription().toLowerCase().contains(description.toLowerCase()) + activate IncomeList + FindCommand->IncomeList: income.getDate().equals(date) + FindCommand <-- IncomeList + FindCommand -> incomesMatched : add(income) + activate incomesMatched + FindCommand <-- incomesMatched + deactivate incomesMatched + deactivate IncomeList + UI <- FindCommand: ui.showMatchedIncome(incomesMatched) + activate UI + System <- UI + deactivate UI +end + +opt type == "expense" + FindCommand->ExpenseList: expense.getDescription().toLowerCase().contains(description.toLowerCase()) + activate ExpenseList + FindCommand->ExpenseList: expense.getDate().equals(date) + FindCommand->ExpenseList: expense.getCategory().equals(category) + FindCommand <-- ExpenseList + FindCommand -> expensesMatched : add(expense) + activate expensesMatched + FindCommand <-- expensesMatched + deactivate expensesMatched + deactivate ExpenseList + UI <- FindCommand: ui.showMatchedExpense(expensesMatched) + activate UI + System <- UI + deactivate UI +end + +alt type != "income" && type != "expense" + FindCommand -> ChChingException: ChChingException("Type specified must be income or expense") + activate ChChingException + deactivate ChChingException +end + +alt type == "income" && category != null + FindCommand -> ChChingException: ChChingException("Income hsa no category") + activate ChChingException + deactivate ChChingException +end + +alt type == "income" && (description == null && date == null) + FindCommand -> ChChingException: ChChingException("No description or date specified for Income") + activate ChChingException + deactivate ChChingException +end + +alt type == "expense" && (description == null && date == null && category == null) + FindCommand -> ChChingException: ChChingException("No description or category or date specified for Expense") + activate ChChingException + deactivate ChChingException +end +deactivate FindCommand + +destroy ChChingException + +@enduml \ No newline at end of file diff --git a/docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml b/docs/diagrams/SetCurrencyCommand_Sequence_Diagram_UML.puml similarity index 67% rename from docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml rename to docs/diagrams/SetCurrencyCommand_Sequence_Diagram_UML.puml index d1422a036e..52eb03e32d 100644 --- a/docs/diagrams/SetCurrencyCommand_Sequence_Diagram.puml +++ b/docs/diagrams/SetCurrencyCommand_Sequence_Diagram_UML.puml @@ -3,14 +3,26 @@ participant ":System" as System participant ":Selector" as Selector participant ":UI" as UI +participant ":Parser" as Parser +participant ":Currency" as Currency participant "SetCurrencyCommand" as SetCurrencyCommand participant "ChChingException" as ChChingException activate UI UI -> UI:readCommand() -UI -->SetCurrencyCommand: input.nextLine() + +activate Parser +UI -->Parser: input.nextLine() deactivate UI +activate Currency +Parser -> Currency: getCurrency(argumentsByField) +Parser <-- Currency +deactivate Currency + +Parser -> SetCurrencyCommand: new SetCurrencyCommand() +deactivate Parser + activate SetCurrencyCommand SetCurrencyCommand -> SetCurrencyCommand: execute(income,expense,ui,storage,selector,converter,targetStorage) activate Selector @@ -22,11 +34,16 @@ SetCurrencyCommand ->ChChingException: ChChingException("currency not available" deactivate ChChingException Selector <- SetCurrencyCommand: selector.printSelector(converter) -deactivate SetCurrencyCommand activate System System <- Selector: System.out.println([x] + currency + converter.convert(currency, 1)) +deactivate Selector + +System <- SetCurrencyCommand: System.out.println("Displaying" + currency + "now.") +deactivate SetCurrencyCommand deactivate System deactivate Selector + +destroy ChChingException @enduml \ No newline at end of file diff --git a/docs/diagrams/UnsetCurrencyCommand_Sequence_Diagram_UML.puml b/docs/diagrams/UnsetCurrencyCommand_Sequence_Diagram_UML.puml new file mode 100644 index 0000000000..e2b257afe6 --- /dev/null +++ b/docs/diagrams/UnsetCurrencyCommand_Sequence_Diagram_UML.puml @@ -0,0 +1,49 @@ +@startuml + +participant ":System" as System +participant ":Selector" as Selector +participant ":UI" as UI +participant ":Parser" as Parser +participant ":Currency" as Currency +participant "UnsetCurrencyCommand" as UnsetCurrencyCommand +participant "ChChingException" as ChChingException + +activate UI +UI -> UI:readCommand() + +activate Parser +UI -->Parser: input.nextLine() +deactivate UI + +activate Currency +Parser -> Currency: getCurrency(argumentsByField) +Parser <-- Currency +deactivate Currency + +Parser -> UnsetCurrencyCommand: new UnsetCurrencyCommand() +deactivate Parser + +activate UnsetCurrencyCommand +UnsetCurrencyCommand -> UnsetCurrencyCommand: execute(income,expense,ui,storage,selector,converter,targetStorage) +activate Selector +Selector <- UnsetCurrencyCommand: selector.containsCurrency(currency) +Selector --> UnsetCurrencyCommand + +activate ChChingException +UnsetCurrencyCommand ->ChChingException: ChChingException("currency not available") +deactivate ChChingException + +Selector <- UnsetCurrencyCommand: selector.printSelector(converter) + +activate System +System <- Selector: System.out.println([] + currency + converter.convert(currency, 1)) +deactivate Selector + +System <- UnsetCurrencyCommand: System.out.println("Not displaying" + currency + "now.") +deactivate UnsetCurrencyCommand +deactivate System + +deactivate Selector + +destroy ChChingException +@enduml \ No newline at end of file diff --git a/docs/images/FindCommand_Sequence_Diagram.png b/docs/images/FindCommand_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a40ca358d9cffb9cf4f91891c185c6eb00802ac4 GIT binary patch literal 111711 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

      nW*g{Lxifm6kRcjg_2K&2&-NyW_s)# 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 literal 0 HcmV?d00001 diff --git a/docs/images/SetCurrencyCommand_sequence_diagram.png b/docs/images/SetCurrencyCommand_sequence_diagram.png index 36741209401677051c08aa76345c63769b70867e..2491afd6e1c37ffd8afc3c00cb802b027fd15f4b 100644 GIT binary patch literal 42262 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 bnYrOaWoo+YSVYo{{8b@-F}~#651#xV^%>IA literal 28676 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

      {>T?sC6*#_fCI6b%Roz95i; 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 Q9Xvcq@mpdUB6lADFT*LbF#rGn literal 0 HcmV?d00001 diff --git a/docs/team/clement.md b/docs/team/hyperbola-bear.md similarity index 78% rename from docs/team/clement.md rename to docs/team/hyperbola-bear.md index 84417fc5a0..a14a3d151a 100644 --- a/docs/team/clement.md +++ b/docs/team/hyperbola-bear.md @@ -20,14 +20,19 @@ Given below are my contributions to the project. * Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. * Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. * Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. +* Refactored and upgraded `FindCommand` to allow users to find income and expenses based on their type. For incomes, user can search based on date and dexcription. For expenses, user can search based on date, description and category. Each of the search parameters are optional, however, at least one search parameter must be provided for `FindCommand` to work. * Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. * Created a Selector to allow users to select the currency of interest. * Created a Converter class to allow users to convert the currency of interest. * Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. -* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand` +* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, #### Contributions to the UG: -Added documentation for the feature `Set Currency`, `Unset Currency`. +Added documentation for the feature `Set Currency`, `Unset Currency` and `FindCommand`. #### Contributions to the DG: * Added `SetCurrencyCommand` sequence diagram +* Added implementation details for `SetCurrencyCommand` +* Added `UnsetCurrencyCommand` sequence diagram +* Added implementation details for `FindCommand` +* Added `FindCommand` sequence diagram diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 801d011f39..d404a6c862 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -10,8 +10,8 @@ public ChChingException(String message) { this.message = message; } - public void printChChingException() { - System.out.println(message); - } + // public void printChChingException() { + // System.out.println(message); + // } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 1fd1e4bce3..680decb39f 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -123,7 +123,7 @@ public void showMatchedExpense(ExpenseList expenses) { System.out.println(" " + (i + 1) + ". " + expenses.get(i)); } } else { - System.out.println(" No matching records for those keyword"); + System.out.println(" No matching records for those search terms"); } } diff --git a/src/main/java/chching/command/Command.java b/src/main/java/chching/command/Command.java index 54d5fa79fd..5002440c56 100644 --- a/src/main/java/chching/command/Command.java +++ b/src/main/java/chching/command/Command.java @@ -13,7 +13,7 @@ * Abstract Command class that acts as a template for other command classes. */ -public abstract class Command { +public class Command { /** diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 97addf1d26..e0a324ce31 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -28,6 +28,7 @@ public FindCommand(String type, String category, String description, LocalDate d this.category = category; this.description = description; this.date = date; + } /** @@ -56,13 +57,13 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if(!type.equals("income") && !type.equals("expense")) { throw new ChChingException("Type specified must be income or expense"); - } else if(type == "income" && (description == null || emptyKeyword) && date == null) { + } else if(type.equals("income") && (description == null || emptyKeyword) && date == null) { throw new ChChingException("No description or date specified for Income"); - } else if (category != null && type.equals("income")) { + } else if (type.equals("income") && category != null) { throw new ChChingException("Income has no category"); - } else if (type == "expense" && (description == null || emptyKeyword) && category == null && date == null) { + } else if (type.equals("expense") && (description == null || emptyKeyword) && category == null && date == null) { throw new ChChingException("No description or category or date specified"); } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index eaac81d019..aa77f3bde5 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -61,7 +61,8 @@ public static Command parse( String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); - Command command = new InvalidCommand(); + //Command command = new InvalidCommand(); + Command command = new Command(); int index; try { switch (instruction) { @@ -239,9 +240,9 @@ public static String getDescription(HashMap argumentsByField) th public static LocalDate getDate(HashMap argumentsByField) throws ChChingException { String dateString = null; dateString = argumentsByField.get("da"); - LocalDate date = null; + LocalDate date; if (dateString == null) { - return date; + return null; } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu") .withResolverStyle(ResolverStyle.STRICT); diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 9a5c5f48ba..9acf37d3f8 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -25,8 +25,4 @@ public String toString() { " | Date - " + getDateString() + " | Value - " + String.format("%.02f", getValue()); } - - public String getDescription() { - return super.getDescription(); - } } From ab2656abbe525862463d89c7d508975666078549 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 7 Apr 2023 01:46:04 +0800 Subject: [PATCH 285/364] checkstyle --- src/main/java/chching/command/FindCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index e0a324ce31..84dc301c71 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -63,7 +63,8 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if (type.equals("income") && category != null) { throw new ChChingException("Income has no category"); - } else if (type.equals("expense") && (description == null || emptyKeyword) && category == null && date == null) { + } else if (type.equals("expense") && (description == null || emptyKeyword) + && category == null && date == null) { throw new ChChingException("No description or category or date specified"); } From 5851e3c40c7acde5316df9a6cf7910549f65a6f3 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 08:02:28 +0800 Subject: [PATCH 286/364] cleanup parser class and further javadoc --- src/main/java/chching/ChChing.java | 2 +- src/main/java/chching/parser/DecimalsChecker.java | 6 ++++++ src/main/java/chching/parser/Parser.java | 11 ++--------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index fc07e1d1ce..24dc6d7d70 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -53,7 +53,7 @@ public void run() { try { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") - Command c = Parser.parse(fullCommand, incomes, expenses, ui); + Command c = Parser.parse(fullCommand, ui); c.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); isExit = c.isExit(); } catch (ChChingException e) { diff --git a/src/main/java/chching/parser/DecimalsChecker.java b/src/main/java/chching/parser/DecimalsChecker.java index 6e0feb0144..a232c36d1b 100644 --- a/src/main/java/chching/parser/DecimalsChecker.java +++ b/src/main/java/chching/parser/DecimalsChecker.java @@ -4,6 +4,12 @@ import java.util.regex.Pattern; public class DecimalsChecker { + + /** + * Checks that input value satisfies the 2 decimal place requirement + * @param valueString string of value field + * @return true if requirements is satisfied, false otherwise + */ public static boolean isTwoDecimals(String valueString) { Pattern pattern = Pattern.compile("^\\d+(\\.\\d{1,2})?$"); Matcher matcher = pattern.matcher(valueString); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index aa77f3bde5..dd1c657262 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -47,21 +47,14 @@ public class Parser { * Method that parses command to the relevant classes to execute * * @param line User input - * @param incomeList List of incomes - * @param expenseList List of expenses * @param ui User interface + * @return Appropriate command to be executed */ - - public static Command parse( - String line, - IncomeList incomeList, - ExpenseList expenseList, - Ui ui) throws ChChingException { + public static Command parse(String line, Ui ui) throws ChChingException { List lineParts = splitLine(line); String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); - //Command command = new InvalidCommand(); Command command = new Command(); int index; try { From 4c28f4323eabcf0389263597ee81d804c8eeeab2 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 08:11:05 +0800 Subject: [PATCH 287/364] clean up PPP --- docs/team/rayleigh47.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/team/rayleigh47.md b/docs/team/rayleigh47.md index 177c00b6b0..19e0ca59f9 100644 --- a/docs/team/rayleigh47.md +++ b/docs/team/rayleigh47.md @@ -16,15 +16,15 @@ Given below are my contributions to the project. * Setting up of GitHub team organisation and repository #### Enhancements Implemented: -* Added methods to parser to parse specific fields such as +* Added methods to parser to parse fields for `income`, `expenses`, `category`, `keyword` and `date`. * Implemented `Record` class and added to `Income` and `Expense` classes. * Created list command to allow users to see their recorded entries. * Created list income command to allow users to see their recorded income entries. * Created list expense command to allow users to see their recorded expense entries. * Created invalid command to show users a default invalid message. -* Contributed to add income command to allow users to edit their existing incomes. -* Contributed to add expense command to allow users to edit their existing expenses. +* Contributed to add income command. +* Contributed to add expense command. * Contributed to JUnit tests for `IncomeTest`, `ExpenseTest`, `ListCommandTest`, `ClearCommandTest`. From 2b2b4e38916f368b3c190fce805ddfd9c42837be Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 08:33:18 +0800 Subject: [PATCH 288/364] update UI help command for add target command --- docs/DeveloperGuide.md | 23 +++++++++++-------- src/main/java/chching/Ui.java | 2 +- .../java/chching/parser/TargetParser.java | 10 ++++++++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9701c8bdad..ec9ba6e30f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -5,6 +5,7 @@ - [Developer Guide](#developer-guide) - [Acknowledgements](#acknowledgements) - [Design & implementation](#design-implementation) + - [Design](#design) - [Implementation](#implementation) - [Record and RecordList](#record-and-recordlist) - [DeleteIncomeCommand](#deleteincomecommand) @@ -25,15 +26,17 @@ ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +### ExchangeRateApi + +`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. ## Design & implementation -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +The overall design and implementation of our product. + +## Design -### ExchangeRateApi -`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. ## Implementation @@ -164,11 +167,12 @@ The `execute()` method will then print out the selected expenses/incomes that ma ### Target user profile -Target users are people who are keen on improving their financial accountability +Target users are people who are keen on improving their financial accountability. ### Value proposition -The value proposition of ChChing is its ability to track income and expenses on a daily basis. +The value proposition of ChChing is its ability to track income and expenses on a daily basis +in a simple and convenient manner through a command line interface. ## User Stories @@ -253,7 +257,7 @@ Given below are instructions to test the app manually. 3. Other incorrect add income commands to try:
      no fields/missing fields - `add income` `add expense`.
      incorrect date format/invalid date/future date - `add income /de ang pao /da 30-02-2022 /v 10` `add expense /c transport /de bus fare /da 31-04-2029 /v 5.30`. -
      negative value/zero value/1000000000 and above value/non-float value - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`. +
      negative value/zero value/1000000000 and above value/non-float value/non 2 d.p. values - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`.
      Expected: Similar to previous. ### Editing an income/expense @@ -271,7 +275,7 @@ Given below are instructions to test the app manually.
      negative index/index over income/expense list size - `edit income /in -1 /de toto /da 12-12-2022 /v 100` `edit expense /in 100 /c drinks /de starbucks coffee /da 13-12-2022 /v 9.50`.
      missing index field/no fields to edit - `edit income` `edit expense`.
      incorrect date format/invalid date/future date - `edit income 1 /de ang pao /da 30-02-2022 /v 10` `edit expense 1 /c transport /de bus fare /da 31-04-2029 /v 5.30`. -
      negative value/zero value/1000000000 and above value/non-float value - `edit income 1 /de salary /da 12-12-2022 /v -3.50` `edit expense 1 /c transport /de bus fare /da 10-10-2019 /v 0`. +
      negative value/zero value/1000000000 and above value/non-float value/non 2 d.p. values - `edit income 1 /de salary /da 12-12-2022 /v -3.50` `edit expense 1 /c transport /de bus fare /da 10-10-2019 /v 0`.
      Expected: Similar to previous. ### Deleting an income/expense @@ -332,7 +336,8 @@ Given below are instructions to test the app manually.
      For income: `find /t income /de bonus`
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. -### Setting target & Unsetting target +### Setting target & showing target +1. Setting ### Setting Currency & Unsetting Currency diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 680decb39f..c8b2158609 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -157,7 +157,7 @@ public static void showHelp() { System.out.println(" unset currency /cr "); System.out.println(); System.out.println(" ADD TARGET:"); - System.out.println(" add target /v "); + System.out.println(" set target /v "); System.out.println(); System.out.println(" SHOW TARGET:"); System.out.println(" show target"); diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index 197e9190d5..fca4c3810c 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -17,12 +17,22 @@ public class TargetParser { */ public static Target parseTarget(HashMap argumentsByField) throws ChChingException { Target targ = null; + String targetValueString; try { + targetValueString = argumentsByField.get("v"); Double targetValue = Double.valueOf(argumentsByField.get("v")); targ = new Target(targetValue); } catch (Exception e) { throw new ChChingException("Trouble adding target value"); } + if(!DecimalsChecker.isTwoDecimals(targetValueString)) { + throw new ChChingException("Target value must be a valid double that is 2 d.p. or less"); + } + if (targ.getValue() > 999999.99) { + throw new ChChingException("target value must be less than 1000000"); + } else if (targ.getValue() <= 0) { + throw new ChChingException("Income value must be greater than 0"); + } return targ; } } From 906baf4b98812e2c88630af1111eac3da26bc772 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 08:47:01 +0800 Subject: [PATCH 289/364] handle values for setting of target to follow constraints --- docs/DeveloperGuide.md | 12 ++++++++++-- src/main/java/chching/parser/TargetParser.java | 7 +++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index ec9ba6e30f..96beea0483 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -336,9 +336,17 @@ Given below are instructions to test the app manually.
      For income: `find /t income /de bonus`
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. -### Setting target & showing target -1. Setting +### Setting target & showing target +1. Setting target to display user's desired budget goal. + 1. Prerequisites: Target will initially be set to 0 by default, accept a preset range of values. + 2. Test case: +
      `set target /v 500.50` +
      Expected: target value added of 500.50 SGD + 3. Test case: `set target /v 500.123` +
      Expected: target value will not be added as value is not 2 d.p., error details shown in status message. + 4. Test case: `set target /v 9999999` +
      Expected: target value will not be added as value is out of range, error details shown in statu message. ### Setting Currency & Unsetting Currency 1. Setting program to display currency of interest and not display unwanted currencies diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index fca4c3810c..c5da9211e4 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -26,12 +26,11 @@ public static Target parseTarget(HashMap argumentsByField) throw throw new ChChingException("Trouble adding target value"); } if(!DecimalsChecker.isTwoDecimals(targetValueString)) { - throw new ChChingException("Target value must be a valid double that is 2 d.p. or less"); - } - if (targ.getValue() > 999999.99) { + throw new ChChingException("Target value must be a valid positive double that is 2 d.p. or less"); + } else if (targ.getValue() > 999999.99) { throw new ChChingException("target value must be less than 1000000"); } else if (targ.getValue() <= 0) { - throw new ChChingException("Income value must be greater than 0"); + throw new ChChingException("target value must be greater than 0"); } return targ; } From 2335c24d2b8e741f7c63fc42122260beda3b145d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 08:59:52 +0800 Subject: [PATCH 290/364] allow for negative values to be parsed by set target command --- docs/UserGuide.md | 6 ++++-- src/main/java/chching/parser/DecimalsChecker.java | 10 ++++++++-- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- src/main/java/chching/parser/TargetParser.java | 10 +++++----- src/main/java/chching/record/ExpenseList.java | 2 +- src/main/java/chching/record/IncomeList.java | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e1caac22d6..0d62a3f011 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -217,8 +217,10 @@ Format:
      `set target /v VALUE` Use case: - -- VALUE ranges from negative to positive +- VALUE must be greater than - 10 000 000 and less than 10 000 000. +- VALUE will be stored as a positive double up to 2 decimal places. +- VALUE will not accept doubles with more than 2 decimal places. +- VALUE will be recorded as SGD, regardless of the currency set. Example of usage:
      `set target /v 350` diff --git a/src/main/java/chching/parser/DecimalsChecker.java b/src/main/java/chching/parser/DecimalsChecker.java index a232c36d1b..c265a5e724 100644 --- a/src/main/java/chching/parser/DecimalsChecker.java +++ b/src/main/java/chching/parser/DecimalsChecker.java @@ -6,15 +6,21 @@ public class DecimalsChecker { /** - * Checks that input value satisfies the 2 decimal place requirement + * Checks that input value satisfies the positive and 2 decimal place requirement * @param valueString string of value field * @return true if requirements is satisfied, false otherwise */ - public static boolean isTwoDecimals(String valueString) { + public static boolean isPositiveTwoDecimals(String valueString) { Pattern pattern = Pattern.compile("^\\d+(\\.\\d{1,2})?$"); Matcher matcher = pattern.matcher(valueString); boolean isMatch = matcher.matches(); return isMatch; + } + public static boolean isTwoDecimals(String valueString) { + Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d{1,2})?$"); + Matcher matcher = pattern.matcher(valueString); + boolean isMatch = matcher.matches(); + return isMatch; } } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 21bc0f8218..8a82738002 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -65,7 +65,7 @@ public static Expense parseExpense(HashMap argumentsByField) thr double expenseValue; LocalDate expenseDate = parseDate(expenseDateString); - if(!DecimalsChecker.isTwoDecimals(expenseValueString)) { + if(!DecimalsChecker.isPositiveTwoDecimals(expenseValueString)) { throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); } try { diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index b31bb72d88..6ff05fb83a 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -53,7 +53,7 @@ public static Income parseIncome(HashMap argumentsByField) throw double incomeValue; LocalDate incomeDate = parseDate(incomeDateString); - if(!DecimalsChecker.isTwoDecimals(incomeValueString)) { + if(!DecimalsChecker.isPositiveTwoDecimals(incomeValueString)) { throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); } try { diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index c5da9211e4..1e4e13d586 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -26,11 +26,11 @@ public static Target parseTarget(HashMap argumentsByField) throw throw new ChChingException("Trouble adding target value"); } if(!DecimalsChecker.isTwoDecimals(targetValueString)) { - throw new ChChingException("Target value must be a valid positive double that is 2 d.p. or less"); - } else if (targ.getValue() > 999999.99) { - throw new ChChingException("target value must be less than 1000000"); - } else if (targ.getValue() <= 0) { - throw new ChChingException("target value must be greater than 0"); + throw new ChChingException("Target value must be a valid double that is 2 d.p. or less"); + } else if (targ.getValue() > 9999999.99) { + throw new ChChingException("target value must be less than 10 000 000"); + } else if(targ.getValue() < -9999999.99) { + throw new ChChingException("target value must be greater than -10 000 000"); } return targ; } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 69f8dad73a..dbfc2fe3c8 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -69,7 +69,7 @@ public void editExpense(int index, String field, String value) throws ChChingExc expense.setDate(date); break; case "v": - boolean isTwoDecimalsOrLess = DecimalsChecker.isTwoDecimals(value); + boolean isTwoDecimalsOrLess = DecimalsChecker.isPositiveTwoDecimals(value); if(!isTwoDecimalsOrLess) { throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 328c1404b6..7d4fcc175b 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -67,7 +67,7 @@ public void editIncome(int index, String field, String value) throws ChChingExce income.setDate(date); break; case "v": - boolean isTwoDecimalsOrLess = DecimalsChecker.isTwoDecimals(value); + boolean isTwoDecimalsOrLess = DecimalsChecker.isPositiveTwoDecimals(value); if(!isTwoDecimalsOrLess) { throw new ChChingException("Income value must be a valid positive double that is 2 d.p. or less"); } From 2e283c2dee2de8d2cdf61eb6364bec964e96276c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:03:14 +0800 Subject: [PATCH 291/364] edit ym PPP --- docs/team/rayleigh47.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/team/rayleigh47.md b/docs/team/rayleigh47.md index 19e0ca59f9..7e528343b3 100644 --- a/docs/team/rayleigh47.md +++ b/docs/team/rayleigh47.md @@ -25,6 +25,7 @@ Given below are my contributions to the project. * Created invalid command to show users a default invalid message. * Contributed to add income command. * Contributed to add expense command. +* Contributed to add target command. * Contributed to JUnit tests for `IncomeTest`, `ExpenseTest`, `ListCommandTest`, `ClearCommandTest`. From 9c81979f1c7dcfc7fbc9790b363f83ca1e6aab72 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:07:35 +0800 Subject: [PATCH 292/364] further edit to UG and DG to tally with set target restraints --- docs/DeveloperGuide.md | 8 ++++++-- docs/UserGuide.md | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 96beea0483..5b0d4d5722 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -345,8 +345,12 @@ Given below are instructions to test the app manually.
      Expected: target value added of 500.50 SGD 3. Test case: `set target /v 500.123`
      Expected: target value will not be added as value is not 2 d.p., error details shown in status message. - 4. Test case: `set target /v 9999999` -
      Expected: target value will not be added as value is out of range, error details shown in statu message. + 4. Test case: `set target /v 999999999` +
      Expected: target value will not be added as value is out of range, error details shown in status message. +2. Show target + 1. Test case: +
      `show target` +
      Expected: Current target to be shown in status message. ### Setting Currency & Unsetting Currency 1. Setting program to display currency of interest and not display unwanted currencies diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0d62a3f011..d700a6317c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -217,8 +217,7 @@ Format:
      `set target /v VALUE` Use case: -- VALUE must be greater than - 10 000 000 and less than 10 000 000. -- VALUE will be stored as a positive double up to 2 decimal places. +- VALUE must be greater than -10 000 000 and less than 10 000 000. - VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. From 436ed272b459778993f24df6467b99b89527be01 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:09:41 +0800 Subject: [PATCH 293/364] sort out checkstyle --- src/main/java/chching/parser/Parser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index dd1c657262..5615dfb342 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -25,9 +25,7 @@ import chching.command.FindCommand; import chching.command.EditIncomeCommand; import chching.record.Expense; -import chching.record.ExpenseList; import chching.record.Income; -import chching.record.IncomeList; import chching.record.Target; import java.time.LocalDate; From 9f524a6a5be80007cbddbe29eff759caa2edac90 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 09:21:25 +0800 Subject: [PATCH 294/364] Update UG, DG. Add ClearTargetCommand --- docs/DeveloperGuide.md | 13 +++-- docs/UserGuide.md | 47 ++++++++++++------- src/main/java/chching/Ui.java | 3 ++ .../chching/command/ClearTargetCommand.java | 30 ++++++++++++ src/main/java/chching/parser/Parser.java | 5 ++ .../java/chching/record/TargetStorage.java | 9 +++- 6 files changed, 86 insertions(+), 21 deletions(-) create mode 100644 src/main/java/chching/command/ClearTargetCommand.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9701c8bdad..67787293a9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -29,7 +29,9 @@ ## Design & implementation -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +Below are the design and implementations of key features of the ChChing program. +
      We used various diagrams such as UML class diagrams, sequence diagrams and activity diagrams +to illustrate our methodology and approach. ### ExchangeRateApi @@ -332,8 +334,13 @@ Given below are instructions to test the app manually.
      For income: `find /t income /de bonus`
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. -### Setting target & Unsetting target - +### Setting target & Clearing target +1. Setting Target + 1. Prerequisites: Target set has to be within -99999.99 to 99999.99. + 2. Test case: `set target /v 350.50`
      Expected: Program will indicate to user that target has been set. If the target is out of range, program will indicate to users that target setting is invalid. +2. Clearing Target + 1. Prerequisites: Target must have been set in the first place. + 2. Test Case: `clear target`
      Expected: Program will indicate to user that target has been cleared. ### Setting Currency & Unsetting Currency 1. Setting program to display currency of interest and not display unwanted currencies diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e1caac22d6..843fdec3eb 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,23 +4,25 @@ * [Introduction](#introduction) * [Quick Start](#quick-start) * [Features](#features) - * [Adding an entry: ```add```](#adding-an-entry-add) - * [Listing all expenses and incomes: ```list```](#listing-all-expenses-and-incomes-list) - * [Updating an entry: ```edit```](#updating-an-entry-edit) - * [Setting currency to be converted: ```set currency```](#setting-currency-to-be-converted-set-currency) - * [Unset currency to be converted: ```unset currency```](#unset-currency-to-be-converted-unset-currency) - * [Finding an entry: ```find```](#finding-an-entry-find) - * [Deleting an entry: ```delete```](#deleting-an-entry-delete) - * [Clear entire income list: ```clear income```](#clear-entire-income-list-clear-income) - * [Clear entire expense list: ```clear income```](#clear-entire-expense-list-clear-income) - * [Clear entire both income and expense lists: ```clear all```](#clear-entire-both-income-and-expense-lists-clear-all) - * [Set a target for balance of finances: ```set target```](#set-a-target-for-balance-of-finances-set-target) - * [See target set: ```show target```](#see-target-set-show-target) - * [Finding balance of finances: ```balance```](#finding-balance-of-finances-balance) - * [View help: ```help```](#view-help-help) - * [Exit: ```exit```](#exit-exit) + * [Adding an entry: `add`](#adding-an-entry--add) + * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) + * [Updating an entry: `edit`](#updating-an-entry--edit) + * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) + * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) + * [Finding an entry: `find`](#finding-an-entry--find) + * [Deleting an entry: `delete`](#deleting-an-entry--delete) + * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) + * [Clear entire expense list: `clear income`](#clear-entire-expense-list--clear-income) + * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) + * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) + * [See target set: `show target`](#see-target-set--show-target) + * [Clear Target Set: `clear target`](#clear-target-set--clear-target) + * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) + * [View help: `help`](#view-help--help) + * [Exit: `exit`](#exit--exit) * [Saving and loading of data](#saving-and-loading-of-data) - * [Command Summary (Alphabetical Order)](#command-summary-alphabetical-order) + * [Other Notes](#other-notes) + * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) ## Introduction @@ -219,6 +221,8 @@ Format: Use case: - VALUE ranges from negative to positive +- Target must be within the range of -99999.99 to 99999.99 +- Target will be set to the nearest 2 decimal place Example of usage:
      `set target /v 350` @@ -230,6 +234,16 @@ Allows users to see the target they have set. Format:
      `show target` +### Clear Target Set: `clear target` + +Allow users to clear the target they have set. + +Format: +
      `clear target` + +Use case: +- A target must have been set in the first place. + ### Finding balance of finances: `balance` Shows users the balance after calculating the difference between income and expenses and informs users on whether they have reached their target. @@ -279,6 +293,7 @@ The data file is not to be edited manually. | Clear All Lists | `clear all` | | Clear Expense List | `clear expense` | | Clear Income List | `clear income` | +| Clear Target | `clear target` | | Delete Expense | `delete expense /in INDEX`
      e.g. `delete expense /in 1` | | Delete Income | `delete income /in INDEX`
      e.g. `delete income /in 2` | | Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 680decb39f..a1017ec335 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -187,6 +187,9 @@ public void showTargetAdded() { System.out.println(" Target added"); } + public void clearTarget() { + System.out.println(" Target cleared"); + } public void showListCleared() { System.out.println(" List(s) cleared"); diff --git a/src/main/java/chching/command/ClearTargetCommand.java b/src/main/java/chching/command/ClearTargetCommand.java new file mode 100644 index 0000000000..466e7611a7 --- /dev/null +++ b/src/main/java/chching/command/ClearTargetCommand.java @@ -0,0 +1,30 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; + +/** + * Models a class that clears target already set. Inherited from Command class. + */ +public class ClearTargetCommand extends Command{ + /** + * Executes clearing of targetStorage + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter, TargetStorage targetStorage) { + targetStorage.clearTargetList(); + } +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index aa77f3bde5..25fd904cc4 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -8,6 +8,7 @@ import chching.command.ClearAllCommand; import chching.command.ClearExpenseCommand; import chching.command.ClearIncomeCommand; +import chching.command.ClearTargetCommand; import chching.command.Command; import chching.command.InvalidCommand; import chching.command.ListIncomeCommand; @@ -141,6 +142,10 @@ public static Command parse( case "show target": command = new ShowTargetCommand(); break; + case "clear target": + command = new ClearTargetCommand(); + ui.clearTarget(); + break; default: command = new InvalidCommand(); } diff --git a/src/main/java/chching/record/TargetStorage.java b/src/main/java/chching/record/TargetStorage.java index 80f42bf582..8d374faec8 100644 --- a/src/main/java/chching/record/TargetStorage.java +++ b/src/main/java/chching/record/TargetStorage.java @@ -19,16 +19,21 @@ public TargetStorage(Target[] targetsList) { /** * Default Constructor to instantiate TargetStorage objects - * */ public TargetStorage() { targetsList = new Target[1]; } + public void addTarget(Target target) { targetsList[0] = target; } - public Target getTarget(){ + + public Target getTarget() { return targetsList[0]; } + + public void clearTargetList() { + targetsList[0] = null; + } } From 08dac9c77652ae8a990fa8eb8579b821945745c4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:21:25 +0800 Subject: [PATCH 295/364] cleanup type for clear expense --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d700a6317c..4b3399df89 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -195,7 +195,7 @@ Clear the entire list of incomes. Format:
      `clear income` -### Clear entire expense list: `clear income` +### Clear entire expense list: `clear expense` Clear the entire list of expenses. From f38ccf8aee0f314956ce4a1d445f2efae7fdf070 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 09:26:03 +0800 Subject: [PATCH 296/364] Update Target Limit --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 67787293a9..5a6565e8de 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -336,7 +336,7 @@ Given below are instructions to test the app manually.
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. ### Setting target & Clearing target 1. Setting Target - 1. Prerequisites: Target set has to be within -99999.99 to 99999.99. + 1. Prerequisites: Target set has to be within -9999999.99 to 9999999.99. 2. Test case: `set target /v 350.50`
      Expected: Program will indicate to user that target has been set. If the target is out of range, program will indicate to users that target setting is invalid. 2. Clearing Target 1. Prerequisites: Target must have been set in the first place. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 843fdec3eb..eb71c844aa 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -221,7 +221,7 @@ Format: Use case: - VALUE ranges from negative to positive -- Target must be within the range of -99999.99 to 99999.99 +- Target must be within the range of -9999999.99 to 9999999.99 - Target will be set to the nearest 2 decimal place Example of usage: From 9339530083d4eff5bec2ef33aae2879be4c08c5c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:26:30 +0800 Subject: [PATCH 297/364] cleanup DG to add new commands to header table --- docs/DeveloperGuide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5b0d4d5722..d852c1c409 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -15,6 +15,8 @@ - [ListExpenseCommand](#listexpensecommand) - [SetTargetCommand](#settargetcommand) - [SetCurrencyCommand](#setcurrencycommand) + - [UnsetCurrencyCommand](#unsetcurrencycommand) + - [FindCommand](#findcommand) - [Product scope](#product-scope) - [Target user profile](#target-user-profile) - [Value proposition](#value-proposition) From 8bef800439c070b2e6f3aa5c4e1709aad1046157 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:31:48 +0800 Subject: [PATCH 298/364] clean up uml diagrams for add income and list expense --- docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml | 3 ++- docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml index c37fbe0d51..6de32e66d3 100644 --- a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml +++ b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml @@ -6,8 +6,9 @@ participant ":Ui" as Ui activate Parser create AddIncomeCommand -activate AddIncomeCommand Parser -> AddIncomeCommand : AddIncomeCommand(income) + +activate AddIncomeCommand AddIncomeCommand -> AddIncomeCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) activate AddIncomeCommand diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml index c5674f9c52..f7fcfb5ce2 100644 --- a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -7,8 +7,9 @@ activate Parser create ListExpenseCommand -activate ListExpenseCommand Parser -> ListExpenseCommand : ListExpenseCommand(args) + +activate ListExpenseCommand ListExpenseCommand -> ListExpenseCommand : execute(incomes, expenses, ui, storage, selector, converter, targetStorage) activate ListExpenseCommand From 6c90a3a80f107940012c476c866057c867a71d37 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 09:45:15 +0800 Subject: [PATCH 299/364] further clean up of uml diagrams --- .../AddIncomeCommand_Sequence_Diagram.puml | 3 +++ .../ListExpenseCommand_Sequence_Diagram.puml | 1 + .../AddIncomeCommand_Sequence_Diagram.png | Bin 18637 -> 20137 bytes .../ListExpenseCommand_Sequence_Diagram.png | Bin 14475 -> 15874 bytes 4 files changed, 4 insertions(+) diff --git a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml index 6de32e66d3..2943a43112 100644 --- a/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml +++ b/docs/diagrams/AddIncomeCommand_Sequence_Diagram.puml @@ -1,10 +1,13 @@ @startuml + participant ":Parser" as Parser participant ":AddIncomeCommand" as AddIncomeCommand participant "incomes:IncomeList" as IncomeList participant ":Ui" as Ui +[-> Parser : parse() activate Parser + create AddIncomeCommand Parser -> AddIncomeCommand : AddIncomeCommand(income) diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml index f7fcfb5ce2..9a45a766a0 100644 --- a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -3,6 +3,7 @@ participant ":Parser" as Parser participant ":ListExpenseCommand" as ListExpenseCommand participant "expenses:ExpenseList" as ExpenseList +[-> Parser : parse() activate Parser create ListExpenseCommand diff --git a/docs/images/AddIncomeCommand_Sequence_Diagram.png b/docs/images/AddIncomeCommand_Sequence_Diagram.png index b9685018707e35ea71b1befa01ec7d98a4750816..f65c4a71999ec779f161aef859009ea36ba55b89 100644 GIT binary patch literal 20137 zcmc({cRbeb`!{}Rmx{6~MG@Jekjz9XD|?e&X0oz1>?E74Q1;%NWMo9bWs@zJ%ii-o zUTD1EpU?gH-jDnD`2BwUBd*tVzRq!+$MHO#$MZbhABYQ|ICkzB3WYjx@2;Q}3U$C4 zg~Aa%vJd{!H5+;fe$bflo`i)iBr5zNl$^@sYXt6SJGl%uft8 zjLj{K44Je{j4T`L$f1ek$1)1$zy6NGfp(sSg-eS`RPf`Mn0(*9I(y(Ke!{VPc!v&B zQ3z5DR<&eaFeNDLo;*BJX4N$pkn3LEJ=tJu(l^y`GI^+aRhuB)=_BF&OVX+5!-UL? z8Qxv{LF|!!Jl}ojFqQd>+u@g0syMU57<{zVvLv5}+{Zjc&ng&a`g1;{z4p=siwP%j zyZH6Roof$OZWN51#ADx2eO%W)G2}w1c^#V+L)Z%)#Q4MPimk75%?p=j$3((DEGNk}UwH2^KmB=> zw5wyp@YwZh^f@n#uW;ir-_+0=AnF-9RzYUIF8Pc|bxDK8;dye8w%4rPF*#dGe9Z}i z;X1BCj?PymoZPk}+AmIVH%p7&@m@dBlaO*<_nFk6KMkMBl_6KQI9x@NcB&%_n%VK;?sSpY|dX}NrOU(zPKlNOXisx zw)d#HY+KZ}sWuDsUH*!Gb;K zmx~{ZgNV=i&pqH@P^@{y9VO+jcy^!tolCENl&=(T_fBToa_dFfo49a=g-z>WN4h%K zMXe%jr#ksep2nX7`#_-tZ=bN;kNoE%#TPB)C;o+D7UZYf$+zuVl*)QN^iPAh^fAvz->NXr3ai0}^@GK4xJQ+c;R>p)#4h^Z zCpKd`*6)68nq=nYT(H3Fl7oHR=B0%ByUd`SMkdI^<(rcOOq0Vnqbh7iy!+3w15C}upJTki9b^No^s0!hryP0u+rzZXA<~}u&5pLa* zeMa&_QMZL=XJ<3Fmb$r23PzTQ8GZHJQ~g3ZjjKG`^aB<#d6%i#iw0aA25WTcpBl6! zs^%G&q^jDwS>_~|4pFO_iTTBfg?gXoT$&k>?y?Bqo$<4=i)dyk-LFc)@47N|zrGtp zm)Wh7>#Sdiw2KJeoHjKz#dhhG%+;xD4>iZc)w~Y*maOP$vpBJc?dId#rp)nKosT5B z_KI5Ubfmpy)rWi11gFm_=E;q-I)7{A$d-OLP8O%!D2Z((k@{Rw5Y0*A{B+RJLfJD* zgcw<0&!=Qr#N9&qCjI?YH6F=Ulh1k=ewr;$Z}*qjdP@XfRkV{ykj>0;r0B{s>8Erc zjHDg(8~NfhNF^foF;4G`4l$DotJ&zr%fp_Q*tLa(xCkN(Y+>W>!U%+*J?}^Ia+EHj z-)Pm`4`kYuV8MBd)vDp8j;@Ef%+ljyjDBOdfi;Pf2w|Nsf8Hdx`qd@wB4H?mE$;xJ-0*}T>(WfbEeiEC=6fHUDr^udRAUP`@mUAOdg6w5e z)g!X*qUBdBmkYPIPBm8Xt`5&9r54^#$uv@qm?#{5M?Dx*muuIa%CqEFZZRUfn4qWJ zuDG*RA~cjt!t={!t1b0xL)oz@9QKM`xkhPQ6q}#%@IHR{kdV{oxNYLBBaJJ`Ow(b| z{jQr(fU7?}@C>JT-m{pl9Og=+l!}K1U!DvmR~6V}o^S>+AJ2u2rAhC7kIeurDr&ft z71;}O*e^Tnaw5&^>@|&}%cxbmWe*BkP_l zWE6Er##@^4A$_9ix78 zqp#{s#&MjSS1R}Vqi_77MPZn(W7fw}PG7ExVtT1j6E!O1?n-Dud9`T=@^Hxm`J zV$CSK3cCrTA8_nVO~RX;-qpWeKR7sel5C^Bne4_)h>e<4cj{NzmW`y=3@jO)hsh^{ z7CHJlrj}UZ>PEksB&EK&z%@4JIH^)?q$>Msm8RKo9`NNpZs}XAXUjC7Xsueab(*lA z>N3>=Wohf=4HNVK0dtUbBVW?m|4wwWhP;yemj2ai^XWesy7e2klloP zQ~pr`>SfF_&u=pa|C4vrX>C@%Y;Dn(Dyj0-K*5+pf2sZ9&Xr+5+~lU(FLe{+J#M*E zyDI~|YcWbhOySi^1@oD%LXu}$OXXTWE6#Gsc8t)_WQ`ZPO7 zEX()&Q0%6HX&^Y7Y@_Z{hs`yL*NjTp4Op$ICPxQVh6fn(t=Zy>ozE7=e@ezwvl-io z+1YJ4;pAaEW}Buvj~Ds<_Bh4_sKuDOtS=AsN`jAib0Mueb40b1Mt2_`?~Ou@&#zv+ zx^vq_yIxPLgFPCV*X;QdSmJ2gFgEjKdVTdT;AN^TVJ%zV$UvxgARfjb!OcR?!xJMO zUYMe+&Sik6$g7fJf%z?@8Ou;$LV_+u)76wX!MtEI$rbT1>oTWypBfe19fQK{&yJ9) zg@qd6GDXHIOlHQo^9^RZ7MuH2p5U{lD?=bwUa)S+d0PX~yLd(nLmR*VetIt|4zslH z`kV@mlsK8p|94&jp;tP#;fb1RhKhI?4b@H{mEayI*>=VFffF=b@60^18)yrUjASTg zjZSq+j~AC~<|Zr7&$*l+on!_q@~U&9jX6~*2W@Q-E0{OgZDqH$aS(~`u>>UMFe^ed z-T{GujUm^p))o|7VtLN4>i`g#E?rOEWJ95x+@4`ltRRZ~EWRZjEvwrQ39Fb!m;yoaLXjBO9_#fG62mc3MPy258@KLk?WKc z=STcCKxwj~Bxh*DIvmdu)W@Rbo85@1o>UUUA zN%pL4D|6h2h*eorGu@GKn;o5^oL5a0Ey9jYlofHw=I>;x^v+aM+u(t$!A)$}CN%4` zu84;n@z+Vu&c5FHY{-k_4LP4fORQLt)pYJCOHQEqR8Ij6I?1F>N=k}Jt$3wZXrH^g zyJmf+!`yH!Y!rt)NFGtBL{3|ODZ#qB+FDNArOBQGGjfL&jn3e=Z_~AE-uU|ZYJ7Hi zJg?w-@&Yhoh#-0@g}=+FtErXfeb%e;=Bzfn`4A;-FlwvdA})wN9O|4 zvR#FL&FI(A_V>45a!nUYZ$`Dls&(fW1o`^1I&Rq+k<~XfO@IF=lA@F&c!t17l%1G_ z#M8@7%mRZpf<`h;d-6>+*E5;uV(xg=ef>&wPa+p-mOn?YPHQQaZn4jHdU2vn1P$FT zuwP#)E-p?^P7Vt@zgTh>c}_+vHHyB+T6FyT$NIxM02ip0BOKO#W@l&n`}=Qgt}`p= zGWe&}uh>3-off+14A{(tE_xevX6o>Vz#=48(@Mu)rlRUKZxOTVx3_}r^wL4KdS2>} zb^52frXIuhNfru8RV~^YBqu%_z$Y4xLvC~pP>8=LGfi{#_(Tx_UG>Emh3 z^fEzk7mqGlAYO=yxQyI(dvm#^rA4;%v~}`r*OL-Fi~bu94Pp5WB`}&(wR);L`RbGW8e-2fmd`dR7`kszj$XS30pANKJJ&d6BpK7{fs+ZYMo-e|IL zcGjaIV{}~aj&dis0vqC!gFep1jk^~RKL~jjwKpH{W=F>9F^0&&s7%}CD4qJiP6lYxFgDqn@#*G$unN)}Pu{1nR2Y{m%9);7 zLcjH?Nfd^0xgCp88i2^*AOF>terF|byBt5uYqxU2sz+lwUx1WU^Rl=7Qm0-*Lc;be z`S$Eckor_-)>t7XRXJ1J-9GBf!wVm$dW#%a23!LhY48tUJo&lr9P8ewBtN-&BLOS= z>{U8g(BmaF-sBSZ?r~a8h23R~HlAjR5mRCDt*L%}78dIGqLzb$18ghC%?trAsa-c; z)_wNE=Gr2`XC0FhCy?1O-atjaz#~VNPw?79nb((0556w(=G$6{@#dwY^X6IVXiboo zU9a`KVp6&~3X!{XrUI8v>jzN20y2eXG23p#)H_acZsHnt=hx4xd z*x#w3qQd=b=3z$orQ0rHy!J{drB6rdDp^T6jC%?#48UG3q=7r=?Cd;x^r%&@MSEwK zo{kpGtrfP53iCa$-+`W6V#}ZJk9L^(aZ8efG1FjWW&j-L`e>+$pitEzqnMnz zZ@2O67u)2SOBQ^O?9Vi~GRD}%9)_6(%#r5ej z^$*VAxh$|=(7QAbRpVWxTbbEGDC%<^)n23~g+HkmW8zJ^vhSh&e0{~k zZd{^s#Uq!?xYhkA#cpeLEVp`ico;&P5;|aE!F;v%jT=6gW2R&Zljh5K5)zUmOU1`+ zi2>uM1DH!!C@3j!vsYJDxtCL7*msu0-;;#-X1lM2V)IFPaMbrjM2tlAzSIA`sgC^@B!8sS1^CFdwDrI`Ayk+Z&)}N-g$0?g*d)V zPFmX45IwagOlPI5uG;jh;0PX+NI|@xhyCb<^`6r~!{~L`i1F1{C&;)JEZZPT4xf-L zcrqa1Mc-m$6qBWy0*FI-b6=EHp0VnxP}oY^q9<+62TN&9MvE{A!9HFWZkl%#S*0l{ zXlIeA+etF2KQB3;`U8v`457ZU5%5Ef1>=}+*T88n)^mzMt*K;FQ3S4+PTpZuVKTN( zuC|KXI(X1lIs5L~uwRp(pR}NA4mq#g1WDN$boOJj=AtJ9QaORjMLDbn=!(|XKuC0x zWs{cXMjZXInk1c_+e{VKMV5+b#d9P(NePP<^>qVuv|5P`1hS^4?Yl zFwFoDBlMm~ORC5+yrIF8UM^XVUSIgL(U~1)1*O?irkkxc5SV}2XgWiy2Jk^+Bwv~m zm|aj8dh3Uip2 zn1;OCIx@6Un&uT?vdbJcwM#T@o7t5x9DUD*R%VAdjJmRImyPF@x(4oxiW0gv=6KWo@UX2RvQ>(2WUCmEO@8}_1p;N~~+SwHOM+8C9*l=#^ zxiC&MLoaADj8(@Y{`EOF{lQ9iiWIN&oKj+#9Ir-?oCrU^EbDpQj5<%|(vAW%z0Mn& zl}8qZA1wD;MH&(1t?kF-PB&<0%1EFR30(NuBFs+4`SgQgmTr=K8nLqNbjh-yOJ}}m z%w%GRTDBM3MnIqfXn_0o?}HoGRTJS-;jvkup`l4h-N0*)5@%-kG2`p6ZNTnJD4oQVAduppKvfc zW`Of8u)_-5oQ)6s^IlNWBfsYw=KbGyO(082;@)n%)7 zk0&c&DDt%R^f(@Udk-#mf|K})M8x^)j~+n24nA9`H`hbCBtL(pk!zYTbON2y9l>MU zx{t!8_sQoIKnR9}gwV^U%3z7QJ#(9tAcwIpvcy(iY>4FRFAlWK2Y1L}(#PHH+tv1& z$9(YWa10y$MSt#G&8i9T(~0Cl_9Jy9I;sakKf6lQtqGG~NHL|lnxCUgk5EfpvHEGs zc@f8K6TwZ$Zze{?yXmwlC91Zzk*Me!oFJucO@Bb|u^enMohvoadr+0%{{*QT={4Po zAD?b3=ZfZ~#$Py*r(wRsShbBlBVCqRkzPr{QNGoX{*^xaq>N+EKBH2$JCqGuFa3} zZ5OP4yr1&knt^XyYxOc-8^vky`B6p)&Xg1F>iwH(jyyEo9EKgS$kxr$T+a{-U7|Rr zSS0wfHNkU{g!`^W z(0p|<%~8+5ZZd-wXjVCerSjMJ{9=J^Q&j7lGVZlWEdPNagBV}`uFb+om4w^sZpu#>=`H%IGu zk*a5Dd^QN^2?ryTkZ8iEq*Ut#-p+vBOmn>%@xr8hPVqlJ*X&~3m3MC1Fb+bK(AL&g z$mYh{b&Rb=#W%gr(;9c@mdrPk*e($Qv8T2b6?B)u-TkXz#A@&KsKWl2xxI=Rn>3j< z?{8VPrmTBA##q+}TInEcIJw;u^Up4Tq`X{?*9JB0Pr3Q6`Idmh@!kFg}sp3X;@(JU7bn-ZvF!fZ6_B;N@0FLx(daB=cwY z{|3hT!8Ma&PR$k0xPVP6xyHH-(k^g6djha#ZF#!Pu#>fvJV|^Pm=jnZFQxvh5X7Wv zT(-HyZqx;^<<-iv7NH3d!h9g0ex-fBi7)cqyLVw>hMNKnE`LLOJ33}&W_tSiRp;Ox zsQddnlJL*iICTlKrQg8%m;LV-{i4+t1I(J>L2}-|l9kV#1#!=kHa4d}?x2%DpJnMa z^=8F=-mplk`v+eibK&%qa4wH><2HNKW_u7%)x!Eb7#wYLKwW zT$(%cgKM> zMB$B7s#PkwlhVcu{OSb9oQH?Uq}a*5Oe(%LexRf&d*XxU5P2Q#n+rtGy!vdOO9h-a z3oxv#E$jsT2tpcca^Os~b#=udY5^{9tg4tmE1M9J-&&GG9Z@WprkB)4o>swJ}6x9W#?5;3UF3s#O$+fP-cFR=&P0L>vcnsW8GwX$s|knD;+KE zDV9la^xoWaUn<=R!abb>R%T8?+i3c|QP$b3yWgDGZtlUoh(8HSa!2jkPm|re3Y#+X z=6&3aSeYM>=+p1F%GR>T*WL+B4oy)n+X_;5NO0Hy$MlZfhz_ICRU`+PX>NWVo1*h9 zu?U$yisi?$vJHMhX3S3f>9C+l{(*tIdU{tbU+%GJSJi8Z2=IbzsA!`k{A(x&-dWbl zbnSchYQII@9vU2k8Cm#rnEcBf%*H*mfyyP)oX~TC3t)ex7}VB5CX!aN)YX+^VA7F( zi(TJJX(uQ90SLllKd=2-wh{!u0CydBa!MR zFKjlx#pN{k@LxROi6jH{oTd2eB!eLHA#TOoJB(vYhH)KObBMp&YnU_=sLbUp|7^L! z%c~aVBby{wdr&<5=HlkGV;SJdCZ6T6F8?LALQ^t@avj`JELXqQi2ZZpFy)i^CSRA> zzceEsq4jQOlh_Z`7ulKIomFC<|fEZh&9A%PaG4UP5 zW~A|nHtI+^Xop{0cw*P8Z%u`>eBoBSzP#_qfg&))y8mPeA?KDCH3mT3USKu`4Cc_!y*iI!mfEzW1@Xcw@AX zXQeM-?=x)r{z{u$>(eBDDZ3dWq#z0E4yzw6q`N3jl|TYTEPXp8Fl_PMqrCSQ_)V_@ z-8mg{O|LQxmPx~QF`i#<;_YZb-P*Tcs(5*uqw6VJ_`Js z0`G2QN$_oEpP?{Cx1zJtn!T3Fvz4!!sIQaJx8s_}^k#OW4NYFUk~=6Es>?(;Zdps> z<)1HJyqa8d-duwN?e$0^%z`p1QV^qSHQC_<|H8r;)Pjyg0&&wXBVXX6YWpmT{5wob zuY-=yjz{yqxZHR~`_DF0`v}Xbd53~dlbv$(cA~220pNwN8TZ_n_to55K-g2A%V3&q zDPCP-Y{0Q(XSe32$H%An%EVa4{rvfJZac_xA>iFRI?}cYO{-`%6_w;J9UL4+-_CS{v)jFbs` z#*`?RqV&{8TUDWm7As!GKEll9zMVMjUrDEb4+|TSVpMN)eVK%>dY30o`S`I{fSd<{Qef1bp?DNNY5Bo}&cw*&_zM9$B`zUWRmo3LBIg-mtT%~=iDN^G8ecvc?+Zpuk zcKe5!7(vMD1<0b9$27|RKz6b8bbIW|MPCcjUEYhZ9WN(X=P&DkWf%dj9$;jem2vTG zHDsTO#8_X=#>=B_xp&xxIIZVCBr0E#?GmG+ruHcCPc~?mvcQT28LCQLBJ9Q~no!onf>}-f?rVq#&rX;57{D0V(+e>;*{Q``K~J<@FF?Lpd-hXWbKlB5GpkMA}~vv+vUtf8eRo5D1MKVAn%Od+DHK2bbWc6gCS%$H*8)R z^klZ2>QQ7zr>d?48%TVOF2m#9rdxFr?|MUe0vV4DAtB+HLd%G_iLUTBXIKO_HELlA z^pvYoQh9tKsY-_G8o2qn0epR+xrnp((^%5I*?=O8*;r$MGKQbZkIVFp_H} zVNkf}*h*GxQT4uEm8Qn9*KKKUw-_%40sA{#>&Le?PB|;bZ8}&9y=aSc4fr)v-tQrK ztGkKvm!D~BQPBF!Og`>rc!uBJ-^w%YU7GBqByAhQQ3rbQ*2_a@0}1CNCMOM>J8}%< z7q6dOU3m_99pCoGy#CU>U*yJRCZ@)8kd;(Jbd*5n%yY}OPc1+{1|JL!4IMsto@OFf zwr8S?vbL#-gcI3utVuW8GruDdP19m_UzM+>^2@ zya5_74-$1MDxIy3)x=Fe3H|GR%Tm(P?J3G}4o0Hu=k||qB2H!+2Wy+G!u)MD=0oq( zZz&0d8@Ta6@YI4inW(aiTaeVTD04*fn4)t8_}p`63FXCrL4y>ov)FoGn9N$x-cun} zqn%7`-1TzmH(_#n88puO;_Kw^SsMQeUo7J#%YB%(q@WVEz}IJ3D*9x|xMP3W+wT$pf_JmsSeAzNqo)4= z=pD3tM?v($ag;yFKT$15h33RV)cfLpp;nVuRjr>8M9ujNQIl%0SX_m_$iDdnzjqr% z@dr@;!n3D{r4K`u_QA+6ti9U|zxC{|lF1%ckAs?8Pft&DG=;6OEY0*M6u;=e?%04- z+Qr6l2M->E0MSraS65%3wJhuN4et<26aQbmf3W1-0rP0HJQeQm-=ER@FJ7Eoa3H@cH?8I}J*-rswI({l7iAi`u=GWS;bMM~0vuDo=vO>$p zkcpM9<&I5O%9)rdnm&ms<2!_ksQ#Up*~KN!1A(;vi(k9ek2g>Wq8Q%kWijN(vzJkKFbRj=gFP={2lme zKSKYZDvu!cvD5HgwEOe>pM>iF;KhH86?p~4%Ri~!e}APHT#nv z<@_? z=kz>CB>CLu{NwjEWZi~@!)XXv%u%)dMuQ$cNWri@&qUqU;Q9ilotclXzwg-l!o7KN zAN7yd{QFDBCEa-@(=Bllc6N4BQr}^zwTJ#yC^7|3=l@}$DCq_nCKieeSy@>Gr%!`^ zAQe*Xx@xFCGppo3FuEm6;dmLBm;wJVB?gs9{#Rxz>synVnTbwQcZ9+?5xtz-0SZ#6 zgYd#;fLhia8JR{Pt?BW27QV@=+b@0>VRm1jAQgUnCc_fjH9yt_ssfb*mpX$XPCsg< z$oSAP6fYUmIss~uGB*wkIt2seaIpBYjX4oaER@``V4}f~x{G-sssklQMV3P0OtUd@ z2c1*#)qgBcn#x+V01Brb*TMLqppPH$*%dDoW~qs9y9W&wo(;gv^@Y9>5lm&TPlsHA zA~Jhon^5Da#lb<%HYR%5Zl_hF=c-85wY9asRNwJB2O62Kz}Iy?Ku7PCUrxSXyR=hc z-k}o$hBKt&#Kl6{8M(NMAQ_>13Z6rx@)}Y-c~Q`;n1Ke?brYM{pJ_Qe7OVv7AYirVS#)C%F7Xajt;|Le0E;aR9g$NG)rLwCJ3|*S%#3ty;@63 zS)VFu0w#I$`C&3Z5kVcTzEmP>3qL7IZ5PHRA3S)dELCKa?=5)#4irq=Dp06$6U2qd z+#^%orIcYXqfL=%6g7~g85d#MoAY(Qo-;!VPoBX+;o-d?c>p;;;$f38ZtJIjVn7@V zStOxFH=Qvo+#n){FiZqK6{HJ3UPIMhp&TX=M)$B21H7kA&v^5$#VY}$wQ^!_DkGM5 zr4D~l#3e-hleBbnAd6t6rOmKH@sI5KrK75a=91eH3fXS^$I&UF@K`d$koty(Vi@vj zKg}K=GZ&l=C3c+shdPugMb4K)asp65vjeJ_2zv(MBtbe3Qu2eFg|GkVjp#%VxI=K5 z?WBwtAkzaqc+VC^tKSpOge+E^4k(09k2>Iym;ITOR?OOV< z54Xb>spigrngG?G0TfMAHE>tF3zY;CU$onxoE*6^dA@{`{WX|kV5Od#ndSWFmnv#DG9FJI{Be6PMBwxO=WAzJ91Y*u zZoVAr-M_OZ62EFe`cqI)AS5KTbP_c~HD423(9Q=h1AUiW-2J%@V0G3(PSp>9UQtmI z$1(p8P!B8m#-o||h1P|p_ zbb&R)B$~aD>`ChWD1RP)(}LnPj+2-hc_MGkJonB7id)YIuL+1!vkZWBQNgEj-|%E@ z2~dtZp|_745jSmx`ul&FQ-EBFgjtOnboG)!Wo81<+C-~PiO^LXRQg2(v;d1D?==pV zsF-W02=XydQhm!cQf~GInl2=yc3BI+QvgCq#uZzOw&5N-27amyFd~y`A$~1Y(=w}(rg$+zC7)jQ!Mpl7E$D-#JstiCyrnhTwsZ`Ub3ceeaBG8f2}K@nY? z3tmaP`v~GwY)R86hjkn~Sl>Os1)<&PdD>P$O1qjZBZP$>HeWwKDE7yK+jie(f{GKb zeX|`0P{nPedwmsjahwZ2t_2Zqb!)jS5{hL|xdv~iTK@0nB<4Cm?G_OjNL@xOjhO#5 zu*~mm_U6Os%M7f|+}s=l)Uf~f6eZ&x9Ua}%qk<*TWFIX8ig_0R!oEeF(k%@QwtYU~ zwYT~3HU5VOC_dvg%^&euH3t4Tk>fYOisYW=CH&`CFS35o@<5(Dk$A_8F7%r*2p$Zv zZSv|lRw_}wLAjFkg~Q+_4xK#z$Usm*$TZ#r5$jX~?HX+MQNq5Yqh6 zFiRCODTid8{U$-M0&?$-H(XQczuVGAG?W`Nw?(cbUNcRtI-8dlcyzIsfU7}18AzXU z(~#h_bHKNkJ8{P%lh^lN!27oDZ-I^q6w>3ni|QXOe>7^95*ZyC0cv!)C_H`?ByvHK zktQY}qUD7h1F+PZY-dTZ(B^rbkabqngb0Caj4CJGl|Um z@9cs9;+@$TIBgcjopDL(3iSyQ9Op5VUHTUCnW)>Ypa}t|@Dm7=w_c6%SLD?Tp6Y0Z zK)n^rk&TwNwvZM(@YuE0%My2oyA~^kXzw}X<2CrO5>v7U0(7uk1oNa9F3B2r-!Ce( zyvNaeVFD3^&NE@;e(k0s*ZRd8O5`-_ik{65)(0^|MOJ)-hK17s6jEhdYnUK4n|llw zNzI-_XzZ zGf=j@wO%!;eq0>1C_*1LfJ9FT{Z1BPc^4?QbgSt;L{18FOVFYQ?mt7r6^vB)8$zy8 zygE+G-tez!fQR%Qb$tG@YuYFN=u(-!2k8^~X<PBXBOT#B+1OgB!|t6=HbS^Md}0i zov{*;yzmBTM$I^oj~?^4FZ=64XBNP19n@Th3X2ejpITLdD}|r zr|R0K{AM$#ET^hpcq zfMgE1CBnx>uqhEkJ52WMA?%W9(^_9D`?UoYhE8xE=vO}rv%56l9UB{oyFpN$WOKl6sqL|R9y$lHK#Y=H z7i0Vwed$t{!C<_0jDl)0f5ry|wat%V2*<6z<0fmJ>Su+m;;Wp#9DdgI=;Zb4kTiwA z5_yypjZ7s;-Ejzc86n3K>uw_Z!aQ~o{ixmx4P_lkd zvImw>6b*J9k56e$)*OBXT7a1g-MhrbuPwI2$!$3O!$c@I{C&qfE2j4ui@(bDt9@?9^e?5KCn-u`DYQ5fW~IzcvBlZWD!{*I8xOXhGhK&98(Ds!ru_1d-1=c@Nrzr?9{{`ce{Tpu9UzGzYH z9hQ$@;WsKp7Q-6ju7kdPumXWj7>m03Xp!kmHHhudW!7HuicCPK>hgNvw?b|0$F86KEJ$CNUO z0M{rYLg^cI6G_^nYeOke7X^n|J|-IT%waOqx7M}zUm?9qNQ6(yU#FS+CzdRN#~&UY zB_<;31>Q3-A2K^+Igs~2D6py)0x zC`(*aV1Dow8N^W=X&H4lsw-FWXj+P_Oe!EXsd&+6liX0k&o)%ct*fh!Q*PDCM6gcv z!7n1B6yOt-wmk|r=HaLyWc%Vg3pUmVQT;P&WLX2uI?v}=`^S|0H$Qb;YvOJJ2MbuB zb{)=p8v)7J1PR>(rrmQWgR9)s+wHhc-wuA&N>qcT&WhY*U}R*342qKS<=sQ5k&0g@ zsbC~cTE1(AAPon>P&j;cY3~RVGFy$6Iy&QwG&CzC%#O7P+57j0E|o+_(4;i$g$%zl zy%nav&qG0fcg`wYH2>YLL+^|C4oB?CVfM~E?8r{0S3aIXPG2DV4_Ih(IK4Gnw)E#% z2O*rQiU|7aco&krpekPcIwI!OKPy6s!l(XyKx^ZT=MhxJD?9~66SLde^ZSEfSQ>ld zhcj}(ahZ)ag!9^iMp&ZSA%xQmT{K;4;CNz&%A~}CUXILR<&>UQ4y{U~6G;givTv*p zIb8+k=O%%Q@wAQJl(Cl&h|I@_^L|QjHXe@SfL4=%fqN(bPDj^6RL&?nzT!RBS4gNg z@bpme2#683ytfrF#euZVjO)wfk$jHNHw_hE{j5CLyL(=K=g{86okM%}bG28n%=@>7 z3i6n$6!XJyOrU$Y^8&Gz0;l4t9da4=j?gm+SR2j_|7=X6uf}zhdFjN_zxz6FZRAvb zQt)Y9p|Ep*&if$;>oxYd{(0>3e>u5$_4)1cP!m;;tS6lN$xi>5lfb9 z|8gi&^auXTsB+LC15BOktN(IRpZdv>XY(l{ro>Eo<+uOaQAmOt2Z~qGA8+6WUHftA zzg+@w^!&a)JB(DAbN$(wxBumoWyOJ$I3}eQw2c)b$DiH(FZT=l=QPlO|F#PA`s+|; z)dR95(<)hc)wcJa+N}CFr;9A@CsY_To#E|KB^El01#?2PQ=6a3(Km}^PT}4lO+i%j zrFI*$85*C-M8(AuPzh%o9ZT3iu%8H7R;A_dMV_%))EOqzDVoQgJZrdvd3d;kjZdsSyNzg z@s7D0=yAbCgAs0Bn62c@n>NfK`gPD=?Rjp}?6;_BIMksCU_4y&U3avQ6t>HP^;$P% za7rne4x51>2Ic7aCb5xksAvqlH@M3790R=ORCYLbS80&?_-CCj0BW@sfP31-e<2xDP|GFkuywpo}6} zPkMlyl=|}ZOyiVqBNJ!1mNJCNH&c}E__rl-z!AhG-y+;Xr-A$JZ(O>s-rO-Vm&f+6 z?e6Nsv3>9N$YFU2p|&ZzOKc2b^zY0hX|6QN<>lNc(%w5N%wmwC`f7b?Q`Ii{iw!KW zSR}92_SQBC{#RZd^{WyNP@>{mzY+~}DGy{SAr!odZ_d-IWopaX*tn?Z{-@TxJr%s#F7&Eg=MeGn&h}+Zv07JfYjFKw zS*pQ^*leW7zmMwYoeVNtt$2vsTybZBQXu zsk@SI#OWMwSv#}(wsrRuehXGwGRHvOty{_Y)6?BuxQ-rp%A|hA5KcN*$&vYi3Lqr7 zV^WW=2moPOQr|zdLEdAct6qJ#R&QWJ?R=Rx-uW+86)TK_XY^!Gtj!Etx2|4 zDNCY-(mCx`J|sIXG)pd`EnslGn+v!(Vz4F3CrVQ8gHvcTiF5N<6f@pTAzC~b)b*~r z?Gy=#Uhm$3Xw1vL=j=%P5f|sCp+vr*b%~YSw`N#%*0 zYKKvovDdNcHD3Gq^DJz+uKZcAjScVP?buu+>m<1pO!JV-z-QsQz(Xg_Ju(Y2Q&rye zKE0tPWGhX!KZy7?28=T6&z)JC-d0~sH8Zf1Geo3NE22Eis|&3TKE;p^2J5Ne%vyi`Lv*%5ZF>3Tx_@6#;D`fEuA3EO|T08EsjS| zd+F?G{ z2M?;hI>(pD_Y}@>ZE1Onor<&>yk=bSs#ah8aYy)$;}}SxkFHO1+~iV@c~F^ zvtL2t-StJdtYmJ^(h7r?F2VG4g%fpqm#wv>1u-a6r8QTpgrU#!IZvr^qHKT z@YtPfi@cf!!|*DR@NG{QX;@_<5vD_V`HPR{Y@<2vnr2gkfT^EfnJ4p9 z0*Lf0xn``&LbdGMA9o{@Fi6ew=-UMg%+^r8pYc+h0#mSqVKND8VcL3Bwa{=%Oj$~ZYV}P z)0DHZxdVG#Ij__bPJI}ACTJqJCP_AGWvKiEUqPdQ7yogC#Qz1h`PbzX|9?X~xI98E zWH93%c6LZF!e)YYz20g2+0-5&RF0LvYyam>8zfQOODjXy-dvzJReQ*yY&pH94O|A? zKeavEvxhVD7}ScjYu@Z{GzdA}OEKjl!TY#Q=&!r0lub(fLW}yWy{dFiW##Rid){LG z!PjTA2P4m$etJW`-J!m1^UYcaF0FvOGgOO~M&P7*I|8^(2L(EJae9RabIJ8~%0MPn z8@QHW9oI?SdOQX93WOEUN*#J8we`i<;{ex3-?14?j@3rhNvOE3ALM3yiYQi4sE0y` poCW1H4qO8KW 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 G=zjr9qR!F) diff --git a/docs/images/ListExpenseCommand_Sequence_Diagram.png b/docs/images/ListExpenseCommand_Sequence_Diagram.png index e298c337ce0d6730a1358f0d9f13eb95453f949f..005f0a8b2505fb3014069d869961bcd8121f1d20 100644 GIT binary patch literal 15874 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 V&D7e>?QP_BQsS~=1tR*s{|~|2sjC10 literal 14475 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 Date: Fri, 7 Apr 2023 10:30:13 +0800 Subject: [PATCH 300/364] Added architecture diagram and update design portion of DG --- docs/DeveloperGuide.md | 31 ++++++++++++++++++------- docs/diagrams/ArchitectureDiagram.puml | 21 +++++++++++++++++ docs/images/ArchitectureDiagram.png | Bin 0 -> 16085 bytes 3 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 docs/diagrams/ArchitectureDiagram.puml create mode 100644 docs/images/ArchitectureDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 47065bf3a0..24913e3041 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -27,29 +27,42 @@ ## Acknowledgements - -<<<<<<< HEAD -======= {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +### ExchangeRateApi + +`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the[ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. +The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, +by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. +The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. +The `converter` hashmap is then used to convert the currency of interest to SGD. +If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. +The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. + ## Design & implementation Below are the design and implementations of key features of the ChChing program.
      We used various diagrams such as UML class diagrams, sequence diagrams and activity diagrams to illustrate our methodology and approach. ->>>>>>> master -### ExchangeRateApi +## Design +The architecture diagram of ChChing below provides an overview of the design of our program. -`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. +![Design](images/ArchitectureDiagram.png) -## Design & implementation +The ChChing program first enters the `run()` state, where it will access the `Storage` class +which reads the .json file from `Data` to populate the program's entries. -The overall design and implementation of our product. +Next, `User` inputs are read by `Ui`, which passes the inputs to `run()`. `run()` sends the +inputs to `Parser` which is responsible for returning a recognized `Command`. -## Design +Next, `run()` calls for the specific `Command` class to be executed. +`Command` makes use of `Ui` to present the appropriate command output to the user. +When the program is to exit, `Command` instructs `Storage` to write the entries to `Data`. +`Storage` will read from `Data` when the program is launched and write and update to `Data` +when the program exits. ## Implementation diff --git a/docs/diagrams/ArchitectureDiagram.puml b/docs/diagrams/ArchitectureDiagram.puml new file mode 100644 index 0000000000..c59f57ef25 --- /dev/null +++ b/docs/diagrams/ArchitectureDiagram.puml @@ -0,0 +1,21 @@ +@startuml + +node "ChChing"{ + [ChChing.run()] + [Storage] + [Parser] + [Ui] + [Command] +} + +[User] <-> [Ui] +[Ui] <--> [ChChing.run()] +[ChChing.run()] <-> [Parser] +[ChChing.run()] --> [Command] +[Command] --> [Ui] +[ChChing.run()] --> [Storage] +[Command] --> [Storage] +[Storage] <--> [Data] + + +@enduml diff --git a/docs/images/ArchitectureDiagram.png b/docs/images/ArchitectureDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..95dec244ed7677c29c0f9d3a014507e01b4c1304 GIT binary patch literal 16085 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 literal 0 HcmV?d00001 From e3bb99fa275ec1c0d00c11fa3a86a4a5cea317d8 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 7 Apr 2023 11:06:51 +0800 Subject: [PATCH 301/364] update Developer Guide for version 2.1 --- docs/DeveloperGuide.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5a6565e8de..f5732480ba 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -9,7 +9,7 @@ - [Record and RecordList](#record-and-recordlist) - [DeleteIncomeCommand](#deleteincomecommand) - [Target and TargetStorage](#target-and-targetstorage) - - [[Proposed] EditIncomeCommand/EditExpenseCommand](#proposed-editincomecommandeditexpensecommand) + - [EditIncomeCommand/EditExpenseCommand](#editincomecommandeditexpensecommand) - [AddIncomeCommand](#addincomecommand) - [ListExpenseCommand](#listexpensecommand) - [SetTargetCommand](#settargetcommand) @@ -25,7 +25,9 @@ ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +The template of ChChing is from the [tp project](https://github.com/nus-cs2113-AY2223S2/tp) of the nus-cs2113-AY2223S2 organisation. +
      The format and coding style of ChChing is largely inspired by the [addressbook-level2](https://github.com/se-edu/addressbook-level2) & [addressbook-level3](https://github.com/se-edu/addressbook-level3) project. + ## Design & implementation @@ -63,7 +65,7 @@ The `Target` and `TargetStorage` class allows users to set a target for their id ![Target Class](images/Target_UML.png) -### [Proposed] EditIncomeCommand/EditExpenseCommand +### EditIncomeCommand/EditExpenseCommand The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. @@ -78,12 +80,12 @@ Given below is how the edit income mechanism works at each step: The following sequence diagram shows how the edit income command works:
      ![edit income sequence diagram](images/EditIncomeCommand_sequence_diagram.png) -The edit expense command works in a similar way, with its sequence diagram as shown: +The edit expense command works in a similar way, with an additional hasCategory check in its sequence diagram as shown:
      ![edit expense sequence diagram](images/EditExpenseCommand_sequence_diagram.png) The following activity diagram summarises what happens when a user executes edit income command:
      ![edit income activity diagram](images/EditIncomeCommand_activity_diagram.png) -
      Note that edit expense command produces the same activity diagram. +
      Note: edit expense command produces the same activity diagram. **Design Considerations**
      The following are the design alternatives we considered for edit income/expense command: @@ -106,6 +108,7 @@ The AddIncomeCommand is facilitated by `Parser`, `AddIncomeCommand`, `IncomeList to print the `Income` added. ![AddIncomeCommand](images/AddIncomeCommand_Sequence_Diagram.png) +
      Note: AddExpenseCommand works in a similar way. ### ListExpenseCommand @@ -120,6 +123,8 @@ The listExpenseCommand is facilitated by `Parser`, `ListExpenseCommand` and `Exp expenses in `expenses`. ![ListExpenseCommand](images/ListExpenseCommand_Sequence_Diagram.png) +
      Note: ListIncomeCommand works in a similar way, but instead calls `printIncomeList`. +
      Note: ListCommand works in a similar way, but calls both `printIncomeList` and `printExpenseList`. ### SetTargetCommand @@ -175,7 +180,7 @@ The value proposition of ChChing is its ability to track income and expenses on ## User Stories | Version | As a ... | I want to ... | So that I can ... | -| ------- | --------- | --------------------------------------- | --------------------------------------------------------------------------------------- | +|---------|-----------|-----------------------------------------|-----------------------------------------------------------------------------------------| | v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | | v1.0 | user | add new expense to the records | record all my expenses | | v1.0 | user | add new income to the records | record all my incomes | @@ -196,6 +201,7 @@ The value proposition of ChChing is its ability to track income and expenses on - ChChing should not crash under normal circumstances. - Dates should be in the format of dd/mm/yyyy, it should be a valid date, and it should not be a future date. - Amount should be a positive number. + - Value amount should only be up to 2 decimal places. - Only characters in the english keyboard should be used. - Constraints: @@ -216,7 +222,7 @@ The value proposition of ChChing is its ability to track income and expenses on
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50` - Should the arguments be in the wrong order, ChChing would still be able to parse the arguments correctly.
      However, should the command not be written first, ChChing would not be able to parse the command.
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry. -
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since command is not written first. +
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since `add command` is not written first. ## Glossary From 47bdd6b666218539f20ad85e97e89da02dd1a975 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 7 Apr 2023 11:08:28 +0800 Subject: [PATCH 302/364] Update EditExpenseCommand and EditIncomeCommand classes to remove magic strings --- .../chching/command/EditExpenseCommand.java | 28 +++++++++++-------- .../chching/command/EditIncomeCommand.java | 21 ++++++++------ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java index 46d6ab627f..ea4453ac0d 100644 --- a/src/main/java/chching/command/EditExpenseCommand.java +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -17,6 +17,10 @@ * Models a class to handle the EditExpense command. Inherited from Command class. */ public class EditExpenseCommand extends Command { + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; private int index; private HashMap argumentsByField; private boolean hasCategory; @@ -29,10 +33,10 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi this.argumentsByField = argumentsByField; index = Expenses.getIndex(argumentsByField); - hasCategory = argumentsByField.containsKey("c"); - hasDescription = argumentsByField.containsKey("de"); - hasDate = argumentsByField.containsKey("da"); - hasValue = argumentsByField.containsKey("v"); + hasCategory = argumentsByField.containsKey(CATEGORY_FIELD); + hasDescription = argumentsByField.containsKey(DESCRIPTION_FIELD); + hasDate = argumentsByField.containsKey(DATE_FIELD); + hasValue = argumentsByField.containsKey(VALUE_FIELD); } /** @@ -67,20 +71,20 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto // edit the fields accordingly if (hasCategory) { - String value = argumentsByField.get("c"); - expenses.editExpense(index, "c", value); + String value = argumentsByField.get(CATEGORY_FIELD); + expenses.editExpense(index, CATEGORY_FIELD, value); } if (hasDescription) { - String value = argumentsByField.get("de"); - expenses.editExpense(index, "de", value); + String value = argumentsByField.get(DESCRIPTION_FIELD); + expenses.editExpense(index, DESCRIPTION_FIELD, value); } if (hasDate) { - String value = argumentsByField.get("da"); - expenses.editExpense(index, "da", value); + String value = argumentsByField.get(DATE_FIELD); + expenses.editExpense(index, DATE_FIELD, value); } if (hasValue) { - String value = argumentsByField.get("v"); - expenses.editExpense(index, "v", value); + String value = argumentsByField.get(VALUE_FIELD); + expenses.editExpense(index, VALUE_FIELD, value); } boolean isExpense = true; diff --git a/src/main/java/chching/command/EditIncomeCommand.java b/src/main/java/chching/command/EditIncomeCommand.java index c95b768201..b55fca96dc 100644 --- a/src/main/java/chching/command/EditIncomeCommand.java +++ b/src/main/java/chching/command/EditIncomeCommand.java @@ -17,6 +17,9 @@ * Models a class to handle the EditIncome command. Inherited from Command class. */ public class EditIncomeCommand extends Command { + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; private int index; private HashMap argumentsByField; private boolean hasDescription; @@ -27,9 +30,9 @@ public EditIncomeCommand(HashMap argumentsByField) throws ChChin this.argumentsByField = argumentsByField; index = Incomes.getIndex(argumentsByField); - hasDescription = argumentsByField.containsKey("de"); - hasDate = argumentsByField.containsKey("da"); - hasValue = argumentsByField.containsKey("v"); + hasDescription = argumentsByField.containsKey(DESCRIPTION_FIELD); + hasDate = argumentsByField.containsKey(DATE_FIELD); + hasValue = argumentsByField.containsKey(VALUE_FIELD); } /** @@ -64,16 +67,16 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto // edit the fields accordingly if (hasDescription) { - String value = argumentsByField.get("de"); - incomes.editIncome(index, "de", value); + String value = argumentsByField.get(DESCRIPTION_FIELD); + incomes.editIncome(index, DESCRIPTION_FIELD, value); } if (hasDate) { - String value = argumentsByField.get("da"); - incomes.editIncome(index, "da", value); + String value = argumentsByField.get(DATE_FIELD); + incomes.editIncome(index, DATE_FIELD, value); } if (hasValue) { - String value = argumentsByField.get("v"); - incomes.editIncome(index, "v", value); + String value = argumentsByField.get(VALUE_FIELD); + incomes.editIncome(index, VALUE_FIELD, value); } boolean isExpense = false; From c011ef26eef8221948cbaf4fb028839b4425b768 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 7 Apr 2023 12:16:32 +0800 Subject: [PATCH 303/364] Update parser to make the command and fields for arguments case insensitive --- src/main/java/chching/parser/Parser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 9127349cd1..e1f2af8c55 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -52,12 +52,13 @@ public class Parser { public static Command parse(String line, Ui ui) throws ChChingException { List lineParts = splitLine(line); String instruction = lineParts.get(0); + String instructionLowerCase = instruction.toLowerCase(); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); Command command = new Command(); int index; try { - switch (instruction) { + switch (instructionLowerCase) { case "add income": Income income = Incomes.parseIncome(argumentsByField); command = new AddIncomeCommand(income); @@ -178,7 +179,7 @@ public static HashMap sortArguments(List arguments) thro String field = null; String value = null; try { - field = fieldAndValue[0].trim(); + field = fieldAndValue[0].trim().toLowerCase(); value = fieldAndValue[1].trim(); } catch (Exception e) { if (field == null) { From acd4b93c38b14e5f081c043851d4ffc475fae98e Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Fri, 7 Apr 2023 12:23:00 +0800 Subject: [PATCH 304/364] Update User Guide to note on the case insensitivitiy --- docs/UserGuide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 21f94118ef..1416ac9e25 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -278,6 +278,8 @@ The data file is not to be edited manually.
      e.g. `add expense /c meal /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` will not be allowed since it has duplicate category fields. * ChChing allows for the fields' order to be changed.
      e.g. `add expense /de breakfast @Technoedge /c meal /da 22-03-2023 /v 3.50` will add the expense successfully. +* ChChing allows command and argument fields to be case-insensitive. However, the values of the fields would be stored according to the case of the input. +
      e.g. `EDIT INCOME /IN 1 /DE DINNER` would successfully edit the description of the first income recorded to `DINNER`. * ChChing will allow for duplicate entries to be added. No warning would be raised. * ChChing will not allow for the user to use '/', unless it is used to specify the field.
      e.g. `add expense /c meal /de breakfast / lunch /da 22-03-2023 /v 3.50` will be allowed. From 932c8e9a939691302a88252ec18127b0647449a7 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 7 Apr 2023 17:12:31 +0800 Subject: [PATCH 305/364] updated livecurrencyapi in DG --- docs/DeveloperGuide.md | 54 ++++++++++-------- .../LiveCurrencyApi_Sequence_Diagram.puml | 45 +++++++++++++++ .../LiveCurrencyApi_Sequence_Diagram.png | Bin 0 -> 49703 bytes docs/team/hyperbola-bear.md | 47 +++++++++------ .../java/chching/api/LiveCurrencyApi.java | 6 +- 5 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 docs/diagrams/LiveCurrencyApi_Sequence_Diagram.puml create mode 100644 docs/images/LiveCurrencyApi_Sequence_Diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9701c8bdad..8e7040742c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -25,16 +25,14 @@ ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +### ExchangeRateApi + +The `LiveCurrencyApi` class uses the [ExchangeRateApi](https://www.exchangerate-api.com/) to retrieve the latest exchange rates. ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} -### ExchangeRateApi - -`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. - ## Implementation ### Record and RecordList @@ -128,6 +126,11 @@ The `Parser` object then returns to `ChChing`. `ChChing` object then runs the `e ![SetTargetCommand UML](images/SetTargetCommand.png) +### LiveCurrencyApi + +`LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. +![LiveCurrencyApi_sequence_diagram.png](images%2FLiveCurrencyApi_sequence_diagram.png) + ### SetCurrencyCommand The setCurrencyCommand is facilitated by `System`, `Selector`, `UI`, `Parser` and `ExpenseList`. @@ -147,7 +150,6 @@ The unsetCurrencyCommand works in a similar way to the setCurrencyCommand. The diagram below shows the sequence diagram for the unsetCurrencyCommand. ![SetCurrencyCommand_sequence_diagram.png](images%2FUnsetCurrencyCommand_sequence_diagram.png) - ### Find The FindCommand is facilitated by `System`, `UI`,`Parser`, `ExpenseList` and `IncomeList`. @@ -158,8 +160,6 @@ By using a loop, the `execute()` method will then search through the `ExpenseLis The `execute()` method will then print out the selected expenses/incomes that matches the search fields using `showMatchedExpense()` or `showMatchedIncome()` method from `UI` to `System` ![FindCommand_sequence_diagram.png](images%2FFindCommand_sequence_diagram.png) - - ## Product scope ### Target user profile @@ -234,6 +234,7 @@ The value proposition of ChChing is its ability to track income and expenses on Given below are instructions to test the app manually. ### Launch and Shutdown + 1. Initial launch 1. Download the jar file and copy into an empty folder. 2. Open a command prompt in the folder and run the command `java -jar tp.jar`. ChChing should start up. @@ -241,29 +242,30 @@ Given below are instructions to test the app manually. 1. Type `exit` into the command prompt and press enter. ChChing should shut down and update the save file accordingly. ### Adding an income/expense + 1. Adding an income/expense 1. Test case:
      For income:`add income /de salary /da 12-12-2022 /v 350`
      For expense:`add expense /c meal /de food /da 13-12-2022 /v 3.50`
      Expected: The income/expense should be added to the income/expense list and the balance should be updated accordingly. - 2. Test case: + 2. Test case:
      For income: `add income /da 12-12-2022 /v 3.50`
      For expense: `add expense /de food /v 3.50` -
      Expected: No income is added. Error details shown in the status message. - 3. Other incorrect add income commands to try: +
      Expected: No income is added. Error details shown in the status message. 3. Other incorrect add income commands to try:
      no fields/missing fields - `add income` `add expense`.
      incorrect date format/invalid date/future date - `add income /de ang pao /da 30-02-2022 /v 10` `add expense /c transport /de bus fare /da 31-04-2029 /v 5.30`.
      negative value/zero value/1000000000 and above value/non-float value - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`.
      Expected: Similar to previous. ### Editing an income/expense + 1. Editing an income/expense 1. Prerequisites: List already contains income/expense entry at specified index to be edited. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. - 2. Test case: + 2. Test case:
      For income: `edit income 1 /de bonus /da 12-12-2022 /v 350`
      For expense: `edit expense 1 /c meal /de food /da 13-12-2022 /v 3.50`
      Expected: The income/expense at index 1 should be edited with updated changes should be reflected in list and the balance should be updated accordingly. - 3. Test case: + 3. Test case:
      For income: `edit income /in 0 /de toto /da 12-12-2022 /v 100`
      For expense: `edit expense /in 0 /c meal /de food /da 13-12-2022 /v 3.50`
      Expected: income/expense will not be edited. Error details shown in the status message. @@ -275,13 +277,15 @@ Given below are instructions to test the app manually.
      Expected: Similar to previous. ### Deleting an income/expense + 1. Deleting an income/expense + 1. Prerequisites: List already contains income/expense entry at specified index to be deleted. Their index can be found using the `list` command. Note that index may vary after every `delete income`/`delete expense` command. - 2. Test case: + 2. Test case:
      For income: `delete income /in 1`
      For expense: `delete expense /in 1`
      Expected: The income/expense at index 1 should be deleted from the income/expense list and the balance should be updated accordingly.
      Depending on the index of the deleted income/expense, the index of the other incomes/expenses after it will be updated accordingly. - 3. Test case: + 3. Test case:
      For income: `delete income /in 0`
      For expense: `delete expense /in 0`
      Expected: income/expense will not be deleted. Error details shown in the status message. @@ -291,11 +295,12 @@ Given below are instructions to test the app manually.
      Expected: Similar to previous. 2. Clearing all incomes/expenses + 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. 2. Test case:
      For incomes: `clear income`
      For expenses: `clear expense` -
      Expected: All incomes/expenses should be deleted from the income/expense list and the balance should be updated accordingly. +
      Expected: All incomes/expenses should be deleted from the income/expense list and the balance should be updated accordingly. 3. Clearing all incomes and expenses 1. Prerequisites: List already contains income and/or expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. @@ -303,28 +308,31 @@ Given below are instructions to test the app manually.
      Expected: All incomes and expenses should be deleted from both the income and expense list and the balance should be updated to 0. ### Listing all income/expense & Viewing balance + 1. List all incomes and/or expenses + 1. Prerequisites: Should there be a currency set, it will be shown based on the set currency. Otherwise, records will be displayed in SGD. 2. Test case: should there be income/expense entries in the list
      For income: `list income` -
      For expense: `list expense` +
      For expense: `list expense`
      For both: `list`
      Expected: All incomes and/or expenses should be listed. Note deleted incomes/expenses will not be shown. 3. Test case: should there be no income/expense entries in the list
      For income: `list income` -
      For expense: `list expense` +
      For expense: `list expense`
      For both: `list`
      Expected: No income/expense will be listed. Status message will indicate that the list is empty. 2. View balance - 1. Prerequisites: If the target has not been set by the user, it will be set to 0 by default. should there be no currency set, only SGD will be shown, else it will additionally show the set currency. + 1. Prerequisites: If the target has not been set by the user, it will be set to 0 by default. should there be no currency set, only SGD will be shown, else it will additionally show the set currency. 2. Test case: `balance`
      Expected: The total expense, total income, current balance and current target will be shown. Should the current balance or equal to the current target, it will prompt a good job message, otherwise it will prompt a message that balance has not reached target. ### Finding income/expense + 1. Finding income/expense 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. - 2. Test case: + 2. Test case:
      For income: `find /t income /de bonus`
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: All income with description containing "bonus" should be listed. All expense with category containing "food", description containing "sushi" and on date "03-03-2023" should be listed. Note deleted incomes/expenses will not be shown. @@ -332,13 +340,14 @@ Given below are instructions to test the app manually.
      For income: `find /t income /de bonus`
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. -### Setting target & Unsetting target +### Setting target & Unsetting target ### Setting Currency & Unsetting Currency + 1. Setting program to display currency of interest and not display unwanted currencies 1. Prerequisites: List already contains income/expense entry/entries. Can be checked via `list income`/`list expense`/`list` command. - 2. Test case: + 2. Test case:
      For income: `set currency /cr HKD`
      For expense: `set currency /cr USD`
      Expected: All income/expense entries, balance and target will be displayed in the SGD as well as any set currencies. @@ -346,4 +355,3 @@ Given below are instructions to test the app manually.
      For income: `set currency /cr JPY`
      For expense: `set currency /cr EUR`
      Expected: Error message will be shown. No currency will be set. - diff --git a/docs/diagrams/LiveCurrencyApi_Sequence_Diagram.puml b/docs/diagrams/LiveCurrencyApi_Sequence_Diagram.puml new file mode 100644 index 0000000000..716490d138 --- /dev/null +++ b/docs/diagrams/LiveCurrencyApi_Sequence_Diagram.puml @@ -0,0 +1,45 @@ +@startuml +participant ":ChChing" as CC +participant ":Converter" as Converter +participant ":Selector" as Selector +participant ":LiveCurrencyApi" as Api +participant "ExchangeRateApi" as source +participant ":ChChingException" as ChChingException + +-> CC : run() +activate CC +CC -> Selector : new Selector() +activate Selector +deactivate Selector +CC -> Converter : new Converter() +activate Converter +deactivate Converter +ChChing -> LiveCurrencyApi : new LiveCurrencyApi() +activate LiveCurrencyApi +LiveCurrencyApi -> ExchangeRateApi : GET request to https://v6.exchangerate-api.com/ +activate ExchangeRateApi +ExchangeRateApi --> LiveCurrencyApi : response +deactivate ExchangeRateApi +LiveCurrencyApi --> LiveCurrencyApi : parse response +LiveCurrencyApi -> Selector : containsCurrency(currencyCode) +activate Selector + +opt currencyCode is in the list + Selector --> LiveCurrencyApi : true + LiveCurrencyApi -> Converter : setConversionRate(currencyCode, rate) +end + +alt currencyCode is not in the list + Selector --> LiveCurrencyApi : false + deactivate Selector + LiveCurrencyApi -> ChChingException : throw new ChChingException("currency not available") + activate ChChingException + deactivate ChChingException +end +CC <-- LiveCurrencyApi +deactivate LiveCurrencyApi +<- CC +deactivate CC + + +@enduml \ No newline at end of file diff --git a/docs/images/LiveCurrencyApi_Sequence_Diagram.png b/docs/images/LiveCurrencyApi_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..344fa800ca2530120dda6da744c9c5f79025a810 GIT binary patch literal 49703 zcmeFZby!tv^ev2uiin`Jf`W*W($Xralt{OLbV+ZdY+5Y3q(Mqra;tQAr*wD6=FSaz z!h`4ho_p`}-0zR?{Br>JUh7?N%sIxGV=lM5k|NkANKRm2U|`=C6}*Rmaby4kLik71T&qkHI*)X&kv%fJN@X}tEg8kv?{UfaX6+Dr zsb+&`ndke4OrE-{f@?2io^rOUVrpO1zITMh&mb-6S(5xqeI9FF@~-IgG9!(eMxW^L z@hK0Myv}9U+FD`z+oN(HFD~ah8ZusTI5@I&qAJ+i16y$`B$D#Nq2tmcBTWWOLHD0! zdSdIuTu$Ybtc$gi{T6!)Q|8kcbL9Dz^wof5D;(ze3)guTu`hK^8XB|Sj#l$HHZVfT zY=3Sd?Hch-^23!+8gCrG_3_;C{#fq&iWfW1(RM%1LM2|0>a^lX)WKzFc6^+6K>Nuf z#^>TGas~oB2~!d=$-eBYH9K#olH>w3wQAx+tr>|tl>>bEltg_h)!ZY^g`7hjoE3Pb z73R}U=9{i+BG_gN`nKvF6&dWqIPh@9<Ku;#l8P93@SUoS%Jft;zOlTvBBL@jomF^Z zgGlqGP;~{iV@@Q>dM|0_rYzSaaI=fkE+f?3X4fuTnxbx%>DCVXqltrjd^Tw}h1Olm(-+DGP-Vf)=k;cSyQ^!&bw?a}Qx+GjXM+QBERlUIETc{Z-Iv(V zrvL-v0>;}!tlgh5>Itqi?frE4pbp9IPmgbW5I?m0)9GXM3{6`zwv#i3o2a~5rwiYv zk*G;(9R4j)6O*Lnn(WLv{uI0ZCoZ!Et2Z~9CR=B6M54yOa`dU1c{L~);4wwumI}90 z)Qd)(k{G2cTkpkX;Hn;a)_rjE>Y;{GH}WBZ#kBe~=9L;m(L_o2(x}`FIPTHa=STvJa|~QkNcKjSb)Q8 zm23Pu7rtGef7UnU_rll50KR>3Q!=u%I4HAlC(EXe7pL7@W_0Dd%jV7|a;NKemr6ii z3S;k50u6M2M=Dug(LW}v&zpTUMOSZaKlDZ`GH{*FnSquNAs_ zHJQ5e)*eI+$FwPpaP==qyTn-fw#=Tt7||lmS5E&pjQO-?@LIV3dxHU!1No1I?Fq(` z<40fR3VG^3PkobljP-4tKoe)x#OkZl4ThItp1(*DyIzyry31P0I-iB1ej}0>%c`x} zQl#hav#GOeFXF1t_72Aat3URnAQ83G6%w65gbD`ZhlbE2xkeK?k*2tmB$~z#=nr~b zny9y`P1`7-6wC;$z|1)^Cv%j-^9=u4`qMgrRATC4ckXoNTE`ZM^_(T8$?eYk%Uz`? zTPFk<=0^-z53V^CH8zJYvKq~^E`M)$AR|)Ya_J+^jRy30zV+rKjMN`=ESuA?%Ub1_ zq94bc>D{W9ph4r=@ZAymdz|SLk~xV8Y&a{ukRqOLKA2@bh~nhnNYO4!(b3i2M(%J7 zv?#PyGL+2c^gbM|l|n7WPUGXVtuWZ4S9MMAi91o2=DYFDDh-+`wd9~jGemmDy^oBl zYztYKDJjzhTu#M?1~Tc_Q+W{3r>E!|xHk|-O#2=b0b02eQq!D|qC{iAhEDUux(*JL<|M zF~cs4j7KQbz7lAoAGs#FmDCY5NtajkY7%?fdG;7?iFmKUT`Inavy_~4NiAmQ4s5-D za?EI@IQyY3xoz&twT@f7VN3DilzgkYx;Ds(k7mfFMt9p@yV>P7XMXDmV>T(SADQX;(Sq-VV;fS#LT&Cf$h&6!{L#oifyLiYAY%V7Ag}^tImCEgXBB8 z7Q-s5J*)Nar1*?9ni}!Wd42U1*7-JD6`xu8DFbP=i6_bQj35X_iG_rFYCOuTX_%$s^4VqxV^2#~GyD%pjSX zfO7NR6j+wv3rzdnAFQcTeE)uHBiOQbv$KtBdDi)Bu5}PzcRdgD*@Wrt_1ot2)5OF9 z6%`e2s*C664Z5$=!U5u{IY=*YUcg*Ch;O^k!oq^vW~-A}ZwWOn6~@|X?%pMUQ-hza zxJb;cRgB%Y(VDq1@3_i)X@zpdrqh6PXMvH$vt_7P-C>@J>8a4{VjZL82937a{Os5E zV*QC6Z5~|v_2HHQxjSN2(`sq)ICY5D!!YOTR5IXYFC zJ$b922VXh+NjYzJ@w*Nxed>R4$0gf%ibnVSNVU?#m5x!@7X}97k-|M^>!KAMz2x*N z5!}eN5{r4OvR8)7nwK1XRO1jnm5-?!8qbc3Ml+8jbFd<>mKeGRbG;}jxt?ex8O+62 zit)NSsQi%8N-oKwT31jWU0yBh?K4sd1@Y(r$n?&ZE5vKKds}6`6n8gB5mFa=Y_MH;$wp?*F-Aw$;~kM|#GHXvw^=-+ALm#D0+-dL|A^f<<| zHFrj9iD#i)W@Nj4aAlN#N8+UZVBdl5_{Mackm^ z`?|AkATLkOnG(b7J{05lcx-jhYB%?6{%WVuWbu((4Bo_Ey6J<~tW#3c2{}YK6Pm<} z7}aOk7W1+g%^yi?TW-Eiwkr2%hj4UW-A>0#RivAycx0gVQdn)sW_ouwkGUnD?bSCi zYI!S4z27(r&0kX3uDq^nrBPzxFqgu!ec!h=Vmm-^?{58QDQQ{7FjHSzYJ$Hso|)bJ zfI{&GMW{c=Ti2dtLrws_9+%iV?p+-d}20NPf?ECjzZw)B;3C&?f8m_ zwo7~FkwByv*<&p>AxV5qgYoOKmn1_1{foXh+^OXQy+&fD4U<0!83 z$bO(9!EWc^L5QRYa~E?cdv(6VH0t+|JPWql_1-q-5m=-Tj6GPIIYfXCn;oK^cUqaPLh20 zVON&prP^u{@(?pC;utLnqs z99Hwr3~S@=ptc#W2kGR(TYm51oHC)rY@;o!)y(v*s4V)7lg#5JRe9o5yUV$7@Ar{sIF*O;oh*fR2i(+Cv|3D zVmmYWmLGGN``UYF^s`%;)|~ZZtHepA`Ok4>NvPizYNx5n`f%V zdl=afi7RE};QF#@xF|nAdhjMM9es-aE6;5;72hlB&59j-QTTRtD;+zxA*$|dPe3NC zs^y!e<`1CsOVQXdg)`_WQG7%p-&~tEN6&g@YB#D5@s)HDVqWedN8Qz3a&N;Y7wpP5 zW29j8yV9E`^S*dcW9LyzwBMT0}k-zWHb?pkL`*w{nG-K<-ax|aH%dAr*$Hc9P# zYj@kYHh_#eOz$=l!zV%$k+{}Pnml_zTMDudN^mwKh7DO{Q$KSIfso7|13>VP2oDsNfIzQmSsFbFa0eDTj7M&K05SJ5IKFhI(L=Vg?5522%KNGKA_6km; z)|AQmf?TN^eODi9CCAas_k5r?HHx<#4Wguqr>1MUclga$+_ha7=guau+0&cGT+JkV3H@_;PXTLBF*HTE`W_m-mx^AS_abuKUBRDuX z-=xdMVtqP$N7T6Sd(?`A=cY?{`nC<8)J(UIM1d4UKTO6~ixuzqUnU`{B&G4_si=lu zlA5m9m^rPE1UWyNN)6*2E@>Au_cD==DO@e6fRs4QAsWPca`X1k63tDqh@AMkH+Q-Y z5Y6^1zw~8@Z8^)CX{KW^?=4_GFmT(;j)({=yHp`26=}4X>^VYFm7G5KNI=Z5$#5d0 zGYE}=&$8IXHg)6&=Q$hoTtB#W^$_mJK(QY^YV)(BLaANb)ZQs+iLm5XUA)a-$r_>N zwCoQhtSDkh4O(d0$-i-SLeB% z#_Ek`@@BsW2di=l?`*X3hH%^34Y=virQlndMbN8c-J`q8*k?j#@Z(^xX!)*8rSDMc z;t#00qnG1qA+f%P2PtD!gS6E^GrK zb($asEI(C?b+$GKy=woUVLT@L$=-r8T9XmZg}9)be17X1f$cNy6c4 zZoV3PvMGiJl`Q|US^mVusd#$CPNv9(7s(iYSanfx&u&P}RbseF;xWjfJBN0%v83B1>@=9%Pn*4~mpwjEQ&Z!R+9Z{WG*--BP*MgG zESdg=;D~cuvQ(@@UV8jw6~DyBT#?lE>9V(k=DH(8Lze@bHq^6R$O0ksBU2ocWZII| z>iBnVX}hdM;!P*#p;)*#SnYT03VVN6umpRLBamNko=4`K?TTY&91!Qh7Vv~_-`{H<725gF{ofWek&8ZHuA1jVM7+<2XlUtUiELJ8EZK3G?-o8s=)>OnYlc$l$-UhAzxq4;*V({IHX2>lcW$FmEqr-%JC4AjHZ4EX$- zmqZSG@p_aIs?JHwGZaVffZSuA>1kIjEOyC=Kr1lMYJ8F+KSCk-@=PX0^FW9^7g9&) zeQ}b|NojN2oTbK#17rqt3dRwIrKJJ!mGAnT{E(y5RzyCjk`%ED$Bpr7Hf4h;-Tm`= z>${^BCEm#71ir{KR~&zReNZm=o(!=Ok$<1$R-2rdEIk}#+8$lte?L!h$ce zk6f0yRBUVe2V|TGk_{ep(uv!}9Je}kt3Puy&RT6Q+);^odV>k8IqQcek|EE%Sp8Hf z9aUA>9e*`BrzT5ZPr}>_Tba_$oPEbKP}ER4RfxN4BI6@)l1q};qd$tdugE+yH zGa8QXPRJT1RXw%Q36x9dMT5ue-p+f<$|zWStLe^`af@?bu=LyYo&ag>mdfsbb5REk}NiAa?^Zcw^$v4*54I)NsUq`Pp_bXSNN zEXEOv6hC8z{zhl|4cniC`F}5r9S8jnaU=2^<_`gm-G0T`$Y0#*za=&J=17goC%Z)( z5D(jEXbb_P7L0~s7C-6mmhY06UqO9)ft3UbAkE(uK+_di#ianW5Vp7{gss&$Dd{T( zjFi8jwCy(cJ7s_Z6|-QuRRyhWwkED`15V8(PYRuua(?7IQteEr-3X$jPMt&&VI2YCBNL`tVs)94>hZ?)Nzg+c$#Bj>2EU>5uYboKHS<@k-O!+?ku<0>An4 zlhf}F_B3p(8v#dmf4XpbA6fg@%>ZGSuwy6Azl{)f$QOQI?14)uMO!T&LFDq5AJ!Ff7y8|1zcLohYtY{qD>CngKDNKO=zktd#9N=BLGv;xg*$ zp+Q0RL*=;Z84(c_l$4QKSt|)f=(-dJM*nOeV-r!dFF^pSL8B)zOSM>X;l@N6xpQ~^ z;k`?|Y}W~t2x6zAqM}#Mi2Ly2gG{U>P_tKvM{9GMma`3!BE!#gs(hEno2WTC?Y=xd zFg!f0_2LY*WCdD~l$6A4HTK$JLNlggQqNAg= zzRwSq)nE;V|Lfwx0DW^kWdceI^R1B*kpd*QTzs0BPu0@oGsi01SqehWH(8;kdD6zG2~YiXZnZ*Y8e~=-U@>FN}4h z$F7-aYJTs`G)i)0Z(Tj$JU*vTk9Tw5)0@$eZQ#qG78n#nYs4@bVyljpSMsKq2fJ7& zZh7Vs^3{Lu7CpT0`K)KxAyJAP2XHGysAe@1peGr^)w1wE_})>Sz-TeQ5jY$pBY{Xh z?Qn+TIQ#F1&ewVgp58Z>Ir$mf5fiK9nxxxo)1zyCL1fM7@S$jyo$BenL1iveTt-bz z?cP1S#Yq-|-N)FS&I_In^i9Q5YOd0&dnLW+xcgM^-W&A4JcaCfe{A1aj*iv!-%~#P z=GN$VW_6w8H^ghQ)5hgDy z3!JC9wbjX*es{V~qbp_iG&Gzmug3B$)eB%_W0!f8_hlF~1(_8Zs8tlJeJv@GPh({< zXpACe(e?M!a9nQj=0|*iX* z!orUpZ6pB=oa?`t`fz<=_{fnX7BBK<3ssEsEJr2h5rd^(aHK@M$#`=H8R5LT;qz@y zu`J%YI#OG6#Lu7h80M*S{ycUTHa0fdraiUrk8m-ub6M>lRo=yhKDv{bZadp69Vr|g z6QirED;dNtL7+2KOGvML=@k+}w}!*~i}s3%mV_O1aWAiQy}H7MO4=H+y`%R>xhJT*WK$ll9>OLP9SPbggt( zt{^tXV@n1x$q@Y;lPMh2YhsuQ1A)vF`Zrqyiu zC^tSn{v(%M=#P+(d80$9xxKLr*Ex%`GTjA4DsQ?gyK0zLKC!&A@~t<_*IKt_T}x|g zOl+(NCP(+fXNrolvS$~=u-tgh5)wKOlJ=cWv1kw?ELiQe_p0UQIKd!E>#$Hkt@R>F zB^%{9D?z6d`0*pnyj540$-?+RiN`RhU&3^IssMvu-xBA;{>Kh9KEA&0FJPx|Fd7SS zZJEkY>9h?CYS9Do!B)=zKyZSH6e;2zFB6Nt`oK8nXt3qZ_Uh=!h;m!H64D8h z+H}dG*bq|8!HlO{>=H^!0e0U;ZtW__j5=DCf=o zq2$7b4#_-XZSFg4^LP9hs&aBVvaBQ|BtzuwzQb?Hx5q>V<^cqt3Ps)_x2MgtSj+p~ zbReCPilY%83~$w#Y)$$6;S9j28E9zU;-6dZV$HLiB~S@KR~IeWsNo4kw#`*ghjl+J!iFRV8JBmtSw_T@DAlNq zp#$G?bmW;^&MoaGjmONsVU8;u3$}(a;sF#pcFkMsi=;u7TmzZ+WMo*FnFSRD1fJ=P z-cwRi0;smdeb-B3=j5G4r1OrG_6zyg-_IqN4oM9@At9+o7#h84d-JZepyXp9N3gMP zM`pc!`!+C;#7M-F)lG_&;-82Ka4!w)KD`j@*5-JbKeP7-Iq8@Kf%A=GjF7A#Td6-9 zkH#Wou$mv%{em<)%|hVu*cga68b|&Cr87Z_oY(ktY{Jeu930T|oUBPV(PpY!}QmQ^c~Ba|tgaUjC&_z$J zLOY1v;Jv!F!8sPgcP1aHb6E_zdN6y@)c|`lDD@;B8CKA6%tUbiKu#a9g<{1iCka6U znrw=dvancqeBclOV;u!GwVqgtZbb3ITh9!CIZ0I$&~ao0>| zW&*$p$l0b=*Clhpgggk`BBz_<-?jT7I+H47qEz9M1!SXfw?o15#rgJRLEHMZgl z1u;I~a-9O7qX3m>Y4c2tx5gs9izRKQJ9U&8j62eV ztN_AS#li~c0}zi~oOdmwRYnv*6anB&GBi;6*@U9G4nINQ0alM^Kxybu~4a$!&s5s3B_pREA8) zAYD*5N6ebqy+wHVY^D^|)q59)s{oqsJR{$_k=$<;?7MB;o8Pg;TAL&pe7&K--nPoD z$#q^0sGvF?|L@6Y17nkG8SqeYfJ%B{j;-yoa!eobfgplK43Gc-#({BfrzOgH#JA_i zo%;qA0O2#Rv03-#+W~JH7!`wT3RZq=ue*>)&_Hy$}6Z@%fb0_J40PO*rwsEX1oB4LsCEx z#9>Cp=YRm(2+VR}aWPgZ3Gvks7_-JLp*OkJ@U_pC^H%YN<)ekIgSXKfkxYUIX#{ zg%tmG#umF5*T{rA_V`?$yotwtYVb2gVzxl_f=9!nqt3JTed&LGLt&tkU|)?`qg8)l zVFCPy)f!=`cgs|J5-y%kKEMCvBl8*?8=pQsxGN(uDXbcbx)_Oc?Mn#slOP60MO_*} zD^CCZ(F+U{{t5PMQAM-Lne_jZ{{bluM7+w$CET5);%EOmzbXiDZ6(X?Khi&Lui<8- zvTp^USm?Z^b;?Vt&o&wVGCsJ6D)(Nv_&@aLokN9x5oqzC8ajeYDf|FD=F^>Q{QS z+f?n&oytLPeg-T8z;Xc3RC6q%tqT-A--=Ynl5sk1Apk(zfs9{4<)^s$9`XjOcInB* zw+ShQ%K7Gtco-PfyCuHop@~s+Dp`qAVSJFW4;?*ug^|%u4N@~;sOs`^bO{DZt~g{o zR|pt13iCgFxRLyDwa3=O#CE3pDw$dLXC`|3>9K}LYTK=7e;pF-@A-C%wcN8j+Up=? zbb^fokgu?dA3-f(VN7y|`u5`cb{E%W&v`n0(r=(JuMXj|egvbemMS^Hq#=s??hxiF z@lYO4ZtgslY*PRfE57t9BXwbYNN49kQNFeQXQ$3{ZB3gwzmrl(RJ_=_Ri%Myggf!? ztk+qDckiUv@dbs2g}r@Cp{_udGtU56=AydR@5IQq-26ez!N54it3*QdYn3ez zXaS4GP&r@(2>Y5vFD1hG)acG8SdZ0*M?~D>Auu91dzNQ=sR{I`j8V{F(7Nsfa}7vq zy|6jJJ61lt3d$l9;@Yek%NBm;750osA? z^7N)^i-5M)o&`@0UUTx{6Y07&xg&u_L)tf|9Jbcx2fpGfs4|&!vgX{K*(oJ8O9Ykk zaR;ohh3iL@yTg>1CX#gCTu+;@O1*U z8eYJsm4Be4Q&9%f?l6-x3QVf0sj1`{sp;pNbaXT{X*=)ESwkhRa6Bf+X|0Id9g|uz zxV)~8@#<9rE2nX^T8j;3#5r%rkSKCB%PUHIC6V)U%(?!t$|l|CRZ0RlBa(&VEEye{HS?vtuEky=n_Fk zN5{Z)`7ru#mKGK;yO+sk`;Zz_TkE4?W;{6p+WdQ%KO{BStO;>(1WW+dr^# z|AtUYPJWiT9f8)Mul}Mzdr2S(|CFF%;B&yX?Ck7-f0FY%s!^QSj_@{Sw!s! z^<7_uU^b)HKajq#wm__(I)pky!wCp06B84~P3Y5NTxi%rlbXG>v;^^a7UlxzCZUFd zIgd`DunVDkj*n*rL?jP)_Xj#6D0VMZy{}J?i~`7QD_qH3?Q_;(u-jg4LtD%sE`NMi zZ0^4O-p{Yfbi)KQydfPV)glC{#PGS7|77Yo#i9Xwfh*uov>7Yk_5C_EQPl8#It2 zy0T|MPp|3wa!>mYOUFLtN_)NW#%Qh3j{5rh)2>vt%-ClM=oITgPY3!yoBUbp`?nW0 zPB|}s8e$+FeqiF}RuN~0dBHbwIaJA-q_r~DK`{jl8yqQlGr8ZseIsxL#zFzQF?{+l zJ0&gKEhvdY@I8u6a&{DC_zQ3MGNIen4J^TS4&-`GQ{YE-2$7j99g20QF^+LovZBFP zXLXkuG9)a_?7dp?AWRhheDN7{kvjkhfc~57ZaLUC=$C@8$a^BTKo~qM-u6h4Sr*Wk zMC@i{j1hmm2zs6l-r4=q4Wiv7i*fqypECsi`uOp^x-F2gPYdt4jt;-y9r5F9Al-B9 z$7At-d3+G-f7K9w{m4HH>$JOLxUn?$@J!VHg?agA7H4b5z|6k@wwQLrM7{j*Y*6sL!B?}dB_YK|8=D`@M<%eQ8>sc%-&rm%)?vG&#sFu=Ap*LUv>SdZvmDAiaa@Nv$ zbA{xGplKPEDV*oDD9$Y>bRSf(;xz9po@ADQq+)710}=?Gw>HhytK)ELHBbwL^N7Ae zM^GoTk{d{rw|R3v5Xs)Wo-f~KJfYpVI~G{i8#m(hP?BKvv!8i}!>6y-8P(yP=g#ak zg?^lyH*Z3QDdyS_SGIM-@y;$>P68MgYFW!E#WVlBTeG^;#o=P?HaLB#;UI8wDmer? zLhta(Y@Zn_tqv4XDupvzHq$+Mw#{+UV800n2xy9tNLM&8#PkEsYAu2}+EuF7SIw<0 zb4tl{c`ChbWOOt(D$4Z`d++<<$H)!CojK^#TwCcfp_kLGtQws;JSOJoU41i`8Gry z?t%v@HZ#(#2~%1iT_-SAyA1SRGA=7oI&dgdgL|?>Wj2#^v zt*w_~@WZF@A$x3g6xe4ge)r<&J?$-|00r$-x$41eTQ@agmj)=fLIw5q z8yg#(g)^7MiFgp7QoF~ySQp0OdskNI_*Oi4`(OsWPGQoyN-d-P2pT-NfwLjtbB@kh_7#!NmmwN z>O#;q(?l=2eo}Q>A0~HN3rFOGO|G)?PVC)dDPYRmY|CA;|4edT*sr^&hNF)TkLH`jWKuS43};Bg zY@z77ZmDTa5r*!c;fXxmcCs~T;Mo8e4~CkCtNdcYGEp}Hj{{Pw{}xez=|b4fde}%! zP0Jaq4l2Hw%GkeP?4~`8?S?sEnW6{}Wn!`37%et@N}GVY*dlh@0Zbt0xvczQ`$108 z@k{mDewI;CWkKXY$e86KW_nLr`eInJ2C@(yyVSxO?02L7n8wuVGw)?2*FmAA^ES&J zk0A%=>A+XCcB!`sCGOG~Ja0r2Xq?miU!PIj6%rBxgGZ6V>Zt#*ageC#uUrw8kWfq4 z^-={xN0_UlySY|k)7ZHa9+^gMm#L{axKbF4OwUzAIXkL0P3NwXqI#|9lcwHgI{S3J zYa?Us#0;?wI>)P2%nGPNXP{t!FcfSFexwLRZiocvfDfC~zb}T#kb;TdHIUdyncJ9L zONY1o%4*cEvtxK|elRWVu7(DqLf0ovfoeZ?^>PD#FA27oh=>R%-FPq-B7k_WXkSaW z>cA0j__R~jDG_|?>WD>ElfQiy`KKPBz5p<EfzQFhelm(vQZ?}|N5GEzPv(E{ z6gm?~7J&5ztysz&_*T2{wXs*nSVc`O9cF3*c#yV6g4<4i69i z4(n1=U47OYHo}zEmM=qh;PkQ? ztmt#LgO_J`YF}&5dkGbkbEQDMoZHlF10Y^CxfoU@(@6~*qJ6a~DSq~agRi(r&Yx-@ z05CS)niRA}Z7@>Sn5dNg@+5I1?0hd$4iYSo_nkJUvpp_3LBs;{(3un?D`KsqcTYFW zbY-VpukG7GtwO$m-sZ631@QTLoU34VSF`T3>PbO3+MCuDT!xOKma%KOXEmAlGh_Lje!{|k0Jm^7%4t9| z9{0M}koTl+-^Sh91`53mt}%|#tq=NJMW;1EpdZ0jk&TH@N-CJn>PkyXD^A$+>xeMe zZm965WInbJi^%e=NjMY`D+@2BY;^hf!{e zob}WtC`5ViuA(W;-E+NBx8D`3h>D5j4g0DN-5vZ?0oy<>62V@yU?y3{Bf9y)eci$< z%d@yUNUgenQ>WhH+Q?kz9~0{npR()IWx^w&{t0FOL1pUQ(MS~gm{1RO)RfPQH8-3U z;8&j8=Ca!p3dj@vS0pYyOZq122xTpRLx5)tQK-&M;Jq@9X1Yf5PssTjte4Ai0o?sD z85y#urYt~3)?hpHMZP(E_-0iursTx@%@p_L3{XpU0v_S5P zWy_gLtGX;1j2MshD_tKB6a_2}f&9V;z{Kl0r*0HOHPv}ir4JA11Qr$?Y@_L{RCSVD zul|0iTPQK6$f>t}er?%ieUO*$g1g8uCc(Z4sL@}5|E;g8krh={d62LBoHk7sPfW0= z^^gJ^*xzisM=uU*z`GQn>c&v3vxqLk=;h{ec<#Dp{z;$q*73;chv4HXum^d;vGmr@ zadh8*8uv@{!XEH{d|}VY?Y534Tmi{5*p%p=isKQ#bR?jI8?cv%oBw@9{kvh~6TQ2< zW^Mk~uMHtTXw$O|afQ{FKitO$qW8Ge|E)iM{_0Km@t3BMA6$v#&nZNmjr+gykp36` z`(Bq_e{F8rWti-f5Z7CUFrJG1F|GY&SS`QUMR(7q7Z5ZF5GUY$GBj7Nj5WtMK@gst zn1Jo;51M&ss1v|BG9JX;WKO->U|`-uLqpx&s!C)&UEm5%UteFpdiAQ-FqEvTd_dUZ zHf)Y-Zf*vl1+H6h@U^P*o=F*ZlX%ag+*Ercmhu2=EMHSgfhM@keo~!@UjGN<4?xlc z2QbvF@x=CYW6}AH@oCXP z{~6kT4Fz@Z)O3MURHqA&XGJVvN?**oa&q{VIjTrdvl%qN&kBBG((^VmR+lh-?g_XB z#<44C-c9*3F zZ@|4nO$N3HDu8Q76|sQeO*}I#OWt4v%KSVLaD(0GVr?ew+jtwC3}`2FXiD-j4zLSw zQJ6uwJ#xB>Rm_)e9M%{8qgD>sTA8X?-`b7VkRAU(|K}kkXO#V={biT#b6gf17bN0y zSOa4Wdg)7Jo>qZ-rsNr94L3~i55aS+O?9Nhe_kdq2`U;INLa8%FuAO`-YSkU`PN4Ffn0hLS7&8y24c(;Qt{LK9I4r6d)UR)VGi)Vk_OmG z^z`(ZHhDtet2`sAmmBqOfpEIOd3#dBtZ;oKl-C~mcZ1DKiIWr~4M1Yaz}*ZmjrsBA z{THZ#7RhG`ASk{GC=fN}vXNkzP}NS}c3e&gR+z{4eU#81JAbOR+QbFL*K6v>{Q;fL-_($|(m@w?v-uj4*i@p%jytly_ymy^X!p z+T2X1`gsoeA;#NM`jqrSsC*$%fSV!6tO?`T)jh=ztz>bm!f`aOe1BCBp6&>t>T5qg zk?5m0MA7rPg$Um#a!wbN`WabRS}raw#y4Z&?&aL>*E@GkOYRfU#(H3Tf;0+;S1kId zE8c&=6BFYN3v~E{Ba?aP#`W?4(6b(o{R9yEYgSN)Z}>4lv_X{4 z9;TwEhK>OeJ=H&)gT+}|VbK4q+tu6L z=Pe;LRu5YM12~c6u-DvTY}KCA^akVD0!uXF=M9!#D=&(oi4V9IZ z@7!@$gf7BdeKxcDu)qG{bIg%<=br$UPqrI)>^HK3@f1?v^^ z$_|X7OnxfrVtl-hmh`m~Lug+ezJc*)Aabr&ui}vLrBiAIzFqpRk98gBbxVEyh0tWB zbYWliDIJpAi8er3A-lPkfex<~!fU^x*vgbX726?Ey=lv(Ta|54Y_XVapyg{2yg=0@H%VXcxso=#WZvfLi8&xsXr^RL|hMFo~IumM177 z%keuoKt%-pvsj<|UR35qy4s-^#>OruRm|n=T<~scIMhF=xEtBTg!QNYZg>GoCsinA z;eg8{wIT43*M2(be<@XQA>l;!(r+0rHqGys#QuvEASFr8w{eBa1|5D}p&1Gl-dxPEweIP2_%7>^a`@w3; z{TquDdgky8z=K=x{Uzzf%Cw5Ivf;E5mAe9FKkjbUL?9V&+Wb&;qMS?w{}QzVg3zy12`m%r}cT!_F^V2 zLC6RotN_*kO$hApe3N&`9^!rnJ1aP5Ac`w;A7p%Up-d(w9(w1?%j1%gGHnn=LNliw zcHfim_n@+;OT%5}bH&sD?1gapMi{mN40Ep+B2}@Hiasgyv+EoPbI>TDsn&VxI9V2! z+u@rin#IBQ97#S>6H@G z1fI;e#8!R^nqwwOQdP>)S+vR~Z)k3LxW}c&9qAIHHO3v+BJ^sckewp8d%Jeyy%vU0 z_`y}%K$)1L>JYP;kV_n+)$92hiwkVFwLDIB0i1e;>ZV%F=c`3BM~Du%$PB$fs-C!D zr#g1{b`!=+bX61mHU@BJ0J%p?UXbbxzk_>%AE-Qdn4!)l4hm-M@uh?{0A`Y$!|!2n zg5h{UPkkR0x&jrd77crxceV{{z_9hvy4lECQ!~61-6oJV07dbaCN!f26Wy zwLcSVPg!!1QW7N1CYs}WN4}@uiN<=<$qqUuyrHduRvfT2NdAVx`0*iemaSDyrbhh+ zSi29b12D9A0qV4438F&5vCy%b_U+rPSxO9yk=G(9i>nyzuB_PiBXIcEZWO2?q1yuW z0^Z|u7po6?Cbs9@s6*>lpVl5T2Dr$mk!dIg@T_21dS`6>1);h=$V4>nV~)>`!bBQ1 zM3ey2hb5XeNv@Sh+G-FXw-e*BDAa~ep@w_Qpq9sO*6RTMw;O}de9{I^D6`BtrD$yF zk1LqwDY+9gY?gEVU%@jDy*csg@M^{NI`-+TqoG-+hvG_4E25fZq{b6mxui_MYiO7W zNXibn$FDu-S@07(@I^Sv0OQQ~>LM&lI}+`bN4-GTc^}P7w)kkw#TpPWs`EVT{{mYk z8;TtK{2D$WU|o9+gBLNo{-FGHW(6Q8`DE32cx72F_eU#GV|r_Or8jTqb#KNo=FAu%?84yVb*a%r!N z`Q6Ulb9NIg=(P4laiLs;;Rpulo0yyD7=ULuHuLjsa1(BX5!xNpc#nWW;dWolalOOP zA3dm%j64ge>(+L5HrO!36&BgOJH1hHaoA8j=?xda+)jn5hU)X&9bPze3Z##my~Y4_ zVxJRb#BoRjfy`zJDc0C%nh9RTjEjvMtFy@aU!Q_U7J(!N+tYV=e}o-U;+;*`x!|l$ zl}-Vp?@f|In4BM(1RaAePw-@hZ4FTiygYfF!Q|XBlKcLJk8EYft_M?iZw=qWs2IFO zEgE>#{4>~~Cn9eSumDtF9!cy=DCmp%A?d(GuR?7CDigEtmP1h?y~9gpmB#I#ZZh_z z>3D3!?TFUHM}VxI6BQ7g)`RH=s~tbAP`H2#`Y;X*Xcc^`^r6K%aRM5#3V_8e&rfIf zg+iPG`qoSa3E3=fItxsKADhTn_3!rIKyBNT`(QDAz7JXgG(6pDi6OO;r<#@rSfM~e zAsFAOac8C}whmq>^1q6E4{)mc|9@OdLs~{MTPS-Ap@r-n$toJ>NJiP?q)=ppN(k8; z85J4X$_QD<-r1xhd!OI)eW+XR`*VN3-|PRo{y*3CxvtNhgPEA6vhy6#m zeO&F$xY^i(Pusm)(f4|~UuAR%)5mx7EB*9OKq$Y14z0BZgm91v&=JQ2cFBmT0Ye%X z;4ClBHW7wouRtl;ejX3xR(*Z_%a>aK&j44&d~849cPF{I&DuUBwT`=NXDs9CdJBYD zyg!^QkSAA;qgUXB+c(^gmhB!r0^>Z|p7nlq@M+zhw&u7bcIL5&>4|YvT;#)7A9$nD z>LReO$O$oVX@f!7<%3tzdsmnk(Hi8IHU$D2CO-SkPf0P(SHzI`m%1rE6(Ij+-qRWH zd%IU1egLV|(_`Q`vsI)BsEJ(MMDK+y6|4#`pT5U?ecET$>OBTUmrS6qJdmgJ*0o8c z{7(aUY;x|6_S>c)c}4mu z^Aw>fbU6O*Gb;GI7srr=1zg-WWu|ooI+ricCz&}V$|Ecu{{)Xm)VH`txcuT9>5p}r z%MCIo^qV=lRsW>OW)5LxcMUELD92y0*{N`9FDPD zhEU3ZUJE7+1n=B@f|nzai z%wf;dKK`p`|9#TK8M0ZFFbArA7SD8d5pQn+k}Sn9G4OAXkNQUSsgb1aN726CRA#CM zXE4c`)vtHo`(izD$()4e|8HLopff7uEg!qAAIsHmaom?I^e~F{;Twbe6vHx=xUMg@Dldh91Z7E>=^06YKY@d}X3HdsL^x&J2e5mSq| zumYKzMs5OIt57O+>+iw)oS@nWupC5oe02hf(n_DoVrJ@4!9ZPde8~YjLA5CzD(c
      G5`1&5392E^q;dPLEP`;Va=eHy#z=}|?aXY_HXseC7Z zT&z=HNBG71$wMBuZ}lyXC~i3{6`wl-&|^pZJOZrcuV1nX;YY?IF%jTbfqEd2noqWQe=JUJQ5(k zPl=+9`Xpap86unlJGHbyjejIcE4u4O{%kHD%GxT=f%A*si#$8#0PF!Wbhk^zb43|cNqL0V`A`$js6xXSW_eDo= zHJH6G1?n>x)8<2nSB}nm^XB{VY?qc4B9!KWHVkDA={~Jy53_;&-rxd$AD_Fo$^<&@r^+&RlLZNLb}ck#5npRSG*znl9&hI{wz9iy4!iDr8ub?$oI zFFuJJpy_*Hn<{bLd*GfoQnpt&3#ZRphY)(u0TBF;`l6+sG{~l9mW9OZCX59Mk0h7Q zVwS)~xtH7YJ7x;}NRC@Q!#mG@EKH;tzB?%~B00S5#_iYxSK~{#4*?Bj)Mh;`X*=Ex z6^s;}bhfbr4Dm2O*gSIxw9(E#zkTiuhC3q!e1ReNTi3i+<7Cg1>B+q8Z-fDPoO?@H5=LSyC{Eno@Vs`ZTYkjQ z`p^qmT_b(xSZ@s_`YaVZmmi}#rda>(x_o-MGG;-2Srt|oLfTk~@4C^@t6v4o{qvZm z&)m*E+@?4I#T)mDrwpdIU5)mg16z1tjU^;952XI_U10Kz&jB&-s%nZw8AG(sg%z%0HfS^~254 za9`281ks6e%|&iu4QGFy`VeX~!nuJfcT=jV(PEf)VGnF&mkyT3gbV;9r-`XS;k_4# zxI2>@N&z-d#@sf4dsiT##=*9g!$X1q!J)HlpWO6B!3R{}5W`ofpv~`J2V;$QG zjTMT~J)l<*obCdVYOV^wC>{zAwuyESY~hUuzlJ6}7N~+hvBq~YNZgq_y}UG>o_{u_SN7w+59Sd!t@iyD-XvJT;b~0w5b_4->|pwZ zTq;D6K)%u@FkN07eGcEV5KcCXxhnw26%dC5(N{rV^S%|oYuieMieX!t{FLOi5y-*; z@5f0rFiuGtc(y9HQh?(BjI6AOPA8<(NNha-bTrWRCth=ga=FAzvk@Y&fox`!AfpUR zxAQ!hb^@}V9)z!8fpqUA%;nN3BIALOQni!;ypGvbk&Ci$4Aut)>%C5ix0E?=CN?l zaoR=`06vspihi%AA7&Yub4bP!As`f^O<@azTOiPJ!OsF#`(S<8{YWdrQB zy8G`dBrtaWP)3XN@^nz@!r(16na*Mm1ZF|`#xRH%2F40xhw+md{7Bg1C(^*Ek$4z_ z$NOSP{DWqw6ChEGMtS+)7f^iI2Y*~A@CAZldJcZ+_pRa4wKq>7;ZjftII1-XJ-80B zl*b=`cg-O0gii;`drxE`(@7G2v7SaM z4h8Ix%unaQ2J-s({#&&IP4inf<0HillGLZbx&v6e~M8X-ws)k++u^vD;l-?TJ7Byw|@y}|9ElH-4=ah zD*pmk@VoVkO9q(Bx`s>%q{xAsn+$Z$DlATjXn zz#pBtA0h9=X0Jkcq9&7o2hM=T2^=K2^OxR9dPK=ff;FHZLgiS+8rihzbpkPGTQ})^rl{5nm9dH;u63Y~yA6jq++v1yi7%ddLihno`0E z6@n9|Pupd~87XrOIx6O~154@T$)6Y}mNUfR{o4-y z$CK@NF~Btd+wWglP`Hnz=SfDjqa-yN#L@zdEAc2=ok;M4%m$Y6SkukT|7o&U6a1v& zQ4(T`H?I335J^#CU0ql`nQa+JkhGIBtYXF=<_~(R0z8Av(w>wp#QX1mbp#V%{4Y8F zACK}Wa_}A5tn?)Wi#STE^Ex;F;Iz{!*))PTpm_NjzZA-r*=P%MZX1^(Mv&-OXjG^ z+=Y?E5tapza6Q;2GH5uyiR9MqKgJSns3?OEkQJ&Eia@kV=Bq zD-F1bhH&?lN#jn*1<0?P^BGqIcWC+&6ds=PAgaruL2Mjy;Iwn-T`+J@Y`84>uQVqJS;(p(hf?&!kEjubl>fBaaXJMyaVHF9u!n+F#km>uV`#H z$r*7e?vOtTXpYQm<20 zA3)q%iPJwi7D3=9iMEl+A*?J$NqZx-S>W6}JE=Y;_Q5$+KkZiS$+%aMGuGf%3y_~a zC#WlsUT$_~ZBSKUyj#f&=c#;*7=@W62+nQ+K|v=S9n(oD*6P7nDLe3?CC19PcFq&P z`ySrv8`I4fa#f*XT1nu;kn&Y#>@F~lP{#nghJq&moH>s3mS$!MgaJ8g5;c}w84N<< z!Xowg!F+0SAf%_<+mAk-d91og*=1EKi1D5j;w>1k@lTvE4~ zyrg~;u)CYNfL5TLp>&1bCZgD@XW4Cp+aI+#Y^Da?2EYeIxl$=Srmbl`#gF3NB@BV> z`e-v7mNd5?>^*9<{5(%ppXjN0qr8+3Rtyjv*)v6awzV&CT%Xr&I8Q}N49>zh&w`ed z7odA!jyaG)yblGJ{h=4xa|=EODJ~vi!3CHAXCF8^S7j-0`$XX*mB-`i>{7Qr%G=5;NW25 zAuGO>Po7|q;Y~zH7*y3$Cyvx3$kTe)lC(H>l5&{DR=QzmGRnT+j>3@jk!7t zCbeq(P|M-qi*p!QqnMRaxgA?guLDDLeM1A$z6*v=RN41_pgX>#QCLL$YXFj=+^P2156 zp;Y0%TcJ9*rqk_PbVNfO} zWT1*JKhzj&5(d}iH~K}~S$zkV-F!5rf?T^g1qsB*R0u`U<}LvYroufB>r8*7tjU_1 zOE;eIbruNiQ!FlJ7eZ%XJ&Re5^eqc{ugE=_-CLE07}>gYGN~do&H6A+WE<4qiJ5sZ zQ=S(ZpX z4}m9A6_?0^-3ogZL6EUCak4zj$CT@%(U{%WAu@(jE$Pjh zrP57DzaCEwPt)o#U>z$rei^GO4{_ViT)dNVl^IwHQVr*ur@?Nr`d}YmZd?~;jh!)| zvdiy`^kNjZFME1KG~zYpurvc$vyB78P7LI*3#V??yiU7GrKAxfeyug>UP1Ar#!)bT z&Hx-4acTh6J0UQdFL|i0PL1J;)L8o!3BYCWnW$=hD$#~CvQZ|?bpR5@VE z_vcs3JDy09dt>-v8Jgdw@vHDQ#@PbtjlJ6?vu-$+zyUdbW$;`=E7P}7Fn@=0186U+ z1wn;e$BDl31tx!p(Pg*+q4u_C27c(DRmE6zmp2$nN6hGIXheUgGr;V7NBRZ%@)BXt zPj(^d#f-w{MOg=`6|1^11$Pu}|Ibn;Ev>lx9!uDb)+0FC(8|?n=4dG9Fds@;OmlHk z0Fs@V75X}`sLO3o5}(#sHsbxOc9|Uysl?&2%WleiW5^1FmQ@kcmg&croB|ZsU{-2H zKP0qje1$Jsj2S*TX2%9B4>c>BzFUNSd6o7h`BvhBY)P3*&G-}5WRrdoA zH!(RI3tb+-p?S{>W+bGnE8z#6HXy&s0!AMgL2w71)~+c_&YAe~`N_fUfkJ6exIEWU zTL{&p!}7$aNQn=U6C4Fpe6*K!lR+I1qEdKf$Tr{uUVW*J9zh3KCcF=W1CZ(vUY-|% z)~l-tL<7X8w7ZZ$T+mH^^X3&y5X9#YGh2M~U(!^-iyl428#-H`UjR}1J zcy5nV7SeeEPK4y^XkvKnZcgUP`CsDeqTIK(Kfjqd_R{6rPg}C7A0whUJ2>~bM{Pif zHU!&E^B)yKDgqW?z!oli;EE&?o-`x3U3jQB6v5Wt*#8->nYwESO$%lVgy61ak4mWP zM)XW&_tm2~rjMQpCMAK1Z&wc?5*)iZ>IClhLeLZqK2tYSp@d$G|LZRv!e6NEgUVp{ z0b+^vAM-7!$FD1mLOnj^^?%F;{^D)?OMXFok>s_mA0#A_H)SuJ)gTf*{@Wk?&tLS9 zx%O%v^t<>@dw+eJw@Oj^|5Ww;)Kl~?S<>%up_$OCX-qM|cpn0-!4HpExrcPF2>UAY zP^34lAY0~+7q5S>B}yu)BroI@&0rG7c4}msx$BXXNN-OdMey`>W`eI+Fhs{BJ15?U zFLP}Cbqy*QI)jYz-xdOEA1f;LScUmRd_q93>prUe;P?Jg`&HC+se-s!HkkD3p$WFu zc%)!`{s(zzEK*&5Bn12;k8DrS=#z5qt=)}sdF=B04Tx-=Q9!)J0j3QiVg;YBmf?l` zVl7@A;oQfo@)sxy1V99(Jrhby)C;bWhs4$rXl&s)DtsU<4a*j(wj-Ai;In{AlD}z; zM+LvSZh9>mHI;QzxXbZwYNah)%`{@xx1oO!(8T2BX9Ffox>tt4+r6bXyHoN3+zFxkWFElBku zRGt>m(8K8r(y>egu?L1(F6hm{a+yL`HabN-Q=qj-r!ag~V>cg55!tDibORamgEdqIWS^~5dR7H zJs9YxeIcJ3A5(Y^gTFqww@Q=(-x*ep?C$c)e)joe_B$Irtx>|g>l^aW7*tMWra z=Pl|2xm5x)+nt1C4QY_^3Wf&;#tld=3?0jj=mICd2v7IDOe>(x!4k0Z72Nr{2cfKG zHxecK1^RqUi40NGK-t>fNj$};6Wnp2^w$pPEAXzwV65udA91Uk62^zHs2XVe3_pWg zS+4uRgI*gU?=&cFX)C**7OzQNA8D+WE)0uzf24bbRA>FRxC1&!1Mv}}n1gor7z9eq zcVPF0hVG9dF#VKs%{1ToZ>dGt3_y&V;EVJ(GkabZcvsv2NFmzw`O)A8$vp*TO&#v4hn{%VV1t+*iO($v4Ybj#17!_C<+83$o^j)s28wjWpW&M3DzQLPNF@yp!;{y zLMGtofH(}@t>NVPm#S<%yNsS;>)pu@6B49z@=-HPu!*3aCtV=PL`4qO*&^HBcJ{BY z{-XD+?IRV|gQA7*hpdH9A@$j#+jnOP!wLc4Ma$))VH+?Vz|efD*eW5E*$ffNP^gIM ziwn8siEfZDE{&I^5B0m4)^pX0X*A_6?O3i3jGPIW*$R8#H$g=t(H+8vy4I5@;>AvZ=Ojf<4%$g(((j&%ussG9|}|^;A?H|4uuY6B3;y4^IUMO zG6B1C`A1W>ZK%-(>BNgV;F)&CbO?Oj(RP)C^lTOcKu*(%2Brgx*DlU6i4POk^U7onoKb+kNBKZLVwi3Y zg=LwPE2Z0F#WQezx*ljY5O+*d+egj}hwt5iUt7|?p3-weF65)-Pvf@JQvXBQ`u5AK zHV*@sGA&P97Cd!0CLJ6L(HS}b&SC^}``)6S?-;9C515>k6ViMMILR%kV1-zX@D0Ac z!F106Hi66UPRvi70ITXmyXh}Uo=cKnr>a1RIS~?B%XRz z{LsYInc`pY?s|?2Isf-N<`Y}AxTN;bOng)XrV2t3;SL`OMSMmPlDPA{LI`q|U4=}w z!6ZxH8K*xIu_6+T^RpR%ln5+OxV3M1L2XUXvYdJ3^mO$BVUF`UugNs%)HxM}vkWhD ztc#fcamy7kz{e^kp0yN6I0k18uv?*Edp=bE>{*xcn~xO~!X-LP%nJEPNNB_VxWaE} ztrdA4-V%$vo5;~H2l@_VFE)|X%polJUxiykL5Ma^S$sRtI~;Cr`jj5bCZN!~;RSEE z5&4m~f8QEV7(UE+-Z?{-a3liqi8r^=5E2(kNnocy&%QfMe5CLx^<$cKasB#%jYjQz zbOf`l>Q$HmF?ZmJ-gcC9L#^28Yd1B|Y7GS9n%t{O$}GgFpQdi}{w*7Vcix-kWHc44 ztW^lmc;Z+Ch=KmbhzUt)Uh-#d^XgyaIMY~~y{r!?C)SbO)6RT4v!OU#d8mDJ2{1bl z67cT%4wk$2d_;=i#%Cke1VkQQDbOYshYfj&FIAnMIl9{BRFclyP;e6AcW?-Lq+eo0FUPLG^-?V5ty^(qfJUH8cM+SS?YhzmVeI)_CtS80Q;?hDPzkJFS+`; zTqr6779u;}h!_~H!&MWQodKLhQGEv52$(pz{pf5;S$iC1Tr2I@OTa@z6Y%ZQWAzJ4!$NtK{gf^Z#&CD ziO&PVe2BFY=ApD3Z?$4U6Zq%WVlGy_#P`Q;fisXe0dVH2{s1Wj$PB<+buSH%A#hh* z1gfA64Sn&nRa6js86eJ4%+xdNvPcj3s)6iQ)wCI6F)+g$=~v?YW5aKp4vrgZn;pmu zf{?gF`VL8a;e&mvAjyVBj#LJ_UpFLbK^z2j3WNoOOTsa^T0}$^(5-XPsI@IgWDMVd zSbSQRH8fgUF7B1(7ig~$m1dCqpI`qKUT+1>E0p3JK=3pkXtG+;{QDk2O09n!BRhMm zaVKCyt#CK3)&d81-`QjY3@LvQi9q-$0Oy36;eII@h2_9`(jX>r`+KeZl_8SK9n6;c zWZXCN{06doUn+Mlfqq5lR3v0ENOcRR0C*4534-Di@sx%ya{ukr`C~0>$)k}2-}!F= zh8LQD)3yD0fbJBkRO1LPvxsjnY}14r&_1UWq>`?`zD_$`$&9i4C)UEpslV%;$7JCK z%?64+6#MjmAO>+}4rIU3hhv!?q159J%NG;Q0hsD zDOzcBA*bPeqqsg`24WJ!K4MVmS*j>*UGY28HA;iM0W6lpYTuUX#V$)Wl3z zS{bt6r?*$BsSmG^oCGwc^yxo-AEGEE!ODxFee=K?8GrXY`>nqZ+8Wc<=Pg_a^u!AR zZo66cx8gxZe#-J3z5N%ne+~Nm4maJSUm1Mv)!WK9E;=6Y+R?U-pig{|bG9jjr^y2bRA1nM$(AeeoB%wRMV3c=GM zZL8`?O3iz#gM;cz<3R~k&(x5<7u-C-!ji~m&IS&EW&$>0P4k)X_{?yqBym%r3)u44dzq;xjk`56FndqF4Fw(&TvLe4LeikRl{Zp=UblnK@I^ae7>U*y zRdB^1@^k*Lr;4vQ1KAUzi$TC)ROO*t0{wL49I6cmipx%OQ0z=wLb1kvCpcVCS+@8 zOfmZjs24JdS--L8y~MqQj&Nq)SP>9S_47U1*;4C;)iDITS^*T^V1I6yFDsd-YH75h<2I)^E!};SZ!(!57 zoiL3F`>wCno2OnR&g$pt=8|K5f7hgKkGX>S6!91waZ}0to)Cm!^ynVIhKls0ac`~v zs&V(P)wrh}2gERA=}ow=faXLMOlVA5@V8vpetI7@UQaYfnc)Op#~CtT!O0lbT~2v~ zWjvwRFaZZ}2-HwiRa8>1ecqMZ2M)<9qlx@ejj~ePuJ1J z+aDJ^Q=?CxV@)-8!hkq_qMC~pnb4yOB)*V4gX95r?`HN3V=6uh8o?#_RmH1!7!!oU zU*`OL8mu>mT?MLbpSUK?=qhSU(re# z&`lyZv)5SpZV%-L`>!I@R1E@JadCxyT6ByPnzbb@Aj@*pmndM}i<^Wa>pYfVkGM+eZ4t)HCa^L_(+rh44nacMyIFz%Es>7U-;EXvemY8FV{x z3*#PnoWvHFIzl`veKm;{DoH1O0YHrJoVC0^XL=22_B`vf%e1Zwi(a773_&$%v2tTV zSjG~h$JoX!@llR0J-IRBX`o3-i8q~vJz`w$4+3$dS*{CJr1i_I#+(1r*d{(i4q3rz z$tzc~@1dal*iZ|um3CGl3!~>$M;#uGGs&+G)JpF?UogzrO%E4lJR!c=k(l;vxCloK zlHiirng80oOKVHTmM%U-DVw{$2+Gzzk}Gp2(331qav6o4Y0`%{jR{&JkErFx8)-t0 z^rURFao(hc=`c7oK9G;{4f$diaJyarseki#WuT}zb)E@@IgczO=FK4bfIjnfLlKXr z&Mk}kAp+zkuU*eNv+}JqYSe127&KRpy*249#nTxLq=P&)1h(oJN2ESpa%5aJuVCB* z#;FmsI)EtxNvdeE-zYzxL0XDspRA;2FQ_N9p*`4&{2=!8h+YgjzoH%@Mu0aBApKux z6E9lmiDgbXlzhjm7}imY&Kzu%9A9Gau^KH*Gg-a#U9B?ktdEG)mJ_YuHXX71;Y7zg z;v|@=yC%h*Qcj*)mEqP@G>91kN(*31T-OUgWAWH|AWGocYACEY1ToOE0?0OZ08mV5 zefBhPf0^T8LaSt(hKdRg)Q-UqCl-zQVgrPFKnW;(t_-rY#G-IZf%!}Qa4kbS42c$a z5(q;hzYS-BF)D;+)3A=g%r#$&72LuIm$@N&O|!=|a<_Gw)kl-VF$a4p-a67`5NNfE z9#)|rgxsD4^IUzf^87_wQ5@DXUxNGZ&Fi`n9UvVZ}$Zs>z6`&E*BSo=PyOYsh2IFxfobP3a!A$*fbZdc+#T*NP`v@6Tb$RAQeMy zqyzfSa6yw7Yp2|5ys{FtXA;q8Zwyq?Ptl=>dbepGC?GuS4aoB)69aQWPYt>ms0Ag6 z4-tw}pabL^xLJWof?k0m0u;G^GK@dv#8pexkn%e~D1X-C%@TLpBm=2KI`_3Tq;%Ze zDR17~hD;and~@q<%#!s2Pn9S}KI6wL^2*p*WHbp02xwp)Qa- zI|&UxhQP17mJoIw#3}j;#0onZ2Wm@7YM zspNoNt;1_s&_D{fW$)>IJ6?D4v{$;4DL7n1?M(_yWM090%8A3}^@&7MdD zegSFCVUEe1n%LSkmAE`i3jQ^UZ=?pXhjwQtZ zWjGwg?EY5=oTKMJD?r?c#eYF{>rc6d?fc1MU?)RMfFBKs2ZMqakZ^-U4QD*^lWY&?IQu zH-p^5rQ!ePZ_b`}-;i`2>hsa&l3KQ4Dm*!HObUqRf8>UMgl-skj=;#3Oy6$GdB3B- zXM0u54QS8*``2#Bk73>_V&WxXX-GLom;Euv97uw#c<#qzV0M>zE?x8k_V2pX`~TW+ zzVSlsa{Xabe%R)d<;fA>#T`nk6a8;_J8}I`PM7|}n)%yh@&D$v|MT@^$O|d)tpk=a z9D$q9T)-kbC}*hWt059;plbxg9n{i0iAc zM*sgpCI8{0wY|c2181V;Pb8uvz?)uVf)Q}1<6xIj`vp<#yHw#)UkH$s)Cr_Ei>IT& zVuIu_FUUoGj=}u}-T=$+J|uq${9TrD`-Fi{@|zTd-TSS+c^w|N3N3AWdU_33BExJ; zl6b6a^fwIX7u^QDXxizf&pOi55$}fImJ1twKK|S1%t|}$3ols@&u#Qb0nO6FVF_>V zzrj{S2F}Y$0Y&%$tPT*nRCs8T`{Ky(ftiDxPVfzAZ~&^X;a`Rz$nW1A^;%K~Q;PfE z2mE8f_Z{&@{CIB|+WOQbT@kiK>{HKdc9mIiMyxl=76hu6<|nuBrZGR41ew_k7||ky zERv_YgYplOoZ)K@j{TV@5k(>J1^fugYx}&&fM3b#t^qnTXP_*i0{K%0J(P{A6L-Yvea)GlghJk6`ncr) z9V%?`v0c-^^^+uAwR;~KzZX;l9w$E(bO5J_0%jt_7V7dy$Em5I!VHup*mFc}oWh&6 zbDJ{9=~D$2d#kiAT~Z1bNPrp=gcHVS%aVV2y@X@9E`y#FjVND{LG`hnoS z6qa%ink-6@?jnP;i5r*XWdUaruG8D=qEWCI!0dSrFlEFuZnTke7NJM3{bjD|#%X2$`bhv+Ran-CMN@0_8=9Np{=?H_l`22C z1!OB7_h{IS%;!Y4eEE<(LT zehPN{`X{fy{s~_8?@!2au|9Krd&ZmdF=hWeMP;Ij@2`EvW5yr0#VJ>JOfeBGOl+@4 zDM>E%FxYf0*F#lgD|cQ(1MYhmZ*MZR4LaudRV2*P;H1m&cFC7NiOSbCXEUY6}9ipo3V#mp=}94J=z#|rWUU9QO5Y3ts!=VPDq@vc<$JG7Wy z#ge@1hg)vv|J)KVR_#*oZ07A#z2F<*$VNte`m$!a*w1=8GmYh`IR1xCUAP;SnGVJ7 z*zp!ovE_-tC!ilFH+<>%%9Exx)grR-0FSB%mjYLlWoXl$Cz<^I!ghRW62+MlJe|jV8T6j~`K8}Ej-@_U zKV}!e3MkQ2!}hsL3ehOO(A|#rSsW;7%=}AzlBK+EHJ?&7+4(a5!a@f-%nn`Tx#P&rQYR3kL@IG6Kzx^%aJi98(@|-G+ppr&w<>5vk_A+xa~N!V8VXdf z0_zs0*X4}cN<#YHMw#qCMk}O*)7i|zR_j*Yuk#{>f!YFn+-$g82>Z>=Z3!smo z*NAl7Ty*^Q3Cb1;!IBt3Y0gp!<*Vl-PRtyK=Q&_>yo-kOi=XU{P-GZVX@s4tU~|=+ z@`CNR2BOX!aaTMwJmRoCJ=PQ19B|sYlII$CUgnI60o`Q{Tm%#X#@Y^&)6adDVbY`2 z=j7R$#2ZlFeCvXq*0LEdf5`Pq^>?e6Q+9m??7hI;kEcB1iIz!r@a9X&j?6hXLe(|A z2Q4QIl$@Oly9)>3X#cddO;5XW-GL%V-J?e~Q>G8?nGxZr8l*tpyvIlx6>@f&oAdPN zgv z>5sK{4d=dNc8bW)}?-V;p7lMx@yMYVm<>k%A%MVnCa zK6oiGDm(Z6SJB1300&ns`Hz|(g#ARG)4c3+xDX%POxK7(7g*CccsA|6rtlLjVmW$*tPO>s>zo*&ug1jyx0p;QjmH_Kb`BMedplW>{m<{wZ07u4m*F}!&qR@C=f8g9w#Ij8j<_61+>e!Oz? z`W&`c-u0oh;4t>Fy($Q_Cn*VsRz~yp&`Ykci4z7w8n$g4qvo(3spNm8Yu8UnKrfsD zz|(AH+91CM+h7qY7Cu+Z)Jb)M{E>$8Pc$bw9J+-3zzxrtq%7}U{t28<0&c!C^y6!` zZ~nP@G2V5RL3fqK(=&9Mll7oOsu8~(Wkt1iR%}j%-S@YjM|xuw8zxW!V!`?+=wrU5 z%I#Jt5?5m`IX&aP^5noJiV*=e4&K(Qn)g1JYxW9~RONd}ycG>kM5TzH{+!s~jI8bj zEfZURIB@n$PpD?R&v@0Dze#Kl@igSUvqZC;Y2GD8-sh^=rzDp*%gLZDbSbz5Q)V^# z0ThwCQm1o*G1sTJYM7P5%vvrCZvpD?dkH#wsTB*^)&{PuKFfwM4Fv=H;c1YEcDyyR zc>mbKV|9)%6%raVlA)yAyELyHzhh~xbQaq<84%u%?@~T>2h5?aV9z=b_6%`j?6f*~ z?hc%OGtkiCFi|e9kpjkc?r0y@ux2p(7+rD@8%vV_9Ih=;f8o7ouEEkb-t@lNe1jS0`)i z-I06RRAA&yXo-*XoRMuh&DhyHFHp(_k}8u1R<^RZv$<8pirH+D`Zz`)2)#8f-<9h# z!iF2b-mGJ~S+!t?Lfvc-Nzj+mtZz&b+Y(rlZXz7Z#Sz5+D}P! zd?Y;KI-qoHOz}9q6#h%4+%x=svwrhRBeNl@VTye)*%~|KKa8owpUOhl32h;GG|cNN zIyCg0grhq-v>7I4I-zkKIlcXRE=r79+7n2>uWsPanLiVu0fO5i7y2;k?W6b9tU4E8 z_^{HkD@HMzj>z5nz5>o;T932>DfJbV7nZ<3=g_jM_%~n%CFuJjA3tBp+|vLSJf;n; z8i^Cur|c%u^`CENfh!Irz zaO8DnTF3yx+|V&PHkP-@xYRz_x;Pt48?S{8oQnz_V=O{$gyYvV)3ekBab*=1bUfW& z>?yAz!%o@TvBbp%ze;U|e&JC+D#KUq`Dpbi_S`a76BBtXjq5GWKixKSSh%8K|FYjs z11m!ha}^l10O}Diy6qvX;CrWYJTYB)%ej&KU+4T+@^_6~ZjU%02PNhGDHoYeXxNA^ z$MifMIjNsC?DSz;q{sC@%G5+fio|d`D4f?tz4?rqhgpOPRXz^9hTt>RiJFc)&&cE z9iLsYdrE6QyP2nI#ak2B8FzhEC#>MuaS z>auZZDB6-W&T@|Rd3kOMcXW_xZ+Qt&+F0i!bglZ98k0Nv2=OIqZ-u7@mV5oj(e?!H z{G7tJo(J2Mx1m3Wz=agcu#J>O#65co47X-q4DGnxx#X;QuN{|zb_AdnTaKMSa{eoW z*i2Ugbj8i7`94IqnAxk7$h;ub7?Qs*LclYyJMK09_-LGX%DxQ4orf0RtRT7=;IF2y z15xsDJwE=+_bH74ic9J#S6%KqsGp(@!YS>E+&?`x&RzXMysV1P`~t?fNQ*)HC_V0q zNPD!Kz1?`B0X1cs!(`QnX`3~i%{)dWAV_S$N`j$XQQHM^^9DDEE5qUyRtNVagnerW z?u^TJw7O=$kWaWW_#E4dJy>hxBO)!O&%K{ZgiQ{;G8`8ODujn(_lDxJSGHg3I9bF} z#4i*OtTy^acYb6ngP<{81wK+nol1T6WlMh7beI=d=NS{Q>;t?)Qv;**W#I_IYGrMY@;_>b6Z zQp+AiS0%OphpxJx#$0s*6I%3%=LQGeSZ3T^BI6s1az7vQU1C#V?=ho_vk z(zt-u=ZfZ-9@ai(@rQ#-$3>89JAU(E?(Bpz>Oe=cJy=-pEp{OLUW1Vc!XG(JJoBi- zfNLe$(2@A{NO3*IrNqh0)IQSg=>gX0r?)OJl&x)zxUhvJ!eg|VzHt#N1q{AG&bxzm zBlJJqSx%%4uL_=iGCvs(-py68!;%7(gQxV;WuF}LN$8(uvajy>aXcU!Vyy`Y&B16T z{m?-t8Ry+sGW+6BB%G9#B+zwb&H*>412!5HK5KALb^4p>(bGonu?e8C$i6#BF)e&? z^tAW5BBd2&JzK40`Rql_p{+S4zPVRlpFj&nC>3AX7F*dCp=%MO;hlfTmdv1nLy;m6 zO-Ro9b*_vNoM z&IABiR36$}I=7ihLb%poItBOCEbNFb2mBTnqnM76V5k*iUx2%3)fNA>^NZ)2%W&a# zOoBAki2j%HDc1&9Gg9{`Kh3e|P}<|Ps@r#Qz&6-XWjS1@S>=dX!b8xf;9xL%GWCMQ zEe$xaVz4uB$3Jt23Buu7;+1ugTQw>}Db$DHOLz%VX!*{2tth9>`N6U7Hl0d1iqpl& zyc9`jn&Cdq4svH2R!$Auq?u^Ne^l%7kBXcETB9<*f$-hQDoIc5K{JY;Lm`@q33q2o zwicmW&5rh*AiZ?W@W2m0Y|Tzv-jr(h6@6#!p@IU%gc^7wZ!J7j6%6AGq|f&%Xlr@vbtA^Uqu7 zAuQ5-79!u&#Anje80oEH}=Wx?2AI2 z#{1)?qnR$)s(t1p zM=oBxx^fA#wDV`~BJbT5un1w8635{bDBaT%Mqmz7_+YOXkE3WSu>OZ#q}qRyR|BuL(5=c8Ttae>W2ASaiu zHh&hMvJk1pQFA}K*X7U)ZvCap2AIqgeDU-&tIZF`uGUs+k(7pkgcKg(>+bhnaYv`8 z8zd$sCfML`-`F$EF!GWT&N;(O=V@uPt*3@YN0`z-q^H-vXOuLlKF z6?__OzO*fGb*+!t(t;#ma(fMU+S%#~3I=6-1Zvo{V;tKqN3w7IgiK*uv#qp8_uS8n zcAX=!Qt*;5{bisUfs$!~k2GRgNi%c=*eZE?%ZC-4)#^xPWyNRjZpb{w;Nd}=tc z;Hqrt!_qw!A8i8Tp}(4_SXZ2@HkBYu;kIx4Z0gIBsZuKE&W(Kk9y>Kc0Ig-#j~{z+ zTXH(=lhL#CTbJ4E31Xt1G5RVaOpGhsSEN6*Xi+z9Rtfr;Ik&|vu#=Nf+Jw_B*nZ@* zO_0X{PELUfD68R-kqE&$OsI%k_1j=2JBR#b{iW0R%p10<0VjTNT~pLZDX-kmGLWFG z(RFQ)(P>Ub>cbtUrmlHS;t$;PJ}9^w_hV?V;f%%>xxsgVjiET!8ySKedH90EGf910 z45zv4i;j$++@h^e=MjE~;pTvz?vc`0Mcit^cf0tpVH{0D-Vx9h`N_b*i}6wY6KV$x zv1e|=K1i0@U3=nrYg-pRZ8o*DxRS!x4lV1CC4Jhc2Oh!LoVd$xPDXsU4$63r7vtHn z$TnYxy_T3?5VzZqms-Km+3!G%TFkb=52zP`O)M<2T3TeIqsk>E$%B?znfEw&T!Qtt zy*TeUHl*`upZ9k*%CNyngQmvD1tzhSDBPiz_g@8<>Dd)|c$K#QKvA2>ov6@NGG_0x zG2BP3F>zhZO$+0qe5l}>!mBwC>XWK$nmXndAp?Eodn~hKV+Wew3YX!(8ML@D^SIDz zZM$^l*T+PD(lNkjFB@4g#C$Cavq~NwM4rV$)Li+!w)(lt1C~dx%)@F=eeKU3z?QQ> z=J3P1{zoO=Q+kZkhAkfkHEEW45~AAULXK-W458R0lKyYd5b&o*(8QgrRO8X~Q= znIgVJ(@^whIv`i)1r#WC-=E>B-In#84;dyU%?W>IWYTxDgPMU)t`H38l04r z#ICiVmuh$Cj>Yxs%*}*{1BDNnZr(fyZ>BD=XFDlrMn=ZNt7_(~e++EnFg&~sJiPxr z@!<{ficm*dgvigzPkYm;A3GLBZDM;$Qc{xXd)97h>O3;xW$6o{2v+3Ms5HA literal 0 HcmV?d00001 diff --git a/docs/team/hyperbola-bear.md b/docs/team/hyperbola-bear.md index a14a3d151a..9cf0d668a5 100644 --- a/docs/team/hyperbola-bear.md +++ b/docs/team/hyperbola-bear.md @@ -1,38 +1,53 @@ # Clement Hung - Project Portfolio Page ## Overview + ChChing is a financial management tool which allows users to keep track of their incomes and expenses conveniently. There is also an option to change currency should users require currency conversion. ### Summary of Contributions + Given below are my contributions to the project. #### Code Contributed: -[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=hyperbola-bear&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +[RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17&tabOpen=true&tabType=authorship&tabAuthor=hyperbola-bear&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) #### Project management: -* Creating issues for team members to work on + +- Creating issues for team members to work on #### Enhancements Implemented: -* Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. -* Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. -* Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. -* Refactored and upgraded `FindCommand` to allow users to find income and expenses based on their type. For incomes, user can search based on date and dexcription. For expenses, user can search based on date, description and category. Each of the search parameters are optional, however, at least one search parameter must be provided for `FindCommand` to work. -* Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. -* Created a Selector to allow users to select the currency of interest. -* Created a Converter class to allow users to convert the currency of interest. -* Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. -* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, + +- Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. +- Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. +- Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. +- Refactored and upgraded `FindCommand` to allow users to find income and expenses based on their type. For incomes, user can search based on date and dexcription. For expenses, user can search based on date, description and category. Each of the search parameters are optional, however, at least one search parameter must be provided for `FindCommand` to work. +- Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. +- Created a Selector to allow users to select the currency of interest. +- Created a Converter class to allow users to convert the currency of interest. +- Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. +- Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, #### Contributions to the UG: + Added documentation for the feature `Set Currency`, `Unset Currency` and `FindCommand`. #### Contributions to the DG: -* Added `SetCurrencyCommand` sequence diagram -* Added implementation details for `SetCurrencyCommand` -* Added `UnsetCurrencyCommand` sequence diagram -* Added implementation details for `FindCommand` -* Added `FindCommand` sequence diagram + +- Added `SetCurrencyCommand` sequence diagram +- Added implementation details for `SetCurrencyCommand` +- Added `UnsetCurrencyCommand` sequence diagram +- Added implementation details for `FindCommand` +- Added `FindCommand` sequence diagram + +#### Contributions to team-based tasks: + +- Ensuring Github's Java CI checks are passing + +#### Review/monitoring contributions + +- PRs reviewed: [CS2113-T13-1](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-T13-1+), [CS2113-W12-4](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-W12-4+) +- Bugs reported and suggestions: [CS2113-F10-1](https://github.com/hyperbola-bear/ped/issues) diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index d9e804503b..3684a87334 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -28,9 +28,9 @@ public LiveCurrencyApi(Selector selector, Converter converter) throws Exception String[] arr = temp.split(","); for (String s : arr) { String[] tempArr = s.split(":"); - String countryCode = tempArr[0].substring(3, tempArr[0].length() - 1); - if (selector.containsCurrency(countryCode)) { - converter.setConversionRate(countryCode, Double.parseDouble(tempArr[1].trim())); + String currencyCode = tempArr[0].substring(3, tempArr[0].length() - 1); + if (selector.containsCurrency(currencyCode)) { + converter.setConversionRate(currencyCode, Double.parseDouble(tempArr[1].trim())); } } } catch (Exception e) { From b1982889e98ee7ce4a48867948d0a139af3ea0af Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:31:01 +0800 Subject: [PATCH 306/364] Add Junit for ClearTargetCommand. Update UG, DG, PPP --- META-INF/MANIFEST.MF | 3 + docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 1 + docs/team/avielcx.md | 8 +- .../chching/command/ShowTargetCommand.java | 1 + .../java/chching/record/TargetStorage.java | 5 +- .../command/ClearTargetCommandTest.java | 77 +++++++++++++++++++ 7 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 META-INF/MANIFEST.MF create mode 100644 src/test/java/chching/command/ClearTargetCommandTest.java diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..e79fa114d7 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: chching.ChChing + diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index fc434a80ff..fc0c35f86f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -380,7 +380,7 @@ Given below are instructions to test the app manually. ### Setting target & Clearing target 1. Setting Target - 1. Prerequisites: Target set has to be within -9999999.99 to 9999999.99. + 1. Prerequisites: Target set has to be within -9999999.99 to 9999999.99. Keep in mind that the default target is 0.00 2. Test case: `set target /v 350.50`
      Expected: Program will indicate to user that target has been set. If the target is out of range, program will indicate to users that target setting is invalid. 2. Clearing Target 1. Prerequisites: Target must have been set in the first place. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1416ac9e25..af0b3c9a08 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -223,6 +223,7 @@ Use case: - VALUE ranges from negative to positive. - Target must be within the range of -9999999.99 to 9999999.99. - Target will be set to 2 decimal places. +- Default target is 0.00 Example of usage:
      `set target /v 350` diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 5fb1edae20..e32cfcbe44 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -16,19 +16,20 @@ Given below are my contributions to the project. * Managed release of v2.0 on GitHub #### Enhancements Implemented: -* Created a balance command to allow users to check their balance when total income deducts total expense. +* Created a balance command to allow users to check their balance when total income deducts total expense and compare with their target. * Created a clear incomes feature which allow users to clear their income list. * Created a clear expenses feature which allow users to clear their expense list. * Created a clear all feature which allow users to clear both income and expense lists. * Created an AddTarget feature which allow users to set their target. * Created a ShowTarget feature which allow users to see the target they have set. +* Created a ClearTarget feature which allow users to clear the target they have set to the default value. * Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, `IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. #### Contributions to the UG: * Created `Table of Contents` * Contributed to `Quick Start` portion -* Created documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`, `balance`, `exit` +* Created documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` * Created `Command Summary` #### Contributions to the DG: @@ -41,14 +42,17 @@ Given below are my contributions to the project. * Added documentation for `Value Proposition` * Added documentation for `v2.0` of `User Stories` * Added documentation for `Glossary` +* Added Non-Functional Requirements section #### Contributions to team-based tasks: * Method documentations * Assertions enabled * Ensured GitHub's Java CI checks pass +* v1.0 wrap-up * v2.0 wrap-up * v2.0 release * v2.1 set-up +* v2.1 wrap-up #### Review/monitoring contributions * PRs reviewed for the following team: [CS2113-W13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/53) diff --git a/src/main/java/chching/command/ShowTargetCommand.java b/src/main/java/chching/command/ShowTargetCommand.java index 57177bc868..98949d36f8 100644 --- a/src/main/java/chching/command/ShowTargetCommand.java +++ b/src/main/java/chching/command/ShowTargetCommand.java @@ -26,6 +26,7 @@ public class ShowTargetCommand extends Command{ */ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { + double target = targetStorage.getTarget().getValue(); String convertedCurrencies = converter.printConverter(target, selector); System.out.println(" Current target: " + target + " SGD" + convertedCurrencies); diff --git a/src/main/java/chching/record/TargetStorage.java b/src/main/java/chching/record/TargetStorage.java index 8d374faec8..39cc9accbe 100644 --- a/src/main/java/chching/record/TargetStorage.java +++ b/src/main/java/chching/record/TargetStorage.java @@ -21,7 +21,9 @@ public TargetStorage(Target[] targetsList) { * Default Constructor to instantiate TargetStorage objects */ public TargetStorage() { + Target defaultTarget = new Target(0); targetsList = new Target[1]; + targetsList[0] = defaultTarget; } public void addTarget(Target target) { @@ -33,7 +35,8 @@ public Target getTarget() { } public void clearTargetList() { - targetsList[0] = null; + Target defaultTarget = new Target(0); + targetsList[0] = defaultTarget; } } diff --git a/src/test/java/chching/command/ClearTargetCommandTest.java b/src/test/java/chching/command/ClearTargetCommandTest.java new file mode 100644 index 0000000000..bc113a476b --- /dev/null +++ b/src/test/java/chching/command/ClearTargetCommandTest.java @@ -0,0 +1,77 @@ +package chching.command; + +import chching.Ui; +import chching.Storage; +import chching.record.Income; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.Target; +import chching.record.TargetStorage; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Junit Test for ClearTargetCommand + */ +public class ClearTargetCommandTest { + static final String CATEGORY = "transport"; + static final String EXPENSE_DESCRIPTION = "public transport"; + static final String INCOME_DESCRIPTION = "ALLOWANCE"; + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-uuuu"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); + static final float EXPENSE_VALUE = (float) 1.50; + static final float INCOME_VALUE = (float) 200; + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private Expense expenseDemo; + private Income incomeDemo; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + + ArrayList expenseList = new ArrayList<>(); + expenseDemo = new Expense(CATEGORY, EXPENSE_DESCRIPTION, DATE, EXPENSE_VALUE); + expenseList.add(expenseDemo); + defaultExpenseList = new ExpenseList(expenseList); + + ArrayList incomeList = new ArrayList<>(); + incomeDemo = new Income(INCOME_DESCRIPTION, DATE, INCOME_VALUE); + incomeList.add(incomeDemo); + defaultIncomeList = new IncomeList(incomeList); + + Target defaultTarget = new Target(350); + targetStorage.addTarget(defaultTarget); + } + + /** + * Junit Test for clearTarget command to clear target + */ + @Test + public void execute_clearTargetCommand_success() { + try { + Command command = new ClearTargetCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertTrue(targetStorage.getTarget().getValue() == 0); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} \ No newline at end of file From 249b4c93ac33d0bed7335a5be106fe5180f043cd Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:43:02 +0800 Subject: [PATCH 307/364] Improve language use in DG and UG --- docs/DeveloperGuide.md | 10 +++++----- docs/UserGuide.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index fc0c35f86f..ebd9ad01ac 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -28,9 +28,9 @@ ## Acknowledgements - -The template of ChChing is from the [tp project](https://github.com/nus-cs2113-AY2223S2/tp) of the nus-cs2113-AY2223S2 organisation. -
      The format and coding style of ChChing is largely inspired by the [addressbook-level2](https://github.com/se-edu/addressbook-level2) & [addressbook-level3](https://github.com/se-edu/addressbook-level3) project. +We first give acknowledgement to Module Coordinator, Dr Akshay Narayan, and Teaching Assistant, Aditi Chadha for guidance and supervision over the ChChing project.
      +We utilized the [tp project](https://github.com/nus-cs2113-AY2223S2/tp) of the nus-cs2113-AY2223S2 organisation as our template for ChChing. +
      The [addressbook-level2](https://github.com/se-edu/addressbook-level2) & [addressbook-level3](https://github.com/se-edu/addressbook-level3) project largely inspired the format and coding style of ChChing. ### ExchangeRateApi @@ -40,12 +40,12 @@ The `LiveCurrencyApi` class uses the [ExchangeRateApi](https://www.exchangerate- ## Design & implementation Below are the design and implementations of key features of the ChChing program. -
      We used various diagrams such as UML class diagrams, sequence diagrams and activity diagrams +
      We used various diagrams such as architectural diagram, UML class diagrams, sequence diagrams and activity diagrams to illustrate our methodology and approach. ## Design -The architecture diagram of ChChing below provides an overview of the design of our program. +The architectural diagram of ChChing below provides an overview of the design of our program. ![Design](images/ArchitectureDiagram.png) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index af0b3c9a08..2cb0195135 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -27,7 +27,7 @@ ## Introduction -ChChing is a desktop app for tracking spending, and it uses a Command Line Interface (CLI) for managing finances. If you are someone who needs a simple interface to get a better hold of your finances, this app is for you! +ChChing is a Command Line Interface (CLI) desktop app for tracking spending and managing finances, with currency conversion capabilities. If you are someone who needs a simple interface to get a better hold of your finances, this app is for you! ## Quick Start From 32b3f769485d37e9cd89f4410802dde4e99dcb86 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:46:00 +0800 Subject: [PATCH 308/364] Fix typo --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2cb0195135..6a06f8acd8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -82,7 +82,7 @@ Use case: - VALUE will be stored as a positive double up to 2 decimal places. - VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. -- Format for DATE will be dd-MM-yyyy. +- Format for DATE will be DD-MM-YYYY. - DATE needs to be a valid date, and it cannot be a date in the future. Example of usage: From 3e8a856294e95eea887c1265c433dca508a34809 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:47:14 +0800 Subject: [PATCH 309/364] Fix checkstyle --- src/main/java/chching/command/ClearTargetCommand.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/chching/command/ClearTargetCommand.java b/src/main/java/chching/command/ClearTargetCommand.java index 466e7611a7..3fa64d82bb 100644 --- a/src/main/java/chching/command/ClearTargetCommand.java +++ b/src/main/java/chching/command/ClearTargetCommand.java @@ -11,13 +11,13 @@ /** * Models a class that clears target already set. Inherited from Command class. */ -public class ClearTargetCommand extends Command{ +public class ClearTargetCommand extends Command { /** * Executes clearing of targetStorage * * @param incomes ArrayList of income. * @param expenses ArrayList of income. - * @param ui User interface + * @param ui User interface * @param storage Storage of data * @param converter Convert value * @param targetStorage store target @@ -28,3 +28,5 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto targetStorage.clearTargetList(); } } + + From 251aa209fb1b7718c24ecf678a7104e34457fc32 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:51:11 +0800 Subject: [PATCH 310/364] fix checkstyle --- src/test/java/chching/command/ClearTargetCommandTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/command/ClearTargetCommandTest.java b/src/test/java/chching/command/ClearTargetCommandTest.java index bc113a476b..fff3fef27e 100644 --- a/src/test/java/chching/command/ClearTargetCommandTest.java +++ b/src/test/java/chching/command/ClearTargetCommandTest.java @@ -74,4 +74,5 @@ public void execute_clearTargetCommand_success() { System.out.println(e.getMessage()); } } -} \ No newline at end of file +} + From 6ea16e3eaa89c0d99ab7a39b6d4ec45650100836 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 18:57:19 +0800 Subject: [PATCH 311/364] Logging --- src/main/java/chching/ChChing.java | 18 ++++++++++++++++++ src/main/java/chching/ChChingException.java | 16 ++++++++++++++++ src/main/java/chching/Storage.java | 15 +++++++++++++++ src/main/java/chching/Ui.java | 15 +++++++++++++++ src/main/java/chching/api/LiveCurrencyApi.java | 17 +++++++++++++++++ .../chching/api/ParameterStringBuilder.java | 14 ++++++++++++++ 6 files changed, 95 insertions(+) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 24dc6d7d70..b3d30247f9 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -10,6 +10,12 @@ import chching.record.Target; import chching.record.TargetStorage; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + + public class ChChing { private Storage storage; private IncomeList incomes; @@ -21,6 +27,18 @@ public class ChChing { private Target target = new Target(0); private Ui ui; + /** + * Program Logging + */ + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } + /** * Loads memory of the program */ diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index d404a6c862..8b41133b1e 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -1,9 +1,25 @@ package chching; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * Models a class for exception thrown */ public class ChChingException extends Exception { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + /** + * Program Logging + */ + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } private String message; public ChChingException(String message) { super(message); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index e2d9c709dc..89eac8ee83 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -12,6 +12,10 @@ import java.nio.file.Files; import java.time.LocalDate; import java.util.ArrayList; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -23,6 +27,17 @@ * Models a class to handle storage for the program. */ public class Storage { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + /** + * Program Logging + */ + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } private final File file; /** diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 633f11f761..6faed85d8b 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -10,11 +10,26 @@ import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.Scanner; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Models a class for user interface of the program */ public class Ui { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + /** + * Program Logging + */ + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } public String readCommand() { Scanner input = new Scanner((new InputStreamReader(System.in, Charset.forName("UTF-8")))); return input.nextLine(); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 3684a87334..7df3c9dd5b 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -4,11 +4,28 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import chching.ChChing; import chching.currency.Converter; import chching.currency.Selector; import chching.ChChingException; public class LiveCurrencyApi { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + /** + * Program Logging + */ + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } public LiveCurrencyApi(Selector selector, Converter converter) throws Exception { try { diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index df1384ee50..dab8c57929 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -1,10 +1,24 @@ package chching.api; +import chching.ChChing; + import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; public class ParameterStringBuilder { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + static { + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setLevel(Level.ALL); + } public static String getParamsString(Map params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); From fefccce74d3bc98d8c8094cd9a45525a47721046 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 19:07:57 +0800 Subject: [PATCH 312/364] fix checkstyle --- src/main/java/chching/ChChing.java | 2 +- src/main/java/chching/ChChingException.java | 7 +------ src/main/java/chching/Storage.java | 4 ++-- src/main/java/chching/Ui.java | 16 +++++++++------- src/main/java/chching/api/LiveCurrencyApi.java | 5 +++-- .../java/chching/api/ParameterStringBuilder.java | 5 ++++- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index b3d30247f9..edac55307e 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -30,7 +30,7 @@ public class ChChing { /** * Program Logging */ - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 8b41133b1e..7627d1b117 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -9,11 +9,10 @@ * Models a class for exception thrown */ public class ChChingException extends Exception { - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - /** * Program Logging */ + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); @@ -25,9 +24,5 @@ public ChChingException(String message) { super(message); this.message = message; } - - // public void printChChingException() { - // System.out.println(message); - // } } diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 89eac8ee83..dad69a73a7 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -27,17 +27,17 @@ * Models a class to handle storage for the program. */ public class Storage { - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - /** * Program Logging */ + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); logger.addHandler(handler); logger.setLevel(Level.ALL); } + private final File file; /** diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 6faed85d8b..3e88018f79 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -19,17 +19,18 @@ * Models a class for user interface of the program */ public class Ui { - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - /** * Program Logging */ + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); logger.addHandler(handler); logger.setLevel(Level.ALL); } + public String readCommand() { Scanner input = new Scanner((new InputStreamReader(System.in, Charset.forName("UTF-8")))); return input.nextLine(); @@ -78,13 +79,13 @@ public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) } public void showAllRecords(IncomeList incomes, ExpenseList expenses, Selector selector, Converter converter) { - if(incomes.size() == 0 && expenses.size() == 0) { + if (incomes.size() == 0 && expenses.size() == 0) { System.out.println(" Both lists are empty. Start adding!"); - } else if(incomes.size() == 0) { + } else if (incomes.size() == 0) { System.out.println(" Income list is empty. Start adding!"); System.out.println(); showExpenseList(expenses, selector, converter); - } else if(expenses.size() == 0) { + } else if (expenses.size() == 0) { showIncomeList(incomes, selector, converter); System.out.println(); System.out.println(" Expense list is empty. Start adding!"); @@ -202,6 +203,7 @@ public void showTargetAdded() { System.out.println(" Target added"); } + public void clearTarget() { System.out.println(" Target cleared"); } @@ -211,7 +213,7 @@ public void showListCleared() { } public void showExpenseList(ExpenseList expenses, Selector selector, Converter converter) { - if(expenses.size() == 0) { + if (expenses.size() == 0) { showEmptyListMessage(); } else { System.out.println(" Here are the expenses in your list:"); @@ -220,7 +222,7 @@ public void showExpenseList(ExpenseList expenses, Selector selector, Converter c } public void showIncomeList(IncomeList income, Selector selector, Converter converter) { - if(income.size() == 0) { + if (income.size() == 0) { showEmptyListMessage(); } else { System.out.println(" Here are the incomes in your list:"); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 7df3c9dd5b..79c2ba8c16 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -15,11 +15,12 @@ import chching.ChChingException; public class LiveCurrencyApi { - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - /** * Program Logging */ + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + + static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index dab8c57929..3fb14c627a 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -11,7 +11,10 @@ import java.util.logging.Logger; public class ParameterStringBuilder { - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + /** + * Program Logging + */ + private final static Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); From b33e9077dd4c351512752d786fc6df0d2c0b864d Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 19:19:37 +0800 Subject: [PATCH 313/364] logging --- src/main/java/chching/ChChing.java | 21 +++++++++---------- src/main/java/chching/ChChingException.java | 2 +- src/main/java/chching/Storage.java | 2 +- src/main/java/chching/Ui.java | 2 +- .../java/chching/api/LiveCurrencyApi.java | 2 +- .../chching/api/ParameterStringBuilder.java | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index edac55307e..a4269552c4 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -17,20 +17,10 @@ public class ChChing { - private Storage storage; - private IncomeList incomes; - private ExpenseList expenses; - private Selector selector; - private Converter converter; - private LiveCurrencyApi liveCurrencyAPI; - private TargetStorage targetStorage; - private Target target = new Target(0); - private Ui ui; - /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); @@ -38,6 +28,15 @@ public class ChChing { logger.addHandler(handler); logger.setLevel(Level.ALL); } + private Storage storage; + private IncomeList incomes; + private ExpenseList expenses; + private Selector selector; + private Converter converter; + private LiveCurrencyApi liveCurrencyAPI; + private TargetStorage targetStorage; + private Target target = new Target(0); + private Ui ui; /** * Loads memory of the program diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 7627d1b117..af295601f3 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -12,7 +12,7 @@ public class ChChingException extends Exception { /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index dad69a73a7..71ffa811f7 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -30,7 +30,7 @@ public class Storage { /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); handler.setLevel(Level.ALL); diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 3e88018f79..65fabfaa48 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -22,7 +22,7 @@ public class Ui { /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 79c2ba8c16..2d7106c5e0 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -18,7 +18,7 @@ public class LiveCurrencyApi { /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 3fb14c627a..1b3c1825ae 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -14,7 +14,7 @@ public class ParameterStringBuilder { /** * Program Logging */ - private final static Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { Handler handler = new ConsoleHandler(); From 2cc5be3865826ba43aa4a7f25c854e38a09282e3 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 19:36:52 +0800 Subject: [PATCH 314/364] Update TOC --- docs/UserGuide.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 6a06f8acd8..9a196fcf28 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,25 +4,25 @@ * [Introduction](#introduction) * [Quick Start](#quick-start) * [Features](#features) - * [Adding an entry: `add`](#adding-an-entry--add) - * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) - * [Updating an entry: `edit`](#updating-an-entry--edit) - * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) - * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) - * [Finding an entry: `find`](#finding-an-entry--find) - * [Deleting an entry: `delete`](#deleting-an-entry--delete) - * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) - * [Clear entire expense list: `clear income`](#clear-entire-expense-list--clear-income) - * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) - * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) - * [See target set: `show target`](#see-target-set--show-target) - * [Clear Target Set: `clear target`](#clear-target-set--clear-target) - * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) - * [View help: `help`](#view-help--help) - * [Exit: `exit`](#exit--exit) + * [Adding an entry: `add`](#adding-an-entry-add) + * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes-list) + * [Updating an entry: `edit`](#updating-an-entry-edit) + * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted-set-currency) + * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted-unset-currency) + * [Finding an entry: `find`](#finding-an-entry-find) + * [Deleting an entry: `delete`](#deleting-an-entry-delete) + * [Clear entire income list: `clear income`](#clear-entire-income-list-clear-income) + * [Clear entire expense list: `clear income`](#clear-entire-expense-list-clear-income) + * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists-clear-all) + * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances-set-target) + * [See target set: `show target`](#see-target-set-show-target) + * [Clear Target Set: `clear target`](#clear-target-set-clear-target) + * [Finding balance of finances: `balance`](#finding-balance-of-finances-balance) + * [View help: `help`](#view-help-help) + * [Exit: `exit`](#exit-exit) * [Saving and loading of data](#saving-and-loading-of-data) * [Other Notes](#other-notes) - * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) + * [Command Summary (Alphabetical Order)](#command-summary-alphabetical-order) ## Introduction From 5fd76030f0a4f5370965333e009afcca8f7e9aaf Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Fri, 7 Apr 2023 20:03:52 +0800 Subject: [PATCH 315/364] Implement logger and log file for Storage --- src/main/java/chching/Storage.java | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 71ffa811f7..affc0985db 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -13,9 +13,10 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.logging.ConsoleHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.logging.FileHandler; +import java.util.logging.LogManager; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -32,10 +33,19 @@ public class Storage { */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/StorageLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/StorageLog.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } private final File file; @@ -79,9 +89,11 @@ public ArrayList loadIncomes() { } } catch (IOException e) { System.out.println("Unfortunately, income list file can't be found. I'll make a new one!"); + logger.info("Loading incomes failed"); } - + logger.info("Successfully loaded incomes"); return incomes; + } public ArrayList loadExpenses() { @@ -112,8 +124,9 @@ public ArrayList loadExpenses() { } } catch (IOException e) { System.out.println("Unfortunately, expense list file can't be found. I'll make a new one!"); + logger.info("Loading expenses failed"); } - + logger.info("Successfully loaded expenses"); return expenses; } @@ -154,6 +167,7 @@ public void save(IncomeList incomes, ExpenseList expenses) { } catch (IOException e) { System.out.println("An error occurred while writing JSON data to file."); + logger.info("Error saving data"); e.printStackTrace(); } } From 47dba67f6dc86de304b7ab5e89538eaf56710f88 Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 20:14:15 +0800 Subject: [PATCH 316/364] Logging --- src/main/java/chching/ChChing.java | 19 +++++++++++++--- src/main/java/chching/ChChingException.java | 19 +++++++++++++--- src/main/java/chching/Ui.java | 20 +++++++++++++---- .../java/chching/api/LiveCurrencyApi.java | 22 ++++++++++++++----- .../chching/api/ParameterStringBuilder.java | 20 ++++++++++++++--- 5 files changed, 82 insertions(+), 18 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index a4269552c4..dd0cc58517 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -10,9 +10,13 @@ import chching.record.Target; import chching.record.TargetStorage; +import java.io.File; +import java.io.IOException; import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.Logger; @@ -23,10 +27,19 @@ public class ChChing { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/MainChChing.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/MainChChing.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } private Storage storage; private IncomeList incomes; diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index af295601f3..e3f5437f7f 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -1,8 +1,12 @@ package chching; +import java.io.File; +import java.io.IOException; import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.Logger; /** @@ -14,10 +18,19 @@ public class ChChingException extends Exception { */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/ExceptionLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/ExceptionLog.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } private String message; public ChChingException(String message) { diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 65fabfaa48..b7c71d78b8 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -7,12 +7,16 @@ import chching.record.Record; import chching.record.RecordList; +import java.io.File; +import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.Scanner; import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.Logger; /** @@ -23,12 +27,20 @@ public class Ui { * Program Logging */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/UILog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/UILog.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } public String readCommand() { diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 2d7106c5e0..20e8d91138 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -1,12 +1,16 @@ package chching.api; import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.Logger; import chching.ChChing; @@ -20,12 +24,20 @@ public class LiveCurrencyApi { */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/LiveCurrencyAPI.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LiveCurrencyAPI.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } public LiveCurrencyApi(Selector selector, Converter converter) throws Exception { @@ -37,7 +49,7 @@ public LiveCurrencyApi(Selector selector, Converter converter) throws Exception conn.setRequestMethod("GET"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream()))) { - for (String line; (line = reader.readLine()) != null;) { + for (String line; (line = reader.readLine()) != null; ) { result.append(line); } } diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 1b3c1825ae..52dfca0c7a 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -2,12 +2,16 @@ import chching.ChChing; +import java.io.File; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; +import java.util.logging.LogManager; import java.util.logging.Logger; public class ParameterStringBuilder { @@ -17,11 +21,21 @@ public class ParameterStringBuilder { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - Handler handler = new ConsoleHandler(); - handler.setLevel(Level.ALL); - logger.addHandler(handler); + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); + try { + new File("data/ParameterStringBuilder.log").createNewFile(); + FileHandler fileHandler = new FileHandler("ParameterStringBuilder.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } } + public static String getParamsString(Map params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); From b30b8b85daeac519e67af656168bee04808de52a Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 20:25:50 +0800 Subject: [PATCH 317/364] update logging --- src/main/java/chching/ChChing.java | 7 +-- src/main/java/chching/ChChingException.java | 7 ++- src/main/java/chching/Storage.java | 5 +- src/main/java/chching/Ui.java | 5 +- .../java/chching/api/LiveCurrencyApi.java | 4 +- .../chching/api/ParameterStringBuilder.java | 4 +- src/main/java/chching/parser/Parser.java | 53 ++++++++++++++----- .../java/chching/parser/TargetParser.java | 31 +++++++++-- 8 files changed, 86 insertions(+), 30 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index dd0cc58517..1baa3179be 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -24,7 +24,7 @@ public class ChChing { /** * Program Logging */ - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { LogManager.getLogManager().reset(); @@ -33,14 +33,15 @@ public class ChChing { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/MainChChing.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/MainChChing.log"); + new File("data/LogFiles/MainChChingLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/MainChChingLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { logger.log(Level.SEVERE, "File logger not working.", e); } } + private Storage storage; private IncomeList incomes; private ExpenseList expenses; diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index e3f5437f7f..3ab88fbd3e 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -17,6 +17,7 @@ public class ChChingException extends Exception { * Program Logging */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + static { LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); @@ -24,15 +25,17 @@ public class ChChingException extends Exception { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/ExceptionLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/ExceptionLog.log"); + new File("data/LogFiles/ExceptionLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/ExceptionLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { logger.log(Level.SEVERE, "File logger not working.", e); } } + private String message; + public ChChingException(String message) { super(message); this.message = message; diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index affc0985db..ceb0aa7e0b 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -32,6 +32,7 @@ public class Storage { * Program Logging */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + static { LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); @@ -39,8 +40,8 @@ public class Storage { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/StorageLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/StorageLog.log"); + new File("data/LogFiles/StorageLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/StorageLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index b7c71d78b8..3887a6d7a1 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -27,6 +27,7 @@ public class Ui { * Program Logging */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + static { LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); @@ -34,8 +35,8 @@ public class Ui { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/UILog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/UILog.log"); + new File("data/LogFiles/UILog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/UILog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 20e8d91138..a91a2902af 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -31,8 +31,8 @@ public class LiveCurrencyApi { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LiveCurrencyAPI.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LiveCurrencyAPI.log"); + new File("data/LiveCurrencyAPILog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/LiveCurrencyAPILog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 52dfca0c7a..5855d3f19e 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -27,8 +27,8 @@ public class ParameterStringBuilder { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/ParameterStringBuilder.log").createNewFile(); - FileHandler fileHandler = new FileHandler("ParameterStringBuilder.log"); + new File("data/LogFiles/ParameterStringBuilderLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/ParameterStringBuilderLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index e1f2af8c55..e63f260bfd 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -1,5 +1,6 @@ package chching.parser; +import chching.ChChing; import chching.ChChingException; import chching.Ui; import chching.command.AddExpenseCommand; @@ -29,6 +30,8 @@ import chching.record.Income; import chching.record.Target; +import java.io.File; +import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -37,16 +40,38 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; public class Parser { - + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + static { + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); + logger.setLevel(Level.ALL); + try { + new File("data/LogFiles/ParserLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/ParserLog.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } + } + public static final String FIELD_DEMARCATION = " /"; - + /** * Method that parses command to the relevant classes to execute * - * @param line User input - * @param ui User interface + * @param line User input + * @param ui User interface * @return Appropriate command to be executed */ public static Command parse(String line, Ui ui) throws ChChingException { @@ -146,7 +171,7 @@ public static Command parse(String line, Ui ui) throws ChChingException { } return command; } - + /** * Split the String of user input into relevant partitions * @@ -158,18 +183,18 @@ public static ArrayList splitLine(String line) { lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); return lineParts; } - + /** * Sort the arguments * * @param arguments arguments * @return Hashmap of sorted arguments */ - + public static HashMap sortArguments(List arguments) throws ChChingException { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); - + // split each argument according to their field and their value, and add into // hashmap accordingly // Hashmap's key is its field, value is the value of the field @@ -188,7 +213,7 @@ public static HashMap sortArguments(List arguments) thro throw new ChChingException("Arguments not inputted correctly / Missing details"); } } - + // checks if it is an existing field boolean isDuplicateField = argumentsByField.containsKey(field); // check if field/value is empty or just spaces @@ -203,7 +228,7 @@ public static HashMap sortArguments(List arguments) thro } return argumentsByField; } - + public static String getType(HashMap argumentsByField) throws ChChingException { String type = null; try { @@ -223,7 +248,7 @@ public static String getCategory(HashMap argumentsByField) throw } return category; } - + public static String getDescription(HashMap argumentsByField) throws ChChingException { String description = null; try { @@ -233,7 +258,7 @@ public static String getDescription(HashMap argumentsByField) th } return description; } - + public static LocalDate getDate(HashMap argumentsByField) throws ChChingException { String dateString = null; dateString = argumentsByField.get("da"); @@ -253,6 +278,6 @@ public static LocalDate getDate(HashMap argumentsByField) throws } return date; } - - + + } diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index 1e4e13d586..d1908b99fa 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -1,19 +1,44 @@ package chching.parser; +import chching.ChChing; import chching.ChChingException; import chching.record.Target; +import java.io.File; +import java.io.IOException; import java.util.HashMap; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; /** * Models a class to parse target. */ public class TargetParser { + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); + + static { + LogManager.getLogManager().reset(); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setLevel(Level.SEVERE); + logger.addHandler(consoleHandler); + logger.setLevel(Level.ALL); + try { + new File("data/LogFiles/TargetParserLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/LogFiles/TargetParserLog.log"); + fileHandler.setLevel(Level.FINE); + logger.addHandler(fileHandler); + } catch (IOException e) { + logger.log(Level.SEVERE, "File logger not working.", e); + } + } /** * Parses a target into the TargetStorage * - * @param argumentsByField Input from users + * @param argumentsByField Input from users */ public static Target parseTarget(HashMap argumentsByField) throws ChChingException { Target targ = null; @@ -25,11 +50,11 @@ public static Target parseTarget(HashMap argumentsByField) throw } catch (Exception e) { throw new ChChingException("Trouble adding target value"); } - if(!DecimalsChecker.isTwoDecimals(targetValueString)) { + if (!DecimalsChecker.isTwoDecimals(targetValueString)) { throw new ChChingException("Target value must be a valid double that is 2 d.p. or less"); } else if (targ.getValue() > 9999999.99) { throw new ChChingException("target value must be less than 10 000 000"); - } else if(targ.getValue() < -9999999.99) { + } else if (targ.getValue() < -9999999.99) { throw new ChChingException("target value must be greater than -10 000 000"); } return targ; From 5f205cbc4bf8b9d1bc1839d374b983ace4c73fdf Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 20:29:17 +0800 Subject: [PATCH 318/364] fix checkstyle --- src/main/java/chching/ChChing.java | 1 - src/main/java/chching/ChChingException.java | 1 - src/main/java/chching/Storage.java | 1 - src/main/java/chching/Ui.java | 1 - src/main/java/chching/api/LiveCurrencyApi.java | 1 - src/main/java/chching/api/ParameterStringBuilder.java | 1 - 6 files changed, 6 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 1baa3179be..3df896f20a 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -14,7 +14,6 @@ import java.io.IOException; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 3ab88fbd3e..0daaba47b2 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index ceb0aa7e0b..507d1a10b7 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -17,7 +17,6 @@ import java.util.logging.Logger; import java.util.logging.FileHandler; import java.util.logging.LogManager; - import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 3887a6d7a1..e813699b60 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -14,7 +14,6 @@ import java.util.Scanner; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index a91a2902af..91da0cc34e 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -8,7 +8,6 @@ import java.net.URL; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 5855d3f19e..38c3155870 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -9,7 +9,6 @@ import java.util.Map; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; -import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; From a1d7644f43cfffea0171d1c9a7d9dca3e26e516e Mon Sep 17 00:00:00 2001 From: avielcx Date: Fri, 7 Apr 2023 20:38:37 +0800 Subject: [PATCH 319/364] Fix checkstyle --- src/main/java/chching/parser/Parser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index e63f260bfd..207dfa8f1f 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -47,6 +47,7 @@ import java.util.logging.Logger; public class Parser { + public static final String FIELD_DEMARCATION = " /"; private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { @@ -65,8 +66,6 @@ public class Parser { } } - public static final String FIELD_DEMARCATION = " /"; - /** * Method that parses command to the relevant classes to execute * From c98caf4276e97b4143b22fa96544228aec56fc52 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 11:36:22 +0800 Subject: [PATCH 320/364] Update PPP, Product Website, AboutUs Image --- docs/AboutUs.md | 10 +++++----- docs/README.md | 12 ++++++++++-- docs/team/avielcx.md | 4 ++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 9ddca2e39f..d736bde6cb 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,8 +2,8 @@ Display | Name | Github Profile | Portfolio --------|:----------------------:|:-------------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) -![](https://via.placeholder.com/100.png?text=photo) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/avielcx.md) -![](https://i.redd.it/lgjx3zalumy71.png) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/rayleigh47.md) -![](https://images.immediate.co.uk/production/volatile/sites/28/2019/02/4-things-parents-need-to-know-about-thomas-and-friends-tale-of-the-brave_60083-f74cd7b.jpg?quality=90&webp=true&resize=610,407) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomasjlalba.md) -![](https://i.kym-cdn.com/photos/images/original/001/889/810/5c7) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) +![](https://i0.wp.com/www.canterburysociety.org.uk/wp-content/uploads/2020/04/person-placeholder.jpg?w=500&ssl=1) | Nafis Azizi Riza | [Github](https://github.com/nafisazizir) | [Portfolio](team/nafisazizir.md) +![](https://i0.wp.com/www.canterburysociety.org.uk/wp-content/uploads/2020/04/person-placeholder.jpg?w=500&ssl=1) | Eng Chen Xi, Aviel | [Github](https://github.com/avielcx) | [Portfolio](team/avielcx.md) +![](https://i0.wp.com/www.canterburysociety.org.uk/wp-content/uploads/2020/04/person-placeholder.jpg?w=500&ssl=1) | Pang Yan Ming | [Github](https://github.com/Rayleigh47/) | [Portfolio](team/rayleigh47.md) +![](https://i0.wp.com/www.canterburysociety.org.uk/wp-content/uploads/2020/04/person-placeholder.jpg?w=500&ssl=1) | Thomas Joseph Lee Alba | [Github](https://github.com/thomasjlalba) | [Portfolio](team/thomasjlalba.md) +![](https://i0.wp.com/www.canterburysociety.org.uk/wp-content/uploads/2020/04/person-placeholder.jpg?w=500&ssl=1) | Hung Hin Wang Clement | [Github](https://github.com/hyperbola-bear) | [Portfolio](team/clement.md) diff --git a/docs/README.md b/docs/README.md index bbcc99c1e7..639095019a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,16 @@ -# Duke +![](https://images.gamebanana.com/img/ico/sprays/oinkspray_2.png) +# ChChing -{Give product intro here} +ChChing is a Command Line Interface (CLI) desktop app for tracking spending and managing finances, with currency conversion capabilities. If you are someone who needs a simple interface to get a better hold of your finances, this app is for you! Useful links: * [User Guide](UserGuide.md) * [Developer Guide](DeveloperGuide.md) * [About Us](AboutUs.md) + +Creaters: +* avielcx +* hyperbola-bear +* nafisazizir +* rayleigh47 +* thomasjlalba \ No newline at end of file diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index e32cfcbe44..b5cc260531 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -14,6 +14,7 @@ Given below are my contributions to the project. #### Project management: * Managed release of v2.0 on GitHub +* Managed Product Website #### Enhancements Implemented: * Created a balance command to allow users to check their balance when total income deducts total expense and compare with their target. @@ -25,6 +26,8 @@ Given below are my contributions to the project. * Created a ClearTarget feature which allow users to clear the target they have set to the default value. * Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, `IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. +* Created logging for `ChChing`, `ChChingException`, `UI`,`Parser`, `TargetParser`, `LiveCurrencyAPI`, `ParameterStringBuilder`. +* Contributed to logging for `Storage`. #### Contributions to the UG: * Created `Table of Contents` @@ -46,6 +49,7 @@ Given below are my contributions to the project. #### Contributions to team-based tasks: * Method documentations +* Product Website * Assertions enabled * Ensured GitHub's Java CI checks pass * v1.0 wrap-up From 06f62158e90134903830bb0cfcb3635732b5d60c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 8 Apr 2023 12:48:23 +0800 Subject: [PATCH 321/364] Fix errors with documentation in User Guide Update thomasjlalba PPP --- docs/UserGuide.md | 13 +++++++------ docs/team/thomasjlalba.md | 6 ++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9a196fcf28..3f51f71901 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -83,7 +83,7 @@ Use case: - VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be DD-MM-YYYY. -- DATE needs to be a valid date, and it cannot be a date in the future. +- DATE needs to be an existing date, and it cannot be a date in the future. Example of usage:
      `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` @@ -104,9 +104,9 @@ Format: Edit an existing expense/income that is currently in the list. Format: -
      `edit expense /in INDEX [c/ CATEGORY] [de/ DESCRIPTION] [da/ DATE] [v/ VALUE]` -
      `edit income /in INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]` -
      where [] indicates optional fields. +
      `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      where [ ] indicates optional fields. Use case: @@ -163,11 +163,12 @@ Find an existing expense/income that is currently in the list. Format:
      `find /t TYPE [/c CATEGORY] [/de DESCRIPTION] [/da DATE]` -
      fields with [] are optional fields, but at least 1 must be not empty for search to work +
      where [ ] indicates optional fields. Use case: - Shows user the entry that they are looking for. +- At least one of the optional fields must be provided. Example of usage:
      `find /t expense /c food /de beef ` @@ -302,7 +303,7 @@ The data file is not to be edited manually. | Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | | Edit Income | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | | Exit | `exit` | -| Find | `find /c CATEGORY /k KEYWORD`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | +| Find | `find /t TYPE [/c CATEGORY] [/k KEYWORD]`
      e.g. `find /t expense /c food /de beef`
      e.g. `find /t income /de salary /da 03-03-2023` | | Help | `help` | | List All Lists | `list` | | List Expense List | `list expense` | diff --git a/docs/team/thomasjlalba.md b/docs/team/thomasjlalba.md index 5da84ec6db..7eca17a7cd 100644 --- a/docs/team/thomasjlalba.md +++ b/docs/team/thomasjlalba.md @@ -31,8 +31,10 @@ Given below are my contributions to the project. * Contributed to the `Command Summary` section. #### Contributions to the DG: -* Added implementation details for the edit income command. -* Added implementation details for the edit expense command. +* Added implementation details for the edit income command/edit expense command. +* Added sequence diagram for the `EditIncomeCommand`. +* Added sequence diagram for the `EditExpenseCommand`. +* Added activity diagram for `EditIncomeCommand`. * Added Non-Functional Requirements section. #### Contributions to team-based tasks: From d7e06f7fa64ebd7dd26336526f840ddabf6857c8 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 12:54:59 +0800 Subject: [PATCH 322/364] Update logging --- docs/UserGuide.md | 2 ++ src/main/java/chching/ChChing.java | 8 ++++++++ src/main/java/chching/ChChingException.java | 8 ++++++++ src/main/java/chching/Storage.java | 10 ++++++++++ src/main/java/chching/Ui.java | 8 ++++++++ src/main/java/chching/api/LiveCurrencyApi.java | 8 ++++++++ src/main/java/chching/api/ParameterStringBuilder.java | 8 ++++++++ src/main/java/chching/parser/Parser.java | 8 ++++++++ src/main/java/chching/parser/TargetParser.java | 8 ++++++++ 9 files changed, 68 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9a196fcf28..3a8c30346c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -44,6 +44,7 @@ java -jar tp.jar 6. If successful, the following greetings should appear:
      For first time users: ``` +Log Folder Created Unfortunately, income list file can't be found. I'll make a new one! Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ @@ -54,6 +55,7 @@ Unfortunately, expense list can't be found. I'll make a new one!
      For current users: ``` +Log Folder Ready ____________________________________________________________ Hello! I'm ChChing. What can I do for you? diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 3df896f20a..0d6cb616a5 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -32,6 +32,14 @@ public class ChChing { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } new File("data/LogFiles/MainChChingLog.log").createNewFile(); FileHandler fileHandler = new FileHandler("data/LogFiles/MainChChingLog.log"); fileHandler.setLevel(Level.FINE); diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 0daaba47b2..3ae9a691b5 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -18,6 +18,14 @@ public class ChChingException extends Exception { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 507d1a10b7..1c6f0fbed6 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -39,6 +39,16 @@ public class Storage { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Log Folder Created"); + } else { + System.out.println("Log Folder Ready"); + } + } new File("data/LogFiles/StorageLog.log").createNewFile(); FileHandler fileHandler = new FileHandler("data/LogFiles/StorageLog.log"); fileHandler.setLevel(Level.FINE); diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index e813699b60..57037f3f4a 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -34,6 +34,14 @@ public class Ui { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } new File("data/LogFiles/UILog.log").createNewFile(); FileHandler fileHandler = new FileHandler("data/LogFiles/UILog.log"); fileHandler.setLevel(Level.FINE); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 91da0cc34e..ba56609cf0 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -24,6 +24,14 @@ public class LiveCurrencyApi { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 38c3155870..7cdaf874e0 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -20,6 +20,14 @@ public class ParameterStringBuilder { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 207dfa8f1f..e0cfa30cfc 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -51,6 +51,14 @@ public class Parser { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index d1908b99fa..0f56ca6dee 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -20,6 +20,14 @@ public class TargetParser { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { + String folderPath = "/data"; + String folderName = "LogFiles"; + File folder = new File(folderPath, folderName); + if (!folder.exists()) { + if (folder.mkdir()) { + System.out.println("Folder created successfully."); + } + } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); From 76291ecfedd01bb0cc93bdc59ff46541cb7aef76 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 13:11:34 +0800 Subject: [PATCH 323/364] Update Logging --- src/main/java/chching/ChChing.java | 8 -------- src/main/java/chching/ChChingException.java | 8 -------- src/main/java/chching/Storage.java | 1 + src/main/java/chching/Ui.java | 8 -------- src/main/java/chching/api/LiveCurrencyApi.java | 8 -------- src/main/java/chching/api/ParameterStringBuilder.java | 8 -------- src/main/java/chching/parser/Parser.java | 8 -------- src/main/java/chching/parser/TargetParser.java | 8 -------- 8 files changed, 1 insertion(+), 56 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 0d6cb616a5..3df896f20a 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -32,14 +32,6 @@ public class ChChing { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } new File("data/LogFiles/MainChChingLog.log").createNewFile(); FileHandler fileHandler = new FileHandler("data/LogFiles/MainChChingLog.log"); fileHandler.setLevel(Level.FINE); diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 3ae9a691b5..0daaba47b2 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -18,14 +18,6 @@ public class ChChingException extends Exception { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 1c6f0fbed6..077a4899af 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -17,6 +17,7 @@ import java.util.logging.Logger; import java.util.logging.FileHandler; import java.util.logging.LogManager; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 57037f3f4a..e813699b60 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -34,14 +34,6 @@ public class Ui { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } new File("data/LogFiles/UILog.log").createNewFile(); FileHandler fileHandler = new FileHandler("data/LogFiles/UILog.log"); fileHandler.setLevel(Level.FINE); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index ba56609cf0..91da0cc34e 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -24,14 +24,6 @@ public class LiveCurrencyApi { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 7cdaf874e0..38c3155870 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -20,14 +20,6 @@ public class ParameterStringBuilder { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index e0cfa30cfc..207dfa8f1f 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -51,14 +51,6 @@ public class Parser { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index 0f56ca6dee..d1908b99fa 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -20,14 +20,6 @@ public class TargetParser { private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Folder created successfully."); - } - } LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); consoleHandler.setLevel(Level.SEVERE); From d37c124130c8f760829c46a69faea1a70fa99a9f Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 13:16:59 +0800 Subject: [PATCH 324/364] Update Logging --- src/main/java/chching/ChChing.java | 4 ++-- src/main/java/chching/ChChingException.java | 4 ++-- src/main/java/chching/Storage.java | 14 ++------------ src/main/java/chching/Ui.java | 4 ++-- src/main/java/chching/api/LiveCurrencyApi.java | 2 +- .../java/chching/api/ParameterStringBuilder.java | 4 ++-- src/main/java/chching/parser/Parser.java | 4 ++-- src/main/java/chching/parser/TargetParser.java | 4 ++-- 8 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 3df896f20a..a8d3447d14 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -32,8 +32,8 @@ public class ChChing { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/MainChChingLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/MainChChingLog.log"); + new File("data/MainChChingLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/MainChChingLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 0daaba47b2..093c2c9439 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -24,8 +24,8 @@ public class ChChingException extends Exception { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/ExceptionLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/ExceptionLog.log"); + new File("data/ExceptionLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/ExceptionLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 077a4899af..a20ea2f7c5 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -40,18 +40,8 @@ public class Storage { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - String folderPath = "/data"; - String folderName = "LogFiles"; - File folder = new File(folderPath, folderName); - if (!folder.exists()) { - if (folder.mkdir()) { - System.out.println("Log Folder Created"); - } else { - System.out.println("Log Folder Ready"); - } - } - new File("data/LogFiles/StorageLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/StorageLog.log"); + new File("data/StorageLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/StorageLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index e813699b60..b2fd1a1ecd 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -34,8 +34,8 @@ public class Ui { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/UILog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/UILog.log"); + new File("data/UILog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/UILog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 91da0cc34e..2146e7adda 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -31,7 +31,7 @@ public class LiveCurrencyApi { logger.setLevel(Level.ALL); try { new File("data/LiveCurrencyAPILog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/LiveCurrencyAPILog.log"); + FileHandler fileHandler = new FileHandler("data/LiveCurrencyAPILog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 38c3155870..68de47f703 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -26,8 +26,8 @@ public class ParameterStringBuilder { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/ParameterStringBuilderLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/ParameterStringBuilderLog.log"); + new File("data/ParameterStringBuilderLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/ParameterStringBuilderLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 207dfa8f1f..74078d9f85 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -57,8 +57,8 @@ public class Parser { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/ParserLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/ParserLog.log"); + new File("data/ParserLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/ParserLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index d1908b99fa..4845c902ed 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -26,8 +26,8 @@ public class TargetParser { logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { - new File("data/LogFiles/TargetParserLog.log").createNewFile(); - FileHandler fileHandler = new FileHandler("data/LogFiles/TargetParserLog.log"); + new File("data/TargetParserLog.log").createNewFile(); + FileHandler fileHandler = new FileHandler("data/TargetParserLog.log"); fileHandler.setLevel(Level.FINE); logger.addHandler(fileHandler); } catch (IOException e) { From 04fe5176a16053232c19fa0d72335f71ffdfd026 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 8 Apr 2023 13:38:53 +0800 Subject: [PATCH 325/364] makes the UG and DG clearer regarding extra field inputs --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index ebd9ad01ac..5d77b8c94f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -247,7 +247,7 @@ in a simple and convenient manner through a command line interface. - Others: - Should user input additional arguments that are not within the scope of the command's input, ChChing would ignore them. -
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50` +
      e.g. category field would be ignored for command: `add income /c income /de salary /da 12-12-2022 /v 3.50`, and `exit /de hello` would still successfully exit ChChing. - Should the arguments be in the wrong order, ChChing would still be able to parse the arguments correctly.
      However, should the command not be written first, ChChing would not be able to parse the command.
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry.
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since `add command` is not written first. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0e187a5203..edea03e612 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -277,7 +277,7 @@ The data file is not to be edited manually. ### Other Notes * Should additional fields that is not required be added to the input, the program will ignore it. -
      e.g. field "a" with value "1" will be ignored for `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50 /a 1`. +
      e.g. field "a" with value "1" will be ignored for `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50 /a 1`, and `exit /de 1` will still successfully exit the program. * ChChing will not allow duplicate fields within the same input.
      e.g. `add expense /c meal /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` will not be allowed since it has duplicate category fields. * ChChing allows for the fields' order to be changed. From c4139d1e855a5399b95f28765aa4850488def8dd Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 16:52:56 +0800 Subject: [PATCH 326/364] Fix TOC --- docs/UserGuide.md | 49 ++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0e187a5203..74a40ecfac 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,25 +4,25 @@ * [Introduction](#introduction) * [Quick Start](#quick-start) * [Features](#features) - * [Adding an entry: `add`](#adding-an-entry-add) - * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes-list) - * [Updating an entry: `edit`](#updating-an-entry-edit) - * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted-set-currency) - * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted-unset-currency) - * [Finding an entry: `find`](#finding-an-entry-find) - * [Deleting an entry: `delete`](#deleting-an-entry-delete) - * [Clear entire income list: `clear income`](#clear-entire-income-list-clear-income) - * [Clear entire expense list: `clear income`](#clear-entire-expense-list-clear-income) - * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists-clear-all) - * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances-set-target) - * [See target set: `show target`](#see-target-set-show-target) - * [Clear Target Set: `clear target`](#clear-target-set-clear-target) - * [Finding balance of finances: `balance`](#finding-balance-of-finances-balance) - * [View help: `help`](#view-help-help) - * [Exit: `exit`](#exit-exit) + * [Adding an entry: `add`](#adding-an-entry--add) + * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) + * [Updating an entry: `edit`](#updating-an-entry--edit) + * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) + * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) + * [Finding an entry: `find`](#finding-an-entry--find) + * [Deleting an entry: `delete`](#deleting-an-entry--delete) + * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) + * [Clear entire expense list: `clear expense`](#clear-entire-expense-list--clear-expense) + * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) + * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) + * [See target set: `show target`](#see-target-set--show-target) + * [Clear Target Set: `clear target`](#clear-target-set--clear-target) + * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) + * [View help: `help`](#view-help--help) + * [Exit: `exit`](#exit--exit) * [Saving and loading of data](#saving-and-loading-of-data) * [Other Notes](#other-notes) - * [Command Summary (Alphabetical Order)](#command-summary-alphabetical-order) + * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) ## Introduction @@ -44,7 +44,6 @@ java -jar tp.jar 6. If successful, the following greetings should appear:
      For first time users: ``` -Log Folder Created Unfortunately, income list file can't be found. I'll make a new one! Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ @@ -55,7 +54,6 @@ Unfortunately, expense list can't be found. I'll make a new one!
      For current users: ``` -Log Folder Ready ____________________________________________________________ Hello! I'm ChChing. What can I do for you? @@ -85,7 +83,7 @@ Use case: - VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be DD-MM-YYYY. -- DATE needs to be an existing date, and it cannot be a date in the future. +- DATE needs to be a valid date, and it cannot be a date in the future. Example of usage:
      `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` @@ -106,9 +104,9 @@ Format: Edit an existing expense/income that is currently in the list. Format: -
      `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` -
      `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` -
      where [ ] indicates optional fields. +
      `edit expense /in INDEX [c/ CATEGORY] [de/ DESCRIPTION] [da/ DATE] [v/ VALUE]` +
      `edit income /in INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]` +
      where [] indicates optional fields. Use case: @@ -165,12 +163,11 @@ Find an existing expense/income that is currently in the list. Format:
      `find /t TYPE [/c CATEGORY] [/de DESCRIPTION] [/da DATE]` -
      where [ ] indicates optional fields. +
      fields with [] are optional fields, but at least 1 must be not empty for search to work Use case: - Shows user the entry that they are looking for. -- At least one of the optional fields must be provided. Example of usage:
      `find /t expense /c food /de beef ` @@ -305,7 +302,7 @@ The data file is not to be edited manually. | Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | | Edit Income | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | | Exit | `exit` | -| Find | `find /t TYPE [/c CATEGORY] [/k KEYWORD]`
      e.g. `find /t expense /c food /de beef`
      e.g. `find /t income /de salary /da 03-03-2023` | +| Find | `find /c CATEGORY /k KEYWORD`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | | Help | `help` | | List All Lists | `list` | | List Expense List | `list expense` | From cc6ed3282d9049c1d67306697d916c6dbe2609af Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 17:23:33 +0800 Subject: [PATCH 327/364] Update TOC --- docs/UserGuide.md | 31 +++++------------------- docs/_config.yml | 2 +- src/main/java/chching/ChChing.java | 1 + src/main/java/chching/Ui.java | 25 +++++++++++++++++++ src/main/java/chching/parser/Parser.java | 3 +++ 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 74a40ecfac..dfa1d1344d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,29 +1,10 @@ # User Guide - -* [User Guide](#user-guide) - * [Introduction](#introduction) - * [Quick Start](#quick-start) - * [Features](#features) - * [Adding an entry: `add`](#adding-an-entry--add) - * [Listing all expenses and incomes: `list`](#listing-all-expenses-and-incomes--list) - * [Updating an entry: `edit`](#updating-an-entry--edit) - * [Setting currency to be converted: `set currency`](#setting-currency-to-be-converted--set-currency) - * [Unset currency to be converted: `unset currency`](#unset-currency-to-be-converted--unset-currency) - * [Finding an entry: `find`](#finding-an-entry--find) - * [Deleting an entry: `delete`](#deleting-an-entry--delete) - * [Clear entire income list: `clear income`](#clear-entire-income-list--clear-income) - * [Clear entire expense list: `clear expense`](#clear-entire-expense-list--clear-expense) - * [Clear entire both income and expense lists: `clear all`](#clear-entire-both-income-and-expense-lists--clear-all) - * [Set a target for balance of finances: `set target`](#set-a-target-for-balance-of-finances--set-target) - * [See target set: `show target`](#see-target-set--show-target) - * [Clear Target Set: `clear target`](#clear-target-set--clear-target) - * [Finding balance of finances: `balance`](#finding-balance-of-finances--balance) - * [View help: `help`](#view-help--help) - * [Exit: `exit`](#exit--exit) - * [Saving and loading of data](#saving-and-loading-of-data) - * [Other Notes](#other-notes) - * [Command Summary (Alphabetical Order)](#command-summary--alphabetical-order-) - + +* Table of Contents +{:toc} + + + ## Introduction diff --git a/docs/_config.yml b/docs/_config.yml index 0d7519b102..b46bcf2c01 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ #Build Settings theme: minima -markdown: GFM +markdown: kramdown diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index a8d3447d14..e363dee662 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -92,6 +92,7 @@ public void run() { ui.showLine(); } } + logger.info("Program running right"); } public static void main(String[] args) { diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index b2fd1a1ecd..a6a40143bd 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -57,6 +57,7 @@ public void showWelcome() { System.out.println(" Hello! I'm ChChing."); System.out.println(" What can I do for you?"); showLine(); + logger.info("showWelcome UI works"); } public void showGoodbye() { @@ -70,6 +71,7 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { assert (incomes.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); + logger.info("showAdded UI works"); } public void showEdited(int index, Record record, boolean isExpense) { @@ -79,6 +81,7 @@ public void showEdited(int index, Record record, boolean isExpense) { System.out.println(" Got it. I've updated the income in index " + index + " to"); } System.out.println(" " + record); + logger.info("showEdited UI works"); } public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) { @@ -88,23 +91,28 @@ public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) assert (expenses.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); + logger.info("showDelete UI works"); } public void showAllRecords(IncomeList incomes, ExpenseList expenses, Selector selector, Converter converter) { if (incomes.size() == 0 && expenses.size() == 0) { System.out.println(" Both lists are empty. Start adding!"); + logger.info("showAllRecords UI works"); } else if (incomes.size() == 0) { System.out.println(" Income list is empty. Start adding!"); System.out.println(); showExpenseList(expenses, selector, converter); + logger.info("showAllRecords UI works"); } else if (expenses.size() == 0) { showIncomeList(incomes, selector, converter); System.out.println(); System.out.println(" Expense list is empty. Start adding!"); + logger.info("showAllRecords UI works"); } else { showIncomeList(incomes, selector, converter); System.out.println(); showExpenseList(expenses, selector, converter); + logger.info("showAllRecords UI works"); } } @@ -115,6 +123,7 @@ public void showBalance(double totalExpense, double totalIncome, double balance, System.out.println(); System.out.println(" Current balance:"); System.out.println(" SGD " + String.format("%.02f", balance) + convertedBalance); + logger.info("showBalance UI works"); } public void showMatchedRecord(RecordList records) { @@ -128,6 +137,8 @@ public void showMatchedRecord(RecordList records) { System.out.println(" No matching records for those keyword"); } + logger.info("showMatchedRecord UI works"); + } public void showMatchedIncome(IncomeList incomes) { @@ -141,6 +152,8 @@ public void showMatchedIncome(IncomeList incomes) { System.out.println(" No matching records for those keyword"); } + logger.info("showMatchedIncome UI works"); + } public void showMatchedExpense(ExpenseList expenses) { @@ -154,6 +167,8 @@ public void showMatchedExpense(ExpenseList expenses) { System.out.println(" No matching records for those search terms"); } + logger.info("showMatchedExpense UI works"); + } public static void showHelp() { @@ -201,27 +216,33 @@ public static void showHelp() { System.out.println(); System.out.println(" EXIT THE PROGRAM:"); System.out.println(" exit"); + logger.info("showHelp UI works"); } public void showError(String message) { System.out.println(" " + message); + logger.info("showError UI works"); } public void showInvalidMessage() { System.out.println(" Command is invalid, use help for valid commands"); + logger.info("showInvalidMessage UI works"); } public void showTargetAdded() { System.out.println(" Target added"); + logger.info("showTargetAdded UI works"); } public void clearTarget() { System.out.println(" Target cleared"); + logger.info("clearTarget UI works"); } public void showListCleared() { System.out.println(" List(s) cleared"); + logger.info("showListCleared UI works"); } public void showExpenseList(ExpenseList expenses, Selector selector, Converter converter) { @@ -231,6 +252,7 @@ public void showExpenseList(ExpenseList expenses, Selector selector, Converter c System.out.println(" Here are the expenses in your list:"); expenses.printExpenseList(selector, converter); } + logger.info("showExpenseList UI works"); } public void showIncomeList(IncomeList income, Selector selector, Converter converter) { @@ -240,9 +262,12 @@ public void showIncomeList(IncomeList income, Selector selector, Converter conve System.out.println(" Here are the incomes in your list:"); income.printIncomeList(selector, converter); } + logger.info("showIncomeList UI works"); } + public void showEmptyListMessage() { System.out.println(" The list is empty. Start adding!"); + logger.info("showEmptyListMessage UI works"); } } diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 74078d9f85..d7d7f5754e 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -168,7 +168,9 @@ public static Command parse(String line, Ui ui) throws ChChingException { } catch (ChChingException e) { ui.showError(e.getMessage()); } + logger.info("Parser works"); return command; + } /** @@ -225,6 +227,7 @@ public static HashMap sortArguments(List arguments) thro argumentsByField.put(field, value); } } + return argumentsByField; } From af9bd495e31163d280eef21e66d2c9e684632a48 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sat, 8 Apr 2023 17:27:31 +0800 Subject: [PATCH 328/364] Update DG TOC --- docs/DeveloperGuide.md | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index ebd9ad01ac..c0580a6d16 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,30 +1,7 @@ # Developer Guide - - -- [Developer Guide](#developer-guide) - - [Acknowledgements](#acknowledgements) - - [Design & implementation](#design-implementation) - - [Design](#design) - - [Implementation](#implementation) - - [Record and RecordList](#record-and-recordlist) - - [DeleteIncomeCommand](#deleteincomecommand) - - [Target and TargetStorage](#target-and-targetstorage) - - [EditIncomeCommand/EditExpenseCommand](#editincomecommandeditexpensecommand) - - [AddIncomeCommand](#addincomecommand) - - [ListExpenseCommand](#listexpensecommand) - - [SetTargetCommand](#settargetcommand) - - [SetCurrencyCommand](#setcurrencycommand) - - [UnsetCurrencyCommand](#unsetcurrencycommand) - - [FindCommand](#findcommand) - - [Product scope](#product-scope) - - [Target user profile](#target-user-profile) - - [Value proposition](#value-proposition) - - [User Stories](#user-stories) - - [Non-Functional Requirements](#non-functional-requirements) - - [Glossary](#glossary) - - [Instructions for manual testing](#instructions-for-manual-testing) - +* Table of Contents + {:toc} ## Acknowledgements From a245914e64f8de0941e199ebe46f54c409393c5d Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 13:44:50 +0800 Subject: [PATCH 329/364] Fix erratas in thomasjlalba PPP and Developer Guide --- docs/DeveloperGuide.md | 15 +++++++-------- docs/team/thomasjlalba.md | 7 ++++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index fdf8ce0795..a4dac85661 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,7 @@ We first give acknowledgement to Module Coordinator, Dr Akshay Narayan, and Teaching Assistant, Aditi Chadha for guidance and supervision over the ChChing project.
      We utilized the [tp project](https://github.com/nus-cs2113-AY2223S2/tp) of the nus-cs2113-AY2223S2 organisation as our template for ChChing. -
      The [addressbook-level2](https://github.com/se-edu/addressbook-level2) & [addressbook-level3](https://github.com/se-edu/addressbook-level3) project largely inspired the format and coding style of ChChing. +
      The [addressbook-level2](https://github.com/se-edu/addressbook-level2) & [addressbook-level3](https://github.com/se-edu/addressbook-level3) project by SE-EDU largely inspired the format and coding style of ChChing. ### ExchangeRateApi @@ -140,7 +140,7 @@ The `Parser` object then returns to `ChChing`. `ChChing` object then runs the `e ### LiveCurrencyApi `LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. -![LiveCurrencyApi_sequence_diagram.png](images%2FLiveCurrencyApi_sequence_diagram.png) +![LiveCurrencyApi_sequence_diagram.png](images/LiveCurrencyApi_Sequence_Diagram.png) ### SetCurrencyCommand @@ -153,13 +153,13 @@ If the method returns true, the command will continue to set the currency in the Afterwards, the `execute()` method will call the `printSelector()` method from `Selector`. The `printSelector()` method will print all the available currencies in the selector hashmap. The selected currencies will be marked with a `[X]` and the unselected currencies will be marked with a `[ ]`. -![SetCurrencyCommand_sequence_diagram.png](images%2FSetCurrencyCommand_sequence_diagram.png) +![SetCurrencyCommand_sequence_diagram.png](images/SetCurrencyCommand_sequence_diagram.png) ### UnsetCurrencyCommand The unsetCurrencyCommand works in a similar way to the setCurrencyCommand. The diagram below shows the sequence diagram for the unsetCurrencyCommand. -![SetCurrencyCommand_sequence_diagram.png](images%2FUnsetCurrencyCommand_sequence_diagram.png) +![SetCurrencyCommand_sequence_diagram.png](images/UnsetCurrencyCommand_Sequence_Diagram.png) ### Find @@ -169,7 +169,7 @@ The user can choose to search through incomes on description or date. The user c The `execute()` method in `FindCommand` will check if the user is searching for income or expense, and ensure that at least one of the search fields are not empty. By using a loop, the `execute()` method will then search through the `ExpenseList` or `IncomeList` and selected the expenses/incomes that matches the search fields. The `execute()` method will then print out the selected expenses/incomes that matches the search fields using `showMatchedExpense()` or `showMatchedIncome()` method from `UI` to `System` -![FindCommand_sequence_diagram.png](images%2FFindCommand_sequence_diagram.png) +![FindCommand_sequence_diagram.png](images/FindCommand_Sequence_Diagram.png) ## Product scope @@ -242,8 +242,6 @@ in a simple and convenient manner through a command line interface. ## Instructions for manual testing -{Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} - Given below are instructions to test the app manually. ### Launch and Shutdown @@ -264,7 +262,8 @@ Given below are instructions to test the app manually. 2. Test case:
      For income: `add income /da 12-12-2022 /v 3.50`
      For expense: `add expense /de food /v 3.50` -
      Expected: No income is added. Error details shown in the status message. 3. Other incorrect add income commands to try: +
      Expected: No income is added. Error details shown in the status message. + 3. Other incorrect add income commands to try:
      no fields/missing fields - `add income` `add expense`.
      incorrect date format/invalid date/future date - `add income /de ang pao /da 30-02-2022 /v 10` `add expense /c transport /de bus fare /da 31-04-2029 /v 5.30`.
      negative value/zero value/1000000000 and above value/non-float value/non 2 d.p. values - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`. diff --git a/docs/team/thomasjlalba.md b/docs/team/thomasjlalba.md index 7eca17a7cd..7747e6fe12 100644 --- a/docs/team/thomasjlalba.md +++ b/docs/team/thomasjlalba.md @@ -13,7 +13,7 @@ Given below are my contributions to the project. #### Project management: * Managed release of v1.0 on GitHub. -* Maintaining the issue tracker with the necessary tags and labels. +* Maintained the issue tracker with the necessary tags and labels. #### Enhancements Implemented: * Created parser to parse user input into commands and arguments. @@ -38,8 +38,9 @@ Given below are my contributions to the project. * Added Non-Functional Requirements section. #### Contributions to team-based tasks: -* Ensuring GitHub's Java CI checks are passing. -* Ensure JUnit test code is well written and has consistent format. +* Ensured GitHub's Java CI checks are passing. +* Ensured JUnit test code is well written and has consistent format. +* Reviewed other teammates PRs before merging into the team's master branch. #### Review/monitoring contributions * PRs reviewed for the following team: [CS2113-F10-1](https://github.com/AY2223S2-CS2113-F10-1/tp/pull/55), [CS2113-T14-3](https://github.com/nus-cs2113-AY2223S2/tp/pull/31/files/12c169b4ab991a2d549761120feb1c63c7c3ae72#diff-1a95edf069a4136e9cb71bee758b0dc86996f6051f0d438ec2c424557de7160b). From 56928fff99df661d7602fde356a87c4d858b0228 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 14:36:42 +0800 Subject: [PATCH 330/364] Update PPP --- docs/team/avielcx.md | 55 ++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index b5cc260531..47bc6c96bf 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -13,8 +13,8 @@ Given below are my contributions to the project. [RepoSense Link](https://nus-cs2113-ay2223s2.github.io/tp-dashboard/?search=avielcx&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=avielcx&tabRepo=AY2223S2-CS2113-T12-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) #### Project management: -* Managed release of v2.0 on GitHub -* Managed Product Website +* Managed release of v2.0 on GitHub. +* Managed Product Website. #### Enhancements Implemented: * Created a balance command to allow users to check their balance when total income deducts total expense and compare with their target. @@ -23,40 +23,41 @@ Given below are my contributions to the project. * Created a clear all feature which allow users to clear both income and expense lists. * Created an AddTarget feature which allow users to set their target. * Created a ShowTarget feature which allow users to see the target they have set. -* Created a ClearTarget feature which allow users to clear the target they have set to the default value. -* Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteExpenseCommand`, `DeleteIncomeCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, +* Created a ClearTarget feature which allow users to clear the target they have set to the default value +* Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, `ClearTargetCommand`, `IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. * Created logging for `ChChing`, `ChChingException`, `UI`,`Parser`, `TargetParser`, `LiveCurrencyAPI`, `ParameterStringBuilder`. * Contributed to logging for `Storage`. #### Contributions to the UG: -* Created `Table of Contents` -* Contributed to `Quick Start` portion -* Created documentation for the feature `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` -* Created `Command Summary` +* Created `Table of Contents`. +* Created `Quick Start` portion. +* Created the `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` in the Feature portion of the UG. +* Created `Command Summary` in the Feature portion of the UG. #### Contributions to the DG: -* Added `Table of Contents` -* Added `Record` and `RecordList` UML class diagrams -* Added `DeleteIncomeCommand` sequence diagram -* Added `Target` and `TargetStorage` UML class diagrams -* Added `SetTargetCommand` sequence diagram -* Added documentation for `Target user profile` -* Added documentation for `Value Proposition` -* Added documentation for `v2.0` of `User Stories` -* Added documentation for `Glossary` -* Added Non-Functional Requirements section +* Added `Table of Contents`. +* Added `Record` and `RecordList` UML class diagrams. +* Added `DeleteIncomeCommand` sequence diagram. +* Added `Target` and `TargetStorage` UML class diagrams. +* Added `SetTargetCommand` sequence diagram. +* Added documentation for `Target user profile`. +* Added documentation for `Value Proposition`. +* Added documentation for `v2.0` of `User Stories`. +* Added documentation for `Glossary`. +* Added Non-Functional Requirements section. #### Contributions to team-based tasks: -* Method documentations -* Product Website -* Assertions enabled -* Ensured GitHub's Java CI checks pass -* v1.0 wrap-up -* v2.0 wrap-up -* v2.0 release -* v2.1 set-up -* v2.1 wrap-up +* Method documentations for most methods. +* Developed Product Website. +* Assertions enabled. +* Ensured GitHub's Java CI checks pass. +* Reviewed other teammates' PRs before merging into the team's master branch. +* v1.0 wrap-up. +* v2.0 wrap-up. +* v2.0 release. +* v2.1 set-up. +* v2.1 wrap-up. #### Review/monitoring contributions * PRs reviewed for the following team: [CS2113-W13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/53) From 556b6f1c1294f1f31b3189d739c7949f85b69c5e Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 14:44:39 +0800 Subject: [PATCH 331/364] Update PPP --- docs/team/avielcx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 47bc6c96bf..606da96dce 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -31,7 +31,7 @@ Given below are my contributions to the project. #### Contributions to the UG: * Created `Table of Contents`. -* Created `Quick Start` portion. +* Created `Quick Start` portion of the UG. * Created the `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` in the Feature portion of the UG. * Created `Command Summary` in the Feature portion of the UG. From eda4f346f20ae79cdf00d3423b9608e42370cb13 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 14:51:30 +0800 Subject: [PATCH 332/364] Update PPP --- docs/team/avielcx.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 606da96dce..58fe895fd5 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -31,20 +31,20 @@ Given below are my contributions to the project. #### Contributions to the UG: * Created `Table of Contents`. -* Created `Quick Start` portion of the UG. -* Created the `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` in the Feature portion of the UG. -* Created `Command Summary` in the Feature portion of the UG. +* Created `Quick Start` portion. +* Created `edit`, `find`, `clear income`, `clear expense`, `clear all`, `set target`, `show target`,`clear target`, `balance`, `exit` features in the Feature portion. +* Created `Command Summary` in the Feature portion. #### Contributions to the DG: -* Added `Table of Contents`. +* Created `Table of Contents`. +* Created documentation for `Target user profile`. +* Created documentation for `Value Proposition`. +* Created documentation for `v2.0` of `User Stories`. +* Created documentation for `Glossary`. * Added `Record` and `RecordList` UML class diagrams. * Added `DeleteIncomeCommand` sequence diagram. * Added `Target` and `TargetStorage` UML class diagrams. * Added `SetTargetCommand` sequence diagram. -* Added documentation for `Target user profile`. -* Added documentation for `Value Proposition`. -* Added documentation for `v2.0` of `User Stories`. -* Added documentation for `Glossary`. * Added Non-Functional Requirements section. #### Contributions to team-based tasks: From 27915e58d0e30f5335c302f34e86787aeafa4702 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 14:56:45 +0800 Subject: [PATCH 333/364] Update PPP --- docs/team/avielcx.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 58fe895fd5..4bb4af3b0d 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -37,10 +37,10 @@ Given below are my contributions to the project. #### Contributions to the DG: * Created `Table of Contents`. -* Created documentation for `Target user profile`. -* Created documentation for `Value Proposition`. -* Created documentation for `v2.0` of `User Stories`. -* Created documentation for `Glossary`. +* Created `Target user profile`. +* Created `Value Proposition`. +* Created `v2.0` of `User Stories`. +* Created `Glossary`. * Added `Record` and `RecordList` UML class diagrams. * Added `DeleteIncomeCommand` sequence diagram. * Added `Target` and `TargetStorage` UML class diagrams. From 8a84fd619cd283781f58ab3d1e47535f2a71e316 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 15:00:13 +0800 Subject: [PATCH 334/364] Update UG to inform users not to edit any txt files --- docs/UserGuide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3ab96b3ecd..680a0e3d07 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -41,7 +41,8 @@ Unfortunately, expense list can't be found. I'll make a new one! ____________________________________________________________ ``` -7. Type in desired command to start using the program! List of commands are listed below +7. Type in desired command to start using the program! List of commands are listed below. +8. Do not edit any program-created saved files (.txt files, etc.), else the program may crash. ## Features From ce9f87c5da846da5ff0999c6d2fbfbde0d4d64af Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 15:21:25 +0800 Subject: [PATCH 335/364] Fix errors made in User Guide --- docs/UserGuide.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3ab96b3ecd..55ec57efbe 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -64,7 +64,7 @@ Use case: - VALUE will not accept doubles with more than 2 decimal places. - VALUE will be recorded as SGD, regardless of the currency set. - Format for DATE will be DD-MM-YYYY. -- DATE needs to be a valid date, and it cannot be a date in the future. +- DATE needs to be an existing date, and it cannot be a date in the future. Example of usage:
      `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` @@ -85,9 +85,9 @@ Format: Edit an existing expense/income that is currently in the list. Format: -
      `edit expense /in INDEX [c/ CATEGORY] [de/ DESCRIPTION] [da/ DATE] [v/ VALUE]` -
      `edit income /in INDEX [de/DESCRIPTION] [da/DATE] [v/VALUE]` -
      where [] indicates optional fields. +
      `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]` +
      where [ ] indicates optional fields. Use case: @@ -144,11 +144,13 @@ Find an existing expense/income that is currently in the list. Format:
      `find /t TYPE [/c CATEGORY] [/de DESCRIPTION] [/da DATE]` -
      fields with [] are optional fields, but at least 1 must be not empty for search to work +
      fields with [ ] are optional fields. Use case: - Shows user the entry that they are looking for. +- At least one of the optional fields must be provided. +- `CATEGORY` field would only be read if `TYPE` specified is `expense`. Example of usage:
      `find /t expense /c food /de beef ` @@ -283,7 +285,7 @@ The data file is not to be edited manually. | Edit Expense | `edit expense /in INDEX [/c CATEGORY] [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit expense /in 1 /de Lunch @Technoedge /v 5.20` | | Edit Income | `edit income /in INDEX [/de DESCRIPTION] [/da DATE] [/v VALUE]`
      e.g. `edit income /in 2 /da 12-12-2022 /v 100` | | Exit | `exit` | -| Find | `find /c CATEGORY /k KEYWORD`
      e.g. `find /c expense /k beef`
      e.g. `find /c income /k salary` | +| Find | `find /t TYPE [/c CATEGORY] [/k KEYWORD]`
      e.g. `find /t expense /c food /de beef`
      e.g. `find /t income /de salary /da 03-03-2023` | | Help | `help` | | List All Lists | `list` | | List Expense List | `list expense` | From 38c38840efa0e4733413f4e41f4b98f6380f1330 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 16:10:46 +0800 Subject: [PATCH 336/364] Update UG --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 680a0e3d07..fa526f5fcf 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -14,12 +14,12 @@ ChChing is a Command Line Interface (CLI) desktop app for tracking spending and 1. Ensure that you have Java 11 or above installed. 2. Download the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). -3. Copy downloaded `tp.jar` file to the desired home folder of choice. +3. Copy downloaded `[CS2113-T12-1][ChChing].jar` file to the desired home folder of choice. 4. Open a command terminal and `cd` into the folder mentioned in step 3. 5. Type in the following to run the application: ``` -java -jar tp.jar +java -jar [CS2113-T12-1][ChChing].jar ``` 6. If successful, the following greetings should appear: From 1cd7fb6d628855470983356055dab365977a516d Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 16:12:04 +0800 Subject: [PATCH 337/364] Update DG --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a4dac85661..7f9c59e10b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -248,7 +248,7 @@ Given below are instructions to test the app manually. 1. Initial launch 1. Download the jar file and copy into an empty folder. - 2. Open a command prompt in the folder and run the command `java -jar tp.jar`. ChChing should start up. + 2. Open a command prompt in the folder and run the command `java -jar [CS2113-T12-1][ChChing].jar`. ChChing should start up. 2. Shutting down 1. Type `exit` into the command prompt and press enter. ChChing should shut down and update the save file accordingly. From 44e73d35ae1b7928cb068aa225710b08c2edc4d3 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Sun, 9 Apr 2023 16:14:07 +0800 Subject: [PATCH 338/364] Update UserGuide.md --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index fa526f5fcf..40655fee6c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -42,7 +42,7 @@ Unfortunately, expense list can't be found. I'll make a new one! ``` 7. Type in desired command to start using the program! List of commands are listed below. -8. Do not edit any program-created saved files (.txt files, etc.), else the program may crash. +8. Do not edit any program-created saved files (.json files, etc.), else the program may crash. ## Features From abcbe2eb7f792cfa626ff9ed044eb2a881af8eaf Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 9 Apr 2023 16:23:34 +0800 Subject: [PATCH 339/364] remove comments --- src/main/java/chching/parser/Expenses.java | 1 - src/main/java/chching/parser/Parser.java | 167 +++++++++--------- .../java/chching/parser/UnicodeChecker.java | 28 ++- 3 files changed, 92 insertions(+), 104 deletions(-) diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 8a82738002..cc392c4226 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -47,7 +47,6 @@ public static LocalDate parseDate(String expenseDateString) throws ChChingExcept * @param argumentsByField Input from users */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException { - // check if all the fields are present boolean isCategoryPresent = argumentsByField.containsKey(CATEGORY_FIELD); boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index d7d7f5754e..6dc92d812c 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -83,87 +83,87 @@ public static Command parse(String line, Ui ui) throws ChChingException { int index; try { switch (instructionLowerCase) { - case "add income": - Income income = Incomes.parseIncome(argumentsByField); - command = new AddIncomeCommand(income); - break; - case "add expense": - Expense expense = Expenses.parseExpense(argumentsByField); - command = new AddExpenseCommand(expense); - break; - case "list income": - command = new ListIncomeCommand(); - break; - case "list expense": - command = new ListExpenseCommand(); - break; - case "list": - command = new ListCommand(); - break; - case "edit income": - command = new EditIncomeCommand(argumentsByField); - break; - case "edit expense": - command = new EditExpenseCommand(argumentsByField); - break; - case "delete income": - index = Incomes.getIndex(argumentsByField); - command = new DeleteIncomeCommand(index); - break; - case "delete expense": - index = Expenses.getIndex(argumentsByField); - command = new DeleteExpenseCommand(index); - break; - case "set currency": - String currency = Currency.getCurrency(argumentsByField); - command = new SetCurrencyCommand(currency); - break; - case "unset currency": - currency = Currency.getCurrency(argumentsByField); - command = new UnsetCurrencyCommand(currency); - break; - case "find": - String type = getType(argumentsByField); - String category = getCategory(argumentsByField); - String keyword = getDescription(argumentsByField); - LocalDate date = getDate(argumentsByField); - command = new FindCommand(type, category, keyword, date); - break; - case "balance": - command = new BalanceCommand(); - break; - case "exit": - command = new ExitCommand(); - break; - case "help": - command = new HelpCommand(); - break; - case "clear income": - command = new ClearIncomeCommand(); - ui.showListCleared(); - break; - case "clear expense": - command = new ClearExpenseCommand(); - ui.showListCleared(); - break; - case "clear all": - command = new ClearAllCommand(); - ui.showListCleared(); - break; - case "set target": - Target target = TargetParser.parseTarget(argumentsByField); - command = new AddTargetCommand(target); - ui.showTargetAdded(); - break; - case "show target": - command = new ShowTargetCommand(); - break; - case "clear target": - command = new ClearTargetCommand(); - ui.clearTarget(); - break; - default: - command = new InvalidCommand(); + case "add income": + Income income = Incomes.parseIncome(argumentsByField); + command = new AddIncomeCommand(income); + break; + case "add expense": + Expense expense = Expenses.parseExpense(argumentsByField); + command = new AddExpenseCommand(expense); + break; + case "list income": + command = new ListIncomeCommand(); + break; + case "list expense": + command = new ListExpenseCommand(); + break; + case "list": + command = new ListCommand(); + break; + case "edit income": + command = new EditIncomeCommand(argumentsByField); + break; + case "edit expense": + command = new EditExpenseCommand(argumentsByField); + break; + case "delete income": + index = Incomes.getIndex(argumentsByField); + command = new DeleteIncomeCommand(index); + break; + case "delete expense": + index = Expenses.getIndex(argumentsByField); + command = new DeleteExpenseCommand(index); + break; + case "set currency": + String currency = Currency.getCurrency(argumentsByField); + command = new SetCurrencyCommand(currency); + break; + case "unset currency": + currency = Currency.getCurrency(argumentsByField); + command = new UnsetCurrencyCommand(currency); + break; + case "find": + String type = getType(argumentsByField); + String category = getCategory(argumentsByField); + String keyword = getDescription(argumentsByField); + LocalDate date = getDate(argumentsByField); + command = new FindCommand(type, category, keyword, date); + break; + case "balance": + command = new BalanceCommand(); + break; + case "exit": + command = new ExitCommand(); + break; + case "help": + command = new HelpCommand(); + break; + case "clear income": + command = new ClearIncomeCommand(); + ui.showListCleared(); + break; + case "clear expense": + command = new ClearExpenseCommand(); + ui.showListCleared(); + break; + case "clear all": + command = new ClearAllCommand(); + ui.showListCleared(); + break; + case "set target": + Target target = TargetParser.parseTarget(argumentsByField); + command = new AddTargetCommand(target); + ui.showTargetAdded(); + break; + case "show target": + command = new ShowTargetCommand(); + break; + case "clear target": + command = new ClearTargetCommand(); + ui.clearTarget(); + break; + default: + command = new InvalidCommand(); } } catch (ChChingException e) { ui.showError(e.getMessage()); @@ -195,10 +195,6 @@ public static ArrayList splitLine(String line) { public static HashMap sortArguments(List arguments) throws ChChingException { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); - - // split each argument according to their field and their value, and add into - // hashmap accordingly - // Hashmap's key is its field, value is the value of the field for (int i = 0; i < argumentsCount; i++) { String argument = arguments.get(i); String[] fieldAndValue = argument.split(" ", 2); @@ -281,5 +277,4 @@ public static LocalDate getDate(HashMap argumentsByField) throws return date; } - } diff --git a/src/main/java/chching/parser/UnicodeChecker.java b/src/main/java/chching/parser/UnicodeChecker.java index df9d512a09..7dd96bc59a 100644 --- a/src/main/java/chching/parser/UnicodeChecker.java +++ b/src/main/java/chching/parser/UnicodeChecker.java @@ -1,30 +1,24 @@ package chching.parser; -public class UnicodeChecker { - public static final String VALID_CHARACTERS = "[\\P{ASCII}]"; +/** + * Models a class to check if the input is valid. + * + */ +public class UnicodeChecker { + /** + * Method to check if the input is valid. + * + * @param input Input from users + */ public static boolean isValidStringInput(String input) { for (char c : input.toCharArray()) { - // System.out.println("testing " + c + ": "); - // System.out.print(Character.UnicodeBlock.of(c) == - // Character.UnicodeBlock.BASIC_LATIN); - // int i = c; - // System.out.println(" " + i); if (!(Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN)) { return false; } } - // System.out.println("testing 观: "); - // System.out.println(Character.UnicodeBlock.of('观') == - // Character.UnicodeBlock.BASIC_LATIN); - // System.out.println("testing ✄: "); - // System.out.println(Character.UnicodeBlock.of('✄') == - // Character.UnicodeBlock.BASIC_LATIN); return true; - // String validString = input.replaceAll(VALID_CHARACTERS, ""); - // System.out.println("validstring: " + validString); - // System.out.println("input: " + input); - // return validString.equals(input); + } } From b0d7f79493c5c84ee6e34f736c973d216a08c7ba Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 16:35:36 +0800 Subject: [PATCH 340/364] Clean up code to improve code quality --- src/main/java/chching/ChChing.java | 7 ++- src/main/java/chching/Storage.java | 57 +++++++++---------- src/main/java/chching/record/ExpenseList.java | 16 +++--- src/main/java/chching/record/IncomeList.java | 11 ++-- src/main/java/chching/record/Record.java | 1 - 5 files changed, 48 insertions(+), 44 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index e363dee662..f400f340be 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -18,7 +18,10 @@ import java.util.logging.LogManager; import java.util.logging.Logger; - +/** + * Main class of ChChing. + * Contains the main method, and the main logic of the program. + */ public class ChChing { /** * Program Logging @@ -82,7 +85,7 @@ public void run() { while (!isExit) { try { String fullCommand = ui.readCommand(); - ui.showLine(); // show the divider line ("_______") + ui.showLine(); Command c = Parser.parse(fullCommand, ui); c.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); isExit = c.isExit(); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index a20ea2f7c5..c1e77d906d 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -32,7 +32,14 @@ public class Storage { * Program Logging */ private static final Logger logger = Logger.getLogger(ChChing.class.getName()); - + public static final String TYPE_PROPERTY = "type"; + public static final String CATEGORY_PROPERTY = "category"; + public static final String DESCRIPTION_PROPERTY = "description"; + public static final String DATE_PROPERTY = "date"; + public static final String AMOUNT_PROPERTY = "amount"; + public static final String EXPENSE_SYMBOL = "E"; + public static final String INCOME_SYMBOL = "I"; + static { LogManager.getLogManager().reset(); ConsoleHandler consoleHandler = new ConsoleHandler(); @@ -67,23 +74,19 @@ public ArrayList loadIncomes() { ArrayList incomes = new ArrayList<>(); try { - // Create a GSON object Gson gson = new Gson(); - // Read the JSON file into a string String json = Files.readString(file.toPath()); - // Parse the JSON string into a JsonArray JsonArray entries = gson.fromJson(json, JsonArray.class); - // Loop through the entries and add each income to the list for (JsonElement entry : entries) { JsonObject jsonObj = entry.getAsJsonObject(); - String type = jsonObj.get("type").getAsString(); - if (type.equals("I")) { - String description = jsonObj.get("description").getAsString(); - LocalDate date = LocalDate.parse(jsonObj.get("date").getAsString()); - double amount = jsonObj.get("amount").getAsDouble(); + String type = jsonObj.get(TYPE_PROPERTY).getAsString(); + if (type.equals(INCOME_SYMBOL)) { + String description = jsonObj.get(DESCRIPTION_PROPERTY).getAsString(); + LocalDate date = LocalDate.parse(jsonObj.get(DATE_PROPERTY).getAsString()); + double amount = jsonObj.get(AMOUNT_PROPERTY).getAsDouble(); Income income = new Income(description, date, amount); incomes.add(income); } @@ -101,24 +104,20 @@ public ArrayList loadExpenses() { ArrayList expenses = new ArrayList<>(); try { - // Create a GSON object Gson gson = new Gson(); - // Read the JSON file into a string String json = Files.readString(file.toPath()); - // Parse the JSON string into a JsonArray JsonArray entries = gson.fromJson(json, JsonArray.class); - // Loop through the entries and add each income to the list for (JsonElement entry : entries) { JsonObject jsonObj = entry.getAsJsonObject(); - String type = jsonObj.get("type").getAsString(); - if (type.equals("E")) { - String description = jsonObj.get("description").getAsString(); - String category = jsonObj.get("category").getAsString(); - LocalDate date = LocalDate.parse(jsonObj.get("date").getAsString()); - double amount = jsonObj.get("amount").getAsDouble(); + String type = jsonObj.get(TYPE_PROPERTY).getAsString(); + if (type.equals(EXPENSE_SYMBOL)) { + String description = jsonObj.get(DESCRIPTION_PROPERTY).getAsString(); + String category = jsonObj.get(CATEGORY_PROPERTY).getAsString(); + LocalDate date = LocalDate.parse(jsonObj.get(DATE_PROPERTY).getAsString()); + double amount = jsonObj.get(AMOUNT_PROPERTY).getAsDouble(); Expense expense = new Expense(category, description, date, amount); expenses.add(expense); } @@ -138,10 +137,10 @@ public void save(IncomeList incomes, ExpenseList expenses) { Record income = incomes.get(i); JsonObject incomeObj = new JsonObject(); - incomeObj.addProperty("type", "I"); - incomeObj.addProperty("description", income.getDescription()); - incomeObj.addProperty("date", income.getDate().toString()); - incomeObj.addProperty("amount", income.getValue()); + incomeObj.addProperty(TYPE_PROPERTY, INCOME_SYMBOL); + incomeObj.addProperty(DESCRIPTION_PROPERTY, income.getDescription()); + incomeObj.addProperty(DATE_PROPERTY, income.getDate().toString()); + incomeObj.addProperty(AMOUNT_PROPERTY, income.getValue()); jsonArray.add(incomeObj); } @@ -150,11 +149,11 @@ public void save(IncomeList incomes, ExpenseList expenses) { Record expense = expenses.get(i); JsonObject expenseObj = new JsonObject(); - expenseObj.addProperty("type", "E"); - expenseObj.addProperty("category", expense.getCategory()); - expenseObj.addProperty("description", expense.getDescription()); - expenseObj.addProperty("date", expense.getDate().toString()); - expenseObj.addProperty("amount", expense.getValue()); + expenseObj.addProperty(TYPE_PROPERTY, EXPENSE_SYMBOL); + expenseObj.addProperty(CATEGORY_PROPERTY, expense.getCategory()); + expenseObj.addProperty(DESCRIPTION_PROPERTY, expense.getDescription()); + expenseObj.addProperty(DATE_PROPERTY, expense.getDate().toString()); + expenseObj.addProperty(AMOUNT_PROPERTY, expense.getValue()); jsonArray.add(expenseObj); } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index dbfc2fe3c8..4021f603de 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -14,7 +14,11 @@ * Models a class that act as list of expenses. Inherited from RecordList Class */ public class ExpenseList extends RecordList { - + + public static final String CATEGORY_FIELD = "c"; + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; protected ArrayList expenseList; /** @@ -52,23 +56,21 @@ public void addExpense(Expense expense) { */ public void editExpense(int index, String field, String value) throws ChChingException { - // change from 1-based indexing to 0-based indexing int indexZeroBased = index - 1; Expense expense = expenseList.get(indexZeroBased); - // edit the according field switch (field) { - case "c": + case CATEGORY_FIELD: expense.setCategory(value); break; - case "de": + case DESCRIPTION_FIELD: expense.setDescription(value); break; - case "da": + case DATE_FIELD: LocalDate date = parseDate(value); expense.setDate(date); break; - case "v": + case VALUE_FIELD: boolean isTwoDecimalsOrLess = DecimalsChecker.isPositiveTwoDecimals(value); if(!isTwoDecimalsOrLess) { throw new ChChingException("Expense value must be a valid positive double that is 2 d.p. or less"); diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 7d4fcc175b..6bfa46d834 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -14,6 +14,9 @@ * Models a class that act as list of incomes. Inherited from RecordList Class */ public class IncomeList extends RecordList { + public static final String DESCRIPTION_FIELD = "de"; + public static final String DATE_FIELD = "da"; + public static final String VALUE_FIELD = "v"; protected ArrayList incomeList; /** @@ -53,20 +56,18 @@ public void addIncome(Income income) { */ public void editIncome(int index, String field, String value) throws ChChingException { - // change from 1-based indexing to 0-based indexing int indexZeroBased = index - 1; Income income = incomeList.get(indexZeroBased); - // edit the according field switch (field) { - case "de": + case DESCRIPTION_FIELD: income.setDescription(value); break; - case "da": + case DATE_FIELD: LocalDate date = parseDate(value); income.setDate(date); break; - case "v": + case VALUE_FIELD: boolean isTwoDecimalsOrLess = DecimalsChecker.isPositiveTwoDecimals(value); if(!isTwoDecimalsOrLess) { throw new ChChingException("Income value must be a valid positive double that is 2 d.p. or less"); diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 265b0728c0..7ce401d48d 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -4,7 +4,6 @@ import java.time.format.DateTimeFormatter; import chching.ChChingException; -// Abstract class that will not be initialized as an object /** * Models an abstract class that act as a template for Expense and Income */ From 21bbaa28357254684eef67f603d460ad30813b2a Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 9 Apr 2023 16:36:05 +0800 Subject: [PATCH 341/364] checkstyle --- src/main/java/chching/Ui.java | 1 - src/main/java/chching/currency/Converter.java | 2 - src/main/java/chching/parser/Incomes.java | 1 - src/main/java/chching/parser/Parser.java | 166 +++++++++--------- 4 files changed, 83 insertions(+), 87 deletions(-) diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index a6a40143bd..b341ad0303 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -168,7 +168,6 @@ public void showMatchedExpense(ExpenseList expenses) { } logger.info("showMatchedExpense UI works"); - } public static void showHelp() { diff --git a/src/main/java/chching/currency/Converter.java b/src/main/java/chching/currency/Converter.java index 5fc84fd63f..148e597f76 100644 --- a/src/main/java/chching/currency/Converter.java +++ b/src/main/java/chching/currency/Converter.java @@ -42,8 +42,6 @@ public String printConverter(double value, Selector selector) { } return result; } - - // for testing public void printConversionRate() { for (String currency : currencyMap.keySet()) { System.out.println(currency + " " + currencyMap.get(currency)); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 6ff05fb83a..9f60d20aef 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -37,7 +37,6 @@ public static LocalDate parseDate(String incomeDateString) throws ChChingExcepti * @param argumentsByField Input from users */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { - // check if all the fields are present boolean isDescriptionPresent = argumentsByField.containsKey(DESCRIPTION_FIELD); boolean isDatePresent = argumentsByField.containsKey(DATE_FIELD); boolean isValuePresent = argumentsByField.containsKey(VALUE_FIELD); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 6dc92d812c..03b2f6188f 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -83,87 +83,87 @@ public static Command parse(String line, Ui ui) throws ChChingException { int index; try { switch (instructionLowerCase) { - case "add income": - Income income = Incomes.parseIncome(argumentsByField); - command = new AddIncomeCommand(income); - break; - case "add expense": - Expense expense = Expenses.parseExpense(argumentsByField); - command = new AddExpenseCommand(expense); - break; - case "list income": - command = new ListIncomeCommand(); - break; - case "list expense": - command = new ListExpenseCommand(); - break; - case "list": - command = new ListCommand(); - break; - case "edit income": - command = new EditIncomeCommand(argumentsByField); - break; - case "edit expense": - command = new EditExpenseCommand(argumentsByField); - break; - case "delete income": - index = Incomes.getIndex(argumentsByField); - command = new DeleteIncomeCommand(index); - break; - case "delete expense": - index = Expenses.getIndex(argumentsByField); - command = new DeleteExpenseCommand(index); - break; - case "set currency": - String currency = Currency.getCurrency(argumentsByField); - command = new SetCurrencyCommand(currency); - break; - case "unset currency": - currency = Currency.getCurrency(argumentsByField); - command = new UnsetCurrencyCommand(currency); - break; - case "find": - String type = getType(argumentsByField); - String category = getCategory(argumentsByField); - String keyword = getDescription(argumentsByField); - LocalDate date = getDate(argumentsByField); - command = new FindCommand(type, category, keyword, date); - break; - case "balance": - command = new BalanceCommand(); - break; - case "exit": - command = new ExitCommand(); - break; - case "help": - command = new HelpCommand(); - break; - case "clear income": - command = new ClearIncomeCommand(); - ui.showListCleared(); - break; - case "clear expense": - command = new ClearExpenseCommand(); - ui.showListCleared(); - break; - case "clear all": - command = new ClearAllCommand(); - ui.showListCleared(); - break; - case "set target": - Target target = TargetParser.parseTarget(argumentsByField); - command = new AddTargetCommand(target); - ui.showTargetAdded(); - break; - case "show target": - command = new ShowTargetCommand(); - break; - case "clear target": - command = new ClearTargetCommand(); - ui.clearTarget(); - break; - default: - command = new InvalidCommand(); + case "add income": + Income income = Incomes.parseIncome(argumentsByField); + command = new AddIncomeCommand(income); + break; + case "add expense": + Expense expense = Expenses.parseExpense(argumentsByField); + command = new AddExpenseCommand(expense); + break; + case "list income": + command = new ListIncomeCommand(); + break; + case "list expense": + command = new ListExpenseCommand(); + break; + case "list": + command = new ListCommand(); + break; + case "edit income": + command = new EditIncomeCommand(argumentsByField); + break; + case "edit expense": + command = new EditExpenseCommand(argumentsByField); + break; + case "delete income": + index = Incomes.getIndex(argumentsByField); + command = new DeleteIncomeCommand(index); + break; + case "delete expense": + index = Expenses.getIndex(argumentsByField); + command = new DeleteExpenseCommand(index); + break; + case "set currency": + String currency = Currency.getCurrency(argumentsByField); + command = new SetCurrencyCommand(currency); + break; + case "unset currency": + currency = Currency.getCurrency(argumentsByField); + command = new UnsetCurrencyCommand(currency); + break; + case "find": + String type = getType(argumentsByField); + String category = getCategory(argumentsByField); + String keyword = getDescription(argumentsByField); + LocalDate date = getDate(argumentsByField); + command = new FindCommand(type, category, keyword, date); + break; + case "balance": + command = new BalanceCommand(); + break; + case "exit": + command = new ExitCommand(); + break; + case "help": + command = new HelpCommand(); + break; + case "clear income": + command = new ClearIncomeCommand(); + ui.showListCleared(); + break; + case "clear expense": + command = new ClearExpenseCommand(); + ui.showListCleared(); + break; + case "clear all": + command = new ClearAllCommand(); + ui.showListCleared(); + break; + case "set target": + Target target = TargetParser.parseTarget(argumentsByField); + command = new AddTargetCommand(target); + ui.showTargetAdded(); + break; + case "show target": + command = new ShowTargetCommand(); + break; + case "clear target": + command = new ClearTargetCommand(); + ui.clearTarget(); + break; + default: + command = new InvalidCommand(); } } catch (ChChingException e) { ui.showError(e.getMessage()); @@ -211,9 +211,9 @@ public static HashMap sortArguments(List arguments) thro } } - // checks if it is an existing field + boolean isDuplicateField = argumentsByField.containsKey(field); - // check if field/value is empty or just spaces + boolean isEmptyFieldOrValue = field.isBlank() || value.isBlank(); if (isDuplicateField) { throw new ChChingException("Duplicate fields detected"); From 5e44c8ed3e0ecb2cb4290c3f7cf2c72bc1ab6b76 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 9 Apr 2023 16:37:49 +0800 Subject: [PATCH 342/364] Cleaned up test files for code quality --- src/test/java/chching/ParserTest.java | 6 ++--- .../command/AddExpenseCommandTest.java | 14 ++++++------ .../chching/command/AddIncomeCommandTest.java | 10 ++++----- .../chching/command/BalanceCommandTest.java | 2 +- .../command/DeleteExpenseCommandTest.java | 6 ++--- .../command/DeleteIncomeCommandTest.java | 6 ++--- .../command/EditExpenseCommandTest.java | 11 +++++----- .../command/EditIncomeCommandTest.java | 10 ++++----- .../java/chching/parser/ExpensesTest.java | 22 +++++++++---------- src/test/java/chching/parser/IncomesTest.java | 22 +++++++++---------- .../java/chching/record/ExpenseListTest.java | 22 +++++++++---------- src/test/java/chching/record/ExpenseTest.java | 3 --- .../java/chching/record/IncomeListTest.java | 18 +++++++-------- src/test/java/chching/record/IncomeTest.java | 3 --- 14 files changed, 74 insertions(+), 81 deletions(-) diff --git a/src/test/java/chching/ParserTest.java b/src/test/java/chching/ParserTest.java index 20e05cf560..8bdb9ce136 100644 --- a/src/test/java/chching/ParserTest.java +++ b/src/test/java/chching/ParserTest.java @@ -114,7 +114,7 @@ public void sortArguments_invalidInput_throwsException() { try { new Parser().sortArguments(input); - fail(); // the test should not reach this line + fail(); } catch (ChChingException e) { assertEquals("Arguments not inputted correctly / Missing details", e.getMessage()); } @@ -132,7 +132,7 @@ public void sortArguments_duplicateField_throwsException() { try { new Parser().sortArguments(input); - fail(); // the test should not reach this line + fail(); } catch (ChChingException e) { assertEquals("Duplicate fields detected", e.getMessage()); } @@ -149,7 +149,7 @@ public void sortArguments_emptyDetail_throwsException() { try { new Parser().sortArguments(input); - fail(); // the test should not reach this line + fail(); } catch (ChChingException e) { assertEquals("Empty detail detected or improper use of \" / \"", e.getMessage()); } diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index 4020d9faad..cb3c28e021 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -67,7 +67,7 @@ void execute_normalScenario_success() { assertEquals(expensesSize + 1, expenses.size()); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } @@ -79,7 +79,7 @@ void execute_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; try { new AddExpenseCommand(null); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -94,7 +94,7 @@ void execute_missingCategoryField_exceptionThrown() { Expense input = new Expense(null, DESCRIPTION , DATE, EXPENSE_VALUE); try { new AddExpenseCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -109,7 +109,7 @@ void execute_missingDescriptionField_exceptionThrown() { Expense input = new Expense(CATEGORY, null, DATE, EXPENSE_VALUE); try { new AddExpenseCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -124,7 +124,7 @@ void execute_missingDateField_exceptionThrown() { Expense input = new Expense(CATEGORY, DESCRIPTION, null, EXPENSE_VALUE); try { new AddExpenseCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -139,7 +139,7 @@ void execute_zeroValueField_exceptionThrown() { Expense input = new Expense(CATEGORY, DESCRIPTION, DATE, ZERO_EXPENSE_VALUE); try { new AddExpenseCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -154,7 +154,7 @@ void execute_negativeValueField_exceptionThrown() { Expense input = new Expense(CATEGORY, DESCRIPTION, DATE, NEGATIVE_EXPENSE_VALUE); try { new AddExpenseCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 34aa877cd4..86569aa233 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -77,7 +77,7 @@ void addIncomeCommand_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; try { new AddIncomeCommand(null); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -92,7 +92,7 @@ void addIncomeCommand_missingDescriptionField_exceptionThrown() { Income input = new Income(null, DATE, INCOME_VALUE); try { new AddIncomeCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -107,7 +107,7 @@ void addIncomeCommand_missingDateField_exceptionThrown() { Income input = new Income(DESCRIPTION, null, INCOME_VALUE); try { new AddIncomeCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -122,7 +122,7 @@ void addIncomeCommand_zeroValueField_exceptionThrown() { Income input = new Income(DESCRIPTION, DATE, ZERO_INCOME_VALUE); try { new AddIncomeCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } @@ -137,7 +137,7 @@ void addIncomeCommand_negativeValueField_exceptionThrown() { Income input = new Income(DESCRIPTION, DATE, NEGATIVE_INCOME_VALUE); try { new AddIncomeCommand(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage()); } diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 1280e399eb..09ed8118b6 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -81,7 +81,7 @@ void execute_normalScenario_success() { assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } } diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index b6f665bc0f..2db8d2d823 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -75,7 +75,7 @@ void execute_positiveIntegerWithinSize_success() { command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); assertEquals(defaultExpenseListSize - OFFSET, defaultExpenseList.size(), "Delete expense working"); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -88,7 +88,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { Command command = new DeleteExpenseCommand(TOO_LARGE_INDEX); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); } @@ -103,7 +103,7 @@ void execute_negativeInteger_exceptionThrown() { Command command = new DeleteExpenseCommand(NEGATIVE_INDEX); try { command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); } diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 0490b2814a..dab97f8a9b 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -70,7 +70,7 @@ void execute_positiveIntegerWithinSize_success() { command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); assertEquals(defaultIncomeListSize - OFFSET, defaultIncomeList.size(), "Delete income working"); } catch (Exception e) { - fail(); // test should not reach here + fail(); } } @@ -83,7 +83,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { Command command = new DeleteIncomeCommand(TOO_LARGE_INDEX); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); } @@ -98,7 +98,7 @@ void execute_negativeInteger_exceptionThrown() { Command command = new DeleteIncomeCommand(NEGATIVE_INDEX); try { command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); } diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java index 7c4e2c6e9a..9493ae1bf9 100644 --- a/src/test/java/chching/command/EditExpenseCommandTest.java +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -87,7 +87,7 @@ void execute_normalScenario_success() { assertEquals(Float.parseFloat(VALUE_VALUE), expenses.get(0).getValue()); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } @@ -104,9 +104,8 @@ void execute_noIndex_exceptionThrown() { argumentsByField.put(VALUE_FIELD, VALUE_VALUE); Command editExpenseCommand = new EditExpenseCommand(argumentsByField); - // exception should be thrown before execute even happens - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } @@ -128,7 +127,7 @@ void execute_negativeIndex_exceptionThrown() { Command editExpenseCommand = new EditExpenseCommand(argumentsByField); editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Negative/Zero index", e.getMessage()); } @@ -150,7 +149,7 @@ void execute_indexOutOfBounds_exceptionThrown() { Command editExpenseCommand = new EditExpenseCommand(argumentsByField); editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("The index is too big", e.getMessage()); } @@ -168,7 +167,7 @@ void execute_noFields_exceptionThrown() { Command editExpenseCommand = new EditExpenseCommand(argumentsByField); editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("No fields to edit", e.getMessage()); } diff --git a/src/test/java/chching/command/EditIncomeCommandTest.java b/src/test/java/chching/command/EditIncomeCommandTest.java index a1135b6839..9aebe30ad4 100644 --- a/src/test/java/chching/command/EditIncomeCommandTest.java +++ b/src/test/java/chching/command/EditIncomeCommandTest.java @@ -81,7 +81,7 @@ void execute_normalScenario_success() { assertEquals(Float.parseFloat(VALUE_VALUE), incomes.get(0).getValue()); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } @@ -100,7 +100,7 @@ void execute_noIndex_exceptionThrown() { Command editIncomeCommand = new EditIncomeCommand(argumentsByField); editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } @@ -122,7 +122,7 @@ void execute_negativeIndex_exceptionThrown() { Command editIncomeCommand = new EditIncomeCommand(argumentsByField); editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Negative/Zero index", e.getMessage()); } @@ -144,7 +144,7 @@ void execute_indexOutOfBounds_exceptionThrown() { Command editIncomeCommand = new EditIncomeCommand(argumentsByField); editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("The index is too big", e.getMessage()); } @@ -163,7 +163,7 @@ void execute_noFields_exceptionThrown() { Command editIncomeCommand = new EditIncomeCommand(argumentsByField); editIncomeCommand.execute(incomes, expenseList, ui, storage, selector, converter, targetStorage); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("No fields to edit", e.getMessage()); } diff --git a/src/test/java/chching/parser/ExpensesTest.java b/src/test/java/chching/parser/ExpensesTest.java index dea1bf4d02..9bcdbf4ae9 100644 --- a/src/test/java/chching/parser/ExpensesTest.java +++ b/src/test/java/chching/parser/ExpensesTest.java @@ -35,7 +35,7 @@ public void parseDate_normalScenario_success() { try { assertEquals(DATE_VALUE, Expenses.parseDate(DATE_STRING)); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -47,7 +47,7 @@ public void parseDate_normalScenario_success() { public void parseDate_invalidDate_exceptionThrown() { try { Expenses.parseDate("30-02-2023"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -61,7 +61,7 @@ public void parseDate_invalidDate_exceptionThrown() { public void parseDate_invalidDateFormat_exceptionThrown() { try { Expenses.parseDate("2023-02-30"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -75,7 +75,7 @@ public void parseDate_invalidDateFormat_exceptionThrown() { public void parseDate_futureDate_exceptionThrown() { try { Expenses.parseDate("02-04-2030"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); } @@ -100,7 +100,7 @@ public void parseExpense_normalScenario_success() { assertEquals(DATE_VALUE, output.getDate()); assertEquals(VALUE_VALUE, output.getValue()); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -117,7 +117,7 @@ public void parseExpense_missingCategory_exceptionThrown() { try { Expenses.parseExpense(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Missing fields detected", e.getMessage()); } @@ -136,7 +136,7 @@ public void parseExpense_valueTooLarge_exceptionThrown() { input.put(VALUE_FIELD, "1000000.00"); try { Expenses.parseExpense(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { System.out.println(e.getMessage()); assertEquals("Expense value must be less than 1000000", e.getMessage()); @@ -157,7 +157,7 @@ public void parseExpense_valueTooSmall_exceptionThrown() { try { Expenses.parseExpense(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be greater than 0", e.getMessage()); } @@ -174,7 +174,7 @@ public void getIndex_normalScenario_success() { try { assertEquals(INDEX_VALUE, Expenses.getIndex(input)); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -188,7 +188,7 @@ public void getIndex_missingIndex_exceptionThrown() { input.put(CATEGORY_FIELD, CATEGORY_VALUE); try { Expenses.getIndex(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } @@ -204,7 +204,7 @@ public void getIndex_invalidIndex_exceptionThrown() { input.put(INDEX_FIELD, "2 a"); try { Expenses.getIndex(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } diff --git a/src/test/java/chching/parser/IncomesTest.java b/src/test/java/chching/parser/IncomesTest.java index c1c9eec7f9..8a0bfcc961 100644 --- a/src/test/java/chching/parser/IncomesTest.java +++ b/src/test/java/chching/parser/IncomesTest.java @@ -32,7 +32,7 @@ public void parseDate_normalScenario_success() { try { assertEquals(DATE_VALUE, Incomes.parseDate(DATE_STRING)); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -44,7 +44,7 @@ public void parseDate_normalScenario_success() { public void parseDate_invalidDate_exceptionThrown() { try { Incomes.parseDate("30-02-2023"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -58,7 +58,7 @@ public void parseDate_invalidDate_exceptionThrown() { public void parseDate_invalidDateFormat_exceptionThrown() { try { Incomes.parseDate("2023-02-30"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -72,7 +72,7 @@ public void parseDate_invalidDateFormat_exceptionThrown() { public void parseDate_futureDate_exceptionThrown() { try { Incomes.parseDate("02-04-2030"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); } @@ -95,7 +95,7 @@ public void parseIncome_normalScenario_success() { assertEquals(DATE_VALUE, output.getDate()); assertEquals(VALUE_VALUE, output.getValue()); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -111,7 +111,7 @@ public void parseIncome_missingDescription_exceptionThrown() { try { Incomes.parseIncome(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Missing fields detected", e.getMessage()); } @@ -129,7 +129,7 @@ public void parseIncome_valueTooLarge_exceptionThrown() { input.put(VALUE_FIELD, "1000000.00"); try { Incomes.parseIncome(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { System.out.println(e.getMessage()); assertEquals("Income value must be less than 1000000", e.getMessage()); @@ -149,7 +149,7 @@ public void parseIncome_valueTooSmall_exceptionThrown() { try { Incomes.parseIncome(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be greater than 0", e.getMessage()); } @@ -166,7 +166,7 @@ public void getIndex_normalScenario_success() { try { assertEquals(INDEX_VALUE, Incomes.getIndex(input)); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -180,7 +180,7 @@ public void getIndex_missingIndex_exceptionThrown() { input.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); try { Incomes.getIndex(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } @@ -196,7 +196,7 @@ public void getIndex_invalidIndex_exceptionThrown() { input.put(INDEX_FIELD, "2 a"); try { Incomes.getIndex(input); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Index field not found", e.getMessage()); } diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 9499face9a..b1a0f3eb24 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -68,7 +68,7 @@ void editExpense_editCategory_success() { assertEquals(DATE, expenses.get(0).getDate()); assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); } catch (Exception e) { - fail(); // test should not fail + fail(); } } @@ -85,7 +85,7 @@ void editExpense_editDescription_success() { assertEquals(DATE, expenses.get(0).getDate()); assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); } catch (Exception e) { - fail(); // test should not fail + fail(); } } @@ -102,7 +102,7 @@ void editExpense_editDate_success() { assertEquals(expectedOutputDate, expenses.get(0).getDate()); assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); } catch (Exception e) { - fail(); // test should not reach this line + fail(); } } @@ -114,7 +114,7 @@ void editExpense_editDate_success() { void editExpense_editFutureDate_exceptionThrown() { try { expenses.editExpense(1, DATE_FIELD, "05-04-2029"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); } @@ -128,7 +128,7 @@ void editExpense_editFutureDate_exceptionThrown() { void editExpense_editInvalidDate_exceptionThrown() { try { expenses.editExpense(1, DATE_FIELD, "30-02-2022"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -147,7 +147,7 @@ void editExpense_editValue_success() { assertEquals(DATE, expenses.get(0).getDate()); assertEquals(expectedOutputValue, expenses.get(0).getValue()); } catch (Exception e) { - fail(); // test should not fail + fail(); } } @@ -159,7 +159,7 @@ void editExpense_editValue_success() { void editExpense_editNegativeValue_exceptionThrown() { try { expenses.editExpense(1, VALUE_FIELD, "-100"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -173,7 +173,7 @@ void editExpense_editNegativeValue_exceptionThrown() { void editExpense_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { try { expenses.editExpense(1, VALUE_FIELD, "100.123"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -187,7 +187,7 @@ void editExpense_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { void editExpense_editValueNotDouble_exceptionThrown() { try { expenses.editExpense(1, VALUE_FIELD, "abc"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -201,7 +201,7 @@ void editExpense_editValueNotDouble_exceptionThrown() { void editExpense_editValueMoreThan999999d99_exceptionThrown() { try { expenses.editExpense(1, VALUE_FIELD, "1000000"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be less than 1000000", e.getMessage()); } @@ -215,7 +215,7 @@ void editExpense_editValueMoreThan999999d99_exceptionThrown() { void editExpense_editValueLessThan0d01_exceptionThrown() { try { expenses.editExpense(1, VALUE_FIELD, "0.00"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Expense value must be greater than 0", e.getMessage()); } diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index 3bab49b7ef..d482c52faf 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -22,7 +22,6 @@ public class ExpenseTest { */ @Test void getExpenseDescription_expected() { - String test = "public transport"; Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals("public transport", exp.getDescription()); } @@ -32,7 +31,6 @@ void getExpenseDescription_expected() { */ @Test void getExpenseDate_expected() { - String test = "01-Apr-2023"; Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals("01-Apr-2023", exp.getDateString()); } @@ -43,7 +41,6 @@ void getExpenseDate_expected() { */ @Test void getExpenseValue_expected() { - float test = (float) 1.50; Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); assertEquals((float) 1.50, exp.getValue()); } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 559b1db180..2760865036 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -81,7 +81,7 @@ void editIncome_editDate_success() { assertEquals(INCOME_VALUE, incomes.get(0).getValue()); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } @@ -93,7 +93,7 @@ void editIncome_editDate_success() { void editIncome_editFutureDate_exceptionThrown() { try { incomes.editIncome(1, DATE_FIELD, "05-04-2029"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date cannot be in the future", e.getMessage()); } @@ -107,7 +107,7 @@ void editIncome_editFutureDate_exceptionThrown() { void editIncome_editInvalidDate_exceptionThrown() { try { incomes.editIncome(1, DATE_FIELD, "31-02-2022"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Date must be valid and have format: \"DD-MM-YYYY\"", e.getMessage()); } @@ -127,7 +127,7 @@ void editIncome_editValue_success() { assertEquals(expectedOutputValue, incomes.get(0).getValue()); } catch (Exception e) { System.out.println(e.getMessage()); - fail(); // test should not reach this line + fail(); } } @@ -139,7 +139,7 @@ void editIncome_editValue_success() { void editIncome_editNegativeValue_exceptionThrown() { try { incomes.editIncome(1, VALUE_FIELD, "-200000"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -153,7 +153,7 @@ void editIncome_editNegativeValue_exceptionThrown() { void editIncome_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { try { incomes.editIncome(1, VALUE_FIELD, "200000.1234"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -167,7 +167,7 @@ void editIncome_editValueWithMoreThanTwoDecimalPlaces_exceptionThrown() { void editIncome_editValueNotDouble_exceptionThrown() { try { incomes.editIncome(1, VALUE_FIELD, "200000.1a"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be a valid positive double that is 2 d.p. or less", e.getMessage()); } @@ -181,7 +181,7 @@ void editIncome_editValueNotDouble_exceptionThrown() { void editIncome_editValueMoreThan999999d99_exceptionThrown() { try { incomes.editIncome(1, VALUE_FIELD, "1000000.00"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be less than 1000000", e.getMessage()); } @@ -195,7 +195,7 @@ void editIncome_editValueMoreThan999999d99_exceptionThrown() { void editIncome_editValueLessThan0d01_exceptionThrown() { try { incomes.editIncome(1, VALUE_FIELD, "0.00"); - fail(); // test should not reach this line + fail(); } catch (Exception e) { assertEquals("Income value must be greater than 0", e.getMessage()); } diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 58dfc710c2..47539771ad 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -21,7 +21,6 @@ class IncomeTest { */ @Test void getIncomeDescription_expected() { - String test = "salary"; Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals("salary", income0.getDescription()); } @@ -31,7 +30,6 @@ void getIncomeDescription_expected() { */ @Test void getIncomeDate_expected() { - String test = "01-Apr-2023"; Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals("01-Apr-2023", income0.getDateString()); } @@ -41,7 +39,6 @@ void getIncomeDate_expected() { */ @Test void getIncomeValue_expected() { - float test = (float) 1000000; Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); assertEquals((float) 1000000, income0.getValue()); } From 564ed3b0426bbc6d497b6e831669afa5db323148 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 16:37:55 +0800 Subject: [PATCH 343/364] Improve code quality --- .../chching/command/EditExpenseCommand.java | 16 +++++++-------- .../chching/command/EditIncomeCommand.java | 20 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java index ea4453ac0d..d1f78cdcbf 100644 --- a/src/main/java/chching/command/EditExpenseCommand.java +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -31,7 +31,7 @@ public class EditExpenseCommand extends Command { public EditExpenseCommand(HashMap argumentsByField) throws ChChingException { this.argumentsByField = argumentsByField; - + index = Expenses.getIndex(argumentsByField); hasCategory = argumentsByField.containsKey(CATEGORY_FIELD); hasDescription = argumentsByField.containsKey(DESCRIPTION_FIELD); @@ -45,7 +45,7 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi * * @param incomes ArrayList of income. * @param expenses ArrayList of income. - * @param ui User interface. + * @param ui User interface. * @param storage Storage of data. * @param converter Convert value. * @param targetStorage store target. @@ -54,22 +54,22 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - // check if the index is valid + if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > expenses.size()) { throw new ChChingException("The index is too big"); } assert index > 0 : "Index must be a positive integer"; - + if (!hasCategory && !hasDescription && !hasDate && !hasValue) { throw new ChChingException("No fields to edit"); } - // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; Expense expense = expenses.get(indexZeroBased); - - // edit the fields accordingly + + if (hasCategory) { String value = argumentsByField.get(CATEGORY_FIELD); expenses.editExpense(index, CATEGORY_FIELD, value); @@ -86,7 +86,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto String value = argumentsByField.get(VALUE_FIELD); expenses.editExpense(index, VALUE_FIELD, value); } - + boolean isExpense = true; ui.showEdited(index, expense, isExpense); } diff --git a/src/main/java/chching/command/EditIncomeCommand.java b/src/main/java/chching/command/EditIncomeCommand.java index b55fca96dc..7b9b044746 100644 --- a/src/main/java/chching/command/EditIncomeCommand.java +++ b/src/main/java/chching/command/EditIncomeCommand.java @@ -25,23 +25,23 @@ public class EditIncomeCommand extends Command { private boolean hasDescription; private boolean hasDate; private boolean hasValue; - + public EditIncomeCommand(HashMap argumentsByField) throws ChChingException { this.argumentsByField = argumentsByField; - + index = Incomes.getIndex(argumentsByField); hasDescription = argumentsByField.containsKey(DESCRIPTION_FIELD); hasDate = argumentsByField.containsKey(DATE_FIELD); hasValue = argumentsByField.containsKey(VALUE_FIELD); } - + /** * Executes edit of incomes. * Based on the fields the user wants to edit, the corresponding fields will be edited. * * @param incomes ArrayList of income. * @param expenses ArrayList of income. - * @param ui User interface. + * @param ui User interface. * @param storage Storage of data. * @param converter Convert value. * @param targetStorage store target. @@ -50,22 +50,22 @@ public EditIncomeCommand(HashMap argumentsByField) throws ChChin @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - // check if the index is valid + if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > incomes.size()) { throw new ChChingException("The index is too big"); } assert index > 0 : "Index must be a positive integer"; - + if (!hasDescription && !hasDate && !hasValue) { throw new ChChingException("No fields to edit"); } - // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; Income income = incomes.get(indexZeroBased); - - // edit the fields accordingly + + if (hasDescription) { String value = argumentsByField.get(DESCRIPTION_FIELD); incomes.editIncome(index, DESCRIPTION_FIELD, value); @@ -78,7 +78,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto String value = argumentsByField.get(VALUE_FIELD); incomes.editIncome(index, VALUE_FIELD, value); } - + boolean isExpense = false; ui.showEdited(index, income, isExpense); } From f5f541c580812ec63d518f9135d76d0ad2a86671 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 16:45:00 +0800 Subject: [PATCH 344/364] Fix checkstyle error --- src/main/java/chching/Storage.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index c1e77d906d..1be4b561b8 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -28,10 +28,6 @@ * Models a class to handle storage for the program. */ public class Storage { - /** - * Program Logging - */ - private static final Logger logger = Logger.getLogger(ChChing.class.getName()); public static final String TYPE_PROPERTY = "type"; public static final String CATEGORY_PROPERTY = "category"; public static final String DESCRIPTION_PROPERTY = "description"; @@ -39,6 +35,7 @@ public class Storage { public static final String AMOUNT_PROPERTY = "amount"; public static final String EXPENSE_SYMBOL = "E"; public static final String INCOME_SYMBOL = "I"; + private static final Logger logger = Logger.getLogger(ChChing.class.getName()); static { LogManager.getLogManager().reset(); From a0cf61356122efc383441b49fe633936bce3f780 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 9 Apr 2023 16:47:46 +0800 Subject: [PATCH 345/364] update ym PPP --- docs/team/rayleigh47.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/rayleigh47.md b/docs/team/rayleigh47.md index 7e528343b3..ad9e0fd330 100644 --- a/docs/team/rayleigh47.md +++ b/docs/team/rayleigh47.md @@ -37,6 +37,7 @@ Given below are my contributions to the project. #### Contributions to the DG: * Added `AddIncomeCommand` sequence diagram * Added `ListExpenseCommand` sequence diagram +* Added architectural diagram * Added documentation for `AddIncomeCommand` * Added documentation for `ListExpenseCommand` @@ -44,6 +45,7 @@ Given below are my contributions to the project. * v1.0 wrap-up * v1.0 release * v2.0 wrap-up +* v2.1 wrap-up #### Review/monitoring contributions * PR and DG reviewed for the following team: [CS2113-T13-2](https://github.com/nus-cs2113-AY2223S2/tp/pull/79) From 96b0a98d8e3f180eeff7f36ac4aa076b4c5faa46 Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 16:58:12 +0800 Subject: [PATCH 346/364] Update TOC --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7f9c59e10b..3a457e6368 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,7 +1,7 @@ # Developer Guide * Table of Contents - {:toc} +{:toc} ## Acknowledgements From 322fb7287db3218d30c94a868ca9f5af7e7cf30e Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 17:06:49 +0800 Subject: [PATCH 347/364] Update instructions/command line to be trimmed to cut off excess spaces --- src/main/java/chching/parser/Parser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 03b2f6188f..a10bb16a17 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -75,7 +75,7 @@ public class Parser { */ public static Command parse(String line, Ui ui) throws ChChingException { List lineParts = splitLine(line); - String instruction = lineParts.get(0); + String instruction = lineParts.get(0).trim(); String instructionLowerCase = instruction.toLowerCase(); List arguments = lineParts.subList(1, lineParts.size()); HashMap argumentsByField = sortArguments(arguments); From 7af572ac63c85c11b8071348e9fd7115076b03e0 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 9 Apr 2023 17:14:47 +0800 Subject: [PATCH 348/364] added currency to target --- [CS2113-T12-1][ChChing].jar | Bin 0 -> 349224 bytes .../java/chching/command/BalanceCommand.java | 3 ++- src/main/java/chching/command/FindCommand.java | 2 +- tp.jar | Bin 82551 -> 0 bytes 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 [CS2113-T12-1][ChChing].jar delete mode 100644 tp.jar diff --git a/[CS2113-T12-1][ChChing].jar b/[CS2113-T12-1][ChChing].jar new file mode 100644 index 0000000000000000000000000000000000000000..cabf6012a2418044544f7231b451fcc9d3a0fd8e GIT binary patch literal 349224 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

      M>)!QCAFryhb@SZ(<^uoK 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 currentTarget) { System.out.println(" Great work! You have met your target goal."); diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 84dc301c71..06e10514fd 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -65,7 +65,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto } else if (type.equals("expense") && (description == null || emptyKeyword) && category == null && date == null) { - throw new ChChingException("No description or category or date specified"); + throw new ChChingException("No description or category or date specified for Expense"); } if (type.equals("income")) { diff --git a/tp.jar b/tp.jar deleted file mode 100644 index 74d27128fd88d6504f67807b3fbe98f600088206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82551 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≥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 Date: Sun, 9 Apr 2023 17:17:41 +0800 Subject: [PATCH 349/364] Remove consolehandler logging --- src/main/java/chching/ChChing.java | 4 ---- src/main/java/chching/ChChingException.java | 4 ---- src/main/java/chching/Storage.java | 4 ---- src/main/java/chching/Ui.java | 4 ---- src/main/java/chching/api/LiveCurrencyApi.java | 4 ---- src/main/java/chching/api/ParameterStringBuilder.java | 4 ---- src/main/java/chching/parser/Parser.java | 4 ---- src/main/java/chching/parser/TargetParser.java | 4 ---- 8 files changed, 32 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index f400f340be..e702068aaa 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -12,7 +12,6 @@ import java.io.File; import java.io.IOException; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -30,9 +29,6 @@ public class ChChing { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/MainChChingLog.log").createNewFile(); diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 093c2c9439..717583163f 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -2,7 +2,6 @@ import java.io.File; import java.io.IOException; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -19,9 +18,6 @@ public class ChChingException extends Exception { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/ExceptionLog.log").createNewFile(); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index 1be4b561b8..4f3a9a6626 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -12,7 +12,6 @@ import java.nio.file.Files; import java.time.LocalDate; import java.util.ArrayList; -import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.FileHandler; @@ -39,9 +38,6 @@ public class Storage { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/StorageLog.log").createNewFile(); diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index b341ad0303..a3d7cc40bb 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -12,7 +12,6 @@ import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.Scanner; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -29,9 +28,6 @@ public class Ui { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/UILog.log").createNewFile(); diff --git a/src/main/java/chching/api/LiveCurrencyApi.java b/src/main/java/chching/api/LiveCurrencyApi.java index 2146e7adda..d911bc6e37 100644 --- a/src/main/java/chching/api/LiveCurrencyApi.java +++ b/src/main/java/chching/api/LiveCurrencyApi.java @@ -6,7 +6,6 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -25,9 +24,6 @@ public class LiveCurrencyApi { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/LiveCurrencyAPILog.log").createNewFile(); diff --git a/src/main/java/chching/api/ParameterStringBuilder.java b/src/main/java/chching/api/ParameterStringBuilder.java index 68de47f703..6a2060fde6 100644 --- a/src/main/java/chching/api/ParameterStringBuilder.java +++ b/src/main/java/chching/api/ParameterStringBuilder.java @@ -7,7 +7,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -21,9 +20,6 @@ public class ParameterStringBuilder { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/ParameterStringBuilderLog.log").createNewFile(); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index a10bb16a17..77590285b7 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -40,7 +40,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -52,9 +51,6 @@ public class Parser { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/ParserLog.log").createNewFile(); diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index 4845c902ed..69eb6a599a 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -7,7 +7,6 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; -import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogManager; @@ -21,9 +20,6 @@ public class TargetParser { static { LogManager.getLogManager().reset(); - ConsoleHandler consoleHandler = new ConsoleHandler(); - consoleHandler.setLevel(Level.SEVERE); - logger.addHandler(consoleHandler); logger.setLevel(Level.ALL); try { new File("data/TargetParserLog.log").createNewFile(); From becaf14be2b2c1c7ee1d2d904a25bce95d93624e Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 9 Apr 2023 17:24:29 +0800 Subject: [PATCH 350/364] ppp --- docs/team/hyperbola-bear.md | 38 +++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/docs/team/hyperbola-bear.md b/docs/team/hyperbola-bear.md index 9cf0d668a5..e179ccb9ae 100644 --- a/docs/team/hyperbola-bear.md +++ b/docs/team/hyperbola-bear.md @@ -17,19 +17,19 @@ Given below are my contributions to the project. #### Project management: -- Creating issues for team members to work on +* Creating issues for team members to work on #### Enhancements Implemented: -- Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. -- Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. -- Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. -- Refactored and upgraded `FindCommand` to allow users to find income and expenses based on their type. For incomes, user can search based on date and dexcription. For expenses, user can search based on date, description and category. Each of the search parameters are optional, however, at least one search parameter must be provided for `FindCommand` to work. -- Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. -- Created a Selector to allow users to select the currency of interest. -- Created a Converter class to allow users to convert the currency of interest. -- Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. -- Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, +* Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. +* Created a `DeleteExpenseCommand` to allow users to delete an expense from the expense list. +* Created a `BalanceCommand` to allow users to view the balance of the user derived from their expenses and income. +* Refactored and upgraded `FindCommand` to allow users to find income and expenses based on their type. For incomes, user can search based on date and dexcription. For expenses, user can search based on date, description and category. Each of the search parameters are optional, however, at least one search parameter must be provided for `FindCommand` to work. +* Created a currency conversion feature which allows the user to set and unset currencies to display the conversion from SGD to currencies of interest. When the user sets a currency, the currency will be displayed in the income, expense list and balance. When the user unsets a currency, the currency will no longer be displayed in the income, expense list and balance. +* Created a Selector to allow users to select the currency of interest. +* Created a Converter class to allow users to convert the currency of interest. +* Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. +* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, #### Contributions to the UG: @@ -37,17 +37,19 @@ Added documentation for the feature `Set Currency`, `Unset Currency` and `FindCo #### Contributions to the DG: -- Added `SetCurrencyCommand` sequence diagram -- Added implementation details for `SetCurrencyCommand` -- Added `UnsetCurrencyCommand` sequence diagram -- Added implementation details for `FindCommand` -- Added `FindCommand` sequence diagram +* Added `SetCurrencyCommand` sequence diagram +* Added implementation details for `SetCurrencyCommand` +* Added `UnsetCurrencyCommand` sequence diagram +* Added implementation details for `FindCommand` +* Added `FindCommand` sequence diagram #### Contributions to team-based tasks: -- Ensuring Github's Java CI checks are passing +* Ensuring Github's Java CI checks are passing +* v2.1 wrap-up +* v2.1 release #### Review/monitoring contributions -- PRs reviewed: [CS2113-T13-1](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-T13-1+), [CS2113-W12-4](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-W12-4+) -- Bugs reported and suggestions: [CS2113-F10-1](https://github.com/hyperbola-bear/ped/issues) +* PRs reviewed: [CS2113-T13-1](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-T13-1+), [CS2113-W12-4](https://github.com/nus-cs2113-AY2223S2/tp/pulls?q=is%3Aopen+is%3Apr+CS2113-W12-4+) +* Bugs reported and suggestions: [CS2113-F10-1](https://github.com/hyperbola-bear/ped/issues) From e4934ab35406977a0293464c4ea8b27f4ec4ccb7 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 9 Apr 2023 17:48:25 +0800 Subject: [PATCH 351/364] update show target to be 2dp --- src/main/java/chching/command/ShowTargetCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/chching/command/ShowTargetCommand.java b/src/main/java/chching/command/ShowTargetCommand.java index 98949d36f8..31bb7a014e 100644 --- a/src/main/java/chching/command/ShowTargetCommand.java +++ b/src/main/java/chching/command/ShowTargetCommand.java @@ -29,6 +29,6 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto double target = targetStorage.getTarget().getValue(); String convertedCurrencies = converter.printConverter(target, selector); - System.out.println(" Current target: " + target + " SGD" + convertedCurrencies); + System.out.println(" Current target: " + String.format("%.02f", target) + " SGD" + convertedCurrencies); } } From 731e284aedd45d5902edc33a6d1ddf4f4127fcd2 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 9 Apr 2023 17:50:49 +0800 Subject: [PATCH 352/364] update DG for limit on number of records for expenses and incomes --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3a457e6368..5beae59dde 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -211,7 +211,7 @@ in a simple and convenient manner through a command line interface. - Constraints: - - Total Expense and Total Income should not exceed 2^31 - 1. + - Total number of entries for Expenses and Incomes should not exceed 10 000 each. - The '/' should not be used within any of the inputs, unless it is for specifying a category. - Technical Requirements: From a2bb66fbe4aa3ee22d165f6871481188df68f4bb Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 17:51:13 +0800 Subject: [PATCH 353/364] Update PPP --- docs/team/avielcx.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 4bb4af3b0d..57986e2056 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -16,6 +16,8 @@ Given below are my contributions to the project. * Managed release of v2.0 on GitHub. * Managed Product Website. +

      + #### Enhancements Implemented: * Created a balance command to allow users to check their balance when total income deducts total expense and compare with their target. * Created a clear incomes feature which allow users to clear their income list. @@ -29,6 +31,8 @@ Given below are my contributions to the project. * Created logging for `ChChing`, `ChChingException`, `UI`,`Parser`, `TargetParser`, `LiveCurrencyAPI`, `ParameterStringBuilder`. * Contributed to logging for `Storage`. +
      + #### Contributions to the UG: * Created `Table of Contents`. * Created `Quick Start` portion. @@ -47,6 +51,8 @@ Given below are my contributions to the project. * Added `SetTargetCommand` sequence diagram. * Added Non-Functional Requirements section. +
      + #### Contributions to team-based tasks: * Method documentations for most methods. * Developed Product Website. From fc82d368d6c65f57ef721fcf7632c94e8f952387 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Sun, 9 Apr 2023 17:53:07 +0800 Subject: [PATCH 354/364] fixed show target test bug --- src/test/java/chching/command/ShowTargetCommandTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/chching/command/ShowTargetCommandTest.java b/src/test/java/chching/command/ShowTargetCommandTest.java index bf3e45bdca..76d87c99d8 100644 --- a/src/test/java/chching/command/ShowTargetCommandTest.java +++ b/src/test/java/chching/command/ShowTargetCommandTest.java @@ -51,7 +51,7 @@ void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); selector.setCurrency("HKD"); convertedCurrencies = converter.printConverter(350, selector); - expectedString = "Current target: " + 350.0 + " SGD" + convertedCurrencies; + expectedString = "Current target: 350.00 SGD" + convertedCurrencies; } From 6dbf53dd031ade70aecf7f4f5e971c5c8b31596e Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 17:54:33 +0800 Subject: [PATCH 355/364] Add page break for PPP --- docs/team/thomasjlalba.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/thomasjlalba.md b/docs/team/thomasjlalba.md index 7747e6fe12..6aa7e58808 100644 --- a/docs/team/thomasjlalba.md +++ b/docs/team/thomasjlalba.md @@ -15,6 +15,8 @@ Given below are my contributions to the project. * Managed release of v1.0 on GitHub. * Maintained the issue tracker with the necessary tags and labels. +
      + #### Enhancements Implemented: * Created parser to parse user input into commands and arguments. * Created an add income command to allow users to add and track their incomes. From 5712364b4997a55415e382a87a8c704cc5d5f68c Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 18:01:22 +0800 Subject: [PATCH 356/364] Add page breaks for Developer Guide --- docs/DeveloperGuide.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3a457e6368..547c0f0736 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -20,6 +20,7 @@ Below are the design and implementations of key features of the ChChing program.
      We used various diagrams such as architectural diagram, UML class diagrams, sequence diagrams and activity diagrams to illustrate our methodology and approach. +
      ## Design The architectural diagram of ChChing below provides an overview of the design of our program. @@ -40,6 +41,7 @@ When the program is to exit, `Command` instructs `Storage` to write the entries `Storage` will read from `Data` when the program is launched and write and update to `Data` when the program exits. +
      ## Implementation @@ -49,6 +51,8 @@ The main class in our program is the `Record` and `RecordList` abstract classes, ![Record Class](images/Record_RecordList_UML_class.png) +
      + ### DeleteIncomeCommand The proposed DeleteIncomeCommand mechanism is facilitated by `System`, `Incomes`, `UI` and `ChChingException`. @@ -67,6 +71,8 @@ The `Target` and `TargetStorage` class allows users to set a target for their id ![Target Class](images/Target_UML.png) +
      + ### EditIncomeCommand/EditExpenseCommand The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. @@ -99,6 +105,8 @@ The following activity diagram summarises what happens when a user executes edit - Pros: Easier to implement. - Cons: Not any easier than having the user to just delete and add new expense/income. +
      + ### AddIncomeCommand The AddIncomeCommand is facilitated by `Parser`, `AddIncomeCommand`, `IncomeList` and `Ui`. @@ -112,6 +120,8 @@ The AddIncomeCommand is facilitated by `Parser`, `AddIncomeCommand`, `IncomeList ![AddIncomeCommand](images/AddIncomeCommand_Sequence_Diagram.png)
      Note: AddExpenseCommand works in a similar way. +
      + ### ListExpenseCommand The listExpenseCommand is facilitated by `Parser`, `ListExpenseCommand` and `ExpenseList`. @@ -128,6 +138,8 @@ The listExpenseCommand is facilitated by `Parser`, `ListExpenseCommand` and `Exp
      Note: ListIncomeCommand works in a similar way, but instead calls `printIncomeList`.
      Note: ListCommand works in a similar way, but calls both `printIncomeList` and `printExpenseList`. +
      + ### SetTargetCommand The setTargetCommand is facilitated by `ChChing`, `Parser`, `TargetParser`, `TargetStorage`. @@ -137,11 +149,15 @@ The `Parser` object then returns to `ChChing`. `ChChing` object then runs the `e ![SetTargetCommand UML](images/SetTargetCommand.png) +
      + ### LiveCurrencyApi `LiveCurrencyApi` class makes an API call to obtain the latest exchange rates from the [ExchangeRateApi](https://www.exchangerate-api.com/). The API call is made using the `HttpUrlConnection` class. The API key is used directly in the API call URL, and stored in the URL itself and not as a variable. The values response of the API call is then parse as a string, by formatting the string to obtain the exchange rates of the currencies and ignoring the other text. The currency name is then used as a key to see if it exist in the `selector` hashmap. If it does the exchange rate is added to the `converter` hashmap. The `converter` hashmap is then used to convert the currency of interest to SGD. If the API call somehow fails, there are hardcoded values in the `converter` hashmap that are outdated, but it allows the program to continue to run. The live currency rates are updated every time the user starts the program, however the API itself only updates the rates every 24 hours. ![LiveCurrencyApi_sequence_diagram.png](images/LiveCurrencyApi_Sequence_Diagram.png) +
      + ### SetCurrencyCommand The setCurrencyCommand is facilitated by `System`, `Selector`, `UI`, `Parser` and `ExpenseList`. @@ -161,6 +177,8 @@ The unsetCurrencyCommand works in a similar way to the setCurrencyCommand. The diagram below shows the sequence diagram for the unsetCurrencyCommand. ![SetCurrencyCommand_sequence_diagram.png](images/UnsetCurrencyCommand_Sequence_Diagram.png) +
      + ### Find The FindCommand is facilitated by `System`, `UI`,`Parser`, `ExpenseList` and `IncomeList`. @@ -171,6 +189,8 @@ By using a loop, the `execute()` method will then search through the `ExpenseLis The `execute()` method will then print out the selected expenses/incomes that matches the search fields using `showMatchedExpense()` or `showMatchedIncome()` method from `UI` to `System` ![FindCommand_sequence_diagram.png](images/FindCommand_Sequence_Diagram.png) +
      + ## Product scope ### Target user profile @@ -199,6 +219,8 @@ in a simple and convenient manner through a command line interface. | v2.0 | user | see the target i have set | remind myself of my target | | v2.0 | user | reset my income/expense lists or both | have a fresh list | +
      + ## Non-Functional Requirements - Domain rules: @@ -229,6 +251,8 @@ in a simple and convenient manner through a command line interface.
      e.g. `add income /de salary /c income /v 3.50 /da 12-12-2022` would successfully add an income entry.
      e.g. `/c income /de salary /da 12-12-2022 /v 3.50 add income` would return an error since `add command` is not written first. +
      + ## Glossary | Terminology | Definition | @@ -240,6 +264,8 @@ in a simple and convenient manner through a command line interface. | Parser | Class to take in inputs | | UI | Class to interact with users | +
      + ## Instructions for manual testing Given below are instructions to test the app manually. @@ -269,6 +295,8 @@ Given below are instructions to test the app manually.
      negative value/zero value/1000000000 and above value/non-float value/non 2 d.p. values - `add income /de salary /da 12-12-2022 /v -3.50` `add expense /c transport /de bus fare /da 10-10-2019 /v 0`.
      Expected: Similar to previous. +
      + ### Editing an income/expense 1. Editing an income/expense @@ -288,6 +316,8 @@ Given below are instructions to test the app manually.
      negative value/zero value/1000000000 and above value/non-float value/non 2 d.p. values - `edit income 1 /de salary /da 12-12-2022 /v -3.50` `edit expense 1 /c transport /de bus fare /da 10-10-2019 /v 0`.
      Expected: Similar to previous. +
      + ### Deleting an income/expense 1. Deleting an income/expense @@ -319,6 +349,8 @@ Given below are instructions to test the app manually. 2. Test case: `clear all`
      Expected: All incomes and expenses should be deleted from both the income and expense list and the balance should be updated to 0. +
      + ### Listing all income/expense & Viewing balance 1. List all incomes and/or expenses @@ -353,6 +385,7 @@ Given below are instructions to test the app manually.
      For expense: `find /t expense /c food /de sushi /da 03-03-2023 `
      Expected: No income/expense will be listed. status message will indicate no matching record for these search terms. +
      ### Setting target & Clearing target 1. Setting Target From 282d21275bf08c526032db620bd24f7cc8ccd55a Mon Sep 17 00:00:00 2001 From: avielcx Date: Sun, 9 Apr 2023 18:03:09 +0800 Subject: [PATCH 357/364] Update UG --- docs/UserGuide.md | 82 +++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 8cc1dd3681..eb5eaab111 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -44,6 +44,8 @@ Unfortunately, expense list can't be found. I'll make a new one! 7. Type in desired command to start using the program! List of commands are listed below. 8. Do not edit any program-created saved files (.json files, etc.), else the program may crash. +
      + ## Features ### Adding an entry: `add` @@ -81,6 +83,8 @@ Format:
      `list expense`
      `list income` +
      + ### Updating an entry: `edit` Edit an existing expense/income that is currently in the list. @@ -101,38 +105,7 @@ Example of usage: `edit expense /in 1 /de Lunch @Technoedge /v 5.20`
      `edit income /in 2 /da 12-12-2022 /v 100` -### Setting currency to be converted: `set currency` - -Setting a currency that the user wants to convert to. So the converted amount will show in the list of expenses and incomes. - -Format: -
      `set currency /cr CURRENCY` - -Use case: -- show the currency that users want to convert to. -- List of supported currencies: - * HKD - Hong Kong Dollar - * PHP - Philippine Peso - * IDR - Indonesian Rupiah - * MYR - Malaysian Ringgit - * VND - Vietnamese Dong - -Example of usage: -
      `set currency /cr HKD` - -### Unset currency to be converted: `unset currency` - -Unset the currency that the user does not want to convert to. - -Format: -
      `unset currency /cr CURRENCY` - -Use case: - -- stop showing the currency that users do not want to convert to. - -Example of usage: -
      `unset currency /cr HKD` +
      ### Finding an entry: `find` @@ -174,6 +147,8 @@ Example of usage:
      `delete expense /in 1`
      `delete income /in 2` +
      + ### Clear entire income list: `clear income` Clear the entire list of incomes. @@ -195,6 +170,8 @@ Clear the entire list of incomes and expenses. Format:
      `clear all` +
      + ### Set a target for balance of finances: `set target` Allows users to set a target for their balance. @@ -229,6 +206,8 @@ Format: Use case: - A target must have been set in the first place. +
      + ### Finding balance of finances: `balance` Shows users the balance after calculating the difference between income and expenses and informs users on whether they have reached their target. @@ -236,6 +215,41 @@ Shows users the balance after calculating the difference between income and expe Format:
      `balance` +### Setting currency to be converted: `set currency` + +Setting a currency that the user wants to convert to. So the converted amount will show in the list of expenses and incomes. + +Format: +
      `set currency /cr CURRENCY` + +Use case: +- show the currency that users want to convert to. +- List of supported currencies: + * HKD - Hong Kong Dollar + * PHP - Philippine Peso + * IDR - Indonesian Rupiah + * MYR - Malaysian Ringgit + * VND - Vietnamese Dong + +Example of usage: +
      `set currency /cr HKD` + +### Unset currency to be converted: `unset currency` + +Unset the currency that the user does not want to convert to. + +Format: +
      `unset currency /cr CURRENCY` + +Use case: + +- stop showing the currency that users do not want to convert to. + +Example of usage: +
      `unset currency /cr HKD` + +
      + ### View help: `help` Shows basic commands executable by the program and the use format for the commands @@ -256,6 +270,8 @@ Record entries are saved in `data/chching.json` file. This file is updated upon When reading from the file, entries for income and expenses are stored in their respective arrayList. The data file is not to be edited manually. +
      + ### Other Notes * Should additional fields that is not required be added to the input, the program will ignore it.
      e.g. field "a" with value "1" will be ignored for `add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50 /a 1`, and `exit /de 1` will still successfully exit the program. @@ -271,6 +287,8 @@ The data file is not to be edited manually. * For values that require double/float, ChChing will only allow for 2 decimal places. Furthermore, ChChing will not accept values that does not have a number before the decimal point.
      e.g. `.01` and `0.001` is not taken as a valid value, but `0.01` is. +
      + ## Command Summary (Alphabetical Order) | **Command** | **Format & Examples** | From 4dcbffcb10c81bc60833229dc9195442d36e1430 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sun, 9 Apr 2023 18:10:06 +0800 Subject: [PATCH 358/364] Add page break to neaten make Developer Guide pdf compatible --- docs/DeveloperGuide.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8c8aaec453..bf19a2961e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -95,6 +95,8 @@ The following activity diagram summarises what happens when a user executes edit
      ![edit income activity diagram](images/EditIncomeCommand_activity_diagram.png)
      Note: edit expense command produces the same activity diagram. +
      + **Design Considerations**
      The following are the design alternatives we considered for edit income/expense command: @@ -372,6 +374,8 @@ Given below are instructions to test the app manually. 2. Test case: `balance`
      Expected: The total expense, total income, current balance and current target will be shown. Should the current balance or equal to the current target, it will prompt a good job message, otherwise it will prompt a message that balance has not reached target. +
      + ### Finding income/expense 1. Finding income/expense From ff7fd69621aaefdbce3ecfe29d1200efffdc8985 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Sun, 9 Apr 2023 18:13:51 +0800 Subject: [PATCH 359/364] Update rayleigh47.md --- docs/team/rayleigh47.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/team/rayleigh47.md b/docs/team/rayleigh47.md index ad9e0fd330..4dd770256f 100644 --- a/docs/team/rayleigh47.md +++ b/docs/team/rayleigh47.md @@ -14,6 +14,7 @@ Given below are my contributions to the project. #### Project management: * Setting up of GitHub team organisation and repository +
      #### Enhancements Implemented: * Added methods to parser to parse fields for From 8fc5f985c9ebdc3f19e49c5f5bfa8ad394733667 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Sun, 9 Apr 2023 18:23:45 +0800 Subject: [PATCH 360/364] page break --- [CS2113-T12-1][ChChing].jar | Bin 349224 -> 348682 bytes docs/README.md | 2 ++ docs/images/Ui.png | Bin 0 -> 709681 bytes docs/team/hyperbola-bear.md | 6 +++++- 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/images/Ui.png diff --git a/[CS2113-T12-1][ChChing].jar b/[CS2113-T12-1][ChChing].jar index cabf6012a2418044544f7231b451fcc9d3a0fd8e..7aee1a301b97ebc68faf78bac38b3439ff6a9753 100644 GIT binary patch delta 36606 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 R5qQjws7_fi3R;lj{{T#FpP2vv delta 37288 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 diff --git a/docs/README.md b/docs/README.md index 639095019a..b8165a49a2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,6 +3,8 @@ ChChing is a Command Line Interface (CLI) desktop app for tracking spending and managing finances, with currency conversion capabilities. If you are someone who needs a simple interface to get a better hold of your finances, this app is for you! +![Ui](images/Ui.png) + Useful links: * [User Guide](UserGuide.md) * [Developer Guide](DeveloperGuide.md) diff --git a/docs/images/Ui.png b/docs/images/Ui.png new file mode 100644 index 0000000000000000000000000000000000000000..4f72a734c51ecc6dc9a8f13360e45c5c4b45ed56 GIT binary patch literal 709681 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
      vG|J0Pcw6havSG0#!X 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%0DwPO-U&iWY3blByxDcco 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�wa;Xz4$`W zv#PGNps0yiVpgfj*>tsMM>zuL-=`Qi!4&;n&bdhas+6j91!{7zFkLAV?V$KXR$&g99H{e0FOC# zVE$-9*IGfx53p@9YWA!_ig)>(i>0pAlq=udLf+(!WsVBe$Pn}7Ci&UZJfyqu)OR7B zq|0Df^yx%CyS*|wHYnz5vh-pZ>;hN`>i%(TDZKTP5l<1;3fTnQ=0Yr&plGw0G|z4s zW7VPPUakBXPo-`d>ViG8;Fy{f_XCXKi5p&cNj17;iRK2mk+R+6o2!hWh>d0wvJd$h z1vzlI)!88uD9**+n0Gdm=|imX66Puczu_%7bC6pzuLPA<1gw z3;F3%;?2U@`PIBR>A?73jL*gY@fn_f1)qP%AB2B95uC_>0@C|`bVUDL1VB@pL7`~0jt7(XqOyMvt7I= zQw^s@AIVHXN8aEl2))G_6Ti4qP9YyxpB*d`SJpD--bO`5{bL^t;f;4qaCGc9S-q~2 zPnqJ~4mXZ3mIX4Zf24Bw!xGP&%26W8-xo3FFc?5BOwHjc zBUP+zPIW%LmtGT$E*|hJu}FsQ1Z#`mBsUWgh~aOOsv0}eBHb!A03mOdRD&^-uqs8R zL5~Alm5LF?IRD$WU4_gcAzZ)VT~szZ2<&jCwGH{kcqqr6PQS#XUY7KD$VsPrFx3wy zmL%{nl-*_845Y<5X{clX)AyTQ{#wiY6p5z*i=)_=TyWql9tBH5k44I$gbb%zs%Z;J zo4*V5WUurQ>6Nu7up;D{1*hgE)5Qnb8=pieDkn%Qg;VrdbMBbS6)!&28^^fT>RP)Y`Gjje8jl#v_nWd95E52Lv$ZnI|M!2Ib>mWjkd zx2kna{Kw4%UFk+SD8!EG-Nw4HR1uaksW7JuTR)=J82`l#*c%u~xarqv1HQ2?r5E{W%LHu@rZDsdO}^`9?7# zzS>i3&C3njcfrNjK@O>Ca#T^Sxt^%iJxUq6$fp_P^+o!UDj<4KJMlNNBq^!2&}n<~ z3r|BkSTZGlj!B&Qz0T^(07g7q@s#BeN(ok! zoT;QljBH}R(7W~OmREJkBi$f(nu_4D#mt@qgqe25eSspKig zIp<=G(%HbM>^f#xVm!nDoUN=DtPd37aWtg`=$tXx=5IS&f%u&s7Y6I3#Dt&Q-DYC? z-1K?#ZvP0LXTw2KXS6UJ%!ZqeS{gJHcY?+cF)0(RdFS}ntTdUsrm>qh0Mu(jW1^si&D z796~`-Sngg2*q>RDnDgtaUQk zzk5-Vqr%GIB@u@>7S|uJF(sw+x@Hn;%Mxf<&|EE&ZRCzFV{!H<{}YAouM1fA7}?<~ z3zw{m%$~Qh#&kO$PO52r7qQho8aThyeq8w`?uPRTY5hdG!I-GPe6LE8M)9d;nYqUq{7(MmhdBL1kM%z1oc$Geg(R95f+=?7yq22VWSU6Pf0Jpo2) zrpEim)agtT&TDv?)x7WX_MU(5%xIc~#U&n}p31qT5I-?F7Tc~`PF)CPw(d{nwvwsW z{Dy#P5T{HH4no=EPEddbyBlTZn2)@w8UsG{(wdA!pX*<>QJe}#os+l;+2AuYVb}Q5 zIMk`_(*=3U&mjGyG&-D)lkTf&#Lwyl(6)gazEC3NlWtOsi_il@i1 zCEn(+N`cf2JN}nV%;XFp*_3SkrT=rZZ274-YSPSoLH0EE=cfyjw`IOX&fe){DUr+? z{XK5Dw(ISe7qY?_yC?FW%Jg~P);2f0J{#z?e0xB4S=X!i_7ubE^{v9|v{dx($viwE zSDE)gLBTK0$~E8f7eD=n-k&31`M>(MyRRzdF$KdrdO%HPtEED9uKA-GBdy&hh6o2 z=Xm1G*KKUXZ^h;DdM_w!{6t&e?U!hDroPJ*lg)zd(!<4Pg#H-f#p=tw?^i>Z+coJL zW)DdYBm#8@INOXgm`{(F+CNuV_y3C1Dr5?NJ73HZtu)Y>=6{<{7-?*KxlboPZX^

      5vWo$JQ_@7>poYr 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

      DZ9~rP%G6Qu4{E#e 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

      cuDWzN^If&FL-2Yrv(K)uu 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 z zcPjlPSO^NFltMxTG{8|prBLqF>tm)gaBYh)#cZ9Nw|dvninX_1b}yX_ z@?v-6(cQoNrexE;5XU^eqx|^(ZLekm$8caW;UgAe<_g9YA&%#1z#`b)cbcNK`aBl#i{>w{tZDBbtoSKKf^kA!iWwAf#Ss*7ck2H@u!CV%r8I36K>|TQF%c|9ynG0KGWBy$L>C zv={O@cTIz)<~^}t--Yones`ts#P0R;i~i=aq#PrH9WH#K2_=%6#1&ZZ%(VYMb!>*; zsl0rAlZ)&a;uuknOg|L)tEDieuy@H7aV^0qV$$*%m2^%fc8< znA~KHX{{X>B20x4z_mFBfuuAl-L&?xF_(G^R~_k|9KCeDp=Ydj_q`rrQR#BQbQHyO zB4Kf@iQ%DG1SdA09qB%FFB5o93?)TeQs(oN>ljjyXcT1qq=Q|Nm6l~Bg^YTNMsu|n zFZN1v>^W&xgmFwTE;u!X!<=k7!*dH`A<1|w>INJT9Kek2&DOcxjOzfJu9r@57K;$X zVdw*iLnMSn^8=g)jvM+(6JVDBt*8qfK(LPlr$RBVBu9+Kkc%l&l5p+{LKWF?e7Ju9 z>nT5AD8dygKuIBF49GY!P*LC#mqk!MLzr-nD&}EJa6cx65rc7GAZkGoP)t^w7->Je zEXjlk44d*0Nmop}MZEWN<=8)tcQ>|7_II}rjkT8lYEftwKwo-vW-R6j$^^C`@nkw+ z1VGayZixzAU{VGdBNpKSOJL%7DioGwI+$r11qF#r78uM!zOMsdv#1m3QV#MA&wKlD zZ{JYY-rE6{e%vG&U@I*Y;1L8}PE$7VJX%nI$+{Dr?Ry_(mJJ24Rh(&R$3&uJ#lDv2 zp_YmV(nO#@F`I|TFbj%xI)mCPf-pwi#xL%Rtibb5k_#5@<0B1H~0Z zuI)f7r1A)`sn%L51rc-sRd@J`Ql&3ksq$An{cq!2+&eTzNdM^9y2$M9Q`lPPzfXGJNB3U0Zki zzK4rap5xd!q&VVmk`OqCL(U-dh^7Sr<}scWGDZNzafetb#wAI(7;wrU##DtF-;B+5 zI16wQg391R2ueJ_0mX5}j2QH62y~F=SVyXDy*_1n4WR(Pwr}hY7YFM51}2BvJG$DBKBFNpEVI;4=i)pH5f%`e zjAXR1O_$R3XNJ4BE-iw7K6X56x*#p2nWSEUGL=g`oF*aU#4iAIr0}OJcWPSv`UTeP z95?g$(NlE|V_#nG8XG*l5@FldR(|gFsrWPH0~aT{cHi$)<}!?_fq|Bay3oe1)PmUn zW4P)_Pw&{LW5Z4LBcFcRz4sZd8FPH7AvaN=2u?(ik>&yM3P8lefxs*bXd!S3Cax?h z1*V(yId!2B&K#Bs>9uYwRr1SSb#3iU7rRIMC#qIbok%!&Gp*#~mFGuBuMG4L{=TdB zB^Wv~s=P<`clQsBPY$;L!Nc$Z$j7;Dz-`VizbqW&hWyMlDbn zRU(BDApFh`&W~TL{*_yhue~7d6BLcVb8MjDy}NNLB_u|X0>YA*8lluY$RcYFAo#KJ z!O^3uAZ5t01*byMx%shlI?I^QmTM6Xs8iz1H+Z2Ja}9|yI6)G^a`Q0-gdk3t;GSY! zLWg08FpMw-5M#-?CnyAj5TX<#+{Tb|+u-p~5mtE3HTaf=+2{5T4ve;x-$^0WuJ$

      SXizQ|E@}m)|{l=D;_%xx85Nv+~(3 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
      #### Contributions to the UG: From 2e87b84f8ef8c4649e0423aabba029a6df0adf35 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:44:30 +0800 Subject: [PATCH 361/364] Update UserGuide.md --- docs/UserGuide.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index eb5eaab111..ac7b27cd9b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -14,12 +14,13 @@ ChChing is a Command Line Interface (CLI) desktop app for tracking spending and 1. Ensure that you have Java 11 or above installed. 2. Download the latest version of `ChChing` from [here](https://github.com/AY2223S2-CS2113-T12-1/tp/releases). -3. Copy downloaded `[CS2113-T12-1][ChChing].jar` file to the desired home folder of choice. +3. Copy downloaded `CS2113-T12-1.ChChing.jar` file to the desired home folder of choice. 4. Open a command terminal and `cd` into the folder mentioned in step 3. 5. Type in the following to run the application: ``` -java -jar [CS2113-T12-1][ChChing].jar +java -jar CS2113-T12-1.ChChing.jar + ``` 6. If successful, the following greetings should appear: From d95cbceb8d6934f5c9d8694325b2347d9036af69 Mon Sep 17 00:00:00 2001 From: Yan Ming <86197932+Rayleigh47@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:44:59 +0800 Subject: [PATCH 362/364] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index bf19a2961e..6fc6dec9c7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -276,7 +276,7 @@ Given below are instructions to test the app manually. 1. Initial launch 1. Download the jar file and copy into an empty folder. - 2. Open a command prompt in the folder and run the command `java -jar [CS2113-T12-1][ChChing].jar`. ChChing should start up. + 2. Open a command prompt in the folder and run the command `java -jar CS2113-T12-1.ChChing.jar`. ChChing should start up. 2. Shutting down 1. Type `exit` into the command prompt and press enter. ChChing should shut down and update the save file accordingly. From b30685840d2caa2f84d44e613b0f052dd738404b Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Mon, 10 Apr 2023 15:46:10 +0800 Subject: [PATCH 363/364] category find --- [CS2113-T12-1][ChChing].jar | Bin 348682 -> 348776 bytes .../java/chching/command/FindCommand.java | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/[CS2113-T12-1][ChChing].jar b/[CS2113-T12-1][ChChing].jar index 7aee1a301b97ebc68faf78bac38b3439ff6a9753..67aef5624ab0da5fb9ccc04bfaa1dd7bad5e8a9e 100644 GIT binary patch delta 16253 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 Dy9*8# delta 16090 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 Date: Mon, 10 Apr 2023 15:50:10 +0800 Subject: [PATCH 364/364] Update PPP --- docs/team/avielcx.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/team/avielcx.md b/docs/team/avielcx.md index 57986e2056..2f34672f92 100644 --- a/docs/team/avielcx.md +++ b/docs/team/avielcx.md @@ -27,9 +27,9 @@ Given below are my contributions to the project. * Created a ShowTarget feature which allow users to see the target they have set. * Created a ClearTarget feature which allow users to clear the target they have set to the default value * Created tests for `AddIncomeCommand`, `AddExpenseCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `BalanceCommand`, `ShowTargetCommand`, `AddTargetCommand`, `ClearTargetCommand`, -`IncomeTest`, `ExpenseTest`, `IncomeListTest`, `ExpenseListTest`, `ParserTest`, `ExitTest`. -* Created logging for `ChChing`, `ChChingException`, `UI`,`Parser`, `TargetParser`, `LiveCurrencyAPI`, `ParameterStringBuilder`. -* Contributed to logging for `Storage`. +`Income`, `Expense`, `IncomeList`, `ExpenseList`, `Parser`, `Exit` classes. +* Created logging for `ChChing`, `ChChingException`, `UI`,`Parser`, `TargetParser`, `LiveCurrencyAPI`, `ParameterStringBuilder` classes. +* Contributed to logging for `Storage` class.

      j(oNIPqZ??{_QlZ<*WJ(yy$GgP;|kBo!bH2 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 z z#gIi{6Rstt)F`Ws^FEc7DZvQ~qo@gmm6S+DOGR4$>a|r7Pit&ogaVZco$=spqLrsu zCX`!ml#tFP3`vq?G!{aJlt`sHU<{B^;R8aMh(U!)8Ix*|90+5&nqU}9E+nSrqO;Ty zL=**5N^OlYnsFJ1vEV8U%Tj1cW7H9%q(n+7!?5hp5-9jI(Z(^Ww6+iug9&GZh5_Y7 zS}K7s#w3E(&X^jCvL;e`mWc{cQ-olt$`BHr7{X$UkQf9|0ik)d;!_92ar!S!<)q!n za&Rf3R~Ef6m=P^1i3~5lJhHh?eI88?;=~xmCHvIFiwKEQDW!;{iRMCTr2r&%d20~H zS~64yjMa`)7KULcfC6gCwBm#@gWhr}!ZImG%~Ft5rGm%GXh0oB5vNRn=3D|OkVYt- zS|@Tt1R6Odj?p>@7?CQbO@g8fd9kW1Bo^8T&Z*!Q6qhVS?}aq2zJ+p9jG7r^Qp*2u zjgXQNiV|o{I3t290*sc+{)(?%lQlL6u@an0h$WSVTceNx7r;?*3Lx;)AE%7bm@&ox znehO?MXZb@l5&KI#8RTsX&4bEcpQfcWtQX!mJ8sLX$7F9aaw6BIT%2rk@Jg2DCd<{ zo(s(wV?2@~HWs{X;ot>BAwvm~1!FWyMWrytR2UC6I<0&h1)QMNCJ0Ihv`{P?Um;K` z1ZX>EU6V$k2uLioVVu*Lloh6+3sS^cTKla3ljU^+B}P$*Kxs;dGD%u4Pf2aNKtfmu z00y`uf-@zxVxX;eghT?U(pI61DY0qBxI~~*Fd>9>!dMVo2}#m4HO3&K(pG}fl7&Gj z>$v*bHVn!fbb`_tOaPfeNhy_rFdAy*jZGO+R3>q`hL9qs5o(T%5kfhFFp^qSpjpIY zDP0$8iioD&&GwDUnNY(a#aBv?xI# zQ%nhBn3lpTmRO+`x3(TJ8Idvo2p(INDwzb>B&1PLWxPydp$V5LvMiA(P#I1Th%-7D z0#I=xq*4kbSBzN{3MB)S)?REsb(+Ru1kx9xQW-;vSjp44M6^m6;X)MJS}TI23M@bX zLUUz-Q7feZgeU+;Q8}SLQ)`|kE+875%Ek{yUE0K&4MAf8HFk?M<02)?& z4vcbAv{Ea<6>?4)ixr?_N^po3a><3#LTeNZL1+MwTvU@91I-OX2{HmHm_n(*hAbi! z&}AVNAf!5{yw%R=B;s)-!zdyE;GN^H#=2}|^l*YJOThN z6a%S@CM2>(Dvk)2OTy6ry3{9W;+TjdK}aaPw@k!DYQ>4*vG+c@czZ-=yaHs55Ecr} z!AhZ}%Tk{xqck$m3Q!9QOd0K69`TSdk?N|HG8U0VrI-MV&LtXE;wwq||FQR8QFhly zzHb{WkUH=EPrp=Ezw{3~b&y(_WITAVJ!6~z8ygH5aKK<2Y=QxiC9*`45DF+~p{!Ob zwp!|z)JjM~1RLx*Gjqx-Scu^?#q49oO@rc9(bEIi(30_zt#Tl|N2zbx4va1 zSDYb`kjn75BXxxo#3`^zih}!;;yCm+SI7leAwenxorZCMAj{=W?`pN0Qz$ifhKfv> zO6AE#D#EPd^aPj3LM0@0TJ)+!B1r8NSfvoOw$6A|kgzh6M~q1&2sVlWYrOzVL`o)v zDs|pCtq=gUb*Kr9RmKYMD&7^w3S%5HQ5>NwoVGd@LPV5+m5!8F5Y zO=7d$Ya-77{l3iquV91gka4FgfH4^@r8GrXUIQRhDon{}1&GS|LIE?#6_D22Tc>0! zm^7FtNd%ArDQB!h3sMm(hbbybpaVfN#sENRClzLv916~2&U7haCbI zN=TP#gFFFAoLfJkUdtGloFqq~lmdyF$y1jpAr&w(+F39lgit`JeQJy|n0(QE#)=h6 z*;;0;O|ychX$3%0Y)wW+0f35yjLXiV;F!7$jJ3cW0D`k7t2jp}z+4nPODaw=tr#qE z1;|MX=3^sMZjIH>7za9$NeoOmkDx4(;mTx^qPQff+Q<}06sFfAAu4SXrIeON6DT06 z=**-jL&oAHi45}8pq8Y}MG?)`s;LwlEk$9ZeU%&_mt+-6M07fLXh9_k5<;b9?6qM= zOR^Thc_j&*Eh5e|*9KImLkL2Nj)(}kLQr57kOHH$lZFx%OUYB62_>~gtr1aMooX~H zky=^>lweX=Pl*-IqDX84w$_6}5|K73V{wvj(w@ssi{O0*!o)0z7$`_U766nx;cP)D zNN6QMAt)n3M}*$mI-(L91zErf4LjXX|e~ENo#(z|;u#^DOT7BWAFBAt-sG*~?MM}_FMybzO&NNHD=)`F2T;8Ezf5X4iLWu`##BoLBBsKhwbMwLWltdF7u zBucKdwp=pnK&qIuRdH;sB`yJViOUL*CvH*ZX=V&bl@Nh84$zVIO6riLB|*NZ3Lo+^ zNR_2d$XGxK$gTC(dISr?NeSM2>kXFzQA?FLPgc9sSRpJEi9)HAx=^Nvk?<93WKP<0 zihN4m)sSnWQJF7n3d1=kB5SoVgd{EqRhdWtq>`LK3nrOJfP_#SfNYUDOp#L@hf>7W z5D+pEkwGarB!+}0m0MdkX%Y)*kQ3!x1>PCw9K?kqB~1cAQYC~LYLbM;=Ee%acr`VN zVx1wN5unpplGNiY6%v>xAz3Nqxr#0&%7v?z!$1j%sE`B#w}y-{h#DkHLZ@pA5+VYo zyjOr)2xh@ZMySXdQc6Whn5ak@Fc>Mur7RH{LeEtc3n>XDDAK9cTF5vGIZqgpFvdku zi)nnlf=$?&>nzK44upn5SQ2Ep)hUZmQLHsus#@!fA;#LBt|1455u!qng2@Y$cTnPj zqp-CW066EUh@^_N@)8At!xWqoj617SMM8)KxF%^dg2mKZAVo%#(SRCJqax%WW1$cb ztkEd|Ip>NZlPZyza1jBJcZG2_Q85!7!8()iged{2z+0E+6>Bn32Js7{ur`?@rlb}^ za4rRNpb~39DU?$Bv|?-ygos*l9z=0TBY9V#0wk`r2DA*gLa^Fd5??f* z#*hKg61M|WF4iDX#1YR_z)Hp#ue;+ocD_tfDOMrPoX-@3R2W8_anJ<7LW>u7kVs9I zI-Qgy)pVu`o0U~ym6j?&QPSuDzyTRki8bQ_5j9ehnOs?&`AQIs^F3EtK9-1-)IO7% zKypDS7zc)7MWtcTL8;Ld&tw@vI>?Q>=>IMjTnik}Bki12Qh9LJ3L=rWIE#`V#5BjQ^l0Y^ji3X(VGDf;GlyjZ7q2y`C!I zEJ!f1NEb%N1O*X!?-M4ZLSqbPu~s~{=uiqJ3yso%v_(yOCPOB5sufe9$s1$h3k$cX z2?Z#VdRxsLk3#RQLasCk@KSO_6kuJ#^Bf`-b-7BXBttr85mVCHLJBPuN8%)z1t&fWEXq8O7O(i3)f(!nLN|TT}QL%uy@M)5Cq?rlI!aE{BLY1beRLCGU zX+|n1k)RP=rADTy6tT7(6iH_23u`*H1%;A`3|Yw$q;@t}Qd?7DA~6n0TSML%FL-2~ zl)`GEfI{n?r!wVUTwIM@GY3s7F;L@Zy)%Y; zgB&1ABIZ*7orW?s4v|ByEFe!67_3BEXd%*kQWTBLYxR)0RapihVj)dJ9*K-m)@sK= zG2qS_G=eyAOdzYpfv8l|D3*l=B(BM$CM2QJS#7kDNFGrc=rUFbh?O8?fwV`knI*+F z02!x^&5;aXY&4omZN{QaOJ1DXhovz*$&HKRPM=n?OvHpJ%ekqA(t(bQvO>u$t(D5n z+Et}sX@-HYNY0@ZOj_%mO96n0$Y`M?YU0Wi2%N}*msVJvYMTfN9aMH!Tb*)10u55f z5&^X!$GHR^dkw}IE|fyZGOtaVBwQ&$$dybGHD_SGL-IgEK>}PjbVjYuw_Z$w}rkxGTuY9VZbiP0#PaaxK@C}}K5 z=0J0;oFY~jElHMR;n0D_KyXyZ1rlhEAW0ZPr=23WC^`tR*5pQXs;==b&RH^l)^)vU z8=)d$jB&A$;6ozALT9W{U^Gb}6~q7}NZT+`CXG>%F-9b)lmHJ(J4?dpgh?&X7>x*0 zDP^rCZAn|sxgkwbp|o6zG}A&!V;nM3XaI>!a1M%~u!cypm?L9eIVChIt}O^>(HN&> zjMi9BOeEH&&REVutBqBe(nMMap^EC{C}x?-H9BR$7#Ayrf~O$0MgRbb%I9DF{XiLL z)D&tZ<-a@l5|LC%o*5;8DA$>fWJ2gO15SA++Nu-&?y9)c0Ygy2Sf2=! znu}^!wMIh6CCeyRJ^?PcOO2Fu-KBvkl%!LIpipX)5>aAoRVPuo&DAG>GMPTzkF)=RRPq&O1B=78MF$VgJiZJ{)H5?U#&5JW2Kl#v09B|5ZZ&{-{bV!hKo zWgM(_8tF@<`!fE6qOeYDJnrb}u3lEg9C<}2O`X_Nt?Ss-GuA3E(>`z5A}V#}wi4-! zc7sS5Qi*Uyot4V2!F^c6@gnI=T#^dina1@*2YG8lUnSWXWvvmRtxu9I?P=~y-li!C zm822llDV{3Qpqxxd6qDdx{RsRJEI{}X_zvTfsIvXp4rGfzV_tt)4Lbk;H5A;6*aCR zYjQ4GCC%cvUGUK937zVzT|L(|H#esR6hZ_%NmECdrRJ&i=g$lsc>HDawTrZ3b-+4oSItWnAXrinch9^(`nNL&X5SnUD&iT5q##rkgRKd7sr6`O z98lUzMhQ+;O@gE**%L&}_b8tTlKQD_|8!vCH%RxP?npTJzQV?d2IOPfbZ^bwHvhoj zmWQ%tIo6xHMsnO!C_)jZn2CyI<=7dY<~-so^_8T(;)}KbDzfSXXbT?!Xg1`03twz z5(P&EacZ@@pbtRIiXtf9_xR!VfYhc+cS z0fv-TJ&O}1Xq=-iO~9$-Fs-;0qB1&_+DbX51bAKR5Ou6r-8Les^s=u;tYUK~SqW^a zQV&X0FdGZD-W`q`SITuxM5(t*m6gw2Vi=7l(`3^=nS{0`+FHw*wrT1*NKN-~xif=Y zUF>9u7D8&SEeW2O%p&===BQe)6eN|P)R8&Nri~UW(6dmm?Cz^ z!u^AzL;KEr_R*$?AdI-Pg_qK$Bs7R963`%pDhD0K0Sd@Ux+O=4iUhGpfV0&!1s*b^ zdb9;46D5EsK(Godk|34Bh2skUU(Z`3I0TERx-o3)D8fuk?CEP6+m!W8)!ayoV&Qtg zXl{CIaA^=suT2aE6LC;O)^2sxlugt~D}6i|!zj&_&=EA}fh&RT%{wn^YSg~YMOkYb z*p_NCA+T+>+#OlokQFK-rF~NLwPI$>3A#Ppy6Oq9tV#LVdiiq>9A`M4)mbSZm@NTsaA2tNHjOYBF7Y(NdC1w#9L85DYNhLy_ zSEWL)#-S;KlA7G3o5lp)HLbXg64#xJ%L6ywa8GGRqn3!vE0imUike6yc6(%MqE+ou zI>az@D(V2y;MJgqr-{OV*i^_$0!>Cdie+F-J;6>y=VK#`R$QP7rPDGohGZ~S)Te-m zT&zXK3Y9o+N&u5n**UIO>vE=>rDNN4tpTVL!=*}O5|guEqS%-5pIs}gfuvwThc&8j z`m4O}`adk#zH|NIb06$Edvy1VyLywRCZ{SzmIFF|aX(Ryf@PJ5R}Y^3@Lz{NJaYWR z?n6Vz*50qV4%nn_;8;{Tl_&=hQ&4xACLvvWq*aDB*%2To&=pq8>z>EL`7}~2>yT2| zl%()H5Il)WGHu-$454Q&pL{_28tDR}lDY#^%$t-W&w&eZ&+h^RJc4K^bP^;ee&dACb+BJWQ*+tzE57;7C+2QCdEosw?wK^6Jg{=e7$ZQhP3pDr4V%za zzg)KY@W9COpK~Xny)kFU(X%5Po|sT&h>S7NIf9K`y&{sr>2g_k+tcT}c+}cSUZsm%H0)dWzbr#7QcG)#EDZohIgGjwfEhpuDjB9Bud-Hw-;_daq94%!-tLy z9GvqHuA`|b{riX4>^;&yG<@pt$Uy(h?+9pWshBwn1`eG0%dtcKCqDmp!6W{g4f|Eo zo5(hoI8e4j@|5UeC~U2^)>`d^;;1Dga?;f6XRX_}WzMa=w!%~Ap+%}GkFVOg_?_Dt z^=eP*auqk1l1OOZbCnAduDU1q{P*t-99;EqVXY|)Myx&NEG+p-w*n?>x^} zv9(?))IwxwH8*KeZciY{vciH7F&1E*t!ju-$kcgj1s5p&g{SL(eMlfBs3X)tQ!?d- zZ#_7F%Z|f4-uX#Sg(M5dj!h@rwPA3_y1$%1HFRpjirL?s#F{P{SDEzd^@sj4^1<2j z2S4Aq@x=*6^QA%ORn>_#JE0X4?|m0m5@q?gVA55OFB|ILz4!gopZ)8xg z$MT1>R71?8vVCIh#@*Yly>9M;^=sDt2@CS=Q-8XA-|l@I=U)B%+GBq{`|;7?!K0%G z_MaMf@9}R;DUB_cgeuZB4H-AFH;N0vWLN#(dHYX(cyj3Qrym?YeeBr5_n*_PUm4fg z_rifapPm2nxx)uH?_763X(>9}tKIi3U$x`#*+Zw!o_l}wt5ecg+b*p!h&qWtYc09p zTuz?;jb~qc@6>^zW2cS`?dxAW=Z3zlrKu^^w`1WFOG+L2e)5)X-EIo_qt|p{^aau=LQcC96faS^tnCr zANty)u}!UES2i8ffEfj7gRp&k&2Ye`s4*eG`~9N_cCUZ!XI)jOO#Hh$7A)L(0kAys=owO z*9)7^Z5=xO*T0=Ub!Pv@SyxQJuXMKNSaDK`ao^xVfE z9v^!D<-hm5sVVg1uln8m9iyAq&G|{A#~5QIkVof9BXRn&oBL(_XGh_L1t#rE(ECan zhmr01#~0>rod2h9SGdF9zkd4srq_R5bb+(hw($;o@y%bxm=VU!8Q6b%~b| z&u%$_>g#U&_#B*;mf2?RtWKm(|SLLrq> z5>#%BRPq4Dxc0DU^!84_;;{u=cg?%gTAvkpPXSF$?Y?{B1mC7YLM>a$c2d36)LM3Z zSGlBCuEJGyt;V&ql^KVud)hTmF4?kn_D?4iK5^7AK{>ia6&Ww7O5HT7$+$~9Kw0g^ zmpg1xo!k+tiH_<{gh^*)x-s{8XWe#VSqcc-RBKzMF(u1zth{mdzR{x#f7{K!qG5br z_cxy1F!&H!s}3A~WiYVMuI{s z$)m)@Ggj{FUp-?&k2Q3~jqhwaG_-BOz1Q@HI=t*FdCw$o%c9p>QNFaPR7~mVyZW(3 zYx@`fak`ad*_`)4XPL@D;wouYFY=(ZDzQX$LInU;>68pQ5+s#U3dlI?y_F)CN$5xs zk&s$YDw48wg$iO>Q09cRSO4LyjmP)BQpFX$m zotv!+!VZTvtv0lANy5u9Cxe~I82N|Y2S)}6*F91MS?h$SmhCyPePrh>7{gnu))h8Y zCTX)(NwUJiAS?Q;Z64QNqq?gb@WEF^HP5xE86s!Lbd)0HrKopxfBW_R6L0-6OUAqJ z%-Gw1ddKtMD(mrAJvn>x2Z!df#`s?Q;F9e-HqU$Xif`Zf)PfDK-7|htDw8L-j*M7fqR;nb4=&DQY%(ve>bbQrIHw3=ON$8%uNXXk@gwyCPXMs@C zVuXT|mT1$MqfpZMiZz6&kpz{V0TwSQW)?fB+5daHIKzyH0FxRMB-cuB8WT6*j3Ej@abRoKgB4ol9aAz&aT4;mzdxW%T9c< z`!$zD)9#wT{?vx$_kDfhnBTuQd|=a)lX8}*>+XGb^RA6cUc0AHfW>YFjH{AOQCm(@8w%NuIjsa=DZz$-u1@C z^7%zkSaWmF`lBBYt-c-09ZB7F#%;9+2R=OB{;fAo|LyGIfma@%HhoM}6MKE{sogIG zk8c>*Kli2H$=)`4?|6OV&K;YV+&xt~(q#vvLz~)4mK#1U7$X`#n*G+`?)`JOe)@6$ zl3TfGxx6V6mAu;9K*yNQBt5nM_}&GN)Olm#?>3C=8(j3{*Xw$0Vj9(Y*wn7C_|=NT z!~5pH(iJ9`74=#WOF!`kuWjAB`Zqn^`|%GR+H>&rH*e2VdDp^?2L?C%w&7E!A6~cT z`he>6)#_|2(?pr&cHB4#T8S96%al#FxT`FXKNw3KtG!5=yd^S6G~Q zQ=dF(x@v90g1)L=*m-7X@e}nTZoXW^HF7e)C<u8=f?U`A7x1Koq(dh7rPuH%j7nihmwscMX?Sh>L2L=aDpFiKf=H=gC(dA>; zq`Gf?=8fTz!4J=T^6>{FTi^V{^r_Q+_4d|d%Ppy6T+3qP<|M=;bhlh@z{QTU`g^%ehn^^4$E-!Um{m1#+)*bzH?!efK#nA|w$>HaIQ`H6^Z)qEzWuw8pF4SQ z*XmbeXgvJp`h!Oge)7>@cFldM-d$)LiKMK%{&;YI|L)OaM-P0kY4hScukp}&?ZUlB zUi-z&{d-p*KmXU`LjzA-U5&?dlx5ugSpSjTGjAN6+%>8ikdi25HYRx=!BU(51yR=Z`(G^>0kDUN$O9p z+x*C5{eM3E(%%JBZ+K|M@-_QUo;@@A*@^yzKdi*Qd&1+dtysD2w=cZ2a?{D{G(v~F2SL0_ko!WbFMo;*Y#}1$U{H-4}b#=5} zPG7rs{q}u(-n!w^OSA4N5Vv+DzGj|Yb#l*|-;r#nu3dVg~0=eR7O0Op-*!Yhk?xO%`Xp~Iq~iffYP*TMCI|#hc?go2T{Vl z`v*o34;&ucef->L|Egb37rZ_0CTkVmvS81-ZLekqJ9*qY@y@qbtey9#tH#$-ba2~i zdrxnl6}N^s{pV}9?;1WaJo>?3w=H|_@26sW%VpjbB954dFq2+YC^bsEP@%Fmb>3NR z5wNoZ!66AG{_g?_)F^r}`qooRU;EvSlYcgA&yJn1{4#GOR@HBLdC%FQWw&%zg0W3- z?aw#tI6tzMZh7Xwfdi|4*{w^hP3GEPtlPF{=WD-Y&U(|;s3ozoSx&NCiu?49v-X`n zv+j;+czILj#4EqOZ09FOH&t(&_x}08MR#<|q>0Bj{A}sQkB8pAy{Ls9tqPdYDM{s= z0n`^mVUP$)Fzc&6OQ|HV5zB!q{3;r30j&isl9dhqmN$w9{BG+w_1qW4R@@?deK&tya0|?VX2S{uxuP%hRX!kA=##(_-ZvFVg?uTXOy~yJZ`J)B<&hL2T+Y{g0wtMYc zzv^w+r1p(BHtyQ--tSV&Z+vO{uDuJs>BDlVXVQdvT8@K+edEP#>-TP$`Sa@v9(FR} zS#zAImv?>qmyd>)%za|=#A|-OaNyL)JKt-&q(${~XO+8`o!Pr~M&T%cyx#SzbszrQ z@#RmxanIL#CilFs{mj6N50oXFGGXe>RXf(cdUtQ5%9uzg@PhHQH_4{|e8JX}>u2VG zaTvMY+gI;AzIxt+neH^|`)_X_IlJ}Ar2U4~=l<>7ws&XU^_?jbzyIpC?R#IngP^1| zAu5ezb?N|o(qWP|lwoQt=e$itCCk8r$sKwNVM0(+X&-`xpsc&cXA`@gUb21b++R4K z8Pd6JzijN+)()Os^gK7L!)BFlEgn6y?n&O#{M7{OldrsY-jai>pOHz}UTTVJlO~S8 z^11mtSI)U3ulHmX>v)2?%+ub$<9+is9a%NY_>xEpQ@LgJz?qG6eu-7=?)vWh9f!_t zoKqJ+dh_tH&kwD8=x0~=P5j}j>$VQQdV5c!Flq6}^@k2E`XR_3jM}NHyw8%zG3*jT z2><-f^M_u06m$RM)$iI-+Ow?>O*f_=c(0aT37SV=5{`AdgW^>xP%w?zH?~c{Rb+l6iGv06osAf zajcD$Qm|mgl2b>wK4yijHXNAFe|Y1_(Ot`bH~nXi&3xyfNemTZ|FHPvxlK>qDZDCl z~ACXX%{29Cd!%Tl@NtEq<^;sEmwBp&|pQm9z>`Qysyu zjvxp^%oF2~OzN_7*g;rF7>9X1gLquX8c%N?9$fyNGHU4Qdw2HHHGe+$QU4qM%B*6W zTAF^ha`^brf}3oX8&i-D;|N6LC`Lpkb!Mls8Lu8+@bFD*cJ6xM>Ic^^dDP9^dSr0% zy_IkM;i;GIy`f4R8+WbTGqU}yA2UTyZ29DW{>!mdvz{CO_fu|uarf!dvu|gzr{U45 zw$_jZ9I1o_n0i-Rb1BXy=24{6r`|ulW6k4NhQFWlx0C(fLV3BH`n8$QZrgtLZ~yh+ zGqM$orOp7hKuN!(R*lQz#nopH?R_N4@~AYnEz?@$-93L;dUVsHKdjeX)=efx+l9a& zGmPWKP#8%l<+V|O4A5DWNQPH$d}G(4W6N$&-Bmvg&-O7NM`!h`FqZ7oM}L`2eHcTST=BA5?-eTOMaL{?+AM z4y=4>dT$}*H|G!TTRHpJS5|D|8+5_SEw`3qIfxoXU2-AfwgRIliQA+y#dw7D-=z_V zNCI_)s8LL)*K!q)z4_(CCq7znZ)HNDJJ_$*pB-8JkJ0$nM)tLrUO&D0&j&wR-~P~o zzaD%4I|1*gRR3}Is{`9UKKA*V*XoUq_U4>tvQqEtAT;d_pVwa5Ff{PYw_>JhS55fi z+aI1hf8gL+^~loy^U#VPw)1k=wDHf)-h1TJ1H)^duID*MiE$PQqd3u|^+i#boVO%m zj!L8!%SD!(XEvNTzTvldL9$ZxnEd`%jt*~c5f86FxMR!fx6j?VMR3JG9f&A{0;cbiV$|v__T6bRFgavdz zvEt~^*1MB7-U^t>>MN`F?^>KZw)3A(Y`MNXHYs|({=y%(t~>MJJ{!0X;tQ>JZH*8r zj#(Us2~*bhjAOE1zy51~T(o2V^FOk>cx>OtAHV*igf5oPFD#JAdQ|$|x%&fdbJerg%v!Pjl{=?G>6dSResX*H$t9!1n;zhDdN*Z&_Qtte zjt?%ssp#pQgcw)5E7qHUN2QK(xkL0#z9MbzxNXUy(?{Ox@RVO7|{3c6860cUSEgJu^5u`q{dtYxSCDyMNJ& zov+;K>XpLT(m3Kg&%6W`Qd(|njs$-1-QlAf{={5_UQd>yBmS!F>>1zVT>#%*etdLj z!A~-4oF_QJ!y@yDerAQ z)<5f(eA4Z2tUtEz?LSVe$xvavd|7*1)NXru&*|OE?z+y6jl)RfJw?Tnz=xI(9qnI! z`}CsYl9u$Yc{{hSnK`v$0F$_U!AUiCr@_6bKdtmm=n%gyK@fpmSNhGT{sn^LkOw zeOd}csVp?6#wtOXt7?rb=!Bp-dDLD@6d++Z1 z^ZT=^+Gx$RF24Kf?%^%3R2_6zvoI`|Bk|jK;o8LV= zwCF)_=8;VweY|hs9n&Vptr7q3%zX#eJv4FpvkNyL*uUZTzMe(x-Ue|oUQi2&S|ihf zR~}wJaA3h5E@eu6;k7wUlDPAEoqQfYvE=lrfd{ovjAvSx{4+aFo>_AHWlcD(Dq6}| z_9DG|ZvUxmGqXZQW7X5!PVHUzgKpj;ka#Hc#QWzhTlmsHPOo*28OyrA{>rA!{jYvo z`EFytXh3}d@3fML*dE%h-l{cc=+@?Ok!-eQ%yQ zeQ0(6#rNh9`r}f$chY1NCap~!tn%wcyGD0Dmqz-b%_D;w-nxB4 zqZBmN?^?9EfAs^oxvV*uJaG~T6OzkvBgeKX=}eIgqWR!HO;@1ne9bf;aY9kX7Ck{8iGk9#(3?eY3x%t_`-9sB* zsB#(CZ2H}~oAsvFrSS zH>TCAb&9C42D}n6p#i)Y3Jb*@DOAKnB@%%~QZv>cJGJ}2A3L`1z(?ml*u7%(^Z)C! zJt6*a>*$GNgXe~qKQTRQYL(Vy4RznUpMJXIc|D#bQ5wVLZsx$*1B>pirv?)qVj3AM zNN7Ob)zf|Vd;RA|c5c{t;OM@APtLy2%DP`QOjKlRdFu z$L2Y|{M}n4ga5p1&*CSpU$JTP;&*@KFZgx~#f{T>o_d?2tfQQ^X6V4dkqDD|x4d)H?QdQzpI^8uY}zS+Tj%XNIlSbDK@!#;-F$e@d*Ao+*4cZHZ^8DGg_cKmD=VRJg_q=T*C*HcfwNx5cp?qvxDdnjJ-{@;( zPP7MYy4JYy?L!~#Ui&kO!M3NSyOt)9@YvqJ^{>P8e_U&c!sw=VhyMHiEie6S%CxC4 z_VQ-PH!uIy|b_CmGFkp;x1RRJ0 zVUodMk}?uPIp>_JR8dkXBgqDb?cIHPoO9KGLSL}=8E1@cc{JzJgXe19uKAAjj^BF2 zGxse~Us<&6;^|X!pU$uOw1v*cSC1au`t%)npKY}1gbCWWXKxwkKQQ-JX>0*&u`vx;o^G-x9?ax{|le3P52mX@Q`6l1u!DCbFMV9 z-Q9c7f&&K+ZTidcK)W)cQ0RmXz%i;W_?^pYeC6UtI@buyHhxAvL9DncR_|DC{-#hVt3>@Bh=sl$>9eQLoH{* z214hK5`j9I3WduXKAW@Qo!xKTL|MXR?p&M8Z@j+a@Un+_uw{yqyXGA@yJ5D-ONu*a zoZdbE%<1hfV46_u0hl)Yp-m@87GLifNtIEeUKK)mZ7jQf?!K|rk831z(~cfq)<3Y| zzK98_ozJSbzj0`AgSIy=-Fs}!BeJxN$;J(D?mqeUY%Nuzcx2wt#VvC@q#YGvn(YQv zDKqsbOuO^ht%HYOee`pm^_LUnzxC$P1Dk(dauk<&@y+D}f8X`GRoQP=?bvXAeGA)<24`oSF50VcxD|2Vc2?NJ5xxPXFRP4=i23_vnf7Q-8d8^2nMW zU)B2FtHTG^{&brA;j=53Z+ZHXyGBnP8$EYscy!~E`#*i1sV51mUG92+Hh1Ma zgR38##@I(DuqQ_b&K^E-X!lRzDLu^wzW&+4k^Rrk$fF4paPQ1tytZd-$D$`b(QYs= zZ9+R!s>C#3YW1bXLxUS%x}_+z6FGr@x${IaOp&0BGLTZ|#ssDKHJ{X>iqLM$+G>*A4P>mMaj z7D|J;ec^%ORgamJ^G+=8T(ke&x);S)7w&uSoxg9}^Ui<#x51MK*YqFz^WInPZAu+Y z)*c1b#26E!Q_UtO@aa1qTzTZ!_~~=!Pn{Xsyzu8U-GA9fyzd=h|L4T8R7?hW+x&ya z_q}u*G@I?B`Q(ay{W}H*R{x@$-YsJJx!>;_+)_TcbLg)F2M=xfsi3_L*7)KZdxy8q zZd(;ik;3XwaAF|#QP$D@)Vg>7c67yp*M9ZIPxaN2`sRuqXZO(Wy!7XP|Jxr2w>{9B zUN$;9zqIJ!i7gK|OijdTM1^8j8=;sK_L3-^)P=NO3-6lDNv$n?bk*3&9ryWKZnLs1 zi~E-j_s)A$Ws=xB#9bjt3>myM4fxp4N>k@X8!@87%i zm50S6n=bxe=k~9D>o?b2o8gb@>*o)iAASsCl1eG8(w1_TrZFW*aw~avg*S;JpSkL` z1dci@l*bF%ius zd};Zi3)|#P&mK6w;pIkW$HYlRPl3L%YUn?qa&N)T9T;9-1q%!EV zsyIn2ldx~)c}U`^)2_XK(f&RC^B!vVmYh`UIQ`D@lc$d?y`6&*V2qO>B#4+|t3Py* z_)!1sC|n^nH$f{;Xd*#0q;<~Sym04{p~D;QYu6@E5Y4MRPZA2b2=7lc{(nkR)um0G8%1%=#qA;BAu>>fO| zX8xC~yLIm2;Z09y%#60C#FJ^(VljVw{jvTxZ>^xXy0dACwZX1tD5 z?QU7xe{RL2LMf$`xpl?yp`|~hB2z+QLvCLPz{+6n`d2aLQ-;U0|J+y1lL`zG5+q1il?R;LR zCdRb5>Gl2N>mIH!^4gB`d*8TSX-_;OX)TUB%AO!AT-g#EZQ+TnL;bs#eUC|z6OOYo z;qepe|NZcrpXHI0`U5*i5N(~N2ql`9>WQ~bpV)9ePPlfG+Z&hdIdNn|qxsw)b`Bp~ zbqkIo$kko*w-2v*qO>Ju>bF~mMqj%%HKvFpKvCQ=_we9`M@x)Y&=5x%6D(u`r3$4S zTPm$oQY$IA;w(w?R?A}&Bd+p7TU=K}QRgjX3ffq9hO(t&QM-5E!I9xNZ)Jh$E>R25 zFCW>l1z`{FBo=J{z+C_s6-BKbdS*%eb_5V6|_u1ul;m*WNpQY** zp>BEQz==9a!vNC+( zmU*j2Mh?AkPm$HG=wQYwCiM)VCPuPFcy#09J!h8B#)YPk8f;Tv1{+fvE``FJGGV0v z158ORl+c3fR3$9G;q8NGhu^sQXY0mKt^PsR6-lf4$nw#1BMWY-n4p5YchQdF4ZkH^ zOOqLcZ=1XS)V7Bs5C$ffh#Jkx({^_;AkR;xzYQWYrF zCUvmhVp>PNi|V2*9F3Kd)Jl~?OP5~KI7*pqxh%#4%=_+XLLwo_`?r4!A&@M+jK2EX z`1s+)UvJbZHBsLDTL1AA3-89QNHIn5lRL*o-XJ%X`7#JUV=__4QF@|vV%$|{b zum2FBs-TZ)_1||-#h4PE-u3#};HmX5WD%1B6rvSrtWX^4 zjJ6vycsfxzkJZG>68_!g{bQ@2X@$5;%N8+{1!S50%Jch2-@1$3`sV(D?el)x?XQ@i z%FiSZzjb{0jXM~3R!GGt0}xh9Ed^1Ma!wr}XT`)yX*?s;Kk+nbBFUO2Kgd1~p{ z;L0b0PdcZx%Bf#}eb>HCZ;F*f_Rx{x>35<`^a7Td(guvfR5TwjCXO@vC`HBad)h-M--P zp|>9HX-SIies$-8L&ui=G!~sw2BDR(F{&yFT)V66H=o&ibj8m(ui}7mXq2L>D#K3} z4)kw)pc}bJYlIR5gk{rtTw}glD^bvhVvruyCh7059Xjgve4_tJl=0f3RfB=!wIBxJ48cP^4X9a$Sq* zw8rgo_Z~lSdhdeU8k$!oncxMN?;9p)6Sz@0qGry@k^O5Q%alZ}@A-`f2M@pX>%6!8 z`pYZ!Zr}UD)vc_Gv}jOMmn818&8b8t)h^!dy>Hj9U2nee-Au^uy|sV)?zK;RqRl3K z3^lVppq&YRa@YAI%kBse*NM(^6_lCWMNP9MfPC-GfsKowYg%VPD)lc5_YJRo^lBTD zSUq**_^ws+e%dQKyJYsG*Vi2y*?qIBA+Dz9=!%Jna|VUtXD=<^wt0yIRLGp?53JdF zXmIBb@sy9!?w_sMJGf`jtz6u;X!zWoCrm`^l%pHpI{ePgX90iknQUncXzmEtj9o@I&E}^M^V(swJvnO}_y4Hng;cCu2^y=1C>z*x? zE)0&-M7f?H{bBj;{p-Hfh77k79q}lo&1Oo>?D@O4z5Tq*lOQ;T-)tHf-LdsMBC1sR zPxhZ4SoHk8GyL_h^^a_R8Z#|p#BW;`sW&yTxn!}^TN>!Tb{f;u06Nq*vN*vLJh~#dd8iC zE+mi2&q9U7nr3$g%nS$9o)9&p+4uB;Ip^Bcl6*}kI(FB{AAJLdpX7k%Y&^Yx z{@oJA+`AxnN`zEQd&jBd2&9BoX)B%84%734MLWii?|$`;Yr1(?#ao4F(YWE2O()Nc zzx_=oNq+a%1N~cHzFtaw*P=7~PmV9U86{K*7WcNwNmXiEg?15V4S?_dY54SSeq&qZ zl?r!Dg_%eg*FsVW2FX}*i$vFB8!l{rTyly3fwexD?K|i07(Dat>7gAj-KLeUcz9~@ z_{l{NRzvHm^42G}559Zyz@w~=Xg<{manDv-E zpFF$f@zA>ILQ^zyIYi3|8=x;MnA! zx@+F5!EJMIFC~*A6JLJw$oWGDU-_2pF6AvNMhD(};d?XtzVW;D*?w~?)5+&I3=h0D=ZBxT`s**O zAG$E~*1ri^gxePHKD6TXyJxj2NkN;8Qf#GALQ+m#rYL8WrH`*WwPJSq{uO{q84Ush zQ3xZGn{;BAD#Ig-2TyN%)PNDPQmOPjx&8PbH$Xaj#hDAsAMf;9-158qgGX21)&Tsg zRbwYMK2%1U>fSl~`VTK(_SkiqoSah7N)UpSwh~0ksHASG^97$Y5w)lOXzsTCL+hUN z2B*sQQCg36@8hdBt=zEq`$Z|k?XPSbJU{yOzj=uLE$jF0-Ll|5r$8GAx6Ipj^8C>Q z&)p8GDjW5h6{SLk<~7~y`NOi^>*hYveO2>IFKr#YIJWf05M;Px-H!E}7yY0C0Mt89 zz=2jg;UQ#%CImnt#-Cg}zVYcxmTV|fnt{m7zs%lx{;&V-%&|?+-VhAX`kjmZbZqDS zWP%Yb_LF5t&%AS@|F!hV)yKzHJ{lnHvY&c++o2k| z^<`TGcJqoOgR5S@vCm1(gQ!iW(|+{o*3te~zam5v6oabvJuffbymsS~wn;ga&ulxs z;f-I->M4FRZ~ei8%N?13n^(QEX5Z-Q2Wz_h-KE=)j&1+_UDp;oHKxgN2WMI}fLBr^ zX8wBh+C7`!x;@h|P@K7dcs)YRYhKv7bNla~u-(Ej!0D~?55IHqo!u{gEmU))J8*zT zlkv2Zv8(Uhc<8{!6;Dl1@f0lzZ^PH$+;Pdg^r1e~KQ{_%6O7COX^=d~Z2C2Kys&=g z#EIkYp6nkvaq+M3oZIsD8@FB8rU~!4^{E3V&hOqZ_qLhSEF)N%Bte)nP8p>flQ@LX zp0oDI`S->TkDNF;vTo;z>>E&9@@9}#EDbmqdRu2{Bf)2JM&ie zkDobq;neWp(Bbv#Ui$pC3e`zX_dK*{;n1P+3+MiNcKpzqXMXglPfdH^rL|jMyK7d{ zasl;t5~F73CvKek_O@du-`z8Me zXIFPKQBSK$A*bK|#_Fx-PhU8H;mqPc{Pv62e}C2L4f}=+I(UoMW04Ug|%agX4i z$*z5T`JNLe&YV4as(;0j-}ZUP%&jkN*|zNQmJA~J)}1eH-uw0(V?Xf4svx-qEi?vI zD54VHobmYwpZML2rw7N+Ts*#O$^9mu*>~rQL&why9oTzhXw%$9dpFFT{V$*Y_VSIp z`$tAb&;5^g-|atq=)i_IAN};lr(HIo23Oy=a?j}Lfqf%K1_w63p!3_8>>E3Fc68Ut zcmF!xfAYlf9ZTo**wPepHf`5YZ66<6`dCkUQoS-o&b;pG?=RSX*)OhH z|Hdz8Wx3&$-TmtN0}GyNUo&m?!p%!xxTUR2p6T~J{%2kHtvB8}aN^|Ii|3CH4jtOG zZpjQkDW>?7(;FY14A*>r!J&ie@0(SJq%`KzRbftlv*pa%UrQmB2CB4`3=5IRL=r?1 z3$|UhW-mQ?@$At9I}V>Yb9!Xo3*Y{niziHuuKwAQ14BoLPoF$9Jic!0n$dj=pS-Fk z??937`|h&syN?|>aN^?0fh|u{>Qv9aEm*zf^u@pZ=`a6dbZF<+Wk3DE@dZX$)mh<# z@|mgB@~rjcMQhi+JNn-K;e8vI-+x_TS$X%o4M&GhA09k;_Uy?c?;IN#+P3L)SIt26 z3KyV#s3j?YEZXJI7jE19>USH>fVfnWdiS+;N5&t2u;=mBdr$5@H*j?8?y)`lHeJ}h z;*p{eX1}?2`=X!qlqE<`Q^Y}P1B9iDgO(0+X-%ehdDSOwer3b4Q>V|L9X{AUGIH_n z7mjaw@iR6|yY|~JuHAcT^uo}xM$h!BY%2taQyJOvGG%XdGFNnrHeoF zxm#bIxAD}eGbc_QAAjfXzxj>*J`-e6j+Oc=zz?$F9{=&z<{pzZ% zN6#NW(m(LuFC05CHa4*OB?msc?a5sO`!Ae-Z^f=9n>X&;x$w~x`|PUkt=PEk(Ajf? zqhlwJA9&@}`=?JcaUD^TFpjheX^Q`Ups@H~P`Fq)IzDh<&+wU3@BQV^CkKv?Y+Zay z`3WTdWzFFD;o*U?{(~#$|ME*$$Cpj$C_jDIOI!B6ckIaKJqMT0`@v_Xv!ojH@~Yk& zo;@^l_UN{^Zq7=bph}!iyY7x9o7awy9o&EB&&yu>?)9IB2@_cMsb8+zJur6WbpL_9 zhgSb`R!b(83I_v5U=mrWBp4}yFv=+dp`P0O&W7JwFEs~^QYJwNXEGs)3XauXYudGs z%sp^u?E{*XI=EKTJox(CdzbdjdVJ;nJ)0h#kx&(;es|5@&FkJ?`nA^&?K^tpc>lhG z#jAIQOOdiQ%aQc0KgQj#JDl@))(H||K|&T{L{&Iwr^j%?B`eEjw&>7 zdUfNGzx@5&xx` z2FH$%A6$Hs^0k;;J^h;tHXJ;8{GD@uI?;b{$D-eV_1|XHCQR_X*WLBTrlE@?hlWPS zS1x__Q*AtXN~iD1y#kr4OYNbRKe-hTZ1FKpVfdG)f_ ze*U?pkT%@<{Ei(Pes$GVWv$IV^UH19hY##p(l>kgh4bg$8yy)sF}`WfzL$S|{jBh@ zk0BO94gg9zlrjcfsr>W*ddGr=oBD^34;(#y@$AWqr;qJh{>BY6reAlbI?XQyT# z5BV+gxBlt;JAZn2Cci$Z!Sh#S`%;}DFfOTJ6(|>Gq z`0P99{OouYjkvE;Km&!{YqS%M}Cr4q-nULCW1svlPb#=RGu^F}gqE1Ci-lnI)vvue~&Qe8IE9andkEx~|JRQ)xr)RoW@M zD@@3YqzywRT**V$bY9juuw;@jjj4IF-Wg3v>xnm*sfMDxg-D5^NfBmD&0zv2f)ZIX z#jG~3r|5&9G`HM=NTslz*@VzUP3xO+6&RLE@#);*dOD#-U3Z}@_O)uA=hHGV;j+3a z+I`)56cZp_zR@U!iWAyfgc=sAkx84>xatN*(!%7SAuEw^o~Eg7dRd90sFq;Ja^bKd z70*$e&?&KnhHyS1iln?6n^s>_2m*p;y?nxyIz}^mX1Iv3Z)>Z% zi$=)EM<>+NMz~sbBve?%y7FSC^b@Ne^WE3XXb=>GFfjpcKzG&Ba@q{SD2h9+Vmdur>s^^fI(gW@0^aH52?rEfI222~hZ znNWAV&4O_ij5W%4RVTQh+e!+fyJ|`|tizZ@x+FD9je>aM6@oSLGHa)jPRj&JY=wB+ z6R<>Gl_(gSLG*!tDOI2p=OL?fbug$Ft)8x$YfbwEj%!6r=9*PL5>?V*`ZDXWz%G@- zIoI;GKJkjo2+k>G0Lm)~wX_lyS6vgLE=+-AOc>A>(rFJ=E~lRJ`qUX;C~ytcE>lEz z)~YO<-dk3uOs-gkIMYT;#u($sDIHvfK{2UN9d}NSTGKv31SXbt)gi8#?#$_~nAZ$U zYf|H#ZDhbYJ3CW7JrBLOHp#S`lm;VdBiCIuT(+(?I>bo@8`3JTq}2jfN^Mi6y^vPg z$p8$r5nzn~>HR~?kFI$fymcHdSrt}1x?FVUWzjo5h|4QTW6gc2%gos@721&ZPXQW?)s()-qp#VX@y4_6b(`9{75HN zE}up!oxau06mN95r>c5VsiZ=2lTKm~e4{9hj1Uh(N?q+V%(nZ=JmHA~9BZ2Urme7A zts>i*&$Yx8Nh&!Hu4qz;rDBCE84(EN&XrGNRTwx!H4V(ST}Q zQganj((;aiM^UX_6up^*D`^fKg@*Grpw6a~h3}pj80z4}T4d`V;jD0WYFwKT7p6{R ztJE3k60u|k1qC%DQa$Sa6YXv2^n|1f*(FAEt6+x@?UWG1{r`i*Qh19(nOi8H?-7b!kO2wBw z#%93Lq&NktyJt?1Xq^E~nUGQn6-Ah3?HN<*xX^NzcX1lYMk8<^Go7+4%ht8t$%g2v zPvYRf>UxE@gz*kgGG(%nfeBx<`)c)+P|;mLpdFd$o?H#77dEh|g}PK;`VhrF)IT{2 zGey9#%m{D5=NdT8ov(CFvO0huR;CHdwC(Qc=^-YA>cp60kkOl(wo`G)1h!aI-}So7yNejj6=3N;~6@5ZYSLYUj;_OsQ476oihbgDYudDV^%h zJQyZxT^uJB%565aPQgejz2{)GfrwO;%YbXG1VLB@s-?2IrW8|t-|E4U)pK%9HNnCK zD|L$qq)caFy-~WOTHy$~bHjY*yyBQ>*D`<*unq*aklh(ADK*Ss>5&KfP{v<(xu6%n=9=j5wj9n5L9=C0h1mI8IOijJR?TCKxh9J)f zVG4pb4V2b6Bq7f#aaB+T+=x&V(;Gfu)K#Ggw@ylv#R)+O3B}6pf-q{7HOvNMb&yfY zOq!z5$W%&2mRWuFvMX1XF1(gZ{mpq*#h`l4hAQ;7kx?g9|9iW8;G`@M1r0x@dx z&}~5V0E2xOv&U}6y1pwR2s$^;h|Z<6>l&qqo^i?&<6ftEdN&&7Vodn<(O0u)w*~;RaS6P*P>wnkuIDl ztBNc*Nh}~Hp{6lm0wI#>*fSfDKp7!Eh?KG^)yYAX#AwY}1|gvU2s!683Dp?9bwMH| z5OB>ZjH`yW3bdjE5)><;Guj)bE`%a#%m;v(`|Fyg?Kkhd#10aoeuAqPfeLo-Peu6FnRJs=S)$03`jXYxh_ps zW_F^NHAMX6sOwUB=|dFzQ2*p8?6Uw;NXBu5s1l5$c5o(Sl!2D2^qMk=YB7!Dgd3aX z+B+qr5;CQPbLy=VMk{5QVU)oXLX>3KG@Bkgt|qJk9B~{tmDXybgErK96epA=()dz2 zYjTn5NGfKC@XVolg$Ufp^0LuQ8Dt;?FyRcMkyBs=P0|`@$GK3-IM+rPG}Vd<3Z{F; zy|1raH1}6c(~_>R6i?w%$|*45mI6~~0zEKuVGG!&vB2p5ELrCiGzkuu5BNZGud=LAQ{ zQgr^U9$9eLGXM^*Odf#{F zybYUw{Mo*2Vio5(LtWAompZp*_q0dmu6^l&-lC8}=OQqI3>P(Rf(kg|%n6l%)QWRe za3#I%vcx!^AqC2o40+9fs~Vv~G0By!)~4jXO)1vYfCFop0+-blhU2yb1;Gc0%|iK=nbD4K={ znlPUkE2tHY<_#K8jIk3emV!?~ml5QWilej8fX<|$~1$z;NWzQ z5V2MldGOvdE~LUrGo?KTjcEeHYT4qP5<%N}Q!4C>=A(00zxd0(+*x^PFQzDBHppJx z4Bl$sRNACAkt-<$WmMWMceashMq?FIs=UY`>WD}q7($rQg$99K2^@1O8!gn3ji|;M zj|Gz4yF`l2=Sni1A_2yGZ>`o^r)m5_Vygt0B5!rEI)@}>LP%{f&s!Oe2rF#^yC^kiJmSq{K;-o4?V2l-6vyhp>DI*-ETxrtsJ!zUEh?wG1H~|Eau8?QI0&|*0 zHBGf=gn7!T2W?^^GX_y~CDy8$S;c{hS%eD8QfDkxDq>a5(@bSdnl!0m0v;$9JTF>a zo1$z!FmL6O$6A+)Wtzq*Ltdm{f|Xo2XN}-QAuhQ9tGiJx@ie8#gmO9n)N3hMR(q!z zh?o!O z7ODxBf;XH{oG{l)pyY`4mdrP{WfoU+N)QU4I0Xzq(jAV>CrPFFv#iGo4utIR%6<5KC%;cFbFO`=* z)Q9?KuL=Vvh%0S57ux3uO#vrFXsH!S8A3!TSq9rMmT?sk#2FzBOGc#xW0X@G0boq2 zK@NOjxF=I^RFMi36$lho3I?1j%?KBmOJW&SAu|*vOJxuulw!d%qcfwq5GrWTG+>Ho z!XPF_QjipcAs~V)g3hhVvaAq51WSSO+-U}wQviYMU7WY3%?va~qK+};$oou)pp+?s zHZlc{Yf0>k4_-T^g%CvGG{u60#w{g5XN-jui>lQw(=AG|Hcp@l62S|MwK61*v2#}c zZ=kT&Rw+S+`C-EYZkVZ2&P~yjrbG8&aV_80WZDMu@;M zNqC%Esw8duQnSn{AXLPt%N0HgCP6Xd3Mr-n6{cpC_EJioaArAZgsVa^Aqi1A7qv=E zGY8f-j8UDFCR9w(_sN;vvML!TUP~S^sxac-+ccpL93rVU92{ur1Z6~9E{LMSWQs6q zkrjeZj6RzAJX5(=f}1o>Yf3uFJ*C(tGp_#lv~=Q?InPM|2M)+3XVE%3y0V$q%`lT| zQC(7nMV(V=t)~f-G7*$n7NpB^r#*9w3uesDLrZ8YSOL8t1x8>&=7mleQKro) zIO&N%z_kEemWB(0Ao4*8E~WUuRezT zmD)j?P=bXk-+wh@jFVC-WuiKYqR4q*A^~0sX}JIpR%{pfmrHMrkVVm$9E;$!l%Ta%3^V0a z+9@RUS0ig*8tTb0j5P~qqN-1MLusKu|W2;SXt|hmGVT?dJCBU1M za!7GRAQ}Vj47qO_lQlFj5FmZNsMJ!P|Rg;-f+&DN|iK1(u6rB z8zRw)$)ZuI)U-5KxWbj02~u#Sgiw-DL5UE+P@R~m*UZc>uhk;P1%RZK0uxdTZ4GF} z1QH|#0OGCF7^p2Im33}qPUdM@>VH9 zG0`AgAeqOpNNc#3G4O7h5*iCiBm<6(NQ}+|G?dT|A}&g8G7u?9?yS@TApotdaLOp1 zX|EVU004!RigOygZf05%OK~8CB&aS5t&}1RTW`DpNq|s+c-pp8r7~X1ln5zh6xHgT zSGrmM)!1n3N=U_7lj2OZQIcIMFMWt&AL^eR zg@s~@3RO7DQSLm|6d~f-5W(R;pkrrS$|?R3b90jnwqiTgaIZ%dF&`gNtUZT^GRIg0z%eM1{k4rK;XbIqmiLPOJy_& z#FLcQwQGR22vZI?4=6K1P^ROYazum^LV!rQDx`9nAdn40NQO{eXb!sKO=lDdz(rq+ zb>T!1f>R|Lk;(%HBbX3eNl!VG!U`cMODHBnaH(7uQI0(YI5Q017bJKRxW0Yvc zjMJDit{ImxHAvOcH0n@!X+lwtI<3jVrOOUZ7;2SCIMdn+M>(>ROW~LYrij!60U&{> zB#aR$cu2syTnK(8HgQ5Lrh`+dxlxu9$~hz;3*MbFBKic=;TS3(kog$2a8 zV$$YLO6{yp2sU5|!;t2|d4g~(QmQLW-7V`)Z4)Jd0p}nKEwM8yAqh{s4c2-gH6euH zl+lzzN@T(`5+WBII7^GtB@BVjy=jO_Dr|vV1R>JQ2igv~6`JCTQlem7fuuqb#*qs? zi$_En8ACE(l}3QM9eV)U-H?V$4uiMO#(4OU`Z@W+bCv1o#|TgaHX! zXc}|M^2|y>wKX-Guz;l?CRMeVSV2pT6UI`Z6vKjp3{A`H!SpaLFia9ggDa^d6e-}E zGp(f4T64~Y5K_v2aHY#7CnX%E5IT}7kFb}K$!E}nsT5^qW@myNL_Nw1z)HoAXQ>e& zDTTWCJ~Mfm#;K?oFBB>zRk^cDGDK3YGzf(l1uLCUUIY$?E1e=zBg|%blS>6of?+Vs^&s9rSjcd`u+v$X6@hSxA%J1gCH7d>J+w>!-~p9s-u_^sZy0GnQ&*FlEtVj zNSIpXtz&?pV#FzB(29tuvIg(C0$z>jYa~~;Dnnt~N$IQuIh+v!!YgNt z5g>t4ri1}$!Ka|5lx>Vf2udkuyhF=LMUhCMr#S{nk%BTL%IntIOew>;WK4Xy=-pUp z9k#|%cQy4kX(fVMh8U7qqUse9tENgT9|mP_WG&4IX^W!B8l{zoERT?Bja=(O7*46> zitAV#%VcJp&T9gb3K1-dZR~BHqUYAL7=vP5@XA@9q3B?Y2n?jP1V92+Uexu(A_K7|z<4SQa^|?w8YK$vt>83b6r7_# zG#aaTV(f**qUV<7E)r$y0D*xtLNEoWv=`cO1j#B043$R{E9a#|&MQ8t#iT5vNc)64 z8}V2P>CvJD0URa73Q>fhP$^*OjbseZ`HPX#UhtSx!4bG6N;)TUWu%m$)D5bwh>Ye^ z*|KC7In$66B!b(_c_lb9;IfREYgXrmgVDgazzDr3A%I2iQ%QtUkrL9Fx>8UoQRfw> zU~C0IaiO%4QZUNO+P4EznxL1Qn%oykCf7O+wQg|As3JM4h=kyn4*>i?1HXwiX#f#m zj55tWF|b1fi9np$H-^l};4bP78$$xd7Cd*Jv!1 z(XHjEQR}24M0wV?beTwEXfYy@x#W>#6l=K@f}sOmVh*j)(vV0fO*AA@DeWo5Hj*NN z90;1+bH{W^2@X0ztY`_G3hfhNYf=yeHDwUBP$&gd7*cC8FV1<7Cg&w*Qjnfe&{}J) zrIf}vV-&b33Yo`-wh;2zn#@ZM(u5IF&MTt{iL6mv#1besToS>OB#y(XLV`X8{UtA? z6O@)Z(ryv+04hccC7qTmMxz8x1!+aB3PBwRCOL~hp-@(#cREw(Bv_EvND7%MmZDT9 zlt)rZ4W4=qNE2!us4^6Z2G1=E%eHE?5fT{_+?rHtEr4^$lrn%!3N0lEX@y{vl{xp; z8=z8(=1_NJCdx7;XjK{x84sLZeAj zl!C`ZgVI7I8B&=T`{jI>=A5ulBq^05bsS^|YLy#CNftDUNib55y8)Y8U05S{@s zR0@rXgJwzwp{({OAvmSxto@r9WN0yV2n@CGLdV)7N+md9)OzPtszdY|!l)!b3a)8N zl=g}VhTLlBffQpY1OpICDFlnC0e~^VnQ|s=31UQ3aOPOsbz#H&s2!Y3WvgmEb^QJGC&I+NECAlU_64e;58b;10e~f zjPNR_La9J&D}>M{1Qn+e=0XXYu#A~7=Fq5JUM6iwxh08mDJUM6 zskJ1CQeC2xiSNvqOjL;5p7{xJ?SRgRg#KkhFKtj*HyccL;y$S1xNw> z%NYca6s)AcBmpO#LMeExl|ZI54~%LKVO~=Z>BtbF5HJpm)mVX|%xHG|EyUsdhpl@E}8@3{oZpk3B>h>k=qY#z7`U%+UaVPcnir zClv`+a|F%6IW2+GSZixt&UpzrQ9L%l0U%9NLb(Kmz&saaqYcZAmQ_&`*v2R#BBit) zO_r&WAV7ph1IPe1Q{ZAnY9tGD%>rd&>U|v`M^&*za?lW#fl1#jX`6ECxvt!2TzVxF z5DdLVg`%TGo4r;}iz1D5H4jTgo#aXq&l&PuNF*d`SW^;^0*$y1MT^mCqMRf_qN;=x zb=KWROF&GD0zpI+l&=A(I0^tjA^@_8$3`fo6iA+Ea0-1y!D1*?4i1H_kRWSUGE^Zd zP6elodY^`s#KncE0FYtQj$s8Q7!peaZUZY($t2VjKxajn+ImuEI`8o*LaWVdWD`oK|%?NfN+0;E2ysHwHI$TiR?@v4BLh9$`~ zi`G zBB8zltO155@0k8+Pf|*lPFhIBA6sbS(U;_P=MC?P;(CeN=PBKR)R~R6-X(cU3YZN zvkHV1S|VyLiAEzpDnR7SbR==Pt(E4zygjgOuEK>;+Q){9Tt|f{!CHz1;SydX%qUHb z^vb!g9O$k#!!JO+_5E{a4OLZ`EuOJ-f7P|~m&!P=VAZCbP|T8T4sWn&B$ z6IBHlwHca)T&i4!w3>DXwvC2mXY+L_E;G z(O3M0v{Y%$*c_z}sdAQ7+sjONL`qAHhl*ppTH{*ACNRJ$6DD&aK;#8tw6lNObnN7j z{x#S8oEMvk)B+>zoykDg6WZDuQK)7OQRShmR@+)bCn=CfbL&JDTHSbd&7s4igL7|Z z+zSjONiyGPG#HVBD)bgb=!|Cy1lNL=Gm#`BZDVaUv`P{tN&sLm0m(sfjYbLj;)_a=@=cKpPI=eMod*1vP{z0_bxN>yxFPh6lijUnNY=2DPMbAg$V9aLK+ii(o< z*)t0__kDQ()LL4pRHQaeNyeB2qZNRp07_s|CM2~^L+V|%B515I0dBQPloC8rMoSK1 zsjSf$oeE`Bs{+Q#LTYO?DoM&H;#Aj^GGBgai=)6A1pvl+rNAidf9w%n8P_Oezujy4Q7= zTGGantX^}B1e2B1-QXNW{90nZQmNItYjMRe*#a!~wOSOIv(*_FCt>g9K8~29vSD** zn$)U#^YmOP%mg*Y1tc!FN#EPJEDu_nD@G?tduOHjBIff<^418YtEMVNyr`Dh3V~YZ z)H`2VFmmMN@l&7fUGTd+LBe9A(JCr16H*IN2F8U#Ac8=k!HXygsWF~ubll5x?RQI* zOUof8M0d9{KDm-f1D+`!2inm~Wze2!y zsi>t~O?#x#$WcvW5JrS?Nr7+?3r?v7A+?cKYkM{ddkutg)KK$j55ZPet#)B0xG>F> zE{CD0U)!EEHI+myOBoZTH4+{B_ge~)TEQE04+#jUB-~dtU?TnT`{pD#3=MEEVp*qUKVGQTffSn zwdAT12WtSN*CI;DWFQP(Dy2ME3JVd0W#8y_qu&POGIl(+rG76|*%+-@lMiOI~#*3q%TBww{j%}mEGHhUs@v&Snv0!L&3&t@gSK3JQ8BoBszp~+q|>XUjWNl*s08P! zbUx=P{0}8jDz(OHM;Ww~i|x~{diA|UC;s;Lv4MdDV-@YZkL>5ir2DqteqYOGC3NceIjJ4HRwl$y?DM~bO zx?r91=%dmll}kEYZ;~V-2C2*dbvbN{iAcd_2@92>ytgXjpm-6FA7650@X(GqH+N;7 z8aTJ;Ij!gti^I5_XYD4NdTHsaNbrp<$Htfajx$9Jl|1npcqFR%AC~MpcJRRbJFM}j zbz%xZF=w$;QYY045nLs4nfR0;wX#Z~WIEeBVr@9l0yqFzm0B=T#6rdhLhuMsbIODe zTq9E;wNgrPDmbbNEx4+3X(ty-Wt^4Dk`gqvh*Tuausf&}pgn);y}kWo2S56WGBT`G zK;>~oW~xqHjDh4JN^xAjcm4SI&Npu$JP_?s#_NSLFPS1ZWl0%ar@<_a%7N#JY>~PG zB=M%=s+T>!?C{YwzmD53La!;JSAtUpHmPM=hGkSfCX!f80m~6hwJuAJp`WEK32c06J&UTCF)oahdR-eU`-V@9e|+ZSgZ&@A z^T*yAgP^&VmmSzN&2Tq!J(DWBIM&3eE7+RE)aK76>!l}U011rc2~XY;;w z@7y=7i?_s=WHBaw3KwxH1Yt;k7CWx_m-p8Ve)Jf@TzSnIVLW6Z)xNWqQ7|@&2uEdmB!(Gb(_>WlL>?OJ`+ z<*%&jJGy*ELouPcpX}>Dw0y~1-+Xz+t}|!;IzOsGuhEoSW>l+=~^!`swrAg@|lw}3zxRMej0z?(8q{_UyZ}ixq zBVz~p`!;WU^qcu)2iM*B?wS+h{X=_)jvhO5a$@W388>%SLa^8`Fw2P$k^D}?wzZaeXCP7g|_>x zr6cQ)k9@v=qW{Rio|o<9*k{w%Zyg`{^z(zqhj$-X^YV|r(R;}ytruJpcK-O98H-o$ z92i-1tptlganw>speR8o4Fa`sk&B~3%u)UDm&=y#-gz zFPEaqn4@PUMH-VzE|S-lZQHf@=~`Cg_?>@wbLjZrH!r;NpXt+20-iMHc-tb=@K?a zlZ&L|YbI*G_!3k;3iM@HcJt=Ic0$4g$C9|DO?GvDvwhkh7VOzH>!zBkGr@ZdkHZM+ z4P-z>+U0lEO??)qNHFP4YfVLNyn1nwXcgBx zL^De|z-XaOVo~{=_&_wdys8tPdP@0~i7ges|I)Vc!^`jQacNUAAjauN*y*B4wsqpN>cq>*!uqcX@i6$Av(sHHjXxZ>-%ya1Kq zF{yO6U)_+GP9mVu32*DVmOgK|fVWG)rA4VK&RhnDf96=rso%CR#l_=7YB;7RZ(_q5GoOb(P*rEF3<#=#gA;%0Q}|**26QOnX$oddFp`nDwl+wN*{|{i^X}tN$Q{s@Zz2 zn$@aJ7sm=cDMpEpA&%qNHjF9hj;}vFea`$>e>Ls0Dec+)i~f52_;wB&7dlbcq@@(Si@u|Ps}*}3*ROPFS+LfV~d;+@}k?wzfh zm(A$v>guRJu)1&8#fO?(poHeT93;{C(dSVErlO1I(l&N{dwJ@O?Xu4HE>}i zd2!|H{w+^;q`iXtVfD~~ZS#KBAyfcLX`dL4S|JD~C?cMX!j5X`i8WR4OaPe8+%|M% z{j)|IWVy`Ev#Ul&Hw5H?m7jjGWqJ`)2xxx zgR5r$?wd$U$|hDA5*v|776v7OJwIHy{J^|FUS~Rd{lRy~kFJ_?cPD}iQ~-=SVvNlU z1qe`d-L-1Z*oFmnR$ZqtkN54~`~H(viKQPc+`IMNpZ3-|BMx3iJZ|DRNw754`dld- zSBhcM`RkR3zSzC^d-5V|gQ6%#`Qs}m#@UbG82#kn$l&@16Vg(l;*||!Lv!k{?>*GF z`UQ_Bs$X{3iZhwGHm-f_YLz(0)vG%vb}e}bOv9Iiak^X!vwP?DyM}I!U%!DPy*Lla)@|bYri^})FiI@!z-)z?im;!8+h+Vp)U=h?rN5sYA%9i z(LL*<)1%w&XB5v<>3q&p_#YdP5Qx@Tmk3S;EhZWgWkg)kaZ^+0EBg=jy?2*Scz6jf zfbo^HA2$)0k%CH}T7B&JhFSG$>4K(0#xJb&8<&(7Jr zans2oXZrUqc;g4(`ss5YZQHeS;y?ed|MBtA&VzeCK7MBXyeB#?@4W5lc?ZT19sBd2 z_kQ?_%knHsCSMx&T>IG8ef@im4V^jq-}daAcRg=S@|#~?vVPH%uW#MHYW(o&qZ4~) ze!a6e`4RyVB$py4DilT;of=FKHHA1c&L~TzKna{nBDi;Gjp9s!jwr*<+KtaI+`8t3Eaw0F(Ku@e&~ zMwh<*v!2F{A0GW||Kjgo)Pz&7esk~8$9oT~y01Xe-k)vi8|{s}T~nLz zSiNWIj!lQp{PnZ3q5i*oabWHpWga=^6=*5B0;`NnRhoC-@z#nB3!mJu$L>eE9HV*H&E{4^msx%Ic&PQA&9fgfw=S-}d05l?!$a z92wl+e{6ii9ap8KQWWS=g0UXZO2M?&D&&{?>wfUcdmj(%8a{FK%!#8L7W}@Zk^+Bb z|KRX}Q-_C74({0U)}8Gw72f^O;-T@0q2clI!6h%XclU%qjlcc*W!pde?dxL`gBy13 z9va>?^IKiEO@n5+wMy`FrLc&a%@Zp=`)vO!+VL>_YWmG+Kbc*VVxcV7OBrE9i~ zADcLF{NwTc+i#j0-!o&)@PWQvpZ(W=P3+jYeem?3Pj6lPR8PI9O?_wm*rCk_j+{Pl zU}VDw-|jINUCxj2M@KAq$WbR1Sre1}KjJKrkstY#nMTsLTr9+Pgj& zIy1QR2DrS^d};mrcYnC$;GP$5l2f&J9q9!vWuQ}DUA^=4{y*gv4#2noZu7jJWGEE_ z)GWAd(a_;duQ;n2k(gZWO-Ywi;;-Fw>~P=E(N7QU-MQ|AZ`QGC^0(#;eZJ-OC-#o* z*)q8G(4m1peP>!w;YKHn&^mxujCx*dRSC(j?CH!^fmB$z_Tu94kzLQ*;GWt0$B(Z2 zu9*JO##Q}?M^2smyno}IKYYD?QfnzuE;r(qg}aX} ze{ipWtn0L8v4gztm z{T|1$=PYY?aRmCF_lC#TExxZiX#UCt&0l}0f8FOpb8jzAZV|j*ZG?H1QC$wfYL{Sq z|HhMpZ-1{)YKl~zb~ZScgAi?{`lyU zp8%slEb7=<4sw^JmI%tq=SpE?R2!X?-L-Jn{!I(-&Y=pB$=)ZoA3wA-x#5HTpYDDC z)%9cZALzv-n7--r;d$)Icg9Zdomq2PSon(j`VU^;xOdNrCq+PlkP@ZQq^^9{%vTt&2RwPy6tn%SH( z2tx2TEaO-tXsqh75Q%Y|uGQ!KWT?3$!^ z+TCw0AKoxC;USA+bJgANuiU@xokwa_(nxQ4tAEew&2viS>sEj9fBt#roG1R}dtd9k z@y&HRM&J2qwU&JO(tr%Bzsv~ujoiWwb-UK+c|xu3qV`7hgNI*;9HV=}mFpPsjP$ND#a|D9>J zJ?5+@QElbx*Npvb`)jvcef=|w7Vr9C&d+-~btc=N-@I|{ve&9Aw~ZU-Z{EB6!#k8D zv)4?le*dAg+L42MYSH?kIk)5uEXT~FC4wukLWZ;?;`HYq4UTV}$q{8+CI0P(iShL> z3v=h<@lOt~ct66WY^xNExo^X%|LyeNC6E1J%2i*xY2mKJ zJ72y9MaZ4i8jCzWR|@NDhj?t+@c8lvBb`B6%9MTYrJ>^^%YV`S>t|nn;gP#?7Dn#7 zi?$DKdi_pao7SjxKCx)k?s*TPO~9EB+7gN0S?dlA&Y9WKxWaW`KX=`hm5Uy~!qM1T zXHsvtGMY-I04;E*&^se(M7VQVYJnS@qRBQFin)TewzT@x{E5RK&2S1O4Y=xpjxPE`Fezwpa5Xy|bZj@5%?e)9=3B{~t#W?t9_7?(bgK_3VnB8$bAc z4^UclgjSeofUJ4tvRsG!D=o}dbe)Bzx_oli_~Dhmqf=hpHMVQkKeZOio!R9xrVkJN zshXGfv++ci-WKPeERjK@8b17wVlT0 zBH>?qcjuv|# z<$H8j+|t~7-TX6uJv{H0y7#i`+9N1=mm`&0SX9LVPtDYZom{Kir#GKCv~h+OoN5aw zY|I6EtD=x39p<4m$9I14^PFTcUJ6}T{Au^dwoTs-$xoMT+4jyaU8>NAU5+<5m$^`x zRgpgTSz(vzpheXmo_%om=(1mGtgv9}@7C@*@ZN3grn$RD*Z;2L@%6iA{iqg{f4g|} z;6nB6#_{2`zl%gQVPQnn_3!k5^6APO!z4w-93Y^qS@5Xpvi8pJKJ)&r!GlX5Z4am3 zuzbzQ(<`3TPRTcyA3S!V?~j-E-Z1@x4~7ReKXN%|p{(#}_1?t&3J{b8A*DnqWty~?ztU9y)%ra{3*Z04_vwSPPmOH8 znUy`!41LX&ORV-@1M7iXBJB zj&41;Wzp;(cE?RpRKa3}1O(1HE9`kL!N>A3p7_g3$E z?fQS_%}q_@n(N=$wRiW+H~9A7&s{S%y769=_N&rVWswr^?|5@`%h19HzsAI+mwK5( zqh54qA6s#HVEz2ZzCEQ-xIq7W-mab7A8%B1a&e;6cjxXNT>dz6)^2r)T>rtqiEVFv z!%c1qqEh3H!-o#cz8wIme{Su>zI8uPEwRmX?yf*eHI2)0>COdX$NJwQVT(&_`-4jl z99;L}l}c7FEw-f92bb&`T$QFjeP!p!nir>Bo>nfoi2ZEop<|n$DsiE-*Ju!g)Xrd{ zXobm$H!c?-Ln39G)H1AiU}(-sr=oq5A+{eeBamgMTLusS|ycAh{>Jv_Z;e9IDc8+>79%3 zy|Vif(w4;SPp@9T?zyie$yX*_Y^K$pn!9Ucg}m*pjl-MfT-OK+ErMk;H+(!W|2C~e zXgCODf-32RA(mkPw|#VAV(pWaB=a$={ABLX=(0Z+$;}JKMmD~FMWftQUG(26rIh15!LAq~ar z-yS?UIPd;%_<{{+3=v7I=@W|&99%TxDw#1F6l;y&eYksI=|ffBNl{XA_lHMzuY4Lg z@lIKK)9ju7i)Qs)V}c8c>i!jn4(^&R@;GK1Xk>&sR|>~OCNtKbIQ`*tU1O}M$~bw- zjP)Z2XaD5Vu-a&+O-ZG-?5_Lm2U}0Pe@uM7mBZ6 z`O1>5yFX}T_srV7d+nc~Uad4;+FE;I@XV)MpJB)-)HDe>C4w6(Ata%49lnvZe8pYS zcy!5$6Nffk(=j=Ebm5WyRge7P?cKYM4jdYNq5k;U>MRtfoqEr*H9L-f{zc!w!R4=i zzdQbFZ0)&H*cb&m38E0n0e6ji-XAkO1zrv39jnM;C;FZPYj z+ZOKIx$KE*)s#ZQK;HAw#OYN}@sK9U5Ow#wy@%F56>1{@k~=>dIkNIe*Zt6{ZChTs zw%cAh=|a3>%2V%-?pt_$uRhm)FGrLL3zAoJm%p@X*Op~7A6>9**TjikilN7jD+fBfs{j%^3W zMo;bAvF_;K|NZESGM~Bli%&;ayfM7xm0lT_F>@|)k8U`6YV%A%M5&ebWF(nBaA@Oe zKOupfgt0>td(@1h#$L}^5|>HgV%9!o=K8G%4(#}G5KClIa%5UC?rfe(&uKzC?%y?b zm}MJ0Tt&;VXC8= zWCnY0eYbCD`v=$SK(s&Ce|TiU&r){lJ4eTtyd}Q%-17BXpSx!2pSB%3Fq{9W|J3-r zr(0ve(}kl*Y8=j=e^&2yFr^TVIC$^>wmHQ z=-{TgH%TQ8Cqim8TqANJxsWIX!??HO<#m5w`})mSn^M~oEB`vN{$?afNRuTjECoFe zE!jLe@8PMUC9<{XJeAJpJca+E2xX14LI8=wYSkE{+6sZMCaFONKi#&qZ}F1f)T#t3 z*4uV{_G5FgKuZGg^t#WFu6;&Tg)}v7#BCq+pFS90_xkAHK0CZ^>*3G;?LS6`*A0*T zZQqJJNug}7etq@k14lmn;;+Y7&%S<&aTW3Wn&F9cuVpm4K>ALnf^z7rOQx?II=JNa zs3>w*Ez??~Ud)P66oeUf&!W*Y>z)K@B`B`%Sb1=4{u6DOXWk~k*9gE8=kg;VeEsuR!j^po}rXNL?x);5l2AOTtvKarTXrS;qk-6a|o~W1N3T^L5Ss9#bH}}liv;VVCJ|8}^civs0ARQb+bK8QxQ^zNU4v!xB z_{^Dsf$`IS@0$mA%^x_ne0pFMGIa3hvO~K+x-n(#UK>ZSReYZGRG5xk{9#|MLFv(e;mm;u4I+TNe!<-}rC@B8?RO;=R5D zYiDXfysQcnaj@q~VN^wUao_OJhi~d$ily9T=DOK~#}CcBz20%#pEi$waromChxYH8 z`1F%QA3daX%^3FN(qjXQ?&|b8C6RO@`_cN{#|91`Ix%tlz^BJ2`bR%MIk?~^VKP-i zEx2Mt87a|F#!Sbz@141{f8yiQ$3Fhz^x*nM4_5cCU9A5c~nila34OVY{fBoSjeJ>{E3iSl)=^f9lADsB&_{s54PmJuC z_uv&Z5tQzlzk6Wuj0}m8hDudaZS4EY51$%4dgSzx6Q@rM_6?jI`E=iV5x;TKk&~+) zV@#=981s9U4xU){L?zFE@#eO}pPw8XId$aJ=>Fx8_9jUoraEF~%1v)<`uO9G&yY6H zd*t)0KRz|GXK>B4hB+Uzo8CWLonARC2syR8*jA{gzgp6_aoghGD1Oe%)C>>Pd`c8v zkmTJYuBcm=Y&qPw^!C&}@zJ4yl|Rd3Nw9JE?6rNTPW<~PW5Wkd96o(=({q$aXM zw|>r&bM1Gls8x9!GL?|>1FQf1_ai%Yu707T>Qcpj@XET;zFFN73rmEUI%bRpN*Uxr zsi2~bup+9kY|3xmU%z{7=?m%0>nBe2kL+IgT4xrkwEDH@w|u&BW-aEtf=p>Ch_Y6@ ziY$B7XQMEsoNDKE8^xN^g1@%vz|N&FB#C86vMJrqf3WA!!gl}WqP|UQ<}Teau<@-s zjE`f7Ts^bm(D;&PbfTn_F*Uc$-#$LD^3Ew$OG)5m#*oEAp)(tr*E$R~Z!1V|FUi9 zqdTJ)_a5Cn4<21Macb>LvOOxqvR0$ly*_m2!2DaHMAeOn;(#kFlx3tutL+`nE!uW` z-#b4s4fo=z!$?k{RB zKC*gZ+p=HRu}jcNvEo)6Oa(8L5}k6bF%EO5D00D&Tc2`_XUrcP-uPVN6Vh6-|MatY zJI9Z%aCa}?v2V@vj$+n?y0gJ}BrR4mUMyn*rIgu%dt}4@(c$%fkimC9+<$ES%e{@T z5~;dkEjj|_VfxzBd*=Nj*Z+5W_tj>{dEJQ~76l@8_ujj9)tle7-dJgeP5=oeg^^54 zmaIfcmM9LDOnD?rvSnF;VjfadA}NU?3FZWVBtU=&1OX5r*hFYFLL)LOczo=0?0M!q zb1`$iz`1~Z&ddcaFuIyY_4@+-f2w+S{cG)2T}0(k=p+Cr1=gFOicdYd_t3U$Q2>M> z*)Wcx;-<@x@GStn-0Es=hev2^?tbN^_}N(2sJAh0m`$aQdlR zxfIlz`nt`>4zBy&w23X5sl0#tw2zGr^(ttv>xW4!YInd9rfui@PP^f=$Q za*SDNyAD40;I7&AcZfhCLs;?St#e!M_;i)`)6fO>@yCz8w*F=z3DVrve|691Eo*=N z{^_v=vYezeqt=D?M_11t+`js&fARRvSN89`Jr^S5*=O(DH^2X;!D5}&naZq*MmqNC zUmn=E?#GkeWI@-x|9v;#zj^l2&ni{{C{S8E&BPTa}7e^G8 z3w3evZI8{p^!TkSrcJx8wENKATTgDfU2^5^(BjAMJutuZ23uKdf&J8~9s8cVb{Lg_ z3Y6APITTDfYm}4{EfA`1UN^h`hi9+C0`#rV9zC}9x^iNWE*OpP{>pa}o&X4&D zA<089)}lc~06-0(G$;)KpT1}R8!y~624EF0gB)eG{OB$FU!VB_LYZcHQE_0Dk1+q` zwR`8+U)wDmSa`x`~IS;XqI^1zj4>ua=N^#Ga_v*H?%$L=ZH#m>-wYX zud|}ij!u?w-1G54Rd)E-cc1=;msfqj zi9(g-)er1GvFUp53aQ3K%Y5;XeQ)l(gApkO^5QS<*?DlsJr}eWFQ9|>|K$Tu?q7Fz zy!wef2iM*Du5nnf6sJoHgk)aS=loa_g5aoY%Bk+zPyTGr+|19vGIjw6mOAs3oo~Ky z_j^4D?Ie~$X3EB#8-k($JH~j(y-(@FeEjPVY=3j>k2{~ZXLfGuPp_GnY>j2T3*=3! zPQLQ=Wi<5AgR{yYD2*C40wSU{Lbw|@&TP6lpp#Nj%}b#Zp^1+Mg%K!y4B~sMj~;vG zR)yY3Yi+#lxq~O}H|mCUul;)Ktz3P3-J#j1Zkfi;f@N^;%zrtw;hRDjCEEbkJo@Te zvk(2%c+|_Js%t5IKqYv_L+z8LV|DMZ9@z8tflYURAx4_=3IT(Q?GE+YItK|S=*xgy zBaubvJEKcSCqH=OL-(z|^D7q&J=GmyhC_DVf@1R9kG-^I_4U&+2o4JKOe5oI89`dB zLg7#_<8OQR$odY@OY5pSf+#+|j4LSNcoY$bw>c%@ey%9$9~j%au|_qA`Z( zqD0nGgYb#l54}2j&y}K#!_lSPi+?qrl~3+ExbN{RRfuM!-K~DK`?a^8zu7UL zC4xz`kZAwcn@{fk#W(t;rqmCNxcu>5zuv#*bJ`@LfZ#Asy98_LOxXo)Odf7ty<`5^ z+`eP4zJ74;D@Xs+?@k=pdwlkpTWjAszg6BjbNJ|EH%--sbe(jzSr%?IRrvRu3JVQj zloBELRA7>tP)>5hERpY;_~F`h+aACDBHuIA#PLtBeg5d4(|aDhVmgQRC>E7emTSYD zcQ$uCH5k=TS09;q;yS64JY0J19eWR*e&qW_9DHK^&b?dK{PLnpRxao+_O6UT7LFuw zd}YkbY{b^nU*Ej#`PD!DM3oP|xNc_C^LKyivZ-E2_%ir_3)-W1ZaDPvqu1!xNJ?B; z=E0V!$nBulA+5iCbpO_S?~J;vLrU4@56{m(b<4#>jEt}R_LJN9Y7Zr!)#2FS}^G19WVzge?s&#rY}omx?Ibj~a<$VhtC!}I^N_eUQP zVQ|~_9fx;3|GA#NaN-jWJ#}E;Ge0*y? ziFIGXEcI2PwFD!LbXXaWhT#>rtlM|+`RjPG{Qcj&aqaB?{r0}Qg81k!b{|;x{eFnL zZ*G5VX4lRqzjdM0D&&wZ7J$~}Mib}E_~7ne?%(y`kEhTqf8WP`wDHKn`OQDckrOIW zGGiR&43HZPM(5vs`h^WMcYp7Fe{9A^D1iy%A^c$T>{~Cb`dX;sF#O4r`{&m^@{Nhn zE*}=5>|JyBmYKCb&HLcknCyP^-kB3m-!KY{B^v+wnf)i8zsmy~>o99TS#1pfTIa#} zA}^c(ymiz3`Ww!=(l^KZX+y>;3S23Oy;ZTFV@u6WlalMn`EaWeSK!@Fj8J^G7xUwYw!CFi5cCcHpF zxD;BdbNxNh4kS@*_^GE}oO$K>UtB&hUFYv!v-j}YpIZ zJd{*@`rd6XK7H46lF7^8f7Ko9AKmcqb(fm7gXpzY$j}5A+t6+mh?WpV+;1^-n(R zO!sWZ!AJMQ=U?A)orS_hM1zrO0su-WZK5}lNQzl^X*zz*Jukn0a@XEtFW&owzU?|$ ze)GwhxeY(-hpNvm|Ngf5w@z*Po6(G7-%n3Zf9|f;8}9w~_(YjUpTc|Zf9|D&kAKk( zhwuK@eXCFZ^S?a%9a4S#;dNWLufF%ge|*W}L}5lIOP(ajxt_-YP(?>bYK^i}S3mW_ z8*?)c{c%wg_P~poz|Jm+ir(WN;>N6f08v_=~A}YCr$@)*ecKfE8 z`3J5|<3)e~nD#KI(_8sD~$C{d|~a8;~Q@T%tr9yYu9ew zck0)3kFak&`+pqV@~ygDBKnu#df$PAJD<4yeZUuTuqc&7MkMA)mG2Ec`_t9O-hSr0 z)|M=svTVTiE{pI^NZas2(?)cGzZyi6de%0rv zF8K1Q$JQS_ab*73+`j$0pWpD{M=z_|ZProlrZqbb9h{q+J$d59+^+lo_Tq~#y>{)s zt&e_wy0!qh6r?@Ihbun*&@($vy!rN)Lp%TbKb$^x^rdZUe%7x)`?Hr%{qz3K2M@pX z%KrHmAOG6Bip2{Nd^gP|Kl|jKw@%K?o;Y#h$@^~p*oVIKi)XgIdE~&sxBv5R-#)Ts z^Rv4*+~U~Xl#k>E_K3-`eZh zb3M)yI|eNJ)KEdxm5%aTP`_~=XGkg5_!M(@lp8DZu-h1gaKi=@tku_i8BVDoLibr>yIPuEv z>pwm$R(^Qnj_uoLkNoFX|MB4Ammh!d>O$gWw>|gDo^AUMy|i}QWA{A0^PwO8yJ(cu zwE!)FN}>r0?`4Zjee$~dH*I?Q)XA5&9N4nz@lC7myt<56tv&tU{-0ADHtu=t*pc5n z|LoVMb$ikI#22||xhqVEFZE)O>BTKp{oR8bUp+Lx|K!ZBnVnBRHM>Q9cQl;A*T3F_ z=ry9VdW{}d?`^f!dkewpH5L&pBGH4etiI~%B}k&I-d3!d=tKz;L=r#W?|a_g`}{HI zo_Xe(GtZqncjkW1ocr0yS{Y7m6FZkI?EbDx2&7S6(ar4+i@9bEQ;G^6|M6t^syKG* zso(YD2di4cp(h>=%OU%h8z0)EJpNWXI)G3naohjcwXaS#o?Kz?ei}DUpWYK)ZgF?S zUK+;+EJ30$|AH0dGF75~?)kQ>ghLvqkmKV{DX)i_5)^0?15K0;NMet6%~@juFc*k4 z%fNZ8a@^hS^DFkXd(NKK62Iv`$H_;S8{vG`la09R9sGOs{5k(#!stPX{BYE>KF*uQ zkUZWH;lG!0(^dYQqa^NR{dC9KjLz!WdaK{9P}D~FR(gl=_q)a8jV`b5P1q;vq6?(A zK@>c0-KFc#+Qyg8dp!GjuR@RS#s%xYkLYfrZ%dChZdT%c|EwwRk^OLqp7=9nUPXmG zAT_VP`#|=-;6eGz58+-*4aBhlUoSy0mHEnvVFnRQ;Gy|#=KE-mrG_U)?20krOT|xn zBX>S?#Dw2A&$mW-P<@d7u$Qw~=O4bIC)4tbRAR~o!9$oaG1Q_d9x`ZkvLbuev(fka z*SO*@Ho5-O#lNj$Yqw<+i{p3aW%g0)DuF@M`r00t5*g3qr!iNp+OfC0@lQ6cC-oH_ z`Y*KOWV1dbv@b7b;4>av$(BU^TG0@od>xets+`)Twi~u!t{3;I^~_;)_?6T1e&q*x zknzzqHk+|HYu4wp<2~%_e@ZSDnmhOV6Nib%;Iry6pP= zcjdNFi0lr?ZlRZ%ga``uz=TWlK^Vg$9 zqzU8WI|WOe204q95UDLw%-b&Y{a8px+8Hx7Dlm_=`1^BndW*l(%HOlfEPOLod?TXtNi&6Br z`-glVdo#D=uU5q!vrIfowmG1~Np}u^^kMei9 zv3zv+ZNFbw+y(de4b)P0ecV^P0QX2W>b0I)NnX-J$@`?^O8r0hP>&urx-8K2N-?0! z->`lrMDHgLr`;c*>o*jnS})2PAN0Mpw)?r|DXS82i(tGF-5+msY>nAiEg>HAo1X0d zyStL?h*f;j6SmRd=y35hXBnDN*VX|BWC~^p5N7e{5^;2YKaD*tjEp;&c?~LX?mets+X;Gm}AW5vE<* zz1>n~-y}B=urWv_-%zv{Wn)!d+Oiuiqia+1tCsvJQ+Mx*H?H^xI;>?SWj<@b2^*UF zaCwWR*_)NBiVPq09rGa>rq4OY$!Yy4{DW5AL{x@Y-Cq_Ge)P8t2IsZ4($AZNyRni}gYbt&x1c(%b9a3$hH)PgV+Khw!%kt* z51rGCd2uN3`M(=i^R!7ndCoMCLzRmjqWAD*P`9XeeNtP5QBOx0f>C{SXIC>xb+^R_n z5LDUZW%uojlmFHxH+w2izYIh+zeDYu&5i%|Ij|--^)*60up`UVW7<-GB=WGm+iyO_ zvr+M=Z74v<%;_~08B#_x+jRn!kdhX#mca$WPZPY-D_v^OycW?vQkvbhu3L&FoF~q` zQDfDM<0 z9U8rwULsTF@i;lJ=0uV3t^1kzzdxaAmY)}vN4Cx@*`ND;V1^l`i0YO1q_R@Dv%lr} zfeERQRhU#b{`{<0l(=2mZQ%jBe|%jc)uKKjy$e0{7XDo^b{*=k9OK=nv0zl8VJl^d zqst(YL=IH3f55LV)8bYyCF6i`%H@%ys66cEOC%_Vh!rXC9rO!D4oGRq&@Q_*F6qV; z?!96lJiZO~u60#T4E_Q24{_$ypzn379HrZGf8Ir2t$?yJmdC&`j&e<>1}z{V616Wb zK#11MIryIrG2E&8PcPIoC`8Tj*86{TWUd9rmLf8ZqK=9NOOZsN!0h1oP_1vgc@Eh< z&AFy?Lcr*_L*U)igk`RYcV63zRNe;sc4=Eanv? zhGG*nP#D(3lI2r{I;KK9Q^(flP+Gr)y7^dB9yt`K4QG=T2n(2Ne0%Iij^u+~ zZY}`dk|L7nZI(2z_0J$>AP@KfLwc^B@8x=0eNMqyLKRiRtr}OjUd4ml_>AfYOi12q zCfK1{FdWpR^KxAyF34%Qg}^Ll_(#owLqP>BbffEwvEi@u@{Bs8+Ahl&Pkz9=gXRga zGmPqSBCrBYbQw|B13NT|BgEp4N+|qck(h^%>ALR1Tm_ zQ+Pd_^UiitAw{vQErugIvc9g?!>V%@^mPNG1{B0m7hD9t+^qiz_SK{DUBFRe5Ylse z7@h28yhMZ>BQ$REqQfX2MO4%b;`~$sdh0rq(p)b??{X{uFT34770>Y`a(+Rzy2v1N$92Ma%s7I+4HIjmIT)+FU-m z6!|V1?pxdLgk;VmKp8=m5GH|I+B|y70+|ZM%A{4*qrl1oN%uFgjV|8W zonk7=Q9*y%8PELlXoa>3NNp%YBo%V6$UN(};i`SGWXeQ`6S!#+S!ro}W(e#!c~!3D ztbO!0zB_)d*ng<5rY5a<{(vfqIY!&2{zU~J=Bi0ZE@xAWSq}Z%?+rCOxjJ?4tT1>4 z#c|3=dym%2Ak3)mkBdR|%2?eGy$5GyAstuF%Up$v5~uE6X#5=Aj=~anFmsctrhboC z3R>MAl&q7woG7gib2B*Tc4VG}1+LQ*z4qOii=T3p1`5u+gx6QkCXw;FA)hg8)xF3> zgzPAjGNV>3e{9CXbL>CL(<{(rkt|9L6DEMK?AgA(q&pxNBRkc=(3%xbAkk81ZO4I@CuSkFv zgw69Q(Pa|5jwA7RvQ#Sbsj7VP44Yu;rRDx?G^s0?Z7^qbt;d=ovd?7Tn|ZlbNvk+GdT>))DPR z`&zR)f*~gKp487sYmFj;e(^o?{}OQ4Wm|p^C0WqpDPD}|>FcIkmGlg;2+*Z9t4iug z0qsdX{t!GadIb~~CzM>DM~vz>%9AE>q0Gg{)Do>>1+g1-V_3K2tfX=-B2T!cAhiq@ zMCQ@iW+XMqtm!<_^FyMF<2%{Sg;aF#0SmW(lp`v>> zpga+fol53575)kOSUA(j!{Ifeo@Amkeq59P_}p~LOx;YdoYhgHJ}Rw8M1Q0ncY1|u zizs0%kNg<)J>lZ9Hk%hBsHS>JLBRQFOnPg^c`yRbWOauZEmNgbl=8(#m%T>gGCKt}FQVQGc6wL^3}7C*a%2JF4e5 zSz-yqAY&b(G=p;JA7bP1eYF!EI{3Bl~xi@bix*|Utt(q%0r0Hp-G%!)Y%HAc;c z`i3L{{yh~kqr@^fv${jYCU!z);@h*9r8r5j!8G1tO5*onTbG}640S4Rye`Ye?|H|< zmyQgNriKy^Uu&1^C(&Z?=l57AO%xrYrePzfy6888mAdryqZ&QRe6?)pCY4Zsp)9WL zH?zV=Jk2FdD(1lX#4xkz`U85sw!yASvL}UrKex_yFRc~d;lF5oWfuS1y@`xJ2@tfDA4G~TRoO&CRbMaE#p9xe|sMiuh_41_rm?u$X`*H%vB!t0Z zFvwKzxWatSvr;+#_ryn5&yy}ncnCh5hdmM9ZO#u);{-2H@7yY49_s^lEbs z7HMUK;WKqFVX+6Hc~sh&7A*F?K~B;pn=G(7Isy3KC5Z`nqa8--eR8#y4?uV_;iUeajMN%eSAZkur&Nk4r6pz7l%6Uqg7|N&9 zYlN&4=tE)_)u%rMj2JS01}+c8R3P2dW=w15n99vrA|pZm)Wxov+{QpQAeLvl83V>?%QAlK~lv>TsX>!z;1QA0-bm@4kO)EoPjx|CasL zM~N!u@i_2N3?0nZn-N+l{3qy$z||E5L6JqM^<^5h)A+a1DDAZDzhg<@Lm_fz(0DI5 z$+)wmhT@BlPRFe0LU=EauUj+=K6Vc%(4|(SwW93dYR5o{%S{EObZ7jbr1y`B7t}cQ zM0L0ibJULMs(=D1`3Smu23fmhuQD1l@|7%=u=t|}X#vE*P9G=ZzM+~9fZkpD!h#U{ z0L|GtP%~3dE=j=dQ|zh27-QBWoIi$9%#+kwxF*}GPW=8%KB;)B1}@R4J|(e5N&dV@ z`Dn{)>+iwo+QowMl4zsv$86ze1mXrJoS-vHAwC|3t#r33<|g>5CdzHO#ho;;w)>S3 zhaqL}c(|2GGS)gR1+BkUo~zHr)ii6`ZQ#1tL0d*qL{kutL|i7cOve}BEG4sqAGD$N z{(P}x_ZymZB2j3SKq*$J9xGjAA!VR2?_}l$lkg?otWtk_m+68s%oX<(Y<+lw0_0-*zVM#j%+=8ol0qU`xhu- z{jnTkPWc&x;1$h`(Qu$|L^3LYIS4L)NC^WNMzx1pL&~zZ!7Nj+CetCqPG6s$^tP`H zo>Yi$C7C&dI!Wux?X5G;PXUl^%?^S)Q0-F`{PU;lj+4mCh7W>Ac3Sp(!}7E_uU7+n zgM4g?34KTvnB5-%M%tQLI*E{8VyC{y6a!KVvJ|Qa=tIJNw@+pJ7WbP0^4SO;lZd+p zxf+d@o0W|T2{2T16R*C$GO}gmnB@&XnNrhH??B0`Cih&!8w?Hon*;N}ihX@$DwpIA zOFHJ`Chc^Yft2X)_Q~K8BvF$e(~*?e7FT~s7G2W%ZJk^BdFCOUSLeLb#Dn2zI*zrr^Jei~2^U+QOZ7OZIgL(}k z{2`Yr(9*p>pF4QK!PI`U({Hoveu?D|T$n5ojR*--1WRV=@uzXIfXUQB&gDQOuz>Kk z#cqXe`WDo!*u+w{QCstgVIF4nYHfhXPt$B=HFJcQn|xdj_mL*%N0Z$)o-irrlh`gP z{LPmS{atIAEP%sI|kwtd!bEXV{&1VzywXyEu6(=^m!R*)QQVa_M&(m)a-!wur*o~(>iD^rk=XGU& zF}E>o`ewqoWCQg%NKDmNiGaD+ON85!*s9b5=n;Ve0VY>8@Z14D1y&z7MFi+zw@gsb z+;v6U0@ViXw#`%R!0@tWNfcw!E7u4kuQzr6Gx&K{Fnlkf!gypFyeXH+%KE|jOOV<= zAr2ykkP{gs3Ur9vW2;IvkFSnV<(TRN<|HH{1aw9bTD&P*w8U~{#{=H+lFeOP*zkDs zK7r;K51v0y{YkmGn6d|bd3&?4ET~~-UvU9j0mB-M!ac{RCSq`i7|~Y2j9(c|k%XTB zBszU&)Y9->_!;Y@p+mVSg!3W6Tc;GSvOM9R5h|lmNs^yJr=K6)-y#o6Eq$gS`BF*M z(P=_bPkwCDrpiV?R|J{&VGp|AVgw-cOQ3MzW=i+!yV461v4AB7=IZm!i2OR*&#OW8112gG|#rpg?_B^{JO! zb<+s%zrSB0}s&L>St7DYCKuJ(#RD0^r(z-e))U503c527N^Lk(S^a!Mw zn~*z&25qfQ+YmVwo{nZg^su`g(tIpXbbMrn7 zHw{-+&`^XW#mJV{Awl>JMYVb&Cg=Y^wZz4Ath+K zEWtK@wCkE20O$L3>^9!iz3&6+^5;HtmCJT_?|2>OdZR|KC4na+Unv-)Mc5xBA)lrig6ARQQFtixShN4$T{H z-^k`UiWF|puAQ5jC%qi6beKXmp$Aw$Cmx1qLsy8v5zt-@>fAj8UDXVgHduL6{mZ+g z5eRE~CE1-Zbxrna)Tt6RX2-0QO7^8rxQE83OiCJIBVN@+;avF~222Ik6G6$~5Vfgu z6qP0kGSr>OS)z&18Vv-s4Jmzgkz?9CbbozZD%u8ec*QOD^YOrWOs+iYLNufLg08`l zJiPM~I`)K5s`tG-2*NP9LAaX`B52A);VARG0;v?Fge-~N!z_SmOwK*b(a=4si_4Of1O2o~@b;xht0vt#6S_!B z7KB4YxC7HcvX#o1zNU@>hu!ZO=B{-1qR2PH5&P$}3IuQ|lO)`yG>o~Dma%qOh&h3p z`uPQjTD5Rmb>gpeE&T8U)_VY7h_(Q6OQc2~nSD3)!!Q($aTA6-Y+<&VVe+ z68+@|(Wn0sa+OyyW!3mvq<*S!mFT3!{fhlrNS0!a`W z0qca*^)7|1fhX^^=gb1VV5Usf19QH$2unKe;b_jB^z86c8*$QOxuq)>_QwMsM9J`R zxVYeW4G-&o5>VtP0`T?|43wd5IRrkEDFE|`0#cgN={^_+m7}^7?|V|ewW+TS6AGqu zGMj{bbCQP0T0Kk`sC!ht_97N#Xuoslpb>;A8g4SvdYDZE2Cqp$a}ac%#f2-6+s6gkKXF4?&N5H6z20PGO<8+W=lE|&?$7lg~&KaIHWiM-cenih5Bipxd}OH z8cI@}45i8%#0n6Db{B_B*qi`i>EsJy9Ci9@DB+%l5I|_gyasx#IR6z7IL1qr2-}Ge z^`@vMsEVk@vWZ6$B*`vo7p^^a_Hgbzu`pUiqa;0Az9w zCX^VfeWqrrJDF%|L_9-@x|HNd@P9~T!yoA2!-D)aVe_$PYFCf@KCcCE*-}`YwxWTK z2Gk!Quy1YglE?m=Q_?RLPholk0PTQ4o$}~oHQ%*1f1GxGLqYadK0enLfnKRZe5?L@ zR%R62hgT_KbP7)dEHG~@o)V4JxU>svd^4ypqt`TGN}#TPQtZD{;3X5BBq(F()}+N; zWll&45P_sPxl~p0^%&@`u#f6Voy`dANEZTDy`)*vwaRC`q%At{i~o^p1O8L-Um5iE zzc2qI*9`qn!+Y60iS>Ww`^fTtK9XiJr1$^d&iWHhV>a1AcOf^t&I_(@g-35BjUL7(yu$P^Q`qxTJ=@!7zDJ=m@%2pMTNsSyiMh zCq_XNwqIbwt;n)$gI|p%0Z9hw^-4FXFIYkz2t=Fc#e+5z@aU?K@|TJenOI#NY^_QI z6HTS3ROzD+>^AMpxNu=@7^b%#aA6|N^?5LB@(W879RI>1!zn(`w-72~Idw6Gjbr+nhnAci28h0V1q5E7V>4rM6sZPrzZQ=>0Hv$34qK znn9jLkjGg`#&RbD$HcS2+I`v-V>nNM(`mvoXiZ=2|6g4hPC+IG6Pqv!doT$zyrtWez}=si!4l~JUX6r~w6 zVxVh)X&(#OfSgm{}0dmLAYmy6Am>nV5+!)_R0U( zT+s@TZj76zv2MBK{okgC_5v!w$L`Gm=)**@g9?2LBCTh2Z30@26o9%O8>kmz0Y~qh z0bJrCqlo>BR}AWfG@j&+oM3ew7AT3D$r~2ebG)`7sIEynMYB}<3=6&8c8dstvY&=+ zUOEJ~%PnFjH$%h(5YF*7*c8YRNG#kwRXvhMkD zE79xnQ2FoV%Y<||wbj5l@!0hnk@r_F$LbpBZcK_poE#R~`-o{8h54^7wvI(K$Rim- zPUy!e4r?c-h4rP)|Fh1o)$4~6E3#jF2G8tpgx`g|cj$QjZ=pE>qD?i;elz)e!>%WE zdPF7Yb+_C)1DiEGZj` zl|x-lSHDlJyCze8_>Db!{`^b8CU@Mg;;JX#6(cYAQ??q}pZ+>5`#AC*+K$zh5(D3EG)O_x;30dmQ%*sYH$+wuycCjq#OgWcxpRia6h2EvIUTJauP$TR+Y$ z->M*-=p`!upZOxTN>V2=L&MFotB{|PYcsPT@lzVp!fs^}!agK&;?iNz*|00->5e2*_dQv_BxWXKS0C#KzkeQ0PY`_@`*o+m{LO+ypd zCZX_$yZfwTug0)LSz9|MD2rK)h*oGSieK=zIe-rXMr4zts)yi+mitF zg5;Snu3ADz5yaQ8_3?ik^xZp)uQxY0t|J-j@ + #### Enhancements Implemented: * Created a `DeleteIncomeCommand` to allow users to delete an income from the income list. @@ -29,7 +31,9 @@ Given below are my contributions to the project. * Created a Selector to allow users to select the currency of interest. * Created a Converter class to allow users to convert the currency of interest. * Created a LiveCurrencyApi to get live currency rates from the internet and put it into the convertor hashmap. -* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`, +* Contributed to tests for `SetCurrencyCommand`, `UnsetCurrencyCommand`, `DeleteIncomeCommand`, `DeleteExpenseCommand`, `ShowTargetCommand`, `IncomeList`, `ExpenseList`. + +

      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

1>}DwO8O~^Hjkxb>I0v3>Jl= z9yWjn8cP*?OJRrB!QCgpa%5ZZby5b~dG7-XyA6rEs^`y7UN!Qe!O3UB(4rGZbN`7s zl=K5^1-30rPB-d}d?w!Xy)```l_0u^&>Ij%UI+)cqaLk+ZIBK@Sl(l5G7yt%N{~#> z2BEG#Oo1}!ilyC%h+iZq0(vCaw-C0f!s^S}s(io@4hMLGJVV93cQ}UfeXl(DAeUJ8 z&A;UU|Nor)_bL>7@m__>1@gU>C(H0&7~TuR#`g*tLh!qfP`@``|3-b4I=j?U%giKE z?bA>3tDF4Ito=`(@ISSS>3a%)C_A)w=xS=~YVOeaN=J8>uFft!9d&K(UE10S^hbaG zhc9?|opf;u{^wulWBQN;$JXC|!QaK>l%M|z5AT2eowC3qVtj}4nc3%zj6DwD{3pLv BKDYn? literal 0 HcmV?d00001 diff --git a/images/UML_class.png b/images/UML_class.png deleted file mode 100644 index 51130e6949f41169f4f1e55975e2886c4fe2930e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57712 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 h@Q(!kf0Y2 Date: Tue, 21 Mar 2023 21:44:13 +0800 Subject: [PATCH 123/364] Update DG and Sequence diagram --- docs/DeveloperGuide.md | 2 +- images/DeleteIncomeCommand_sequence_diagram.png | Bin 0 -> 89775 bytes images/Sequence_diagram.png | Bin 65604 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 images/DeleteIncomeCommand_sequence_diagram.png delete mode 100644 images/Sequence_diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 24f499da84..33d2906f9e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -26,7 +26,7 @@ Entering any of these optional lines will result in early termination of the com Or else, the command will continue to delete the entry at the particular index. Afterwards, the ```execute()``` method will print ```"Income deleted, here is the updated list:"``` and prints the entries in the income list. -![Record Class](/images/Sequence_diagram.png) +![Record Class](/images/DeleteIncomeCommand_sequence_diagram.png) ### Delete Income command diff --git a/images/DeleteIncomeCommand_sequence_diagram.png b/images/DeleteIncomeCommand_sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5084ce812d74e940186f565ff6d37b617e5914 GIT binary patch literal 89775 zcmeFZXH-*b*EWivq9ULo(m@4OKv1N25v5mYN>!0g=)FZOpwg5s9Rs0*bO=>Z5RhI1 z1QL`^2%P|dz`2)uzt8#Je`ky{#`$v|_SniwS?gZ&p5?l(IhXHrwN+@(u%4lyprBP# zz5kGc;^Y(s#R=V0C&4Qyhg4Va*JUf!hguXA{?{ldUc9EDAc2=&EKpE*-KL;edO|@V zokT&w_e5RptpW+DmFS9W>7QAxWRrRq41qE{o^#3t6uUB#4MQTqqtq0We zRE)HI5)A#@y5NiyYWEcle8-n3{Q~1=8;_2BuEj5^0g1gZ~qi3yc&L4H~gwm z^!Th})%Jo^PVr=soFRr3>t8uCXl1%DXW}@FAb%cKH+1;;;JDuNkAllQA>Z$wdVJ++ zOvkU8opwnHkKUNqGofnV@O!>ndbV||dlTph58GO-hqT;ac_gFNED&H!2A|3hb3{wM@paWbrH_MwMIxSNcSkg~UoB}+)S zniZmTchxSS^3U`$Zu1L5&$PO=>&%^}y`Me1m#qP13hCF_i(s+Nf9%G}zC_ciYBXNv z_&wV$u-#ET*+$4`Xtz@(PN_<0rLeMb6cpr(In%3Zz85eB|-dxrMI1N<-Us9^z>j=3+JHp^uqa@!mdNtS_8Yat+m75qaoGAKy5Rj z#Lj4A^>T5Z!h(F-Gqj5n&9}i~6w{_dV)l9Mm#w))ZzGzW#BEwu39_8g+6G4WyZz@4 z(~E>x=w(&z3=E3G1|*fy+YiISH82fAyED(N9aM==O8#Cp{%`K{Pg44kBW++-@Y_#{ zRf06YIcV=!zT~8^CW8sIAm^Wijc(;bC*6GiPHryn!F*i2vFAej z@%ZbGTO;+Wj^9QpXX(4=8fsPJ6O8jJ8}6|z+M^tnUVqT%r0?nyR@Q~~K<+e@neR%( z$HvdP*4re&rmJ80SHQ3H&^Z#`thU$UJRddRl4}syT*u<$PGh*ZOn}Qg;%26Yt zB(;r`LMb(bl`YTE1s3m1oVO>5k*;7r)C|R{`1u4S(%3LQ1Y-yHW=@IEO!L>c<+Rqz zu+92f+O|LOtqMl4zKKtRFN0HsGvWO6P)7IX`N#JBxAWGDb1PTxmI*KAZ9I>}n%3)C zrb=+n{5;knvuy<&t-!${e)PJcn%cXBdG-N9pg zp6p(75Jk36pJt^sG_lAMPK-PiFcISQy}i9^tf|T4##-ZAW6kd#HrzCKEmI%-Z?g_I7CE}RL?>44{xNTme}@OxES?!`S^# zlpl~bxpeIEpY=|(YWDinnT?}@bbfmILLb@eRC`MGx*A%GJ-#RN{MjaQPlm|kLbj)5 zGFTlcbDl6}nJu>;&ZAay)1ogcnb*E2f^UB4G{-JU|9X_3w-Hj@1q1Vs+^u~S$rhAf ze$u*<<#}jmwW#`=PUex3bV0ivxr*G(LEp5#GSya(3x+c-=&tMOQwV%gifU;O zYL8EgXA#dcJ?bC%FsK@ua=}^Uckm#g<-?D5n+kgnz{5i$cwM)AJsm?Wm@YM`zuf9+ zu3$uT`0&hWgp#)6{1J8zM0)3U;VU>(9Fa3xMTUl+d3(2-Eg_L%>(Hx`tim|MmeJVK z9=p$*|HRjMl!&W1`m!!{Dh>pj8iVqQnr2J$4suN8lb)?FUbNjkXV|Vb)_7a>?XNht z_DCY;~QVk&VIXcyX4)@`6`eM*DO>DZ1taY#w8S3%NSD-|ULj zL`2?eoDY%SNUiR%J=**+Z&squeXCpFSvz4ColkV&l)BnGV1JL`U4POV>3EpBs5t*8 z>Ki#(F33F$)6m$=1{>yb7F~T^c7iosf@gts`lyxpsQp@mVBb^-3)0??+*@3INcXzF z?L<10hmGdPNoVwRjQ1zvbaVPMbMj(lJGfu`z*D8ue}G3^y-Z?i-u-dws`+tnbaCiB z*QgqPFjwd0z{40r(wN(H(_k)}*W#Mlw6_&PX|?g_V}Syf)cK#Y-h~UQpH3ooj5FkI zWft%t828rIr-{6;sFUxZ3YJXB9^J}f>29wlSHXs$p1UHSSy>GY{29plgMe|?tV*UN zr;+B9>03u`s`2K`s%xkj;j+Ke4YTi(_&S0N-DfH?qf8Pp#T(P{?sXHaqJ0ymm)3nN zckX^1fmdp6=f0BBNl8fqS2)%Huo+*`UGM*}ziBT! zt=rM>PTSEDGsy{SP{~-Cu=U3p4hl(d(px|Ahi~g>_3sLwU^Tq`%TwM@mNRIr--tt& z{gBmpNpIs?yx8E5%+}YbblAuHLinCNBPR;bupH$+Y*PZTqVd;h2bCb@g(IKpI*2 z(vl9It5CesFHOpISGBLnTqsf8i6r{mZoXbzOePK4JN@?H%KOO3(|hS*sFO82sUW*m z`pIV$6$~#9MzYG@X!W(EEY%OX@W<cwd*c$b zgIdOnTwkl0f|K7>VGRAs$G3L6e13sw6+l;$eJZvprWN6smxsYQTf@~H0WXPzzHL{+ z5Ne;OsO`3?Q(kf^JT@$hLChjoPXRx!z5QsBm4YIZTAk|&=a0UjWl^oLDr=ReeRfH2 zHf zdn1Y`N!l&KzMi9=_@>AYBsyfWgcHdC6eWE^wJrRkdY8aOE~Y}g6MKr$T>L_`4$+2q zd2z4Gw)P(mOW%cA4L`UPIPRB_kvo}X{pUqLf3G2|HKbth@cbkjJiw)%dK5qze*6`t9MW)s`_U7Y7G%SnS92k(D8D z@f59BcLtT@ON$z=-niM((K!@hpC|zG?Be0T#u-CHbZAgoX8|h*zmQ>|S<#(=?qf>& z75Ybys=l7GP^$XfvBX;S1AQ2>Y7T1E#R4)FTD?nEhejHW*AZK|Z|#-h1sk)lYjA#& zqIL&)YirCW^Ty0i37oC4f$y*$XmuS*g$*&f3h}NRerVo`B`xZ#!1RZl7RHXOIx2( zgb5p&j_+10*n5cP`w-4h_BZ*7p9WY-SHD7JS*-6U2mqy)H(%MIY$^9)(%CrB%;~4z zO~c_i?S+UfQLFEFpFMjy*ZZlY1{-7rT3JQ&?CLEtr&p#+g{lS_C%?RFdnM(-RTG ziL{9zo#(WMF16}Zr;K+s%M}zjYH<*OK}CJ$46OK}#HPi4BPuSQ4c2HKRwptHFX*^3 z_Dbw3JkMUeoH(Kq4k}~3ew*XnBZEjTnTK3X6VIIR0hTtJ^=80E* zJ$&r|Kk9v`?4N97A*=^{*~3;_L`%k}a{1BEMTww42T>i<>v^E!@R@B}T6WL6pLoM~ zh=*CzcG`LHHxtkPS}2X!s?0q1t2rI)0(kk9Oyr;S_p!*{2|yyIgVZ!NZ&&F6)DFCc zwY|o1RdKNCK*3||@h3%?mDmvlue^{^1yV;GyE!&^J!PaxU;;iW+WqYE5ud7zd)k?^ zhXD8OQW~= z1Xn#()_!ViMn>7!PnKwGh9ygvlBvR5#EQ>^&L`h{b&Ra9h1fkf5qfUy@hi>txTK`a zh-3ChI;<`pu{Ses!{+s){Re-YON>1xwMdgY?;Y?h2mx>^=smWs9P4=T@%h*>MD@v& zMU#v|Yfb{p4mwkIanMd}-gZ4Ac(#B#wF= zpFE05iM0-#Yq&Czxp}Dt@VxGt69Dx1Y*~UErgVcG)pUtg63>40#>)oUj_1CzWcMV5>cy8$IHZ^NHouZws5>^e zzrC9AY^j!jQ^@I_-=}eE?mnhyC>hd@GioH9UZ&8YXP}&aZk-%ekrTP7GX3Y5qvnaI z3$%fyR7y@YU4lQ}V10lrfW(9lxR@_p<4w-s@{Q8KZq5t=b~`kT-&*X`UlFS+3(l;W z{H5PL=2ZO!VMV2K``Qj|db#^ull`ZGrpw;-%8X|Rf1dXP6cG&^`peh%F5~h?dcGlq zFQAO4a0>=ypmj6qTF!fC$-g>%+O7O0#@galX?cNiO7*hnB$Kb4JwA};>{H6t?COzt zO|2CsPs_aC{MM)G4~awhq27+pi!)oz1bavI9^yZw6-XR_KQ#7>hg9v?JXV@!8MF#P zKg%aL+TDPWFMs{Zrm{%-xms`p)zM)nN_+RXwhNoD_VM&hqcjYt1`D!(*)u2qTH@Ys zY0NlHp)`r+sD9Nk(CD|H%+99$wx8Zgwp#B!-1*;GX=g+sk%^ z`f|5r-$x3EX@#V%kng<~h`CpifyM^-fwT$*i1gu{_qVL-d`oLTYi^ zzK*1RA9XyaM1HKgi@D>Xgy=sfMXM9ux9Bx!1?$sE<*VV+tOQl@sQQO1b|IPvWh8& zb`ZnhD|lA+I%Th4VGj(L$&>T1OPrLcr$yQgZ<+Tui{uagA^Ilp59Zr z-@hN{y>`v+i88#{WT$M=18{<`lF_7XjfeUztO;p#J;$ShH>AAi^v{G|5L%;Q=V0Yx zViP}JX)@(ifOvK<;+#|IoG#);edqN0@gPo0m5R_!?06)yS)<8{Iqp+QXq(8>+5e`m`Axc*BZ_a zSEtpjkSe{%UB8&0peD!gaV|Wc4aI8Or`PRz4_g&sVt(Hi=wMvC5`Q7{+9SQkjNX`* zW+@=>zDj3UYVu(8jm(gCE3zMQs68JKIUWb|F@SCRwDx>BWs;LUYimWH=dR?v4AjrH z8p%96IQ@Xvnl%Y)Nkz&HH4AVsP;62@@tQwthOX{=r8&5jli4}^0JQ?^o7Suf56>$U zT>nzxag=po&@OlD*qojgkjXlGIz=6Xq#puuOJs|t@9pY;UB=zJA8>9o;UA?^fp%fF z*k=c;gls3vM1{@ICXG7+jhNMA>=X!7=Jt!b!6%!rdlw{0RzL)@x^I;y7C-kZ=^6Xx zi^KfRj!w~P7YA>L9|haVx2x|ik_RtxapfYBHt}2vS)XI>==a3{owZ>V=!wZlv0{bc zOu2n}NC~m7!3+c8Z>5o1%L|k?Z{KVSA4bWgpKy*wpkxrvNZP1zB+pfF-z#4Au3Sz6 zCE6Om3y_zA=(;e}}=xy#-Dv?Ta+ntJv zwHGn_+lK1ymUU)A1Z=?1tvayM7UmyJwN03>pSi(}x=sh437otOkSQ_zZXNt$Yprg=Y)XOINcKM*#Y93dCe1}FdTYrZcV=oNv|pvlmMtY zH653*9DHIyBl3u@$j|ooF+}&hVsl~+e$IPIWP$5uO|2QfLh#j@tq&m~o~D$!txk4p zC!+!723y5XQ`X zKEYC5d%p)iVZ8Q$kTcyhV~vq}v`-(;OjruIMWv+Ffl*w=|5ONY;(qx}>1d5N4qPJn zj$4Eq#-?JilW#h5k&oBD_wXuXeB22wpCyq)%GV|HrhrfL-6#O=6z?d(dL(#)S`AVd zLp+T~ox}&L6gNsFYQV;WqO$aG>YVT7$AaSLFizDj4pdQ ztTgowHb!?CO`KM?Wc5q~*46i@7&LGJq(lF$i2b*`7kyt0z`kBlcx7Iv40;##^}P^U zuTb1PGh+^4%JAb#!IOtdhiN*HKqWbRv?Q3n)-6H+`N$?~W6#7FLpmq?Z(*~bj- zjj0}s$2k?evjJ8g2Sk`*7~bq%FE`_zGt1~+KM~V_&51Ju;2fV7VnJ+*Uk zu2I9Tr=`)k8z=^+%olar(4bE4q2+;OqfVF9HfRY{0p!U*ivtYNNoLkZN|W~Dk~C1c zt}T$H+$OA%81H&>a1G%!27qV5J@w!h3PBGF<@~kCgA@_w-@HV=Hx7iQWQqMVgI>-+ zL~0v~*S{8Z+OJ6!>!_`g`^`xM^fNxdsRHMEQjvv73+D-E2k)g=SiMq|?^$*=KpM3WmXV% zIMm~kECIO@;{SdJqT+96~~dq-$1uv+3-PCHEr)}PKbj*uOI)(nKJljhC9 zUPcZM?tN7)HWe)BPauQ_-+n7nWC7f?xH}l}{oW^F4)-v#&oPJ$met5rF=}gM;qPCc z#8n1qK?f;>g$nf9KH48IT1~1rNo&yD^e&+xF{B+kh93eYEm^@9MdY|~rz)j%4hTE1 zlvBJ60f8kEwG19U%Mdb0x0{KZePW@~Y+v3toniYJI6Ty)H8@5>mTaZn0?`iWld-j7 zB-m^gcsnJ!Edu{Ma&unO7_?>?x%M=-b6Fw5@?gRVQlT5TK+C2dh$d~~{Y1Ozc0LFd z)O|KFH8th_+a2g>1~u-P)pCMXz#Ql}NxB>x*ej5V@dBOExDV&hgs2W5Gjm!<*)LbY zNOL6Zjhqg@e}m;Ts33SgQaiDW7f2BPjasJO$&{6*mu^Ys5_;p? zrvY+$r}|=I3~#{WxN=4Sdke1874-?Zoht37nW%CMWmdw8E`io1+q4J9Q_OgJjIZzS zomEHS<6fEP7s^m;7*+Zh?>wy-LwT`1793Dqesd7vH5)|GOf#pIE;^-NboOETTLrC)cV>OtQR$nwBDG>@t6f|(*$x8E2pa7myl+ku2` zrLLL*{5>u$J|DF227gL)u-TB1VJE=*((nJBg)uX*(aI>I7k3uER|^`-Z7BF5)S+Jb zUMA;ma2b5^YWROX3EFH`PkKB#faDKO3#p?1fuLlArq|!AztDc?0E59IJt2$>8h9@M z_VI~7DzTTpdDNLXI6DhZCVn`lvIf@rLg>o>IjHl!x9;z^{{Hd52YSj?P|&NH*8^aC zovMix6zAQ#{+#$I1kL;`RR4v7f4>EWI&KtHRaJ=%Joxt*{MC4Zd+Pr_`rjx1e=#X^ z9u2686=FIy9XGTb;W@@pFgWY}02QGdT3U_-BBI;On(6@q4l7o*4RVGqXfA<9nAi;wxdlHE@CBdC)wwsq0MO0q z4mzv3S_%ndz4?U-pigz(ljMo`pL9?LE%L79KhsrLoexGo0%-SEHSxS#q%AubdC&z> z`4>ihx-Ka7(5M7R^lFp00%bv70m`|cn)*s&Hh2xFYfGpT6%o^U1tr5ODL#3?Ia7;% zdC*OP0SD~ky$~?}0DY9CPaBgB^l|18Ye4FP%3+C1I$}3K!(YIt7!5EyXcb*g>AvL7 z6+mSAL@cvCdI~gj9yNfNhd?<$$??~wm2cou(6YZo0D=d!X;H#wz++IQ#rtG0FaG<9 zU5xGlM`Y5{srI8X;!>45XdeJ8DH03~9$xaknBc;y6Wz`*bh63H6^O#yHRv|bT$$Wy z0gMDdPjDv=AP+j$4>QzmW{4l=7zYzC1L@=k??L|l<|iTs+mQU*DgVdr0sr`K zX4ioVCjj2B6SI=&2&kgtA1VhejL$0!*A zeyGK%U;->I5g8|K>0W*ZVD_id*yM44pd~`smpP5s?^Q8l;Ydn#288;}je;8^TNQ76`JBXGKX`b+qN{6sis?e_xLqo;^a2*s~#>gi6a zFfFv|$TvPANZq`p0+6s)dq8ci0oW3C^<^vnlF}03_X`^6?qMMG!*Ep!zS${*`2gG* z1J=q>Dwz*C8DOiI%mbmf;X@0d7Gar#p=+dG$M9gC(L}Rl1Pqac}3^a^_eF2Ry zY8X1!ILg~eb!h1X;`I(VmSCfSa?rL|cUBX?|e?S`z<}@H7{*$qG4AfapPL~N@ zRt5C<2B6eGhiAv|>)Hg(NVgZ(9snkF ze-fT;;Di#-3+x-d8&KWx`~*x5e6yesZ}8ZVq0%PFCC+qjok3k~#j&VeOjJg|&T_WB zQU6%e_R79u^zcZAgAZ#bLq?bem`l*>vjQ%OT;wKGF&=&NZMuAYoD()7ak>A5}<6;b}<=phd$1K-N75k2i2?Nr64{bd84Y<3`y||47B)K zM7>w<6fJm?M0b%x&%HT2GoON&Pke;!vnJp#$NA;o1zi~8#EB!$Y`j7`F8?G>J{ZXi z8Lwzo1;~KohV*AZ8x#>Ico+#O| z<^3yPxj;-D!kT>d2~5{`oZO`&`L1CwVG5RyQp9d3LAyrex;X-hY)_ZlUxZ-(SEZ!z zdnMoOLUgG+Z=W!&?@ zyb`31ZCLI(&6W8ebEs|Lw@Q=Rv=O+ewO_cA5{L|_1<#HzV~8iL z$T;eT0>imX0O9^`i3Vg(wKhuH!tEiOc#uD~wFY$EjldkmbJsZ<&*-$gp|yr9ZQ`H> z6bB-3BG`78I_9D~SJu7zz`+5(2MHYlZxkF~S^v&LqrNk}2mDtL00_`q1=En`!21nB z7Aq)d{0d1oP$}yo-c!S#yKxb>>3wm<7gSC)tZ%5>`0}7`-;Q> zISwcYyLsS?EJQH}2RtM|3-Phm6-8q&^0r<)PN-Qw-pHZSnwCJl**i z7ncX<7gTb=C`cX%10a_b0y#!GBligeNAIq-p87jWZZ7V;l|y=tafW69pczmZj{>Lz z0NmcB{%M8tjD4@T^jeBpm8V&OW?jfgT@7l!kBJ=dJQOcKbS^{tRjN)9MAD(#Z(2Qnm0;Lz z&R?ZExgb(60;;^VQ;Wv7Dp(?( z>j!2c-6fM5nV783Oo1%`f{3EyH;`b(Bx;UNuCf^pW8-3)&@@#+Q}{Rjg1DbIfd>OA zbrA%}`2o-Gz{dbmZEXE&na2uzL0$E&$cQVAaeZk|)UwDILBQOQVt?*cxtPLM9OrdE z6Z)ZwuypE&k32i5li((*7RC!(N0z+nl;r1d%1z1l(xT_f=`FiMcA)A1yZ^$fmJ8x3 z#glhIvU+p&CAhK3s*!^+0`WuELlv~UOd@&{E(nSYyl6ZVxT-Saj3XGBg2qn3EJavr zP0uN>hLBRG5~9bLZ2)Yne}CL@-XmWr1^|-yjFd_5Vz;FauJhA%%Ls0ly=xGZ7Odae4;)tPYHAlkW^*P{e4*BF7x5wHE$c%Z{Whq{o=}ce~tYh z^nX2~P^b!>_Me~sKGy)*;lGcB{Pl+aI>UdR;jbe=fBZjnh7aV1mBu<{cd4sE5qIau z7_w_CRgIyv^Y_R99G*%N&62<6GVrlkJ(o_Iv`gW5G0?P=eCO$Z9?7!%=UFc60LPM# zBiPGg#t%rfFE*{P4t&A_1BU-|su#|`P!uI3ef!PE*Dec_e@?1;9QLTz_7o`G;IQP4 zzd3CZl77oED^AL^ll1brOtXkIBGE1FV?nj*gIns?6{0-F?xMfbu31oTu1=|_FEFMS zb8`4d87_Jkv`xSFl)4-JfrX=xJs|ZV!s@E|8450vvD$aCFPVk>jo< zA_FoE+(9>6-t>ca_GzUjdf&A31_erRbT6cxnsXCcqF3h%iiICX_;l_kixNYCDLlv3 zYVre7c%2fKXV)^ggVeJOop2EEl za=^ze3Yk~`o<5J7+~Bw%bDn7uG(~v zRU_lo2TprW^0huWzw&qC#}Z1(quq9X|4f9S7QcfVv~1(N^;*x&S+)t?b<85ASBdnh~4B|I94Dh=>C3jgQ5`ZA-6fDt6LVhTWm)(FB1aQ zFJ?|ZWp-e4?k@AJz*X~Ou217{hC`tRt+#25R9dd0vDyAF!w>;guVa` zCbg(XF@V$m^JD&lo~Hl7f1fP`*7*PR(~_ALtX4Ql~y=XK=gf(t#Pcci(GNrM5eQ7wOrnaDF=Q@x$C#nzMo8| z6Nf+NFFT3LqRK6gXC9fyU3g{^pS;jWa8(!B85O(PiU@PDOCWDHv$ftaONM{a*bI)% zyKdBG-!GZy(0gC);ZHrss>m1wuR06aBr<47ywf+Wg;kurJglf44qq33c&}(L827Vo zNWNJ8?e>UeK-&STiLig|rzh8oYPmI=)HaJhBgL`iAB9d(_*W52YQTy}_z`BZU2w%Z z$6|=YG>=+yLz&dTEY(6t)QZp$vboV3bxWA{!B`^W4cjeib&j~P#h_;5Pb*d#pX$&E zmY}au^TT0W@jR2H%?yh#=!on#lr#r+BcBMbRI48;8XT>wh!^pXb8n9}v~{O?B!8v8qY?S@}F)m)oLiAi@^E!hUT`ZZjNaJLWi zZg0v!i>qhE-FIxgQg5_U=J@qSqRm+!`$wVeqWhyIy-xn%qgWD=h4*`ChSYMYsa2(W zbmQc_*GQr1^7!^+&y?Q9cR{N2^^-5s-&6El4G+et&?whM^rTQ-Z-7e;TzGX$GXLE` zD3=85mC*slGLyRY5^JA~)5!@N)wT>gY68uxeZMIn(fjpu*mD@J~F zIoz(59YFrEBL~BZ$_R2IX(o~*)~|!(b3a!u>;!q@UfKk?_LX$=+8&*|S-&4q{?Me# z^Fb=O2R6(R{#SykgiIgzuDpaCp^JfHOO#;lBCv!2i#OLO@#Z%yM#6wV;;C%@AjiA- zac+oT9cz-z{TPFWpj`Q2t2!P&_@Cpz^hdhS)H_cU<_laIFA>8_H^Ov0Jbkj#%{Qo~ ziC_o3KF{R!pF~gA-#4D{RLbr;{(`f#x*ya0cyfUdn;L^p;E}74H|j0g!5$J4Q>3@8 zjySBvC%2!ybPE7>ey=@V>8{hjW54+4TF}$V{Z!%}Vz1l8y-J^j+@tfh5?^6gJYj{7 zGpl*HzcrERFfedme?NWIo64V`QZoD|^X$N=Mvp~byKO+_lQ<3F=-Zpk?TcUEbR+d_ z50A*VVojjiU0tnleAG6ki+8n-D`116Y>__8CAR`iy?0o)-^KIms4O0$r#Rb? zM)u4;87AU;ToADBAI>AjF2l8c9ub&GFE9V2AI%HX5()Skp9#cj)0*bbb3KHOL$*8P zoRj^DF+5TnbU&`~ybdh#-PfMgVn*k~>Ph4C-w5s*n{N9q0#%dFu;E1-T+G13?H{~5 zb~A=xuEa~4-G8IYXCW;&ePrtV-W8S0-Z{jQ%BRNB`(_!K;pyWPM{9zvw_kK|lMhz0 zT>D3Rtw~=Lw&>CHziDux*1n$Y@!H+2zs1w%116~x+XY0%CU(ZKP5KPh2aj&Wl@J?u zWoy4k%{bXHeXH9dyj~KJHezDjYKW>dRT=;F{!lnm=C^0{&s#1|bfl{7n8L=dW1Vu| z-MfaLodd)bn=M!hTjS@#hjyK!N!R_iNaFQw=M%Gcb^V=`!l}o)ol00hBjciPw zH*eu)$*o&&`kldM<)QkKVI@9GG>A#o3<4Q(O)Vg5^8x!QQG5H(*92iQpAK!GR$dd- z8Y)BG;3y0qfc0Lp8%Mk&ZFfEz7EjK=yQ)Jg#-wZYW#_!}pX!zz^t!hZTy`)`VipYS ztj|y=i9SubGlLZH*-Z9lP`0SHTdc|qs`YJe}T~2y!-G)1E zeHg8)Uuf<)vKaDdvkH9H3InRm_QB37x|PPcuaI70JZpOvDnisYJ;sFfGsB#vx2xgc zQpbx=%z4*s_vpj>TvlsU=zpb_&Nsv1eZqTD`wC3Bf{gAuBS%YLDLVz|EgaS@8svIW z;&w*3i`Y`}4gUT?pP()~3Ea9*c4S~6H*O_xLpU-;qW$7M;Li)V!&QAK`~M;FBuA~b zw5M!iWLEln=gbPhMVg^A5in>AYI$rCbj+C~WeHuS>Q=+e4mRIL(i+0w_baW*{!zg($eXSH@5r74!52bK}p0#v7-OhqE(F=J+7|^ zbFC)N@}8qE*Q>5+0zPTI@O}_JemB$WH@L;aRbvj)H@g}>U3IOv^h1YO=ah-h*|k%; z3!q9jZL2rf9ProD^RD4onlLdnxM{~;Uc2A=r%BVKq)ho#07M}7Lb&j{?t5$(8~+ir zw|}NM;U}4%y)g>F!WZc!__Cc?rHkxlu=HKVV3PG?@f`a&l9WNxLypbp#i1eyZ{a}Rf5 z%ds|n=835Ys+^KIjSQccC~?s9LTJ62#nybEU8nnz9)mY>_`G9$8k9TF+5zP1p~5N` zN0`2H=B1UyV^xt4!G{^jC)<8(f;$Bu<8Mh#%bDRI5}Hd7JXhnLhcYWHSK2N9G?r%Z z4G5mya?&vVzDQmA10N-jW^%g|y8ae^rziAJRph{*T!u;~jflBRwW7S};`o4NlU;+C z>%6NVl#+K+zW1u+pdfT*fwMt>#_b3PEyiaTt2mLc<-Xm5u8ZlPv^h#DL85O|9J5+& zTioAFRoB`I4%sjd=dq+1Rrz5kE@(cHU3WqVDo*)P!0ssgkK;MK)k|6UG?aG)@Y_|v z@awOEFvnCZ$gNt znoQft+xV#m0TanP$0*M-o9mABfG^g8_}d0vjus5g+_2@ zM3$0gmy&|sGxhgS!6g%;0$zU0*Tn`9!2`6-xWbRd=J^87CPmS>MSn5y+V5-7D2mujR21&Zx5TsC&he5bNXq9)i{Y%n}P^?iuuX3 zwRf*HyK?9Yz9EOMbEsJ1D1W_n@OK{+uZb&g-I%{?SAwNMYnKZ`*SxGg!c6NFWL0ZJ zc!6ruy=rbRaSO^Nv6f9rQV13M<%uzq%>xan{2hnwCx&tMw@h4Vb8GfIdIcrA1^ChQ zJUHAO8srZ=qOwZ)wxiIOJa73B``Qh)zj!n-;WAMI83Qc!rri-&!$tv=4SD=>$DBZh z)Ywt5s|?4?jzCEcd~Kj*A}cwN%(Okvb$I`1pG#r&PwugnA9i>>7kJC}D_KV)qp*SK zOOjsr=ZX0W?)dYo(XV+In@)7|7iXt-LbM^it{PSnQVyRKJY$S~R|Q zWT$HWf+srsbSK+X|G*C|b;4jly@h5Us948Om_sY^Ih3-H(6$pMy}Kko8-yLzXsBpX z!!|ADge&=+TfI?Xk9E1Q{k^j`^RU3UCN(Xt6#lseP6F6;YsI;~Ujn=(3FAj9oR;I# z*G;$ePVsq-*>%bdu56J>o&{t`uI!FBy-+l|yuPvdl$mHx4#X<9E$Z8BWg>f4>lHGB zA8z#Iq>Sepc2$43^LV!t-3LJKq?Ful^t;~c8KtvxX~uQrvLC zcg(4pZjY1qWM{qQ0+lM3t1Fr>2H-KaqM-N->4Xc*wc;@igCYku@jD)b=8~DB^K=lF zz>c$6CF2`V{Wi(o)!6e;0x<|c4(C}d^Jz(g{{W zW%!B;^i7=i;KqbWqlENKX*We?VX&W-2)_DQZRSI2>!n0IPG+9a){|BYs%8*pOpaZ9 zKq2UwIwU8!chaI4Z9PhcaTy0`P5a+OuIyColj-9W++H>ven+%bzNnjSU-I$6B6Jd( z5m4q}xMa5J=X&RR(uKiA*M<9T?@DUz%S!6eY?nYOQ~`X5`PfK~v8MedvvwT&F#INb zxYpcnChvVUOagiP;Q5{mcra{uQs*cUuq45nu412zU}di6GBZ=0pD}uJUyw}hz^TOq zlSUld+@hQO6VjXTrsEq#g_k3y_2l&&Bx*$VCeX-ZOaC8`D zjB&|Gs!S8IpuCqy&8j4Q`1j6Qt1<2aPdB-ZpqwY|jAbtl`fUv|Nls=y`{uO>k&*t* z#=~}(n-Wpv_bJYO?_v<7-N@OtfIpi6d@`?^9~FJ|Cwy#&m_>r@4mEh(LTsZz07{XS zM+mL9O^DE0&G(E{X{_i~%9$v&MHt<~HGzQ7HPkbBc7|2wV&Z~IX;b!);-{Ewc`)5m zrNTLAyHB??Ab?~JK^~Q9*Zr1m^u_6T{YmW&reKP_72%DiLG%*e0Zuj60Py5DqG{+f zj_In}S*U?hV{#6EIPT69(79jWWOFcS45{Vl}`<)--y1xY*fT#Ow7gneLj zJM-^qP*M}j2t!Ma*cuzpkue%KsG?s13~{ODbc)exl_Ln2Oa=BszyNBR0V-&^QYnULBfzy- z(q6$zB0`oL?u6qY5*>iQbg!mAFF$JZx*rI7QU+h0pVqIw9|~ zpl^oR{dO%Ep|-B(Ofac{s@l&*yO=>YZ_)!?UYV{#v~gY*(nz1lvQ+=N4(m?)_IjxN z8@xF4Q?<+(j(T3T)?CdyT06`caXf0{>)0i4s@e`Tyx%imp;nlGyxKg{Yx}*HYTw5+ zEPAat@e(Y0#A_$G>!MKF4I$yGuvI@Qk1#uQvX}DPS;w%6b*qT^?OxWKYOH?4@rr~c zwz}a*#%LS1pz;G)cipsOL1A7TkF}*y9|)P5{)cJ_{pj-X-( z6M8oiXSQjOMAMG?cG49_8|MqMZiGn*>)Z$|))bPlAoXiFQe3dUzJCF~{^ld1qKDWV z(Mzu{9};M`434|bcTltr&*GNC@wal7@f;rWw$s;@bRAFLmOO*Bk2sh*qtwy{;0*nh%Bj?=d5q$;mt>GXMb@F zWT7|c7fH0t=gJ$Y3@^qn^eP;@bBlo4m(t;+mS}{6#tV;8Q0@g!;S~mTRNgGjug%j$ zi8DUP*gTcrvUod|L0Vk8_lUYXrp^V;mC3U0numF+?^V2nQY7EdD>G{ zJJgv0YveO|#dY6WwO9nw2+y_O+7tRVTRYUZojrg~*3FD1CKkcd#y-oGI`jic?O$0C z!uW%gi4?B#+d5lz9%`PWi&hr6He*W)rUcBaxH9b?wE$F_4(glFyQj2#P?44~fvre5 z)3d%APT#tMy}dwePfUJ!C1dn;lvi67FQ4Er^ShA|VX={6YB}$@IG=1IvkYPYmQv{o zyy;1Cqxi-f6KM0h=_gzwZqm%8+%W)W?4JB%P$^d%D&Iktp7b_{!E;-)aFc$~i=zzs zF;%Or(Ml!9(44qEN(yu98o%ZYV~KHtN6s{uTT`y;!rp26cjswP(0=XANwqq&IjkvW z5RDg3FII8~s?Oj8P9F$owvJ&fWZK|@l@c}W3&?l2=wJ99zZbs9NHps>4r6f?WU8;L zx?l+pkY+U^eM9RiL>2k?u3FVyFuS?S^5p@i8E0v;vt0d`*)L~T?LI6ir#J^xMKz26)jL9K=OXYlz-4>D45~m!s$T3;6(6NfU$n&^cB&LO}OUZp;o!_X;Jk5 zV(-19n%cg$(b$h7a4d*|fC`A9fG9;liXu$}q$5>Dx)hNPAy^QVCP-00Kzffz352Gi zAR;vc1f(cZLMS3VA;~v)@chpEzW3fSzCZ4`_x^D+#yJStd+oK?nrqHyK69?QWM6>I zsp%7=p!wu~WqB73U@tp&04lV8_r3giveEhlttCWO zOlHe&kfVk*eQ(E#+DrV1^>3{i@$EX~I^p&CJL{q{tu19>>?QAaHI^j5HQQN(7qz~1 z8-@es(UHHkihs;9Il%kb=Qjk+f1GwFf23CHZ)&AI^e#06FAE4WgwO=U_i)WBN9mIc z&&Ugk{&gHnqfG2IeP!iO(`)zNwI<+K{G__NK9kPK4a9=O(`xAC37jY-t6b0idP4LY zzebkBZaM4r*K2HLx|6AwtxE^(s7t}$j8$|W^ICX>CNt=?=vHmvt9J_CFPt0tbdf>g zYBRL!AM)N=E37&%q}^VCMPJRme~KgVX)2A+d9o`IO>i{g6_y$p>ZNU{s95c`@84}J zaz0+obj{=5K808}?dyiBbw<{`FZm5$*}XjjO9&Z9oF$3Et|idau{$t})oMud+OUBo zXJ(Q6nM}38r6OuMxXVDREj%1zXF==BY+d3*`G8Af`|IM=rwLrY_tS0kLg)MxYRAi^N)J?+06TZ8 zC3}E_@Vmz9mgT??i{`>|UBr_DLfw*Maj>W2_JvR&Y$(5e^@>YDRHDy(ccE{*Cz@8) zbz=BbaTT9f>glOmc>`K`_Msh5NeDlr$amZQ^9)AZiEM@8e+VC-r6zk?gT^> z8DZ5R{1Zq&H(S;!W0U6Lb&;?QTkW{{rgn%jR$(m%p|SFg?NCJ9sEz6z6xX2qBFg;q zLXb(eP+dR>5)-j*DSK>Xen_LQ(y{QH*z9uGleFCkm@@uWTG1@E(jDo94HqEAg#;ea zKqvsjB|q8sc6pGt8Zy}EN?XOKM~fXGv1TgxtTJBox%Dd=CG@Ra_^l;)Am!&vI_+Z9 zE-5J=wLQG>zTh5dM3>X7Gdl)(zHI9RcMbC)d>&d);{k9;4i(|TkWGJeF%w>4t# zi|2d%xM#)pd~CH71?JE?#jS%&YYK7i*9AoY)>IcHpcYVr~&~2E5TYf%NhYX<>3#tYQOnd+6ESN97SAVX#ptQ@mxE~t%;Uza z(b%TNJ+EZl4uH0bYdEadlZx*?wa3TM+;{M6MNZ&I5N(xou+N8htYi11 z63?C54n(sdg>=@Cw8eMls~ow~C2?;vGea#dFK!*K{$-K95qn+Hbhs-z|7D-iq(x+> z9BY_bPsHuuwW!^7wVT^@i?`1qV(zXQd1^+p=}S9AFtyq=FKg&7*=*r@9?$J=`ti$} zIeIzR4x#~Rg|pT95Omh6rH6`CxaT>DG`;P?FFX;Z%#kr2VA353LxTwS2wx_sT6zZG z*wb31Db1LXyRS+@sGM|ca%R0*xdU)To*%VBr2;++uqK}C*vq?xH*|JoV~;RPwPGJ{ zp&5p*-%>~A?yGe#)8-W=uB`SP^IqF;%_!c!oifAHhPa5*wM#M@ovey$5g@qEeK>{$ z&RET^|5MM=`lD7w^=1lES;hzD{U81ois(tbzIwi`Zf4Ncfj;2v*snOK@9>>>fWD$P z8o_7nXQ@Ws>6!E@qTjo9wHwERtAqGrm{;MdQf9D!jDmm~LPOh(jZd};@ev;X*lifk z$Kp$;)IDU-YM0$doG|*<7BBaGo7b{9<^BNSx6hZMf+Dezhfnve(E=dqX7r8RK3UTt za$-49Q3uFKhgI!xuAfj@Y$H`bVAh*{Wf=oRhyESzMGcKo>4U$$?yyhKcK$TSsoMEo zcB=O*6+a5Gkni+?T_(-1!;ESI;+M}fJKn<2=j|hWvHo7pB6K**kejX76WG-O$+@Yz ztGjR1-0iQbn(i|=SO~tZC-Ee%qXD^MHG6Y11})>&nu}Z~N{(?1c-gZ#EU|DtevX)!y>OOjOWT1^;BmdG(XJG0NP>ocr&b zDISM@G^A}+yneIq(lZPXNhHW?`j*R;;6$tIo5t(!DLBBc#tNTy#_rpVlW7L#HmA3k zLdc_fNFYIVi04Zl~fyD*9I&B&iPu%9P1RI6?m(vNvHkF- zzlMY6k4S$`m^q5#xyWE~3(U}Z1o@2L3#h7+KX_eFZdkDOwR%?MBaP&XhDCh*XuDDe zo$yeTu3Dbm<|c7KQmB&y#j~5+M!z8Kh{e`+^3SiZUHDJdq~$jhGtn0E9>s!6dTZWo zcCvnj6Im&jT-q>O84;nud;Vl(s2W^FW&t%bK+I(DLjEL+-PES&8l8-Mly)}_kUBS1jNa`)Et$^{c+z=z;yy6JYX~o`i)!d>9nR9Nf z5#^E&nC2Ji@f#L=9Hgs`HY~=9K8ebFyG4z`a_!|~9rfNG75t8cjpIT=^;;wyIt4U3 zy9;3(|Bm+ZF)oK`R=qoh8OJvi#0Lg@Z$6W5-LZ>X`r6Q*fN1XfK{i7M+LJMUlkdj!}WUm z^;Vy#8*lQ^`i7c4(sO@I13mxOkeiFST}C}7E~2LK#Dmy|Hw$O4WS?qJHc=6lJ8HQp-MTA&_Jh*05={9_C-&*@I^!+JcAeJB#=0)bKIM;@1z|-S^1}ES!(%+_v-|MlN zQS{DNmHkN2Cyg(Vipv>ZXomC4F3fDXJJUEA;;Gv9Y-CY7FlTeB=8g1QyGuwfIXyXq zDpWVU4ZdLYc1y|a=^a`rB~PWd9nyHC!rXMfzN%7X*7xfBRrCx6m@U&MHo#?9W(zGj zmyoUI6E#G#fkD7U_$L%wR>Lo_6xEdH73TKaBv52KgaFXA5*jGjfs&YT;x7QVEO2tkQBG-ePFvL&%6U(BOb?l-#nTr`_4K3pE#Nd3 zNWcuawiz*q?JQ>xYT;=`g3%eX0c0`$fcauIHK%SvW0BLR`8zYcSel0@Ap)e&4$s1= z@Ib$*s1N}S*V?ipoq|Z2nQdPy;%389)$2RGlZ0U0vcnUlo!&_qANRJ87(}~Uh46^cErYN;`}*cdQ5IjP0}RbaL&8XCTU@%zr9p%*xK zh2X>|A`&Nnra9rZ2D>WU?XURe;ta`=^zlkg0S&9FX)8%pwkqhIq=p{`}Vq9T=*=>St?7_2nd}!Cl4H2~kg#KX1Z5nLzI{Ar(COD)7m@tFBL8=4toht_5=3$)oavn$;27;*!5ZH^3s&W;{g!d|4r z!283r{0&g$d%4R1OaT1)cf*>Kt=*}7i`H`@tY(mV&~v1T#R(FJ^ijMF0$Fqi#xl^0#sa zZeD0fy({g~R}hG%I(EDlw}_}mXp!=)dsSl2DWA` zY4`3Qf*OQut&aLgg;$Z%&KD^Ov^1np=Dx< zrH_h`j?s%r@)xhRwV9?=FB7*G;&t-s)K>`_DcHCa8V=_{zn~9UF}hvMRx{WqhQ?@o z0V}%g6U@>Ks0-I&@t6zjmta8+D1)dv4^^5)m!ijAYH)rp2hD1<1=S)PVVJ|lL2jDA z+jq`A*>maACD^SlDS1hjyC_pY2uJl3RJ$Z+&;w(u9^FaUwtqP@%V)XHeUW+{H@_u- zj=eLzRykd3sfL?(4bjimN$fkkcSu1*L_|Vz6;ZO4$elAT>>CrdCcCy$|N`*~pmNuc^ zjOr8Yi`@dw8xH&3UiDQj^PAq*@K>!{-;R&?Hv`k&qPot`=uch~e_7=maN#+p(Ko+3 zQMY7%%Ev7`VwckEnSk)EsMO;{SACvI7g_8gokDqRVrs&-TgF%#v#cZpf0jPtbM8wk zOqprdY?Cist9}K$gqiDnWbWH5WkkKQsp)_HyH)1>t!X?fr4=``w%cva7!zl@ey@vv;CprHQs@tW|yc`*1Us$5@IgO`|==!uXFgZbu$C zfo3ApAeLKK#*{KMvnIc*rL>b>YYRca_Ze0gSM6B76fMCu&8dmWTsFcItn2874%7pL zY++F;L)=i=#kRTy&S{Zv`QAfjdlqCBSHF8pk$%thQAljGU-T3QRDFHKw++4hW6Z>LEmMHQV9OlmBPCb38>))P3zrj>gH_o;5ABJ%nvy?9x zDF4lq;_6(hRGTUZ`u)f>(sR^=ZyIJU)N1X>dU2VWj<$IECErSAK@D=ZYu8F~dhFk` zF9+w2;{r9F0dtRMWO33Mj>+h&bc(zb5#zYFBZxq3BUc*!zV=h@?uvA5nLf?%ZH}e)2 zlQsf9=z0QUMk90@z!c`?JHd1=)?rrjf4he~te$o2*u}~hm(9U2_iXLwFqbtaWL=gl zt7q-8$p8GzP!^3pUmr3`635cD?r*bu_$>s>1BUW`pJU%or0S1U*?7@_zvtwFgN6JZ zzjo?Mzv7zieaM)Jzz*yq=_BZT;M=@7U1eyEVhsBkf?Swj^G~TBB>{A)L+A{ZB)-r( zL{ICADbcr_foVo`ZiB1`+^l4l)pj)}+{qX=IiUtn>vCH$q4gr55|M3WMvIp$K%LWR zRm&vm(5lRP8D!eto;?hv=crb~UZ&{@;%(#QDMa*bExpXl6BuO?4LmJT(_=n7wA81A zliz|DxhplKc)jKjYC_DVcFs?0zl>`1!jR4h!@$9I^?0P9I%?uBqQW`1tA5#7@%7BX z2=(|N-p`!)U9}s=*?a8af(0+;3ZICz{qlSl^7QL&pad3-z(_sv*p9+)U$3r!w1xWL zJKXHrhLCjOPC?Yf(SIGh*Kfg&Jz=)@r{2(!T#$e25}$#xvUP?g>1jsB#Zk5vT|Ww{ zH$9!-g1HMB_19hIMq^GMIG5l!z4DTH?HU}E;{@l&wRTsvIJrx2#yKiLtg-OxcCxNr+GR{hkScO9AK@!Wtj=Y#D~oR%IBm z)gJ}b7Q3)~)3*s)<&7W)R_9i%IpPlznaI$c*}EX-z_vFddKCdEQv{u*K2OjU(Tgzq zh*1pIT|b5HkN%z@4hA>{AGJ`hynkw&Dn4djMA0=zz+tv_6S4yaK0%?(BEl#?Q5b0i zwxQ=Euy7&E575&NEmUrB@|ch2lxNDrf~n`?Vsu7vx_GFEFz1JF`F8fxvdnJ|=`l^m zZj{HKb-^mrHZnXeDkarvV}6pfiISgHF5PLvY|E{KS$|szYpAQ6%bd>x%)bvGQAYLD zI}hNcK#HJks!WNB zin`0b94{T9&embYzqus}07NTkbLh{>Ii{kb0>yr`z5Lr&KL>yg$jlH}Z)Z4d)J;h$*u>WVQlIVboU$@QyVfKqqSgWDR}f#y^4o=y?^Sz2y}uh%9g`{10vb?-Kc=Od zCKOo#(3^s*nrR2LqlSl*z)-_!lIYe8&gNA|m<{{2w)w(*yLJ5XIp=umRu{BrXh3Wp zseD~`!08M@KqF6XAcroD7QDLWJ)p3TZG3?luHWb!%}#@04!}%Gf+=9>Gh)8^q5Vt= z#dAQtk%tYcXA=@U3*LyOm6euXGAzr66LSjTjiH7Opp3lw{;F>-(*xd0i3+`Wbu@Ia zwv42D^ymh2&_ui|tLc<69xEF>H?v**2Ie$+9M{s)a7Zs#d<~9*u37C?Z1r~rdpLPFMG;w&L~v82I<=TGg<_s+803-xW9Wi2BYLt% zi3zIPEDGCv{HnawjZ@ZRe$}3^Z(x~VHIe8YuvmTBiD`aOvLVb>Kk%@BI<9{@s(Jdc zhw%A?B+)07>V}DliATXMwVpq_3x{&R9{c_1u$lmuhJWB3v-@w?mpwkbyW8lcgJXop zf$Q+28!!T;@pG9Utpz7rlaeA%GyFu=j5uhhI~V1JOYvCsq4isM+rO`nC|G66xsuF9 z5W%wt*#rdy5M2%n{CaA2TFY}0mhsS3ln)1ZO}wbdHRv|F1|1Dly8s@5OkPGCh`rOat(3TsSVK>>kmn?TZe|eaS71{ ziLTX_GDAK!2P3l7VpR>NIg8{(|Y<}b8=$Xy$UwH0^t3(ngq+2 z1l+OzVLSfcAqTJB{m*bP7utIN{||*7^>9n-8y`0>z_51yk zi1H@ek>ip+neofqk`nAY!gE4@<(v} zg@|9x!x(Q)IO!4wzAwK87u@;x?ez{C!CzvNyYpRhX@plxGlf}-t>-`U+FBi0E=~;v4BnR4FZtnbwiVAfZ7L-ZWzsRiJ8sO4tE&kQPNzbfCZ_XKK zZ$|COqNx&V$}}H62VqrW&`sCSq=#fl*O@7GJ_QtNyrrQGcFF%|VGrnCxKItpR;j4< z$K>7wZ464i@+6jrPsqPi3yul9q^^F&!^0yZaTDsq?dl&7c&Ur7Ws3x!&u!d!;8Wg9 zKJDANSs#T1=7%uC!69@6y&r~038%LHR>C48mtcIJJbtVT=lA{?86o!d<$?Bxb1=Mc zm|yRfn6U5m-_-7O=Af3}RMQaR+P zktX9dRD1_rTxQ;g)gk{@M|*@(0p9wixZUJt#_vq^ctjDIm;P}DCR6~Ac&#MC3`_>>VTW(qS-$dHFt1vWF7sUU`;Lhx z$qnH(mnMMVCKPsc6UlWL#^rX}5OqoZl9mQrWeY+VR2sMKr1}^G*GZdUZzFx`(4+l$ z$46dr73(O`QOpI|;2$t}DQ&x;Zewf9L>aJF8`g*S^;g8?f?eZynM}skI4r8*m-hOouZre&Ygd4eeMgt)yC&SuPoR>d=hKuEZ3*4y z1T9GUkENU90`H$HpM7eu@55qEDQ>swkU_3?TVS$S4LoN5c%uBgu7=HF;-pl{L?LcS z|1u-+^VeGCbcWk~)yOb?b#-pw#m!2_k6wzlG<%+7wK(gkK$T~#Kuhv!j&x=bQF&RXdwUh+{Lu+ciF>@Nqyx)Un~o1%`SC3q z8OdEYko%s~X<;KESg{+^cGZW7WMLFPF3e{4p5|LTaOkS&K34klXmo}g-6PaUpeAk6 zNztI{ms_FEfW5~vo^vbd`%ah^P-kD}!1cr@HduRj!%|UnRl&Yc)t!8K4?6e-HL|ri zatz5v$V(&BhCJll34_}`7RNOb<~|ufXYC8$%V@+-;!IDd+DrSikD5j;JfSDQ(Tk3$ zb`0+z#Z^-MMa}3DM|BP&{USQC>?ymoD%Xb>RgNwl{epQIOeq@g9E`UI_x`dnqA!P& zm@qH(YRUMRVS*o<{Z5$V3=kM$Ut+?gS$Hkv&5v(mMP4S;F2IbO%k9)`%hF|Kt0<x+Z7yx6vnpafzkeUUdwc@c0Bsvvg0ziw|I@#* zv-&atxnAGDTb5~dzEf5tPWYgy3(}*qllAe5(qstv3{0JBe=mTgn6wGj7EBDre@afw zejqWjy6L&?@Le@t8QGA;v|q2Upm8uECJTPg*miF~Y3*@hR?b7^N%{VGNv!4Dd-It= zdBnG#MBD)jyYbI(%xgu?O2L3bSt0FKkM1Cez^0*>DE-c}XoGzos1gICZrya2a*?HP z=R{3PO^!!fMiFo5!iaWbX|F8KV%ZPiG zl*8wGKj-Ud$)K2!cU>OR&LeD_&9%#lJl7vWCmxXYcoc11n7gEWRfkqvXe$h;7)mCuDL<7Y96@!9Y0i(xxv z6P`2*i-~ksb2fL6Px(8zTCC+KH=y^+jTsf1tk&YaDzEtZ3LPKV7E+&E##p(mNQVSp z`5ND@@Xw!R^HSLOx>t&=!{+^Gw1zbOkI&$pY)ZEH@z~w`HXA;-+|^gs9E=bAFq=n{ zUs)V;ri@d>Jz!`&JAyg)50sSHDNHV&i{aC^3J515>Jzjan9kYx-i0nNFr%T*20L5Q zU0}DD4G;0@yZZ~HSuK5~zWMJjC@;3tmiLeMRm}#?$@#(Per{8~7 z!>nc))w#?>aIaQW5LJm-;X`4sDMvmvRPs@+-lm z8P*F-WY6Rp4KrXIT{=O`5W)F^qVOE&!5GvjbTk;mB(rB`TFHL;jG4elkM=y5Gp?($ zeI!5%=Qxh89a`>uBYZTHr#W}NGU(wCw=3r3j z6dj#2QL&y~U+wItuBH2XtjX(_O_T|+@_JOxyp(NOkuL?~AO?G(zS=E)Q9~?6l6Lm3 zawX&f=?rH*w<}LCC@V{Pz27^sjA$`rWOwoUUML93R?KXxThU{u_sCO7zpk@JR$T=? z8Tw45bcG|DQ1Z~&sY1%c9{FFNMr1wnlsLU+3WRK1q`H+ZTP_yE)3wmz(}gNnLDF}U zj)n;Jr5E&h;iomb)3l<392xCn{qfR(oM*yTcD#A0rDkVITdZd=V)wyt8jNe}PX66t zSy}0eESV8gHeQNG{8H_Q3U;;-edtI1h)Z`u8RLq*{iEFtVLgNBZDC|e8@oROzmQIi zcrPI$;7+hb4Crs2WXbN=3kS#3Smd0hJ_z>}AJ+#RB`@JrlpHX1o%K=WR6(6T_Mqey zvc8PSadHl<_i(4YN#C4HA01Wz7uE zpgXq)^h)<)S1py7jgBqU=|PKWG=zM9DW~GVxO+ePGoDq9Z-07W|EaK^sY+kV zfkUuHu;0F&LzE$y0l(GY$_9V_kwENELnldpm$ZE~aT&jUy`e4fojDegK2<-njX~xe z*srKMGW#MAw4Wo0!y=-17IV3!R&a1=v4Pr%a<5h*F3&Y(aL3M_l9P0oJ6 zjXEH{B11lOS{JJo0xJMh4Ob{KG@2R9t_YyAZu};q;n*W)4h9twGKyuN+4gkT&e;1~ z9hpeYB@NMc+*rQDRq{Q5^^VoNzH)uE$RhgoWgT4jIOUwRaqZIGO%!e`O`G#pfVnA# zZM+BuMzDerdf~BdRrcu-@175i@6tXtEO9vZRU5*ih_93%^hWMAeLc+>%!LUdjdIeD zfR2JOC}q4oi~xgdJB2*%kw$x%b^M49ZhzZtzXlxAG8`YJD(7Y6h@Mmhki9UXqo^4z zp)%Dh{>AW`l2Yt=dGAJ!ef#oQ^d(^@v^G23k@ z@9&}CQ^e^2a4ClJF&-H)OCJ)4{O{qti&GsfE5K;QCeIbxo;zju{rW2|MX#_pQH zj%&@@d#hGIK3Kt>01TyNM-i!Cg=5Jx=xs4>C>BQ5liOA?tit5+@J6&3DmxE)zJlKfHz(`S}~IMu222@4sI^g+_|gr4U5Z z_wF~5E;PNS6ckteyLnrCvh^1qpF9_U53(0ajYHUW$$Fho18i30r6t`Kk~vC_F{oTR zz2W`O$KG6xcPa-g%UlQIUP(LO3-1#Y1~9$ph8Q8M#q7A2q8(rp(6yJ6s2;KUt{cbe zlNoEN3t_I|!aO1DRecj8tY9k;zu=xqX!s#h5th)YrE@&z7M>MH8gyGoN_xF6w(toa zrrv@9h!$w^`F%AwI5^KAS2Wo-dLf-VKa21)j`0G~Hi(}%-4DaXZ!W?YQ_8}=ydy79 zPoZ6>ZN+Hmn|XS@D=cCdJOTkk^Xqo~n3J~E(Z;p6yOpwT^?ktj@HEa-ox479FLd|M zf_qzJs9i%oKt{THWwLktbD(hpxFKuLg!1JXaNOZUvsR+i^jvm$P}6Bujz|JLcck)+ z+pnh*Qr60eisQms3BO;vgz@Q*KF^X=U5-T2cCxa))p)_m;WFY43Cj}G6AEos#E?d#&`iC*?Mt>8^$qqoCHFMX zS|!eGvg+?HU&?EkkKCRv39nGoEdw06pI_@d*WYk_^sKV=;?j`9uN|iC9*g)DjY^tQ;3qcpokd+41bZQJdxn7bo|H^ayxEbjaS0?)hq{8o34aBf z?Z3>^?u`48Xt87R{H!IXW^^25cE|&u)H>?{D_07HKnl~U@8>s`4)=DOL{2}sD*=u- zGCG!2pKcZNq=mRSeEs*Xw;O2TBvx=f{DW^_fAy+?%K_B$WN&)nJ|R(=CEWN}E+|tF zrXJu!9MNdd7+XJ>XW29lNpz3HqH$h}dY6T9js++U?vX}xn!lA^{zzn4l{V?XkROj( zG_TLk?SS>u6R+e2zWnm4_&yj$>&%fU2xTIA(zY$2>-m$;Jqtd-v7sv+N+fEs#<`3N z0*1&626pe#dSJcjo7m@c%n{4TD$$?2zZ}OTd6H%98;dTNISyO`c0ej3s(Nxnq`nh; zb42c*%FAH;s3rsZSGn|czK&jf=K5*)JYrUWW<&sIKclAJN9;IaP|#HN&&i47iy;P9 zu7g>C0f+$7kuSas3~`Uh{PD7Qs!r9+Jj*ckcHD@%!goSPk+wjvsIK8PqJUsg}zdWssh{DG#2r8);hkT z7bPi#)aGpyvnfS{Xk)r5nY79kikV%}E;KFcEUT;Po6^f0UF8X%?A^FY%Hz{DXN|V@ zXd6cUJp$XuH9S_qlB%;xrRKL~*8Fs@G|dtD4b^ABvkB*NEVK5jD4$fTH6nmrr zV0=1paEe0+*`B@GdPapZQ8lRqh|KCX5TS$i^=k;s#@87R~UhxX)!#QRDNV~z2q)^DO z_J#v&Vl!p2<0Au`jrS(!sbEDBc)sIJ@7@9GZs$QtcxNpo9#DnvS;P5jp4ipvc0}v|Gm82(|-8A=dX4hKZ||I7tXGbWwo1{?!CLs#-FLx)ZebR--#neGohPMwh8 zIU5ZrZbwu+!$9aXv{F{XelXn9Z`~b)%5M#&Fyf=*DV-0+WpdF~ZmgA)IK*--;- zD5j~c%?k0c_toGHjvLitC2)fUn(6+zWED=Xw%YMP%}!7q3)mJCm*R}qDwPlkJfGqk zBm--$dv$9e?T$|s*Y0_udL`3fi#g`Kwn4dco`EO_H83&_63}i}*6&h53yv1~2~hzt){Jj;Pew?&p%t z+{cY3-?zRb8$`;>=;*Zh(yI%PkB5T#tLEh7sv9{+aIY;tS=?!m#0y?kx@(QTxL|AU zTxp7u#ZKOR*+9CsKi|k7v-qR*NdBLt}45>SZ(#Qix01-5Dh#xnFz0+-(6s6IjDiGZ!p2Q z&x)qS<6{nHlqFTd<419K+0LMN*9j+hS5(&~2x0PGJ`WsZ(7wh|FPUE9H^|>nN+avR zyM1}%WuvDnecff-c=tUFerRO6 zEi;R+%X{MQ!}%Ze#HrmLNg1E5&Es$9k!ouja*HG9DiuO&mz<}p%~RTLI4?P$P@E+a ztM2r;AncwX)-;_%1B;*qDZDh&v2jkI`IK0`yPdgN()$GhYFsZt(=Q?{6SdA8pbL}lEGdmk%EI~(uh9F-GrS+_NIxgeVOEgI29PFAH zUO%eGKJFk}NUtDDsRr=O16R0EX-_@#5Fh)vhdU2k7#BxLUI(C12A<(dS;K2y!b;B& zx&R!20H`6FdcB>t_3iyX=^RPMhFX!ee<(i~L4FNKPTnHm*T0By+Q0dXRq2I05f@Ko zx%RPl8xxwFRgGSh)gm0fd?iB$k8#=~AM(DWMd+yI6yz(@Oy9JZHNc zkY?+?1e((*7ZZ`p$QG_Y6fBB>khj~d8}b2Ao7OEUBVrDrsDxjvIchJ{WF6POO7yMt zav^~Vghq)rM&I&+^g&6dbshnQ(yuPQk%{=4kME>(gWXB6U~8WOz8s0gASMw&mWCd9 zeP6^_P(ikjLHv=A+u-!q*j#`)9l*_R9}1c;uu8G7DL<*pvQM-dB%-8wLqaUf^cP4B z;r}Nwq_ql|A7Vjcb}<{rwP=V?#h&!bfI(=O(u28-`x8KY>pSWyYBuEjRZ97b*cSVa znL5`rgnt9!Yk^e0AlvoaDLB{CI4C>?Iw|@ko?*mHKbDpi;Luaqqt21#00xU4|jKi1L`1Rva~>)3 zOOD#VnhvET|6h;koZQ6>G$L1_P*)=V%pLMekROs2C;9N@RLFWfI#~rdjsKZS zRBEu__e^6+3cJiF$KvO3zy+#h$Dg;hF9z8GiVdFi{02ZB1cKoPcDsVQD3S0nNn&=e zz!p(N@JUFHj@}&$M`M+imKsqj2gE$5_GkY1@xwHQaHIHBTboW`V4!E-z<0OFkQ(Yj zlVT5fq>RxeWo(sswuDy>JF@M03s@~=@qi;A*Rs#v>+FA#mDC1vv3S4%8G0NXRR$&o zRfj|w26x3OGvXt7a6OKSp&zZz-`yY*yLbQJsYZpSM3F~eKKkghFHMVoqo=>c3Wt7# z6dzFyk)ly4l-5g7w$?(Ibs-3P2@F&3D6EeYObLRiGvj?>iFKLk8zwJ%`e9W0;2aB`zsl7HE zV3Ggx5{__KR(?*7Nl3)cB>f&U-|6@LxoXQZp0cVM8o3b%TZqBB(*{rE z@HFoW(^>0~xN(!#+eq}KA463_936xVp0jRzZUOn`CpWCG8_A8X1tv_h0am~PG8k;* z327=`kFEe=U>o0I59gASFS;c6+N>b{TH1|xV8`N#j>KS2k8Wf+gz!}u`!nV-eTyGe z(F?0v(J6N>>6fEZ&o?-s!vj`?<3IqnEGb z53Q*RhOle?rX^jnX?tXK<;wkY7|$pf2fh14;}6gDkYEpr>p)(+pyp&*!|yuROYZIl zew5O+d-ptk&ovVLKK#|YdpB1=5-8?|p($pTV`}F716Qo*Wq|@GdIq|;NakCi?r zWwhM3r(IGtbITTY0U^e3+KbzwgZQ%ZZHX{M?pYbfu1#FwaQS*I?Abg)r>0@*mbE|f z8i0HdJkSg^R>5*}2Yh+rJso{oP$ls2VUe=|Uvo0o=C3AaYo9i(Zi{YhM!P(^1A}6k zo(gi33;r)SOJm16N z#+DTP(Y?}q$6tT7=YF`z@g+rEV@FtIyz~3bv18-;C#4Kc@di26p; zwsc1NJ9$KaFx-p`eI{@M_^1aaJ+I ziCmj#zx3|BVb4|i!HAzX&l(p=)|Q)lM42v<_{XzTjPkPaPC1hSnX9X@j^d)nuFyBJ z=Xl<_l_^o;K{`Ut)wjg1a`nJe8@MmzY#bS>$&##gZ&!lIi`EdjR5jj|c3hril)Uqx z)FoKC{sU$@Xca4rXkEGUaf><$7uVX{w<|ta@*7pP=GYgx_qMQf+4e~iFKV@p=Js~x zK10+DHL0qWVJYbA8#|-Z5hofubBBDq=wxmA(p2tyR_=hop1hgL+nD2P2aPk=eC2zF z&t{GLTeTJ2B?VaA$(%M9<3P^^x6LhhFbo5dcYpvvOFOFR6p{LCb;H-n(5p71gI0d0k^7^pzGf0`S^E#mP%(&F$rGT&x#Uq8!WSdsfF{hzg z$Hhd*UmvU;&gjG7jn3N1j%U1?IocM|8*CTB?MBeD{GO-=eZEpvDtWcaYmv>v{m!Vm zwh^qo=!^i3@~T;*{_*7F`QBusQJv(1?gIzjY~I#feCtJ$u&^U~b@Vgl*ZK5Bjp!q% zPK7;vhn{$<-SWcvvgbHyp*iJTWxIxjJGQ*Z?OFQ&F>3S52cKlL_g#AH&0sQ=O-=^jcW$)2nacK zmuoqeP~=DB{rBCQt-*Cx?8VH7AJmNJ>bW`>s2Pp9nQ@Ont+U~lX|1plJbPB;te-)l zTG+3^nQZOYJENBnP1MiFFd6l8OSVq(oBLm^{RLE&X&XL@Z+q-9K*eB2u}GB=k+M)k zLK-Agq@}wtnNa~n5kX3kjxAD38Y4)9#3lq3#0_jhflbG`9>8(F-#Y(w*8i--`o5Xj z@a}iN`^o#huXs)zddSOUD-VxVVi7iZV3l;MZJVfDCU;Yoi&%N6;RmG*-0-x|Hh=u9 z(wnZHUgB6*+;Xm*X10NQ&tU_M=vCCKG@bi;or-OvwxHk+zP+JSe)Rib=dw&jl1bL4 z;;@XbBUYq??m7*8-N5>dx#i(>JrAbDn|LZ)Q~Idi(Ql-Lzrll$wvxW!){-+AY3J(8?T=oql-(mTH%-ttMRo@aw4>eX7pl=I!1kbo@7(q1zTO#|4#z&Rw#iS2dlf2i(sfVkd;B`0c8AoS zzND-&r%z<84Ydcf7nMBF8|{BFuyc3(9v)e&WkT~GuX}fMQx(5+QZ#;3;LKEvEmldF zy_|p@nXLSFC52~?OWo9R8NzlM_0h>@-P-j6c5&NRZ&Pl3e;YTfjt%7B=`XvyV`(l{ z{ynyZey7I+Sl4f?x_XnU9q)7K&@$a~wRRWz9H{8v&GZ!6N8$LTiNmfzt0Wz>%W98; zG>7hJIYrV2S`TG-96ugeb~=JJKxT-anLb`1!Rb&d8=CM(^s%<5pv`P>AH3Jk?)v;= z@~wkrigj6ioR@mF+T0H-DXu?Y5xPC)#rk{qp46&oN1`V`FvF%NUbGDL_&xJ{a*S(h zmCedm4xi5Uq*#uX9z-ivJ5J#Z)h6FRzX%^Jc~#`=f;oS}KwsKVO&t`tQ`o%fdvmk8 zHLwYBKNE3Qe&6D%SFO_IHne<|P-sfO#KA~p95Mk#Y+HF`0(dzK3(sPe==c3g;gae@ z(h`6#+8qZ5(ns&;iLC+{s;U6kfP zRWst1_Hk%Yc{4Gp(`KB-;3cE@DPQhgj{1CWB}Sb(dF>Y*{36_?|LcoC9Nx^A*7p$o z+!?dt<&fr%-v*yIxn*bt2KvvJqkK$9>>2vG@SPRBtTAz`QPE*H*!(8cw>P6}LIY zEuYUXxN}dr)>tJZoiFdQt-h0p<`#=w4f_zpNcskGK+ZPxA&9#azunUY5z^u9Z|Qkh z>hAQ+$M%brw6<^)zjCVnZL${9l<$NNu<5aEN%;O?{f(S)bB$B#>M^bSAt#?$ocXy7x)4Ahci%JHUaeKG*HmImJ-kMg)P4g#JCDBlA#t9jRDTS}`ay5Qd@-ZeZ zOim`KF7jbhu@BWRHW5ufGTh8nI8M)B_t~k}?#s=Ue$SpyPwMWNAYEJEn^_!h^E_&1 zS$;+Tx?v0V^k0AJhQ{*KdOOos1|C*JXQ5w&lB!Ha)e>R^LPM#y^CoK@OV^2pB7{8j zkS~CXUkRDX@7|;-o)< zux8uH^CM`u^(dh#f@jlNbYy|4>nE`KGyxHka%Z>9aeh1At$(mYcbg(%z;5U-Uczhl z$~DPB)!$QM;?4L=!>D^)g~jpqd8(7+E^h1_*)6XBmUL~2TkWT=7samIiuv8b`5xZp z?H?2WT5qT_Qh8F!LCNTqd1zc2BXCM?Y-jjhtd~C4f8M2suD59EO>=wyI;y5Upg7R) zsoy)V_>f(d!YzTnN7=pV94+$DonX>*o*2hlhnV?QkHy7jzulx}5QPXZl$p(P$nUk4E?!9q)8TtN^6MVZm)39LQr#GG zHk2*y;^u>LJ}g{CQCfq^27!jliv5;-NjUjsci0|`k5~4+gNJ$(7q1=)nyTazR(D_J zWi=UE5tpv1YXd9OK~w6ca$owR(B%Gv9RbK2bjF?YUvlh@ZZO`%<*mYU1?wGqBv;ai zzGkU)0fvvau}~xq@R|Pb;dEOk`=;2pz7j%jg{S}e4HG2E+9Ip;rEg7Qjv5PXxP{hX zxMXGd7fZJ3#-)qSxE85wNkR^~e)Y}wa#f?^t z1V>q0eLPo`_?$<9UDR~D;6DPFL-+QJUXhno(K1bnid()+izPGjjvMdG*K`H~)gqCv zt`qSi^YX%K;;`1Lr0d$IPP~14XZW=H)M$cT)=+O^zcb=Xu0_66W(|&E(jWQTA|%i+?IUxrTca}#i%L<{Ijs!2hq{w-ig(r5 zxvR!sc4#p>bF4Ga{lGr)=8atP6{We%3mQixz;d(4Lm~ zb!+yL6`NJ#olV(#+a@+`b4Zz~UUke$*fyfd1!SC5$N)XKnd_x2GLbCNCy+Y;r9&Zd zgonWa){pt+gJ8Nlf6wck;qoF1Ab>HL|KMgS62>Q3N(Q>TL2Jr2&$1j&EGqWs-k&yB zYT=5r@7`Ahwrk~N79~BXl9uL7Ze;1+Q5Qoq6&*O@Vr-s7W2h{$Njp1IZ-{hrV_S!M z?x&8V{)F4#n)C9CCKudX$zQuVUV7LEnFZB+Yk9KUqC+(y)UVZhHHva{th*lka5t;j zl}%!x-az^u(VdY+y&pU`n=72v3~DF|j$Jf8oU(ZLE>3|sJ@2x!O)mqsh>ghzyGD&a z&t$HSd=Y!l%%O#+;A7+q*+-uzn*(3hHN*#$3l852Dzp7db<6OrH^GKm-+b<@@(8s5 zu_dhP_1TE82vp|shneP(wX$pCn}$ zJL~BQL;o#eanBuE64PzU_?h}=Z+OO$8>H&Xq?tDRvpY~t2W_*PtYzwx#Ydkdm?kg2 zBKx5vP`_%s>LY{7auXFsUES$7ibyJvHc1J028yIkybQ?H@*hG%qT#n*xmPsQ4Z)pq zW^Y&i69lH%)D)w2U1WXqi@&mO>a4lY)j2VcQ2FhUj%@yjmZQjM(UM!CVgCJh%5tpf z$TIKlI8<-yQqbSdd0IxPF+f+fF+hhT`9+fhVW!#vOh1_}rpP>s-JAqV*s#DlJGvf7 zC_zPuS^|_zqUV9|ru#tUeDzG*vj}QQ1~K$fcDLQ5?S!*UxJDSd-aRNrp)m$D-<9;o z>q`5{p<~J=Yb3TGt?e)h3EuyX;kw(f;NFwA&ll< zxPD2J))pQ$DFNTtSY=y{V}0Ggqw_7tK~YM7urJxq*O zE_&@c6%xCx*c|n#(Oe1PYMS#Zlfi`Gr7H5lqnkwWWWkRfovu=J&fI4+#^ewEJ3>3_ zp=`0!uDf>ZBF_+?@7X7=L-Hxa&dUN1QWKU79(pCkbgZQfNbs}p0k52s4=ekfdnec+ za$I@xN=t{tr$1&9DZV8<#~&M4tsm;mBGc__$62)Ou|)&)Vk}GzygCWbhg+!Daj&}; zYPlrNWaCee2$O64NUG2f9jVeK9%qu6kP>U&1I2id0|spbhG5K;hD$urN(F@Wt z#x8Ri)_yhAeNT+H?9s;;O%hXQ_x^snF8LVp;=5=+jJ<069~aZydJnZte)if%a%hrF zpp;O~FbxQbOTWEgGksu7bW?O#t@9^u-ngE|^2|hfv-8pVxGASzePo0tS&qr>j~$Lq z=}mJZy1|wkACmbo0s(sd%f_}=Qoch6Cy|UpV*6Y5#}(_A)f|7FMpIo@!cq9}Zn(X% zv5BDL^KL6EsYjd8DEkv*5Y?lSrSKu!3A;>;BSZDX!$jk5Z{CNbKm7JDC$V{+XQXWWhAJpD5 zyElo*{L$ShetGL=7oDhnJacrFUXk=;9tA=P$IhHHfAdCvtH-=~cDW}}Ys{{F5TB?R zAaiJPtPtx&kD?M|GVos6guAq>YKZ$f8@cguwyKX;=lgGw(CI6G6}>Jcs@!o(&$lqy zHWo=NXN}t9wra0T@#Se-ql2{0p$vI?tBp>3QDM~r0;Y^Jmw+V_%hUNv%JG2T}#WH zPZ61mc@dVq^}9b;gBW8M@LkR;OxJevj>Q$%MCoV}@vt9g1#Fpi+#(H+LaR|gTP87f z>P=PjctW4+bV4xod#R0^U{g}=y9~4|a^cHobeB?$U?&{(a^8Z)z?>2HdK!FtGo2aT zEfHNhBT*9k1e}soWR^siKHxz1Yv^C_oc@iFw1K@5Cb3^ND)k`Lya}?D+?wjfR3QUZ z?#vym`J9HIU%%MPQGTY!%ZA1&qB)ni-tk=5JdvP^sc@fTtM@HGF>xJ031r)PGu&io z@5FN&kb-{{bs_h;r&IgpAn}1s1ObHd!+4P0ydut5 zyb?@r!UpnF(-}M@+m>*soC{=8@Fe39dxr8JZ2CHJNPaJ}cJDmHIPlmSVxpfeWaC1z zexWaqkKTnoY_-U}*Hi8xZqa06SJTyBT%5FH4-kLXWllpH{@Wyy-r6z9+Ew2!aGE6e zVGpBFn^i{nOEqsY@oH~oeC3(KhP8l6iZB$BFc!W9tx0M|g>PW|;qITO<>e1%tq3pd zT3>V4B0E>1z^A=q4)!7(Cg}2r*dT#bCen@2K>x!uhZf5=QZMP0^9exEH*VYva{F8I ze!F2>(ZjocNauS9u>hJn?JZo_kJLHy(%<#^0?v3s+1`3nIV>Op!Sf~8Ns{NFP`($M zB*%bs3f+SG-ZKL`fyhF8sNN%lw&Ndv5tjXSi(sNWf!0*rYN{vjbj{gd!&Zj~tIU9xLrS6j=nXZ(wWsbkZbzCsq0QANW%thXVm zc?P9GDKCp8|FPL;H`-6`&|ltM*Eqc={{2OJY2k9hySz5s^3H3*bE#1 z*CWXefg39X9l zTXR~+JrF(SQ+QM%M9aKAy^``-bWYW_Pvh;Q9|i#x+kek}!%f(U4L7{FM7gWMjtM{U zSh&|-`r~wxt1fRqvEyXChuMD8YroH8xR1JP0>acTdHt4BY&4|qu+(4_5<0=l9lxg( zWBcL0UVO-1%VYXd2pEjsG;Q;PN(&dn%t224JCPLZ!8{LUn~qkRLti{{2B zsB_q@;Q|;DW(fn(ctxg`eq&2d*Cc@=lN^ym}*J{&a4ZBE>tWq>l!MuI<)^^%$9W%@H;?h=6 z15ZlQ-)#%*NV8C$Q8O-A-Rq7p2>4SvNYpAAlj+gtm6V{rFh6djF0D;12&?5;deD^c zua_Fz=$Kk&H9>}@%{N)jXc%OwiValTrg$xq-1?IkvCHDb+A7ic6qE9Hdq!YhHj$Aq zE3U1MF)ZH}Red2@UBL1+g_-#*;9Kcq>cM8s*dGo)`&}F<)mQTB3H(S|c_nZLt`05* z<-_<~zJ2MV{Y|Og6SJX;W0RQT<#Azb#kY+IsU(IFCue^oZ$qD()=|UZy-lnuTmFzn zNT`@g$HVK7nO%PE=0+ zjBs%v{J3+iCxf(?dD=*#D3$vAg2gNLfrmt?@U$N2Cw)ugeu^6BzY>1F2$kI$QrC{G zrWVtoPsiK83Hqj;!rl$SUc#c=Isxy#B-rNo5z!!cAZKBdER>~%TfJSlXh|U0W+HR? zCxfrxp;zHiz0G+*JjrNwmnX&x(QP-qZgfF0|H#b=QWX5pPP`0)1Y@GFE(lx2B_MDd zVoCTg_%~AkMJsR`=m3)KHJXFs9PL%DM|F^1Ckr&D0OG1gYvjpXTh(iKGr(>YdW5%;AHQ zH`dl%8frvk=&Sa->4PO(J}@ehzT5G3XG{5SEu7n0Hk30}zIHC=ZfO#_IHEuTk6}Nx zbu&`Rm|4Rv0hwbrS6qmqq&mJo@xEb@nn<{~H&4tcXlCyt>`83CN}%Xh4SDo^7s&--_dgyFMCD4@Fv%Iyl?+i5;_O&0ch>8#AyPsn zcRRT)Ska84ChoXd$o5oZQifiEHN;b{X|yl|@?jy?hx6i{#WFA(OLNW8V3eR)2Rn*U z6gpw&om^?KE`^9DiS!vMVh4%-kVAa12etx`NJS8y=IoC1lu&aaqZ_Q4yzdV_x%5W} z*~wV6N`PvVyp=Ff$C!WDLQP$rqZDn7S|9kNnr#I>m3a=X(Rhd&v_Ev!{>g4$s@yJ- zMc+%&FHNfzXFhme?+|Bnc{k#t$BMLCV^{Rw_pw~C@}xEr+B3!Oi-r9xDbNOyU>DSj z5L70%HF&u0l9n3zR{YRx6H(XT2_AB^NlXvC)6skER4z_T3}!+`=+nf6dajrpZh>Cy zBZ(TJTeqG3t3|M*!Hy+5y1O~i^w=tRdl8$FxuRLa&FhYCVGtUE)v4Me4pG$uj#5}B z&=`mF8qF3uAa2?Ac*rwKY$_F3*w->^@UJM9zPw1HKZLUg7sRX)N>rlJ;yY-TG^BoP z@#;9C*YKKfx^V@p!_a~?Bs8lCo?A&>p&K|nF7)LI>4&!Q!gYPh=ffR3YM{=Zv804B zsK-V-y?@R$1JblZroTJzzCBue^k8(=-omWSRBgwR(Ty;P06Z~k)JX~VBN4k;Tcb(F zPqPA{^>~ENzcp-#L{UuGEQ&CS5tlyyIOv-@vaHqFwl5Biw-;F-)Rkhb|+@b^8!Sj z9jp5wu_}G~^%1fG65Vo0mc5Lhxc2ZXxUSsiAnIMeRIK7epnG)4C=zQd>iYiMpNH(X2uO4JboNfK})~d;leF=EA>H^%n6Qf6T}>mw?6|CJ}Q! zdy&>CYWfNSE^v@@gr_%cJ^YY-jriH%;3)Egjg57euMj-u zPa$zV!hO&F3|7f2ioovKkC}P#|3n=Qzj2BrRx`vdyuoPAuibf$PCRoPisTNP%+IMv zZV)|y@w~Tv_Scl~(fSOJJggZ)AXd}=nxzh}^@t%i3>PtLSjff2Ros0b&bF(1?~Qab zQ`oGO{o*f&zwZQXa<eLWrnSQMV!|BJi=P@#z?JBEpZ)TjpjpZl)QGuWko9_ohvo zNK}zO)Pw#}f`0e^yztrhuBOPJt5sgd zgdUe-m4GuXjH>1Q%+xV@IC5+!u55Yq z4a$+5zkJ*z#m#513 zuB`kF8SDcDXfx#bmH$4%A_kh1=+v{=pUslz7tfLBDHLLHMrsrlmw(+!3ziFAjnNq- zzWnd+(Y2SQ6=$ayc>O=cBnstV>CSK{cJBme#f^HTf4UXNZmz@IkNSN58pKX(SF|#S zvibx<6AJn|jo==VdR;%eOG1O5Q(0ep`q<}Fa^j4wz6gyx#X%1(8;?XV^?`S#CoJ+Ml>g0qrrlM1E1>3&as>Hi-uM8#qyVj zj92_gr4pC{&+$Gm&_Gv&61+h*WjPuU>J9IAUzA~&#<6$bJ_QJg>9$+smmG(Fm*{@@ zmbXLXJG+-qSAUq1c7^!8wD3L=TO9f6oP`ST%JSiNv?LX<^n|1J0N*JCd=PJ09xASF z79~62oLFPwuGI5G6U0j30NkV~dx;weh&V$ik^jJ@rK`;E4$%DZgdsuvC!feXJmojh zn4tzPlm4rYr;868lFzxm5C}C2+j3X?Q8dh@skMTJS<2h4EmfBW`74+YB#) z88a;Y=cQ-dCbzJd)o-Vjg)9pauI!fScXCVQ%gfFmf3QU&X`=9c4a)tCR%|tKHJjxS zJis}+e{DVd)v!Inm{PhKY|HFn& zQN4tipnyJ^z0!;bFX~h>@&+YfPw->-j7sgj%VMIFd#U4HwjyZ=9jbaaXZx>iL1mTz z281N#^gWy)7pS+R_D`?g+qSd?rFIrVp#rVzlB%jk_=e5#S4Rg_05_+JL`BMM0N>^- z&2ygmdDm=ko0Lb(NfkIGD`^=mabVf2iL2N2WljmxDQUY1+662`1r3_>b}3rFoqepB zUF|xrMysF?a8kc#;5h=}%KZEsYALdHKCm+H>SEA80Q$I=_KKW*vDQ8R8qtr|Ss`nEO#h0$C{;UA4wBO;`_ z=CD0sgn&C-OfXoytHW<+zwe#uPMS`?{{9fzPAshW{7Ok>db?oi!A`hb4|Yg7qRO_>*$(%Use?7#=qzay(M94E|Q6_dP6X_0gOdmB+I zJ@J#eWB!v?u>rO)>$VoDMRKs{_dHI(7M>L;z^nJ8fjrgnjL?;0xv5G1mHrZ@_XiJ$* z+=X%v_lk~leFPCGb1p*&Ln6I$rkBY%3%d{x7HVXiUKm4Ajl2u4D@qY&+U5?C14)i_ zF+{{Q9cNyFE4^~F$Z<$x69dK+@@`Et`K0|&XdfDN2geLN$yfoEOO=^+MV&PHGJmdi zn5qDZrZO9E%?j2t<%UG)d;K#Vh|xq;M%m0V=nkJL9Qo~@^m5#e8JJ$4oWd?G&o*O&DmYFYFaw)%oV33 zrLC-?PGw}$ho)eR=a1u4M7C{?UzeQBDdw)_XS-cUwLniVe&uP=wpLJMxUX|hXKQ=7 zMOqDuTCnKyNvML0W!sv`P#*bFfJ0^@F#EhE8Tf`An}!oE{-N@{!Bn3%O7$oNNi6u$ zM(X*PC|c(k>B`O<%k_P4bGg*UJEn6@Z2=(+FYlw-{Ofu+H8YaB4aaiFP29?hBy`ap z;$c)^Z*9&5it>XDKuIpoU2xey+Q3z}u~W0NdO4S)^u`#~7}N@*kBQL-wA#SJF6u3P zdn4a%P&7V~nyu)^DSKhl?;8w7@0V6aDNh|{lboy78W|9kzU;x4C#XuC@@rO4Rz$dD z3|9+5Na(hOPCZy7itUi3>Oc74w%I03tUc=fRw8<8NZHpRkLE#%gLr7HgbtmM@}TG@ zP-j>bw-2nF;+s9#sG+5%tE zCy&i@ao(9IpES8qzFhFrXu2pB@}7<3L}!bq>%4L@wBq~A$Ab2)>j~~bK3f}MkzO#T z&Hx_mj@=LPrSM1%{`?B1HZnC69nMrk zgdvrE-N6g^Jj~AUsKv%wZ?@w?o z2=x`-b=%JA+WG%TquRX!gZ~~DLhO?SBt~?yr~mVjMfn9-=wjEb0FI0!xq$dbhPi8| zYpXuwD12qz&Nn=I=DA_c$i+6n@Bhz{HVQzF()GYHhl zxIH|wH^N+>B4}A3>i3jzUh~apyi~W_;9_TaOdLZ?=TBOKoi?0j`R*nsHRYm192bAe zxx)3~eq_C>aF!M;u@KsO&!uOT!4PCBi!_u@cpjG-ug*FP*@wJT>?W5{Emo zE706QjgBK4`^kpYX%^E*CVQ^cAjhqNsgpkk$(&kxrgS_4CmsEp>{V|Q*RGn))Bv|X z4vp0wChnJ1GsLpQ^(ucD0WP7Y!T2>E)&fSgZB>H+&ZHdbTAyVQZ%1bTa*s-xzil}D zZ#d#pyV^H=!~dtAq8$1ZVpo5Tl~ZQ*x=neoF-!fCBIx(*nwR^>V!nwJunet4HCak_ zxvut%O&y+9KZ9-zE~m9{a3&<{M08K=&jjpC68)0~!0mm2a;1T&s0x8?VYEf;+HPg_ zYU({kAe)A}=c}(kZI`$SqijV~?32TC)qtX_U$pmiK$d%lIl)P6Y_2!y(9_x#@=mW} zf5@T7lhp9r$UFAzqy7Xzex@s)Fuc&Eou(MK6hmBXV;%Ut9I-{KYsD_F+qLmYfXDIc zh&H_?E7nCV{A7FotS^3XS+8JBR22c2^~H;>Q-?=K+VbrQIE{c6+@lB6b$Zs^+Hsh} z-dJDFKw9~6#2rkQxOZUeUN|P{c`I*J%CFj>Y)gc@M0`!ho`Fw0e4&2W*k+DE0b3I! zPe%Sq6DWWGwk*4ywM`gg1M(lz{@0#lL}Z>iazsiS?5wut)A~me5Eqy87L1+8&e=!5 z{QW!_c$~Hb-(yLLm%B_{=^CX)(u-OSAQ8R_drL7<|grjmik*(PQKZvmzquYJs%f|JY3Go zz3=D?kj_=GGNoyrEKRd9tQS^hx`sG4i~VUbD#D|k83R_mlO3z-ZUmQlx{YQTPFwS~ zmoq|pINi0CSi(FgMgVn!grgpi(-RanV{Go995;r;>P~4QLWDtBq5v}jmLU)huV-U> zib}4kZ?AURWQ%^26^1G?peDdTMa5mtcNzV}HI>+CN=<)RY}dP9B|c~z#+oQ70K6e) zQYia!W;)bsp8A=+lQGgTWBUdZUUS<={&`cxMEQpsq`|Q5&BX>pY#8CzDv)#tyIDQT zf~c>}hyY>z+pVMn{J@{1$+_S-sY9vXre?#hn3zJtm->TwdDR`SVv$DszER&~xDeYpZ1F;%}GTdg8u z@je;qj=M;PAOy(w8r^+S56sRB6Njw~irzl8RyujQKWMG|*v@^{TSe6)tT;ugSX8aF z#9Gu=Y;a$Z>SRHS51)ZO1FH88U$*jJ6kFGtd4OL9Nx{=pfiM!x#M*{nyGUDg{90d@ zJc!NuN|&Tg6e2KrTP_~Y47x0J@~cKD6$w;ve*Dpp#4^zq!*d1YU3xi3q*d(GoTFZG zdw3v!`!e(Oqq;{XK)EVGR~9Q~XXteUCJ8y@KHpDeUU>x#Ug{ z`}D<$rWg09c5Tq@>dA8phjkY*QUq%#j(3QC592pZUe1R#Lo!C{`|p_4WcqV-f+%A5 zS4_RLbdC1FeP6Kz;@b;Hy7eq98hdS1>*q5STelD+U1VfWS&DV`zkS^gw{}wUCPPz? zTP}o?k=_Y#1mf+}I-@t|FIbSqlapZj56w!nG2+K}q%N4gBmuQDFz~NZc$le`HYM3o zRj8QlmIdKSdVT@(jGH4bP0|13#DwP7;&pdxj>i`7qy_Hfld-mb_V#G!mdrO-qvfgV ze?RR95oVdOXxv3m4Z4_)D@*w}z9uxPM?|nd0o8Y~+*+cH=``@(zg}`{E}?RjrTjpS z_>a$4BKA3?MpgZCl6~)RdgCPwp>a)H*U^wRO^-Ac6+^RYO$#VSM`qdOo~)OFFO9{% zO}(tB(NP7mI1rgckS4r66g8d;xqag&a1<<4nVQEEvnw;2V~LG0n%ee(mzOT}pYjj0R`Anm@#tgb(CccGv`v+% zbXOMNw$a>+1sbxB^FQ2F&<=0i@cSR&vc5XN@8+YeT^q_@_GO0xr`;<~+4~)xBcf{l zp{4z%_cantwr*|=rx^#+Z*f%*y`ryA*7LF|L&|C5x}rSDw|B?MY%0BEfaQ0!bn`f{ zH;XgJIc@8lL^{gScj>>ElP$N3b9NWg4r(t)8m_>2-K$l*_%f%cX~X>4(`vw@0RNvj zg+=2$LRiO*rM`27g$3tu$+#bm@#-OPDT$B?`|M87;Rhc5&p2kNUMP(Q3DTXQy;297 zPQqQoFqg9q6P>Jts05cfSTH~Be&rv%(Pg^l8QUTY)G#|P51iT58JjoZ5-oq27_{f3?5a)I^Bj-(s4sUHbCJ4 z`Vg5SiD`h)@&YI$PIu?}9__*9W}S^`=PMcc8_OIonMB%<3ke(T9F3P`2Lzc%K%$61 zf_!YKjH?ErRwBM97Kv-NIY-e3ziY|AkKKDA_w#r!;y2g6X%_%G4eR3gZNrPv~O0qVxd~pW;aJ+hJ2q?95YxC;GDU?5m00CP$v#hnG#Q9Yj zQUcV7a(vnh(>Ooh+-#ESF-ocBXGySOnuL`HFk4?poLah3DB+{}!>?asI^wA&*}L>d zlfQ2%Na@u%5gMy0)`*P4I(ytau>di6Vr`Y`d`YEu>mQIsx}s!aq^dkW)lZ_kDLNq` zf~=BeGA&71rZ@L(#kmwubV;@RgY4mL?A?9oHXpF3mi0 zCp9|;rv07ppv*+2Mfzj=0=>by)FprjO+Ygtql*|I!QP+n{_xF&%F=M;!qcbQy=|oR zm9(2hyQCt9KuOq0tDB)8-X@@jhkG4Eu)RH>nyU(fDHS={r2`|2mJlj(J8117T(g-5 zO6S>rStuW-6T2>c*IOk;P~k}}3Ka|}0YHI#D{KzgWm=$6scG1)5J^E5zxztjxkLje6WmXUd=LMqfL8+IlRyRb)FV{2L@(YtM-XJBI z*A-8QToiH#Qlx>&1JwEnm9MIZz_Fslez=Lmyl^@2>q*L*p;NfbxE81xy1ZYlq^0lT)|mQVk$?3?&X0YNR4Ad z+1RDdy0eHCU|vuN`Kl>ZN6JAHS)rYH?rsGL4bopcw<_NTB~E{40P{)B=QkoyERtI2 zTVL@5y?KUb7TjEA_M9<@-7damN|n&=C*Q3mRw19phvP9L5w*lm)~`lQp8RbayTwFk zOyNMySP_>#_Cip=NsWodtmf#>kUGiu8rZTm)NOLd4*l^qb~khOeYP>QQI5TzqaK^s zv5Q@Bd@Xyhrd)Q3r_`J;Q_vNR6caGe2vh>Zb7Ro%3erUC;eA4xk%AeF(E%!L~wnvQ;%F4vgkyxgK^5e&`=}Ozwf+fT~&@OjFOct?& z_{*&EtK+aXF*YIQ6pZ*JMJPX|?tZ=Ss$)B{cs0$(B?Fm||NjU=&eISXRrJa^?N)6f zsXUFsj|A&iT4w)gs_{4Ypg`WrH~rm`+UBe?987I>($wx9-xN3ET=CD}FPiKhFVk^T zfqI;1^i`}!EF&pN`Ar9PUC#vL@!GA$4-3-_eGzM^Nor}ORc%ytO^Oqt5(&bA17D$MXTg$s zbnQB#=_QqM(`;8UuUz+Can7NQq7%>Y+|`ALY%W1P_{Ji)lf@M+SluDQ)y#-fPT(1N z;&rLBS^ET|wzFDEz7V1iNDKHyDDi7uTil5LfM#kI<|1dd&0RgZ#Z~DByGH_5#5%=>X70wy&h6!TGI zVR7xtfl_$8%Sw;tNZm|&nSPKe#pv|EewG#AfqPySs$B|Owd75r+;T7i{J!Zx4FE&{ zWA)0nu3WidDpXCpl!iJ*A2wPOMmOaI%_RbT>IDZ@<>*8R;eoesXT zKp&0%g{5}dlo#hb!G1i`!F#^Z7<>p(ga7l`%^4cL(I21`Rhpd`shzkElGFRq@;!Tm zPoeTq5ii3FmhH>om0oYWUO{y1~Q2}&|B`tuor zOF#d|%O=}CY`&+)uN)ixMCYJGx`c(xyKnNagE+%k$@>Ob_qXjoI@QzoSo>Dr*xI!m z((Y!Bp&2$(Cr-@RyXD#ntU-O_R$aR6PQ%)hgBC5hQcYA`69?;teEwCGQthe{U8xvi z{q`U<)Es0D3dMUBVRJ~nBO-MBrSxY|>zz{5x?sPlMxsAcvpIePmG)ZsEb z(ZOcRBwQ#8VWeM(!rN4r5DrTlaohv(NyR`yn^OG$MV~1_!H6ITJ&5q-B)oI7&R(|y zgDpsmd)8(J@5Ybh{h>B_ue9$qk=~ql7F4|Wml?uCP-;*kVt?^Gt{#DLpP+V3ri zt~Sc*zwim1%7+}2QPWiB>j%;#E~pQf7asW2mru6&quNy5_wW1gDRIPoUB_+I3GQ0^ zvL2kqK|&hD#ddYGhcCDaX)kPOy_$VCuqh@kZ%LC)3ZUbSeTu4UuQm2kGIx+p^pzOr z`#XsFPpW3$hAr!3Y7-Os2L?<>t}L+B`DvH9ix1Yfuo4Vb0UaDPEhGC){?~8Z-HY~^5oBjR+9X4 zBr7zs5i2+A?N8>j*v<(7)P{3qv}hO+M$9jw<|Jdaf+%YL#4yjBtFFPrmLB&_8BO3UCqZBbk4bpcXUwwb$FH7cn+0 zeUM0dvThd>YnpLU#AOQ0cgu$efe$iAgd+F<|83={`J6n3&VO?5C6lnTH2?Zn zuta{H`rE%tRe(B0X zul~B`5i!#xOk(sG#Yhr7bwxPvp@*?>&auxP83BnWgvQxR&ZX-c)m8jSUQo*B$n5(n z`;z{yK@y?vvV;<}7jPGjse&DJ3;gXdu;!dMUmqtGOo(@gMr3AnTLAY?Y@&n%1QL!C zijWw+FioAa^gRCp-h6w&YsCdOeqTii`WyL!QTO$|q+(AF7z9O4;Ow7fSJCo6$GoT1 zXP7mTqA5A0h~)ODPce|}5`RULH%R1(sXKwufS4H(RTo%IMZ`Ljjl$0TFn{`oaGr!` zRPo$`=lNo_nvVMyK61_usn7!S+MmTC=||3_h&mIB#iVAei^1dk?bQZ&g5KpIF8ffy zhQ|&!m8Ra8+_B*jyjriPEL&wVAvpiL_bfS)?HcHmGIX&cKZK*Wa3|8lAA4Y!$L9%g*94v^NMZNrk^XT}ht^2c9gzdBfoe&Xy4dPueWN$an?`we@lJZlqe zj}#0oGi%K6{z6e${cGa#1cil#HQY#3aWwi1OBAPY&jXy+WHpO(1fybqB0|5Eet&R-pd7ytj8`FgT)b8;%;d@hVt>~>r~S!^JnhGLcxiuCNxP%#gN zzsHF- z9Dd>#(Gkaw{9*_Hue&i%5mw?7-Y2SQnV-xtu@z)~ewgHPRu-1n+<+l)kUwW@%+UuR z-La^C^ANPFt0$=BP%(09AWWG z5cgc~TxOY6{mKkLtoTp48Mko~uVNxT)@Jq8oOyi76ak}(KQIo+tv-k%fui=|92oDo z%}K7b#-&+Jj2tlOjMod!kNK&W!}^wz0Xtq`Q;dO}{EC%o$&6Ck_?Z(+1-AbDZcy+h zPE_AliS;#q2~%p*9C0mJb*4GtFu}Lq01yWqzfJU<+{dqvE1?)?_I; z@QVfgdeh2ErYcM37te2V$8wXtYpsc7B;qTh413X4d$aAkd8O&4fe^JeBExnE56Nm?Vu(GG}pv(3}g$&fKR z@sSHR=Gpk`#_waxlMd>l94vKkOU2b+TY=`Cn;o-HUOcB>#!ZdZuw^pLpe+ugR;^r; zD*Cev{=0&N9|%80AL-?`_Q^H*&C&qEG0*#e4p#@Co&b*}iz0_)^DtE?BkbmZOg zW>@Fe96F%&=FJp1Wp2dv`sBzpDVG$3z%c_AE- zk-W)YA=y-k1s#*#xFY<>Y*U1EiLr$4LQi2NavCyjlG!Qco&6?tj8eS{T@v0*^e#|e zV(kqe!cc3pIfYX5pBSX<_ARBeLW7zXX)4+WwZ8M4tS4gmoheM}3s$;J@9}3MARAAIv#MnP3 zU@@c#Y}0}`{7Lm&Zy$5c*ImHn!_56CWrT5yVR$ZLMRU=B?K|%~<2g7*@dF;XdM%zu z-~hp*)B>_&QS$A&x?F^dlQT}o=djTS!Le}(32OhOQnZ{g#G=UD$#HvKIQejFMJwk` zbDT?K4&MKT*$0nF&fk_RSfe>_f&>g~_lR;=-y$dC+*$y5NoA7y0XYG$N1K&z%#Z+#>HX^4R((KcgHo=YYV7n&ek8rb-Ann1d z7Ht2C@}~i_=NT9sz(N_mW@O^FfLU=}Qh`BFMdBu`z`-IQ+iSfTjDfp{hvocj}CG>MA3Zu zajp9_Qq;QdVAdsa6GHP(t!9t4 z-wbX0T;R6N$?_JVxY#lB6uNFwOL*D$X@mX`Q=9gd+#HZ1N_nFzxnS%G^K%s46x-Z3 zw%t^5cikCF%AyXv+!CfuQ`Ft zh!Ik4fG$n~i3tZSdzNP&T{|xFkVgq1jDhaaYg}cpgzZ$kQSx{qEX<%>^gBa_oZQ)1ag{bd`bC8Svo{VsV|;Nmz>?O00Wrs7aVQDtMPO?D=) zf*V#;>4=D}ht_1@x&hO4QRUlB1j44}0%5mubAm+O#S8y_85q z?_WKuSHFzkcx}ru&jgM<3BR|(^sM+e|6g{c7*3o8a!bmqqWc&72VpERY z8kqw2d>VeMg@&ja>v#-<*SG}m`QAEldwZ6?Ot;qaKbm7=3%ypo8fuyNaPldj(5Kx+ zTsz3$$UPIaHd&N~vDYV_i+CBwImE54sc`J1jZJFFqctw#)1xsXC5BJGcBkmkuP#cC zNEc#%ZJUvHf)RYk>iZL~i*KFiCw`xKkPEz4YKR0qj%dHb|J3aLtvw+J`G#6t zEV^S7y}KXsETSGxHC9Ruwvy`3V%9!#e7Ewf^-%o}12Z#RAa?or3*5bz(G-38qglrL zDVIL)hx}z9mIwq6=SfUAEM*^4n4;(Qw3j&v_b}OMtxEFVe{HOYb}LAWPh&nR5TrFH z$-9|USeb>09nQ4xE%7x4#UX)PxX{+_i(wICIYL+}}C({(15|J_7mb{?=Z5t@nM``qWik zo8*+Hy+{vTY}edR&UNgoN?>=v;J>@2zRuCFS0ZEBFmcm|Fq{KH`7E_2Fciy?+t%rB za%Fxps@|o1BlC`oV)zw!yiAL|iiWfglrSCUdZXSjg^9UgTpc4&@}@8GyJF9onoLsJ zbvt|@W(M8y~6BlA*lP^v6EA??$ zmfn_@>x_&luHL+r$v4yOg9 z>o^swsFRbgyjq=pMze6egC4W3`FxLCa~b;HQ1NoWiOrFf^okP!MLk@88agjIZo%U*ksm&u%N#2;~K-^;gyl)(naI%5^(k}pVeRJjb_6`|dRdJr*JHQ+{Kv%!(knnC-;=2k-YO@+pU>s>I%2ylU0;93xXR5fLukQAfC$ zz>X7240umksyaPOfs<~$Vya8h(0DCFR2^`x+D-5ra2_=ieLXwsDCT0yS{e&BtkYVd ze%dK??WIfJ*WPr!+KKm#_vqp$DT^odwAoF$t+SF-Yd-9ldfn`WR*atBZ1=L26{(7* zaaSrtn3h_aCw=A``1$X$M;)i&{X$qVvt7F~hSw$rfQ2QUpXj;f8XDkZ(pfYL172LY z1@imD2Pr0tA0L-<#lw@4i}+Bf!5nG*P4c z)3f?~d$esS%qh>J=g+%|mt9?jz2_$qD0Oig*9Qye80qR38k-2E8=Wdkh;+-<&;r^KyFn z>m|Plr7=Vj!EFy*vaKW)3SBmJJ=l6fW4`2C^E!qKRnM{IlZUD6!^U4Jn87^WEWI#xRxtElgTBmcK25pb`WHI!v@Yv6T>e%m*Jgt;q9QImoUpm)#)AiFX04v7 z8;|WMNF@JGX>&9-1VdEXC|7}Bj=`)sb=ti&Dxz>I{+2I+Hu5C-R79m_eQ6+n{n}~0 z!p}EL2!2&Y#7*Ij`CC`3O=t?we&$PtnShoTn8Q(tsqT7idI`e(Y6s1j3e7*VeDhrs zeW>x*mmX%9BymD>imv5I9@{kMbCch?uRPn1F=pvNbqcjM4L>m->ha^8XEVX~xAfso z#dMd}*9R9<2+cko`(pVd3eKKQ8g4XNX>Eu&mo}8WO6VDETMJ|C{QJYr$Md_B^JkS!Sc|YO1i#=v1GL@r)Yhj)Ku??N+NOE%dJ} zyScn>$;u?Q5Lr;pUn(_K-@d?+1G4+{vO&&>q{ zD8VX-mPD`?Z3c(Ulufaul+VAu*4cX5ZzFMqfVpRfLWG%@70D$$c3)o@*&Hk8_~}zA zN5M{9{5-kp{)G0iV+TDWSKghwl%7r!lN5({iHhw~B92|&M`xJqlNU!*L<#(eQz)zX zWuW4vOFi9lGuN9t3$SNd9)z`U9?fa#qC8k`-J2Tw#H1dmtBL<$bN;^Xh^0=aIhJkX zHe=*hs{k%eZaVMu>4b6T)H7MzU)R<$t$tZ1)ZEiW7#uJgn)Y0G>NI^shVkJL({-pL zXV+>U8g5B?bs<%apC1JTQ>E%r3>;z_pSWMNnVRre*OGB>>*BWR#`|`T@0O`Mm8w^Z zo}(2^N~Hzp9jiT8kqz@;bH&U>>*-aG!JOX1qm9kZJ``$aU}bdyp4EXvCFjCUL1a{N z$rU0YEpS5wEQ;JvJaTgUL6Y9KCoj*ghZXgrG9{#?=)#f0J$9#sFJ26QHPk@P)f!f) ziGCgRHE<_;`o;=yb=23@lb}zcy*;F_T0b>E&#dS~!|jwM4KEyZ`fmNPxR$kP(_`3E zlXV^&=HtR~s<}Ewa5ZQFtg~-V8Xd-ltq?F<*JosQAL}ibWK&uCJS8zSG$kR3?&u@2 zbHlEnz~Bw*N4QNyb{vEU(N0}nOTuQj`4{?YqPtoIMQUr+GArFj0s<8~ezFq4#yO%$ z^EkVe)bk-+zx<(&Xdr}#1`{!)(iT~ zGEp8HKQR}oW*a5<^vK$3%4lOl(rbNLKH>P3MEg)O$H7i|e)hgCz!H`>w{F+T&v&Ih z0eZYRAOdPVZd)2cobhRH4q^r!mLf66UAd$wzP3E=x0NV{U5{r**+S#SA-Yu>-({~O9rnD>*e_&52DI*>rp^7WOGo6 z?7#U~K8^6Stx!2==gyD2tl^$Olb>#gLF<*&Pauju|!>$;Gh z=g+f%Ah(EnbCGim(kt!d=mId95X*FXyjp@^j`FA+#zJoaVJ%jo|3hewHvakGSN#3( zov*O|8We1xkN@}R%;@v4HuL}fa>uLPqig*6zhL2%mXM8&6C4dsY?~FPIQrfZ-phM2 zKdWVuo&~m2KRp8GKV*kBpb+SD;M!ME_s-7?H-OpFoy1)EarYv@%?n@2h8E?pXFTUx z`{9QD_k00IDJ}9ObpgIKwlnWE;{HN?4<0;#-7prKlQ=|H-P!QvfS4_ZAzA- z&-+g{JMi5;hci*`D~gvdyw}v<`Eq&4kSABHP=+_Um5yX7@PK^mAmtPMn7Tvosa(A+75iT`vDQY{br8XwPVA;3mxYf$5%U7 zn;LPQ=x!7Hc2qE!|9EQtIS@ZD5>kArTkyTbjRj(^SZSZ7wp$^WuPcg|s$cjBa4LKb zlfavurz~0PR@>p* zIS8=Bbbs&tH_zi=;{CZyz`h*F4cVK2GuJ$Wv}ezDfR$7B+Ma+u*#xywxtm!aT2->D ziU232bjeR2xxA0S<{oZkSriz!FHwGB^>-_9*c-TBRi#mmR@w+8pzn&B&NN|kwJcC-un ziS_7coE73SU7NL@JlZnq^2bq&mpgr4LM_iuWCzct;Jqz0rM2?ihF3aMbPTt)00vYjViQ|F#P=U=&7rGnw3WqymCBfgqA`t*ZEhRw|VqT zJU@P>)$ZdMyv!9Ig#qxeve!E1u-yHA6BjM#*}ir?Cgi!}g^VIv;F0icWd$Tv`E93< zt8TU*b8HurDV#lzMh=Y(rN$$kUy3-H>kQZWxKo68^~v`zt1Z5-jEE>rH1$3*Ke07? zqFg9-0NH94CTQ7t@iKV-*a0;g)$?8gRtb+@NJP5?JrWatgNis9v45If%Ryj zoos*mH!-3dJO_&!*@Xq5JOdW_QkY^3i$zb?%I?{kcojvSo7_T_M3c*QAuPfCUn~)} z6s$0B=Xk5KFS~wO=Fx2OcOHqcNeo`r%u)I#$oZ$i#GfAP5A*-ql2>s7s+H=y{C-Av zjXv6O@Wf@kFZ+Ie>^Y>!6`j%WR`TNx*%@$)@KEMBnN|JW&1XDIM_ZR?eI3W;-AXT0 zWeV4Y?Q;lOhM#sCX)RD(FrveM4T;44E&b7kM9-`}n?%nF;25L2=)KMu%<WNT~LN)7}Xy+4cow<%!G&wD+dMhWo7;)=~enaGsW1y*oJZHl&rmP_%Pi8{dMs|$BrF?HA!~J?aGx>Ar<%X zVHNr#vmczU6{65E+3l8ZH*%PH;nMA`8*|xsZsNtZc}Hi8fV!AX{LI+Nq3t_%1iDh| zZX46$*L!s3i+8cpVlsN$NTv7eG}fA6J$Jx>C9}KXjxgm{QDn7`Gjs&vM+hA~?y-C7 z%V%f$$)&Z`QHj&Wj@M&Uy-v(GVs`}<(3odyylGs?-G$wSO2eJBpiDTjk09eBrQCB| zhpz%AWy5X(j73Y0AF^EVeJX+AeJ2=<)Ij7#`1uKaac)fo6p{ePxWj|1NO`xiPRb`u zF{EHjhAW;!7(byp6N?X<6H^l=;%Bn6s+WeIz~OKwLEH!T}LT;C!*+Nw`a$WOd+BJKL_Q6b|rFy@+y8s32Kn zYVE0t&uI@iY+v#6Y?atuv*fZ4qU#JKb17~5aAQu=-#baxqbQ%|OT#5S0uO#-X*7&{ zAw|S7jG8m=ekMI}-%P~Qr`z=lE(@-IliAvm>ta=CV7NBbwZE5(vut_^y0BWwEvkcn z-OR|i>)!wXscm>Txgd4)hA{U4XnRzdy#_?uhbPCFccjIWrtTX7IC1C-jf~f$<^d-X zbSO+i^l_Bw8XR%@@x^%gloUcDXD^~i(u}aT1Kw*yvAk4On$$I#_Gsk!`M!-73mapz zDCii3$*LpD)bPGDtQ;bMV%G>`z{ddnb%#DE64lWnG8*jxEECSxx5rI*Y|{{#Tp^dn z){s~h*PLcnzu)Hg2>WA{xcDSDVf-zhwtIDCOSaQPjlD1~7N7Ww<1d77yB+sfk`=qh z^5)~MpTAdn8bVn z{A=r^On)fa9v%odB0_sc*ppF)YL0L-N@u@Qn(XrJkAeIqa`x(@Q6i%YxPrNOS}97Q z)1C*dP*B*@_X2zSV_O?y+uoS_Dy+6|+uJ*m*5Rt$X>ZTmxWqSVb#-khq83|snJldl z4jhOPQH*m(JY5k%9kxC>-gYQKRZqXteLOL!=tvb6ix2S{U8-*VsC&KB_ya13p@KBhl+{i@r%sK8G zWb43<8Dw}m>pguI7!Z(j@Lf()Rn|hsseYlzL ztRq>yvM3F%VnOnwzOM2LOUZgoLK% zN&7Bg{=4|y2tAG5eH+7OPC^{HeNzs6JbMV306nuyW>U|8`29=hb; z)!?SZt4vXIB*k||?LtIm1b+1G%&=v1qme)%{!*e{`ipD@Iy;veNh>ieS|7YYtM9g= zw!yY=M;S(+Cl**wYK4SRNyMoala?RiYqh~NbXbe|dRf^(F771GmOY)VCJMXIv6`iX z`%){@NL5zVON;2p4_qu5PP;}il0Licej=;m&Sq<%&qs*Vglk(F2rC4Q|D^{2aJ&)BCYGYBwFAKr4;+*sC|?z5HK+G38yjx+DF^frFLDw0*Z)rZ3h19jE`tg z#&QwHIs3^lY|dMyBafc0;$b!;Qu0xqYtqP2LfAhb%-Wizy(%Yz-l7Z0XUV-+_S{_ASoa~xXncKanA}veJ#z>M}QiN zowmAkDao5f_cU>JEwrzW+ztkfm>7f^r_9u;?*yc=;jBq=k_Ro0Yr~=sT(ZBNYu~yi zB|C@y{T5ik5XHavlJe|$i9xoPD#g88mVDOT?Nfcb z`V$RLOd-5TuOl69H8v7Jt6kq~D+BgqHM-Y`x>x~wsnfj`yRnR+MkEfH_tKgk`TPkO zPA0?p(xvm{)ZBiu>p;CuGUz#;0tvE~zhLCUK`bY$?$^6Fo9PHQl(ZIIG&pIBvyW?P+XO7XHn_xt zcplsjXE?drB$74^%)57_yU%p}HOp*R^MT2&0RNN(){|6_x(n%B##_~MmRqwusETvC5}iYbMzea&YT7- z(aRf1YH^!s46J=n1(5)u-7(Bi)bnR9(+T)XIy_cQO#)Y390?&B+jFUl*&KEQct(zE z0nMiLDnv@+;)vz+!H_*RzF$Pm_r-BkT@%yuS->(qhhZeBZSxtwzIZG)xe-E2Py>OF zEn3Rx@TA;Hyj#|g!uZ~%**sRG3F!Vru4$rYr`w*1H^Y;p^+u<(oZZ~A7<4;LlJq-R zAyz5J{siIm>p#K0;uWV6BSM&}L(>HT@u29L@IG}4abwr47{I4YoiieDop(8>iRd_C zRY86=tam>>cqc?1i2WJ#wT_vITB-M>36>`-WbEM%1-k&lU;4cv7;6aFZ}QXEa_AO7 z*g?+-Ln{bcPD5woUa@i(ojdP#%o|3T1%T+P3@bNhkAs->ci^KZ|W3aLJrq z;^J~NUq?;N3yEG&Qp9dfSlM}*nd!Y5e6s!d%Mc_Sfn}!2HKgm+wv@?WY)H^=EBS;T zXld#Z*mSf71RC38HHg2DCGQ!m#)iTUw84@WknH9Dk{gg9GsUM^VxQ-dxiuIh5O57V zy~g`ntC#uBmO!8d3!oYa>uwy^)*=X283bf}7}yG8E`g?I`bozq%RlLjTs-2DdLKy0 z_Flg;$2Vw_htk;iG5Bhmetdzb;mw;E?AGP1U`Kdm0=ZDQ0P zT9G%UaHce?HLSJ@h(px&&Z!KW4B9z zW4q3$5l7>K+y_N}WUOyG$?{ajMFT_NxzBUCHBHcsCH_&8h3TB4@YgSH}_8W8Af1rr+z*G6c<<> zP4xqHMNiOUCA;Wq3b(UWBA$`i4g?|+_NcMjaJT#3Wuk?j$dKBwI|P&~KZF{n`g%jq z5=X3<^V9B)>=LPZdrLG377FrylAd+3m%HkOCaI-gy&X3^fF}#5LW&@f#K4D#o;MBN zDTSN+EQ>!}k41`(OkG{*PuE0MgjM2E8Sv_o2glOkEhVwZlt9TON~I(&vSEmQO^IRU zS(c(90?w`iXhKAK&5VR+db@#JkHaSI%GK-$g>aeGQjs+O{Ke$v)?Z!Dl@d%GcASxu z6Sz5z6?J{5Ozq{yuPmI)+4E`A_jwNPcw2Qp} z)r-dYcD7AJU)|>R4pZ5JmzVEYbbvcD7K1PG#)K$&wW!31PZ0{r}C;oH{dDB7JS$VhlwD{cVc zSOUq{p?D&*wzfXLcJ-P5$zL50JC93hY`mh86DpaoJA)NBTpk>z!zDc;xb;qpQC3jn zjb2^01jcz?g~?Sj@=yD5(M7{94;?DXZ!a!a^oWC5J=N@5IhZ2Q&jLMoq_vCFW=2D6F@$so!AP9}vA{J%r@Z;2Ti}r!!M6qk~*y>Y2NVSNA=9 z^28>;xNGa6%hdy9wYNJR3-=&r4Ot=zOIq?R4rbLQ#AEk6$zJzeBvL=6#kP=7ySet2 z$PxAJgN(i_4jT-1Zy5%8TJbQX36x(gEs+#KOa&f=+QZ}h@9`=hHJqvjiC21@gdM^P zlHKzBYIm)VI;>)tB08bKw&|X}ADg=Oj0TmH-nqK-t-|G$G9^pVrzZgK_jyyyLpC1=JVUlepd>IW_Zjj?YzDtUXk{S zvaVjlhb`OjWlUGf)MwLo85a#gP z`i2G|`>GSbj(EK!3$Ah}jpR?1Cv5$d$SB&b%o;h!2ppDCDV_b%EkSFoBnSnRhhI|E zxjQ__@!0ZxfzBdTcR3#rZK1tMz8lawfD=$Y8no@W@VJ#T(i6NH%|YQMTCbUGhizR> zhfp#B$(kiZb)qrq^5Np*#LH&3hYpeSl3?aSgp|Q}5_{A1rko<{BB(!pw97eqVvh7W z$kT40jzeW-$4DFjnvo|)#9nReY>LFbaa5WkIaJoFR_zi~UbD)^8hZjFa6lYN?&y~G zSs&=PCQUbL2&z4C9qlAN%X>cbG)kP3elCYHGltUvpAxFOab@u3Tq9B*8z(4XnAIFSAabhR1UiE4a-JknjsWn(TWs7%b1J; z|1bfNVA&1SSx;3n`>ZYctS5f7(LP*ik~uV~!AM|CNQ-%GxfR=}@RGBsyoT^70(xj` z7S1feLk`b6ofgvk;yIEuso|)NP5n_DYbwnQ^BH1DyX+llJ>u$%w8nq}`7w*%_Kw{r z;5_>xvs62j`^`N7h1hHp-2ZNngPo?16_nIg2_45V`%bb(4|+iFT*?@!gziS`y5~!q zf*6j^YmT%f?t{?yG+BO^hj|Hm1gWs}#ptb5uP4ieaFK5z8Z0H{gQNtaXJ-TAo?-6B z{R23C<*njBT(1WQyV>Rxy;JCwO6+K>Mg}8n$>c*jB6~55B;7H^BtbUXH`7dPtnf`M z;jrThHo(dSLJ0Za;l*DjE9+ceISY?~c=-D5;YYC!K|Mo5i>~%f_-Xf_@mquOzdIJT zo7M1zbuC_T(!JG+DMR$|?ODr%Q!YA$0z!s#K7L{^39LR)UG+0Q1qM9Ln;Xhah*jD{ z@AS4CF@L=UpqvP<922>r=EgpoR>+Hb;1|wHI>;eBGaqe%Tsr|zt9t`=)D{Oh!DLD{ zWQ?9gBxz!YKxKhCdyuD0Gs&0h8ZaX`RW%bL`QltYpG(7c#c62ZMe~c=U9fqg-o1B~ z^8DET`&hS@gT=HMK$Nl1K1fZGEX>PqhKANome~UwrluR%<<`u9=z&CKt)2@1)r;8t z137MWaTn9m!^{$AH4!2Q8NNYl!7bxf;G#Z+A-S4Jkv!Rj;-c!3IdGPwricJZfT_@r zNT;=|IaO%VH^0>jVIRIyM)X2Q`pBYcjsCic+AyCjNdFG@8rIaBi4uP*LqSNdtfveu z6Zk|lMhKilx;qaXPIEfMOS2Rd$hBc!WIB?;BTy-;2o^Y)+R?P;cyPH(e+BvH`VRdH zg{~rb4HFwu9mB19qfIHuyq0}$$F^D1|4XGQ-ecN)Z9y7gKb_vH;-G}C6A9Y}E;@`c zN9Ot!lR>=;g7Nk{v`RBOUzT^?PW7o6rOadrax=_)L8kp-xE`RiTTy=eu|IjV{*S)e`< zh^8X`#w&RLdJ>EqJ^|EoOQ_89m&Qw|F`yTl7eo>MW?F3Wsl8qvMAW94fVii@ejyR&uOni@_%(PN<84Q9R=-`Qby%nFze`zFK&%c zxAaD?83lwAj6l?#lq#`okGN#kmUuysnH%VX?%nIDVYpXqjvTu*Wa)*#QShi8_I|9J1 z(u|FU&`&)eS>=HT;Nnmz#(6MP1neQmA>5JZ`<|i?sY`T@gBeFu1@Lg9gX>!-w01(O z2Dt#WqRAXPz&|-577k%qM99Hii}&;;;KY+`2AdJ50M`)&;8j+-c|6f(X~&Bqsxl9>pcgr|8KsL(f{$J6-L4D) z*b>TF(2R;TC+YR)X-J?P0VZKpTH$2g&=Sl|db$vPJ!8HEug?=f1idLJC}`MyzRB-*J7;&CsxLa#Gism0I1fdrA3A80mp7qDD}PzRdEbIXiG=UjWdX z^GQm%L{ngW)nCfIr7o~?{PmeXwmXrdK6we8Iw?$#W6_eYNV~B2!9^$dK6%|5aD7=A zD^F4vm?Bgc1L0$N7R7Ya*u}Px0Ey6J5%=R?4L=4!KFE-lj)Z$|0X=kyH)%qccyZ`c zvO4W^md7KzDd1-^T;E<(8kN=EDjEzS#(;yP#t`8>@H(S;i(Aki+A=7Qq_;-1I)v)n z)T2wxEb})89{>J$ zNN8xNr)5Q*r*B09$P7L`3hbMp57``wrP5v%UC( zpnMyf<@-LwThg&)Bj)DJV;dcSwK%$lbfbt$;VFT5NgQAN=Qxiwn~k}T`5^%h2+zxH zo7f3iJ3tmQ(j~CS9ATdDQeyihEv|v=IVg1VPl65sPDx>S=~0ovHee;}0rGLz8x_mx ztg51HB5hGu0pKFJcMJZY_e-kJ-sa-F<~X^r?9YW<%^QySIr^n}qNYUk)qD4r0?zxx zC0a*LstvKIi#-ZatHq;@YUHEeg*d|?PiQ*~mJJPocs1Jn$fMsu$*DA6L@P^xcY-5e z)j%E>cHxvc-q$Z(Suh>KK2&@m1~~2_-TNE#6GZ_`W`#f`Y*7k|x{#l=*7FK)wtG=k zBwU+}B`-(5J9B!k^LYfTSE`U>+;>#;MX+dLsOU#{b`Uy)=?GYoDia=8)kBW2TX16! z?ZaAqRMdb#{iV{KG39zk;fj?ueW&ElpY-(gi58bQa9urc5HM)!B8oq5x>TxQM2=Me zw7Bf0^(khsIr@ZbgxHO2RWXCJ^rf3z$$Wfjxld> z6aFatLdX4Ave7>;{BN6C#9h2}>F7eg8h_`n?=V}@l6TJRo52Q^VZF{S2>=)vv_PRD1?iTG=9+~ zVv3cv`Y#rg+@05rG`Q#^DDV%uvH!aUg}3LHf6F|bPQWWBRE9uj!V||l##nZIqg|`< zU)+5I+DLf3ubH0D2-F zZh2CVCuqNPW+EGG;@oT89FQ6&%h^(OHu;t%sjEn`AQoNp@i)2x^Ts>{u$(_Xv=Ng1 zAuCrbfIQEVpWt%FbtXPJa@f(K2K$)y8RHL#`-d3EV)rWysptHh#?kEL=U&qtfD4hG zLpv>A##f&8ECpm8m=Nf>;?M5@!kmdg;+*LfceiqQ$zxAH#J|>Y?q?$+BH}){^NFeo zvgo71W(DpQ8r<<)6Sp1NVY72ZQp==;@@IaF>JbRrr(JSr_&kl^YwLk#g3cf^R8V$Q z&K8((w((R;AczdH(AQ`eRwR4t%-`aUizSUwjN->Xq^83Q8n;VH1rIi)RDkfKOy6%V zGmmpKHi?7du5-khobqAe=YK{D+!m+_+9SfH5nju2#-yb5+n5-NerrTS4^POv*rI0k z7Lj`vOb}E26okZr50R|H6kl>|qCU)=U#zG{!Zs>A{oDkVAV_AWuzKY26P3{_R6dGP z?1NBSdOO)~@JZhM$KVF_T^2vas(3i;MGjQt%8CL}*;na2xT$1qXOO_jegJie<&P|a9pElPi-e1pXE|a`;(Y0? zwo!YYqKoKWMlGd}?mD#8$=B-W(H|n8cg(%hMWzS(rKiVPCozIofnDDY#d2I^2HFx_ zv0WIQ(X58!!8Q*PgTXP*J|*Ltprpa3h-GG*_#KoF)YclDFcSep8pMf1SF&@oZFF_@ zo+?j@@e3nS43dicASy-d2?7jWkF_pL7w60NuUPG2e#AT&cFwT-{0`A|0I!Ka*{c}^ z-0aS;BHUN-ZeN{Id&d_+V7uU5LQH@L6pxOhBo!G{?t#)Vs3YkOpk~8qTa1l7Iz~|x;J(XL&=9w{cn6ks zmRCUo4F4!nxB4e<^Ir@SKL{l#pcX+a0Nm!zW1K1@q#j95c-BgLJ&X;Dt7Rx-bsu( z1NjT8Pyw$0!185~OWl%r^D|*Qkz@JC`XTt+Ho)tQS{i_m2I<8i4RRC6iAG+9%C}hF z!Z||mM3OJ)jiC2G&ZZEqN2Fmg95Q2(SG^Zb?9a6qniPgpo~vyVdQRqRRxA;rmh4D- zzKJe(7l!mY-4Zx%#`h1XiP&*ZM2180)asXJI8%l1Ft?1r&KjO1-221nYsYlzMwUWi zm;s25*48eHK5y9cC`aQgo?AQ%0rMOs9T9&Ewd0{s5Pn71XPw% z0YvfCRb#HZOGWD!=m7K{6`+0c4pqaszkT@_a6^DH)}b1%+s2ubv_U%?GqaJGFM>s~ zvmq00ytC*WKthG)r`E$sd&8RdRZqzvoP;J1?RWpnr2^g81PLU9wWFuq_NymVkEiDyt5OkVH>=EFlkoov_ z9NY}^G)@oV5`Tk!i20yE6j3rzC&i&wL7gG8Xp}`kNqgNg0W{yBk`Bd(V7*Vf2x?WV zkFy%XvY+b+(w`T3{pCDjRA;b?~zXoL@6GS!kW|H??aSTD%5gzzIyn38V5=@Ljn@4 z#8Uhi1$*o}-yq5gP0msBy!Bf<)W`s2VMil;r<3{l5tF&}do`41ihEnT+&A;{(gQ&N z&e}|2uO=e@p;FWk>ZKA~&9k4UaJndb+dK*b0)q7Y|YKBy)<`QqI4HTBp}?L>(E4ZPShh#v;00@*K2i1r3| z$6s3@i$8d$4WwsRXf6Dp9ViFo7gDp-yZ@;BAi;&pHrVfI{?-yk8*$anLpN8UTSr0} z&i;58lG+mX8DLz6y(cTdJ3uC|%wD2F#bi&j2dwb-P`>mv2($Qchw@a-cAyrCc<^k^ zFVX>4K=omOFd zrV;@60H#f%y(5m#7uA2m6c;n?`{ns%$LLS!G6yCqaMuWW+ju0bAFG`Ymj(|F)lx+y z;QjQ#<$2eAmekncc?_}-Ugc)t*qdkb0|P(s?~m!@ze_M>qXbY)S6sJY!XK| zUYGHCNX-V~5=Ig=SE%qw^X*H^>~K>AYd~CG=qv#!Sg}Ge$z%J+GGG$;haZD-5?Ss0 zabDJMNg_gu+M4S|@TX52$MBV)h5&v!1{}f0Mm5sRO5fGZ$2Ija>-Z6Orm2Z!7bGq; z58w*$I}hB|0cFW0Utct9VyCFosC%jp)W%@Sh(k3SaHzLTpTBzgdh%(g0PJq5^PR-R z>41oE5az+NH2HP5IV0cLUIdCO4W~*2mym2w#cc^6UqO68Kn;#;GCuXNE5-%Bzbh6D zg^tXMu;yM9hd_XVJ*OnZ0>OW1dziF4j~YdXe>#J))IZ{E(6+VsDFapd5sN6?KkHy9 zQ2sjX@1L3uwdx?T*y;HafPjF2f%#5aX!>YmD%82}AA1YeP{*vg1#f?xHy_)p^ zDIsCPJ(;PC8z~U8z~{?O9-g~(x46>q)-nUrkzuIM(B43N_#Gx> zZT^Q8U~HD+35wB!LLWqi;sZ~4fBvna(S5Kl3ShbFJMs?!8IIw4lmS`F&krr6V(=q? z&>q^oYvV+ds2gzgl39Gn?(b51BL_M>SfkhLrmJT>$o{(-Zz!t{N&0jzhWL$hT}-%v z1^nx+RV4sYhl{;1EpFoqv+BH6P6)1el%AKTbX4*}lIM-xGfEkS(npUTMFj$wAI>C0 z$=*5;=1pZL0jiel+Mcr=rfKq2cC$Dra?1p!7M-OA%g_r!?6^HJUZ9_WwwF>LYAJMDO5r_j(TQKFcK9!rY4HP%B0yG>!>~PEJYi6Qht6^D6Kht!w~`D zAi=Aq-QB={xAXN@gy2KZjwC2@M_Lo8(FH}4ef!dB1MuMhHm`cBSXH&OFvn4hiZDu~ zE4om(UrG-6D)hhDuhzMjD~XCJfH0#G0E73*i?AyImxpj?kR>4o;_*~}A6XIHBGQ~7 z#1hGHY3YE?(Wi|Zm7;{G1UH5~ItJ8{PKNdUk`9~*)Sy;lm-RK9hU5J}B%p=F-oNk3 z)xmP++OwtF#@ie9_Cg}E-BoYcj3Mm!{&MGixkd@qv}3dPxdC3yh}KR;$K(+IdH zPYQvD`~H?A=uCyr6y*FKU)O9NTxVpiJYwnFUMEuE*_IXU^!c~DUL@S)+cRWuU5KQK z5f^~6v-cp2+*j<1)~JI}3L1d~29bQW?N9KLgF5WO-^I&gf@cY@=&mF8okr$mjrM!65) z5r_qut$)-`1NoTT(~uat!k0c+ecJ;}ezjl<#EoJ(WA{7=@<)$r6#b4}*)~?R8hZbP zAXdStPWd{$-U4L-0M?2*?TW-YYk`&PRKUy4KP>Z&+Eklu0^NHIV7?mwyNbH|?1$nM z(84ZmYXhwuELcpZ^@nw!!jVp=&uX-jLl)oK|8cjZxOh--aFTc1qiCfJ@#8UaTSr|i zPT~-9T#i-Si1(-_LzW)m4ON{#@p76UEx!M$I9`+R>$02G)Fs8Ai@H>Tb+^m!6NZEX zQSu-Xlv+NFs4K*ufi_UIiF2hm&~3c??L`fzpUwTi@ZWr7?|fKz<(D{fH3h%P%*2Wt zE7taqh5>#WyJ`SyU?tQHDbpcs!JIgSaC`um5y|J5SPW`sG^IddcyxBD1ms4>deO3* ztrN`GL(Njki9^oL261xF#5w63Q{aWgUN3!TQzlAoa%0?^AtA@0Lt31y+?5*xGkJ9y zRt)6+_plG{)xQ8t6tylu{SKfx(a706Swz}^Xzq#GrVkaRK|#@XDm9NBajpq4JkPy) zy}q?|{j$~Wn$#5!)*GELUDs!|HtFS+Um}jb*VHtKh>9vBDbDs$_uDO0-jrPUY^aKL{uEborh*j!p-bH?4wRKfP1L1P_m=F zUOuTj$8=zu&-J^hP&2Qs%MQh7cH)zDVaK{x?uDvtT$B?8HLZZrsmM;pBWKY!T+b zSso}>{1oN$fYONl=s9n~r7VMA^$Jum<@v$=GKc>xPfgaIawUm1xIztx96BN-0TfB@ z#KQiY_hB;f?+W8)tZNp%A1)=`+pB1?r zJ-|4AWcmQwHQ!H8JW`;C;dR1;eM=OHQ|y6}5#dSZ*x1-?zXu`FJqFNAWNMh>X#mcO z&fwsPrCh%;rUYROufZs^+P(;LI35#P$hK!K)Qc|79nAa4z4hlgjP!D-a|F!5ABw3wIZSdni{yoEdkmKj zh{MsZhy$9Pkn66oAqz&8q_)5jFCt`W~%3l6u@nLw&i5G7YeCZP4KQZth)mSR+ z1mjx(F(J?J$L!vk%YlAlSk*Q`Jf8euwkeme78MYk|M=+0#2Bm$P^O@NIF{8;uUIKV z5NywN3?p+njY?ByHl=4EUImthg!vgL#Jy@@SCY)##Lqt^!*qg`JNj!~eZZIY0K&m~M~?Wggt&s?lKMvr z)(PI{)xBY{Yq`w1uXeQ1B@U9D=fKxwSRO-8F=cV`X$Sh#R%oiBs{1RVNs5)OpmN<@ z;zSs@%i`C&IrLAW~7C1=W?-uMDE;!*^w0WjfUIwMW?fo zwS&8q@f?ApxtHz>o$)(Z&|3nx2%Ht*d873d}_=10I?hvRps8{x_H*rMVre%o8t>eCq7%jCbc3 zEkZD?o+Fxv{=y8SO0UyH-2F1tJ#nyFSuaj6VmRWBpX_cX7y!#xYrd?@wj@h?^w z3IBzj0J7R>>cYRE?p2r*r~hJ>3kLdy{ONx50Pt#_!&?DV3GcgqLTw!`E?+hLP0x>S z=$n7Zp4{>O>&o#z)&MJ3eIeb719}--;4*&R^@a5MxBDyny$T=l!iD}KaVL3Is&H`0 zh;O>7{LNNjHT&Ae;_rPi;H&>t&y~M#7TU(iVIwZDc>6w&u@1yU`LBg86vYNO-s&S@ zj@EGWk>Hh&KiK``M_Mx#>0=^Z2aW!*E?+z1 z&x&V^_U{lrL{Htyq+rGHs!*WGE9lL7W=NUdn1U*e;Zqy{9YF*i@^IhzUP+DHsV3ON z1rdd0;@qYA0Uf@wRf#5XUsfOqbPYH5qjFUf;&ih!Lk$~@wrlGvg|hxqBjOuzXqskJ z-WO#ax3CUjBu*m|SFnv&5DyDtnFfc_Y}r*9+!IE{u7PrO$?Tix5ULZUG88;Jy*zJ5 z7cYW$8Qf~?v2x-101X%X%o)mTE`7;J;8j5Lt}`Hj&(Epuh%L*5$l{hIsNs6TWYTUs zrZX#0sqfJO6|}eZOEAFz-jF~oHAEcRS69j?DMCST2V&4N@OT_5B@h2N7D6%?QJ~=* zFF@)$wm>@@90JNL2$ebqESIlGhr?*Uf|7YmcW?BUc>{k6S&3}5{Lz<2s_^3uXpTY+ z20{rw{&)Y)9vc6IOkHT%a{T$1Gw`g3ckqR(dD(5XUn=-{?M)P`nCE#WV{zecZ9x8* z3$XLob`yWAw_iByA1!&ly_kQ-{l=YyvTd|nVU!;Jr_Act3HlEgMJfG*GsRe#F8JoJ zE+pj0*V&8+@;rk&fdzsWBk@NU{eSFq^EWbk;a>me&AK05`a*Uu++4_!uQv;goz@iJ zb|IYM*$GC_`2XqNWsmb1L*B8zN(_!a|0+9(`;}*2TjcSG8v5#-{>@u~Tm5UJ8bQgg zOEi2%`Qr^NUk2kZrUv$eKf5qi+W!wtn|2OC{C>Ou8bYFvpcIhcyr2H!RPziR{t!OE zqZa#5SAl=h=IGlI`}GUt!MgxV@tJc=c?}-^{rT~~oJRlMY+LPrsay1W~PK|;(~zfxujE;nj3BE zm&2YGP)u+f% zY~BXO`_!cuU`NtWzjX|1g_mlVjx~#Hl zb?ceFzH5ZL>1CGB)35uqJT1FkJdMp^S2lESE?Z!vgL+d~c9Ij9E)S)r+oIMbmE}l~ z1@-Kfav{u8P={EpV&(7G-w6B@0_e|%s3bul#U3VfH9(;005d6>RF;j%dNYD@(nTqsm4%XSCO_Om3zMaWD_t!n-xj5@~mRss!Tzu_Y zvRf;1FEK{yRkL?Kzn2JGM=WIItWLSn*}(V0Ma?i7H2^Q!XjO|wG%qcuRI4jvSKHlU zj4j%&r%$xVE}(qs*4V-84V`nE?m$w0tu5PQXRKhMAghq8Va~SYWmBC&&iAOWsE%tG zg!I!$kDJ7JBJ$VF1j=Q{L57B_^jsAK7WBd}v7x{>IiD$6u;nm*h?8{CW9+xCU7UYk zS=NJCxKQ?J>PHE^*l@+$xxP$%J3sepfYAV>G`CMzLP5&49lipO*$!@?x6F&{-Cz31 z?0#!t&GioLKwD>Kg<_)SUp4LC$%qj+pm$}~L4oJsdf5T6Fp5WAmjy5}`brod)`Yh5 zn$F^ne~vl^H;a=DPltXe<95Oh5FCs!_yBU17(y>)Sg`2D@)&s)*e6U`k2{I4h((Db z_@a1*2zt5=I_^P(+uOW$n_{qd@5Qy$7 z8|8i`@~{%y!fKa1W+vlM1teec+r-0B&wvgEnzz%ZLCvkIPRIVY;u=l)jU^3;+HG2Byns;klE6l}T=oN>+I z85P}7rvM(YL9Fz`>(xP*78DC5wP& z&c5^9{fbNnc`1#)T;|JvpWWFqpJ*4GKd+lTO1hsi*66mI4sV=ePAKpqRsbcO#FTku zYII)a%I075`$V%u3>G;Ji!>Q;OysfxymXLF2ST-f&dZURq@w=;ew`4<~fO zq;9}j%olq}U=xySA@b%nzMji-Yfv!RlZ-=2QbjEh7%+d7fk@QLr+y|*^ii(gHb*nH zqbfgvrlM$uU+|m=kdkJ%qzKFc3Llko{J4CN&XrA2c;Qd}&QJcR%zBOWu0H6K@W<}z zX#?F5jeCV-RWOYz#-o%DEEvs3tz+HD3^Mqiw@)6 zih`kTgCDZ_pY!KXsTPHhb!S&??SXmXeD>aYS@y@7qN8Ed*tA`QYpagL!kdsaa$dg+ z*Nmgw#l0^zcqM$}bgvt+|A)^vc-EpPink zA6F~aH0%Z@``IBU`hd?4NXkZguj!dFI`JZ|^}F^_Pj)~BrYt8OC<^fP$ZYUTUQKR$ zoLB*6G3Li{9oJ~n1MI;HJFiudJ%>!2CV=L#RTQp=1AU6^Rr--gDaYTCcg)`;?O5Et z&1a@=`2bmY2DA<__s5XJAG=F0UIs~HW$c?N!;b^cM{F?fCr5D*(o3%X>{_(z3{zpt zrR$KwYe*BhJ5AV-v~!{%uzLN(LPSVbIllMQ#Nms2vNmgIYtuXN73NJ|L!1o3%-@I3 z!ehJgxQ9Dwl7j{}I(yE<@tvj^4$?yjHE;b7L;+Xt5S@A~d&Ot)l6v@S^0Ba&n*JS# zIE*!u9$Qu&F~hu197cj|#?5){KT1*jZgJ zeUFImW)M$90%UKm$`za9B)-In!Q9Oa_?&gJk@9Ybmu0fn*$5VgCr`Sx##XGm1bNyy z!_KMsSFXAfW4?uFDjgpV_AKWfpZVP!Y~PUdZKtD2w~pqE^BFdkW*YZJp=o8`>Ru~p zRh+2OrbJN9yhkK*k5!M1fX7X8q=_1@ z@qsQ8aM|%wg%^qldc`inL)7uuqx1HSj?KQtuhbv!KLV6wT2QFg_OPq{Px-mC2>Paubc7;7CffKNq z6=ht{OusH%gahn6ttkL$vz$tWM}Bb4$5O4Z3EWYv8IHs2=aX}KIWgeY)|-^BZuokP z8E<^@K$X@E4}CGQF}jfzGWua*4`dPBO-Bn)mUGIBQ}8}to@pL>`=%xEK$*7$nEzv? z#(nI`ephkj*19^Py+}jL5aX4>$ZxL58Ubr4YN-Bbo0e*ehJ}HIQb@;-Q@$|jjSwKn z@GfTz44Xdugr&9on91h}A{YV()vTO3yW5p((PK@&(caO>oKFO`-b%nDxM2R&SS%1( zA?GwuAC2m2ZO!!e;@*AW@0B)2u)y%6;6U=wMpLb#ZLb>apzytAJU>=XP_6+nHM=t35k zLuxFvaI(rLSa8o}Q4+V&lixaDq+5|T^dhr#F!mrh7pUZ%ovDD8NQKa5@(ZTy+N3bK^a&ip_IcZ=afQ5?4>SAjET9}5(X}_R@N)R zCS&OnFNvRF%EJ=gO#^P}i0hD9A=M*hrYM`6nW2v7aQx%yD19+?t?Wb|lvG>m!e04vn2;OQHfjyEE_NaOJ-8y*XRlyPETDq64v7yh zWB8t?_u}mK;O${kSTl%6rXRm=mnh}E$7g&4v&FxhddayknJ-=J(X3hN$Dy1cE(UkyJ(yBNuHnK zgLSD}gO|fC+M@Ul!#O zkbsW~ZaJ$XSMvv_YlcM(?^wK??18M{)(WJ3TXtju-&HMn*!ylBKIKI%<^2d1o{O$I zMec4Hd3g8;^33#~8n=x!UiHzU+N$XFWHH2%*l$g6xfq%s1S+$H#Jv3adMEGMB(1b`h?qo@9Cy!~ciK~MN!AAj*|>5Z z*;BzXDBLa%?ndo4hp}9*)?Mo$o~9pXS$j*Gqh5KnApQ)348Eeb5vp+ZITTt`K?oOt zk=J>pqeo-lp#J{i#PlnpVm*^yDo(7z0sLQZxS3K-6}FH5k~M?{?05NaC@Z5TrL~)S z-oy^;DY4s4tFTRZl)cItOkP`<^4Z6HVmleFkxN+l9t)YO;_T#3b9Cs2>*?bd83@#1 zAwBHpwc1vt`$R@rb)o@+KKZlV=RF^rD%q|cZ(eBmLaFYkHIpt1$tr^tZf%cZxx}9N z+bObQ(TXgI5$EkOI>{8{7S=WYmLt-4$D5i!JSYr0iHHtBO_trh6VJ-wJ@fsRGA8rQ z^dP6czBZKjA&7tKB~Wj)`^~(dmP&&i*s{8#>fPtqyEoxB5PKU$jSB&-QYoU%97^dc z$pyICQ5~3g-3k5TWbe$!og9KMNHQ(=htx-okfOSq5P_RXgK9 zB}Ro*?p4`zm(7#1ukHqd{n+OI{Ht9lW56S07tU5QNUm3K8i<-3?Ho(c_{*tl-HGt7 zol{qXQqp&oaEXMF7FXhg%vKz zq#|wGDFwN|4pNUZ?X@VV1YJ@3CLR7J52@q&qrRopI{uLeY-qyPcJ)q-4@3bI7RpfQ zrVwxa{uF50t&;(A`BWS;lu4I`;uNuanqyNtKN|ER#Pv@ULalX5r?7|MIIRX+)zg3&`egzO*q`AJzDy>-<+Gdh zWwXzKq|=yR&Szpl_DE6*<#w^8+z!e|+!u}=67wFbbX(==D3=v|80CQsjF<=h9vdycup$1u=WgW)(e;+;*17<%i0YU+)(Ag3 zAE%1+^L>tti2b=emtslcyb$%f-9L_1o$5|p7`iOZgE_X+n5$(cGO(hGW)F}`x19m} zUIV?~+dhI1Cex>H^fon zQJh6U5?-lj!m?^*REe#Gi-W+s?#e#UlAzNXZDm#w1SZewoH#!qqO@yjQ*}w5^3$U# z_@sA3lLX;{i5r)vF7p!iB@X#a+4<3uAi!73$X#_1N>t?iItM2kvg|BNIDZTDCz-(i zZUNrDIX<}3Cx1<$fkCE=X`6Z2r>9yQJFFYsocfHNpPO=XsIT!832J}7MBJuUf$axK z2h@BFtvME@xL^YMBkab@d^*+6$n|lIE*vv8|9IJ%TxMs$dh{ui$Xcj++Y9dg;4ei# z5e(HrQY@wy0?Hd1SLJV8 zqn;)Uwl?XB031s^R}@B!PH=&+ zeMXq|cH+?sDBHkGHxF{f_i ziax^YpjY)5G^5gkZa+TMbL-n3NpFk>M)FYd&YCIou$y2a-^aGWy(x9)Ka?fPSYFf0 zT*b^L71yQ-U71lClJY}F)p4sXNMi4E7c=Mp!0Rb{b*ljM?%u7o#nP!6$up)M_I%OK z>7=!$OW!xoXbzvO!E`a;qHwqXQpbDx+Y*C-=8R=Jp@|)pT3-&QKxi!LV)`8b`0bcl zMp)tqw=cgAJEPSZSZK&vx(+zs;^BsZizf=5fs|Z(=~x!OR^oX4%Tns?`!D|K9Vc8& zd#+#qt9h*LkBi?W*ZisRSzrIf%Z$7K^wa;{zcV`WrBv%u`V~mriOcLAr?~i!F6Cq! z7aH){V)dn&F1%r5m`U@CzoO zP|AreSXBfjS<(qo2Em)0+yxQXxp$x~?Sl zlU5yhim((%1Cm2HM7L(UlHcYY^{0l~RY5fMBP6gbj?Wtrdw*)3hiMw=jcn)IY{Wi) zjl&b?5p7w?4dFDN_>f|%FF)e>$G-5o%W)ZXQRxG5NOZ}4{;H5T4nj2F)C&gs?Qc63Wt8y2E4_#|OJsnQ^J6Cq6wlE$_@(6?qzTJ3j3C?o42g%JOn{=TBof ziI||So2w%q2t50Vk+nv;Sk6)0MUxHVu!l%Al?5Kf!AIj`;ci#;)GL$LVqHoNKZobk zadp+JPvRMQCBI20dv#|u>1aZ9e%b3d*auq*0>#LRCTCQcX)<*ULB}*jCDdz~k_}5N z4ZDk5pBd{Ch_LzH*&#=E6zvU@3~Jj$LHGeJ_ma|FsGC`E)k~9;TaB7s)U%SJL*q0o*H!Lf`Ae%zg8+6B@xb%^a5c_ayFl@ZXN0kMj_Dy(UNJ&T%(e84L z9P(vPW_~OFDvLq2;-R$4Tk+?0%+j9pB>b)xz8A;PeF4m-_M7_k81?dq1_H=}H6J_g z$zU|_d8Fc?G3+?_3J5&yLErdYSUlWw-|JI6)9H5HN9vVj0G!dom%I11Rs(0lLCN_D zqD?=2club5(*xtwOV|Ij3*gY7f6CEwQGdpu_{6shTaiINJ6G+K9y}j#Op8f7%7Cv5 z>zU*@KcEwlv0;rzJH2B&}ynMPF{|#5RA5sHDK8HWAuQh}6QW1mp zRrWZFWcbmt-m_}qlA^85AMl(%=}ht*lZS>WU;46#z-}}w`O0|D%|YE#+m$~paUZG0 zrRtObkA&=f7<^<8%9*BJ4|UrWe0_(a!0{1ozeXLV%k zYq&74`j1%D4c`K`J)LbWcGKh$Euxgzdvy-fW&ZM2?eI6%i1Cpx8p$$hBS?#Es@?&W zdw%u1BJ2-TGiAM-IK)NSUqy56OQ=w~D|Wye)m!ei7B^+?+kWTLLK3$ju(Bjxx@kd+2tda^tXAy)>XhBY+^MIn>>*gkPN0Rma}d8Xlqa zQ1y95szhKOQMXESSnT!-FTlfqLe~;Sqr{=4q5zpVTV%X(xa0=C&W%PWL|>EyP$8Kq z)Q2Fugfrg$@y|`sc!WF{mOlUZ@gAD#Ln@(m>k?1RgIG}Lrq)ckhquccgH(|F^gRbE zYem0Si-2Q1O7a1;7YKeFdV{UtvNWrX`VDkAfT{sh`<3;wRg|*$fpCoy=zSd1?oBpF z*c2<nY(l?|{k zNLW_uTb}~F92i^WM%V43#F2!Ru=J}vNxlcR!oq%8;%c~})i=4& z&JcBM$u>=uU$dLR+v1qN0KDjP>+tzCjk3gdba=P~wJI7v8nV8m$gKAEtE7=V8SB~U zu?cG>d;V-q;MKrQvV)%)(_YlMXyL1Kdjmr76~un{1A%y6>^9IRZU|8ePn-{zT%%u` zPSTI?x<_|-5)VU{H8;T4(T;)<_a_xk9sMFd1cg+;&LPWfSLIa6d5F$HdR5RgFDDdL z-;b9?NU(n**6A#y1BLKL+u4@)Z{n^FDfSH`|V3%I7B1;*bboCu^RYh~%6H#I>wA3Sd$Ta+i7*toN;;#SLE(2mf z-z^#8IE;~dB|B&H?F8Nzo}T_Ur=J8zg;O#;DohvM-bE$FV-EbfL%)=rpHG@kQF`53 zoofG8@4-FW{fi{95pNt_+-iH3YT60y(h->=mX%V1DLI#vm7{w*!F39o+@c`d& zCFvo9M%%`k@*LpJw~O*M^eBJewMr<5)3UOvJ#|igsvZ>u(w7 zI3$q7mKSUmS7Ne4FZKPXP`MDnDwD4*dUR^nuZOT^`@HDRW36Nly=yI54;CkAWy1^t z8dg~%C2uGp8YcSD8A%?pEw2k*^)w&EjB!9sUa~E=d(^G|G5FHGZ+4NImY^n?a1gF9 z_$-`axPd{*?DrZ!=+lcAiDQ*1@1KmMgqymkxt?(0uKv(xq4BFe5qkfqn(LkPWjbD} z&rA4T#qz7AVu$tC9^p!~_dnCv-R!=*x&06KX_9p|O&=y$VD9kkn;5IVAwY z7bRl#iLm^XHS5)_R;ifVzbevyrMlGv?%74&Y0Bec&Z@DWHHR`{%)TUL;sN7K$NhZyWXt~tD0HSqoJ=BQno!^d%_ zxe?9KFr~(W1CDALr#+Ih+&yH=Vz6Du@7!Cab9-6AnqSqe(6^QqyoaiA9&qI%^`lEv zV?$R(?hjKf92)oJ{V(pxFU}-qZGQnEKR%PJF=&b)t z9IoH6D)PS~`W!$m-qYOvXBqr@1MRZ@vEynP|2KfD#vc5y3-&jde}nnAWd6O)|9`79 zUz@ihdMmn)pSV|b{a@+K`W``qqSc{ZDgk}S>D)-(DRZw;*{_$qE20JB)`ae$=->qJ6sbni7g&2g$sb*Y1 z=RHZ8AWjvVD(|kC2FQ&z|Q@>cud1F{Z5j(#=zXoIIq=OUaoFXa#qR6@4iAf(lobvga!O zlZGUw*1gsXSoi3=k02S^;P?b7HB*o$4+z#F=U?QjaFlCXDyMUl+&SxczLMl%Js>8c zkc28*1Ue|eIDf)9Gs&JEl>w1_Y+*ag@yA@QdPrcr!A6Fu){=SVnMz;!DReY!tEN#3 zOJ!8ug+8q})mQpuz8&$trW=qMA`!>u~ihap4rqrL<-5@%e5b!%=_BoufvwFD!Z zs$8^&^{Y&?**nh_?LcIVH$?DP;-3XRl>h0Izcx>2#gxE;a8wT0Ajf}*avh9=7-s>~ z*Q%Tyx16BS%4I_ui=J5&dYQk;?=3q$7mSpX%2LGqi&lMq=d&g*o-RSOw?B^2s5Y(A zY_ScFk8qx@unAVmE=|Uw9%7-L6~GYJffIgxn9fuO_VL-zUQf5$NUAD;bYERrBRB&> zFFLLEb5R{lS#+8<;%7VCuSE(>Zx8gW=o}XbBSI@Ws%%$<#~Mda@`DmEfVykb*n<69 zm|Y-Y)zRVX1`3Bq=)ap}FqhHOSw^?>S#q)J$7>xcCx7@7LV^iHkaITWZjD%tVIQkb z%>55Rwe(9zOmc!hVRUU)#c->|@giUPXh@Yw(bLXg>x4ejE&B}yGxM;6fOdpu4p!qW z_s7VcGN1Hy*w+I-$%m&x}s=uhE>LCx2?6TH_>h&QTR9c(~ZOX&7XNoQd(Lr zRHU`P30S}TGu@2nYP1?={$&%0{aE8%0vtl)q^^9QG_oy&Ze+?Ow=gK&OTjxOnczP) z?nZ5`vPIe6gK)rMpt!3ZhC!;t;8TuwQtFq^xPj&+M0Yl*IPvKbuGx*U@LXGB#rl_W7{FCB+5zs2Za;8QzjPYDWW z^})Ib`k!!lRH4+qb>6D`n1LU7$x~|iYLsGqg8a>!JbMy>7z^=akm44wV~6@F<^D|F9c=S9b*jp58w z&QTmZmsEd^TD7v%$*13_*%6tB*yK>>_F)40iBEg(YyV|)XSLfzRdoJ0Ye}f=3NMEq zeBB`}IAN=3a^R#Eb7Y~)1s@UMWOL{ECzFR%8~^p)1HU~3)VZj%N5W#j;HN#T-^0pR z?HW17yx~!2APE}ys_>_BcE_m?xmKNWftC52$BtRv*=|3K?ex;RERghI)n7rQ!43vI zL^m}jDndU)bMglzU_Ix*J+&h)ND+di7r+H zi@jfMGU6NK!;3TigiCM{Em((cY8R&lkp)&rx_I!8^{HPwqgl|;2Ngp^p7B*28^Uj} zjkv1K9b&F%aAA_TEm1K3_|E8|byD9KTVwK>37LO|kU)I`rA5akOfA&JT1(vaYT@oy z>k>wYafCxpbUIJ9%16&Ch7ilKt@t5~{6qU<*5AVWu)D=Z9{Q=7+^^j!GtSQYvA3Iilfj1UoDKBxv4q0fS7dPAx#R=whz}KA%T=wx z5H&QzGz}!Z??t;0MH zpe<{;1@haMwz6xIe+j=57w}+TniHhT@FA7y8m`*D)h;mLgM#=EDIW{IbuJ6E|MaoQ z(y(WW)7{>lxc2mItbg|HT5)XQ=M&c3z3D+F2@0rw4X}v&(Umu0k)W8T~3I9Dk-qIHi>-AwM1Byj^Ue}%r3?b1OgO5f+D<@xb} zT8r~rJ3oi`W{|A2sjBtzcd(oSm!s}KSSYyHD-3pjl_TCH^$qgR99M~5%yzOwJU>!{ zHt`kPAJ`!}unmbu6-y6SyQt*xz%!g5q8rN(;>S2hz-iG51TI_gm!YyVmR>q(V_vAi zkv@)@WzTPnc;Jn4>ua@uY{zJQh<<2`t8{A)4zy9PU(vGU&}})0jTrwil6wq0oZX5| zY;uN6Ks7Ip+bW%d1Vs2);(uS9_|#?oTF(QQ?KRvH zbaW3QJWC_4fpxHin`&&`prvskmgHTe;UkUlD+o0-q06Ha@LYtmF$Pnpnbw<9pU5Tj z28B$ughVWhnLJG6P}&=dEjmtp_F&fJ9WKi)(|8-Jf8e2dP4P;W?PbM~)?~G}w_$D$ zZT~|z!!g(+ObyfMNg`zoAqst**yQn7&ZFqq)VJs`*I&yMN4ZtT@a!=M?>|SQZx1=eSdiDJ&wktw++&U3ejAaP0z2GvG zj6fk_wz2Wa*EoHdQ%=Oo)*C$Px7~Z8Bp3$HE(Z8@4O`hENVT3*Z(nZ%y>2KJ> znWYD>ip2lr0+xs?nLkDXi(0WXL%Okue$qZPpZ)dz52vZ0bPr_KWDl8<^7dzea{Msd zR`Q}YlU$p;9}9^tIGYT+v6z7=dJf3ZxMp6}Yrhuz2s-l0^g?f zRRPVoMDw;5doG`#gZ?RGG1h=J&JnZg>H<{SMdji>9%uwmU2|J0(nsf=EyjO5=i)ju z4xMF-%W+fUCj)59FOM~1L?A*44H?A@0L$hD-%fW5B|WwD+ECO&IcLgim)KxrO1hs5 zhNz0im@4Xt2Zx`~N+3B+CE~IsvA6VP^B$^C<{;uwD4db7kcb=?kx_J(TMou9yAO6C z^Bm@dDJbuKCD~@zUvM|+VGhgyfl#z40>ZISJ&Jk~zU6pZN#OkD|4C6I>o9(uJ_sgD^!NFxS=W;^U zS27G%g+bmp%tv8z^;)IS1hEV&RCP3q+N2|F-vx(VQqPD8TiB<+q8tI=eRiGNRO15K zIo5dEBK%L@c?b-i402`P(fAc$Uuk(hDly(>FT+Q(AyZF%zC zdRc?(@1`b{6awzI$Bs`6u2q8i9+zoEh}cZ&{&k@*PTGIM9o$|3$=0}QJ?mp=DQt|E z?x8*@!_+8r+9fr_xGH1*vnJfUEKv}za>1EjO)#MHhHL++CQb{4&k)5I4caOfoOGnW zMt68`l#Q#}pC+8QcILEwZEP~xDMEDjM&a$e2zQ|P;!%@gIUypUlEBJ2PiAi-2l-5c zNJpdhBrMGPG`VTK9p5AklcQuD; zr4+$rpYih$(zJ^O+iHV)lX!CpslK8B!@v=kyPrBn<2U{Ae494)A@zYeNnDnNHJl5$ zwiI2^ceb@`%9&z?1P-N`8?}{s=eSL@RUfuEkvRIIV7p2{Qe>K{@YBrTaiTJhSeTs3 z4ZN|}@KNCB3X}A)OP5>&TN?))aA3ox5|Yy)jX%t1wdi9l=cl#Fs%oR6;1+mwk`(hX z$j3Fj4LLecRZ&Epr0@w zjH|d$6HYYLtQ8PC!4yd&y!sjBU4j1xYRpvZi78HngH!a|2G?91xf7QO?&fp_KQR8# z*Um}I@Go*8Bc#4`i!y3;_V=(iE~O=Reb7l+rg?R<)~Hj`L`(c<#PTsKT82q!`ndS3rP_UhKck()hdUh9O_UkpQoJ=0e`c!)}PN` z_Q^D=Ld;(_sKu=k@Yht?(yQV7k&}mo-tNW~C>dAgO*i+Ta|6HU+Piadw{^5XE5^7! z4AIP*cIu*CO`cZXIFoJn5}-Z$n`|yji$yE-3R-rUeBb!dxR~pKBXC}^{qRiNI4zn$ zN3@6Lt(8T8(3G9Hpsg45!|i257VWcD8RpWt$jg(HO6Q2AM@zdY3bo8XLSSZ?lf6N; zFO13q1$&fzhy_cfPN?Ci>X2Nuk)e6bM@?jg5|>qIzVZpZ7g<(BzKX$^{5&C;pP$-! z5vWUkKRR(ML}8t&M;(AMs$6VR2J-Kfv%wfiuf;3=F*u(l*?tz4(FyH}nLyD?e{m&r zpM)2R*e97W*std@sl@K2tyq&pNdzo|dFjf|Oltm4hyPfMu}$9OluaSgwjEWkCzitv$%xd8sb-vwg9@#3tJc6>698K zC$pCNQ32dm*N$xZjL60*y$x2EKd?HlB@{FY59`f0=(TgoJO47#L!()4CF7SwpL-$% zAN~rv|H%CX?UvL^`9v17-J`|QmzwqM;I{Zp zZ_&7xaDSGK`cqG2c zzV1Fa6P}}TniJpzY8;AFv84H6Xq<;#z||ZX8T=k*rr3fp%NFriVx8CoqMOt=2OVtk zmzCMjZvNWRwPiqO)IGyUYVAqxJQ?BaySY3X7-5V-MV$`11}qw#{7iYmtS`hIK>d^% z>@)L9w)He|;!63vD!yovHxApz8E3}KDRiT!`O6^Y`?JYWw9?h|S`?PcJ_9Meo5XVx z48%&aoR;cEup~kIgWOtl7E_QOw3H1=N&jV0y1!SB7Gre%XwqNxu!Q;J&&srFpKsb2 zLv$Z_MRy?gma2^(Q>CHYRMoTlr^GKVt4dTymsHz-s}i;M7#8t5FxS$Tok#2nmYsV* zv0D{c_*X6J>c2@mnr0cl#fFj$1PxAVXpQe>seemwd;`elSM`dMa^N$HT~rsCWD~ns zH(RWI{X2U9QTzILL{!zpziMCq+dQt-uNF&2{K@;DmW=YhC?vjX`(Gw`Fa4F&)Zfvv z=%)UQLgJb&OS;eb(ygV$-oGd$Ui=@#;eRe9{tf2eV5)qT|GC8dw`Bgk%@@;u|6{+v z-#YW(RoecoS^a-%fNJwWiv9?S;;!GNTSH74)*CO4 z$a(87D|<`?4~4A~q`#^?sVL*|dJmaeOUMa=+wp)TRTtR{n)a}DqZGdmVV{3x{R1+a zvySvi)ke_WMb&F66dhY{ea!w_0yiRZebJ4q>m$gWu9y7(_#&8+v3d~z1PHz6i5XMm z@XG&oK1ngk?>6*3KK5z$F>vN(xI%n0^RoQRaa|NiI#Wnv4eLX*PJ_A>Y`?Kx<9!l` z3>bl_oJ%--{!ZG;5G`kvo(QpC)yXx+hnI?fh)3HV+E#spsJI<*|GMEdVVvH=h5mJp zV^Ixqn?No&(%oY{Pt_^atyrOICu{NAWB304+otq~-#X5zCu+6umlrS&=$l!vgs=_u zd);^Ey42r$A2i~(eR$bOImkxteq2`v&0VXO}wRgr~IEH^e;$%y>D>W_})C z_ME@xZAyVrYQ(-KJ;lsj%Lk1*MfsEMnem7Jbp4#tl%6!+Zs~eR{vtzaw^Oh`8irhK zbW35Ob_l*EReW2Xb4VWU0je|>)PLI?ylqc&lu3!lkN$0ptVmKk ze?rx$S19sXKWSK`dmkaBBBzz$dv)20s zU`0Vkyjpr&{fe2SUtg%jmpun~<)}s8UT|9-xp!23-{w)>W?^vp^5NpM$v?zz|HtLL z2W9rnzF;Bw>{$3b0k!ZVE>I3Z{DM?eq82XIWBTm+&y!>*`82)? zK@*qq;fDjayz$r+n!fykDi;JWyQK_Oa}90+oH#(M*H*^{xbIp0dtJg7^U)>w9_wAd6`xYmD*!Q!#RkHS5 zWi6m|e*oacuaKc~$6}VW&|#r_PUyyj*%%SI&LGDI7!AA=TltpP-dx9pZl}%iCf}go zo>aAUmb6W(lS2N#DtneKVL4%)4(s9j$tGc_Hji^Xd{92|^9;c)h~YW#q+dCm?|pvt z#U85T<&n6DkM(JDeGlu%bmZePZWQhLSsgwaAgPhi<>whiJJ2FtUU&?wqP|;I!*>A2 zX;wg~y0@Dq6QLN(Y(9u`OhUK5a`y`U>fPv}vinNa-If~mhiB4tN4@=8=drlF?w&o} zYU?CAZC6ySr^!wS+SSr08q#4>O<%3g)%PCVe!BaEYnxvLiBVYtWY z!`S*-q` zuS}vz57X(;hmfoN4H=6_YuXg)z(cE02J$0KUtImVhUAg?DNpj25CCozBc zQUV{~XUdN?uY4U&Dcx43QNV4!w{fT?2Mf26R8!yOj6&1WH=c-kw0iEY<`3)BAMf6l zx^>gr>ruCUOgM7u*mJlodmPv z7mmG5cTpChOD85v%R|DTFzBmBd%dUoR8ON4^m_DB#I`K>tGvkRou0Hc9NeAXBTShl zIrNgXuPi1|)8$OEk8oa<{TFs@GiGdvIc-;fyKifTz+{#O7_bzA4*>MQIso8W840%d z6btQb>Xxy9oOe|w*WJuVOc>9re@>oHPX>c1T4d3mIOA~hCn%eoca`(V>5^!R?E!?$ znu+mI8^{xMLIR<&XexG!3KS;ZPqrC_7K#L_BYiIOyp^hX{VOzwJk^GLuDkwxOMhD$ zRV1*^?N9?!_m4vZ4+6b@(x#m13{HdeZTCclG#6S#_(ekdo0bgi}3fE8Jph8_7ijQwU}=?XObD+*p98rd|J=)G0g4y6Yj4&LHE*NE1? zP?6Kl-+1nmZy~Ccn`jRJ^!})N%pd@8KWR$`dZt?Ev5KwI_05Y%Brb*C0&SMY`DYZ^ zaQhzt0B1Cs)uvOxRCMS^6@pHJn%VOtvy4%T$6Sb&8en+MGOJ{}?a4m?k{O4as^ZHQ zR0{`RISdfr0{r~-G)&F8>&=@tH6mNUog-V;HWN3fCR@36>NgN=^@Xrn7~oy;eN|Wd z@-97-|8Fi`0BzN25?!@hm%Lu!wEAO?cvSFRI|o0>ArEU=Hg78IKk-9z?h*tJzRAQ|?dIOAU`e2+ z&#KoM6LBLF_vPL-gO3mDn`T^8P2ip+(gz&FRo-8oT(yYwN@Ohn9%`0cHh4v%Uz=wV z?sQ>eU6em8qD5fduxr;ogDsGQfa#V02TNF}+1&^yq0I}OS!iC?g<0G$KW|#ia#7v! z;^KVC)Ou>hRo{0g7@vbG#9`{f(no#m$l(fCxo-0>((qM(t;#vWU8a6roW7eZ(A&Bi5(3ZI^v zE7sZ946#dj47|h_ShPLub=2=W6v?wH5q^#N`DbP#ZfP^$oSk$-&UeUHtW)^@7#K$q z^f{3hZYw39%oK7Ed~XjM$xX{tyopG%z8$qr&whb6J3G5NR(j{_%oPOt@fJ&MQId+2 z$;i|3Dvp*LEyMgo)Q^|hpyY2~kmM4?_}LQBw_;Gj+!jzHzUCL+OxsBDyBAU$(E{)u z9nz*JQ;u&(XbA1?wY=WS= zRAI`$qti&RRz}1OpLY}Ob<-DPSFyDCtwfGQ4Uk+KLS?Bw0mCT_0!%U(&-1mtTlsUd zDQte4jg-5me<<%PnEQ!gs-K+3CbWvvlT-wchv@5 zh*)EnEW2;UfNN5&r@3FDh6wdwvABA#|BJf!j%q4v!$$+CU_-GZ1V)(=kt!f1w6TE> zO+-K-1O$`)$wjzWYQtg=RCByaJ6y^6WDELZ(YEegmeeeq;GladvG_1w!p| zT_8J}KMRyo)_V?0@)nc1bF$U7-oc>=0}j69G>wo82O{l~teq6#=`7D49lCRJi}%Y! zdJ@Td_1nlUXv+xcas-MWH2!pjZJhR}b==V)Q5WxfXr9%&;x}!u@YQo|Cs6u_|Dh96 zZ*(_%zZ4o0cH!9KTShX01z$jcw)h=se_EbHV;&GI81L0F5_Rq0kEQ%|%m|q6x(!Vl z_*0V_euW4s?F72>ng|vQR}P~8;ZMW71Ne)!fhrlua+69X-`w55#t<5SWWNDp%*8{5 z9ZVO#t7_CO@SnpW>YE+xe>8)K{(o`u58mkSmxd_0{%P=>ehL>z+5#*b2qJ5qJ`p%1 z047CsL$DCYR2=UOPeTOj`cr@dDFJJA;4+W^B>ZGB*Y&GjGWbDBjyKf~pEmsOju?nA z*eXrsyYfl_FA8Zef&gD!HvmQgmjRCeF46d(m(*owXlUHz86hRhzfTAr>?!j&?Emy2 zF!)>k`SnZ$Y-8<#rv>BP;JJloXQ4c^`uAM@-+k}!)12?F@P}95@%Nhgdx|?f172oq zt`qvxdjEYJ2m2aK>6Djvo$j9=_3vT+(+!>6UB_p12dwrnV9)<{zlZKT6Z9r6vDYs_ z1YZmA7AhVHGWhLZtMtA^-TCebI%&PAvKNvT``?#G?2=TdT`CKv7u>-=Gup7$B6~U+ zTay0R&`9s8&Jykl=fC`%llS~Yp9^V?i`QG?nP&ZkQ+H*WfW2Bh$o3U5`Urd^t+ir- z<++w@h3bWCn;c^Dbmcejl+u6c*5I4^h|EZr!j7+0XVc8}GDTg?)WFvo;5^!_SjqxM z7scx2bLzWS#A5e0{FhfQDi56O_c-}wtR!=t8@+q1IQ!7!!1XtG=(S<%YxA9q%}FWB z;j%f(QIXDrmhs%mWev>k(I0EusJ8 zw!hcO>ZiXilw@BTb2AcIdtay|6%zUDYX!-=r1L)=AVx(g6=tw#7dj^;TTpB2=z)Nq zEBAeNp(hbM-Q{T%=4pn%F-0oX#vXTrPT~N<#+V{qOjPvG>U}gn)KSOjk zq=B_GHWCTE()hk8X!E4FgnWN~4yM#*bq!d+_4Xq)w{vqXS>hkOn*zPP>&rw{+Vz0x z<}O3DGl0y`5^rY1>5tJoWdkZJ!VBUo#p=>k{AGdacUeu;0u`?N87M}8EJ}V+P3yTW-mLvji{;1Wx7BeDGAXI{XR~Y`Nb4sT=~^i5S#Nm_p{ zQvh<%kY^=8fO8zB6Qp4)9&94^&!uNkdRrlh24L;!;o4Oo5Dk&^&#j_%6hU4*2r1X* zX}`~S fT&ygTLJ^|vTQ-2@$(=719_S2ZT#}MJ9!@y?n;)}YB&(DN6;^t$-V15k; zcl|weL1`e&Qi8+UZ*9c6LIdHshtEQIYyTgUX%6gKHqZoMAMgGZvFQUysj)cy=IFpc zp^H-?#M-@&PZw&d*z_;m*S>-RzDvFAUSjF3!)keahj2mJKOKyT5=RvV5{;->+q!V&z;bG`7GTmnGYOO-Bik^Pw`7VMQ zDa1>SWI=k5a^>Yf|B(^&=qMO&i|B_}(|T_!_pPapKqZ72SbTKt$pEZmI~_c1;FP>~%3G_-ZkHrD-;sEj2yK zM{KrzNqLlShgw8%jLK-uMg0ny+)nlI{8+_tqUbXM2HShFn~E~;mLtMyEz)yd7j7Lt zx?3B$K3d^TMza^k?yDUR4~-|~@G1HJm1|`64Jk9s>=_(EKcV(o)a{qbs_uzy`az6G z$91v_5ZSK}TslQA*z5*nDUY}mzOVM(ho~_6gpZYth+ect$xNNd2qnt9($q+Xp&{sQ zzY51DslJ)uoZyxkCcFEfHPf7Z74uox*r5{VvT59rDsutfDxw)r6CrNzE_JUl&l7nO_QTB#vKL>1UQSPccL&+?ApW zQbh(`F)FB>P!h!9++X?wG*D*u=jpfRoua$Zn{>I=OI-JURzPHhd6h>p>?vjpf=i+H z>lSzSpK!3fhm^Mc?OKQX3wWcv7;!U_HWHW{i&t=YMI;{BreE{I$DQP!e{xA* zCy!K(u6-otN54K6`x{r%p+T{StL=NUU{LS+i`Ee-;XR^>ZMF6grK5k%id6WJGWwpn z-7QlcJhmn!aFGxG37->i_C4lg2eb^W6wtYHU9IYJKrgk?Dp94KM&^UtP0X#vVB{E= zigYu8pD&VaotRxzFD=(W1}|HGrD1PA=X6Cq!nsV^FiBD`Ei_S7snV~{)8vfvMREMW?I_T>QkYRHMzoaO4|$iwkW<4A}3j9`~-07E>;wi_6m~$l8X^mOw;~ zQ=A(7Zd+~Gzh`mFIfK+U)?gZ;&`0?#Qe;&SmcoIqaoS>?WM3KTW{$rDaG ziZD5IAqzA%!E)IhHc7KJ%ZU307RX*zC8Kthvna@#=E}5Z{RscJYG`8T@97NqKr09=|Gn|J`IzaBIQ~X6eg1Cv48nVb^9 zW{#JlDm%tl|40Sz$OeO?He=tBIix z>!l7EGLZGO4s;^LPI%suTbB1^p{7E=t!Si9VcfNBb!6`C`#C2u+m^r+_I~gn>+%Z> z7ol*GKjUYfV@>=e@GuUhZ!h|P!cUmuO|8Rewh#ywHe8;Q?~ zGU?P?Op7BiSD69Fh>Ag2o!|0MUOl11ki5Re6_W~7$Q%uM;M&C!6R|5DNNa=wQD%Hn zdj0fMJJhK#bYxF;zuT9h08is¿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 Date: Wed, 22 Mar 2023 10:40:30 +0800 Subject: [PATCH 124/364] Add sequence diagram for Edit Income command --- .../EditIncomeCommand_sequence_diagram.puml | 57 ++++++++++++++++++ images/EditIncomeCommand_sequence_diagram.png | Bin 0 -> 30822 bytes src/main/java/chching/Ui.java | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/EditIncomeCommand_sequence_diagram.puml create mode 100644 images/EditIncomeCommand_sequence_diagram.png diff --git a/docs/diagrams/EditIncomeCommand_sequence_diagram.puml b/docs/diagrams/EditIncomeCommand_sequence_diagram.puml new file mode 100644 index 0000000000..aa6cafb5da --- /dev/null +++ b/docs/diagrams/EditIncomeCommand_sequence_diagram.puml @@ -0,0 +1,57 @@ +@startuml + +participant ":ChChing" as ChChing +participant "c:Parser" as Parser +participant "c:EditIncomeCommand" as EditIncomeCommand +participant "incomes:IncomeList" as IncomeList + +[-> ChChing : run() +activate ChChing + +ChChing -> Parser : parse(line, incomes, expenses, ui) +activate Parser + +create EditIncomeCommand +Parser -> EditIncomeCommand : EditIncomeCommand(args) +activate EditIncomeCommand + +EditIncomeCommand --> Parser +deactivate EditIncomeCommand + +Parser --> ChChing : command +deactivate Parser + +ChChing -> EditIncomeCommand : execute(incomes, expenses, ui, storage) +activate EditIncomeCommand + +opt hasDescription + EditIncomeCommand -> IncomeList : editIncome(index, "de", value) + activate IncomeList + + IncomeList --> EditIncomeCommand + deactivate IncomeList +end + +opt hasDate + EditIncomeCommand -> IncomeList : editIncome(index, "da", value) + activate IncomeList + + IncomeList --> EditIncomeCommand + deactivate IncomeList +end + +opt hasValue + EditIncomeCommand -> IncomeList : editIncome(index, "v", value) + activate IncomeList + + IncomeList --> EditIncomeCommand + deactivate IncomeList +end + +EditIncomeCommand --> ChChing +deactivate EditIncomeCommand + +[<--ChChing +deactivate ChChing + +@enduml \ No newline at end of file diff --git a/images/EditIncomeCommand_sequence_diagram.png b/images/EditIncomeCommand_sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8737664e53467286cd218b5227f857a62d7a0a93 GIT binary patch literal 30822 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 hl}ZBk*rc%nGP~qgimCvXv;uTD9{|^DJz0d#v literal 0 HcmV?d00001 diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 2d59185fdb..e31a439e11 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -31,7 +31,7 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); System.out.println(); - assert(incomes.size() > 0); + assert(incomes.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } From d0e49cd018a3b351b0eb3ffccf273041f633d194 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 10:51:31 +0800 Subject: [PATCH 125/364] Add activity diagram for Edit Income command --- .../EditIncomeCommand_activity_diagram.puml | 18 ++++++++++++++++++ images/EditIncomeCommand_activity_diagram.png | Bin 0 -> 18760 bytes 2 files changed, 18 insertions(+) create mode 100644 docs/diagrams/EditIncomeCommand_activity_diagram.puml create mode 100644 images/EditIncomeCommand_activity_diagram.png diff --git a/docs/diagrams/EditIncomeCommand_activity_diagram.puml b/docs/diagrams/EditIncomeCommand_activity_diagram.puml new file mode 100644 index 0000000000..ad257b9440 --- /dev/null +++ b/docs/diagrams/EditIncomeCommand_activity_diagram.puml @@ -0,0 +1,18 @@ +@startuml +start + +:User executes edit income command; + +:separate arguments to index and fields; + +if () then ([Missing/Incorrect Index]) + :Alert user of missing/incorrect index; +else if () then ([No fields to edit]) + :Alert user of nothing to edit; +else ([else]) + :identify income record to update; + :identify the fields to update & update accordingly; +endif + +stop +@enduml \ No newline at end of file diff --git a/images/EditIncomeCommand_activity_diagram.png b/images/EditIncomeCommand_activity_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..aa493abb51871320e7179ef93a0234e836e14f6b GIT binary patch literal 18760 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 literal 0 HcmV?d00001 From 4916ea7ff08c6bfe7aaabd39cecd4ac3b36915ab Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 11:31:36 +0800 Subject: [PATCH 126/364] Add sequence diagram for Edit Expense command --- docs/DeveloperGuide.md | 27 ++++++++ .../EditExpenseCommand_sequqnce_diagram.puml | 65 ++++++++++++++++++ .../EditExpenseCommand_sequqnce_diagram.png | Bin 0 -> 36302 bytes 3 files changed, 92 insertions(+) create mode 100644 docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml create mode 100644 images/EditExpenseCommand_sequqnce_diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 33d2906f9e..8aafe4c3b7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -30,6 +30,33 @@ Afterwards, the ```execute()``` method will print ```"Income deleted, here is th ### Delete Income command +### [Proposed] Edit Income/Expense Command +The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. + +Note that below highlights the implementation of the edit income command, whereby edit expense command follows a similar implementation. + +Given below is how the edit income mechanism behaves at each step: +1. The user launches the application. If there is a saved IncomeList of + +The following sequence diagram shows how the edit income command works: +
![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) + +The edit expense command works in a similar way, with its sequence diagram as shown: +
![edit expense sequence diagram](../images/EditExpenseCommand_sequqnce_diagram.png) + +The following activity diagram summarises what happens when a user executes edit income command: +
![edit income activity diagram](../images/EditIncomeCommand_activity_diagram.png) +
Note that edit expense command has a similar activity diagram. + +### Design Considerations +The following are the design alternatives we considered for edit income/expense command: + +* **Alternative 1 (current choice):** Edit only the specific fields indicated in the input arguments. + * Pros: Easier for the user to edit. + * Cons: May introduce more bugs. +* **Alternative 2:** Edit to require user to rewrite all its fields. + * Pros: Easier to implement. + * Cons: Not any easier than having the user to just delete and add new expense/income. ## Product scope ### Target user profile diff --git a/docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml b/docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml new file mode 100644 index 0000000000..637f6777f2 --- /dev/null +++ b/docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml @@ -0,0 +1,65 @@ +@startuml + +participant ":ChChing" as ChChing +participant "c:Parser" as Parser +participant "c:EditExpenseCommand" as EditExpenseCommand +participant "expenses:ExpenseList" as ExpenseList + +[-> ChChing : run() +activate ChChing + +ChChing -> Parser : parse(line, incomes, expenses, ui) +activate Parser + +create EditExpenseCommand +Parser -> EditExpenseCommand : EditExpenseCommand(args) +activate EditExpenseCommand + +EditExpenseCommand --> Parser +deactivate EditExpenseCommand + +Parser --> ChChing : command +deactivate Parser + +ChChing -> EditExpenseCommand : execute(incomes, expenses, ui, storage) +activate EditExpenseCommand + +opt hasCategory + EditExpenseCommand -> ExpenseList : editExpense(index, "c", value) + activate ExpenseList + + ExpenseList --> EditExpenseCommand + deactivate ExpenseList +end + +opt hasDescription + EditExpenseCommand -> ExpenseList : editExpense(index, "de", value) + activate ExpenseList + + ExpenseList --> EditExpenseCommand + deactivate ExpenseList +end + +opt hasDate + EditExpenseCommand -> ExpenseList : editExpense(index, "da", value) + activate ExpenseList + + ExpenseList --> EditExpenseCommand + deactivate ExpenseList +end + +opt hasValue + EditExpenseCommand -> ExpenseList : editExpense(index, "v", value) + activate ExpenseList + + ExpenseList --> EditExpenseCommand + deactivate ExpenseList +end + +EditExpenseCommand --> ChChing +deactivate EditExpenseCommand + +[<--ChChing +deactivate ChChing + +@enduml \ No newline at end of file diff --git a/images/EditExpenseCommand_sequqnce_diagram.png b/images/EditExpenseCommand_sequqnce_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..e439bac3da1708d349f2840bc1606e2dccab50ad GIT binary patch literal 36302 zcmdSBby!tf_cpu@6h%T2P*U+I(gwLHX%%S&X$9$0xEd4A9PzSsAD|9s~<*QIV2YtK2?9An($zVEr*r6fdgkCPrpp-{NDZVJhuP=^#y zsDlRB2jLT^=&i5t2c4PleKQT?$JPd#T4pFwO(RW{hi00O&Z%3U(=ju9Y>H-Per)j2 z$jsc(fJwvH(Bf+y72E=)d-uNC{^zIza38CXs=Hl!T{j5q)f)LuIK1XRo*jhq;*@|U zdq1YK)mv>o>s8#mbJi)_lVAHRA1S;#MW6QoGp@^Os`ZuAHjv9O?;2YJ`N)UY@2H6{ z`X3Q_nB|=#5O<-U6mP=vC5Q5pSm~+rU*@r|in#_(-S#7mrf$f;votn1TX@^xHJUqu zSRgnqV?B+PZ#6dsjm@v{!-t|;;{u)0hnA@i#6l|~bmgCIzH13Y9Tlh+_QANk>pVoi zR;=iP=SkH5^gO;>yO2r9#frg*&-dQ1vk0nCur+>hG#~hISh6*@pm$QPd&G7)^mFfX zT$^%=>h=h(yeE`8vX{dKboGUGAAB|!dXXi?jCW}5`9|+jLkV%?!<$0RT)s@*wJsjo zIU_0SX5E|mvf6mu#XegREk`=~`WU7F@nMkA}o6Te&nw+#d&Z~BK8gqN) zc>{s+$DvCnQY$`_-S69WMe}G)Z|WT=_&_Ie^JdAZhMbZg8f>FPZd7uluQagnV~lt= zdyhQ0L?3xPFq*}nM8U#oLTo$f$_EkQ+Yd4y$!=5`Y9&xJooc2KxGUkD+FoZ@F{Y$Ek=jPO>oRK=;o%~Y4C(i9mzas*IGlYZ*DSjVI)4@Q|svK+%YUV8VX zFu$|def66t1+lF(&S8$PoC{jhCH8y`+`KfS_4T2Fw$of{#?!bDvtiSr2;NuJQ|$cZ z+Dj~C8w!wQoP$4Zj0q4QhCi`Y@E(;LcJ*3s%mw=LZJ9MPNb+({u$Km^sHhn7-oqw- z%By=-_&{0k!D20S>+VD{w;qO-@uZ2ZSvS_P5~)wpIe@^$5Fi} z$yo`-@(0=R3KeDpwZmko7&wU0tUFf(?OdTsz=B-i!jAWdzb2LB@XLt6tbiy~KNi32 z^>jZjtHB$@W|KDjsAK;>yIfGaGeffwLrd&tL_Xc%JX7k(&2DKYAfO&C;%!uz@;OSF zepu@M{eXg!7A1v6t^y9T;&V>l!n4LtS$q^{?`e&>)pC?_rM$$RDly4gyZkg3iurM@ z*4iqySi!4;AbgUf!Srzwv5(JB>c!tDFL;v2iQ_O^9)I?1?&exYX;0>8bRvh!m#i?yS@UJ+1sy3tUnbv*EgI zb+gV4zCQb9r}+ZCrQp7z$DbJ)gV=q~@}PY^7&DKimn`8;OC4)Vt@ks_UumGdPZ2pO zzf7zZVKmn0{SjB8F)t?Gvb(_CEpcIGj;<-<<5bJ&*Qu^;;i)Rm?VH-eb#n7ViLXL? zW_m0wTP{@-g*k3jQEkm`PxY*y?`@E-T|s+}!!n+RpS|UZuc{$L1%?y_>fMjEnEl zy;oRYqS#)_m7&v-jpGgq<_ha{xvyq>)H1E8+dEVVz)E;KFrRAe)}d{|d#` zA)5Gexz`vsdXsbLEN82~k1(7$dv>)+G``g#y^&uwhIMPKPOkd-6Vpz~ld>h*w*6(t zlEg+D7oAZRcQ7wrh*aN-Wm0Q%N3-|YnJO!PrrI2PxK=8{S@7^9*8xx(;X``s<;F%s< zp`VRo>oZg&h6Swby3MYAf&o<&-I1r>t90ho_PqBD4{`3U%bK;##Juk=CvywV>^ICc zXJTTyzSKzZGuGdM858I7jt`yt7IS6uTbAy1LE??d@z}-eOR4U zNoRG+*wO!W^HTokh;jFd+^tWgDI@0@yK;!ql=E{$eYvW=0?*kb#OYiQFGzW^7ZY*! zrlO?gr;PDqUgufPxWO6+Zt!UrV6hu@2lTnLQ51E*+8OE<)^+^W7$#ii%?Vy&0yuELln#;+fdae6AZmo7WV&7`wvm4{PkyGvGPzNEmXEl2(L=xheu6&iTCmIJj%&N!AA zIBd!_#fd9sug%cBPg#0ke$?MHbZ3A%TvY=!@exLvZN}ZfXgU%|u|{8!6kBB2m8G^h z-s!kGG5hoo%}9gVDMG?Rc&w2AY&dt;_2&BO4@sJ4#_&@Q<>V}XZ;S2Ka5Vy6$lx+A(OW!=gxDJdsW6}Fi@?@I*2pL1Sn~pv;>an5ZlDj1)Qf)ZzNn-Yqk%=k#?ZSfN zrEOAw3w(9^!9$;@DCixHXD2_NX!y?1Ddw~nrd${S%R4Dz7Iiej;o)8vjkky>=uWa zn^xy))b51bzp0t4s+f)Z0yT#n#w4pMcv6RA4n-`wIS zrt@M{%!<0mZdtT}>-E?4#4oDco0g1!fM$#AE#BN1m27sn%yAa~2E%TVIi$YYQHn=% z=~B|>FrF$i_BlWs!_I&qRQulr(PoPEGx0w@K8)AP;mnDXqi0SpynaEHuGevUMbZ)d zq&rWv)qFS09(>ZQN3s)~xvll*uw{P#R;p@oqL_cGHz{ku@VmV3?zw6{3M1v6+VtOl z3A1~FvsSaZ$3Z8O!{T2mWgsRFDKw@--up-A5+jnr_#0dAFd&0_iA7Ness8`+@{dNu zcH@chZKB70G~1K=0vd>&1sd-tBC~RiNDRCWGkx;yi*s60hRtxDeA`i+pTjQr5~qp3 zvW7Dre%2qbgPF!&)D>r>&3Q8=e*dwpQTkuUT0*GmJh$A2g&z}USfU^r;M zGc|TBn=h5uS^(9--1H%)9Rmtc8>dF-P&Xd%_sFek5Qp&C=H%m)F+WT_h&oK%YDkoE z&S~L_`~lQKobjCF3It`=0ZAy-Q!I0(XAIc=-1YZRPG!yoDf2Z9FB;4RBFdDpP}mF! zU38B1&VV*i{S>u3e@5ac5WqjrnVrW$S}j*5`1y)5&EeyJ-eAU7@b?WK@uNon_k$Sr zRUinTaJ}&~|2T@^zEtkLt$-cWTgLS-^lRcs+?`|C)nD#%6qi&8ci{{&x)s7@?egiK z!kH97+=T$1zXoJtO3c8-G~E*KtFt`Sl^YW?6g-&Izurr5d4DzPuHig?_Kb*_SW8pW zJttj_jhI=rJ5{A{c6Jt*jP1qOPj6@%g4rdrM!$xN@pdDk@Xl`yE7#Q&K^4i$2TXi^(+->C;yEgypz`*<@iCm)|p#~i0qL(2d zApkQ=9k(xvy=z@(JI~v3?CC*MBGkDL5k^Vf;aIr_o!271wx=j*juJ|8pQNI491XSP zoh>``oP7iq?8N5CojW~h(qm!#M|Xwl8qX^tyiyKQ)g0WmP>@9dA2te2JHEH zr{r^E+(sVkRC47rLDneEy;@)u^{9&_~ovFZ}e>2qv?g@~wsG zRFIsPw5mNFk{=qfmCJcsPwytv<0}jtdaVgah!k_Pv&)-lJ$iJSh)AW#>dET-u%Gu( z5DqZ|hxz#FY}y-A>zHhP{f<;|F)>2=JAv0?lanXM+mgimnL^nNgU0+y&k@6v-dqw# zJ8o?hm`~`0?@eibeqPmnu?;S4O1+Hd@pWTkV|8J)CCJQzkVe8U7(zWr;8dt|N2*G= z-TWuh(XVa$6FPJhPpT+RtS8@eRL~92U1I7@RFAT4J0`l>C{?B9csSPbWanUan!EJg zo}%l|?09 zfezlwZ+cEwre!VkmNlOB-4hUSp2L3T=XZL};@rj3n3#W>XxZc4;@DJhJDEx0+f|R! zV|WOTn|5|~Vqsxrh_1)zuy=%IFC}CJ>vv>PFB=mxeeP_@Z*=))v58;JPaUdLvZ*}MmreMQAB!mIIzBs{d zh{+NUW_$bgZK9?9kAW&rcxrELCGOlQG8wL8mrwNe^o-{5%qgHZENYytIbKSSzJR{j z$^6g7i|)%Zgb41&E-C3zHjn(@3uw? zx>Z(IR#XTqrb^zvefx4Di%#Q>p+ijy3JSNlB2~;M+701}M`cDtI4v<_##6JTMGC0~ zkBe-iUj8~VG}M?{U@=8kT44gk18yZEER0LZ9e{}wPsZ$Q!a+F^3{UOM$7|yHfy&M{RwOOATfLiW=~Vh_L$GL_IlQE?$B;s@-^;yeGfyJ zEK*Fsb?y4~;l3r)DzCHG>s7YusstA+-c*?WT=}s&1*OukC!APPOl%zhAOqhSDdr8s zgL^n`&QK|1XAC6jHIQD9oH+Af8cSc*N~YU0tPc{K#}YhLLPEm9!NDKf2UP9ms%-i$ z3GLSv$9zMjSe~a;SdTAwxWLtMwElj6ejy?CrQ$F4t0EL4t!sG4X=!QYj0vOmiqO3> zs4-M^b#+nOaq;n`n@e3ISD#t0!KnJmEJg1gc!Tvt1x0z?xVLC!#VQDxp=^lA`)R7h zYs)jGk3OB6D>=tUwki!9))9)}EG{*+mX;RY*=sTO>r1Pvt8ooD^O>)ZnmNl3->;^W z_xPcVj0}=dyl)UXu+2xqZ*Cn?Am}gk@btWX?OH4QLGhK&T3-OGD`b!Oozm{!z58v$ zQgrt-C*$vh7wBNbHM6^S?W^eXlZI-^@jTpn<1+jXaYh6JmalFY42d2{22j1!sU5z( zm=je63Q`D^KC?3lxy#toeQK(z4#Z+F7y$YkeFF+Oii6!`$pZM_q+mC)8v$GW18?U1G^B)27@0Gr^CL|G8*h+)R=3mhPE_K)A^VY>M93u1^2_(X!la zDhc@xqU4f1p?87WLC30ZiL8%m3FdI>AU^S_c$LkX*RmSo#DjaSM?;}^KONfE)&|w3 zsj2CLh*v^l;wyb7)uKEAqu;-OhYd{-I?<69PesP6*IH<4ygH+)%PuJ?*_Ue^u7lH& zrbglo0rK$U^QO)wY5TbgrlpSlqpPdJ%{s z8Kc;+XG`-EVcgb09c-i?$HB?W$Vjk^tmBiNnSRnHrl!K9ezdYM18C6;%ziZMw#0p6r4bJ@ z+uB%#!An=33~jyt;X!$}en)$%O7OdP)dszJPc#B?#OD_lMjOH(aBk=f?lF)*RFYZc#PTU=FWGFVKN(4RR@`0q*w@#I*hl{>WvN$7tdDU zn4SIca)>gE1X?E^iS3|oKNv1+I|JQ*zok{@+m#CU&6UU2+na;=`GbU~PSHN=vrzIE z_LO@+vC>tcEaG}99LYzJLwvr&Lg)l6D%s4<%>hI@#tMWHoxChrT#kpj6s$i#|I^9H zMPG7G8Kvcs5bh6bh8U^W(MPaC0W;UJ4wJdfOCJFq*luMOD9Q!sv7+MJ)fZ}OZyr}N zp@`mvIaq}|Fo(*=Lf8<^-Dzx!^`q`B{kU8dBPr%{SCRF?__$uvyJU;E0Ri`+4zGXV z(P73Lt^$m+8ZD^&$yqPnLb`)xDIt0*$L@cn9E=A!WM3g6Rv_4L&Hu3G(MEB%U-Uqc zd$_k;wBCzXq%1l&XkAJDnbp{|PRf34m80Ob3y|Zmm<*VVq|yz~Hg~^WB1w$EB0+%6 z!$H+4LN3j!5UaYOkQg9FJtd|_03Dzo_dDqj);&v-PkT3^R%qc(`crMN%VFNX7UPy` z`3yEweF*1ufaR>LZFz4C;+E!R;%{bUw->%Xdc%!TqCD^DR8^#XbC__Kw4B21M|{bV zp$(^I3pc#8X{B2}V<$5Gzr!YX|pBKQU6QRthS^uvm~XjId!3BKj-qL`R=gh6&W z@?Fe->())lhhd}<10HFcm;m2!%* zq2qu)hM9IX*KVw$;#pR%l99XZT-7k&_UfCarZ3(#QZvVAigUI5%g&qOe*8!l7i)gM zWP>O_aw#U6sj%Q2j&pdw5o7P8KVnZOz}!ph&K+)t4Gz}2&!30&^x%Pr2eBlol{(1A zOT6XDDzOst8jvtC$ry`qBkZhwVeJPU4UvRn;wwFb1(E&CY)JuwUo3*;*w@ zWV8(1m0qa$RI{z-sAxIe9rUEgxh;}Snxfv)(i*OY?#VYlW_8@6=02%kWclNvqY`I)BYTMup{_-;A?|wYmME2d$Ut1T zl&y@MzlzFBta8c6xx~g91un-oE<3T$Wj5)x`knW>BoV@)QSAj7Ts+_k{}*b=-QkW~ z`H8X@`IrL&1FdKK`C;>nj*fP;wl*@3z7nN884COftT+`@X1#yvoe&&&Rpj5Sn4enJw^CNIGA#RYI~)0zQFQ+ zqPQsix?$=AWu4Gqqk>zh5j?a>pHrD?o%?D2qnhMp2EB*`P}^%eQ|#{U?#K8j-hg|h z-{sY-SBuj^4!$ei?7e5uW(mrUUqd)ytLJZTtq<1>($UlZ5FMXvPwCp)T;Ewy0Gm=7 z28|I1G%0R#L!ZkTiEULwVc8fN7aN;$KV4ucoYy|chlY+$Z??a@l{ggRc0DIMwAw;i zS{ka=SQK!1^GdqR#{B#TRL(Y~TFPsG4auKKEqwj@HG~YkBUW-TM^*z+W}k5>)Zb!( zMoGaXm$>x#Vm(?<$_j1sGfQWCy^rcMYuocgL&Y)F<#1t9_IR(0@(xf?qBcRi(&2q! zk*U@6@QB&0iM^uuv=nc<2T@XDPr62YqAb;$c-?HmAeHLSfOpSvFAN#KNqlIhGnn>% zc>TrvnQ@h;?{LX_BQA3re5-9wk@X_eldK!hNW#g8knAtK@IGxK)L5a1AIsr%Sug@q zZ4?5|H#(iX*r8f%6KFdjJCo)F9g>2gqTXa;Lc;xQy|*jl#~SExWW2Uk2ANwO@~=pL zJaZe5a-;r?daGgJrqu2ArQD-&FyqQIN8g#SB>GCYoLEpdR zsIr-%oGvs8iT_#Ku`{YRKbF~Z^yn^72xkQwmndYVd`<85Jl9paIW;rZ9d2v1Rqbv3 z)^9_pFmg_GcXRMQ{hT`QuY~1zba=P^Y$W(UJCCFIxxT(TTi-ulK3?u5l0H(N=Y7UGYAcSG#*zDwt2cU*(jyE&iX|1gr-%4|&AfCb{%Sk*h zLT2AO>`tS_vp(64NY@(_b8CxA!i6zIn{p{z>nG73`ah!!jwXHk$Nx)k-t@lz3A0 zAQs)V+|sum*qYhlpBl^d&K>gww323CSz zGK#DYmacgB>~##4x^xZVW3poDZ%H1&lADr$e1}g_#loEb^4u|Hi?^lSbSqq!`HuIC zBR$diN7CeX?%avt2zdKe_>+u%a3gHQm@|9&mG1D4ekJ}&_@XE+QB_rTO#ROZwQaej z&qsvc0i*zsq{X){N-e4(qLlbq5A}Uf%5HQXMAQI|bSFw53$8s$YlHC=@=A1%G-c)?~3YlYLV;Z1ouq39 zq9n|UqRqyfma)c^c3g$$_o0^jim5I$kjnFrsU zQ%{8j`scPvr;GRf`L^?Q02Tgc6ASp;eyMXb+-AHJ^fw*fjq4Kr%6BC>7 z0oM~FtTIY{zvq_V1NsW1LPm_`OfPgHz!LHkxDv#dhUF@&2d=wZL$i*x^=iOXjmz7gY`Xw& z6@!vOF$3z~3i&T?gvBRSIX?piPmSlW-qj~Uei${&`D?8ceCl$K0nY@4uqOxh16TZc z7ypNKiF*%63v54c@wsPFTP5e5PWHweKz?(VkV&a3iO@DX+DS8xeH zF(svLQy9o* zyuf_JwpYqEqR`|Brhl}re7v#{vz9hu)ouRAhG8%W;5RU6BmQa*w{Rbo->BRP>YeAa zzZ`O>PMu;>&U-L^=hm&0#z$p70NHa2z6^MfTi(!s$`oc~$Sid!^A~_1QSesBQ^d}0 zgC^Wgz#D+{`(T&t-PK2xJYz_h_h+c+<6o7g2c!=)47<6AkdX4P_SHmOgZFwI+TlO? zS1qVemziY-=Z8PnIzN4}!wmk~75h);bx4Ta+<>sGwv5bcD>abo3m_jv$&z8b3=QMc zdqBAYo&*9rF*(_*kM8Q#xs|!W*2~PyqWddecG$QXwGvYL=;Rh&ov-4jhK4@i1!Beg z<l--8r1p56k!b|6Hj!^F~k-PD-|0JKi zR*;a802v9m?*hvi)h6q|+3#N?R{4`)cSzbp^;si9tokpp4xQZLFRuXqILo=W0x2n; z_DOOn?}0(YN9B?Iz97Hst23;&THfRDhw!;yzIr9CtZYDeWEPdwd3iP(^}u;AU=On5 zP{KBjbfdg2A>rc-BzO*^^EoSTG?_PKLDVc`5mCzV4-A)kv5{6G#rz09r5&hv7qFe# zJ43+B(C-F276|5HvZvHouc2c26L?$y-}n>+A1S@}r!bp0n$s?3iXVBF^<)isAScCr*ZZd;>|T zrcZ;gF3z!?hjfR!aSjUiY`#;2^TDm2llvF&zs5RXcQBm)$m5f$Li?#_^gAQ&F13%; zdP=?Hzm#1Ld{(SKgyKKw`L7?fUmj3)B{^wzHZBA>Wypj_kWEI8IEhzIKwWJ>lwqd^ zz$t%!h*2L^%Z0^4d=`l(A&tqivT#~%PH|V!(eS!(1NR$5H=^n!HC*Y5T}A}SQF}Tl ztPJ$)RvfSb)T?+PW{jS~j&7U-6<=kOO$HcogZ^Q;S6>WEOeE1d72(F9BUWt8O0>h) z)^y`MjqZ)V|2aRXc~2!~2H$;{sX133r|I^>VcsbPZ(uh@hlYeiMSag)jf#sCF#}aV zXamm(#9mNtwcC^5zbEB1fjl!bmD^XM-@(+RTYor;!op>&by{y%6uxeBk#slhsaRR9 zfOk+Reuok*ou#vS8Sq8_`Gym8lJ&}lnyiV)+NL!oa^yyjsOaJ_%ocEYN^+GEd zb5@}q(BS6g*}9r~wYiOtU{bO&GL`F+ejCu`3&nSbQ2Jm%Xw6V#$r8QxxWDZCN4L_| zk>K&@ge=>HHkBJTjTc0HTHA}YFNNd%DdmsbXJlpJKkW8!M0){|!IS?GTBLjTh!9%1 zj!)E&L_=L&i0oYD_gz@<-ex*TRpaf_;iRS)FJ62gBV{wVybhAV9iAE=iouQ(`1qw@ z;ZYWSY57E>>sw;aJt!uXjD2|-7V?;*vG%IF9S($1l1|y_Gn;Lu7gSnMw`~wyZPr+Xmg@) zE^=j$-t2gJ$xG*uE5{CQ`MsxrqX91U>T-K=N*ffYMA`T{%Bi4FpFWW=tFoBa6|O-3 z%bpV`Oac+7?r2m>&+VLS{2)KSe|lfMPfayyd;fN<)yT*|-&ZKY?S6q-Vw?G!^tYU zF;}x;DkRz!C5$6Wb3+Hoj+{!C;>`UsYjV-M+*==PZ(>G8ztB)d^l(iN=%e_Q+_lMp z;o+s$3tHn~k}`)F64r(YUt64DR?fQ-T+4+vci37TtxvW2IR=u3L{t0oQ=RR+I;yH+ z8%~&y_-GeEEVecZC5+>{HUZ z>>a7P!t0N~5Q(gPd|q$-g+GbB3`a;f4crSSszfm%jy^i?e@=GFW*rcK#Ou`1X4>(S zG%1VbzBhPJz!SL%OxTZI@=G{=gLIP2xag|cn3R@yfj=ZXDQ$?zVRpVsc1qZX#7xSU zXU6b(R~|fi^iO7zv$Hdxrx!VFeziGE{F33k;%=m1{zQyC!EEVz`o1wSF|OB?Vao|g z$mCvYMsk*}DVksLO}l@%S1aNd*qw}m{*w(1jhHP;1mkvvw`!4>LReUs0&RBl&K(8@ z2EWb!;LmtO3tmHUBr$X%K%lv45Lc`u1n*O-#iPFj@9?4F;lM)jNZfn9L)~*+xo_<; z4d*)6>HEWYY~Q_m7i4?jpn|Y)6*Nwj9r5H*_9qWm;l+j2)v#N+OWJNEgxA*B`#CZ< z;(rOa`muW$J6xN8)Tb{$W%7DSY!lF{Ak8_h4*UD^uIT_?c$i`wajQ8+iQSa>Mn63m z{=TIT`Z{iCtUf)9;&aW7y2o2mE@p=r1SxV~4#y?tZE)WDbYHeTO|1`VorpJS4*+2r ziI6MFi?}Sea*TTPrm?V(pFWD9SSl*XZQ~6v2%({PJH?;JdA~7yqye#PmC1wa>ds|6 zASZzg0VjflM0J;IzwvLgmeeN>EB#QAf{Mhkw+@*r0cwC^d{A+HX$qkWOw%gt4xt{? zLmLY}Y3v4h+rfQ08GQYk-L@J%e2wGrWl3F^FHBB!DSIs4Hk_% z;Uq&7oX}^4IU(+@X@34IAW-u1_O6IT98+rmNqwh}L_IzsNyzXeGfX(AQS~Y zU=4yv;0^3}Mnw-OyA`DDU<|NxIYsYWmWQ`z69s3J=-grm_yQ>QT%=&;@)E(V?sC1LuaI5;>hEiH&UiHd4_ z5Xg5BMn_o3i`J(>8Mn{P@3`)zeU#unj1*;82JNd5p=sJW2N*xu)Ee5FpnnR?DF%WY zXb5N*#HXME3u-^<cD}r1e}hVJwTJu4=G+J2~&i33A*nsG9AZ_Krhym;QW`{x-~)b;YrxKH>DC|?DdogmC<5>4l=mS@j>iu`c7!u4!c!R;8JL37vl3GvH`SVZxg91T z*j)v8h80h>4QDp%>HJY0dOhyVpDj^pLNCKNhG?K$iK~Vc^xjl6o-rDj!P(lJabyn< z#(KhCy#(id+~BZPcaXhzEO9tKfF*5@1*8oo{<{P3O6wX=A08 zTsbe8n+{&s`Wep`i`ZtM1xkIKbr5@Jk6f>P@P<&~1K^#kPk>MGDbPaR2+m@r z#y0mjBa~nFZF_Oai1lH`VazI+yuQ$AiIe-L+rtCf-WcU;&HE7-oUi~q`RNq2WhSiJFF!>>{F9w_xHw-rOSA@yGKf_F=v;8;tvt? z`EAu!Lr0_tbpOMt32qp(Zz+n|QSmN#VOwMr6oz&)aAxO5*^M3%Xgg@YU-aRVI|Gmo zf|#MZ6nZR1-S>ZbVpFeQpr-ah7MoY%aJixiF-ta_JCpDR1x$EJYTN^&Zs-*#ON5E> zAZ@mGLTi4dXXZuQ7tQFU>OyxgQ&fu!O-BEtUGJsazcT3S*2ZK1 z(0qH|V~i!`(9?tFWMIb$m69#HM3eCVSn`i2W^ll1)3IrQ7AnLJP*p8z|8QLUS5Xl!Ue%X zYiN!u#$~R>7Q0c}yudIQ%~pV%C5k(@slLiJ0N|r8h04hriW9ThcQIKz9~G^-*$+yPVS z=!ijjpoiwAUU6T?$H%+7mFIe1(aOew$D_%ttODO**5w0Ppo~<Z=J3A8(V zGb&1bV`Xl@w(`1GeL`~b=}l^9ZZJvv>0Ukqx{YX*?M=zFaTi%iOcw+WK7eQqQ9 zTSbUuA-8msu}WypydP0@IvVrMew-5i1X0`#R#5;6FE{0AupRJrAL#7aN65y~5f&ma zO)Jblb6DS4=prj4l2Xl^;P7D>$P4bA)YMU+j&CnJZfmOwy0yb$$cLc!sXDA`cIuj2 z^lwY$zCse@xepl;6Z|jBk=%;{f)^Xrf9QZ877yuR{fQ)`eCFXn{Vh8xL`)9j(BBf@ z;MZ-yD#xsiBLy^7a3@>7!aC$E>hi$Q9w~RI4rr9~2$5RziBERJ$1!tTvYyi$sl`qc zJKx%U%rO{cAmeFV`>PselOrr5bm#vcd<+#jxOIRm<5xLm6h$fuWjt};%bjA2QjULj z0g5fkS9X64s8rd{C!y7Ms!6P3e}pXMa1#+5E7+>NqUkutl^}(aaa%o3`CdDr>G;LQ zU1g3dE7M2ZXZlfN1izVmeR2Q6Y;w*eKP$ZLHNXX^jSxjUL1Luvg^^x^Hvf?l#Uj<7 zb1UC}xVl9b=&g-3BCd&VLu0R6-bPMnOk zW8?y>-Z~igr&D~%B*8Tzy4B$kYHnaMPz(4-Nk&F}+MIYiN70Ae;WoFc<0c@55@)c( zv+d35Y)Wcs9K$IJ3Lf>!7ePU!JCv5~bbdT|x*@5(IWNdkVRXep4;SGJh)s6+0+P@y z-l#(f_iutFumBuL#F0wi~1S^j5{S zAm!bK&mGVGucmEd)jPEc{0xROHaKA(_Pb3?z59d9`L1Ubj!mD%se31;xy z3Q49^jUdk1)Kp@_!B^QyJ&U^YFQ=5*aq7)8>>bmxwiy`v_VKT^ zm(ZQy3k04(DM}bT z{86UBFhTW*_zJXi!ubo_+#3rGeC+1$hvFx8yZ6gz-Ay>Q07wzGkf&s6nDj{$_p^<*ynWadF_Bco?wm&?KdS`>MXn6$zL&prU|`+judBV2pM z8M?k-H9O*BiBK~rEoW!IQeN###k>_oz?Znv6cMwV&(7mG@8vV7hIgs4Eyf!8W6A(j zCaV@>@(%uaDRjIK-t1RP6yb4aIEMnlZZ*<(->ULGa&hPD;ngy~uDNg=Y30eUJaGDf zIN4?9qWN$AyT;$h*oHG>Z#<}QZ|_VKHOrB`@|KA>t$TYc&Cl0oDIxH}AqY zL&_xS99S+V4r3!{K3Ar(f0f_UWydyR21H$6EBZh~1t-jC5AEkas*9k1{1S8S|8eVn z?nnF|Ztca%7@YM0CK=&)Jw3l@pxOg&-Baq*k&;1RhtmQ$ATI5WFDZIYPw6Xl6c7+F zF_{OxPn;e#+j>j0a(^{A@P9pw{3mydPJSz~UxzbSpgCRyxeR*p>&Z9|JU3}csCOm_ z2jnad?>{{6I`)ImEtt9H1( z1ssEEB{r^(_RiU~DAp77+F1@1_g*q!Sz8?q_a$Rzx_D8z_dO&TuQV@Ip6A~eRX4$5 z8L*v;R+i&YpwHnQ%zO6t1>*^J!B=>Bd0APBo)DA??`_f&u7mq4epUq-9;X9`&=!*~ zIIvT1An6rZ!^)aB2gYOf08|D;Hu9-GSFjEedP z=QJW2{U4GxWww8EOMMgv9-rQ4OAr-)XQ%aF-se^1_CRu(^xy20-tqrE`2=Y4?~72V z-j6$|pZfrU@CTu>n|G;z(|scam)O{rDD+wM;Ke@NsBOxtC@1-U(ME7RbOdY$-;$kJ zEhg`ypMh%f#ZuhBV6w1Xr?uz+Dz9yyEJCuG5OIvqqHvkbRCdSMX+V(_3;CQc_B#Tg zpgp0BVnc|if6+iYP2qW*oi+&}+xEMy|C7rQ_&oGqNTj4_6TYigubQ0&*!D=VT)0|8 zws?;|(pk{g`{cro?=%yE5LT!aCz6baTJjOqtDXy^+2*4lF+(nUkz z?K5@t^#;(d$;dRrLB~XGXg)xN2g4@RX`qj0fFtr+U!BZsNO%<#bbIRGtWml(xManH z9oK%ux5j;i8nFSm?ll*{LWC&tUMImt-^6fpaRsxH@Wc@%Jels!zp7Eq0_TjtXqdGH zpmAty(3el5L0&+h0@{APiP{v@#$lv8!smbnea=&@@lpfNGP$9!H+0O3KRpfR-h^*F zLXyK79-FN6?TM)#MrLN;rS0X??H)TL;>x)*U5+asskT-d9A#XhPMOOP*iEG5`jB%9 z@PL6Wf)XeeaKsdY3sA57NexBy=8o0Ck0NoiC49>d12$r2TG~hv;I7+7ScIlZH-?#i z_5t0Q{}C*Ma(C~ZS!O2n`;L%K(i(t$F_{rZu*yFaw5$S`MI}cQXG$p*KVxwyk1Ofth>W2#st}z%XRmvx6*PglYmxe{)zx`-mCfp zR$fz|{h7B%`L-jg;Y~(Dp}>AyO{UlU2cH!AJ|m+!k4l61bh;!kNa>i6=Lrh{yS90f z$+);3w~FROI|0@Xz)B}H6`ioZ)=IYWrP|>HQz)y^^&E|nluY=A`qz;uBI?_ z4K&eW1C8rLI)E3e($adwagXZQVT*x>0}%7@`7#y|vB+4~muE<3a4ucEcy_(Cw^uv_ z$2q&*`esgabaY}moR;nc5Jsg}w6!(?B_;ZZ%7J|3n5ml0kBfR>e0$Tn+9-%Gy$))p z)lBhn!ugW%q#ipsK;BABWx=xLbD!L6PPFMhuz@e)2bRAAY=^hr^irSmV1>rL;FfB$Yn11{{ zf&}_nc;c|Ly}X#$N< zD^vsuSI$|nV7Ir+BZA6fik&khzph*!JCfiUv+oY3v>8_Y1f8xF24~YqO0rz z$?wL5`xDmHZn^yAoV^ZzxPSH53_6Y(8m>3 zWnR~B7n{6YC}`#ZyZV-GiegOzU<7S$7wP-Zu_5fQV@+7&v-&O zxFeDGbmZsq8gYk$C45zla7#J>m!gXArCeW$J<#s;#SdJ72r5~ltSH?=j*0T^5nx(b z1qDIsqTq*u5{-oXC}`I+`J-W=Gk~&iXXIEDc47JcvA&xBcB~Jh5y1-L_n&Y7fS_*i z1#9;>*yo{z2>b%)|G15Nx%25erIr(s20B~&(VI=t^b3rPQy?YBRD%Iq$WZT>-ws|2 zfgImUjysYL<3jKxp9ckGS8SD|dPtv%X+`|1baYV~N+ovr8y8FFDvb@+ z%$3&1;Pk5j@@y%y+%`%Q%w;@$8&lJI1_H4(Oz$JdpW74QPMl8X9L-dk{GyRRcX zTle)V)8)%Ad9t<;)kRuCf!6o7?TM^7yFn@5I+&FkKGoJpu(2vQJ$|+-8i31V=X4w! zWq!fVSQV1EE(DX?_}To=EYBU?@M}}ivUhe^p01sko6i0&UO!QqQzDI0QyTfi0)m)CO7?j{s_7c$p9KI)c-CN=coA#s z{GE~MH^bTwAo$9E5YQ8__Mt0l8c;$2>(c)qh(xAFxJ2 zGy;322)WsA zO+e=3nm zIzs7OnD><+NkJ%`DS}qRY;uJXwj!_n_56cy*2>DrnBQ8TF@_}sfe(?3&~SDX)Scx^ zmoCZ7%D7a)aW;569WB>A^_vb8OMf0$`uX^0#QcICM&srB)f~t~m)+n5^bJ?Cro^5i zc)sG)o`ri7@DURcnU6I-T~fP$KOrn_B^Az0)WcEHRnd4) zHv2WRCJStY;bxHx{vSD-l1%Uo4~Wd88FT1MW?gZwE_ye>sr?R$4mh4q~zu00cJRTW0<+K950*P+BkLL zKgpjz=o&12vwSc{C@L+d<@`fKQ&Up|CN5LZrL2M*|I6+$ll3FNcL{nLI~MXNyAI z^ZR^%&+~o$?Cw6d`+kpWysp>vdP5Vmib{FcP4XH-fMlI(U;-3UV(#By7ZbzCvrY-K zBBQaIEB*rdjk_DybsqvF3;aIeS?>B*$3Co~8r1_whw94Tz!T68egRLw7|*jM zWZb<=GllY}`U6vHtmuvUg&o|7TuG3hKO2?-$n^{zN7>btRS4jD_$rE{=P$9m*UP^MHB)B>6{)tjGyz%mA-x`>{ChhuZOew7*f>U%?V~t#bh| zC%|-+|N0v)mfEFiL3n=ZPlwj9L_j)z;W6#~@UPgl;On(Vf2J*p{0nGAs4~BcgS+3l zL#@K)q$vOm5-UK1zfmxgSWEZbi)lNNvg0;bhC&5=NZ!5$UVj!kWa6PhLpqu8;ll^_ ztmZV24X6U(zNQrMuxn~YtTABzcW4AvdixI|(VxK14-iA$@?b9kv+Q)nTK2%@V*4o5 z$DOf?H`X6u?B;By*F1DA@;IeqtDG>^UZ!3BXCAWetlZgwmJp0MrnzAlt+?|Jwe5y= zY$s6`vG1BKRcSS-(c-hqfr4}v3B{?IqhAWj5>uHUwUV?6IGx!xBN>O@FPkE&jGG#g zQM*CjVq+C>mhtuEZb_QTkm4*rE6Tq~SfKvC0*XZc?S*gq&0q7oNQs25f0^ts2GM!g zm3U$M1DL&>YH`!%muYBdbQQUh8@Hj@QGTKOP!XrkX-lD$88u`Ub9ElC+|Etg1BL5I zfp*~9e%=XWG4fU9XFYe-6%!ayL79MjM^ddrcWTo|DUeC`$w*32wQ1KF4*ZzeJ^kw5htkU&EAMiumUjuGv$ zU1x~;^G@5*=4oB#a_C2CN4_53VsHg)H1IK=z7p{bu#m&qV@Z@W;!GVs-W$sJPmeov zi&oLxU1UxAma{#F*)^V*x^hpVT%eK)^u`Q}dJS;R@E+!R0-P4JWl9H74%iWii%9@? zfLwT5Rh5BPA1wt)LKCn@8yXtw>c*hs5q#_TJmkU}DIg8X=wp-@k~aiIV<_1hUL)EU ze9ZS-_FX)}nv1+9O8Gj<;46fGIXX~^pnDCm7c=k=$(gc(K(7a)qaC)$61J;u>i1|| zWhiAaz!ATgKlLH$tj4<@U!VX1t4BsTxv)@QoTDD-I2VC_+tLa^#7MZ`Qyf(C00&YT zxXXimF-f||UltZPDAQq|MW_s8J(&W~>*xu)cI8W-USFR{eL|GA1{wjHYP~t4V5BdM zk@U#9%n=N@NrvxUYhX&SEc7$r!`?lXyD`3KRS=p9`Wr@W(w@`Sr0b_rABEz4fNH^y zUpRMw^w1^b>K8zIx(l74J?CW}C=5Oof_jfbVP7CHH<_fpKa{a}(YF=k9S9f1v>fsv zE(vKfQXhrHGDX&(S6^3`GyXCJTY#3eSofCUM)j^MiW5pMf}x&Sdev2>;g8Va`3tf^a?dwYtGC@Y2$CU{`RZ`CQPq1s2hq96 zvR=O~=R8cIdE|yvm4R-TCY?p@_xg*_t(ZHT_)%ItfT~;dEjATmx5kOuNCA-jjW3s_{G zCY78q=zVvXOA(87AlX`D%MjLT?vLxO|1bE&bFpqp)4{>kTf7q0a}gn59qnZ zpTD?lTA8e!CJUY;U_bcHWn+BG4DZ zqRf@5svh@>p=bDWb#JEz(-hf}naW=%m7({&0L)?<<`LJp6va9&Eh7Wq(AZZ6d`^-N zK|jZES^NRZ+ZRvFhBiABpb`xRM%1hCx@m}a;^M~RX3ImGC}kJVZ`+Q7Q@YPA=B#j0 z$7AuEo-u4Pd=tAmFL1sqp}MvK`fCNez?Th2UA~l zxFhPJxShqd)Y#;-4#kN5*kxstWK`JDbU&jZIJJE^5Ox5qJHTkup`tGX5)c_v*pe@C z$1c19_n~Jq?D1w7?^RoC$UkC@ook?{6*_PFfumb<^&}6^`;uD8K_7M>q62{!-O;8^oA< z>SCMZ+H-qEbD2L=#H|r{87u7SxbJt8I23Bk^7cCv z8OIVfL7f_=(Qk0NAi{69q_^|-cu5Q6O#ayM(`TBRnhJDhAR>xoW68FbUmbGUjIUtE ze!VhS?dR@_V9m9y03zTxr#t{^nx2oYY@^5KJNEMNfPhogXgI$`VoMm^MVugs!eq>H z>RcUkb{-vrP9BF3FXUW{9r$iP4hZpaSsPF`2c^OAv1BIktJaX+N05Mnbji=b6>x;Y z(q~XC2n$NT_;L(89f+IoyzksHm~P19rG)IbP(7h1TRZ$xu$pL{-@84q8QfB|CQ|}H zh0%)8zVnF7_{ObF=+-j<-5r3k^F7Ud$TJVjV}T!#q256{e~nH>9xQSG_FC5|(E9VB zCJ4*8blhq=`VO?FPHFb4e06*E=Pe7mDHmeo_qU5-zXk%L}wj>8{?hMRz z3C=1DX+<%cSQ9sl?Y#VoEz=Wn`nQn<0&%Z%-BF~Sqz5+-g(7QY224^fY^V^iMPrgCB^4rkeLpymP~pL%_Yup*=_ z>-Tw}tA?=iSEclkb)h+!SrYt?tO@NXAJVnBM!fs)aBY=vI(RNoV&T(`9V@SYVARS2 z1iuh{A>{qR#p~FcrFD6VIeT=Tdvj$`Y4iZqInX?;V8i_gj6vL8WX*|o_BRrfr7mE% zB)s-qf^uOaw(#`y(ga`8U<5+!&dbYdyk3kdat&sfyC<-?DgSk=cv*m2g|Z0aE!mK7qi+kbIWod z`kF#fv(Z$6E7cC@WZ|uTc~1c_S?!Ct_M`9ihElbC@}6R+dyGW{|2F5L>&3}m9<$41 zBq2_N9JEx;`dKU+#B}TrSFKA!vOmw>&0V07)-TkSW4(qR_ta+cqpGEu2bR-esF9lB<}EDH1mD!HKSx2@ z(8y>WM4Q})-#>x+7%YN~azCDGa7+B#@Uob^ym$(Hhm+IGtEXuO56W#E@Tt9Zb9L&> z<$liG{yhAy5B<3SRPEZhOFu!Yu`_yNbmJ3y0jG8xdO0i+|+jg)Z%({O`cE0 zCi7m1u>ItO_$hhC)#>te+sHifRwTEcT>5romddIj&K1G|6VH*Sdd5z-ij87pV#+|m zv@vhpGP3<(?quJr-rp@<44VZ|c<>IU&KDrbxN}3+c*Pg~niZcm&-fPr5<>b^DTh}4 z`}fB(dN{{hp3=%Ftgn$$fD zfT(K(n##$Q*AAPv6|LK;2eLX>+-}{cJA@?5Flf_*Bd}0xK>49^v%yYg9X&mn;MU){ zw-X$9fU?p%tfHAiLx=1nUg{seg42VmTWf>wN>mF$u@OYTDE3gq;;dr_@(U_VawQQD zqlWjF{r+GjRX>Cj18XiJ5iaTu04_+->u>fmVQ*iHcmHuE?Z|(90f}wFrM6Z-M;es4 zE@_=T`$9l`zpDePk^p@I2_{b}d)YSmr$o@{>_D}=Yt@jk-+Oq)lGFwua)T-NPe8gN zb`u<^)WLX2lM9j}HA$OL{TVQ*$b1M#Q*mf6ie18eujO&3=F!7mWscWa`Hr0>Ad?UQ z<65IgpS$|i<14AzE4Hseyw=AdxIGMWC2X)Wh|5=Go#Y`}!=JFsO7;=AJ~SeXDwfy4 z`E#_MxYt0HBmHytK!Wb#kS8`YAB5=gLAD?@7oxunHh{#5wQG)t_BUfl!;U=WLaUDj z=X)B&HZbox8D+|I9`^`$xcE#rN=!!CL#EF&0mRtT^YgvSWtR@VT{_%D)kTB3SN!vD zLv{|l=W1P0g*}IYWZw(u4utHSd*;di1Pe6A4bE;){jZ^m6c^~HB{vS@L2ko@*fLOD zL=K{yR2_h60bb@&$%*_fhc3Jy{u0&Ajlc1dbvd7)2*?|M=8>d9e#AS#Wpwbhd@?`E zcMQgG21A0`Ip5^K;)rxoEh2Qp#!L6)rC7Y?p;S2!WD;~RnA(vj_5x@^2R@*(281n7 zm6oDspj#b0I%hBswoqQ2Km&<)M1G~TjcVxFP&=F9HZQO0FxD1*Kr*0JF6H=@PqI}s z)LW2IMx8^;()050M5@6q2bn5in_SrKWwp!4F~hOh6>K9U%4Smg<_CqP{>zNHko2e7%t8p`vnUTJ?LRAEXW1 zsbxhyFA8+t=MIuc61pgP*tDo4JJGblP%aS`yAmhVC^c)0OcbFPLLaZ?&WQmo*`4~M87~QbevJcwTNQW$ z2E-ApXXfJyR1|Wfx0ybK_9wI0AlY~(PHxD0N5x=_4u-^OwgbPENALhSI^_X4B+UTy z*MzXR8N)mlJ1R8$8l>_GlrGLT&3MS!r1?ghfWUYP4FzCBSPF_zJrygt_ke19K=|Rg zrk+Po$dj}p51=!wAQpoN9zMnZT9DWopodS_KFK%wehyHa3F(dwClGC&(+YgNyrq+6 z^UoV0T1KSnL0MEpWcFFS0|k(_Hs9xa{llQC^IN4=SRVi!`dV6o7b~gBE|m}s$$0;G zF{;-IO$A3HZk8=hI3g1GRxe8LG&;TB^=A$KT zpD6`H;**&b`V61}&r-;(8%>i%nbkqwGt19)NYiXV+DeS;Umt@YxIe?FxDm~Yp5)MH zcOVP~DM2x>vE5Y_`$exjCTBNFj;i{Tx__b+msTK?Nd`{2`VPDY9jaw5Y~7X&;bOQ# zL~LvaV2ZH(G8!RC_Z>6p6^D}>z#3dSwT+PG9*AotKvbGm#xMt9G-MGPuCdmLPybsV-vDKOs=8fC^t8>%RMq|Am<%p2{IOS_I)0`i@{Uu zuBSaarjHWZcH%ew6WBZthfu*70u?R}(lbaR)5Ir>$FR_)ut3iCiwcST`~2+Z;-W>y%62X1kEvtj#a~*+4ncKATYc4@J#uv!q|p4aHSWhm zMWwM14#Nh>7Rt!XB&YSoi5VlDAE@Cl0sE7{HkK*U$KH+*84--FB3W4()=a+ZS!_H5 zJ$>!TwEQ_t34%W%!=(v^TGjTfqgppleMgTim@P50PMjhqfunorykH+RaBp)(O4wCxuaXx)N~0}FL;~Ni#zX( zUj0}Kd(VBnZO4GZ`9V_zMWZ8U*@nFtFs}3 zMribSqn$1JO2!2UAq+?$pJd9YVp+Jv<{G>{T^#vuz)`yFL>B#LwY)B zlrh5l;$DfYgVvJC@$dY665r$-k+Dg@2}Ak}qQ8Iwr;yd$_>na27p#ER`4j&Z!bD)G zAk+2)zO|UwNsY!D2y7nW%#b?&>N!lHP}CH60)VBP$jahy#KvQ?{iY71QpA2{X6q6v z%XPC1qoFnr5g(wgzP+4VSrHI_9lGxqN?@EW3JEFzS@-ygtLM9JvZnk6VGt&mf;1t? zUFd=>2boB#*fXcbH zVzI7LeeH^lH@LfH^WnX8bkFavmiKv%C;&F*fb2!j?^hwi5P~$L{|2%m!DA%8vjH6d z$5RM{z`yVSthZM@Q7MNFsO~~p0q}+eq*R1t)A@i+Y*bQP_kX!i)f9sIe*i2DBB+0h$hDS~ZNNNr{}tJbUYYpVvtqk+B%;${Kpa{+MZ zjPD4!yK$9nQCG@a2#^r8T}1(P3gW8V+*~NXZj?)*!N;S%)_LV^-VNlyx(B@0xLqG$ z=OaaC8$!ljxt-~!;HxrT5hY6e3zHni1UP9CcHvt+h;YFdtC?!sWX8q-rkQJ#>QQpa zt_U51y)ATE{0tZ_m8Bm&`x4Dq0FK29Q%d$ z!NbsgOzR_$m3qO-#l|QqWUs=Z4}%LqSg{F=(sk`8&rq_KPaMXKa~_jpkzCji5dWL# zed&N?{PEvq5i376uMUIGZU|zdV`30FS1}~VAqs}BPk&<-c731IF4md{&c%2OIoObp zBCR-0F!DMAND`H6#Y}}VKMZQA=deAX$=wOTHNBaRt}YC)P?5sZEWS2{f~?yiL-l*$ zBX+pbqQd0;yv*KHy2^CFjzZ@G)XpR4K!Ff_6TZCG=krtmFjmWk;_QH*#=adm`a3tT zLv1-lzwun-XHrns>fqLd-tflm!2}f1{2cir^IwC^Nt&f4e(O~*r-4%_k#U0|iXH?I zP{Ne!*EM7;y-U@r>EO6XWO7%)IXLnW1I}2rinp319)9FOrtJN~pfK|@VkY92fXFF- z<=htLj9_!MVK9X-HK=oeywoX72y`caOkT@z+V4f`$RF9s#&?K)zm|Gzh(Xvg=OHaP z;t~DoY=JA>CA#)n$Of!3rt+_cTFP8?04V;?0sh9NvE-2yD>1pig%jLWcPVty8>)?s z&=00EouW2vY;iZR7S1q)`lW);ffwez0+-%xO;>N+AGT??iD2smm8&1s=XQU3*LQ*z zj%WFPeKRxh#RVf*vQ=m9!jQ;{Bs8h{5RZ9P3OuM1Bx2f2J@5oBl&UVD-@?EQM0l#f z&W$&sYD3~`&P^;M&p{3&ag zx3)7ew#y>hvkk8FSJqH&SXA|od9&UyZ$SQJd8n_Drr(G`ju%G2;x2M~J92v>a{F1g z44HFoyk(6H0?O@Y44+x=gOh~{Q@VB>H&<&gPoMD^K+{qr%&O4_f;O0>3$pZE`{e1( zRl57f-hsxnds&!Vj%AC$sS1DIeQ$2@R!0=R?FhcXJ3RU8kFPU0c9Yg1jKk?(HsfZ4 z_q}uSn`+`z>gcv@$T?5Vkb_q3r#BPXp7R(#b!%(HiO85E2R4CzHlMj%Oy$us2PShl zKN9VJc010aT0&dlC?DhM0Ny)B-XBG)1D5`N=P)XR-3332ox-RV6Zp-;o?~*)G#^t| zp*JqRn%7ekkqd9Pd*EW>O`ngV{fSf}jy)3Bz6SO8M*x+}b%FwFL_-EA$)kkUjvb{s zxxV;&+3-UBJ_?^=y-+AxB^3oZ?UqqhoM59E=^>EDmKJ;c903%g*wz?4NV>37l-AIN zpl+s?HDV3tkR5yNd#-Tb7do4ged=rm$87GoSSCKpj(NjDoVwGVO+U{ut`DEk|Bwpc zQ9n3EhXOre3%J>Q`(D#2sMG6dYJTJQ6H^LSlt?*m^w#d1D~z+Gx?#s#=`qMhMLfQ1 ziS$a!njICRg;BX!6X2OTmXvKX*{sxRf4uidi`(&s`Z?!Y=qobAI8|R*S%0YQ2xi-E z@P0`fM0!Qs#_>d@L_c4rQ07=8yIQF{lalRb^TdwPjwX!Myv(J}T2JFVIDLqxiY5p0 zM`;%&y%V6ATGP@pQ|h7RQOxL*{bj za}Duk*JeK^yH83F7H3_$a5qpcmv`75OJu;Dcke!~&l!KFBlS_7O*UrK?A`^L=x85O zgVAH6%h19Q01a9^ps*xJO6)B)c(ovRBd{hiw>?z2!Xz^{yROnZ^~Z3s40JS|WH5f8 z1ZX+V(*&xViO+BQ_TL%FDVS>F2M*Df9ezIsN=q$6jP7_)Rd7sto^4hyDKpolZ!?RU z#xP=ex|+Om^;mtjvl0b!DP$bsRkO&n>p;*+`dofMYfbaV4=Ryh%Vw}@6zFAV>Siw` z=fcTKc}zOIMh2VtgYVwu>Gia`arvUzh1#g}f{!zZ%D@plXOFp4SguSW3AV=ZGloU! z%H-IaTnwe%7s-2>UVXl?V@U~XMEF7^Gw$J9>IZnav)HxwBy=Wxk!t7Mu(^kO(XPV* z>iW#JPfM(t`d}f0XqRr*RGXF{r<&)*`I)$2M)#V9sQj_~kXx|5nsXla7TKElevhmH z;q8+cy^sTGB3tLf#pZ$?jf=fz<%(zq9RPtg%yYiIJplx*@^V~M&fnM^dX|ULvd}Ji z#uf8ml5Uxjy@$oayd~d0vGzOvvOpip^0#G!9iXQq1BYblsV8?UE%&iFMDlbv@f^=S zUpQ#8gPUm65xccE0Ly=xQopSudP4R0XqwE@+h>AF3K6v`haA^^tUZ+Mn^zqfV^^_c z!E4mXI7)VzR(128pP1Ewwz?Pv2@Aw#1zl*VbuBw3AKUJDbf)uAq?W_c@A#8GC+3#> zVV_>I&++z%KEb{`5ovVqk`E?wrYg^2BE?#m^VX#%&sN4_q;YVY{Hfe3f0H0x9oGl9djie8#6<_?9}%VwiRnkQ|XsoQl! z-j)_v8|loKI#r6%!Z`%jI?oVbgAL_?UrZeI3vM3Jp?KnVcE}OiE0Rb@FO@*xcV+B`&%X+$3$r>dqUDY^#b@ zi+^NQ7r>(QYm$eChJ2@+6Un}IcZ7}1=b-5pHbGZSWTI*5wYPC6{O$_xurMeq1yNWk zDKAr}4iooG=JX?2j7D#J+3JVhx4;rl)&Qe3sYz!(KX9=+m^8Wc#S=3#iO07Zc2au7 zqYOOIgc;F_2{TXpnR@rTVC4=H@n!W%lTP-7XKmsv8gxl!*$)^y-N9kUdl z-sD0ZVhycR>pNEVJP{(iu3l1Wto5r?F)*di9Z|qx6(&mN#&nn(S!}CmxZDueKoM`w z*I8Y;<@!UT9I?|s23QI*fyB$-LCWwks_e^kpJ)52i-!;j_3 zlxPLH>bo&LNY}cx;d>=!dymYVG zy6GZfib`wmvTxSiv&}QFz!Y}6H9e}x0VN3n#DsllY$@3yw-w93KZ?p^&HR^qX@8m0v^vq9{1+g^dbjH~@35%< z3A?4~gvo`)IT8bMhM!dv4|FXNtnG;StuLZ`-s7QQ^RglCbHQZ;5CLo&929zyZFzLf ze4WO8>6(?;#<(=mLEtl?|o51U&POK z?eI%)gl5?(soDGCjQS1^UtBxLoiF;9doCZ7G(Mpv#I$PLtb$K-bMuzUKI_)-qqt=D z+A5oerythoc#&9JTZUgEAIe+G_RV`wdCDj-7cYW88&iHmNq^GV^I>0mY#Cpq?LdNj z{(_*}bx3@$xgb-Rw);h+WM59`mu-Rr^+4c6dZk#8}U*G_H8`s`$n# z7p>9m_{H52S2{2`RR`>US-s4b#lqvV8fQM!Ftl6s?hhW_bM?D;$D-yj@32ozKv6i= z?Xwe8@4_1l;DkRT<=ozv$(BU5D6iUY$Z-CpEl0I!_w(RSh2uJUM7KrH*{CxX9m9vfG#kayrG=N{+i@*2?_{k=S^5sHA|Vsh!XI7v^I*a5685oQaX- zPFpA;vAW;D*ElMThoWMZ^&iILIi^Vb#yE=oAIZbry*!CtUrr&v{`|eitBcvwdI8|L zgemmXoMg)!?RmV@wT6Ix&}Z_S=^TmVl!`e~cXP`gC}f->IUTxZPC>GXTBvET__T>_ z*3WSa*MkED_Mc05D2U!>?%80Dp&NeJhoopIbR9yWK)nGO3^)|m6!JHe|5wWLjd0rL Vy2(iyIHwh*a!OqRD}O%V{{S_T0K)(P literal 0 HcmV?d00001 From ed8bfac775dc81b262d3875314142c58ca883719 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 11:46:37 +0800 Subject: [PATCH 127/364] Update developer guide with proposed implementation of edit income/expense command --- docs/DeveloperGuide.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8aafe4c3b7..c45a6fe7ba 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -14,7 +14,7 @@ The main class in our program is the ```Record``` and ```RecordList``` abstract classes, in which ```Income```, ```Expense``` will inherit from ```Record``` and ```IncomeList``` and ```ExpenseList``` will inherit from ```RecordList```. Most commands will act on instances of the ```Income```, ```Expense```,```IncomeList``` and ```ExpenseList``` classes. -![Record Class](/images/Record_RecordList_UML_class.png) +![Record Class](../images/Record_RecordList_UML_class.png) ### DeleteIncomeCommand @@ -26,7 +26,7 @@ Entering any of these optional lines will result in early termination of the com Or else, the command will continue to delete the entry at the particular index. Afterwards, the ```execute()``` method will print ```"Income deleted, here is the updated list:"``` and prints the entries in the income list. -![Record Class](/images/DeleteIncomeCommand_sequence_diagram.png) +![Record Class](../images/DeleteIncomeCommand_sequence_diagram.png) ### Delete Income command @@ -35,8 +35,10 @@ The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand` Note that below highlights the implementation of the edit income command, whereby edit expense command follows a similar implementation. -Given below is how the edit income mechanism behaves at each step: -1. The user launches the application. If there is a saved IncomeList of +Given below is how the edit income mechanism works at each step: +1. The user types in the command for edit income with the necessary arguments given to indicate which income to edit and what fields to edit for said income record. +2. The line inputted by the user will then be parsed by `Parser`, where it will check if the input contains a valid index with valid fields to edit. If they are valid, it will return `EditIncomeCommand`. Else it will throw a `ChChingException` indicating an error in the input from the user. +3. `EditIncomeCommand` will then perform its `execute` method, where for each field to be edited, it will call `editIncome` method from the `ExpenseList` class. This would then update the required income record accordingly. The following sequence diagram shows how the edit income command works:
![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) @@ -52,7 +54,7 @@ The following activity diagram summarises what happens when a user executes edit The following are the design alternatives we considered for edit income/expense command: * **Alternative 1 (current choice):** Edit only the specific fields indicated in the input arguments. - * Pros: Easier for the user to edit. + * Pros: Easier for the user to input an edit. * Cons: May introduce more bugs. * **Alternative 2:** Edit to require user to rewrite all its fields. * Pros: Easier to implement. From ba63fe28f12a8ee1f5ade136a1d02b982b1a7af5 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 11:58:10 +0800 Subject: [PATCH 128/364] update developer guide formatting --- docs/DeveloperGuide.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c45a6fe7ba..465d11f145 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -30,28 +30,28 @@ Afterwards, the ```execute()``` method will print ```"Income deleted, here is th ### Delete Income command -### [Proposed] Edit Income/Expense Command +### [Proposed] EditIncomeCommand/EditExpenseCommand The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. -Note that below highlights the implementation of the edit income command, whereby edit expense command follows a similar implementation. +Note that below highlights the implementation of the edit income command, with edit expense command following the same implementation. Given below is how the edit income mechanism works at each step: -1. The user types in the command for edit income with the necessary arguments given to indicate which income to edit and what fields to edit for said income record. +1. The user types in the command for edit income with the necessary arguments given to indicate which income record to edit and what fields to edit for the chosen income record. 2. The line inputted by the user will then be parsed by `Parser`, where it will check if the input contains a valid index with valid fields to edit. If they are valid, it will return `EditIncomeCommand`. Else it will throw a `ChChingException` indicating an error in the input from the user. 3. `EditIncomeCommand` will then perform its `execute` method, where for each field to be edited, it will call `editIncome` method from the `ExpenseList` class. This would then update the required income record accordingly. The following sequence diagram shows how the edit income command works: -
![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) +
![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) The edit expense command works in a similar way, with its sequence diagram as shown: -
![edit expense sequence diagram](../images/EditExpenseCommand_sequqnce_diagram.png) +
![edit expense sequence diagram](../images/EditExpenseCommand_sequqnce_diagram.png) The following activity diagram summarises what happens when a user executes edit income command: -
![edit income activity diagram](../images/EditIncomeCommand_activity_diagram.png) -
Note that edit expense command has a similar activity diagram. +
![edit income activity diagram](../images/EditIncomeCommand_activity_diagram.png) +
Note that edit expense command produces the same activity diagram. -### Design Considerations -The following are the design alternatives we considered for edit income/expense command: +**Design Considerations** +
The following are the design alternatives we considered for edit income/expense command: * **Alternative 1 (current choice):** Edit only the specific fields indicated in the input arguments. * Pros: Easier for the user to input an edit. From 2627e0a73d31f14e39a3e1e74bcad374a108d685 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 12:05:45 +0800 Subject: [PATCH 129/364] Fixed typo with file name --- docs/DeveloperGuide.md | 2 +- ...uml => EditExpenseCommand_sequence_diagram.puml} | 0 ....png => EditExpenseCommand_sequence_diagram.png} | Bin 3 files changed, 1 insertion(+), 1 deletion(-) rename docs/diagrams/{EditExpenseCommand_sequqnce_diagram.puml => EditExpenseCommand_sequence_diagram.puml} (100%) rename images/{EditExpenseCommand_sequqnce_diagram.png => EditExpenseCommand_sequence_diagram.png} (100%) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 465d11f145..b464f78f4b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -44,7 +44,7 @@ The following sequence diagram shows how the edit income command works:
![edit income sequence diagram](../images/EditIncomeCommand_sequence_diagram.png) The edit expense command works in a similar way, with its sequence diagram as shown: -
![edit expense sequence diagram](../images/EditExpenseCommand_sequqnce_diagram.png) +
![edit expense sequence diagram](../images/EditExpenseCommand_sequence_diagram.png) The following activity diagram summarises what happens when a user executes edit income command:
![edit income activity diagram](../images/EditIncomeCommand_activity_diagram.png) diff --git a/docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml b/docs/diagrams/EditExpenseCommand_sequence_diagram.puml similarity index 100% rename from docs/diagrams/EditExpenseCommand_sequqnce_diagram.puml rename to docs/diagrams/EditExpenseCommand_sequence_diagram.puml diff --git a/images/EditExpenseCommand_sequqnce_diagram.png b/images/EditExpenseCommand_sequence_diagram.png similarity index 100% rename from images/EditExpenseCommand_sequqnce_diagram.png rename to images/EditExpenseCommand_sequence_diagram.png From baad075297c0534c8bcb6af56ce00a25c31f2507 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 16:24:04 +0800 Subject: [PATCH 130/364] Change record, income and expense class to use dateTime type for date and print format for date --- src/main/java/chching/record/Expense.java | 6 ++++-- src/main/java/chching/record/Income.java | 6 ++++-- src/main/java/chching/record/Record.java | 19 ++++++++++++------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 86c2e1f30e..2723e6757f 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -1,9 +1,11 @@ package chching.record; +import java.time.LocalDate; + public class Expense extends Record { private final String category; - public Expense(String category, String description, String date, double value) { + public Expense(String category, String description, LocalDate date, double value) { super(description, date, value); this.category = category; } @@ -17,7 +19,7 @@ public String getCategory() { public String toString() { return "Category - " + getCategory() + " | Description - " + getDescription() + - " | Date - " + getDate() + + " | Date - " + getDateString() + " | Value - " + String.format("%.02f", getValue()); } diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 29a8bddae8..5fbac586af 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,14 +1,16 @@ package chching.record; +import java.time.LocalDate; + public class Income extends Record{ - public Income(String description, String date, double value) { + public Income(String description, LocalDate date, double value) { super(description, date, value); } @Override public String toString() { return "Description - " + getDescription() + - " | Date - " + getDate() + + " | Date - " + getDateString() + " | Value - " + String.format("%.02f", getValue()); } } diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 20d81caea3..b2d28ea084 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -1,15 +1,15 @@ package chching.record; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + // Abstract class that will not be initialized as an object public abstract class Record { protected String description; - protected String date; + protected LocalDate date; protected double value; - public Record(){ - } - - public Record(String description, String date, double value) { + public Record(String description, LocalDate date, double value) { this.description = description; this.date = date; this.value = value; @@ -24,10 +24,15 @@ public String getDescription() { return description; } - public String getDate() { + public LocalDate getDate() { return date; } + public String getDateString() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM uuuu"); + return date.format(formatter); + } + public double getValue() { return value; } @@ -36,7 +41,7 @@ public void setDescription(String description) { this.description = description; } - public void setDate(String date) { + public void setDate(LocalDate date) { this.date = date; } From 6af0ad3bd2ea8ccd83a4829c48793ddd121131fb Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 16:55:11 +0800 Subject: [PATCH 131/364] Change parser to take in specific format for date with exception handling. Modified storage to parse date accordingly. --- data/chching.txt | 4 ++++ src/main/java/chching/Storage.java | 10 +++++----- src/main/java/chching/parser/Expenses.java | 9 +++++++-- src/main/java/chching/parser/Incomes.java | 9 +++++++-- src/main/java/chching/record/Record.java | 2 +- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index e69de29bb2..40687aad46 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -0,0 +1,4 @@ +I | tuition | 2023-12-12 | 500.00 +I | test | 2022-11-11 | 300.00 +E | expense | transport | 2023-12-12 | 500.00 +E | tuition | test | 2023-12-24 | 350.50 diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index e690d0e42e..f29488d7b7 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -9,6 +9,7 @@ import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Scanner; @@ -38,11 +39,11 @@ public ArrayList loadIncomes() { String line = reader.nextLine(); String[] extract = line.split("\\|"); String symbol = extract[0].trim(); - String description = extract[1].trim(); - String date = extract[2].trim(); - String value = extract[3].trim(); if (symbol.equals("I")) { + String description = extract[1].trim(); + LocalDate date = LocalDate.parse(extract[2].trim()); + String value = extract[3].trim(); Income income = new Income(description, date, Double.parseDouble(value)); incomes.add(income); } @@ -69,9 +70,8 @@ public ArrayList loadExpenses() { if (symbol.equals("E")) { String category = extract[1].trim(); String description = extract[2].trim(); - String date = extract[3].trim(); + LocalDate date = LocalDate.parse(extract[3].trim()); String value = extract[4].trim(); - Expense expense = new Expense(category, description, date, Double.parseDouble(value)); expenses.add(expense); } diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 465359f04c..f9c840beee 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -3,6 +3,8 @@ import chching.ChChingException; import chching.record.Expense; +import java.time.LocalDate; +import java.time.format.DateTimeParseException; import java.util.HashMap; public class Expenses { @@ -11,11 +13,14 @@ public static Expense parseExpense(HashMap argumentsByField) thr try { String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); - String expenseDate = argumentsByField.get("da"); + LocalDate expenseDate = LocalDate.parse(argumentsByField.get("da")); float expenseValue = Float.parseFloat(argumentsByField.get("v")); assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); - } catch (Exception e) { + } catch (DateTimeParseException e) { + throw new ChChingException("Date format should be: yyyy-mm-dd"); + } + catch (Exception e) { throw new ChChingException("Trouble adding expense value"); } return exp; diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index d802cdfb18..e7b53e0d28 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -3,6 +3,8 @@ import chching.ChChingException; import chching.record.Income; +import java.time.LocalDate; +import java.time.format.DateTimeParseException; import java.util.HashMap; public class Incomes { @@ -10,12 +12,15 @@ public static Income parseIncome(HashMap argumentsByField) throw Income inc = null; try { String incomeDescription = argumentsByField.get("de"); - String incomeDate = argumentsByField.get("da"); + LocalDate incomeDate = LocalDate.parse(argumentsByField.get("da")); float incomeValue = Float.parseFloat(argumentsByField.get("v")); inc = new Income(incomeDescription, incomeDate, incomeValue); assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); - } catch (Exception e) { + } catch (DateTimeParseException e) { + throw new ChChingException("Date format should be: dd MM uuuu"); + } + catch (Exception e) { throw new ChChingException("Trouble adding income value"); } return inc; diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index b2d28ea084..5b6680aaa0 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -29,7 +29,7 @@ public LocalDate getDate() { } public String getDateString() { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM uuuu"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-uuuu"); return date.format(formatter); } From 6691778478144eb6426b880f0fdd71223117182c Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 17:07:31 +0800 Subject: [PATCH 132/364] added changes to format for add expense and income to user guide --- docs/UserGuide.md | 4 ++-- src/main/java/chching/parser/Incomes.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 828e470ddf..400fc807a7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -37,8 +37,8 @@ Use case: * VALUE will be stored as a positive float. Example of usage: -
`add expense /c meal /de breakfast @Technoedge /da 01/02/23 /v 3.50` -
`add income /c salary /de salary /da 01/01/23 /v 500` +
`add expense /c meal /de breakfast @Technoedge /da 2023-03-22 /v 3.50` +
`add income /c salary /de salary /da 2023-03-22 /v 500` ### Listing all expenses and incomes: `list` Shows a full list of both the expenses and incomes created by the user. Includes the index number, category, description, and value. diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index e7b53e0d28..747c86d241 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -18,7 +18,7 @@ public static Income parseIncome(HashMap argumentsByField) throw assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); } catch (DateTimeParseException e) { - throw new ChChingException("Date format should be: dd MM uuuu"); + throw new ChChingException("Date format should be: yyyy-mm-dd"); } catch (Exception e) { throw new ChChingException("Trouble adding income value"); From ca94a7740f51fe70e0ef0c5fdeedb4f0accebbe6 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Wed, 22 Mar 2023 17:50:27 +0800 Subject: [PATCH 133/364] add currency conversion --- build.gradle | 1 + src/main/java/chching/ChChing.java | 9 ++++- src/main/java/chching/Ui.java | 27 +++++++------ .../chching/command/AddExpenseCommand.java | 6 ++- .../chching/command/AddIncomeCommand.java | 8 +++- .../java/chching/command/BalanceCommand.java | 17 +++++--- src/main/java/chching/command/Command.java | 6 ++- .../chching/command/DeleteExpenseCommand.java | 11 ++++-- .../chching/command/DeleteIncomeCommand.java | 13 ++++--- .../java/chching/command/ExitCommand.java | 7 +++- .../java/chching/command/HelpCommand.java | 6 ++- .../java/chching/command/InvalidCommand.java | 6 ++- .../java/chching/command/ListCommand.java | 8 +++- .../chching/command/ListExpenseCommand.java | 8 +++- .../chching/command/ListIncomeCommand.java | 8 +++- .../chching/command/SetCurrencyCommand.java | 28 +++++++++++++ .../chching/command/UnsetCurrencyCommand.java | 28 +++++++++++++ src/main/java/chching/currency/Converter.java | 33 ++++++++++++++++ src/main/java/chching/currency/Selector.java | 39 +++++++++++++++++++ src/main/java/chching/parser/Currency.java | 17 ++++++++ src/main/java/chching/parser/Parser.java | 31 +++++++++------ src/main/java/chching/record/ExpenseList.java | 16 +++++--- src/main/java/chching/record/IncomeList.java | 17 +++++--- .../chching/command/BalanceCommandTest.java | 9 ++++- .../command/DeleteExpenseCommandTest.java | 25 +++++++----- .../command/DeleteIncomeCommandTest.java | 19 +++++---- 26 files changed, 323 insertions(+), 80 deletions(-) create mode 100644 src/main/java/chching/command/SetCurrencyCommand.java create mode 100644 src/main/java/chching/command/UnsetCurrencyCommand.java create mode 100644 src/main/java/chching/currency/Converter.java create mode 100644 src/main/java/chching/currency/Selector.java create mode 100644 src/main/java/chching/parser/Currency.java diff --git a/build.gradle b/build.gradle index c829005061..c59c8f5308 100644 --- a/build.gradle +++ b/build.gradle @@ -44,4 +44,5 @@ checkstyle { run{ standardInput = System.in + enableAssertions = true } diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 7e7929524d..cd9352cf0e 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -2,6 +2,8 @@ import chching.parser.Parser; import chching.command.Command; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; @@ -9,6 +11,8 @@ public class ChChing { private Storage storage; private IncomeList incomes; private ExpenseList expenses; + private Selector selector; + private Converter converter; private Ui ui; public ChChing(String filePath) { @@ -18,6 +22,8 @@ public ChChing(String filePath) { try { this.incomes = new IncomeList(storage.loadIncomes()); this.expenses = new ExpenseList(storage.loadExpenses()); + this.selector = new Selector(); + this.converter = new Converter(); } catch (Exception e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); @@ -33,7 +39,7 @@ public void run() { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand, incomes, expenses, ui); - c.execute(incomes, expenses, ui, storage); + c.execute(incomes, expenses, ui, storage, selector, converter); isExit = c.isExit(); } catch (ChChingException e) { ui.showError(e.getMessage()); @@ -44,6 +50,7 @@ public void run() { } public static void main(String[] args) { + // assert false : "Assertions should be enabled"; new ChChing("data/chching.txt").run(); } } diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 2d59185fdb..38853260e1 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -1,5 +1,7 @@ package chching; +import chching.currency.Selector; +import chching.currency.Converter; import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Record; @@ -31,7 +33,7 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); System.out.println(); - assert(incomes.size() > 0); + assert (incomes.size() > 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } @@ -40,31 +42,30 @@ public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) System.out.println(" Noted. I've removed this record:"); System.out.println(" " + record); System.out.println(); - assert(expenses.size() >= 0); + assert (expenses.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } - public void showAllRecords(IncomeList incomes, ExpenseList expenses) { + public void showAllRecords(IncomeList incomes, ExpenseList expenses, Selector selector, Converter converter) { System.out.println(" Here are the incomes in your list:"); - incomes.printIncomeList(); - + incomes.printIncomeList(selector, converter); + System.out.println(); - + System.out.println(" Here are the expense in your list:"); - expenses.printExpenseList(); + expenses.printExpenseList(selector, converter); } - public void showBalance(double totalExpense, double totalIncome, double balance) { - assert(totalExpense >= 0); + public void showBalance(double totalExpense, double totalIncome, double balance, String convertedBalance) { + assert (totalExpense >= 0); System.out.println(" Total Expense: " + String.format("%.02f", totalExpense)); System.out.println(" Total Income: " + String.format("%.02f", totalIncome)); System.out.println(); System.out.println(" Current balance:"); - System.out.println(" SGD " + String.format("%.02f", balance)); + System.out.println(" SGD " + String.format("%.02f", balance) + convertedBalance); } - public static void showHelp() { System.out.println(" ADD RECORDS:"); System.out.println(" add expense /c /de /da /v "); @@ -80,6 +81,10 @@ public static void showHelp() { System.out.println(" SHOW BALANCE:"); System.out.println(" balance"); System.out.println(); + System.out.println(" CONVERT CURRENCY:"); + System.out.println(" convert /cr "); + System.out.println(" Currencies available: HKD, PHP, IDR, MYR, VND"); + System.out.println(); System.out.println(" SHOW HELP:"); System.out.println(" help"); System.out.println(); diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index c82e19014e..7afb3a1ab9 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -3,6 +3,8 @@ import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Expense; @@ -24,8 +26,10 @@ public AddExpenseCommand(Expense expense) throws ChChingException { } this.expense = expense; } + @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { assert expense.getValue() > 0 : "Expense value should be greater than 0"; expenses.addExpense(expense); ui.showAdded(incomes, expenses, expense); diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 2d003ec6fb..96b53de430 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -3,6 +3,8 @@ import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Income; @@ -17,13 +19,15 @@ public AddIncomeCommand(Income income) throws ChChingException { throw new ChChingException("Missing description field"); } else if (income.getDate() == null) { throw new ChChingException("Missing date field"); - } else if(income.getValue() <= 0) { + } else if (income.getValue() <= 0) { throw new ChChingException("Invalid/Missing income value"); } this.income = income; } + @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { assert income.getValue() > 0 : "Income value must be positive"; incomes.addIncome(income); ui.showAdded(incomes, expenses, income); diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index 40c9265ed2..72c6e5d8c7 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -1,29 +1,34 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class BalanceCommand extends Command { private double balance; - + public String showBalance() { return String.format("%.02f", balance); } + @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { double totalIncome = 0; double totalExpense = 0; - for(int i = 0; i < incomes.size(); i++) { + for (int i = 0; i < incomes.size(); i++) { totalIncome += incomes.get(i).getValue(); } - for(int i = 0; i < expenses.size(); i++) { + for (int i = 0; i < expenses.size(); i++) { totalExpense += expenses.get(i).getValue(); } balance = totalIncome - totalExpense; assert balance <= totalIncome : "Wrong calculations"; - - ui.showBalance(totalExpense, totalIncome, balance); + String convertedBalance = converter.printConverter(balance, selector); + ui.showBalance(totalExpense, totalIncome, balance, convertedBalance); } } diff --git a/src/main/java/chching/command/Command.java b/src/main/java/chching/command/Command.java index 78d10958ee..d9ec27403b 100644 --- a/src/main/java/chching/command/Command.java +++ b/src/main/java/chching/command/Command.java @@ -5,13 +5,17 @@ import chching.Ui; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.currency.Selector; +import chching.currency.Converter; public abstract class Command { - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { } /** * Method to indicate to exit the program after executed + * * @return boolean. */ public boolean isExit() { diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 5d32ce88e0..e6b4626218 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -3,16 +3,21 @@ import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class DeleteExpenseCommand extends Command { private final int index; + public DeleteExpenseCommand(int index) { this.index = index; } + @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > expenses.size()) { @@ -21,7 +26,7 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto assert index > 0 : "Index must be a positive integer"; expenses.deleteExpense(index); System.out.println("Expense deleted, here is the updated list:"); - expenses.printExpenseList(); + expenses.printExpenseList(selector, converter); } - + } diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index 8e0119adf7..22e020df21 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -3,26 +3,29 @@ import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; - public class DeleteIncomeCommand extends Command { - + private int index; + public DeleteIncomeCommand(int index) { this.index = index; } @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { - if (index <= 0){ + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { + if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > incomes.size()) { throw new ChChingException("The number is too big"); } incomes.deleteIncome(index); System.out.println("Income deleted, here is the updated list:"); - incomes.printIncomeList(); + incomes.printIncomeList(selector, converter); } } diff --git a/src/main/java/chching/command/ExitCommand.java b/src/main/java/chching/command/ExitCommand.java index 8dae0e06cb..328bc26414 100644 --- a/src/main/java/chching/command/ExitCommand.java +++ b/src/main/java/chching/command/ExitCommand.java @@ -1,7 +1,10 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; @@ -10,13 +13,15 @@ */ public class ExitCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { storage.save(incomes, expenses); ui.showGoodbye(); } /** * Method to indicate to exit the program after executed + * * @return boolean. */ @Override diff --git a/src/main/java/chching/command/HelpCommand.java b/src/main/java/chching/command/HelpCommand.java index 1b1e5e6984..78a8a720a2 100644 --- a/src/main/java/chching/command/HelpCommand.java +++ b/src/main/java/chching/command/HelpCommand.java @@ -1,13 +1,17 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class HelpCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { ui.showHelp(); } } diff --git a/src/main/java/chching/command/InvalidCommand.java b/src/main/java/chching/command/InvalidCommand.java index 90e83af92f..2e357d8d74 100644 --- a/src/main/java/chching/command/InvalidCommand.java +++ b/src/main/java/chching/command/InvalidCommand.java @@ -1,7 +1,10 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; @@ -10,7 +13,8 @@ */ public class InvalidCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { ui.showInvalidMessage(); } } diff --git a/src/main/java/chching/command/ListCommand.java b/src/main/java/chching/command/ListCommand.java index bd07bd4773..60adff4450 100644 --- a/src/main/java/chching/command/ListCommand.java +++ b/src/main/java/chching/command/ListCommand.java @@ -1,13 +1,17 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class ListCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { - ui.showAllRecords(incomes, expenses); + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { + ui.showAllRecords(incomes, expenses, selector, converter); } } diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index 8040aafd23..e28d976050 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -1,14 +1,18 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class ListExpenseCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { System.out.println(" Expenses:"); - expenses.printExpenseList(); + expenses.printExpenseList(selector, converter); } } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index fa5bda3549..e38f6f7388 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -1,14 +1,18 @@ package chching.command; +import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; public class ListIncomeCommand extends Command { @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { System.out.println(" Income:"); - incomes.printIncomeList(); + incomes.printIncomeList(selector, converter); } } diff --git a/src/main/java/chching/command/SetCurrencyCommand.java b/src/main/java/chching/command/SetCurrencyCommand.java new file mode 100644 index 0000000000..de85526d26 --- /dev/null +++ b/src/main/java/chching/command/SetCurrencyCommand.java @@ -0,0 +1,28 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.currency.Selector; +import chching.currency.Converter; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +public class SetCurrencyCommand extends Command { + private final String currency; + + public SetCurrencyCommand(String currency) { + this.currency = currency; + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) + throws ChChingException { + if (!selector.containsCurrency(currency)) { + throw new ChChingException("Currency not available!"); + } + selector.setCurrency(currency); + selector.printSelector(); + } +} diff --git a/src/main/java/chching/command/UnsetCurrencyCommand.java b/src/main/java/chching/command/UnsetCurrencyCommand.java new file mode 100644 index 0000000000..31bd572b9c --- /dev/null +++ b/src/main/java/chching/command/UnsetCurrencyCommand.java @@ -0,0 +1,28 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.currency.Selector; +import chching.currency.Converter; + +public class UnsetCurrencyCommand extends Command { + private final String currency; + + public UnsetCurrencyCommand(String currency) { + this.currency = currency; + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { + + if (!selector.containsCurrency(currency)) { + throw new ChChingException("Currency not available!"); + } + selector.unsetCurrency(currency); + selector.printSelector(); + } +} diff --git a/src/main/java/chching/currency/Converter.java b/src/main/java/chching/currency/Converter.java new file mode 100644 index 0000000000..e36f6001aa --- /dev/null +++ b/src/main/java/chching/currency/Converter.java @@ -0,0 +1,33 @@ +package chching.currency; + +import java.util.HashMap; + +public class Converter { + protected HashMap currencyMap; + + public Converter() { + currencyMap = new HashMap<>(); + currencyMap.put("HKD", 5.87); + currencyMap.put("PHP", 40.72); + currencyMap.put("IDR", 11437.80); + currencyMap.put("MYR", 3.34); + currencyMap.put("VND", 17618.54); + } + + public double convert(String currency, double amount) { + return amount * currencyMap.get(currency); + } + + public String printConverter(double value, Selector selector) { + String result = ""; + for (String currency : currencyMap.keySet()) { + if (selector.isSelected(currency)) { + double convertedValue = convert(currency, value); + result += " | " + currency + " " + String.format("%.2f", convertedValue); + + } + } + return result; + } + +} diff --git a/src/main/java/chching/currency/Selector.java b/src/main/java/chching/currency/Selector.java new file mode 100644 index 0000000000..3417fd8141 --- /dev/null +++ b/src/main/java/chching/currency/Selector.java @@ -0,0 +1,39 @@ +package chching.currency; + +import java.util.HashMap; + +public class Selector { + protected HashMap selectedCurrencies; + + public Selector() { + selectedCurrencies = new HashMap<>(); + selectedCurrencies.put("HKD", false); + selectedCurrencies.put("PHP", false); + selectedCurrencies.put("IDR", false); + selectedCurrencies.put("MYR", false); + selectedCurrencies.put("VND", false); + } + + public void setCurrency(String currency) { + selectedCurrencies.put(currency, true); + } + + public void unsetCurrency(String currency) { + selectedCurrencies.put(currency, false); + } + + public void printSelector() { + for (String currency : selectedCurrencies.keySet()) { + String marked = selectedCurrencies.get(currency) ? "[X] " : "[ ] "; + System.out.println(marked + currency); + } + } + + public boolean containsCurrency(String currency) { + return selectedCurrencies.containsKey(currency); + } + + public boolean isSelected(String currency) { + return selectedCurrencies.get(currency); + } +} diff --git a/src/main/java/chching/parser/Currency.java b/src/main/java/chching/parser/Currency.java new file mode 100644 index 0000000000..954d0dbd7f --- /dev/null +++ b/src/main/java/chching/parser/Currency.java @@ -0,0 +1,17 @@ +package chching.parser; + +import java.util.HashMap; +import chching.ChChingException; + +public class Currency { + public static String getCurrency(HashMap argumentsByField) throws ChChingException { + String currency = null; + try { + currency = argumentsByField.get("cr"); + } catch (Exception e) { + throw new ChChingException("Missing/invalid currency"); + } + return currency; + } + +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index d31b1de75f..88c51d989d 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -3,23 +3,24 @@ import chching.ChChingException; import chching.Ui; import chching.command.Command; -import chching.command.InvalidCommand; -import chching.command.DeleteExpenseCommand; -import chching.command.DeleteIncomeCommand; import chching.command.AddExpenseCommand; import chching.command.AddIncomeCommand; -import chching.command.BalanceCommand; -import chching.command.ExitCommand; -import chching.command.HelpCommand; +import chching.command.DeleteExpenseCommand; +import chching.command.DeleteIncomeCommand; +import chching.command.InvalidCommand; import chching.command.ListCommand; import chching.command.ListExpenseCommand; import chching.command.ListIncomeCommand; -import chching.record.ExpenseList; +import chching.command.SetCurrencyCommand; +import chching.command.UnsetCurrencyCommand; +import chching.command.BalanceCommand; +import chching.command.ExitCommand; +import chching.command.HelpCommand; import chching.record.Expense; +import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -33,8 +34,7 @@ public static Command parse( String line, IncomeList incomeList, ExpenseList expenseList, - Ui ui - ) throws ChChingException { + Ui ui) throws ChChingException { List lineParts = splitLine(line); String instruction = lineParts.get(0); List arguments = lineParts.subList(1, lineParts.size()); @@ -68,6 +68,14 @@ public static Command parse( index = Expenses.getIndex(argumentsByField); command = new DeleteExpenseCommand(index); break; + case "set currency": + String currency = Currency.getCurrency(argumentsByField); + command = new SetCurrencyCommand(currency); + break; + case "unset currency": + currency = Currency.getCurrency(argumentsByField); + command = new UnsetCurrencyCommand(currency); + break; case "balance": command = new BalanceCommand(); break; @@ -96,7 +104,8 @@ public static HashMap sortArguments(List arguments) thro HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); - // split each argument according to their field and their value, and add into hashmap accordingly + // split each argument according to their field and their value, and add into + // hashmap accordingly // Hashmap's key is its field, value is the value of the field for (int i = 0; i < argumentsCount; i++) { String argument = arguments.get(i); diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index cacde1bc1c..89f9a5b099 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -2,15 +2,18 @@ import java.util.ArrayList; -public class ExpenseList extends RecordList{ +import chching.currency.Converter; +import chching.currency.Selector; + +public class ExpenseList extends RecordList { protected ArrayList expenseList; - public ExpenseList(ArrayList expenseList){ + public ExpenseList(ArrayList expenseList) { this.expenseList = expenseList; } - public ExpenseList(){ + public ExpenseList() { expenseList = new ArrayList<>(); } @@ -22,7 +25,7 @@ public void addExpense(Expense expense) { expenseList.add(expense); } - public void deleteExpense(int i) throws IndexOutOfBoundsException{ + public void deleteExpense(int i) throws IndexOutOfBoundsException { try { expenseList.remove(i - 1); } catch (IndexOutOfBoundsException e) { @@ -30,10 +33,11 @@ public void deleteExpense(int i) throws IndexOutOfBoundsException{ } } - public void printExpenseList() { + public void printExpenseList(Selector selector, Converter converter) { for (int i = 1; i <= expenseList.size(); i++) { Record record = expenseList.get(i - 1); - System.out.println(" " + i + ". " + record.toString()); + String convertedCurrencies = converter.printConverter(record.value, selector); + System.out.println(" " + i + ". " + record.toString() + convertedCurrencies); } } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 952245a7c0..5668d9f4a8 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -2,14 +2,17 @@ import java.util.ArrayList; -public class IncomeList extends RecordList{ +import chching.currency.Converter; +import chching.currency.Selector; + +public class IncomeList extends RecordList { protected ArrayList incomeList; - public IncomeList(ArrayList incomeList){ + public IncomeList(ArrayList incomeList) { this.incomeList = incomeList; } - public IncomeList(){ + public IncomeList() { incomeList = new ArrayList<>(); } @@ -22,7 +25,8 @@ public void addIncome(Income income) { incomeList.add(income); } - public void deleteIncome(int i) throws IndexOutOfBoundsException{ + + public void deleteIncome(int i) throws IndexOutOfBoundsException { try { incomeList.remove(i - 1); } catch (IndexOutOfBoundsException e) { @@ -30,10 +34,11 @@ public void deleteIncome(int i) throws IndexOutOfBoundsException{ } } - public void printIncomeList() { + public void printIncomeList(Selector selector, Converter converter) { for (int i = 1; i <= incomeList.size(); i++) { Record record = incomeList.get(i - 1); - System.out.println(" " + i + ". " + record.toString()); + String convertedCurrencies = converter.printConverter(record.value, selector); + System.out.println(" " + i + ". " + record.toString() + convertedCurrencies); } } diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 5afe6f96a1..ed422b66ef 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -6,6 +6,8 @@ import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; +import chching.currency.Selector; +import chching.currency.Converter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -31,6 +33,8 @@ class BalanceCommandTest { private Expense groceries; private IncomeList defaultIncomeList; private ExpenseList defaultExpenseList; + private Selector selector; + private Converter converter; @BeforeEach void setup() { @@ -38,6 +42,9 @@ void setup() { salary = new Income(INCOME_DESCRIPTION, INCOME_DATE, INCOME_VALUE); groceries = new Expense(EXPENSE_CATEGORY, EXPENSE_DESCRIPTION, EXPENSE_DATE, EXPENSE_VALUE); + selector = new Selector(); + converter = new Converter(); + ArrayList incomeList = new ArrayList(); incomeList.add(salary); @@ -52,7 +59,7 @@ void execute_normalScenario_success() { String expectedOutput = "4500.00"; Command command = new BalanceCommand(); try { - command.execute(defaultIncomeList, defaultExpenseList, ui, storage); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter); assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); } catch (Exception e) { fail(); // test should not reach this line diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 5bd1906a22..7a427fcd2e 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -2,9 +2,12 @@ import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.IncomeList; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,7 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - class DeleteExpenseCommandTest { static final int OFFSET = 1; static final int CORRECT_INDEX = 1; @@ -37,14 +39,17 @@ class DeleteExpenseCommandTest { private Expense groceries; private ExpenseList defaultExpenseList; private IncomeList emptyIncomeList; - + private Selector selector; + private Converter converter; + @BeforeEach void setup() { ui = new Ui(); - spending = new Expense(SPENDING_CATEGORY, SPENDING_DESCRIPTION , SPENDING_DATE, SPENDING_EXPENSE_VALUE); - groceries = new Expense(GROCERIES_CATEGORY,GROCERIES_DESCRIPTION,GROCERIES_DATE,GROCERIES_EXPENSE_VALUE); - - + spending = new Expense(SPENDING_CATEGORY, SPENDING_DESCRIPTION, SPENDING_DATE, SPENDING_EXPENSE_VALUE); + groceries = new Expense(GROCERIES_CATEGORY, GROCERIES_DESCRIPTION, GROCERIES_DATE, GROCERIES_EXPENSE_VALUE); + selector = new Selector(); + converter = new Converter(); + ArrayList expenseList = new ArrayList(); expenseList.add(spending); expenseList.add(groceries); @@ -52,11 +57,11 @@ void setup() { } @Test - void execute_positiveIntegerWithinSize_success(){ + void execute_positiveIntegerWithinSize_success() { int defaultExpenseListSize = defaultExpenseList.size(); Command command = new DeleteExpenseCommand(CORRECT_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); assertEquals(defaultExpenseListSize - OFFSET, defaultExpenseList.size(), "Delete expense working"); } catch (Exception e) { fail(); // test should not reach this line @@ -68,7 +73,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteExpenseCommand(TOO_LARGE_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); @@ -80,7 +85,7 @@ void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteExpenseCommand(NEGATIVE_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 9cc7be1d03..fee3592d8e 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -2,6 +2,8 @@ import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Income; @@ -13,7 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - class DeleteIncomeCommandTest { static final int OFFSET = 1; @@ -34,12 +35,16 @@ class DeleteIncomeCommandTest { private Income bonus; private ExpenseList emptyExpenseList; private IncomeList defaultIncomeList; - + private Selector selector; + private Converter converter; + @BeforeEach void setup() { - salary = new Income(SALARY_DESCRIPTION, SALARY_DATE,SALARY_INCOME_VALUE); + salary = new Income(SALARY_DESCRIPTION, SALARY_DATE, SALARY_INCOME_VALUE); bonus = new Income(BONUS_DESCRIPTION, BONUS_DATE, BONUS_INCOME_VALUE); - + selector = new Selector(); + converter = new Converter(); + ArrayList incomeList = new ArrayList(); incomeList.add(salary); incomeList.add(bonus); @@ -51,7 +56,7 @@ void execute_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); Command command = new DeleteIncomeCommand(CORRECT_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); assertEquals(defaultIncomeListSize - OFFSET, defaultIncomeList.size(), "Delete income working"); } catch (Exception e) { fail(); // test should not reach here @@ -63,7 +68,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteIncomeCommand(TOO_LARGE_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); @@ -75,7 +80,7 @@ void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteIncomeCommand(NEGATIVE_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); From 85242f87f88cae4376524cdfe6fdd79ef77ee76e Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 20:07:04 +0800 Subject: [PATCH 134/364] change format for date input and exception handling --- data/chching.txt | 2 ++ src/main/java/chching/parser/Expenses.java | 19 ++++++++++++++----- src/main/java/chching/parser/Incomes.java | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/data/chching.txt b/data/chching.txt index 40687aad46..ea27b3127a 100644 --- a/data/chching.txt +++ b/data/chching.txt @@ -1,4 +1,6 @@ I | tuition | 2023-12-12 | 500.00 I | test | 2022-11-11 | 300.00 +I | test | 2023-12-12 | 500.00 E | expense | transport | 2023-12-12 | 500.00 E | tuition | test | 2023-12-24 | 350.50 +E | test | test | 2023-07-05 | 300.00 diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index f9c840beee..4af069d01e 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -5,22 +5,31 @@ import java.time.LocalDate; import java.time.format.DateTimeParseException; +import java.time.format.DateTimeFormatter; import java.util.HashMap; public class Expenses { + + private static LocalDate parseDate(String expenseDateString) throws ChChingException { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate expenseDate = LocalDate.parse(expenseDateString, formatter); + return expenseDate; + } catch (DateTimeParseException e) { + throw new ChChingException("Date format should be: dd-MM-yyyy"); + } + } public static Expense parseExpense(HashMap argumentsByField) throws ChChingException{ Expense exp = null; try { String expenseCategory = argumentsByField.get("c"); String expenseDescription = argumentsByField.get("de"); - LocalDate expenseDate = LocalDate.parse(argumentsByField.get("da")); + String expenseDateString = argumentsByField.get("da"); + LocalDate expenseDate = parseDate(expenseDateString); float expenseValue = Float.parseFloat(argumentsByField.get("v")); assert expenseValue > 0 : "Expense value should be greater than zero"; exp = new Expense(expenseCategory, expenseDescription, expenseDate, expenseValue); - } catch (DateTimeParseException e) { - throw new ChChingException("Date format should be: yyyy-mm-dd"); - } - catch (Exception e) { + } catch (Exception e) { throw new ChChingException("Trouble adding expense value"); } return exp; diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index 747c86d241..1ce5b3ea7c 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -5,20 +5,28 @@ import java.time.LocalDate; import java.time.format.DateTimeParseException; +import java.time.format.DateTimeFormatter; import java.util.HashMap; public class Incomes { + private static LocalDate parseDate(String incomeDateString) throws ChChingException { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + LocalDate incomeDate = LocalDate.parse(incomeDateString, formatter); + return incomeDate; + } catch (DateTimeParseException e) { + throw new ChChingException("Date format should be: dd-MM-yyyy"); + } + } public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; try { String incomeDescription = argumentsByField.get("de"); - LocalDate incomeDate = LocalDate.parse(argumentsByField.get("da")); + String incomeDateString = argumentsByField.get("da"); + LocalDate incomeDate = parseDate(incomeDateString); float incomeValue = Float.parseFloat(argumentsByField.get("v")); - inc = new Income(incomeDescription, incomeDate, incomeValue); assert incomeValue > 0 : "incomeValue has to be more than 0"; inc = new Income(incomeDescription, incomeDate, incomeValue); - } catch (DateTimeParseException e) { - throw new ChChingException("Date format should be: yyyy-mm-dd"); } catch (Exception e) { throw new ChChingException("Trouble adding income value"); From 1b40360afe7cc3edf164d33ec7ce72c0ae207be4 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 20:12:41 +0800 Subject: [PATCH 135/364] further edit user guide --- docs/UserGuide.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 400fc807a7..4185d66917 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -35,10 +35,11 @@ Format: Use case: * Re-prompts user if any field is not provided properly. * VALUE will be stored as a positive float. +* Format for DATE will be dd-MM-yyyy. Example of usage: -
`add expense /c meal /de breakfast @Technoedge /da 2023-03-22 /v 3.50` -
`add income /c salary /de salary /da 2023-03-22 /v 500` +
`add expense /c meal /de breakfast @Technoedge /da 22-03-2023 /v 3.50` +
`add income /c salary /de salary /da 22-03-2023 /v 500` ### Listing all expenses and incomes: `list` Shows a full list of both the expenses and incomes created by the user. Includes the index number, category, description, and value. From 047e838fd14689a31c704882e1847dd3aec0fdfa Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 20:40:10 +0800 Subject: [PATCH 136/364] Did up basic design details for ListExpenseCommand in DG --- docs/DeveloperGuide.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 24f499da84..67a85e08bd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -8,7 +8,7 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} -## Implmentation +## Implementation ### Record and RecordList @@ -28,8 +28,16 @@ Afterwards, the ```execute()``` method will print ```"Income deleted, here is th ![Record Class](/images/Sequence_diagram.png) -### Delete Income command +### ListExpenseCommand +The listExpenseCommand is facilitated by ```System```, ```Parser``` and ```ExpenseList```. +1. The user inputs the command top list expense. This input is handled by```Parser``` which returns the +```listExpenseCommand``` if successful. +2. ```ListExpenseCommand``` will then call its ```execute``` method +which makes use of ```System``` to print a new line ```"Expenses:"```. +3. The ```expenseList``` method ```printExpenseList``` +is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of +expenses in ```expenses```. ## Product scope ### Target user profile From acc50584be6a43af719845c474ca181a4fa0e0b0 Mon Sep 17 00:00:00 2001 From: Nafis Azizi Riza <101693218+nafisazizir@users.noreply.github.com> Date: Wed, 22 Mar 2023 20:48:49 +0800 Subject: [PATCH 137/364] add find feature --- src/main/java/chching/Ui.java | 14 +++++ .../java/chching/command/FindCommand.java | 51 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/chching/command/FindCommand.java diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index de5124f5a9..0c799e2f09 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -5,6 +5,7 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Record; +import chching.record.RecordList; import java.util.Scanner; @@ -66,6 +67,19 @@ public void showBalance(double totalExpense, double totalIncome, double balance, System.out.println(" SGD " + String.format("%.02f", balance) + convertedBalance); } + public void showMatchedRecord(RecordList records) { + if (records.getRecordCount() > 0) { + System.out.println(" Here are the matching records in your list:"); + + for (int i = 0; i < records.getRecordCount(); i++) { + System.out.println(" " + (i+1) + ". " + records.get(i)); + } + } else { + System.out.println(" No mathcing records for those keyword"); + } + + } + public static void showHelp() { System.out.println(" ADD RECORDS:"); System.out.println(" add expense /c /de /da /v "); diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java new file mode 100644 index 0000000000..28d62c2735 --- /dev/null +++ b/src/main/java/chching/command/FindCommand.java @@ -0,0 +1,51 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.Expense; +import chching.record.ExpenseList; + +/** + * model a class to handle the find command. inherit from Command class. + */ +public class FindCommand extends Command { + private final String category; + private final String keyword; + + public FindCommand(String category, String keyword) { + this.category = category; + this.keyword = keyword; + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) { + + IncomeList incomesMatched = new IncomeList(); + ExpenseList expensesMatched = new ExpenseList(); + + if (category == "income") { + for (int i = 0; i < incomes.size(); i++) { + Income income = incomes.get(i); + if (income.toString().contains(keyword)) { + incomesMatched.addRecord(income); + } + } + ui.showMatchedRecord(incomesMatched); + + } else { + for (int i = 0; i < expenses.size(); i++) { + Expense expense = expenses.get(i); + if (expense.toString().contains(keyword)) { + expensesMatched.addRecord(expense); + } + } + ui.showMatchedRecord(expensesMatched); + } + } + +} From 2e0ea213e690aa12baef1f5af152cd2e68dcc675 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 21:08:51 +0800 Subject: [PATCH 138/364] Change JUnit testing to test for new dateTime format for record date --- .../java/chching/command/AddExpenseCommandTest.java | 6 ++++-- .../java/chching/command/AddIncomeCommandTest.java | 7 +++++-- .../java/chching/command/BalanceCommandTest.java | 11 ++++++----- .../chching/command/DeleteExpenseCommandTest.java | 9 +++++---- .../chching/command/DeleteIncomeCommandTest.java | 9 +++++---- src/test/java/chching/record/ExpenseListTest.java | 7 ++++++- src/test/java/chching/record/ExpenseTest.java | 12 ++++++++---- src/test/java/chching/record/IncomeListTest.java | 6 +++++- src/test/java/chching/record/IncomeTest.java | 12 ++++++++---- 9 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index b445e9ced2..cdc3bcbf5c 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -2,6 +2,8 @@ import chching.record.Expense; import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; @@ -11,8 +13,8 @@ public class AddExpenseCommandTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - - static final String DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); static final float EXPENSE_VALUE = (float) 1.50; static final float ZERO_EXPENSE_VALUE = (float) 0; static final float NEGATIVE_EXPENSE_VALUE = (float) -1.50; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 2196a68dda..d40e723aa8 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -3,14 +3,17 @@ import chching.record.Income; import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; public class AddIncomeCommandTest { static final String DESCRIPTION = "salary"; - - static final String DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); static final float INCOME_VALUE = (float) 500; static final float ZERO_INCOME_VALUE = (float) 0; static final float NEGATIVE_INCOME_VALUE = (float) -500; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 5afe6f96a1..ac2c6897df 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -8,6 +8,9 @@ import chching.record.IncomeList; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -15,14 +18,12 @@ class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; - - static final String INCOME_DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate INCOME_DATE = LocalDate.parse("01-04-2023", formatter); static final float INCOME_VALUE = (float) 5000; - static final String EXPENSE_CATEGORY = "grocery"; static final String EXPENSE_DESCRIPTION = "too much groceries"; - - static final String EXPENSE_DATE = "1st apr 2023"; + static final LocalDate EXPENSE_DATE = LocalDate.parse("01-04-2023", formatter); static final float EXPENSE_VALUE = (float) 500; private Ui ui; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 5bd1906a22..7aa73b768b 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -22,14 +24,13 @@ class DeleteExpenseCommandTest { static final String SPENDING_CATEGORY = "entertainment"; static final String SPENDING_DESCRIPTION = "movie"; - - static final String SPENDING_DATE = "02/10/23"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate SPENDING_DATE = LocalDate.parse("02-10-2023", formatter); static final float SPENDING_EXPENSE_VALUE = (float) 10.50; static final String GROCERIES_CATEGORY = "entertainment"; static final String GROCERIES_DESCRIPTION = "movie"; - - static final String GROCERIES_DATE = "02/10/23"; + static final LocalDate GROCERIES_DATE = LocalDate.parse("02-10-2023", formatter); static final float GROCERIES_EXPENSE_VALUE = (float) 500; private Ui ui; private Storage storage; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 9cc7be1d03..bda9def34f 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -21,12 +23,11 @@ class DeleteIncomeCommandTest { static final int TOO_LARGE_INDEX = 5; static final int NEGATIVE_INDEX = -1; static final String SALARY_DESCRIPTION = "salary"; - - static final String SALARY_DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate SALARY_DATE = LocalDate.parse("01-04-2023", formatter); static final float SALARY_INCOME_VALUE = (float) 5000; static final String BONUS_DESCRIPTION = "salary"; - - static final String BONUS_DATE = "5/2/23"; + static final LocalDate BONUS_DATE = LocalDate.parse("05-02-2023", formatter); static final float BONUS_INCOME_VALUE = (float) 3000; private Ui ui; private Storage storage; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 8b95199d9e..91abc782aa 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -1,12 +1,17 @@ package chching.record; import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + import static org.junit.jupiter.api.Assertions.assertEquals; class ExpenseListTest { static final int EXPECTED_SIZE = 1; static final String CATEGORY = "entertainment"; static final String DESCRIPTION = "beach party"; - static final String DATE = "23 may 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("23-05-2023", formatter); static final float EXPENSE_VALUE = (float) 50; @Test diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index 0ef7042081..f48dec8edf 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -2,12 +2,16 @@ import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + import static org.junit.jupiter.api.Assertions.assertEquals; public class ExpenseTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - static final String DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); static final float EXPENSE_VALUE = (float) 1.50; @Test void getExpenseDescription_expected() { @@ -18,9 +22,9 @@ void getExpenseDescription_expected() { @Test void getExpenseDate_expected() { - String test = "1st apr 2023"; + String test = "01-Apr-2023"; Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); - assertEquals("1st apr 2023", exp.getDate()); + assertEquals("01-Apr-2023", exp.getDateString()); } @Test @@ -33,7 +37,7 @@ void getExpenseValue_expected() { @Test void getValue_expected() { Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); - String expected = "Category - transport | Description - public transport | Date - 1st apr 2023 | Value - 1.50"; + String expected = "Category - transport | Description - public transport | Date - 01-Apr-2023 | Value - 1.50"; assertEquals(expected, exp.toString()); } } diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 047c307630..65dfe11886 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -2,12 +2,16 @@ import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + import static org.junit.jupiter.api.Assertions.assertEquals; class IncomeListTest { static final String DESCRIPTION = "salary"; - static final String DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); static final float INCOME_VALUE = (float) 1000000; @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 7dc60db36d..67944fb26d 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -2,12 +2,16 @@ import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + import static org.junit.jupiter.api.Assertions.assertEquals; class IncomeTest { static final String DESCRIPTION = "salary"; - static final String DATE = "1st apr 2023"; + static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); static final float INCOME_VALUE = (float) 1000000; @Test @@ -19,9 +23,9 @@ void getIncomeDescription_expected() { @Test void getIncomeDate_expected() { - String test = "1st apr 2023"; + String test = "01-Apr-2023"; Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); - assertEquals("1st apr 2023", income0.getDate()); + assertEquals("01-Apr-2023", income0.getDateString()); } @Test @@ -34,7 +38,7 @@ void getIncomeValue_expected() { @Test void getValue_expected() { Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); - String expected = "Description - salary | Date - 1st apr 2023 | Value - 1000000.00"; + String expected = "Description - salary | Date - 01-Apr-2023 | Value - 1000000.00"; assertEquals(expected, income0.toString()); } From faf84c30a16f67a194119f13aa017961f70da3a9 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 21:29:44 +0800 Subject: [PATCH 139/364] Add FindCommand to parser --- src/main/java/chching/parser/Parser.java | 38 +++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 88c51d989d..5affda46ba 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -2,20 +2,7 @@ import chching.ChChingException; import chching.Ui; -import chching.command.Command; -import chching.command.AddExpenseCommand; -import chching.command.AddIncomeCommand; -import chching.command.DeleteExpenseCommand; -import chching.command.DeleteIncomeCommand; -import chching.command.InvalidCommand; -import chching.command.ListCommand; -import chching.command.ListExpenseCommand; -import chching.command.ListIncomeCommand; -import chching.command.SetCurrencyCommand; -import chching.command.UnsetCurrencyCommand; -import chching.command.BalanceCommand; -import chching.command.ExitCommand; -import chching.command.HelpCommand; +import chching.command.*; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.Income; @@ -76,6 +63,10 @@ public static Command parse( currency = Currency.getCurrency(argumentsByField); command = new UnsetCurrencyCommand(currency); break; + case "find": + String category = getCategory(argumentsByField); + String keyword = getKeyword(argumentsByField); + command = new FindCommand(category, keyword); case "balance": command = new BalanceCommand(); break; @@ -120,5 +111,24 @@ public static HashMap sortArguments(List arguments) thro } return argumentsByField; } + public static String getCategory(HashMap argumentsByField) throws ChChingException { + String category = null; + try { + category = argumentsByField.get("c"); + } catch (Exception e) { + throw new ChChingException("missing/invalid category"); + } + return category; + } + public static String getKeyword(HashMap argumentsByField) throws ChChingException { + String keyword = null; + try { + keyword = argumentsByField.get("k"); + } catch (Exception e) { + throw new ChChingException("missing/invalid keyword"); + } + return keyword; + } + } From bb01fbd9099158711129c5816ec38190aa76944f Mon Sep 17 00:00:00 2001 From: avielcx Date: Wed, 22 Mar 2023 21:33:29 +0800 Subject: [PATCH 140/364] Add documentation for classes and methods --- src/main/java/chching/ChChing.java | 6 ++++ src/main/java/chching/ChChingException.java | 3 ++ src/main/java/chching/Storage.java | 2 +- src/main/java/chching/Ui.java | 3 ++ .../chching/command/AddExpenseCommand.java | 14 ++++++++ .../chching/command/AddIncomeCommand.java | 17 ++++++++++ .../java/chching/command/BalanceCommand.java | 14 ++++++++ src/main/java/chching/command/Command.java | 13 ++++++++ .../chching/command/DeleteExpenseCommand.java | 13 ++++++++ .../chching/command/DeleteIncomeCommand.java | 13 +++++++- .../java/chching/command/ExitCommand.java | 12 ++++++- .../java/chching/command/HelpCommand.java | 12 +++++++ .../java/chching/command/InvalidCommand.java | 11 ++++++- .../java/chching/command/ListCommand.java | 12 +++++++ .../chching/command/ListExpenseCommand.java | 12 +++++++ .../chching/command/ListIncomeCommand.java | 12 +++++++ src/main/java/chching/parser/Expenses.java | 16 +++++++++ src/main/java/chching/parser/Incomes.java | 15 ++++++++- src/main/java/chching/parser/Parser.java | 22 +++++++++++++ src/main/java/chching/record/Expense.java | 17 +++++++++- src/main/java/chching/record/ExpenseList.java | 17 ++++++++++ src/main/java/chching/record/Income.java | 19 +++++++++-- src/main/java/chching/record/IncomeList.java | 18 ++++++++++ src/main/java/chching/record/Record.java | 11 ++++++- src/main/java/chching/record/RecordList.java | 16 +++++++++ .../command/AddExpenseCommandTest.java | 33 +++++++++++++++---- .../chching/command/AddIncomeCommandTest.java | 27 ++++++++++++--- .../command/DeleteExpenseCommandTest.java | 13 +++++++- .../command/DeleteIncomeCommandTest.java | 13 +++++++- .../java/chching/record/ExpenseListTest.java | 6 ++++ src/test/java/chching/record/ExpenseTest.java | 17 ++++++++++ .../java/chching/record/IncomeListTest.java | 7 ++++ src/test/java/chching/record/IncomeTest.java | 16 ++++++++- 33 files changed, 429 insertions(+), 23 deletions(-) diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index 7e7929524d..b0d20b9b03 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -11,6 +11,9 @@ public class ChChing { private ExpenseList expenses; private Ui ui; + /** + * Loads memory of the program + */ public ChChing(String filePath) { this.ui = new Ui(); this.storage = new Storage(filePath); @@ -25,6 +28,9 @@ public ChChing(String filePath) { } } + /** + * Runs the program + */ public void run() { ui.showWelcome(); boolean isExit = false; diff --git a/src/main/java/chching/ChChingException.java b/src/main/java/chching/ChChingException.java index 2c4e42d1f1..bfef272cd5 100644 --- a/src/main/java/chching/ChChingException.java +++ b/src/main/java/chching/ChChingException.java @@ -1,5 +1,8 @@ package chching; +/** + * Models a class for exception thrown + */ public class ChChingException extends Exception { public ChChingException(String message) { super(message); diff --git a/src/main/java/chching/Storage.java b/src/main/java/chching/Storage.java index e690d0e42e..c3ffa8056c 100644 --- a/src/main/java/chching/Storage.java +++ b/src/main/java/chching/Storage.java @@ -13,7 +13,7 @@ import java.util.Scanner; /** - * Model a class to handle storage for the program. + * Models a class to handle storage for the program. */ public class Storage { private final File file; diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index e31a439e11..9760d10eea 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -6,6 +6,9 @@ import java.util.Scanner; +/** + * Models a class for user interface of the program + */ public class Ui { public String readCommand() { Scanner input = new Scanner((System.in)); diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index c82e19014e..877ff29cbb 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -10,6 +10,11 @@ public class AddExpenseCommand extends Command { private final Expense expense; + /** + * Constructor that checks validity of expense input + * + * @param expense ArrayList of expenses. + */ public AddExpenseCommand(Expense expense) throws ChChingException { if (expense == null) { throw new ChChingException("No fields found"); @@ -24,6 +29,15 @@ public AddExpenseCommand(Expense expense) throws ChChingException { } this.expense = expense; } + + /** + * Executes addition of expense to list of expenses + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { assert expense.getValue() > 0 : "Expense value should be greater than 0"; diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index 2d003ec6fb..91ba21beb7 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -7,9 +7,17 @@ import chching.record.IncomeList; import chching.record.Income; +/** + * Models a class to add income to incomeList. Inherited from Command class. + */ public class AddIncomeCommand extends Command { private final Income income; + /** + * Constructor that checks validity of income input + * + * @param income ArrayList of income. + */ public AddIncomeCommand(Income income) throws ChChingException { if (income == null) { throw new ChChingException("No fields found"); @@ -22,6 +30,15 @@ public AddIncomeCommand(Income income) throws ChChingException { } this.income = income; } + + /** + * Executes addition of income to list of incomes + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { assert income.getValue() > 0 : "Income value must be positive"; diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index 40c9265ed2..1f342be031 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -5,12 +5,26 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to show the balance. Inherited from Command class. + */ + + public class BalanceCommand extends Command { private double balance; public String showBalance() { return String.format("%.02f", balance); } + + /** + * Executes showing balance. + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { double totalIncome = 0; diff --git a/src/main/java/chching/command/Command.java b/src/main/java/chching/command/Command.java index 78d10958ee..a32d65cf0f 100644 --- a/src/main/java/chching/command/Command.java +++ b/src/main/java/chching/command/Command.java @@ -6,7 +6,20 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Abstract Command class that acts as a template for other command classes. + */ + public abstract class Command { + + /** + * Executes command + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { } diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 5d32ce88e0..c2a0f6ab09 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -6,11 +6,24 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to handle the DeleteExpense command. Inherited from Command class. + */ + public class DeleteExpenseCommand extends Command { private final int index; public DeleteExpenseCommand(int index) { this.index = index; } + + /** + * Executes deletion of expense from list of expenses + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { if (index <= 0) { diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index 8e0119adf7..cb46d3fb35 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -6,7 +6,9 @@ import chching.record.ExpenseList; import chching.record.IncomeList; - +/** + * Models a class to handle the DeleteIncome command. Inherited from Command class. + */ public class DeleteIncomeCommand extends Command { private int index; @@ -14,6 +16,15 @@ public DeleteIncomeCommand(int index) { this.index = index; } + + /** + * Executes deletion of income from list of incomes + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { if (index <= 0){ diff --git a/src/main/java/chching/command/ExitCommand.java b/src/main/java/chching/command/ExitCommand.java index 8dae0e06cb..c1f2ce5927 100644 --- a/src/main/java/chching/command/ExitCommand.java +++ b/src/main/java/chching/command/ExitCommand.java @@ -6,9 +6,19 @@ import chching.record.IncomeList; /** - * model a class to handle the bye command. inherit from Command class. + * Models a class to handle the bye command. Inherited from Command class. */ public class ExitCommand extends Command { + + + /** + * Executes program termination + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { storage.save(incomes, expenses); diff --git a/src/main/java/chching/command/HelpCommand.java b/src/main/java/chching/command/HelpCommand.java index 1b1e5e6984..b2ae0e70b5 100644 --- a/src/main/java/chching/command/HelpCommand.java +++ b/src/main/java/chching/command/HelpCommand.java @@ -5,7 +5,19 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to handle the HelpCommand command. Inherited from Command class. + */ public class HelpCommand extends Command { + + /** + * Executes help command + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { ui.showHelp(); diff --git a/src/main/java/chching/command/InvalidCommand.java b/src/main/java/chching/command/InvalidCommand.java index 90e83af92f..9f0a46ed76 100644 --- a/src/main/java/chching/command/InvalidCommand.java +++ b/src/main/java/chching/command/InvalidCommand.java @@ -6,9 +6,18 @@ import chching.record.IncomeList; /** - * model a class to handle the invalid command. inherit from Command class. + * Models a class to handle the invalid command. Inherited from Command class. */ public class InvalidCommand extends Command { + + /** + * Executes invalidCommand method + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { ui.showInvalidMessage(); diff --git a/src/main/java/chching/command/ListCommand.java b/src/main/java/chching/command/ListCommand.java index bd07bd4773..b8caceb641 100644 --- a/src/main/java/chching/command/ListCommand.java +++ b/src/main/java/chching/command/ListCommand.java @@ -5,7 +5,19 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to list incomes and expenses. Inherited from Command class. + */ public class ListCommand extends Command { + + /** + * Executes the listing of incomes and expenses + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { ui.showAllRecords(incomes, expenses); diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index 8040aafd23..65340d23ef 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -5,7 +5,19 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to list the entries in the expenseList. Inherited from Command class. + */ public class ListExpenseCommand extends Command { + + /** + * Executes listing of expenses from expenseList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { System.out.println(" Expenses:"); diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index fa5bda3549..bbf0053ef7 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -5,7 +5,19 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +/** + * Models a class to list the entries in the incomeList. Inherited from Command class. + */ public class ListIncomeCommand extends Command { + + /** + * Executes listing of incomes from incomeList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) { System.out.println(" Income:"); diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 465359f04c..369d390de0 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -5,7 +5,17 @@ import java.util.HashMap; +/** + * Models a class to parse expenses. + */ + public class Expenses { + + /** + * Parses an expense into the expenseList + * + * @param argumentsByField Input from users + */ public static Expense parseExpense(HashMap argumentsByField) throws ChChingException{ Expense exp = null; try { @@ -20,6 +30,12 @@ public static Expense parseExpense(HashMap argumentsByField) thr } return exp; } + + /** + * Gets the index of the entry + * + * @param argumentsByField ArrayList of income. + */ public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index d802cdfb18..2451bf9980 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -6,6 +6,12 @@ import java.util.HashMap; public class Incomes { + + /** + * Parses an income into the incomeList + * + * @param argumentsByField Input from users + */ public static Income parseIncome(HashMap argumentsByField) throws ChChingException { Income inc = null; try { @@ -20,7 +26,14 @@ public static Income parseIncome(HashMap argumentsByField) throw } return inc; } - + + + /** + * Gets the index of the entry + * + * @param argumentsByField ArrayList of income. + */ + public static int getIndex(HashMap argumentsByField) throws ChChingException { int index = -1; try { diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index d31b1de75f..1d0edb5539 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -29,6 +29,15 @@ public class Parser { public static final String FIELD_DEMARCATION = " /"; + /** + * Method that parses command to the relevant classes to execute + * + * @param line User input + * @param incomeList List of incomes + * @param expenseList List of expenses + * @param ui User interface + */ + public static Command parse( String line, IncomeList incomeList, @@ -86,12 +95,25 @@ public static Command parse( return command; } + /** + * Split the String of user input into relevant partitions + * + * @param line User input + * @return An ArrayList of Strings + */ public static ArrayList splitLine(String line) { ArrayList lineParts = new ArrayList(); lineParts.addAll(Arrays.asList(line.split(FIELD_DEMARCATION))); return lineParts; } + /** + * Sort the arguments + * + * @param arguments arguments + * @return Hashmap of sorted arguments + */ + public static HashMap sortArguments(List arguments) throws ChChingException { HashMap argumentsByField = new HashMap(); int argumentsCount = arguments.size(); diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 86c2e1f30e..6a47bf651d 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -1,8 +1,20 @@ package chching.record; +/** + * Models a class for an expense entry + */ public class Expense extends Record { private final String category; + + /** + * Constructor to instantiate Expense objects + * + * @param category Category of expense + * @param description Description of expense + * @param date Date of expense + * @param value Value of expense + */ public Expense(String category, String description, String date, double value) { super(description, date, value); this.category = category; @@ -12,7 +24,10 @@ public Expense(String category, String description, String date, double value) { public String getCategory() { return category; } - + + /** + * Changes String format + */ @Override public String toString() { return "Category - " + getCategory() + diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index cacde1bc1c..eb13cc9824 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -2,14 +2,25 @@ import java.util.ArrayList; +/** + * Models a class that act as list of expenses. Inherited from RecordList Class + */ public class ExpenseList extends RecordList{ protected ArrayList expenseList; + /** + * Constructor to instantiate IncomeList objects + * + * @param expenseList ArrayList of expenses + */ public ExpenseList(ArrayList expenseList){ this.expenseList = expenseList; } + /** + * Default constructor to instantiate ExpenseList objects + */ public ExpenseList(){ expenseList = new ArrayList<>(); } @@ -22,6 +33,12 @@ public void addExpense(Expense expense) { expenseList.add(expense); } + + /** + * Deletes expense from an ExpenseList + * + * @param i index of the income entry + */ public void deleteExpense(int i) throws IndexOutOfBoundsException{ try { expenseList.remove(i - 1); diff --git a/src/main/java/chching/record/Income.java b/src/main/java/chching/record/Income.java index 29a8bddae8..0a7cb0f2d4 100644 --- a/src/main/java/chching/record/Income.java +++ b/src/main/java/chching/record/Income.java @@ -1,13 +1,28 @@ package chching.record; -public class Income extends Record{ + +/** + * Models a class for an income entry + */ +public class Income extends Record { + + /** + * Constructor to instantiate Income objects + * + * @param description Description of income + * @param date Date of income + * @param value Value of income + */ public Income(String description, String date, double value) { super(description, date, value); } + /** + * Changes String format + */ @Override public String toString() { - return "Description - " + getDescription() + + return "Description - " + getDescription() + " | Date - " + getDate() + " | Value - " + String.format("%.02f", getValue()); } diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 952245a7c0..3050dde7e9 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -2,13 +2,25 @@ import java.util.ArrayList; +/** + * Models a class that act as list of incomes. Inherited from RecordList Class + */ public class IncomeList extends RecordList{ protected ArrayList incomeList; + /** + * Constructor to instantiate IncomeList objects + * + * @param incomeList ArrayList of incomes + */ + public IncomeList(ArrayList incomeList){ this.incomeList = incomeList; } + /** + * Default constructor to instantiate IncomeList objects + */ public IncomeList(){ incomeList = new ArrayList<>(); @@ -22,6 +34,12 @@ public void addIncome(Income income) { incomeList.add(income); } + + /** + * Deletes income from an IncomeList + * + * @param i index of the income entry + */ public void deleteIncome(int i) throws IndexOutOfBoundsException{ try { incomeList.remove(i - 1); diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 20d81caea3..56f4c61604 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -1,6 +1,8 @@ package chching.record; -// Abstract class that will not be initialized as an object +/** + * Models an abstract class that act as a template for Expense and Income + */ public abstract class Record { protected String description; protected String date; @@ -9,6 +11,13 @@ public abstract class Record { public Record(){ } + /** + * Constructor template for Expense and Income classes + * + * @param description String description + * @param date String of the date + * @param value value of the income/expense + */ public Record(String description, String date, double value) { this.description = description; this.date = date; diff --git a/src/main/java/chching/record/RecordList.java b/src/main/java/chching/record/RecordList.java index a9544dfe8e..3a2ac16576 100644 --- a/src/main/java/chching/record/RecordList.java +++ b/src/main/java/chching/record/RecordList.java @@ -2,6 +2,10 @@ import java.util.ArrayList; + +/** + * Models an abstract class that act as a template for ExpenseList and IncomeList. + */ public abstract class RecordList { protected ArrayList recordList = new ArrayList<>(); @@ -20,6 +24,12 @@ public int getRecordCount() { return recordList.size(); } + /** + * Gets the balance of the list + * + * return balance + */ + public double getBalance(){ for(int i = 0; i < getRecordCount(); i++){ balance += this.recordList.get(i).value; @@ -27,6 +37,12 @@ public double getBalance(){ return balance; } + /** + * Adds record to a list + * + * @param record A record + */ + public void addRecord(Record record) { recordList.add(record); } diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index b445e9ced2..b44708497d 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -6,7 +6,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - +/** + * Junit Test for AddExpenseCommand + */ public class AddExpenseCommandTest { static final String CATEGORY = "transport"; @@ -19,7 +21,9 @@ public class AddExpenseCommandTest { - + /** + * Junit Test when there is null field for the expense input + */ @Test void execute_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; @@ -30,7 +34,10 @@ void execute_nullExpense_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is missing category for the expense input + */ @Test void execute_missingCategoryField_exceptionThrown() { String expectedOutput = "Missing category field"; @@ -42,7 +49,10 @@ void execute_missingCategoryField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is missing description for the expense input + */ @Test void execute_missingDescriptionField_exceptionThrown() { String expectedOutput = "Missing description field"; @@ -54,7 +64,10 @@ void execute_missingDescriptionField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is missing date for the expense input + */ @Test void execute_missingDateField_exceptionThrown() { String expectedOutput = "Missing date field"; @@ -66,7 +79,10 @@ void execute_missingDateField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a zeroValue field + */ @Test void execute_zeroValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing expense value"; @@ -78,7 +94,10 @@ void execute_zeroValueField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a negative value field + */ @Test void execute_negativeValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing expense value"; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index 2196a68dda..a8f068c4bc 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -6,6 +6,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +/** + * Junit Test for AddIncomeCommand + */ public class AddIncomeCommandTest { static final String DESCRIPTION = "salary"; @@ -14,6 +17,10 @@ public class AddIncomeCommandTest { static final float INCOME_VALUE = (float) 500; static final float ZERO_INCOME_VALUE = (float) 0; static final float NEGATIVE_INCOME_VALUE = (float) -500; + + /** + * Junit Test when there is a null entry in the income input + */ @Test void addIncomeCommand_nullExpense_exceptionThrown() { String expectedOutput = "No fields found"; @@ -24,7 +31,10 @@ void addIncomeCommand_nullExpense_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a missing description in the income input + */ @Test void addIncomeCommand_missingDescriptionField_exceptionThrown() { String expectedOutput = "Missing description field"; @@ -36,7 +46,10 @@ void addIncomeCommand_missingDescriptionField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a missing date in the income input + */ @Test void addIncomeCommand_missingDateField_exceptionThrown() { String expectedOutput = "Missing date field"; @@ -48,7 +61,10 @@ void addIncomeCommand_missingDateField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a zeroValue field + */ @Test void addIncomeCommand_zeroValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing income value"; @@ -60,7 +76,10 @@ void addIncomeCommand_zeroValueField_exceptionThrown() { assertEquals(expectedOutput, e.getMessage()); } } - + + /** + * Junit Test when there is a negative value field + */ @Test void addIncomeCommand_negativeValueField_exceptionThrown() { String expectedOutput = "Invalid/Missing income value"; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 5bd1906a22..f783dca64b 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -13,7 +13,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - +/** + * Junit Test for DeleteExpenseCommand + */ class DeleteExpenseCommandTest { static final int OFFSET = 1; static final int CORRECT_INDEX = 1; @@ -51,6 +53,9 @@ void setup() { defaultExpenseList = new ExpenseList(expenseList); } + /** + * Junit Test when deleting an entry of index within the size of the ExpenseList + */ @Test void execute_positiveIntegerWithinSize_success(){ int defaultExpenseListSize = defaultExpenseList.size(); @@ -63,6 +68,9 @@ void execute_positiveIntegerWithinSize_success(){ } } + /** + * Junit Test when deleting an entry of index outside the size of the ExpenseList + */ @Test void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; @@ -75,6 +83,9 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { } } + /** + * Junit Test when deleting a negative index of the ExpenseList + */ @Test void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 9cc7be1d03..201cd06294 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -13,7 +13,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; - +/** + * Junit Test for DeleteIncomeCommand + */ class DeleteIncomeCommandTest { static final int OFFSET = 1; @@ -46,6 +48,9 @@ void setup() { defaultIncomeList = new IncomeList(incomeList); } + /** + * Junit Test when deleting an entry of index within the size of the IncomeList + */ @Test void execute_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); @@ -58,6 +63,9 @@ void execute_positiveIntegerWithinSize_success() { } } + /** + * Junit Test when deleting an entry of index outside the size of the IncomeList + */ @Test void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; @@ -70,6 +78,9 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { } } + /** + * Junit Test when deleting a negative index of the IncomeList + */ @Test void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 8b95199d9e..3d934161d6 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -2,6 +2,9 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +/** + * Junit Test for ExpenseList + */ class ExpenseListTest { static final int EXPECTED_SIZE = 1; static final String CATEGORY = "entertainment"; @@ -9,6 +12,9 @@ class ExpenseListTest { static final String DATE = "23 may 2023"; static final float EXPENSE_VALUE = (float) 50; + /** + * Junit Test to test method that returns the size of ExpenseList + */ @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index 0ef7042081..c05e6e8fe0 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -4,11 +4,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +/** + * Junit Test for Expense + */ public class ExpenseTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; static final String DATE = "1st apr 2023"; static final float EXPENSE_VALUE = (float) 1.50; + + /** + * Junit Test to get expense description + */ @Test void getExpenseDescription_expected() { String test = "public transport"; @@ -16,6 +23,9 @@ void getExpenseDescription_expected() { assertEquals("public transport", exp.getDescription()); } + /** + * Junit Test to get expense date + */ @Test void getExpenseDate_expected() { String test = "1st apr 2023"; @@ -23,6 +33,10 @@ void getExpenseDate_expected() { assertEquals("1st apr 2023", exp.getDate()); } + + /** + * Junit Test to get expense value + */ @Test void getExpenseValue_expected() { float test = (float) 1.50; @@ -30,6 +44,9 @@ void getExpenseValue_expected() { assertEquals((float) 1.50, exp.getValue()); } + /** + * Junit Test to get expense entry as a String + */ @Test void getValue_expected() { Expense exp = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 047c307630..b25e7aad8f 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -4,11 +4,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +/** + * Junit Test for IncomeList + */ class IncomeListTest { static final String DESCRIPTION = "salary"; static final String DATE = "1st apr 2023"; static final float INCOME_VALUE = (float) 1000000; + + /** + * Junit Test to test method that returns the size of IncomeList + */ @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 7dc60db36d..4309c0ca61 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -4,12 +4,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals; - +/** + * Junit Test for Income + */ class IncomeTest { static final String DESCRIPTION = "salary"; static final String DATE = "1st apr 2023"; static final float INCOME_VALUE = (float) 1000000; + /** + * Junit Test to get income description + */ @Test void getIncomeDescription_expected() { String test = "salary"; @@ -17,6 +22,9 @@ void getIncomeDescription_expected() { assertEquals("salary", income0.getDescription()); } + /** + * Junit Test to get income date + */ @Test void getIncomeDate_expected() { String test = "1st apr 2023"; @@ -24,6 +32,9 @@ void getIncomeDate_expected() { assertEquals("1st apr 2023", income0.getDate()); } + /** + * Junit Test to get income value + */ @Test void getIncomeValue_expected() { float test = (float) 1000000; @@ -31,6 +42,9 @@ void getIncomeValue_expected() { assertEquals((float) 1000000, income0.getValue()); } + /** + * Junit Test to get income entry in String + */ @Test void getValue_expected() { Income income0 = new Income(DESCRIPTION, DATE, INCOME_VALUE); From 6087fae8b3ccc0c3282c398173f36ede50b5072d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Wed, 22 Mar 2023 21:39:37 +0800 Subject: [PATCH 141/364] Coding standard --- src/main/java/chching/parser/Parser.java | 17 ++++++++++++++++- .../chching/command/AddExpenseCommandTest.java | 4 ++-- .../chching/command/AddIncomeCommandTest.java | 4 ++-- .../chching/command/BalanceCommandTest.java | 6 +++--- .../command/DeleteExpenseCommandTest.java | 6 +++--- .../command/DeleteIncomeCommandTest.java | 6 +++--- .../java/chching/record/ExpenseListTest.java | 4 ++-- src/test/java/chching/record/ExpenseTest.java | 4 ++-- .../java/chching/record/IncomeListTest.java | 4 ++-- src/test/java/chching/record/IncomeTest.java | 4 ++-- 10 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 5affda46ba..1d15421eba 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -2,7 +2,21 @@ import chching.ChChingException; import chching.Ui; -import chching.command.*; +import chching.command.Command; +import chching.command.InvalidCommand; +import chching.command.DeleteExpenseCommand; +import chching.command.DeleteIncomeCommand; +import chching.command.AddExpenseCommand; +import chching.command.AddIncomeCommand; +import chching.command.BalanceCommand; +import chching.command.ExitCommand; +import chching.command.HelpCommand; +import chching.command.ListCommand; +import chching.command.ListExpenseCommand; +import chching.command.ListIncomeCommand; +import chching.command.SetCurrencyCommand; +import chching.command.UnsetCurrencyCommand; +import chching.command.FindCommand; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.Income; @@ -67,6 +81,7 @@ public static Command parse( String category = getCategory(argumentsByField); String keyword = getKeyword(argumentsByField); command = new FindCommand(category, keyword); + break; case "balance": command = new BalanceCommand(); break; diff --git a/src/test/java/chching/command/AddExpenseCommandTest.java b/src/test/java/chching/command/AddExpenseCommandTest.java index cdc3bcbf5c..04876bebf3 100644 --- a/src/test/java/chching/command/AddExpenseCommandTest.java +++ b/src/test/java/chching/command/AddExpenseCommandTest.java @@ -13,8 +13,8 @@ public class AddExpenseCommandTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; static final float ZERO_EXPENSE_VALUE = (float) 0; static final float NEGATIVE_EXPENSE_VALUE = (float) -1.50; diff --git a/src/test/java/chching/command/AddIncomeCommandTest.java b/src/test/java/chching/command/AddIncomeCommandTest.java index d40e723aa8..a683dcdcd6 100644 --- a/src/test/java/chching/command/AddIncomeCommandTest.java +++ b/src/test/java/chching/command/AddIncomeCommandTest.java @@ -12,8 +12,8 @@ public class AddIncomeCommandTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 500; static final float ZERO_INCOME_VALUE = (float) 0; static final float NEGATIVE_INCOME_VALUE = (float) -500; diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index a15eb6e113..929d416ee5 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -20,12 +20,12 @@ class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate INCOME_DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate INCOME_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 5000; static final String EXPENSE_CATEGORY = "grocery"; static final String EXPENSE_DESCRIPTION = "too much groceries"; - static final LocalDate EXPENSE_DATE = LocalDate.parse("01-04-2023", formatter); + static final LocalDate EXPENSE_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 500; private Ui ui; diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index de5c3d3254..d91fda5250 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -26,13 +26,13 @@ class DeleteExpenseCommandTest { static final String SPENDING_CATEGORY = "entertainment"; static final String SPENDING_DESCRIPTION = "movie"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate SPENDING_DATE = LocalDate.parse("02-10-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate SPENDING_DATE = LocalDate.parse("02-10-2023", FORMATTER); static final float SPENDING_EXPENSE_VALUE = (float) 10.50; static final String GROCERIES_CATEGORY = "entertainment"; static final String GROCERIES_DESCRIPTION = "movie"; - static final LocalDate GROCERIES_DATE = LocalDate.parse("02-10-2023", formatter); + static final LocalDate GROCERIES_DATE = LocalDate.parse("02-10-2023", FORMATTER); static final float GROCERIES_EXPENSE_VALUE = (float) 500; private Ui ui; private Storage storage; diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 8d5929f2c0..68f17e2afb 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -24,11 +24,11 @@ class DeleteIncomeCommandTest { static final int TOO_LARGE_INDEX = 5; static final int NEGATIVE_INDEX = -1; static final String SALARY_DESCRIPTION = "salary"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate SALARY_DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate SALARY_DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float SALARY_INCOME_VALUE = (float) 5000; static final String BONUS_DESCRIPTION = "salary"; - static final LocalDate BONUS_DATE = LocalDate.parse("05-02-2023", formatter); + static final LocalDate BONUS_DATE = LocalDate.parse("05-02-2023", FORMATTER); static final float BONUS_INCOME_VALUE = (float) 3000; private Ui ui; private Storage storage; diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 91abc782aa..5d9bec8350 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -10,8 +10,8 @@ class ExpenseListTest { static final int EXPECTED_SIZE = 1; static final String CATEGORY = "entertainment"; static final String DESCRIPTION = "beach party"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("23-05-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("23-05-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 50; @Test diff --git a/src/test/java/chching/record/ExpenseTest.java b/src/test/java/chching/record/ExpenseTest.java index f48dec8edf..ee11181610 100644 --- a/src/test/java/chching/record/ExpenseTest.java +++ b/src/test/java/chching/record/ExpenseTest.java @@ -10,8 +10,8 @@ public class ExpenseTest { static final String CATEGORY = "transport"; static final String DESCRIPTION = "public transport"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 1.50; @Test void getExpenseDescription_expected() { diff --git a/src/test/java/chching/record/IncomeListTest.java b/src/test/java/chching/record/IncomeListTest.java index 65dfe11886..ba5e5d8281 100644 --- a/src/test/java/chching/record/IncomeListTest.java +++ b/src/test/java/chching/record/IncomeListTest.java @@ -10,8 +10,8 @@ class IncomeListTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 1000000; @Test void getExpenseCount_one_expectOne() { diff --git a/src/test/java/chching/record/IncomeTest.java b/src/test/java/chching/record/IncomeTest.java index 67944fb26d..ea7e2744d0 100644 --- a/src/test/java/chching/record/IncomeTest.java +++ b/src/test/java/chching/record/IncomeTest.java @@ -10,8 +10,8 @@ class IncomeTest { static final String DESCRIPTION = "salary"; - static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - static final LocalDate DATE = LocalDate.parse("01-04-2023", formatter); + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); static final float INCOME_VALUE = (float) 1000000; @Test From 48d61ed07027efc16dc7a78769b8eeb3318fe1fd Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 23:46:25 +0800 Subject: [PATCH 142/364] add edit expense command --- src/main/java/chching/Ui.java | 11 ++- .../chching/command/EditExpenseCommand.java | 70 +++++++++++++++++++ src/main/java/chching/parser/Parser.java | 16 ++--- src/main/java/chching/record/Expense.java | 6 +- src/main/java/chching/record/ExpenseList.java | 35 +++++++++- src/main/java/chching/record/Record.java | 3 +- 6 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 src/main/java/chching/command/EditExpenseCommand.java diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 2d59185fdb..d741d55474 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -31,10 +31,19 @@ public void showAdded(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Got it. I've added this record:"); System.out.println(" " + record); System.out.println(); - assert(incomes.size() > 0); + assert(incomes.size() >= 0); System.out.println(" Now you have " + incomes.size() + " income records,"); System.out.println(" and " + expenses.size() + " expense records in the list."); } + + public void showEdited(int index, Record record, boolean isExpense) { + if (isExpense) { + System.out.println(" Got it. I've updated the expense in index " + index + " to"); + } else { + System.out.println(" Got it. I've updated the income in index " + index + " to"); + } + System.out.println(" " + record); + } public void showDelete(IncomeList incomes, ExpenseList expenses, Record record) { System.out.println(" Noted. I've removed this record:"); diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java new file mode 100644 index 0000000000..a983a7a2f1 --- /dev/null +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -0,0 +1,70 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.parser.Expenses; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +import java.util.HashMap; + +public class EditExpenseCommand extends Command { + private int index; + private HashMap argumentsByField; + private boolean hasCategory; + private boolean hasDescription; + private boolean hasDate; + private boolean hasValue; + + + public EditExpenseCommand(HashMap argumentsByField) throws ChChingException { + this.argumentsByField = argumentsByField; + + index = Expenses.getIndex(argumentsByField); + hasCategory = argumentsByField.containsKey("c"); + hasDescription = argumentsByField.containsKey("de"); + hasDate = argumentsByField.containsKey("da"); + hasValue = argumentsByField.containsKey("v"); + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + // check if the index is valid + if (index <= 0) { + throw new ChChingException("Negative/Zero index"); + } else if (index > expenses.size()) { + throw new ChChingException("The index is too big"); + } + assert index > 0 : "Index must be a positive integer"; + + if (!hasCategory && !hasDescription && !hasDate && !hasValue) { + throw new ChChingException("No fields to edit"); + } + // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; + Expense expense = expenses.get(indexZeroBased); + + // edit the fields accordingly + if (hasCategory) { + String value = argumentsByField.get("c"); + expenses.editExpense(index, "c", value); + } + if (hasDescription) { + String value = argumentsByField.get("de"); + expenses.editExpense(index, "de", value); + } + if (hasDate) { + String value = argumentsByField.get("da"); + expenses.editExpense(index, "da", value); + } + if (hasValue) { + String value = argumentsByField.get("v"); + expenses.editExpense(index, "v", value); + } + + boolean isExpense = true; + ui.showEdited(index, expense, isExpense); + } +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index d31b1de75f..4548d0638d 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -2,18 +2,7 @@ import chching.ChChingException; import chching.Ui; -import chching.command.Command; -import chching.command.InvalidCommand; -import chching.command.DeleteExpenseCommand; -import chching.command.DeleteIncomeCommand; -import chching.command.AddExpenseCommand; -import chching.command.AddIncomeCommand; -import chching.command.BalanceCommand; -import chching.command.ExitCommand; -import chching.command.HelpCommand; -import chching.command.ListCommand; -import chching.command.ListExpenseCommand; -import chching.command.ListIncomeCommand; +import chching.command.*; import chching.record.ExpenseList; import chching.record.Expense; import chching.record.Income; @@ -60,6 +49,9 @@ public static Command parse( case "list": command = new ListCommand(); break; + case "edit expense": + command = new EditExpenseCommand(argumentsByField); + break; case "delete income": index = Incomes.getIndex(argumentsByField); command = new DeleteIncomeCommand(index); diff --git a/src/main/java/chching/record/Expense.java b/src/main/java/chching/record/Expense.java index 86c2e1f30e..46f3ee735b 100644 --- a/src/main/java/chching/record/Expense.java +++ b/src/main/java/chching/record/Expense.java @@ -1,7 +1,7 @@ package chching.record; public class Expense extends Record { - private final String category; + private String category; public Expense(String category, String description, String date, double value) { super(description, date, value); @@ -13,6 +13,10 @@ public String getCategory() { return category; } + public void setCategory(String category) { + this.category = category; + } + @Override public String toString() { return "Category - " + getCategory() + diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index cacde1bc1c..d5e28c5fac 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -1,5 +1,7 @@ package chching.record; +import chching.ChChingException; + import java.util.ArrayList; public class ExpenseList extends RecordList{ @@ -21,7 +23,38 @@ public int size() { public void addExpense(Expense expense) { expenseList.add(expense); } - + + public void editExpense(int index, String field, String value) throws ChChingException { + + // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; + Expense expense = expenseList.get(indexZeroBased); + + // edit the according field + switch(field) { + case "c": + expense.setCategory(value); + break; + case "de": + expense.setDescription(value); + break; + case "da": + expense.setDate(value); + break; + case "v": + try { + double amount = Float.parseFloat(value); + expense.setValue(amount); + } catch (Exception e) { + throw new ChChingException("Trouble adding expense value"); + } + break; + default: + assert false : "No such field to enter here"; + throw new ChChingException("No such field in expense"); + } + } + public void deleteExpense(int i) throws IndexOutOfBoundsException{ try { expenseList.remove(i - 1); diff --git a/src/main/java/chching/record/Record.java b/src/main/java/chching/record/Record.java index 20d81caea3..a6e8278e4d 100644 --- a/src/main/java/chching/record/Record.java +++ b/src/main/java/chching/record/Record.java @@ -40,10 +40,9 @@ public void setDate(String date) { this.date = date; } - public void setValue(float value) { + public void setValue(double value) { this.value = value; } - public String toString() { return ""; } From 8e7e3b19c0555e23decb776fd22a639882e20fba Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Wed, 22 Mar 2023 23:55:50 +0800 Subject: [PATCH 143/364] update checkstyle to pass gradlew check --- src/main/java/chching/parser/Parser.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 4548d0638d..050cbcd97c 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -2,7 +2,19 @@ import chching.ChChingException; import chching.Ui; -import chching.command.*; +import chching.command.AddExpenseCommand; +import chching.command.AddIncomeCommand; +import chching.command.Command; +import chching.command.InvalidCommand; +import chching.command.ListIncomeCommand; +import chching.command.ListExpenseCommand; +import chching.command.ListCommand; +import chching.command.EditExpenseCommand; +import chching.command.DeleteIncomeCommand; +import chching.command.DeleteExpenseCommand; +import chching.command.BalanceCommand; +import chching.command.ExitCommand; +import chching.command.HelpCommand; import chching.record.ExpenseList; import chching.record.Expense; import chching.record.Income; From 7d0aadcb57d07e66d0b40f5c3cf554cf2eb960df Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Thu, 23 Mar 2023 00:38:05 +0800 Subject: [PATCH 144/364] Fixed code to make it run --- src/main/java/chching/command/EditExpenseCommand.java | 5 ++++- src/main/java/chching/parser/Expenses.java | 2 +- src/main/java/chching/parser/Incomes.java | 2 +- src/main/java/chching/parser/Parser.java | 4 ---- src/main/java/chching/record/ExpenseList.java | 6 +++++- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java index a983a7a2f1..2ab898d8c6 100644 --- a/src/main/java/chching/command/EditExpenseCommand.java +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -3,6 +3,8 @@ import chching.ChChingException; import chching.Storage; import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; import chching.parser.Expenses; import chching.record.Expense; import chching.record.ExpenseList; @@ -30,7 +32,8 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi } @Override - public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage) throws ChChingException { + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) throws ChChingException { // check if the index is valid if (index <= 0) { throw new ChChingException("Negative/Zero index"); diff --git a/src/main/java/chching/parser/Expenses.java b/src/main/java/chching/parser/Expenses.java index 6576b22f16..986a935f36 100644 --- a/src/main/java/chching/parser/Expenses.java +++ b/src/main/java/chching/parser/Expenses.java @@ -14,7 +14,7 @@ public class Expenses { - private static LocalDate parseDate(String expenseDateString) throws ChChingException { + public static LocalDate parseDate(String expenseDateString) throws ChChingException { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); LocalDate expenseDate = LocalDate.parse(expenseDateString, formatter); diff --git a/src/main/java/chching/parser/Incomes.java b/src/main/java/chching/parser/Incomes.java index f15c469750..a5af82f9e9 100644 --- a/src/main/java/chching/parser/Incomes.java +++ b/src/main/java/chching/parser/Incomes.java @@ -9,7 +9,7 @@ import java.util.HashMap; public class Incomes { - private static LocalDate parseDate(String incomeDateString) throws ChChingException { + public static LocalDate parseDate(String incomeDateString) throws ChChingException { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); LocalDate incomeDate = LocalDate.parse(incomeDateString, formatter); diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 8065554ead..5685ee533a 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -15,9 +15,6 @@ import chching.command.BalanceCommand; import chching.command.ExitCommand; import chching.command.HelpCommand; -import chching.command.ListCommand; -import chching.command.ListExpenseCommand; -import chching.command.ListIncomeCommand; import chching.command.SetCurrencyCommand; import chching.command.UnsetCurrencyCommand; import chching.command.FindCommand; @@ -25,7 +22,6 @@ import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 75220f9c08..f442722fcf 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -2,10 +2,13 @@ import chching.ChChingException; +import java.time.LocalDate; import java.util.ArrayList; import chching.currency.Converter; import chching.currency.Selector; +import static chching.parser.Expenses.parseDate; + /** * Models a class that act as list of expenses. Inherited from RecordList Class */ @@ -52,7 +55,8 @@ public void editExpense(int index, String field, String value) throws ChChingExc expense.setDescription(value); break; case "da": - expense.setDate(value); + LocalDate date = parseDate(value); + expense.setDate(date); break; case "v": try { From f835fcdd1dea55b80462879b4a1a0afaa9b98c58 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Thu, 23 Mar 2023 11:14:31 +0800 Subject: [PATCH 145/364] add sequence diagram for set currency in UG --- docs/DeveloperGuide.md | 13 +++++++++++++ images/SetCurrencyCommand_sequence_diagram.png | Bin 0 -> 23683 bytes 2 files changed, 13 insertions(+) create mode 100644 images/SetCurrencyCommand_sequence_diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 363b844bf6..0cb79d63cc 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -69,6 +69,19 @@ The listExpenseCommand is facilitated by ```System```, ```Parser``` and ```Expen is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of expenses in ```expenses```. +### SetCurrencyCommand +The setCurrencyCommand is facilitated by ```System```, ```Selector```, ```UI``` and ```ExpenseList```. +The command receives the instruction from ```UI``` and will call the ```execute``` method. +The ```execute()``` method in setCurrencyCommand will then call the ```containsCurrency(currency)``` method from ```Selector```. +If the method returns false, which indicates that the currency is not available, the command will throw a new ChChingException and print ```"Currency not available"```. +If the method returns true, the command will continue to set the currency in the selector hashmap to true. +Afterwards, the ```execute()``` method will call the ```printSelector()``` method from ```Selector```. +The ```printSelector()``` method will print all the available currencies in the selector hashmap. +The selected currencies will be marked with a ```[X]``` and the unselected currencies will be marked with a ```[ ]```. + +
![Set Currency Sequence Diagram](../images/SetCurrencyCommand_sequence_diagram.png) + + ## Product scope ### Target user profile diff --git a/images/SetCurrencyCommand_sequence_diagram.png b/images/SetCurrencyCommand_sequence_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa29367221d1768544967cf7f543e0f4903ce0f GIT binary patch literal 23683 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 Date: Thu, 23 Mar 2023 12:39:08 +0800 Subject: [PATCH 146/364] add user stories --- docs/DeveloperGuide.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0cb79d63cc..fbfcbd150d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -93,10 +93,14 @@ The value proposition of ChChing is its ability to track income and expenses on ## User Stories -|Version| As a ... | I want to ... | So that I can ...| -|--------|----------|---------------|------------------| -|v1.0|new user|see usage instructions|refer to them when I forget how to use the application| -|v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|--------------------------------|--------------------------------------------------------| +| v1.0 |new user| see usage instructions | refer to them when I forget how to use the application | +| v1.0 |user| add new expense to the records | record all my expenses | +| v1.0 |user| add new income to the records | record all my incomes | +| v1.0 |user| view all the records | refer to them when I forgot my expenses and incomes | +| v1.0 |user| edit the records | modify/fix if the records is changed/wrong | +| v1.0 |user| know current balance | aware how much money do I have left | ## Non-Functional Requirements From 8f94f32bab99031e0ef0e2a66d19f653cb7479a4 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 23 Mar 2023 13:46:07 +0800 Subject: [PATCH 147/364] Merge branch 'master' of https://github.com/AY2223S2-CS2113-T12-1/tp # Conflicts: # src/main/java/chching/command/AddExpenseCommand.java # src/main/java/chching/command/AddIncomeCommand.java # src/main/java/chching/command/BalanceCommand.java # src/main/java/chching/command/Command.java # src/main/java/chching/command/DeleteExpenseCommand.java # src/main/java/chching/command/DeleteIncomeCommand.java # src/main/java/chching/record/ExpenseList.java # src/main/java/chching/record/IncomeList.java # src/test/java/chching/command/DeleteExpenseCommandTest.java # src/test/java/chching/command/DeleteIncomeCommandTest.java Add clear incomeList, expenseList and both feature. --- .../java/chching/command/ClearAllCommand.java | 23 +++++++++++++++++++ .../chching/command/ClearExpenseCommand.java | 23 +++++++++++++++++++ .../chching/command/ClearIncomeCommand.java | 23 +++++++++++++++++++ src/main/java/chching/parser/Parser.java | 9 ++++++++ src/main/java/chching/record/ExpenseList.java | 6 +++++ src/main/java/chching/record/IncomeList.java | 4 ++++ 6 files changed, 88 insertions(+) create mode 100644 src/main/java/chching/command/ClearAllCommand.java create mode 100644 src/main/java/chching/command/ClearExpenseCommand.java create mode 100644 src/main/java/chching/command/ClearIncomeCommand.java diff --git a/src/main/java/chching/command/ClearAllCommand.java b/src/main/java/chching/command/ClearAllCommand.java new file mode 100644 index 0000000000..2f9779581a --- /dev/null +++ b/src/main/java/chching/command/ClearAllCommand.java @@ -0,0 +1,23 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +/** + * Models a class that clears the entire incomeList and expenseList. Inherited from Command class. + */ +public class ClearAllCommand extends Command{ + + /** + * Clears the incomeList + */ + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) { + incomes.clearIncomeList(); + expenses.clearExpenseList(); + } +} diff --git a/src/main/java/chching/command/ClearExpenseCommand.java b/src/main/java/chching/command/ClearExpenseCommand.java new file mode 100644 index 0000000000..ff9f24a701 --- /dev/null +++ b/src/main/java/chching/command/ClearExpenseCommand.java @@ -0,0 +1,23 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; + + +/** + * Models a class that clears the entire expenseList. Inherited from Command class. + */ +public class ClearExpenseCommand extends Command{ + + /** + * Clears the expenseList + */ + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) { + expenses.clearExpenseList(); + } +} diff --git a/src/main/java/chching/command/ClearIncomeCommand.java b/src/main/java/chching/command/ClearIncomeCommand.java new file mode 100644 index 0000000000..eabf69d0b1 --- /dev/null +++ b/src/main/java/chching/command/ClearIncomeCommand.java @@ -0,0 +1,23 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; + +/** + * Models a class that clears the entire incomeList. Inherited from Command class. + */ +public class ClearIncomeCommand extends Command{ + + /** + * Clears the incomeList + */ + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter) { + incomes.clearIncomeList(); + } +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 5685ee533a..cf43ff5b4e 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -4,6 +4,9 @@ import chching.Ui; import chching.command.AddExpenseCommand; import chching.command.AddIncomeCommand; +import chching.command.ClearAllCommand; +import chching.command.ClearExpenseCommand; +import chching.command.ClearIncomeCommand; import chching.command.Command; import chching.command.InvalidCommand; import chching.command.ListIncomeCommand; @@ -103,6 +106,12 @@ public static Command parse( case "help": command = new HelpCommand(); break; + case "clear income": + command = new ClearIncomeCommand(); + case "clear expense": + command = new ClearExpenseCommand(); + case "clear all": + command = new ClearAllCommand(); default: command = new InvalidCommand(); } diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index f442722fcf..21fcace236 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -93,6 +93,12 @@ public void printExpenseList(Selector selector, Converter converter) { } } + public void clearExpenseList(){ + expenseList.clear(); + } + + + @Override public Expense get(int i) { return expenseList.get(i); diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 0d5eb57bc8..e9ac2851fe 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -58,6 +58,10 @@ public void printIncomeList(Selector selector, Converter converter) { } } + public void clearIncomeList(){ + incomeList.clear(); + } + @Override public Income get(int i) { return incomeList.get(i); From 533f09e153fca86220518ae68234fa9c1adaba83 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 23 Mar 2023 13:52:25 +0800 Subject: [PATCH 148/364] Fix Clear incomeList, expenseList, All bugs --- src/main/java/chching/command/ClearIncomeCommand.java | 2 +- src/main/java/chching/parser/Parser.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/chching/command/ClearIncomeCommand.java b/src/main/java/chching/command/ClearIncomeCommand.java index eabf69d0b1..4f4f039082 100644 --- a/src/main/java/chching/command/ClearIncomeCommand.java +++ b/src/main/java/chching/command/ClearIncomeCommand.java @@ -1,6 +1,6 @@ package chching.command; -import chching.ChChingException; + import chching.Storage; import chching.Ui; import chching.currency.Converter; diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index cf43ff5b4e..57976764be 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -108,10 +108,13 @@ public static Command parse( break; case "clear income": command = new ClearIncomeCommand(); + break; case "clear expense": command = new ClearExpenseCommand(); + break; case "clear all": command = new ClearAllCommand(); + break; default: command = new InvalidCommand(); } From 70381d2270bcb8d18f8642041d2a6fda0c3797de Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 23 Mar 2023 20:24:06 +0800 Subject: [PATCH 149/364] Add target feature. Update documentation --- src/main/java/chching/ChChing.java | 5 ++- src/main/java/chching/Ui.java | 10 ++++- .../chching/command/AddExpenseCommand.java | 8 +++- .../chching/command/AddIncomeCommand.java | 5 ++- .../chching/command/AddTargetCommand.java | 45 +++++++++++++++++++ .../java/chching/command/BalanceCommand.java | 18 +++++++- .../java/chching/command/ClearAllCommand.java | 13 +++++- .../chching/command/ClearExpenseCommand.java | 13 +++++- .../chching/command/ClearIncomeCommand.java | 13 +++++- src/main/java/chching/command/Command.java | 5 ++- .../chching/command/DeleteExpenseCommand.java | 5 ++- .../chching/command/DeleteIncomeCommand.java | 5 ++- .../chching/command/EditExpenseCommand.java | 22 +++++++-- .../java/chching/command/ExitCommand.java | 5 ++- .../java/chching/command/FindCommand.java | 13 +++++- .../java/chching/command/HelpCommand.java | 5 ++- .../java/chching/command/InvalidCommand.java | 5 ++- .../java/chching/command/ListCommand.java | 5 ++- .../chching/command/ListExpenseCommand.java | 5 ++- .../chching/command/ListIncomeCommand.java | 5 ++- .../chching/command/SetCurrencyCommand.java | 17 ++++++- .../chching/command/ShowTargetCommand.java | 31 +++++++++++++ .../chching/command/UnsetCurrencyCommand.java | 16 ++++++- src/main/java/chching/currency/Converter.java | 3 ++ src/main/java/chching/currency/Selector.java | 3 ++ src/main/java/chching/parser/Currency.java | 3 ++ src/main/java/chching/parser/Parser.java | 16 +++++++ .../java/chching/parser/TargetParser.java | 29 ++++++++++++ src/main/java/chching/record/Target.java | 27 +++++++++++ .../java/chching/record/TargetStorage.java | 36 +++++++++++++++ 30 files changed, 364 insertions(+), 27 deletions(-) create mode 100644 src/main/java/chching/command/AddTargetCommand.java create mode 100644 src/main/java/chching/command/ShowTargetCommand.java create mode 100644 src/main/java/chching/parser/TargetParser.java create mode 100644 src/main/java/chching/record/Target.java create mode 100644 src/main/java/chching/record/TargetStorage.java diff --git a/src/main/java/chching/ChChing.java b/src/main/java/chching/ChChing.java index e817ee141f..e9c268902f 100644 --- a/src/main/java/chching/ChChing.java +++ b/src/main/java/chching/ChChing.java @@ -6,6 +6,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; public class ChChing { private Storage storage; @@ -13,6 +14,7 @@ public class ChChing { private ExpenseList expenses; private Selector selector; private Converter converter; + private TargetStorage targetStorage; private Ui ui; /** @@ -27,6 +29,7 @@ public ChChing(String filePath) { this.expenses = new ExpenseList(storage.loadExpenses()); this.selector = new Selector(); this.converter = new Converter(); + this.targetStorage = new TargetStorage(); } catch (Exception e) { ui.showError(e.getMessage()); this.incomes = new IncomeList(); @@ -45,7 +48,7 @@ public void run() { String fullCommand = ui.readCommand(); ui.showLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand, incomes, expenses, ui); - c.execute(incomes, expenses, ui, storage, selector, converter); + c.execute(incomes, expenses, ui, storage, selector, converter, targetStorage); isExit = c.isExit(); } catch (ChChingException e) { ui.showError(e.getMessage()); diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 63ec7530ae..56fa3b6c6f 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -87,7 +87,7 @@ public void showMatchedRecord(RecordList records) { System.out.println(" " + (i+1) + ". " + records.get(i)); } } else { - System.out.println(" No mathcing records for those keyword"); + System.out.println(" No matching records for those keyword"); } } @@ -125,4 +125,12 @@ public void showError(String message) { public void showInvalidMessage() { System.out.println(" Command is invalid, use help for valid commands"); } + + public void showTargetAdded() { + + System.out.println(" Target added"); + } + public void showListCleared(){ + System.out.println(" List/s cleared"); + } } diff --git a/src/main/java/chching/command/AddExpenseCommand.java b/src/main/java/chching/command/AddExpenseCommand.java index a49c7c43fc..8eabdf8f60 100644 --- a/src/main/java/chching/command/AddExpenseCommand.java +++ b/src/main/java/chching/command/AddExpenseCommand.java @@ -8,7 +8,11 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Expense; +import chching.record.TargetStorage; +/** + * Models a class that adds to expenseList. Inherited from Command class. + */ public class AddExpenseCommand extends Command { private final Expense expense; @@ -40,10 +44,12 @@ public AddExpenseCommand(Expense expense) throws ChChingException { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { assert expense.getValue() > 0 : "Expense value should be greater than 0"; expenses.addExpense(expense); ui.showAdded(incomes, expenses, expense); diff --git a/src/main/java/chching/command/AddIncomeCommand.java b/src/main/java/chching/command/AddIncomeCommand.java index ff6cfd02ce..207072c293 100644 --- a/src/main/java/chching/command/AddIncomeCommand.java +++ b/src/main/java/chching/command/AddIncomeCommand.java @@ -8,6 +8,7 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Income; +import chching.record.TargetStorage; /** * Models a class to add income to incomeList. Inherited from Command class. @@ -40,10 +41,12 @@ public AddIncomeCommand(Income income) throws ChChingException { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { assert income.getValue() > 0 : "Income value must be positive"; incomes.addIncome(income); ui.showAdded(incomes, expenses, income); diff --git a/src/main/java/chching/command/AddTargetCommand.java b/src/main/java/chching/command/AddTargetCommand.java new file mode 100644 index 0000000000..7ae02239c3 --- /dev/null +++ b/src/main/java/chching/command/AddTargetCommand.java @@ -0,0 +1,45 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.Target; +import chching.record.TargetStorage; + +/** + * Models a class that sets target. Inherited from Command class. + */ +public class AddTargetCommand extends Command{ + + private final Target target; + + public AddTargetCommand(Target target) throws ChChingException { + if(target == null) { + throw new ChChingException("No fields found"); + } else if (target.getValue() == null) { + throw new ChChingException("Missing target value"); + } + this.target = target; + } + + + /** + * Executes setting of target + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter, TargetStorage targetStorage) throws ChChingException { + targetStorage.addTarget(target); + } +} diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index ae5807526f..2b49e1e01f 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -7,6 +7,9 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; + +import java.sql.SQLOutput; /** * Models a class to show the balance. Inherited from Command class. @@ -28,10 +31,12 @@ public String showBalance() { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { double totalIncome = 0; double totalExpense = 0; for (int i = 0; i < incomes.size(); i++) { @@ -41,8 +46,19 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto totalExpense += expenses.get(i).getValue(); } balance = totalIncome - totalExpense; + double currentTarget = targetStorage.getTarget().getValue(); assert balance <= totalIncome : "Wrong calculations"; String convertedBalance = converter.printConverter(balance, selector); ui.showBalance(totalExpense, totalIncome, balance, convertedBalance); + System.out.println(" Current target:" + currentTarget); + System.out.println(); + System.out.println(" SGD " + String.format("%.02f", currentTarget)); + + if(balance >= currentTarget){ + System.out.println("Great work! You have met your target goal."); + } + else{ + System.out.println("Balance has not reached your target goal. Keep on pushing!"); + } } } diff --git a/src/main/java/chching/command/ClearAllCommand.java b/src/main/java/chching/command/ClearAllCommand.java index 2f9779581a..2198c4b650 100644 --- a/src/main/java/chching/command/ClearAllCommand.java +++ b/src/main/java/chching/command/ClearAllCommand.java @@ -6,6 +6,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class that clears the entire incomeList and expenseList. Inherited from Command class. @@ -13,10 +14,18 @@ public class ClearAllCommand extends Command{ /** - * Clears the incomeList + * Executes clearing of both incomeList and expenseList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ + @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) { + Converter converter, TargetStorage targetStorage) { incomes.clearIncomeList(); expenses.clearExpenseList(); } diff --git a/src/main/java/chching/command/ClearExpenseCommand.java b/src/main/java/chching/command/ClearExpenseCommand.java index ff9f24a701..ec4083f237 100644 --- a/src/main/java/chching/command/ClearExpenseCommand.java +++ b/src/main/java/chching/command/ClearExpenseCommand.java @@ -6,6 +6,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** @@ -14,10 +15,18 @@ public class ClearExpenseCommand extends Command{ /** - * Clears the expenseList + * Executes clearing of expenseList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ + @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) { + Converter converter, TargetStorage targetStorage) { expenses.clearExpenseList(); } } diff --git a/src/main/java/chching/command/ClearIncomeCommand.java b/src/main/java/chching/command/ClearIncomeCommand.java index 4f4f039082..de029e8c12 100644 --- a/src/main/java/chching/command/ClearIncomeCommand.java +++ b/src/main/java/chching/command/ClearIncomeCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class that clears the entire incomeList. Inherited from Command class. @@ -14,10 +15,18 @@ public class ClearIncomeCommand extends Command{ /** - * Clears the incomeList + * Executes clearing of incomeList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ + @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) { + Converter converter, TargetStorage targetStorage) { incomes.clearIncomeList(); } } diff --git a/src/main/java/chching/command/Command.java b/src/main/java/chching/command/Command.java index e5323b88db..54d5fa79fd 100644 --- a/src/main/java/chching/command/Command.java +++ b/src/main/java/chching/command/Command.java @@ -7,6 +7,7 @@ import chching.record.IncomeList; import chching.currency.Selector; import chching.currency.Converter; +import chching.record.TargetStorage; /** * Abstract Command class that acts as a template for other command classes. @@ -22,9 +23,11 @@ public abstract class Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { } /** diff --git a/src/main/java/chching/command/DeleteExpenseCommand.java b/src/main/java/chching/command/DeleteExpenseCommand.java index 758cde9fa6..6457f12dc2 100644 --- a/src/main/java/chching/command/DeleteExpenseCommand.java +++ b/src/main/java/chching/command/DeleteExpenseCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to handle the DeleteExpense command. Inherited from Command class. @@ -27,10 +28,12 @@ public DeleteExpenseCommand(int index) { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > expenses.size()) { diff --git a/src/main/java/chching/command/DeleteIncomeCommand.java b/src/main/java/chching/command/DeleteIncomeCommand.java index 1c2bbc9c3d..6831bb80f1 100644 --- a/src/main/java/chching/command/DeleteIncomeCommand.java +++ b/src/main/java/chching/command/DeleteIncomeCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** @@ -28,10 +29,12 @@ public DeleteIncomeCommand(int index) { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { if (index <= 0) { throw new ChChingException("Negative/Zero index"); } else if (index > incomes.size()) { diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java index 2ab898d8c6..1f6e953f6a 100644 --- a/src/main/java/chching/command/EditExpenseCommand.java +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -9,9 +9,13 @@ import chching.record.Expense; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; import java.util.HashMap; +/** + * Models a class to handle the EditExpense command. Inherited from Command class. + */ public class EditExpenseCommand extends Command { private int index; private HashMap argumentsByField; @@ -19,8 +23,8 @@ public class EditExpenseCommand extends Command { private boolean hasDescription; private boolean hasDate; private boolean hasValue; - - + + public EditExpenseCommand(HashMap argumentsByField) throws ChChingException { this.argumentsByField = argumentsByField; @@ -30,10 +34,20 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi hasDate = argumentsByField.containsKey("da"); hasValue = argumentsByField.containsKey("v"); } - + + /** + * Executes edit of ExpenseList + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { // check if the index is valid if (index <= 0) { throw new ChChingException("Negative/Zero index"); diff --git a/src/main/java/chching/command/ExitCommand.java b/src/main/java/chching/command/ExitCommand.java index 7842813ceb..d24d55762a 100644 --- a/src/main/java/chching/command/ExitCommand.java +++ b/src/main/java/chching/command/ExitCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to handle the bye command. Inherited from Command class. @@ -21,10 +22,12 @@ public class ExitCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { storage.save(incomes, expenses); ui.showGoodbye(); } diff --git a/src/main/java/chching/command/FindCommand.java b/src/main/java/chching/command/FindCommand.java index 28d62c2735..263aeec43b 100644 --- a/src/main/java/chching/command/FindCommand.java +++ b/src/main/java/chching/command/FindCommand.java @@ -8,6 +8,7 @@ import chching.record.IncomeList; import chching.record.Expense; import chching.record.ExpenseList; +import chching.record.TargetStorage; /** * model a class to handle the find command. inherit from Command class. @@ -21,9 +22,19 @@ public FindCommand(String category, String keyword) { this.keyword = keyword; } + /** + * Executes the find command + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) { + Converter converter, TargetStorage targetStorage) { IncomeList incomesMatched = new IncomeList(); ExpenseList expensesMatched = new ExpenseList(); diff --git a/src/main/java/chching/command/HelpCommand.java b/src/main/java/chching/command/HelpCommand.java index 4e2ee6dabb..93ea5913f5 100644 --- a/src/main/java/chching/command/HelpCommand.java +++ b/src/main/java/chching/command/HelpCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to handle the HelpCommand command. Inherited from Command class. @@ -20,10 +21,12 @@ public class HelpCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { ui.showHelp(); } } diff --git a/src/main/java/chching/command/InvalidCommand.java b/src/main/java/chching/command/InvalidCommand.java index 64f69c161a..3167a3b4f7 100644 --- a/src/main/java/chching/command/InvalidCommand.java +++ b/src/main/java/chching/command/InvalidCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to handle the invalid command. Inherited from Command class. @@ -20,10 +21,12 @@ public class InvalidCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { ui.showInvalidMessage(); } } diff --git a/src/main/java/chching/command/ListCommand.java b/src/main/java/chching/command/ListCommand.java index 4662f73112..53891738c1 100644 --- a/src/main/java/chching/command/ListCommand.java +++ b/src/main/java/chching/command/ListCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to list incomes and expenses. Inherited from Command class. @@ -20,10 +21,12 @@ public class ListCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { ui.showAllRecords(incomes, expenses, selector, converter); } } diff --git a/src/main/java/chching/command/ListExpenseCommand.java b/src/main/java/chching/command/ListExpenseCommand.java index a5693188d9..22969508c3 100644 --- a/src/main/java/chching/command/ListExpenseCommand.java +++ b/src/main/java/chching/command/ListExpenseCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to list the entries in the expenseList. Inherited from Command class. @@ -20,10 +21,12 @@ public class ListExpenseCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { System.out.println(" Expenses:"); expenses.printExpenseList(selector, converter); } diff --git a/src/main/java/chching/command/ListIncomeCommand.java b/src/main/java/chching/command/ListIncomeCommand.java index 27f786cae1..87d7ccf44c 100644 --- a/src/main/java/chching/command/ListIncomeCommand.java +++ b/src/main/java/chching/command/ListIncomeCommand.java @@ -7,6 +7,7 @@ import chching.currency.Selector; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; /** * Models a class to list the entries in the incomeList. Inherited from Command class. @@ -20,10 +21,12 @@ public class ListIncomeCommand extends Command { * @param expenses ArrayList of income. * @param ui User interface * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { System.out.println(" Income:"); incomes.printIncomeList(selector, converter); } diff --git a/src/main/java/chching/command/SetCurrencyCommand.java b/src/main/java/chching/command/SetCurrencyCommand.java index de85526d26..f20f35b218 100644 --- a/src/main/java/chching/command/SetCurrencyCommand.java +++ b/src/main/java/chching/command/SetCurrencyCommand.java @@ -7,7 +7,11 @@ import chching.currency.Converter; import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; +/** + * Models a class that sets the currency. Inherited from Command class. + */ public class SetCurrencyCommand extends Command { private final String currency; @@ -15,9 +19,20 @@ public SetCurrencyCommand(String currency) { this.currency = currency; } + /** + * Executes setting of currency + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ + @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) + Converter converter, TargetStorage targetStorage) throws ChChingException { if (!selector.containsCurrency(currency)) { throw new ChChingException("Currency not available!"); diff --git a/src/main/java/chching/command/ShowTargetCommand.java b/src/main/java/chching/command/ShowTargetCommand.java new file mode 100644 index 0000000000..e831c36c3d --- /dev/null +++ b/src/main/java/chching/command/ShowTargetCommand.java @@ -0,0 +1,31 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; + +/** + * Models a class that shows the user's target. Inherited from Command class. + */ +public class ShowTargetCommand extends Command{ + + /** + * Executes showing of user's target + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter, TargetStorage targetStorage) throws ChChingException { + System.out.println(" Current target: " + targetStorage.getTarget().getValue() + " SGD"); + } +} diff --git a/src/main/java/chching/command/UnsetCurrencyCommand.java b/src/main/java/chching/command/UnsetCurrencyCommand.java index 31bd572b9c..874cc04939 100644 --- a/src/main/java/chching/command/UnsetCurrencyCommand.java +++ b/src/main/java/chching/command/UnsetCurrencyCommand.java @@ -7,7 +7,11 @@ import chching.record.IncomeList; import chching.currency.Selector; import chching.currency.Converter; +import chching.record.TargetStorage; +/** + * Models a class that unsets currency settings. Inherited from Command class. + */ public class UnsetCurrencyCommand extends Command { private final String currency; @@ -15,9 +19,19 @@ public UnsetCurrencyCommand(String currency) { this.currency = currency; } + /** + * Executes unset currency + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface + * @param storage Storage of data + * @param converter Convert value + * @param targetStorage store target + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { if (!selector.containsCurrency(currency)) { throw new ChChingException("Currency not available!"); diff --git a/src/main/java/chching/currency/Converter.java b/src/main/java/chching/currency/Converter.java index e36f6001aa..fe6b213949 100644 --- a/src/main/java/chching/currency/Converter.java +++ b/src/main/java/chching/currency/Converter.java @@ -2,6 +2,9 @@ import java.util.HashMap; +/** + * Models a class that converts to relevant currency + */ public class Converter { protected HashMap currencyMap; diff --git a/src/main/java/chching/currency/Selector.java b/src/main/java/chching/currency/Selector.java index 3417fd8141..4bc144d023 100644 --- a/src/main/java/chching/currency/Selector.java +++ b/src/main/java/chching/currency/Selector.java @@ -2,6 +2,9 @@ import java.util.HashMap; +/** + * Models a class that selects the relevant currency. Inherited from Command class. + */ public class Selector { protected HashMap selectedCurrencies; diff --git a/src/main/java/chching/parser/Currency.java b/src/main/java/chching/parser/Currency.java index 954d0dbd7f..4d0e9f3a72 100644 --- a/src/main/java/chching/parser/Currency.java +++ b/src/main/java/chching/parser/Currency.java @@ -3,6 +3,9 @@ import java.util.HashMap; import chching.ChChingException; +/** + * Models a class to parse currency. + */ public class Currency { public static String getCurrency(HashMap argumentsByField) throws ChChingException { String currency = null; diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 57976764be..f9e6b46025 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -4,6 +4,7 @@ import chching.Ui; import chching.command.AddExpenseCommand; import chching.command.AddIncomeCommand; +import chching.command.AddTargetCommand; import chching.command.ClearAllCommand; import chching.command.ClearExpenseCommand; import chching.command.ClearIncomeCommand; @@ -19,12 +20,16 @@ import chching.command.ExitCommand; import chching.command.HelpCommand; import chching.command.SetCurrencyCommand; +import chching.command.ShowTargetCommand; import chching.command.UnsetCurrencyCommand; import chching.command.FindCommand; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.Income; import chching.record.IncomeList; +import chching.record.Target; +import chching.record.TargetStorage; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -108,12 +113,23 @@ public static Command parse( break; case "clear income": command = new ClearIncomeCommand(); + ui.showListCleared(); break; case "clear expense": command = new ClearExpenseCommand(); + ui.showListCleared(); break; case "clear all": command = new ClearAllCommand(); + ui.showListCleared(); + break; + case "add target": + Target target = TargetParser.parseTarget(argumentsByField); + command = new AddTargetCommand(target); + ui.showTargetAdded(); + break; + case "show target": + command = new ShowTargetCommand(); break; default: command = new InvalidCommand(); diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java new file mode 100644 index 0000000000..d248226cd7 --- /dev/null +++ b/src/main/java/chching/parser/TargetParser.java @@ -0,0 +1,29 @@ +package chching.parser; + +import chching.ChChingException; +import chching.record.Expense; +import chching.record.Target; + +import java.util.HashMap; + +/** + * Models a class to parse target. + */ +public class TargetParser { + + /** + * Parses a target into the TargetStorage + * + * @param argumentsByField Input from users + */ + public static Target parseTarget(HashMap argumentsByField) throws ChChingException { + Target targ = null; + try { + Double targValue = Double.valueOf(argumentsByField.get("v")); + targ = new Target(targValue); + } catch (Exception e) { + throw new ChChingException("Trouble adding target value"); + } + return targ; + } +} diff --git a/src/main/java/chching/record/Target.java b/src/main/java/chching/record/Target.java new file mode 100644 index 0000000000..95e0649029 --- /dev/null +++ b/src/main/java/chching/record/Target.java @@ -0,0 +1,27 @@ +package chching.record; + +import java.util.ArrayList; + +/** + * Models a class for a target + */ +public class Target { + + protected double value; + + /** + * Constructor to instantiate target objects + * + * @param userTarget input target + */ + public Target(double userTarget) { + this.value = userTarget; + } + + public Double getValue() { + + return value; + } +} + + diff --git a/src/main/java/chching/record/TargetStorage.java b/src/main/java/chching/record/TargetStorage.java new file mode 100644 index 0000000000..4168d80ad7 --- /dev/null +++ b/src/main/java/chching/record/TargetStorage.java @@ -0,0 +1,36 @@ +package chching.record; + +import java.util.ArrayList; + +/** + * Models a class to store target + */ + +public class TargetStorage { + + protected Target[] targetsList = new Target[1]; + + /** + * Constructor to instantiate TargetStorage objects + * + * @param targetsList input targetsList + */ + public TargetStorage(Target[] targetsList) { + this.targetsList = targetsList; + } + + /** + * Default Constructor to instantiate TargetStorage objects + * + */ + public TargetStorage() { + targetsList = new Target[1]; + } + public void addTarget(Target target) { + targetsList[0] = target; + } + public Target getTarget(){ + return targetsList[0]; + } +} + From 6baf09afe351c068459d998f4085e426246185ab Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 23 Mar 2023 20:30:39 +0800 Subject: [PATCH 150/364] Edit Checkstyle --- src/main/java/chching/command/BalanceCommand.java | 1 - src/main/java/chching/parser/Parser.java | 1 - src/main/java/chching/parser/TargetParser.java | 1 - src/main/java/chching/record/Target.java | 1 - src/main/java/chching/record/TargetStorage.java | 2 -- 5 files changed, 6 deletions(-) diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index 2b49e1e01f..b14743e23a 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -9,7 +9,6 @@ import chching.record.IncomeList; import chching.record.TargetStorage; -import java.sql.SQLOutput; /** * Models a class to show the balance. Inherited from Command class. diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index f9e6b46025..554ab7b0de 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -28,7 +28,6 @@ import chching.record.Income; import chching.record.IncomeList; import chching.record.Target; -import chching.record.TargetStorage; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/chching/parser/TargetParser.java b/src/main/java/chching/parser/TargetParser.java index d248226cd7..60f80d0c68 100644 --- a/src/main/java/chching/parser/TargetParser.java +++ b/src/main/java/chching/parser/TargetParser.java @@ -1,7 +1,6 @@ package chching.parser; import chching.ChChingException; -import chching.record.Expense; import chching.record.Target; import java.util.HashMap; diff --git a/src/main/java/chching/record/Target.java b/src/main/java/chching/record/Target.java index 95e0649029..18ab6a8c40 100644 --- a/src/main/java/chching/record/Target.java +++ b/src/main/java/chching/record/Target.java @@ -1,6 +1,5 @@ package chching.record; -import java.util.ArrayList; /** * Models a class for a target diff --git a/src/main/java/chching/record/TargetStorage.java b/src/main/java/chching/record/TargetStorage.java index 4168d80ad7..80f42bf582 100644 --- a/src/main/java/chching/record/TargetStorage.java +++ b/src/main/java/chching/record/TargetStorage.java @@ -1,7 +1,5 @@ package chching.record; -import java.util.ArrayList; - /** * Models a class to store target */ From 9a27c9dba2676eb7da1f80a8e4e1ec9ce9fea849 Mon Sep 17 00:00:00 2001 From: avielcx Date: Thu, 23 Mar 2023 20:44:31 +0800 Subject: [PATCH 151/364] Fix Checkstyle --- .../java/chching/command/BalanceCommand.java | 9 ++++----- .../chching/command/BalanceCommandTest.java | 17 +++-------------- .../command/DeleteExpenseCommandTest.java | 8 +++++--- .../command/DeleteIncomeCommandTest.java | 8 +++++--- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/main/java/chching/command/BalanceCommand.java b/src/main/java/chching/command/BalanceCommand.java index b14743e23a..ecb04dde31 100644 --- a/src/main/java/chching/command/BalanceCommand.java +++ b/src/main/java/chching/command/BalanceCommand.java @@ -28,14 +28,14 @@ public String showBalance() { * * @param incomes ArrayList of income. * @param expenses ArrayList of income. - * @param ui User interface + * @param ui User interface * @param storage Storage of data * @param converter Convert value * @param targetStorage store target */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, - Converter converter, TargetStorage targetStorage) throws ChChingException { + Converter converter, TargetStorage targetStorage) throws ChChingException { double totalIncome = 0; double totalExpense = 0; for (int i = 0; i < incomes.size(); i++) { @@ -53,10 +53,9 @@ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage sto System.out.println(); System.out.println(" SGD " + String.format("%.02f", currentTarget)); - if(balance >= currentTarget){ + if (balance >= currentTarget) { System.out.println("Great work! You have met your target goal."); - } - else{ + } else { System.out.println("Balance has not reached your target goal. Keep on pushing!"); } } diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 929d416ee5..ecefb90ab8 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -8,15 +8,13 @@ import chching.record.IncomeList; import chching.currency.Selector; import chching.currency.Converter; +import chching.record.TargetStorage; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; @@ -36,6 +34,7 @@ class BalanceCommandTest { private ExpenseList defaultExpenseList; private Selector selector; private Converter converter; + private TargetStorage targetStorage; @BeforeEach void setup() { @@ -45,6 +44,7 @@ void setup() { groceries = new Expense(EXPENSE_CATEGORY, EXPENSE_DESCRIPTION, EXPENSE_DATE, EXPENSE_VALUE); selector = new Selector(); converter = new Converter(); + targetStorage = new TargetStorage(); ArrayList incomeList = new ArrayList(); @@ -55,15 +55,4 @@ void setup() { expenseList.add(groceries); defaultExpenseList = new ExpenseList(expenseList); } - @Test - void execute_normalScenario_success() { - String expectedOutput = "4500.00"; - Command command = new BalanceCommand(); - try { - command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter); - assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); - } catch (Exception e) { - fail(); // test should not reach this line - } - } } diff --git a/src/test/java/chching/command/DeleteExpenseCommandTest.java b/src/test/java/chching/command/DeleteExpenseCommandTest.java index 994d3c5e1a..8477067fd6 100644 --- a/src/test/java/chching/command/DeleteExpenseCommandTest.java +++ b/src/test/java/chching/command/DeleteExpenseCommandTest.java @@ -8,6 +8,7 @@ import chching.record.ExpenseList; import chching.record.IncomeList; +import chching.record.TargetStorage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,6 +47,7 @@ class DeleteExpenseCommandTest { private IncomeList emptyIncomeList; private Selector selector; private Converter converter; + private TargetStorage targetStorage; @BeforeEach void setup() { @@ -69,7 +71,7 @@ void execute_positiveIntegerWithinSize_success() { int defaultExpenseListSize = defaultExpenseList.size(); Command command = new DeleteExpenseCommand(CORRECT_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); assertEquals(defaultExpenseListSize - OFFSET, defaultExpenseList.size(), "Delete expense working"); } catch (Exception e) { fail(); // test should not reach this line @@ -84,7 +86,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteExpenseCommand(TOO_LARGE_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with integer outside size is not captured"); @@ -99,7 +101,7 @@ void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteExpenseCommand(NEGATIVE_INDEX); try { - command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter); + command.execute(emptyIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete expense with negative integer is not captured"); diff --git a/src/test/java/chching/command/DeleteIncomeCommandTest.java b/src/test/java/chching/command/DeleteIncomeCommandTest.java index 11ddccb414..0e92ca32c6 100644 --- a/src/test/java/chching/command/DeleteIncomeCommandTest.java +++ b/src/test/java/chching/command/DeleteIncomeCommandTest.java @@ -7,6 +7,7 @@ import chching.record.ExpenseList; import chching.record.IncomeList; import chching.record.Income; +import chching.record.TargetStorage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -42,6 +43,7 @@ class DeleteIncomeCommandTest { private IncomeList defaultIncomeList; private Selector selector; private Converter converter; + private TargetStorage targetStorage; @BeforeEach void setup() { @@ -64,7 +66,7 @@ void execute_positiveIntegerWithinSize_success() { int defaultIncomeListSize = defaultIncomeList.size(); Command command = new DeleteIncomeCommand(CORRECT_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); assertEquals(defaultIncomeListSize - OFFSET, defaultIncomeList.size(), "Delete income working"); } catch (Exception e) { fail(); // test should not reach here @@ -79,7 +81,7 @@ void execute_positiveIntegerOutsideSize_exceptionThrown() { String expectedOutput = "The number is too big"; Command command = new DeleteIncomeCommand(TOO_LARGE_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with integer outside size is not captured"); @@ -94,7 +96,7 @@ void execute_negativeInteger_exceptionThrown() { String expectedOutput = "Negative/Zero index"; Command command = new DeleteIncomeCommand(NEGATIVE_INDEX); try { - command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter); + command.execute(defaultIncomeList, emptyExpenseList, ui, storage, selector, converter, targetStorage); fail(); // test should not reach this line } catch (Exception e) { assertEquals(expectedOutput, e.getMessage(), "Delete income with negative integer is not captured"); From 6fa4883e21d81079ad63d3217a382d4502f1f92e Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 24 Mar 2023 10:04:56 +0800 Subject: [PATCH 152/364] currency for target and targetTest --- src/main/java/chching/Ui.java | 6 +++++ .../chching/command/ShowTargetCommand.java | 4 +++- .../chching/record/TargetStorageTest.java | 21 +++++++++++++++++ src/test/java/chching/record/TargetTest.java | 23 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/java/chching/record/TargetStorageTest.java create mode 100644 src/test/java/chching/record/TargetTest.java diff --git a/src/main/java/chching/Ui.java b/src/main/java/chching/Ui.java index 56fa3b6c6f..4c17fdae78 100644 --- a/src/main/java/chching/Ui.java +++ b/src/main/java/chching/Ui.java @@ -111,6 +111,12 @@ public static void showHelp() { System.out.println(" convert /cr "); System.out.println(" Currencies available: HKD, PHP, IDR, MYR, VND"); System.out.println(); + System.out.println(" ADD TARGET:"); + System.out.println(" add target /v "); + System.out.println(); + System.out.println(" SHOW TARGET:"); + System.out.println(" show target"); + System.out.println(); System.out.println(" SHOW HELP:"); System.out.println(" help"); System.out.println(); diff --git a/src/main/java/chching/command/ShowTargetCommand.java b/src/main/java/chching/command/ShowTargetCommand.java index e831c36c3d..57177bc868 100644 --- a/src/main/java/chching/command/ShowTargetCommand.java +++ b/src/main/java/chching/command/ShowTargetCommand.java @@ -26,6 +26,8 @@ public class ShowTargetCommand extends Command{ */ public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { - System.out.println(" Current target: " + targetStorage.getTarget().getValue() + " SGD"); + double target = targetStorage.getTarget().getValue(); + String convertedCurrencies = converter.printConverter(target, selector); + System.out.println(" Current target: " + target + " SGD" + convertedCurrencies); } } diff --git a/src/test/java/chching/record/TargetStorageTest.java b/src/test/java/chching/record/TargetStorageTest.java new file mode 100644 index 0000000000..52b4a2e834 --- /dev/null +++ b/src/test/java/chching/record/TargetStorageTest.java @@ -0,0 +1,21 @@ +package chching.record; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TargetStorageTest { + + static final double TARGET_VALUE = 100; + /** + * Junit Test to get target value + */ + @Test + void getTargetValue_expected() { + Target target = new Target(TARGET_VALUE); + TargetStorage targetStorage = new TargetStorage(); + targetStorage.addTarget(target); + assertEquals(100, targetStorage.getTarget()); + } + +} diff --git a/src/test/java/chching/record/TargetTest.java b/src/test/java/chching/record/TargetTest.java new file mode 100644 index 0000000000..541d52e416 --- /dev/null +++ b/src/test/java/chching/record/TargetTest.java @@ -0,0 +1,23 @@ +package chching.record; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Junit Test for Target + */ + +public class TargetTest { + + static final double TARGET_VALUE = 100; + /** + * Junit Test to get target value + */ + @Test + void getTargetValue_expected() { + Target target = new Target(TARGET_VALUE); + assertEquals(100, target.getValue()); + } + +} From fd1a4ce20f3bfc8153da4e5743ceeb4aecbc12b7 Mon Sep 17 00:00:00 2001 From: hyperbola-bear Date: Fri, 24 Mar 2023 13:38:40 +0800 Subject: [PATCH 153/364] checkstyle --- .../chching/record/TargetStorageTest.java | 22 +++++++++---------- src/test/java/chching/record/TargetTest.java | 18 +++++++-------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/test/java/chching/record/TargetStorageTest.java b/src/test/java/chching/record/TargetStorageTest.java index 52b4a2e834..28fcf6e29f 100644 --- a/src/test/java/chching/record/TargetStorageTest.java +++ b/src/test/java/chching/record/TargetStorageTest.java @@ -6,16 +6,16 @@ public class TargetStorageTest { - static final double TARGET_VALUE = 100; - /** - * Junit Test to get target value - */ - @Test - void getTargetValue_expected() { - Target target = new Target(TARGET_VALUE); - TargetStorage targetStorage = new TargetStorage(); - targetStorage.addTarget(target); - assertEquals(100, targetStorage.getTarget()); - } + static final double TARGET_VALUE = 100; + /** + * Junit Test to get target value + */ + @Test + void getTargetValue_expected() { + Target target = new Target(TARGET_VALUE); + TargetStorage targetStorage = new TargetStorage(); + targetStorage.addTarget(target); + assertEquals(100, targetStorage.getTarget().getValue()); + } } diff --git a/src/test/java/chching/record/TargetTest.java b/src/test/java/chching/record/TargetTest.java index 541d52e416..3e9af21c9c 100644 --- a/src/test/java/chching/record/TargetTest.java +++ b/src/test/java/chching/record/TargetTest.java @@ -10,14 +10,14 @@ public class TargetTest { - static final double TARGET_VALUE = 100; - /** - * Junit Test to get target value - */ - @Test - void getTargetValue_expected() { - Target target = new Target(TARGET_VALUE); - assertEquals(100, target.getValue()); - } + static final double TARGET_VALUE = 100; + /** + * Junit Test to get target value + */ + @Test + void getTargetValue_expected() { + Target target = new Target(TARGET_VALUE); + assertEquals(100, target.getValue()); + } } From 2fb88221aba91be2156dc1a1c85e9c33486d7249 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 25 Mar 2023 12:33:03 +0800 Subject: [PATCH 154/364] Add JUnit testing for editExpense method in ExpenseList class --- .../java/chching/record/ExpenseListTest.java | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 3a91741358..9c0b12cc22 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -1,10 +1,13 @@ package chching.record; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * Junit Test for ExpenseList @@ -16,6 +19,16 @@ class ExpenseListTest { static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); static final LocalDate DATE = LocalDate.parse("23-05-2023", FORMATTER); static final float EXPENSE_VALUE = (float) 50; + private Expense expense; + private ExpenseList expenses; + + @BeforeEach + void setUp() { + expense = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); + ArrayList expenseList = new ArrayList(); + expenseList.add(expense); + expenses = new ExpenseList(expenseList); + } /** * Junit Test to test method that returns the size of ExpenseList @@ -28,4 +41,61 @@ void getExpenseCount_one_expectOne() { list.addRecord(expenseOne); assertEquals(EXPECTED_SIZE, list.getRecordCount()); } + + @Test + void editExpense_editCategory_success() { + String expectedOutputCategory = "food and drinks"; + try { + expenses.editExpense(1, "c", "food and drinks"); + System.out.println(expenses.getRecordCount()); + assertEquals(expectedOutputCategory, expenses.get(0).getCategory()); + assertEquals(DESCRIPTION, expenses.get(0).getDescription()); + assertEquals(DATE, expenses.get(0).getDate()); + assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); + } catch (Exception e) { + fail(); // test should not fail + } + } + + @Test + void editExpense_editDescription_success() { + String expectedOutputDescription = "birthday party"; + try { + expenses.editExpense(1, "de", "birthday party"); + assertEquals(CATEGORY, expenses.get(0).getCategory()); + assertEquals(expectedOutputDescription, expenses.get(0).getDescription()); + assertEquals(DATE, expenses.get(0).getDate()); + assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); + } catch (Exception e) { + fail(); // test should not fail + } + } + + @Test + void editExpense_editDate_success() { + LocalDate expectedOutputDate = LocalDate.parse("23-05-2024", FORMATTER); + try { + expenses.editExpense(1, "da", "23-05-2024"); + assertEquals(CATEGORY, expenses.get(0).getCategory()); + assertEquals(DESCRIPTION, expenses.get(0).getDescription()); + assertEquals(expectedOutputDate, expenses.get(0).getDate()); + assertEquals(EXPENSE_VALUE, expenses.get(0).getValue()); + } catch (Exception e) { + fail(); // test should not fail + } + } + + @Test + void editExpense_editValue_success() { + float expectedOutputValue = (float) 100; + try { + expenses.editExpense(1, "v", "100"); + assertEquals(CATEGORY, expenses.get(0).getCategory()); + assertEquals(DESCRIPTION, expenses.get(0).getDescription()); + assertEquals(DATE, expenses.get(0).getDate()); + assertEquals(expectedOutputValue, expenses.get(0).getValue()); + } catch (Exception e) { + fail(); // test should not fail + } + } } From d5ee6047f319b3ddd44f6081dd2869ad13976a73 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 25 Mar 2023 13:33:56 +0800 Subject: [PATCH 155/364] Add comments to methods for documentation of JUnit testing in ExpenseListTest --- src/test/java/chching/record/ExpenseListTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index 9c0b12cc22..d967b22740 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -42,6 +42,9 @@ void getExpenseCount_one_expectOne() { assertEquals(EXPECTED_SIZE, list.getRecordCount()); } + /** + * JUnit test to test method to edit category of expense + */ @Test void editExpense_editCategory_success() { String expectedOutputCategory = "food and drinks"; @@ -57,6 +60,9 @@ void editExpense_editCategory_success() { } } + /** + * JUnit test to test method to edit description of expense + */ @Test void editExpense_editDescription_success() { String expectedOutputDescription = "birthday party"; @@ -71,6 +77,9 @@ void editExpense_editDescription_success() { } } + /** + * JUnit test to test method to edit date of expense + */ @Test void editExpense_editDate_success() { LocalDate expectedOutputDate = LocalDate.parse("23-05-2024", FORMATTER); @@ -85,6 +94,9 @@ void editExpense_editDate_success() { } } + /** + * JUnit test to test method to edit value of expense + */ @Test void editExpense_editValue_success() { float expectedOutputValue = (float) 100; From afe80a771e8ef69cb434affd492375ca7d490b55 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 25 Mar 2023 15:25:17 +0800 Subject: [PATCH 156/364] Add JUnit testing for EditExpenseCommand class --- .../command/EditExpenseCommandTest.java | 151 ++++++++++++++++++ .../java/chching/record/ExpenseListTest.java | 8 + 2 files changed, 159 insertions(+) create mode 100644 src/test/java/chching/command/EditExpenseCommandTest.java diff --git a/src/test/java/chching/command/EditExpenseCommandTest.java b/src/test/java/chching/command/EditExpenseCommandTest.java new file mode 100644 index 0000000000..71e636c8e2 --- /dev/null +++ b/src/test/java/chching/command/EditExpenseCommandTest.java @@ -0,0 +1,151 @@ +package chching.command; + +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.record.Expense; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class EditExpenseCommandTest { + static final String GROCERIES_CATEGORY = "grocery"; + static final String GROCERIES_DESCRIPTION = "too much groceries"; + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate GROCERIES_DATE = LocalDate.parse("01-04-2023", FORMATTER); + static final float GROCERIES_VALUE = 500; + static final String INDEX_FIELD = "in"; + static final String INDEX_VALUE = "1"; + static final String CATEGORY_FIELD = "c"; + static final String CATEGORY_VALUE = "food"; + static final String DESCRIPTION_FIELD = "de"; + static final String DESCRIPTION_VALUE = "too much food"; + static final String DATE_FIELD = "da"; + static final String DATE_VALUE = "02-04-2023"; + static final String VALUE_FIELD = "v"; + static final String VALUE_VALUE = "50"; + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList incomeList; + private ExpenseList expenses; + private Expense groceries; + + @BeforeEach + void setUp() { + ui = new Ui(); + + groceries = new Expense(GROCERIES_CATEGORY, GROCERIES_DESCRIPTION, GROCERIES_DATE, GROCERIES_VALUE); + + ArrayList expenseList = new ArrayList(); + expenseList.add(groceries); + expenses = new ExpenseList(expenseList); + } + + @Test + void execute_normalScenario_success() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, INDEX_VALUE); + argumentsByField.put(CATEGORY_FIELD, CATEGORY_VALUE); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editExpenseCommand = new EditExpenseCommand(argumentsByField); + editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); + + assertEquals(CATEGORY_VALUE, expenses.get(0).getCategory()); + assertEquals(DESCRIPTION_VALUE, expenses.get(0).getDescription()); + assertEquals(LocalDate.parse(DATE_VALUE, FORMATTER), expenses.get(0).getDate()); + assertEquals(Float.parseFloat(VALUE_VALUE), expenses.get(0).getValue()); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } + + @Test + void execute_noIndex_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(CATEGORY_FIELD, CATEGORY_VALUE); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editExpenseCommand = new EditExpenseCommand(argumentsByField); + // exception should be thrown before execute even happens + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Missing/invalid index", e.getMessage()); + } + } + + @Test + void execute_negativeIndex_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, "-1"); + argumentsByField.put(CATEGORY_FIELD, CATEGORY_VALUE); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editExpenseCommand = new EditExpenseCommand(argumentsByField); + editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("Negative/Zero index", e.getMessage()); + } + } + + @Test + void execute_indexOutOfBounds_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, "2"); + argumentsByField.put(CATEGORY_FIELD, CATEGORY_VALUE); + argumentsByField.put(DESCRIPTION_FIELD, DESCRIPTION_VALUE); + argumentsByField.put(DATE_FIELD, DATE_VALUE); + argumentsByField.put(VALUE_FIELD, VALUE_VALUE); + + Command editExpenseCommand = new EditExpenseCommand(argumentsByField); + editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("The index is too big", e.getMessage()); + } + } + + @Test + void execute_noFields_exceptionThrown() { + try { + HashMap argumentsByField = new HashMap(); + argumentsByField.put(INDEX_FIELD, INDEX_VALUE); + + Command editExpenseCommand = new EditExpenseCommand(argumentsByField); + editExpenseCommand.execute(incomeList, expenses, ui, storage, selector, converter, targetStorage); + + fail(); // test should not reach this line + } catch (Exception e) { + assertEquals("No fields to edit", e.getMessage()); + } + } +} diff --git a/src/test/java/chching/record/ExpenseListTest.java b/src/test/java/chching/record/ExpenseListTest.java index d967b22740..de793a1aab 100644 --- a/src/test/java/chching/record/ExpenseListTest.java +++ b/src/test/java/chching/record/ExpenseListTest.java @@ -22,6 +22,14 @@ class ExpenseListTest { private Expense expense; private ExpenseList expenses; + /** + * Sets up ExpenseList expenses with one expense for each JUnit testing + * expense contains the following details: + * category: entertainment + * description: beach party + * date: 23-05-2023 + * value: 50 + */ @BeforeEach void setUp() { expense = new Expense(CATEGORY, DESCRIPTION, DATE, EXPENSE_VALUE); From 3a5bd59bb9c9892cd0420d764793839370595aad Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 25 Mar 2023 15:30:51 +0800 Subject: [PATCH 157/364] update BalanceCommandTest class to put back missing JUnit test --- .../chching/command/BalanceCommandTest.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index ecefb90ab8..69658b56b8 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -2,19 +2,19 @@ import chching.Storage; import chching.Ui; -import chching.record.Expense; -import chching.record.ExpenseList; -import chching.record.Income; -import chching.record.IncomeList; +import chching.record.*; import chching.currency.Selector; import chching.currency.Converter; -import chching.record.TargetStorage; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + class BalanceCommandTest { static final String INCOME_DESCRIPTION = "salary"; @@ -39,12 +39,17 @@ class BalanceCommandTest { @BeforeEach void setup() { ui = new Ui(); + converter = new Converter(); + + Target target = new Target(100); + targetStorage = new TargetStorage(); + targetStorage.addTarget(target); + + selector = new Selector(); + selector.setCurrency("SGD"); salary = new Income(INCOME_DESCRIPTION, INCOME_DATE, INCOME_VALUE); groceries = new Expense(EXPENSE_CATEGORY, EXPENSE_DESCRIPTION, EXPENSE_DATE, EXPENSE_VALUE); - selector = new Selector(); - converter = new Converter(); - targetStorage = new TargetStorage(); ArrayList incomeList = new ArrayList(); @@ -55,4 +60,17 @@ void setup() { expenseList.add(groceries); defaultExpenseList = new ExpenseList(expenseList); } + + @Test + void execute_normalScenario_success() { + String expectedOutput = "4500.00"; + try { + Command command = new BalanceCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertEquals(expectedOutput, ((BalanceCommand) command).showBalance(), "Balance calculation is right"); + } catch (Exception e) { + System.out.println(e.getMessage()); + fail(); // test should not reach this line + } + } } From 43ad3ef83500b46e78e4c0a0f67403983a2bb122 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Sat, 25 Mar 2023 15:34:36 +0800 Subject: [PATCH 158/364] Fix checkstyle to pass gradlew check --- src/test/java/chching/command/BalanceCommandTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/chching/command/BalanceCommandTest.java b/src/test/java/chching/command/BalanceCommandTest.java index 69658b56b8..8c1de2a672 100644 --- a/src/test/java/chching/command/BalanceCommandTest.java +++ b/src/test/java/chching/command/BalanceCommandTest.java @@ -2,15 +2,19 @@ import chching.Storage; import chching.Ui; -import chching.record.*; +import chching.record.ExpenseList; +import chching.record.IncomeList; +import chching.record.TargetStorage; +import chching.record.Target; +import chching.record.Expense; +import chching.record.Income; import chching.currency.Selector; import chching.currency.Converter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - +import java.util.ArrayList; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; From ee4b8ee9ce4a044521ea9e67209f2ae9aac317ad Mon Sep 17 00:00:00 2001 From: avielcx Date: Mon, 27 Mar 2023 15:27:01 +0800 Subject: [PATCH 159/364] Update User Guide --- docs/UserGuide.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4185d66917..2bb271696b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -50,6 +50,38 @@ Format:
`list expense`
`list income` +### Updating an entry: `edit` +Edit an existing expense/income that is currently in the list. + +Format: +
`edit expense i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` + + +Use case: +* Edits the item at the specified INDEX, where INDEX is a positive integer. +* At least one of the fields must be provided. +* Existing values will be updated to the input values. + +Example of usage: +`edit expense i/1 d/Lunch @Technoedge v/5.20` + +### Finding an entry: `find` +Find an existing expense/income that is currently in the list. + +Format: +
`find expense c/CATEGORY de/DESCRIPTION` + +Use case: +* Shows user the entry that they are looking for. + +Example of usage: +
`find expense c/Grocery de/Beef` +### Showing the balance: `balance` +Shows users the balance he has after calculating the difference of income and expense. + +Format: +
`balance` + ### Deleting an entry: `delete` Remove an entry from the expense/income list. @@ -90,6 +122,11 @@ When reading from the file, entries for income and expenses are stored in their * List Records: `list` * List Expenses: `list expense` * List Incomes: `list income` +* Edit income list: `edit income i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` +* Edit expense list: `edit expense i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` +* Find income entry: `find income c/CATEGORY de/DESCRIPTION` +* Find expense entry: `find expense c/CATEGORY de/DESCRIPTION` +* Show balance: `balance` * Delete Expense: `delete expense /in INDEX` * Delete Income: `delete income /in INDEX` * Show Balance: `balance` From 1cd3d4ecff406ded0025f36f10c62f0e35ffb5db Mon Sep 17 00:00:00 2001 From: avielcx Date: Mon, 27 Mar 2023 15:45:00 +0800 Subject: [PATCH 160/364] Update Developer Guide --- docs/DeveloperGuide.md | 27 +++++++++++++++++++-------- images/Target_UML.png | Bin 0 -> 41760 bytes 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 images/Target_UML.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index fbfcbd150d..677c9f4e3e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -28,6 +28,12 @@ Afterwards, the ```execute()``` method will print ```"Income deleted, here is th ![Record Class](../images/DeleteIncomeCommand_sequence_diagram.png) +### Target and TargetStorage + +The `Target` and `TargetStorage` class allows users to set a target for their ideal balance. + +![Target Class](../images/Target_UML.png) + ### [Proposed] EditIncomeCommand/EditExpenseCommand The proposed edit income command is facilitated by `Parser`, `EditIncomeCommand`, `IncomeList`, while the proposed edit expense command is facilitated by `Parser`, `EditExpenseCommand` and `ExpenseList`. @@ -83,6 +89,7 @@ The selected currencies will be marked with a ```[X]``` and the unselected curre ## Product scope + ### Target user profile Target users are people who are keen on improving their financial accountability @@ -93,14 +100,18 @@ The value proposition of ChChing is its ability to track income and expenses on ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|----------|--------------------------------|--------------------------------------------------------| -| v1.0 |new user| see usage instructions | refer to them when I forget how to use the application | -| v1.0 |user| add new expense to the records | record all my expenses | -| v1.0 |user| add new income to the records | record all my incomes | -| v1.0 |user| view all the records | refer to them when I forgot my expenses and incomes | -| v1.0 |user| edit the records | modify/fix if the records is changed/wrong | -| v1.0 |user| know current balance | aware how much money do I have left | +| Version | As a ... | I want to ... | So that I can ... | +|---------|-----------|-----------------------------------------|-----------------------------------------------------------------------------------------| +| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | +| v1.0 | user | add new expense to the records | record all my expenses | +| v1.0 | user | add new income to the records | record all my incomes | +| v1.0 | user | view all the records | refer to them when I forgot my expenses and incomes | +| v1.0 | user | edit the records | modify/fix if the records is changed/wrong | +| v1.0 | user | know current balance | aware how much money do I have left | +| v2.0 | user | edit my existing entries | rectify or update any entries without having to enter another entry and delete an entry | +| v2.0 | user | find specific entries | refer to specific entries when necessary | +| v2.0 | foreigner | view my entries in a different currency | read my incomes and expenses in a currency I am familiar with | +| v2.0 | user | set a target for my balance | improve my financial management | ## Non-Functional Requirements diff --git a/images/Target_UML.png b/images/Target_UML.png new file mode 100644 index 0000000000000000000000000000000000000000..1a147d29e3eea303d39059efa71da0a1098cf6c1 GIT binary patch literal 41760 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
c)O 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 Date: Mon, 27 Mar 2023 16:02:55 +0800 Subject: [PATCH 161/364] Update user guide and developer guide --- docs/DeveloperGuide.md | 3 ++- docs/UserGuide.md | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 677c9f4e3e..7c1ea1db7a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -112,7 +112,8 @@ The value proposition of ChChing is its ability to track income and expenses on | v2.0 | user | find specific entries | refer to specific entries when necessary | | v2.0 | foreigner | view my entries in a different currency | read my incomes and expenses in a currency I am familiar with | | v2.0 | user | set a target for my balance | improve my financial management | - +| v2.0 | user | see the target i have set | remind myself of my target | +| v2.0 | user | reset my income/expense lists or both | have a fresh list | ## Non-Functional Requirements {Give non-functional requirements} diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2bb271696b..9c380403a2 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -97,8 +97,36 @@ Example of usage:
`delete expense /in 1`
`delete income /in 2` +### Clear entire income list: `clear expense` +Clear the entire list of incomes. + +Format: +
`clear income` + +### Clear entire expense list: `clear income` +Clear the entire list of expenses. + +Format: +
`clear expense` + +### Clear entire both income and expense lists: `clear all` +Clear the entire list of incomes and expenses. + +Format: +
`clear all` +### Set a target for balance of finances: `add target` +Allows users to set a target for their balance. + +Format: +
`add target /v VALUE` + +Use case: +* VALUE is more than or equal to zero + +Example of usage: +
`add target 350` ### Finding balance of finances: `balance` -Shows users the balance after calculating the difference between income and expenses +Shows users the balance after calculating the difference between income and expenses and informs users on whether they have reached their target. Format:
`balance` @@ -126,8 +154,12 @@ When reading from the file, entries for income and expenses are stored in their * Edit expense list: `edit expense i/INDEX c/CATEGORY de/DESCRIPTION da/DATE v/VALUE` * Find income entry: `find income c/CATEGORY de/DESCRIPTION` * Find expense entry: `find expense c/CATEGORY de/DESCRIPTION` -* Show balance: `balance` * Delete Expense: `delete expense /in INDEX` * Delete Income: `delete income /in INDEX` +* Clear income list: `clear income` +* Clear expense list: `clear expense` +* Clear both income and expense lists: `clear all` +* Set Target: `add target /v Value` +* Show Target: `show target` * Show Balance: `balance` * Show help: `help` From 21c783d95410a2d67d3e0dd85311b9dc1ed09ac8 Mon Sep 17 00:00:00 2001 From: avielcx Date: Mon, 27 Mar 2023 16:40:42 +0800 Subject: [PATCH 162/364] SetTargetCommand UML --- docs/DeveloperGuide.md | 6 ++++++ images/SetTargetCommand.png | Bin 0 -> 81003 bytes 2 files changed, 6 insertions(+) create mode 100644 images/SetTargetCommand.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7c1ea1db7a..a55b6cf40b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -74,7 +74,13 @@ The listExpenseCommand is facilitated by ```System```, ```Parser``` and ```Expen 3. The ```expenseList``` method ```printExpenseList``` is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of expenses in ```expenses```. +### SetTargetCommand +The setTargetCommand is facilitated by ```ChChing```, ```Parser```, ```TargetParser```, ```TargetStorage```. +When the command receives to set target, the ```parse()``` method of the ```Parser``` object will read in the command and call the ```parseTarget()``` method from the TargetParser class +to instantiate a Target object and initializes a target value. Afterwards, ```parse()``` method calls the ```AddTargetCommand``` and instantiate a ```SetTargetCommand``` object and returns to the ```Parser``` object. +The ```Parser``` object then returns to ```ChChing```. ```ChChing``` object then runs the ```execute()``` method of the SetTargetCommand object. The method then calls the ```setTarget()``` method of the ```TargetStorage``` object to store the previously initialized ```Target``` object. +![SetTargetCommand UML](../images/SetTargetCommand.png) ### SetCurrencyCommand The setCurrencyCommand is facilitated by ```System```, ```Selector```, ```UI``` and ```ExpenseList```. The command receives the instruction from ```UI``` and will call the ```execute``` method. diff --git a/images/SetTargetCommand.png b/images/SetTargetCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..26973e13a0a88ec7306ccb2de0ff359400d31024 GIT binary patch literal 81003 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
OhQ-B6*`$9L}=pV%n>=h2mCJ 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 Date: Mon, 27 Mar 2023 17:02:45 +0800 Subject: [PATCH 163/364] Add edit income command feature --- .../chching/command/EditIncomeCommand.java | 67 +++++++++++++++++++ src/main/java/chching/parser/Parser.java | 4 ++ src/main/java/chching/record/IncomeList.java | 37 +++++++++- 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/main/java/chching/command/EditIncomeCommand.java diff --git a/src/main/java/chching/command/EditIncomeCommand.java b/src/main/java/chching/command/EditIncomeCommand.java new file mode 100644 index 0000000000..fd8e870943 --- /dev/null +++ b/src/main/java/chching/command/EditIncomeCommand.java @@ -0,0 +1,67 @@ +package chching.command; + +import chching.ChChingException; +import chching.Storage; +import chching.Ui; +import chching.currency.Converter; +import chching.currency.Selector; +import chching.parser.Incomes; +import chching.record.ExpenseList; +import chching.record.Income; +import chching.record.IncomeList; +import chching.record.TargetStorage; + +import java.util.HashMap; + +public class EditIncomeCommand extends Command { + private int index; + private HashMap argumentsByField; + private boolean hasDescription; + private boolean hasDate; + private boolean hasValue; + + public EditIncomeCommand(HashMap argumentsByField) throws ChChingException { + this.argumentsByField = argumentsByField; + + index = Incomes.getIndex(argumentsByField); + hasDescription = argumentsByField.containsKey("de"); + hasDate = argumentsByField.containsKey("da"); + hasValue = argumentsByField.containsKey("v"); + } + + @Override + public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, + Converter converter, TargetStorage targetStorage) throws ChChingException { + // check if the index is valid + if (index <= 0) { + throw new ChChingException("Negative/Zero index"); + } else if (index > incomes.size()) { + throw new ChChingException("The index is too big"); + } + assert index > 0 : "Index must be a positive integer"; + + if (!hasDescription && !hasDate && !hasValue) { + throw new ChChingException("No fields to edit"); + } + // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; + Income income = incomes.get(indexZeroBased); + + // edit the fields accordingly + if (hasDescription) { + String value = argumentsByField.get("de"); + incomes.editIncome(index, "de", value); + } + if (hasDate) { + String value = argumentsByField.get("da"); + incomes.editIncome(index, "da", value); + } + if (hasValue) { + String value = argumentsByField.get("v"); + incomes.editIncome(index, "v", value); + } + + boolean isExpense = false; + ui.showEdited(index, income, isExpense); + } +} diff --git a/src/main/java/chching/parser/Parser.java b/src/main/java/chching/parser/Parser.java index 554ab7b0de..c2f31c0cf4 100644 --- a/src/main/java/chching/parser/Parser.java +++ b/src/main/java/chching/parser/Parser.java @@ -23,6 +23,7 @@ import chching.command.ShowTargetCommand; import chching.command.UnsetCurrencyCommand; import chching.command.FindCommand; +import chching.command.EditIncomeCommand; import chching.record.Expense; import chching.record.ExpenseList; import chching.record.Income; @@ -77,6 +78,9 @@ public static Command parse( case "list": command = new ListCommand(); break; + case "edit income": + command = new EditIncomeCommand(argumentsByField); + break; case "edit expense": command = new EditExpenseCommand(argumentsByField); break; diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index e9ac2851fe..25aa0c8ec8 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -1,9 +1,14 @@ package chching.record; +import java.time.LocalDate; import java.util.ArrayList; + +import chching.ChChingException; import chching.currency.Converter; import chching.currency.Selector; +import static chching.parser.Incomes.parseDate; + /** * Models a class that act as list of incomes. Inherited from RecordList Class */ @@ -35,8 +40,36 @@ public void addIncome(Income income) { incomeList.add(income); } - - + + public void editIncome(int index, String field, String value) throws ChChingException { + + // change from 1-based indexing to 0-based indexing + int indexZeroBased = index - 1; + Income income = incomeList.get(indexZeroBased); + + // edit the according field + switch(field) { + case "de": + income.setDescription(value); + break; + case "da": + LocalDate date = parseDate(value); + income.setDate(date); + break; + case "v": + try { + double amount = Float.parseFloat(value); + income.setValue(amount); + } catch (Exception e) { + throw new ChChingException("Trouble adding income value"); + } + break; + default: + assert false: "No such field to enter here"; + throw new ChChingException("No such field in income"); + } + } + /** * Deletes income from an IncomeList * From e1f297f6af0143d4d9949de69816837800321ac1 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 27 Mar 2023 17:15:40 +0800 Subject: [PATCH 164/364] Add documentation to methods of edit income command --- .../java/chching/command/EditExpenseCommand.java | 12 +++++++----- src/main/java/chching/command/EditIncomeCommand.java | 12 ++++++++++++ src/main/java/chching/record/ExpenseList.java | 9 +++++++++ src/main/java/chching/record/IncomeList.java | 9 +++++++++ 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/main/java/chching/command/EditExpenseCommand.java b/src/main/java/chching/command/EditExpenseCommand.java index 1f6e953f6a..46d6ab627f 100644 --- a/src/main/java/chching/command/EditExpenseCommand.java +++ b/src/main/java/chching/command/EditExpenseCommand.java @@ -36,14 +36,16 @@ public EditExpenseCommand(HashMap argumentsByField) throws ChChi } /** - * Executes edit of ExpenseList + * Executes edit of expenses. + * Based on the fields the user wants to edit, the corresponding fields will be edited. * * @param incomes ArrayList of income. * @param expenses ArrayList of income. - * @param ui User interface - * @param storage Storage of data - * @param converter Convert value - * @param targetStorage store target + * @param ui User interface. + * @param storage Storage of data. + * @param converter Convert value. + * @param targetStorage store target. + * @throws ChChingException if the index is invalid or if there is no field to edit. */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, diff --git a/src/main/java/chching/command/EditIncomeCommand.java b/src/main/java/chching/command/EditIncomeCommand.java index fd8e870943..cc76560309 100644 --- a/src/main/java/chching/command/EditIncomeCommand.java +++ b/src/main/java/chching/command/EditIncomeCommand.java @@ -29,6 +29,18 @@ public EditIncomeCommand(HashMap argumentsByField) throws ChChin hasValue = argumentsByField.containsKey("v"); } + /** + * Executes edit of incomes. + * Based on the fields the user wants to edit, the corresponding fields will be edited. + * + * @param incomes ArrayList of income. + * @param expenses ArrayList of income. + * @param ui User interface. + * @param storage Storage of data. + * @param converter Convert value. + * @param targetStorage store target. + * @throws ChChingException if the index is invalid or if there is no field to edit. + */ @Override public void execute(IncomeList incomes, ExpenseList expenses, Ui ui, Storage storage, Selector selector, Converter converter, TargetStorage targetStorage) throws ChChingException { diff --git a/src/main/java/chching/record/ExpenseList.java b/src/main/java/chching/record/ExpenseList.java index 21fcace236..0e37c65585 100644 --- a/src/main/java/chching/record/ExpenseList.java +++ b/src/main/java/chching/record/ExpenseList.java @@ -40,6 +40,15 @@ public void addExpense(Expense expense) { expenseList.add(expense); } + /** + * Method to edit an expense in the expense list. + * Edits a specific field of an expense based on the parameters field to value. + * + * @param index Index of expense to be edited. + * @param field Field to be edited. + * @param value Updated value desired. + * @throws ChChingException If value value is not a non-numeric input. + */ public void editExpense(int index, String field, String value) throws ChChingException { // change from 1-based indexing to 0-based indexing diff --git a/src/main/java/chching/record/IncomeList.java b/src/main/java/chching/record/IncomeList.java index 25aa0c8ec8..51e4e6a99c 100644 --- a/src/main/java/chching/record/IncomeList.java +++ b/src/main/java/chching/record/IncomeList.java @@ -41,6 +41,15 @@ public void addIncome(Income income) { } + /** + * Method to edit an income in the income list. + * Edits a specific field of an income based on the parameters field to value. + * + * @param index Index of income to be edited. + * @param field Field to be edited. + * @param value Updated value desired. + * @throws ChChingException If value value is not a non-numeric input. + */ public void editIncome(int index, String field, String value) throws ChChingException { // change from 1-based indexing to 0-based indexing From 4ec6a370b82744a8b38c4370296b8731fcb609b2 Mon Sep 17 00:00:00 2001 From: thomasjlalba Date: Mon, 27 Mar 2023 17:17:01 +0800 Subject: [PATCH 165/364] Add documentation to EditIncomeCommand class --- src/main/java/chching/command/EditIncomeCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/chching/command/EditIncomeCommand.java b/src/main/java/chching/command/EditIncomeCommand.java index cc76560309..c95b768201 100644 --- a/src/main/java/chching/command/EditIncomeCommand.java +++ b/src/main/java/chching/command/EditIncomeCommand.java @@ -13,6 +13,9 @@ import java.util.HashMap; +/** + * Models a class to handle the EditIncome command. Inherited from Command class. + */ public class EditIncomeCommand extends Command { private int index; private HashMap argumentsByField; From 0aa20e0d7b81964585f869e07ad5a61faf9f1190 Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 27 Mar 2023 22:11:14 +0800 Subject: [PATCH 166/364] Added JUnit testing for ClearAll, ClearExpense and ClearIncome Commands --- .../chching/command/ClearCommandTest.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/test/java/chching/command/ClearCommandTest.java diff --git a/src/test/java/chching/command/ClearCommandTest.java b/src/test/java/chching/command/ClearCommandTest.java new file mode 100644 index 0000000000..bcda729e38 --- /dev/null +++ b/src/test/java/chching/command/ClearCommandTest.java @@ -0,0 +1,82 @@ +package chching.command; + +import chching.Ui; +import chching.Storage; +import chching.record.*; +import chching.currency.Converter; +import chching.currency.Selector; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ClearCommandTest { + static final String CATEGORY = "transport"; + static final String EXPENSE_DESCRIPTION = "public transport"; + static final String INCOME_DESCRIPTION = "ALLOWANCE"; + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); + static final float EXPENSE_VALUE = (float) 1.50; + static final float INCOME_VALUE = (float) 200; + private Ui ui; + private Storage storage; + private Selector selector; + private Converter converter; + private TargetStorage targetStorage; + private IncomeList defaultIncomeList; + private ExpenseList defaultExpenseList; + private Expense expenseDemo; + private Income incomeDemo; + + @BeforeEach + void setUp() { + ui = new Ui(); + converter = new Converter(); + targetStorage = new TargetStorage(); + selector = new Selector(); + + ArrayList expenseList = new ArrayList<>(); + expenseDemo = new Expense(CATEGORY, EXPENSE_DESCRIPTION, DATE, EXPENSE_VALUE); + expenseList.add(expenseDemo); + defaultExpenseList = new ExpenseList(expenseList); + + ArrayList incomeList = new ArrayList<>(); + incomeDemo = new Income(INCOME_DESCRIPTION, DATE, INCOME_VALUE); + incomeList.add(incomeDemo); + defaultIncomeList = new IncomeList(incomeList); + } + @Test + public void execute_clearAll_success() { + try { + Command command = new ClearAllCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertTrue(defaultExpenseList.size() == 0 && defaultIncomeList.size() == 0); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + @Test + public void execute_clearExpense_success() { + try { + Command command = new ClearExpenseCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertTrue(defaultExpenseList.size() == 0); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + @Test + public void execute_clearIncome_success() { + try { + Command command = new ClearIncomeCommand(); + command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); + assertTrue(defaultIncomeList.size() == 0); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } +} From ab9149f71ef87189b4bae642f3b71894f3b02cac Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 27 Mar 2023 22:24:39 +0800 Subject: [PATCH 167/364] Added JUnit testing for ListCommand --- .../chching/command/ClearCommandTest.java | 6 +-- .../java/chching/command/ListCommandTest.java | 49 +++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 src/test/java/chching/command/ListCommandTest.java diff --git a/src/test/java/chching/command/ClearCommandTest.java b/src/test/java/chching/command/ClearCommandTest.java index bcda729e38..381e990d19 100644 --- a/src/test/java/chching/command/ClearCommandTest.java +++ b/src/test/java/chching/command/ClearCommandTest.java @@ -50,7 +50,7 @@ void setUp() { defaultIncomeList = new IncomeList(incomeList); } @Test - public void execute_clearAll_success() { + public void execute_ClearAllCommand_success() { try { Command command = new ClearAllCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); @@ -60,7 +60,7 @@ public void execute_clearAll_success() { } } @Test - public void execute_clearExpense_success() { + public void execute_ClearExpenseCommand_success() { try { Command command = new ClearExpenseCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); @@ -70,7 +70,7 @@ public void execute_clearExpense_success() { } } @Test - public void execute_clearIncome_success() { + public void executeClear_IncomeCommand_success() { try { Command command = new ClearIncomeCommand(); command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage); diff --git a/src/test/java/chching/command/ListCommandTest.java b/src/test/java/chching/command/ListCommandTest.java new file mode 100644 index 0000000000..75752d19ac --- /dev/null +++ b/src/test/java/chching/command/ListCommandTest.java @@ -0,0 +1,49 @@ +package chching.command; + +import chching.ChChingException; +import chching.Ui; +import chching.Storage; +import chching.record.*; +import chching.currency.Converter; +import chching.currency.Selector; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertTrue; +public class ListCommandTest { + static final String CATEGORY = "transport"; + static final String EXPENSE_DESCRIPTION = "public transport"; + static final String INCOME_DESCRIPTION = "ALLOWANCE"; + static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + static final LocalDate DATE = LocalDate.parse("01-04-2023", FORMATTER); + static final float EXPENSE_VALUE = (float) 1.50; + static final float INCOME_VALUE = (float) 200; + private Ui ui = new Ui(); + private Storage storage; + private Selector selector = new Selector(); + private Converter converter = new Converter(); + private TargetStorage targetStorage = new TargetStorage(); + private IncomeList defaultIncomeList = new IncomeList(); + private ExpenseList defaultExpenseList = new ExpenseList(); + private Expense expenseDemo = new Expense(CATEGORY, EXPENSE_DESCRIPTION, DATE, EXPENSE_VALUE); + private Income incomeDemo = new Income(INCOME_DESCRIPTION, DATE, INCOME_VALUE); + + @Test + void execute_ListCommand_empty_NoException() throws ChChingException { + Command command = new ListCommand(); + assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage)); + } + + @Test + void execute_ListCommand_expenseAndIncome_NoException() throws ChChingException { + defaultIncomeList.addIncome(incomeDemo); + defaultExpenseList.addExpense(expenseDemo); + Command command = new ListCommand(); + assertDoesNotThrow( () ->command.execute(defaultIncomeList, defaultExpenseList, ui, storage, selector, converter, targetStorage)); + } +} From 91bf197cb3d10d5f0a86f9877b41d129ffe6fb8d Mon Sep 17 00:00:00 2001 From: Rayleigh47 Date: Mon, 27 Mar 2023 22:49:11 +0800 Subject: [PATCH 168/364] Added UML diagram for ListExpenseCommand --- docs/DeveloperGuide.md | 4 +++- .../ListExpenseCommand_Sequence_Diagram.puml | 8 ++++++++ images/ListExpenseCommand_Sequence_Diagram.png | Bin 0 -> 13041 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml create mode 100644 images/ListExpenseCommand_Sequence_Diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a55b6cf40b..c05ecbf9d5 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -65,7 +65,7 @@ The following activity diagram summarises what happens when a user executes edit * Cons: Not any easier than having the user to just delete and add new expense/income. ### ListExpenseCommand -The listExpenseCommand is facilitated by ```System```, ```Parser``` and ```ExpenseList```. +The listExpenseCommand is facilitated by ```Parser```, ```ListExpenseCommand``` and ```ExpenseList```. 1. The user inputs the command top list expense. This input is handled by```Parser``` which returns the ```listExpenseCommand``` if successful. @@ -74,6 +74,8 @@ The listExpenseCommand is facilitated by ```System```, ```Parser``` and ```Expen 3. The ```expenseList``` method ```printExpenseList``` is called, which iterates through the expenseList, ```expenses``` and prints the index as well as a completed string of expenses in ```expenses```. + +![ListExpenseCommand](../images/ListExpenseCommand_Sequence_Diagram.png) ### SetTargetCommand The setTargetCommand is facilitated by ```ChChing```, ```Parser```, ```TargetParser```, ```TargetStorage```. When the command receives to set target, the ```parse()``` method of the ```Parser``` object will read in the command and call the ```parseTarget()``` method from the TargetParser class diff --git a/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml new file mode 100644 index 0000000000..a8de362d7d --- /dev/null +++ b/docs/diagrams/ListExpenseCommand_Sequence_Diagram.puml @@ -0,0 +1,8 @@ +@startuml +class chching.command.ListExpenseCommand { ++ void execute(IncomeList,ExpenseList,Ui,Storage,Selector,Converter,TargetStorage) +} + + +chching.command.Command <|-- chching.command.ListExpenseCommand +@enduml \ No newline at end of file diff --git a/images/ListExpenseCommand_Sequence_Diagram.png b/images/ListExpenseCommand_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a0dae9768f0ff645fa7dca04bc69ad234a829765 GIT binary patch literal 13041 zcmeHucT`i|*JcnE6s)K;0qIIF0@6hk1O%k_ARxVj-a=EcAOQpfq$^dVNeLZ-fPg`I z4-j~zC?!OC36MGQmG|@a%~#f%H8X3?TH`;$&CR{%?6b@BJbM#%UqkuSNrsaU2;`K? z-P_s_$dOP8giMU`2)MG6Z=(nP=xGIW^>ebe@q{Q_yI8whcv?TaV(E9q&ePM? zLrPH4)ycxe)63aOzzXK<-GycWj}W%kHS|2Z4j}{2@lA<%rS8~t^XxM`)y^3YT?WO8 zU9xu+_T}1)dDj;LC+?_ zad#)KKSpyH40T3QaD%2W?853did3LiO|C&SXBkGxW8G zP@j{UKVL{svHytDk-JA>b#>112C}w5)O_{XS;iI;u6ZinE0w2AUdTZ<^H3 zLhq#)AA6&fkH|UxrR1~s4i(~fJ;m(Xn=~nn-d}RIxdL!ap##=8u0CDr`L5XIt`K*I zc$X~9T8d8`Z~w8ifh_Y`#8zjdB@qGSE~hCAj-Gqna+~ZC_1W7`=v=v^ zR4?4`WxXOnu5w0nI)iGtHZL{l+j?F@sA}&-fV^g!Os+<%KVg7#f6+mTb-@+_aaFmK z#{_{inuQ8OAPIC9)R0C_B|375YuJ4AcF#LS>87?Kv)ZmS+5Ba42*lzRO>2LyChFTu z-i#(yQ`7O5Fq+`)zbL%GlPLWh=vd@~Ok;e1^t@ZZ*;1NRx|sR<*W9axO*WvHA&|4X z140K=PtMFJiOS2H&z}k8)h~FJ2pcWEV@3wKX{Xa{=yIL2Z>F}7Wf!~;e0$=r=I8mm z;K|O>G_7p1vh^0t&%Sr1>KK4$HL>v^%F4>DSC1V#wg5c(mf`KED~Y1EmX?;S2>Q$- z2;@qro*W`#@|re0aJ3{XN>73Qy50S?xz0f-xcf~~Z~_k^H6}6f+8Hff-7M1mx_Q0t zPfgEuBuLozWkKuxqvUpfM9Cl6c`|(2{p&f4H`tbbp>bYb9$^b#yv{Y0B91XKGIGY0 zhebrhS)>Q;=9Q@O8JAy`lWVZg)Q6SWIh%Olu@iuGT(5$IZpw(ay?IFj;VEHVK9~%FHdkf`d5in zTTs#V6UHIaf)*|;POxG77ABZTm@Ld+7%mpX6{8M}F@#NAS&;~nTtJmE(qRsF0|H^y zP#38cI#@I(?sh9&e0`-{K;M!Ezo{v|KU2T(A;0M5Zkt(gKxI+sg0TYb7~~4auh+K1 zyNc^KjTICWbU&j881_}q8q@NYgqfKbEe+)949H`18i)skxM;3w{`h38>O1*6^qp79`Q#B~+-GonjNuv1V-@JTv2Oi!cD-y~#~_e*%IYF` zp-bVkf*N=4+V#Bs^z*M~;$|g^K2`NBPxvPn%i&F^Y3ai+V#B7fuV0t@;Gy%VRWxs> zp1#Oi&2%{jLGTFfw?e0xkdDKVAGR0!ZM)OVkPdO>#kI>)UiY7ViRB)Cua#L|u1j*| z7bnVum}PuFx@9`~&qON^C|rE`^5sKk8=IV(Bao1@G&U9i-&(@T%gc|SVlZ|4eDM^c z_+??s7W0EuTCX1Y>o9CU&szo3J6XBDHr=>t)rtrU3zPJiLy*3H|NIvVr#(wOZ|{o3 zUjvrMtDl`>%*oCD6)l_&bf~p1>GQ3?*~iYETdr9w!XO=C<5gNGH*)#SE>jEZs@+!3XejtRPG`pGsSSl#l@a#m958^7<8! zZjomDF^M39P>Lx&qXui!!WMIZUtPQBI+HnVsi>$5Q%UJ$xp$5aB$N<%xuhCMDO1eO zUFTaNkSgWmvj3wW>oK-IKh1CB zdY>?&z;%I%P2k{FYROTdZa3?iZ-|QO_yhkcNCmIS=~Omo_T5>XRZqH}XHbmI1UYOv zN>TK;qRqvHQf*t?0#{*d97O>whj_~Hb@pWsB-!3DRQeg>usXLSVf^^sp9j~ zkD}&>3X{F=)q3N~$6hW^)H3E{g9y%E6HhJpcGu@YOlEl=flNK|kvmwjq3a0DT`w>y z;{xu=CO