From 94afe7c41dfe0f4731d19bc4fca7b62d6c03fb41 Mon Sep 17 00:00:00 2001 From: Willson <102905979+wallywallywally@users.noreply.github.com> Date: Thu, 7 Mar 2024 12:17:05 +0800 Subject: [PATCH 001/339] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f82e2494b7..9aa6d7e017 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Duke project template +# GiT + +Grocery in Time ! This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. From 7b4fc0235312e6639a04ed52d7de9f2087cbb07f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Thu, 7 Mar 2024 12:37:37 +0800 Subject: [PATCH 002/339] Update AboutUs --- docs/AboutUs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..9c401c7818 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) +Display | Name | Github Profile | Portfolio +--------|:--------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Willson | [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) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 8dd7e969c8de93057257bfaae925b8b7a433452a Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 7 Mar 2024 12:37:41 +0800 Subject: [PATCH 003/339] change john doe to 641 in aboutus --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..c5aa97fc3b 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,7 +2,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://via.placeholder.com/100.png?text=Photo) | 641 | [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) From 8d11e2bb4afdaba2fe6e5052e83e8e43516b2e9c Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 7 Mar 2024 12:37:51 +0800 Subject: [PATCH 004/339] changed john doe --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..e647bdc406 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) | Luo Zi Hui | [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) From 5e55005f5fd7a554f41fb3b0504ac3b1c2f174b1 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 7 Mar 2024 12:37:57 +0800 Subject: [PATCH 005/339] Edit John Doe to Me! --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..ce618caeac 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) | Sharlyn Lui | [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) From 06e3d8b155eb2fc3a1054a5a4ff9e6d9cce886a0 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 7 Mar 2024 12:40:52 +0800 Subject: [PATCH 006/339] Update about us --- docs/AboutUs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..31fc689c22 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) +Display | Name | Github Profile | Portfolio +--------|:--------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [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) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 2d1f8c84ec3e52bde04bb43ab785f5513cf3e647 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sun, 10 Mar 2024 19:44:06 +0800 Subject: [PATCH 007/339] Create basic version of GiT --- .vscode/settings.json | 3 + build.gradle | 4 +- src/main/java/seedu/duke/Duke.java | 21 ----- src/main/java/seedu/git/GiT.java | 83 ++++++++++++++++++++ src/main/java/seedu/grocery/Grocery.java | 39 +++++++++ src/main/java/seedu/grocery/GroceryList.java | 12 +++ 6 files changed, 139 insertions(+), 23 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 src/main/java/seedu/duke/Duke.java create mode 100644 src/main/java/seedu/git/GiT.java create mode 100644 src/main/java/seedu/grocery/Grocery.java create mode 100644 src/main/java/seedu/grocery/GroceryList.java diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..c5f3f6b9c7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index ea82051fab..decc781870 100644 --- a/build.gradle +++ b/build.gradle @@ -29,11 +29,11 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("seedu.git.GiT") } shadowJar { - archiveBaseName.set("duke") + archiveBaseName.set("GiT") archiveClassifier.set("") } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java deleted file mode 100644 index 5c74e68d59..0000000000 --- a/src/main/java/seedu/duke/Duke.java +++ /dev/null @@ -1,21 +0,0 @@ -package seedu.duke; - -import java.util.Scanner; - -public class Duke { - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - } -} diff --git a/src/main/java/seedu/git/GiT.java b/src/main/java/seedu/git/GiT.java new file mode 100644 index 0000000000..4aeaf877b9 --- /dev/null +++ b/src/main/java/seedu/git/GiT.java @@ -0,0 +1,83 @@ +package seedu.git; + +import java.util.Scanner; + +import seedu.grocery.Grocery; +import seedu.grocery.GroceryList; + +public class GiT { + /** + * Main entry-point for the java.duke.Duke application. + */ + public static void main(String[] args) { + String logo = " _______ ______\n" + + " / ____(_)_ __/\n" + + " / / __/ / / / \n" + + "/ /_/ / / / / \n" + + "\\____/_/ /_/ \n"; + + System.out.println("Hello from\n" + logo); + System.out.println("What is your name?"); + + Scanner in = new Scanner(System.in); + System.out.println("Hello " + in.nextLine()); + + + GroceryList groceryList = new GroceryList(); + Scanner scanner = new Scanner(System.in); + boolean isRunning = true; + + while (isRunning) { + System.out.println("Enter command:"); + String commandLine = scanner.nextLine(); + String[] commandParts = commandLine.split(" ", 2); + String command = commandParts[0]; + + switch (command.toLowerCase()) { + case "add": + // Assuming the format is "add GROCERY" + String[] addItemParts = commandParts[1].split("g/", 2); + groceryList.addGrocery(new Grocery(addItemParts[1], "", "")); + break; + case "exp": + // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" + String[] expParts = commandParts[1].split(" d/", 2); + groceryList.setExpiration(expParts[0], expParts[1]); + break; + case "amt": + // Assuming the format is "amt GROCERY a/AMOUNT" + String[] amtParts = commandParts[1].split(" a/", 2); + groceryList.setAmount(amtParts[0], amtParts[1]); + break; + case "del": + groceryList.removeGrocery(commandParts[1]); + break; + case "list": + groceryList.listGroceries(); + break; + case "help": + displayHelp(); + break; + case "exit": + System.out.println("bye bye!"); + isRunning = false; + break; + default: + System.out.println("Unknown command. Type 'help' for a list of commands."); + break; + } + } + + scanner.close(); + } + + private static void displayHelp() { + System.out.println("Here are some ways you can use this app!\n" + + "add GROCERY: adds the item GROCERY\n" + + "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY\n" + + "amt GROCERY a/AMOUNT: sets the amount of GROCERY\n" + + "del GROCERY: deletes GROCERY\n" + + "list: shows list of all groceries you have\n" + + "exit: exits the program."); + } +} diff --git a/src/main/java/seedu/grocery/Grocery.java b/src/main/java/seedu/grocery/Grocery.java new file mode 100644 index 0000000000..03431b14d6 --- /dev/null +++ b/src/main/java/seedu/grocery/Grocery.java @@ -0,0 +1,39 @@ +package seedu.grocery; + +public class Grocery { + private String name; + private String amount; + private String expiration; + + public Grocery(String name, String amount, String expiration) { + this.name = name; + this.amount = amount; + this.expiration = expiration; + } + + // Getters and setters + public String getName() { + return name; + } + + public String getAmount() { + return amount; + } + + public String getExpiration() { + return expiration; + } + + public void setName(String name) { + this.name = name; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public void setExpiration(String expiration) { + this.expiration = expiration; + } +} + diff --git a/src/main/java/seedu/grocery/GroceryList.java b/src/main/java/seedu/grocery/GroceryList.java new file mode 100644 index 0000000000..1a1726215a --- /dev/null +++ b/src/main/java/seedu/grocery/GroceryList.java @@ -0,0 +1,12 @@ +package seedu.grocery; + +import java.util.ArrayList; +import java.util.List; + +public class GroceryList { + private List groceries = new ArrayList<>(); + + + + // Additional methods for updating grocery items +} From 9f997f8514617d193b6e3435e7738a616e358e33 Mon Sep 17 00:00:00 2001 From: 641 <64634836+64-1@users.noreply.github.com> Date: Sun, 10 Mar 2024 20:13:05 +0800 Subject: [PATCH 008/339] Update EXPECTED.TXT --- text-ui-test/EXPECTED.TXT | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..bef8a140cf 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,9 @@ Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| + _______ ______ + / ____(_)_ __/ + / / __/ / / / +/ /_/ / / / / +\____/_/ /_/ What is your name? Hello James Gosling From c9b6007bfd69bb23b59a641de72b52c67ff7b3fe Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 11 Mar 2024 00:23:17 +0800 Subject: [PATCH 009/339] Add add grocery method into grocery list class --- src/main/java/seedu/grocery/GroceryList.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/grocery/GroceryList.java b/src/main/java/seedu/grocery/GroceryList.java index 1a1726215a..1bb40c04e7 100644 --- a/src/main/java/seedu/grocery/GroceryList.java +++ b/src/main/java/seedu/grocery/GroceryList.java @@ -6,7 +6,9 @@ public class GroceryList { private List groceries = new ArrayList<>(); - + public void addGrocery(Grocery grocery) { + groceries.add(grocery); + } // Additional methods for updating grocery items } From 761d902fbd2607969a48569dc2e26e230be6bbda Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 12 Mar 2024 21:13:51 +0800 Subject: [PATCH 010/339] Add method to view all the groceries --- src/main/java/seedu/git/GiT.java | 6 +++--- src/main/java/seedu/grocery/Grocery.java | 4 ++++ src/main/java/seedu/grocery/GroceryList.java | 7 +++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/git/GiT.java b/src/main/java/seedu/git/GiT.java index 4aeaf877b9..327ca57d70 100644 --- a/src/main/java/seedu/git/GiT.java +++ b/src/main/java/seedu/git/GiT.java @@ -42,15 +42,15 @@ public static void main(String[] args) { case "exp": // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" String[] expParts = commandParts[1].split(" d/", 2); - groceryList.setExpiration(expParts[0], expParts[1]); + //groceryList.setExpiration(expParts[0], expParts[1]); break; case "amt": // Assuming the format is "amt GROCERY a/AMOUNT" String[] amtParts = commandParts[1].split(" a/", 2); - groceryList.setAmount(amtParts[0], amtParts[1]); + //groceryList.setAmount(amtParts[0], amtParts[1]); break; case "del": - groceryList.removeGrocery(commandParts[1]); + //groceryList.removeGrocery(commandParts[1]); break; case "list": groceryList.listGroceries(); diff --git a/src/main/java/seedu/grocery/Grocery.java b/src/main/java/seedu/grocery/Grocery.java index 03431b14d6..83fa6f4ca2 100644 --- a/src/main/java/seedu/grocery/Grocery.java +++ b/src/main/java/seedu/grocery/Grocery.java @@ -35,5 +35,9 @@ public void setAmount(String amount) { public void setExpiration(String expiration) { this.expiration = expiration; } + + public String printGrocery() { + return this.name + ", amount: " + this.amount + ", expiration: " + this.expiration; + } } diff --git a/src/main/java/seedu/grocery/GroceryList.java b/src/main/java/seedu/grocery/GroceryList.java index 1bb40c04e7..25bfb5b001 100644 --- a/src/main/java/seedu/grocery/GroceryList.java +++ b/src/main/java/seedu/grocery/GroceryList.java @@ -10,5 +10,12 @@ public void addGrocery(Grocery grocery) { groceries.add(grocery); } + public void listGroceries() { + System.out.println("Here are your groceries!"); + for (Grocery grocery: groceries) { + System.out.println(" - " + grocery.printGrocery()); + } + } + // Additional methods for updating grocery items } From 811fcb8c84d6cc1ecafa06e7be6c1c86b8f2017d Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 03:11:41 +0800 Subject: [PATCH 011/339] Add exp, amt commands and refactor code --- src/main/java/exceptions/GitException.java | 20 ++++ .../exceptions/NoSuchGroceryException.java | 14 +++ .../java/exceptions/WrongFormatException.java | 29 +++++ src/main/java/git/Git.java | 103 ++++++++++++++++++ src/main/java/git/Ui.java | 73 +++++++++++++ .../java/{seedu => }/grocery/Grocery.java | 12 +- src/main/java/grocery/GroceryList.java | 81 ++++++++++++++ src/main/java/seedu/git/GiT.java | 83 -------------- src/main/java/seedu/grocery/GroceryList.java | 14 --- .../duke/DukeTest.java => git/GitTest.java} | 7 +- src/test/java/grocery/GroceryListTest.java | 35 ++++++ 11 files changed, 370 insertions(+), 101 deletions(-) create mode 100644 src/main/java/exceptions/GitException.java create mode 100644 src/main/java/exceptions/NoSuchGroceryException.java create mode 100644 src/main/java/exceptions/WrongFormatException.java create mode 100644 src/main/java/git/Git.java create mode 100644 src/main/java/git/Ui.java rename src/main/java/{seedu => }/grocery/Grocery.java (77%) create mode 100644 src/main/java/grocery/GroceryList.java delete mode 100644 src/main/java/seedu/git/GiT.java delete mode 100644 src/main/java/seedu/grocery/GroceryList.java rename src/test/java/{seedu/duke/DukeTest.java => git/GitTest.java} (82%) create mode 100644 src/test/java/grocery/GroceryListTest.java diff --git a/src/main/java/exceptions/GitException.java b/src/main/java/exceptions/GitException.java new file mode 100644 index 0000000000..e6055b1fc2 --- /dev/null +++ b/src/main/java/exceptions/GitException.java @@ -0,0 +1,20 @@ +package exceptions; + +/** + * Represents abstract superclass for GiT-specific exceptions. + */ +public abstract class GitException extends Exception { + protected String message; + + /** + * Constructs WallybotException. + */ + public GitException() {} + + /** + * Returns error message. + */ + public String getMessage() { + return message; + } +} diff --git a/src/main/java/exceptions/NoSuchGroceryException.java b/src/main/java/exceptions/NoSuchGroceryException.java new file mode 100644 index 0000000000..08f6cf87a7 --- /dev/null +++ b/src/main/java/exceptions/NoSuchGroceryException.java @@ -0,0 +1,14 @@ +package exceptions; + + +/** + * Represents the exception thrown when the grocery to edit does not exist. + */ +public class NoSuchGroceryException extends GitException { + /** + * Constructs NoSuchGroceryException. + */ + public NoSuchGroceryException() { + message = "The grocery does not exist!"; + } +} diff --git a/src/main/java/exceptions/WrongFormatException.java b/src/main/java/exceptions/WrongFormatException.java new file mode 100644 index 0000000000..2e05745b31 --- /dev/null +++ b/src/main/java/exceptions/WrongFormatException.java @@ -0,0 +1,29 @@ +package exceptions; + +/** + * Represents the exception thrown when the command does not follow the proper format. + */ +public class WrongFormatException extends GitException { + /** + * Constructs WrongFormatException. + */ + public WrongFormatException(String command) { + message = printWrongFormatFix(command); + } + + /** + * Creates a message that reminds the user of the proper command format. + */ + public String printWrongFormatFix(String command) { + StringBuilder message = new StringBuilder(); + message.append("Command is in the wrong format, type \"help\" for more information."); + message.append(System.lineSeparator()); + if (command.equals("date")) { + message.append("exp needs 'd/'"); + } else if (command.equals("amt")) { + message.append("amt needs 'a/'"); + } + + return message.toString(); + } +} diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java new file mode 100644 index 0000000000..1f9ad72baa --- /dev/null +++ b/src/main/java/git/Git.java @@ -0,0 +1,103 @@ +package git; + +import java.util.Scanner; + +import exceptions.GitException; +import grocery.Grocery; +import grocery.GroceryList; + +/** + * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! + */ +public class Git { + // ATTRIBUTES + private GroceryList groceryList; + private Ui ui; + private boolean isRunning; + + // METHODS + /** + * Initialise Git. + */ + public Git() { + groceryList = new GroceryList(); + ui = new Ui(); + isRunning = true; + } + + /** + * Handles commands. + * + * @param command Command. + * @param details Command details. + * @throws GitException Exception thrown depending on specific error. + */ + private void executeCommand(String command, String details) throws GitException { + switch (command) { + case "add": + // Assuming the format is "add GROCERY" + Grocery grocery = new Grocery(details, "", ""); + groceryList.addGrocery(grocery); + break; + + case "exp": + groceryList.setExpiration(details); + break; + + case "amt": + groceryList.setAmount(details); + break; + + case "del": + // groceryList.removeGrocery(commandParts[1]); + break; + + case "list": + // groceryList.listGroceries(); + break; + + case "help": + ui.displayHelp(); + break; + + case "exit": + System.out.println("bye bye!"); + isRunning = false; + break; + + default: + System.out.println("Unknown command. Type 'help' for a list of commands."); + break; + } + } + + /** + * Runs Git. + */ + private void run() { + Scanner scanner = new Scanner(System.in); + + while (isRunning) { + try { + String[] commandParts = ui.processInput(); + executeCommand(commandParts[0], commandParts[1]); + } catch (GitException e) { + System.out.println(e.getMessage()); + } catch (ArrayIndexOutOfBoundsException e) { + // throw the other error + } finally { + ui.printLine(); + } + } + + scanner.close(); + } + + /** + * Main for GiT. + */ + public static void main(String[] args) { + new Git().run(); + } + +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java new file mode 100644 index 0000000000..d8afa098e1 --- /dev/null +++ b/src/main/java/git/Ui.java @@ -0,0 +1,73 @@ +package git; + +import java.util.Scanner; + +import exceptions.GitException; + + +/** + * Deals with interactions with the user. + */ +public class Ui { + // ATTRIBUTES + public static final String DIVIDER = "- - - - -"; + private Scanner in; + + // METHODS + /** + * Constructs Ui and initialises Scanner to read input. + */ + public Ui() { + in = new Scanner(System.in); + printWelcome(); + } + + /** + * Prints welcome message. + */ + private void printWelcome() { + final String GITLOGO = + " _______ ______\n" + + " / ____(_)_ __/\n" + + " / / __/ / / / \n" + + "/ /_/ / / / / \n" + + "\\____/_/ /_/ \n"; + + System.out.println("Hello from\n" + GITLOGO); + System.out.println("What is your name?"); + System.out.println("Hello " + in.nextLine() + "!"); + System.out.println("Enter command:"); + } + + /** + * Processes user input into commands and their details. + */ + public String[] processInput() throws GitException { + String command = in.next().toLowerCase(); + String input = in.nextLine().strip(); + + return new String[]{command, input}; + } + + /** + * Displays help message containing all possible commands. + */ + public void displayHelp() { + System.out.println( + "Here are some ways you can use this app!\n" + + "add GROCERY: adds the item GROCERY\n" + + "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY\n" + + "amt GROCERY a/AMOUNT: sets the amount of GROCERY\n" + + "del GROCERY: deletes GROCERY\n" + + "list: shows list of all groceries you have\n" + + "exit: exits the program." + ); + } + + /** + * Prints divider for user readability. + */ + public void printLine() { + System.out.println(DIVIDER); + } +} diff --git a/src/main/java/seedu/grocery/Grocery.java b/src/main/java/grocery/Grocery.java similarity index 77% rename from src/main/java/seedu/grocery/Grocery.java rename to src/main/java/grocery/Grocery.java index 03431b14d6..d20986bd2b 100644 --- a/src/main/java/seedu/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -1,10 +1,20 @@ -package seedu.grocery; +package grocery; +/** + * Represents a grocery. + */ public class Grocery { private String name; private String amount; private String expiration; + /** + * Constructs a Grocery. + * + * @param name Name. + * @param amount Measurement of grocery. + * @param expiration When grocery expires. + */ public Grocery(String name, String amount, String expiration) { this.name = name; this.amount = amount; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java new file mode 100644 index 0000000000..510e8dd03a --- /dev/null +++ b/src/main/java/grocery/GroceryList.java @@ -0,0 +1,81 @@ +package grocery; + +import exceptions.GitException; +import exceptions.NoSuchGroceryException; +import exceptions.WrongFormatException; + +import java.util.ArrayList; +import java.util.List; + +/** + * Stores all the user's groceries. + */ +public class GroceryList { + private List groceries; + + /** + * Constructs Grocerylist. + */ + public GroceryList() { + groceries = new ArrayList<>(); + } + + /** + * Adds a grocery. + */ + public void addGrocery(Grocery grocery) { + groceries.add(grocery); + System.out.println(grocery.getName() + " added!"); + } + + /** + * Returns the desired grocery. + */ + private Grocery getGrocery(String name) throws NoSuchGroceryException { + int index = -1; + for (Grocery grocery : groceries) { + if(grocery.getName().equals(name)) { + index = groceries.indexOf(grocery); + break; + } + } + + if (index != -1) { + return groceries.get(index); + } else { + throw new NoSuchGroceryException(); + } + } + + /** + * Adds the expiration date of an existing grocery. + */ + public void setExpiration(String details) throws GitException { + try { + // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" + String[] expParts = details.split("d/", 2); + Grocery grocery = getGrocery(expParts[0].strip()); + grocery.setExpiration(expParts[1].strip()); + System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); + } catch (ArrayIndexOutOfBoundsException e) { + throw new WrongFormatException("date"); + } + } + + /** + * Adds the amount of an existing grocery. + */ + public void setAmount(String details) throws GitException { + try { + // Assuming the format is "amt GROCERY a/AMOUNT" + String[] expParts = details.split("a/", 2); + Grocery grocery = getGrocery(expParts[0].strip()); + grocery.setAmount(expParts[1].strip()); + System.out.println(grocery.getName() + ": " + grocery.getAmount()); + } catch (ArrayIndexOutOfBoundsException e) { + throw new WrongFormatException("amt"); + } + } + + +} diff --git a/src/main/java/seedu/git/GiT.java b/src/main/java/seedu/git/GiT.java deleted file mode 100644 index 4aeaf877b9..0000000000 --- a/src/main/java/seedu/git/GiT.java +++ /dev/null @@ -1,83 +0,0 @@ -package seedu.git; - -import java.util.Scanner; - -import seedu.grocery.Grocery; -import seedu.grocery.GroceryList; - -public class GiT { - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) { - String logo = " _______ ______\n" - + " / ____(_)_ __/\n" - + " / / __/ / / / \n" - + "/ /_/ / / / / \n" - + "\\____/_/ /_/ \n"; - - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - - - GroceryList groceryList = new GroceryList(); - Scanner scanner = new Scanner(System.in); - boolean isRunning = true; - - while (isRunning) { - System.out.println("Enter command:"); - String commandLine = scanner.nextLine(); - String[] commandParts = commandLine.split(" ", 2); - String command = commandParts[0]; - - switch (command.toLowerCase()) { - case "add": - // Assuming the format is "add GROCERY" - String[] addItemParts = commandParts[1].split("g/", 2); - groceryList.addGrocery(new Grocery(addItemParts[1], "", "")); - break; - case "exp": - // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" - String[] expParts = commandParts[1].split(" d/", 2); - groceryList.setExpiration(expParts[0], expParts[1]); - break; - case "amt": - // Assuming the format is "amt GROCERY a/AMOUNT" - String[] amtParts = commandParts[1].split(" a/", 2); - groceryList.setAmount(amtParts[0], amtParts[1]); - break; - case "del": - groceryList.removeGrocery(commandParts[1]); - break; - case "list": - groceryList.listGroceries(); - break; - case "help": - displayHelp(); - break; - case "exit": - System.out.println("bye bye!"); - isRunning = false; - break; - default: - System.out.println("Unknown command. Type 'help' for a list of commands."); - break; - } - } - - scanner.close(); - } - - private static void displayHelp() { - System.out.println("Here are some ways you can use this app!\n" + - "add GROCERY: adds the item GROCERY\n" + - "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY\n" + - "amt GROCERY a/AMOUNT: sets the amount of GROCERY\n" + - "del GROCERY: deletes GROCERY\n" + - "list: shows list of all groceries you have\n" + - "exit: exits the program."); - } -} diff --git a/src/main/java/seedu/grocery/GroceryList.java b/src/main/java/seedu/grocery/GroceryList.java deleted file mode 100644 index 1bb40c04e7..0000000000 --- a/src/main/java/seedu/grocery/GroceryList.java +++ /dev/null @@ -1,14 +0,0 @@ -package seedu.grocery; - -import java.util.ArrayList; -import java.util.List; - -public class GroceryList { - private List groceries = new ArrayList<>(); - - public void addGrocery(Grocery grocery) { - groceries.add(grocery); - } - - // Additional methods for updating grocery items -} diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/git/GitTest.java similarity index 82% rename from src/test/java/seedu/duke/DukeTest.java rename to src/test/java/git/GitTest.java index 2dda5fd651..e38822ab2b 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/git/GitTest.java @@ -1,10 +1,11 @@ -package seedu.duke; +package git; + +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; -class DukeTest { +public class GitTest { @Test public void sampleTest() { assertTrue(true); diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java new file mode 100644 index 0000000000..b4917f8cba --- /dev/null +++ b/src/test/java/grocery/GroceryListTest.java @@ -0,0 +1,35 @@ +package grocery; + +import exceptions.GitException; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + + +public class GroceryListTest { + // exp + @Test + public void setExpiration_noSuchGrocery_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.setExpiration("nothing"); + } catch (GitException e) { + assertEquals("The grocery does not exist!", e.getMessage()); + } + } + + @Test + public void setExpiration_wrongFormat_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", "", "")); + gl.setExpiration("Meat"); + } catch (GitException e) { + String message = "Command is in the wrong format, type \"help\" for more information." + + System.lineSeparator() + + "exp needs 'd/'"; + assertEquals(message, e.getMessage()); + } + } + +} From 9910de66e0966af3c8b31d7431b70fe034703adb Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 03:51:11 +0800 Subject: [PATCH 012/339] Fix CI issues --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index decc781870..d35d5d76bb 100644 --- a/build.gradle +++ b/build.gradle @@ -29,11 +29,11 @@ test { } application { - mainClass.set("seedu.git.GiT") + mainClass.set("git.Git") } shadowJar { - archiveBaseName.set("GiT") + archiveBaseName.set("Git") archiveClassifier.set("") } From 2ca31892933aee23f18ce34cd836ceb905ca77f6 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 03:58:49 +0800 Subject: [PATCH 013/339] Fix CI issues v2 --- 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 bef8a140cf..fd609d9377 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -6,4 +6,4 @@ Hello from \____/_/ /_/ What is your name? -Hello James Gosling +Hello James Gosling! From 36f66cc2101e21162611f9a831225f5f917d2db3 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 04:02:03 +0800 Subject: [PATCH 014/339] Fix CI issues v3 --- src/main/java/git/Git.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index f63ab7159f..3b223534c8 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,7 +1,5 @@ package git; -import java.util.Scanner; - import exceptions.GitException; import grocery.Grocery; import grocery.GroceryList; @@ -75,8 +73,6 @@ private void executeCommand(String command, String details) throws GitException * Runs Git. */ private void run() { - Scanner scanner = new Scanner(System.in); - while (isRunning) { try { String[] commandParts = ui.processInput(); @@ -89,8 +85,6 @@ private void run() { ui.printLine(); } } - - scanner.close(); } /** From 47a87a5526667202c35348875d0ce47b0bf4825f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 04:18:15 +0800 Subject: [PATCH 015/339] Fix CI issues v4 --- src/main/java/git/Git.java | 15 +++++++-------- src/main/java/git/Ui.java | 6 ++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 3b223534c8..dfe5e0dc97 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -26,24 +26,23 @@ public Git() { /** * Handles commands. * - * @param command Command. - * @param details Command details. + * @param commandParts Command and its details. * @throws GitException Exception thrown depending on specific error. */ - private void executeCommand(String command, String details) throws GitException { - switch (command) { + private void executeCommand(String[] commandParts) throws GitException { + switch (commandParts[0]) { case "add": // Assuming the format is "add GROCERY" - Grocery grocery = new Grocery(details, "", ""); + Grocery grocery = new Grocery(commandParts[1], "", ""); groceryList.addGrocery(grocery); break; case "exp": - groceryList.setExpiration(details); + groceryList.setExpiration(commandParts[1]); break; case "amt": - groceryList.setAmount(details); + groceryList.setAmount(commandParts[1]); break; case "del": @@ -76,7 +75,7 @@ private void run() { while (isRunning) { try { String[] commandParts = ui.processInput(); - executeCommand(commandParts[0], commandParts[1]); + executeCommand(commandParts); } catch (GitException e) { System.out.println(e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index d8afa098e1..ca870a97b5 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -43,10 +43,8 @@ private void printWelcome() { * Processes user input into commands and their details. */ public String[] processInput() throws GitException { - String command = in.next().toLowerCase(); - String input = in.nextLine().strip(); - - return new String[]{command, input}; + String commandLine = in.nextLine(); + return commandLine.strip().split(" ", 2); } /** From f05ae477c0fb86966c8c1c87098f32ca1af73a68 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 04:22:59 +0800 Subject: [PATCH 016/339] Update text-ui-test --- text-ui-test/EXPECTED.TXT | 3 +++ text-ui-test/input.txt | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index fd609d9377..f202ade2c1 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -7,3 +7,6 @@ Hello from What is your name? Hello James Gosling! +Enter command: +bye bye! +- - - - - \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..0ce8051ef6 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1,2 @@ -James Gosling \ No newline at end of file +James Gosling +exit \ No newline at end of file From 16a955f3910262d424581ec00f6918084e448d5b Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 04:24:45 +0800 Subject: [PATCH 017/339] Update text-ui-test v2 --- text-ui-test/EXPECTED.TXT | 2 +- text-ui-test/input.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index f202ade2c1..4a9ebd09ed 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -9,4 +9,4 @@ What is your name? Hello James Gosling! Enter command: bye bye! -- - - - - \ No newline at end of file +- - - - - diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 0ce8051ef6..f69b832290 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,2 +1,2 @@ James Gosling -exit \ No newline at end of file +exit From 7a7f9434a44514d71db72c462b03762e53a511b9 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 13 Mar 2024 04:57:34 +0800 Subject: [PATCH 018/339] Remove logo to fix CI --- src/main/java/git/Ui.java | 3 ++- text-ui-test/EXPECTED.TXT | 8 +------- text-ui-test/input.txt | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index ca870a97b5..e08ad37289 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -26,6 +26,7 @@ public Ui() { * Prints welcome message. */ private void printWelcome() { + // LOGO causes runtest.bat to fail, failing our CI final String GITLOGO = " _______ ______\n" + " / ____(_)_ __/\n" @@ -33,7 +34,7 @@ private void printWelcome() { + "/ /_/ / / / / \n" + "\\____/_/ /_/ \n"; - System.out.println("Hello from\n" + GITLOGO); + System.out.println("Hello from GiT"); System.out.println("What is your name?"); System.out.println("Hello " + in.nextLine() + "!"); System.out.println("Enter command:"); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 4a9ebd09ed..4e61c678b2 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,10 +1,4 @@ -Hello from - _______ ______ - / ____(_)_ __/ - / / __/ / / / -/ /_/ / / / / -\____/_/ /_/ - +Hello from GiT What is your name? Hello James Gosling! Enter command: diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f69b832290..0ce8051ef6 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,2 +1,2 @@ James Gosling -exit +exit \ No newline at end of file From e444026fdbedd12e2f1aefb4ac2ac14cd3bebd5e Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 13 Mar 2024 23:26:56 +0800 Subject: [PATCH 019/339] Added delete method --- src/main/java/git/Git.java | 2 +- src/main/java/grocery/GroceryList.java | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index dfe5e0dc97..c13030b4ac 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -46,7 +46,7 @@ private void executeCommand(String[] commandParts) throws GitException { break; case "del": - // groceryList.removeGrocery(commandParts[1]); + groceryList.removeGrocery(commandParts[1]); break; case "list": diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index d093436150..a6c4553110 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -86,5 +86,12 @@ public void listGroceries() { System.out.println(" - " + grocery.printGrocery()); } } - + public void removeGrocery(String details) throws NoSuchGroceryException { + // Assuming the format is "del GROCERY" + Grocery grocery = getGrocery(details); + //System.out.println("I have deleted the task: "); + //System.out.println(grocery); //need to toString this to print correctly + groceries.remove(grocery); + System.out.println("You now have " + groceries.size() + " groceries left"); + } } From f085c6f943dc2c3cf55fe98fa12db6c328ee7c64 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 14 Mar 2024 13:01:08 +0800 Subject: [PATCH 020/339] Updated delete method --- src/main/java/git/Git.java | 2 +- src/main/java/grocery/GroceryList.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index c13030b4ac..dad31c92d7 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -46,7 +46,7 @@ private void executeCommand(String[] commandParts) throws GitException { break; case "del": - groceryList.removeGrocery(commandParts[1]); + groceryList.removeGrocery(commandParts[1]); break; case "list": diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index a6c4553110..48bd4e5703 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -89,9 +89,7 @@ public void listGroceries() { public void removeGrocery(String details) throws NoSuchGroceryException { // Assuming the format is "del GROCERY" Grocery grocery = getGrocery(details); - //System.out.println("I have deleted the task: "); - //System.out.println(grocery); //need to toString this to print correctly - groceries.remove(grocery); - System.out.println("You now have " + groceries.size() + " groceries left"); + groceries.remove(grocery); + System.out.println("You now have " + groceries.size() + " groceries left"); } } From d4a3bb42d6ced25b1d23c43e70e50402f6436c83 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 14 Mar 2024 19:02:25 +0800 Subject: [PATCH 021/339] Add JUnit test to test for printGroceries when no amount and expiration date were given --- src/main/java/grocery/GroceryList.java | 6 ++++++ src/test/java/grocery/GroceryTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/test/java/grocery/GroceryTest.java diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 48bd4e5703..54402c4f77 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -81,11 +81,17 @@ public void setAmount(String details) throws GitException { * Lists all the user's groceries. */ public void listGroceries() { + int size = groceries. size(); + if (size == 0) { + System.out.println("There's no groceries!"); + return; + } System.out.println("Here are your groceries!"); for (Grocery grocery: groceries) { System.out.println(" - " + grocery.printGrocery()); } } + public void removeGrocery(String details) throws NoSuchGroceryException { // Assuming the format is "del GROCERY" Grocery grocery = getGrocery(details); diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java new file mode 100644 index 0000000000..4e9912b9f8 --- /dev/null +++ b/src/test/java/grocery/GroceryTest.java @@ -0,0 +1,15 @@ +package grocery; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class GroceryTest { + @Test + public void printGrocery_noAmountNoExpiration_leaveEmpty() { + Grocery grocery = new Grocery("apple", "", ""); + String message = "apple" + ", amount: " + ", expiration: "; + assertEquals(message, grocery.printGrocery()); + } + +} \ No newline at end of file From 787ae874bbcaeaf355b91fb1665817fafe8b31a4 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 14 Mar 2024 22:23:24 +0800 Subject: [PATCH 022/339] Add exception handling to addGrocery method and add test for IllegalArgumentException --- src/main/java/grocery/GroceryList.java | 13 +++++++++++-- src/test/java/grocery/GroceryListTest.java | 11 +++++++++++ src/test/java/grocery/GroceryTest.java | 6 ++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 54402c4f77..19c6aea1ab 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -24,9 +24,18 @@ public GroceryList() { * Adds a grocery. */ public void addGrocery(Grocery grocery) { - groceries.add(grocery); - System.out.println(grocery.getName() + " added!"); + try { + groceries.add(grocery); + System.out.println(grocery.getName() + " added!"); + } catch (NullPointerException e) { + System.out.println("Failed to add grocery: the groceries collection is null."); + } catch (IllegalArgumentException e) { + System.out.println("Failed to add grocery: " + e.getMessage()); + } catch (Exception e) { + System.out.println("An unexpected error occurred while adding the grocery: " + e.getMessage()); + } } + /** * Returns the desired grocery. diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index b4917f8cba..8efcba29e6 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class GroceryListTest { @@ -32,4 +33,14 @@ public void setExpiration_wrongFormat_exceptionThrown() { } } + @Test + public void addGrocery_throwIllegalArgument_exception(){ + try{ + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("InvalidGroceryName", null, null)); + fail("Expected IllegalArgumentException was not thrown."); + } catch (IllegalArgumentException e){ + assertEquals("The grocery name is invalid.", e.getMessage()); + } + } } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 4e9912b9f8..2fb1fcf574 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -1,8 +1,7 @@ package grocery; import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class GroceryTest { @Test @@ -11,5 +10,4 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { String message = "apple" + ", amount: " + ", expiration: "; assertEquals(message, grocery.printGrocery()); } - -} \ No newline at end of file +} From da3c367cd01eb876e43ab293629c101f12323e25 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 14 Mar 2024 22:30:42 +0800 Subject: [PATCH 023/339] Add validation for grocery name in addGrocery method --- src/main/java/grocery/GroceryList.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 19c6aea1ab..62f5e025e0 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -24,13 +24,14 @@ public GroceryList() { * Adds a grocery. */ public void addGrocery(Grocery grocery) { + if (grocery.getName() == null || grocery.getName().trim().isEmpty()) { + throw new IllegalArgumentException("The grocery name is invalid."); + } try { groceries.add(grocery); System.out.println(grocery.getName() + " added!"); } catch (NullPointerException e) { System.out.println("Failed to add grocery: the groceries collection is null."); - } catch (IllegalArgumentException e) { - System.out.println("Failed to add grocery: " + e.getMessage()); } catch (Exception e) { System.out.println("An unexpected error occurred while adding the grocery: " + e.getMessage()); } From 44fc17e04f2729208b308fbc55d65b836b54fa58 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 14 Mar 2024 22:41:59 +0800 Subject: [PATCH 024/339] Refactor addGrocery_throwIllegalArgument_exception method in GroceryListTest.java --- src/test/java/grocery/GroceryListTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 8efcba29e6..423ddad84c 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -34,13 +34,13 @@ public void setExpiration_wrongFormat_exceptionThrown() { } @Test - public void addGrocery_throwIllegalArgument_exception(){ - try{ + public void addGrocery_throwIllegalArgument_exception() { + try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("InvalidGroceryName", null, null)); + gl.addGrocery(new Grocery(null, null, null)); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); - } catch (IllegalArgumentException e){ + } catch (IllegalArgumentException e) { assertEquals("The grocery name is invalid.", e.getMessage()); } - } + } } From e5f8da69dbfaa284c37a49c858055ceb90fc908e Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 14 Mar 2024 23:44:54 +0800 Subject: [PATCH 025/339] Edited comments --- src/main/java/exceptions/GitException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/exceptions/GitException.java b/src/main/java/exceptions/GitException.java index e6055b1fc2..ed27413251 100644 --- a/src/main/java/exceptions/GitException.java +++ b/src/main/java/exceptions/GitException.java @@ -7,7 +7,7 @@ public abstract class GitException extends Exception { protected String message; /** - * Constructs WallybotException. + * Constructs GiTException. */ public GitException() {} From d60809746446a9157d40e20ea1710c885093c805 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 15 Mar 2024 00:22:53 +0800 Subject: [PATCH 026/339] Added JUnit Test and refactored Ui class! --- src/main/java/git/Ui.java | 30 ++++++++++++++++++++++ src/main/java/grocery/GroceryList.java | 16 +++++------- src/test/java/grocery/GroceryListTest.java | 19 +++++++++++--- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e08ad37289..398eaf5c47 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -1,8 +1,10 @@ package git; +import java.util.List; import java.util.Scanner; import exceptions.GitException; +import grocery.Grocery; /** @@ -63,6 +65,34 @@ public void displayHelp() { ); } + public static void printExpSet(Grocery grocery) { + System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); + } + + public static void printGroceryAdded(Grocery grocery) { + System.out.println(grocery.getName() + " added!"); + } + + public static void printAmtSet(Grocery grocery) { + System.out.println(grocery.getName() + ": " + grocery.getAmount()); + } + + public static void printNoGrocery() { + System.out.println("There's no groceries!"); + } + + public static void printGroceryList(List groceries) { + System.out.println("Here are your groceries!"); + for (Grocery grocery: groceries) { + System.out.println(" - " + grocery.printGrocery()); + } + } + + public static void printGroceryRemoved(Grocery grocery, List groceries) { + System.out.println("You now have " + groceries.size() + " groceries left"); + } + + /** * Prints divider for user readability. */ diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 62f5e025e0..33f2a24c7f 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; +import git.Ui; /** * Stores all the user's groceries. @@ -29,7 +30,7 @@ public void addGrocery(Grocery grocery) { } try { groceries.add(grocery); - System.out.println(grocery.getName() + " added!"); + Ui.printGroceryAdded(grocery); } catch (NullPointerException e) { System.out.println("Failed to add grocery: the groceries collection is null."); } catch (Exception e) { @@ -66,7 +67,7 @@ public void setExpiration(String details) throws GitException { String[] expParts = details.split("d/", 2); Grocery grocery = getGrocery(expParts[0].strip()); grocery.setExpiration(expParts[1].strip()); - System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); + Ui.printExpSet(grocery); } catch (ArrayIndexOutOfBoundsException e) { throw new WrongFormatException("date"); } @@ -81,7 +82,7 @@ public void setAmount(String details) throws GitException { String[] expParts = details.split("a/", 2); Grocery grocery = getGrocery(expParts[0].strip()); grocery.setAmount(expParts[1].strip()); - System.out.println(grocery.getName() + ": " + grocery.getAmount()); + Ui.printAmtSet(grocery); } catch (ArrayIndexOutOfBoundsException e) { throw new WrongFormatException("amt"); } @@ -93,19 +94,16 @@ public void setAmount(String details) throws GitException { public void listGroceries() { int size = groceries. size(); if (size == 0) { - System.out.println("There's no groceries!"); + Ui.printNoGrocery(); return; } - System.out.println("Here are your groceries!"); - for (Grocery grocery: groceries) { - System.out.println(" - " + grocery.printGrocery()); - } + Ui.printGroceryList(groceries); } public void removeGrocery(String details) throws NoSuchGroceryException { // Assuming the format is "del GROCERY" Grocery grocery = getGrocery(details); groceries.remove(grocery); - System.out.println("You now have " + groceries.size() + " groceries left"); + Ui.printGroceryRemoved(grocery, groceries); } } diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 423ddad84c..96a408c57d 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -2,9 +2,10 @@ import exceptions.GitException; +import exceptions.NoSuchGroceryException; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; + +import static org.junit.jupiter.api.Assertions.*; public class GroceryListTest { @@ -42,5 +43,17 @@ public void addGrocery_throwIllegalArgument_exception() { } catch (IllegalArgumentException e) { assertEquals("The grocery name is invalid.", e.getMessage()); } - } + } + + @Test + public void removeGrocery_groceryDelete_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("fooood", null, null)); + gl.removeGrocery("food"); + fail("Expected NoSuchGroceryException not thrown"); + } catch (NoSuchGroceryException e) { + assertEquals("The grocery does not exist!", e.getMessage()); + } + } } From 32bb74dbc8779cfb23e90aa60ca387b8135b4eaf Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 15 Mar 2024 00:34:44 +0800 Subject: [PATCH 027/339] Solved checkstyle errors --- src/test/java/grocery/GroceryListTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 96a408c57d..4971bee94e 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -5,7 +5,8 @@ import exceptions.NoSuchGroceryException; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class GroceryListTest { From 38a005ac195e9017caa8e7bfe1514e632ddd2044 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Fri, 15 Mar 2024 12:34:41 +0800 Subject: [PATCH 028/339] Update code for viewing groceries to remove blank space when no amount and expiration --- src/main/java/grocery/Grocery.java | 4 +++- src/test/java/grocery/GroceryTest.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 60f5b973ab..5fb8c76519 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -47,7 +47,9 @@ public void setExpiration(String expiration) { } public String printGrocery() { - return this.name + ", amount: " + this.amount + ", expiration: " + this.expiration; + String amt = (this.amount.isEmpty() ) ? "" : ", amount: " + this.amount; + String exp = (this.expiration.isEmpty() ) ? "" : ", expiration: " + this.expiration; + return this.name + amt + exp; } } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 2fb1fcf574..7463d5a050 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -7,7 +7,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", "", ""); - String message = "apple" + ", amount: " + ", expiration: "; + String message = "apple"; assertEquals(message, grocery.printGrocery()); } } From ecc6b7f387066adafcf98144a5607e35af5d8870 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 15 Mar 2024 12:52:28 +0800 Subject: [PATCH 029/339] Added new JUnit test for Grocery --- src/test/java/grocery/GroceryTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 2fb1fcf574..568434aebe 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -10,4 +10,11 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { String message = "apple" + ", amount: " + ", expiration: "; assertEquals(message, grocery.printGrocery()); } + + @Test + public void printGrocery_correctAmtAndExp() { + Grocery grocery = new Grocery("chicken", "1 leg", "soon"); + String message = "chicken" + ", amount: 1 leg" + ", expiration: soon"; + assertEquals(message, grocery.printGrocery()); + } } From 6026578f2645183c14c2c06b80b972b9b83a4efc Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 15 Mar 2024 13:30:22 +0800 Subject: [PATCH 030/339] Added test case for add amount --- src/test/java/grocery/GroceryListTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 4971bee94e..f2b54e4c5b 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -57,4 +57,17 @@ public void removeGrocery_groceryDelete_exceptionThrown() { assertEquals("The grocery does not exist!", e.getMessage()); } } + @Test + public void setAmount_wrongFormat_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", "", "")); + gl.setAmount("Meat"); + } catch (GitException e) { + String message = "Command is in the wrong format, type \"help\" for more information." + + System.lineSeparator() + + "amt needs 'a/'"; + assertEquals(message, e.getMessage()); + } + } } From 8efd36381f7b45ca17c2d1a8c313aeb3d0406b5c Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Mon, 18 Mar 2024 20:54:00 +0800 Subject: [PATCH 031/339] Add assertion to view groceries function --- build.gradle | 1 + src/main/java/grocery/Grocery.java | 1 + src/main/java/grocery/GroceryList.java | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d35d5d76bb..bbe50bad45 100644 --- a/build.gradle +++ b/build.gradle @@ -43,4 +43,5 @@ checkstyle { run{ standardInput = System.in + enableAssertions = true; } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5fb8c76519..5ccc1e2574 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -47,6 +47,7 @@ public void setExpiration(String expiration) { } public String printGrocery() { + assert !(this.name.isEmpty()); String amt = (this.amount.isEmpty() ) ? "" : ", amount: " + this.amount; String exp = (this.expiration.isEmpty() ) ? "" : ", expiration: " + this.expiration; return this.name + amt + exp; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 33f2a24c7f..b4f3403b24 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -92,7 +92,7 @@ public void setAmount(String details) throws GitException { * Lists all the user's groceries. */ public void listGroceries() { - int size = groceries. size(); + int size = groceries.size(); if (size == 0) { Ui.printNoGrocery(); return; From 4c7cc6858111a1770cd71e8415069259909e4d86 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 13:06:31 +0800 Subject: [PATCH 032/339] Improve defensiveness --- logs/GroceryList.log | 32 +++++++ .../exceptions/EmptyGroceryException.java | 14 +++ .../IncompleteCommandException.java | 13 +++ .../exceptions/InvalidCommandException.java | 14 +++ src/main/java/git/Git.java | 13 +-- src/main/java/git/Ui.java | 37 ++++++-- src/main/java/grocery/Grocery.java | 5 ++ src/main/java/grocery/GroceryList.java | 87 ++++++++++++++----- src/main/java/grocery/LoggerGroceryList.java | 37 ++++++++ src/test/java/git/GitTest.java | 13 ++- src/test/java/grocery/GroceryListTest.java | 26 ++++-- 11 files changed, 251 insertions(+), 40 deletions(-) create mode 100644 logs/GroceryList.log create mode 100644 src/main/java/exceptions/EmptyGroceryException.java create mode 100644 src/main/java/exceptions/IncompleteCommandException.java create mode 100644 src/main/java/exceptions/InvalidCommandException.java create mode 100644 src/main/java/grocery/LoggerGroceryList.java diff --git a/logs/GroceryList.log b/logs/GroceryList.log new file mode 100644 index 0000000000..97b7e7d503 --- /dev/null +++ b/logs/GroceryList.log @@ -0,0 +1,32 @@ + + + + + 2024-03-20T04:59:24.082952300Z + 1710910764082 + 952300 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added a + + + + + + + 2024-03-20T05:03:55.680808700Z + 1710911035680 + 808700 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added noddles + + diff --git a/src/main/java/exceptions/EmptyGroceryException.java b/src/main/java/exceptions/EmptyGroceryException.java new file mode 100644 index 0000000000..ed1c6a1838 --- /dev/null +++ b/src/main/java/exceptions/EmptyGroceryException.java @@ -0,0 +1,14 @@ +package exceptions; + +/** + * Represents the exception thrown when the grocery is not given after the command. + */ +public class EmptyGroceryException extends GitException { + /** + * Constructs EmptyGroceryException. + */ + public EmptyGroceryException() { + message = "A grocery needs to be specified!"; + } + +} diff --git a/src/main/java/exceptions/IncompleteCommandException.java b/src/main/java/exceptions/IncompleteCommandException.java new file mode 100644 index 0000000000..33ef6ebcbd --- /dev/null +++ b/src/main/java/exceptions/IncompleteCommandException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the format is correct, but input is empty. + */ +public class IncompleteCommandException extends GitException { + /** + * Constructs IncompleteCommandException. + */ + public IncompleteCommandException(String parameter) { + message = parameter + " cannot be empty!"; + } +} diff --git a/src/main/java/exceptions/InvalidCommandException.java b/src/main/java/exceptions/InvalidCommandException.java new file mode 100644 index 0000000000..454005fd1d --- /dev/null +++ b/src/main/java/exceptions/InvalidCommandException.java @@ -0,0 +1,14 @@ +package exceptions; + +/** + * Represents the exception thrown when the command is invalid. + */ +public class InvalidCommandException extends GitException { + /** + * Constructs InvalidCommandException. + */ + public InvalidCommandException() { + message = "Unknown command. Type 'help' for a list of commands."; + } + +} diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index dad31c92d7..8bb2ca6938 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,6 +1,7 @@ package git; import exceptions.GitException; +import exceptions.InvalidCommandException; import grocery.Grocery; import grocery.GroceryList; @@ -29,7 +30,9 @@ public Git() { * @param commandParts Command and its details. * @throws GitException Exception thrown depending on specific error. */ - private void executeCommand(String[] commandParts) throws GitException { + public void executeCommand(String[] commandParts) throws GitException { + assert commandParts.length == 2 : "Command passed in wrong format"; + switch (commandParts[0]) { case "add": // Assuming the format is "add GROCERY" @@ -38,6 +41,7 @@ private void executeCommand(String[] commandParts) throws GitException { break; case "exp": + // if (commandParts.length < 2) throw new EmptyGroceryException(); groceryList.setExpiration(commandParts[1]); break; @@ -63,8 +67,7 @@ private void executeCommand(String[] commandParts) throws GitException { break; default: - System.out.println("Unknown command. Type 'help' for a list of commands."); - break; + throw new InvalidCommandException(); } } @@ -72,14 +75,14 @@ private void executeCommand(String[] commandParts) throws GitException { * Runs Git. */ private void run() { + ui.printWelcome(); + while (isRunning) { try { String[] commandParts = ui.processInput(); executeCommand(commandParts); } catch (GitException e) { System.out.println(e.getMessage()); - } catch (ArrayIndexOutOfBoundsException e) { - // throw the other error } finally { ui.printLine(); } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 398eaf5c47..3ed3a2089f 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Scanner; -import exceptions.GitException; import grocery.Grocery; @@ -21,13 +20,12 @@ public class Ui { */ public Ui() { in = new Scanner(System.in); - printWelcome(); } /** * Prints welcome message. */ - private void printWelcome() { + public void printWelcome() { // LOGO causes runtest.bat to fail, failing our CI final String GITLOGO = " _______ ______\n" @@ -38,16 +36,26 @@ private void printWelcome() { System.out.println("Hello from GiT"); System.out.println("What is your name?"); + printLine(); System.out.println("Hello " + in.nextLine() + "!"); System.out.println("Enter command:"); + printLine(); } /** * Processes user input into commands and their details. */ - public String[] processInput() throws GitException { + public String[] processInput() { String commandLine = in.nextLine(); - return commandLine.strip().split(" ", 2); + String[] commandParts = commandLine.strip().split(" ", 2); + assert commandParts.length > 0 : "Failed to read user input"; + + // Return an array of length 2 for executeCommand + if (commandParts.length == 1) { + return new String[]{commandParts[0], ""}; + } else { + return commandParts; + } } /** @@ -65,22 +73,37 @@ public void displayHelp() { ); } + /** + * Prints output after setting the selected grocery's expiration date. + */ public static void printExpSet(Grocery grocery) { System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } + /** + * Prints output after adding a grocery. + */ public static void printGroceryAdded(Grocery grocery) { System.out.println(grocery.getName() + " added!"); } + /** + * Prints output after setting the selected grocery's amount. + */ public static void printAmtSet(Grocery grocery) { System.out.println(grocery.getName() + ": " + grocery.getAmount()); } + /** + * Prints out when there are no groceries. + */ public static void printNoGrocery() { System.out.println("There's no groceries!"); } + /** + * Prints all groceries. + */ public static void printGroceryList(List groceries) { System.out.println("Here are your groceries!"); for (Grocery grocery: groceries) { @@ -88,11 +111,13 @@ public static void printGroceryList(List groceries) { } } + /** + * Prints output when the selected grocery is removed. + */ public static void printGroceryRemoved(Grocery grocery, List groceries) { System.out.println("You now have " + groceries.size() + " groceries left"); } - /** * Prints divider for user readability. */ diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5ccc1e2574..171ca5328c 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -1,5 +1,6 @@ package grocery; + /** * Represents a grocery. */ @@ -46,8 +47,12 @@ public void setExpiration(String expiration) { this.expiration = expiration; } + /** + * Returns a String representation of the Grocery. + */ public String printGrocery() { assert !(this.name.isEmpty()); + String amt = (this.amount.isEmpty() ) ? "" : ", amount: " + this.amount; String exp = (this.expiration.isEmpty() ) ? "" : ", expiration: " + this.expiration; return this.name + amt + exp; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index b4f3403b24..fc0feba150 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,46 +1,58 @@ package grocery; +import git.Ui; import exceptions.GitException; +import exceptions.EmptyGroceryException; +import exceptions.IncompleteCommandException; import exceptions.NoSuchGroceryException; import exceptions.WrongFormatException; import java.util.ArrayList; import java.util.List; -import git.Ui; +import java.util.logging.Logger; +import java.util.logging.Level; /** * Stores all the user's groceries. */ public class GroceryList { private List groceries; + private Logger logger; /** - * Constructs Grocerylist. + * Constructs GroceryList. */ public GroceryList() { groceries = new ArrayList<>(); + LoggerGroceryList.setupLogger(); + logger = Logger.getLogger(GroceryList.class.getName()); } /** * Adds a grocery. */ - public void addGrocery(Grocery grocery) { + public void addGrocery(Grocery grocery) throws EmptyGroceryException { if (grocery.getName() == null || grocery.getName().trim().isEmpty()) { - throw new IllegalArgumentException("The grocery name is invalid."); + throw new EmptyGroceryException(); } + try { groceries.add(grocery); Ui.printGroceryAdded(grocery); } catch (NullPointerException e) { - System.out.println("Failed to add grocery: the groceries collection is null."); + System.out.println("Failed to add grocery: he groceries collection is null."); } catch (Exception e) { System.out.println("An unexpected error occurred while adding the grocery: " + e.getMessage()); } + + logger.log(Level.INFO, "Added " + grocery.printGrocery()); } /** * Returns the desired grocery. + * + * @throws NoSuchGroceryException Selected grocery does not exist. */ private Grocery getGrocery(String name) throws NoSuchGroceryException { int index = -1; @@ -60,32 +72,58 @@ private Grocery getGrocery(String name) throws NoSuchGroceryException { /** * Adds the expiration date of an existing grocery. + * + * @throws GitException Exception thrown depending on error. */ public void setExpiration(String details) throws GitException { - try { - // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" - String[] expParts = details.split("d/", 2); - Grocery grocery = getGrocery(expParts[0].strip()); - grocery.setExpiration(expParts[1].strip()); - Ui.printExpSet(grocery); - } catch (ArrayIndexOutOfBoundsException e) { + if (details.isEmpty()) { + throw new EmptyGroceryException(); + } + + // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" + String parameter = "d/"; + String[] expParts = details.split(parameter, 2); + Grocery grocery = getGrocery(expParts[0].strip()); + + if (expParts.length < 2) { throw new WrongFormatException("date"); } + + String date = expParts[1].strip(); + if (date.isEmpty()) { + throw new IncompleteCommandException(parameter); + } else { + grocery.setExpiration(date); + Ui.printExpSet(grocery); + } } /** * Adds the amount of an existing grocery. + * + * @throws GitException Exception thrown depending on error. */ public void setAmount(String details) throws GitException { - try { - // Assuming the format is "amt GROCERY a/AMOUNT" - String[] expParts = details.split("a/", 2); - Grocery grocery = getGrocery(expParts[0].strip()); - grocery.setAmount(expParts[1].strip()); - Ui.printAmtSet(grocery); - } catch (ArrayIndexOutOfBoundsException e) { + if (details.isEmpty()) { + throw new EmptyGroceryException(); + } + + // Assuming the format is "amt GROCERY a/AMOUNT" + String parameter = "a/"; + String[] amtParts = details.split(parameter, 2); + Grocery grocery = getGrocery(amtParts[0].strip()); + + if (amtParts.length < 2) { throw new WrongFormatException("amt"); } + + String amount = amtParts[1].strip(); + if (amount.isEmpty()) { + throw new IncompleteCommandException(parameter); + } else { + grocery.setAmount(amount); + Ui.printAmtSet(grocery); + } } /** @@ -100,7 +138,16 @@ public void listGroceries() { Ui.printGroceryList(groceries); } - public void removeGrocery(String details) throws NoSuchGroceryException { + /** + * Removes a grocery. + * + * @throws GitException Exception thrown depending on error. + */ + public void removeGrocery(String details) throws GitException { + if (details.isEmpty()) { + throw new EmptyGroceryException(); + } + // Assuming the format is "del GROCERY" Grocery grocery = getGrocery(details); groceries.remove(grocery); diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java new file mode 100644 index 0000000000..e2c873271b --- /dev/null +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -0,0 +1,37 @@ +package grocery; + +import java.io.IOException; + +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; + +/** + * Logs metadata about the GroceryList class. + */ +public class LoggerGroceryList { + /** + * Configure logger for the GroceryList class. + */ + public static void setupLogger() { + Logger loggerGL = Logger.getLogger(GroceryList.class.getName()); + + LogManager.getLogManager().reset(); + loggerGL.setLevel(Level.ALL); + + ConsoleHandler ch = new ConsoleHandler(); + ch.setLevel(Level.SEVERE); + loggerGL.addHandler(ch); + + try { + FileHandler fh = new FileHandler("logs/./././GroceryList.log", true); + fh.setLevel(Level.INFO); + loggerGL.addHandler(fh); + } catch (IOException e) { + loggerGL.log(Level.SEVERE, "Logger for GroceryList class fails", e); + } + } + +} diff --git a/src/test/java/git/GitTest.java b/src/test/java/git/GitTest.java index e38822ab2b..9a5a47dbc7 100644 --- a/src/test/java/git/GitTest.java +++ b/src/test/java/git/GitTest.java @@ -1,13 +1,20 @@ package git; +import exceptions.GitException; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; public class GitTest { @Test - public void sampleTest() { - assertTrue(true); + public void executeCommand_invalidCommand_success() { + try { + Git git = new Git(); + String[] commandParts = {"nonsense", ""}; + git.executeCommand(commandParts); + } catch (GitException e) { + assertEquals("Unknown command. Type 'help' for a list of commands.", e.getMessage());; + } } } diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index f2b54e4c5b..09ee28cb77 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,8 +1,8 @@ package grocery; +import exceptions.EmptyGroceryException; import exceptions.GitException; -import exceptions.NoSuchGroceryException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -10,7 +10,17 @@ public class GroceryListTest { - // exp + @Test + public void setExpiration_success() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", "", "")); + gl.setExpiration("Meat d/ Monday"); + } catch (GitException e) { + fail("setExpiration should be successful"); + } + } + @Test public void setExpiration_noSuchGrocery_exceptionThrown() { try { @@ -36,13 +46,13 @@ public void setExpiration_wrongFormat_exceptionThrown() { } @Test - public void addGrocery_throwIllegalArgument_exception() { + public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); gl.addGrocery(new Grocery(null, null, null)); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); - } catch (IllegalArgumentException e) { - assertEquals("The grocery name is invalid.", e.getMessage()); + } catch (EmptyGroceryException e) { + assertEquals("A grocery needs to be specified!", e.getMessage()); } } @@ -53,10 +63,12 @@ public void removeGrocery_groceryDelete_exceptionThrown() { gl.addGrocery(new Grocery("fooood", null, null)); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); - } catch (NoSuchGroceryException e) { + } catch (GitException e) { + // NoSuchGroceryException assertEquals("The grocery does not exist!", e.getMessage()); } } + @Test public void setAmount_wrongFormat_exceptionThrown() { try { @@ -70,4 +82,6 @@ public void setAmount_wrongFormat_exceptionThrown() { assertEquals(message, e.getMessage()); } } + + } From 8dca66d83fea052c1b0b0c1f8fd8efe58429ee8e Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:07:47 +0800 Subject: [PATCH 033/339] Fix test --- logs/GroceryList.log | 96 ++++++++++++++++++++++++++++++ src/main/java/grocery/Grocery.java | 7 ++- 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/logs/GroceryList.log b/logs/GroceryList.log index 97b7e7d503..ab0f04bc0d 100644 --- a/logs/GroceryList.log +++ b/logs/GroceryList.log @@ -30,3 +30,99 @@ Added noddles + + + + + 2024-03-20T05:20:33.020653700Z + 1710912033020 + 653700 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T05:20:33.053643900Z + 1710912033053 + 643900 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T05:20:33.067648300Z + 1710912033067 + 648300 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + + + + + + + + + + + + + 2024-03-20T05:23:49.567394100Z + 1710912229567 + 394100 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + 2024-03-20T06:05:14.252450500Z + 1710914714252 + 450500 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 171ca5328c..629a0bfa12 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -50,11 +50,12 @@ public void setExpiration(String expiration) { /** * Returns a String representation of the Grocery. */ + // TODO: cannot take in NULL values ? public String printGrocery() { - assert !(this.name.isEmpty()); + assert !(this.name.isEmpty()) : "Grocery does not exist"; - String amt = (this.amount.isEmpty() ) ? "" : ", amount: " + this.amount; - String exp = (this.expiration.isEmpty() ) ? "" : ", expiration: " + this.expiration; + String amt = (this.amount == null || this.amount.isEmpty()) ? "" : ", amount: " + this.amount; + String exp = (this.amount == null || this.expiration.isEmpty()) ? "" : ", expiration: " + this.expiration; return this.name + amt + exp; } } From 09114a2ebb71dc90eb8d89790a6a28bdf062ba5e Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:12:36 +0800 Subject: [PATCH 034/339] Fix logger file access issue --- logs/GroceryList.log | 16 ++++++++++++++++ src/main/java/grocery/Grocery.java | 1 - src/main/java/grocery/LoggerGroceryList.java | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/logs/GroceryList.log b/logs/GroceryList.log index ab0f04bc0d..005d08bce7 100644 --- a/logs/GroceryList.log +++ b/logs/GroceryList.log @@ -126,3 +126,19 @@ Added fooood + + + + + 2024-03-20T06:11:47.080729900Z + 1710915107080 + 729900 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added good + + diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 629a0bfa12..d8a491584b 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -50,7 +50,6 @@ public void setExpiration(String expiration) { /** * Returns a String representation of the Grocery. */ - // TODO: cannot take in NULL values ? public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist"; diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index e2c873271b..0bf9741515 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -26,7 +26,7 @@ public static void setupLogger() { loggerGL.addHandler(ch); try { - FileHandler fh = new FileHandler("logs/./././GroceryList.log", true); + FileHandler fh = new FileHandler("logs/GroceryList.log", true); fh.setLevel(Level.INFO); loggerGL.addHandler(fh); } catch (IOException e) { From 930c5d60e42fdfed6c18ba95bde1542c727f0fd6 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:19:53 +0800 Subject: [PATCH 035/339] Fix logger file access issue by using relative paths --- logs/GroceryList.log | 16 ++++++++++++++++ src/main/java/grocery/LoggerGroceryList.java | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/logs/GroceryList.log b/logs/GroceryList.log index 005d08bce7..e06e99326f 100644 --- a/logs/GroceryList.log +++ b/logs/GroceryList.log @@ -142,3 +142,19 @@ Added good + + + + + 2024-03-20T06:19:10.135464900Z + 1710915550135 + 464900 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added a + + diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index 0bf9741515..d7baf4c2ca 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -1,5 +1,6 @@ package grocery; +import java.io.File; import java.io.IOException; import java.util.logging.Logger; @@ -26,7 +27,8 @@ public static void setupLogger() { loggerGL.addHandler(ch); try { - FileHandler fh = new FileHandler("logs/GroceryList.log", true); + String filepath = new File("logs/GroceryList.log").getAbsolutePath(); + FileHandler fh = new FileHandler(filepath, true); fh.setLevel(Level.INFO); loggerGL.addHandler(fh); } catch (IOException e) { From 24afb4fa64521219e33eaa43b9242b3b57626db7 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:25:28 +0800 Subject: [PATCH 036/339] Fix logger file access issue by using relative paths --- src/main/java/grocery/LoggerGroceryList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index d7baf4c2ca..3542514006 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -27,7 +27,7 @@ public static void setupLogger() { loggerGL.addHandler(ch); try { - String filepath = new File("logs/GroceryList.log").getAbsolutePath(); + String filepath = new File("tp/logs/GroceryList.log").getAbsolutePath(); FileHandler fh = new FileHandler(filepath, true); fh.setLevel(Level.INFO); loggerGL.addHandler(fh); From 62f6732f4822adf63b488c93ed8560237b8d49d5 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:44:03 +0800 Subject: [PATCH 037/339] Fix logger file access issue: try different path --- GroceryList.log | 16 ++ logs/GroceryList.log | 160 ------------------- src/main/java/grocery/LoggerGroceryList.java | 6 +- 3 files changed, 20 insertions(+), 162 deletions(-) create mode 100644 GroceryList.log delete mode 100644 logs/GroceryList.log diff --git a/GroceryList.log b/GroceryList.log new file mode 100644 index 0000000000..1934c820f2 --- /dev/null +++ b/GroceryList.log @@ -0,0 +1,16 @@ + + + + + 2024-03-20T06:31:21.248609900Z + 1710916281248 + 609900 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added food + + diff --git a/logs/GroceryList.log b/logs/GroceryList.log deleted file mode 100644 index e06e99326f..0000000000 --- a/logs/GroceryList.log +++ /dev/null @@ -1,160 +0,0 @@ - - - - - 2024-03-20T04:59:24.082952300Z - 1710910764082 - 952300 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added a - - - - - - - 2024-03-20T05:03:55.680808700Z - 1710911035680 - 808700 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added noddles - - - - - - - 2024-03-20T05:20:33.020653700Z - 1710912033020 - 653700 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T05:20:33.053643900Z - 1710912033053 - 643900 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T05:20:33.067648300Z - 1710912033067 - 648300 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - - - - - - - - - - - - - 2024-03-20T05:23:49.567394100Z - 1710912229567 - 394100 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-20T06:05:14.252450500Z - 1710914714252 - 450500 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-20T06:11:47.080729900Z - 1710915107080 - 729900 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added good - - - - - - - 2024-03-20T06:19:10.135464900Z - 1710915550135 - 464900 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added a - - diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index 3542514006..eaef7e6954 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -27,8 +27,10 @@ public static void setupLogger() { loggerGL.addHandler(ch); try { - String filepath = new File("tp/logs/GroceryList.log").getAbsolutePath(); - FileHandler fh = new FileHandler(filepath, true); + // TODO: /home/runner/work/tp/tp/text-ui-test///////tp/logs/GroceryList.log.clk + // initialises it in text-ui-test ??? + // do not put parent dir bruh + FileHandler fh = new FileHandler("GroceryList.log", true); fh.setLevel(Level.INFO); loggerGL.addHandler(fh); } catch (IOException e) { From d3319505a478004ffb15f1635cb88fb3c5b3b343 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:45:48 +0800 Subject: [PATCH 038/339] Fix checkstyleMain --- src/main/java/grocery/LoggerGroceryList.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index eaef7e6954..134f395721 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -1,6 +1,5 @@ package grocery; -import java.io.File; import java.io.IOException; import java.util.logging.Logger; From 4b53ce3c45390a1128f3e35d1cb902ffef014b56 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 20 Mar 2024 14:51:04 +0800 Subject: [PATCH 039/339] Update runtest.bat --- src/main/java/grocery/LoggerGroceryList.java | 3 --- text-ui-test/EXPECTED.TXT | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/grocery/LoggerGroceryList.java b/src/main/java/grocery/LoggerGroceryList.java index 134f395721..885bde817b 100644 --- a/src/main/java/grocery/LoggerGroceryList.java +++ b/src/main/java/grocery/LoggerGroceryList.java @@ -26,9 +26,6 @@ public static void setupLogger() { loggerGL.addHandler(ch); try { - // TODO: /home/runner/work/tp/tp/text-ui-test///////tp/logs/GroceryList.log.clk - // initialises it in text-ui-test ??? - // do not put parent dir bruh FileHandler fh = new FileHandler("GroceryList.log", true); fh.setLevel(Level.INFO); loggerGL.addHandler(fh); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 4e61c678b2..246581e325 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,6 +1,8 @@ Hello from GiT What is your name? +- - - - - Hello James Gosling! Enter command: +- - - - - bye bye! - - - - - From 78ea162bd221411d79c05ad1177336ab2ac141e2 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 20 Mar 2024 16:50:35 +0800 Subject: [PATCH 040/339] Added assertions to Ui --- GroceryList.log | 8 ++++++++ src/main/java/git/Ui.java | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/GroceryList.log b/GroceryList.log index 1934c820f2..0875e4ba24 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -14,3 +14,11 @@ Added food + + + + + + + + diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 3ed3a2089f..7ea772daa8 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -77,6 +77,8 @@ public void displayHelp() { * Prints output after setting the selected grocery's expiration date. */ public static void printExpSet(Grocery grocery) { + assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; + assert !(grocery.getExpiration().isEmpty()): "expiration date should not be empty"; System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } @@ -84,6 +86,7 @@ public static void printExpSet(Grocery grocery) { * Prints output after adding a grocery. */ public static void printGroceryAdded(Grocery grocery) { + assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; System.out.println(grocery.getName() + " added!"); } @@ -91,6 +94,7 @@ public static void printGroceryAdded(Grocery grocery) { * Prints output after setting the selected grocery's amount. */ public static void printAmtSet(Grocery grocery) { + assert !(grocery.getAmount().isEmpty()): "grocery amount should not be empty"; System.out.println(grocery.getName() + ": " + grocery.getAmount()); } From e157fa75155f30cd9ffcd9f2457111a2867c19c4 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 20 Mar 2024 21:05:39 +0800 Subject: [PATCH 041/339] Add assertions in removeGrocery and listGrocery --- GroceryList.log | 168 +++++++++++++++++++++++++ src/main/java/grocery/GroceryList.java | 2 + 2 files changed, 170 insertions(+) diff --git a/GroceryList.log b/GroceryList.log index 1934c820f2..76c3dc51c7 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -14,3 +14,171 @@ Added food + + + + + + + + + 2024-03-20T09:47:54.506992Z + 1710928074506 + 992000 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T09:47:54.559200200Z + 1710928074559 + 200200 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T09:47:54.581279500Z + 1710928074581 + 279500 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + + + + + 2024-03-20T09:47:54.605366900Z + 1710928074605 + 366900 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + 2024-03-20T09:48:21.534991500Z + 1710928101534 + 991500 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added whe + + + + + + + 2024-03-20T13:01:21.310491Z + 1710939681310 + 491000 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T13:01:21.331465Z + 1710939681331 + 465000 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T13:01:21.345003200Z + 1710939681345 + 3200 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + + + + + 2024-03-20T13:01:21.362571600Z + 1710939681362 + 571600 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index fc0feba150..223cd8e125 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -130,6 +130,7 @@ public void setAmount(String details) throws GitException { * Lists all the user's groceries. */ public void listGroceries() { + assert (!groceries.isEmpty()) : "There is nothing to list."; int size = groceries.size(); if (size == 0) { Ui.printNoGrocery(); @@ -144,6 +145,7 @@ public void listGroceries() { * @throws GitException Exception thrown depending on error. */ public void removeGrocery(String details) throws GitException { + assert (!groceries.isEmpty()) : "There is nothing to remove."; if (details.isEmpty()) { throw new EmptyGroceryException(); } From d950c190ebe96106eaa28d64b833dc92a1c7637c Mon Sep 17 00:00:00 2001 From: lsiyi Date: Wed, 20 Mar 2024 21:46:54 +0800 Subject: [PATCH 042/339] Add assertions for addGrocery --- .gitignore | 3 + GroceryList.log | 112 +++++++++++++++++++++++++ src/main/java/grocery/GroceryList.java | 3 + 3 files changed, 118 insertions(+) diff --git a/.gitignore b/.gitignore index 2873e189e1..b24d810a9c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT + +GroceryList.log + diff --git a/GroceryList.log b/GroceryList.log index a4baeecf72..537d1c2cdd 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -13,6 +13,14 @@ 1 Added food + + + + + + + + 2024-03-20T09:47:54.506992Z 1710928074506 @@ -25,6 +33,10 @@ 1 Added Meat + + + + 2024-03-20T09:47:54.559200200Z 1710928074559 @@ -37,6 +49,10 @@ 1 Added Meat + + + + 2024-03-20T09:47:54.581279500Z 1710928074581 @@ -49,6 +65,18 @@ 1 Added Meat + + + + + + + + + + + + 2024-03-20T09:47:54.605366900Z 1710928074605 @@ -61,6 +89,10 @@ 1 Added fooood + + + + 2024-03-20T09:48:21.534991500Z 1710928101534 @@ -73,6 +105,10 @@ 1 Added whe + + + + 2024-03-20T13:01:21.310491Z 1710939681310 @@ -85,5 +121,81 @@ 1 Added Meat + + + + 2024-03-20T13:01:21.331465Z + 1710939681331 + 465000 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-20T13:01:21.345003200Z + 1710939681345 + 3200 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + + + + + 2024-03-20T13:01:21.362571600Z + 1710939681362 + 571600 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + +======= + + + + + + 2024-03-20T13:39:01.739875600Z + 1710941941739 + 875600 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added tomato + + diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 223cd8e125..88f70a9b8a 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -39,6 +39,7 @@ public void addGrocery(Grocery grocery) throws EmptyGroceryException { try { groceries.add(grocery); Ui.printGroceryAdded(grocery); + assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add grocery: he groceries collection is null."); } catch (Exception e) { @@ -64,6 +65,7 @@ private Grocery getGrocery(String name) throws NoSuchGroceryException { } if (index != -1) { + assert groceries != null : "Found grocery should not be null"; return groceries.get(index); } else { throw new NoSuchGroceryException(); @@ -94,6 +96,7 @@ public void setExpiration(String details) throws GitException { throw new IncompleteCommandException(parameter); } else { grocery.setExpiration(date); + assert grocery.getExpiration().equals(date) : "Expiration date should be set correctly"; Ui.printExpSet(grocery); } } From 9dd8938463501b2e7a1170af7c9f14f9c05cc190 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Thu, 21 Mar 2024 13:21:07 +0800 Subject: [PATCH 043/339] Ignore log file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b24d810a9c..b96ab7a83f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ bin/ text-ui-test/EXPECTED-UNIX.TXT GroceryList.log +GroceryList.log.lck From 198f9ef4ebebb8eff5074cb6165bb833863dc877 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 21 Mar 2024 16:09:11 +0800 Subject: [PATCH 044/339] Refactor executeCommand function into new Parser class --- src/main/java/git/Git.java | 56 +++----------------------- src/main/java/git/Parser.java | 73 ++++++++++++++++++++++++++++++++++ src/main/java/git/Ui.java | 16 ++++---- src/test/java/git/GitTest.java | 4 +- 4 files changed, 89 insertions(+), 60 deletions(-) create mode 100644 src/main/java/git/Parser.java diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 8bb2ca6938..19958b2022 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -10,77 +10,31 @@ */ public class Git { // ATTRIBUTES - private GroceryList groceryList; private Ui ui; private boolean isRunning; + private Parser parser; + // METHODS /** * Initialise Git. */ public Git() { - groceryList = new GroceryList(); ui = new Ui(); + parser = new Parser(); isRunning = true; } - /** - * Handles commands. - * - * @param commandParts Command and its details. - * @throws GitException Exception thrown depending on specific error. - */ - public void executeCommand(String[] commandParts) throws GitException { - assert commandParts.length == 2 : "Command passed in wrong format"; - - switch (commandParts[0]) { - case "add": - // Assuming the format is "add GROCERY" - Grocery grocery = new Grocery(commandParts[1], "", ""); - groceryList.addGrocery(grocery); - break; - - case "exp": - // if (commandParts.length < 2) throw new EmptyGroceryException(); - groceryList.setExpiration(commandParts[1]); - break; - - case "amt": - groceryList.setAmount(commandParts[1]); - break; - - case "del": - groceryList.removeGrocery(commandParts[1]); - break; - - case "list": - groceryList.listGroceries(); - break; - - case "help": - ui.displayHelp(); - break; - - case "exit": - System.out.println("bye bye!"); - isRunning = false; - break; - - default: - throw new InvalidCommandException(); - } - } - /** * Runs Git. */ private void run() { ui.printWelcome(); - while (isRunning) { try { String[] commandParts = ui.processInput(); - executeCommand(commandParts); + parser.executeCommand(commandParts); + isRunning = parser.isRunning(); } catch (GitException e) { System.out.println(e.getMessage()); } finally { diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java new file mode 100644 index 0000000000..cae6f93754 --- /dev/null +++ b/src/main/java/git/Parser.java @@ -0,0 +1,73 @@ +package git; + +import exceptions.GitException; +import exceptions.InvalidCommandException; +import grocery.Grocery; +import grocery.GroceryList; + +/** + * Deals with commands entered by user. + */ +public class Parser { + private GroceryList groceryList; + private Ui ui; + + private boolean isRunning; + + public Parser() { + groceryList = new GroceryList(); + ui = new Ui(); + isRunning = true; + } + + /** + * Handles commands. + * + * @param commandParts Command and its details. + * @throws GitException Exception thrown depending on specific error. + */ + public void executeCommand(String[] commandParts) throws GitException { + assert commandParts.length == 2 : "Command passed in wrong format"; + + switch (commandParts[0]) { + case "add": + // Assuming the format is "add GROCERY" + Grocery grocery = new Grocery(commandParts[1], "", ""); + groceryList.addGrocery(grocery); + break; + + case "exp": + // if (commandParts.length < 2) throw new EmptyGroceryException(); + groceryList.setExpiration(commandParts[1]); + break; + + case "amt": + groceryList.setAmount(commandParts[1]); + break; + + case "del": + groceryList.removeGrocery(commandParts[1]); + break; + + case "list": + groceryList.listGroceries(); + break; + + case "help": + ui.displayHelp(); + break; + + case "exit": + System.out.println("bye bye!"); + isRunning = false; + break; + + default: + throw new InvalidCommandException(); + } + } + + public boolean isRunning() { + return isRunning; + } +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 7ea772daa8..d021ed34cf 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -38,6 +38,7 @@ public void printWelcome() { System.out.println("What is your name?"); printLine(); System.out.println("Hello " + in.nextLine() + "!"); + displayHelp(); System.out.println("Enter command:"); printLine(); } @@ -63,13 +64,14 @@ public String[] processInput() { */ public void displayHelp() { System.out.println( - "Here are some ways you can use this app!\n" + - "add GROCERY: adds the item GROCERY\n" + - "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY\n" + - "amt GROCERY a/AMOUNT: sets the amount of GROCERY\n" + - "del GROCERY: deletes GROCERY\n" + - "list: shows list of all groceries you have\n" + - "exit: exits the program." + "Here are some ways you can use this app! \n" + + "add GROCERY: adds the item GROCERY. \n" + + "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY. \n" + + "amt GROCERY a/AMOUNT: sets the amount of GROCERY. \n" + + "del GROCERY: deletes GROCERY. \n" + + "list: shows list of all groceries you have. \n" + + "exit: exits the program. \n" + + "help: view all the possible commands." ); } diff --git a/src/test/java/git/GitTest.java b/src/test/java/git/GitTest.java index 9a5a47dbc7..840752f95b 100644 --- a/src/test/java/git/GitTest.java +++ b/src/test/java/git/GitTest.java @@ -10,9 +10,9 @@ public class GitTest { @Test public void executeCommand_invalidCommand_success() { try { - Git git = new Git(); + Parser parser = new Parser(); String[] commandParts = {"nonsense", ""}; - git.executeCommand(commandParts); + parser.executeCommand(commandParts); } catch (GitException e) { assertEquals("Unknown command. Type 'help' for a list of commands.", e.getMessage());; } From 8911895a5f4f37f71eec644755381fc8034cb1bd Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 21 Mar 2024 16:13:37 +0800 Subject: [PATCH 045/339] Remove unnecessary imports --- src/main/java/git/Git.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 19958b2022..ce140d86d2 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,9 +1,6 @@ package git; import exceptions.GitException; -import exceptions.InvalidCommandException; -import grocery.Grocery; -import grocery.GroceryList; /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! From ee786a66b6ae0b3c8ad34be400c92d99bdcb81e6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 21 Mar 2024 16:18:40 +0800 Subject: [PATCH 046/339] Update EXPECTED.TXT for testing --- text-ui-test/EXPECTED.TXT | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 246581e325..eec507e9a0 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -2,6 +2,14 @@ Hello from GiT What is your name? - - - - - Hello James Gosling! +Here are some ways you can use this app! +add GROCERY: adds the item GROCERY. +exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY. +amt GROCERY a/AMOUNT: sets the amount of GROCERY. +del GROCERY: deletes GROCERY. +list: shows list of all groceries you have. +exit: exits the program. +help: view all the possible commands. Enter command: - - - - - bye bye! From ef90efa64c92a56052538720308e35546ff3b666 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 21 Mar 2024 16:37:42 +0800 Subject: [PATCH 047/339] Removed extra white spaces --- src/main/java/git/Ui.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index d021ed34cf..e03f5401e4 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -64,13 +64,13 @@ public String[] processInput() { */ public void displayHelp() { System.out.println( - "Here are some ways you can use this app! \n" + - "add GROCERY: adds the item GROCERY. \n" + - "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY. \n" + - "amt GROCERY a/AMOUNT: sets the amount of GROCERY. \n" + - "del GROCERY: deletes GROCERY. \n" + - "list: shows list of all groceries you have. \n" + - "exit: exits the program. \n" + + "Here are some ways you can use this app!\n" + + "add GROCERY: adds the item GROCERY.\n" + + "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY.\n" + + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + + "del GROCERY: deletes GROCERY.\n" + + "list: shows list of all groceries you have.\n" + + "exit: exits the program.\n" + "help: view all the possible commands." ); } From c31a4a1969fc4b0522fcc00467c785e5d87e6d2e Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 21 Mar 2024 17:49:29 +0800 Subject: [PATCH 048/339] Add assertions to Ui and Grocery classes --- src/main/java/git/Ui.java | 5 +++++ src/main/java/grocery/Grocery.java | 4 +++- src/main/java/grocery/GroceryList.java | 5 ++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e03f5401e4..6404c22c60 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -48,6 +48,7 @@ public void printWelcome() { */ public String[] processInput() { String commandLine = in.nextLine(); + assert !(commandLine.isEmpty()): "User input should be read"; String[] commandParts = commandLine.strip().split(" ", 2); assert commandParts.length > 0 : "Failed to read user input"; @@ -111,6 +112,7 @@ public static void printNoGrocery() { * Prints all groceries. */ public static void printGroceryList(List groceries) { + assert !groceries.isEmpty() : "grocery list should not be empty"; System.out.println("Here are your groceries!"); for (Grocery grocery: groceries) { System.out.println(" - " + grocery.printGrocery()); @@ -121,6 +123,9 @@ public static void printGroceryList(List groceries) { * Prints output when the selected grocery is removed. */ public static void printGroceryRemoved(Grocery grocery, List groceries) { + assert grocery!=null : "Grocery does not exist"; + System.out.println("This grocery is removed:"); + System.out.println(grocery.printGrocery()); System.out.println("You now have " + groceries.size() + " groceries left"); } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index d8a491584b..b93aa3ee86 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -40,10 +40,12 @@ public void setName(String name) { } public void setAmount(String amount) { + assert !(amount.isEmpty()) : "Amount entered is invalid!"; this.amount = amount; } public void setExpiration(String expiration) { + assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; this.expiration = expiration; } @@ -51,7 +53,7 @@ public void setExpiration(String expiration) { * Returns a String representation of the Grocery. */ public String printGrocery() { - assert !(this.name.isEmpty()) : "Grocery does not exist"; + assert !(this.name.isEmpty()) : "Grocery does not exist!!"; String amt = (this.amount == null || this.amount.isEmpty()) ? "" : ", amount: " + this.amount; String exp = (this.amount == null || this.expiration.isEmpty()) ? "" : ", expiration: " + this.expiration; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 88f70a9b8a..6e6b3445e4 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -133,13 +133,12 @@ public void setAmount(String details) throws GitException { * Lists all the user's groceries. */ public void listGroceries() { - assert (!groceries.isEmpty()) : "There is nothing to list."; int size = groceries.size(); if (size == 0) { Ui.printNoGrocery(); - return; + } else { + Ui.printGroceryList(groceries); } - Ui.printGroceryList(groceries); } /** From 2783ad46f288a3b21d9177f6a2246ad0dd735f12 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 22 Mar 2024 22:20:05 +0800 Subject: [PATCH 049/339] Add welcome logo --- GroceryList.log | 8 ++++++++ src/main/java/git/Ui.java | 6 ++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/GroceryList.log b/GroceryList.log index 537d1c2cdd..deaae22766 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -199,3 +199,11 @@ Added tomato + + + + + + + + diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 6404c22c60..49d607fa85 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -26,15 +26,13 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { - // LOGO causes runtest.bat to fail, failing our CI - final String GITLOGO = + String logo = " _______ ______\n" + " / ____(_)_ __/\n" + " / / __/ / / / \n" + "/ /_/ / / / / \n" + "\\____/_/ /_/ \n"; - - System.out.println("Hello from GiT"); + System.out.println("Hello from\n" + logo); System.out.println("What is your name?"); printLine(); System.out.println("Hello " + in.nextLine() + "!"); From 77f386953d0535e059b25ff5e55cc6638979361b Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 22 Mar 2024 22:47:33 +0800 Subject: [PATCH 050/339] Allow users to exit at the start --- GroceryList.log | 36 ++++++++++++++++++++++++++++++++++++ src/main/java/git/Ui.java | 29 ++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/GroceryList.log b/GroceryList.log index deaae22766..d251025dca 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -207,3 +207,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 2024-03-22T14:45:35.548862500Z + 1711118735548 + 862500 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added tomato + + diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 49d607fa85..489e57882d 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -1,8 +1,10 @@ package git; import java.util.List; +import java.util.Objects; import java.util.Scanner; +import exceptions.GitException; import grocery.Grocery; @@ -13,8 +15,9 @@ public class Ui { // ATTRIBUTES public static final String DIVIDER = "- - - - -"; private Scanner in; - + private Parser parser; // METHODS + /** * Constructs Ui and initialises Scanner to read input. */ @@ -28,19 +31,31 @@ public Ui() { public void printWelcome() { String logo = " _______ ______\n" - + " / ____(_)_ __/\n" - + " / / __/ / / / \n" - + "/ /_/ / / / / \n" - + "\\____/_/ /_/ \n"; + + " / ____(_)_ __/\n" + + " / / __/ / / / \n" + + "/ /_/ / / / / \n" + + "\\____/_/ /_/ \n"; System.out.println("Hello from\n" + logo); System.out.println("What is your name?"); printLine(); - System.out.println("Hello " + in.nextLine() + "!"); + + String userName = in.nextLine(); + if (!Objects.equals(userName, "exit")) { + printHello(userName); + } else { + System.out.println("Exiting..."); + System.exit(0); + } +} + + public void printHello(String userName) { + System.out.println("Hello " + userName + "!"); + displayHelp(); System.out.println("Enter command:"); + printLine(); } - /** * Processes user input into commands and their details. */ From e5fb457cabafd0101c6beccf81f84e6e884aa59c Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 22 Mar 2024 22:54:27 +0800 Subject: [PATCH 051/339] Add welcome logo, Allow users to exit at the start --- src/main/java/git/Ui.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 489e57882d..2054f531e8 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -4,7 +4,6 @@ import java.util.Objects; import java.util.Scanner; -import exceptions.GitException; import grocery.Grocery; @@ -46,7 +45,7 @@ public void printWelcome() { System.out.println("Exiting..."); System.exit(0); } -} + } public void printHello(String userName) { System.out.println("Hello " + userName + "!"); From d2934aa87855527c1640195998c3d39e82cdc20a Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 22 Mar 2024 23:03:19 +0800 Subject: [PATCH 052/339] Add welcome logo, add printHello method --- GroceryList.log | 4 ++++ src/main/java/git/Ui.java | 12 ++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/GroceryList.log b/GroceryList.log index d251025dca..ed8c51501b 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -243,3 +243,7 @@ Added tomato + + + + diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2054f531e8..18ce7bc55a 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -37,16 +37,12 @@ public void printWelcome() { System.out.println("Hello from\n" + logo); System.out.println("What is your name?"); printLine(); - String userName = in.nextLine(); - if (!Objects.equals(userName, "exit")) { - printHello(userName); - } else { - System.out.println("Exiting..."); - System.exit(0); - } + printHello(userName); } - + /** + * Prints Hello with user's name + */ public void printHello(String userName) { System.out.println("Hello " + userName + "!"); From f277cebb5bf3b79490f532f5c6a1dcd2a6c530ef Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 22 Mar 2024 23:58:47 +0800 Subject: [PATCH 053/339] Update imports for printHello method --- src/main/java/git/Ui.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 18ce7bc55a..18945c3250 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -1,7 +1,6 @@ package git; import java.util.List; -import java.util.Objects; import java.util.Scanner; import grocery.Grocery; From c78ed648adc7f3f0a97a212bf656764f9596bc4a Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sat, 23 Mar 2024 00:03:20 +0800 Subject: [PATCH 054/339] Update printHello method --- GroceryList.log | 76 +++++++++++++++++++++++++++++++++++++++ src/main/java/git/Ui.java | 2 +- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/GroceryList.log b/GroceryList.log index ed8c51501b..dd01577198 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -247,3 +247,79 @@ + + + + + + + + + 2024-03-22T16:02:42.628318800Z + 1711123362628 + 318800 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-22T16:02:42.653319200Z + 1711123362653 + 319200 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-22T16:02:42.667318700Z + 1711123362667 + 318700 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + + + + + 2024-03-22T16:02:42.685604200Z + 1711123362685 + 604200 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 18945c3250..1f5b342be7 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -13,7 +13,7 @@ public class Ui { // ATTRIBUTES public static final String DIVIDER = "- - - - -"; private Scanner in; - private Parser parser; + // METHODS /** From 373a6968984a7efa95926b50837ed7a37acb9ee2 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sat, 23 Mar 2024 22:48:24 +0800 Subject: [PATCH 055/339] Add printHello method --- src/main/java/git/Ui.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 1f5b342be7..51fcf17d2c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -27,13 +27,13 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { - String logo = - " _______ ______\n" - + " / ____(_)_ __/\n" - + " / / __/ / / / \n" - + "/ /_/ / / / / \n" - + "\\____/_/ /_/ \n"; - System.out.println("Hello from\n" + logo); +// String logo = +// " _______ ______\n" +// + " / ____(_)_ __/\n" +// + " / / __/ / / / \n" +// + "/ /_/ / / / / \n" +// + "\\____/_/ /_/ \n"; + System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); String userName = in.nextLine(); From fc1ce518fd6916a8ca6178e30edcd63885b40479 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sun, 24 Mar 2024 00:16:36 +0800 Subject: [PATCH 056/339] Delete welcome logo --- src/main/java/git/Ui.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 51fcf17d2c..e07641f019 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -27,12 +27,6 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { -// String logo = -// " _______ ______\n" -// + " / ____(_)_ __/\n" -// + " / / __/ / / / \n" -// + "/ /_/ / / / / \n" -// + "\\____/_/ /_/ \n"; System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); From 01249c82ed83885b62d5d25f14c48242d8abccf4 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sun, 24 Mar 2024 00:28:39 +0800 Subject: [PATCH 057/339] Add new welcome logo --- GroceryList.log.lck | 0 src/main/java/git/Ui.java | 9 ++++++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 GroceryList.log.lck diff --git a/GroceryList.log.lck b/GroceryList.log.lck new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e07641f019..316464a9cf 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -27,7 +27,14 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { - System.out.println("Hello from GiT"); + String logo = "\n" + + "________._____________\n" + + " / _____/|__\\__ ___/\n" + + "/ \\ ___| | | | \n" + + "\\ \\_\\ \\ | | | \n" + + " \\______ /__| |____| \n" + + " \\/\n"; + System.out.println("Hello from GiT" + logo); System.out.println("What is your name?"); printLine(); String userName = in.nextLine(); From 88374f1af939387ccbb56bb5d1d08c89e91683b4 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sun, 24 Mar 2024 00:30:19 +0800 Subject: [PATCH 058/339] Delete welcome logo --- src/main/java/git/Ui.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 316464a9cf..e07641f019 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -27,14 +27,7 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { - String logo = "\n" + - "________._____________\n" + - " / _____/|__\\__ ___/\n" + - "/ \\ ___| | | | \n" + - "\\ \\_\\ \\ | | | \n" + - " \\______ /__| |____| \n" + - " \\/\n"; - System.out.println("Hello from GiT" + logo); + System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); String userName = in.nextLine(); From ffa72ef2a19ac448cb256578e97f2002c138a7d6 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 24 Mar 2024 23:54:26 +0800 Subject: [PATCH 059/339] Refactor code and add ability to edit grocery amount --- GroceryList.log | 670 ++++++++++++++++++ GroceryList.log.lck | 0 .../java/exceptions/CannotUseException.java | 13 + .../exceptions/InvalidAmountException.java | 13 + .../{ => commands}/EmptyGroceryException.java | 4 +- .../IncompleteCommandException.java | 4 +- .../NoSuchGroceryException.java | 4 +- .../{ => commands}/WrongFormatException.java | 16 +- src/main/java/git/Git.java | 4 +- src/main/java/git/Parser.java | 13 +- src/main/java/git/Ui.java | 12 +- src/main/java/grocery/Grocery.java | 16 +- src/main/java/grocery/GroceryList.java | 89 ++- src/test/java/grocery/GroceryListTest.java | 52 +- src/test/java/grocery/GroceryTest.java | 6 +- 15 files changed, 845 insertions(+), 71 deletions(-) delete mode 100644 GroceryList.log.lck create mode 100644 src/main/java/exceptions/CannotUseException.java create mode 100644 src/main/java/exceptions/InvalidAmountException.java rename src/main/java/exceptions/{ => commands}/EmptyGroceryException.java (83%) rename src/main/java/exceptions/{ => commands}/IncompleteCommandException.java (84%) rename src/main/java/exceptions/{ => commands}/NoSuchGroceryException.java (82%) rename src/main/java/exceptions/{ => commands}/WrongFormatException.java (72%) diff --git a/GroceryList.log b/GroceryList.log index dd01577198..532fd4a617 100644 --- a/GroceryList.log +++ b/GroceryList.log @@ -323,3 +323,673 @@ Added fooood + + + + + 2024-03-24T14:18:51.892994500Z + 1711289931892 + 994500 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T14:20:20.038975300Z + 1711290020038 + 975300 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T14:24:22.273000800Z + 1711290262273 + 800 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T14:28:32.992688200Z + 1711290512992 + 688200 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T15:03:28.554540700Z + 1711292608554 + 540700 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T15:05:51.796060700Z + 1711292751796 + 60700 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T15:06:32.029311200Z + 1711292792029 + 311200 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T15:08:11.281378300Z + 1711292891281 + 378300 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + 2024-03-24T15:30:57.160546800Z + 1711294257160 + 546800 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + 2024-03-24T15:34:55.111611800Z + 1711294495111 + 611800 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk + + + + + + + + + + + 2024-03-24T15:37:55.608110200Z + 1711294675608 + 110200 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:37:55.638116600Z + 1711294675638 + 116600 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:37:55.661121600Z + 1711294675661 + 121600 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:37:55.694131400Z + 1711294675694 + 131400 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + + + + + 2024-03-24T15:38:17.691931500Z + 1711294697691 + 931500 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:38:17.722934300Z + 1711294697722 + 934300 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:38:17.742939600Z + 1711294697742 + 939600 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:38:17.765947700Z + 1711294697765 + 947700 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + + + + + 2024-03-24T15:42:02.362622300Z + 1711294922362 + 622300 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:42:02.390633700Z + 1711294922390 + 633700 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:42:02.412636300Z + 1711294922412 + 636300 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:42:02.445645300Z + 1711294922445 + 645300 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + 2024-03-24T15:42:52.833368300Z + 1711294972833 + 368300 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + 2024-03-24T15:44:16.147586600Z + 1711295056147 + 586600 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:44:16.178591900Z + 1711295056178 + 591900 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:44:16.200597600Z + 1711295056200 + 597600 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:44:16.220603Z + 1711295056220 + 603000 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + + + + + 2024-03-24T15:48:36.606280600Z + 1711295316606 + 280600 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:48:36.649291300Z + 1711295316649 + 291300 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:48:36.676299700Z + 1711295316676 + 299700 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:48:36.693301900Z + 1711295316693 + 301900 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + 2024-03-24T15:48:36.707310300Z + 1711295316707 + 310300 + 4 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat, amount: 5 + + + + + + + 2024-03-24T15:48:36.717306300Z + 1711295316717 + 306300 + 5 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:51:29.329021100Z + 1711295489329 + 21100 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:51:29.367038200Z + 1711295489367 + 38200 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + 2024-03-24T15:51:29.393037200Z + 1711295489393 + 37200 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + + + + + + + + + + 2024-03-24T15:51:29.413040400Z + 1711295489413 + 40400 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added fooood + + + + + + + 2024-03-24T15:51:29.428044600Z + 1711295489428 + 44600 + 4 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat, amount: 5 + + + + + + + 2024-03-24T15:51:29.439045200Z + 1711295489439 + 45200 + 5 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added Meat + + diff --git a/GroceryList.log.lck b/GroceryList.log.lck deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/main/java/exceptions/CannotUseException.java b/src/main/java/exceptions/CannotUseException.java new file mode 100644 index 0000000000..f0437c4689 --- /dev/null +++ b/src/main/java/exceptions/CannotUseException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when command "use" should not be run due to the grocery an amount of 0. + */ +public class CannotUseException extends GitException { + /** + * Constructs CannotUseException. + */ + public CannotUseException() { + message = "The grocery you want to use is already out of stock - time to replenish!"; + } +} diff --git a/src/main/java/exceptions/InvalidAmountException.java b/src/main/java/exceptions/InvalidAmountException.java new file mode 100644 index 0000000000..d7a2cd3248 --- /dev/null +++ b/src/main/java/exceptions/InvalidAmountException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the amount inputted by the user is invalid. + */ +public class InvalidAmountException extends GitException { + /** + * Constructs InvalidAmountException. + */ + public InvalidAmountException() { + message = "Please input a valid integer!"; + } +} diff --git a/src/main/java/exceptions/EmptyGroceryException.java b/src/main/java/exceptions/commands/EmptyGroceryException.java similarity index 83% rename from src/main/java/exceptions/EmptyGroceryException.java rename to src/main/java/exceptions/commands/EmptyGroceryException.java index ed1c6a1838..ee251df658 100644 --- a/src/main/java/exceptions/EmptyGroceryException.java +++ b/src/main/java/exceptions/commands/EmptyGroceryException.java @@ -1,4 +1,6 @@ -package exceptions; +package exceptions.commands; + +import exceptions.GitException; /** * Represents the exception thrown when the grocery is not given after the command. diff --git a/src/main/java/exceptions/IncompleteCommandException.java b/src/main/java/exceptions/commands/IncompleteCommandException.java similarity index 84% rename from src/main/java/exceptions/IncompleteCommandException.java rename to src/main/java/exceptions/commands/IncompleteCommandException.java index 33ef6ebcbd..1dd04d2cc3 100644 --- a/src/main/java/exceptions/IncompleteCommandException.java +++ b/src/main/java/exceptions/commands/IncompleteCommandException.java @@ -1,4 +1,6 @@ -package exceptions; +package exceptions.commands; + +import exceptions.GitException; /** * Represents the exception thrown when the format is correct, but input is empty. diff --git a/src/main/java/exceptions/NoSuchGroceryException.java b/src/main/java/exceptions/commands/NoSuchGroceryException.java similarity index 82% rename from src/main/java/exceptions/NoSuchGroceryException.java rename to src/main/java/exceptions/commands/NoSuchGroceryException.java index 08f6cf87a7..794a9af6ff 100644 --- a/src/main/java/exceptions/NoSuchGroceryException.java +++ b/src/main/java/exceptions/commands/NoSuchGroceryException.java @@ -1,6 +1,8 @@ -package exceptions; +package exceptions.commands; +import exceptions.GitException; + /** * Represents the exception thrown when the grocery to edit does not exist. */ diff --git a/src/main/java/exceptions/WrongFormatException.java b/src/main/java/exceptions/commands/WrongFormatException.java similarity index 72% rename from src/main/java/exceptions/WrongFormatException.java rename to src/main/java/exceptions/commands/WrongFormatException.java index 2e05745b31..8db1a8c405 100644 --- a/src/main/java/exceptions/WrongFormatException.java +++ b/src/main/java/exceptions/commands/WrongFormatException.java @@ -1,4 +1,6 @@ -package exceptions; +package exceptions.commands; + +import exceptions.GitException; /** * Represents the exception thrown when the command does not follow the proper format. @@ -18,10 +20,18 @@ public String printWrongFormatFix(String command) { StringBuilder message = new StringBuilder(); message.append("Command is in the wrong format, type \"help\" for more information."); message.append(System.lineSeparator()); - if (command.equals("date")) { + switch(command) { + case ("exp"): message.append("exp needs 'd/'"); - } else if (command.equals("amt")) { + break; + case ("amt"): message.append("amt needs 'a/'"); + break; + case ("use"): + message.append("use needs 'a/'"); + break; + default: + // Do nothing } return message.toString(); diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index ce140d86d2..8478a9f12b 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -14,7 +14,7 @@ public class Git { // METHODS /** - * Initialise Git. + * Constructs Git. */ public Git() { ui = new Ui(); @@ -31,7 +31,7 @@ private void run() { try { String[] commandParts = ui.processInput(); parser.executeCommand(commandParts); - isRunning = parser.isRunning(); + isRunning = parser.getIsRunning(); } catch (GitException e) { System.out.println(e.getMessage()); } finally { diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index cae6f93754..1c3409ce2b 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -14,6 +14,9 @@ public class Parser { private boolean isRunning; + /** + * Constructs Parser. + */ public Parser() { groceryList = new GroceryList(); ui = new Ui(); @@ -32,17 +35,17 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": // Assuming the format is "add GROCERY" - Grocery grocery = new Grocery(commandParts[1], "", ""); + Grocery grocery = new Grocery(commandParts[1], 0, ""); groceryList.addGrocery(grocery); break; case "exp": - // if (commandParts.length < 2) throw new EmptyGroceryException(); - groceryList.setExpiration(commandParts[1]); + groceryList.editExpiration(commandParts[1]); break; case "amt": - groceryList.setAmount(commandParts[1]); + case "use": + groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); break; case "del": @@ -67,7 +70,7 @@ public void executeCommand(String[] commandParts) throws GitException { } } - public boolean isRunning() { + public boolean getIsRunning() { return isRunning; } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e07641f019..61b1952dac 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -33,6 +33,7 @@ public void printWelcome() { String userName = in.nextLine(); printHello(userName); } + /** * Prints Hello with user's name */ @@ -70,6 +71,7 @@ public void displayHelp() { "add GROCERY: adds the item GROCERY.\n" + "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "exit: exits the program.\n" + @@ -98,10 +100,18 @@ public static void printGroceryAdded(Grocery grocery) { * Prints output after setting the selected grocery's amount. */ public static void printAmtSet(Grocery grocery) { - assert !(grocery.getAmount().isEmpty()): "grocery amount should not be empty"; + // TODO: update amount output according to Grocery subclass + assert grocery.getAmount() >= 0 : "grocery amount should not be empty"; System.out.println(grocery.getName() + ": " + grocery.getAmount()); } + /** + * Prints output after a grocery's amount is set to 0. + */ + public static void printAmtDepleted(Grocery grocery) { + System.out.println(grocery.getName() + " is now out of stock!"); + } + /** * Prints out when there are no groceries. */ diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index b93aa3ee86..991df21755 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -6,7 +6,7 @@ */ public class Grocery { private String name; - private String amount; + private int amount; private String expiration; /** @@ -16,7 +16,7 @@ public class Grocery { * @param amount Measurement of grocery. * @param expiration When grocery expires. */ - public Grocery(String name, String amount, String expiration) { + public Grocery(String name, int amount, String expiration) { this.name = name; this.amount = amount; this.expiration = expiration; @@ -27,7 +27,7 @@ public String getName() { return name; } - public String getAmount() { + public int getAmount() { return amount; } @@ -39,8 +39,8 @@ public void setName(String name) { this.name = name; } - public void setAmount(String amount) { - assert !(amount.isEmpty()) : "Amount entered is invalid!"; + public void setAmount(int amount) { + assert amount >= 0 : "Amount entered is invalid!"; this.amount = amount; } @@ -55,8 +55,10 @@ public void setExpiration(String expiration) { public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; - String amt = (this.amount == null || this.amount.isEmpty()) ? "" : ", amount: " + this.amount; - String exp = (this.amount == null || this.expiration.isEmpty()) ? "" : ", expiration: " + this.expiration; + // TODO: update amount output according to Grocery subclass + // TODO: consider stating amount == 0 now that we track amount ? + String amt = (amount == 0) ? "" : ", amount: " + amount; + String exp = (expiration == null || expiration.isEmpty()) ? "" : ", expiration: " + expiration; return this.name + amt + exp; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 6e6b3445e4..dd8cf95f23 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,11 +1,13 @@ package grocery; +import exceptions.InvalidAmountException; import git.Ui; import exceptions.GitException; -import exceptions.EmptyGroceryException; -import exceptions.IncompleteCommandException; -import exceptions.NoSuchGroceryException; -import exceptions.WrongFormatException; +import exceptions.commands.EmptyGroceryException; +import exceptions.commands.IncompleteCommandException; +import exceptions.commands.NoSuchGroceryException; +import exceptions.commands.WrongFormatException; +import exceptions.CannotUseException; import java.util.ArrayList; import java.util.List; @@ -48,7 +50,6 @@ public void addGrocery(Grocery grocery) throws EmptyGroceryException { logger.log(Level.INFO, "Added " + grocery.printGrocery()); } - /** * Returns the desired grocery. @@ -73,58 +74,80 @@ private Grocery getGrocery(String name) throws NoSuchGroceryException { } /** - * Adds the expiration date of an existing grocery. + * Checks whether details are valid, else throw GitException accordingly. * + * @param details User input. + * @param command Command word. + * @param parameter Parameter for the command. + * @return String array of valid details. * @throws GitException Exception thrown depending on error. */ - public void setExpiration(String details) throws GitException { + private String[] checkDetails(String details, String command, String parameter) throws GitException { if (details.isEmpty()) { throw new EmptyGroceryException(); } - // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" - String parameter = "d/"; - String[] expParts = details.split(parameter, 2); - Grocery grocery = getGrocery(expParts[0].strip()); - - if (expParts.length < 2) { - throw new WrongFormatException("date"); + String[] detailParts = details.split(parameter, 2); + Grocery grocery = getGrocery(detailParts[0].strip()); + if (detailParts.length < 2) { + throw new WrongFormatException(command); } - String date = expParts[1].strip(); - if (date.isEmpty()) { + String attribute = detailParts[1].strip(); + if (attribute.isEmpty()) { throw new IncompleteCommandException(parameter); - } else { - grocery.setExpiration(date); - assert grocery.getExpiration().equals(date) : "Expiration date should be set correctly"; - Ui.printExpSet(grocery); } + + return detailParts; } /** - * Adds the amount of an existing grocery. + * Adds the expiration date of an existing grocery. * * @throws GitException Exception thrown depending on error. */ - public void setAmount(String details) throws GitException { - if (details.isEmpty()) { - throw new EmptyGroceryException(); - } + public void editExpiration(String details) throws GitException { + // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" + String[] expParts = checkDetails(details, "exp", "d/"); + Grocery grocery = getGrocery(expParts[0].strip()); + String date = expParts[1].strip(); + + grocery.setExpiration(date); + assert grocery.getExpiration().equals(date) : "Expiration date should be set correctly"; + Ui.printExpSet(grocery); + + } + /** + * Sets the amount of an existing grocery. + * + * @param details User input. + * @param use True to reduce the amount of a grocery, false to set a new amount. + * @throws GitException Exception thrown depending on error. + */ + public void editAmount(String details, boolean use) throws GitException { // Assuming the format is "amt GROCERY a/AMOUNT" - String parameter = "a/"; - String[] amtParts = details.split(parameter, 2); + String[] amtParts = checkDetails(details, "amt", "a/"); Grocery grocery = getGrocery(amtParts[0].strip()); + String amountString = amtParts[1].strip(); + + int amount = 0; + try { + amount = Integer.parseInt(amountString); + } catch (NumberFormatException e) { + throw new InvalidAmountException(); + } - if (amtParts.length < 2) { - throw new WrongFormatException("amt"); + // "use" is not valid if an amount was not previously set + if (use && grocery.getAmount() == 0) { + throw new CannotUseException(); } - String amount = amtParts[1].strip(); - if (amount.isEmpty()) { - throw new IncompleteCommandException(parameter); + int finalAmount = use ? Math.max(0, grocery.getAmount() - amount) : amount; + grocery.setAmount(finalAmount); + if (finalAmount == 0) { + Ui.printAmtDepleted(grocery); } else { - grocery.setAmount(amount); Ui.printAmtSet(grocery); } } diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 09ee28cb77..26066bad57 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,6 +1,6 @@ package grocery; -import exceptions.EmptyGroceryException; +import exceptions.commands.EmptyGroceryException; import exceptions.GitException; import org.junit.jupiter.api.Test; @@ -11,32 +11,32 @@ public class GroceryListTest { @Test - public void setExpiration_success() { + public void editExpiration_success() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", "", "")); - gl.setExpiration("Meat d/ Monday"); + gl.addGrocery(new Grocery("Meat", 0, "")); + gl.editExpiration("Meat d/ Monday"); } catch (GitException e) { fail("setExpiration should be successful"); } } @Test - public void setExpiration_noSuchGrocery_exceptionThrown() { + public void editExpiration_noSuchGrocery_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.setExpiration("nothing"); + gl.editExpiration("nothing"); } catch (GitException e) { assertEquals("The grocery does not exist!", e.getMessage()); } } @Test - public void setExpiration_wrongFormat_exceptionThrown() { + public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", "", "")); - gl.setExpiration("Meat"); + gl.addGrocery(new Grocery("Meat", 0, "")); + gl.editExpiration("Meat"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + System.lineSeparator() + @@ -49,7 +49,7 @@ public void setExpiration_wrongFormat_exceptionThrown() { public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, null, null)); // Use null to trigger the exception + gl.addGrocery(new Grocery(null, 0, null)); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); } catch (EmptyGroceryException e) { assertEquals("A grocery needs to be specified!", e.getMessage()); @@ -60,7 +60,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", null, null)); + gl.addGrocery(new Grocery("fooood", 0, null)); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -70,11 +70,11 @@ public void removeGrocery_groceryDelete_exceptionThrown() { } @Test - public void setAmount_wrongFormat_exceptionThrown() { + public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", "", "")); - gl.setAmount("Meat"); + gl.addGrocery(new Grocery("Meat", 0, "")); + gl.editAmount("Meat", false); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + System.lineSeparator() + @@ -83,5 +83,29 @@ public void setAmount_wrongFormat_exceptionThrown() { } } + @Test + public void editAmountUseTrue_amountReaches0_success() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", 5, "")); + gl.editAmount("Meat a/10", true); + } catch (GitException e) { + fail("editAmount_useTrue should be able to handle cases where amount <= 0"); + } + } + + @Test + public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", 0, "")); + gl.editAmount("Meat a/5", true); + } catch (GitException e) { + String message = "The grocery you want to use is already out of stock - time to replenish!"; + assertEquals(message, e.getMessage()); + } + } + + } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index a0fcd6f502..8d1ae8be02 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -6,15 +6,15 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", "", ""); + Grocery grocery = new Grocery("apple", 0, ""); String message = "apple"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_correctAmtAndExp() { - Grocery grocery = new Grocery("chicken", "1 leg", "soon"); - String message = "chicken" + ", amount: 1 leg" + ", expiration: soon"; + Grocery grocery = new Grocery("chicken", 1, "soon"); + String message = "chicken" + ", amount: 1" + ", expiration: soon"; assertEquals(message, grocery.printGrocery()); } } From 33c26aa4349232052219ad28fd703dca570a0907 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 25 Mar 2024 00:04:25 +0800 Subject: [PATCH 060/339] Fix text-ui-test issues --- text-ui-test/EXPECTED.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index eec507e9a0..15c9eba049 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -6,6 +6,7 @@ Here are some ways you can use this app! add GROCERY: adds the item GROCERY. exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY. amt GROCERY a/AMOUNT: sets the amount of GROCERY. +use GROCERY a/AMOUNT: updates the total amount after using a GROCERY del GROCERY: deletes GROCERY. list: shows list of all groceries you have. exit: exits the program. From 75c20008ba82e4f547c85eaaa998c0d8d568821a Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 25 Mar 2024 00:06:24 +0800 Subject: [PATCH 061/339] Remove GroceryList.log from tracking --- GroceryList.log | 995 ------------------------------------------------ 1 file changed, 995 deletions(-) delete mode 100644 GroceryList.log diff --git a/GroceryList.log b/GroceryList.log deleted file mode 100644 index 532fd4a617..0000000000 --- a/GroceryList.log +++ /dev/null @@ -1,995 +0,0 @@ - - - - - 2024-03-20T06:31:21.248609900Z - 1710916281248 - 609900 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added food - - - - - - - - - - - 2024-03-20T09:47:54.506992Z - 1710928074506 - 992000 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T09:47:54.559200200Z - 1710928074559 - 200200 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T09:47:54.581279500Z - 1710928074581 - 279500 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - - - - - 2024-03-20T09:47:54.605366900Z - 1710928074605 - 366900 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-20T09:48:21.534991500Z - 1710928101534 - 991500 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added whe - - - - - - - 2024-03-20T13:01:21.310491Z - 1710939681310 - 491000 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T13:01:21.331465Z - 1710939681331 - 465000 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-20T13:01:21.345003200Z - 1710939681345 - 3200 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - - - - - 2024-03-20T13:01:21.362571600Z - 1710939681362 - 571600 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - -======= - - - - - - 2024-03-20T13:39:01.739875600Z - 1710941941739 - 875600 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added tomato - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2024-03-22T14:45:35.548862500Z - 1711118735548 - 862500 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added tomato - - - - - - - - - - - - - - - 2024-03-22T16:02:42.628318800Z - 1711123362628 - 318800 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-22T16:02:42.653319200Z - 1711123362653 - 319200 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-22T16:02:42.667318700Z - 1711123362667 - 318700 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - - - - - 2024-03-22T16:02:42.685604200Z - 1711123362685 - 604200 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-24T14:18:51.892994500Z - 1711289931892 - 994500 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T14:20:20.038975300Z - 1711290020038 - 975300 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T14:24:22.273000800Z - 1711290262273 - 800 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T14:28:32.992688200Z - 1711290512992 - 688200 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T15:03:28.554540700Z - 1711292608554 - 540700 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T15:05:51.796060700Z - 1711292751796 - 60700 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T15:06:32.029311200Z - 1711292792029 - 311200 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T15:08:11.281378300Z - 1711292891281 - 378300 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - 2024-03-24T15:30:57.160546800Z - 1711294257160 - 546800 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - 2024-03-24T15:34:55.111611800Z - 1711294495111 - 611800 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added milk - - - - - - - - - - - 2024-03-24T15:37:55.608110200Z - 1711294675608 - 110200 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:37:55.638116600Z - 1711294675638 - 116600 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:37:55.661121600Z - 1711294675661 - 121600 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:37:55.694131400Z - 1711294675694 - 131400 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - - - - - 2024-03-24T15:38:17.691931500Z - 1711294697691 - 931500 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:38:17.722934300Z - 1711294697722 - 934300 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:38:17.742939600Z - 1711294697742 - 939600 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:38:17.765947700Z - 1711294697765 - 947700 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - - - - - 2024-03-24T15:42:02.362622300Z - 1711294922362 - 622300 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:42:02.390633700Z - 1711294922390 - 633700 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:42:02.412636300Z - 1711294922412 - 636300 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:42:02.445645300Z - 1711294922445 - 645300 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-24T15:42:52.833368300Z - 1711294972833 - 368300 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - 2024-03-24T15:44:16.147586600Z - 1711295056147 - 586600 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:44:16.178591900Z - 1711295056178 - 591900 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:44:16.200597600Z - 1711295056200 - 597600 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:44:16.220603Z - 1711295056220 - 603000 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - - - - - 2024-03-24T15:48:36.606280600Z - 1711295316606 - 280600 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:48:36.649291300Z - 1711295316649 - 291300 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:48:36.676299700Z - 1711295316676 - 299700 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:48:36.693301900Z - 1711295316693 - 301900 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-24T15:48:36.707310300Z - 1711295316707 - 310300 - 4 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat, amount: 5 - - - - - - - 2024-03-24T15:48:36.717306300Z - 1711295316717 - 306300 - 5 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:51:29.329021100Z - 1711295489329 - 21100 - 0 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:51:29.367038200Z - 1711295489367 - 38200 - 1 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - 2024-03-24T15:51:29.393037200Z - 1711295489393 - 37200 - 2 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - - - - - - - - - - 2024-03-24T15:51:29.413040400Z - 1711295489413 - 40400 - 3 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added fooood - - - - - - - 2024-03-24T15:51:29.428044600Z - 1711295489428 - 44600 - 4 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat, amount: 5 - - - - - - - 2024-03-24T15:51:29.439045200Z - 1711295489439 - 45200 - 5 - grocery.GroceryList - INFO - grocery.GroceryList - addGrocery - 1 - Added Meat - - From 23dbf1dec0fbac314ca7d22e5490005900c46191 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 12:40:32 +0800 Subject: [PATCH 062/339] Edit expiration date functionality for Grocery class --- src/main/java/git/Parser.java | 7 ++- src/main/java/git/Ui.java | 47 +++++++++++++++++- src/main/java/grocery/Grocery.java | 13 +++-- src/main/java/grocery/GroceryList.java | 56 ++++++++++++++++++---- src/test/java/grocery/GroceryListTest.java | 47 ++++++++++-------- src/test/java/grocery/GroceryTest.java | 7 +-- 6 files changed, 135 insertions(+), 42 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 1c3409ce2b..e6967ceb7e 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -1,5 +1,7 @@ package git; +import java.time.LocalDate; + import exceptions.GitException; import exceptions.InvalidCommandException; import grocery.Grocery; @@ -34,8 +36,9 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": - // Assuming the format is "add GROCERY" - Grocery grocery = new Grocery(commandParts[1], 0, ""); + Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now()); + String expiration = ui.promptForExpiration(); + grocery.setExpiration(expiration); groceryList.addGrocery(grocery); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 61b1952dac..72f9cbffbc 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -62,6 +62,50 @@ public String[] processInput() { } } + /** + * Prompts user for expiration date. + */ + public String promptForExpiration() { + System.out.println("Please enter the year of expiry (e.g., 2024):"); + String year = in.nextLine().trim(); + + System.out.println("Please enter the month of expiry (can be July or can be 07):"); + String month = in.nextLine().trim(); + month = convertMonthToNumber(month); + + System.out.println("Please enter the date of expiry (e.g., 19):"); + String day = in.nextLine().trim(); + + String formattedDate = formatExpirationDate(year, month, day); + return formattedDate; + } + + /** + * Reads expiration date from user input. + */ + private String convertMonthToNumber(String month) { + // Convert month from name to number (e.g., "July" to "07") + String[] monthNames = {"January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; + String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; + for (int i = 0; i < monthNames.length; i++) { + if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { + return monthNumbers[i]; // Found a match, return the month number + } + } + // If no match found or input is already in numeric format, return original input + // This part can be enhanced to handle invalid months. + return month; + } + + /** + * Reads expiration date from user input. + */ + private String formatExpirationDate(String year, String month, String day) { + // This method can be enhanced to validate the date components + return year + "-" + month + "-" + day; + } + /** * Displays help message containing all possible commands. */ @@ -69,7 +113,7 @@ public void displayHelp() { System.out.println( "Here are some ways you can use this app!\n" + "add GROCERY: adds the item GROCERY.\n" + - "exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY.\n" + + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY\n" + "del GROCERY: deletes GROCERY.\n" + @@ -84,7 +128,6 @@ public void displayHelp() { */ public static void printExpSet(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; - assert !(grocery.getExpiration().isEmpty()): "expiration date should not be empty"; System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 991df21755..99c1398378 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -1,4 +1,6 @@ package grocery; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; /** @@ -7,7 +9,7 @@ public class Grocery { private String name; private int amount; - private String expiration; + private LocalDate expiration; /** * Constructs a Grocery. @@ -16,7 +18,7 @@ public class Grocery { * @param amount Measurement of grocery. * @param expiration When grocery expires. */ - public Grocery(String name, int amount, String expiration) { + public Grocery(String name, int amount, LocalDate expiration) { this.name = name; this.amount = amount; this.expiration = expiration; @@ -31,7 +33,7 @@ public int getAmount() { return amount; } - public String getExpiration() { + public LocalDate getExpiration() { return expiration; } @@ -46,7 +48,8 @@ public void setAmount(int amount) { public void setExpiration(String expiration) { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; - this.expiration = expiration; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + this.expiration = LocalDate.parse(expiration, formatter); } /** @@ -58,7 +61,7 @@ public String printGrocery() { // TODO: update amount output according to Grocery subclass // TODO: consider stating amount == 0 now that we track amount ? String amt = (amount == 0) ? "" : ", amount: " + amount; - String exp = (expiration == null || expiration.isEmpty()) ? "" : ", expiration: " + expiration; + String exp = (expiration == null) ? "expiration date not set" : " expires on: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); return this.name + amt + exp; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index dd8cf95f23..babcdf32f1 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -9,10 +9,15 @@ import exceptions.commands.WrongFormatException; import exceptions.CannotUseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import java.util.logging.Level; +import java.util.Collections; + /** * Stores all the user's groceries. @@ -87,18 +92,29 @@ private String[] checkDetails(String details, String command, String parameter) throw new EmptyGroceryException(); } + // Split the input into the grocery name and the detail part. String[] detailParts = details.split(parameter, 2); + if (detailParts.length < 2 || detailParts[1].trim().isEmpty()) { + throw new WrongFormatException(command + " command is in the wrong format. " + parameter + " is required."); + } + + // Retrieve the grocery to ensure it exists. Grocery grocery = getGrocery(detailParts[0].strip()); - if (detailParts.length < 2) { - throw new WrongFormatException(command); + if (grocery == null) { + throw new NoSuchGroceryException(); } String attribute = detailParts[1].strip(); - if (attribute.isEmpty()) { - throw new IncompleteCommandException(parameter); + // For expiration date updates, validate the date format. + if (command.equals("exp")) { + try { + LocalDate.parse(attribute, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } catch (DateTimeParseException e) { + throw new WrongFormatException("Expiration date is in the wrong format. Please use yyyy-MM-dd."); + } } - return detailParts; + return new String[] {detailParts[0].trim(), attribute}; } /** @@ -109,13 +125,26 @@ private String[] checkDetails(String details, String command, String parameter) public void editExpiration(String details) throws GitException { // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" String[] expParts = checkDetails(details, "exp", "d/"); + if (expParts.length < 2 || expParts[1].trim().isEmpty()) { + throw new IncompleteCommandException("Expiration date is missing. Please use the format 'd/YYYY-MM-DD'."); + } Grocery grocery = getGrocery(expParts[0].strip()); - String date = expParts[1].strip(); - - grocery.setExpiration(date); - assert grocery.getExpiration().equals(date) : "Expiration date should be set correctly"; + + // Parse the date string to LocalDate + LocalDate date; + try { + date = LocalDate.parse(expParts[1].strip(), DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } catch (DateTimeParseException e) { + throw new WrongFormatException("Expiration date is in the wrong format. Please use yyyy-MM-dd."); + } + + // Convert LocalDate back to String to match the setExpiration signature + String dateString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + grocery.setExpiration(dateString); + + // Verification and UI feedback + assert grocery.getExpiration().isEqual(date) : "Expiration date should be set correctly"; Ui.printExpSet(grocery); - } /** @@ -164,6 +193,13 @@ public void listGroceries() { } } + /** + * Sorts the groceries by expiration date. + */ + public void sortByExpiration() { + Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); + } + /** * Removes a grocery. * diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 26066bad57..7f707abd02 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,6 +1,8 @@ package grocery; import exceptions.commands.EmptyGroceryException; +import exceptions.commands.WrongFormatException; +import exceptions.CannotUseException; import exceptions.GitException; import org.junit.jupiter.api.Test; @@ -8,19 +10,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +import java.time.LocalDate; + public class GroceryListTest { @Test public void editExpiration_success() { + GroceryList gl = new GroceryList(); try { - GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, "")); - gl.editExpiration("Meat d/ Monday"); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { - fail("setExpiration should be successful"); + fail("editExpiration should not throw an exception"); } } - + @Test public void editExpiration_noSuchGrocery_exceptionThrown() { try { @@ -35,7 +39,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, "")); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); gl.editExpiration("Meat"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -73,39 +77,42 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, "")); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); gl.editAmount("Meat", false); + fail("Expected a WrongFormatException to be thrown"); + } catch (WrongFormatException e) { + String expectedMessage = "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; + assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { - String message = "Command is in the wrong format, type \"help\" for more information." + - System.lineSeparator() + - "amt needs 'a/'"; - assertEquals(message, e.getMessage()); + fail("Expected a WrongFormatException, but another GitException was thrown"); } } @Test public void editAmountUseTrue_amountReaches0_success() { + GroceryList gl = new GroceryList(); try { - GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 5, "")); - gl.editAmount("Meat a/10", true); + gl.addGrocery(new Grocery("Meat", 5, LocalDate.now())); + gl.editAmount("Meat a/5", true); } catch (GitException e) { - fail("editAmount_useTrue should be able to handle cases where amount <= 0"); + fail("editAmount_useTrue should not throw an exception"); } } + @Test public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, "")); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); gl.editAmount("Meat a/5", true); + fail("Expected a CannotUseException to be thrown"); + } catch (CannotUseException e) { + String expectedMessage = "The grocery you want to use is already out of stock - time to replenish!"; + assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { - String message = "The grocery you want to use is already out of stock - time to replenish!"; - assertEquals(message, e.getMessage()); + fail("Expected a CannotUseException, but another GitException was thrown"); } } - - } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 8d1ae8be02..212b4e3219 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -1,20 +1,21 @@ package grocery; +import java.time.LocalDate; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, ""); + Grocery grocery = new Grocery("apple", 0, null); String message = "apple"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_correctAmtAndExp() { - Grocery grocery = new Grocery("chicken", 1, "soon"); - String message = "chicken" + ", amount: 1" + ", expiration: soon"; + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1)); + String message = "chicken" + ", amount: 1" + ", expiration: " + LocalDate.now().plusDays(1); assertEquals(message, grocery.printGrocery()); } } From ba50ea95c1d44898d4b12928212ee7cca1a0e87f Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:02:52 +0800 Subject: [PATCH 063/339] Update expiration date format in Grocery class and fix typo in GroceryTest --- src/main/java/grocery/Grocery.java | 4 +++- src/test/java/grocery/GroceryListTest.java | 5 +++-- src/test/java/grocery/GroceryTest.java | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 99c1398378..86e42d804f 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -61,7 +61,9 @@ public String printGrocery() { // TODO: update amount output according to Grocery subclass // TODO: consider stating amount == 0 now that we track amount ? String amt = (amount == 0) ? "" : ", amount: " + amount; - String exp = (expiration == null) ? "expiration date not set" : " expires on: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String exp = (expiration == null) + ? " expiration date not set" + : " expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); return this.name + amt + exp; } } diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 7f707abd02..3d4dd5a86f 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -40,7 +40,7 @@ public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); - gl.editExpiration("Meat"); + gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + System.lineSeparator() + @@ -81,7 +81,8 @@ public void editAmount_wrongFormat_exceptionThrown() { gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { - String expectedMessage = "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; + String expectedMessage = + "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 212b4e3219..efcd45dd15 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,7 +8,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null); - String message = "apple"; + String message = "apple expiration data not set"; assertEquals(message, grocery.printGrocery()); } From c4bc1e799c25ef464fb427dcf1e72634c8775f94 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:15:13 +0800 Subject: [PATCH 064/339] Fix formatting issue in Grocery class and update exception handling in GroceryListTest --- src/main/java/grocery/Grocery.java | 2 +- src/test/java/grocery/GroceryListTest.java | 14 +++++++++----- src/test/java/grocery/GroceryTest.java | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 86e42d804f..298cb1cb02 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -63,7 +63,7 @@ public String printGrocery() { String amt = (amount == 0) ? "" : ", amount: " + amount; String exp = (expiration == null) ? " expiration date not set" - : " expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); return this.name + amt + exp; } } diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 3d4dd5a86f..2fe6a10017 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,6 +1,7 @@ package grocery; import exceptions.commands.EmptyGroceryException; +import exceptions.commands.NoSuchGroceryException; import exceptions.commands.WrongFormatException; import exceptions.CannotUseException; import exceptions.GitException; @@ -29,9 +30,12 @@ public void editExpiration_success() { public void editExpiration_noSuchGrocery_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.editExpiration("nothing"); - } catch (GitException e) { + gl.editExpiration("nonexistentGrocery d/2024-07-19"); + fail("Expected NoSuchGroceryException not thrown"); + } catch (NoSuchGroceryException e) { assertEquals("The grocery does not exist!", e.getMessage()); + } catch (GitException e) { + fail("Expected NoSuchGroceryException, but another GitException was thrown"); } } @@ -78,16 +82,16 @@ public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); - gl.editAmount("Meat", false); + gl.editAmount("Meat", false); // This should probably include an attempt at an amount without the 'a/' indicator fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { - String expectedMessage = - "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; + String expectedMessage = "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); } } + @Test public void editAmountUseTrue_amountReaches0_success() { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index efcd45dd15..1b547b8dfe 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,7 +8,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null); - String message = "apple expiration data not set"; + String message = "apple expiration date not set"; assertEquals(message, grocery.printGrocery()); } From 9d64748b0af960f8e15a41ee5fab75adb0b1ddde Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:18:47 +0800 Subject: [PATCH 065/339] Fix wrong format error message in GroceryListTest --- src/test/java/grocery/GroceryListTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 2fe6a10017..5afbecb476 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -82,16 +82,16 @@ public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); - gl.editAmount("Meat", false); // This should probably include an attempt at an amount without the 'a/' indicator + gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { - String expectedMessage = "Command is in the wrong format, type \"help\" for more information. amt needs 'a/'"; + String expectedMessage = + "Command is in the wrong format, type \"help\" for more information."; assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); } } - @Test public void editAmountUseTrue_amountReaches0_success() { From 1df0abb1910546355acbe6ec8cca0e0fb4e7630f Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:21:59 +0800 Subject: [PATCH 066/339] Fix error message formatting in GroceryListTest --- src/test/java/grocery/GroceryListTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 5afbecb476..adf91a0d21 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -86,7 +86,7 @@ public void editAmount_wrongFormat_exceptionThrown() { fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { String expectedMessage = - "Command is in the wrong format, type \"help\" for more information."; + "Command is in the wrong format, type \"help\" for more information.\n"; assertEquals(expectedMessage, e.getMessage()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); From f0b2fa5769c7e0026f17493c00c5db949afd551f Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:26:24 +0800 Subject: [PATCH 067/339] Update expiration date command in text UI test --- 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 15c9eba049..538e3459ab 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -4,7 +4,7 @@ What is your name? Hello James Gosling! Here are some ways you can use this app! add GROCERY: adds the item GROCERY. -exp GROCERY d/EXPIRATION_DATE: sets the expiration date for GROCERY. +exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY. amt GROCERY a/AMOUNT: sets the amount of GROCERY. use GROCERY a/AMOUNT: updates the total amount after using a GROCERY del GROCERY: deletes GROCERY. From 498a01846a9f35b7c94378119d2ca87ab3716eb4 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 25 Mar 2024 13:29:28 +0800 Subject: [PATCH 068/339] Fix assertion in GroceryListTest --- src/test/java/grocery/GroceryListTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index adf91a0d21..f33f164958 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -87,7 +87,7 @@ public void editAmount_wrongFormat_exceptionThrown() { } catch (WrongFormatException e) { String expectedMessage = "Command is in the wrong format, type \"help\" for more information.\n"; - assertEquals(expectedMessage, e.getMessage()); + assertEquals(expectedMessage.trim(), e.getMessage().trim()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); } From e49d222b631c7bd9dd996e4c0f961f9da215c4d6 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 25 Mar 2024 21:45:12 +0800 Subject: [PATCH 069/339] Add logo --- src/main/java/git/Ui.java | 9 +++++++++ text-ui-test/EXPECTED.TXT | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 72f9cbffbc..bd56e06bbe 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -27,6 +27,15 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { + final String GITLOGO = + " ______ _ _________\n" + + " .' ___ | (_)| _ _ |\n" + + "/ .' \\_| __ |_/ | | \\_|\n" + + "| | ____[ | | |\n" + + "\\ `.___] || | _| |_\n" + + " `._____.'[___] |_____|"; + + System.out.println(GITLOGO + System.lineSeparator()); System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 538e3459ab..f7fd9d9c0a 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,3 +1,10 @@ + ______ _ _________ + .' ___ | (_)| _ _ | +/ .' \_| __ |_/ | | \_| +| | ____[ | | | +\ `.___] || | _| |_ + `._____.'[___] |_____| + Hello from GiT What is your name? - - - - - From 67aebd34131c91255bf53933fd815a559038abb7 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 11:49:13 +0800 Subject: [PATCH 070/339] Add methods to store cost and sort list by cost --- src/main/java/git/Parser.java | 8 +++++- src/main/java/git/Ui.java | 31 ++++++++++++++++++++- src/main/java/grocery/Grocery.java | 32 +++++++++++++++++++--- src/main/java/grocery/GroceryList.java | 13 +++++++++ src/test/java/grocery/GroceryListTest.java | 14 +++++----- src/test/java/grocery/GroceryTest.java | 4 +-- 6 files changed, 87 insertions(+), 15 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index e6967ceb7e..7d04e5ff6c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -36,9 +36,11 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": - Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now()); + Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now(), 0); String expiration = ui.promptForExpiration(); + String cost = ui.promptForCost(); grocery.setExpiration(expiration); + grocery.setCost(cost); groceryList.addGrocery(grocery); break; @@ -59,6 +61,10 @@ public void executeCommand(String[] commandParts) throws GitException { groceryList.listGroceries(); break; + case "listC" : + groceryList.sortByCost(); + break; + case "help": ui.displayHelp(); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index bd56e06bbe..9ec6f4fc40 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -54,8 +54,11 @@ public void printHello(String userName) { printLine(); } + /** * Processes user input into commands and their details. + * + * @return an array of the fragments of the commands */ public String[] processInput() { String commandLine = in.nextLine(); @@ -73,6 +76,8 @@ public String[] processInput() { /** * Prompts user for expiration date. + * + * @return the formatted expiration date */ public String promptForExpiration() { System.out.println("Please enter the year of expiry (e.g., 2024):"); @@ -82,15 +87,33 @@ public String promptForExpiration() { String month = in.nextLine().trim(); month = convertMonthToNumber(month); - System.out.println("Please enter the date of expiry (e.g., 19):"); + System.out.println("Please enter the date of expiry (e.g., 09):"); String day = in.nextLine().trim(); String formattedDate = formatExpirationDate(year, month, day); return formattedDate; } + /** + * Prompts the user to enter the cost of the grocery and format the string. + * Returns the cost to be set for the grocery. + * + * @return the cost of the grocery formatted in 2dp + */ + public String promptForCost() { + System.out.println("Please enter the cost (e.g., $1.20):"); + String price = in.nextLine().trim(); + String formattedPrice = price.replace("$", ""); + //format the money value with 2dp + double cost = Double.parseDouble(formattedPrice); + return String.format("%.2f", cost); + } + /** * Reads expiration date from user input. + * + * @param month the month of expiration + * @return month in numerical format */ private String convertMonthToNumber(String month) { // Convert month from name to number (e.g., "July" to "07") @@ -109,6 +132,11 @@ private String convertMonthToNumber(String month) { /** * Reads expiration date from user input. + * + * @param year the year of expiration + * @param month the month of expiration + * @param day the day of expiration + * @return the formatted expiration date */ private String formatExpirationDate(String year, String month, String day) { // This method can be enhanced to validate the date components @@ -127,6 +155,7 @@ public void displayHelp() { "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + + "listC: shows the list sorted by price.\n" + "exit: exits the program.\n" + "help: view all the possible commands." ); diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 298cb1cb02..1680e2ac8d 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -10,6 +10,7 @@ public class Grocery { private String name; private int amount; private LocalDate expiration; + private double cost; /** * Constructs a Grocery. @@ -18,10 +19,11 @@ public class Grocery { * @param amount Measurement of grocery. * @param expiration When grocery expires. */ - public Grocery(String name, int amount, LocalDate expiration) { + public Grocery(String name, int amount, LocalDate expiration, double cost) { this.name = name; this.amount = amount; this.expiration = expiration; + this.cost = cost; } // Getters and setters @@ -37,6 +39,10 @@ public LocalDate getExpiration() { return expiration; } + public double getCost() { + return this.cost; + } + public void setName(String name) { this.name = name; } @@ -46,6 +52,11 @@ public void setAmount(int amount) { this.amount = amount; } + /** + * Formats the expiration date from type string to local date. + * + * @param expiration the expiration date of the grocery + */ public void setExpiration(String expiration) { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -53,18 +64,31 @@ public void setExpiration(String expiration) { } /** - * Returns a String representation of the Grocery. + * Converts the cost from type String to double and store it. + * + * @param cost the cost of grocery in String type + */ + public void setCost(String cost) { + assert !(cost.isEmpty()) : "Cost entered is invalid!"; + this.cost = Double.parseDouble(cost); + } + + /** + * Returns the name, amount, expiration date and cost of the grocery. + * + * @return a String representation of the Grocery. */ public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; // TODO: update amount output according to Grocery subclass // TODO: consider stating amount == 0 now that we track amount ? - String amt = (amount == 0) ? "" : ", amount: " + amount; String exp = (expiration == null) ? " expiration date not set" : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - return this.name + amt + exp; + String amt = (amount == 0) ? "" : ", amount: " + amount; + String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): " the cost is not set"; + return this.name + amt + exp + price; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index babcdf32f1..bf6c8eecec 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -13,6 +13,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.logging.Logger; import java.util.logging.Level; @@ -200,6 +201,18 @@ public void sortByExpiration() { Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); } + public void sortByCost() { + int size = groceries.size(); + if (size == 0) { + Ui.printNoGrocery(); + } else { + List groceriesByDate = groceries; + groceriesByDate.sort((g1, g2) -> Double.compare(g1.getCost(), g2.getCost())); + Collections.reverse(groceriesByDate); + Ui.printGroceryList(groceriesByDate); + } + } + /** * Removes a grocery. * diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index f33f164958..2a43a6cde3 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -19,7 +19,7 @@ public class GroceryListTest { public void editExpiration_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), 0)); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { fail("editExpiration should not throw an exception"); @@ -43,7 +43,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), 0)); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -57,7 +57,7 @@ public void editExpiration_wrongFormat_exceptionThrown() { public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, 0, null)); // Use null to trigger the exception + gl.addGrocery(new Grocery(null, 0, null, 0)); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); } catch (EmptyGroceryException e) { assertEquals("A grocery needs to be specified!", e.getMessage()); @@ -68,7 +68,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", 0, null)); + gl.addGrocery(new Grocery("fooood", 0, null, 0)); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -81,7 +81,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), 0)); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { @@ -97,7 +97,7 @@ public void editAmount_wrongFormat_exceptionThrown() { public void editAmountUseTrue_amountReaches0_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 5, LocalDate.now(), 0)); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -109,7 +109,7 @@ public void editAmountUseTrue_amountReaches0_success() { public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), 0)); gl.editAmount("Meat a/5", true); fail("Expected a CannotUseException to be thrown"); } catch (CannotUseException e) { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 1b547b8dfe..b471328770 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -7,14 +7,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, null); + Grocery grocery = new Grocery("apple", 0, null, 0); String message = "apple expiration date not set"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_correctAmtAndExp() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1)); + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), 0); String message = "chicken" + ", amount: 1" + ", expiration: " + LocalDate.now().plusDays(1); assertEquals(message, grocery.printGrocery()); } From 396dd62540c4bb84b2cb5498585d9f069ddf6ab2 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 12:15:44 +0800 Subject: [PATCH 071/339] Add exceptions and test for cost methods --- .../java/exceptions/InvalidCostException.java | 13 +++++++++++++ src/main/java/git/Ui.java | 18 +++++++++++++----- src/main/java/grocery/Grocery.java | 2 +- src/test/java/grocery/GroceryTest.java | 18 ++++++++++++++---- text-ui-test/EXPECTED.TXT | 1 + 5 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 src/main/java/exceptions/InvalidCostException.java diff --git a/src/main/java/exceptions/InvalidCostException.java b/src/main/java/exceptions/InvalidCostException.java new file mode 100644 index 0000000000..5029838348 --- /dev/null +++ b/src/main/java/exceptions/InvalidCostException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the cost inputted by the user is invalid. + */ +public class InvalidCostException extends GitException{ + /** + * Constructs InvalidCostException. + */ + public InvalidCostException() { + message = "Please input a valid cost!"; + } +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9ec6f4fc40..d41e5557f3 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Scanner; +import exceptions.InvalidCostException; import grocery.Grocery; @@ -100,13 +101,20 @@ public String promptForExpiration() { * * @return the cost of the grocery formatted in 2dp */ - public String promptForCost() { + public String promptForCost() throws InvalidCostException { System.out.println("Please enter the cost (e.g., $1.20):"); String price = in.nextLine().trim(); - String formattedPrice = price.replace("$", ""); - //format the money value with 2dp - double cost = Double.parseDouble(formattedPrice); - return String.format("%.2f", cost); + if(price.contains("$")) { + String formattedPrice = price.replace("$", ""); + try { + double cost = Double.parseDouble(formattedPrice); + return String.format("%.2f", cost);//format the money value to 2dp + } catch (NumberFormatException nfe) { + throw new InvalidCostException(); + } + } else { + throw new InvalidCostException(); + } } /** diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 1680e2ac8d..5d47ffc387 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -87,7 +87,7 @@ public String printGrocery() { ? " expiration date not set" : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String amt = (amount == 0) ? "" : ", amount: " + amount; - String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): " the cost is not set"; + String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): " cost not set"; return this.name + amt + exp + price; } } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index b471328770..9a612206b2 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,14 +8,24 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null, 0); - String message = "apple expiration date not set"; + String message = "apple expiration date not set cost not set"; assertEquals(message, grocery.printGrocery()); } @Test - public void printGrocery_correctAmtAndExp() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), 0); - String message = "chicken" + ", amount: 1" + ", expiration: " + LocalDate.now().plusDays(1); + public void printGrocery_costWrongFormat_formattedCost() { + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), 1); + String message = "chicken" + ", amount: 1" + ", expiration: " + + LocalDate.now().plusDays(1) + ", cost: $1.00"; assertEquals(message, grocery.printGrocery()); } + + @Test + public void printGrocery_correctAmtAndExpAndCost() { + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), 1.20); + String message = "chicken" + ", amount: 1" + ", expiration: " + + LocalDate.now().plusDays(1) + ", cost: $1.20"; + assertEquals(message, grocery.printGrocery()); + } + } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index f7fd9d9c0a..ffed670f24 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -16,6 +16,7 @@ amt GROCERY a/AMOUNT: sets the amount of GROCERY. use GROCERY a/AMOUNT: updates the total amount after using a GROCERY del GROCERY: deletes GROCERY. list: shows list of all groceries you have. +listC: shows the list sorted by price. exit: exits the program. help: view all the possible commands. Enter command: From 80443c2b33f6b0233613b835e2d276ce9c18d9ea Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 12:55:39 +0800 Subject: [PATCH 072/339] Add methods to edit the cost of a grocery --- src/main/java/git/Parser.java | 6 +++++- src/main/java/git/Ui.java | 11 ++++++++++- src/main/java/grocery/GroceryList.java | 18 +++++++++++++++++- text-ui-test/EXPECTED.TXT | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7d04e5ff6c..d20e9d6dee 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -53,6 +53,10 @@ public void executeCommand(String[] commandParts) throws GitException { groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); break; + case "cost": + groceryList.editCost(commandParts[1]); + break; + case "del": groceryList.removeGrocery(commandParts[1]); break; @@ -61,7 +65,7 @@ public void executeCommand(String[] commandParts) throws GitException { groceryList.listGroceries(); break; - case "listC" : + case "listC": groceryList.sortByCost(); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index d41e5557f3..22804f69c9 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Scanner; +import exceptions.GitException; import exceptions.InvalidCostException; import grocery.Grocery; @@ -101,7 +102,7 @@ public String promptForExpiration() { * * @return the cost of the grocery formatted in 2dp */ - public String promptForCost() throws InvalidCostException { + public String promptForCost() throws GitException { System.out.println("Please enter the cost (e.g., $1.20):"); String price = in.nextLine().trim(); if(price.contains("$")) { @@ -161,6 +162,7 @@ public void displayHelp() { "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY\n" + + "cost GROCERY $PRICE: updates the price of GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "listC: shows the list sorted by price.\n" + @@ -177,6 +179,13 @@ public static void printExpSet(Grocery grocery) { System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } + public static void printCostSet(Grocery grocery) { + assert (grocery.getCost()!= 0): "grocery cost should not be empty"; + double cost = grocery.getCost(); + String price = "$" + String.format("%.2f", cost); + System.out.println(grocery.getName() + " is now " + price); + } + /** * Prints output after adding a grocery. */ diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index bf6c8eecec..3cd2a2b71f 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,6 +1,7 @@ package grocery; import exceptions.InvalidAmountException; +import exceptions.InvalidCostException; import git.Ui; import exceptions.GitException; import exceptions.commands.EmptyGroceryException; @@ -13,7 +14,6 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.logging.Logger; import java.util.logging.Level; @@ -182,6 +182,22 @@ public void editAmount(String details, boolean use) throws GitException { } } + public void editCost(String details) throws GitException { + // Assuming the format is "cost GROCERY $PRICE" + System.out.println(details); + String[] costParts = checkDetails(details, "cost", "\\$"); + Grocery grocery = getGrocery(costParts[0].strip()); + String price = costParts[1].strip(); + + try { + double cost = Double.parseDouble(price); + grocery.setCost(String.format("%.2f", cost)); + Ui.printCostSet(grocery); + } catch (NumberFormatException e) { + throw new InvalidCostException(); + } + } + /** * Lists all the user's groceries. */ diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index ffed670f24..bd36dadd95 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -14,6 +14,7 @@ add GROCERY: adds the item GROCERY. exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY. amt GROCERY a/AMOUNT: sets the amount of GROCERY. use GROCERY a/AMOUNT: updates the total amount after using a GROCERY +cost GROCERY $PRICE: updates the price of GROCERY. del GROCERY: deletes GROCERY. list: shows list of all groceries you have. listC: shows the list sorted by price. From 81641febafb785ecebc3a4cdb56e5952bcead64e Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Tue, 26 Mar 2024 13:39:29 +0800 Subject: [PATCH 073/339] Add category --- src/main/java/git/Parser.java | 3 ++- src/main/java/git/Ui.java | 13 ++++++++++--- src/main/java/grocery/Grocery.java | 5 ++++- src/test/java/grocery/GroceryListTest.java | 14 +++++++------- src/test/java/grocery/GroceryTest.java | 4 ++-- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index e6967ceb7e..9e4e57b540 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -36,7 +36,8 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": - Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now()); + String category = ui.promptForCategory(); + Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now(), category); String expiration = ui.promptForExpiration(); grocery.setExpiration(expiration); groceryList.addGrocery(grocery); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index bd56e06bbe..9175f9e4a9 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -75,19 +75,26 @@ public String[] processInput() { * Prompts user for expiration date. */ public String promptForExpiration() { - System.out.println("Please enter the year of expiry (e.g., 2024):"); + System.out.println("Please enter the year of expiry (e.g. 2024):"); String year = in.nextLine().trim(); - System.out.println("Please enter the month of expiry (can be July or can be 07):"); + System.out.println("Please enter the month of expiry (e.g. July or 07):"); String month = in.nextLine().trim(); month = convertMonthToNumber(month); - System.out.println("Please enter the date of expiry (e.g., 19):"); + System.out.println("Please enter the date of expiry (e.g. 19):"); String day = in.nextLine().trim(); String formattedDate = formatExpirationDate(year, month, day); return formattedDate; } + /** + * Prompts user for category + */ + public String promptForCategory(){ + System.out.println("Please enter the category (e.g. fruit):"); + return in.nextLine().trim(); + } /** * Reads expiration date from user input. diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 298cb1cb02..d293296bc1 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -10,6 +10,7 @@ public class Grocery { private String name; private int amount; private LocalDate expiration; + private String category; /** * Constructs a Grocery. @@ -17,11 +18,13 @@ public class Grocery { * @param name Name. * @param amount Measurement of grocery. * @param expiration When grocery expires. + * @param category Category of grocery. */ - public Grocery(String name, int amount, LocalDate expiration) { + public Grocery(String name, int amount, LocalDate expiration, String category) { this.name = name; this.amount = amount; this.expiration = expiration; + this.category = category; } // Getters and setters diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index f33f164958..f49772ad83 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -19,7 +19,7 @@ public class GroceryListTest { public void editExpiration_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(),"Meat")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { fail("editExpiration should not throw an exception"); @@ -43,7 +43,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -57,7 +57,7 @@ public void editExpiration_wrongFormat_exceptionThrown() { public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, 0, null)); // Use null to trigger the exception + gl.addGrocery(new Grocery(null, 0, null, "Meat")); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); } catch (EmptyGroceryException e) { assertEquals("A grocery needs to be specified!", e.getMessage()); @@ -68,7 +68,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", 0, null)); + gl.addGrocery(new Grocery("fooood", 0, null, "Meat")); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -81,7 +81,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat")); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { @@ -97,7 +97,7 @@ public void editAmount_wrongFormat_exceptionThrown() { public void editAmountUseTrue_amountReaches0_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 5, LocalDate.now(), "Meat")); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -109,7 +109,7 @@ public void editAmountUseTrue_amountReaches0_success() { public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now())); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat")); gl.editAmount("Meat a/5", true); fail("Expected a CannotUseException to be thrown"); } catch (CannotUseException e) { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 1b547b8dfe..e05d9b69b0 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -7,14 +7,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, null); + Grocery grocery = new Grocery("apple", 0, null, "fruit"); String message = "apple expiration date not set"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_correctAmtAndExp() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1)); + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat"); String message = "chicken" + ", amount: 1" + ", expiration: " + LocalDate.now().plusDays(1); assertEquals(message, grocery.printGrocery()); } From a271d211c93ad755b96dfd7446bf1dd4c9f80549 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 14:12:50 +0800 Subject: [PATCH 074/339] Update the JavaDoc to correct format --- src/main/java/git/Ui.java | 40 +++++++++++++++++++------- src/main/java/grocery/Grocery.java | 6 ++-- src/main/java/grocery/GroceryList.java | 17 +++++++++-- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 22804f69c9..95f7469bfa 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -46,7 +46,9 @@ public void printWelcome() { } /** - * Prints Hello with user's name + * Prints Hello with user's name. + * + * @param userName User's name. */ public void printHello(String userName) { System.out.println("Hello " + userName + "!"); @@ -60,7 +62,7 @@ public void printHello(String userName) { /** * Processes user input into commands and their details. * - * @return an array of the fragments of the commands + * @return Array of the fragments of the commands. */ public String[] processInput() { String commandLine = in.nextLine(); @@ -79,7 +81,7 @@ public String[] processInput() { /** * Prompts user for expiration date. * - * @return the formatted expiration date + * @return Formatted expiration date. */ public String promptForExpiration() { System.out.println("Please enter the year of expiry (e.g., 2024):"); @@ -100,7 +102,7 @@ public String promptForExpiration() { * Prompts the user to enter the cost of the grocery and format the string. * Returns the cost to be set for the grocery. * - * @return the cost of the grocery formatted in 2dp + * @return Cost of the grocery formatted in 2 decimal points. */ public String promptForCost() throws GitException { System.out.println("Please enter the cost (e.g., $1.20):"); @@ -121,8 +123,8 @@ public String promptForCost() throws GitException { /** * Reads expiration date from user input. * - * @param month the month of expiration - * @return month in numerical format + * @param month Month of expiration. + * @return Month in numerical format. */ private String convertMonthToNumber(String month) { // Convert month from name to number (e.g., "July" to "07") @@ -142,10 +144,10 @@ private String convertMonthToNumber(String month) { /** * Reads expiration date from user input. * - * @param year the year of expiration - * @param month the month of expiration - * @param day the day of expiration - * @return the formatted expiration date + * @param year Year of expiration. + * @param month Month of expiration. + * @param day Day of expiration. + * @return Formatted expiration date. */ private String formatExpirationDate(String year, String month, String day) { // This method can be enhanced to validate the date components @@ -173,12 +175,19 @@ public void displayHelp() { /** * Prints output after setting the selected grocery's expiration date. + * + * @param grocery The grocery that should be updated. */ public static void printExpSet(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } + /** + * Prints output after editing the selected grocery's cost. + * + * @param grocery The grocery that should be updated. + */ public static void printCostSet(Grocery grocery) { assert (grocery.getCost()!= 0): "grocery cost should not be empty"; double cost = grocery.getCost(); @@ -188,6 +197,8 @@ public static void printCostSet(Grocery grocery) { /** * Prints output after adding a grocery. + * + * @param grocery Grocery added. */ public static void printGroceryAdded(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; @@ -196,6 +207,8 @@ public static void printGroceryAdded(Grocery grocery) { /** * Prints output after setting the selected grocery's amount. + * + * @param grocery The grocery that should be updated. */ public static void printAmtSet(Grocery grocery) { // TODO: update amount output according to Grocery subclass @@ -205,6 +218,8 @@ public static void printAmtSet(Grocery grocery) { /** * Prints output after a grocery's amount is set to 0. + * + * @param grocery The grocery that is depleted. */ public static void printAmtDepleted(Grocery grocery) { System.out.println(grocery.getName() + " is now out of stock!"); @@ -219,6 +234,8 @@ public static void printNoGrocery() { /** * Prints all groceries. + * + * @param groceries An array list of groceries. */ public static void printGroceryList(List groceries) { assert !groceries.isEmpty() : "grocery list should not be empty"; @@ -230,6 +247,9 @@ public static void printGroceryList(List groceries) { /** * Prints output when the selected grocery is removed. + * + * @param grocery The grocery that is removed. + * @param groceries The array list of groceries. */ public static void printGroceryRemoved(Grocery grocery, List groceries) { assert grocery!=null : "Grocery does not exist"; diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5d47ffc387..cae341903b 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -55,7 +55,7 @@ public void setAmount(int amount) { /** * Formats the expiration date from type string to local date. * - * @param expiration the expiration date of the grocery + * @param expiration The expiration date of the grocery. */ public void setExpiration(String expiration) { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; @@ -66,7 +66,7 @@ public void setExpiration(String expiration) { /** * Converts the cost from type String to double and store it. * - * @param cost the cost of grocery in String type + * @param cost The cost of grocery in String type. */ public void setCost(String cost) { assert !(cost.isEmpty()) : "Cost entered is invalid!"; @@ -76,7 +76,7 @@ public void setCost(String cost) { /** * Returns the name, amount, expiration date and cost of the grocery. * - * @return a String representation of the Grocery. + * @return String representation of the Grocery. */ public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 3cd2a2b71f..c068ed68a6 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -38,6 +38,9 @@ public GroceryList() { /** * Adds a grocery. + * + * @param grocery Grocery to be added. + * @throws EmptyGroceryException If grocery name == null. */ public void addGrocery(Grocery grocery) throws EmptyGroceryException { if (grocery.getName() == null || grocery.getName().trim().isEmpty()) { @@ -60,7 +63,9 @@ public void addGrocery(Grocery grocery) throws EmptyGroceryException { /** * Returns the desired grocery. * - * @throws NoSuchGroceryException Selected grocery does not exist. + * @param name Name of the grocery. + * @return The needed grocery. + * @throws NoSuchGroceryException If the selected grocery does not exist. */ private Grocery getGrocery(String name) throws NoSuchGroceryException { int index = -1; @@ -121,6 +126,7 @@ private String[] checkDetails(String details, String command, String parameter) /** * Adds the expiration date of an existing grocery. * + * @param details A string containing grocery name and details. * @throws GitException Exception thrown depending on error. */ public void editExpiration(String details) throws GitException { @@ -182,6 +188,12 @@ public void editAmount(String details, boolean use) throws GitException { } } + /** + * Updates the cost of an existing grocery. + * + * @param details A string containing grocery name and details. + * @throws GitException If the input new cost is not numeric. + */ public void editCost(String details) throws GitException { // Assuming the format is "cost GROCERY $PRICE" System.out.println(details); @@ -232,7 +244,8 @@ public void sortByCost() { /** * Removes a grocery. * - * @throws GitException Exception thrown depending on error. + * @param details User input. + * @throws GitException If grocery is empty. */ public void removeGrocery(String details) throws GitException { assert (!groceries.isEmpty()) : "There is nothing to remove."; From 57210ed712855919d4f3fafac00a7bcb760c5ebd Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 14:23:14 +0800 Subject: [PATCH 075/339] Add a few lines of user stories --- docs/DeveloperGuide.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..9e245b532d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -20,10 +20,15 @@ ## 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 instructions on how to use the app|refer to them when I forget how to use the application| +|v1.0|user| add groceries to the app |manage all my groceries| +|v1.0|user| view all my groceries |know what I have bought| +|v1.0|user| delete the groceries from the list |know which items are depleted| +|v1.0|user| add the amount of a grocery|keep track of the amount of that item I have| +|v1.0|user| add the expiration date of the grocery |keep track of when my items expire easily| +|v2.0|financially-aware user|add the cost of the groceries|know how much I am spending| ## Non-Functional Requirements From 9744995cd7247eda65632f371055b545df7e1978 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 26 Mar 2024 14:44:57 +0800 Subject: [PATCH 076/339] Update the developer guide --- docs/DeveloperGuide.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9e245b532d..4c794c4d1e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,19 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} - +1. View all groceries added + * First create a method in "Grocery" class that prints the grocery in a preferred format.\ + e.g., NAME, AMOUNT, EXPIRATION, PRICE. + * Then create a method in "GroceryList" class that prints all the groceries in the list. +2. List the groceries by price in descending order + * First, create a field in "Grocery" class that stores the cost of a grocery. + * When adding a grocery, prompt the user to enter the cost. + * Format the cost into 2 decimal places, remove the dollar sign and store it as a string. + * Second, the grocery's cost accordingly before adding it into the list. + * When setting the cost, convert the cost from String into Double. + * Third, add method in "GroceryList" class to create a copy of the current grocery list, then sort the + new grocery list by price using lambda function. Reverse and print the new list. +3. xx ## Product scope ### Target user profile From dfe536eaab655f5eeefd290221248d085e627583 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Tue, 26 Mar 2024 14:57:25 +0800 Subject: [PATCH 077/339] Add amount --- src/main/java/git/Parser.java | 3 ++- src/main/java/git/Ui.java | 10 ++++++++++ src/main/java/grocery/Grocery.java | 22 ++++++++++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 9e4e57b540..f7f0f59dcc 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -37,7 +37,8 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": String category = ui.promptForCategory(); - Grocery grocery = new Grocery(commandParts[1], 0, LocalDate.now(), category); + int amount = ui.promptForAmount(); + Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category); String expiration = ui.promptForExpiration(); grocery.setExpiration(expiration); groceryList.addGrocery(grocery); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9175f9e4a9..61c19b376b 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -96,6 +96,16 @@ public String promptForCategory(){ return in.nextLine().trim(); } + public int promptForAmount(){ + System.out.println("Please enter the amount (e.g. 3):"); + try { + return Integer.parseInt(in.nextLine().trim()); + } catch (NumberFormatException e){ + System.out.println("Please enter a valid integer for the amount (e.g. 3)!"); + return promptForAmount(); + } + } + /** * Reads expiration date from user input. */ diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index d293296bc1..eb7c89d9d8 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -63,11 +63,29 @@ public String printGrocery() { // TODO: update amount output according to Grocery subclass // TODO: consider stating amount == 0 now that we track amount ? - String amt = (amount == 0) ? "" : ", amount: " + amount; + String amountString = (amount == 0) ? "" : ", amount: " + amount; String exp = (expiration == null) ? " expiration date not set" : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - return this.name + amt + exp; + String unit = ""; + switch (category.toLowerCase()){ + case "fruit": + unit = "pieces"; + break; + case "vegetable": + unit = "grams"; + break; + case "meat": + unit = "grams"; + break; + case "beverage": + unit = "ml"; + break; + default: + unit = "units"; + break; + } + return this.name + " (" + this.category + ") " + amountString + unit + exp; } } From 65578c5e1cdb173637d19f0b5bd3137a43d057f4 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Tue, 26 Mar 2024 16:09:59 +0800 Subject: [PATCH 078/339] Fix indentation --- src/main/java/grocery/Grocery.java | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5c29ce2ec3..ded64dae50 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -96,21 +96,21 @@ public String printGrocery() { String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): " cost not set"; String unit = ""; switch (category.toLowerCase()){ - case "fruit": - unit = "pieces"; - break; - case "vegetable": - unit = "grams"; - break; - case "meat": - unit = "grams"; - break; - case "beverage": - unit = "ml"; - break; - default: - unit = "units"; - break; + case "fruit": + unit = "pieces"; + break; + case "vegetable": + unit = "grams"; + break; + case "meat": + unit = "grams"; + break; + case "beverage": + unit = "ml"; + break; + default: + unit = "units"; + break; } return this.name + " (" + this.category + ") " + amountString + unit + exp + price; From 2fe86d9995d3ffe8b9bfbb79f29a4ea8bf2d82e7 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Tue, 26 Mar 2024 16:17:48 +0800 Subject: [PATCH 079/339] Fix Assertion --- src/test/java/grocery/GroceryTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 1684b5838e..b3df1d6730 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,14 +8,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null, "fruit", 0); - String message = "apple expiration date not set cost not set"; + String message = "apple (fruit) pieces expiration date not set cost not set"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1); - String message = "chicken" + ", amount: 1" + ", expiration: " + String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00"; assertEquals(message, grocery.printGrocery()); } @@ -23,7 +23,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20); - String message = "chicken" + ", amount: 1" + ", expiration: " + String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20"; assertEquals(message, grocery.printGrocery()); } From e73c7e8ebeec7938f0094975839e1a91fce47978 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Tue, 26 Mar 2024 20:40:18 +0800 Subject: [PATCH 080/339] Edit Developer Guide --- docs/DeveloperGuide.md | 13 +++++++++++-- src/main/java/git/Parser.java | 1 - 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4c794c4d1e..de142798a9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -19,8 +19,17 @@ * When setting the cost, convert the cost from String into Double. * Third, add method in "GroceryList" class to create a copy of the current grocery list, then sort the new grocery list by price using lambda function. Reverse and print the new list. -3. xx - +3. Input category for each grocery added + * In Grocery class, modified the Grocery constructor to accept the 'category' parameter. + * In Parser class executeCommand method, modified the add command to prompt the user for the category of the grocery. Passed the category as a parameter when creating a new Grocery object. + * In Ui class, added a new method promptForCategory to prompt the user for the category of the grocery. + * In Grocery class, modified the printGrocery method to include the category information in the output string. +4. Input amount for each grocery added + * In Grocery class, modified the Grocery constructor to accept the 'amount' parameter. + * In Parser class executeCommand method, modified the add command to prompt the user for the amount of grocery. Passed the amount as a parameter when creating a new Grocery object. + * In Ui class, added a new method promptForAmount to prompt the user for the amount of grocery. + * In Grocery class, modified the printGrocery method to print different units of measurement for different categories. +5. xx ## Product scope ### Target user profile diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c5bee08107..c29995c7e4 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -36,7 +36,6 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": - String category = ui.promptForCategory(); int amount = ui.promptForAmount(); Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, 0); From c89e6848f47aa12104a8f4411813f6c12ee2ac9d Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 02:04:18 +0800 Subject: [PATCH 081/339] Update expiration date cases --- .../LocalDateWrongFormatException.java | 13 ++++++ ....java => CommandWrongFormatException.java} | 6 +-- ...java => IncompleteParameterException.java} | 8 ++-- src/main/java/grocery/GroceryList.java | 40 ++++++------------- src/test/java/grocery/GroceryListTest.java | 4 +- 5 files changed, 34 insertions(+), 37 deletions(-) create mode 100644 src/main/java/exceptions/LocalDateWrongFormatException.java rename src/main/java/exceptions/commands/{WrongFormatException.java => CommandWrongFormatException.java} (85%) rename src/main/java/exceptions/commands/{IncompleteCommandException.java => IncompleteParameterException.java} (50%) diff --git a/src/main/java/exceptions/LocalDateWrongFormatException.java b/src/main/java/exceptions/LocalDateWrongFormatException.java new file mode 100644 index 0000000000..4595501bc3 --- /dev/null +++ b/src/main/java/exceptions/LocalDateWrongFormatException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the LocalDate format is wrong. + */ +public class LocalDateWrongFormatException extends GitException { + /** + * Constructs LocalDateWrongFormatException. + */ + public LocalDateWrongFormatException() { + message = "Expiration date is in the wrong format. Please use yyyy-MM-dd."; + } +} diff --git a/src/main/java/exceptions/commands/WrongFormatException.java b/src/main/java/exceptions/commands/CommandWrongFormatException.java similarity index 85% rename from src/main/java/exceptions/commands/WrongFormatException.java rename to src/main/java/exceptions/commands/CommandWrongFormatException.java index 8db1a8c405..a80a87ee84 100644 --- a/src/main/java/exceptions/commands/WrongFormatException.java +++ b/src/main/java/exceptions/commands/CommandWrongFormatException.java @@ -5,11 +5,11 @@ /** * Represents the exception thrown when the command does not follow the proper format. */ -public class WrongFormatException extends GitException { +public class CommandWrongFormatException extends GitException { /** - * Constructs WrongFormatException. + * Constructs CommandWrongFormatException. */ - public WrongFormatException(String command) { + public CommandWrongFormatException(String command) { message = printWrongFormatFix(command); } diff --git a/src/main/java/exceptions/commands/IncompleteCommandException.java b/src/main/java/exceptions/commands/IncompleteParameterException.java similarity index 50% rename from src/main/java/exceptions/commands/IncompleteCommandException.java rename to src/main/java/exceptions/commands/IncompleteParameterException.java index 1dd04d2cc3..397fd1e428 100644 --- a/src/main/java/exceptions/commands/IncompleteCommandException.java +++ b/src/main/java/exceptions/commands/IncompleteParameterException.java @@ -3,13 +3,13 @@ import exceptions.GitException; /** - * Represents the exception thrown when the format is correct, but input is empty. + * Represents the exception thrown when the format is correct, but parameter input is empty. */ -public class IncompleteCommandException extends GitException { +public class IncompleteParameterException extends GitException { /** - * Constructs IncompleteCommandException. + * Constructs IncompleteParameterException. */ - public IncompleteCommandException(String parameter) { + public IncompleteParameterException(String parameter) { message = parameter + " cannot be empty!"; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index c068ed68a6..ad32397423 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,14 +1,11 @@ package grocery; -import exceptions.InvalidAmountException; -import exceptions.InvalidCostException; +import exceptions.*; import git.Ui; -import exceptions.GitException; import exceptions.commands.EmptyGroceryException; -import exceptions.commands.IncompleteCommandException; +import exceptions.commands.IncompleteParameterException; import exceptions.commands.NoSuchGroceryException; -import exceptions.commands.WrongFormatException; -import exceptions.CannotUseException; +import exceptions.commands.CommandWrongFormatException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -43,7 +40,7 @@ public GroceryList() { * @throws EmptyGroceryException If grocery name == null. */ public void addGrocery(Grocery grocery) throws EmptyGroceryException { - if (grocery.getName() == null || grocery.getName().trim().isEmpty()) { + if (grocery.getName() == null) { throw new EmptyGroceryException(); } @@ -100,27 +97,17 @@ private String[] checkDetails(String details, String command, String parameter) // Split the input into the grocery name and the detail part. String[] detailParts = details.split(parameter, 2); - if (detailParts.length < 2 || detailParts[1].trim().isEmpty()) { - throw new WrongFormatException(command + " command is in the wrong format. " + parameter + " is required."); - } - - // Retrieve the grocery to ensure it exists. - Grocery grocery = getGrocery(detailParts[0].strip()); - if (grocery == null) { - throw new NoSuchGroceryException(); + Grocery grocery = getGrocery(detailParts[0].strip()); // Needed to throw NoSuchGrocery exception first + if (detailParts.length < 2) { + throw new CommandWrongFormatException(command); } String attribute = detailParts[1].strip(); - // For expiration date updates, validate the date format. - if (command.equals("exp")) { - try { - LocalDate.parse(attribute, DateTimeFormatter.ofPattern("yyyy-MM-dd")); - } catch (DateTimeParseException e) { - throw new WrongFormatException("Expiration date is in the wrong format. Please use yyyy-MM-dd."); - } + if (attribute.isEmpty()) { + throw new IncompleteParameterException(parameter); } - return new String[] {detailParts[0].trim(), attribute}; + return new String[] {detailParts[0].strip(), attribute}; } /** @@ -132,9 +119,6 @@ private String[] checkDetails(String details, String command, String parameter) public void editExpiration(String details) throws GitException { // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" String[] expParts = checkDetails(details, "exp", "d/"); - if (expParts.length < 2 || expParts[1].trim().isEmpty()) { - throw new IncompleteCommandException("Expiration date is missing. Please use the format 'd/YYYY-MM-DD'."); - } Grocery grocery = getGrocery(expParts[0].strip()); // Parse the date string to LocalDate @@ -142,7 +126,7 @@ public void editExpiration(String details) throws GitException { try { date = LocalDate.parse(expParts[1].strip(), DateTimeFormatter.ofPattern("yyyy-MM-dd")); } catch (DateTimeParseException e) { - throw new WrongFormatException("Expiration date is in the wrong format. Please use yyyy-MM-dd."); + throw new LocalDateWrongFormatException(); } // Convert LocalDate back to String to match the setExpiration signature @@ -163,7 +147,7 @@ public void editExpiration(String details) throws GitException { */ public void editAmount(String details, boolean use) throws GitException { // Assuming the format is "amt GROCERY a/AMOUNT" - String[] amtParts = checkDetails(details, "amt", "a/"); + String[] amtParts = checkDetails(details, use ? "use": "amt", "a/"); Grocery grocery = getGrocery(amtParts[0].strip()); String amountString = amtParts[1].strip(); diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 7dd6e66fef..ef535dcdbe 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -2,7 +2,7 @@ import exceptions.commands.EmptyGroceryException; import exceptions.commands.NoSuchGroceryException; -import exceptions.commands.WrongFormatException; +import exceptions.commands.CommandWrongFormatException; import exceptions.CannotUseException; import exceptions.GitException; @@ -84,7 +84,7 @@ public void editAmount_wrongFormat_exceptionThrown() { gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0)); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); - } catch (WrongFormatException e) { + } catch (CommandWrongFormatException e) { String expectedMessage = "Command is in the wrong format, type \"help\" for more information.\n"; assertEquals(expectedMessage.trim(), e.getMessage().trim()); From 94e9ff3c1f665f2918e6a3af9e775e967d0e3bbd Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 02:13:47 +0800 Subject: [PATCH 082/339] Update test accordingly --- src/test/java/grocery/GroceryListTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index ef535dcdbe..2c8400724c 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -85,8 +85,9 @@ public void editAmount_wrongFormat_exceptionThrown() { gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (CommandWrongFormatException e) { - String expectedMessage = - "Command is in the wrong format, type \"help\" for more information.\n"; + String expectedMessage = "Command is in the wrong format, type \"help\" for more information." + + System.lineSeparator() + + "amt needs 'a/'"; assertEquals(expectedMessage.trim(), e.getMessage().trim()); } catch (GitException e) { fail("Expected a WrongFormatException, but another GitException was thrown"); From f84e46088146df5e057ab028bf0d4ac9b8aded48 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 02:23:11 +0800 Subject: [PATCH 083/339] Fix checkstyle issues --- src/main/java/git/Ui.java | 4 ++-- src/main/java/grocery/GroceryList.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2b89066ece..092f87a434 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -29,7 +29,7 @@ public Ui() { * Prints welcome message. */ public void printWelcome() { - final String GITLOGO = + final String gitlogo = " ______ _ _________\n" + " .' ___ | (_)| _ _ |\n" + "/ .' \\_| __ |_/ | | \\_|\n" + @@ -37,7 +37,7 @@ public void printWelcome() { "\\ `.___] || | _| |_\n" + " `._____.'[___] |_____|"; - System.out.println(GITLOGO + System.lineSeparator()); + System.out.println(gitlogo + System.lineSeparator()); System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ad32397423..ef22f51a3f 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,7 +1,11 @@ package grocery; -import exceptions.*; import git.Ui; +import exceptions.GitException; +import exceptions.LocalDateWrongFormatException; +import exceptions.InvalidAmountException; +import exceptions.InvalidCostException; +import exceptions.CannotUseException; import exceptions.commands.EmptyGroceryException; import exceptions.commands.IncompleteParameterException; import exceptions.commands.NoSuchGroceryException; From 7a3d581f806c306218fde6f9221df8d20c23240a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 27 Mar 2024 15:58:48 +0800 Subject: [PATCH 084/339] Add location feature to grocery --- docs/DeveloperGuide.md | 9 ++++++++- src/main/java/git/Parser.java | 3 ++- src/main/java/git/Ui.java | 11 ++++++++++- src/main/java/grocery/Grocery.java | 17 +++++++++++++++-- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index de142798a9..a54df92bcb 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -29,7 +29,14 @@ * In Parser class executeCommand method, modified the add command to prompt the user for the amount of grocery. Passed the amount as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForAmount to prompt the user for the amount of grocery. * In Grocery class, modified the printGrocery method to print different units of measurement for different categories. -5. xx +5. Input the location of where each grocery is stored + * In Grocery class, modified the Grocery class to include location (String) as an attribute. + * In Grocery class, modified the Grocery constructor to accept the 'location' parameter. + * In Grocery class, under printGrocery, added locationString to format location. + * In Parser class executeCommand method, modified the add command to prompt the user for where the grocery is stored. Passed the location as a parameter when creating a new Grocery object. + * In Ui class, added promptForLocation method to take in user input for location of the grocery. + * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. + ## Product scope ### Target user profile diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c29995c7e4..c36c5292ed 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -38,7 +38,8 @@ public void executeCommand(String[] commandParts) throws GitException { case "add": String category = ui.promptForCategory(); int amount = ui.promptForAmount(); - Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, 0); + String location = ui.promptForLocation(); + Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, 0, location); String expiration = ui.promptForExpiration(); String cost = ui.promptForCost(); grocery.setExpiration(expiration); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2b89066ece..b6e1f81bb3 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -136,6 +136,15 @@ public String promptForCost() throws GitException { } } + /** + * Prompts the user to enter the location of the grocery. + * @return Location of grocery in String + */ + public String promptForLocation() { + System.out.println("Please enter the location (e.g. freezer first compartment)"); + return in.nextLine().trim(); + } + /** * Reads expiration date from user input. * @@ -218,7 +227,7 @@ public static void printCostSet(Grocery grocery) { */ public static void printGroceryAdded(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; - System.out.println(grocery.getName() + " added!"); + System.out.println(grocery.getName() + "added!"); } /** diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index ded64dae50..7d07a961f3 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -12,6 +12,7 @@ public class Grocery { private LocalDate expiration; private String category; private double cost; + private String location; /** @@ -21,14 +22,16 @@ public class Grocery { * @param amount Measurement of grocery. * @param expiration When grocery expires. * @param category Category of grocery. + * @param location Location of where the grocery is stored. */ - public Grocery(String name, int amount, LocalDate expiration, String category, double cost) { + public Grocery(String name, int amount, LocalDate expiration, String category, double cost, String location) { this.name = name; this.amount = amount; this.expiration = expiration; this.category = category; this.cost = cost; + this.location = location; } // Getters and setters @@ -48,6 +51,10 @@ public double getCost() { return this.cost; } + public String getLocation() { + return this.location; + } + public void setName(String name) { this.name = name; } @@ -78,6 +85,10 @@ public void setCost(String cost) { this.cost = Double.parseDouble(cost); } + public void setLocation(String location) { + this.location = location; + } + /** * Returns the name, amount, expiration date and cost of the grocery. * @@ -89,6 +100,8 @@ public String printGrocery() { // TODO: update amount output according to Grocery subclass // TODO: consider stating amount == 0 now that we track amount ? + String locationString = ", location: " + location; + String amountString = (amount == 0) ? "" : ", amount: " + amount; String exp = (expiration == null) ? " expiration date not set" @@ -112,7 +125,7 @@ public String printGrocery() { unit = "units"; break; } - return this.name + " (" + this.category + ") " + amountString + unit + exp + price; + return this.name + " (" + this.category + ") " + amountString + unit + exp + price + locationString; } } From 037f1ac40b59752be03e2ea332fcb65aef861a4a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 27 Mar 2024 16:07:48 +0800 Subject: [PATCH 085/339] Edit minor formatting issues --- src/main/java/git/Ui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index b6e1f81bb3..2c31b1499a 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -227,7 +227,7 @@ public static void printCostSet(Grocery grocery) { */ public static void printGroceryAdded(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; - System.out.println(grocery.getName() + "added!"); + System.out.println(grocery.getName() + " added!"); } /** From 1d4a49687d77dd27481389af592f1c1b955d6407 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 27 Mar 2024 16:13:50 +0800 Subject: [PATCH 086/339] Edited Test Case --- src/test/java/grocery/GroceryListTest.java | 14 +++++++------- src/test/java/grocery/GroceryTest.java | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 7dd6e66fef..05dc8f431c 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -19,7 +19,7 @@ public class GroceryListTest { public void editExpiration_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(),"Meat", 0)); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(),"Meat", 0, "Freezer")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { fail("editExpiration should not throw an exception"); @@ -43,7 +43,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0)); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0, "Freezer")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -57,7 +57,7 @@ public void editExpiration_wrongFormat_exceptionThrown() { public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, 0, null, "Meat", 0)); // Use null to trigger the exception + gl.addGrocery(new Grocery(null, 0, null, "Meat", 0, "Freezer")); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); } catch (EmptyGroceryException e) { assertEquals("A grocery needs to be specified!", e.getMessage()); @@ -68,7 +68,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", 0, null, "Meat", 0)); + gl.addGrocery(new Grocery("fooood", 0, null, "Meat", 0,"Freezer")); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -81,7 +81,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0)); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (WrongFormatException e) { @@ -97,7 +97,7 @@ public void editAmount_wrongFormat_exceptionThrown() { public void editAmountUseTrue_amountReaches0_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, LocalDate.now(), "Meat", 0)); + gl.addGrocery(new Grocery("Meat", 5, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -109,7 +109,7 @@ public void editAmountUseTrue_amountReaches0_success() { public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0)); + gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat a/5", true); fail("Expected a CannotUseException to be thrown"); } catch (CannotUseException e) { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index b3df1d6730..aa2b66307a 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -7,14 +7,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, null, "fruit", 0); + Grocery grocery = new Grocery("apple", 0, null, "fruit", 0,"Pantry"); String message = "apple (fruit) pieces expiration date not set cost not set"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_costWrongFormat_formattedCost() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1); + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1,"Pantry"); String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00"; assertEquals(message, grocery.printGrocery()); @@ -22,7 +22,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20); + Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20"; assertEquals(message, grocery.printGrocery()); From 55fe2803b75546ac4fadddc09e3e5ece8268a99d Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 27 Mar 2024 16:25:32 +0800 Subject: [PATCH 087/339] Edited Developer Guide to add alternatives considered. --- docs/DeveloperGuide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a54df92bcb..dc915d4733 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -36,6 +36,7 @@ * In Parser class executeCommand method, modified the add command to prompt the user for where the grocery is stored. Passed the location as a parameter when creating a new Grocery object. * In Ui class, added promptForLocation method to take in user input for location of the grocery. * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. + * Alternative considered: Can possibly add location as enumeration however different people might store groceries in different places thus better to set as String so that user is free to input location details however specific they want. ## Product scope ### Target user profile From ea69e87d0b574898891c4f6f5424e97ce1e544ca Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Wed, 27 Mar 2024 18:43:01 +0800 Subject: [PATCH 088/339] Update method to prompt user for valid cost --- src/main/java/git/Ui.java | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2b89066ece..91e7555a18 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -115,14 +115,29 @@ public int promptForAmount(){ } /** - * Prompts the user to enter the cost of the grocery and format the string. - * Returns the cost to be set for the grocery. + * Prompts the user to enter the cost of the grocery until a valid cost is given. * - * @return Cost of the grocery formatted in 2 decimal points. + * @return the cost to be set for the grocery. */ - public String promptForCost() throws GitException { + public String promptForCost() { System.out.println("Please enter the cost (e.g., $1.20):"); String price = in.nextLine().trim(); + try { + return convertCost(price); + } catch (GitException e) { + System.out.println("Cost entered is invalid!"); + return promptForCost(); + } + } + + /** + * Removes dollar sign from input cost and store in 2 decimal places. + * + * @param price Input cost entered by user. + * @return Cost in desired format. + * @throws GitException If there is no Dollar sign or cost entered is not numeric. + */ + private String convertCost(String price) throws GitException{ if(price.contains("$")) { String formattedPrice = price.replace("$", ""); try { From 463db674a39a2ae384cef6f5905bf67c0ef1bfd3 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 27 Mar 2024 18:58:38 +0800 Subject: [PATCH 089/339] Updated JUnit Testings --- src/test/java/grocery/GroceryTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index aa2b66307a..95d6a128d5 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,7 +8,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null, "fruit", 0,"Pantry"); - String message = "apple (fruit) pieces expiration date not set cost not set"; + String message = "apple (fruit) pieces expiration date not set cost not set, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -16,7 +16,7 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1,"Pantry"); String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.00"; + + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -24,7 +24,7 @@ public void printGrocery_costWrongFormat_formattedCost() { public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.20"; + + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } From 96580ffecc641db07c8518e17e3b7eac9bc985f2 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 22:46:24 +0800 Subject: [PATCH 090/339] Update docs for using grocery amt --- docs/diagrams/GroceryAmtGroceryList.puml | 0 docs/diagrams/useAmt.puml | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/diagrams/GroceryAmtGroceryList.puml create mode 100644 docs/diagrams/useAmt.puml diff --git a/docs/diagrams/GroceryAmtGroceryList.puml b/docs/diagrams/GroceryAmtGroceryList.puml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/diagrams/useAmt.puml b/docs/diagrams/useAmt.puml new file mode 100644 index 0000000000..e69de29bb2 From 0a6a58338e9ca5d3fc85bf33d507a1338382994f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 22:47:57 +0800 Subject: [PATCH 091/339] Include updated docs --- docs/DeveloperGuide.md | 63 ++++++++++++++++++------ docs/diagrams/GroceryAmtGroceryList.puml | 13 +++++ docs/diagrams/useAmt.puml | 36 ++++++++++++++ 3 files changed, 96 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index dc915d4733..a3acd84bf2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,11 +7,13 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} -1. View all groceries added +### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. * Then create a method in "GroceryList" class that prints all the groceries in the list. -2. List the groceries by price in descending order + + +### 2. List the groceries by price in descending order * First, create a field in "Grocery" class that stores the cost of a grocery. * When adding a grocery, prompt the user to enter the cost. * Format the cost into 2 decimal places, remove the dollar sign and store it as a string. @@ -19,17 +21,23 @@ * When setting the cost, convert the cost from String into Double. * Third, add method in "GroceryList" class to create a copy of the current grocery list, then sort the new grocery list by price using lambda function. Reverse and print the new list. -3. Input category for each grocery added + + +### 3. Input category for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'category' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the category of the grocery. Passed the category as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForCategory to prompt the user for the category of the grocery. * In Grocery class, modified the printGrocery method to include the category information in the output string. -4. Input amount for each grocery added + + +### 4. Input amount for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'amount' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the amount of grocery. Passed the amount as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForAmount to prompt the user for the amount of grocery. * In Grocery class, modified the printGrocery method to print different units of measurement for different categories. -5. Input the location of where each grocery is stored + + +### 5. Input the location of where each grocery is stored * In Grocery class, modified the Grocery class to include location (String) as an attribute. * In Grocery class, modified the Grocery constructor to accept the 'location' parameter. * In Grocery class, under printGrocery, added locationString to format location. @@ -38,26 +46,49 @@ * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. * Alternative considered: Can possibly add location as enumeration however different people might store groceries in different places thus better to set as String so that user is free to input location details however specific they want. +### 6. Edit grocery amount after using a grocery + * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. + +![useAmt sequence diagram](./diagrams/GroceryAmtGroceryList.puml) + * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: + 1. details: String — User input read from `Scanner`. + 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. + * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. +Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. + +![useAmt sequence diagram](./diagrams/useAmt.puml) + * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. + * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. + + ## Product scope ### Target user profile -{Describe the target user profile} +Our target user is someone who regularly goes grocery shopping, and would like to track and manage their inventory of groceries. ### Value proposition -{Describe the value proposition: what problem does it solve?} +Grocery in Time aims to act as an easy-to-use central database for all the user's groceries. Managing many groceries stored at different locations around the house can get confusing, +therefore our app will allow users to track their groceries easily. + +Users are able to edit and manage the category, amount, expiration date, and storage location of their groceries. +When groceries are running low, the app can generate a shopping list to remind users of what they need to buy. +Furthermore, the app can generate a list of items that are expiring soon, reminding users to consume their groceries as soon as possible. ## User Stories -|Version| As a ... | I want to ... | So that I can ...| -|--------|---------|----------------------------------------|------------------| -|v1.0|new user|see instructions on how to use the app|refer to them when I forget how to use the application| -|v1.0|user| add groceries to the app |manage all my groceries| -|v1.0|user| view all my groceries |know what I have bought| -|v1.0|user| delete the groceries from the list |know which items are depleted| -|v1.0|user| add the amount of a grocery|keep track of the amount of that item I have| -|v1.0|user| add the expiration date of the grocery |keep track of when my items expire easily| -|v2.0|financially-aware user|add the cost of the groceries|know how much I am spending| +| Version | As a ... | I want to ... | So that I can ... | +|---------|-------------------------------|---------------------------------------------|--------------------------------------------------------| +| v1.0 | new user | see instructions on how to use the app | refer to them when I forget how to use the application | +| v1.0 | user | add groceries to the app | manage all my groceries | +| v1.0 | user | view all my groceries | know what I have bought | +| v1.0 | user | delete groceries from the list | stop tracking those groceries | +| v1.0 | user | add the amount of a grocery | keep track of the amount of that item I have | +| v1.0 | user | add the expiration date of the grocery | keep track of when my items expire easily | +| v2.0 | financially-aware user | add the cost of the groceries | know how much I am spending | +| v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | +| v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | +| v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | ## Non-Functional Requirements diff --git a/docs/diagrams/GroceryAmtGroceryList.puml b/docs/diagrams/GroceryAmtGroceryList.puml index e69de29bb2..0b6bc75a30 100644 --- a/docs/diagrams/GroceryAmtGroceryList.puml +++ b/docs/diagrams/GroceryAmtGroceryList.puml @@ -0,0 +1,13 @@ +@startuml +skinparam classAttributeIconSize 0 + +class GroceryList +GroceryList : +editAmount(details : String, use : boolean) + +class Grocery +Grocery : -amount : int + +GroceryList "1" ---> "*" Grocery : stores > + + +@enduml \ No newline at end of file diff --git a/docs/diagrams/useAmt.puml b/docs/diagrams/useAmt.puml index e69de29bb2..7dc394bd1c 100644 --- a/docs/diagrams/useAmt.puml +++ b/docs/diagrams/useAmt.puml @@ -0,0 +1,36 @@ +@startuml + +actor User as user +participant "groceryList:GroceryList" as gl +participant ":Grocery" as g +participant "ui:Ui" as ui + +user -> gl : editAmount() +activate gl + +gl -> gl : checkDetails() +note right +Ensures user input is valid +end note +activate gl +return amtParts + +gl -> gl : getGrocery() +activate gl +return Grocery + +gl -> g : setAmount() +activate g +deactivate g + +alt finalAmount == 0 + gl -> ui : printAmtDepleted() + activate ui +else else + gl -> ui : printAmtSet() + activate ui +end + +ui --> user : message + +@enduml \ No newline at end of file From 3861261939b543c93defc46e38d5fdf202cd29f1 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 22:54:20 +0800 Subject: [PATCH 092/339] Fix inline PlantUML diagrams --- docs/DeveloperGuide.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index a3acd84bf2..0a53b7932f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -49,14 +49,16 @@ ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. -![useAmt sequence diagram](./diagrams/GroceryAmtGroceryList.puml) + + * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. -![useAmt sequence diagram](./diagrams/useAmt.puml) + + * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. From 2567032f201b96926d142f13cc2d5e63a2405810 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 23:04:11 +0800 Subject: [PATCH 093/339] Fix PlantUML issue --- docs/DeveloperGuide.md | 10 ++++------ docs/diagrams/GroceryAmtGroceryList.png | Bin 0 -> 8474 bytes docs/diagrams/useAmt.png | Bin 0 -> 24778 bytes 3 files changed, 4 insertions(+), 6 deletions(-) create mode 100644 docs/diagrams/GroceryAmtGroceryList.png create mode 100644 docs/diagrams/useAmt.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0a53b7932f..f9874fe309 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -48,19 +48,17 @@ ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. - - +![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. +![useAmt sequence diagram](./diagrams/useAmt.png) - - - * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. - * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. + * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. + * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. ## Product scope diff --git a/docs/diagrams/GroceryAmtGroceryList.png b/docs/diagrams/GroceryAmtGroceryList.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa5c43f00cf2762c37d7511f11b4b8b331d2f03 GIT binary patch literal 8474 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/useAmt.png b/docs/diagrams/useAmt.png new file mode 100644 index 0000000000000000000000000000000000000000..ae54ae226dcbd6e4520af9595082aa256a829486 GIT binary patch literal 24778 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 V2ZhNM@TUT(^=_M83!Qfy`y1kB<4FJj literal 0 HcmV?d00001 From 4f8376f95ddb1825ca5a21750882be92cbb5aa42 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 27 Mar 2024 23:07:45 +0800 Subject: [PATCH 094/339] Fix PlantUML formatting --- docs/DeveloperGuide.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f9874fe309..b62f824818 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -48,6 +48,7 @@ ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. + ![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: @@ -55,10 +56,11 @@ 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. + ![useAmt sequence diagram](./diagrams/useAmt.png) - * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. - * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. + * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. + * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. ## Product scope From 0b278063328c9f37563b334392634d2f06052986 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 28 Mar 2024 12:21:32 +0800 Subject: [PATCH 095/339] Enhance error handling in checkDetails and update developer guide --- docs/DeveloperGuide.md | 10 ++++++++++ src/main/java/grocery/GroceryList.java | 23 +++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b62f824818..958786af86 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -49,6 +49,16 @@ ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. +### 7. Input expiration date of each grocery when added + * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. + * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. + * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. + * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items. + +### 8. Editing expiration date after it is added + * In GroceryList class, modified the editExpiration method to parse String into localdate. + + ![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ef22f51a3f..0f8132f457 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -61,6 +61,21 @@ public void addGrocery(Grocery grocery) throws EmptyGroceryException { logger.log(Level.INFO, "Added " + grocery.printGrocery()); } + /** + * Checks if a grocery exists. + * + * @param name Name of the grocery. + * @return True if the grocery exists, false otherwise. + */ + private boolean isGroceryExists(String name) { + for (Grocery grocery : groceries) { + if (grocery.getName().equals(name)) { + return true; + } + } + return false; + } + /** * Returns the desired grocery. * @@ -101,7 +116,12 @@ private String[] checkDetails(String details, String command, String parameter) // Split the input into the grocery name and the detail part. String[] detailParts = details.split(parameter, 2); - Grocery grocery = getGrocery(detailParts[0].strip()); // Needed to throw NoSuchGrocery exception first + + // Check if the grocery exists + if (!isGroceryExists(detailParts[0].strip())) { + throw new NoSuchGroceryException(); + } + if (detailParts.length < 2) { throw new CommandWrongFormatException(command); } @@ -121,7 +141,6 @@ private String[] checkDetails(String details, String command, String parameter) * @throws GitException Exception thrown depending on error. */ public void editExpiration(String details) throws GitException { - // Assuming the format is "exp GROCERY d/EXPIRATION_DATE" String[] expParts = checkDetails(details, "exp", "d/"); Grocery grocery = getGrocery(expParts[0].strip()); From e0b03733574fb95464870a4f0721e07a17c3fe30 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 28 Mar 2024 13:22:18 +0800 Subject: [PATCH 096/339] Refactor expiration date handling and input validation --- docs/DeveloperGuide.md | 19 +++---- .../PastExpirationDateException.java | 13 +++++ src/main/java/git/Ui.java | 56 +++++++++++++------ src/main/java/grocery/Grocery.java | 11 +++- src/main/java/grocery/GroceryList.java | 8 ++- 5 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 src/main/java/exceptions/PastExpirationDateException.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 958786af86..e02bc338c1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -49,16 +49,6 @@ ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. -### 7. Input expiration date of each grocery when added - * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. - * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. - * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. - * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items. - -### 8. Editing expiration date after it is added - * In GroceryList class, modified the editExpiration method to parse String into localdate. - - ![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: @@ -72,6 +62,15 @@ Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. +### 7. Input expiration date of each grocery when added + * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. + * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. + * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. + * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items. + +### 8. Editing expiration date after it is added + * In GroceryList class, modified the editExpiration method to parse String into localdate. + ## Product scope ### Target user profile diff --git a/src/main/java/exceptions/PastExpirationDateException.java b/src/main/java/exceptions/PastExpirationDateException.java new file mode 100644 index 0000000000..256b996bee --- /dev/null +++ b/src/main/java/exceptions/PastExpirationDateException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the grocery has already expired. + */ +public class PastExpirationDateException extends GitException{ + /** + * Constructs PastExpirationDateException. + */ + public PastExpirationDateException() { + message = "The grocery has already expired!"; + } +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 4cf10019ea..2661a54bbf 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -1,5 +1,7 @@ package git; +import java.time.DateTimeException; +import java.time.LocalDate; import java.util.List; import java.util.Scanner; @@ -78,24 +80,44 @@ public String[] processInput() { } } - /** - * Prompts user for expiration date. - * - * @return Formatted expiration date. - */ - public String promptForExpiration() { - System.out.println("Please enter the year of expiry (e.g. 2024):"); - String year = in.nextLine().trim(); - - System.out.println("Please enter the month of expiry (e.g. July or 07):"); - String month = in.nextLine().trim(); - month = convertMonthToNumber(month); - System.out.println("Please enter the date of expiry (e.g. 19):"); - String day = in.nextLine().trim(); - - String formattedDate = formatExpirationDate(year, month, day); - return formattedDate; +/** + * Prompts user for expiration date. + * + * Validates the input date for correct format and future dates. + * + * @return Formatted expiration date in the format YYYY-MM-DD. + */ +public String promptForExpiration() { + LocalDate expirationDate = null; + while (expirationDate == null) { + try { + System.out.println("Please enter the year of expiry (e.g. 2024):"); + int year = Integer.parseInt(in.nextLine().trim()); + + System.out.println("Please enter the month of expiry (e.g. July or 07):"); + String monthInput = in.nextLine().trim(); + String monthString = convertMonthToNumber(monthInput); + int month = Integer.parseInt(monthString); + + System.out.println("Please enter the date of expiry (e.g. 19):"); + int day = Integer.parseInt(in.nextLine().trim()); + + // Attempt to create a date from the input. + expirationDate = LocalDate.of(year, month, day); + + // Check if the date is in the past. + if (expirationDate.isBefore(LocalDate.now())) { + System.out.println("The expiration date cannot be in the past. Please try again."); + expirationDate = null; // Reset to null to re-prompt the user. + } + } catch (DateTimeException | NumberFormatException e) { + System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); + // No need to reset expirationDate to null here as it's already null or will be reset if the date was in the past. + } } + return expirationDate.toString(); // Formats to YYYY-MM-DD by default. +} + /** * Prompts user for category */ diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 7d07a961f3..c9a4819725 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -2,6 +2,8 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import exceptions.PastExpirationDateException; + /** * Represents a grocery. @@ -68,10 +70,17 @@ public void setAmount(int amount) { * Formats the expiration date from type string to local date. * * @param expiration The expiration date of the grocery. + * @throws PastExpirationDateException */ - public void setExpiration(String expiration) { + public void setExpiration(String expiration) throws PastExpirationDateException { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate expirationDate = LocalDate.parse(expiration, formatter); + + if (expirationDate.isBefore(LocalDate.now())) { + throw new PastExpirationDateException(); + } + this.expiration = LocalDate.parse(expiration, formatter); } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 0f8132f457..f74d066ec0 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -3,6 +3,7 @@ import git.Ui; import exceptions.GitException; import exceptions.LocalDateWrongFormatException; +import exceptions.PastExpirationDateException; import exceptions.InvalidAmountException; import exceptions.InvalidCostException; import exceptions.CannotUseException; @@ -154,7 +155,12 @@ public void editExpiration(String details) throws GitException { // Convert LocalDate back to String to match the setExpiration signature String dateString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - grocery.setExpiration(dateString); + try { + grocery.setExpiration(dateString); + } catch (PastExpirationDateException e) { + System.out.println(e.getMessage()); + } + // Verification and UI feedback assert grocery.getExpiration().isEqual(date) : "Expiration date should be set correctly"; From d793c265e7ea3135cea15c7a7d789ef2a056a315 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 28 Mar 2024 13:24:51 +0800 Subject: [PATCH 097/339] Refactor promptForExpiration method to validate input and handle past dates --- src/main/java/git/Ui.java | 68 +++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2661a54bbf..11ba4a0989 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -80,43 +80,43 @@ public String[] processInput() { } } -/** - * Prompts user for expiration date. - * - * Validates the input date for correct format and future dates. - * - * @return Formatted expiration date in the format YYYY-MM-DD. - */ -public String promptForExpiration() { - LocalDate expirationDate = null; - while (expirationDate == null) { - try { - System.out.println("Please enter the year of expiry (e.g. 2024):"); - int year = Integer.parseInt(in.nextLine().trim()); - - System.out.println("Please enter the month of expiry (e.g. July or 07):"); - String monthInput = in.nextLine().trim(); - String monthString = convertMonthToNumber(monthInput); - int month = Integer.parseInt(monthString); - - System.out.println("Please enter the date of expiry (e.g. 19):"); - int day = Integer.parseInt(in.nextLine().trim()); - - // Attempt to create a date from the input. - expirationDate = LocalDate.of(year, month, day); - - // Check if the date is in the past. - if (expirationDate.isBefore(LocalDate.now())) { - System.out.println("The expiration date cannot be in the past. Please try again."); - expirationDate = null; // Reset to null to re-prompt the user. + /** + * Prompts user for expiration date. + * + * Validates the input date for correct format and future dates. + * + * @return Formatted expiration date in the format YYYY-MM-DD. + */ + public String promptForExpiration() { + LocalDate expirationDate = null; + while (expirationDate == null) { + try { + System.out.println("Please enter the year of expiry (e.g. 2024):"); + int year = Integer.parseInt(in.nextLine().trim()); + + System.out.println("Please enter the month of expiry (e.g. July or 07):"); + String monthInput = in.nextLine().trim(); + String monthString = convertMonthToNumber(monthInput); + int month = Integer.parseInt(monthString); + + System.out.println("Please enter the date of expiry (e.g. 19):"); + int day = Integer.parseInt(in.nextLine().trim()); + + // Attempt to create a date from the input. + expirationDate = LocalDate.of(year, month, day); + + // Check if the date is in the past. + if (expirationDate.isBefore(LocalDate.now())) { + System.out.println("The expiration date cannot be in the past. Please try again."); + expirationDate = null; // Reset to null to re-prompt the user. + } + } catch (DateTimeException | NumberFormatException e) { + System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); + // No need to reset expirationDate to null here as it's already null or will be reset if the date was in the past. } - } catch (DateTimeException | NumberFormatException e) { - System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); - // No need to reset expirationDate to null here as it's already null or will be reset if the date was in the past. } + return expirationDate.toString(); // Formats to YYYY-MM-DD by default. } - return expirationDate.toString(); // Formats to YYYY-MM-DD by default. -} /** * Prompts user for category From ea81ae81d3cdbe8c67c469d3eff2a639526adaeb Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 28 Mar 2024 13:26:47 +0800 Subject: [PATCH 098/339] Remove unnecessary comment in Ui.java --- src/main/java/git/Ui.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 11ba4a0989..71cc8834bf 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -112,7 +112,6 @@ public String promptForExpiration() { } } catch (DateTimeException | NumberFormatException e) { System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); - // No need to reset expirationDate to null here as it's already null or will be reset if the date was in the past. } } return expirationDate.toString(); // Formats to YYYY-MM-DD by default. From 881eca905422376e18b7a46aa4dea3e8125a9aa4 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 30 Mar 2024 01:39:53 +0800 Subject: [PATCH 099/339] Refactor code after code review --- src/main/java/git/Git.java | 2 +- src/main/java/git/Parser.java | 15 ++++++++++++++- src/main/java/git/Ui.java | 12 +++--------- src/main/java/grocery/Grocery.java | 4 ---- src/main/java/grocery/GroceryList.java | 18 ++++++++++++------ 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 8478a9f12b..c41f088d85 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -29,7 +29,7 @@ private void run() { ui.printWelcome(); while (isRunning) { try { - String[] commandParts = ui.processInput(); + String[] commandParts = parser.processCommandParts();; parser.executeCommand(commandParts); isRunning = parser.getIsRunning(); } catch (GitException e) { diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c36c5292ed..a6a600f10c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -25,10 +25,23 @@ public Parser() { isRunning = true; } + /** + * Processes a command and its details into a valid format for executing relevant code. + * + * @return Array of the fragments of the commands. + */ + public String[] processCommandParts() { + String[] commandParts = ui.processInput(); + if (commandParts.length == 1) { + return new String[]{commandParts[0], ""}; + } else { + return commandParts; + } + } + /** * Handles commands. * - * @param commandParts Command and its details. * @throws GitException Exception thrown depending on specific error. */ public void executeCommand(String[] commandParts) throws GitException { diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 71cc8834bf..43e4bfcda8 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -62,9 +62,9 @@ public void printHello(String userName) { } /** - * Processes user input into commands and their details. + * Processes user input into a command and its details for Parser. * - * @return Array of the fragments of the commands. + * @return Array of the fragments of the command. */ public String[] processInput() { String commandLine = in.nextLine(); @@ -72,12 +72,7 @@ public String[] processInput() { String[] commandParts = commandLine.strip().split(" ", 2); assert commandParts.length > 0 : "Failed to read user input"; - // Return an array of length 2 for executeCommand - if (commandParts.length == 1) { - return new String[]{commandParts[0], ""}; - } else { - return commandParts; - } + return commandParts; } /** @@ -272,7 +267,6 @@ public static void printGroceryAdded(Grocery grocery) { * @param grocery The grocery that should be updated. */ public static void printAmtSet(Grocery grocery) { - // TODO: update amount output according to Grocery subclass assert grocery.getAmount() >= 0 : "grocery amount should not be empty"; System.out.println(grocery.getName() + ": " + grocery.getAmount()); } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index c9a4819725..d3db340425 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -106,11 +106,7 @@ public void setLocation(String location) { public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; - // TODO: update amount output according to Grocery subclass - // TODO: consider stating amount == 0 now that we track amount ? - String locationString = ", location: " + location; - String amountString = (amount == 0) ? "" : ", amount: " + amount; String exp = (expiration == null) ? " expiration date not set" diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index f74d066ec0..f88a583955 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -136,7 +136,7 @@ private String[] checkDetails(String details, String command, String parameter) } /** - * Adds the expiration date of an existing grocery. + * Sets the expiration date of an existing grocery. * * @param details A string containing grocery name and details. * @throws GitException Exception thrown depending on error. @@ -176,11 +176,16 @@ public void editExpiration(String details) throws GitException { */ public void editAmount(String details, boolean use) throws GitException { // Assuming the format is "amt GROCERY a/AMOUNT" - String[] amtParts = checkDetails(details, use ? "use": "amt", "a/"); + String [] amtParts; + if (use) { + amtParts = checkDetails(details, "use", "a/"); + } else { + amtParts = checkDetails(details, "amt", "a/"); + } Grocery grocery = getGrocery(amtParts[0].strip()); String amountString = amtParts[1].strip(); - int amount = 0; + int amount; try { amount = Integer.parseInt(amountString); } catch (NumberFormatException e) { @@ -190,11 +195,12 @@ public void editAmount(String details, boolean use) throws GitException { // "use" is not valid if an amount was not previously set if (use && grocery.getAmount() == 0) { throw new CannotUseException(); + } else if (use) { + amount = Math.max(0, grocery.getAmount() - amount); } - int finalAmount = use ? Math.max(0, grocery.getAmount() - amount) : amount; - grocery.setAmount(finalAmount); - if (finalAmount == 0) { + grocery.setAmount(amount); + if (amount == 0) { Ui.printAmtDepleted(grocery); } else { Ui.printAmtSet(grocery); From d23e4bac5f4192fa322a8a7d4d7ff659c308ec1a Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 30 Mar 2024 02:01:49 +0800 Subject: [PATCH 100/339] Implement singleton for Ui --- src/main/java/git/Git.java | 4 ++-- src/main/java/git/Parser.java | 4 ++-- src/test/java/git/GitTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index c41f088d85..dce9dd3fa0 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -18,7 +18,7 @@ public class Git { */ public Git() { ui = new Ui(); - parser = new Parser(); + parser = new Parser(ui); isRunning = true; } @@ -29,7 +29,7 @@ private void run() { ui.printWelcome(); while (isRunning) { try { - String[] commandParts = parser.processCommandParts();; + String[] commandParts = parser.processCommandParts(); parser.executeCommand(commandParts); isRunning = parser.getIsRunning(); } catch (GitException e) { diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index a6a600f10c..1abeaccc3e 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -19,9 +19,9 @@ public class Parser { /** * Constructs Parser. */ - public Parser() { + public Parser(Ui ui) { groceryList = new GroceryList(); - ui = new Ui(); + this.ui = ui; isRunning = true; } diff --git a/src/test/java/git/GitTest.java b/src/test/java/git/GitTest.java index 840752f95b..25a9e18427 100644 --- a/src/test/java/git/GitTest.java +++ b/src/test/java/git/GitTest.java @@ -10,7 +10,7 @@ public class GitTest { @Test public void executeCommand_invalidCommand_success() { try { - Parser parser = new Parser(); + Parser parser = new Parser(new Ui()); String[] commandParts = {"nonsense", ""}; parser.executeCommand(commandParts); } catch (GitException e) { From 058c0f6404c0e6355c13966539738f6971cd4b05 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 30 Mar 2024 02:02:48 +0800 Subject: [PATCH 101/339] Update singleton implementation for Ui --- src/main/java/git/Git.java | 2 +- src/main/java/git/Ui.java | 19 ++++++++++++++++--- src/test/java/git/GitTest.java | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index dce9dd3fa0..dd81351331 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -17,7 +17,7 @@ public class Git { * Constructs Git. */ public Git() { - ui = new Ui(); + ui = Ui.getInstance(); parser = new Parser(ui); isRunning = true; } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 43e4bfcda8..d14c82523e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -15,18 +15,28 @@ */ public class Ui { // ATTRIBUTES + private static Ui singleUi = null; public static final String DIVIDER = "- - - - -"; private Scanner in; // METHODS - /** * Constructs Ui and initialises Scanner to read input. */ - public Ui() { + private Ui() { in = new Scanner(System.in); } + /** + * Returns the single instance of Ui. + */ + public static Ui getInstance() { + if (singleUi == null) { + singleUi = new Ui(); + } + return singleUi; + } + /** * Prints welcome message. */ @@ -113,13 +123,16 @@ public String promptForExpiration() { } /** - * Prompts user for category + * Prompts user for category. */ public String promptForCategory(){ System.out.println("Please enter the category (e.g. fruit):"); return in.nextLine().trim(); } + /** + * Prompts user for amount. + */ public int promptForAmount(){ System.out.println("Please enter the amount (e.g. 3):"); try { diff --git a/src/test/java/git/GitTest.java b/src/test/java/git/GitTest.java index 25a9e18427..c0c312b000 100644 --- a/src/test/java/git/GitTest.java +++ b/src/test/java/git/GitTest.java @@ -10,7 +10,8 @@ public class GitTest { @Test public void executeCommand_invalidCommand_success() { try { - Parser parser = new Parser(new Ui()); + Ui ui = Ui.getInstance(); + Parser parser = new Parser(ui); String[] commandParts = {"nonsense", ""}; parser.executeCommand(commandParts); } catch (GitException e) { From a51c0aec23d0aa668747f1540641f0f7bab53dc1 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 30 Mar 2024 02:06:30 +0800 Subject: [PATCH 102/339] Fix checkstyle issue --- src/main/java/git/Ui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index d14c82523e..a45c1cce12 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -15,8 +15,8 @@ */ public class Ui { // ATTRIBUTES - private static Ui singleUi = null; public static final String DIVIDER = "- - - - -"; + private static Ui singleUi = null; private Scanner in; // METHODS From 4aa65cdf4bb798607187ea04f7c7bd79782dd916 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 10:47:00 +0800 Subject: [PATCH 103/339] Use loop instead to prevent unbounded recursion in promptForCost --- src/main/java/git/Ui.java | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index a45c1cce12..b76911ee5e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -148,30 +148,37 @@ public int promptForAmount(){ * * @return the cost to be set for the grocery. */ - public String promptForCost() { - System.out.println("Please enter the cost (e.g., $1.20):"); - String price = in.nextLine().trim(); - try { - return convertCost(price); - } catch (GitException e) { - System.out.println("Cost entered is invalid!"); - return promptForCost(); + public double promptForCost() { + System.out.println("Please enter the cost (e.g., $1.20) or nil:"); + double cost = 0; + for (int i = 0; i < 5; i++) { + String price = in.nextLine().trim(); + if (price.equals("nil")) { + break; + } + try { + cost = convertCost(price); + break; + } catch (GitException e) { + System.out.println("Cost entered is invalid!"); + System.out.println("Please enter the cost (e.g., $1.20):"); + } } + return cost; } /** - * Removes dollar sign from input cost and store in 2 decimal places. + * Removes dollar sign from input cost and convert to double. * * @param price Input cost entered by user. * @return Cost in desired format. * @throws GitException If there is no Dollar sign or cost entered is not numeric. */ - private String convertCost(String price) throws GitException{ + private double convertCost(String price) throws GitException{ if(price.contains("$")) { String formattedPrice = price.replace("$", ""); try { - double cost = Double.parseDouble(formattedPrice); - return String.format("%.2f", cost);//format the money value to 2dp + return Double.parseDouble(formattedPrice); } catch (NumberFormatException nfe) { throw new InvalidCostException(); } From 47e36c7dd646c58989c0fe0cadedff1745d6b3ed Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 10:47:32 +0800 Subject: [PATCH 104/339] Remove unnecessary comments --- src/main/java/grocery/Grocery.java | 8 +++----- src/main/java/grocery/GroceryList.java | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index d3db340425..5427326485 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -108,18 +108,16 @@ public String printGrocery() { String locationString = ", location: " + location; String amountString = (amount == 0) ? "" : ", amount: " + amount; - String exp = (expiration == null) - ? " expiration date not set" + String exp = (expiration == null) + ? " expiration date not set" : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): " cost not set"; + String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): ", cost not set"; String unit = ""; switch (category.toLowerCase()){ case "fruit": unit = "pieces"; break; case "vegetable": - unit = "grams"; - break; case "meat": unit = "grams"; break; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index f88a583955..96efaa492b 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -214,7 +214,6 @@ public void editAmount(String details, boolean use) throws GitException { * @throws GitException If the input new cost is not numeric. */ public void editCost(String details) throws GitException { - // Assuming the format is "cost GROCERY $PRICE" System.out.println(details); String[] costParts = checkDetails(details, "cost", "\\$"); Grocery grocery = getGrocery(costParts[0].strip()); From 56ef9653bc786035da1cf7105e13d14507af09ba Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 10:47:46 +0800 Subject: [PATCH 105/339] Use enums instead of magic literals --- src/main/java/git/Parser.java | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 1abeaccc3e..7008c1fd34 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -25,6 +25,11 @@ public Parser(Ui ui) { isRunning = true; } + enum Command { + ADD, EXP, AMT, USE, COST, DEL, LIST, LISTC, HELP, EXIT + + } + /** * Processes a command and its details into a valid format for executing relevant code. * @@ -46,50 +51,49 @@ public String[] processCommandParts() { */ public void executeCommand(String[] commandParts) throws GitException { assert commandParts.length == 2 : "Command passed in wrong format"; - - switch (commandParts[0]) { - case "add": + Command command = Command.valueOf(commandParts[0].toUpperCase()); + switch (command) { + case ADD: String category = ui.promptForCategory(); int amount = ui.promptForAmount(); String location = ui.promptForLocation(); - Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, 0, location); + double cost = ui.promptForCost(); + Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, cost, location); String expiration = ui.promptForExpiration(); - String cost = ui.promptForCost(); grocery.setExpiration(expiration); - grocery.setCost(cost); groceryList.addGrocery(grocery); break; - case "exp": + case EXP: groceryList.editExpiration(commandParts[1]); break; - case "amt": - case "use": + case AMT: + case USE: groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); break; - case "cost": + case COST: groceryList.editCost(commandParts[1]); break; - case "del": + case DEL: groceryList.removeGrocery(commandParts[1]); break; - case "list": + case LIST: groceryList.listGroceries(); break; - case "listC": + case LISTC: groceryList.sortByCost(); break; - case "help": + case HELP: ui.displayHelp(); break; - case "exit": + case EXIT: System.out.println("bye bye!"); isRunning = false; break; From ba13be74a9dd9c913cc1e6656e4b263fee3720b3 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 11:32:14 +0800 Subject: [PATCH 106/339] Refactor executeCommand method to shorten it --- src/main/java/git/Parser.java | 66 +++++++++++++++++++++++--- src/main/java/grocery/Grocery.java | 33 ++++++++++--- src/main/java/grocery/GroceryList.java | 1 - src/test/java/grocery/GroceryTest.java | 6 +-- 4 files changed, 90 insertions(+), 16 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7008c1fd34..79abb7a36f 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -25,8 +25,11 @@ public Parser(Ui ui) { isRunning = true; } + /** + * Enums containing the possible commands. + */ enum Command { - ADD, EXP, AMT, USE, COST, DEL, LIST, LISTC, HELP, EXIT + ADD, DEL, EXP, AMT, USE, COST, LIST, LISTC, HELP, EXIT } @@ -45,13 +48,37 @@ public String[] processCommandParts() { } /** - * Handles commands. + * Handles different types of commands. * + * @param commandParts Fragments of the command entered by user. * @throws GitException Exception thrown depending on specific error. */ public void executeCommand(String[] commandParts) throws GitException { assert commandParts.length == 2 : "Command passed in wrong format"; - Command command = Command.valueOf(commandParts[0].toUpperCase()); + Command command; + try { + command = Command.valueOf(commandParts[0].toUpperCase()); + } catch (Exception e) { + throw new InvalidCommandException(); + } + int index = command.ordinal(); + if (index <= Command.DEL.ordinal()) { + addOrDelGrocery(command, commandParts); + } else if (index <= Command.COST.ordinal()) { + editGrocery(command,commandParts); + } else { + viewListOrHelp(command); + } + } + + /** + * Handles commands related to adding or deleting a grocery. + * + * @param command Command keyword of data type Enum. + * @param commandParts Fragments of the command entered by user. + * @throws GitException Exception thrown depending on specific error. + */ + private void addOrDelGrocery(Command command, String[] commandParts) throws GitException { switch (command) { case ADD: String category = ui.promptForCategory(); @@ -64,6 +91,24 @@ public void executeCommand(String[] commandParts) throws GitException { groceryList.addGrocery(grocery); break; + case DEL: + groceryList.removeGrocery(commandParts[1]); + break; + + default: + throw new InvalidCommandException(); + } + } + + /** + * Handles commands related to editing a grocery. + * + * @param command Command keyword of data type Enum. + * @param commandParts Fragments of the command entered by user. + * @throws GitException Exception thrown depending on specific error. + */ + private void editGrocery(Command command, String[] commandParts) throws GitException { + switch (command) { case EXP: groceryList.editExpiration(commandParts[1]); break; @@ -77,10 +122,19 @@ public void executeCommand(String[] commandParts) throws GitException { groceryList.editCost(commandParts[1]); break; - case DEL: - groceryList.removeGrocery(commandParts[1]); - break; + default: + throw new InvalidCommandException(); + } + } + /** + * Handles commands related to viewing the grocery list. + * + * @param command Command keyword of data type Enum. + * @throws GitException Exception thrown depending on specific error. + */ + private void viewListOrHelp(Command command) throws GitException { + switch (command) { case LIST: groceryList.listGroceries(); break; diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5427326485..1c0aa67644 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -107,11 +107,28 @@ public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; String locationString = ", location: " + location; - String amountString = (amount == 0) ? "" : ", amount: " + amount; - String exp = (expiration == null) - ? " expiration date not set" - : ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String price = (cost != 0) ? ", cost: $" + String.format("%.2f", cost): ", cost not set"; + + String amountString; + if (amount != 0) { + amountString = ", amount: " + amount + " "; + } else { + amountString = ", amount not set"; + } + + String exp; + if (expiration != null) { + exp = ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } else { + exp = ", expiration date not set"; + } + + String price; + if (cost != 0) { + price = ", cost: $" + String.format("%.2f", cost); + } else { + price = ", cost not set"; + } + String unit = ""; switch (category.toLowerCase()){ case "fruit": @@ -128,7 +145,11 @@ public String printGrocery() { unit = "units"; break; } - return this.name + " (" + this.category + ") " + amountString + unit + exp + price + locationString; + if (amount == 0) { + unit = ""; + } + + return this.name + " (" + this.category + ")" + amountString + unit + exp + price + locationString; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 96efaa492b..ad0d7e5516 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -214,7 +214,6 @@ public void editAmount(String details, boolean use) throws GitException { * @throws GitException If the input new cost is not numeric. */ public void editCost(String details) throws GitException { - System.out.println(details); String[] costParts = checkDetails(details, "cost", "\\$"); Grocery grocery = getGrocery(costParts[0].strip()); String price = costParts[1].strip(); diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 95d6a128d5..8135a43fb8 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -8,14 +8,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, null, "fruit", 0,"Pantry"); - String message = "apple (fruit) pieces expiration date not set cost not set, location: Pantry"; + String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1,"Pantry"); - String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -23,7 +23,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); - String message = "chicken (meat) " + ", amount: 1grams" + ", expiration: " + String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } From 2a3ee69f49c9b9275f936a1b89cb292e3c63df43 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 12:10:48 +0800 Subject: [PATCH 107/339] Add methods to set threshold values --- .../java/exceptions/InvalidCostException.java | 4 ++- src/main/java/git/Parser.java | 11 +++++-- src/main/java/git/Ui.java | 30 +++++++++++++++++-- src/main/java/grocery/GroceryList.java | 14 +++++++++ src/test/java/grocery/GroceryListTest.java | 14 ++++----- src/test/java/grocery/GroceryTest.java | 6 ++-- 6 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/main/java/exceptions/InvalidCostException.java b/src/main/java/exceptions/InvalidCostException.java index 5029838348..aea6762fc4 100644 --- a/src/main/java/exceptions/InvalidCostException.java +++ b/src/main/java/exceptions/InvalidCostException.java @@ -8,6 +8,8 @@ public class InvalidCostException extends GitException{ * Constructs InvalidCostException. */ public InvalidCostException() { - message = "Please input a valid cost!"; + + message = "Cost entered is invalid!\n" + + "Please enter the cost (e.g., $1.20):"; } } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 79abb7a36f..eb8c6603db 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -26,10 +26,10 @@ public Parser(Ui ui) { } /** - * Enums containing the possible commands. + * Enums containing the possible commands for groceries. */ enum Command { - ADD, DEL, EXP, AMT, USE, COST, LIST, LISTC, HELP, EXIT + ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, HELP, EXIT } @@ -83,9 +83,10 @@ private void addOrDelGrocery(Command command, String[] commandParts) throws GitE case ADD: String category = ui.promptForCategory(); int amount = ui.promptForAmount(); + int threshold = ui.promptForThreshold(); String location = ui.promptForLocation(); double cost = ui.promptForCost(); - Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, cost, location); + Grocery grocery = new Grocery(commandParts[1], amount, threshold, LocalDate.now(), category, cost, location); String expiration = ui.promptForExpiration(); grocery.setExpiration(expiration); groceryList.addGrocery(grocery); @@ -118,6 +119,10 @@ private void editGrocery(Command command, String[] commandParts) throws GitExcep groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); break; + case TH: + groceryList.editThreshold(commandParts[1]); + break; + case COST: groceryList.editCost(commandParts[1]); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index b76911ee5e..fd1a9bc466 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -160,8 +160,7 @@ public double promptForCost() { cost = convertCost(price); break; } catch (GitException e) { - System.out.println("Cost entered is invalid!"); - System.out.println("Please enter the cost (e.g., $1.20):"); + System.out.println(e.getMessage()); } } return cost; @@ -187,6 +186,28 @@ private double convertCost(String price) throws GitException{ } } + /** + * Prompts user for threshold amount. + */ + public int promptForThreshold(){ + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + int threshold = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equals("nil")) { + break; + } + try { + threshold = Integer.parseInt(input); + break; + } catch (NumberFormatException nfe) { + System.out.println("Amount entered is invalid!"); + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + } + } + return threshold; + } + /** * Prompts the user to enter the location of the grocery. * @return Location of grocery in String @@ -291,6 +312,11 @@ public static void printAmtSet(Grocery grocery) { System.out.println(grocery.getName() + ": " + grocery.getAmount()); } + public static void printThresholdSet(Grocery grocery) { + System.out.println(grocery.getName() + "'s threshold is now " + + grocery.getThreshold() + " " + grocery.getUnit()); + } + /** * Prints output after a grocery's amount is set to 0. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ad0d7e5516..85aa2a3c69 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -227,6 +227,20 @@ public void editCost(String details) throws GitException { } } + public void editThreshold(String details) throws GitException { + String [] amtParts = checkDetails(details, "th", "a/"); + Grocery grocery = getGrocery(amtParts[0].strip()); + String thresholdString = amtParts[1].strip(); + + try { + int threshold = Integer.parseInt(thresholdString); + grocery.setThreshold(threshold); + Ui.printThresholdSet(grocery); + } catch (NumberFormatException e) { + throw new InvalidAmountException(); + } + } + /** * Lists all the user's groceries. */ diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index b34529f7d0..f6cff17698 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -19,7 +19,7 @@ public class GroceryListTest { public void editExpiration_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(),"Meat", 0, "Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(),"Meat", 0, "Freezer")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { fail("editExpiration should not throw an exception"); @@ -43,7 +43,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0, "Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, "Freezer")); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -57,7 +57,7 @@ public void editExpiration_wrongFormat_exceptionThrown() { public void addGrocery_throwIllegalArgument_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, 0, null, "Meat", 0, "Freezer")); // Use null to trigger the exception + gl.addGrocery(new Grocery(null, 0, 0, null, "Meat", 0, "Freezer")); // Use null to trigger the exception fail("Expected IllegalArgumentException was not thrown."); } catch (EmptyGroceryException e) { assertEquals("A grocery needs to be specified!", e.getMessage()); @@ -68,7 +68,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", 0, null, "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("fooood", 0, 0, null, "Meat", 0,"Freezer")); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -81,7 +81,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (CommandWrongFormatException e) { @@ -98,7 +98,7 @@ public void editAmount_wrongFormat_exceptionThrown() { public void editAmountUseTrue_amountReaches0_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 5, 0, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -110,7 +110,7 @@ public void editAmountUseTrue_amountReaches0_success() { public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,"Freezer")); gl.editAmount("Meat a/5", true); fail("Expected a CannotUseException to be thrown"); } catch (CannotUseException e) { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 8135a43fb8..a7375cf71d 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -7,14 +7,14 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, null, "fruit", 0,"Pantry"); + Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,"Pantry"); String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_costWrongFormat_formattedCost() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1,"Pantry"); + Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,"Pantry"); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); @@ -22,7 +22,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { - Grocery grocery = new Grocery("chicken", 1, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); + Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); From f8cfdfecfd7768d7289ea49d9000a8051913f9ff Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 12:11:11 +0800 Subject: [PATCH 108/339] Refactor code to set unit of a grocery in constructor --- src/main/java/grocery/Grocery.java | 68 ++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 1c0aa67644..325976fdc1 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -11,8 +11,11 @@ public class Grocery { private String name; private int amount; + + private int threshold; private LocalDate expiration; private String category; + private String unit; private double cost; private String location; @@ -27,11 +30,13 @@ public class Grocery { * @param location Location of where the grocery is stored. */ - public Grocery(String name, int amount, LocalDate expiration, String category, double cost, String location) { + public Grocery(String name, int amount, int threshold, LocalDate expiration, String category, double cost, String location) { this.name = name; this.amount = amount; + this.threshold = threshold; this.expiration = expiration; this.category = category; + setUnit(category); this.cost = cost; this.location = location; } @@ -57,6 +62,10 @@ public String getLocation() { return this.location; } + public int getThreshold() { + return this.threshold; + } + public void setName(String name) { this.name = name; } @@ -66,6 +75,41 @@ public void setAmount(int amount) { this.amount = amount; } + public void setThreshold(int threshold) { + this.threshold = threshold; + } + + public String getUnit() { + return unit; + } + + /** + * Set unit of the grocery based on its category. + * + * @param category Category of the grocery. + */ + public void setUnit(String category) { + switch (category.toLowerCase()){ + case "fruit": + this.unit = "pieces"; + break; + case "vegetable": + case "meat": + this.unit = "grams"; + break; + case "beverage": + this.unit = "ml"; + break; + default: + this.unit = "units"; + break; + } + + if (this.amount == 0) { + this.unit = ""; + } + } + /** * Formats the expiration date from type string to local date. * @@ -129,27 +173,7 @@ public String printGrocery() { price = ", cost not set"; } - String unit = ""; - switch (category.toLowerCase()){ - case "fruit": - unit = "pieces"; - break; - case "vegetable": - case "meat": - unit = "grams"; - break; - case "beverage": - unit = "ml"; - break; - default: - unit = "units"; - break; - } - if (amount == 0) { - unit = ""; - } - - return this.name + " (" + this.category + ")" + amountString + unit + exp + price + locationString; + return this.name + " (" + this.category + ")" + amountString + this.unit + exp + price + locationString; } } From 0db0d31922656efb669a835b141652fade4b735d Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 12:14:20 +0800 Subject: [PATCH 109/339] Fix checkstyle error --- src/main/java/git/Parser.java | 3 ++- src/main/java/grocery/Grocery.java | 3 ++- src/main/java/grocery/GroceryList.java | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index eb8c6603db..233390f0a1 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -86,7 +86,8 @@ private void addOrDelGrocery(Command command, String[] commandParts) throws GitE int threshold = ui.promptForThreshold(); String location = ui.promptForLocation(); double cost = ui.promptForCost(); - Grocery grocery = new Grocery(commandParts[1], amount, threshold, LocalDate.now(), category, cost, location); + Grocery grocery = new Grocery(commandParts[1], amount, threshold, + LocalDate.now(), category, cost, location); String expiration = ui.promptForExpiration(); grocery.setExpiration(expiration); groceryList.addGrocery(grocery); diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 325976fdc1..4a162296d2 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -30,7 +30,8 @@ public class Grocery { * @param location Location of where the grocery is stored. */ - public Grocery(String name, int amount, int threshold, LocalDate expiration, String category, double cost, String location) { + public Grocery(String name, int amount, int threshold, + LocalDate expiration, String category, double cost, String location) { this.name = name; this.amount = amount; this.threshold = threshold; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 85aa2a3c69..1461190df6 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -253,6 +253,7 @@ public void listGroceries() { } } + /** * Sorts the groceries by expiration date. */ From 041a66e1e98861da98eed55f7e3d8dc3e7b04729 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 12:21:28 +0800 Subject: [PATCH 110/339] Implement the listing of groceries that are low in stock --- src/main/java/git/Parser.java | 6 +++++- src/main/java/git/Ui.java | 11 +++++++++++ src/main/java/grocery/GroceryList.java | 8 ++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 233390f0a1..7084ae14b1 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -29,7 +29,7 @@ public Parser(Ui ui) { * Enums containing the possible commands for groceries. */ enum Command { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, HELP, EXIT + ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LOW, HELP, EXIT } @@ -149,6 +149,10 @@ private void viewListOrHelp(Command command) throws GitException { groceryList.sortByCost(); break; + case LOW: + groceryList.listLowStocks(); + break; + case HELP: ui.displayHelp(); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index fd1a9bc466..56019cdc45 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -346,6 +346,17 @@ public static void printGroceryList(List groceries) { } } + public static void printLowStocks(List groceries) { + assert !groceries.isEmpty() : "grocery list should not be empty"; + System.out.println("Time to top up these groceries!"); + for (Grocery grocery: groceries) { + if (grocery.getAmount() < grocery.getThreshold()) { + System.out.println(" - " + grocery.getName() + + " only left: " +grocery.getAmount()); + } + } + } + /** * Prints output when the selected grocery is removed. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 1461190df6..b273852350 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -253,6 +253,14 @@ public void listGroceries() { } } + public void listLowStocks() { + int size = groceries.size(); + if (size == 0) { + Ui.printNoGrocery(); + } else { + Ui.printLowStocks(groceries); + } + } /** * Sorts the groceries by expiration date. From 6a8da7bab30badf5659affd0768694b7dc8a6ccb Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 12:30:37 +0800 Subject: [PATCH 111/339] Included JavaDoc for the new methods --- src/main/java/git/Ui.java | 15 +++++++++++++-- src/main/java/grocery/GroceryList.java | 12 ++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 56019cdc45..7e3ff2a6d5 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -144,7 +144,8 @@ public int promptForAmount(){ } /** - * Prompts the user to enter the cost of the grocery until a valid cost is given. + * Prompts the user to enter the cost of the grocery for at most 5 times. + * If invalid value is entered for the 6th time, auto set the cost to 0. * * @return the cost to be set for the grocery. */ @@ -303,7 +304,7 @@ public static void printGroceryAdded(Grocery grocery) { } /** - * Prints output after setting the selected grocery's amount. + * Prints the new amount set for the selected grocery. * * @param grocery The grocery that should be updated. */ @@ -312,6 +313,11 @@ public static void printAmtSet(Grocery grocery) { System.out.println(grocery.getName() + ": " + grocery.getAmount()); } + /** + * Prints the new threshold set for the selected grocery. + * + * @param grocery The grocery that should be updated. + */ public static void printThresholdSet(Grocery grocery) { System.out.println(grocery.getName() + "'s threshold is now " + grocery.getThreshold() + " " + grocery.getUnit()); @@ -346,6 +352,11 @@ public static void printGroceryList(List groceries) { } } + /** + * Prints all groceries with amount less than threshold set. + * + * @param groceries An array list of groceries. + */ public static void printLowStocks(List groceries) { assert !groceries.isEmpty() : "grocery list should not be empty"; System.out.println("Time to top up these groceries!"); diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index b273852350..cdcc92297e 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -227,6 +227,12 @@ public void editCost(String details) throws GitException { } } + /** + * Updates the threshold of an existing grocery. + * + * @param details A string containing grocery name and details. + * @throws GitException If the input new cost is not numeric. + */ public void editThreshold(String details) throws GitException { String [] amtParts = checkDetails(details, "th", "a/"); Grocery grocery = getGrocery(amtParts[0].strip()); @@ -253,6 +259,9 @@ public void listGroceries() { } } + /** + * Lists all the groceries that are low in stock. + */ public void listLowStocks() { int size = groceries.size(); if (size == 0) { @@ -269,6 +278,9 @@ public void sortByExpiration() { Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); } + /** + * Sorts the groceries by descending cost. + */ public void sortByCost() { int size = groceries.size(); if (size == 0) { From b4cfc61bbbba281ce051a076bda12d5161deb161 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Tue, 2 Apr 2024 13:32:27 +0800 Subject: [PATCH 112/339] Refactor add grocery menu and update Parser class --- .vscode/extensions.json | 5 ++ src/main/java/git/Parser.java | 11 +---- src/main/java/git/Ui.java | 78 +++++++++++++++++++++++++----- src/main/java/grocery/Grocery.java | 18 +++++++ 4 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..733b5072eb --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "markis.code-coverage" + ] +} \ No newline at end of file diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 1abeaccc3e..06bfd58f5d 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -1,6 +1,5 @@ package git; -import java.time.LocalDate; import exceptions.GitException; import exceptions.InvalidCommandException; @@ -49,14 +48,8 @@ public void executeCommand(String[] commandParts) throws GitException { switch (commandParts[0]) { case "add": - String category = ui.promptForCategory(); - int amount = ui.promptForAmount(); - String location = ui.promptForLocation(); - Grocery grocery = new Grocery(commandParts[1], amount, LocalDate.now(), category, 0, location); - String expiration = ui.promptForExpiration(); - String cost = ui.promptForCost(); - grocery.setExpiration(expiration); - grocery.setCost(cost); + Grocery grocery = new Grocery(commandParts[1]); + ui.printAddMenu(grocery); groceryList.addGrocery(grocery); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index a45c1cce12..df3a61c580 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -7,6 +7,7 @@ import exceptions.GitException; import exceptions.InvalidCostException; +import exceptions.PastExpirationDateException; import grocery.Grocery; @@ -85,6 +86,70 @@ public String[] processInput() { return commandParts; } + /** + * Prints the add grocery menu + * + * @param grocery The grocery to be added + */ + public void printAddMenu(Grocery grocery) { + Ui ui = Ui.getInstance(); + + System.out.println("Do you want to include the following details?"); + System.out.println("1. Category"); + System.out.println("2. Amount"); + System.out.println("3. Location"); + System.out.println("4. Expiration Date"); + System.out.println("5. Cost"); + System.out.println("6. Skip"); + System.out.println("Please enter the number of the details you want to include:"); + System.out.println("You may enter multiple numbers. (e.g. 1234)"); + + // Reading the user input as a string + String input = ui.processInput()[0]; + // Iterating over each character in the string + for (char choice : input.toCharArray()) { + switch (choice) { + case '1': + System.out.println("Including Category"); + String category = ui.promptForCategory(); + grocery.setCategory(category); + break; + case '2': + System.out.println("Including Amount"); + int amount = ui.promptForAmount(); + grocery.setAmount(amount); + break; + case '3': + System.out.println("Including Location"); + String location = ui.promptForLocation(); + grocery.setLocation(location); + break; + case '4': + System.out.println("Including Expiration Date"); + String expiration = ui.promptForExpiration(); + try { + grocery.setExpiration(expiration); + } catch (PastExpirationDateException e) { + e.printStackTrace(); + } + break; + case '5': + System.out.println("Including Cost"); + String cost = ui.promptForCost(); + grocery.setCost(cost); + break; + case '6': + System.out.println("Skipping additional details"); + break; + default: + System.out.println("Invalid choice: " + choice); + break; + } + // If the choice is to skip, break out of the loop + if (choice == '6') break; + } + } + /** * Prompts user for expiration date. * @@ -210,19 +275,6 @@ private String convertMonthToNumber(String month) { return month; } - /** - * Reads expiration date from user input. - * - * @param year Year of expiration. - * @param month Month of expiration. - * @param day Day of expiration. - * @return Formatted expiration date. - */ - private String formatExpirationDate(String year, String month, String day) { - // This method can be enhanced to validate the date components - return year + "-" + month + "-" + day; - } - /** * Displays help message containing all possible commands. */ diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index d3db340425..d0f04d0fd8 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -36,6 +36,20 @@ public Grocery(String name, int amount, LocalDate expiration, String category, d this.location = location; } + /** + * Basic constructor for Grocery. + * + * @param name Name. + */ + public Grocery(String name) { + this.name = name; + this.amount = 0; + this.expiration = null; + this.category = null; + this.cost = 0; + this.location = null; + } + // Getters and setters public String getName() { return name; @@ -66,6 +80,10 @@ public void setAmount(int amount) { this.amount = amount; } + public void setCategory(String category) { + this.category = category; + } + /** * Formats the expiration date from type string to local date. * From 27a25cc6f80e316fb1e38ef8155ece89fa2753c2 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 14:05:34 +0800 Subject: [PATCH 113/339] Improve code to alert the user when grocery is used until below threshold --- src/main/java/git/Ui.java | 10 ++++++++-- src/main/java/grocery/Grocery.java | 4 ++++ src/main/java/grocery/GroceryList.java | 3 +++ text-ui-test/EXPECTED.TXT | 3 ++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 7e3ff2a6d5..dac97f4062 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -261,7 +261,8 @@ public void displayHelp() { "add GROCERY: adds the item GROCERY.\n" + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + - "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY\n" + + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + + "th GROCERY a/AMOUNT: updates the threshold amount of GROCERY.\n" + "cost GROCERY $PRICE: updates the price of GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + @@ -361,13 +362,18 @@ public static void printLowStocks(List groceries) { assert !groceries.isEmpty() : "grocery list should not be empty"; System.out.println("Time to top up these groceries!"); for (Grocery grocery: groceries) { - if (grocery.getAmount() < grocery.getThreshold()) { + if (grocery.isLow()) { System.out.println(" - " + grocery.getName() + " only left: " +grocery.getAmount()); } } } + public static void lowStockAlert(Grocery grocery) { + System.out.println(grocery.getName() + " is low in stock!"); + System.out.println("There's only " +grocery.getAmount() + " left"); + } + /** * Prints output when the selected grocery is removed. * diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 4a162296d2..57f8e6dfda 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -84,6 +84,10 @@ public String getUnit() { return unit; } + public boolean isLow() { + return this.amount < this.threshold; + } + /** * Set unit of the grocery based on its category. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index cdcc92297e..64d44fbcdf 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -202,9 +202,12 @@ public void editAmount(String details, boolean use) throws GitException { grocery.setAmount(amount); if (amount == 0) { Ui.printAmtDepleted(grocery); + } else if (grocery.isLow()){ + Ui.lowStockAlert(grocery); } else { Ui.printAmtSet(grocery); } + } /** diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index bd36dadd95..d503dbae54 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -13,7 +13,8 @@ Here are some ways you can use this app! add GROCERY: adds the item GROCERY. exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY. amt GROCERY a/AMOUNT: sets the amount of GROCERY. -use GROCERY a/AMOUNT: updates the total amount after using a GROCERY +use GROCERY a/AMOUNT: updates the total amount after using a GROCERY. +th GROCERY a/AMOUNT: updates the threshold amount of GROCERY. cost GROCERY $PRICE: updates the price of GROCERY. del GROCERY: deletes GROCERY. list: shows list of all groceries you have. From 4635db32e5b3764d824f23e6b75ebb3e9ecf687c Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 14:08:15 +0800 Subject: [PATCH 114/339] Include JavaDoc --- src/main/java/grocery/Grocery.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 57f8e6dfda..1400807d3e 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -84,6 +84,11 @@ public String getUnit() { return unit; } + /** + * Checks if the grocery is low in stock. + * + * @return True if current amount is lesser than threshold. + */ public boolean isLow() { return this.amount < this.threshold; } From 936f84ff0f10680ed128163dc63f27feadd9a1fe Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 14:12:45 +0800 Subject: [PATCH 115/339] Add new description in help function --- src/main/java/git/Ui.java | 1 + text-ui-test/EXPECTED.TXT | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index dac97f4062..652d647934 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -267,6 +267,7 @@ public void displayHelp() { "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "listC: shows the list sorted by price.\n" + + "low: shows a list of groceries that are low in stock.\n" + "exit: exits the program.\n" + "help: view all the possible commands." ); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index d503dbae54..79e8d2ac3a 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -19,6 +19,7 @@ cost GROCERY $PRICE: updates the price of GROCERY. del GROCERY: deletes GROCERY. list: shows list of all groceries you have. listC: shows the list sorted by price. +low: shows a list of groceries that are low in stock. exit: exits the program. help: view all the possible commands. Enter command: From 6e0566e36453612b8773d254184d96200bd9f2b5 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Tue, 2 Apr 2024 16:32:29 +0800 Subject: [PATCH 116/339] Add new commands for sorting and displaying groceries --- src/main/java/git/Parser.java | 38 ++++++++++++++++++++++++-- src/main/java/git/Ui.java | 35 ++++++++++++++++++++++-- src/main/java/grocery/Grocery.java | 24 +++++++++++----- src/main/java/grocery/GroceryList.java | 34 ++++++++++++++++++++++- text-ui-test/EXPECTED.TXT | 2 ++ 5 files changed, 119 insertions(+), 14 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index a65800a816..50931d91d7 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -28,7 +28,7 @@ public Parser(Ui ui) { * Enums containing the possible commands for groceries. */ enum Command { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LOW, HELP, EXIT + ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, EXIT } @@ -54,10 +54,34 @@ public String[] processCommandParts() { */ public void executeCommand(String[] commandParts) throws GitException { assert commandParts.length == 2 : "Command passed in wrong format"; + Command command; + try { + command = Command.valueOf(commandParts[0].toUpperCase()); + } catch (Exception e) { + throw new InvalidCommandException(); + } + int index = command.ordinal(); + if (index <= Command.DEL.ordinal()) { + addOrDelGrocery(command, commandParts); + } else if (index <= Command.COST.ordinal()) { + editGrocery(command,commandParts); + } else { + viewListOrHelp(command); + } + } - switch (commandParts[0]) { + /** + * Handles commands related to adding or deleting a grocery. + * + * @param command Command keyword of data type Enum. + * @param commandParts Fragments of the command entered by user. + * @throws GitException Exception thrown depending on specific error. + */ + private void addOrDelGrocery(Command command, String[] commandParts) throws GitException { + switch (command) { case ADD: Grocery grocery = new Grocery(commandParts[1]); + ui.printAddMenu(grocery); groceryList.addGrocery(grocery); break; @@ -117,6 +141,14 @@ private void viewListOrHelp(Command command) throws GitException { groceryList.sortByCost(); break; + case LISTE: + groceryList.sortByExpiration(); + break; + + case EXPIRING: + groceryList.displayGroceriesExpiringInNext3Days(); + break; + case LOW: groceryList.listLowStocks(); break; @@ -138,4 +170,4 @@ private void viewListOrHelp(Command command) throws GitException { public boolean getIsRunning() { return isRunning; } -} +} \ No newline at end of file diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index a54bd13010..2c9139a695 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -100,7 +100,9 @@ public void printAddMenu(Grocery grocery) { System.out.println("3. Location"); System.out.println("4. Expiration Date"); System.out.println("5. Cost"); - System.out.println("6. Skip"); + System.out.println("6. Threshhold Amount"); + System.out.println("7. Help"); + System.out.println("8. Skip"); System.out.println("Please enter the number of the details you want to include:"); System.out.println("You may enter multiple numbers. (e.g. 1234)"); @@ -135,17 +137,25 @@ public void printAddMenu(Grocery grocery) { break; case '5': System.out.println("Including Cost"); - String cost = ui.promptForCost(); + Double cost = ui.promptForCost(); grocery.setCost(cost); break; case '6': + System.out.println("Including Threshold Amount"); + int threshold = ui.promptForThreshold(); + grocery.setThreshold(threshold); + break; + case '7': + System.out.println("Displaying help"); + ui.displayAddHelp(); + break; + case '8': System.out.println("Skipping additional details"); break; default: System.out.println("Invalid choice: " + choice); break; } - // If the choice is to skip, break out of the loop if (choice == '6') break; } } @@ -319,12 +329,31 @@ public void displayHelp() { "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "listC: shows the list sorted by price.\n" + + "listE: shows the list sorted by expiration date.\n" + + "expiring: shows a list of groceries that are expiring soon.\n" + "low: shows a list of groceries that are low in stock.\n" + "exit: exits the program.\n" + "help: view all the possible commands." ); } + /** + * Display help message for the user when adding grocery. + */ + public void displayAddHelp() { + System.out.println( + "Here are some details you can include when adding a grocery:\n" + + "Category - Enter the category of the grocery.\n" + + "Amount - Enter the amount of the grocery.\n" + + "Location - Enter the location of the grocery.\n" + + "Expiration Date - Enter the expiration date of the grocery.\n" + + "Cost - Enter the cost of the grocery.\n" + + "Minimum Amount - Enter the minimum amount of the grocery to set reminder.\n" + + "Skip - Skip adding additional details." + ); + } + + /** * Prints output after setting the selected grocery's expiration date. * diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 890fa8183b..b5a8db734d 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -51,7 +51,7 @@ public Grocery(String name) { this.name = name; this.amount = 0; this.expiration = null; - this.category = null; + this.category = ""; this.cost = 0; this.location = null; } @@ -85,6 +85,11 @@ public void setName(String name) { this.name = name; } + public void setCategory(String category) { + this.category = category; + setUnit(category); + } + public void setAmount(int amount) { assert amount >= 0 : "Amount entered is invalid!"; this.amount = amount; @@ -153,13 +158,13 @@ public void setExpiration(String expiration) throws PastExpirationDateException } /** - * Converts the cost from type String to double and store it. + * Sets the cost of the grocery. * - * @param cost The cost of grocery in String type. + * @param cost The cost of the grocery as a double. */ - public void setCost(String cost) { - assert !(cost.isEmpty()) : "Cost entered is invalid!"; - this.cost = Double.parseDouble(cost); + public void setCost(double cost) { + assert cost >= 0 : "Cost entered is invalid!"; // Ensure that the cost is non-negative. + this.cost = cost; } public void setLocation(String location) { @@ -174,7 +179,12 @@ public void setLocation(String location) { public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; - String locationString = ", location: " + location; + String locationString; + if(this.location != null) { + locationString = ", location: " + this.location; + } else { + locationString = ", location not set"; + } String amountString; if (amount != 0) { diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 64d44fbcdf..63c85318aa 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -20,6 +20,7 @@ import java.util.logging.Logger; import java.util.logging.Level; import java.util.Collections; +import java.util.stream.Collectors; /** @@ -223,7 +224,7 @@ public void editCost(String details) throws GitException { try { double cost = Double.parseDouble(price); - grocery.setCost(String.format("%.2f", cost)); + grocery.setCost(cost); Ui.printCostSet(grocery); } catch (NumberFormatException e) { throw new InvalidCostException(); @@ -279,6 +280,37 @@ public void listLowStocks() { */ public void sortByExpiration() { Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); + Ui.printGroceryList(groceries); + } + + /** + * Gets a list of groceries expiring in the next 3 days. + * + * @return A list of groceries expiring within the next 3 days. + */ + public List getGroceriesExpiringInNext3Days() { + LocalDate today = LocalDate.now(); + LocalDate threeDaysFromNow = today.plusDays(3); + + return groceries.stream() + .filter(grocery -> { + LocalDate expirationDate = grocery.getExpiration(); + return !expirationDate.isBefore(today) && !expirationDate.isAfter(threeDaysFromNow); + }) + .collect(Collectors.toList()); + } + + /** + * display the groceries that are expiring in the next 3 days. + */ + public void displayGroceriesExpiringInNext3Days() { + List groceriesExpiringInNext3Days = getGroceriesExpiringInNext3Days(); + if (groceriesExpiringInNext3Days.isEmpty()) { + Ui.printNoGrocery(); + } else { + System.out.println("Here are the groceries expiring in the next 3 days:"); + Ui.printGroceryList(groceriesExpiringInNext3Days); + } } /** diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 79e8d2ac3a..95cf885a87 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -19,6 +19,8 @@ cost GROCERY $PRICE: updates the price of GROCERY. del GROCERY: deletes GROCERY. list: shows list of all groceries you have. listC: shows the list sorted by price. +listE: shows the list sorted by expiration date. +expiring: shows a list of groceries that are expiring soon. low: shows a list of groceries that are low in stock. exit: exits the program. help: view all the possible commands. From 7417e4499831f13953d3945955ea23bc60879a38 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Tue, 2 Apr 2024 16:38:09 +0800 Subject: [PATCH 117/339] Refactor user input handling in Ui class --- src/main/java/git/Parser.java | 2 +- src/main/java/git/Ui.java | 92 ++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 50931d91d7..8e9307febe 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -170,4 +170,4 @@ private void viewListOrHelp(Command command) throws GitException { public boolean getIsRunning() { return isRunning; } -} \ No newline at end of file +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2c9139a695..d1a05e8d6e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -111,52 +111,54 @@ public void printAddMenu(Grocery grocery) { // Iterating over each character in the string for (char choice : input.toCharArray()) { switch (choice) { - case '1': - System.out.println("Including Category"); - String category = ui.promptForCategory(); - grocery.setCategory(category); - break; - case '2': - System.out.println("Including Amount"); - int amount = ui.promptForAmount(); - grocery.setAmount(amount); - break; - case '3': - System.out.println("Including Location"); - String location = ui.promptForLocation(); - grocery.setLocation(location); - break; - case '4': - System.out.println("Including Expiration Date"); - String expiration = ui.promptForExpiration(); - try { - grocery.setExpiration(expiration); - } catch (PastExpirationDateException e) { - e.printStackTrace(); - } - break; - case '5': - System.out.println("Including Cost"); - Double cost = ui.promptForCost(); - grocery.setCost(cost); - break; - case '6': - System.out.println("Including Threshold Amount"); - int threshold = ui.promptForThreshold(); - grocery.setThreshold(threshold); - break; - case '7': - System.out.println("Displaying help"); - ui.displayAddHelp(); - break; - case '8': - System.out.println("Skipping additional details"); - break; - default: - System.out.println("Invalid choice: " + choice); - break; + case '1': + System.out.println("Including Category"); + String category = ui.promptForCategory(); + grocery.setCategory(category); + break; + case '2': + System.out.println("Including Amount"); + int amount = ui.promptForAmount(); + grocery.setAmount(amount); + break; + case '3': + System.out.println("Including Location"); + String location = ui.promptForLocation(); + grocery.setLocation(location); + break; + case '4': + System.out.println("Including Expiration Date"); + String expiration = ui.promptForExpiration(); + try { + grocery.setExpiration(expiration); + } catch (PastExpirationDateException e) { + e.printStackTrace(); + } + break; + case '5': + System.out.println("Including Cost"); + Double cost = ui.promptForCost(); + grocery.setCost(cost); + break; + case '6': + System.out.println("Including Threshold Amount"); + int threshold = ui.promptForThreshold(); + grocery.setThreshold(threshold); + break; + case '7': + System.out.println("Displaying help"); + ui.displayAddHelp(); + break; + case '8': + System.out.println("Skipping additional details"); + break; + default: + System.out.println("Invalid choice: " + choice); + break; + } + if (choice == '6') { + break; } - if (choice == '6') break; } } From 6589944149974ce08d9a2d34d864afbc02c1f3fe Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 17:10:24 +0800 Subject: [PATCH 118/339] Add methods to store food consumed and their calories --- .../java/enumerations/GroceryCommand.java | 5 + src/main/java/enumerations/Mode.java | 5 + .../exceptions/InsufficientInfoException.java | 15 ++ .../InvalidActivenessException.java | 11 ++ .../java/exceptions/InvalidAimException.java | 11 ++ .../commands/EmptyFoodException.java | 12 ++ src/main/java/food/Food.java | 22 +++ src/main/java/food/FoodList.java | 43 +++++ src/main/java/git/Git.java | 5 +- src/main/java/git/Parser.java | 114 +++++++++++-- src/main/java/git/Ui.java | 148 +++++++++++++++-- src/main/java/user/UserInfo.java | 153 ++++++++++++++++++ src/test/java/git/GitTest.java | 2 +- 13 files changed, 518 insertions(+), 28 deletions(-) create mode 100644 src/main/java/enumerations/GroceryCommand.java create mode 100644 src/main/java/enumerations/Mode.java create mode 100644 src/main/java/exceptions/InsufficientInfoException.java create mode 100644 src/main/java/exceptions/InvalidActivenessException.java create mode 100644 src/main/java/exceptions/InvalidAimException.java create mode 100644 src/main/java/exceptions/commands/EmptyFoodException.java create mode 100644 src/main/java/food/Food.java create mode 100644 src/main/java/food/FoodList.java create mode 100644 src/main/java/user/UserInfo.java diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java new file mode 100644 index 0000000000..559822e4a2 --- /dev/null +++ b/src/main/java/enumerations/GroceryCommand.java @@ -0,0 +1,5 @@ +package enumerations; + +public enum GroceryCommand { + ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LOW, HELP, SWITCH, EXIT +} diff --git a/src/main/java/enumerations/Mode.java b/src/main/java/enumerations/Mode.java new file mode 100644 index 0000000000..344b078e0f --- /dev/null +++ b/src/main/java/enumerations/Mode.java @@ -0,0 +1,5 @@ +package enumerations; + +public enum Mode { + GROCERY, PROFILE, CALORIES, RECIPE +} diff --git a/src/main/java/exceptions/InsufficientInfoException.java b/src/main/java/exceptions/InsufficientInfoException.java new file mode 100644 index 0000000000..027574411a --- /dev/null +++ b/src/main/java/exceptions/InsufficientInfoException.java @@ -0,0 +1,15 @@ +package exceptions; + +/** + * Represents the exception thrown when the information given is insufficient to calculate BMR. + */ +public class InsufficientInfoException extends GitException { + + /** + * Constructs InsufficientInfoException. + */ + public InsufficientInfoException() { + message = "User's information is insufficient to calculate BMR," + + " please check the current information"; + } +} diff --git a/src/main/java/exceptions/InvalidActivenessException.java b/src/main/java/exceptions/InvalidActivenessException.java new file mode 100644 index 0000000000..bffc8a348d --- /dev/null +++ b/src/main/java/exceptions/InvalidActivenessException.java @@ -0,0 +1,11 @@ +package exceptions; + +public class InvalidActivenessException extends GitException { + + /** + * Constructs InvalidActivenessException. + */ + public InvalidActivenessException() { + message = "The activeness provided is invalid!" ; + } +} diff --git a/src/main/java/exceptions/InvalidAimException.java b/src/main/java/exceptions/InvalidAimException.java new file mode 100644 index 0000000000..67fe4c3264 --- /dev/null +++ b/src/main/java/exceptions/InvalidAimException.java @@ -0,0 +1,11 @@ +package exceptions; + +public class InvalidAimException extends GitException { + + /** + * Constructs InvalidAimException. + */ + public InvalidAimException() { + message = "The aim provided is invalid!" ; + } +} diff --git a/src/main/java/exceptions/commands/EmptyFoodException.java b/src/main/java/exceptions/commands/EmptyFoodException.java new file mode 100644 index 0000000000..3d80741618 --- /dev/null +++ b/src/main/java/exceptions/commands/EmptyFoodException.java @@ -0,0 +1,12 @@ +package exceptions.commands; + +import exceptions.GitException; + +public class EmptyFoodException extends GitException { + /** + * Constructs EmptyFoodException. + */ + public EmptyFoodException() { + message = "A food needs to be specified!"; + } +} diff --git a/src/main/java/food/Food.java b/src/main/java/food/Food.java new file mode 100644 index 0000000000..93dbbcb98a --- /dev/null +++ b/src/main/java/food/Food.java @@ -0,0 +1,22 @@ +package food; + +public class Food { + private String name; + private double calories; + public Food(String name, double calories) { + this.name = name; + this.calories = calories; + } + + public String getName() { + return name; + } + + public double getCalories() { + return calories; + } + + public String print() { + return this.name + ", with " + this.calories + " calories"; + } +} diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java new file mode 100644 index 0000000000..7adb7f8b48 --- /dev/null +++ b/src/main/java/food/FoodList.java @@ -0,0 +1,43 @@ +package food; + +import exceptions.commands.EmptyFoodException; +import git.Ui; +import grocery.Grocery; + +import java.util.ArrayList; +import java.util.List; + +public class FoodList { + private List foods; + + /** + * Constructs GroceryList. + */ + public FoodList() { + foods = new ArrayList<>(); + } + + public void addFood(Food food) throws EmptyFoodException { + if (food.getName() == null) { + throw new EmptyFoodException(); + } + + try { + foods.add(food); + Ui.printFoodAdded(food); + assert foods.contains(food) : "Food should be added to the list"; + } catch (NullPointerException e) { + System.out.println("Failed to add food: the food collection is null."); + } catch (Exception e) { + System.out.println("An unexpected error occurred while adding the food: " + e.getMessage()); + } + } + + public void printFoods() { + assert !foods.isEmpty() : "food list should not be empty"; + System.out.println("Here are the food you have consumed today:"); + for (Food food: foods) { + System.out.println(" - " + food.print()); + } + } +} diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index dd81351331..5ace2a8f09 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -26,12 +26,13 @@ public Git() { * Runs Git. */ private void run() { - ui.printWelcome(); + String mode = ui.printWelcome(); while (isRunning) { try { String[] commandParts = parser.processCommandParts(); - parser.executeCommand(commandParts); + parser.executeCommand(commandParts, mode); isRunning = parser.getIsRunning(); + mode = parser.getCurrentMode(); } catch (GitException e) { System.out.println(e.getMessage()); } finally { diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7084ae14b1..0acb739a0f 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -4,33 +4,41 @@ import exceptions.GitException; import exceptions.InvalidCommandException; +import food.Food; +import food.FoodList; import grocery.Grocery; import grocery.GroceryList; +import enumerations.Mode; +import enumerations.GroceryCommand; +import user.UserInfo; /** * Deals with commands entered by user. */ public class Parser { private GroceryList groceryList; + private FoodList foodList; + private UserInfo userInfo; private Ui ui; private boolean isRunning; + private String currentMode; + /** * Constructs Parser. */ public Parser(Ui ui) { groceryList = new GroceryList(); + foodList = new FoodList(); + String userName = ui.getUserName(); + userInfo = new UserInfo(userName); this.ui = ui; isRunning = true; } - /** - * Enums containing the possible commands for groceries. - */ - enum Command { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LOW, HELP, EXIT - + public String getCurrentMode() { + return currentMode; } /** @@ -53,18 +61,90 @@ public String[] processCommandParts() { * @param commandParts Fragments of the command entered by user. * @throws GitException Exception thrown depending on specific error. */ - public void executeCommand(String[] commandParts) throws GitException { + public void executeCommand(String[] commandParts, String selectedMode) throws GitException { + this.currentMode = selectedMode; + Mode mode = Mode.valueOf(currentMode.toUpperCase()); + switch (mode) { + case GROCERY: + groceryManagement(commandParts); + break; + case CALORIES: + caloriesManagement(commandParts); + break; + case PROFILE: + profileManagement(commandParts); + break; + } + } + + public void caloriesManagement(String[] commandParts) throws GitException { + String command = commandParts[0]; + switch (command) { + case "eat": + double calories = ui.promptForCalories(); + Food food = new Food(commandParts[1], calories); + foodList.addFood(food); + userInfo.consumptionOfCalories(food); + break; + + case "view": + foodList.printFoods(); + System.out.println("You have consumed " + userInfo.getCurrentCalories() + " calories for today"); + break; + + case "switch": + currentMode = Ui.switchMode(); + break; + + case "exit": + System.out.println("bye bye!"); + isRunning = false; + break; + + default: + throw new InvalidCommandException(); + } + } + + public void profileManagement(String[] commandParts) throws GitException { + String command = commandParts[0]; + switch (command) { + case "update": + double weight = ui.promptForWeight(); + double height = ui.promptForHeight(); + int age = ui.promptForAge(); + String gender = ui.promptForGender(); + String activeness = ui.promptForActiveness(); + String aim = ui.promptForAim(); + userInfo.updateInfo(weight,height,age,gender,activeness,aim); + break; + + case "switch": + currentMode = Ui.switchMode(); + break; + + case "exit": + System.out.println("bye bye!"); + isRunning = false; + break; + + default: + throw new InvalidCommandException(); + } + } + + public void groceryManagement(String[] commandParts) throws GitException { assert commandParts.length == 2 : "Command passed in wrong format"; - Command command; + GroceryCommand command; try { - command = Command.valueOf(commandParts[0].toUpperCase()); + command = GroceryCommand.valueOf(commandParts[0].toUpperCase()); } catch (Exception e) { throw new InvalidCommandException(); } int index = command.ordinal(); - if (index <= Command.DEL.ordinal()) { + if (index <= GroceryCommand.DEL.ordinal()) { addOrDelGrocery(command, commandParts); - } else if (index <= Command.COST.ordinal()) { + } else if (index <= GroceryCommand.COST.ordinal()) { editGrocery(command,commandParts); } else { viewListOrHelp(command); @@ -78,7 +158,7 @@ public void executeCommand(String[] commandParts) throws GitException { * @param commandParts Fragments of the command entered by user. * @throws GitException Exception thrown depending on specific error. */ - private void addOrDelGrocery(Command command, String[] commandParts) throws GitException { + private void addOrDelGrocery(GroceryCommand command, String[] commandParts) throws GitException { switch (command) { case ADD: String category = ui.promptForCategory(); @@ -109,7 +189,7 @@ private void addOrDelGrocery(Command command, String[] commandParts) throws GitE * @param commandParts Fragments of the command entered by user. * @throws GitException Exception thrown depending on specific error. */ - private void editGrocery(Command command, String[] commandParts) throws GitException { + private void editGrocery(GroceryCommand command, String[] commandParts) throws GitException { switch (command) { case EXP: groceryList.editExpiration(commandParts[1]); @@ -139,7 +219,7 @@ private void editGrocery(Command command, String[] commandParts) throws GitExcep * @param command Command keyword of data type Enum. * @throws GitException Exception thrown depending on specific error. */ - private void viewListOrHelp(Command command) throws GitException { + private void viewListOrHelp(GroceryCommand command) throws GitException { switch (command) { case LIST: groceryList.listGroceries(); @@ -154,7 +234,11 @@ private void viewListOrHelp(Command command) throws GitException { break; case HELP: - ui.displayHelp(); + Ui.displayHelpForGrocery(); + break; + + case SWITCH: + currentMode = Ui.switchMode(); break; case EXIT: diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 7e3ff2a6d5..f5d1efb886 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -7,8 +7,11 @@ import exceptions.GitException; import exceptions.InvalidCostException; +import food.Food; import grocery.Grocery; +import enumerations.Mode; + /** * Deals with interactions with the user. @@ -17,7 +20,8 @@ public class Ui { // ATTRIBUTES public static final String DIVIDER = "- - - - -"; private static Ui singleUi = null; - private Scanner in; + private static Scanner in; + private String userName; // METHODS /** @@ -37,10 +41,14 @@ public static Ui getInstance() { return singleUi; } + public String getUserName() { + return userName; + } + /** * Prints welcome message. */ - public void printWelcome() { + public String printWelcome() { final String gitlogo = " ______ _ _________\n" + " .' ___ | (_)| _ _ |\n" + @@ -53,8 +61,13 @@ public void printWelcome() { System.out.println("Hello from GiT"); System.out.println("What is your name?"); printLine(); - String userName = in.nextLine(); + userName = in.nextLine(); printHello(userName); + System.out.println("Please select a mode: " + + "grocery, profile, calories or recipe:"); + String selectedMode = in.nextLine().trim(); + displayCommands(selectedMode); + return selectedMode; } /** @@ -64,13 +77,23 @@ public void printWelcome() { */ public void printHello(String userName) { System.out.println("Hello " + userName + "!"); - - displayHelp(); - System.out.println("Enter command:"); - printLine(); } + public static void displayCommands(String selectedMode) { + Mode mode = Mode.valueOf(selectedMode.toUpperCase()); + switch (mode) { + case GROCERY: + displayHelpForGrocery(); + System.out.println("Enter command:"); + printLine(); + break; + case CALORIES: + System.out.println("Enter command:"); + break; + } + } + /** * Processes user input into a command and its details for Parser. * @@ -209,6 +232,97 @@ public int promptForThreshold(){ return threshold; } + public double promptForCalories() { + System.out.println("Please enter the calories of the food in kcal:"); + double calories = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + calories = Double.parseDouble(input); + break; + } catch (NumberFormatException nfe) { + System.out.println("Calories entered is invalid!"); + System.out.println("Please enter the calories of the food in kcal:"); + } + } + return calories; + } + + public double promptForWeight() { + System.out.println("Please enter your weight in KG:"); + double weight = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + weight = Double.parseDouble(input); + break; + } catch (NumberFormatException nfe) { + System.out.println("Weight entered is invalid!"); + System.out.println("Please enter your weight in KG:"); + } + } + return weight; + } + + public double promptForHeight() { + System.out.println("Please enter your height in cm:"); + double height = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + height = Double.parseDouble(input); + break; + } catch (NumberFormatException nfe) { + System.out.println("Height entered is invalid!"); + System.out.println("Please enter your height in cm:"); + } + } + return height; + } + + public int promptForAge() { + System.out.println("Please enter your age in years:"); + int age = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + age = Integer.parseInt(input); + break; + } catch (NumberFormatException nfe) { + System.out.println("Age entered is invalid!"); + System.out.println("Please enter your age in years:"); + } + } + return age; + } + + public String promptForGender() { + System.out.println("Please enter your gender (e.g. F):"); + String gender = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.length() == 1) { + gender = input; + break; + } else { + System.out.println("Gender entered is invalid!"); + System.out.println("Please enter your age in years:"); + } + } + return gender; + } + + public String promptForAim() { + System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); + return in.nextLine().trim(); + } + + public String promptForActiveness() { + System.out.println("Please enter your activeness " + + "(e.g. inactive/light/moderate/active/very):):"); + return in.nextLine().trim(); + } + /** * Prompts the user to enter the location of the grocery. * @return Location of grocery in String @@ -252,12 +366,20 @@ private String formatExpirationDate(String year, String month, String day) { return year + "-" + month + "-" + day; } + public static String switchMode() { + System.out.println("What mode would you like to switch to?"); + System.out.println("Please select a mode: " + + "grocery, profile, calories or recipe:"); + String newMode = in.nextLine().trim(); + return newMode; + } + /** * Displays help message containing all possible commands. */ - public void displayHelp() { + public static void displayHelpForGrocery() { System.out.println( - "Here are some ways you can use this app!\n" + + "Here are some ways you can manage your groceries!\n" + "add GROCERY: adds the item GROCERY.\n" + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + @@ -381,10 +503,16 @@ public static void printGroceryRemoved(Grocery grocery, List groceries) System.out.println("You now have " + groceries.size() + " groceries left"); } + public static void printFoodAdded(Food food) { + assert !(food.getName().isEmpty()): "food name should not be empty"; + System.out.println(food.print() + " was consumed!"); + } + + /** * Prints divider for user readability. */ - public void printLine() { + public static void printLine() { System.out.println(DIVIDER); } } diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java new file mode 100644 index 0000000000..deaa484cb8 --- /dev/null +++ b/src/main/java/user/UserInfo.java @@ -0,0 +1,153 @@ +package user; + +import exceptions.*; +import food.Food; + +public class UserInfo { + private String name; + private double weight; + private double height; + private int age; + private String gender; + private String aim; + private String activeness; + private double BMR; + private double AMR; + private double caloriesCap; + private double currentCalories; + + public UserInfo(String name) { + this.name = name; + this.weight = 0; + this.height = 0; + this.age = 0; + this.currentCalories = 0; + } + + public void setName(String name) { + this.name = name; + } + + /** + * Sets weight in KG. + * + * @param weight User's weight. + */ + public void setWeight(double weight) { + this.weight = weight; + } + + /** + * Sets height in cm. + * + * @param height User's height. + */ + public void setHeight(double height) { + this.height = height; + } + + /** + * Sets age in years. + * + * @param age User's age. + */ + public void setAge(int age) { + this.age = age; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public void setAim(String aim) { + this.aim = aim; + } + + public void setActiveness(String activeness) { + this.activeness = activeness; + } + + public double getCurrentCalories() { + return currentCalories; + } + + public void updateInfo(double weight, double height, int age, + String gender, String activeness, String aim) { + setWeight(weight); + setHeight(height); + setAge(age); + setGender(gender); + setAim(aim); + setActiveness(activeness); + try { + calBMR(); + calAMR(); + setCaloriesCap(); + System.out.println("Your target calories intake a day should be " + + this.caloriesCap); + } catch (GitException e) { + System.out.println(e.getMessage()); + } + } + + private void calBMR() throws InsufficientInfoException { + if (this.weight == 0 || this.height == 0 || this.age == 0) { + throw new InsufficientInfoException(); + } + double result; + if(gender.equals("F")) { + result = 655 + (9.56 * this.weight) + (1.85 * this.height) - (4.68 * this.height); + } else { + result = 66.47 + (13.75 * this.weight) + (5 * this.height) - (6.76 * this.height); + } + this.BMR = result; + } + + private void calAMR() throws GitException { + switch (this.activeness) { + case "inactive": + this.AMR = this.BMR * 1.2; + break; + case "light": + this.AMR = this.BMR * 1.38; + break; + case "moderate": + this.AMR = this.BMR * 1.55; + break; + case "active": + this.AMR = this.BMR * 1.73; + break; + case "very": + this.AMR = this.BMR * 1.9; + break; + default: + throw new InvalidActivenessException(); + } + } + + private void setCaloriesCap() throws GitException { + switch (this.aim) { + case "lose": + this.caloriesCap = this.AMR*0.8; + break; + case "maintain": + this.caloriesCap = AMR; + break; + case "gain": + this.caloriesCap = this.AMR*1.2; + break; + default: + throw new InvalidAimException(); + } + } + + public void consumptionOfCalories(Food food) { + this.currentCalories = food.getCalories() + this.currentCalories; + if (this.currentCalories > this.caloriesCap) { + System.out.println("You have exceeded your calories intake!"); + System.out.println("You have consumed " + currentCalories + "kcal"); + System.out.println("when your target is " + caloriesCap + "kcal"); + } + } + +} diff --git a/src/test/java/git/GitTest.java b/src/test/java/git/GitTest.java index c0c312b000..3d15a7f0e4 100644 --- a/src/test/java/git/GitTest.java +++ b/src/test/java/git/GitTest.java @@ -13,7 +13,7 @@ public void executeCommand_invalidCommand_success() { Ui ui = Ui.getInstance(); Parser parser = new Parser(ui); String[] commandParts = {"nonsense", ""}; - parser.executeCommand(commandParts); + parser.executeCommand(commandParts, "grocery"); } catch (GitException e) { assertEquals("Unknown command. Type 'help' for a list of commands.", e.getMessage());; } From cfbaaeae48e35ff8948606ab6f48f4a009b7bb29 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 17:23:43 +0800 Subject: [PATCH 119/339] Handle some exception --- src/main/java/git/Git.java | 7 ++++++- src/main/java/git/Parser.java | 12 +++++++++++- src/main/java/git/Ui.java | 16 +++++++++++++--- text-ui-test/EXPECTED.TXT | 15 +-------------- text-ui-test/input.txt | 3 +-- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 5ace2a8f09..1b868e6528 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -26,7 +26,12 @@ public Git() { * Runs Git. */ private void run() { - String mode = ui.printWelcome(); + String mode = null; + try { + mode = ui.printWelcome(); + } catch (GitException e) { + System.out.println(e.getMessage()); + } while (isRunning) { try { String[] commandParts = parser.processCommandParts(); diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 0acb739a0f..ab29c33a45 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -63,17 +63,27 @@ public String[] processCommandParts() { */ public void executeCommand(String[] commandParts, String selectedMode) throws GitException { this.currentMode = selectedMode; - Mode mode = Mode.valueOf(currentMode.toUpperCase()); + Mode mode; + try { + mode = Mode.valueOf(currentMode.toUpperCase());; + } catch (Exception e) { + throw new InvalidCommandException(); + } switch (mode) { case GROCERY: groceryManagement(commandParts); break; + case CALORIES: caloriesManagement(commandParts); break; + case PROFILE: profileManagement(commandParts); break; + + default: + throw new InvalidCommandException(); } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index f5d1efb886..86e42368e5 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -6,6 +6,7 @@ import java.util.Scanner; import exceptions.GitException; +import exceptions.InvalidCommandException; import exceptions.InvalidCostException; import food.Food; import grocery.Grocery; @@ -48,7 +49,7 @@ public String getUserName() { /** * Prints welcome message. */ - public String printWelcome() { + public String printWelcome() throws GitException { final String gitlogo = " ______ _ _________\n" + " .' ___ | (_)| _ _ |\n" + @@ -80,17 +81,26 @@ public void printHello(String userName) { printLine(); } - public static void displayCommands(String selectedMode) { - Mode mode = Mode.valueOf(selectedMode.toUpperCase()); + public static void displayCommands(String selectedMode) throws GitException{ + Mode mode; + try { + mode = Mode.valueOf(selectedMode.toUpperCase());; + } catch (Exception e) { + throw new InvalidCommandException(); + } switch (mode) { case GROCERY: displayHelpForGrocery(); System.out.println("Enter command:"); printLine(); break; + case CALORIES: System.out.println("Enter command:"); break; + + default: + throw new InvalidCommandException(); } } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index bd36dadd95..4ee711b932 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -9,18 +9,5 @@ Hello from GiT What is your name? - - - - - Hello James Gosling! -Here are some ways you can use this app! -add GROCERY: adds the item GROCERY. -exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY. -amt GROCERY a/AMOUNT: sets the amount of GROCERY. -use GROCERY a/AMOUNT: updates the total amount after using a GROCERY -cost GROCERY $PRICE: updates the price of GROCERY. -del GROCERY: deletes GROCERY. -list: shows list of all groceries you have. -listC: shows the list sorted by price. -exit: exits the program. -help: view all the possible commands. -Enter command: -- - - - - -bye bye! - - - - - +Please select a mode: grocery, profile, calories or recipe: \ No newline at end of file diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 0ce8051ef6..f6ec2e9f95 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1,2 +1 @@ -James Gosling -exit \ No newline at end of file +James Gosling \ No newline at end of file From 7702023ce3a569790118a2a2b27be068a325ef40 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 17:32:58 +0800 Subject: [PATCH 120/339] Resolve failed gradle check --- src/main/java/enumerations/GroceryCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 559822e4a2..3dfee0e6c3 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -1,5 +1,5 @@ package enumerations; public enum GroceryCommand { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LOW, HELP, SWITCH, EXIT + ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT } From 8c4cc16e46e0829803b269965d871ee1d7b8fac6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 17:37:44 +0800 Subject: [PATCH 121/339] Fix checkstyle error --- src/main/java/food/FoodList.java | 2 -- src/main/java/user/UserInfo.java | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index 7adb7f8b48..df9f8e2aec 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -2,8 +2,6 @@ import exceptions.commands.EmptyFoodException; import git.Ui; -import grocery.Grocery; - import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index deaa484cb8..c5b977118b 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -1,6 +1,9 @@ package user; -import exceptions.*; +import exceptions.GitException; +import exceptions.InsufficientInfoException; +import exceptions.InvalidActivenessException; +import exceptions.InvalidAimException; import food.Food; public class UserInfo { From 6f63dd78005cf31589637c2cc341f8c32ac772f3 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 17:40:49 +0800 Subject: [PATCH 122/339] Fix error --- 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 4ee711b932..1165ccf4b7 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -10,4 +10,4 @@ What is your name? - - - - - Hello James Gosling! - - - - - -Please select a mode: grocery, profile, calories or recipe: \ No newline at end of file +Please select a mode: grocery, profile, calories or recipe: From e245a0d9b68327e2b85c793b036ffbbec42220df Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 19:22:31 +0800 Subject: [PATCH 123/339] Enable exit from the start --- src/main/java/enumerations/CalCommand.java | 5 + src/main/java/enumerations/Mode.java | 2 +- .../java/enumerations/ProfileCommand.java | 5 + src/main/java/git/Git.java | 15 +- src/main/java/git/Parser.java | 61 +++++-- src/main/java/git/Ui.java | 159 +++++++++++++++--- src/main/java/user/UserInfo.java | 18 +- 7 files changed, 225 insertions(+), 40 deletions(-) create mode 100644 src/main/java/enumerations/CalCommand.java create mode 100644 src/main/java/enumerations/ProfileCommand.java diff --git a/src/main/java/enumerations/CalCommand.java b/src/main/java/enumerations/CalCommand.java new file mode 100644 index 0000000000..6c9619c446 --- /dev/null +++ b/src/main/java/enumerations/CalCommand.java @@ -0,0 +1,5 @@ +package enumerations; + +public enum CalCommand { + EAT, VIEW, SWITCH, HELP, EXIT +} diff --git a/src/main/java/enumerations/Mode.java b/src/main/java/enumerations/Mode.java index 344b078e0f..26e3e782bb 100644 --- a/src/main/java/enumerations/Mode.java +++ b/src/main/java/enumerations/Mode.java @@ -1,5 +1,5 @@ package enumerations; public enum Mode { - GROCERY, PROFILE, CALORIES, RECIPE + GROCERY, PROFILE, CALORIES, RECIPE, MODE, EXIT, HELP } diff --git a/src/main/java/enumerations/ProfileCommand.java b/src/main/java/enumerations/ProfileCommand.java new file mode 100644 index 0000000000..6a4f3e5b38 --- /dev/null +++ b/src/main/java/enumerations/ProfileCommand.java @@ -0,0 +1,5 @@ +package enumerations; + +public enum ProfileCommand { + UPDATE, VIEW, SWITCH, HELP, EXIT +} diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 1b868e6528..e1e315af37 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -26,11 +26,16 @@ public Git() { * Runs Git. */ private void run() { + ui.printWelcome(); String mode = null; - try { - mode = ui.printWelcome(); - } catch (GitException e) { - System.out.println(e.getMessage()); + boolean isInitialised = false; + while (!isInitialised) { + try { + mode = Ui.switchMode(); + isInitialised = true; + } catch (GitException e) { + Ui.printLine(); + } } while (isRunning) { try { @@ -41,7 +46,7 @@ private void run() { } catch (GitException e) { System.out.println(e.getMessage()); } finally { - ui.printLine(); + Ui.printLine(); } } } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c5418d5048..48d2c548f7 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -1,6 +1,8 @@ package git; +import enumerations.CalCommand; +import enumerations.ProfileCommand; import exceptions.GitException; import exceptions.InvalidCommandException; import food.Food; @@ -30,7 +32,7 @@ public class Parser { public Parser(Ui ui) { groceryList = new GroceryList(); foodList = new FoodList(); - String userName = ui.getUserName(); + String userName = Ui.getUserName(); userInfo = new UserInfo(userName); this.ui = ui; isRunning = true; @@ -82,31 +84,54 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi profileManagement(commandParts); break; + case MODE: + currentMode = Ui.switchMode(); + break; + + case HELP: + Ui.displayHelp(); + break; + + case EXIT: + System.out.println("bye bye!"); + isRunning = false; + break; + default: throw new InvalidCommandException(); } } public void caloriesManagement(String[] commandParts) throws GitException { - String command = commandParts[0]; + CalCommand command; + try { + command = CalCommand.valueOf(commandParts[0].toUpperCase()); + } catch (Exception e) { + throw new InvalidCommandException(); + } + //String command = commandParts[0]; switch (command) { - case "eat": + case EAT: double calories = ui.promptForCalories(); Food food = new Food(commandParts[1], calories); foodList.addFood(food); userInfo.consumptionOfCalories(food); break; - case "view": + case VIEW: foodList.printFoods(); System.out.println("You have consumed " + userInfo.getCurrentCalories() + " calories for today"); break; - case "switch": + case SWITCH: currentMode = Ui.switchMode(); break; - case "exit": + case HELP: + Ui.displayHelpForCal(); + break; + + case EXIT: System.out.println("bye bye!"); isRunning = false; break; @@ -117,23 +142,37 @@ public void caloriesManagement(String[] commandParts) throws GitException { } public void profileManagement(String[] commandParts) throws GitException { - String command = commandParts[0]; + ProfileCommand command; + try { + command = ProfileCommand.valueOf(commandParts[0].toUpperCase()); + } catch (Exception e) { + throw new InvalidCommandException(); + } switch (command) { - case "update": + case UPDATE: + String name = ui.promptForName(); double weight = ui.promptForWeight(); double height = ui.promptForHeight(); int age = ui.promptForAge(); String gender = ui.promptForGender(); String activeness = ui.promptForActiveness(); String aim = ui.promptForAim(); - userInfo.updateInfo(weight,height,age,gender,activeness,aim); + userInfo.updateInfo(name, weight,height,age,gender,activeness,aim); break; - case "switch": + case VIEW: + System.out.println(userInfo.viewProfile()); + break; + + case SWITCH: currentMode = Ui.switchMode(); break; - case "exit": + case HELP: + Ui.displayHelpForProf(); + break; + + case EXIT: System.out.println("bye bye!"); isRunning = false; break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index c4fe1dded2..8a2b7d809c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -23,7 +23,7 @@ public class Ui { public static final String DIVIDER = "- - - - -"; private static Ui singleUi = null; private static Scanner in; - private String userName; + private static String userName; // METHODS /** @@ -43,14 +43,14 @@ public static Ui getInstance() { return singleUi; } - public String getUserName() { + public static String getUserName() { return userName; } /** * Prints welcome message. */ - public String printWelcome() throws GitException { + public void printWelcome() { final String gitlogo = " ______ _ _________\n" + " .' ___ | (_)| _ _ |\n" + @@ -65,11 +65,7 @@ public String printWelcome() throws GitException { printLine(); userName = in.nextLine(); printHello(userName); - System.out.println("Please select a mode: " + - "grocery, profile, calories or recipe:"); - String selectedMode = in.nextLine().trim(); - displayCommands(selectedMode); - return selectedMode; + displayHelp(); } /** @@ -97,7 +93,23 @@ public static void displayCommands(String selectedMode) throws GitException{ break; case CALORIES: + displayHelpForCal(); + System.out.println("Enter command:"); + printLine(); + break; + + case PROFILE: + displayHelpForProf(); System.out.println("Enter command:"); + printLine(); + break; + + case RECIPE: + System.out.println("Enter command:"); + break; + + case EXIT: + System.out.println("Enter anything again to confirm exit"); break; default: @@ -269,7 +281,13 @@ public double promptForCost() { } try { cost = convertCost(price); - break; + if (cost >= 0 ){ + break; + } else { + cost = 0; + System.out.println("Cost entered is invalid!"); + System.out.println("Please enter the cost (e.g., $1.20) or nil:"); + } } catch (GitException e) { System.out.println(e.getMessage()); } @@ -310,7 +328,13 @@ public int promptForThreshold(){ } try { threshold = Integer.parseInt(input); - break; + if (threshold >= 0 ){ + break; + } else { + threshold = 0; + System.out.println("Amount entered is invalid!"); + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + } } catch (NumberFormatException nfe) { System.out.println("Amount entered is invalid!"); System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); @@ -326,7 +350,13 @@ public double promptForCalories() { String input = in.nextLine().trim(); try { calories = Double.parseDouble(input); - break; + if (calories > 0 ){ + break; + } else { + calories = 0; + System.out.println("Calories entered is invalid!"); + System.out.println("Please enter the calories of the food in kcal:"); + } } catch (NumberFormatException nfe) { System.out.println("Calories entered is invalid!"); System.out.println("Please enter the calories of the food in kcal:"); @@ -335,6 +365,11 @@ public double promptForCalories() { return calories; } + public String promptForName() { + System.out.println("Please enter your name"); + return in.nextLine().trim(); + } + public double promptForWeight() { System.out.println("Please enter your weight in KG:"); double weight = 0; @@ -342,7 +377,13 @@ public double promptForWeight() { String input = in.nextLine().trim(); try { weight = Double.parseDouble(input); - break; + if (weight > 0 ){ + break; + } else { + weight = 0; + System.out.println("Weight entered is invalid!"); + System.out.println("Please enter your weight in KG:"); + } } catch (NumberFormatException nfe) { System.out.println("Weight entered is invalid!"); System.out.println("Please enter your weight in KG:"); @@ -358,7 +399,13 @@ public double promptForHeight() { String input = in.nextLine().trim(); try { height = Double.parseDouble(input); - break; + if (height > 0 ){ + break; + } else { + height = 0; + System.out.println("Height entered is invalid!"); + System.out.println("Please enter your height in cm:"); + } } catch (NumberFormatException nfe) { System.out.println("Height entered is invalid!"); System.out.println("Please enter your height in cm:"); @@ -374,7 +421,13 @@ public int promptForAge() { String input = in.nextLine().trim(); try { age = Integer.parseInt(input); - break; + if (age > 0 ){ + break; + } else { + age = 0; + System.out.println("Age entered is invalid!"); + System.out.println("Please enter your age in years:"); + } } catch (NumberFormatException nfe) { System.out.println("Age entered is invalid!"); System.out.println("Please enter your age in years:"); @@ -388,7 +441,9 @@ public String promptForGender() { String gender = ""; for (int i = 0; i < 5; i++) { String input = in.nextLine().trim(); - if (input.length() == 1) { + if (input.length() == 1 && + (input.equalsIgnoreCase("F") + || input.equalsIgnoreCase("M"))) { gender = input; break; } else { @@ -401,13 +456,41 @@ public String promptForGender() { public String promptForAim() { System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); - return in.nextLine().trim(); + String aim = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equalsIgnoreCase("lose") + || input.equalsIgnoreCase("maintain") + || input.equalsIgnoreCase("gain")) { + aim = input; + break; + } else { + System.out.println("Gender entered is invalid!"); + System.out.println("Please enter your age in years:"); + } + } + return aim; } public String promptForActiveness() { System.out.println("Please enter your activeness " + - "(e.g. inactive/light/moderate/active/very):):"); - return in.nextLine().trim(); + "(e.g. inactive/light/moderate/active/very):"); + String activeness = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equalsIgnoreCase("inactive") + || input.equalsIgnoreCase("light") + || input.equalsIgnoreCase("moderate") + || input.equalsIgnoreCase("active") + || input.equalsIgnoreCase("very")) { + activeness = input; + break; + } else { + System.out.println("Gender entered is invalid!"); + System.out.println("Please enter your age in years:"); + } + } + return activeness; } /** @@ -453,11 +536,12 @@ private String formatExpirationDate(String year, String month, String day) { return year + "-" + month + "-" + day; } - public static String switchMode() { + public static String switchMode() throws GitException { System.out.println("What mode would you like to switch to?"); System.out.println("Please select a mode: " + "grocery, profile, calories or recipe:"); String newMode = in.nextLine().trim(); + displayCommands(newMode); return newMode; } @@ -475,15 +559,48 @@ public static void displayHelpForGrocery() { "cost GROCERY $PRICE: updates the price of GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + - "listC: shows the list sorted by price.\n" + - "listE: shows the list sorted by expiration date.\n" + + "listc: shows the list sorted by price.\n" + + "liste: shows the list sorted by expiration date.\n" + "expiring: shows a list of groceries that are expiring soon.\n" + "low: shows a list of groceries that are low in stock.\n" + "exit: exits the program.\n" + + "switch: switches the mode.\n" + "help: view all the possible commands." ); } + public static void displayHelpForCal() { + System.out.println( + "Here are some ways you can manage your calories intake!\n" + + "eat FOOD: adds the food that you have eaten.\n" + + "view: adds the food you have eaten and total calories intake.\n" + + "switch: switches the mode.\n" + + "exit: exits the program.\n" + + "help: view all the possible commands for calories management." + ); + } + + public static void displayHelpForProf() { + System.out.println( + "Here are some ways you can manage your profile!\n" + + "update: stores information needed to manage your calories intake.\n" + + "view: view your profile details.\n" + + "switch: switches the mode.\n" + + "exit: exits the program.\n" + + "help: view all the possible commands for profile management." + ); + } + + public static void displayHelp() { + System.out.println( + "Here are some ways you can use our app!\n" + + "grocery: manages your calories.\n" + + "calories: manages your calories intake.\n" + + "profile: manages your profile\n" + + "exit: exits the program.\n" + ); + } + /** * Display help message for the user when adding grocery. */ diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index c5b977118b..2acfbc159e 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -74,8 +74,9 @@ public double getCurrentCalories() { return currentCalories; } - public void updateInfo(double weight, double height, int age, + public void updateInfo(String name, double weight, double height, int age, String gender, String activeness, String aim) { + setName(name); setWeight(weight); setHeight(height); setAge(age); @@ -144,7 +145,10 @@ private void setCaloriesCap() throws GitException { } } - public void consumptionOfCalories(Food food) { + public void consumptionOfCalories(Food food) throws GitException{ + if (this.weight == 0 || this.height == 0 || this.age == 0) { + throw new InsufficientInfoException(); + } this.currentCalories = food.getCalories() + this.currentCalories; if (this.currentCalories > this.caloriesCap) { System.out.println("You have exceeded your calories intake!"); @@ -153,4 +157,14 @@ public void consumptionOfCalories(Food food) { } } + public String viewProfile(){ + String userName = "Name: " + this.name + "\n"; + String height = "Height: " + this.height + "\n"; + String weight = "Weight: " + this.weight + "\n"; + String age = "Age: " + this.age + "\n"; + String gender = "Gender: " + this.gender + "\n"; + String target = "Target calories intake: " + this.caloriesCap; + return userName + height + weight + age + gender + target; + } + } From 83cb6ead215d08533424864536bf94df87ded1f0 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 19:25:00 +0800 Subject: [PATCH 124/339] Fix error in expected.txt --- text-ui-test/EXPECTED.TXT | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 1165ccf4b7..a887a556a3 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -10,4 +10,12 @@ What is your name? - - - - - Hello James Gosling! - - - - - +Here are some ways you can use our app! +grocery: manages your calories. +calories: manages your calories intake. +profile: manages your profile +exit: exits the program. + +What mode would you like to switch to? Please select a mode: grocery, profile, calories or recipe: + From 309b481df5aa63bc541526828c5b6505efe0f9d3 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 19:28:08 +0800 Subject: [PATCH 125/339] Fix error --- text-ui-test/EXPECTED.TXT | 1 - 1 file changed, 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index a887a556a3..644e57e639 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -18,4 +18,3 @@ exit: exits the program. What mode would you like to switch to? Please select a mode: grocery, profile, calories or recipe: - From 2cf4d01b1e6040204e460a3535d7b30cb498cdbe Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 2 Apr 2024 19:31:41 +0800 Subject: [PATCH 126/339] Add new test --- src/main/java/git/Ui.java | 2 +- text-ui-test/EXPECTED.TXT | 5 ++++- text-ui-test/input.txt | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 8a2b7d809c..e0299e3a5b 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -596,7 +596,7 @@ public static void displayHelp() { "Here are some ways you can use our app!\n" + "grocery: manages your calories.\n" + "calories: manages your calories intake.\n" + - "profile: manages your profile\n" + + "profile: manages your profile.\n" + "exit: exits the program.\n" ); } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 644e57e639..7622057996 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -13,8 +13,11 @@ Hello James Gosling! Here are some ways you can use our app! grocery: manages your calories. calories: manages your calories intake. -profile: manages your profile +profile: manages your profile. exit: exits the program. What mode would you like to switch to? Please select a mode: grocery, profile, calories or recipe: +Enter anything again to confirm exit +bye bye! +- - - - - diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..a998c92f2b 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1,3 @@ -James Gosling \ No newline at end of file +James Gosling +exit +exit \ No newline at end of file From 8fce83949732e04d6cc9c99930ca4d7823fb8192 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Tue, 2 Apr 2024 21:14:22 +0800 Subject: [PATCH 127/339] Update DG --- docs/UserGuide.md | 21 +++++++++++++++++++++ docs/diagrams/useAmt.png | Bin 24778 -> 24764 bytes docs/diagrams/useAmt.puml | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index abd9fbe891..68fa94dd92 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -29,6 +29,27 @@ Example of usage: `todo n/Refactor the User Guide to remove passive voice d/13/04/2020` +### Setting the amount of a grocery: `amt` +Sets the amount of a grocery. + +Format: `amt GROCERY a/AMOUNT` + +* The `DEADLINE` can be in a natural language format. +* The `TODO_NAME` cannot contain punctuation. + +Example of usage: + +`amt milk a/5` + +### Using a grocery: `use` +Reduce the amount of a grocery after using it. + +Format: `use GROCERY a/AMOUNT` + +Example of usage: + +`use milk a/4` + ## FAQ **Q**: How do I transfer my data to another computer? diff --git a/docs/diagrams/useAmt.png b/docs/diagrams/useAmt.png index ae54ae226dcbd6e4520af9595082aa256a829486..5739a75a35683200a0ff4639c12e4b0511d31ce9 100644 GIT binary patch literal 24764 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 literal 24778 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 V2ZhNM@TUT(^=_M83!Qfy`y1kB<4FJj diff --git a/docs/diagrams/useAmt.puml b/docs/diagrams/useAmt.puml index 7dc394bd1c..ee2bd07858 100644 --- a/docs/diagrams/useAmt.puml +++ b/docs/diagrams/useAmt.puml @@ -32,5 +32,9 @@ else else end ui --> user : message +deactivate ui +deactivate ui + + @enduml \ No newline at end of file From 44f2abe7a17320e8f3db1c154575a917531d33d7 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Tue, 2 Apr 2024 22:48:09 +0800 Subject: [PATCH 128/339] Add RATE command and prompt for rating and review --- .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/Parser.java | 6 +++ src/main/java/git/Ui.java | 44 ++++++++++++++----- src/main/java/grocery/Grocery.java | 25 ++++++++++- src/main/java/grocery/GroceryList.java | 17 ++++++- 5 files changed, 79 insertions(+), 15 deletions(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 3dfee0e6c3..e6d92137b0 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -1,5 +1,5 @@ package enumerations; public enum GroceryCommand { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT + ADD, DEL, EXP, AMT, TH, RATE, USE, COST, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 48d2c548f7..4004dfb1e5 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -28,6 +28,8 @@ public class Parser { /** * Constructs Parser. + * + * @param ui Ui object. */ public Parser(Ui ui) { groceryList = new GroceryList(); @@ -249,6 +251,10 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G case COST: groceryList.editCost(commandParts[1]); break; + + case RATE: + groceryList.editRatingAndReview(commandParts[1]); + break; default: throw new InvalidCommandException(); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e0299e3a5b..86a0d48338 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -343,6 +343,37 @@ public int promptForThreshold(){ return threshold; } + /** + * Prompts user for rating and review. + * + * @param grocery for rate and review. + */ + public static void promptForRatingAndReview(Grocery grocery) { + System.out.println("Please enter the rating from 1 to 5:"); + int rating = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + rating = Integer.parseInt(input); + if (rating >= 0 && rating <= 5){ + break; + } else { + rating = 0; + System.out.println("Rating entered is invalid!"); + System.out.println("Please enter the rating (e.g. 5):"); + } + } catch (NumberFormatException nfe) { + System.out.println("Rating entered is invalid!"); + System.out.println("Please enter the rating in integer(e.g. 5):"); + } + } + grocery.setRating(rating); + + System.out.println("Please enter the review:"); + String review = in.nextLine().trim(); + grocery.setReview(review); + } + public double promptForCalories() { System.out.println("Please enter the calories of the food in kcal:"); double calories = 0; @@ -523,18 +554,6 @@ private String convertMonthToNumber(String month) { return month; } - /** - * Reads expiration date from user input. - * - * @param year Year of expiration. - * @param month Month of expiration. - * @param day Day of expiration. - * @return Formatted expiration date. - */ - private String formatExpirationDate(String year, String month, String day) { - // This method can be enhanced to validate the date components - return year + "-" + month + "-" + day; - } public static String switchMode() throws GitException { System.out.println("What mode would you like to switch to?"); @@ -557,6 +576,7 @@ public static void displayHelpForGrocery() { "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + "th GROCERY a/AMOUNT: updates the threshold amount of GROCERY.\n" + "cost GROCERY $PRICE: updates the price of GROCERY.\n" + + "rate GROCERY: rates and reviews GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "listc: shows the list sorted by price.\n" + diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index b5a8db734d..8ddc79787e 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -18,6 +18,8 @@ public class Grocery { private String unit; private double cost; private String location; + private int rating; + private String review; /** @@ -31,7 +33,8 @@ public class Grocery { */ public Grocery(String name, int amount, int threshold, - LocalDate expiration, String category, double cost, String location) { + LocalDate expiration, String category, + double cost, String location) { this.name = name; this.amount = amount; this.threshold = threshold; @@ -40,6 +43,8 @@ public Grocery(String name, int amount, int threshold, setUnit(category); this.cost = cost; this.location = location; + this.rating = 0; + this.review = ""; } /** @@ -54,6 +59,8 @@ public Grocery(String name) { this.category = ""; this.cost = 0; this.location = null; + this.rating = 0; + this.review = ""; } // Getters and setters @@ -81,6 +88,14 @@ public int getThreshold() { return this.threshold; } + public int getRating() { + return this.rating; + } + + public String getReview() { + return this.review; + } + public void setName(String name) { this.name = name; } @@ -103,6 +118,14 @@ public String getUnit() { return unit; } + public void setRating(int rating) { + this.rating = rating; + } + + public void setReview(String review) { + this.review = review; + } + /** * Checks if the grocery is low in stock. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 63c85318aa..bb4812da81 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -55,7 +55,7 @@ public void addGrocery(Grocery grocery) throws EmptyGroceryException { Ui.printGroceryAdded(grocery); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { - System.out.println("Failed to add grocery: he groceries collection is null."); + System.out.println("Failed to add grocery: the groceries collection is null."); } catch (Exception e) { System.out.println("An unexpected error occurred while adding the grocery: " + e.getMessage()); } @@ -251,6 +251,21 @@ public void editThreshold(String details) throws GitException { } } + /** + * Updates the rating and review of an existing grocery. + * + * @param details A string containing grocery name and details. + * @throws GitException If the input grocery is empty. + */ + public void editRatingAndReview(String details) throws GitException { + if (details.isEmpty()) { + throw new EmptyGroceryException(); + } + Grocery grocery = getGrocery(details); + Ui.promptForRatingAndReview(grocery); + } + + /** * Lists all the user's groceries. */ From 590aa809033f6469ac5011cde8604f838f5d1b9a Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 3 Apr 2024 04:51:14 +0800 Subject: [PATCH 129/339] Add Location class, find Groceries method --- .../java/enumerations/GroceryCommand.java | 2 +- .../commands/CommandWrongFormatException.java | 27 +--- .../commands/EmptyFoodException.java | 12 -- .../commands/EmptyGroceryException.java | 16 --- .../commands/NoSuchGroceryException.java | 16 --- .../emptyinput/EmptyInputException.java | 15 +++ .../nosuch/NoSuchObjectException.java | 16 +++ src/main/java/food/FoodList.java | 8 +- src/main/java/git/Git.java | 2 + src/main/java/git/Parser.java | 87 +++++++++++-- src/main/java/git/Ui.java | 119 ++++++++++++++---- src/main/java/grocery/Grocery.java | 21 ++-- src/main/java/grocery/GroceryList.java | 87 +++++++++---- src/main/java/grocery/location/Location.java | 55 ++++++++ .../java/grocery/location/LocationList.java | 66 ++++++++++ src/test/java/grocery/GroceryListTest.java | 33 ++--- src/test/java/grocery/GroceryTest.java | 8 +- 17 files changed, 437 insertions(+), 153 deletions(-) delete mode 100644 src/main/java/exceptions/commands/EmptyFoodException.java delete mode 100644 src/main/java/exceptions/commands/EmptyGroceryException.java delete mode 100644 src/main/java/exceptions/commands/NoSuchGroceryException.java create mode 100644 src/main/java/exceptions/emptyinput/EmptyInputException.java create mode 100644 src/main/java/exceptions/nosuch/NoSuchObjectException.java create mode 100644 src/main/java/grocery/location/Location.java create mode 100644 src/main/java/grocery/location/LocationList.java diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 3dfee0e6c3..d4fc5e631c 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -1,5 +1,5 @@ package enumerations; public enum GroceryCommand { - ADD, DEL, EXP, AMT, TH, USE, COST, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT + ADD, DEL, EXP, AMT, TH, USE, COST, STORE, LOC, LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/exceptions/commands/CommandWrongFormatException.java b/src/main/java/exceptions/commands/CommandWrongFormatException.java index a80a87ee84..18cbc1f321 100644 --- a/src/main/java/exceptions/commands/CommandWrongFormatException.java +++ b/src/main/java/exceptions/commands/CommandWrongFormatException.java @@ -9,31 +9,16 @@ public class CommandWrongFormatException extends GitException { /** * Constructs CommandWrongFormatException. */ - public CommandWrongFormatException(String command) { - message = printWrongFormatFix(command); + public CommandWrongFormatException(String command, String parameter) { + message = printWrongFormatFix(command, parameter); } /** * Creates a message that reminds the user of the proper command format. */ - public String printWrongFormatFix(String command) { - StringBuilder message = new StringBuilder(); - message.append("Command is in the wrong format, type \"help\" for more information."); - message.append(System.lineSeparator()); - switch(command) { - case ("exp"): - message.append("exp needs 'd/'"); - break; - case ("amt"): - message.append("amt needs 'a/'"); - break; - case ("use"): - message.append("use needs 'a/'"); - break; - default: - // Do nothing - } - - return message.toString(); + public String printWrongFormatFix(String command, String parameter) { + return "Command is in the wrong format, type \"help\" for more information." + + System.lineSeparator() + + command + " needs '" + parameter + "'"; } } diff --git a/src/main/java/exceptions/commands/EmptyFoodException.java b/src/main/java/exceptions/commands/EmptyFoodException.java deleted file mode 100644 index 3d80741618..0000000000 --- a/src/main/java/exceptions/commands/EmptyFoodException.java +++ /dev/null @@ -1,12 +0,0 @@ -package exceptions.commands; - -import exceptions.GitException; - -public class EmptyFoodException extends GitException { - /** - * Constructs EmptyFoodException. - */ - public EmptyFoodException() { - message = "A food needs to be specified!"; - } -} diff --git a/src/main/java/exceptions/commands/EmptyGroceryException.java b/src/main/java/exceptions/commands/EmptyGroceryException.java deleted file mode 100644 index ee251df658..0000000000 --- a/src/main/java/exceptions/commands/EmptyGroceryException.java +++ /dev/null @@ -1,16 +0,0 @@ -package exceptions.commands; - -import exceptions.GitException; - -/** - * Represents the exception thrown when the grocery is not given after the command. - */ -public class EmptyGroceryException extends GitException { - /** - * Constructs EmptyGroceryException. - */ - public EmptyGroceryException() { - message = "A grocery needs to be specified!"; - } - -} diff --git a/src/main/java/exceptions/commands/NoSuchGroceryException.java b/src/main/java/exceptions/commands/NoSuchGroceryException.java deleted file mode 100644 index 794a9af6ff..0000000000 --- a/src/main/java/exceptions/commands/NoSuchGroceryException.java +++ /dev/null @@ -1,16 +0,0 @@ -package exceptions.commands; - - -import exceptions.GitException; - -/** - * Represents the exception thrown when the grocery to edit does not exist. - */ -public class NoSuchGroceryException extends GitException { - /** - * Constructs NoSuchGroceryException. - */ - public NoSuchGroceryException() { - message = "The grocery does not exist!"; - } -} diff --git a/src/main/java/exceptions/emptyinput/EmptyInputException.java b/src/main/java/exceptions/emptyinput/EmptyInputException.java new file mode 100644 index 0000000000..f659e9c3f9 --- /dev/null +++ b/src/main/java/exceptions/emptyinput/EmptyInputException.java @@ -0,0 +1,15 @@ +package exceptions.emptyinput; + +import exceptions.GitException; + +/** + * Represents the exception thrown when the input is not given after the command. + */ +public class EmptyInputException extends GitException { + /** + * Constructs EmptyInputException. + */ + public EmptyInputException(String input) { + message = "A " + input + " needs to be specified!"; + } +} diff --git a/src/main/java/exceptions/nosuch/NoSuchObjectException.java b/src/main/java/exceptions/nosuch/NoSuchObjectException.java new file mode 100644 index 0000000000..a42b1bfc20 --- /dev/null +++ b/src/main/java/exceptions/nosuch/NoSuchObjectException.java @@ -0,0 +1,16 @@ +package exceptions.nosuch; + + +import exceptions.GitException; + +/** + * Represents the exception thrown when the Object the code is looking for does not exist. + */ +public class NoSuchObjectException extends GitException { + /** + * Constructs NoSuchObjectException. + */ + public NoSuchObjectException(String object) { + message = "The " + object + " does not exist!"; + } +} diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index df9f8e2aec..02c233ebd2 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -1,6 +1,6 @@ package food; -import exceptions.commands.EmptyFoodException; +import exceptions.emptyinput.EmptyInputException; import git.Ui; import java.util.ArrayList; import java.util.List; @@ -9,15 +9,15 @@ public class FoodList { private List foods; /** - * Constructs GroceryList. + * Constructs FoodList. */ public FoodList() { foods = new ArrayList<>(); } - public void addFood(Food food) throws EmptyFoodException { + public void addFood(Food food) throws EmptyInputException { if (food.getName() == null) { - throw new EmptyFoodException(); + throw new EmptyInputException("food"); } try { diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index e1e315af37..22766df52b 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -27,6 +27,7 @@ public Git() { */ private void run() { ui.printWelcome(); + String mode = null; boolean isInitialised = false; while (!isInitialised) { @@ -37,6 +38,7 @@ private void run() { Ui.printLine(); } } + while (isRunning) { try { String[] commandParts = parser.processCommandParts(); diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 48d2c548f7..16284829b0 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -5,12 +5,15 @@ import enumerations.ProfileCommand; import exceptions.GitException; import exceptions.InvalidCommandException; +import exceptions.emptyinput.EmptyInputException; import food.Food; import food.FoodList; import grocery.Grocery; import grocery.GroceryList; import enumerations.Mode; import enumerations.GroceryCommand; +import grocery.location.Location; +import grocery.location.LocationList; import user.UserInfo; /** @@ -38,11 +41,6 @@ public Parser(Ui ui) { isRunning = true; } - - public String getCurrentMode() { - return currentMode; - } - /** * Processes a command and its details into a valid format for executing relevant code. * @@ -58,9 +56,10 @@ public String[] processCommandParts() { } /** - * Handles different types of commands. + * Handles all the user's commands depending on the selected mode. * - * @param commandParts Fragments of the command entered by user. + * @param commandParts Fragments of the command entered by the user. + * @param selectedMode Mode of GiT as selected by the user. * @throws GitException Exception thrown depending on specific error. */ public void executeCommand(String[] commandParts, String selectedMode) throws GitException { @@ -71,6 +70,7 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi } catch (Exception e) { throw new InvalidCommandException(); } + switch (mode) { case GROCERY: groceryManagement(commandParts); @@ -102,6 +102,12 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi } } + /** + * Handles commands related to calorie tracking. + * + * @param commandParts Fragments of the command entered by the user. + * @throws GitException Exception thrown depending on specific error. + */ public void caloriesManagement(String[] commandParts) throws GitException { CalCommand command; try { @@ -109,7 +115,7 @@ public void caloriesManagement(String[] commandParts) throws GitException { } catch (Exception e) { throw new InvalidCommandException(); } - //String command = commandParts[0]; + switch (command) { case EAT: double calories = ui.promptForCalories(); @@ -141,6 +147,12 @@ public void caloriesManagement(String[] commandParts) throws GitException { } } + /** + * Handles commands related to the user's profile. + * + * @param commandParts Fragments of the command entered by the user. + * @throws GitException Exception thrown depending on specific error. + */ public void profileManagement(String[] commandParts) throws GitException { ProfileCommand command; try { @@ -148,6 +160,7 @@ public void profileManagement(String[] commandParts) throws GitException { } catch (Exception e) { throw new InvalidCommandException(); } + switch (command) { case UPDATE: String name = ui.promptForName(); @@ -182,19 +195,31 @@ public void profileManagement(String[] commandParts) throws GitException { } } + /** + * Handles commands related to grocery management. + * + * @param commandParts Fragments of the command entered by the user. + * @throws GitException Exception thrown depending on specific error. + */ public void groceryManagement(String[] commandParts) throws GitException { assert commandParts.length == 2 : "Command passed in wrong format"; + GroceryCommand command; try { command = GroceryCommand.valueOf(commandParts[0].toUpperCase()); } catch (Exception e) { throw new InvalidCommandException(); } + int index = command.ordinal(); if (index <= GroceryCommand.DEL.ordinal()) { addOrDelGrocery(command, commandParts); - } else if (index <= GroceryCommand.COST.ordinal()) { - editGrocery(command,commandParts); + } else if (index <= GroceryCommand.STORE.ordinal()) { + editGrocery(command, commandParts); + } else if (index <= GroceryCommand.LISTL.ordinal()) { + handleLocationCommands(command, commandParts[1]); + } else if (index == GroceryCommand.FIND.ordinal()) { + groceryList.findGroceries(commandParts[1]); } else { viewListOrHelp(command); } @@ -210,6 +235,10 @@ public void groceryManagement(String[] commandParts) throws GitException { private void addOrDelGrocery(GroceryCommand command, String[] commandParts) throws GitException { switch (command) { case ADD: + String name = commandParts[1]; + if (name == null || name.isBlank()) { + throw new EmptyInputException("grocery"); + } Grocery grocery = new Grocery(commandParts[1]); ui.printAddMenu(grocery); groceryList.addGrocery(grocery); @@ -250,13 +279,44 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G groceryList.editCost(commandParts[1]); break; + case STORE: + groceryList.editLocation(commandParts[1]); + break; + + default: + throw new InvalidCommandException(); + } + } + + /** + * Handles commands related to locations. + * + * @param command Command keyword of data type Enum. + * @param name Location name. + * @throws GitException Exception thrown depending on specific error. + */ + private void handleLocationCommands(GroceryCommand command, String name) throws GitException { + switch (command) { + case LOC: + LocationList.addLocation(name); + break; + + case LISTL: + if (name.isBlank()) { + LocationList.listLocations(); + } else { + Location location = LocationList.findLocation(name); + location.listGroceries(); + } + break; + default: throw new InvalidCommandException(); } } /** - * Handles commands related to viewing the grocery list. + * Handles commands related to viewing the grocery list, getting help, or switching modes. * * @param command Command keyword of data type Enum. * @throws GitException Exception thrown depending on specific error. @@ -301,7 +361,12 @@ private void viewListOrHelp(GroceryCommand command) throws GitException { } } + // Getters public boolean getIsRunning() { return isRunning; } + + public String getCurrentMode() { + return currentMode; + } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e0299e3a5b..b6c666def2 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -8,11 +8,14 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; +import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; import grocery.Grocery; +import grocery.location.Location; import enumerations.Mode; +import grocery.location.LocationList; /** @@ -78,7 +81,7 @@ public void printHello(String userName) { printLine(); } - public static void displayCommands(String selectedMode) throws GitException{ + public static void displayCommands(String selectedMode) throws GitException { Mode mode; try { mode = Mode.valueOf(selectedMode.toUpperCase());; @@ -89,19 +92,16 @@ public static void displayCommands(String selectedMode) throws GitException{ case GROCERY: displayHelpForGrocery(); System.out.println("Enter command:"); - printLine(); break; case CALORIES: displayHelpForCal(); System.out.println("Enter command:"); - printLine(); break; case PROFILE: displayHelpForProf(); System.out.println("Enter command:"); - printLine(); break; case RECIPE: @@ -124,7 +124,6 @@ public static void displayCommands(String selectedMode) throws GitException{ */ public String[] processInput() { String commandLine = in.nextLine(); - assert !(commandLine.isEmpty()): "User input should be read"; String[] commandParts = commandLine.strip().split(" ", 2); assert commandParts.length > 0 : "Failed to read user input"; @@ -132,75 +131,85 @@ public String[] processInput() { } /** - * Prints the add grocery menu + * Prints the add grocery menu. * - * @param grocery The grocery to be added + * @param grocery The grocery to be added. */ public void printAddMenu(Grocery grocery) { - Ui ui = Ui.getInstance(); - System.out.println("Do you want to include the following details?"); System.out.println("1. Category"); System.out.println("2. Amount"); System.out.println("3. Location"); System.out.println("4. Expiration Date"); System.out.println("5. Cost"); - System.out.println("6. Threshhold Amount"); + System.out.println("6. Threshold Amount"); System.out.println("7. Help"); System.out.println("8. Skip"); System.out.println("Please enter the number of the details you want to include:"); System.out.println("You may enter multiple numbers. (e.g. 1234)"); // Reading the user input as a string - String input = ui.processInput()[0]; + String input = singleUi.processInput()[0]; // Iterating over each character in the string for (char choice : input.toCharArray()) { switch (choice) { case '1': System.out.println("Including Category"); - String category = ui.promptForCategory(); + String category = singleUi.promptForCategory(); grocery.setCategory(category); break; + case '2': System.out.println("Including Amount"); - int amount = ui.promptForAmount(); + int amount = singleUi.promptForAmount(); grocery.setAmount(amount); break; + case '3': System.out.println("Including Location"); - String location = ui.promptForLocation(); + Location location = singleUi.promptForLocation(); grocery.setLocation(location); + if (location != null) { + location.addGrocery(grocery); + } break; + case '4': System.out.println("Including Expiration Date"); - String expiration = ui.promptForExpiration(); + String expiration = singleUi.promptForExpiration(); try { grocery.setExpiration(expiration); } catch (PastExpirationDateException e) { e.printStackTrace(); } break; + case '5': System.out.println("Including Cost"); - Double cost = ui.promptForCost(); + Double cost = singleUi.promptForCost(); grocery.setCost(cost); break; + case '6': System.out.println("Including Threshold Amount"); - int threshold = ui.promptForThreshold(); + int threshold = singleUi.promptForThreshold(); grocery.setThreshold(threshold); break; + case '7': System.out.println("Displaying help"); - ui.displayAddHelp(); + singleUi.displayAddHelp(); break; + case '8': System.out.println("Skipping additional details"); break; + default: System.out.println("Invalid choice: " + choice); break; } + if (choice == '6') { break; } @@ -377,7 +386,7 @@ public double promptForWeight() { String input = in.nextLine().trim(); try { weight = Double.parseDouble(input); - if (weight > 0 ){ + if (weight > 0) { break; } else { weight = 0; @@ -495,11 +504,28 @@ public String promptForActiveness() { /** * Prompts the user to enter the location of the grocery. - * @return Location of grocery in String + * If the location is new, it is automatically created + * If left blank, location is set to null. + * + * @return Location of selected grocery. */ - public String promptForLocation() { + public Location promptForLocation() { System.out.println("Please enter the location (e.g. freezer first compartment)"); - return in.nextLine().trim(); + String name = in.nextLine().strip(); + + Location location; + try { + location = LocationList.findLocation(name); + } catch (NoSuchObjectException e1) { + try { + LocationList.addLocation(name); + location = LocationList.findLocation(name); + } catch (GitException e2) { + location = null; + } + } + + return location; } /** @@ -552,15 +578,18 @@ public static void displayHelpForGrocery() { System.out.println( "Here are some ways you can manage your groceries!\n" + "add GROCERY: adds the item GROCERY.\n" + + "loc LOCATION: adds a LOCATION to track.\n" + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + "th GROCERY a/AMOUNT: updates the threshold amount of GROCERY.\n" + "cost GROCERY $PRICE: updates the price of GROCERY.\n" + + "store GROCERY l/LOCATION: sets the location of GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + "listc: shows the list sorted by price.\n" + "liste: shows the list sorted by expiration date.\n" + + "listl [LOCATION]: shows all locations, or all groceries stored in [LOCATION].\n" + "expiring: shows a list of groceries that are expiring soon.\n" + "low: shows a list of groceries that are low in stock.\n" + "exit: exits the program.\n" + @@ -738,6 +767,52 @@ public static void printFoodAdded(Food food) { System.out.println(food.print() + " was consumed!"); } + /** + * Prints output when a location is added to LocationList. + * + * @param name Location name. + */ + public static void printLocationAdded(String name) { + System.out.println("New location added: " + name); + } + + /** + * Prints all locations. + * + * @param locations List of locations. + */ + public static void printLocationList(List locations) { + if (locations.isEmpty()) { + System.out.println("No locations are currently being tracked!"); + } else { + System.out.println("Here's all the locations you are tracking:"); + for (Location loc : locations) { + System.out.println(" - " + loc.getName()); + } + } + } + + /** + * Prints the new location set for the selected grocery. + * + * @param grocery The grocery that should be updated. + */ + public static void printLocationSet(Grocery grocery) { + assert !grocery.getLocation().getName().isEmpty() : "Grocery location should not be empty"; + System.out.println(grocery.getName() + " stored in " + grocery.getLocation().getName()); + } + + public static void printGroceriesFound(List groceries, String key) { + if (groceries.isEmpty()) { + System.out.println("No groceries contain: " + key); + } else { + System.out.println("Here are the groceries containing: " + key); + for (Grocery grocery: groceries) { + System.out.println(" - " + grocery.printGrocery()); + } + } + } + /** * Prints divider for user readability. diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index b5a8db734d..53b89732fd 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -3,6 +3,7 @@ import java.time.format.DateTimeFormatter; import exceptions.PastExpirationDateException; +import grocery.location.Location; /** @@ -17,7 +18,7 @@ public class Grocery { private String category; private String unit; private double cost; - private String location; + private Location location; /** @@ -29,9 +30,8 @@ public class Grocery { * @param category Category of grocery. * @param location Location of where the grocery is stored. */ - public Grocery(String name, int amount, int threshold, - LocalDate expiration, String category, double cost, String location) { + LocalDate expiration, String category, double cost, Location location) { this.name = name; this.amount = amount; this.threshold = threshold; @@ -73,7 +73,7 @@ public double getCost() { return this.cost; } - public String getLocation() { + public Location getLocation() { return this.location; } @@ -167,7 +167,7 @@ public void setCost(double cost) { this.cost = cost; } - public void setLocation(String location) { + public void setLocation(Location location) { this.location = location; } @@ -180,8 +180,8 @@ public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; String locationString; - if(this.location != null) { - locationString = ", location: " + this.location; + if (this.location != null) { + locationString = ", location: " + this.location.getName(); } else { locationString = ", location not set"; } @@ -193,6 +193,11 @@ public String printGrocery() { amountString = ", amount not set"; } + String unitString = ""; + if (unit != null) { + unitString = unit; + } + String exp; if (expiration != null) { exp = ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); @@ -207,7 +212,7 @@ public String printGrocery() { price = ", cost not set"; } - return this.name + " (" + this.category + ")" + amountString + this.unit + exp + price + locationString; + return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + locationString; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 63c85318aa..0413135b03 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,16 +1,18 @@ package grocery; +import exceptions.emptyinput.EmptyInputException; import git.Ui; import exceptions.GitException; +import exceptions.nosuch.NoSuchObjectException; import exceptions.LocalDateWrongFormatException; import exceptions.PastExpirationDateException; import exceptions.InvalidAmountException; import exceptions.InvalidCostException; import exceptions.CannotUseException; -import exceptions.commands.EmptyGroceryException; import exceptions.commands.IncompleteParameterException; -import exceptions.commands.NoSuchGroceryException; import exceptions.commands.CommandWrongFormatException; +import grocery.location.Location; +import grocery.location.LocationList; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -24,7 +26,7 @@ /** - * Stores all the user's groceries. + * Stores all the user's groceries in a main list. */ public class GroceryList { private List groceries; @@ -43,19 +45,14 @@ public GroceryList() { * Adds a grocery. * * @param grocery Grocery to be added. - * @throws EmptyGroceryException If grocery name == null. */ - public void addGrocery(Grocery grocery) throws EmptyGroceryException { - if (grocery.getName() == null) { - throw new EmptyGroceryException(); - } - + public void addGrocery(Grocery grocery) { try { groceries.add(grocery); Ui.printGroceryAdded(grocery); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { - System.out.println("Failed to add grocery: he groceries collection is null."); + System.out.println("Failed to add grocery: the grocery is null."); } catch (Exception e) { System.out.println("An unexpected error occurred while adding the grocery: " + e.getMessage()); } @@ -83,12 +80,12 @@ private boolean isGroceryExists(String name) { * * @param name Name of the grocery. * @return The needed grocery. - * @throws NoSuchGroceryException If the selected grocery does not exist. + * @throws NoSuchObjectException If the selected grocery does not exist. */ - private Grocery getGrocery(String name) throws NoSuchGroceryException { + private Grocery getGrocery(String name) throws NoSuchObjectException { int index = -1; for (Grocery grocery : groceries) { - if(grocery.getName().equals(name)) { + if(grocery.getName().equalsIgnoreCase(name)) { index = groceries.indexOf(grocery); break; } @@ -98,7 +95,7 @@ private Grocery getGrocery(String name) throws NoSuchGroceryException { assert groceries != null : "Found grocery should not be null"; return groceries.get(index); } else { - throw new NoSuchGroceryException(); + throw new NoSuchObjectException("grocery"); } } @@ -113,7 +110,7 @@ private Grocery getGrocery(String name) throws NoSuchGroceryException { */ private String[] checkDetails(String details, String command, String parameter) throws GitException { if (details.isEmpty()) { - throw new EmptyGroceryException(); + throw new EmptyInputException("grocery"); } // Split the input into the grocery name and the detail part. @@ -121,11 +118,11 @@ private String[] checkDetails(String details, String command, String parameter) // Check if the grocery exists if (!isGroceryExists(detailParts[0].strip())) { - throw new NoSuchGroceryException(); + throw new NoSuchObjectException("grocery"); } if (detailParts.length < 2) { - throw new CommandWrongFormatException(command); + throw new CommandWrongFormatException(command, parameter); } String attribute = detailParts[1].strip(); @@ -251,6 +248,48 @@ public void editThreshold(String details) throws GitException { } } + /** + * Updates the location of an existing grocery. + * + * @param details A string containing grocery name and details. + * @throws GitException Thrown if given location name is empty. + */ + public void editLocation(String details) throws GitException { + String[] locationParts = checkDetails(details, "store", "l/"); + Grocery grocery = getGrocery(locationParts[0].strip()); + String name = locationParts[1].strip(); + + Location location; + try { + location = LocationList.findLocation(name); + } catch (NoSuchObjectException e) { + LocationList.addLocation(name); + location = LocationList.findLocation(name); + } + + grocery.setLocation(location); + location.addGrocery(grocery); + Ui.printLocationSet(grocery); + } + + /** + * Searches for groceries containing the given keyword. + */ + public void findGroceries(String key) throws EmptyInputException { + if (key.isEmpty()) { + throw new EmptyInputException("keyword"); + } + + List relevantGroceries = new ArrayList<>(); + for (Grocery grocery : groceries) { + if(grocery.getName().toLowerCase().contains(key.toLowerCase())) { + relevantGroceries.add(grocery); + } + } + + Ui.printGroceriesFound(relevantGroceries, key); + } + /** * Lists all the user's groceries. */ @@ -331,18 +370,20 @@ public void sortByCost() { /** * Removes a grocery. * - * @param details User input. + * @param name Grocery name from user input. * @throws GitException If grocery is empty. */ - public void removeGrocery(String details) throws GitException { - assert (!groceries.isEmpty()) : "There is nothing to remove."; - if (details.isEmpty()) { - throw new EmptyGroceryException(); + public void removeGrocery(String name) throws GitException { + if (name.isEmpty()) { + throw new EmptyInputException("grocery"); } // Assuming the format is "del GROCERY" - Grocery grocery = getGrocery(details); + Grocery grocery = getGrocery(name); groceries.remove(grocery); + Location location = grocery.getLocation(); + location.removeGrocery(grocery); + Ui.printGroceryRemoved(grocery, groceries); } } diff --git a/src/main/java/grocery/location/Location.java b/src/main/java/grocery/location/Location.java new file mode 100644 index 0000000000..d46ebca356 --- /dev/null +++ b/src/main/java/grocery/location/Location.java @@ -0,0 +1,55 @@ +package grocery.location; + +import git.Ui; +import grocery.Grocery; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a location to store groceries. + */ +public class Location { + // ATTRIBUTES + private String name; + private List groceries; + + // METHODS + /** + * Constructs Location. + */ + public Location (String name) { + this.name = name; + groceries = new ArrayList<>(); + } + /** + * Adds a grocery to this location. + */ + public void addGrocery(Grocery grocery) { + groceries.add(grocery); + } + + /** + * Removes the specified grocery from this location. + */ + public void removeGrocery(Grocery grocery) { + groceries.remove(grocery); + } + + /** + * Lists all groceries stored at this location. + */ + public void listGroceries() { + System.out.println("Viewing location: " + name); + if (groceries.isEmpty()) { + Ui.printNoGrocery(); + } else { + Ui.printGroceryList(groceries); + } + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java new file mode 100644 index 0000000000..b93fd546d2 --- /dev/null +++ b/src/main/java/grocery/location/LocationList.java @@ -0,0 +1,66 @@ +package grocery.location; + +import exceptions.emptyinput.EmptyInputException; +import exceptions.nosuch.NoSuchObjectException; +import git.Ui; + +import java.util.ArrayList; +import java.util.List; + +/** + * Stores all the user's saved locations. + */ +public class LocationList { + // ATTRIBUTES + private static List locations = new ArrayList<>(); + + // METHODS + /** + * Adds a new location. + * + * @param name Name of location. + * @throws EmptyInputException Exception thrown if user does not input a location name. + */ + public static void addLocation(String name) throws EmptyInputException { + if (name == null || name.isBlank()) { + throw new EmptyInputException("location"); + } + + Location location = new Location(name.strip()); + locations.add(location); + Ui.printLocationAdded(name.strip()); + } + + /** + * Returns the desired location. + * + * @param name Name of location + * @throws NoSuchObjectException Thrown if the location does not exist. + */ + public static Location findLocation(String name) throws NoSuchObjectException { + if (locations.isEmpty()) { + throw new NoSuchObjectException("location"); + } + + int index = -1; + for (Location loc : locations) { + if(loc.getName().equalsIgnoreCase(name)) { + index = locations.indexOf(loc); + break; + } + } + + if (index != -1) { + return locations.get(index); + } else { + throw new NoSuchObjectException("location"); + } + } + + /** + * Lists all locations being tracked. + */ + public static void listLocations() { + Ui.printLocationList(locations); + } +} diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index f6cff17698..7ef01ab66f 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,25 +1,26 @@ package grocery; -import exceptions.commands.EmptyGroceryException; -import exceptions.commands.NoSuchGroceryException; import exceptions.commands.CommandWrongFormatException; import exceptions.CannotUseException; import exceptions.GitException; +import exceptions.nosuch.NoSuchObjectException; +import grocery.location.Location; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - import java.time.LocalDate; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + public class GroceryListTest { @Test public void editExpiration_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(),"Meat", 0, "Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(),"Meat", 0, new Location("Freezer"))); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { fail("editExpiration should not throw an exception"); @@ -32,7 +33,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { GroceryList gl = new GroceryList(); gl.editExpiration("nonexistentGrocery d/2024-07-19"); fail("Expected NoSuchGroceryException not thrown"); - } catch (NoSuchGroceryException e) { + } catch (NoSuchObjectException e) { assertEquals("The grocery does not exist!", e.getMessage()); } catch (GitException e) { fail("Expected NoSuchGroceryException, but another GitException was thrown"); @@ -43,7 +44,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { public void editExpiration_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, "Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, new Location("Freezer"))); gl.editExpiration("Meat d/2024-07-19"); } catch (GitException e) { String message = "Command is in the wrong format, type \"help\" for more information." + @@ -54,13 +55,13 @@ public void editExpiration_wrongFormat_exceptionThrown() { } @Test - public void addGrocery_throwIllegalArgument_exceptionThrown() { + public void addGrocery_throwNULL_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null, 0, 0, null, "Meat", 0, "Freezer")); // Use null to trigger the exception + gl.addGrocery(new Grocery(null)); fail("Expected IllegalArgumentException was not thrown."); - } catch (EmptyGroceryException e) { - assertEquals("A grocery needs to be specified!", e.getMessage()); + } catch (NullPointerException e) { + assertNull(e.getMessage()); } } @@ -68,7 +69,7 @@ public void addGrocery_throwIllegalArgument_exceptionThrown() { public void removeGrocery_groceryDelete_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("fooood", 0, 0, null, "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("fooood", 0, 0, null, "Meat", 0,new Location("Freezer"))); gl.removeGrocery("food"); fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { @@ -81,7 +82,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,new Location("Freezer"))); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (CommandWrongFormatException e) { @@ -98,7 +99,7 @@ public void editAmount_wrongFormat_exceptionThrown() { public void editAmountUseTrue_amountReaches0_success() { GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, 0, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 5, 0, LocalDate.now(), "Meat", 0,new Location("Freezer"))); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -110,7 +111,7 @@ public void editAmountUseTrue_amountReaches0_success() { public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,"Freezer")); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,new Location("Freezer"))); gl.editAmount("Meat a/5", true); fail("Expected a CannotUseException to be thrown"); } catch (CannotUseException e) { diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index a7375cf71d..a7c14f6f04 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -1,20 +1,22 @@ package grocery; import java.time.LocalDate; + +import grocery.location.Location; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,"Pantry"); + Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @Test public void printGrocery_costWrongFormat_formattedCost() { - Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,"Pantry"); + Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); @@ -22,7 +24,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { - Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,"Pantry"); + Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); From e09685a31bbaed244477c30548e7b2c83a2547a9 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Wed, 3 Apr 2024 11:03:08 +0800 Subject: [PATCH 130/339] Add new enumeration value and update exception handling in GroceryList --- src/main/java/enumerations/GroceryCommand.java | 1 + src/main/java/grocery/GroceryList.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index c4ef8663d1..bd18220217 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -3,3 +3,4 @@ public enum GroceryCommand { ADD, DEL, EXP, AMT, TH, RATE, USE, COST, STORE, LOC, LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT +} diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 233d359b27..f88ec13473 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -291,6 +291,7 @@ public void findGroceries(String key) throws EmptyInputException { Ui.printGroceriesFound(relevantGroceries, key); } + /** * Updates the rating and review of an existing grocery. * * @param details A string containing grocery name and details. @@ -298,7 +299,7 @@ public void findGroceries(String key) throws EmptyInputException { */ public void editRatingAndReview(String details) throws GitException { if (details.isEmpty()) { - throw new EmptyGroceryException(); + throw new EmptyInputException("grocery"); } Grocery grocery = getGrocery(details); Ui.promptForRatingAndReview(grocery); From a3d3c2ff8f44b5a745589e60ba1cc8686bfbdcc3 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Wed, 3 Apr 2024 11:11:42 +0800 Subject: [PATCH 131/339] Refactor code: Remove unnecessary enumeration values and fix indentation --- src/main/java/enumerations/GroceryCommand.java | 3 ++- src/main/java/grocery/Grocery.java | 2 +- src/main/java/grocery/GroceryList.java | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index bd18220217..437b10fd74 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -2,5 +2,6 @@ public enum GroceryCommand { - ADD, DEL, EXP, AMT, TH, RATE, USE, COST, STORE, LOC, LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT + ADD, DEL, EXP, AMT, TH, RATE, USE, COST, STORE, LOC, + LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 6c5f574c3f..400f3d2711 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -34,7 +34,7 @@ public class Grocery { * @param location Location of where the grocery is stored. */ public Grocery(String name, int amount, int threshold, - LocalDate expiration, String category, double cost, Location location) { + LocalDate expiration, String category, double cost, Location location) { this.name = name; this.amount = amount; this.threshold = threshold; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index f88ec13473..fd1d6602e6 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -249,7 +249,6 @@ public void editThreshold(String details) throws GitException { } /** - * Updates the location of an existing grocery. * * @param details A string containing grocery name and details. From 90225f97e6cd24f939f145e37e6e74f3ee4bdf6b Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 3 Apr 2024 12:39:41 +0800 Subject: [PATCH 132/339] Update User Guide --- docs/UserGuide.md | 129 ++++++++++++++---- docs/images/GitStartup.png | Bin 0 -> 2836 bytes .../featureExampleOutputs/FindExOut.png | Bin 0 -> 14355 bytes .../featureExampleOutputs/ListlExOut.png | Bin 0 -> 4560 bytes .../featureExampleOutputs/ListlLocExOut.png | Bin 0 -> 12812 bytes .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/Parser.java | 4 + src/main/java/git/Ui.java | 11 ++ src/main/java/grocery/location/Location.java | 9 ++ .../java/grocery/location/LocationList.java | 19 +++ 10 files changed, 147 insertions(+), 27 deletions(-) create mode 100644 docs/images/GitStartup.png create mode 100644 docs/images/featureExampleOutputs/FindExOut.png create mode 100644 docs/images/featureExampleOutputs/ListlExOut.png create mode 100644 docs/images/featureExampleOutputs/ListlLocExOut.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 68fa94dd92..1802707a58 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,54 +1,124 @@ -# User Guide +# User Guide to ***Grocery in Time*** -## Introduction +![Grocery in Time logo](images/GitStartup.png) -{Give a product intro} -## Quick Start +## Introduction -{Give steps to get started quickly} +Grocery in Time (GiT) is a **grocery tracker app**, optimised for use via a Command Line Interface (CLI). +It allows users to track and manage their groceries around their home easily. +  +## Quick Start 1. Ensure that you have Java 11 or above installed. -1. Down the latest version of `Duke` from [here](http://link.to/duke). +2. Down the latest version of `Grocery in Time` from [here](https://github.com/AY2324S2-CS2113-T12-2/tp/releases). +3. Open a command terminal, `cd` into the folder where the JAR file is + and use `java -jar Git.jar` to run Grocery in Time. +  ## 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` +> #### Notes about the command format +> * Words in `UPPERCASE` are parameters to be supplied by the user. +>
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. +> +> +> * Features requiring the `GROCERY` input are case-insensitive. +>
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. +  ### Setting the amount of a grocery: `amt` Sets the amount of a grocery. Format: `amt GROCERY a/AMOUNT` -* The `DEADLINE` can be in a natural language format. -* The `TODO_NAME` cannot contain punctuation. +* `AMOUNT` must be a valid integer. Example of usage: `amt milk a/5` +  ### Using a grocery: `use` Reduce the amount of a grocery after using it. Format: `use GROCERY a/AMOUNT` +* `AMOUNT` must be a valid integer. +* If `AMOUNT` is greater than what the `GROCERY` has in stock, its amount will be reduced to 0. +* If the amount of the `GROCERY` is already 0, GiT will let the user know and the amount stays at 0. + +Example of usage: + +`use meat a/4` + +  +### Finding groceries: `find` +Find groceries containing a given keyword. + +Format: `find KEYWORD` + +* The search is case-insensitive. +* If a phrase is passed, the entire phrase is searched for. + +Example of usage: + +`find cheese` +![Find example output](images/featureExampleOutputs/FindExOut.png) + + +  +### Adding a storage location: `loc` +Add a storage location to be tracked. + +Format: `loc LOCATION` + +Example of usage: + +`loc freezer` + +  +### Storing a grocery in a storage location: `store` +Store a grocery in a given storage location. + +Format: `store GROCERY l/LOCATION` + +* `LOCATION` is case-insensitive. e.g. `freezer` matches `FREEZER`. +* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. + +Example of usage: + +`store paprika l/spice rack` + +  +### Viewing storage locations and their groceries: `listl` +View all storage locations being tracked, or the groceries stored in a given location + +Format: `listl [LOCATION]` + +* `LOCATION` is an optional parameter. +* Without `LOCATION`, all storage locations will be displayed. +* With `LOCATION`, all groceries in the given `LOCATION` will be displayed + +Example of usage: + +* `listl` + +![Listl example output](images/featureExampleOutputs/ListlExOut.png) + +* `listl cubby` + +![Listl LOCATION example output](images/featureExampleOutputs/ListlLocExOut.png) + +  +### Removing a storage location: `delloc` +Remove a storage location from tracking. + +Format: `delloc LOCATION` + Example of usage: -`use milk a/4` +`delloc cabinet` ## FAQ @@ -58,6 +128,13 @@ Example of usage: ## Command Summary -{Give a 'cheat sheet' of commands here} -* Add todo `todo n/TODO_NAME d/DEADLINE` +| Command | Format and example | +|----------------------------------------------------------------|----------------------------| +| Set grocery amount | `amt GROCERY a/AMOUNT` | +| Use grocery | `use GROCERY a/AMOUNT` | +| Find groceries | `find KEYWORD` | +| Add storage location | `loc LOCATION` | +| Store grocery | `store GROCERY l/LOCATION` | +| View storage locations
View groceries in a given location | `listl [LOCATION]` | +| Remove storage location | `delloc LOCATION` | \ No newline at end of file diff --git a/docs/images/GitStartup.png b/docs/images/GitStartup.png new file mode 100644 index 0000000000000000000000000000000000000000..ee918626d3807d2e3c7e7c7649651b18b94da5d6 GIT binary patch literal 2836 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 J((Cua{vYPwaEbr` literal 0 HcmV?d00001 diff --git a/docs/images/featureExampleOutputs/ListlExOut.png b/docs/images/featureExampleOutputs/ListlExOut.png new file mode 100644 index 0000000000000000000000000000000000000000..e075d1457705c6b7a9e20ff543f161722739352d GIT binary patch literal 4560 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 Date: Wed, 3 Apr 2024 12:48:00 +0800 Subject: [PATCH 133/339] Fix checkstyle issues --- src/main/java/grocery/location/Location.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/grocery/location/Location.java b/src/main/java/grocery/location/Location.java index 913c79ff45..ab70214765 100644 --- a/src/main/java/grocery/location/Location.java +++ b/src/main/java/grocery/location/Location.java @@ -49,7 +49,8 @@ public void listGroceries() { } /** - * Sets the location attribute of all stored groceries to NULL. Called when a location is being removed from tracking. + * Sets the location attribute of all stored groceries to NULL. + * Called when a location is being removed from tracking. */ public void clearLocation() { for (Grocery grocery : groceries) { From b7422cb7a614b8e265b303a72491e30bfd35675e Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 3 Apr 2024 12:50:33 +0800 Subject: [PATCH 134/339] Edit User Guide --- docs/UserGuide.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 68fa94dd92..04967a49e1 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -50,6 +50,33 @@ Example of usage: `use milk a/4` +### List all groceries: `list` +Shows a list of all groceries you have. + +Format: `list` + +Example of usage: + +`list` + +### List all groceries by price: `listc` +Shows a list of all groceries you have, sorted by price. + +Format: `listc` + +Example of usage: + +`listc` + +### List all groceries by expiration date: `liste` +Shows a list of all groceries you have, sorted by expiration date. + +Format: `liste` + +Example of usage: + +`liste` + ## FAQ **Q**: How do I transfer my data to another computer? From 4b26cc259d7bd7ed089ec72bded48884d7735991 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 3 Apr 2024 13:41:41 +0800 Subject: [PATCH 135/339] Add editCategory --- .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/Parser.java | 4 +++- src/main/java/git/Ui.java | 9 ++++++-- src/main/java/grocery/Grocery.java | 1 + src/main/java/grocery/GroceryList.java | 22 +++++++++++++------ 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 437b10fd74..0603cf9adc 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -2,6 +2,6 @@ public enum GroceryCommand { - ADD, DEL, EXP, AMT, TH, RATE, USE, COST, STORE, LOC, + ADD, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 4a031eefca..c9d476df5a 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -267,7 +267,9 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G case EXP: groceryList.editExpiration(commandParts[1]); break; - + case CAT: + groceryList.editCategory(commandParts[1]); + break; case AMT: case USE: groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 666f346b67..8f32f7502e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -599,10 +599,11 @@ public static void displayHelpForGrocery() { "add GROCERY: adds the item GROCERY.\n" + "loc LOCATION: adds a LOCATION to track.\n" + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + + "cat GROCERY c/CATEGORY: edits the category for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + - "th GROCERY a/AMOUNT: updates the threshold amount of GROCERY.\n" + - "cost GROCERY $PRICE: updates the price of GROCERY.\n" + + "th GROCERY a/AMOUNT: edits the threshold amount of GROCERY.\n" + + "cost GROCERY $PRICE: edits the price of GROCERY.\n" + "store GROCERY l/LOCATION: sets the location of GROCERY.\n" + "rate GROCERY: rates and reviews GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + @@ -676,6 +677,10 @@ public static void printExpSet(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } + public static void printCategorySet(Grocery grocery){ + assert !(grocery.getCategory().isEmpty()): "grocery category should not be empty"; + System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); + } /** * Prints output after editing the selected grocery's cost. diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 400f3d2711..7f3c1be9cb 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -75,6 +75,7 @@ public int getAmount() { public LocalDate getExpiration() { return expiration; } + public String getCategory() {return this.category;} public double getCost() { return this.cost; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index fd1d6602e6..db66f412e5 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -165,13 +165,21 @@ public void editExpiration(String details) throws GitException { Ui.printExpSet(grocery); } - /** - * Sets the amount of an existing grocery. - * - * @param details User input. - * @param use True to reduce the amount of a grocery, false to set a new amount. - * @throws GitException Exception thrown depending on error. - */ + public void editCategory(String details) throws GitException { + String[] catParts = checkDetails(details, "cat", "c/"); + Grocery grocery = getGrocery(catParts[0].strip()); + String newCategory = catParts[1].strip(); + + grocery.setCategory(newCategory); + Ui.printCategorySet(grocery); + } + /** + * Sets the amount of an existing grocery. + * + * @param details User input. + * @param use True to reduce the amount of a grocery, false to set a new amount. + * @throws GitException Exception thrown depending on error. + */ public void editAmount(String details, boolean use) throws GitException { // Assuming the format is "amt GROCERY a/AMOUNT" String [] amtParts; From d3f9292eeedef3ed1f46bbb1c488d26e646b111e Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 3 Apr 2024 14:16:08 +0800 Subject: [PATCH 136/339] Add sortByCategory and rename listloc, listcost, listexp --- src/main/java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/Parser.java | 12 ++++++++---- src/main/java/git/Ui.java | 12 +++++++++--- src/main/java/grocery/GroceryList.java | 16 ++++++++++++++-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 0603cf9adc..82c9dc776e 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -3,5 +3,5 @@ public enum GroceryCommand { ADD, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, - LISTL, FIND, LIST, LISTC, LISTE, EXPIRING, LOW, HELP, SWITCH, EXIT + LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c9d476df5a..a93ff1297c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -218,7 +218,7 @@ public void groceryManagement(String[] commandParts) throws GitException { addOrDelGrocery(command, commandParts); } else if (index <= GroceryCommand.STORE.ordinal()) { editGrocery(command, commandParts); - } else if (index <= GroceryCommand.LISTL.ordinal()) { + } else if (index <= GroceryCommand.LISTLOC.ordinal()) { handleLocationCommands(command, commandParts[1]); } else if (index == GroceryCommand.FIND.ordinal()) { groceryList.findGroceries(commandParts[1]); @@ -309,7 +309,7 @@ private void handleLocationCommands(GroceryCommand command, String name) throws LocationList.addLocation(name); break; - case LISTL: + case LISTLOC: if (name.isBlank()) { LocationList.listLocations(); } else { @@ -335,11 +335,15 @@ private void viewListOrHelp(GroceryCommand command) throws GitException { groceryList.listGroceries(); break; - case LISTC: + case LISTCAT: + groceryList.sortByCategory(); + break; + + case LISTCOST: groceryList.sortByCost(); break; - case LISTE: + case LISTEXP: groceryList.sortByExpiration(); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 8f32f7502e..51831c6d81 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -608,9 +608,10 @@ public static void displayHelpForGrocery() { "rate GROCERY: rates and reviews GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "list: shows list of all groceries you have.\n" + - "listc: shows the list sorted by price.\n" + - "liste: shows the list sorted by expiration date.\n" + - "listl [LOCATION]: shows all locations, or all groceries stored in [LOCATION].\n" + + "listcat: shows the list sorted by category.\n" + + "listcost: shows the list sorted by price.\n" + + "listexp: shows the list sorted by expiration date.\n" + + "listloc [LOCATION]: shows all locations, or all groceries stored in [LOCATION].\n" + "expiring: shows a list of groceries that are expiring soon.\n" + "low: shows a list of groceries that are low in stock.\n" + "exit: exits the program.\n" + @@ -677,6 +678,11 @@ public static void printExpSet(Grocery grocery) { assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); } + /** + * Prints output after editing the selected grocery's category. + * + * @param grocery The grocery that should be updated. + */ public static void printCategorySet(Grocery grocery){ assert !(grocery.getCategory().isEmpty()): "grocery category should not be empty"; System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index db66f412e5..71344cc3d0 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -18,6 +18,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.logging.Logger; import java.util.logging.Level; @@ -164,7 +165,12 @@ public void editExpiration(String details) throws GitException { assert grocery.getExpiration().isEqual(date) : "Expiration date should be set correctly"; Ui.printExpSet(grocery); } - + /** + * Sets the category of an existing grocery. + * + * @param details User input. + * @throws GitException Exception thrown depending on error. + */ public void editCategory(String details) throws GitException { String[] catParts = checkDetails(details, "cat", "c/"); Grocery grocery = getGrocery(catParts[0].strip()); @@ -390,7 +396,13 @@ public void sortByCost() { Ui.printGroceryList(groceriesByDate); } } - + /** + * Sorts the groceries by category. + */ + public void sortByCategory(){ + Collections.sort(groceries, Comparator.comparing(Grocery::getCategory)); + Ui.printGroceryList(groceries); + } /** * Removes a grocery. * From 086581b380892aef5a31164af48ce3c38a81e1f1 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Wed, 3 Apr 2024 15:04:47 +0800 Subject: [PATCH 137/339] Fix indentation --- src/main/java/grocery/GroceryList.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index a0bd7812f5..cd72567ee6 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -179,13 +179,13 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); Ui.printCategorySet(grocery); } - /** - * Sets the amount of an existing grocery. - * - * @param details User input. - * @param use True to reduce the amount of a grocery, false to set a new amount. - * @throws GitException Exception thrown depending on error. - */ + /** + * Sets the amount of an existing grocery. + * + * @param details User input. + * @param use True to reduce the amount of a grocery, false to set a new amount. + * @throws GitException Exception thrown depending on error. + */ public void editAmount(String details, boolean use) throws GitException { // Assuming the format is "amt GROCERY a/AMOUNT" String [] amtParts; From ff06761ab1ed5d71d49f37f9d857472b1d36ddec Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 15:13:48 +0800 Subject: [PATCH 138/339] Added recipemanagement in Parser, but yet to implement all features --- docs/DeveloperGuide.md | 2 +- src/main/java/enumerations/RecipeCommand.java | 5 ++ src/main/java/git/Parser.java | 67 +++++++++++++++++-- src/main/java/git/ParserForRecipe.java | 23 +++++++ src/main/java/git/Ui.java | 37 +++++++++- 5 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 src/main/java/enumerations/RecipeCommand.java create mode 100644 src/main/java/git/ParserForRecipe.java diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e02bc338c1..2be5844c09 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -100,7 +100,7 @@ Furthermore, the app can generate a list of items that are expiring soon, remind | v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | | v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | | v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | - +| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook ## Non-Functional Requirements {Give non-functional requirements} diff --git a/src/main/java/enumerations/RecipeCommand.java b/src/main/java/enumerations/RecipeCommand.java new file mode 100644 index 0000000000..f29a90855f --- /dev/null +++ b/src/main/java/enumerations/RecipeCommand.java @@ -0,0 +1,5 @@ +package enumerations; + +public enum RecipeCommand { + ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP +} \ No newline at end of file diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index fe527238d4..5cf493b0f9 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -1,8 +1,7 @@ package git; -import enumerations.CalCommand; -import enumerations.ProfileCommand; +import enumerations.*; import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.emptyinput.EmptyInputException; @@ -10,8 +9,6 @@ import food.FoodList; import grocery.Grocery; import grocery.GroceryList; -import enumerations.Mode; -import enumerations.GroceryCommand; import grocery.location.Location; import grocery.location.LocationList; import user.UserInfo; @@ -24,6 +21,7 @@ public class Parser { private FoodList foodList; private UserInfo userInfo; private Ui ui; + private ParserForRecipe parserForRecipe; private boolean isRunning; private String currentMode; @@ -86,6 +84,10 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi profileManagement(commandParts); break; + case RECIPE: + recipeManagement(commandParts); + break; + case MODE: currentMode = Ui.switchMode(); break; @@ -197,6 +199,60 @@ public void profileManagement(String[] commandParts) throws GitException { } } + /** + * Handles commands related to recipe management. + * + * @param commandParts Fragments of the command entered by the user. + * @throws GitException Exception thrown depending on specific error. + */ + public void recipeManagement(String[] commandParts) throws GitException { + RecipeCommand command; + try { + command = RecipeCommand.valueOf(commandParts[0].toUpperCase()); + } catch (Exception e) { + throw new InvalidCommandException(); + } + + switch (command) { + case ADD: + String title = ui.promptForTitle(); + String ingredients = ui.promptForIngredients(); +// String steps = ui.promptForSteps(); +// userInfo.updateInfo(name, weight,height,age,gender,activeness,aim); + break; + + //edit + case LIST: + break; + //edit + case VIEW: + //System.out.println(userInfo.viewProfile()); + break; + //edit + case DELETE: + break; + + case SWITCH: + currentMode = Ui.switchMode(); + executeCommand(commandParts, currentMode); + break; + + case EXIT: + System.out.println("bye bye!"); + isRunning = false; + break; + + case HELP: + Ui.displayHelpForRecipe(); + break; + + + + default: + throw new InvalidCommandException(); + } + } + /** * Handles commands related to grocery management. * @@ -227,6 +283,9 @@ public void groceryManagement(String[] commandParts) throws GitException { } } + + + /** * Handles commands related to adding or deleting a grocery. * diff --git a/src/main/java/git/ParserForRecipe.java b/src/main/java/git/ParserForRecipe.java new file mode 100644 index 0000000000..94894c16f6 --- /dev/null +++ b/src/main/java/git/ParserForRecipe.java @@ -0,0 +1,23 @@ +package git; + +import enumerations.RecipeCommand; +import exceptions.GitException; +import exceptions.InvalidCommandException; + +public class ParserForRecipe { + + private Ui ui; + private boolean isRunning; + private String newMode; + private Parser parser; + + public boolean getIsRunning() { + return isRunning; + } + + public String getNewMode() { + return newMode; + } + + +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 71df441ffb..1362c1cd07 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -105,6 +105,7 @@ public static void displayCommands(String selectedMode) throws GitException { break; case RECIPE: + displayHelpForRecipe(); System.out.println("Enter command:"); break; @@ -253,6 +254,24 @@ public String promptForExpiration() { return expirationDate.toString(); // Formats to YYYY-MM-DD by default. } + /** + * Prompts user for title when adding recipe in RECIPE mode. + * @return the title of the recipe + */ + public String promptForTitle(){ + System.out.println("Please enter the title of this recipe (e.g. fried egg):"); + return in.nextLine().trim(); + } + + /** + * Prompts user for ingredients when adding recipe in RECIPE mode. + * @return the ingredients in a single line, unprocessed + */ + public String promptForIngredients(){ + System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); + return in.nextLine().trim(); + } + /** * Prompts user for category. */ @@ -582,7 +601,7 @@ private String convertMonthToNumber(String month) { public static String switchMode() throws GitException { - System.out.println("What mode would you like to switch to?"); + System.out.println("What mode would you like to enter?"); System.out.println("Please select a mode: " + "grocery, profile, calories or recipe:"); String newMode = in.nextLine().trim(); @@ -642,12 +661,26 @@ public static void displayHelpForProf() { ); } + public static void displayHelpForRecipe() { + System.out.println( + "Here are some ways you can manage your recipes!\n" + + "add: add a new recipe. \n" + + "list: list all your recipes. \n" + + "view TITLE: view your recipes details.\n" + + "delete TITLE: delete the recipe. \n" + + "switch: switches the mode.\n" + + "exit: exits the program.\n" + + "help: view all the possible commands for recipes management." + ); + } + public static void displayHelp() { System.out.println( "Here are some ways you can use our app!\n" + - "grocery: manages your calories.\n" + + "grocery: manages your groceries.\n" + "calories: manages your calories intake.\n" + "profile: manages your profile.\n" + + "recipe: manages your recipe. \n" + "exit: exits the program.\n" ); } From 756819a42be3f1b3bb16a9087f37cdf43fe9f189 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 18:55:17 +0800 Subject: [PATCH 139/339] Functioning add recipe --- src/main/java/git/Parser.java | 16 +++++++++---- src/main/java/git/Ui.java | 13 ++++++++++- src/main/java/recipe/Recipe.java | 22 +++++++++++++++++ src/main/java/recipe/RecipeList.java | 35 ++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/main/java/recipe/Recipe.java create mode 100644 src/main/java/recipe/RecipeList.java diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 5cf493b0f9..0a7bb51363 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -11,8 +11,14 @@ import grocery.GroceryList; import grocery.location.Location; import grocery.location.LocationList; +import recipe.Recipe; +import recipe.RecipeList; import user.UserInfo; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * Deals with commands entered by user. */ @@ -21,7 +27,7 @@ public class Parser { private FoodList foodList; private UserInfo userInfo; private Ui ui; - private ParserForRecipe parserForRecipe; + private RecipeList recipeList; private boolean isRunning; private String currentMode; @@ -37,6 +43,7 @@ public Parser(Ui ui) { foodList = new FoodList(); String userName = Ui.getUserName(); userInfo = new UserInfo(userName); + recipeList = new RecipeList(); this.ui = ui; isRunning = true; } @@ -217,8 +224,9 @@ public void recipeManagement(String[] commandParts) throws GitException { case ADD: String title = ui.promptForTitle(); String ingredients = ui.promptForIngredients(); -// String steps = ui.promptForSteps(); -// userInfo.updateInfo(name, weight,height,age,gender,activeness,aim); + String[] ingList = ingredients.split(","); + ArrayList ingArr = new ArrayList(Arrays.asList(ingList)); + recipeList.addRecipe(new Recipe(title, ingArr)); break; //edit @@ -246,8 +254,6 @@ public void recipeManagement(String[] commandParts) throws GitException { Ui.displayHelpForRecipe(); break; - - default: throw new InvalidCommandException(); } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 1362c1cd07..0db7dd045e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -16,6 +16,7 @@ import enumerations.Mode; import grocery.location.LocationList; +import recipe.Recipe; /** @@ -265,13 +266,23 @@ public String promptForTitle(){ /** * Prompts user for ingredients when adding recipe in RECIPE mode. - * @return the ingredients in a single line, unprocessed + * @return the ingredients in a single line, trimmed only */ public String promptForIngredients(){ System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); return in.nextLine().trim(); } + /** + * Informs the user that the recipe has been added to the recipe list. + * + * @param recipe Recipe added. + */ + public static void printRecipeAdded(Recipe recipe){ + assert !(recipe.getTitle().isEmpty()): "grocery name should not be empty"; + System.out.println(recipe.getTitle() + " added!"); + } + /** * Prompts user for category. */ diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java new file mode 100644 index 0000000000..2033ea456b --- /dev/null +++ b/src/main/java/recipe/Recipe.java @@ -0,0 +1,22 @@ +package recipe; + + +import java.util.ArrayList; + +public class Recipe { + private String title; + private ArrayList ingredients; + + public Recipe(String title, ArrayList ingredients) { + this.title = title; + this.ingredients = ingredients; + } + + public String getTitle() { + return title; + } + + public ArrayList getIngredients() { + return ingredients; + } +} diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java new file mode 100644 index 0000000000..def405f054 --- /dev/null +++ b/src/main/java/recipe/RecipeList.java @@ -0,0 +1,35 @@ +package recipe; + +import git.Ui; +import java.util.ArrayList; +import java.util.List; + +public class RecipeList { + private ArrayList recipeArr; + + /** + * Constructs RecipeList with recipe as an empty ArrayList. + */ + public RecipeList() { + recipeArr = new ArrayList<>(); + } + + /** + * Adds a recipe to the recipe list. + * + * @param recipe Recipe to be added. + */ + public void addRecipe(Recipe recipe) { + try { + recipeArr.add(recipe); + Ui.printRecipeAdded(recipe); + assert recipeArr.contains(recipe) : "Grocery should be added to the list"; + } catch (NullPointerException e) { + System.out.println("Failed to add recipe: the recipe is null."); + } catch (Exception e) { + System.out.println("An unexpected error occurred while adding the recipe: " + e.getMessage()); + } + + } + +} From ba2ea407bc7f0f790229f8d416246348300f2420 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 19:29:47 +0800 Subject: [PATCH 140/339] Delete and List function for recipeList completed. --- src/main/java/git/Parser.java | 8 ++-- src/main/java/git/Ui.java | 35 ++++++++++++++++- src/main/java/recipe/Recipe.java | 2 + src/main/java/recipe/RecipeList.java | 57 ++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 4 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 0a7bb51363..53120d989d 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -229,15 +229,17 @@ public void recipeManagement(String[] commandParts) throws GitException { recipeList.addRecipe(new Recipe(title, ingArr)); break; - //edit case LIST: + recipeList.listRecipes(); break; - //edit + case VIEW: //System.out.println(userInfo.viewProfile()); break; - //edit + case DELETE: + String recipeTitle = ui.promptForTitle(); + recipeList.removeRecipe(recipeTitle); break; case SWITCH: diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 0db7dd045e..b6d6d93b4c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -2,6 +2,7 @@ import java.time.DateTimeException; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -260,7 +261,7 @@ public String promptForExpiration() { * @return the title of the recipe */ public String promptForTitle(){ - System.out.println("Please enter the title of this recipe (e.g. fried egg):"); + System.out.println("Please enter the title of the recipe (e.g. fried egg):"); return in.nextLine().trim(); } @@ -283,6 +284,38 @@ public static void printRecipeAdded(Recipe recipe){ System.out.println(recipe.getTitle() + " added!"); } + /** + * Prints out when there are no recipe. + */ + public static void printNoRecipe() { + System.out.println("There's no recipe!"); + } + + /** + * Prints all recipes. + * + * @param recipeArr An array list of groceries. + */ + public static void printRecipeList(ArrayList recipeArr) { + assert !recipeArr.isEmpty() : "recipe list should not be empty"; + System.out.println("Here are your recipe titles!"); + int num = 1; + for (Recipe recipe: recipeArr) { + System.out.println(num + ". " + recipe.getTitle()); + num += 1; + } + } + + /** + * Prints output when the selected recipe is removed. + * + * @param recipe The recipe that is removed. + */ + public static void printRecipeRemoved(Recipe recipe) { + assert recipe != null : "Recipe does not exist"; + System.out.println(recipe.getTitle() + " is removed from the recipe list."); + } + /** * Prompts user for category. */ diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index 2033ea456b..4eb42a5ba6 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -19,4 +19,6 @@ public String getTitle() { public ArrayList getIngredients() { return ingredients; } + + } diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index def405f054..f7f6e37e29 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -1,6 +1,12 @@ package recipe; +import exceptions.GitException; +import exceptions.emptyinput.EmptyInputException; +import exceptions.nosuch.NoSuchObjectException; import git.Ui; +import grocery.Grocery; +import grocery.location.Location; + import java.util.ArrayList; import java.util.List; @@ -32,4 +38,55 @@ public void addRecipe(Recipe recipe) { } + /** + * Lists all the user's recipes. + */ + public void listRecipes() { + int size = recipeArr.size(); + if (size == 0) { + Ui.printNoRecipe(); + } else { + Ui.printRecipeList(recipeArr); + } + } + + /** + * Returns the desired recipe. + * + * @param title Title of the recipe. + * @return The specific recipe. + * @throws NoSuchObjectException If the selected grocery does not exist. + */ + private Recipe getRecipe(String title) throws NoSuchObjectException { + int index = -1; + for (Recipe recipe : recipeArr) { + if(recipe.getTitle().equalsIgnoreCase(title)) { + index = recipeArr.indexOf(recipe); + break; + } + } + + if (index != -1) { + assert recipeArr != null : "Found grocery should not be null"; + return recipeArr.get(index); + } else { + throw new NoSuchObjectException("recipe"); + } + } + + /** + * Removes a recipe. + * + * @param title Recipe title from user input. + * @throws GitException If recipe is empty. + */ + public void removeRecipe(String title) throws GitException { + if (title.isEmpty()) { + throw new EmptyInputException("recipe"); + } + + Recipe currRecipe = getRecipe(title); + recipeArr.remove(currRecipe); + Ui.printRecipeRemoved(currRecipe); + } } From 408aa60b21ee192d9ec4b9893244b82f24276b6d Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 19:44:59 +0800 Subject: [PATCH 141/339] View is working without steps. --- src/main/java/git/Parser.java | 4 +++- src/main/java/git/Ui.java | 4 ++-- src/main/java/recipe/Recipe.java | 9 +++++++-- src/main/java/recipe/RecipeList.java | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 53120d989d..2d638295f6 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -234,7 +234,9 @@ public void recipeManagement(String[] commandParts) throws GitException { break; case VIEW: - //System.out.println(userInfo.viewProfile()); + String titleView = ui.promptForTitle(); + Recipe recipeToView = recipeList.getRecipe(titleView); + recipeToView.viewRecipe(); break; case DELETE: diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index b6d6d93b4c..32736f1791 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -710,8 +710,8 @@ public static void displayHelpForRecipe() { "Here are some ways you can manage your recipes!\n" + "add: add a new recipe. \n" + "list: list all your recipes. \n" + - "view TITLE: view your recipes details.\n" + - "delete TITLE: delete the recipe. \n" + + "view: view your recipes details.\n" + + "delete: delete the recipe. \n" + "switch: switches the mode.\n" + "exit: exits the program.\n" + "help: view all the possible commands for recipes management." diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index 4eb42a5ba6..1a82cc173c 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -1,6 +1,5 @@ package recipe; - import java.util.ArrayList; public class Recipe { @@ -20,5 +19,11 @@ public ArrayList getIngredients() { return ingredients; } - + public void viewRecipe() { + System.out.println("Recipe title: " + title); + System.out.println("Ingredients: "); + for (String currIng : ingredients) { + System.out.println("- " + currIng); + } + } } diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index f7f6e37e29..c23ff82274 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -57,7 +57,7 @@ public void listRecipes() { * @return The specific recipe. * @throws NoSuchObjectException If the selected grocery does not exist. */ - private Recipe getRecipe(String title) throws NoSuchObjectException { + public Recipe getRecipe(String title) throws NoSuchObjectException { int index = -1; for (Recipe recipe : recipeArr) { if(recipe.getTitle().equalsIgnoreCase(title)) { From 519895806fad3a212b0b94336121cdbd7b47c6cb Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 20:00:42 +0800 Subject: [PATCH 142/339] Recipe manager completed --- src/main/java/git/Parser.java | 9 ++++++--- src/main/java/git/Ui.java | 9 +++++++++ src/main/java/recipe/Recipe.java | 31 +++++++++++++++++++++++-------- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 2d638295f6..4e84a5585a 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -224,9 +224,12 @@ public void recipeManagement(String[] commandParts) throws GitException { case ADD: String title = ui.promptForTitle(); String ingredients = ui.promptForIngredients(); - String[] ingList = ingredients.split(","); - ArrayList ingArr = new ArrayList(Arrays.asList(ingList)); - recipeList.addRecipe(new Recipe(title, ingArr)); + String[] ingredientsList = ingredients.split("[,]"); + ArrayList ingredientsArr = new ArrayList(Arrays.asList(ingredientsList)); + String steps = ui.promptForSteps(); + String[] stepsList = steps.split("[.]"); + ArrayList stepsArr = new ArrayList(Arrays.asList(stepsList)); + recipeList.addRecipe(new Recipe(title, ingredientsArr, stepsArr)); break; case LIST: diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 32736f1791..e4a7c96f97 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -274,6 +274,15 @@ public String promptForIngredients(){ return in.nextLine().trim(); } + /** + * Prompts user for steps when adding recipe in RECIPE mode. + * @return the steps in a single line, trimmed only + */ + public String promptForSteps(){ + System.out.println("Please enter the steps for this recipe in one line (e.g. Fry the egg. Add salt. Serve.):"); + return in.nextLine().trim(); + } + /** * Informs the user that the recipe has been added to the recipe list. * diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index 1a82cc173c..5bea7d6590 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -6,24 +6,39 @@ public class Recipe { private String title; private ArrayList ingredients; - public Recipe(String title, ArrayList ingredients) { + private ArrayList steps; + + /** + * Constructs a Recipe. + * + * @param title Title of the recipe. + * @param ingredients Ingredients to be stored in the recipe. + * @param steps Steps to be stored in the recipe. + */ + public Recipe(String title, ArrayList ingredients, ArrayList steps) { this.title = title; this.ingredients = ingredients; + this.steps = steps; } public String getTitle() { return title; } - public ArrayList getIngredients() { - return ingredients; - } - + /** + * Prints the title, ingredients and steps of the recipe. + */ public void viewRecipe() { - System.out.println("Recipe title: " + title); + System.out.println("Recipe title: " + title + "\n"); System.out.println("Ingredients: "); - for (String currIng : ingredients) { - System.out.println("- " + currIng); + for (String currIngredient : ingredients) { + System.out.println("- " + currIngredient); + } + System.out.println("\nSteps: "); + int index = 1; + for (String currStep : steps) { + System.out.println(index + ": " + currStep); + index += 1; } } } From acb7402dad2626407fcd958af4cd39f80f83c8ab Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 20:42:45 +0800 Subject: [PATCH 143/339] Edit imports in files. --- src/main/java/enumerations/RecipeCommand.java | 2 +- src/main/java/git/Parser.java | 7 ++++-- src/main/java/git/ParserForRecipe.java | 23 ------------------- src/main/java/recipe/RecipeList.java | 3 --- 4 files changed, 6 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/git/ParserForRecipe.java diff --git a/src/main/java/enumerations/RecipeCommand.java b/src/main/java/enumerations/RecipeCommand.java index f29a90855f..4c3c534d4d 100644 --- a/src/main/java/enumerations/RecipeCommand.java +++ b/src/main/java/enumerations/RecipeCommand.java @@ -2,4 +2,4 @@ public enum RecipeCommand { ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP -} \ No newline at end of file +} diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 4e84a5585a..1ad9b4964e 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -1,7 +1,11 @@ package git; -import enumerations.*; +import enumerations.CalCommand; +import enumerations.GroceryCommand; +import enumerations.Mode; +import enumerations.ProfileCommand; +import enumerations.RecipeCommand; import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.emptyinput.EmptyInputException; @@ -17,7 +21,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.List; /** * Deals with commands entered by user. diff --git a/src/main/java/git/ParserForRecipe.java b/src/main/java/git/ParserForRecipe.java deleted file mode 100644 index 94894c16f6..0000000000 --- a/src/main/java/git/ParserForRecipe.java +++ /dev/null @@ -1,23 +0,0 @@ -package git; - -import enumerations.RecipeCommand; -import exceptions.GitException; -import exceptions.InvalidCommandException; - -public class ParserForRecipe { - - private Ui ui; - private boolean isRunning; - private String newMode; - private Parser parser; - - public boolean getIsRunning() { - return isRunning; - } - - public String getNewMode() { - return newMode; - } - - -} diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index c23ff82274..1128653234 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -4,11 +4,8 @@ import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import git.Ui; -import grocery.Grocery; -import grocery.location.Location; import java.util.ArrayList; -import java.util.List; public class RecipeList { private ArrayList recipeArr; From 730057af13063bc572d9f60245b179223bac0ee8 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 20:47:40 +0800 Subject: [PATCH 144/339] Edit minor formatting --- src/main/java/git/Ui.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e4a7c96f97..5ef1728c32 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -655,8 +655,7 @@ private String convertMonthToNumber(String month) { public static String switchMode() throws GitException { System.out.println("What mode would you like to enter?"); - System.out.println("Please select a mode: " + - "grocery, profile, calories or recipe:"); + System.out.println("Please select a mode: " + "grocery, profile, calories or recipe:"); String newMode = in.nextLine().trim(); displayCommands(newMode); return newMode; From 60586f8d5ab2ff7eeb420f55173b420d20cd2229 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Wed, 3 Apr 2024 20:49:59 +0800 Subject: [PATCH 145/339] Update user guide --- docs/UserGuide.md | 100 +++++++++++++++++++++++++++++++++++++- src/main/java/git/Ui.java | 2 +- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2acb78e115..f1f4c8886c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -52,6 +52,51 @@ Example of usage: `use meat a/4` +  +### Setting the cost of a grocery: `cost` +Sets the cost of a grocery. + +Format: `cost GROCERY $PRICE` + +* `PRICE` must be a valid integer. + +Example of usage: + +`cost milk $1.20` + +  +### Setting the threshold of a grocery: `th` +Sets the threshold amount of a grocery. +The user should be reminded to top up the stock if amount falls below the threshold amount. + +Format: `th GROCERY a/AMOUNT` + +* `AMOUNT` must be a valid integer. + +Example of usage: + +`th milk 1` + +  +### View a list of groceries that are low in stock: `low` +Shows a list of groceries below the threshold amount. + +Format: `low` + +Example of usage: + +`low` + +  +### Switch between different modes: `switch` +Switches between profile, calories, grocery or recipe mode. + +Format: `switch` + +Example of usage: + +`switch` +   ### Finding groceries: `find` Find groceries containing a given keyword. @@ -147,6 +192,49 @@ Example of usage: `liste` +## Calories management mode + +### Add eaten food: `eat` +Adds the food eaten and store its calories. + +Format: `eat FOOD` + +Example of usage: + +`eat burger` + +  +### View all food and calories intake: `view` +Shows all the food consumed so far and their calories. + +Format: `view` + +Example of usage: + +`view` + +## Profile management mode + +### Update user information: `update` +Stores information needed to calculate and manage calories intake. + +Format: `update` + +Example of usage: + +`update` + +  +### View user details: `view` +Shows the user profile details. + +Format: `view` + +Example of usage: + +`view` + + ## FAQ **Q**: How do I transfer my data to another computer? @@ -159,9 +247,19 @@ Example of usage: | Command | Format and example | |----------------------------------------------------------------|----------------------------| | Set grocery amount | `amt GROCERY a/AMOUNT` | +| Set grocery cost | `cost GROCERY $PRICE` | +| Set grocery threshold amount | `th GROCERY a/AMOUNT` | +| View groceries that are low in stock | `low` | | Use grocery | `use GROCERY a/AMOUNT` | | Find groceries | `find KEYWORD` | | Add storage location | `loc LOCATION` | | Store grocery | `store GROCERY l/LOCATION` | | View storage locations
View groceries in a given location | `listl [LOCATION]` | -| Remove storage location | `delloc LOCATION` | \ No newline at end of file +| Remove storage location | `delloc LOCATION` | +| List all groceries | `list` | +| List all groceries by price | `listcost` | +| Switch between modes | `switch` | +| Add food consumed | `eat FOOD` | +| View consumed food and their calories | `view` | +| Update user information | `update` | +| View user details | `view` | \ No newline at end of file diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index e6c989cc31..34f1203afe 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -626,7 +626,7 @@ public static void displayHelpForCal() { System.out.println( "Here are some ways you can manage your calories intake!\n" + "eat FOOD: adds the food that you have eaten.\n" + - "view: adds the food you have eaten and total calories intake.\n" + + "view: shows the food you have eaten and total calories intake.\n" + "switch: switches the mode.\n" + "exit: exits the program.\n" + "help: view all the possible commands for calories management." From b00def428ec90fc6e1bc6dc1c042147eda8e0065 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 21:00:15 +0800 Subject: [PATCH 146/339] Edited EXPTECTED.TXT --- src/main/java/git/Ui.java | 1 - text-ui-test/EXPECTED.TXT | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 5ef1728c32..294a84b76d 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -652,7 +652,6 @@ private String convertMonthToNumber(String month) { return month; } - public static String switchMode() throws GitException { System.out.println("What mode would you like to enter?"); System.out.println("Please select a mode: " + "grocery, profile, calories or recipe:"); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 7622057996..ba4453eff2 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -16,7 +16,7 @@ calories: manages your calories intake. profile: manages your profile. exit: exits the program. -What mode would you like to switch to? +What mode would you like to enter? Please select a mode: grocery, profile, calories or recipe: Enter anything again to confirm exit bye bye! From 75281a202968cfc3a6a78726e2fa70bc55b518ee Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 21:04:57 +0800 Subject: [PATCH 147/339] Minor Editing --- 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 ba4453eff2..84ebd5b35e 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -11,7 +11,7 @@ What is your name? Hello James Gosling! - - - - - Here are some ways you can use our app! -grocery: manages your calories. +grocery: manages your groceries. calories: manages your calories intake. profile: manages your profile. exit: exits the program. From 9a6fc9a6e343621c3cd9011676b292c8774c6e64 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 21:06:34 +0800 Subject: [PATCH 148/339] Minor Edits --- text-ui-test/EXPECTED.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 84ebd5b35e..d6fe97c510 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -14,6 +14,7 @@ Here are some ways you can use our app! grocery: manages your groceries. calories: manages your calories intake. profile: manages your profile. +recipe: manages your recipe. exit: exits the program. What mode would you like to enter? From 4e1cbadecba6669649d21bf7b755ce54f3fed47e Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 21:34:27 +0800 Subject: [PATCH 149/339] Update User Guide --- docs/UserGuide.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f1f4c8886c..7208946d72 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -234,6 +234,66 @@ Example of usage: `view` +## Recipe management mode + +### Add new recipe: `add` +Adds new recipe, ingredient and steps. + +Format: `add` + +Example of usage: + +`add` + +Please enter the title of the recipe: + +`Fried Egg` + +Please enter the ingredients for this recipe in one line: + +`egg, salt` + +Please enter the steps for this recipe in one line: + +`Fry the egg. Add salt. Serve.` + +Fried Egg added! + +  +### List all the recipes: `list` +Shows all the recipe titles. + +Format: `list` + +  +### View a recipe: `view` +Shows the recipe ingredients and steps. + +Format: `view` `RECIPE` + +Example of usage: + +`view` + +Please enter the title of the recipe: + +`Fried Egg` + +  +### Delete a recipe: `delete` +Shows the recipe ingredients and steps. + +Format: `delete` `RECIPE` + +Example of usage: + +`delete` + +Please enter the title of the recipe: + +`Fried Egg` + +Fried Egg is removed from the recipe list. ## FAQ From f0a1f97986dce3ff304efdda88276ff5e71e006f Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 21:39:44 +0800 Subject: [PATCH 150/339] Updates User Guide --- docs/UserGuide.md | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 7208946d72..708647619a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -304,22 +304,26 @@ Fried Egg is removed from the recipe list. ## Command Summary -| Command | Format and example | -|----------------------------------------------------------------|----------------------------| -| Set grocery amount | `amt GROCERY a/AMOUNT` | -| Set grocery cost | `cost GROCERY $PRICE` | -| Set grocery threshold amount | `th GROCERY a/AMOUNT` | -| View groceries that are low in stock | `low` | -| Use grocery | `use GROCERY a/AMOUNT` | -| Find groceries | `find KEYWORD` | -| Add storage location | `loc LOCATION` | -| Store grocery | `store GROCERY l/LOCATION` | -| View storage locations
View groceries in a given location | `listl [LOCATION]` | -| Remove storage location | `delloc LOCATION` | -| List all groceries | `list` | -| List all groceries by price | `listcost` | -| Switch between modes | `switch` | -| Add food consumed | `eat FOOD` | -| View consumed food and their calories | `view` | -| Update user information | `update` | -| View user details | `view` | \ No newline at end of file +| Command | Format and example | +|----------------------------------------------------------------|-------------------------------------| +| Set grocery amount | `amt GROCERY a/AMOUNT` | +| Set grocery cost | `cost GROCERY $PRICE` | +| Set grocery threshold amount | `th GROCERY a/AMOUNT` | +| View groceries that are low in stock | `low` | +| Use grocery | `use GROCERY a/AMOUNT` | +| Find groceries | `find KEYWORD` | +| Add storage location | `loc LOCATION` | +| Store grocery | `store GROCERY l/LOCATION` | +| View storage locations
View groceries in a given location | `listl [LOCATION]` | +| Remove storage location | `delloc LOCATION` | +| List all groceries | `list` | +| List all groceries by price | `listcost` | +| Switch between modes | `switch` | +| Add food consumed | `eat FOOD` | +| View consumed food and their calories | `view` | +| Update user information | `update` | +| View user details | `view` | +| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | +| List all recipes | `list` | +| View recipe details | `view` `TITLE` | +| Delete recipe | `delete` `TITLE` | \ No newline at end of file From 9b40adfaf18bd16b8826ae6a4dae2fde646ade45 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Wed, 3 Apr 2024 21:59:29 +0800 Subject: [PATCH 151/339] Add sequence diagram for calorieManagement method --- docs/DeveloperGuide.md | 8 ++++++++ docs/diagrams/CaloriesManagement.png | Bin 0 -> 44038 bytes 2 files changed, 8 insertions(+) create mode 100644 docs/diagrams/CaloriesManagement.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2be5844c09..1fca6bdc0e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,6 +7,14 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} + +### _Designs_ +### 1. Calories Management Mode +![Commands for managing calories](./diagrams/CaloriesManagement.png) + * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. + * if `eat`, store the name and calories of the input food + * if `view`, display all the foods consumed + ### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. diff --git a/docs/diagrams/CaloriesManagement.png b/docs/diagrams/CaloriesManagement.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd66f72e6acb224a5488f86bf492d921a96850e GIT binary patch literal 44038 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 Q;`>yUw6>*g-Fx!?0Dp-jtN;K2 literal 0 HcmV?d00001 From 60ee88e1d716e4c7b9636affb0a7f80be9e2d91c Mon Sep 17 00:00:00 2001 From: lsiyi Date: Wed, 3 Apr 2024 22:57:28 +0800 Subject: [PATCH 152/339] Add grocery management commands and fix expiration date validation --- docs/UserGuide.md | 82 ++++++++++++++++++++++---- src/main/java/grocery/Grocery.java | 4 ++ src/main/java/grocery/GroceryList.java | 3 +- 3 files changed, 76 insertions(+), 13 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 708647619a..77214cc0c8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -26,6 +26,51 @@ It allows users to track and manage their groceries around their home easily. > * Features requiring the `GROCERY` input are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. +## grocery management mode + +### Adding a new grocery: `add` +Adds a grocery. + +Format: `add GROCERY` + +* `Grocery` must be a valid String. + +Example of usage: + +`add milk` + +  +### Setting the expiration date of a grocery: `exp` +Sets the expiration date of a grocery. + +Format: `exp GROCERY d/EXPIRATION_DATE` + +* `EXPIRATION_DATE` must be a in yyyy-MM-dd format. + +Example of usage: + +`exp milk d/2024-07-20` + +  +### Adding Details to a Grocery: Extended Options +After executing add GROCERY, you will see: +``` +Do you want to include the following details? +1. Category +2. Amount +3. Location +4. Expiration Date +5. Cost +6. Threshold Amount +7. Help +8. Skip +Please enter the number of the details you want to include: +You may enter multiple numbers. (e.g. 1234) +``` +Example of usage : + +`124` +   ### Setting the amount of a grocery: `amt` Sets the amount of a grocery. @@ -122,6 +167,16 @@ Example of usage: `loc freezer` +  +### Adding rating and review of a grocery: `rate` +Adds rating and review of an existing grocery + +Format: `rate GROCERY` + +Example of usage: + +`rate milk` +   ### Storing a grocery in a storage location: `store` Store a grocery in a given storage location. @@ -136,10 +191,10 @@ Example of usage: `store paprika l/spice rack`   -### Viewing storage locations and their groceries: `listl` +### Viewing storage locations and their groceries: `listloc` View all storage locations being tracked, or the groceries stored in a given location -Format: `listl [LOCATION]` +Format: `listloc [LOCATION]` * `LOCATION` is an optional parameter. * Without `LOCATION`, all storage locations will be displayed. @@ -147,11 +202,11 @@ Format: `listl [LOCATION]` Example of usage: -* `listl` +* `listloc` ![Listl example output](images/featureExampleOutputs/ListlExOut.png) -* `listl cubby` +* `listloc cubby` ![Listl LOCATION example output](images/featureExampleOutputs/ListlLocExOut.png) @@ -174,23 +229,23 @@ Example of usage: `list` -### List all groceries by price: `listc` +### List all groceries by price: `listcost` Shows a list of all groceries you have, sorted by price. -Format: `listc` +Format: `listcost` Example of usage: -`listc` +`listcost` -### List all groceries by expiration date: `liste` +### List all groceries by expiration date: `listexp` Shows a list of all groceries you have, sorted by expiration date. -Format: `liste` +Format: `listexp` Example of usage: -`liste` +`listexp` ## Calories management mode @@ -306,6 +361,8 @@ Fried Egg is removed from the recipe list. | Command | Format and example | |----------------------------------------------------------------|-------------------------------------| +| Add grocery | `add GROCERY` | +| Set grocery expiration date | `exp GROCERY d/EXPIRATION_DATE` | | Set grocery amount | `amt GROCERY a/AMOUNT` | | Set grocery cost | `cost GROCERY $PRICE` | | Set grocery threshold amount | `th GROCERY a/AMOUNT` | @@ -313,11 +370,14 @@ Fried Egg is removed from the recipe list. | Use grocery | `use GROCERY a/AMOUNT` | | Find groceries | `find KEYWORD` | | Add storage location | `loc LOCATION` | +| Rate and review groceries | `rate GROCERY` | | Store grocery | `store GROCERY l/LOCATION` | -| View storage locations
View groceries in a given location | `listl [LOCATION]` | +| View storage locations
View groceries in a given location | `listloc [LOCATION]` | | Remove storage location | `delloc LOCATION` | | List all groceries | `list` | | List all groceries by price | `listcost` | +| List all groceries by expiration date | `listexp` | +| View all groceries expiring in the next 3 days | `expiring` | | Switch between modes | `switch` | | Add food consumed | `eat FOOD` | | View consumed food and their calories | `view` | diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 7f3c1be9cb..e86dcb8359 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -75,6 +75,7 @@ public int getAmount() { public LocalDate getExpiration() { return expiration; } + public String getCategory() {return this.category;} public double getCost() { @@ -171,6 +172,9 @@ public void setUnit(String category) { */ public void setExpiration(String expiration) throws PastExpirationDateException { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; + if(expiration == null||expiration.isEmpty()) { + throw new IllegalArgumentException("Expiration date entered is invalid!"); + } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate expirationDate = LocalDate.parse(expiration, formatter); diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index cd72567ee6..6738252469 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -160,11 +160,10 @@ public void editExpiration(String details) throws GitException { System.out.println(e.getMessage()); } - // Verification and UI feedback - assert grocery.getExpiration().isEqual(date) : "Expiration date should be set correctly"; Ui.printExpSet(grocery); } + /** * Sets the category of an existing grocery. * From 71f9d9a3a743328c03b5a4a419dcfa775cd1298f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 3 Apr 2024 23:01:51 +0800 Subject: [PATCH 153/339] Update switch feature in User Guide --- docs/UserGuide.md | 32 ++++++++++++------ .../featureExampleOutputs/SwitchExOut.png | Bin 0 -> 6754 bytes 2 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 docs/images/featureExampleOutputs/SwitchExOut.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 708647619a..c1adbcd82d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -26,7 +26,23 @@ It allows users to track and manage their groceries around their home easily. > * Features requiring the `GROCERY` input are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. +## Switch between different modes: `switch` +Switches between profile, calories, grocery or recipe mode. +GiT comes in different modes and will prompt the user to choose their desired mode. + +Format: `switch` + +* Enter the desired mode to switch to after inputting `switch`. + +Example of usage: + +`switch` + +![Switch example output](images/featureExampleOutputs/SwitchExOut.png) +   +## Grocery management mode + ### Setting the amount of a grocery: `amt` Sets the amount of a grocery. @@ -87,16 +103,6 @@ Example of usage: `low` -  -### Switch between different modes: `switch` -Switches between profile, calories, grocery or recipe mode. - -Format: `switch` - -Example of usage: - -`switch` -   ### Finding groceries: `find` Find groceries containing a given keyword. @@ -165,6 +171,7 @@ Example of usage: `delloc cabinet` +  ### List all groceries: `list` Shows a list of all groceries you have. @@ -174,6 +181,7 @@ Example of usage: `list` +  ### List all groceries by price: `listc` Shows a list of all groceries you have, sorted by price. @@ -183,6 +191,7 @@ Example of usage: `listc` +  ### List all groceries by expiration date: `liste` Shows a list of all groceries you have, sorted by expiration date. @@ -192,6 +201,7 @@ Example of usage: `liste` +  ## Calories management mode ### Add eaten food: `eat` @@ -213,6 +223,7 @@ Example of usage: `view` +  ## Profile management mode ### Update user information: `update` @@ -234,6 +245,7 @@ Example of usage: `view` +  ## Recipe management mode ### Add new recipe: `add` diff --git a/docs/images/featureExampleOutputs/SwitchExOut.png b/docs/images/featureExampleOutputs/SwitchExOut.png new file mode 100644 index 0000000000000000000000000000000000000000..0f35032a26cbbb4cca890bbf456a6fdadcb4d2be GIT binary patch literal 6754 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 literal 0 HcmV?d00001 From 019433462a0054d6d37e59ad2d22f7e00dc3bdc0 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 23:04:15 +0800 Subject: [PATCH 154/339] Edit remark not working yet. --- .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/Parser.java | 4 +++ src/main/java/git/Ui.java | 34 +++++++++++++++++-- src/main/java/grocery/Grocery.java | 18 +++++++++- src/main/java/grocery/GroceryList.java | 14 ++++++++ 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index 2deff8420e..a24b5ce0cd 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -2,6 +2,6 @@ public enum GroceryCommand { ADD, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, DELLOC, - LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, EXIT + LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, REMARK, EXIT } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index f24eff7a99..e21a678d48 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -366,6 +366,10 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G groceryList.editLocation(commandParts[1]); break; + case REMARK: + groceryList.editRemark(commandParts[1]); + break; + default: throw new InvalidCommandException(); } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 00ce02550c..79db622a85 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -146,8 +146,9 @@ public void printAddMenu(Grocery grocery) { System.out.println("4. Expiration Date"); System.out.println("5. Cost"); System.out.println("6. Threshold Amount"); - System.out.println("7. Help"); - System.out.println("8. Skip"); + System.out.println("7. Remark"); + System.out.println("8. Help"); + System.out.println("9. Skip"); System.out.println("Please enter the number of the details you want to include:"); System.out.println("You may enter multiple numbers. (e.g. 1234)"); @@ -200,11 +201,17 @@ public void printAddMenu(Grocery grocery) { break; case '7': + System.out.println("Including Remark"); + String remark = singleUi.promptForRemark(); + grocery.setRemark(remark); + break; + + case '8': System.out.println("Displaying help"); singleUi.displayAddHelp(); break; - case '8': + case '9': System.out.println("Skipping additional details"); break; @@ -256,6 +263,16 @@ public String promptForExpiration() { return expirationDate.toString(); // Formats to YYYY-MM-DD by default. } + /** + * Prompts user for remark for grocery. + * @return the remark to be added. + */ + public String promptForRemark(){ + System.out.println("Please enter the remark for this grocery:"); + return in.nextLine().trim(); + } + + /** * Prompts user for title when adding recipe in RECIPE mode. * @return the title of the recipe @@ -672,6 +689,7 @@ public static void displayHelpForGrocery() { "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "cat GROCERY c/CATEGORY: edits the category for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + + "remark GROCERY r/REMARK: sets the remark of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + "th GROCERY a/AMOUNT: edits the threshold amount of GROCERY.\n" + "cost GROCERY $PRICE: edits the price of GROCERY.\n" + @@ -774,6 +792,16 @@ public static void printCategorySet(Grocery grocery){ System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); } + /** + * Prints output after editing the selected grocery's remark. + * + * @param grocery The grocery that should be updated. + */ + public static void printRemarkSet(Grocery grocery){ + assert !(grocery.getRemark().isEmpty()): "grocery category should not be empty"; + System.out.println(grocery.getName() + " is updated with this remark: " + grocery.getRemark()); + } + /** * Prints output after editing the selected grocery's cost. * diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 7f3c1be9cb..389e8b2e97 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -21,6 +21,7 @@ public class Grocery { private Location location; private int rating; private String review; + private String remark; @@ -127,6 +128,14 @@ public void setReview(String review) { this.review = review; } + public void setRemark(String remark) { + this.remark = remark; + } + + public String getRemark() { + return remark; + } + /** * Checks if the grocery is low in stock. * @@ -236,7 +245,14 @@ public String printGrocery() { price = ", cost not set"; } - return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + locationString; + String remarkString; + if (remark != null) { + remarkString = ", remark: " + remark + " "; + } else { + remarkString = ", remark not set"; + } + + return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + locationString + remarkString; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index cd72567ee6..23a3e488e2 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -179,6 +179,20 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); Ui.printCategorySet(grocery); } + /** + * Sets the remark of an existing grocery. + * + * @param details User input. + * @throws GitException Exception thrown depending on error. + */ + public void editRemark(String details) throws GitException { + String[] remarkParts = checkDetails(details, "remark", "r/"); + Grocery grocery = getGrocery(remarkParts[0].strip()); + String newRemark = remarkParts[1].strip(); + + grocery.setRemark(newRemark); + Ui.printRemarkSet(grocery); + } /** * Sets the amount of an existing grocery. * From cb8af6bdb4655d7f01984f6b6935d73a26c047cf Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 23:12:55 +0800 Subject: [PATCH 155/339] Removed Edit Remark --- src/main/java/git/Parser.java | 4 ---- src/main/java/git/Ui.java | 11 ----------- src/main/java/grocery/Grocery.java | 4 ---- src/main/java/grocery/GroceryList.java | 14 -------------- 4 files changed, 33 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index e21a678d48..f24eff7a99 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -366,10 +366,6 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G groceryList.editLocation(commandParts[1]); break; - case REMARK: - groceryList.editRemark(commandParts[1]); - break; - default: throw new InvalidCommandException(); } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 79db622a85..3a3a2c86aa 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -689,7 +689,6 @@ public static void displayHelpForGrocery() { "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "cat GROCERY c/CATEGORY: edits the category for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + - "remark GROCERY r/REMARK: sets the remark of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + "th GROCERY a/AMOUNT: edits the threshold amount of GROCERY.\n" + "cost GROCERY $PRICE: edits the price of GROCERY.\n" + @@ -792,16 +791,6 @@ public static void printCategorySet(Grocery grocery){ System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); } - /** - * Prints output after editing the selected grocery's remark. - * - * @param grocery The grocery that should be updated. - */ - public static void printRemarkSet(Grocery grocery){ - assert !(grocery.getRemark().isEmpty()): "grocery category should not be empty"; - System.out.println(grocery.getName() + " is updated with this remark: " + grocery.getRemark()); - } - /** * Prints output after editing the selected grocery's cost. * diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 389e8b2e97..3288820017 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -132,10 +132,6 @@ public void setRemark(String remark) { this.remark = remark; } - public String getRemark() { - return remark; - } - /** * Checks if the grocery is low in stock. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 23a3e488e2..cd72567ee6 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -179,20 +179,6 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); Ui.printCategorySet(grocery); } - /** - * Sets the remark of an existing grocery. - * - * @param details User input. - * @throws GitException Exception thrown depending on error. - */ - public void editRemark(String details) throws GitException { - String[] remarkParts = checkDetails(details, "remark", "r/"); - Grocery grocery = getGrocery(remarkParts[0].strip()); - String newRemark = remarkParts[1].strip(); - - grocery.setRemark(newRemark); - Ui.printRemarkSet(grocery); - } /** * Sets the amount of an existing grocery. * From cf5b13f324155126b8423f70b8210800dc99b266 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 23:18:38 +0800 Subject: [PATCH 156/339] Edit Test --- src/test/java/grocery/GroceryTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index a7c14f6f04..bf080d3677 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -10,7 +10,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); - String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry"; + String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } @@ -18,7 +18,7 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; + + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } @@ -26,7 +26,7 @@ public void printGrocery_costWrongFormat_formattedCost() { public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; + + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } From 7cef07cf6861f30d09268daa97968328afffa270 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Wed, 3 Apr 2024 23:21:11 +0800 Subject: [PATCH 157/339] Minor edits --- src/main/java/grocery/Grocery.java | 3 ++- src/test/java/grocery/GroceryTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 3288820017..782c8a8af9 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -248,7 +248,8 @@ public String printGrocery() { remarkString = ", remark not set"; } - return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + locationString + remarkString; + return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + + locationString + remarkString; } } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index bf080d3677..2079175c99 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -10,7 +10,8 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); - String message = "apple (fruit), amount not set, expiration date not set, cost not set, location: Pantry, remark not set"; + String message = "apple (fruit), amount not set, expiration date not set, " + + "cost not set, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } From f9c25206e12cdbd93bebe37be47e21e86c64836c Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Thu, 4 Apr 2024 12:56:33 +0800 Subject: [PATCH 158/339] Resolve merge conflicts in UG --- docs/DeveloperGuide.md | 3 ++- docs/UserGuide.md | 8 -------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1fca6bdc0e..60adfe5fa1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -108,7 +108,8 @@ Furthermore, the app can generate a list of items that are expiring soon, remind | v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | | v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | | v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | -| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook +| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | + ## Non-Functional Requirements {Give non-functional requirements} diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b184a081c4..590367fe2d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -235,12 +235,8 @@ Example of usage: `list` -<<<<<<< HEAD   -### List all groceries by price: `listc` -======= ### List all groceries by price: `listcost` ->>>>>>> 732ea24123b4e0ef53fc087a8f3d9f6f74f64b49 Shows a list of all groceries you have, sorted by price. Format: `listcost` @@ -249,12 +245,8 @@ Example of usage: `listcost` -<<<<<<< HEAD   -### List all groceries by expiration date: `liste` -======= ### List all groceries by expiration date: `listexp` ->>>>>>> 732ea24123b4e0ef53fc087a8f3d9f6f74f64b49 Shows a list of all groceries you have, sorted by expiration date. Format: `listexp` From 517ca53404e005a7a85be2727e9709e7028f550f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Fri, 5 Apr 2024 12:27:04 +0800 Subject: [PATCH 159/339] Update UG --- docs/UserGuide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 590367fe2d..17827328d8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -159,6 +159,7 @@ Format: `find KEYWORD` Example of usage: `find cheese` + ![Find example output](images/featureExampleOutputs/FindExOut.png) From 3a4a525b199d61577c11ae024f43c45ef85524d0 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 09:46:40 +0800 Subject: [PATCH 160/339] Add my PPP --- docs/luoyu-uwu.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/luoyu-uwu.md diff --git a/docs/luoyu-uwu.md b/docs/luoyu-uwu.md new file mode 100644 index 0000000000..e2b9386db8 --- /dev/null +++ b/docs/luoyu-uwu.md @@ -0,0 +1,32 @@ +# Luo Yu's Project Portfolio Page +## Project: Grocery in Time +Grocery in Time is a desktop application used for keeping track of groceries. +The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. + +Given below are my contributions to the project. +* New Feature: Added the ability to store grocery prices. + * What it does: allows the user to view the cost of a grocery and sort groceries by price in descending order. + * Justification: This feature improves the product significantly as user can track how much they are spending. +* New Feature: Added the ability to store grocery threshold amount. + * What it does: allows the user to view low-stock groceries and receive reminders when consumption dips below set thresholds. + * Justification: This feature greatly enhances the product by keeping users informed about which groceries need replenishing. +* New Feature: Added the ability to consumed food. + * What it does: allows the user to input their details to calculate target calorie intake, track consumed calories, + and receive reminders if they exceed their target intake. + * Justification: + This feature significantly enhances the product by enabling users to monitor their calorie intake effectively. + +* Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luoyu-uwu&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +* Documentation + * User Guide: + * Added documentation for the features `switch`, `cost`, `th`, `low`, `eat`, `view` and `update`. + * Developer Guide: + * Added implementation details of the `list` and `listcost` feature. + * Added `Calories Management Mode` sequence diagram. + +* Review/mentoring contributions: + * [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18) , + [#49](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/49), + [#60](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/60), + [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73) \ No newline at end of file From 474e5366b66f2f5ed39ce860b5ac4ba632c70eae Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Tue, 9 Apr 2024 13:56:32 +0800 Subject: [PATCH 161/339] Handle empty inputs for recipe title, ingredients and steps --- src/main/java/git/Parser.java | 2 +- src/main/java/git/Ui.java | 39 ++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index f24eff7a99..e66bd76089 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -215,7 +215,7 @@ public void profileManagement(String[] commandParts) throws GitException { * @param commandParts Fragments of the command entered by the user. * @throws GitException Exception thrown depending on specific error. */ - public void recipeManagement(String[] commandParts) throws GitException { + public void recipeManagement(String[] commandParts) throws GitException, EmptyInputException { RecipeCommand command; try { command = RecipeCommand.valueOf(commandParts[0].toUpperCase()); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 3a3a2c86aa..c3b3c19855 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,6 +9,7 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; +import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; @@ -277,9 +278,17 @@ public String promptForRemark(){ * Prompts user for title when adding recipe in RECIPE mode. * @return the title of the recipe */ - public String promptForTitle(){ - System.out.println("Please enter the title of the recipe (e.g. fried egg):"); - return in.nextLine().trim(); + public String promptForTitle() { + String title = null; + while (title == null) { + System.out.println("Please enter the title of the recipe (e.g. fried egg):"); + title = in.nextLine().trim(); + if (title.isEmpty()) { + System.out.println("Invalid input. Title cannot be empty."); + title = null; + } + } + return title; } /** @@ -287,8 +296,16 @@ public String promptForTitle(){ * @return the ingredients in a single line, trimmed only */ public String promptForIngredients(){ - System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); - return in.nextLine().trim(); + String ingredients = null; + while (ingredients == null) { + System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); + ingredients = in.nextLine().trim(); + if (ingredients.isEmpty()) { + System.out.println("Invalid input. Ingredients cannot be empty."); + ingredients = null; + } + } + return ingredients; } /** @@ -296,8 +313,16 @@ public String promptForIngredients(){ * @return the steps in a single line, trimmed only */ public String promptForSteps(){ - System.out.println("Please enter the steps for this recipe in one line (e.g. Fry the egg. Add salt. Serve.):"); - return in.nextLine().trim(); + String steps = null; + while (steps == null) { + System.out.println("Please enter the steps for this recipe in one line (e.g. Fry the egg. Add salt. Serve.):"); + steps = in.nextLine().trim(); + if (steps.isEmpty()) { + System.out.println("Invalid input. Steps cannot be empty."); + steps = null; + } + } + return steps; } /** From 29885c7884088464a401098988266b0bcdd49653 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:01:58 +0800 Subject: [PATCH 162/339] Fix view calories bug when user info is insufficient --- src/main/java/user/UserInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index 2acfbc159e..ae3059e078 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -146,10 +146,10 @@ private void setCaloriesCap() throws GitException { } public void consumptionOfCalories(Food food) throws GitException{ + this.currentCalories = food.getCalories() + this.currentCalories; if (this.weight == 0 || this.height == 0 || this.age == 0) { throw new InsufficientInfoException(); } - this.currentCalories = food.getCalories() + this.currentCalories; if (this.currentCalories > this.caloriesCap) { System.out.println("You have exceeded your calories intake!"); System.out.println("You have consumed " + currentCalories + "kcal"); From 0ab79c30955af0b3b7c5a7237276de6da4d2aa9c Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Tue, 9 Apr 2024 14:07:11 +0800 Subject: [PATCH 163/339] Handle invalid input for userName. --- src/main/java/git/Ui.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index c3b3c19855..3039391012 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -67,9 +67,16 @@ public void printWelcome() { System.out.println(gitlogo + System.lineSeparator()); System.out.println("Hello from GiT"); - System.out.println("What is your name?"); - printLine(); - userName = in.nextLine(); + userName = null; + while (userName == null) { + System.out.println("What is your name?"); + printLine(); + userName = in.nextLine(); + if (userName.isEmpty()) { + System.out.println("Invalid input. Please enter a valid name."); + userName = null; + } + } printHello(userName); displayHelp(); } From 99f976b1c15c4fc19a45e7e3cceac5b812c008d8 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:10:50 +0800 Subject: [PATCH 164/339] Edit user guide to clarify the format of setting threshold --- docs/UserGuide.md | 2 +- src/main/java/git/Ui.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 17827328d8..cb277abb49 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -135,7 +135,7 @@ Format: `th GROCERY a/AMOUNT` Example of usage: -`th milk 1` +`th milk a/1`   ### View a list of groceries that are low in stock: `low` diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 3a3a2c86aa..85df829e74 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -829,8 +829,14 @@ public static void printAmtSet(Grocery grocery) { * @param grocery The grocery that should be updated. */ public static void printThresholdSet(Grocery grocery) { + String unit; + if (grocery.getUnit() == null) { + unit = ""; + } else { + unit = " " + grocery.getUnit(); + } System.out.println(grocery.getName() + "'s threshold is now " + - grocery.getThreshold() + " " + grocery.getUnit()); + grocery.getThreshold() + unit); } /** From 1388e2a997b604edc1cde776f81d6915d2d2827a Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:24:00 +0800 Subject: [PATCH 165/339] Fix code to disallow input cost to be negative --- src/main/java/grocery/GroceryList.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 6738252469..10fbbcc540 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -234,6 +234,9 @@ public void editCost(String details) throws GitException { try { double cost = Double.parseDouble(price); + if (cost < 0) { + throw new InvalidCostException(); + } grocery.setCost(cost); Ui.printCostSet(grocery); } catch (NumberFormatException e) { From 1bc6a958ee91015d8d4fc21d894e241fbea7e5ea Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Tue, 9 Apr 2024 14:25:08 +0800 Subject: [PATCH 166/339] Update UG to latest expected output. --- docs/UserGuide.md | 48 +++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 17827328d8..5d8d036bd7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -77,8 +77,9 @@ Do you want to include the following details? 4. Expiration Date 5. Cost 6. Threshold Amount -7. Help -8. Skip +7. Remark +8. Help +9. Skip Please enter the number of the details you want to include: You may enter multiple numbers. (e.g. 1234) ``` @@ -308,59 +309,70 @@ Adds new recipe, ingredient and steps. Format: `add` -Example of usage: - -`add` +Example: +``` +add Please enter the title of the recipe: -`Fried Egg` +Fried Egg Please enter the ingredients for this recipe in one line: -`egg, salt` +egg,salt Please enter the steps for this recipe in one line: -`Fry the egg. Add salt. Serve.` +Fry the egg. Add salt. Serve. Fried Egg added! - +```   ### List all the recipes: `list` Shows all the recipe titles. Format: `list` +Example: +``` +list + +Here are your recipe titles! + +1. fried egg +- - - - - +``` +   ### View a recipe: `view` Shows the recipe ingredients and steps. Format: `view` `RECIPE` -Example of usage: - -`view` +Example: +``` +view Please enter the title of the recipe: -`Fried Egg` - +Fried Egg +```   ### Delete a recipe: `delete` Shows the recipe ingredients and steps. Format: `delete` `RECIPE` -Example of usage: - -`delete` +Example: +``` +delete Please enter the title of the recipe: -`Fried Egg` +Fried Egg Fried Egg is removed from the recipe list. +``` ## FAQ From 7948e2f957ceb09ad05c602766ba8eb05a642c7d Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:29:30 +0800 Subject: [PATCH 167/339] Fix UG bug for "cost" --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index cb277abb49..c0926f797e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -118,7 +118,7 @@ Sets the cost of a grocery. Format: `cost GROCERY $PRICE` -* `PRICE` must be a valid integer. +* `PRICE` must be a valid numerical value. Example of usage: From f79b3bfeec5e288df432724d25ec36d0f7d4fb45 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Tue, 9 Apr 2024 14:30:12 +0800 Subject: [PATCH 168/339] Fixed checkstyle error --- src/main/java/git/Ui.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 3039391012..5c611fc710 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,7 +9,6 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; -import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; @@ -322,7 +321,8 @@ public String promptForIngredients(){ public String promptForSteps(){ String steps = null; while (steps == null) { - System.out.println("Please enter the steps for this recipe in one line (e.g. Fry the egg. Add salt. Serve.):"); + System.out.println("Please enter the steps for this recipe in one line " + + "(e.g. Fry the egg. Add salt. Serve.):"); steps = in.nextLine().trim(); if (steps.isEmpty()) { System.out.println("Invalid input. Steps cannot be empty."); From 5727f42f5b48fd6f29ef62c4b11666c126384247 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:43:10 +0800 Subject: [PATCH 169/339] Add code to check if cost is deliberately set to 0. --- src/main/java/grocery/Grocery.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 09fe15b1e1..55d6cba8b1 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -22,6 +22,7 @@ public class Grocery { private int rating; private String review; private String remark; + private boolean isSetCost; @@ -43,6 +44,7 @@ public Grocery(String name, int amount, int threshold, this.category = category; setUnit(category); this.cost = cost; + this.isSetCost = true; this.location = location; this.rating = 0; this.review = ""; @@ -59,6 +61,7 @@ public Grocery(String name) { this.expiration = null; this.category = ""; this.cost = 0; + this.isSetCost = false; this.location = null; this.rating = 0; this.review = ""; @@ -198,6 +201,7 @@ public void setExpiration(String expiration) throws PastExpirationDateException public void setCost(double cost) { assert cost >= 0 : "Cost entered is invalid!"; // Ensure that the cost is non-negative. this.cost = cost; + this.isSetCost = true; } public void setLocation(Location location) { @@ -241,6 +245,8 @@ public String printGrocery() { String price; if (cost != 0) { price = ", cost: $" + String.format("%.2f", cost); + } else if (isSetCost) { + price = ", cost: $0.00"; } else { price = ", cost not set"; } From 857b6d3c793a0fe94694a98394e97719e4e90026 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:44:47 +0800 Subject: [PATCH 170/339] Fix failed test --- src/test/java/grocery/GroceryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 2079175c99..181392fe52 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -11,7 +11,7 @@ class GroceryTest { public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); String message = "apple (fruit), amount not set, expiration date not set, " + - "cost not set, location: Pantry, remark not set"; + "cost: $0.00, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } From ea6ba819c69154f434d0d7b9df7e9109252e73a2 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:52:25 +0800 Subject: [PATCH 171/339] Add code to check for valid food name --- src/main/java/git/Parser.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index e66bd76089..fa5e4399f1 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -132,8 +132,12 @@ public void caloriesManagement(String[] commandParts) throws GitException { switch (command) { case EAT: + String name = commandParts[1]; + if (name == null || name.isBlank() || !name.matches("[a-zA-Z]+")) { + throw new EmptyInputException("valid food name"); + } double calories = ui.promptForCalories(); - Food food = new Food(commandParts[1], calories); + Food food = new Food(name, calories); foodList.addFood(food); userInfo.consumptionOfCalories(food); break; From 25934ae764298c52f4a1d561747fa158cf573465 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 14:54:01 +0800 Subject: [PATCH 172/339] Change the prompt for invalid gender --- src/main/java/git/Ui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index eebe1ce041..103e457339 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -609,7 +609,7 @@ public String promptForGender() { break; } else { System.out.println("Gender entered is invalid!"); - System.out.println("Please enter your age in years:"); + System.out.println("Please enter your gender (e.g. F):"); } } return gender; From 39f68608fb2d16ac2f5e41db904cffe0542ef59f Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:12:29 +0800 Subject: [PATCH 173/339] Improve code to print message when no groceries are low in stock. --- src/main/java/git/Ui.java | 14 ++++++++------ src/main/java/grocery/Grocery.java | 16 +++++++++++++--- src/main/java/grocery/GroceryList.java | 11 ++++++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 103e457339..ffc9c5b45c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -906,12 +906,14 @@ public static void printGroceryList(List groceries) { * @param groceries An array list of groceries. */ public static void printLowStocks(List groceries) { - assert !groceries.isEmpty() : "grocery list should not be empty"; - System.out.println("Time to top up these groceries!"); - for (Grocery grocery: groceries) { - if (grocery.isLow()) { - System.out.println(" - " + grocery.getName() - + " only left: " +grocery.getAmount()); + int size = groceries.size(); + if (size == 0) { + System.out.println("There are no items low in stock :)"); + } else { + System.out.println("Time to top up these groceries!"); + for (Grocery grocery : groceries) { + System.out.println(" - " + grocery.getName() + + " only left: " + grocery.getAmount()); } } } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 55d6cba8b1..832c078cbb 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -23,6 +23,7 @@ public class Grocery { private String review; private String remark; private boolean isSetCost; + private boolean isSetAmount; @@ -45,6 +46,7 @@ public Grocery(String name, int amount, int threshold, setUnit(category); this.cost = cost; this.isSetCost = true; + this.isSetAmount = true; this.location = location; this.rating = 0; this.review = ""; @@ -62,6 +64,7 @@ public Grocery(String name) { this.category = ""; this.cost = 0; this.isSetCost = false; + this.isSetAmount = false; this.location = null; this.rating = 0; this.review = ""; @@ -114,6 +117,7 @@ public void setCategory(String category) { public void setAmount(int amount) { assert amount >= 0 : "Amount entered is invalid!"; this.amount = amount; + this.isSetAmount = true; } public void setThreshold(int threshold) { @@ -139,10 +143,14 @@ public void setRemark(String remark) { /** * Checks if the grocery is low in stock. * - * @return True if current amount is lesser than threshold. + * @return True if current amount is lesser than threshold, or amount is 0. */ public boolean isLow() { - return this.amount < this.threshold; + if (this.amount == 0) { + return true; + } else { + return this.amount < this.threshold; + } } /** @@ -180,7 +188,7 @@ public void setUnit(String category) { */ public void setExpiration(String expiration) throws PastExpirationDateException { assert !(expiration.isEmpty()) : "Expiration date entered is invalid!"; - if(expiration == null||expiration.isEmpty()) { + if (expiration == null||expiration.isEmpty()) { throw new IllegalArgumentException("Expiration date entered is invalid!"); } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -226,6 +234,8 @@ public String printGrocery() { String amountString; if (amount != 0) { amountString = ", amount: " + amount + " "; + } else if (isSetAmount) { + amountString = ", amount: 0"; } else { amountString = ", amount not set"; } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 10fbbcc540..fc02480baa 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -336,12 +336,13 @@ public void listGroceries() { * Lists all the groceries that are low in stock. */ public void listLowStocks() { - int size = groceries.size(); - if (size == 0) { - Ui.printNoGrocery(); - } else { - Ui.printLowStocks(groceries); + List lowStockGroceries = new ArrayList<>(); + for (Grocery grocery: groceries) { + if (grocery.isLow()) { + lowStockGroceries.add(grocery); + } } + Ui.printLowStocks(lowStockGroceries); } /** From ce62e62fe1b89f583817d03a0becb80fec57f976 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:14:35 +0800 Subject: [PATCH 174/339] Fix checkstyle error --- src/main/java/git/Ui.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index ffc9c5b45c..9c7cefbc28 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -912,8 +912,8 @@ public static void printLowStocks(List groceries) { } else { System.out.println("Time to top up these groceries!"); for (Grocery grocery : groceries) { - System.out.println(" - " + grocery.getName() - + " only left: " + grocery.getAmount()); + System.out.println(" - " + grocery.getName() + + " only left: " + grocery.getAmount()); } } } From 4d32b70bc4b3c16bd266add3c5a562a35fcbd073 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:15:11 +0800 Subject: [PATCH 175/339] Fix failed test --- src/test/java/grocery/GroceryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 181392fe52..763fb82de3 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -10,7 +10,7 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); - String message = "apple (fruit), amount not set, expiration date not set, " + + String message = "apple (fruit), amount: 0, expiration date not set, " + "cost: $0.00, location: Pantry, remark not set"; assertEquals(message, grocery.printGrocery()); } From 056cc43ecf7c1fc3856f8de47c1782603bdbc0d8 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:18:55 +0800 Subject: [PATCH 176/339] Include one more feature in my PPP --- docs/luoyu-uwu.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/luoyu-uwu.md b/docs/luoyu-uwu.md index e2b9386db8..e1cb2e3b30 100644 --- a/docs/luoyu-uwu.md +++ b/docs/luoyu-uwu.md @@ -10,6 +10,9 @@ Given below are my contributions to the project. * New Feature: Added the ability to store grocery threshold amount. * What it does: allows the user to view low-stock groceries and receive reminders when consumption dips below set thresholds. * Justification: This feature greatly enhances the product by keeping users informed about which groceries need replenishing. +* New Feature: Added the ability to select different modes and switch between them. + * What it does: allows the users to seamlessly switch between grocery, profile, calories, and recipe management modes. + * Justification: This feature enhances user experience by facilitating easy navigation between various functions. * New Feature: Added the ability to consumed food. * What it does: allows the user to input their details to calculate target calorie intake, track consumed calories, and receive reminders if they exceed their target intake. From 9187327a6ec4aba06f05f71664bd8fe113d6e450 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:36:35 +0800 Subject: [PATCH 177/339] Fix bugs to prompt for correct mode until a valid value is entered --- src/main/java/git/Ui.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9c7cefbc28..f4594d1dfd 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Scanner; +import enumerations.ProfileCommand; import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; @@ -705,6 +706,16 @@ public static String switchMode() throws GitException { System.out.println("What mode would you like to enter?"); System.out.println("Please select a mode: " + "grocery, profile, calories or recipe:"); String newMode = in.nextLine().trim(); + Mode mode; + while (true) { + try { + mode = Mode.valueOf(newMode.toUpperCase()); + break; + } catch (Exception e) { + System.out.println("Please enter a valid mode:"); + newMode = in.nextLine().trim(); + } + } displayCommands(newMode); return newMode; } From 023e173e149adde19aecbeddbf58932376e636fb Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 15:39:12 +0800 Subject: [PATCH 178/339] Improve checkstyle error --- src/main/java/git/Ui.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index f4594d1dfd..54f0f0bf4c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Scanner; -import enumerations.ProfileCommand; import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; From b1319567d60aed9f4dd848673bcf9c549cc94b4e Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 18:41:01 +0800 Subject: [PATCH 179/339] Included range for height and weight --- src/main/java/git/Ui.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 54f0f0bf4c..b4d19b8f88 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -29,6 +29,9 @@ public class Ui { private static Ui singleUi = null; private static Scanner in; private static String userName; + private static final double MAX_HEIGHT = 280; + private static final double MAX_WEIGHT = 370; + private static final double MAX_AGE = 160; // METHODS /** @@ -538,7 +541,7 @@ public double promptForWeight() { String input = in.nextLine().trim(); try { weight = Double.parseDouble(input); - if (weight > 0) { + if (weight > 0 && weight < MAX_WEIGHT) { break; } else { weight = 0; @@ -560,7 +563,7 @@ public double promptForHeight() { String input = in.nextLine().trim(); try { height = Double.parseDouble(input); - if (height > 0 ){ + if (height > 0 && height < MAX_HEIGHT){ break; } else { height = 0; @@ -576,22 +579,22 @@ public double promptForHeight() { } public int promptForAge() { - System.out.println("Please enter your age in years:"); + System.out.println("Please enter your age in years (nearest whole number):"); int age = 0; for (int i = 0; i < 5; i++) { String input = in.nextLine().trim(); try { age = Integer.parseInt(input); - if (age > 0 ){ + if (age > 0 && age < MAX_AGE){ break; } else { age = 0; System.out.println("Age entered is invalid!"); - System.out.println("Please enter your age in years:"); + System.out.println("Please enter your age in years (nearest whole number):"); } } catch (NumberFormatException nfe) { System.out.println("Age entered is invalid!"); - System.out.println("Please enter your age in years:"); + System.out.println("Please enter your age in years (nearest whole number):"); } } return age; From 662253774efb79930307b611135655f1583194fe Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 18:46:12 +0800 Subject: [PATCH 180/339] Improve code to check for valid name in profile.update() --- src/main/java/git/Ui.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index b4d19b8f88..5d487a2cb1 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,6 +9,7 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; +import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; @@ -507,6 +508,11 @@ public static void promptForRatingAndReview(Grocery grocery) { grocery.setReview(review); } + /** + * Prompts user for calories of the food. + * + * @return The calories of the consumed food. + */ public double promptForCalories() { System.out.println("Please enter the calories of the food in kcal:"); double calories = 0; @@ -529,9 +535,23 @@ public double promptForCalories() { return calories; } + /** + * Prompts user for a name. + * + * @return The entered name. + */ public String promptForName() { System.out.println("Please enter your name"); - return in.nextLine().trim(); + String name = ""; + for (int i = 0; i < 5; i++) { + name = in.nextLine().trim(); + if (name.isBlank()) { + System.out.println("Please enter a valid name"); + } else { + break; + } + } + return name; } public double promptForWeight() { From b11fa2e8bb8cea3fdbd8970c8db342459f19cc08 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 18:54:37 +0800 Subject: [PATCH 181/339] Add prompts when user failed to enter valid input for too many times --- src/main/java/git/Ui.java | 44 +++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 5d487a2cb1..da57414a75 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -546,7 +546,12 @@ public String promptForName() { for (int i = 0; i < 5; i++) { name = in.nextLine().trim(); if (name.isBlank()) { - System.out.println("Please enter a valid name"); + if (i == 4) { + System.out.println("Failed to enter valid name, " + + "namewill be stored as empty"); + } else { + System.out.println("Please enter a valid name"); + } } else { break; } @@ -554,6 +559,11 @@ public String promptForName() { return name; } + /** + * Prompts user for weight. + * + * @return The entered valid weight or 0. + */ public double promptForWeight() { System.out.println("Please enter your weight in KG:"); double weight = 0; @@ -570,12 +580,22 @@ public double promptForWeight() { } } catch (NumberFormatException nfe) { System.out.println("Weight entered is invalid!"); - System.out.println("Please enter your weight in KG:"); + if(i == 4) { + System.out.println("Failed to enter valid weight, " + + "weight will be stored as 0"); + } else { + System.out.println("Please enter your weight in KG:"); + } } } return weight; } + /** + * Prompts user for height. + * + * @return The entered valid height or 0. + */ public double promptForHeight() { System.out.println("Please enter your height in cm:"); double height = 0; @@ -592,12 +612,22 @@ public double promptForHeight() { } } catch (NumberFormatException nfe) { System.out.println("Height entered is invalid!"); - System.out.println("Please enter your height in cm:"); + if(i == 4) { + System.out.println("Failed to enter valid height, " + + "height will be stored as 0"); + } else { + System.out.println("Please enter your height in cm:"); + } } } return height; } + /** + * Prompts user for age. + * + * @return The entered valid age or 0. + */ public int promptForAge() { System.out.println("Please enter your age in years (nearest whole number):"); int age = 0; @@ -614,7 +644,13 @@ public int promptForAge() { } } catch (NumberFormatException nfe) { System.out.println("Age entered is invalid!"); - System.out.println("Please enter your age in years (nearest whole number):"); + if(i == 4) { + System.out.println("Failed to enter valid age, " + + "age will be stored as 0"); + } else { + System.out.println("Please enter your age in years " + + "(nearest whole number):"); + } } } return age; From 9662c9dbe47491b56dba8426bbf55cb04edbc3be Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 19:11:35 +0800 Subject: [PATCH 182/339] Add code to alert user when invalid aim or activeness, cannot calculate calories. --- .../exceptions/FailToCalculateCalories.java | 12 +++++++ .../InvalidActivenessException.java | 11 ------ .../java/exceptions/InvalidAimException.java | 11 ------ src/main/java/git/Ui.java | 36 ++++++++++++++----- src/main/java/user/UserInfo.java | 10 +++--- 5 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 src/main/java/exceptions/FailToCalculateCalories.java delete mode 100644 src/main/java/exceptions/InvalidActivenessException.java delete mode 100644 src/main/java/exceptions/InvalidAimException.java diff --git a/src/main/java/exceptions/FailToCalculateCalories.java b/src/main/java/exceptions/FailToCalculateCalories.java new file mode 100644 index 0000000000..0cca119c14 --- /dev/null +++ b/src/main/java/exceptions/FailToCalculateCalories.java @@ -0,0 +1,12 @@ +package exceptions; + +public class FailToCalculateCalories extends GitException { + + /** + * Constructs failToCalculateCalories. + */ + public FailToCalculateCalories() { + message = "Failed to calculate target calories. \n" + + "Please check if sufficient information has been given." ; + } +} diff --git a/src/main/java/exceptions/InvalidActivenessException.java b/src/main/java/exceptions/InvalidActivenessException.java deleted file mode 100644 index bffc8a348d..0000000000 --- a/src/main/java/exceptions/InvalidActivenessException.java +++ /dev/null @@ -1,11 +0,0 @@ -package exceptions; - -public class InvalidActivenessException extends GitException { - - /** - * Constructs InvalidActivenessException. - */ - public InvalidActivenessException() { - message = "The activeness provided is invalid!" ; - } -} diff --git a/src/main/java/exceptions/InvalidAimException.java b/src/main/java/exceptions/InvalidAimException.java deleted file mode 100644 index 67fe4c3264..0000000000 --- a/src/main/java/exceptions/InvalidAimException.java +++ /dev/null @@ -1,11 +0,0 @@ -package exceptions; - -public class InvalidAimException extends GitException { - - /** - * Constructs InvalidAimException. - */ - public InvalidAimException() { - message = "The aim provided is invalid!" ; - } -} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index da57414a75..9412b9086d 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,7 +9,6 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; -import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; @@ -538,7 +537,7 @@ public double promptForCalories() { /** * Prompts user for a name. * - * @return The entered name. + * @return The entered valid name or empty. */ public String promptForName() { System.out.println("Please enter your name"); @@ -548,7 +547,7 @@ public String promptForName() { if (name.isBlank()) { if (i == 4) { System.out.println("Failed to enter valid name, " + - "namewill be stored as empty"); + "name will be stored as empty"); } else { System.out.println("Please enter a valid name"); } @@ -656,6 +655,11 @@ public int promptForAge() { return age; } + /** + * Prompts user for gender. + * + * @return The entered valid gender or empty. + */ public String promptForGender() { System.out.println("Please enter your gender (e.g. F):"); String gender = ""; @@ -668,7 +672,12 @@ public String promptForGender() { break; } else { System.out.println("Gender entered is invalid!"); - System.out.println("Please enter your gender (e.g. F):"); + if (i == 4) { + System.out.println("Failed to enter valid gender, " + + "gender will be stored as empty"); + } else { + System.out.println("Please enter your gender (e.g. F):"); + } } } return gender; @@ -685,8 +694,13 @@ public String promptForAim() { aim = input; break; } else { - System.out.println("Gender entered is invalid!"); - System.out.println("Please enter your age in years:"); + System.out.println("Aim entered is invalid!"); + if (i == 4) { + System.out.println("Failed to enter valid aim, " + + "aim will be stored as empty"); + } else { + System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); + } } } return aim; @@ -706,8 +720,14 @@ public String promptForActiveness() { activeness = input; break; } else { - System.out.println("Gender entered is invalid!"); - System.out.println("Please enter your age in years:"); + System.out.println("Activeness entered is invalid!"); + if (i == 4) { + System.out.println("Failed to enter valid activeness, " + + "activeness will be stored as empty"); + } else { + System.out.println("Please enter your activeness " + + "(e.g. inactive/light/moderate/active/very):"); + } } } return activeness; diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index ae3059e078..0c6f9078cc 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -1,9 +1,8 @@ package user; import exceptions.GitException; +import exceptions.FailToCalculateCalories; import exceptions.InsufficientInfoException; -import exceptions.InvalidActivenessException; -import exceptions.InvalidAimException; import food.Food; public class UserInfo { @@ -125,7 +124,7 @@ private void calAMR() throws GitException { this.AMR = this.BMR * 1.9; break; default: - throw new InvalidActivenessException(); + throw new FailToCalculateCalories(); } } @@ -141,13 +140,14 @@ private void setCaloriesCap() throws GitException { this.caloriesCap = this.AMR*1.2; break; default: - throw new InvalidAimException(); + throw new FailToCalculateCalories(); } } public void consumptionOfCalories(Food food) throws GitException{ this.currentCalories = food.getCalories() + this.currentCalories; - if (this.weight == 0 || this.height == 0 || this.age == 0) { + if (this.weight == 0 || this.height == 0 || this.age == 0 || + this.gender.isEmpty() || this.aim.isEmpty() || this.activeness.isEmpty()) { throw new InsufficientInfoException(); } if (this.currentCalories > this.caloriesCap) { From f9ca48de1633a30fbf0e1c6ed0a495534682d903 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Tue, 9 Apr 2024 19:23:09 +0800 Subject: [PATCH 183/339] Added documentations for food and userInfo --- src/main/java/food/Food.java | 11 +++++++++ src/main/java/food/FoodList.java | 9 ++++++++ src/main/java/git/Ui.java | 21 +++++++++++++++++- src/main/java/user/UserInfo.java | 38 ++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/main/java/food/Food.java b/src/main/java/food/Food.java index 93dbbcb98a..4088c422f9 100644 --- a/src/main/java/food/Food.java +++ b/src/main/java/food/Food.java @@ -3,6 +3,13 @@ public class Food { private String name; private double calories; + + /** + * Constructs the food to store name and calories. + * + * @param name Name of the food. + * @param calories Calories of the food. + */ public Food(String name, double calories) { this.name = name; this.calories = calories; @@ -16,6 +23,10 @@ public double getCalories() { return calories; } + /** + * Stores the food's name and calories as a string + * @return A string containing the food's name and calories. + */ public String print() { return this.name + ", with " + this.calories + " calories"; } diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index 02c233ebd2..983328563f 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -15,6 +15,12 @@ public FoodList() { foods = new ArrayList<>(); } + /** + * Adds a new food into the list of food. + * + * @param food New consumed food. + * @throws EmptyInputException When food name entered is empty. + */ public void addFood(Food food) throws EmptyInputException { if (food.getName() == null) { throw new EmptyInputException("food"); @@ -31,6 +37,9 @@ public void addFood(Food food) throws EmptyInputException { } } + /** + * Prints the list of food in the list. + */ public void printFoods() { assert !foods.isEmpty() : "food list should not be empty"; System.out.println("Here are the food you have consumed today:"); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9412b9086d..6d63499f97 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -683,6 +683,11 @@ public String promptForGender() { return gender; } + /** + * Prompts user for aim. + * + * @return The entered valid aim or empty. + */ public String promptForAim() { System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); String aim = ""; @@ -706,6 +711,11 @@ public String promptForAim() { return aim; } + /** + * Prompts user for activeness. + * + * @return The entered valid activeness or empty. + */ public String promptForActiveness() { System.out.println("Please enter your activeness " + "(e.g. inactive/light/moderate/active/very):"); @@ -799,7 +809,7 @@ public static String switchMode() throws GitException { } /** - * Displays help message containing all possible commands. + * Displays help message containing all possible commands for grocery management. */ public static void displayHelpForGrocery() { System.out.println( @@ -830,6 +840,9 @@ public static void displayHelpForGrocery() { ); } + /** + * Displays help message containing all possible commands for calories management. + */ public static void displayHelpForCal() { System.out.println( "Here are some ways you can manage your calories intake!\n" + @@ -841,6 +854,9 @@ public static void displayHelpForCal() { ); } + /** + * Displays help message containing all possible commands for profile management. + */ public static void displayHelpForProf() { System.out.println( "Here are some ways you can manage your profile!\n" + @@ -865,6 +881,9 @@ public static void displayHelpForRecipe() { ); } + /** + * Displays help message containing all possible commands for this app. + */ public static void displayHelp() { System.out.println( "Here are some ways you can use our app!\n" + diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index 0c6f9078cc..509d3bcd1b 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -73,6 +73,17 @@ public double getCurrentCalories() { return currentCalories; } + /** + * Updates the user's information using the given input. + * + * @param name Entered name. + * @param weight Entered weight. + * @param height Entered height. + * @param age Entered age. + * @param gender Entered gender. + * @param activeness Entered activeness. + * @param aim Entered aim. + */ public void updateInfo(String name, double weight, double height, int age, String gender, String activeness, String aim) { setName(name); @@ -93,6 +104,11 @@ public void updateInfo(String name, double weight, double height, int age, } } + /** + * Calculate's the user's Basal metabolic rate if there is sufficient information. + * + * @throws InsufficientInfoException When there is not enough information for calculation. + */ private void calBMR() throws InsufficientInfoException { if (this.weight == 0 || this.height == 0 || this.age == 0) { throw new InsufficientInfoException(); @@ -106,6 +122,11 @@ private void calBMR() throws InsufficientInfoException { this.BMR = result; } + /** + * Calculate's the user's Active Metabolic Rate given the activeness. + * + * @throws GitException When invalid activeness was given. + */ private void calAMR() throws GitException { switch (this.activeness) { case "inactive": @@ -128,6 +149,11 @@ private void calAMR() throws GitException { } } + /** + * Calculate's the user's target calories given the aim. + * + * @throws GitException When invalid aim was given. + */ private void setCaloriesCap() throws GitException { switch (this.aim) { case "lose": @@ -144,6 +170,13 @@ private void setCaloriesCap() throws GitException { } } + /** + * Calculates the total calories consumed. + * Only check if it has exceeded the target calories if sufficient information was given. + * + * @param food Consumed food. + * @throws GitException When insufficient information about the user was given. + */ public void consumptionOfCalories(Food food) throws GitException{ this.currentCalories = food.getCalories() + this.currentCalories; if (this.weight == 0 || this.height == 0 || this.age == 0 || @@ -157,6 +190,11 @@ public void consumptionOfCalories(Food food) throws GitException{ } } + /** + * Stores user details as a string. + * + * @return A string containing all the user's details. + */ public String viewProfile(){ String userName = "Name: " + this.name + "\n"; String height = "Height: " + this.height + "\n"; From a130b0eee51d0e860a3ffdef4172c81c84049003 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 14:34:36 +0800 Subject: [PATCH 184/339] Update PPP --- docs/AboutUs.md | 14 +++--- docs/DeveloperGuide.md | 16 +++--- docs/UserGuide.md | 2 +- docs/{ => team}/luoyu-uwu.md | 0 docs/team/wallyimgs/editAmt_1.png | Bin 0 -> 74989 bytes docs/team/wallyimgs/editAmt_2.png | Bin 0 -> 87725 bytes docs/team/wallyimgs/find_eg.png | Bin 0 -> 85249 bytes docs/team/wallyimgs/listloc_eg.png | Bin 0 -> 94291 bytes docs/team/wallywallywally.md | 78 +++++++++++++++++++++++++++++ 9 files changed, 96 insertions(+), 14 deletions(-) rename docs/{ => team}/luoyu-uwu.md (100%) create mode 100644 docs/team/wallyimgs/editAmt_1.png create mode 100644 docs/team/wallyimgs/editAmt_2.png create mode 100644 docs/team/wallyimgs/find_eg.png create mode 100644 docs/team/wallyimgs/listloc_eg.png create mode 100644 docs/team/wallywallywally.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 2277bf228a..e62407bd0c 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) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +| Display | Name | Github Profile | Portfolio | +|-----------------------------------------------------|:------------------:|:--------------------------------------------:|:------------------------------:| +| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/) | [Portfolio](team/luoyu-uwu.md) | diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 60adfe5fa1..d83b27476a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -20,7 +20,7 @@ e.g., NAME, AMOUNT, EXPIRATION, PRICE. * Then create a method in "GroceryList" class that prints all the groceries in the list. - +  ### 2. List the groceries by price in descending order * First, create a field in "Grocery" class that stores the cost of a grocery. * When adding a grocery, prompt the user to enter the cost. @@ -30,21 +30,21 @@ * Third, add method in "GroceryList" class to create a copy of the current grocery list, then sort the new grocery list by price using lambda function. Reverse and print the new list. - +  ### 3. Input category for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'category' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the category of the grocery. Passed the category as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForCategory to prompt the user for the category of the grocery. * In Grocery class, modified the printGrocery method to include the category information in the output string. - +  ### 4. Input amount for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'amount' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the amount of grocery. Passed the amount as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForAmount to prompt the user for the amount of grocery. * In Grocery class, modified the printGrocery method to print different units of measurement for different categories. - +  ### 5. Input the location of where each grocery is stored * In Grocery class, modified the Grocery class to include location (String) as an attribute. * In Grocery class, modified the Grocery constructor to accept the 'location' parameter. @@ -54,28 +54,31 @@ * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. * Alternative considered: Can possibly add location as enumeration however different people might store groceries in different places thus better to set as String so that user is free to input location details however specific they want. +  ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. ![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) - * `GroceryList#editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: + * `GroceryList+editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. -Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. +Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. ![useAmt sequence diagram](./diagrams/useAmt.png) * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. +  ### 7. Input expiration date of each grocery when added * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items. +  ### 8. Editing expiration date after it is added * In GroceryList class, modified the editExpiration method to parse String into localdate. @@ -85,6 +88,7 @@ Our app then executes `GroceryList#editAmount()` with parameter `use = true`, as Our target user is someone who regularly goes grocery shopping, and would like to track and manage their inventory of groceries. + ### Value proposition Grocery in Time aims to act as an easy-to-use central database for all the user's groceries. Managing many groceries stored at different locations around the house can get confusing, diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b763ff0cb1..0211e4ff90 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -150,7 +150,7 @@ Example of usage:   ### Finding groceries: `find` -Find groceries containing a given keyword. +Find groceries containing a given keyword in their name. Format: `find KEYWORD` diff --git a/docs/luoyu-uwu.md b/docs/team/luoyu-uwu.md similarity index 100% rename from docs/luoyu-uwu.md rename to docs/team/luoyu-uwu.md diff --git a/docs/team/wallyimgs/editAmt_1.png b/docs/team/wallyimgs/editAmt_1.png new file mode 100644 index 0000000000000000000000000000000000000000..605890afd171ebbb57e5c0c8c753a1a922b8eb4a GIT binary patch literal 74989 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≶y^CHLJ(wo`DtAV8y#DpV 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%0ATh!|Y}vBg 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 literal 0 HcmV?d00001 diff --git a/docs/team/wallyimgs/find_eg.png b/docs/team/wallyimgs/find_eg.png new file mode 100644 index 0000000000000000000000000000000000000000..0e64e5395d80c5d030da50878fcdb6887abea91d GIT binary patch literal 85249 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

kgbTSD{>`BJ%YMuiH0duA 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 HlaT)d;pRQd literal 0 HcmV?d00001 diff --git a/docs/team/wallyimgs/listloc_eg.png b/docs/team/wallyimgs/listloc_eg.png new file mode 100644 index 0000000000000000000000000000000000000000..0e605d6fcf87425eae01a366210379141cca3975 GIT binary patch literal 94291 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 z zv5i`p!h)6BLYSa?92%`H9$m5=)l&K-V)jeWOTgaRki{?pONuTI&~ z=AygqVZzlwOyW!;idXUlW{SA3CaEuL8>+V)vp(mB6(#W(4I&1pMRyRZUk^sj%kSM) zPeoh;gZIQbB-2C})QPn>}O%(Sz#ntq;*@KsfkYWaxjS2}h$;4c1eJ91P>tQ@+_!n$fw zzt`8XC(`_wQS(uBC#8CS0p2FgGum?^M&tKK<(9+e;3cf}R57zi8Oc1^Ro4R^G>12- z-vo^V(k6fzH_%p}Rv8JXtl%jy|4aJi%cy~iX1LXJfwthI7Ro)*SaT6Fz?BHLrNts) z?%<43k6r!k{1mxdt1%j*C&9LvB$s6Q@ocyy`~{XfJXhX8n!t-A^Zngsy?|$SXgg_5 z${o@}k?&b#ae^|iH=101k(L%hzf(VE z-Z27LRZA}(8lL#zSczy^V^33f_qqCqxD2-ZN0FJZ$&+v-n?J0qpcdj|QZ47xVzt(` zZ3nJY!4Ylyyzr;7dQOoLU)5O4$S7nrgqb-xAwo-@*8c=06H#Gsc&4N3gVJlQGSs^* z)bTgtzvx1H&yXFiT5&j7?p>`j)o8fpiM2mIc4+Gm`%&-QCPmgkgqz{v)!fQ8nhreR z5NXu{*mp8pGF4Ml)7i7REbQlLqG=QJ#nk&?V}g)8Ix1dAEc_B~wlyUhGNIO- zdwgr(GpB8)@Qf#@akOb)jk<>>(LffQCh|yLLk+a&28^Yyw!W&^z3y^G5x5N<`bFBe z537-*vD$UNqQGYjZv`5I{C_AKCl+i3SQ9HlU>rxskzk`QT^U@;0ngA_n$69-G+`It zA?Bk&6YY&*DApkBXUO3r64oQ&^BhP?k^O>mx?9Y@;F)zeX6XVa(r9+3p;Tii zzEf!@uHDz(zz?IqOn8vKY{kM5qARz?jplj|*^s1^1=xxwS>&XmD3ZR>hSsBuE}`b+ zbPq<8kO;42D0qJ&R%2b*u0KPP!%FwwB1e>^6a>4KL*KObGLEg#bd=>k(l5g`PyUR% zo(v4Aiu-p&SKT9ZKgj^ zoE{HrSCE6~0z>u8Q?lwkJaF}jgvTH^&N>Fs(kYdulDcb~@BT#E4&V3_-7K|r7#GxI z_Js6L#)URumk52~I*mUXQCMegiZn!5k`wYY$W#~G^m~pb3=JYCyZD|toj3UKn)R)% z?Jwf~4dF}GDpK7WUlcxSOO~w*ThrDr>R|j`sdiC-!m*_*03u^~YH{jY-2;C=#GclhhU7??I{oS~ad5tnUx>(k zntW(=(BY?wTsP{FYM^Gf&?hoX9R(3qW54NHsc*46ysL%*QB*6edPhpB>!QdfRkIOo z!0-o$V< ze(uFau&}8-pv>t=?n`DVhx1_>C))?3B+AX14x!IN>@%PnBnUPib?l&uo{?#+ZLA&P zRsVv#)f-!TD%~UAYymV_=SA9>Kn?jX?iq+&<}a{HE_5ggM&$JR*uR<~+bw@#8-oD- zfm?+{`uEfp16=P!YBH{`>#wJ6QliNUd$B{0RQOwn$q{DhXTJ?3cWI ztYb1PjCop79&`~RK-n(`8TA!@J&hdmLl>NknHx{W|8B6Z$$wErVh3g_xs81?WG?krybnvWtIeZa23>(6sVYFb+rqQphzYvJ(BYz0+x|2q5V;Qcb^q#`$ zpkP_iYHZrX-aof>$JGB&Li1zE?q4y($hR?fFD~YYXm!W~M;hMXzWd|<0n5RUN5wA& zJchhzi%@IBmmiYf1x8sWU2*n^u0&)Ntqf{@`{%_=lz_Li-u)4i)zW}xN;O!cmI?!| z*_6h&Z_#cPQa^Y)U&#fzMoxVF|m8 zFRj)I@LO~~a!VKEJs$iX?}V&~P+Dgp#!yz^BRw6S`_+9nIm-ZLclr}+QCKuy;J@Gd zHH|l7_PSV$Ruuw;u=IrRJu{{(fDv$Sh*o9-)*kAi3uSrnP}PFfuTp$v-C)kyboc^D zV@0;3MJUQqekN}7I$5cl@<(+cY7D9aysI65W+Z+i4I(^lfxlg@?x6DNqx zoHDRJg2`m2z>cr`$r?-oHh1rF^zL&cSMU!_saSxoV76ea4#t_Q)u8YcB-SO&^2TmH z8T~C`%u)-$BbyydLFFycFfh3W10GOn0#9Xfm0mJeL0`%n&<=F(&sjvxm3cau1<_NA(L6NJg^a^88{K4BfjkZ%; zJ5mvC?TC)NakI$y1C2S&)>FqXugTrtyHH61NXSdpd|E|b142lfV>ZTRL1}ZJ2^(U~ z$F#5kGOIYPbYum43g;lq$pvh!NF>aGd(bEDy0R+?!3G6D1^ z3bFT}5`_28&IekDt@p<465;)v4gVSit1ZPzZ?Nce7RWk9WSRBQ>vQqC&~|4kC{@2` z3ndaaKt`jVhW&k;=kJaRiFJwHa2BH__$d^TQ%pp;bh(jjrYpn9FUq!)qHlglxw$^8 zDBRZmjj{Iibn^jcUHpT^1zEOm!+zdPC1*m!D7&=s{kyRC(FEFCe^Vapgui(P-T#cP zp)b0(Zh{j<1m5O%e(obXuRlax#d3kc;d~_)ma7Rvw3?H0B`UAvQ_z-FL@aI6hlXZk zlG9`V3J(th@1~Uvl_ojmTukviJTc=lvtxafz5Y~EUou50%Ve>mVi>BIQGERq0V+Ql z8B7w4t-~s^v8D~i;$mZ704luWZ~EuBdR0CsIf43AA=68dG`o}<)6icv!ee3dA%P% z8-!`3p=h6a6ft||L3eb5M23=>=wk;%qzXx;fX5OKKm|FMT6@Dp)3DDrk`O)>CL!Bzb{EQrQwvR?hiVe z?u)-SUrx?x>8NXmRjj#PT0@60W*F#%Yx)Wt#Ao7vDnBgV?EL+Zp3{2@izS=5DbKTh zScY?}Jglz?6&@Pjnh^CL%XRZT+yvzN;VO83$`6&HE&Y5xnXRPsu`YiI89#2xetI59 zvHhv-Y|9;UM*e4(`tmITZ6HTogo+4oROxMPN&MG?ftTeuF^ONXY_P1pKE7AY$wzC& zjl~k5Q2IP#OREUQQCoN*@q_4>G6ev;dB8U3IwgA{L-$ZA9~Bb|Qu$yAjLqdg6PMzA zwtvd`n;W)mhHqK;=<)Q}$veI;uZC!h~vi#P3On#_-vmuUSN|Mwt z0Tve~3XkwA@l8@VXU_AaE3$)^7=+#EwEfNb%ZK3N|M4W0ur*Kou5>iSa8feom=kTF zqQkZWFKduj{_Xs$5&tG?kK3Q4+oQ^oL5#7WJYgAnOX0vJ%5Ix6|LYT{aJc>-SZanF zRiI?7TIw98S3=e#iSox6I2<;GlvO1LIn)1tC zp4Qq&5vvg|4XoYDX?x*ps{%Sr_~?@8@L60HpRSM`)1!hLfFosIpxX4bjd?b)wekDF zh*zYNZX#z<)x?j1c?t2QEJZ6*FsGA5K@;6q%Y@iMmb3ZO&-V2nX(MrS%RhO2*2dCj zTDo(`M?Vy@qI+})dt>*1NJ&t=Rs51EGaSb=kdU0vJKybTMH^KtX_(_!E?N2kKk%w$ zK~~9;LNrCMHppI4>acz`Q71m_oh()bkG0xTJ8r?xNFihYNV7N1#5=N8AL&>)(Gr*t z3{t6!E$*kh*}!x0ojLJmwf4lu_&pg!*N^=sXsIXeTmy8-l1^$icSkMAY4yj}P~Pd^ zt)cdJu{6OeH@CMS2RTX^54eSQE7<>mwBkBd`H$K2ozT;HZ^TsxmJ+b}42}MMHCE`I&1!cYPjPob4g`fku5*}- z*DVJ{s&v+D-gkiCX14OF%aX1bf+OvvN*A6 z!y)?MmWF3?E~$s_ILD^2Y9MZvJU?UBx^_|ho2n)Vcc#L$*^pp_IEl?Qxp!uLBNNV; zPspmWV*M>%<&kscN|k~CmDu|89Y&n@&Xj%??X1QF!*G0qtL60)P137plAx!WXOidJ z4dln&^>a`6(}UCv96{9ram0nZfuo-0h99@2K$svVrLe%8ewyZHqj9S1B4ERt+rx8% zwtKXihtp*&dloIX)3AZ5A5*oVovOFaeF8>6>_G9}kB(EqU18bqZWxT_x#zh1F^Z|- zly~m$JBAzL6J`b>>ge{GlRMb+pM^MAcQCKoARj?3C^w0CB-Z&rsyk$(fM2iv0EZ2Nb23_+ctw^4IAeik?le-;zp(m8ZeN8Cs7f#cx zch9%@nZm$x5qy`_aC=CQ19q<%Q?QKZL@h*5((GzGos>Gsg?pBjs>_a%1sVdy+(e=7 z-t(c6o!&Rw$dSk_Z8tcmmeY`V=Pe6+qdo09Ffz@>AIBVv@y83B)DLVUax!HUZ1Y9 z9T?u*zhb$T`1N}y^X1`0D!8iBYHjcL;Q7W$!rARKl;6w7Q0XQrRFJ=mw2|JWQsS2A zIM7!;6N)j`W@^6SyPOs_NRmHd9*z*s8_oA8J>>5?RZDHb>fgO`f1a1(f^Kh%vWG2+A4nBX2+{YYE)lA~LrhH{T0)wv@=A;IDVT^wWM+h9SeK9a|w@mc9O`f&EHz`&b zl9N7Ua3u83G?z3NeSSr=(bb<*jD9KNkTqd(njXJ@ymbT6qI_l(jul9|AARNi83XUN zYK7v;81a?a4A1k8P~h`L0`#|`S892@*Uw43&s1Ay-}a{vaY6ADHSUw^n!fQ93;8|_ zmXRC5LeFhU8y;p$0{5}mC%Xp8*E)_aI5l-==lgXMQ})XwQ~GuL5c#q^ z<44rD=-Zv6F;yh|aeb?Da)PD?qZzxEzokW>Ge+?bx+2HU61 zD*9)d^%m?YqFYYh+dDR)#g~trK$XWmtz@F1R5#_94FpMw6GW9&RaW1lVM3CzgUAD4 z>UHz!`8oOQ8dc>|Od5H~^Yb5puQ7eQnO=Q$I|CWY;glOy1V42->dsiTpuFGoW?wyA z*>CP3j}dmckw7(P>fbixGNlSv=_>-9ik7$U?ozH#R+l3}64|6vrO}ioMsYFwb&&vv#YAI_Go1Y*X1we$Ef{e8dg9i!q1@_3U=SI@@#1S0 zY}dg>zRHEHT9%h(R5I{DMc0GcL-m*Tl3i~D9G8ZsCa=2|12BJC#y%ddknnmsnPlo4 z&)VNuF$IV-Cgp z?1XG3`$ayzP|A(+(BB>UI9M~taPT;vp!3pf^7z-E%R(#Oz)>rvhZOHfnr&78xBe5E zQlsfwNIk=`Xvd&S5+ma~89t2j&R2`2qS|bwq%9p=F?-Nyyr!|jDWS%^lHh$v58udi zpw|v+4n>^usQg#S`4~Y*yVkfMiR{j~wCV$ip3^(tFi~S|lZD{nPs{v1WeWTi$|Ql* z<^G-A(>^}x^!BCVRW8~6XY2HwI7W?0*LWQhx5WZw2hHYzm;W5cQtehdf8Z$fq^_HN zB?=ij_X#|->OaN}l9X^&OAp+0)+3cLUIZr$J2@8nko*z$c@6PmBL9>WBt7VLzbo04 zqBy;_8cUvyx{i+Ih4U0E!p29>VV*n&*+p&BhoJx0ex*gIRxFV?A-@@vYarsWwl|9DxPju<-| zxcRY6Do#VEWNvxYA0>9~XV1>h9AA^pW*5pj&9nf7yz>-Xi`Dm3D<{13(<}5Pvsb7L zu3SE5XUXX6P&kT~Gg3?bu&T>GQ|N^xsJJK93OgAXN&U{e7u>A?x+hHyj*&ooIa6uz zZ|VKPvy5{hvx?^()Z3TA2Ft*=*8wCOw&R*R7GCRRhqdN%TDX3|c~(gn3^hllSa}~K+NcpSDfBUl>yxeOZT{{##EF$Y zMKLp_)bFT;S1W|G#V?Z8>ABZ{7}riDMjkf-7W$L3Vr$&(;%=N+g;fdAW=^AKd!Q#W zfLt=O>OL^Av5eB|cb#vF*+k>535gkRNq*8Sndr!Oz%Q;6_nFpL*lP+t)Z+P_IdA+VgxU3|bVB8#Xt2!S8bQ+D4Fxk^1^c0ZrubOb!SjC+mapb^uU z@-CUoJ(p)qBp?C^r@UKHhVRgh9d`7rCA(kf*?J%tW(}oJmsj~2>x1o`i^!KHa3Ir| z!Vq%p?16WN%tsk@5=V5X`vbytG5bsY-NCV@ zf@qD71R#5V()R$NIoy0sF}v1>zIYCq<^{E`HMhViWxeGGy~pqCTVir^7t&nX!QwKZ z`9(yclg0-i;{2jYn#a+%J{^T+Sg>3ojOYjjxg^4$W4z4aS0|^N596e>ZC(+ubM5+* ze-IU_q|U>Nju#8*{SEutSccc9_SK;F!_9;1Qd;?jO2RPz=iU)Hs{Oj|xhG@X@4}x% z&Z0)Oi^e|`u)mlIQJb4s5AIV?$WzASE@|gv$8IX9?s&C!q`ycttY}gGB3O^YubL=bq&T?G>VeYp@IU+~ft3O~)^J) z_!llC|J;jUH?e?z_Dg@93QlSL)UlSEw}s4sL3)?@9xcK0xr$O>`gfWi(pg5MS@2SW znDjdp_AYRue)2>I$LrNsv2vQSM0>{)3n9d9$@wNv5b}rzR@39yLT1`iw%c0q82QTw z9!d?qQcw0v0xGufUqyJup{-h_VAPSxV`@+d8ED>yjy5)?2EUjdiK&ugDUdS{9n##Y zG6_U!2fTsBNMKNrK2q2b&j`zbWN9sE%}j;N*4{45ki_2DN!Ct%n`swd)HWC~oT z{vDzy&fMJ*h?90!=2H3LGC|3nDCf6{9OOk{UuEC;1*?HoAFhjSr$Q2W3N_Sy4$V!l znt6k%vM3X+pnSB#OyInDSiWOQsik9T1R8?P=b)ana50VZr!eZ=wi<~*Qsnf*JbzF} zG5xNP@5vC~&;Z5tr&Bc0UYIwAPL+s~vXX+6qhy<&sl}*hSdYrp3|ADrc<@caa6QPX zC^n9sQ-CC92V%e%XPFl@|0>6f9}@S}bkHMv{afgSfS}u&e|flQv6ScI@hpSntBfEShNt$?kG!ZV$$+O^hOVzgt98C{6_0 zYasEU83xd@2SB`;N??|Pgml(EMA4>j_?DdWoEz;6uLDgAmZ2YQhVx`?t+*1z#+Qh@ z#5hL;B;dgE{PCSm(uZT;a4O7GHdTo#3m^QSbt>A>sffEXr}uISrq8`9)-QYc5L3$% z5nbunM{ft=lgB;0!arzbf;0(`oXXRi+R3ydXMYRoGDTbb@s0OHb$8yijjhNu2l)N7 z;y9^g({i4Jk{jVibzVaOFg@o0koxHBJ64CaHrabW=mem|#P5Z^Y7;wuS5mw85qAzA zZlpu5jHsgW$M_W0oSst@oU54K8a?_?y@SDb(bIY9YqWeD{uV)@o}l3m0Z)!s(E z+0deAow4e^(^K%}a4vH4J~eMk1MQ^>-X0i6&|MroVk{665efuBkNu?yYYN=Ie2`Vd zX$yb}c3!=_7CZp&HomZGbM9%VetEl3K1ZHwsh<0T-G;y!Tm|+Y)Z&OL*vbjkfV@gu z`qaMqn`cJ!vjJn@-Y%ESZZ?8Khr;=FINMEy39W9#To}iq6S0ApNU3FOdMXVnsC$i*Qx`yHoL<#TCoZn$HjLazjWjjPZ4|>e2FpsOO3A5_((O?^s_+E=Of05^HiKVkfq-0??D7z&7(US>{ zJa}h%Y=>gi%xqAm{Z2PmKj;<@rvF0V^!|KrjLd4}VpR5epU+^YeL5fGA@kx0n-`gR z4{+OcJ4m5}zEYWtY&~37Of4){f?)Y;b}CUVY-h^dtXBncICplQdYLMupfI%8Z8_3R zGCViL$zUStuj!S(<`;hdMPbZ?N#P|h=xJM#=W~Yy!W!J%;iiVZ9eqz0+g!=LAFY9` z!;Cbu8U)TyQIEIy-?OG=c_j|42`Gd_UF;?OgiL#RS3(6Fk2huqO{VJyIu9Jaj|HAA zyYX>J6^!c|utyEzw6F!UHHduqRa5F~s&M`}GO5KNqSaU9mPYSeSJi^S%EfQVfiDHe zJm&r9lsHZ72D_}n5|cr@qjB#WHuYt@uZXWis6;&i5Hx#CDJ1k#QaDEPbf?j@vicEE zhYMh}=0b+d=j;52YUaDEAtw$uCL9^rB|aNoLiKgX$S?E>kzCGgn+8Fa1WLBcJ^bI} z9S_XrYWgXD`D}mBLmyE-ulLJVF2T8{i(ZP=QW9&U^i5D0lo(AHZ9PkTNuBPF`veiU zUG~s`kH&O7M3BwO5o$_&`!bIWapEdfmG@=Y`$<+5odhz%K)V_;cdh)rKbhJ^3-UAD zoQCq+E}tWRhZAtC&5bmYR>M=tmM2GCU=6{1+URHhG=nJ6_g9r-_Tm|hy3gvKe;xPe!bY?5VUSUjsKNwGg7|lBOk7#;Uk7|5cM1wcmen+au zZX}xp%5~^k|6zo3ahKFu{~qD-I(}72fL*44x2!lw>v@8k8EeR!PtN(an+L$9MKuCj zkht=gL`L{7*3D9v$7X*M^>nf=lDCZLtu`W=e7aW(iGtyds`)*=LvyZJ+{jkck>T~W zRA7u&Y&dS!LfRC-xM!A#dY^+SJjUE3kT6(1RH;K2z*h3IFFY6AY8&qRV^XT*e0P~b ze9frWfNvbfk%XnHBX5nl(O>nDc#l-XZXbw3rxT@BAY^g4`|Zj>UW-Y)%X4GE{V`_s zIp(fD8*xl_DWqbXdkGgR@vjyE@!xGl#MAKy5$a$zG~2VEWXE@Xs5$yq?s;Rh`av^YD|*$&6e)?#e@AEIOz2_eC%_5#t=*0*>f*NZJuBL5Bczd35QKf z4o}P`$YJ9t*DaC9`Nm~1X@DSn?u-^I%^U3fK#Jbw?tgQY>*KE!t*3b;0CM0bo3-@v zPva5DQ>B`csvQWk$;3X|^lELYe^3*0R^tGfow)l$hut*fPW@V`RCUEOw0x<5Nxv)Ru=p8$e7+_k zOhK3l(>uj2qztXPc1I`Y%vFw9^i69z=eyJGQm02bM5@`#I>2=hPqN1ySyOJW_(CYO z@|(sm6}2#>t-;XZ`FV^`2~_@78|KS4FyC)BL3(1*m$g7Lr`4#bZe@iSkb?h|xYVPb z=~Gm0haaWYRVSubZI-|PF+7GPx*6-0SdIJ5-D7Kj$k~{A84sMi*#K!r0pCFiU1q7T z%g~N`$B#%I>|n&Iha=oA_mn&7U-{X9kBPM^N1sDSTd{P!PxpMi=m(Re6at2s!>ZaB zC4~E-gJ^nL8fhiyQ=f~@OfVvfzY>uyGu1!ek%&uGMEjG!x?J{r2+ZOs#?Fo)oA3rF z1XfAkdXU$?#w?B5UDLPTHJaL;O(&ZrTtn+%Q()hJb1Q6LPiZC^rfvLzgsC+8g?gx= z(xw;21#ot7PT{;tB6X6)R(QVe8p%Jo9NIO$V=s6^k8TZS%AEdlU*!Sil6_8IP{Ukj7|35)*mki_II-rd-#fj4djK_Qh#nP+dp(s-k%K!M6Q!x zMabZG8#}1MhRf#74|X}&Vc2D(Cwppx{Ka-86xH%-&2SyckGbC;U$0oxlYdIxHhb?q zV5lt>O}1ciaF3V|F7>&1lJe;mikn9Jxlk27CQ z<~W5lWeYzh%yWNtzm`1GsU~LZN7)8pX;*eb%#M!#lIh&PM|-r*-O*E`Yj5mK6UT^# z)rq(Ht`1IaK+?h>bYcFZ#)7;LLrRJ=m4tW;Wc|kGYR+t&?AK8GQYVxq{pa61GMME2 zWuGNTq^w2+ z?WQADn4|4$=i@Bgz7nlWN^VY#SD!Kd=@+i4HI^vlHX!2XN_Mm^Dy8M&+?lJ2lUh&X zg+1U3j{aqMcrX1xhnoZawmeNG{(MLf_}CDRXQVV!`1puy9QMu+Y0pzAcuPv9!&tIF zJy1_4=Oyl%8sT(B0Z&B(@AR%3p0zWw**xrpNS?z-)4>K@;K7?MGOJ%?%kY}tynSQ} zVX^~9ylSW&JlQsb{3lfYXqto?xV4F5V`+LfAP0nl z)vt|^1u`TFs{E-$)kCmOHFJ8EFERmjCKS5=D)Yr1U5V-+VdQY>nL4SpKMpqhX(yfi z#_3oFYy)w+m_J|A2!pTkE8;u-zmd(df~dQG04@HJ*tR=oKs}w|yY;Au*%Qm<*?yh? zIk57Tupw^?<&3-~-zEP)=Fa-7jjwy#6{I)>cXxL!POxCbU4j=WS}0cB-GX~?hvHJa zxVsd0FK%x>&syLA;r%UHlaX^KbIzXo?CajjyT%YytZ4)gsbBZ_5f$C?NSxA*Lg^pb zjzjocL+*_!$h_IABgn@Ij(FyemOK2Dqb+Dc0yvNqb>I8FX5v;{+nw%hhcPTN9Qu4s zyg0H<`?UOUtr5kbME=Mkytu+ASsf+vGVeVOd3-tsE?7ObO+sFSVX8}4H0Q1ZZJzx2 z`np@dC*Nt~kx3tIu--7?OfNfudgNT#A%bAOxq|gzY;D_lw}BPXPX4uz5&UZ^c}EQ& z>;nE>{}{qdl!L!I{O80V z>!-yw$B*j|?YKf1qgvc{9S1HcXs_#k0=ZTkrBCKsb6kakikgU@c zNDy0$OV{dq&K-Oc4e@mP^!Xtn(esb*I6Wt08sAlM^+2e3B4?KK3k7)i`q;oz^4S{f z9%4LA=u4SbI&`i#kZ%>s_W?|>_7-I5f{}i$?&BDQPN05kw_wup*3ZG?;G=KOmTEek zHI5(R$OolLCwKDE5y@}mlz&JCKxBilLoZrK@d?ylU{js@mP8=igo}>#tNR|@6?^@6 z6!c>Np0Eq%bJXD&Y_kEcYqquq|BtEUksKYf>n4+}FuwIpD^M>s7GMKoJ5UNTxT1<( zs5mvtId4$x_^|tEGT`dI3jhxfmS1;LNR7r2C$ZPL4yV!#6)v>2?UW59#SoVT`zEgq zD*_F+XVRi^k(9pMnGn(#Wu5{`h>q%0vp{FRDshQlB+krLx zwN{dZi;mJHN0YQeijO15qfw;^1HIskUQqd)g2+tKJHiMankUzAMUd>D9Uqt? zA{iZ41MWG&t$&|^V1?G8eoD@^ zpTec7B;+H<2}%BdbjOSn-7Da)ssV8tHt~&HVV&aTsj^L%;IT1=w16wx_>J70&4v1d zXT>NRZo-){lxRloOqqiXABUDCQ6*6&B#tYbc=bk0E( zuqYWrOwXw+uumeY*kgtSN`Nu75_FCY{;}KTQH)+-ww2V#&X>wZSa?;0IhbVj_pG`m znm>Oco5i&Ej-j)XhN#Cb=ELHxt zfSKroKYkUNF&-#=g#$nCPHYT8)-kIrKuhKM+gR8+pVC^1mZ#e8?}wt+%RUs=qjlVT)b0sBiez|QfGJ6(1p;w7yjzLSJ|Go`R^Q7q^`sF-Q5+3{p)>G zmJxpZkvosF)UNf)vS6kyvEm%SQ6w(H7|+2?@O~Oy-P&)&?Ry%MnPC_IBGYDaL3G=H}{LBa=L4zped6*xU=XpIU z)DK2yC_1L#Ctii{(0GSbOfu$RV#(@8?sK`6ktN-iy0WSL9|MjWwu_21kZ{1vmRu`L zDP0NL`t$kuIt__bMsG;v=)E7{C=!-_7f2Zo^N9CDtp*bXCfgPkmBy(}`eSi%53ayw zk5Rr^70=6mixKFWLR=FEqwAK$qt!w8FAu9hza*6~#oPm^&}9<)|%}B^>)ODhg=Udo((Rp z_)OiH6er?=9~r9Uf>{$egPPHdeydxDQbJY9e3i+C-2LTMgWX5m73qsEZJkZSkK3y5 z`JVHUgP|kVBO=6ux@4*Tm-5n=x!Bm-fd^IdRJ@F6bqyj7kQ|c{!NIPRaBdo;zH?En zRlY6l{=!m4vr`PWr>hR@9U1zs!KJSHM-yfBghiME$* z+Tz_K6I!uiK>It^6stw2ag&PI(fXgdLT5z|80SP&k8_tsa}eP4MuMu)9j3!F4g0Ms z2_e&vOFBpU1K_LT%faoNcR!NYXCXYTOB28F?bKJz=S3%VRiUkco#yvKIc(t(R1M2U zCJTaN9bw^J7Rk$FGkPQU@#93d`q5=f4NAhC>xPlYntxAsNyIeyTk*7=+MDjto~vRp zf_Ci4X>4J{&iH!F9 znY2bl$*B`?#SeRq+ZoaLEv1nviO{rLQ4Lrf9Os}AT1l4U?yW@ai*)PGWJ{^+D*v(y ze05kNy~p+kaM_XndUHfU7JNe-+Z8OS#i7PWnT86yB)=`aJaah70n5E5AI;N}d4gk$ zAz(vSOCs4-RH;4UGgCGOI+;twZ$wOG@#Dy12wgo0=T_N+s5K{NQB7tWP`7nRH8=s@ zBY*ZXIHB>g$`Y5Ny+rtqf@85PL%fX#5I3-aaqt&fFW-z&p08Hkufgs-o$>Oj?vrFz zE+2oTIn0*qCeeqJY!#mDM%(#yKaL0-I%;XVPaD%O7}F|nKkN^{!^TTk;xaog6zfx0 zBC--G?%0$rh^?ij;SSx;+am}q6s94dQlNY^@UUeNl@b z2ozILT#47>WL_aT@fyRJh7;Ii(xvADIj=#>y&?d1;U-Yu0i zpeRh>IsgHE^D=D2LAv+EP(;uupo-z6{3gC}QFMX@MR|l-^@x;S`@iMP=0$6;7T4eI zgzu54W3WKml2ep7mR3*v+;O?e3KUN7H6+qmgWqv&PNcP_lWEvD8$f)9hGF@1q?Q2C z87dU~abQ)t)`~yyKno&XsBJwQ0IBdIC)`Uq+k=TRQ0zxo3KZ_=D? zUxWR}uWZcGDCZe+m2gqfhE*dNU~*t%{AV+ED` z9yPVz>yUw6>Mn4$D-^BL2?+&c#kJM=U>7)k|0jOM?9n5Jz z2t>{rX~BKn-#sUQ-5kVqB@C#|CYzk)!}pnir05I+M$H*WgS{CzYs`fxFkBGgzP`B$ zeN(XJDOT)<;P1_$ah>`a;+d@aMurj(To3S6y$d!(`L>2JUj)zV>FmIw(^=zzm@0x( z9XT@b$CG|lKSSrBTDE0NNX*LxcE8?~w78-u3lOVJvYJF7M`hB!(`lY$+F?{{RQ*nJ zKy$2X1Cp_l@!f5KiCwA-ZG`%^6P<5Wy~hm~*WLq?jrU}B+oUDhPma2{F3%y+R&Gl@ zlE$P8GZW8I(gs)&H;Ug#5iXCv0_WhLX&7y-%Z2i)=frRObA;O9OwIc6(c*oLreo(1 zJZYfgLS7od7(j-ObtU8){u>d+X9h#Jz# zr6y;6TpUd5M=C7ue` zvPIDOf(f{1Jeswez0>r*_0)F+d+PZ`?pj^ZcEVZs&^7x!?}_%Z)3G87YLXt5O;NC= z`!SAtR%uJgdC)aPCqmX*Rp?CL*U!{z%*alu>BA)_9l12ah3{e$GS00FS{QrurER$^vy}2S->*Nn*_`%Gf7t?P~`}cqUkRo)9YU|Uf*0>!%7hyIw4=*-mT{WO4QBRSxzXw=f`EPeCWMB z_vo66bk^h&{Z9O6AG4@L!YwDBZ%$ZeLnqiCik($>xbycNf^D)%*Dg{1$?uDX_oSLF zs!;sg+=Y^B>-G6%Er!J2x3T zntf6M{&1pqHCHw~ZqvD|iu0_LQM07#GZ1z!qC%p5vHW)zFZkuU36-mG9@N9Z@lI-N zDW6it04QiXP&!d5b#kIkCIIDJ9qO__wL8HN?3!zyHIeXRe^P4tyRB?$(*5%_y_?Vz z&(Sh1X6xp{sm24%jR7h^HL<451~Ul@;Nz|9B46#=8fT~w$Y9p)+)%Vgw8&{nHBg6{I zxvm>xUWWMnc>=ObTBD2sp015XTh7$CYE@074owo4=--eu;BWaba=VoNyGHiy7e+KP zR*!Xd@!W)&buPwd&6DDo@#{Nkp?b2Lk0a(i)@1Rz;HJw)j3rL)*+_@m$0zkuFr~Uy zp6|3wM!{42_%9>^+quVUbNTjE4AO3=C;VBs8{ij4o0dDZzH>{XD4+ zw-r5ZC*GTzHe+EQ?V4sQvl92QUaENIGE63*3;`|CVVULLjZoGYZ6964B>U*(>-hDjAX>HPxe4%8<8j8menS;nZYjmbaEW8Y!RoTq zk&g=lY~OoKY?`r(h9g}meU}=o&7T*EhOUN%BF@TYo+TOZad8o%9J~698{MrFwwsCk zviDQ50Ls_x`GfougktO& z)4V%t^rLsjfKeDnQ%1vYt9|k$jUnPBWQhH0{+SK;C|AL^i0MCga<=$U4Q1we?}J_F z-$@rLx=nmYS@kvKGci7p^)V6x^u7M_^%c$HzxOsGDU*$-x?DXE=JJ(aM&Ox%yR1ho zI7SsqVNc^NfGqn4-<@eOU_U!bzX%0Q>X9TG1td6d+Yuu!E`wccup>W?F5!xmVTpz8v zB&jrqYzX>ChmkY6qs{lgY(pL8)HE%~njO86Y};+$rq>hJ%aaxznGD>Sz$|Mfk;*xn z%<$9!aCCzaL5YmN2xXj~X=>Amn9U$+8^X9pHJ^ zc;_1wL`Pj<{^=SfsRu5Z?F?04_g=w}P2$B6(Q;doNQ{l`DOWNLdac?} z{>$eJlQuR!oQ0+p#nG5c7*6>|B#7)3!bO$xv>^oVHkJ%)Q*rVkY?@k;ucK2)7luGB z-=BSV{A;Tc^5r(mD2_(F8~ziPP5gp+z|$OebNY51*>~bA_C-kcYYPF4F*P8k%oj;= zUHa?m3}SSCl7yWB zNuip5SLh&(1QC5fmyf3uDL_BsLl*Ac`l%@hJ2J_oi46(!;sq0+?LRFld~0lHCQaz} zyVAuE9uCYT-mOGM(}}=K&AjM&Fpz5y)Estg5BKSUT3Rc1Kpy|sneb!|o#bd~&M_v1 zc=y8px`FAh2#vxJ3h~tE*$5GvS@;P|*zrlR3M7F}*#AQ4c7TysZp>G)e)<*A-#=TA z%yx?4vk7rvyK9S=`Iog58m`?;M#!X!>QRZmLoCHR8n$#jvdzo$Zn=Pu{Q&o=8Sj71 zgMEUX@_+p8C(H}%&Hruy)Bk<{-v%+P|1W>|*Ex)eGGgQ>R~OO4GK=}phYcBKFM!BkTINjkS1Rx8hUR6LRq z2Q;kC89)x6{ccDn9xh>i;`z4Xk4e$Gpq44oh7@y3T|oG^sRv&;Z-l8oVX0Qs{Q5E0 zYH&T{zHi!62|d^9SY0(M!zwb*(+>1q#K55}xuID%YrVz6OQ0CjG&W^R?pm}|0y5!Y zW@2&(!{hmg>)yT1(Nuf$;3ae78-=fN_yG=UQd(LZy~2dgciK2Mq(decA|_ToQW+|S zZoxz)<+v$70O6roxAf&lGj2~`A!5H&{DRpvinFTh>l~Bwh_yy4LeUyp@LAkV~{0rF{EOu;Brh!`4{@x~J2Zs?IF??@w64LjrQUlV zw$=Lvid7?{l7hNyL^cqcE~yD-6e*!dOtRb4SSe%b1WeH|WY>?mFAOvs{L2O2tJ(;> z!Wo#2%=?A*J(wsvDK?)Cdo%;%a%U)fJ%ENrCX$`i{lhplO&hkGx4VqQ#cW(VvH*f2PplCzjF>sP3U`*+kv!ardh zxob+)(lgO1y7<|ZgmE&&Y?tu%&F+2dj7{){zYslq9Z`8BXyn+fzw76cwW2inU|pZ4 zyKET3!^HB2iI$7Lnb1+;d_}jG(@%d6r3TwkV%NM$u<#omm|;Y4Y}EsfWdr`p_(zdNj$9o)uW}U* zqmZ~79P_y-GuwUE_2)-+@5jNe%as*Y0`-xv~x=#P&G1OKz7W9P|Mv6( zXAZlctr5#yaKcbJE#?=DN94Zwx$Qr-AxKC3(1>ZiILQ0hdLm6D9Wl|kNePtpW~(Ez z7x3`H2jA$K%a8wR(G8Mj%w;(Z@|_N_5GLm5hN7Y|j45nR9Le-iNl(ROcZ#B_u$!3J zl3j!ChZxTWhZ>OTrC?INJP=aN5iCt3WwaRZtJY#V_K`b-16nO90i^OMz=maIMo7Mp zv?p@47bY|$=^{j zhhH5TtF0aEE%TwNcJDqp#?1SVPsGNV?N4Ll&lBe&sS^}hfvb=2QL*{ia!8*=%2Y?N zh?6ELvE-jUqS8(BFKcG*mH*97deHc{y)ZEO-$$GF44xm*UOrtU+}mG0g9;8RM_NR? zm;){q#YU>z(*IrWEAmM8)T^56^qCl=*z$6%wqQ$uX=Jo!Xix)v4$3qrkI=^$iJJ1y z;17Nvm>!({erFG~2c>RWCRwO=!W||oaYW}8xi#xXF)KIk>BlFsT$6JD+!#Pj{^^>kLf#p&5CsqJ z=>sBuq{yYdC;0KB)VRzaUDz^&NUdk@LEG+LGCz58{i%UFxX>?v>eILa4~#}2Ir0_@0>4=%_o!1J$;`$5Y3=N?DK?robG)1 zI8xU*Fv>MWB4gl~1TQhbIs(im5Mvy$O(3bQNfA@-ZwoeHL(T~0R2b;~Ri|*h3gm4{ zE1!67J=#w_8408?bWI+T-*!Wal$UXZzvT83^u-9@aNNHyt^RX<^a)EXi^XAoPp~*A zc`Wt^&h&F!W}n2h5EX9PuHixc&5(6LYg>Cze9RZ?FIyk!nR+}7BlLhAzjn6VYW3w) z>5?X!YuzY8=^>C|#!-ES^)~hgkB!e55#KRMahDdt_>uEAOBr|}c?);HC#||UGGrSj z(g;iTk8HXH)JV287?@rC1wfHFvPiR?0t8}=m--i%UjH7oy&vg(gE-3kFFhF?ieUat z$6FMJmI%aZnSYL*dtyhdrqiyL`UZN<`gF7fc}hinYa3!Tu*8_R?;`Gf`ih%G#4xs- zcz)hqeZ6W!W(eVMLZvGBbj9a7?Q4Jh$yc>+uhh1MS0%49S#z=#L9MMhSF>UL zn?&YvG#jpU>@*$NhCqII_q|CRdKm*()cpK>EUfX3C49ORs!CHbskIIc0)#0co8Y<4 zARBkg8_z?zh}%2by{p)0;-+)+ZBtl%0V_s+hxaksHuOLb4FK{}iGx1BXI7xeNjb2T z>+Jevs@+`ZDRxAeYKWL2)*8c<12u1qd~o#Lk@K#cNcgrHEImf$D+sK?YE9VK+w$vu zTR%cUFx~;ocSlx8HKQLuZ2~g%x~qjP5TE3uDaL%ZJ9qru#}{j(M*kwuYj0f?ox8T} z@0s=pgWYvpz|iXVv^G;Y_WObhY#;vM77*k{uMf21kI)I7)e)~(DzTt7nQDcgMmyAoy5kr62-mSAY5B1-=;)6fP3@Qo&aOWU38!xei^{F0Faag69cx(I zTyJC{`buTRSYA^%e?Js>^>#V~@3Td(h<_Yp=Se{RE&@R!c$lG0A z6kBYCNaUCebof;j0vIE-a*_~3fPQ%P^}8c566-n?b=9ymPTZLLeO;fmwNLBIVvPJ{ z(YwGK>yMg%T+3!{FORCfYdDVSpBsX2M z(izA0;#Ry@-R_Jjl)gWZZ0Lb*ytOf5sg^3UcZ1qh@k&}zLH_sKSV+7eH{Mv`wdh>U zgJ=UT%~O?0M7$24BoJb|UKW}mtC*r$;qZe)30le_7$N+gf{mnmvVm~q7~}QrwllCi z+I;0Pb&<{ri&p$oI0+og&&Xw57mHGr!pbg?^S5UY+WFeunf`{#%0{UJ5_~rT2KROw z^j6QRlF*<`)atIZrmeiJ_HB>a_vKpzZ{X4&7knZZ4Naenp6iqJT+i{w2LHzNB@-i3 zgoUXM+mM^NW|85|wJ*n%^!COgitlS2;jyjbA8Wmq{O85~5K}yElo1`CbMT$X$9hAH z0Kd+=-DBVja1%4cb(Y?)Vx~|(vb2sy{Hb7j4uv>^0otBUbWEaJC?dmL1=g=R?ST{D7o+pQ>4Gc!5MFRws?`TI>=r5!D@r^7#I%*$?$|umMAG+-{L` zMb|%oWD?fjWZtAZ_?^uvVIjcuWk zV2{arb>P5AS@%eOV(Q^7U`IadCC85;KWslc%>tsulEl7~^9P-HcSKI=J(n4yaZf2b z3rY84g~Y}A;zHM@yT*R8$Z*%-a{VIFth%z}DmBRXK2)OTF{X%jYl-O!R4dGv!l{#p zGN;rT^ree(FWGYpc>N(oTk9zF1OjyuQlZ=1i2V79CP~Ru<7==*^Z@ne@(F~&c_QHP zb+9{|i0UM&nRm?P6#_jz`Nginjtu?9bV!*g#AMgr5eVhhq6rfBRm<3&4$(S^M+j!g`ddFn?}X`g_D({2MfmY;;_@VZful(vx z{iuNO&xrGB_@jCv17?^eEd>USu1M(00bP1kYu^GIcXh2=-u>S zCwbdhbYf1v#h3w-@U~7P;&4oql;B4kGaq2t1W#nR!V>AF-%242pISKI9P>u%k?P|0 zjF8p=aUv+c!e3i64y&JgwLPvx+YhHMfby-9gtmWinHNGOp-i%O$l+YuI6#H%)t)4} z+JSH*SDt@h?>lPcy)w0Rfk;Nc1)n-Qa*3$e7W-F|j|fCGT7$N61-VZdYLTyv>N;rH z1WeG!PANzg`B{(9)K5uGA^_|?L?LS&x^zhHr2tCQm(N7K?B_`{HW&;Iv`K<8#IYzz zdK<7%_1ffL{e3^n3R-eoFjyF~9e{jWlSfUh5$N;&L$(?aPbZtArrqvFP!nIn9c3!M zy>0yGozPI%-IF>)p23UgTi>k~j~ghk7XC4tYIvWfj}AB2cQmT@)pFLdE=K1c``2&S zdi6+;om_<@hp$l0{29<)uYi9%S81$Y;DLeOU|WYg4*f{iOjl_7Ojn-$!H^i~HM`8e z>d31JOM<~~rT?JbCJNlG4ek}`R#V!L$fS8CfmawKqUCR@U51TSNp0Svzdk+tnzpt+0lWrGHTDZ7Qj#Jg4yEiW z5+~N+KY1zdmXIA26M$rU$u#AN?eCpiFFQ2@A0n;syVq5#lU4wZa#vqj)>U=Rqr8j| zz-5^O*z?a-{}=~)@(N&&Mj@avLdb{=$Hy%!Q$Ss;Hd#Q+Z{h$7ls<=~)~WqFBxznG zk$vy9wM84?fwhq!OBK4sn{JaoX{hiZDN?LmV0Frh1Rqhb=;POA?_k>MQxmhhskcS@ zvF=0*r1tj9g5nk8$Fh#EHbg8&bLkjjnhVf{rS@6ynz&vAZi{?f%M6|R!kv=TSLit( z+`*&NF$9z`p-t3B_%BqdzwYtod8zkSP)a}3Q7an-K^XzJpBqc$B5|I*&gdoB9;~>I zYbIqLQYAg()B=rG;7R&iV(B&qx*#5VG^~Bi=PY9 zBKwS*TOL)#PHs-`*80PHp8p2>p zG3e+2YJ?8j>HBvpdMj|I7gzQvq77@tOSao32VgqFH~IvUTE)a~U{>ox&dydCG0Nhr zhozm35G^q}P4s2K;7$lT`vhh9 zefDxl$4fy=Pwxu~4a~W?s^DwIp&UbbIKChNht@i+7M$OPToi?WHNnoIeBs#N9=3FA zR#;R>DcDB#a=f6k@P!2avgw(acJp!h=#)HTL}ayVaAhHw(W^fF-OVWB2_Jy^^KPFD z!j~(3n7{M;mO)1G!YtY~l)>IhG1}!)L-fk#o$dGV2}9u$ zg*0SN@T4VKYwc1Hgx_M)AptG?-xmMr9I#2z_2;QJnL58wleqARjafQ12Oqw!6E$=s z52;&7sVxQuCmPq(@BEuc?22Enh=0|3c=x0qe zi*ugtNtRgI=b|9A)?|t5;M2E9)gM2&r(IzHxO7(D-8*AhU`Yb|B2aN;4on=t09%@A zlKc<-Jm-SGUP1lnXwE^1Q4+4~eUB9y8`6<&oq4A!8Zc9gYytGvpu_d4_jcTdW+XO6 zC3A*7s7@h6nBixyS;GcBHyIkSk@v=AIAV4eyJ&$Cl2B0rHkx z-n;I3-Y-}TA~$Lp7O#lWDJ0!oL+VI2qhS`|R&RZKuB1wmwBuZ`;VqwB#t+MDk;aI* z(JJz61y;PG-r-?0RReXddrv#~aG43|$$|GnX6Jn=J*UNNuZUh?;rcfxp4giX-z!QTAHn~t=Yd$YUb7cvZ1J-E=MRwGGb>5evhW9G zWS@i%4}`Llb2RUE-o$a)`gMV0(oMg<57DZkv;8u)rn)((ROeOMh|ajjHnU%&1B2ao z4Xm)>6Cc9|&|gl2xlXiR(IO0ID^;+vn|1QuVZGGrL#mDtrz)MUBoi}NIj<(96Z3@j z$cZPWrySZsd|T0!2$i#60&)-50{b~a4+l`ITXQU98Kbd%ol547zlbKrRe)|C_J3Eo zlK}(RK9a^TA3zU$cLY4+`y}St&{nv1ja_2C3%^O-K@#p!RC6s(sZ*?khs5?hfX~5u z4F!!Y=#57>w)&8kTwrr;6UnC)UHU6!yq7g@1d?;`a9w z-!{*{(RBNfFKox(G~EETw&(Zdt)~A{Xdf;BOegj@&nR?nzeL6Pr>MfnQrP1;zZ@an z)tYAadq|~x?|k<60)0L`?&10Hp3?JR{q;ky2dk~7a(19iCczJ+P$xhyZ-p^Rf%B~I zf?tSdD`9k+*=sHL=bo$9$*C`qWvk{^8)RYl|DG^oUljnUL0b=sc0_|5s_|Q=8-cKX zF&-Aei55P?gksSM%pEMfAPv;o&NB21EE?(0T`=1b&~xa}-b%5V+FDRCX?vp_kOP#c z&XM(@PN+#|0MEwWD25b6)K{K!I1y13i12TR1=L9Y-K?t z#XCD*YQT|vyz+MF-eL;qV^$w`UVnLsq#)c0_JMdkz_YvEOfr~do_+@Wjt@Q%Hn~yD zaZxuOR`Lm)GxK3HZFR(zDIt)>={N0;$l{UC0P0YBL^2n@gx$wtK_>uZYKmyP7mwI% z2JVO5ps$P?#*{C=YQt5Ch;FKLi~aNY7hW7sl6^Ri38W<3*C9v$5(#FT;ZyVN(ewh5 z_8f@BgORk!mPf4wp0AAWucl5nZdBfS*d6&yNtyCuf(-8{cl*%k^U~=+`l%k@eL@UF zaS={gLi9%BGFZ+U+gi?sGlY+yZpIMiLn0jMieqaF6<`I*USv^b=E7|OP=~xXFCCLF zv}K{JH8}>`&k9j@YwT|Wsn~#RQr%cgXx{A4>#5q?h#(twy_wa8Fh`w`dAaCTV=0S1 zL}Xa|ey}Q)psYHktGCUY^0W@ORA0~bXms&Jku~nS@dtfwZgr>owg~r`JnNS_0J>%^ z@3MfkF?6eZT)V2z;BGtKB^J$Lfd{ACfu$&%+T1DBALA44orSfoU_sk@YsvLCdr)V* zbw46@xx}3FhS-(8WO_8`v3pI<4C;k{YqgQ|x!NWFes2|6TRhp@B@Wk@oZqk!qAm6k zl(SJ8zo-qDFriUkBtLVM&HLELkrL}6SU*e=$u%|AH zeev?ry0odS!GVNqb_TvCITAB9cFlUv(ec0;vC^jndB}J}9_QGL<6+>*MFBj!DG^Pz z%ytmkac4Wp5y!TR+%zm&>3<5K!&@Q0oaQ(7eT9`Sbj4L9Wmylsoq%0=<~dc~@lHQG zrVUNdeAG3KK$@Rj8o6QWa=LFBl3VHcMq-VEwM%zhdryK4d`robZ)^x0aOU3CRAlSNqF~ts z+1B=YOSiZC?Cw|qUeJQ&BJUO>j~a^cpwJ~P9*edV;tpj^I z0BDYJ>pbmevb#fXr=;gx=C+Smwlt*ft29Na8)?cmv%#l!o!qP(X=9)F8vO0jloZW4 zy|QB4NxLJ6oZ4&~K2Yxm{@2%G=~vF|j+dv)pi(&hJPQKB2RX?CO;h#QNt<-3iNB=rJ~<|;pNz0j1M{LDxfIfiAHx%|a9r%^ zgYTx%a9iW3x0C1zjdBkC48i33&!Z2x`Pqtc-?U6mZp1G3Mm8=k>E1g3rtf9Fd6eR> zS3K4`$7`JZt8#wZR~x5R$w8Dzn2AU!`fNbLnlH+WJ|$5V2+hX=Xa+l#oj+$k0yA&c zSauDw#r=vB)or^bcHOLxti_Y{Yr)hkeBn>Q>8xSF?%=zmL!P-ZNY>$6J6F;Hd$Ni8x9KfGxRyIE)jQvqO!x8 zKE^rci}`cf$T2$rkGp9Gpz?)Bb~O&CJ+OQ_B2#&swko32lvGKdJ>etf;cp9f1d0^| zxa*M4bQTW?2W)n;$_YC3pe@tb(0hF906ssIs`A+euUm#%*pRFlnze8LLLsq(n0PdB zXco*22iagC@$#!U-OvG`KpljLPDRKOod3a|($wM4OK7Grv=|>Mb@1n|{jBwyb?7}^ z5>nR(fG-H*o~OHuXL zPe%%a?PT@uJ0Ndc^ufRwXm5CwJmJ^Q!74rRNWA##?6$glunWJ|g5hwZ8|F^x@AteT z{=Jg~Nuug;6*dq~hK`He`6$}egDsXGLKX*O5s}olsqpl;*ZeRn6?3qIu<<_Xc5SAH z440x2*wcK%A9Prr3fd-(S!jef{<$c-J`7?+g0iYX=8IcBBOHyWO%*(sHUH9r(5~04 zC)}>{Pu54MA+|B7^UEgcRp#j-^A;3uuK8bK|z)&{z2F40@klto}wtgyyW!j^wLAWHoqYbvg z|1dT>Qiw|>I$s-qQ#B=$2w=qcyg~yiCQ>_(XJ5yY>4}9~``t(ZDp&7wW`CB7o9ujl zJWRExmxb}}nSgz1sPx}nzeGFBjb@(Q-+se8brkh&5K4MopSP)_CbGsIFK75HHk;#O`Ks7x{NJ4ZVX8FnRS1wbg)79T07G#M^C-2{3Ly1sH zo>8|w&}>B>3~fFwfFQ{gwmyNw0WE6^9Hf{#K^kRI6aH#VP?!_l|HlR+#09qD@bl#Cr7v+3?bpbfT5NkNiHD$}$h@v=yk+KWzbW zU=6DZ| zc-z#$HlN(Gb**{pi`rkTCtQsc=k5Gsf_9u$M0foeo^6Bq^9l~wzjX?*Dd46u}}RrhiD|dCwWY{_s4AtX}M=wFRSW z*Nz+?@Zoi*U~Zi57mwZVpB~^*eRfspWdsG?QPdMt&h-7goSDv7e=ZgFe-YM?-#i_J znMSExr~cK|`ACOh)SFKXqz|{y7G_G%M=IYXGZnhg4`##;6FhK@!_2XfRZoB74?jhZ z_>L8cQ+@yLoH3ZO%~AKD0oD6^+@;eM1Xgm!FWwPl> z0&}r(od4ux%+`5=?BwJmasYJhO}Y8J@}Dw<3v8!p^ZdgIl<;H@IXSNZlK>r&gk7i; zf@~-s??k%=)?)Syv^)Dy9ugqpZ=`35>;W9SZzerF32;_eNXh_L@LY*|r>Rws#`^cL z8;f7&LV;JbB=0F_eVhE~Bo@9=A1neED0D^Z>ZjwGB13ZgNCLK&YyaH>n7L;$c4?^T zLK^dMlGuz)7r1VOk!BduL-D~E2PmjCHOz)iaU98aarg2x5v8}Qv4=L4a^xsluK4UwqJIGglu9+ zl7dF@SS?dnKZxm0`G2~2UPfqRo8$MsN>nv|(LQQZhluw0N+GL4!qqW=54M`N{KPpDDWPrqBEG8185E>G0cffjj|2SQuN zFZn$=Qj&o=bze8;l(PtEv>H%1>};I`^XP~c=b$xq&-qA~_#UdvXX-Z3-@!hw?PBcH z2^0FMoZBY3x`LU#_`ldBVBR+>Q;A0~$l#-%i%P8&0VSSEEwX!_sV-Ua;j!BgIaqJ= z7gIvN1CAz_ZgeNO!eq81M^ zp6#vdjg~!EX;}qKCV7dQXROgj-6-vv_y2^0O7pRH!88@<#cBZZKuFD}OM&a|!LTRT z|6NNtB;o;la5FZ`&WbS3rrySZs>TR@RnjSf{MA%4kv4G*1QP*_nl zQVR&s_%6DSe)>rfB^3^9_v#$(#~Kc>JR$3WMM}Y!7x}tAp6%MRK5jXR>FV6s4BU&t!RaBrMa9`On`Ig zP%bGeqVyqp3k?ukRW&hbPnid8F1IM&84~D`K_KdrC__IkNl4tRGe842+3u@mNZ4n; z;t>#dUq^2`qNoE*uudVLMf1Xq=#RdXkOs?Ai)e+X7jfIIxHbis*5Nj)mwU8v`%B6f zX6(PipCEf>WRBymi}vd%`lFj(3=_AdHEdK&XQRQ*RPsYzs>59ghtxW-H`a1Xub6B- zNQB4&;kucwSPW&WgN8JZp|-ys>l${3OKhpw&HwA|tDmC$!nYNqyE~Td#RXw$>28n| z1f+8TacSvJDG^Bt0VPygx)&vtu3fsMVPRR`{k${pyng?I@AcC&XU_A?J@=gR%sF>l z7ZU|bUO19+@KeA{h05x&QH{)y$Rh87ppL1hOPCeKvbo(wp_!TvI7!okVAWf;fve@lZCOr}itbL2W6`q!CY%74q>_ zdUpj_LcJvQIHeE6FqE8~65H5FMB~V~(a=#Ez)G3%26f^9&g-VQw9X6<^PQm|w<`_v zElxh^J(WL+r7I@`j&*I#n|9c+QJ|7;MDAJLdc+^+lo}0PhUvd((E^-bc~}p-OglK$ zGO=(IGRn+tn;RLpw{?Rq+C$3|lx$*#DoQ=jPdwTT+qOrPLdWmyi>vq494!F8&pQlQ zt9WfP*&zff&1B>%p z=x!&K?Xx$v>9e(e&y?{2NfMz&csaXrTm@zjdln^DBpvcOT5hFK)wDPugkfJD*I$d1 z{AbRx^sRz|LLw&@$wkgGec2oV!0o9u5X0$@=au@lWMBlbZ{-`NYE%6 z+UGz$d|*9@GUv4v_r1R5Wj9|SLeQk#Mq%gxD$oKPw3+?P;`s_|!$Ct#)5$je!j>3a zfwjJ*eLI%@p+0gI`8X$u5)WVOF4i<<&Ls6Lb>@d9yDsLpZ?a=p{afMbPQ^;MwELDP zKBD7t6=bv(4=2;P906bJ@o_9>^uIz7q=js5`kXogV8+jE4N3^ZI5nP?G#9BXRT92Y zQzcf|Y1(MaSKp#eLp@nyVU999gnO{~QA(+@FwJSSg#r11(81@5d(v^GvO_ANv*(z6 zyAtd5pP`uDsCB06G^c~Lr09HZojR7aZt0|)Mtkb4ix*R2JR+)9FDmEdP4XIVurkcm zOJgWKS3wCCQ}$Ib3{3z!7Wa)NF>NcU-i>7|fwR=faanJMa31q}^YyMBBGP5h49H`1$=DHdz+eAf#eyJ>G<`zzx zz%-VKRtUQ~{#vS;Qen}0ie5gbT-!R^Rb#SrIpPwdVWW(8WJ`WVfaUoTc@Ryk>H z6VV&1nx|j26vE4BH2?BgCfZd=N*tTEqjRCh<2l19Az{Yb!o&^m?CV-qdor2|`%W%N zpuW~uU;Ekn} zG50byY&rG!2yT_jgAl-e&r%QnGuL!i6V>i<ESB8&Z_{oDOo}%x_kh5mS zBG$Kd-qqJHAF=lG`SVg&?O#=3UkK!c>kI3=3kMAEEcT9WkuqyX zRoTscE{a0$B$3zgf#(Y+u>2Rt8#-H)2W;S~#@xsD(&$Lovdl`}sGEUQQ|w#G{k-al z;{K5&oi)`ly1@4|YD1(F=bSE>+_#zhn}NI68|uJ?(oE5X0|!HK_rf$hDT%WhK$>cLs#MZIpeF<~ta zaawW2M?89}5QJ8PhUWwrO6&2S^yWo7o7D&c1zuegasMd`m`X&<1^`w#XuT~7Kfdk{?vgXfON0f`EWfY!@ak<7eF`yA zoEF7~?LPUB$jj(@Lz|Ky#Z@rXW?uAU8J#gqkX4e|pS;|Ob@%{LPCh?yNWaQeNTR$m z6>m%PqKMbf-_!n;pY~d7;gP!C1-}0fhA+^$vO6d(cRZ8PK*6DJQoClYNbOiZHF{?e zO@O2np*S08y*ds)v@np@3eu@BoHC!az}NL61%W{6LMh5B#R@i$)Dq*SJv}F&i~6!= zWi76xHQp;dAj`N!>I~=0cj+6L3xGSG1miT*s7t4z7}ntl?*T@uOQ7IL0MKI+3m6^I zjia4@{(FLYwxkiJa&>5C?Y#`pd7D2W?%ub4!uS*Ngzp^AtpUAe`=I0p{*yMFS`71v z@A|+nVQC#LyEn8s1y#XC_5t|_Kh4lt@u&W7m4BSNB~|;u7(-yfM+b*?h=$TWi%%?h z#e8?pP?V-toRHda(b_OHH;r$6DFL>OpY7DWdijOzmA^vbo@+ta1y1Tb&$by(l{LO# z^Xr;|NmIRRVjWR}5o+rFFFu&KjceA{6~lZMZ)rI)e_THkVSj1DU>2(Dgo_bn9>bzpP)Mivsp9n3Z}B!lXb&R2P|iuM|h#?#9kN3 zNVMn;8Qg1c>n{n#{gG{v9@8Sz5ezeh<`Ai9xXCf{FwcdZ5zMlM_uO8wK?1(D1)=oW+rD%QRMrCcgK`#f(^%- zPuhhnO%rkNq<+n|MW-bygau}{a0xtHjiS7<_lSy8f=93jiBB0BGo#vM3^L=!=S?u;tN5m=K-%!TLy z<(%16#nZp1h}GlW%JB4X9-(h?g9=WH_@)vijzLuIl1S7;=QvuO`m{-H+0%C@L64%i zfT8ShI&i&S=~r=Kp>NM;=XJ{fvps;ZVIHG7cOL-nl2UVW!EJZC!oR`S!lP0A9_cvB0 z(%@5G&ZF6{WP?BgQ_Yx+^S;|4y5Z8O;Sudg{Meto96-8Cur(96&6oNv_(Ia&PwmDE zJWi`w=fik+{Y!Q|cdX}nR*=rlGT~{{*kWpXr^U&> z-_M>#9~N9F!$W1h>6Vo7kr<^x7Hl))rsU<4MG997DaMzpoV-JV3j>|quNz;hM#|G9F4cVf*wh?l!#AYIsN-}x@$R*`1i}DQ94&enKlx2sDqml zA;GuR^VlO*Fuc*VVERYzJl<$%+vN~2w|+dJ6trUN!iJti^0A5cU={%Ur@M!nj9~^q zc|*4|-6ieg<)V9wD_d@^w+nN@Q^D_Pj{um!zCBm(YaQOtbtii_oGXPzFT6bo%LLhc z8bJ`NJWAkbqMgoB2Ne`4bPS3^SNp?bgrA70jSq6C%GZaXY_DT(PVO;fl8D@*PfNLE zbJja*a*IrY{UtmUt;w5Fg3ipCQ$J}|Wjp+u)Q)jlkr?nlXr@wav!20;cl^uEp4T3t_q^wr1QjRV)CJ(d8F|N8l{8wyFQDe- zRDGNU)-b2#)gyE;KFg>!VK;;yp_IzsX_%HPbDu#Q_t{d9!8k^Z;(Wz7iRPgUgc{rw zD;x)fz6A1{Hqre69w{P=JrH%aNpZ_Z>b)i6VMH0lo|J)Xedmw`eq`Bn#xt>m@}Cao z!a>BdH5n8L5vuAc6~`h9wMCvkx@9h7IUGDQftCen4dn$1$Pe@~H#E7i0vn^;Ho?zW z9ncgB=>lgNHT+aZ7GXJ9r{br&*|_E6ga<9h+Zh5M9m@ey09=aoeh0UQQ{^T2B-&3y z+@!O1`QtDB3Q>dCN%}F7hqwHt(oa-}jkp04pt0ceQwP~f=|HDV@nIt#4jzs%h9oiD zEVqvp6;Ek5-vQ?h2+_z+0D+o8H1!m5_1C;3h%2|&%zQ6vMLV=(v44M%U^YA0){MtS z^7mOAnj${lET|s_FNSi4z-h*&yGH+>>wlxe1X&vSzEs^Dn ztM)EtTvr{-oJvKb-X@^4TTrk_qpd?Wm_nc-8xLvMnx$9LEeQfIM-U~)(pyLlo~y;YMlLVAiuuBxEJ{O$pV_RaL`2mP!hhOmG;k?+ zu6%GcnQo|%t^PPC%QVo+mEja*szFS5CZ&^uovnqV+B>`2hNr@%SmFDHXb~jfq^$9Fmk`zX}9?=;26`)!d3|sbVALMkc$LkA5 z8)ZaCYrK|^c2;lYYP88w67;g^Spj zEBL>s+p?YVyr<-nKa|BC9eq4@V2g0m#18bh{?EaCf9FHbytes!L(di#IQkVs+mp6? zm0nVgXVx2}Jr*%o;|BbGn@bsi=|sZsyqJ)D1Zal;Ebh2Uz1pXZrVGo^80L!vsm5O8 z&u&QJ+i4;-Dnm3ctu1=t>4wa$1FR5@P`D2Rl2=pB=#TeF8UsRAt78LDIT4lX0q0(b zqdNsABDXWf=Uv6U8fZkD_g>vrLXf$+dVZCQ$V?lVl-3{3;38nO4&|lBeP~K(5$It9 z;gi#(0z{xIL8GZ}Kf$8p4(qkL5%VsqtZ`9II){LGzo6~hJ4T^8*+n3ebM)o6=d>c|hZ{fH3U&VU zgQQON<;KnM9=Vg{${?UK)i{%w2<597{^mL+-EQnMli@E+N~;?jH;kH(w3hXmI6?0X zrsZN1O7z631=tCQ+nT8Yw|L_k{jp+U`g41_F`%O>>DFAP=Ech~{fOjh2Krxh4a?d1 zfn#au;a5eYFicO+5R=Szxn@nG>3w65rU8I_W;4In6_d;d>t(MuyBqYEIpF^2@NrsB zuO;-?L-j{=6-%A=aCB{azXuoWZ8{%>Xqwy=H*@D7Sq+iBzao^U^EGBkE zxpH)!vp#ru)#waB4tqa&fw&>}LjrzPc7``W>_$@-jTgQekZ1+{^eOPPla_ff*=r@> zwRF_vTryBaZy9q}&O&AJFuntsMJMSM&T>o9gYm@bYUz_<&!V9}+H(2uUW!onT}nx> zt|GZ4enq=0tUqM5ljJnfRcsvh{l@V%+hmW$Rv=&Tl9?pER-MP;0tWIej~2JY-Fi`f z<>?}rBrD~T>eMc(Xx*D2CUMBHl^CYxuGqWywcf17zuxE)eBu=$Wk<=MChnB2a z^fpm*SLy%#CdP`T76@W6<-Z5C(j{jkk?}txEs$HH`80eHo!0+1=fBB^z?TXfEut8O ziU0q4b5}a1yykf{KiQpPywe+(26is(pz{{h;>$8NOeADmQTY#{vysR}gKdA>gX z0QCvuj;Mct(8r;xVEz~30vH3={=v2J|CT8O_jtn8k3;=haTOn6psA{-@ Date: Wed, 10 Apr 2024 16:53:22 +0800 Subject: [PATCH 185/339] Fix bugs related to addMenu --- docs/UserGuide.md | 66 ++++++++++++++++++------------ src/main/java/git/Git.java | 3 +- src/main/java/git/Parser.java | 15 ++++--- src/main/java/git/Ui.java | 70 +++++++++++++++++++++----------- src/main/java/user/UserInfo.java | 4 +- 5 files changed, 100 insertions(+), 58 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0211e4ff90..d63c989283 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -44,33 +44,25 @@ Example of usage: ## Grocery management mode ### Adding a new grocery: `add` -Adds a grocery. +Adds a grocery and any desired additional details. Format: `add GROCERY` -* `Grocery` must be a valid String. +* `GROCERY` must be a valid String. +* After executing `add GROCERY`, GiT will ask if the user wishes to include additional details. + * If so, the user has to enter the numbers corresponding to the details they wish to add. + * Multiple numbers can be entered in any order and spaces between numbers are ignored. + * Details are prompted for in the order their numbers are entered. + * If `8` is entered, another menu explaining what each detail means will always be displayed first. + * Invalid values are ignored. + * This step can be skipped by inputting nothing. +* Any details not included here can be edited using other commands in the future. -Example of usage: - -`add milk` - -  -### Setting the expiration date of a grocery: `exp` -Sets the expiration date of a grocery. - -Format: `exp GROCERY d/EXPIRATION_DATE` - -* `EXPIRATION_DATE` must be a in yyyy-MM-dd format. - -Example of usage: - -`exp milk d/2024-07-20` - -  -### Adding Details to a Grocery: Extended Options -After executing add GROCERY, you will see: +Example of usage : ``` -Do you want to include the following details? +>> add milk + +Before adding milk, do you want to include the following details? 1. Category 2. Amount 3. Location @@ -79,13 +71,37 @@ Do you want to include the following details? 6. Threshold Amount 7. Remark 8. Help -9. Skip Please enter the number of the details you want to include: You may enter multiple numbers. (e.g. 1234) +If nothing or invalid values are entered, no additional details are included! + +>> 23 + +Including Amount +Please enter the amount (e.g. 3): + +>> 5 + +Including Location +Please enter the location (e.g. freezer first compartment) + +>> cabinet + +cheese added! +- - - - - ``` -Example of usage : -`124` +  +### Setting the expiration date of a grocery: `exp` +Sets the expiration date of a grocery. + +Format: `exp GROCERY d/EXPIRATION_DATE` + +* `EXPIRATION_DATE` must be a in yyyy-MM-dd format. + +Example of usage: + +`exp milk d/2024-07-20`   ### Setting the amount of a grocery: `amt` diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 22766df52b..775a9e6862 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -26,7 +26,8 @@ public Git() { * Runs Git. */ private void run() { - ui.printWelcome(); + String username = ui.printWelcome(); + parser.setUsername(username); String mode = null; boolean isInitialised = false; diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index fa5e4399f1..de85fc8e8c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -44,8 +44,7 @@ public class Parser { public Parser(Ui ui) { groceryList = new GroceryList(); foodList = new FoodList(); - String userName = Ui.getUserName(); - userInfo = new UserInfo(userName); + userInfo = new UserInfo(); recipeList = new RecipeList(); this.ui = ui; isRunning = true; @@ -165,6 +164,13 @@ public void caloriesManagement(String[] commandParts) throws GitException { } } + /** + * Sets username after user input. + */ + public void setUsername(String username) { + userInfo.setName(username); + } + /** * Handles commands related to the user's profile. * @@ -303,9 +309,6 @@ public void groceryManagement(String[] commandParts) throws GitException { } } - - - /** * Handles commands related to adding or deleting a grocery. * @@ -321,7 +324,7 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro throw new EmptyInputException("grocery"); } Grocery grocery = new Grocery(commandParts[1]); - ui.printAddMenu(grocery); + ui.promptAddMenu(grocery); groceryList.addGrocery(grocery); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 6d63499f97..c8c97dd8fa 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import java.util.Set; +import java.util.LinkedHashSet; import exceptions.GitException; import exceptions.InvalidCommandException; @@ -58,7 +60,7 @@ public static String getUserName() { /** * Prints welcome message. */ - public void printWelcome() { + public String printWelcome() { final String gitlogo = " ______ _ _________\n" + " .' ___ | (_)| _ _ |\n" + @@ -81,6 +83,8 @@ public void printWelcome() { } printHello(userName); displayHelp(); + + return userName; } /** @@ -144,12 +148,37 @@ public String[] processInput() { } /** - * Prints the add grocery menu. + * Prompts user for additional details when adding a grocery. * * @param grocery The grocery to be added. */ - public void printAddMenu(Grocery grocery) { - System.out.println("Do you want to include the following details?"); + public void promptAddMenu(Grocery grocery) { + printAddMenu(grocery.getName()); + String rawInput = in.nextLine().replaceAll(" ", ""); + + // Help is always shown first + if (rawInput.contains("8")) { + System.out.println("Displaying help:"); + singleUi.displayAddHelp(); + printLine(); + rawInput = rawInput.replaceAll("8",""); + } + + // Remove duplicates + StringBuilder addNums = new StringBuilder(); + for (char choice : rawInput.toCharArray()) { + if (!addNums.toString().contains(String.valueOf(choice))) + addNums.append(choice); + } + + processAddMenu(grocery, addNums.toString()); + } + + /** + * Prints the additional details menu. + */ + public void printAddMenu(String name) { + System.out.println("Before adding " + name + ", do you want to include the following details?"); System.out.println("1. Category"); System.out.println("2. Amount"); System.out.println("3. Location"); @@ -158,14 +187,19 @@ public void printAddMenu(Grocery grocery) { System.out.println("6. Threshold Amount"); System.out.println("7. Remark"); System.out.println("8. Help"); - System.out.println("9. Skip"); - System.out.println("Please enter the number of the details you want to include:"); + System.out.println("Please enter the numbers of the details you want to include:"); System.out.println("You may enter multiple numbers. (e.g. 1234)"); - - // Reading the user input as a string - String input = singleUi.processInput()[0]; - // Iterating over each character in the string - for (char choice : input.toCharArray()) { + System.out.println("To skip this step, do not enter any values."); + } + + /** + * Processes the additional details of the grocery to be added. + * + * @param grocery The grocery to be added. + * @param addNums String containing the numbers of the additional details to be added. + */ + public void processAddMenu (Grocery grocery, String addNums) { + for (char choice : addNums.toCharArray()) { switch (choice) { case '1': System.out.println("Including Category"); @@ -216,29 +250,17 @@ public void printAddMenu(Grocery grocery) { grocery.setRemark(remark); break; - case '8': - System.out.println("Displaying help"); - singleUi.displayAddHelp(); - break; - - case '9': - System.out.println("Skipping additional details"); - break; - default: System.out.println("Invalid choice: " + choice); break; } - if (choice == '6') { - break; - } + printLine(); } } /** * Prompts user for expiration date. - * * Validates the input date for correct format and future dates. * * @return Formatted expiration date in the format YYYY-MM-DD. diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index 509d3bcd1b..3501c3625a 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -18,8 +18,8 @@ public class UserInfo { private double caloriesCap; private double currentCalories; - public UserInfo(String name) { - this.name = name; + public UserInfo() { + this.name = null; this.weight = 0; this.height = 0; this.age = 0; From db5809b0ae58302ba1579561ff1a95abfedde5c5 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 16:59:09 +0800 Subject: [PATCH 186/339] Fix checkstyle issues --- docs/UserGuide.md | 2 +- src/main/java/git/Ui.java | 5 ++--- src/main/java/grocery/Grocery.java | 4 +++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d63c989283..43ff7ae779 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -73,7 +73,7 @@ Before adding milk, do you want to include the following details? 8. Help Please enter the number of the details you want to include: You may enter multiple numbers. (e.g. 1234) -If nothing or invalid values are entered, no additional details are included! +To skip this step, do not enter any values. >> 23 diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index c8c97dd8fa..fc6b78fed3 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -5,8 +5,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; -import java.util.Set; -import java.util.LinkedHashSet; import exceptions.GitException; import exceptions.InvalidCommandException; @@ -167,8 +165,9 @@ public void promptAddMenu(Grocery grocery) { // Remove duplicates StringBuilder addNums = new StringBuilder(); for (char choice : rawInput.toCharArray()) { - if (!addNums.toString().contains(String.valueOf(choice))) + if (!addNums.toString().contains(String.valueOf(choice))) { addNums.append(choice); + } } processAddMenu(grocery, addNums.toString()); diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 832c078cbb..4e8dc7f78c 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -83,7 +83,9 @@ public LocalDate getExpiration() { return expiration; } - public String getCategory() {return this.category;} + public String getCategory() { + return this.category; + } public double getCost() { return this.cost; From c9fe1df852ecfe75db180dd6b0c42a2ac39441e9 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 20:02:34 +0800 Subject: [PATCH 187/339] Fix more PED bugs --- docs/UserGuide.md | 74 ++++++++++--------- .../exceptions/InvalidAmountException.java | 2 +- src/main/java/git/Ui.java | 21 ++++-- src/main/java/grocery/GroceryList.java | 59 ++++++++++----- 4 files changed, 96 insertions(+), 60 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 43ff7ae779..e5194243df 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -26,7 +26,7 @@ It allows users to track and manage their groceries around their home easily. > * Features requiring the `GROCERY` input are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. -## Switch between different modes: `switch` +## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. GiT comes in different modes and will prompt the user to choose their desired mode. @@ -141,6 +141,7 @@ Example of usage: `cost milk $1.20` +   ### Setting the threshold of a grocery: `th` Sets the threshold amount of a grocery. @@ -154,8 +155,9 @@ Example of usage: `th milk a/1` +   -### View a list of groceries that are low in stock: `low` +### Viewing a list of groceries that are low in stock: `low` Shows a list of groceries below the threshold amount. Format: `low` @@ -164,6 +166,18 @@ Example of usage: `low` + +  +### Adding rating and review of a grocery: `rate` +Adds rating and review of an existing grocery + +Format: `rate GROCERY` + +Example of usage: + +`rate milk` + +   ### Finding groceries: `find` Find groceries containing a given keyword in their name. @@ -190,15 +204,6 @@ Example of usage: `loc freezer` -  -### Adding rating and review of a grocery: `rate` -Adds rating and review of an existing grocery - -Format: `rate GROCERY` - -Example of usage: - -`rate milk`   ### Storing a grocery in a storage location: `store` @@ -213,25 +218,6 @@ Example of usage: `store paprika l/spice rack` -  -### Viewing storage locations and their groceries: `listloc` -View all storage locations being tracked, or the groceries stored in a given location - -Format: `listloc [LOCATION]` - -* `LOCATION` is an optional parameter. -* Without `LOCATION`, all storage locations will be displayed. -* With `LOCATION`, all groceries in the given `LOCATION` will be displayed - -Example of usage: - -* `listloc` - -![Listl example output](images/featureExampleOutputs/ListlExOut.png) - -* `listloc cubby` - -![Listl LOCATION example output](images/featureExampleOutputs/ListlLocExOut.png)   ### Removing a storage location: `delloc` @@ -244,7 +230,7 @@ Example of usage: `delloc cabinet`   -### List all groceries: `list` +### Listing all groceries: `list` Shows a list of all groceries you have. Format: `list` @@ -254,7 +240,7 @@ Example of usage: `list`   -### List all groceries by price: `listcost` +### Listing all groceries by price: `listcost` Shows a list of all groceries you have, sorted by price. Format: `listcost` @@ -264,7 +250,7 @@ Example of usage: `listcost`   -### List all groceries by expiration date: `listexp` +### Listing all groceries by expiration date: `listexp` Shows a list of all groceries you have, sorted by expiration date. Format: `listexp` @@ -273,6 +259,27 @@ Example of usage: `listexp` +  +### Listing storage locations and their groceries: `listloc` +View all storage locations being tracked, or the groceries stored in a given location + +Format: `listloc [LOCATION]` + +* `LOCATION` is an optional parameter. +* Without `LOCATION`, all storage locations will be displayed. +* With `LOCATION`, all groceries in the given `LOCATION` will be displayed + +Example of usage: + +* `listloc` + +![Listl example output](images/featureExampleOutputs/ListlExOut.png) + +* `listloc cubby` + +![Listl LOCATION example output](images/featureExampleOutputs/ListlLocExOut.png) + +   ## Calories management mode @@ -343,6 +350,7 @@ Fry the egg. Add salt. Serve. Fried Egg added! ``` +   ### List all the recipes: `list` Shows all the recipe titles. diff --git a/src/main/java/exceptions/InvalidAmountException.java b/src/main/java/exceptions/InvalidAmountException.java index d7a2cd3248..73183ad606 100644 --- a/src/main/java/exceptions/InvalidAmountException.java +++ b/src/main/java/exceptions/InvalidAmountException.java @@ -8,6 +8,6 @@ public class InvalidAmountException extends GitException { * Constructs InvalidAmountException. */ public InvalidAmountException() { - message = "Please input a valid integer!"; + message = "Please input a valid integer that is greater than 0!"; } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index fc6b78fed3..2cf5ddc0cf 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,6 +9,7 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; +import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; @@ -775,6 +776,11 @@ public Location promptForLocation() { System.out.println("Please enter the location (e.g. freezer first compartment)"); String name = in.nextLine().strip(); + while (name.isBlank()) { + System.out.println("The location cannot be empty!"); + name = in.nextLine().strip(); + } + Location location; try { location = LocationList.findLocation(name); @@ -922,14 +928,13 @@ public static void displayHelp() { public void displayAddHelp() { System.out.println( "Here are some details you can include when adding a grocery:\n" + - "Category - Enter the category of the grocery.\n" + - "Amount - Enter the amount of the grocery.\n" + - "Location - Enter the location of the grocery.\n" + - "Expiration Date - Enter the expiration date of the grocery.\n" + - "Cost - Enter the cost of the grocery.\n" + - "Minimum Amount - Enter the minimum amount of the grocery to set reminder.\n" + - "Skip - Skip adding additional details." - ); + "1. Category - what type of grocery is it.\n" + + "2. Amount - how much of the grocery is stored.\n" + + "3. Location - where the grocery is stored.\n" + + "4. Expiration Date - when the grocery expires.\n" + + "5. Cost - how much did the grocery cost.\n" + + "6. Threshold Amount - the minimum amount of the grocery that sets reminder.\n" + + "7. Remark - extra information about the grocery.\n"); } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index fc02480baa..bb33a2004b 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -178,6 +178,29 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); Ui.printCategorySet(grocery); } + + /** + * Checks whether the amount inputted by the user is valid. + * + * @param amountString String of amount inputted by the user. + * @return Valid amount. + * @throws InvalidAmountException Thrown if the amount is not a valid integer that is greater than 0 + */ + private int checkAmount (String amountString) throws InvalidAmountException { + int amount; + try { + amount = Integer.parseInt(amountString); + } catch (NumberFormatException e) { + throw new InvalidAmountException(); + } + + if (amount <= 0) { + throw new InvalidAmountException(); + } + + return amount; + } + /** * Sets the amount of an existing grocery. * @@ -195,13 +218,7 @@ public void editAmount(String details, boolean use) throws GitException { } Grocery grocery = getGrocery(amtParts[0].strip()); String amountString = amtParts[1].strip(); - - int amount; - try { - amount = Integer.parseInt(amountString); - } catch (NumberFormatException e) { - throw new InvalidAmountException(); - } + int amount = checkAmount(amountString); // "use" is not valid if an amount was not previously set if (use && grocery.getAmount() == 0) { @@ -254,14 +271,10 @@ public void editThreshold(String details) throws GitException { String [] amtParts = checkDetails(details, "th", "a/"); Grocery grocery = getGrocery(amtParts[0].strip()); String thresholdString = amtParts[1].strip(); + int threshold = checkAmount(thresholdString); - try { - int threshold = Integer.parseInt(thresholdString); - grocery.setThreshold(threshold); - Ui.printThresholdSet(grocery); - } catch (NumberFormatException e) { - throw new InvalidAmountException(); - } + grocery.setThreshold(threshold); + Ui.printThresholdSet(grocery); } /** @@ -349,8 +362,13 @@ public void listLowStocks() { * Sorts the groceries by expiration date. */ public void sortByExpiration() { - Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); - Ui.printGroceryList(groceries); + int size = groceries.size(); + if (size == 0) { + Ui.printNoGrocery(); + } else { + Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); + Ui.printGroceryList(groceries); + } } /** @@ -401,8 +419,13 @@ public void sortByCost() { * Sorts the groceries by category. */ public void sortByCategory(){ - Collections.sort(groceries, Comparator.comparing(Grocery::getCategory)); - Ui.printGroceryList(groceries); + int size = groceries.size(); + if (size == 0) { + Ui.printNoGrocery(); + } else { + Collections.sort(groceries, Comparator.comparing(Grocery::getCategory)); + Ui.printGroceryList(groceries); + } } /** * Removes a grocery. From 15f3841c24a414961ade62fcb66e15421689bbd4 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 20:10:08 +0800 Subject: [PATCH 188/339] Fix checkstyle issue --- src/main/java/git/Ui.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 2cf5ddc0cf..a4062101a5 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -9,7 +9,6 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.InvalidCostException; -import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import exceptions.PastExpirationDateException; From 2bde7e6ffa93a8670c5b1f97e9b013207bb6c46f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 20:38:19 +0800 Subject: [PATCH 189/339] Update NoSuchObject exceptions thrown with more information --- src/main/java/grocery/GroceryList.java | 9 +++++---- src/main/java/grocery/location/LocationList.java | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index bb33a2004b..0aa1a9ee5b 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -69,7 +69,7 @@ public void addGrocery(Grocery grocery) { */ private boolean isGroceryExists(String name) { for (Grocery grocery : groceries) { - if (grocery.getName().equals(name)) { + if (grocery.getName().equalsIgnoreCase(name)) { return true; } } @@ -96,7 +96,7 @@ private Grocery getGrocery(String name) throws NoSuchObjectException { assert groceries != null : "Found grocery should not be null"; return groceries.get(index); } else { - throw new NoSuchObjectException("grocery"); + throw new NoSuchObjectException("grocery (" + name + ")"); } } @@ -119,9 +119,10 @@ private String[] checkDetails(String details, String command, String parameter) // Check if the grocery exists if (!isGroceryExists(detailParts[0].strip())) { - throw new NoSuchObjectException("grocery"); - } + throw new NoSuchObjectException("grocery (" + detailParts[0].strip() + ")"); + } + // Missing parameter if (detailParts.length < 2) { throw new CommandWrongFormatException(command, parameter); } diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java index 98c140177a..f8191b671e 100644 --- a/src/main/java/grocery/location/LocationList.java +++ b/src/main/java/grocery/location/LocationList.java @@ -57,7 +57,7 @@ public static void removeLocation(String name) throws EmptyInputException, NoSuc */ public static Location findLocation(String name) throws NoSuchObjectException { if (locations.isEmpty()) { - throw new NoSuchObjectException("location"); + throw new NoSuchObjectException("location (" + name + ")"); } int index = -1; @@ -71,7 +71,7 @@ public static Location findLocation(String name) throws NoSuchObjectException { if (index != -1) { return locations.get(index); } else { - throw new NoSuchObjectException("location"); + throw new NoSuchObjectException("location (" + name + ")"); } } From f2ed673e2b6c4cb2e6e75f1e5dd3dbde7e361cac Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 21:20:07 +0800 Subject: [PATCH 190/339] Fix fatal del bug related to storage locations --- docs/UserGuide.md | 12 ++++++++++++ src/main/java/grocery/GroceryList.java | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e5194243df..852f771794 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -91,6 +91,18 @@ cheese added! - - - - - ``` + +  +### Deleting a grocery: `del` +Delete a grocery. + +Format: `del GROCERY` + +Example of usage: + +`del pork` + +   ### Setting the expiration date of a grocery: `exp` Sets the expiration date of a grocery. diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 0aa1a9ee5b..459dcc5ad7 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -443,7 +443,9 @@ public void removeGrocery(String name) throws GitException { Grocery grocery = getGrocery(name); groceries.remove(grocery); Location location = grocery.getLocation(); - location.removeGrocery(grocery); + if (location != null) { + location.removeGrocery(grocery); + } Ui.printGroceryRemoved(grocery, groceries); } From e877ef94401804bfa93a6d0856de2e1e60f37e34 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 21:51:14 +0800 Subject: [PATCH 191/339] Prevent duplicate groceries from being added --- .../java/exceptions/DuplicateGroceryException.java | 13 +++++++++++++ src/main/java/git/Parser.java | 6 ++++++ src/main/java/grocery/GroceryList.java | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/java/exceptions/DuplicateGroceryException.java diff --git a/src/main/java/exceptions/DuplicateGroceryException.java b/src/main/java/exceptions/DuplicateGroceryException.java new file mode 100644 index 0000000000..38f82722a8 --- /dev/null +++ b/src/main/java/exceptions/DuplicateGroceryException.java @@ -0,0 +1,13 @@ +package exceptions; + +/** + * Represents the exception thrown when the user tries to add a duplicate of a grocery. + */ +public class DuplicateGroceryException extends GitException { + /** + * Constructs DuplicateGroceryException. + */ + public DuplicateGroceryException(String input) { + message = "The grocery (" + input + ") already exists, duplicate will not be added."; + } +} diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index de85fc8e8c..90d32ccb6c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -6,6 +6,7 @@ import enumerations.Mode; import enumerations.ProfileCommand; import enumerations.RecipeCommand; +import exceptions.DuplicateGroceryException; import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.emptyinput.EmptyInputException; @@ -323,6 +324,11 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro if (name == null || name.isBlank()) { throw new EmptyInputException("grocery"); } + + if (groceryList.isGroceryExists(name)) { + throw new DuplicateGroceryException(name); + } + Grocery grocery = new Grocery(commandParts[1]); ui.promptAddMenu(grocery); groceryList.addGrocery(grocery); diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 459dcc5ad7..e3818b185d 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -67,7 +67,7 @@ public void addGrocery(Grocery grocery) { * @param name Name of the grocery. * @return True if the grocery exists, false otherwise. */ - private boolean isGroceryExists(String name) { + public boolean isGroceryExists(String name) { for (Grocery grocery : groceries) { if (grocery.getName().equalsIgnoreCase(name)) { return true; From e55af58c291ff38ff185e804b3fb5d168a708da7 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Wed, 10 Apr 2024 21:54:02 +0800 Subject: [PATCH 192/339] Update tests to match new exceptions --- src/test/java/grocery/GroceryListTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 7ef01ab66f..530fef5e61 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -34,7 +34,7 @@ public void editExpiration_noSuchGrocery_exceptionThrown() { gl.editExpiration("nonexistentGrocery d/2024-07-19"); fail("Expected NoSuchGroceryException not thrown"); } catch (NoSuchObjectException e) { - assertEquals("The grocery does not exist!", e.getMessage()); + assertEquals("The grocery (nonexistentGrocery) does not exist!", e.getMessage()); } catch (GitException e) { fail("Expected NoSuchGroceryException, but another GitException was thrown"); } @@ -74,7 +74,7 @@ public void removeGrocery_groceryDelete_exceptionThrown() { fail("Expected NoSuchGroceryException not thrown"); } catch (GitException e) { // NoSuchGroceryException - assertEquals("The grocery does not exist!", e.getMessage()); + assertEquals("The grocery (food) does not exist!", e.getMessage()); } } From 9c9e94adb82ede9c7315a97857bca7464c410549 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 10:19:30 +0800 Subject: [PATCH 193/339] Trimmed Recipe output --- src/main/java/recipe/Recipe.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index 5bea7d6590..afa15f720e 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -32,12 +32,12 @@ public void viewRecipe() { System.out.println("Recipe title: " + title + "\n"); System.out.println("Ingredients: "); for (String currIngredient : ingredients) { - System.out.println("- " + currIngredient); + System.out.println("- " + currIngredient.trim()); } System.out.println("\nSteps: "); int index = 1; for (String currStep : steps) { - System.out.println(index + ": " + currStep); + System.out.println(index + ": " + currStep.trim()); index += 1; } } From 5a82d2a1f059a189132903ec42944f5950a41d79 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 10:24:13 +0800 Subject: [PATCH 194/339] Amend my PPP --- docs/AboutUs.md | 14 ++++++------ docs/team/luoyu-uwu.md | 49 ++++++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index e62407bd0c..aafca7a97e 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) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/) | [Portfolio](team/luoyu-uwu.md) | +| Display | Name | Github Profile | Portfolio | +|-----------------------------------------------------|:------------------:|:--------------------------------------------:|:---------------------------------:| +| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/luoyu-uwu) | [Portfolio](team/luoyu-uwu.md) | diff --git a/docs/team/luoyu-uwu.md b/docs/team/luoyu-uwu.md index e1cb2e3b30..ee7fe0e356 100644 --- a/docs/team/luoyu-uwu.md +++ b/docs/team/luoyu-uwu.md @@ -1,35 +1,38 @@ # Luo Yu's Project Portfolio Page + ## Project: Grocery in Time -Grocery in Time is a desktop application used for keeping track of groceries. +Grocery in Time is a desktop application used for keeping track of groceries. The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. -Given below are my contributions to the project. -* New Feature: Added the ability to store grocery prices. - * What it does: allows the user to view the cost of a grocery and sort groceries by price in descending order. - * Justification: This feature improves the product significantly as user can track how much they are spending. +Given below are my contributions to the project. +* New Feature: Added the ability to store grocery prices. + * What it does: allows the user to view the cost of a grocery and sort groceries by price in descending order. + * Justification: This feature improves the product significantly as user can track how much they are spending. * New Feature: Added the ability to store grocery threshold amount. - * What it does: allows the user to view low-stock groceries and receive reminders when consumption dips below set thresholds. - * Justification: This feature greatly enhances the product by keeping users informed about which groceries need replenishing. + * What it does: allows the user to view low-stock groceries and receive reminders when consumption dips below set thresholds. + * Justification: This feature greatly enhances the product by keeping users informed about which groceries need replenishing. * New Feature: Added the ability to select different modes and switch between them. - * What it does: allows the users to seamlessly switch between grocery, profile, calories, and recipe management modes. - * Justification: This feature enhances user experience by facilitating easy navigation between various functions. + * What it does: allows the users to seamlessly switch between grocery, profile, calories, and recipe management modes. + * Justification: This feature enhances user experience by facilitating easy navigation between various functions. * New Feature: Added the ability to consumed food. - * What it does: allows the user to input their details to calculate target calorie intake, track consumed calories, - and receive reminders if they exceed their target intake. - * Justification: - This feature significantly enhances the product by enabling users to monitor their calorie intake effectively. + * What it does: allows the user to input their details to calculate target calorie intake, track consumed calories, + and receive reminders if they exceed their target intake. + * Justification: + This feature significantly enhances the product by enabling users to monitor their calorie intake effectively. * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luoyu-uwu&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) * Documentation - * User Guide: - * Added documentation for the features `switch`, `cost`, `th`, `low`, `eat`, `view` and `update`. - * Developer Guide: - * Added implementation details of the `list` and `listcost` feature. - * Added `Calories Management Mode` sequence diagram. + * User Guide: + * Added documentation for the features `switch`, `cost`, `th`, `low`, `eat`, `view` and `update`. + * Developer Guide: + * Added implementation details of the `list` and `listcost` feature. + * Added `Calories Management Mode` sequence diagram. -* Review/mentoring contributions: - * [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18) , - [#49](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/49), - [#60](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/60), - [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73) \ No newline at end of file +* Review/mentoring contributions: + * [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18) , + [#49](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/49), + [#60](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/60), + [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73), + [#153](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/153), + [#154](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/154). \ No newline at end of file From 3dbcf39d718533173800f1bbde58d9b224296ea7 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 10:49:41 +0800 Subject: [PATCH 195/339] extracted RecipeUi from Ui --- docs/UserGuide.md | 2 +- src/main/java/git/Parser.java | 12 +-- src/main/java/git/RecipeUi.java | 122 +++++++++++++++++++++++++++ src/main/java/git/Ui.java | 98 +-------------------- src/main/java/recipe/RecipeList.java | 9 +- 5 files changed, 137 insertions(+), 106 deletions(-) create mode 100644 src/main/java/git/RecipeUi.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 852f771794..0cf23db593 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -354,7 +354,7 @@ Fried Egg Please enter the ingredients for this recipe in one line: -egg,salt +egg, salt Please enter the steps for this recipe in one line: diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 90d32ccb6c..9e364a2a80 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -31,6 +31,7 @@ public class Parser { private FoodList foodList; private UserInfo userInfo; private Ui ui; + private RecipeUi recipeUi; private RecipeList recipeList; private boolean isRunning; @@ -46,6 +47,7 @@ public Parser(Ui ui) { groceryList = new GroceryList(); foodList = new FoodList(); userInfo = new UserInfo(); + recipeUi = new RecipeUi(); recipeList = new RecipeList(); this.ui = ui; isRunning = true; @@ -236,11 +238,11 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn switch (command) { case ADD: - String title = ui.promptForTitle(); - String ingredients = ui.promptForIngredients(); + String title = recipeUi.promptForTitle(); + String ingredients = recipeUi.promptForIngredients(); String[] ingredientsList = ingredients.split("[,]"); ArrayList ingredientsArr = new ArrayList(Arrays.asList(ingredientsList)); - String steps = ui.promptForSteps(); + String steps = recipeUi.promptForSteps(); String[] stepsList = steps.split("[.]"); ArrayList stepsArr = new ArrayList(Arrays.asList(stepsList)); recipeList.addRecipe(new Recipe(title, ingredientsArr, stepsArr)); @@ -251,13 +253,13 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn break; case VIEW: - String titleView = ui.promptForTitle(); + String titleView = recipeUi.promptForTitle(); Recipe recipeToView = recipeList.getRecipe(titleView); recipeToView.viewRecipe(); break; case DELETE: - String recipeTitle = ui.promptForTitle(); + String recipeTitle = recipeUi.promptForTitle(); recipeList.removeRecipe(recipeTitle); break; diff --git a/src/main/java/git/RecipeUi.java b/src/main/java/git/RecipeUi.java new file mode 100644 index 0000000000..a864a959b1 --- /dev/null +++ b/src/main/java/git/RecipeUi.java @@ -0,0 +1,122 @@ +package git; + +import recipe.Recipe; + +import java.util.ArrayList; +import java.util.Scanner; + +/** + * Deals with interactions with the user in Recipe mode. + */ +public class RecipeUi { + // ATTRIBUTES + public static final String DIVIDER = "- - - - -"; + private static Scanner in; + + // METHODS + + /** + * Constructs Ui and initialises Scanner to read input. + */ + public RecipeUi() { + in = new Scanner(System.in); + } + + + /** + * Prompts user for title when adding recipe in RECIPE mode. + * + * @return the title of the recipe + */ + public String promptForTitle() { + String title = null; + while (title == null) { + System.out.println("Please enter the title of the recipe (e.g. fried egg):"); + title = in.nextLine().trim(); + if (title.isEmpty()) { + System.out.println("Invalid input. Title cannot be empty."); + title = null; + } + } + return title; + } + + /** + * Prompts user for ingredients when adding recipe in RECIPE mode. + * + * @return the ingredients in a single line, trimmed only + */ + public String promptForIngredients() { + String ingredients = null; + while (ingredients == null) { + System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); + ingredients = in.nextLine().trim(); + if (ingredients.isEmpty()) { + System.out.println("Invalid input. Ingredients cannot be empty."); + ingredients = null; + } + } + return ingredients; + } + + /** + * Prompts user for steps when adding recipe in RECIPE mode. + * + * @return the steps in a single line, trimmed only + */ + public String promptForSteps() { + String steps = null; + while (steps == null) { + System.out.println("Please enter the steps for this recipe in one line " + + "(e.g. Fry the egg. Add salt. Serve.):"); + steps = in.nextLine().trim(); + if (steps.isEmpty()) { + System.out.println("Invalid input. Steps cannot be empty."); + steps = null; + } + } + return steps; + } + + /** + * Informs the user that the recipe has been added to the recipe list. + * + * @param recipe Recipe added. + */ + public static void printRecipeAdded(Recipe recipe) { + assert !(recipe.getTitle().isEmpty()) : "grocery name should not be empty"; + System.out.println(recipe.getTitle() + " added!"); + } + + /** + * Prints out when there are no recipe. + */ + public static void printNoRecipe() { + System.out.println("There's no recipe!"); + } + + /** + * Prints all recipes. + * + * @param recipeArr An array list of groceries. + */ + public static void printRecipeList(ArrayList recipeArr) { + assert !recipeArr.isEmpty() : "recipe list should not be empty"; + System.out.println("Here are your recipe titles!"); + int num = 1; + for (Recipe recipe : recipeArr) { + System.out.println(num + ". " + recipe.getTitle()); + num += 1; + } + } + + /** + * Prints output when the selected recipe is removed. + * + * @param recipe The recipe that is removed. + */ + public static void printRecipeRemoved(Recipe recipe) { + assert recipe != null : "Recipe does not exist"; + System.out.println(recipe.getTitle() + " is removed from the recipe list."); + } +} \ No newline at end of file diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index a4062101a5..c3ca7256f3 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -296,108 +296,14 @@ public String promptForExpiration() { /** * Prompts user for remark for grocery. + * * @return the remark to be added. */ - public String promptForRemark(){ + public String promptForRemark() { System.out.println("Please enter the remark for this grocery:"); return in.nextLine().trim(); } - - /** - * Prompts user for title when adding recipe in RECIPE mode. - * @return the title of the recipe - */ - public String promptForTitle() { - String title = null; - while (title == null) { - System.out.println("Please enter the title of the recipe (e.g. fried egg):"); - title = in.nextLine().trim(); - if (title.isEmpty()) { - System.out.println("Invalid input. Title cannot be empty."); - title = null; - } - } - return title; - } - - /** - * Prompts user for ingredients when adding recipe in RECIPE mode. - * @return the ingredients in a single line, trimmed only - */ - public String promptForIngredients(){ - String ingredients = null; - while (ingredients == null) { - System.out.println("Please enter the ingredients for this recipe in one line (e.g. egg, salt):"); - ingredients = in.nextLine().trim(); - if (ingredients.isEmpty()) { - System.out.println("Invalid input. Ingredients cannot be empty."); - ingredients = null; - } - } - return ingredients; - } - - /** - * Prompts user for steps when adding recipe in RECIPE mode. - * @return the steps in a single line, trimmed only - */ - public String promptForSteps(){ - String steps = null; - while (steps == null) { - System.out.println("Please enter the steps for this recipe in one line " + - "(e.g. Fry the egg. Add salt. Serve.):"); - steps = in.nextLine().trim(); - if (steps.isEmpty()) { - System.out.println("Invalid input. Steps cannot be empty."); - steps = null; - } - } - return steps; - } - - /** - * Informs the user that the recipe has been added to the recipe list. - * - * @param recipe Recipe added. - */ - public static void printRecipeAdded(Recipe recipe){ - assert !(recipe.getTitle().isEmpty()): "grocery name should not be empty"; - System.out.println(recipe.getTitle() + " added!"); - } - - /** - * Prints out when there are no recipe. - */ - public static void printNoRecipe() { - System.out.println("There's no recipe!"); - } - - /** - * Prints all recipes. - * - * @param recipeArr An array list of groceries. - */ - public static void printRecipeList(ArrayList recipeArr) { - assert !recipeArr.isEmpty() : "recipe list should not be empty"; - System.out.println("Here are your recipe titles!"); - int num = 1; - for (Recipe recipe: recipeArr) { - System.out.println(num + ". " + recipe.getTitle()); - num += 1; - } - } - - /** - * Prints output when the selected recipe is removed. - * - * @param recipe The recipe that is removed. - */ - public static void printRecipeRemoved(Recipe recipe) { - assert recipe != null : "Recipe does not exist"; - System.out.println(recipe.getTitle() + " is removed from the recipe list."); - } - /** * Prompts user for category. */ diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 1128653234..402b593c19 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -4,6 +4,7 @@ import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import git.Ui; +import git.RecipeUi; import java.util.ArrayList; @@ -25,7 +26,7 @@ public RecipeList() { public void addRecipe(Recipe recipe) { try { recipeArr.add(recipe); - Ui.printRecipeAdded(recipe); + RecipeUi.printRecipeAdded(recipe); assert recipeArr.contains(recipe) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add recipe: the recipe is null."); @@ -41,9 +42,9 @@ public void addRecipe(Recipe recipe) { public void listRecipes() { int size = recipeArr.size(); if (size == 0) { - Ui.printNoRecipe(); + RecipeUi.printNoRecipe(); } else { - Ui.printRecipeList(recipeArr); + RecipeUi.printRecipeList(recipeArr); } } @@ -84,6 +85,6 @@ public void removeRecipe(String title) throws GitException { Recipe currRecipe = getRecipe(title); recipeArr.remove(currRecipe); - Ui.printRecipeRemoved(currRecipe); + RecipeUi.printRecipeRemoved(currRecipe); } } From 8800c7ce5fa2061dfb4a1babb8442299c0657276 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Thu, 11 Apr 2024 10:56:17 +0800 Subject: [PATCH 196/339] Shorten my PPP --- docs/team/wallywallywally.md | 53 ++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/docs/team/wallywallywally.md b/docs/team/wallywallywally.md index cff2702c31..c536bb58fc 100644 --- a/docs/team/wallywallywally.md +++ b/docs/team/wallywallywally.md @@ -6,13 +6,12 @@ It allows users to track and manage their groceries around their home easily. -## Summary of Contributions +### Summary of Contributions -### Code contributed -[RepoSense link of contributions](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=wallywallywally&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=true&tabType=authorship&tabAuthor=wallywallywally&tabRepo=AY2324S2-CS2113-T12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +#### Code contributed: [RepoSense link of contributions](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=wallywallywally&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=true&tabType=authorship&tabAuthor=wallywallywally&tabRepo=AY2324S2-CS2113-T12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) -### Enhancements +#### Enhancements 1. Ability to **edit** the amount of a grocery - `amt GROCERY a/AMOUNT`: Set amount - `use GROCERY a/AMOUNT`: Decrease amount after using @@ -28,25 +27,24 @@ It allows users to track and manage their groceries around their home easily. 4. Improved defensiveness through exception handling - Created custom exceptions with specific error messages for unexpected inputs - -### Contributions to the User Guide -- Documentation for my enhancements - - `amt`, `use`, `loc`, `delloc`, `store`, `listloc`, `find` -- General information - - Introduction, Quick Start, Command Summary -- Enhancements to overall formatting and readability - - -### Contributions to the Developer Guide -- Design and implementation details - - For features `amt` and `use` - - Sequence diagram for `use` - - Class diagram for `GroceryList` -- Product scope - - Target user profile, Value proposition, User stories - - -### Contributions to Team-Based Tasks + +#### Contributions to documentation +1. #### User Guide + - Documentation for my enhancements + - `amt`, `use`, `loc`, `delloc`, `store`, `listloc`, `find` + - General information + - Introduction, Quick Start, Command Summary + - Enhancements to overall formatting and readability +2. #### Contributions to the Developer Guide + - Design and implementation details + - For features `amt` and `use` + - Sequence diagram for `use` + - Class diagram for `GroceryList` + - Product scope + - Target user profile, Value proposition, User stories + + +#### Contributions to Team-Based Tasks - Set up GitHub organisation and repository - General code enhancements regarding code readability, with a focus on exceptions - Maintained issue tracker and milestones @@ -54,7 +52,7 @@ It allows users to track and manage their groceries around their home easily. - Released v2.0 -### Review/mentoring contributions +#### Review/mentoring contributions As shown in the following PRs: [#19](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/19), [#52](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/52), @@ -62,17 +60,18 @@ As shown in the following PRs: [#151](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/151) -### Contributions beyond the project team +#### Contributions beyond the project team [Reviewed another team's Developer Guide](https://github.com/nus-cs2113-AY2324S2/tp/pull/41) - +  ## Examples of documentation contributions [//]: # (to update) ### Extracts from the User Guide ![Find example](wallyimgs/find_eg.png) ![Listloc example](wallyimgs/listloc_eg.png) -## Extracts from the Developer Guide + +### Extracts from the Developer Guide ![EditAmount example 1](wallyimgs/editAmt_1.png) ![EditAmount example 2](wallyimgs/editAmt_2.png) \ No newline at end of file From cb791322271da2d8711968c02f040f69b087960d Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 11 Apr 2024 11:09:37 +0800 Subject: [PATCH 197/339] Add new features and documentation for Grocery in Time project --- docs/team/64-1.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/team/64-1.md diff --git a/docs/team/64-1.md b/docs/team/64-1.md new file mode 100644 index 0000000000..8efe7b9eb8 --- /dev/null +++ b/docs/team/64-1.md @@ -0,0 +1,46 @@ +# LIU SIYI's Project Portfolio Page + +## Project: Grocery in Time +Grocery in Time is a desktop application used for keeping track of groceries. +The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. + +## Summary of contributions +* New Feature: Added the "Add Grocery" function. + *What it does: enables users to add groceries directly into the grocery list. + *Justification: This feature streamlines the process of managing grocery inventories, making it easier for users to keep their lists up-to-date. + +* Improvement: Amended the "Edit Expiry Date" function. + *What it does: split into two distinct parts for enhanced usability. The first part prompts users for an expiry date when adding a grocery, while the second allows users to edit the expiry date at a later stage. + *Justification: This modification improves the flexibility and accuracy of managing grocery expiry dates, ensuring users can easily update their groceries’ shelf life. + +* Technical Update: Changed time format to LocalDateTime. + What it does: switches the time format from string to LocalDateTime across the application. + Justification: This update standardizes time representation within the app, enhancing data consistency and supporting more complex time-based functionalities. + +* New Feature: Added an "Add Grocery Menu" function. + What it does: prompts the user for additional details after adding a new grocery item, ensuring a comprehensive entry is made. + Justification: This feature enriches the grocery addition process by capturing detailed information from the outset, leading to better inventory management. + +* New Method: Added a method for sorting groceries by expiry date. + What it does: allows users to sort their grocery list based on the expiry dates of items, in either ascending or descending order. + Justification: Enhances the user's ability to prioritize groceries based on expiry, helping to minimize waste and manage groceries more efficiently. + +* New Method: Added a method to display groceries expiring in 3 days. + What it does: shows users a list of groceries that are expiring within the next three days. + Justification: This method significantly aids in reducing waste by alerting users to consume or replace items nearing their expiry, improving overall grocery management. + +* Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=64-1&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +## Documentation +* User Guide: + * Added documentation for the features `add`, `exp`, `rate`, `listexp`, and `expiring`. +* Developer Guide: + * Added implementation details of the `add` and `expiring` feature. + +* Review/mentoring contributions: + * [#6](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/6) , + [#7](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/7), + [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18), + [#27](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/27), + [#44](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/44), + [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73). \ No newline at end of file From 3caeb74288774de7eb434c6566a2a7a4ab21a268 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 11:24:40 +0800 Subject: [PATCH 198/339] Added saveFile method for groceries, loadFile work in progress --- GroceryList.log.1 | 28 ++++++++ GroceryList.log.1.lck | 0 data/groceryList.txt | 1 + src/main/java/git/Parser.java | 10 +-- src/main/java/git/Storage.java | 94 ++++++++++++++++++++++++++ src/main/java/git/Ui.java | 2 +- src/main/java/grocery/Grocery.java | 62 ++++++++++++++++- src/main/java/grocery/GroceryList.java | 15 +++- 8 files changed, 203 insertions(+), 9 deletions(-) create mode 100644 GroceryList.log.1 create mode 100644 GroceryList.log.1.lck create mode 100644 data/groceryList.txt create mode 100644 src/main/java/git/Storage.java diff --git a/GroceryList.log.1 b/GroceryList.log.1 new file mode 100644 index 0000000000..1bb13a6649 --- /dev/null +++ b/GroceryList.log.1 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GroceryList.log.1.lck b/GroceryList.log.1.lck new file mode 100644 index 0000000000..e69de29bb2 diff --git a/data/groceryList.txt b/data/groceryList.txt new file mode 100644 index 0000000000..9c0e5cd3a4 --- /dev/null +++ b/data/groceryList.txt @@ -0,0 +1 @@ +milk | 400 | 300 | 2024-09-20 | bev | 6.00 | firdge diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index f24eff7a99..9d7bf4904c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * Deals with commands entered by user. @@ -31,6 +32,7 @@ public class Parser { private UserInfo userInfo; private Ui ui; private RecipeList recipeList; + private Storage storage; private boolean isRunning; private String currentMode; @@ -48,6 +50,7 @@ public Parser(Ui ui) { userInfo = new UserInfo(userName); recipeList = new RecipeList(); this.ui = ui; + this.storage = new Storage(); isRunning = true; } @@ -84,6 +87,7 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi switch (mode) { case GROCERY: groceryManagement(commandParts); + GroceryList x = this.storage.loadFile(); break; case CALORIES: @@ -152,7 +156,7 @@ public void caloriesManagement(String[] commandParts) throws GitException { break; case EXIT: - System.out.println("bye bye!"); + System.out.println("Bye bye!"); isRunning = false; break; @@ -299,9 +303,6 @@ public void groceryManagement(String[] commandParts) throws GitException { } } - - - /** * Handles commands related to adding or deleting a grocery. * @@ -319,6 +320,7 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro Grocery grocery = new Grocery(commandParts[1]); ui.printAddMenu(grocery); groceryList.addGrocery(grocery); + storage.saveFile(groceryList.getGroceries()); break; case DEL: diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java new file mode 100644 index 0000000000..d256af72d0 --- /dev/null +++ b/src/main/java/git/Storage.java @@ -0,0 +1,94 @@ +package git; + +import exceptions.PastExpirationDateException; +import exceptions.nosuch.NoSuchObjectException; +import grocery.Grocery; +import grocery.GroceryList; + +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.List; +import java.util.Scanner; + +import grocery.location.Location; +import grocery.location.LocationList; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + + +/** + * Handles loading from and saving tasks to a file. + */ +public class Storage { + private Grocery grocery; + private List groceries; + private GroceryList groceryList; + private static final String FILE_PATH = "./data/groceryList.txt"; + /** + * Loads groceries from the file. + * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. + */ + public GroceryList loadFile(){ + GroceryList groceryList = new GroceryList(); + try { + File file = new File(FILE_PATH); + Scanner scanner = new Scanner(file); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + // -------------------------------- + Grocery grocery = parseGrocery(line); + System.out.println(grocery); + groceryList.addGrocery(grocery); + } + scanner.close(); + } catch (FileNotFoundException e) { + System.out.println("No saved groceries found.\n "); + } + return groceryList; + } + /** + * Parses a string from the file into a grocery object. + * + * @param line The string to parse. + * @return The parsed grocery object. + */ + private Grocery parseGrocery(String line) { + String[] parts = line.split(" \\| "); + String name = parts[0].trim(); + int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); + int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); + String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); + double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); + Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); + return new Grocery(name, amount, threshold, expiration, category, cost, location); + //return new Grocery(name, 0, 0, null, "", 0, null); + } + + /** + * Saves the current list of groceries to the file. + * + * @param groceries The list of groceries to save. + */ + public static void saveFile(List groceries) { + try { + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdirs(); + } + FileWriter writer = new FileWriter(FILE_PATH); + for (Grocery grocery : groceries) { + writer.write(grocery.toSaveFormat() + "\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while saving groceries."); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 3a3a2c86aa..2c73431c13 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -320,7 +320,7 @@ public static void printNoRecipe() { /** * Prints all recipes. * - * @param recipeArr An array list of groceries. + * @param recipeArr An array list of recipes. */ public static void printRecipeList(ArrayList recipeArr) { assert !recipeArr.isEmpty() : "recipe list should not be empty"; diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 09fe15b1e1..ff95ed6c50 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -12,7 +12,6 @@ public class Grocery { private String name; private int amount; - private int threshold; private LocalDate expiration; private String category; @@ -252,9 +251,68 @@ public String printGrocery() { remarkString = ", remark not set"; } - return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + + return this.name + "( " + this.category + ") " + amountString + unitString + exp + price + locationString + remarkString; } + /** + * Returns the name, amount, threshold, expiration date, category, cost and location of the grocery for saving. + * + * @return String representation of the Grocery. + */ + public String toSaveFormat() { + assert !(this.name.isEmpty()) : "Grocery does not exist!!"; + + String amountString; + if (amount != 0) { + amountString = "| " + amount + " "; + } else { + amountString = "| null "; + } + + String locationString; + if (this.location != null) { + locationString = "| " + this.location.getName() + " "; + } else { + locationString = "| null "; + } + + String thresholdString; + if (this.threshold != 0){ + thresholdString = "| " + threshold + " "; + } else { + thresholdString = "| null "; + } + + String exp; + if (expiration != null) { + exp = "| " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " "; + } else { + exp = "| null "; + } + + String categoryString; + if (category != null) { + categoryString = "| " + this.category + " "; + } else { + categoryString = "| null "; + } + + String price; + if (cost != 0) { + price = "| " + String.format("%.2f", cost) + " "; + } else { + price = "| null "; + } + + String remarkString; + if (remark != null) { + remarkString = "| " + remark + " "; + } else { + remarkString = "| null "; + } + return this.name + " " + amountString + thresholdString + exp + categoryString + price + locationString; + + } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 6738252469..ebe5d36573 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,6 +1,7 @@ package grocery; import exceptions.emptyinput.EmptyInputException; +import git.Storage; import git.Ui; import exceptions.GitException; import exceptions.nosuch.NoSuchObjectException; @@ -32,12 +33,13 @@ public class GroceryList { private List groceries; private Logger logger; - + private Storage storage; /** * Constructs GroceryList. */ public GroceryList() { groceries = new ArrayList<>(); + //storage.loadFile(); LoggerGroceryList.setupLogger(); logger = Logger.getLogger(GroceryList.class.getName()); } @@ -48,6 +50,7 @@ public GroceryList() { * @param grocery Grocery to be added. */ public void addGrocery(Grocery grocery) { + try { groceries.add(grocery); Ui.printGroceryAdded(grocery); @@ -59,6 +62,7 @@ public void addGrocery(Grocery grocery) { } logger.log(Level.INFO, "Added " + grocery.printGrocery()); + } /** @@ -99,7 +103,14 @@ private Grocery getGrocery(String name) throws NoSuchObjectException { throw new NoSuchObjectException("grocery"); } } - + /** + * Returns the desired groceries. + * + * @return The needed groceries. + */ + public List getGroceries(){ + return groceries; + } /** * Checks whether details are valid, else throw GitException accordingly. * From f9286f6bb2d9859aa365cc0c0787926dc91b33ec Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 11:31:25 +0800 Subject: [PATCH 199/339] Add sequence diagram for calories and profile management --- docs/DeveloperGuide.md | 8 ++++- docs/diagrams/CaloriesManagement.png | Bin 44038 -> 0 bytes docs/diagrams/caloriesManagement.png | Bin 0 -> 50012 bytes docs/diagrams/caloriesManagement.puml | 39 +++++++++++++++++++++ docs/diagrams/profileManagement.png | Bin 0 -> 66827 bytes docs/diagrams/profileManagement.puml | 47 ++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 1 deletion(-) delete mode 100644 docs/diagrams/CaloriesManagement.png create mode 100644 docs/diagrams/caloriesManagement.png create mode 100644 docs/diagrams/caloriesManagement.puml create mode 100644 docs/diagrams/profileManagement.png create mode 100644 docs/diagrams/profileManagement.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d83b27476a..8f41a8c33e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -10,11 +10,17 @@ ### _Designs_ ### 1. Calories Management Mode -![Commands for managing calories](./diagrams/CaloriesManagement.png) +![Commands for managing calories](./diagrams/caloriesManagement.png) * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. * if `eat`, store the name and calories of the input food * if `view`, display all the foods consumed +### 2. Profile Management Mode +![Commands for managing profile](./diagrams/profileManagement.png) + * when `profileManagement` is executed in Parser, different actions will be carried out based on the commands. + * if `update`, store the user data required for calories calculation. + * if `view`, display user information + ### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. diff --git a/docs/diagrams/CaloriesManagement.png b/docs/diagrams/CaloriesManagement.png deleted file mode 100644 index 9dd66f72e6acb224a5488f86bf492d921a96850e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44038 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 Q;`>yUw6>*g-Fx!?0Dp-jtN;K2 diff --git a/docs/diagrams/caloriesManagement.png b/docs/diagrams/caloriesManagement.png new file mode 100644 index 0000000000000000000000000000000000000000..ff904a2534c217e52fbfa12f895a1d8304a9e35f GIT binary patch literal 50012 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

8BptZoecNK{|P7+>&h@qfnk2c*bAsMb;mn~CQ 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 TjxKw~I4pBS;&8+vO}qaOUz-!f literal 0 HcmV?d00001 diff --git a/docs/diagrams/caloriesManagement.puml b/docs/diagrams/caloriesManagement.puml new file mode 100644 index 0000000000..f4c3fe923a --- /dev/null +++ b/docs/diagrams/caloriesManagement.puml @@ -0,0 +1,39 @@ +@startuml + +participant ":Parser" as p +participant "command:CalCommand" as cal +participant "ui:Ui" as ui +participant "food:Food" as f +participant "userInfo:UserInfo" as info +participant "foodList:foodList" as fl +participant ":System.out" as sys + + -> p : caloriesManagement(commandParts) +create cal +p -> cal : valueOf(commandParts[0].toUpperCase()) +cal --> p : command + +alt command == eat + p -> ui : promptForCalories() + ui --> p : calories + create f + p -> f : Food(commandParts[1],calories) + f --> p : food + p -> fl : addFood(food) + p -> info : consumptionOfCalories(food) +else command == view + p -> fl: printFoods() +else command == switch + p -> ui : switchMode() + ui --> p : currentMode +else command == help + p -> ui : displayHelpForCal() +else command == exit + p -> sys : println("bye bye") +else else + p -> sys : println(GitException.getMessage()) +end + + + +@enduml \ No newline at end of file diff --git a/docs/diagrams/profileManagement.png b/docs/diagrams/profileManagement.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e8c3b9315242afb03cdd75cee343df25c93eb1 GIT binary patch literal 66827 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 F{|Ee*6e0is literal 0 HcmV?d00001 diff --git a/docs/diagrams/profileManagement.puml b/docs/diagrams/profileManagement.puml new file mode 100644 index 0000000000..056bd10ad4 --- /dev/null +++ b/docs/diagrams/profileManagement.puml @@ -0,0 +1,47 @@ +@startuml + +participant ":Parser" as p +participant "command:ProfileCommand" as cal +participant "ui:Ui" as ui +participant "userInfo:UserInfo" as info +participant "foodList:foodList" as fl +participant ":System.out" as sys + + -> p : caloriesManagement(commandParts) +create cal +p -> cal : valueOf(commandParts[0].toUpperCase()) +cal --> p : command + +alt command == update + p -> ui : promptForName() + ui --> p : name + p -> ui : promptForWeight() + ui --> p : Weight + p -> ui : promptForHeight() + ui --> p : Height + p -> ui : promptForAge() + ui --> p : Age + p -> ui : promptForGender() + ui --> p : Gender + p -> ui : promptForActiveness() + ui --> p : Activeness + p -> ui : promptForAim() + ui --> p : Aim + p -> info : updateInfo(name, weight,height,age,gender,activeness,aim) +else command == view + p -> info: viewProfile() + info --> p : profile + p -> sys : println(profile) +else command == switch + p -> ui : switchMode() + ui --> p : currentMode +else command == help + p -> ui : displayHelpForProf() +else command == exit + p -> sys : println("bye bye") +else else + p -> sys : println(GitException.getMessage()) +end + + +@enduml \ No newline at end of file From 8ed20252990706aecea90421471f61ccfab4643d Mon Sep 17 00:00:00 2001 From: luozihui2003 <110605459+luozihui2003@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:44:52 +0800 Subject: [PATCH 200/339] Create luozihui2003.md --- docs/team/luozihui2003.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/team/luozihui2003.md diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md new file mode 100644 index 0000000000..3a6028f728 --- /dev/null +++ b/docs/team/luozihui2003.md @@ -0,0 +1,18 @@ +# Zi Hui's Project Portfolio Page +## Project: Grocery in Time +Grocery in Time is a desktop application used for keeping track of groceries. +The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. +## Summary of contributions +* New Feature: Added the "Find Grocery" function. + *What it does: enables users to find groceries from the list of groceries. + *Justification: This feature aids user in finding the grocery that they are looking for quicker, and allow them to view its details. + +* New Feature: Add category parameter for Grocery class + What it does: Add the category of the grocery, and automatically assigns the unit to the item by its category (e.g. beverage is assigned ml). + Justification: This feature enables user to add amount later on, based on the unit that has been assigned. + +* New Feature: Add Save and Load file feature + What it does: Saves the list, with all groceries and the details into a text file, and loads it. + Justification: This feature enables users to leave the program, and still be able to see all their groceries stored when they return. + +* Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luozihui2003&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=false) From e74febf25de5f971a0d9f0e33a746bd57eda0c50 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 11:54:57 +0800 Subject: [PATCH 201/339] Add sequence diagram for executeCommand in parser --- docs/DeveloperGuide.md | 12 +++++++-- docs/diagrams/caloriesManagement.png | Bin 50012 -> 49874 bytes docs/diagrams/caloriesManagement.puml | 8 +++--- docs/diagrams/executeCommand.png | Bin 0 -> 52281 bytes docs/diagrams/executeCommand.puml | 35 ++++++++++++++++++++++++++ docs/diagrams/profileManagement.png | Bin 66827 -> 63445 bytes docs/diagrams/profileManagement.puml | 13 +++++----- docs/team/luoyu-uwu.md | 2 ++ 8 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 docs/diagrams/executeCommand.png create mode 100644 docs/diagrams/executeCommand.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8f41a8c33e..94512a7733 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -9,13 +9,21 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} ### _Designs_ -### 1. Calories Management Mode +### 1. Execute different commands based on the modes +![Execute different commands](./diagrams/executeCommand.png) +* when 'executeCommand' is executed in Parser, different methods in Parser will be self invoked based on the selected mode. +* if mode is `grocery`, execute `groceryManagement` +* if mode is `calories`, execute `caloriesManagement` +* if mode is `profile`, execute `profileManagement` +* if mode is `recipe`, execute `recipeManagement` + +### 2. Calories Management Mode ![Commands for managing calories](./diagrams/caloriesManagement.png) * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. * if `eat`, store the name and calories of the input food * if `view`, display all the foods consumed -### 2. Profile Management Mode +### 3. Profile Management Mode ![Commands for managing profile](./diagrams/profileManagement.png) * when `profileManagement` is executed in Parser, different actions will be carried out based on the commands. * if `update`, store the user data required for calories calculation. diff --git a/docs/diagrams/caloriesManagement.png b/docs/diagrams/caloriesManagement.png index ff904a2534c217e52fbfa12f895a1d8304a9e35f..e4f908483a3aec35675e1300b819d495f1486d77 100644 GIT binary patch literal 49874 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 CK&M;) literal 50012 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

8BptZoecNK{|P7+>&h@qfnk2c*bAsMb;mn~CQ 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 TjxKw~I4pBS;&8+vO}qaOUz-!f diff --git a/docs/diagrams/caloriesManagement.puml b/docs/diagrams/caloriesManagement.puml index f4c3fe923a..9580c25e75 100644 --- a/docs/diagrams/caloriesManagement.puml +++ b/docs/diagrams/caloriesManagement.puml @@ -13,7 +13,7 @@ create cal p -> cal : valueOf(commandParts[0].toUpperCase()) cal --> p : command -alt command == eat +alt command == EAT p -> ui : promptForCalories() ui --> p : calories create f @@ -21,14 +21,14 @@ alt command == eat f --> p : food p -> fl : addFood(food) p -> info : consumptionOfCalories(food) -else command == view +else command == VIEW p -> fl: printFoods() else command == switch p -> ui : switchMode() ui --> p : currentMode -else command == help +else command == HELP p -> ui : displayHelpForCal() -else command == exit +else command == EXIT p -> sys : println("bye bye") else else p -> sys : println(GitException.getMessage()) diff --git a/docs/diagrams/executeCommand.png b/docs/diagrams/executeCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..04d015bfc9af5c8daac6005894644b115a3d6461 GIT binary patch literal 52281 zcmdSB2{hGh`!>8IDTS0NLXu=7GNjC9Ci6_@kU5cgiljsuY%pHLVJkH}dPEX}!#qsed@DK^Vnk(JSXeLJH&=M0?A-LOTf4ErUP4FihC{)`j6Yj;PeRJ4ErtwNJcDXOgz4D^?WK2$Ujlsb{l7~+MaEKi zvt8g?){R6H9g9Vos@-$I%{?#IGK70*EkBIfUO7&r{Z3FTU59MGZBiBv6QAd`SS+Ve zq|NB*O|sW|i3@>Riw{D{mhAfSnM~=4h20(wh?{lZQyFR9V4vBPq$f!Kczjxbt;9++ ztU=Ah7_aYiQPt0g@A-9$wYp-#*S&VCZ*8;+dJc+q&e&frr<;FqSd_?0 zvZKy)-?7^$l^wx*chygvyr3W=Z*zu3l&JLtJ=bTJ5alorS=rZ#PY*pGNigDQ*Gsw{ zdMC`qIJot$)v&s8S5uqRIj#-UjL_qnsh*ycMd;GqImbmi*C<=owTC4U$9WQ!p3bOMXw@o!>!~HMHT{fCHzIwGudyd5CuwJxCNl(uGL^&e zx81H!Zd1)Kf24PKP){kTw7^>T#*G`P8U-FZw(Wi-OnGwH9}G6;Kef-5m)smMi70D6 z>b$*TG1KLFW7c^isQc}=5V)VS(}^KE&4jY3!q*Jax^62fGp&eq>$>QqIkt?hiP(G- z>?7|NMwQGsy7%8*O(sL?f7fMur86JC{~c3WbM=Yk-t|Ss{4+DsN5v2XkM#~ye+u~j z*Xy@87Tp$Wuev2NaZ@tr<+0L|AG-F2zw*mCsjlw8ix**p{L8**G|lqY+Xb}b50yz& zRj1lll@}?twJkV`-#mSLJz7FSG370& z@PN~7`)kt13$_*6 zoSrLAvybF?X=*A*!>@UvPptx;G$;V2((1bsjp&+~?+AMuj@j#J*A26_6r1@$IrLbD zwy#;|^L6x6FDc7Vl{Nv5fXvdVQHJf2VLH8lcQPVfT}vrZ&v!eto<(~IFfpf-QkgZ! zdH4}l6%2oFGBOr`Am`^PYm6)z8<`%(B?`|D-#mSiJKpVB<dC$&}`(RLnlfWLe0{Rt`HC5F*zb#%;ZUUV44^V{=>UR?6Cd z?pN#b)$Zwm-JO?MOs@midAi>`d3?fYy<|>So-gjUsCYcCcGjR9Ps~`Xsml)^H63Tu zsaRpb*44ra8Ta)cf>SgSrKa!bNXX~*4uml$`OJWa-{bA!z~rfLs_XY_Iy*z=7Q0M( zHnf*Bo?Rr9adE~j41Cq}E*y;?ZLGTuCrI(Cs;cnM*X1qtTUf)-&P;SUZdA<-2NrT# zkpG;c`4%reSNl3SQ+tasEt-3-Z)>(Bnmc~YVs~dP>DL{X?`(P;w`#OdZmjRg90;){ z?p$YOb(q@`;3k`oU56CL7j0HePQc+s{-E5F1oiE!H1m3og2t8q_to+Cy-1 zYCZk5vo$BTbX7W-IXNttMT>uX*%lr0DmGRh{pC^rYss~C>!V`lj0}xN`IT&yl&s(V zam$=N3&Z1=miZus1wBHe(XdcR6>5G>{S&D6)@*?u|?mFYYjIwZ<$?wX}mPwLvvF$5vvc13B zO}@&h&!SzNBkb!U{`{697cDJq3nF1aE%zXTrSnFDE7eTslXTPu=_$q6xbZaZ*QDoY zR|1%394!uVVtQERrSoyK=VHkO)fnW$DNuUd>cV3D3~ zkldYPlsxmiyZAv*pkV(;Yxm`5GRy9~+~)ER>u~6=>Im4RY4Z+!dC7skSltoEC9L5z z-sl~4zkCx}q5AILcHoPuKW>O7`kXteX7_4&?DNl84^GY7GyVpK;SCYjqx-F!6I$P@ zl;-R2_6!t6@H!kT)7Q+Kh(;$rQ%W`#T$+juiUs%9_}rMf&8^|RBU=j%gR4J#vkWusb#p3Ft&@9yZnrO^_ECSovX`AJ9ib0 z?h@-_`UAd&!<^yG`=zYIOCj;}p&r$Dn+Z-!!4CaS42f~v1Gn#5mTjz6a4TR}>~79+ zRw4sw1Vf?(F7u%?1_uYD__tb0`2TnW*3*49pQ&WRI9;}82$!i;T7O=Y2@{Kr?qB1! z>b2|6<8~^`Z#1>Lg3V9K8tvE>NX6tn7FyAgHatgjl1Ra!E#<_*vn&)7x4fZqbd7n! z>!zh9ljgkB#Kg*a10u?%p#+OP`98qf@NV*leIvS#D7LEOZMXSIfoX_cP`S>;KaQ0Ce4&ytm*IJ_R$j3KBj5z6B&9}Ot^*Eu-Nc9WUmb7|M7Wa^clK8J^+9Yja3O<4PuZCU=aMT0zL*m z)^Q+rnZ8*t@&DJypJo32LWIEw^Vkxv>WDrBlt0dfYt^2eHyv=ET`xJb_YF3FhcbO; z@knj$v7zXL&-C?&oVQu@7|q&qpPZ}?&zYGHtj@|CRti)&u*uRUVr-ZX?-wD z$+m3$)?9_$N|=s(g6kv%ef6{J3XQ^&D zkzV!lTdc6}t5>JoJKx)mcjuWJ?jHMoSF+4&^Kn6k)t{@c9$BefQ-l0?$Jkgll-*~b zp|*DNdv^T23gr6fu5ve*@y1B&3MK6pJ(0Tldf}Tlt0*XuZbWIBc!c_Q$rgA@(TnxD zCQV}wuslC~$aJ!H?-pp;Pqz4MW)*Y@7^8phliq_PtV~SOl9I=cAE)GVoZna)*BHen z+~Fq|+Gvf-yyKf;dx}E5QnGAMfu$j;LxNJeRo9m$^7$Pu4T=2QA+ia2&>;qD{95`r~k9QTVfSaI8&t+0Jz5 zi#{U_pb?BxnH{KzCjGd$xOmmF``eIyypfsNlrN3Dx`M(DRGwiI}CoUVsx3M@{uRJIxf~J;nrfTD}T=0nz4;66Z znfYR+$-CJ5-nJ=77NzUD!U`_5PH z0eMaXy`NlkZI-2=>X*;{*i#?`;_}Ltb4Cw#VK% z+2WGeslmrIsdF_0do=vpH+i12FfMcIYxg`mbA=~$_Z~sY&6^@ON8zuOpnW_(KE6vN z^9n$fk&%()X!o#A39YMlzr~c6-d3t5^Z)qq=2xC72}038`ki&>(K?iNv7Nq=b46o+ z3G~;ZVq!T`3!W`Gd5X-fr_Tzyqc>N6LW~=_u=4yk%^)iu8x!NHCMF^x|4MKFz*PrR ztkQ(Wo0Q#cKEK06-@_S@*eAs2v|ZNnlQ{}bRZnNE;pgYxxP-D265raS5AHm&0=76z z3W1P+WY0e=7Dyc#9j&XNaK&Q>ose)rwbsK>B(1vA8`mg-l2ou!_ul2jILjFqcf=ubiU$&9ddX#`*wl$e>xASPCf)KMbQ}yCol{C$~ zyEm-YAn94osc33;7h3C@Nv82;o(1IRe}+R{V=pgcCyFJClj>GQM4YYr>hA8&jJtHT zWmp=M3kS4+Ka!Uh7El0m;?M6+C9*~@%eUYrmS55Tcv#g~Hd>&}qKkb&R~D+g!^?CP zc^Ts2+4tkrmhU>HWn|h_of6^DjE#+%Aq%YssL9AeUcRgpGzaFVP>Aim-=jx|cQQ#2 zao7xrSfbWqb(*12SmD{@CqK5HEDd|2&ntw{ zpr9}$E&>qA0Ny@Z=(e?L{55P+@I0&_8Nk$g9O(K^1Y+v{0dR`w)6Uc>E7q&@>eLCJ zjil7>Z%p0!y=RaE35g(@e z47U#WaL1phG+3#G2?xtfYW}0lw%$ma)!+pT7Sv-uDrTW1NFGXr;Q`;A@FD`n2XmJQ z#H}NhPb`m$H3B3>ATE0ARb4$yXM(|-0aIxI=FiDU@9p)4Vc?(S0hnn!^sRgr+*$Zc z<1ym!P9yi?xpRYS6}$W>!L8|B0k=(bakzAZfLmC|>C>k}ShOzoZs^Wc>L!~(_-5so z)V>dr5$v}QeK_-WiA*;w>na%;nG$(-nTvyylar)mZN={P97B|2TwY#K-_N_nI zFz9!gD?3hhdAg@C6QIY^cvI)qx5!nmQ^+ieY>VV6yG|)u^6Y;W^*K!jV(>zHsKMK; ztI){WhIy#1L4t8L z2@Sn&R7dR2!N8CVdGq783PX7eRDoE!pY^LLvJUTv_xGuC;S&iWLWHN9)4XH)%S$?C zfT}bpw|xGAWrJ|=5~V|Oj9o1|Mvkdo`Zq!}N>hF3=jZ2WnB=lH8ywEdu1w8qKiv?@ z(N#uIPyaVq3=%j`lCy`_k{P9&9#Jr>XT_MdCQTb6RX@pj_5pJt51_3}=GBWASq^hL z{V_#FjvqV^#m2^B;}Y;W%$`kSW@eslj>lCg-(Kx0OF?dz}1zv_p`FQi?zJDI-w5;&^1*g~8%xoio+H2RYmdP8%t;V5L_><6m=PeEc()5@mAU`H%9M(Y zWCwB8eL!q?A0%M06azJ(kIGxlk(#YTF;!MprZ=p;Q%O_R&^W`?xsMyu8zgC7;th#k zEM?|DEn_J2Fa!`>J8X@@!<`6D(^uawUcDOZ7ALHK{^G^QDq^CdkvtFl@WcbD^W7Ll zhG5r!{`^@_dDraj03?C_`%Cdj&MQ-0DM3+>9jUy$ye_q5=WrR|PW-}+7s`cN#EEp} z{mg&-__3M8pU~H?pnP1ctw<)^-erw?oNH?>+M+8573)n*?)nXj<1k&aJvPG)$W?`l zi}y8Un2^Z3p(f@!3JT35wXYc&xB&Ih&@DT89X@hov-i}=lOK>k;=bEJ1_U=j7RX{B z=xk~V9B1(G@YwMoU~m&b&IcQ4IA82|9+R5jdYXblia`TTGz9h&%ZaS%R@Tke9%CXV zvdxwEIp&|TtT3EAMWg2Yy=1mn+MjtjZl3SPR!($UE6HiW%@#E&xliIn^6xbByDK~d znNB-bjn;?c=D;Q!O?KxqQTfHqG)D4jBrYpdkpoS1+cC)=)3?{5;g3fsp&En#1si!qEb=n$2kGnqd zXSeDV;W^ib3SQ;p8Ya9TFu~D;UO}npjB{m{U3HoMeylVgo?1CKmBzo}DAb;147O}j zl3SVW3-7xnD@*+gZhq<%b&Ji)dJzI(Rzu|E_KdYhPw|5^^<1O+U@{%Yhp3HmNU(f@ zTz9{DdQmXhwuq15$iNZ;GOGjd0g3(^E$s~@n$xF033M|uF+KD5zk^ynDz}0H z)V<+;M-xMmsCkw-EIqb*Mto^@=+dG&O}lk>7SWa7f|h;7X)0-s(OPGW#u_$&p@hDJ zM{w77vUMOXXZeO{W`X5tCmBUWK)U0L-q(h29ETb@TyO;&VZ7X-W!>z$Swm@^6|S$Z zpT`!m2WoH9&|!M$bPe0dmc-_G@g*tb`1rV*vT{STpdcgTQH=hi7u>>cYoVUE?yA1`43zb>1!-Ik(`8HJ! zptax;3JkQqB_|hs&E`D6s-|YxKa0y+fqoTN3w;u!&$rl1nXa&!)0drzi$%tpqLY{I z2p-K;6|QN0{dNx83aQuvL@Pa}7V=P~GXQ z=vY{N`jl#QhH3D#b@Tb>AsaOmpFcBLbO#ATEptl`Riep5RDQXRVZ#EqMIO63i9ny- z4hef=Vq$vQqWtnA*4FlYN5^&GF&vF-Y!+f}c;CEv699IF^?-n?B(yRsU+4mRA9QNB zMd3|*<3FC`wdyT8!(p7o&Qin3$Y>W)RVA{6tusmIXI`ov9Q8DB0hk7FFE371-mCS^ z&76uPh7K}dHGX!oUb|KV#FVlzig&N0LQywmXL0tC*w4Olw&9f78aHhHuCV14!u#JCYC0eZ>si}tX;FFp`aL}8=R>Q z;Bw#Dkc<~IlGh)qst{ai&~15xcyjCfVvl~@gwmqE^eT-t^%mx<@8yd)rS1Fgz*?%WGhPkzZ(k2PWL zVt0P@!sFMjC4$bIh62MVL)H*x|S zk9Nz+e_zj{x9H{G_1>2#UiAwI2=Ma*xvx4w@^u2uITZ%-vdt;Vp}CmhAylI zT~|^SxG~>Fd~3l6W~;VMWp;xf0)s4~+*YeEYZpHyOuoJjA{-JG?cx6F`2HdXQNBRv z1?&+p08@hkE|Ea)i_rn1>u2X&XJ+&mcEZ%*c*xZJD{bGueS;oX6B{=vOV=zn;Jmbm zNZq4H{0sZMWD5oCATEU zf|!z0Ywn_-_zN1lye z`Q;48E+9l3MoM-@K=L?K&U{Q#eey->@LyEBfmNd;EmTg#O5_sCNc;% zLNd$DpzXkf3DrIc&06l&2|bbMZ*>2g`%bp+lzgqzoP3zIH%WHeceUkG4F>-I^#-V- z6>I&zn=ykbJ(b?c{lEv#Br5nTl{|d?n>25n%>a<&yC;E>4n`2LU=#Zj!{tt>Copk8d;a}}2eD&}4_4iW*&Se;*Uwt{a)B*1g zFH-LwruyiwhLN5*=Ltw|RSlPolqKh_&b-M>wa;Sdo$ z!oAz`)Wxj8k^We(r!l`-{Q2-BY(&4h;Qv8Y;43c)TaZ3~a49x?2bn7Z0&gyTU~_n& z7P7F;FmckjRO-zfh!om$@tb8>Qmf`Z`80OJ%b=ngkb1Pjnz~6`8U!Re&0!F{a&mXDs9O}{HNNotK zZW0!u*ngt`L#40JR9wJvf%|s6=Er5y7!iwwLxF_ua>-fsNkD)R4Y7iw-_xi1D4-0W z%Eot7^%6r`2Zvx zvX(?Kvm8=>Yt~1?=YM8ji&3`pdkLS32n(z8FywSyzo!}+6(wLZR0VxrULI%v{pE?~ zjg1ZE>jymEv2!Zbs4JYCyCI@&kW?Y6_T5-Um}vInCQ^1A!KY-&W!xe`#^6lI2f4Jc&t2+7l#C z-=UNDEidsRW8XWdZ1|K)4e(hS=LuRguUHHLWgkhY??3y-Q!TMOYK|yO$twwqgb2KU z@Wh~|0TWgaNB*vtd;g<^IoL>09keO>^~p8u`+B$TxBeW8v0*ulZort}v71le6i)P4%bX@{@G|<-;1Q zsOkl+aGpw3^>B2I@FjQD5khKzy~Fa_%;XAf*G!PR8%-V)c@^tJ$7hxf-6P=Gnd&&n zvEy8`LOgc_)7N_u2|a+c=804Jg%0BA8Ui>fb=XQQxEwaT;3>Mn`t$=e+z!Fu2fY#7 z*99FIh=|~X|2z9Zvhwcs=1OgCZQ;P2gqSxGFLzv7ywq98OU(??uJ?g!z{CKw{XlbE zcV12ry=Lp-u?vyozA+k-z5tvLz;lkb5HTPDOK;o&?jsdgt#e4^RG1BvOdD}=;&6?@A|2g3jM�$)6gTq-e6Wbf}^X18dMtyXYn=hu#}D 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/executeCommand.puml b/docs/diagrams/executeCommand.puml new file mode 100644 index 0000000000..3c6148aec2 --- /dev/null +++ b/docs/diagrams/executeCommand.puml @@ -0,0 +1,35 @@ +@startuml + +participant ":Parser" as p +participant "ui:Ui" as ui +participant "mode:Mode" as m +participant ":System.out" as sys + +-> p : executeCommand(commandParts, selectedMode) +create m +p -> m : valueOf(currentMode.toUpperCase()) +m --> p : mode + +alt mode == GROCERY + p -> p : groceryManagement(commandParts) + ref over p, ui, sys : groceryManagement +else mode == CALORIES + p -> p : caloriesManagement(commandParts) + ref over p, ui, sys : caloriesManagement +else mode == PROFILE + p -> p : profileManagement(commandParts) + ref over p, ui, sys : profileManagement +else mode == RECIPE + p -> p : recipeManagement(commandParts) + ref over p, ui, sys : recipeManagement +else mode == MODE + p -> ui : switchMode() + ui --> p : mode +else mode == HELP + p -> ui : displayHelp() +else mode == EXIT + p -> sys : println("bye bye") +else else + p -> sys : println(GitException.getMessage()) +end +@enduml \ No newline at end of file diff --git a/docs/diagrams/profileManagement.png b/docs/diagrams/profileManagement.png index d3e8c3b9315242afb03cdd75cee343df25c93eb1..3c0003b1db34727067d7c95a3e426f9459df766b 100644 GIT binary patch literal 63445 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 F{|Ee*6e0is diff --git a/docs/diagrams/profileManagement.puml b/docs/diagrams/profileManagement.puml index 056bd10ad4..c8d4e4cfef 100644 --- a/docs/diagrams/profileManagement.puml +++ b/docs/diagrams/profileManagement.puml @@ -4,15 +4,14 @@ participant ":Parser" as p participant "command:ProfileCommand" as cal participant "ui:Ui" as ui participant "userInfo:UserInfo" as info -participant "foodList:foodList" as fl participant ":System.out" as sys - -> p : caloriesManagement(commandParts) + -> p : profileManagement(commandParts) create cal p -> cal : valueOf(commandParts[0].toUpperCase()) cal --> p : command -alt command == update +alt command == UPDATE p -> ui : promptForName() ui --> p : name p -> ui : promptForWeight() @@ -28,16 +27,16 @@ alt command == update p -> ui : promptForAim() ui --> p : Aim p -> info : updateInfo(name, weight,height,age,gender,activeness,aim) -else command == view +else command == VIEW p -> info: viewProfile() info --> p : profile p -> sys : println(profile) -else command == switch +else command == SWITCH p -> ui : switchMode() ui --> p : currentMode -else command == help +else command == HELP p -> ui : displayHelpForProf() -else command == exit +else command == EXIT p -> sys : println("bye bye") else else p -> sys : println(GitException.getMessage()) diff --git a/docs/team/luoyu-uwu.md b/docs/team/luoyu-uwu.md index ee7fe0e356..71397c43c8 100644 --- a/docs/team/luoyu-uwu.md +++ b/docs/team/luoyu-uwu.md @@ -27,7 +27,9 @@ Given below are my contributions to the project. * Added documentation for the features `switch`, `cost`, `th`, `low`, `eat`, `view` and `update`. * Developer Guide: * Added implementation details of the `list` and `listcost` feature. + * Added `Execute Command` sequence diagram. * Added `Calories Management Mode` sequence diagram. + * Added `Profile Management Mode` sequence diagram. * Review/mentoring contributions: * [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18) , From 1039cdf1e379f822ed4e24cc329c130d657e685e Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 12:00:04 +0800 Subject: [PATCH 202/339] Update user stories --- docs/DeveloperGuide.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 94512a7733..141271aa1e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -114,19 +114,21 @@ Furthermore, the app can generate a list of items that are expiring soon, remind ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|-------------------------------|---------------------------------------------|--------------------------------------------------------| -| v1.0 | new user | see instructions on how to use the app | refer to them when I forget how to use the application | -| v1.0 | user | add groceries to the app | manage all my groceries | -| v1.0 | user | view all my groceries | know what I have bought | -| v1.0 | user | delete groceries from the list | stop tracking those groceries | -| v1.0 | user | add the amount of a grocery | keep track of the amount of that item I have | -| v1.0 | user | add the expiration date of the grocery | keep track of when my items expire easily | -| v2.0 | financially-aware user | add the cost of the groceries | know how much I am spending | -| v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | -| v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | -| v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | -| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | +| Version | As a ... | I want to ... | So that I can ... | +|---------|-------------------------------|---------------------------------------------|---------------------------------------------------------| +| v1.0 | new user | see instructions on how to use the app | refer to them when I forget how to use the application | +| v1.0 | user | add groceries to the app | manage all my groceries | +| v1.0 | user | view all my groceries | know what I have bought | +| v1.0 | user | delete groceries from the list | stop tracking those groceries | +| v1.0 | user | add the amount of a grocery | keep track of the amount of that item I have | +| v1.0 | user | add the expiration date of the grocery | keep track of when my items expire easily | +| v2.0 | financially-aware user | add the cost of the groceries | know how much I am spending | +| v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | +| v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | +| v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | +| v2.0 | user who replenishes groceries | set threshold amount for the groceries | know what groceries I should top up | +| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | +| v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | ## Non-Functional Requirements From 2d69dd1c423356cbc38f7823e6e0d496abf099d7 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 12:09:33 +0800 Subject: [PATCH 203/339] Extracted profile, calories Ui from Ui. --- src/main/java/food/FoodList.java | 4 +- src/main/java/git/CaloriesUi.java | 47 ++ src/main/java/git/Git.java | 2 + src/main/java/git/GroceryUi.java | 606 +++++++++++++ src/main/java/git/Parser.java | 24 +- src/main/java/git/ProfileUi.java | 231 +++++ src/main/java/git/Ui.java | 798 ------------------ src/main/java/grocery/GroceryList.java | 48 +- src/main/java/grocery/location/Location.java | 6 +- .../java/grocery/location/LocationList.java | 8 +- 10 files changed, 934 insertions(+), 840 deletions(-) create mode 100644 src/main/java/git/CaloriesUi.java create mode 100644 src/main/java/git/GroceryUi.java create mode 100644 src/main/java/git/ProfileUi.java diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index 983328563f..4d6a737d7b 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -1,7 +1,7 @@ package food; import exceptions.emptyinput.EmptyInputException; -import git.Ui; +import git.GroceryUi; import java.util.ArrayList; import java.util.List; @@ -28,7 +28,7 @@ public void addFood(Food food) throws EmptyInputException { try { foods.add(food); - Ui.printFoodAdded(food); + GroceryUi.printFoodAdded(food); assert foods.contains(food) : "Food should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add food: the food collection is null."); diff --git a/src/main/java/git/CaloriesUi.java b/src/main/java/git/CaloriesUi.java new file mode 100644 index 0000000000..d1d4c9e55b --- /dev/null +++ b/src/main/java/git/CaloriesUi.java @@ -0,0 +1,47 @@ +package git; + +import java.util.Scanner; + +public class CaloriesUi { + + // ATTRIBUTES + public static final String DIVIDER = "- - - - -"; + private static Scanner in; + + // METHODS + /** + * Constructs Ui and initialises Scanner to read input. + */ + public CaloriesUi() { + in = new Scanner(System.in); + } + + //@@author LuoYu-uwu + /** + * Prompts user for calories of the food. + * + * @return The calories of the consumed food. + */ + public double promptForCalories() { + System.out.println("Please enter the calories of the food in kcal:"); + double calories = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + calories = Double.parseDouble(input); + if (calories > 0 ){ + break; + } else { + calories = 0; + System.out.println("Calories entered is invalid!"); + System.out.println("Please enter the calories of the food in kcal:"); + } + } catch (NumberFormatException nfe) { + System.out.println("Calories entered is invalid!"); + System.out.println("Please enter the calories of the food in kcal:"); + } + } + return calories; + } + //@@author LuoYu-uwu +} diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 775a9e6862..1ca966e09e 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -8,6 +8,7 @@ public class Git { // ATTRIBUTES private Ui ui; + private GroceryUi groceryUi; private boolean isRunning; private Parser parser; @@ -18,6 +19,7 @@ public class Git { */ public Git() { ui = Ui.getInstance(); + groceryUi = GroceryUi.getInstance(); parser = new Parser(ui); isRunning = true; } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java new file mode 100644 index 0000000000..cd62543ca1 --- /dev/null +++ b/src/main/java/git/GroceryUi.java @@ -0,0 +1,606 @@ +package git; + +import exceptions.GitException; +import exceptions.InvalidCostException; +import exceptions.PastExpirationDateException; +import exceptions.nosuch.NoSuchObjectException; +import food.Food; +import grocery.Grocery; +import grocery.location.Location; +import grocery.location.LocationList; + +import java.time.DateTimeException; +import java.time.LocalDate; +import java.util.List; +import java.util.Scanner; + +public class GroceryUi { + // ATTRIBUTES + public static final String DIVIDER = "- - - - -"; + private static GroceryUi singleGroceryUi = null; + private static Scanner in; + + // METHODS + /** + * Constructs Ui and initialises Scanner to read input. + */ + public GroceryUi() { + in = new Scanner(System.in); + } + + /** + * Returns the single instance of Ui. + */ + public static GroceryUi getInstance() { + if (singleGroceryUi == null) { + singleGroceryUi = new GroceryUi(); + } + return singleGroceryUi; + } + + public static void printLine() { + System.out.println(DIVIDER); + } + + /** + * Prompts user for additional details when adding a grocery. + * + * @param grocery The grocery to be added. + */ + //@@author wallywallywally + public void promptAddMenu(Grocery grocery) { + printAddMenu(grocery.getName()); + String rawInput = in.nextLine().replaceAll(" ", ""); + + // Help is always shown first + if (rawInput.contains("8")) { + System.out.println("Displaying help:"); + singleGroceryUi.displayAddHelp(); + printLine(); + rawInput = rawInput.replaceAll("8",""); + } + + // Remove duplicates + StringBuilder addNums = new StringBuilder(); + for (char choice : rawInput.toCharArray()) { + if (!addNums.toString().contains(String.valueOf(choice))) { + addNums.append(choice); + } + } + + processAddMenu(grocery, addNums.toString()); + } + + /** + * Prints output when a location is added to LocationList. + * + * @param name Location name. + */ + public static void printLocationAdded(String name) { + System.out.println("New location added: " + name); + } + + /** + * Prints output when a location is removed from LocationList. + * + * @param name Location name. + */ + public static void printLocationRemoved(String name) { + System.out.println("Location: " + name + " has been removed from tracking!"); + } + + /** + * Prints all locations. + * + * @param locations List of locations. + */ + public static void printLocationList(List locations) { + if (locations.isEmpty()) { + System.out.println("No locations are currently being tracked!"); + } else { + System.out.println("Here's all the locations you are tracking:"); + for (Location loc : locations) { + System.out.println(" - " + loc.getName()); + } + } + } + + /** + * Prints the new location set for the selected grocery. + * + * @param grocery The grocery that should be updated. + */ + public static void printLocationSet(Grocery grocery) { + assert !grocery.getLocation().getName().isEmpty() : "Grocery location should not be empty"; + System.out.println(grocery.getName() + " stored in " + grocery.getLocation().getName()); + } + + public static void printGroceriesFound(List groceries, String key) { + if (groceries.isEmpty()) { + System.out.println("No groceries contain: " + key); + } else { + System.out.println("Here are the groceries containing: " + key); + for (Grocery grocery: groceries) { + System.out.println(" - " + grocery.printGrocery()); + } + } + } + + /** + * Prints output after a grocery's amount is set to 0. + * + * @param grocery The grocery that is depleted. + */ + public static void printAmtDepleted(Grocery grocery) { + System.out.println(grocery.getName() + " is now out of stock!"); + } + + /** + * Display help message for the user when adding grocery. + */ + public void displayAddHelp() { + System.out.println( + "Here are some details you can include when adding a grocery:\n" + + "1. Category - what type of grocery is it.\n" + + "2. Amount - how much of the grocery is stored.\n" + + "3. Location - where the grocery is stored.\n" + + "4. Expiration Date - when the grocery expires.\n" + + "5. Cost - how much did the grocery cost.\n" + + "6. Threshold Amount - the minimum amount of the grocery that sets reminder.\n" + + "7. Remark - extra information about the grocery.\n"); + } + + /** + * Prompts the user to enter the location of the grocery. + * If the location is new, it is automatically created + * If left blank, location is set to null. + * + * @return Location of selected grocery. + */ + public Location promptForLocation() { + System.out.println("Please enter the location (e.g. freezer first compartment)"); + String name = in.nextLine().strip(); + + while (name.isBlank()) { + System.out.println("The location cannot be empty!"); + name = in.nextLine().strip(); + } + + Location location; + try { + location = LocationList.findLocation(name); + } catch (NoSuchObjectException e1) { + try { + LocationList.addLocation(name); + location = LocationList.findLocation(name); + } catch (GitException e2) { + location = null; + } + } + + return location; + } + + //@@author wallywallywally + + //@@author LuoYu-uwu + /** + * Prompts user for category. + */ + public String promptForCategory(){ + System.out.println("Please enter the category (e.g. fruit):"); + return in.nextLine().trim(); + } + + /** + * Prompts user for amount. + */ + public int promptForAmount(){ + System.out.println("Please enter the amount (e.g. 3):"); + try { + return Integer.parseInt(in.nextLine().trim()); + } catch (NumberFormatException e){ + System.out.println("Please enter a valid integer for the amount (e.g. 3)!"); + return promptForAmount(); + } + } + + /** + * Prompts the user to enter the cost of the grocery for at most 5 times. + * If invalid value is entered for the 6th time, auto set the cost to 0. + * + * @return the cost to be set for the grocery. + */ + public double promptForCost() { + System.out.println("Please enter the cost (e.g., $1.20) or nil:"); + double cost = 0; + for (int i = 0; i < 5; i++) { + String price = in.nextLine().trim(); + if (price.equals("nil")) { + break; + } + try { + cost = convertCost(price); + if (cost >= 0 ){ + break; + } else { + cost = 0; + System.out.println("Cost entered is invalid!"); + System.out.println("Please enter the cost (e.g., $1.20) or nil:"); + } + } catch (GitException e) { + System.out.println(e.getMessage()); + } + } + return cost; + } + + /** + * Removes dollar sign from input cost and convert to double. + * + * @param price Input cost entered by user. + * @return Cost in desired format. + * @throws GitException If there is no Dollar sign or cost entered is not numeric. + */ + private double convertCost(String price) throws GitException{ + if(price.contains("$")) { + String formattedPrice = price.replace("$", ""); + try { + return Double.parseDouble(formattedPrice); + } catch (NumberFormatException nfe) { + throw new InvalidCostException(); + } + } else { + throw new InvalidCostException(); + } + } + + /** + * Prompts user for threshold amount. + */ + public int promptForThreshold(){ + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + int threshold = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equals("nil")) { + break; + } + try { + threshold = Integer.parseInt(input); + if (threshold >= 0 ){ + break; + } else { + threshold = 0; + System.out.println("Amount entered is invalid!"); + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + } + } catch (NumberFormatException nfe) { + System.out.println("Amount entered is invalid!"); + System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); + } + } + return threshold; + } + + /** + * Prints all groceries with amount less than threshold set. + * + * @param groceries An array list of groceries. + */ + public static void printLowStocks(List groceries) { + int size = groceries.size(); + if (size == 0) { + System.out.println("There are no items low in stock :)"); + } else { + System.out.println("Time to top up these groceries!"); + for (Grocery grocery : groceries) { + System.out.println(" - " + grocery.getName() + + " only left: " + grocery.getAmount()); + } + } + } + + public static void lowStockAlert(Grocery grocery) { + System.out.println(grocery.getName() + " is low in stock!"); + System.out.println("There's only " +grocery.getAmount() + " left"); + } + + /** + * Prints output when the selected grocery is removed. + * + * @param grocery The grocery that is removed. + * @param groceries The array list of groceries. + */ + public static void printGroceryRemoved(Grocery grocery, List groceries) { + assert grocery!=null : "Grocery does not exist"; + System.out.println("This grocery is removed:"); + System.out.println(grocery.printGrocery()); + System.out.println("You now have " + groceries.size() + " groceries left"); + } + + /** + * Prints the new threshold set for the selected grocery. + * + * @param grocery The grocery that should be updated. + */ + public static void printThresholdSet(Grocery grocery) { + String unit; + if (grocery.getUnit() == null) { + unit = ""; + } else { + unit = " " + grocery.getUnit(); + } + System.out.println(grocery.getName() + "'s threshold is now " + + grocery.getThreshold() + unit); + } + + /** + * Prints output after editing the selected grocery's cost. + * + * @param grocery The grocery that should be updated. + */ + public static void printCostSet(Grocery grocery) { + assert (grocery.getCost()!= 0): "grocery cost should not be empty"; + double cost = grocery.getCost(); + String price = "$" + String.format("%.2f", cost); + System.out.println(grocery.getName() + " is now " + price); + } + //@@author LuoYu-uwu + + //@@author lsiyi + /** + * Prints the additional details menu. + */ + public void printAddMenu(String name) { + System.out.println("Before adding " + name + ", do you want to include the following details?"); + System.out.println("1. Category"); + System.out.println("2. Amount"); + System.out.println("3. Location"); + System.out.println("4. Expiration Date"); + System.out.println("5. Cost"); + System.out.println("6. Threshold Amount"); + System.out.println("7. Remark"); + System.out.println("8. Help"); + System.out.println("Please enter the numbers of the details you want to include:"); + System.out.println("You may enter multiple numbers. (e.g. 1234)"); + System.out.println("To skip this step, do not enter any values."); + } + + /** + * Processes the additional details of the grocery to be added. + * + * @param grocery The grocery to be added. + * @param addNums String containing the numbers of the additional details to be added. + */ + public void processAddMenu (Grocery grocery, String addNums) { + for (char choice : addNums.toCharArray()) { + switch (choice) { + case '1': + System.out.println("Including Category"); + String category = singleGroceryUi.promptForCategory(); + grocery.setCategory(category); + break; + + case '2': + System.out.println("Including Amount"); + int amount = singleGroceryUi.promptForAmount(); + grocery.setAmount(amount); + break; + + case '3': + System.out.println("Including Location"); + Location location = singleGroceryUi.promptForLocation(); + grocery.setLocation(location); + if (location != null) { + location.addGrocery(grocery); + } + break; + + case '4': + System.out.println("Including Expiration Date"); + String expiration = singleGroceryUi.promptForExpiration(); + try { + grocery.setExpiration(expiration); + } catch (PastExpirationDateException e) { + e.printStackTrace(); + } + break; + + case '5': + System.out.println("Including Cost"); + Double cost = singleGroceryUi.promptForCost(); + grocery.setCost(cost); + break; + + case '6': + System.out.println("Including Threshold Amount"); + int threshold = singleGroceryUi.promptForThreshold(); + grocery.setThreshold(threshold); + break; + + case '7': + System.out.println("Including Remark"); + String remark = singleGroceryUi.promptForRemark(); + grocery.setRemark(remark); + break; + + default: + System.out.println("Invalid choice: " + choice); + break; + } + + printLine(); + } + } + + /** + * Prompts user for expiration date. + * Validates the input date for correct format and future dates. + * + * @return Formatted expiration date in the format YYYY-MM-DD. + */ + public String promptForExpiration() { + LocalDate expirationDate = null; + while (expirationDate == null) { + try { + System.out.println("Please enter the year of expiry (e.g. 2024):"); + int year = Integer.parseInt(in.nextLine().trim()); + + System.out.println("Please enter the month of expiry (e.g. July or 07):"); + String monthInput = in.nextLine().trim(); + String monthString = convertMonthToNumber(monthInput); + int month = Integer.parseInt(monthString); + + System.out.println("Please enter the date of expiry (e.g. 19):"); + int day = Integer.parseInt(in.nextLine().trim()); + + // Attempt to create a date from the input. + expirationDate = LocalDate.of(year, month, day); + + // Check if the date is in the past. + if (expirationDate.isBefore(LocalDate.now())) { + System.out.println("The expiration date cannot be in the past. Please try again."); + expirationDate = null; // Reset to null to re-prompt the user. + } + } catch (DateTimeException | NumberFormatException e) { + System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); + } + } + return expirationDate.toString(); // Formats to YYYY-MM-DD by default. + } + + /** + * Prompts user for rating and review. + * + * @param grocery for rate and review. + */ + public static void promptForRatingAndReview(Grocery grocery) { + System.out.println("Please enter the rating from 1 to 5:"); + int rating = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + rating = Integer.parseInt(input); + if (rating >= 0 && rating <= 5){ + break; + } else { + rating = 0; + System.out.println("Rating entered is invalid!"); + System.out.println("Please enter the rating (e.g. 5):"); + } + } catch (NumberFormatException nfe) { + System.out.println("Rating entered is invalid!"); + System.out.println("Please enter the rating in integer(e.g. 5):"); + } + } + grocery.setRating(rating); + + System.out.println("Please enter the review:"); + String review = in.nextLine().trim(); + grocery.setReview(review); + } + + /** + * Reads expiration date from user input. + * + * @param month Month of expiration. + * @return Month in numerical format. + */ + private String convertMonthToNumber(String month) { + // Convert month from name to number (e.g., "July" to "07") + String[] monthNames = {"January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; + String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; + for (int i = 0; i < monthNames.length; i++) { + if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { + return monthNumbers[i]; // Found a match, return the month number + } + } + // If no match found or input is already in numeric format, return original input + // This part can be enhanced to handle invalid months. + return month; + } + //@@author lsiyi + + //@@author SharlynLui + /** + * Prints output after setting the selected grocery's expiration date. + * + * @param grocery The grocery that should be updated. + */ + public static void printExpSet(Grocery grocery) { + assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; + System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); + } + /** + * Prints output after editing the selected grocery's category. + * + * @param grocery The grocery that should be updated. + */ + public static void printCategorySet(Grocery grocery){ + assert !(grocery.getCategory().isEmpty()): "grocery category should not be empty"; + System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); + } + + + /** + * Prints output after adding a grocery. + * + * @param grocery Grocery added. + */ + public static void printGroceryAdded(Grocery grocery) { + assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; + System.out.println(grocery.getName() + " added!"); + } + + /** + * Prints the new amount set for the selected grocery. + * + * @param grocery The grocery that should be updated. + */ + public static void printAmtSet(Grocery grocery) { + assert grocery.getAmount() >= 0 : "grocery amount should not be empty"; + System.out.println(grocery.getName() + ": " + grocery.getAmount()); + } + + + /** + * Prints out when there are no groceries. + */ + public static void printNoGrocery() { + System.out.println("There's no groceries!"); + } + + /** + * Prints all groceries. + * + * @param groceries An array list of groceries. + */ + public static void printGroceryList(List groceries) { + assert !groceries.isEmpty() : "grocery list should not be empty"; + System.out.println("Here are your groceries!"); + for (Grocery grocery: groceries) { + System.out.println(" - " + grocery.printGrocery()); + } + } + + + public static void printFoodAdded(Food food) { + assert !(food.getName().isEmpty()): "food name should not be empty"; + System.out.println(food.print() + " was consumed!"); + } + + /** + * Prompts user for remark for grocery. + * + * @return the remark to be added. + */ + public String promptForRemark() { + System.out.println("Please enter the remark for this grocery:"); + return in.nextLine().trim(); + } + //@@author SharlynLui + + //@@author luozihui +} diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 9e364a2a80..80dd65c669 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -31,7 +31,10 @@ public class Parser { private FoodList foodList; private UserInfo userInfo; private Ui ui; + private GroceryUi groceryUi; private RecipeUi recipeUi; + private ProfileUi profileUi; + private CaloriesUi caloriesUi; private RecipeList recipeList; private boolean isRunning; @@ -48,6 +51,9 @@ public Parser(Ui ui) { foodList = new FoodList(); userInfo = new UserInfo(); recipeUi = new RecipeUi(); + groceryUi = new GroceryUi(); + profileUi = new ProfileUi(); + caloriesUi = new CaloriesUi(); recipeList = new RecipeList(); this.ui = ui; isRunning = true; @@ -138,7 +144,7 @@ public void caloriesManagement(String[] commandParts) throws GitException { if (name == null || name.isBlank() || !name.matches("[a-zA-Z]+")) { throw new EmptyInputException("valid food name"); } - double calories = ui.promptForCalories(); + double calories = caloriesUi.promptForCalories(); Food food = new Food(name, calories); foodList.addFood(food); userInfo.consumptionOfCalories(food); @@ -190,13 +196,13 @@ public void profileManagement(String[] commandParts) throws GitException { switch (command) { case UPDATE: - String name = ui.promptForName(); - double weight = ui.promptForWeight(); - double height = ui.promptForHeight(); - int age = ui.promptForAge(); - String gender = ui.promptForGender(); - String activeness = ui.promptForActiveness(); - String aim = ui.promptForAim(); + String name = profileUi.promptForName(); + double weight = profileUi.promptForWeight(); + double height = profileUi.promptForHeight(); + int age = profileUi.promptForAge(); + String gender = profileUi.promptForGender(); + String activeness = profileUi.promptForActiveness(); + String aim = profileUi.promptForAim(); userInfo.updateInfo(name, weight,height,age,gender,activeness,aim); break; @@ -332,7 +338,7 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro } Grocery grocery = new Grocery(commandParts[1]); - ui.promptAddMenu(grocery); + groceryUi.promptAddMenu(grocery); groceryList.addGrocery(grocery); break; diff --git a/src/main/java/git/ProfileUi.java b/src/main/java/git/ProfileUi.java new file mode 100644 index 0000000000..4993124800 --- /dev/null +++ b/src/main/java/git/ProfileUi.java @@ -0,0 +1,231 @@ +package git; + +import java.util.Scanner; + +public class ProfileUi { + // ATTRIBUTES + public static final String DIVIDER = "- - - - -"; + private static Scanner in; + private static final double MAX_HEIGHT = 280; + private static final double MAX_WEIGHT = 370; + private static final double MAX_AGE = 160; + + // METHODS + /** + * Constructs Ui and initialises Scanner to read input. + */ + public ProfileUi() { + in = new Scanner(System.in); + } + + //@@author LuoYu-uwu + /** + * Prompts user for a name. + * + * @return The entered valid name or empty. + */ + public String promptForName() { + System.out.println("Please enter your name"); + String name = ""; + for (int i = 0; i < 5; i++) { + name = in.nextLine().trim(); + if (name.isBlank()) { + if (i == 4) { + System.out.println("Failed to enter valid name, " + + "name will be stored as empty"); + } else { + System.out.println("Please enter a valid name"); + } + } else { + break; + } + } + return name; + } + + /** + * Prompts user for weight. + * + * @return The entered valid weight or 0. + */ + public double promptForWeight() { + System.out.println("Please enter your weight in KG:"); + double weight = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + weight = Double.parseDouble(input); + if (weight > 0 && weight < MAX_WEIGHT) { + break; + } else { + weight = 0; + System.out.println("Weight entered is invalid!"); + System.out.println("Please enter your weight in KG:"); + } + } catch (NumberFormatException nfe) { + System.out.println("Weight entered is invalid!"); + if(i == 4) { + System.out.println("Failed to enter valid weight, " + + "weight will be stored as 0"); + } else { + System.out.println("Please enter your weight in KG:"); + } + } + } + return weight; + } + + /** + * Prompts user for height. + * + * @return The entered valid height or 0. + */ + public double promptForHeight() { + System.out.println("Please enter your height in cm:"); + double height = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + height = Double.parseDouble(input); + if (height > 0 && height < MAX_HEIGHT){ + break; + } else { + height = 0; + System.out.println("Height entered is invalid!"); + System.out.println("Please enter your height in cm:"); + } + } catch (NumberFormatException nfe) { + System.out.println("Height entered is invalid!"); + if(i == 4) { + System.out.println("Failed to enter valid height, " + + "height will be stored as 0"); + } else { + System.out.println("Please enter your height in cm:"); + } + } + } + return height; + } + + /** + * Prompts user for age. + * + * @return The entered valid age or 0. + */ + public int promptForAge() { + System.out.println("Please enter your age in years (nearest whole number):"); + int age = 0; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + try { + age = Integer.parseInt(input); + if (age > 0 && age < MAX_AGE){ + break; + } else { + age = 0; + System.out.println("Age entered is invalid!"); + System.out.println("Please enter your age in years (nearest whole number):"); + } + } catch (NumberFormatException nfe) { + System.out.println("Age entered is invalid!"); + if(i == 4) { + System.out.println("Failed to enter valid age, " + + "age will be stored as 0"); + } else { + System.out.println("Please enter your age in years " + + "(nearest whole number):"); + } + } + } + return age; + } + + /** + * Prompts user for gender. + * + * @return The entered valid gender or empty. + */ + public String promptForGender() { + System.out.println("Please enter your gender (e.g. F):"); + String gender = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.length() == 1 && + (input.equalsIgnoreCase("F") + || input.equalsIgnoreCase("M"))) { + gender = input; + break; + } else { + System.out.println("Gender entered is invalid!"); + if (i == 4) { + System.out.println("Failed to enter valid gender, " + + "gender will be stored as empty"); + } else { + System.out.println("Please enter your gender (e.g. F):"); + } + } + } + return gender; + } + + /** + * Prompts user for aim. + * + * @return The entered valid aim or empty. + */ + public String promptForAim() { + System.out.println("Please enter your weight aim (e.g. lose/maintain/gain):"); + String aim = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equalsIgnoreCase("lose") + || input.equalsIgnoreCase("maintain") + || input.equalsIgnoreCase("gain")) { + aim = input; + break; + } else { + System.out.println("Aim entered is invalid!"); + if (i == 4) { + System.out.println("Failed to enter valid aim, " + + "aim will be stored as empty"); + } else { + System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); + } + } + } + return aim; + } + + /** + * Prompts user for activeness. + * + * @return The entered valid activeness or empty. + */ + public String promptForActiveness() { + System.out.println("Please enter your activeness " + + "(e.g. inactive/light/moderate/active/very):"); + String activeness = ""; + for (int i = 0; i < 5; i++) { + String input = in.nextLine().trim(); + if (input.equalsIgnoreCase("inactive") + || input.equalsIgnoreCase("light") + || input.equalsIgnoreCase("moderate") + || input.equalsIgnoreCase("active") + || input.equalsIgnoreCase("very")) { + activeness = input; + break; + } else { + System.out.println("Activeness entered is invalid!"); + if (i == 4) { + System.out.println("Failed to enter valid activeness, " + + "activeness will be stored as empty"); + } else { + System.out.println("Please enter your activeness " + + "(e.g. inactive/light/moderate/active/very):"); + } + } + } + return activeness; + } + //@@author LuoYu-uwu +} diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index c3ca7256f3..0a425aaf5f 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -1,23 +1,9 @@ package git; -import java.time.DateTimeException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; import java.util.Scanner; - import exceptions.GitException; import exceptions.InvalidCommandException; -import exceptions.InvalidCostException; -import exceptions.nosuch.NoSuchObjectException; -import food.Food; -import exceptions.PastExpirationDateException; -import grocery.Grocery; -import grocery.location.Location; - import enumerations.Mode; -import grocery.location.LocationList; -import recipe.Recipe; /** @@ -145,582 +131,7 @@ public String[] processInput() { return commandParts; } - /** - * Prompts user for additional details when adding a grocery. - * - * @param grocery The grocery to be added. - */ - public void promptAddMenu(Grocery grocery) { - printAddMenu(grocery.getName()); - String rawInput = in.nextLine().replaceAll(" ", ""); - - // Help is always shown first - if (rawInput.contains("8")) { - System.out.println("Displaying help:"); - singleUi.displayAddHelp(); - printLine(); - rawInput = rawInput.replaceAll("8",""); - } - - // Remove duplicates - StringBuilder addNums = new StringBuilder(); - for (char choice : rawInput.toCharArray()) { - if (!addNums.toString().contains(String.valueOf(choice))) { - addNums.append(choice); - } - } - - processAddMenu(grocery, addNums.toString()); - } - - /** - * Prints the additional details menu. - */ - public void printAddMenu(String name) { - System.out.println("Before adding " + name + ", do you want to include the following details?"); - System.out.println("1. Category"); - System.out.println("2. Amount"); - System.out.println("3. Location"); - System.out.println("4. Expiration Date"); - System.out.println("5. Cost"); - System.out.println("6. Threshold Amount"); - System.out.println("7. Remark"); - System.out.println("8. Help"); - System.out.println("Please enter the numbers of the details you want to include:"); - System.out.println("You may enter multiple numbers. (e.g. 1234)"); - System.out.println("To skip this step, do not enter any values."); - } - - /** - * Processes the additional details of the grocery to be added. - * - * @param grocery The grocery to be added. - * @param addNums String containing the numbers of the additional details to be added. - */ - public void processAddMenu (Grocery grocery, String addNums) { - for (char choice : addNums.toCharArray()) { - switch (choice) { - case '1': - System.out.println("Including Category"); - String category = singleUi.promptForCategory(); - grocery.setCategory(category); - break; - - case '2': - System.out.println("Including Amount"); - int amount = singleUi.promptForAmount(); - grocery.setAmount(amount); - break; - - case '3': - System.out.println("Including Location"); - Location location = singleUi.promptForLocation(); - grocery.setLocation(location); - if (location != null) { - location.addGrocery(grocery); - } - break; - - case '4': - System.out.println("Including Expiration Date"); - String expiration = singleUi.promptForExpiration(); - try { - grocery.setExpiration(expiration); - } catch (PastExpirationDateException e) { - e.printStackTrace(); - } - break; - - case '5': - System.out.println("Including Cost"); - Double cost = singleUi.promptForCost(); - grocery.setCost(cost); - break; - - case '6': - System.out.println("Including Threshold Amount"); - int threshold = singleUi.promptForThreshold(); - grocery.setThreshold(threshold); - break; - - case '7': - System.out.println("Including Remark"); - String remark = singleUi.promptForRemark(); - grocery.setRemark(remark); - break; - - default: - System.out.println("Invalid choice: " + choice); - break; - } - - printLine(); - } - } - - /** - * Prompts user for expiration date. - * Validates the input date for correct format and future dates. - * - * @return Formatted expiration date in the format YYYY-MM-DD. - */ - public String promptForExpiration() { - LocalDate expirationDate = null; - while (expirationDate == null) { - try { - System.out.println("Please enter the year of expiry (e.g. 2024):"); - int year = Integer.parseInt(in.nextLine().trim()); - - System.out.println("Please enter the month of expiry (e.g. July or 07):"); - String monthInput = in.nextLine().trim(); - String monthString = convertMonthToNumber(monthInput); - int month = Integer.parseInt(monthString); - - System.out.println("Please enter the date of expiry (e.g. 19):"); - int day = Integer.parseInt(in.nextLine().trim()); - - // Attempt to create a date from the input. - expirationDate = LocalDate.of(year, month, day); - - // Check if the date is in the past. - if (expirationDate.isBefore(LocalDate.now())) { - System.out.println("The expiration date cannot be in the past. Please try again."); - expirationDate = null; // Reset to null to re-prompt the user. - } - } catch (DateTimeException | NumberFormatException e) { - System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); - } - } - return expirationDate.toString(); // Formats to YYYY-MM-DD by default. - } - - /** - * Prompts user for remark for grocery. - * - * @return the remark to be added. - */ - public String promptForRemark() { - System.out.println("Please enter the remark for this grocery:"); - return in.nextLine().trim(); - } - - /** - * Prompts user for category. - */ - public String promptForCategory(){ - System.out.println("Please enter the category (e.g. fruit):"); - return in.nextLine().trim(); - } - - /** - * Prompts user for amount. - */ - public int promptForAmount(){ - System.out.println("Please enter the amount (e.g. 3):"); - try { - return Integer.parseInt(in.nextLine().trim()); - } catch (NumberFormatException e){ - System.out.println("Please enter a valid integer for the amount (e.g. 3)!"); - return promptForAmount(); - } - } - - /** - * Prompts the user to enter the cost of the grocery for at most 5 times. - * If invalid value is entered for the 6th time, auto set the cost to 0. - * - * @return the cost to be set for the grocery. - */ - public double promptForCost() { - System.out.println("Please enter the cost (e.g., $1.20) or nil:"); - double cost = 0; - for (int i = 0; i < 5; i++) { - String price = in.nextLine().trim(); - if (price.equals("nil")) { - break; - } - try { - cost = convertCost(price); - if (cost >= 0 ){ - break; - } else { - cost = 0; - System.out.println("Cost entered is invalid!"); - System.out.println("Please enter the cost (e.g., $1.20) or nil:"); - } - } catch (GitException e) { - System.out.println(e.getMessage()); - } - } - return cost; - } - - /** - * Removes dollar sign from input cost and convert to double. - * - * @param price Input cost entered by user. - * @return Cost in desired format. - * @throws GitException If there is no Dollar sign or cost entered is not numeric. - */ - private double convertCost(String price) throws GitException{ - if(price.contains("$")) { - String formattedPrice = price.replace("$", ""); - try { - return Double.parseDouble(formattedPrice); - } catch (NumberFormatException nfe) { - throw new InvalidCostException(); - } - } else { - throw new InvalidCostException(); - } - } - - /** - * Prompts user for threshold amount. - */ - public int promptForThreshold(){ - System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); - int threshold = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - if (input.equals("nil")) { - break; - } - try { - threshold = Integer.parseInt(input); - if (threshold >= 0 ){ - break; - } else { - threshold = 0; - System.out.println("Amount entered is invalid!"); - System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); - } - } catch (NumberFormatException nfe) { - System.out.println("Amount entered is invalid!"); - System.out.println("Please enter the threshold amount (e.g. 3) or nil:"); - } - } - return threshold; - } - - /** - * Prompts user for rating and review. - * - * @param grocery for rate and review. - */ - public static void promptForRatingAndReview(Grocery grocery) { - System.out.println("Please enter the rating from 1 to 5:"); - int rating = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - try { - rating = Integer.parseInt(input); - if (rating >= 0 && rating <= 5){ - break; - } else { - rating = 0; - System.out.println("Rating entered is invalid!"); - System.out.println("Please enter the rating (e.g. 5):"); - } - } catch (NumberFormatException nfe) { - System.out.println("Rating entered is invalid!"); - System.out.println("Please enter the rating in integer(e.g. 5):"); - } - } - grocery.setRating(rating); - - System.out.println("Please enter the review:"); - String review = in.nextLine().trim(); - grocery.setReview(review); - } - - /** - * Prompts user for calories of the food. - * - * @return The calories of the consumed food. - */ - public double promptForCalories() { - System.out.println("Please enter the calories of the food in kcal:"); - double calories = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - try { - calories = Double.parseDouble(input); - if (calories > 0 ){ - break; - } else { - calories = 0; - System.out.println("Calories entered is invalid!"); - System.out.println("Please enter the calories of the food in kcal:"); - } - } catch (NumberFormatException nfe) { - System.out.println("Calories entered is invalid!"); - System.out.println("Please enter the calories of the food in kcal:"); - } - } - return calories; - } - - /** - * Prompts user for a name. - * - * @return The entered valid name or empty. - */ - public String promptForName() { - System.out.println("Please enter your name"); - String name = ""; - for (int i = 0; i < 5; i++) { - name = in.nextLine().trim(); - if (name.isBlank()) { - if (i == 4) { - System.out.println("Failed to enter valid name, " + - "name will be stored as empty"); - } else { - System.out.println("Please enter a valid name"); - } - } else { - break; - } - } - return name; - } - - /** - * Prompts user for weight. - * - * @return The entered valid weight or 0. - */ - public double promptForWeight() { - System.out.println("Please enter your weight in KG:"); - double weight = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - try { - weight = Double.parseDouble(input); - if (weight > 0 && weight < MAX_WEIGHT) { - break; - } else { - weight = 0; - System.out.println("Weight entered is invalid!"); - System.out.println("Please enter your weight in KG:"); - } - } catch (NumberFormatException nfe) { - System.out.println("Weight entered is invalid!"); - if(i == 4) { - System.out.println("Failed to enter valid weight, " + - "weight will be stored as 0"); - } else { - System.out.println("Please enter your weight in KG:"); - } - } - } - return weight; - } - - /** - * Prompts user for height. - * - * @return The entered valid height or 0. - */ - public double promptForHeight() { - System.out.println("Please enter your height in cm:"); - double height = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - try { - height = Double.parseDouble(input); - if (height > 0 && height < MAX_HEIGHT){ - break; - } else { - height = 0; - System.out.println("Height entered is invalid!"); - System.out.println("Please enter your height in cm:"); - } - } catch (NumberFormatException nfe) { - System.out.println("Height entered is invalid!"); - if(i == 4) { - System.out.println("Failed to enter valid height, " + - "height will be stored as 0"); - } else { - System.out.println("Please enter your height in cm:"); - } - } - } - return height; - } - - /** - * Prompts user for age. - * - * @return The entered valid age or 0. - */ - public int promptForAge() { - System.out.println("Please enter your age in years (nearest whole number):"); - int age = 0; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - try { - age = Integer.parseInt(input); - if (age > 0 && age < MAX_AGE){ - break; - } else { - age = 0; - System.out.println("Age entered is invalid!"); - System.out.println("Please enter your age in years (nearest whole number):"); - } - } catch (NumberFormatException nfe) { - System.out.println("Age entered is invalid!"); - if(i == 4) { - System.out.println("Failed to enter valid age, " + - "age will be stored as 0"); - } else { - System.out.println("Please enter your age in years " + - "(nearest whole number):"); - } - } - } - return age; - } - - /** - * Prompts user for gender. - * - * @return The entered valid gender or empty. - */ - public String promptForGender() { - System.out.println("Please enter your gender (e.g. F):"); - String gender = ""; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - if (input.length() == 1 && - (input.equalsIgnoreCase("F") - || input.equalsIgnoreCase("M"))) { - gender = input; - break; - } else { - System.out.println("Gender entered is invalid!"); - if (i == 4) { - System.out.println("Failed to enter valid gender, " + - "gender will be stored as empty"); - } else { - System.out.println("Please enter your gender (e.g. F):"); - } - } - } - return gender; - } - - /** - * Prompts user for aim. - * - * @return The entered valid aim or empty. - */ - public String promptForAim() { - System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); - String aim = ""; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - if (input.equalsIgnoreCase("lose") - || input.equalsIgnoreCase("maintain") - || input.equalsIgnoreCase("gain")) { - aim = input; - break; - } else { - System.out.println("Aim entered is invalid!"); - if (i == 4) { - System.out.println("Failed to enter valid aim, " + - "aim will be stored as empty"); - } else { - System.out.println("Please enter your aim (e.g. lose/maintain/gain):"); - } - } - } - return aim; - } - - /** - * Prompts user for activeness. - * - * @return The entered valid activeness or empty. - */ - public String promptForActiveness() { - System.out.println("Please enter your activeness " + - "(e.g. inactive/light/moderate/active/very):"); - String activeness = ""; - for (int i = 0; i < 5; i++) { - String input = in.nextLine().trim(); - if (input.equalsIgnoreCase("inactive") - || input.equalsIgnoreCase("light") - || input.equalsIgnoreCase("moderate") - || input.equalsIgnoreCase("active") - || input.equalsIgnoreCase("very")) { - activeness = input; - break; - } else { - System.out.println("Activeness entered is invalid!"); - if (i == 4) { - System.out.println("Failed to enter valid activeness, " + - "activeness will be stored as empty"); - } else { - System.out.println("Please enter your activeness " + - "(e.g. inactive/light/moderate/active/very):"); - } - } - } - return activeness; - } - - /** - * Prompts the user to enter the location of the grocery. - * If the location is new, it is automatically created - * If left blank, location is set to null. - * - * @return Location of selected grocery. - */ - public Location promptForLocation() { - System.out.println("Please enter the location (e.g. freezer first compartment)"); - String name = in.nextLine().strip(); - - while (name.isBlank()) { - System.out.println("The location cannot be empty!"); - name = in.nextLine().strip(); - } - - Location location; - try { - location = LocationList.findLocation(name); - } catch (NoSuchObjectException e1) { - try { - LocationList.addLocation(name); - location = LocationList.findLocation(name); - } catch (GitException e2) { - location = null; - } - } - - return location; - } - /** - * Reads expiration date from user input. - * - * @param month Month of expiration. - * @return Month in numerical format. - */ - private String convertMonthToNumber(String month) { - // Convert month from name to number (e.g., "July" to "07") - String[] monthNames = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; - String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; - for (int i = 0; i < monthNames.length; i++) { - if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { - return monthNumbers[i]; // Found a match, return the month number - } - } - // If no match found or input is already in numeric format, return original input - // This part can be enhanced to handle invalid months. - return month; - } public static String switchMode() throws GitException { System.out.println("What mode would you like to enter?"); @@ -827,215 +238,6 @@ public static void displayHelp() { ); } - /** - * Display help message for the user when adding grocery. - */ - public void displayAddHelp() { - System.out.println( - "Here are some details you can include when adding a grocery:\n" + - "1. Category - what type of grocery is it.\n" + - "2. Amount - how much of the grocery is stored.\n" + - "3. Location - where the grocery is stored.\n" + - "4. Expiration Date - when the grocery expires.\n" + - "5. Cost - how much did the grocery cost.\n" + - "6. Threshold Amount - the minimum amount of the grocery that sets reminder.\n" + - "7. Remark - extra information about the grocery.\n"); - } - - - /** - * Prints output after setting the selected grocery's expiration date. - * - * @param grocery The grocery that should be updated. - */ - public static void printExpSet(Grocery grocery) { - assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; - System.out.println(grocery.getName() + " will expire on: " + grocery.getExpiration()); - } - /** - * Prints output after editing the selected grocery's category. - * - * @param grocery The grocery that should be updated. - */ - public static void printCategorySet(Grocery grocery){ - assert !(grocery.getCategory().isEmpty()): "grocery category should not be empty"; - System.out.println(grocery.getName() + " is now a " + grocery.getCategory()); - } - - /** - * Prints output after editing the selected grocery's cost. - * - * @param grocery The grocery that should be updated. - */ - public static void printCostSet(Grocery grocery) { - assert (grocery.getCost()!= 0): "grocery cost should not be empty"; - double cost = grocery.getCost(); - String price = "$" + String.format("%.2f", cost); - System.out.println(grocery.getName() + " is now " + price); - } - - /** - * Prints output after adding a grocery. - * - * @param grocery Grocery added. - */ - public static void printGroceryAdded(Grocery grocery) { - assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; - System.out.println(grocery.getName() + " added!"); - } - - /** - * Prints the new amount set for the selected grocery. - * - * @param grocery The grocery that should be updated. - */ - public static void printAmtSet(Grocery grocery) { - assert grocery.getAmount() >= 0 : "grocery amount should not be empty"; - System.out.println(grocery.getName() + ": " + grocery.getAmount()); - } - - /** - * Prints the new threshold set for the selected grocery. - * - * @param grocery The grocery that should be updated. - */ - public static void printThresholdSet(Grocery grocery) { - String unit; - if (grocery.getUnit() == null) { - unit = ""; - } else { - unit = " " + grocery.getUnit(); - } - System.out.println(grocery.getName() + "'s threshold is now " + - grocery.getThreshold() + unit); - } - - /** - * Prints output after a grocery's amount is set to 0. - * - * @param grocery The grocery that is depleted. - */ - public static void printAmtDepleted(Grocery grocery) { - System.out.println(grocery.getName() + " is now out of stock!"); - } - - /** - * Prints out when there are no groceries. - */ - public static void printNoGrocery() { - System.out.println("There's no groceries!"); - } - - /** - * Prints all groceries. - * - * @param groceries An array list of groceries. - */ - public static void printGroceryList(List groceries) { - assert !groceries.isEmpty() : "grocery list should not be empty"; - System.out.println("Here are your groceries!"); - for (Grocery grocery: groceries) { - System.out.println(" - " + grocery.printGrocery()); - } - } - - /** - * Prints all groceries with amount less than threshold set. - * - * @param groceries An array list of groceries. - */ - public static void printLowStocks(List groceries) { - int size = groceries.size(); - if (size == 0) { - System.out.println("There are no items low in stock :)"); - } else { - System.out.println("Time to top up these groceries!"); - for (Grocery grocery : groceries) { - System.out.println(" - " + grocery.getName() - + " only left: " + grocery.getAmount()); - } - } - } - - public static void lowStockAlert(Grocery grocery) { - System.out.println(grocery.getName() + " is low in stock!"); - System.out.println("There's only " +grocery.getAmount() + " left"); - } - - /** - * Prints output when the selected grocery is removed. - * - * @param grocery The grocery that is removed. - * @param groceries The array list of groceries. - */ - public static void printGroceryRemoved(Grocery grocery, List groceries) { - assert grocery!=null : "Grocery does not exist"; - System.out.println("This grocery is removed:"); - System.out.println(grocery.printGrocery()); - System.out.println("You now have " + groceries.size() + " groceries left"); - } - - public static void printFoodAdded(Food food) { - assert !(food.getName().isEmpty()): "food name should not be empty"; - System.out.println(food.print() + " was consumed!"); - } - - /** - * Prints output when a location is added to LocationList. - * - * @param name Location name. - */ - public static void printLocationAdded(String name) { - System.out.println("New location added: " + name); - } - - /** - * Prints output when a location is removed from LocationList. - * - * @param name Location name. - */ - public static void printLocationRemoved(String name) { - System.out.println("Location: " + name + " has been removed from tracking!"); - } - - /** - * Prints all locations. - * - * @param locations List of locations. - */ - public static void printLocationList(List locations) { - if (locations.isEmpty()) { - System.out.println("No locations are currently being tracked!"); - } else { - System.out.println("Here's all the locations you are tracking:"); - for (Location loc : locations) { - System.out.println(" - " + loc.getName()); - } - } - } - - /** - * Prints the new location set for the selected grocery. - * - * @param grocery The grocery that should be updated. - */ - public static void printLocationSet(Grocery grocery) { - assert !grocery.getLocation().getName().isEmpty() : "Grocery location should not be empty"; - System.out.println(grocery.getName() + " stored in " + grocery.getLocation().getName()); - } - - public static void printGroceriesFound(List groceries, String key) { - if (groceries.isEmpty()) { - System.out.println("No groceries contain: " + key); - } else { - System.out.println("Here are the groceries containing: " + key); - for (Grocery grocery: groceries) { - System.out.println(" - " + grocery.printGrocery()); - } - } - } - - /** * Prints divider for user readability. */ diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index e3818b185d..db401c0258 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,7 +1,7 @@ package grocery; import exceptions.emptyinput.EmptyInputException; -import git.Ui; +import git.GroceryUi; import exceptions.GitException; import exceptions.nosuch.NoSuchObjectException; import exceptions.LocalDateWrongFormatException; @@ -50,7 +50,7 @@ public GroceryList() { public void addGrocery(Grocery grocery) { try { groceries.add(grocery); - Ui.printGroceryAdded(grocery); + GroceryUi.printGroceryAdded(grocery); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add grocery: the grocery is null."); @@ -162,7 +162,7 @@ public void editExpiration(String details) throws GitException { } // Verification and UI feedback - Ui.printExpSet(grocery); + GroceryUi.printExpSet(grocery); } /** @@ -177,7 +177,7 @@ public void editCategory(String details) throws GitException { String newCategory = catParts[1].strip(); grocery.setCategory(newCategory); - Ui.printCategorySet(grocery); + GroceryUi.printCategorySet(grocery); } /** @@ -230,11 +230,11 @@ public void editAmount(String details, boolean use) throws GitException { grocery.setAmount(amount); if (amount == 0) { - Ui.printAmtDepleted(grocery); + GroceryUi.printAmtDepleted(grocery); } else if (grocery.isLow()){ - Ui.lowStockAlert(grocery); + GroceryUi.lowStockAlert(grocery); } else { - Ui.printAmtSet(grocery); + GroceryUi.printAmtSet(grocery); } } @@ -256,7 +256,7 @@ public void editCost(String details) throws GitException { throw new InvalidCostException(); } grocery.setCost(cost); - Ui.printCostSet(grocery); + GroceryUi.printCostSet(grocery); } catch (NumberFormatException e) { throw new InvalidCostException(); } @@ -275,7 +275,7 @@ public void editThreshold(String details) throws GitException { int threshold = checkAmount(thresholdString); grocery.setThreshold(threshold); - Ui.printThresholdSet(grocery); + GroceryUi.printThresholdSet(grocery); } /** @@ -299,7 +299,7 @@ public void editLocation(String details) throws GitException { grocery.setLocation(location); location.addGrocery(grocery); - Ui.printLocationSet(grocery); + GroceryUi.printLocationSet(grocery); } /** @@ -317,7 +317,7 @@ public void findGroceries(String key) throws EmptyInputException { } } - Ui.printGroceriesFound(relevantGroceries, key); + GroceryUi.printGroceriesFound(relevantGroceries, key); } /** @@ -331,7 +331,7 @@ public void editRatingAndReview(String details) throws GitException { throw new EmptyInputException("grocery"); } Grocery grocery = getGrocery(details); - Ui.promptForRatingAndReview(grocery); + GroceryUi.promptForRatingAndReview(grocery); } /** @@ -340,9 +340,9 @@ public void editRatingAndReview(String details) throws GitException { public void listGroceries() { int size = groceries.size(); if (size == 0) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { - Ui.printGroceryList(groceries); + GroceryUi.printGroceryList(groceries); } } @@ -356,7 +356,7 @@ public void listLowStocks() { lowStockGroceries.add(grocery); } } - Ui.printLowStocks(lowStockGroceries); + GroceryUi.printLowStocks(lowStockGroceries); } /** @@ -365,10 +365,10 @@ public void listLowStocks() { public void sortByExpiration() { int size = groceries.size(); if (size == 0) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); - Ui.printGroceryList(groceries); + GroceryUi.printGroceryList(groceries); } } @@ -395,10 +395,10 @@ public List getGroceriesExpiringInNext3Days() { public void displayGroceriesExpiringInNext3Days() { List groceriesExpiringInNext3Days = getGroceriesExpiringInNext3Days(); if (groceriesExpiringInNext3Days.isEmpty()) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { System.out.println("Here are the groceries expiring in the next 3 days:"); - Ui.printGroceryList(groceriesExpiringInNext3Days); + GroceryUi.printGroceryList(groceriesExpiringInNext3Days); } } @@ -408,12 +408,12 @@ public void displayGroceriesExpiringInNext3Days() { public void sortByCost() { int size = groceries.size(); if (size == 0) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { List groceriesByDate = groceries; groceriesByDate.sort((g1, g2) -> Double.compare(g1.getCost(), g2.getCost())); Collections.reverse(groceriesByDate); - Ui.printGroceryList(groceriesByDate); + GroceryUi.printGroceryList(groceriesByDate); } } /** @@ -422,10 +422,10 @@ public void sortByCost() { public void sortByCategory(){ int size = groceries.size(); if (size == 0) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { Collections.sort(groceries, Comparator.comparing(Grocery::getCategory)); - Ui.printGroceryList(groceries); + GroceryUi.printGroceryList(groceries); } } /** @@ -447,6 +447,6 @@ public void removeGrocery(String name) throws GitException { location.removeGrocery(grocery); } - Ui.printGroceryRemoved(grocery, groceries); + GroceryUi.printGroceryRemoved(grocery, groceries); } } diff --git a/src/main/java/grocery/location/Location.java b/src/main/java/grocery/location/Location.java index ab70214765..5f0c246231 100644 --- a/src/main/java/grocery/location/Location.java +++ b/src/main/java/grocery/location/Location.java @@ -1,6 +1,6 @@ package grocery.location; -import git.Ui; +import git.GroceryUi; import grocery.Grocery; import java.util.ArrayList; @@ -42,9 +42,9 @@ public void removeGrocery(Grocery grocery) { public void listGroceries() { System.out.println("Viewing location: " + name); if (groceries.isEmpty()) { - Ui.printNoGrocery(); + GroceryUi.printNoGrocery(); } else { - Ui.printGroceryList(groceries); + GroceryUi.printGroceryList(groceries); } } diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java index f8191b671e..0be65c29b7 100644 --- a/src/main/java/grocery/location/LocationList.java +++ b/src/main/java/grocery/location/LocationList.java @@ -2,7 +2,7 @@ import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; -import git.Ui; +import git.GroceryUi; import java.util.ArrayList; import java.util.List; @@ -28,7 +28,7 @@ public static void addLocation(String name) throws EmptyInputException { Location location = new Location(name.strip()); locations.add(location); - Ui.printLocationAdded(name.strip()); + GroceryUi.printLocationAdded(name.strip()); } /** @@ -46,7 +46,7 @@ public static void removeLocation(String name) throws EmptyInputException, NoSuc Location location = findLocation(name); location.clearLocation(); locations.remove(location); - Ui.printLocationRemoved(name.strip()); + GroceryUi.printLocationRemoved(name.strip()); } /** @@ -79,7 +79,7 @@ public static Location findLocation(String name) throws NoSuchObjectException { * Lists all locations being tracked. */ public static void listLocations() { - Ui.printLocationList(locations); + GroceryUi.printLocationList(locations); } } From 2bd316e293bc7e34b83129f98e6801c02dbcd4d8 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 12:16:27 +0800 Subject: [PATCH 204/339] Updated calories to be integer --- src/main/java/user/UserInfo.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index 3501c3625a..aec684a8c7 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -15,8 +15,8 @@ public class UserInfo { private String activeness; private double BMR; private double AMR; - private double caloriesCap; - private double currentCalories; + private int caloriesCap; + private int currentCalories; public UserInfo() { this.name = null; @@ -157,13 +157,13 @@ private void calAMR() throws GitException { private void setCaloriesCap() throws GitException { switch (this.aim) { case "lose": - this.caloriesCap = this.AMR*0.8; + this.caloriesCap = (int)(this.AMR*0.8); break; case "maintain": - this.caloriesCap = AMR; + this.caloriesCap = (int)(AMR); break; case "gain": - this.caloriesCap = this.AMR*1.2; + this.caloriesCap = (int)(this.AMR*1.2); break; default: throw new FailToCalculateCalories(); @@ -178,7 +178,7 @@ private void setCaloriesCap() throws GitException { * @throws GitException When insufficient information about the user was given. */ public void consumptionOfCalories(Food food) throws GitException{ - this.currentCalories = food.getCalories() + this.currentCalories; + this.currentCalories = (int)(food.getCalories() + this.currentCalories); if (this.weight == 0 || this.height == 0 || this.age == 0 || this.gender.isEmpty() || this.aim.isEmpty() || this.activeness.isEmpty()) { throw new InsufficientInfoException(); From 9e257240c88d15d712e103c4dbb35343208e2618 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 12:22:22 +0800 Subject: [PATCH 205/339] Edit checks --- src/main/java/git/GroceryUi.java | 2 +- src/main/java/git/RecipeUi.java | 2 +- src/main/java/recipe/RecipeList.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index cd62543ca1..e10a7943fc 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -510,7 +510,7 @@ public static void promptForRatingAndReview(Grocery grocery) { private String convertMonthToNumber(String month) { // Convert month from name to number (e.g., "July" to "07") String[] monthNames = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; + "July", "August", "September", "October", "November", "December"}; String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; for (int i = 0; i < monthNames.length; i++) { if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { diff --git a/src/main/java/git/RecipeUi.java b/src/main/java/git/RecipeUi.java index a864a959b1..fcf0d8b164 100644 --- a/src/main/java/git/RecipeUi.java +++ b/src/main/java/git/RecipeUi.java @@ -119,4 +119,4 @@ public static void printRecipeRemoved(Recipe recipe) { assert recipe != null : "Recipe does not exist"; System.out.println(recipe.getTitle() + " is removed from the recipe list."); } -} \ No newline at end of file +} diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 402b593c19..5a3f4ae496 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -3,7 +3,6 @@ import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; -import git.Ui; import git.RecipeUi; import java.util.ArrayList; From 4d175f7b16d65745bd702aa0895a6ff2f74f274a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 12:25:40 +0800 Subject: [PATCH 206/339] Gradle check --- src/main/java/git/GroceryUi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index e10a7943fc..cd62543ca1 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -510,7 +510,7 @@ public static void promptForRatingAndReview(Grocery grocery) { private String convertMonthToNumber(String month) { // Convert month from name to number (e.g., "July" to "07") String[] monthNames = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; + "July", "August", "September", "October", "November", "December"}; String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; for (int i = 0; i < monthNames.length; i++) { if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { From d4befa726e3a0bd74625da49d0b4fb5a684e981c Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 12:28:26 +0800 Subject: [PATCH 207/339] Gradle Check --- src/main/java/git/GroceryUi.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index cd62543ca1..20e4aa945e 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -464,7 +464,8 @@ public String promptForExpiration() { expirationDate = null; // Reset to null to re-prompt the user. } } catch (DateTimeException | NumberFormatException e) { - System.out.println("Invalid date. Please ensure the year, month, and day are correct and try again."); + System.out.println("Invalid date. Please ensure the year, " + + "month, and day are correct and try again."); } } return expirationDate.toString(); // Formats to YYYY-MM-DD by default. @@ -510,7 +511,7 @@ public static void promptForRatingAndReview(Grocery grocery) { private String convertMonthToNumber(String month) { // Convert month from name to number (e.g., "July" to "07") String[] monthNames = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; + "July", "August", "September", "October", "November", "December"}; String[] monthNumbers = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}; for (int i = 0; i < monthNames.length; i++) { if (month.equalsIgnoreCase(monthNames[i]) || month.equals(monthNumbers[i])) { From b0eb5dd86edbed8e71d11855fe96e537c48ff41d Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 12:35:54 +0800 Subject: [PATCH 208/339] Add grocery command sequence diagram --- docs/diagrams/groceryManagement.png | Bin 0 -> 58456 bytes docs/diagrams/groceryManagement.puml | 39 +++++++++++++++++++++++++++ docs/diagrams/profileManagement.puml | 8 +++--- 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 docs/diagrams/groceryManagement.png create mode 100644 docs/diagrams/groceryManagement.puml diff --git a/docs/diagrams/groceryManagement.png b/docs/diagrams/groceryManagement.png new file mode 100644 index 0000000000000000000000000000000000000000..7928d6e4f382efb5bfa0138710dbe0d9ea65b767 GIT binary patch literal 58456 zcmce;1yogS*Dky)_oeZO< zPaJ{o^asWW!H27sA`dLJOrP2r>F8Rb#B@w_%pY0mXkU12cR|n6@~H(63(HfZM<$k5 z#zxFqrpDF{wNxn75gdJm2bRCTkHUcC*uH-oC}kRc^X$v{Ee28UXQZl~W-+JQ6ct?B zn1ilZn|qpfmV~Bd^^4REbM6(r!01V6Rpc(o7sYbXjQRygDtEA7&YwvGf}bOvN+azCOgwlU64;(T2}aElrB;qZA}5kU>j~>8H&`C=nY?pum7#Sv)la?} zo?^ax(WVbip8jo)^%I9@f_1?(zs~8jYtQLLW3w^F??%qOy1jd0Qd__s<7|Yy%e4vI zuR{qgBj0^pxr@FH;uMm({M_hgVl1u4n*TU&cTb4fqI49~Ts`#s#fv9t`n`V8hNP}X zmT7%R>HL5z`_h18r`@PTa@M_h>e}_>@r7f(zV@1K?i^v6o8zyg%<4{u4Zri^sOQ1n zy+n4#^cCaaRVKYTy=#QwdUuWbCwrMXO^*q^%sL|-l7K?FqV5RaQn1yS={v2as8h6O zwnQ6!GurK&?(LYt<4p@HAI8|N7ui(2IDD=AI!Gk0nO1pmtH=lRRY>Rz>umDc#Yqx6 zSoww357e+XxmdH4)f+4c-OxaBg`U#*v1ef`Et8CH*UjJ}!))Iz)NHKlFcsWVHcbE8 zYsjzJ(fzPQ5msUe@sVW;_~?3HJQzMKV85Y-4~{RiPr`?R3(7IF5dyRJt6ju<3$N^C z_!f-_Ol1T%X5?k+d$MP>b{tTs?F5pDHhoHt^vk#2(2}+l+OfIY>VxN zaTqR}9!1^z*tP##EOf|ky9j5zQ@4ZiP` z=jE^g?uobeHJXdDQ8#_ZY?b2eTKOW5-3iuHs9z-iIeF_iYWE{|B=XWS`!B6%!G~pM ze-FcTPtWg(RhU?P%bnNSo}z8!jkh8x6;OkMVI#^BW3s<2@h`z?aa38nj>kHOTKE5- zJ#@N5Pu8TCR{W02tZB=^J5mg>xL4wzmNypm`Lm&z|89N%*8$R394fz-qmQ8WWJA8# z%j-RsX0>kr!J>Na-scSYY@Ir#93zqhx|G2|C70b_m?NJ>P3HRj3Y@zP?7}M|Wu9M> zU{A__{~`;kS2|j%IklCL-`-OL&oRnbX#F;a9?@nc!kM`R{Fs&Fa0xrwr~@ z)B@F9!_+W4ukQCweuv#6+;msHNOBYh4}15=N8X0b9!TfMcKmB93_~h z@`vZ~w!q?bw!Yvn7EX}Ii>KS`HIEPPe8>w<+=g4W|BZzx%fR1`O^dLP}c zdNp;voypMXU=Q?0v{lgCY_0NVI*&)Jp=;zEYG-@%k~isgBKZeyL@Z{`wI(L7`lPn& z+mX7A`0iOurxq({$;q4cejd8bEtm1qgcr96hX))DzK5F@(b(r(OX2O26YjAEMhp$% z8PsEN3}kbvw|DaKC!k7Pa(R<;kVU$s*^Y(dI6h}dK}eV~x9TMn@lNDJLw{1+C_A$f zKEcTAlSX~{^))q#20kXn`3Dzl<(@1*r)_wq9nZ-(jLiwX5ihb*gZu(9dhnw^F&tK%nMv8?ee35Dx>c( zSYi{W)yt&1{mZj#J;f+a@EeWGjY`XJx|^Ijhh;C17fWB2iE7c!&F?fZ^SQlHf>&;H z3`5lvoPbFIrAnWUq0=|b;0e0tc3*+4-ZZnQSF4f_tej@$*gUjK22_I zCF3&gPQ&b2WG{jm*_;RWsg2;FXhF(k`Qp}qAgu<&rAy`OSEjW-lx&Rg~Q+9byddCw35ym+yAw~!_5CW(cK2#`2kz4 zMx|60bsP28a!=gkC<0SAB2v<@NP)rWbSdY;Zt2wK{S3YS*~dsFE=hDA6XQiie_-u+K&@O# zx30wT`wJigC0zd*D*fa4;0vj<|BXZ6=*B={`{q^R*Wh!0%Srm{3qW5*w=$0bFf)D4 z2$W%vOo~f+b*9T=WvVT|A*bJ7VtJY;Jb>V`v>ug7SEkOw;J5BbI))2_E`nDv1oOwj z3`@((s{ANaRa7>AWtdF%7d5Ec^wC;-6cM9P>{M_tubCh5GE^aTvG&qY0)1Z{Y|fd5 zeN0HWGF#UF)nUHti&#&KwtisjR7y(9_qw{Rm2{U>dxLm~EuP2sJt$)4Q?C~(Vx#o* z;Hrk1+$A_U_U=if-Adbi#m3ygu^Pj9VE$J=Gzxh@qfq^PL);6Z41 zJW;TV&Cb>u%hjtt*4nX)PaZ)vHNpMJicTsnoScN3f%8hMElJTJv9ORY zqqL-?G>R`D@;rj?0T;|UC%KnCDbdqFYl}kRF#)kclU*jYG%#NrfU{!6ePx-zCwl1@lF!>grz|H_Y+gXph6?S)1*#nfyW9%X%LLc4h_*k!8&yM`fcYa&m8Gwr9RH78YG>XvR5M zOucjx@h$YlBgmaIPP$>Y^eKe^AOEL2J08pM@UZq1Bcqu-i*fDLEYksvPt39&w#^w@ zVqJ;qinne(+rAb2;r1)%^`Tb=uIs-x#-sN7=AAE}S{!eY5lr1gGiwy;<-4Q(*_~dX zO_OZzwvLXDCKWSF=!+R}B}#>JLQTo!>@$sX=rq@2#JUo^RX_AJC@4sc!x8fn0&T>^ zyo-qg)JEmKM#J2B=L;>$J@AIpRktcdnoN7LQ|%}4{H#$oZ)>Gxe3Bu%`|#o5XkCbi z*-+_mh(#YEOOEt5eQA`-;+FwdO7 zrd8>KEWVWl45zJC3T|_46_v0wO-43{)tR*c7ngw|r#RIITjDKTdU=U)R(&BqtVKmc zJg?9hw(RKUzmmG2oGQhOMo;!%qoD8aX#OZBBCDom#3L6!XQ)(Opi$(Qw;89aub;Ty zQPKDcYN76J!4`&=IH_D$)UHedKl8qQB= z{5CFsmd(6IbDrhokL6{{uEf(MjeNf(;nt9u7JjgAb-k})C(_!;zxF;&ked22{0(!6 z;c&US zP|JBl(unybP;x})=B|esrfqBu?4?aNHa5=xi1lun{9a$rQO~-++JnOlR63jzx8{ol zFI^IDhvN8N(4{CvYAt+{l2bi3n{&3cJx;L`#qltt#HJpkDQ~TMdwKo% z@uNJFI77}&qKn?T`lG)su#xH;V z)d!-YFL(8$cwqU=yXVq@)(Uv^h2AJDV#Myw*l-No~=$UKDN3@$R$;z%E<$*4!4_ITcyi z9BSGW0eimBtcqe&!-dwmVyr%V<*T6mQq5%woT}8EejfYfiG~PXGL}b6;TJ#?geLu_ zNBbl@2en#d>qOU=@#5{e;^pZM8HbaBzpM7~>O@jKYp7GgnS>(HTA(-8{w{2}x}Lft z07mYJi#O5LL0y5W_|7mGe+?J$m%P#C7!|3MEjr{}bJt9c4#W2E;cLA> zg(N@PwYn7+7J3u2ObN>E{sth;IOlg((y5A9+PjB`Pm$JpuWpPFXg}H8Ep zrA;`~P3mdZQBjxmvM*x(`97Y{M3c38a^}Nz>VhW)A2|CQVi`CT|HjWRl_@trwtaP4 zQ?ICFDNfmYxWRgeuLhDZeIjk2Yu`yWrIFCz2UXa+W6vqvAgAXM?4<8>N8{5)1 zEGjSD897>pt^ENyi@vEIzlp+?g`*qNavAtB)+03GkL z^hANPbeb|Dv;vy}Cz}Tk9taDUn>zmrmyeg8#GGi=sSoBCFaxlqxifXYL&L#XNT_r= zy*SM!pYmt?Xj;J>zWYpbyT%3OA5#P3!73~747Y_}ytjTxe{k>K1(&Z+=lj1_e2!x3RY=^4?z>362Tf{cv!hsv zAC2rqo1OP6cGA)fS^6!20361?zpJ8jFq-Slt7KKN(zIaWU$NO&NH=0GmW6MWOk&Y1f2Q{?WP{d%F03;;AnJ^+0w`36-()Q;NS&!-6grPtIfHS zEZEVd`}i)sr2p!tPoIkScIIQ&S9?rFn7kr*ZQ|nNU%hraHB!}^EV0cQsLQ8hlDm#{v9D|Xb3p2FTg)M8qxOx zPAb-3Is*U>6G#Eu^~3(JXs?})wjv*#GaefqrKO`Y5DN|t#vx@FH!ATu#~``(V&QKf zXR(h=KRC_bH!M1LK_eO7A{QL2ipnJgvo1!xz}mnilGlbAI%j(~Yd7U=Sl?_;6w$h! z|CMsG!qsj=Q&4=Mfwlk8-|V1R7$GCHf_ecBh+!+1;eJ|mspWX++_9GX&CV)Bj1MkQ zk{ZhF?~S-8_lqm~KYtR$J6az!*}Pj#_qoOnw718FScdcv` z!v&qymgDU=mnXMYXA7VSE{)a!h-2avxtHs>kx9zv8GYe2I%QR9{bxf?{ zJZ7CIe}PPf?911$%QFc$Z`mRWgX7LC?Q9Q6;W zJvpW<_^wxkKTmXKe4HU%6tccb%&c|-8~ZIYllJKoJu z`|@-=!p09+P8qIXYmpg8G}P6r${Km*v^Q>a-Vl}O(a#?M>6jF`R>3o$eDbVKpy}exvF0#S3R8Ao(|s3 zXb~O*I+|m0v%q>*p%dRl40z$!6tq@WRz%zu6C0ac_(plH;st`bTB-zm7mDs3qZ#&{ z>Gq;;&|m@UR;!#%Uk62`y8G|_BzzIsO?eW*fG}!&d^YJQ`c_v@rxh?yp*xgzch_V@gtPR!*q(ygoG{{Q+#^u% ztKkDHt6xb;^ruhE4EKvti5!RA-ObFnJY353s;GDrR$2DgGSmz7GOA16?JxviQYw1H zQKWa5x=Roc@FsuT*a(k_Nh=-=-mRD$h?q<}YdrSdXwk2nQ}P|#Z6kk^2z`D23fox; z@3ZvTtKKYr-$NJIKl(Sc39PL4%&*Kj1*Y^FzZ@0FA|FhSFfxJ`TK;nxyR+u=qcWg> zLj`mB5(4Dc9+u2>eL=bcAhP4jAX=8Qdt_}B5@Y^d8R#a5P(O69t>53Fi z1L-kLC#)TAS2g9goOqog^Zv%g;gH|A%y^>d!`1wgQO=u_6gIsV4Kq>-*%@|u$~A?V zBH~>7xbO?3 zn+8+9u+(e6z1Tau1Gv+zTG8O!@-haMQ`XjmY>4%Ci%jt~!}j?K+kjv>x%}gy?vyRk z0X^lF$rvOgYu;~Xz#!<{DY)Kuj{1YZnp)ZkZ-+JKt);qj&+c4lyaxmJh7tCYAsY6I zg=VsrbG=r-#we0BITtZ?hD@$Au6-DFec4%)i6EQ67Osbv)4#5U-OxfL00AElkF(%8 zm`lCCAzQzb1ZIm`vGWcPUP}9ki*58%Umezz?%!uo&u8c7SGQJDQ1GD=)L1=4gt(;b7#mD~|Nebu z#wbHkK2DOAB2g<(Hv`w7N|1RPHVCKdT+rAzpYXG{cBI3V6==!cZCP+?^iN zVkQkI(50x~6age#qHl@N%0Ill?wbJ?#mgg^IyuOXXd(zjXi48QM`qD2l#@K%$#Yxai0 zzJau(-^LgWupFe-r z_-a2pP^@Wv3d%eXWKSO-!V!^+>CSfyy57MqixSjqr+y0b&SPa6VRzA@`udZwPlayZ z#=@mcaVE=C=~XxGPE0j)3GY_bXz&*e9jJp}8MNDP-UX`-k{djF@wTj@O(vwaQ-k=MTL+Hv4?Q+2O9Q z><;yN3Lb^4(=0_dV$}W3KHDcGM4A?Hf56N|?g}*@pHP9&Y}&nPLIzJyv+C$PlfJQ^ zKNY%I1kQJJ#Tw3W(v%obso-2OagAU^Aio)}3#wkCWm^gDae=GPGO(zl_;{{=>Rt6p z+j2|yxQIRBZW#$coHld4`YEvh=~Fbms%)!@^yt^BXA*wct`2C)Z$R7}YdqyoBHl!q z?YcNE-C6Rg#mhgEPoAXEw0+dHQxIm`j?kT3p><7_INu+#VOv&2x3i-fCop#idI>KYH~Mcrtri#l^u^ zx4sdzG-+)T@GY&Ktx?GdDzJHy&mhdhcy%*8?Mvt9hQ0z^uQT~tRsEdC-IO;LB4*wT z>}0%uAA&9u?w$tM=U-2OqwCAG;BkjCxj^2GBmMfBVq2ibv^EBSW)*olf#ZiV&cgG_ zQ&PNpc|YStIt%T-03G51D=DL8(((p5wSN&T(YTOneYAClHc=bbz#TYU`A0+=vJw)iaz7p771EPy7QXsQBr5?||H$wUHHq$@@a|3b-)wqH5L z6tkVIlejLn8b3MlxQLll+Ov(dZ+*i;o4%ZMZb7bU{zdCdBdOJyO_^`~pId)Qr?}eO z=pK3{oLe~blI-#0$H4T5M@D>+^N|R+{1Ur>_r|)5v;SJ0RL?$^pmMfVv9%Qz77oXw zVf)$WO;}LF+KsHW@p02Buw6Zzs24px>EuVxeGpd%E8Sai_4{>}JTexSAKZgtG3~qd z5`7QhZ2HowzrUx~;AdxF_Tzmy)4x;Pal~qx(0I1nH%8u#+xUrWGqKG8|7QMljF6Df z=5iirPkRb7c|B)l!=wyh<<26Y;JrE;_!i=U_*t)CKF1sjV0D&O(x&FkShCWC-1(Pe z_&z(<27mt=$Co3{X=47A!;K(>nD*tr)$WR(EqV54V3*SZ(8-9rwE+M_=jT=6UZBD< z+)opONP$NS)#ep0m2-;}7dH8gr(jN~eKGpefb!~<_SHV=557ip-kS_ICMEQKhA&KYwbEh}@+> z$n3!p9}zevlkR@p-NVB5Raz6xY<+yFSj-*u5f9GV+=r4uXb(a^0g=K2jvI z|1A@fgU|LIpGO30w&2tJHls9ykNo|`pUxE6N4C$x!xv8c^|oAzZ&;PkI6mBWx8NXy z$DbeJE8RD^Pz#!uBua7+_i7Jb)6pA5mIck;-h`!aGoN+|>P7T~Ro4(HLDTtPvbKAO8nzUm3w21?%9D5HN~C!Epp_Jzgd%ID&fUD&>+0wL|C#_y43rzNP!PPDFO}f#_jlI~ zJJM!B5J)FgTT{dBvRils zIlbXAx%msrKYQ_sHl++Sdfn7qxX^sVfOq@49ypZMMmT@ zgWb!9uF%utRe+k}<9!r#RaX6PbcF>AXV0Iv9j!g5{^aS?1;kUhxZA4nMu7&cFB6Vu zNOez1DL61NFd(4$!)>ftxyk_W0thGN34x?uP(E_AWvEYWgZ3i2w` zuOV-VxBE+GCZ|d719kNsU{{v&{p!|mR?1F|=7%n<>O=Qe6vq23kzl(|!4|X*L6Pap?TBjpT9c(IS3GbyZ zXW-vtI{XoVYL3Zl(}&yN8_}i%&fwrZ9y^PEFPM;+n26@!;=&jJds)EC+xxOq*rgxZ z-~H!6h%)KRH><}7UHBGAt$HkcDJtkG;Q7HrOCiPEv_tr)K?1d(*~l)eCR0_J!jCH( z0%d{*esE8wG7pmn+-qSbv8^PCxZ*ILOYKgnxhW4|}^Ar{r{RubbH4)_Y+|;!(<>qxmGPC;CzD?b_%SL+2)V0 z5&({2VUu3MOnHz|YRjcYXlG~V>FEig#qs0EGcEqbD$W-H{ffl>lcCw*#b&2xvUKJgws+UV+ zXC(isF4I0B^)gYLy4P)fX%rZFc>}KbYe*~1G4oy8uO;B%Ae20U`gkOtom@N4tB;>P z2@}4;pH6m=Zt%@-$IBX&w{JtW^-fE&FiCcb#mXn zeG6gHBywMuSGOdjUx4?T30Z>J6CN?SPlukf(iyaTN&-h7+*~#`HXh4~hvf81w%{u( zdkew&9v%&m;Cm@%&CJY}!axnuv9!#ZX&n=ZZ?RjRkd-AQCMMI0(a-#+_CO+r*nkuC z)8H+^=Bgn@HTC9&8%FP+qu(kN>g0K4KQb<9YlB~pb#-;Et*x!BR)Xl|eOQ~>l|_Yx zXZpYP?6c(N8<{du0w4~(L0{QionOw}=~Nk0G1E93rvjh5@xhpT|Nf5b3fkOiZ&aq+jhqG$Q28$1>Ci1O=owOf(LDD$Hlm`yneoQ7L_Kz=q+iQPSvN5_t zxP#<*29HZqES#V^zmNFfAhyq&n@LEpb#m;7LFT64BD|`b@}8d7OD{ z3M{Bje56D_&UDk1x0C&6HTZG>GKPkR7?e`((J(MDK-;3GrWW-hw;TIT(#35#(FA?i z<1uJ1G@?GQBT%SyGGsv(oW||ehCyF$g&bXs{ka}3q#V`Jf~iR`_?t;`@!Wuy#rOg_DF_wHR` zGw4%oT}4g~cnl(DQ>}@96uh<4w~n%sgi2!PFPQ=VC zBU`>wDgr7Q&iQK(D}6{dFQeEWA%*^*e*oPd+J9PFS|po}*OcSLhgYj$ckqCo5*8WB z%-goc*z)5C4kh0eUJQ1p{s^AIob{6Z_!S_adk&c?2?^)fv^`oT)xPNZPBF5u6pu$b zAVA@_CGO0*{Q_6uJf~6U%(13rJiaa z-q#fZWa~czWm-jQJ3Bi=NdZh;&ww?}aM-K0b#!QM=>k$e`6d>j9zqUT^WEs_XIPXT z{{A*R5nyv)QakeW6~Y2)ejpp<5np#3t>mk+fY+~Y<{o>f&1Z!|4<0nxgwfJ6$S}}J zhL!*@cqn|&Rm|X>;RTQ)Szt?|&j0_^>k+`fau)8;K7II$2D#NA*E@!ZNkm8(DiE6x z-}-qoxzPaaZFG=tv+1)6L7Kg-Kit6Js$b+yg?fQq`Bu|Fc@=U~Xvf=@f{3TSaL#7J zZRwZ4jo^mDs(L8|7%aHz-U^u#&OLMH47=0abBS7^7DJc(?;nb69%>+Z1o}7$v2!fvt|e-M#sihCz@}!LT=*)CN@68 zH6A&N$o@R=4NaRMLVlf}9|(Kv&{F_#cXO(t851$9U70?9n#ki-CMJrV6zNgklLUIq zy-v!tp?K)U263*+2*}%kDiy)+U_Dy<_T9U8nevQi?V2|LIX&%ve7XZ}%XniHvAY>M zCX~l2>4BO9HV1r9P_P(qeaiK#SMTO{6rN+A26@|uY#7zF-doRck16x{bEJ8^PUzN$q$x(aVeuYD#Da-p~T?H&KcIF=db82hv zD&JR7$TIFxYDc+>j+mr9i;4Q-s$1LFZ1UZ>vPoB=PG0VBa^h_E>tC?M;yLv6eJg-P z($dnRqM`s)d}u08fsTF2P!_ow_o$G1@#kBeW*gpInRZ$t;QJ@CU>>#P@u%d!>NPz4 zSWA*!D)=bonNV=lA>2}IIv_Ao4G~5>ejRm4_@$}yDj!Y2wTZ_mA%qq{)N;8=Ew^AH zy8bEPxr-MsQmc_h{YV_8*GJTGhv0p6ygQa{Kg^SyoE$It?y-+&Tn&`NWHqN=);H6UT^c`32kI*q|ruyO1q2(=pfR2va+n& z)o0^d@^tG-+e{g=tPV8ga_YRiyvl&z*&LC@iI4uZq&J;FB|*@4eHm17ll)0KWhC1N zP*l)`vP4Gu{f!L!6$1!yx|BizLb|9PCtxap)aK;-EISq`=QPlxf&IXhpEA4@mz#I^ zJD~PiiunSco{l>DZ~MaaYhnuv$n2j! zU8<7^y*Yab;vJPwxzdv`YazsEoW*(38^mw3lLQ)vNs)5Y%|1x0-`Vc^1A&MKABs?@ zIAKR0fB%qoY@D2&^z?}~^Zfw1m%{!9MbMmM;DvSyUD1=^@>J22n!iZ{Qb;K97$T(O z%Z8c|g$SgEeQ1J0kzEBE(3%*yNF9sw8$Ovpk#lt+`XA#k|3zK><;n!e9@tG_12Ka9lv3hmqk05&ljfn< zb1C*^cPy4AH9NaJ@j&1iiAhQ3d1_?P{H{F`5)pBCRC-wr(Nw*TLI9DkU%&1yizSA? zUGRJvX=vn1e~PoYNi%qfx{-f(eFPD!R@I6e?G}eCGL;xwQ+ zB3UC)1VGHmyiQ9So01~gUTd7wXN?{ky`(%{*}AJzxd=@6K%$5NiGpJGFLY$ULh?tT z;2sUgK}DtmMIf9oL3|Xl(3!s=`^9g+oRE|>)&F%1(!I32s%QhNjU^pr25P!mp{*Z+ z{5!uWTRPbMum(90%Db;Pz}W+YN%OV2EECyk1@V$MZ}4Twc`U`PvLRF|%rE;M3aeI? zU#9%oZ{V{zLC7X49?}lxpUj6!-J6>3DRXe*>6C~YY5Fae*@_{pctQ>L1yO(3F_~X)b$Z<;yj~%xy z-`7|~zNNpbp+m;Tf7y_U)I(pNea;|6ZPvij-%FA1jpKo6qM4$BQ!z;?}0-N*+aQO7? z?ek|82EIs2NbuS&M9&~FOVGKHoYCX)OlQVa4$iwGOR)2SbesrT`Y>q-2!RR_Eh`9* zy9}A=D@_^D z7|@JEJtg5ZE;Q`MnwmS((!oP)G&C=so-Cn2L|G9NzD}qpDVo$yB$==vY`{FP66Wp@e|@=nG?9z zXo$HXeGg=%tgMWNhK9;<;TvqEM6^DZro${6?mVyacJ3m*2-5@w8k0pSRvjkRm|kGv z7D2Q^_yY+PD4&8nOs}ezb4~1dTbZp8Nm?sC&62CejCTc;2;KUyw-FJk6w#-RVR=zY z&2@c=2iU`iepL4IBmtd*g2H*MDB$lfi;%asyX7mhao4FmQ9T)j7kk}Y((t}xo2TveA zVuEMKpw=Gcv`WHNj=}UBhtXZ9Y9enl9~y%A*OjYR!?;ZQBW(KVe{@1PAk|4JWKSi> z#0gX;<3=!)gl^x~NtFVZtGpIUUP8RHO66B1W0fe!cpfxt-ik~p;z8&G;oMz3t^1}v zxxOQ)Uo51=psGme=)|TlT)o;2MaB?y|KzEKdx#Xe^Zi(74-hO!5Tp6?9fQNdk_yP2 zfhzB3m2ik;SNd!QX4_N4^CMCtGYQGb8Ph$z1lvT!GG^W~+}G~Q)RDkDo8Ep&MN6`^ z$SbJ=a~zx~ZEXN4-)_jI+|$w72enV%0whz37!!)#$e+ufPD)O0D+9SGQMKm{Gajsw zCs6vjBSB=+gZyS@JB~AS2r)nMM9OwnWyC7rQ&CnXp`c*mMc48C)d@P!6G#P)Le2YI zsc*c&2C!de^v4gmKHO^<&VKN+O8YMxcI{Cq0ZeUI5Nmo!D$B_&4STaBnR4CD7k&UR z)OmXy$&+-Pt$+xul*{z%r(3f*ko4?drnjM!iA*ValDOj+M|y#ig_l>gaQV0V=9NfibwzT`pm!JncXsyJcuD~H-E1$GX zQ~pw!i#aQ`)8bJMT}i%d6Qwee&;GU1t-(Na$O$=6TC9sFkwA;jcP5w77)C zR+cEVtK~)vPGnRmD2V-0>9G~#v(dYMiPq>&U~&{3FbkC8g7Z1Ocy}dTI=*G-sfUX^ zlX`xTL}-HG-y>u+c+9ZI03GAw?@w0jD|V#^5EZduQE>{ngwVafGDU}6A1`;KlNYIJT`@(F zls6awrF-9AU>>-K;e((U{+F|IEKi~C?Ax3B@$iKs@i?|_xIX({>1kY4;Z0B){y*w{ zLwzB!M~+O{pJ;XZ)E+=12CfDLB_$;Z$;RLdTuNSRNq)5R&SrFUG&qDgnVD=140Uif zUfsEaaAnZ9gSCJreW*N&+MPrMDKD--+NNV1%aC@?1Qm%`-@GxBA12el1A_iUKqr}y zknp!l%=inj?21sE$WjO>eLfBz( zwkOBXLD*Ui!cr-1r@#Z+0TVHqwaTB$v?DFTYhAIAMGEl7xBPzX5YcAn4JZHbpjW(B4RusL^1w+z+V zP#}-BO?04;y4es@Dwq&d0M3MKQgBey$N!k;;xPaBC^0VijSIu-Z~-B_T)a8O(AAZs z$e^V`SR+GZ;9g)eKL^DHhPD74Q47tEN4cb7CbJ41#EZ*`($w;RZ_8spIOr{D`CZpg zXc{1K`#@d$WO1BS@P9<SO+Ri*A0~*&6XBj+WM@}s?`~a( z2rc2cbHH-v!K5V2Tb<1r;Piv}i`OAnfuax)6USpF)LZ8~LIIlFH^GsYt8Dmh;&<($ z{cf@4r2^Q~A80Jv+Q(Mi?zqBsVp@_H#{D!k*`tzNXAZo;ca6rbQTLjq!iN+fZ~0rm zFpl>L=K*Dh0+N|NB-a(-U0Fa$j3Y5$fjOHnUYj&nKIveBA!A`uC6ZXRhUH*u@YErx(%A~xd<@HZ-tV9M)3A*87f0@0BihQZzg1@kSG9NoTxi;9js5OyCC1ZxHl?+s!AH5yer3IZ}@R}N-O z59gl?OQ06H{WZ2za{8ZM&Hqer1sp>R3_2?FHdx5--o71udIK^YZ{EBC0LiRb#E5lX zpSbluQ3?Ghewg4%cV0<`2ib65yg0Pdq1hoYN`WSsgSp~=^^IMrhQJO&)VblstYhp_ zbAHw>GqF7LFtbRkVf$^=-18=cAUJ`qLJYPgAPzTnX~{f*ZVh6Yii)&Kf76QUC%_OW ziHXIJVWc7|y+kW6TvqH)KU#2jt`#E`WPzHkjgtprGWMgSFR&!2 z7ZRNVj=)Wir_|tJG|A6~fe}aW5xXe^kck7v=}DL}4Cj*JS5#1F1%Yv;i5EGzK^Hh3 z(B*3KUG{b#mpPLjTgN`s9fxsPz=$2_vVe9l2Y7s;cRw~Hsb#Q z)H8_6hdI>M4+{T22oqBGALxhi%k1j9ItfWhkj+7WdJXJjPEtk&7aQB^204r`|6pPR zbO$KC*8bb`Y%gV}CI!vb@~ zYM%}#LDCWu^k5hmE(NsslAPu1XCGd#3>{6A?*u~*Y|`v_<{H?{FdDH9Z5A$2h!qg% zXGgJG<*9Xwel_q;eZU94!Q!~jHx|vO+UOtk}KP*uN82oix}vDL)i z8F43A0#M69wkd{`xS-~@y-+^8%+1JA;HTQ~#>!vnJbB{10#6sJKpV5c z53&2r9M0)7d2Q~M^PoB-5k;Yf{Uo~>uwm5EF8U}Yn9t|2)C=b{R>{)Cqo9CrdrDH$ z)xP2US3H@TpMLz=oK6RL?Wdz9;86o|azEhVHHn*T!}krdwL3pQg69T+ctM0VbM;92 zTl(6m6oP=~|0YpDb_4QIQ*Fr=g2@O2LF^Q;DPgSA;qK4AaFhHy?FSRHpc`R@FKbVWV-LJ8V^73Bu zIwnM?14{vNtU!fGP*_d1$z8EHpA z4=jaK2=(Q(@4|p3l8_a@3DEw-&-UNW-z?|9OL+jnV;#l`QvXk5sFPt*yl-Kp zCgiUMpbWyiB4JI2)cx6njvhUF`qU{f=?5#q zKE}i-%vKDe2%!)BXtMCdzIGYIYFNb8;om1XCo00w-nJPxQ0|CFWP!gO_FKoVmGI2` zzm75-h+3IS$dfvfIan^&sBnq)xyXWU6uLFYqUQ*d`(Ya>WSi8u4WI(=+dfw@0$ znXi^6`%%>0&CPPUeHO+_-bSDxrZcEYCr>&kn6+U95)7QTdX7nixOt|uFAy>U|*`kIQ!ZpK>%wMv4i+0!XLx|an{8Rj zE_yHEEYqTYWK9pB`Y_zKKk1Z5h#I6oVjqv$VlnCiz_I$%m!R%R{68?051&41e-C8^ zkrvFAbMD*iai5&@DQ3Tjh=@?9g4ZDT=?=)8;|EhXF+?FE(EV&D{|cwV^7ipLlYs_5 zy7$Wy|CwXah%B;blD5cz7z?A#%xvvY_tAR}*r*4QJSe6^Dxt#62kX%sQav0p@VgQh2@*{v|=G#-rAgw}w z__J5};`G;JpF+bXK-kG)Jn=A;`l2>S4*oENQ5nK0=^iQ?@1pn9C@3TtzMo|Qh5~6Y zlf2R3pFe+sG{I_7URh~9)#?e4EkH#LQs*4xQ8tG5zSyiaD=OOTR^665K^N+J0N%3`V1SWSd4q} zSJ1aVeR6XFlZAlFg!&RwE2-WkiEqdLf}y z{d15~JBy^$5XH=O9pZh3@E=vqBG7yA8OoJQJlF%T7sC5)Wav0WIOYi?M1O+IKq?ve zi5fg_>gmV!Ead%tYr`oyF3>A1p1_extxPTY6n*sRGb)M`Cr|JHp~pimN__GZ=VY+> zr|Njs@@n1$1%dWRXA#QVa8!@iA_VX_NL!2W*a10gtrM@~d5Fdger-s0R{i<$ z8`p>WY)5?2X!I~$vIU4+u$N|WL%#XNGkte5&7X{u2}^v*dhDhiazeet+!wAMlQ7qH zgrSBIm?xw14o_*gX^|^=_b!`*+6iku<43bwFyM!%1vyo|WI0f%>t3MTo@<}9t#b-E z8YA@i(v!+6SV91wz)h{ryTirUKpC5vxdbM*l!Qb$n@%mT8>@KIJiX=^7{O1l1{4TW zpda=Fx7>LKjH=m2fHB9g=0LQlZ)}v2lB%z*g-P7E#vw3sJ_Ry%>ul8C_W0C?|Hayu zfK%DF?Ji9!mC{S43`Hr4N|K>yBCjcPhKQ6bN#-#$ydg;{88Vc4Ok`?6gOW^zC9_au zP9kL3=S`&d|Ni~&y^sAJ$9H^RWm#)I&;8u@b)D07X7+q$jx)3Bnci|Qm1VkbIB>_y zg`})~JWro1zrn~`8M#-;`Up!;AE0UIZP~QxeK7SCs66Z(vDIJ_bRHag4w0wYOT2Ai z$ZqYfGxf`h3JSDyoX;IS8XSmd3-5-rsFsU=ALCprlR7QVy!8G1R+#Xi&*uU|{msW0w7j968D z=7fr8>u$+#vd(={{fckpe5Ow4@8KL<5E@V$0d8JtWN}DP(3*24DN#`yxVZM)2L3#0 zWW*t2aX^R^?ya8;QqcO@fl|ZvmxAn>);BmeV!p)I06@Y%S8hs?JTf<4=)s$VE8In& z-ygVs<1L|?bga(DEbpW;ZqnpM|G8aQ6OcjS5#w$( z&>8mMJ^@|GBw*0aHrg`2O>&&t%@q%&Z)4cX!A0ferOQBr1o7 zs?*>j$d66Q zRas&J%f_y5%@=IHH=`h{gu?uMoceOm2}A#`J*H-U_e6Q%SWrHOb4h{ktm z&fwYQ6aNpP+MHz5LnzYHGr!)Dcn3IZe{YAB7hYOryl_p-(Ga7oz$<6I|6FG)PVWD> zN1Jb1doR&XvPL=(71PMG*^Cj9kw?KlGa~E}sYD6#utt;KMQ^-ck7w5xI`wchQ;r4C zE|WWTVNR-t=XZ5Y&DhdUJfTj?8X8Ew>c7)4(&E_gQx^?&ec;3{90hevrhiq`s3650 zw|DA=1Bf#l%X1lVtHR@(YS(K}XJc-*-G88jlDlQ%7Vh1rBiIZAu>kQ|cg@zf7Xy%h zbC(M)IOu39-UJ2)Vrzj^7cSl&7?B?L;eYFqo1$r?qpw0;Y_Hd z1!nHsyYK4RA15{mWt!0y}(e@BA9Y}l}K$BsFH%kR+wpp8B&gZ?xz z3v6JF!=CXG%XlNWebNjMi7lct4p7i@b`N2|ARC@3!8 zWAVwI>I4e(Wb`$wooF2Rv7HUKMJI;jz#@w_HDen$k;u6Wy1BeF?TwXha=q=nSTcsJ zHuFDz+2&1~?7JVews&;Ek(gMF)nNhfH_o!HG;(NY=y4hF2|yV5rQ_PRaOtB7YIb-K z#tQSPe}B>vkEzeN?{l{_eG?0|n!mVn=i3UiYbluV&LvVOF)_!w$JXjbCr*6Ejt*0U zD78EW)ZQ0`4%?S5KWiFD-D}IM2QT`5#@$w3X&-Fhyb}5@%q8^ubI)Hm-{Xnaa*d6L z+*hDALh&pD&BeLduDhfrwwD8)0C*f>GU)sE4QjL5KX+1kVV=Yu<>8N??>8GCFoWs{ zJJZ{uqV?*t&NjW2e+IK+?p?rhJRx>r5Jy0B`3Aejj#Epao1t)AN0l_zCox|3SY`-0 zk-Npj!~_NVpdIH?pGA54LcV)qH$m0}vLOBJBZ<6SGvyQV`7}&NO?kl&m+h>PJalB| zL=_YhKZ-CKtkE`rtS#%|tz+G8IR6JiFhe*s(@EW=uiJ$HxUm-D94x!Y7bl#Z_cSs| zZgtA^xPF~a`(Vm}t7mn)Dz?ZmZ=;0*9#<&lV3TAxvUTFOr=D%r?`tV?=@WK&nParz znFluU)WarsQRq!5pm#yv1Wy+orFY_?hC|X_&na_a2Z#OzS)3E~;O}}4`p4hfS0=(d z8>J@7#BCSi*<2aOM>=exMLyC;D*eY<5~53)SmaO$el3OMSXS%}dG2bS?E798I`+Ml z(o~4X!mMZ31xKvUuA}BXo&wohZ&LD^bd`tjktn%ddLvCMPBL+7zK|8wB#uZ4FW!eI zi-Sid2Eu=nR%9$4l0l7zyaVz?2B zu(AgXDk-&4LG0c8+_xs{FKSA8UepoOpYvsEq|>EqLL*=|Cp5v!ka;D3GgKqEwqwq4O>9^QX)A*5Jv)WO+ z`HVmTx?<>c;+WFUUDUqEUP655gOHF6;!z<+9coWy^8S9JNfkRc~x4 zbX-#?oQ+O-s4i9tjR6Z$d*U=u zWfZp?NlUvugnVg(?eR&f;i%}EMp_POul~AfFWuV44H@L>Tl(;+IoW^q)lgkJG}_~m zG=L23_oJewyJ{N0;?H_TcsJCbbh3Tq{r6{|!w7@@dQzJ$j*6rck;;)KUDt6m6ed`H!JdY(PXTFD^N^~V)}y9z zG*ZmE`fU1cVdRnu4dFYRN(6i?poI2no5*YHdxjupWx4y(u$IL?;mU zFg;y8vi%aKA)rGpP-K~p+%dhP@OHiZ`!7}rq=Xz478eh};)->nN@vknV}GRVeiFd< zYADesedk9(^uplB$gLjhG?GwxQfuEDj9@4;>lg1vpI6sgEZaPLud+|2apX3^{I+78 zzvFlAR}tJN2L#H=Gs>G_vriMQw`)fASnvF^>sjQ`mX>4jd9{XVHJ0K8yY2!o6`MY+ zl7_a(Na0L6B5&@o0vKL0CqS>3;VTCkmHXIWZ1``Spi<+iKOYhd-fHFYAl{@eDa_0#78OMll_iL`Syw?`~TN(_Vw zZ5*#jyR5dx?ukOYVW`+v)e%HN)AFN`p5iE0_re{bztix@@62pU*xbnrFwj;e-IW4e z)cB9_u~3DTj~h;Rl$@2o1crhqX?Hq~teSu0N^bE>H%7qM(UFlwK_X@CSlx2SaI>*V z|C928LiqUu&zJD&6$cn&3n-vilS9 zu@oH*PPlS^64F(qyuTpO5;*yqQkSl)zI4sSLFZ=g%kx~odF48vJXYM%Pdo(!d4E%q zFa6#}Jii*sB+NOs|1gf2ts8Evf1$urp!x7*7PI|#2{#4&3)v28KkX!UNK{jb57-Kv zS`%yL2li#vEh(s_a#q{FEhy-6W8mz@-uQuh2y-7g$y{uHk^#=5a98aDjk_XCcQgJitFUOflt>U+%#c z#``uD{;!Q205{C|vHM8_bJ|=Ic8b9r|6dE*tLOdJuS6#VEubNX`TD+1sPkiN-v6{| zEBy><-L`qdR6J1VN>hJGare!=s$8+@$mVG14ycj42P%(a{b*cU+zxi;BUbku|r;^D12a0OlR9mD~1ZB&{_3j(!x| zDq;*9aQ1@aOg6Rdwu9N|?gmCr8yc=!E_3|G@j$stxo{##4}Nk5!KPwg=Np zNdfdBH>}~U_eoCfrga@hcz2?K)Sa7#=RPejvScy7#-n4;FTkxBe_74eUcojTH)(RHlpC?g&s+($b34t*NfovgU`z z#6eO?={*KxbPNwW2tB%T__1K6pq9$H@t+MYZIONxyP?ELBV#|MFZ`^zRxhPI6@l5A zZ!uiY)1Zk9|QpjjqY@*1M60OL48+rLXiTZB?>b*zzdGNHg>7y=oM>TI=hwwA+_8yLu1#}duV_$*L;cQ_S7 zcdb#=HOIC!aP^%^ROsEkaKjaawT(BD&UKj}_>$Cm`D$h%X{!OoJHVa`9d~ zhNz{q8R?#FHh7;geq>JdejUTH`8Lgslfcl%NkhEaMaT@*f|u;b%e^h;wrG{X&mB4^ z2))#n&T4~I8Gp|Ho$qd-P2(%pFfqaHd%C8*_I>A$(0xVWW_RNx5*?4l=`VgT$5F~8 z;_vH-xKxX-KtF{WR~M^Gw^@q*PK75rgb=mmiFN_u|oxr9Yx#C8cXwLPai5@)!D1^Ld$^*f{6>Oi@K)DOe)@5PJf! z4sD@bVq!mWx8sPCHMMr=2e7_$y|Q|gF%ly$CBCGuWZN<7C0wU2*s)bV<@FuC7iER# zii|BSEWVHK^kslG*UAWaqzM8iw6vV1OTY~(xAAx-0>0raU~B{zVx((~ABPNV25 zmOnmu>baAiq9oK#yP+K3h{G-}nHKXYeivwggWN3VetL7?-Hlz_`IKiNm7 z_olmqy-80JF;!CX>1TTm$h4yvL@x-5*!%{&=EWT+sRbo5qs44h~@fYMY8e4Db zE3%M*f%XZUX{z&h6wPSS4*DfD%fYYu@kS6uV-&=NGoEEv=#MFEPJgBFa7(sy)0<;G zK3(Oh8%5{#4yLIah3qs99FBKCgNX%3Fli#Mp@mnurwyZp5_%srzLdYjeI(IC(cnGf zaPy+Gd+}I&q%r~#K6hgDb?N|;PDlXkNyStM(Nk<2ZveVRk^iCIQ+DwE`RfnJ>Boa+ z3uhm_F#A4bZS9}o9HU?0mrG7`!MjyRjIKNgBvZt3MPRJ0C4v7Y&Z`A!udz5L>wp7y zAr2!)Wa^mL+5&J9JxC|l<_Yt25QZ*azvrLxh6^$`O#L*){Ro)p-xbBbDvTknhv8L> zu&Me_zrw|;(~BOxTkgeci9$Y7e8b3ol)?A>QYj#dy_}QX>U5&Vj_L0qou}J{i4fZfae0O(=`r>GYuc--dMjhlJp2upQ__5B$UJ(G>u6h9qRl>z`iqnW+TAk z5SRsE`a=55@Q)sj>?5m?a6@VGo_d=R{dzm-Y<{A2+`_z3?c-|5ToGvgf_3w3@|_t` z<^3+bphbFWe^Yr}uO5c9JB-QOp`3Ode73?;e(GcONrT=~xXJd)SrS)#f69*EFK(v- ztk%N$iChFAdGDUsn)wdEuqu4&9VbV(=B&vpiK2A+ce&Z8`T6>uL!In@Wy=i>oXtwCuULZ;q1;Uy?n1j}zu7!O(Rx)JOX4zE2x z2$)uAUYg$lpAhHYlPCCOJvooE%#%@=oamE(#wfAddEo(~v9{qV05gZAV5eF;Rlmlb zz3qApSQvkw7lo3#T=>!Sr!UJ-xqJ6x)v54nnrx3m$Bw?2%31aV9N5QAuv0Pp`Tzky z8)Aa5?QHj_`II2HLOeL;E5OSee00w&xn-xz;6t~^xHM;(<^t1SkY76eoZN^++bFpj zi)rTd;FcZt;XA+cSBXA#75LWVe}nL^2Wn;ui*KOsO&eN}0=Beo=AvSdP9ZHt;KQd+ zN1#C-Fs(;*w+-g;>8CB_EO!BD?^uzpEM0u0ZQe7l6pM0-+$kHRd(}F0B(^s~Xpr-> zu16OxbVwG_@sm17Na|rvPcS+?Z2AOOmPBGH}=&{BE}6o zrD#po_fpvj*1@up+0o(eS4bhHkB?pnK@!X=_M%GI4=9b#C+)i9_7V(v`AAoyJejwB0|5ofhVlktp(CZr1RUE zdXMuHkBy|=jMWK1A<+#5MtdU!_E*=AZir;OT;@d{5@c-tox4DuAlmGtc8W|ZuPXqECap!Fco3{W7ATT5} z<%p1lL?<=P8cI-{<~yV-{?+@u4+iT3GP%7p5-mq9A%!)cxcqq1a1O2`KuN^Sp>=bP z7=~Z5^kb}od>U{H7AaH`?J&<3ym?~>URrz4)--G6BJ2({MYue;G%CC0*fGbdYut@Y zyE!?tS}qzLij76gGqjpo^AtxkNSc|iiMdu_6-K}B#vv#)@@=xvaioYK4M+C=vHPQ(zX=8 z50a?VE#}&G{Dh=K5gnx~Z^knpv`PA(2gk-0Z2@sH-$;-;bLM`w8qrGMym{PoH|ahq z^lrD~)I5GXoI3JZzy)Y|PQ57HO1>w^MJ3XJA774=9+@!h>3>^?I(_rl5;S)W{qa3@ zpZ69O`oJbI+_{8J)X@40{mG)(ow4ctp>pZw0+tb7*MpKoD0fE(4en$84$NAR>X!K? zXcN!2ZOO5*`76KWgmRM1tIuFmhegViEi6*5sK?zK*xpkL@aa9ZBmStDTxJ9`PY&^K z?LnDpFsi7iz_e6U2b9Mi^c6vVhZ3VrhK?1c?^0&FckLp=>b5FAw?8(#G9mqpf7dZb z5$V8Sx;7ztN-D>UL&E578@BYfhOe(nqC-H?JPC0DDQ%<$59<3IYWTq0H*X%8(oD~# z85tSXjE%C%f@lZL1unIJf7VZu2;YM<7_35y!>mL$xp*!(xE#)vd;@c%9&LB5Dd^;r zF2{h0x8?-6bLoqoLEp#lu zeLW&$V@(1m(VpAbFg^npEY;W4XPQOB@1z=D;Pl~^tyy{;A>T(?Kh@)-)j-!)>> zmd|KL!U6bV@q(lqY~~n0)zIl_=U7Alx8Ic@*XKd+4{J_wO?K{+#m}luc`i>|psktS z;3YP>t!CWdqH9TU7cQRx!pVp@X}%@9Ev5Ie*74u9iwL#sNuw&p5A|F*KJ10Ml8Ah8 zbtj>{tePOcMhP5AyhN}w;~&&CGl6b04UNqS-W1RQw|TAZKMc{7d! z%F^VSUum|h`^-{q73Bcm?{8P?DHniwJq|HrL}X6;Y{HEd3uK^XN zjG`ir@*1M_6gq}h4>fcR^YVWbI80;c7v=JhtE5vNxUz+B7zg>&&pL+P>#lib6~>Rk zQw;?rf0~;^mx5cpf`s5@HFyO*{Og=2{->S*X_me%avC!Tp4U zAi`$6#-x|M@*CN`MSO(>U61`LdWyq1K;~%|A3Q0wCO&aBvc$-oIn{6?{w1O9aalH9 zTFjjZJ}~iKqQ>ZB|5WmN@nRoM1gcD0Hg3T3z#ayzlE_ajEpb)Qx|WugM>u|0WwCrf z3t!F7?wu`ckEB7Gx=Y-E^@pQId%{zYSV&Xn0)uTmFKzMRWaTu(viD<@jl2+aI`a@h zHv}N~JZIkVJM@waWR3poGxqoQ^Nwqhsd;fq8X8F17KvB+N4&1$v2D+NQ4uW`UiZn zGJ;TST>e8Rh~vk4mS6$mqAH=V z5d0&^BTQoKt#tuXr_(toFt39FGM*K9X*ylS%9`FeYhF_3OcY3eT#YR@Xdl#s)P*04 zlA4%y1l$YGHnsiZ_1}q~PupdwIF97q-bE;st^G~T_w%X0Je|>MSMSiVg$C$C3ko>f z>^?SHeaZ>XE|1Gg*y5^5n*rr88||>t5o>%2wKO$VHFFy{FBcSrUWUaoK5iTCe$Ari z*YZRbQ79#UuK!AV028RwQd4(~j_#{N8eIUw;(_9zaD(Qm6~zzcICLP+2Tc*ID|V9v zj_O=!o*sm}qWX8)u$SP(#9`p?@4xHVGYTzT{=O3!>0c~qS)}X=<_i+TU$|&wt{M&- zNUNDQnoy~#Cuup)Nixaf$D%ch=-TY8a!glJo-OC6$}h5H83mDDZ^6I4VckSYJ&-b6 zQU@jV^bM7hUc;fhMB~Y;j1OxlO^efBf12Do))Ov;NF)DUQU9jYXMhqPVf00O>HL`x z%zp({z9 zWBwzUe2kb0Glja=BJn;uu>awmVu_@=@*-y`#ls5-J#;O%g57={9_tuJ)YQIg1kj*br6!}$4;Vz2gZj~>RsI9@6%5KE@wVK5s< zJ6(%(V^eAqU5qj8=;pq91m#3$Pi9Zd4aeBA827T*biCE~!R-8FEM)2}8`>3@g+z(O zkODA9afC7QZw(7MfxIKC^yt>g!U}EU?)Z>{{lY>*vCT*cyW2g2+@V3qr^l!GB1M-; zz6e~n+A0Mh)yN*A{VII>c9=}C#1#1b#T5N0I_(;R{-9mv`!axl^_%Ww-UG*{l@ZG6 zl3=mu8kXMcg|R4cB3x8j0Uf0~>&N^O%x+QG%Eh(wj&|;`s(C&a$Ou(V556xWrVj;z+j~_qAO|IBK_zUJS8_#DT zjg2Uxg;IPMf$vBVBLvA`hrOUr^FRNr;z3$)aGW`qkvern?4A*0C5b_1vxZ@S}JC-_WwbJ>QU1_DYQ><4)mHUf)dE_^>mZs>C{uLgm z9pY`pg@n>DA<8!HhwAQFp?Q=r_aomgj^)nLLDw#Eq0a72adCy_^9uVzw(~Cy+{1{7PZ)xt5)7oPSn}?L<_XTBeu59a!pyJsazxs_ zu=cR3s^K~5vpCTn6Y~*tjqM)LS9lRBN}>1q>1CfdK0xO^cpFxuYobH74S&^H)r< zOdbm+S*9n|*i9g$tj1l0DT$o_M7F0mA;i;Gb1>rc2e)v=`!U<8C4Mq~W06+02L>lT zzFh=0#BZ^&*7%L|w`<_pXs<$ci}C1~m))WC!LV6w?IKQt4`_lYkYF|5J3-cNjb2>t|;skcTS`Q6s4u2_=B7n3dq3tLs`*Kt37-@+x_fws=O1E zr}Mi|e^&tjY=rr@^xwq0Uzk2KOTa@E?c41;s+2nE=TO{5oVI=VjdRAt zXCX%KpB1_QqGPN}EZ}a{AAQ9}kn%r9}W5{mzZ&KmD5#s?%LSJ|xq)nqz8!Q2{(u7l78)%`K83cl#TfENjj4qZ zb@K#ZqlfRM*dB^nSdTopAE9^?7qR#9o!aS6zs)fALUr2&(=h~qsi;h;9^*?1!M1h= z*RhId*;miN0dNeGp8XGOVB+s4d(^4o65+#~2882)`f2J@v0O78f>`!PTN#gt$PhX9 z%=!>v=Wag}^8JTPbD*6jTcinbA>@reclH2m_m`dlglq1)aRS>}dC-8aA`Eq3S2qk^ zcDPM)4#a~|db_WMj`cV7as9@LeGf@LfH`eyj6idSF@x~Oo-zj= z+x`omu_iyoYl7i3nE!voXFM1%ah%{1R_>dE*(QOYG#*WMm}CAafZi}NBBB<8Kr-HF zS3>ZU(bg^)jWFwh@8Aa_BURl z+wVN8@vZOmMINI$oJ<7!`s2fRu8DeG!wRaRq5@)Dz)i98kev`wW}Ow(Wy zODS8>V71U~fu{h(@}TaaT;_qan-hXLE90nVfC+j9#=i+ve1u8j>KYN{={}=os?S)1 zEf7bj$$h~^j>%|ZQ*m1Fp-aW`lr$~a@E7O||v816@~F~EO@ZXClOI*Os5oESVC8@q|0 zpJn!EROV{OCoPkrI*>j!EYDb902~FaV?{*;ZqO-Gz4jr6ozPNX#!SzZD2p>$h9F5F zDTR<`Cxp0KN#PLt*LD*ml8};O0iQeSC^jK#Ip9_+qe-_KlCad)S#2l)?-jc=wuV=y z-K9i%H1_z3XFhx=#1Y9C6c{LK-gJOg5sU~Ycq~t$+d*EGmA4&ti+FoX`AbN5wRh9C zU8Nk@^yj&Q2bLvjH6!lVnr#M`63ehde4LFRVT#gP9yxsw(L_42o1g1Q%s3sabWVyQ zH}eE~rMtv4OK?^bY+S#OpG82xN9dYVl%3_|63^je}djAl%otl|hT{Ff9KwcB$LLhU&4s|B8@iO6Bi;?>^HQ1%ZZ0YY# zDl+mlzk{u}D|qxKcWcCIiJ^Q&ELZf?StQ2X9yyPIR3UWr1C2`Zp9O(Ju@^xhb`L_Y zTYi3e)-*M^iq4!mwQ`%m0hB3_MXt`YYQ6^!tO%B~2M7;ClvbVSBBjA=M&N;{BhjJG zaW+Hn)2TXQq`3o=32(f93cB=Kdw^PzQBiTT{dX9bB2muSzIC&$1j=pftYj)RoF~xB zk)%xpW?h;t^#|GCF$yqUe#tX(nrG&lT1=ynf<;IEuN@L3NG{}^lioWAengdP6s04d zpIGI>qf`7ZCbHLk{c86;E1xK2i75d2ZK8dvOiev$vDfwrsh+M&KJG>(qLTEZ3F%jS z<9bp1LH@+Ki68uK_hY#^1M%K94@lqf+ zVcAGfV0*xaC?SntP>C+k=0KlMJ{#nJQS9wCZq#@o z<(?CcHaBVZaB;*+!Ky=;!A}T(P3K41uM)R=V7ekcF;wf-TO5#aQh?$vGh=S}?v3nYT(_a1H@r(iZw|CRH-&rzrc6eu~z_jC$oRY`+NK za%vT8Q0l^NKF4w0Ojwfcj|A)b~~_dII^8;;FG6BhVA7c@gVOF*C?8OdH>x;s#$=U8S)OcQoVld2eK22N?6;-_B)ei{r|H4GOhTN2_=7~ zxbL1WT_MW+x1r*fA#VoZyR4I{__f<5I5~=HUwk{`vE|61d3@KIvGK8<@odbH!8G;2 z+S*!}^{cW)wx>E!aYzE849gN;m*&9lQ=;=#3;Pvz6n4kXWVm%V=gm98f7BalcIKb5X>XBu2a>$oRDqU_OG6O}L|;AvvKS=IUJA3NIHAKP?M2U73SK0IG@ z7T}T#2%zGl2_cAojHNk#em$^oAbj@H34ch2-m_nj;2H6lW+IpY)rf#8@yU*bT1LL7at#z0CIY=f8v84uc2bZCh;cF#DA%ax)DM1 z7{T7?13;AxgEekfXiZ+P6GnezvAIGoA2}_7Kewe5IeXpwo%zT{aokaZvK!Mg%Afl$ zPZxb=&*C7^n(UGE6|N7OKXPbD0v1SxkZvNn&_zaB9gE)MH{yOoI(@p;0=K8IP_Ayt z&c3jNo>Es=`keLXUeTa#`K@7WAS0cu>Mu*c(IgEQUiuC@Fr z*CMaAVhekYy#Z(3-MGN+!kHqZ>gLjDYw9P|u;5LL$n1~lSPEV<_2ZMRgW2iRn9VQ* zH9Rf|FX#XP&p@5s$7N(Zy7_o{hvBz9s;8G^qtUz1cAnVIx~(-$K~0)EutBPSOBPLDaDg`4(oVjhybakes2#|}fV-u91WT|yn6L)2D*{@XLixTRyVH~U;U~W)vWuWaVK`_v#A^N7t`mjde7*WAjB$xO4|8Txv zyYkejQ(FsK5ygPx3IxkJl*n;pDwWYaAcjde^X^?a1=QJ8TOLug!&_DLi=o~LMjnE? z&yOqS^J(jaL-*5qI=6_2UWlZ@eWYR66_b54QlBoH$d=ribsJ*3zLbwhE8}M8N z$_N(RvowTkk~d&7YvT>9tCwUaj1g32F4FVtA2qJyP+r`jVk}$ZEgz(^hG^!-hm*!r zhSlDZa8WC%REo*n3P0eB}@c_v__GD5adum*A-=haqhyG7q5oI z=r~?J499Xpje7L1XgiirfFBSCAO=(~_IXdvc=p>Ju!L9KsovvJ#UfUeZpYGesF(S- z*P*}1=}R#ryij1br4N=KY_t>ECSQ}5R$uhHtlIwFP$pSX3R(wI*HB>;$o`{7bvqGvz4rqMRMb4off z!|UK{tmcgzT3Yvn*FpH8csdFVAV^=*X`70TP1DlU?mk5n2#p(0BC?<&X&j~8sH=9= zG-;xveaA81Pn;q6|;EDZ!8Yw zv-}~K_gzh=H^tpBtUSeN?lW{Tes@dkSriz;HICtXVKd2M@Y`h>aZ~6d3U5-=TX22c zJkiD^>Xk~?O!^dikNs(Q;5T+mQ8gQd{=KuN+H0Dd|Kk<#ID_ks&RX%F?_NOGhhvKm zn~h>8?z~guHIZ`!!hH1heIriQNrMF?QxfHQjL+n6jhnSGqC-0!z6DU1~pK zx`0k0;C!>Nu&~nvoEi2ID&g#2uLrN+66{xNCic6%;fU}i0!obw zn9;tjom55-{x+_TV9;#2aY}e4j3!Gh(JlSvjsQ9i;gLrC)ScTl2Ft*9e zfN2$a}X9bqkcf`Wm;0(s;aLG4}VeyZi zjnIVmm@hGn&8GZ6^9WnX+k%PvjV1Bl_>55J0RWqOck^K`-KlJo!3k9Z>bF9Djm|bU zLG?I3lMsf}})L=1j$(?Y#Mp=q4^U`i@Gx~Uj9luz3(k0hPtmNkfE zz+E-}hX{jzId2?qd`7-~7&{3Vr~y7qB_J{^4!M8ZBJ|B>GMQxBOk<*$B92g+g??bE zWo2Z@lm;TBG(RG?Z1Yhr&2`n2h|Bb+UAta(eA(uji-sPjq$lBvsW+Zlmc;w8d~@Ae zyq2`)Q&$Fb7dMysW2uw_sW3K73!LO^3o|6P5{(z* zv-S`6wafy&4fD@Tz0?bO4abSMc;Pm6GEDjCU$~VBvrjMz=J}z*E9P?$J&|Ri$Jwbi z(DE{4|GUb1{tDGCB~{=}}cOn?XI8vmbe}{&C%l(@ni3P#;kXAG##_1ko(0WL%U_vH1L!y$Hie zo*vIzV$I!hDRIf!kPGz%_NSXno|rdF2}PmF%s|US0zt$kFU90WmwosQR?fkeMI7yo zjLu&#V$(H6delLdI`DrPQ2IkZL$V*%bDKQSGT(6Ezy=P|3HSF zh?Q>45Gx_n_O!L+1C_JvcLuBD5@9blrc#yrFmvLtEwxy91)^(m!vt<=KNFg~4X5g_ zKO9bjXGSoCB z=<1G}XXBB1IdN8IXMLrh`P*(ZxOKTVjmVlI^-{gihLPj}&Ouy|7)^8zp9Ne0>?hQQ zRTm50u`VkPtS$X^KA@x{NM3vl!E zMpU~$?aAUD^hroDt*gQa$=#14KhJ*1+C&x`W=XXC;G=C8wEKE&x?R{3 zdZCI%PaE;M3T!qfPexU>Ia$(iUY?+0bHXerUBpQ=xKvPnrc**oK?3W6v`JcE>U4BE z*9`qzNtB)#^*^#L4hu*?qa@PufzFx+A!)T z%ka(_g)@)S+2(tb+bYR8nNdD3+hefOj6aNRX0?3Dd*$mpo~LFC2Uaz5UG8mJSN#Wd zIiF+ORV<~Z+f$X8)!^Yf^^2qR#=iLt@Lvjb&I47`G-rl!&oM(pa~AD{s3evMizWg${OqNL#Qd}KQ=x}D>j1*3T z-zVPpbt)||R@ZfIh4h>CWBqgguZ6ys8E5c0`H$W(@h4aNNz;EA z@L^e@;rM@;bG7CC;gDD9va5g0qNLvR)LQ=XH!gg%+dNt0NYcPzZzFtQ>IeqbIDr}j zxT2Z{bNIdCB+OQ)?Ll(MxpU`YECUPA)d(_DNKyDg%OvdDG&<|C>X5MWx0|7cCr^S` zafClOt`CAsWD{ZPi@>H$$x_I4CWqkez}#mn%=g*%NK2K?p`>b_InHD~t$E>Wa zbWXf~PIut;(N)&31N1l4pVL=+>U#H@VD`eHa%@HYL^^=KL0Zz69M{WcO6EE#Xq+Hg^9)`e+cZAssuPsT-Yy9qi*}L_4{T-6mocdYA7#(x1 zvs84~p-v~Ayg5q+F3f6rai?~t+54n*nlJR~Wui`UmQ{jchlMM+I4Ee1F$o0&h+;0f zUNs>7eS)T7TP=cJ@yvhD!@zTN9J@-G1zI)bUgq@~SEt5~Y!nNW4)!@I@Zq6Y5PO;X zXQ%RJiaQ?BL;e|GG{_+C9&Q!E>(y-$+r&fyND7||d-nqfmHnN`sNbJ!%i0b*>Rjx) zTz5Zz=zCk4bTvQ+-}DjQu7|~<1$#2%yV{l9Vq2S87jf#soUcFgYEh$yI!awc3)`MH zUD+IAj;k!7m#xFv8f1CR>KglQt?HJGZFIBe`8RU|C5_h4FtOM}G=ZrCuq@+0$f%1h zg<-%vg2!Ul?)I(yPC6Iqasf}Bzhv*}jJ(mYZwlLmX2%kvC$5Su0P6c#ztN~9f{(wx znqN{(fkX~VF_RYQlT^B<#dv#;8VX8OE3h9*qe(e`_OoD%WXj# z!=OyCA!RA)z-RoKa<^NFbPvwTJephWkb!#rbUEvcw;)MT`BI6=Q@@aJrH}egV8Ay6 z0_+ij^1*W`M>19VZTDg_|Lq7sCtc^E6DG%$bDcxd{d66Sp-t(oKWw3U_fcFJYB%}7 z9giTU1+eD5X7zhW25OH=ZFqtfVy(2 z2fptz<1|^!95~yEG@m-g11;Q49=<4Rzr_#r!dW2R;(z=$0)Cp`y#o`KhtWD6-HX?^ zeyh$;g3tjqp`VV0N7?eDaIikuI8(t3QC@MmRVM48o|!HW{9)&V1zdPU4s{ugT@*4YQet8@^6(hJ4-X3IJNsLEW$TC`t89pijY8~Ot}t(wBc5v) zkPU(9!x8Om`OC@pyY$Ljkd35Z9n949OOGM=0FgBpZ#T4FH&L!-HDK#P}SYL?ZfcZ zWls9;XJ%nhz&x^);B)eEY=;jY-U=eZquSy~YjayJf0B3su0EGoAO{y)m7{OmI-TV` zJx6bakb#hlxn%&j4*CD<>%jMHYmLkWQ{>^X0*eZ;T~TJUYj?3ZHkV`d47Vm5AIfQ+5M{xV5SS~V087@~s`t7m6*$d!IUi+MK|MwssUn3tI zGz4WF%@h(0*-=-JD$iB=S?HQ*dkluAj*hfS_>*>kDyZ5ycP0}u0PcBNQ)#Or6E$KlRBbR3jN`ysc{FVJGiJ%QMr%wfAc(*9J5 zXR(p%eyNI|dr?8Rr80hAqsO*s(?hh2-;UeZ4B%JGMF&02zpLgGTJGr3ezUrZO7Dca z5%&JyDb<{v2<)yX! z)7fF)p*&7M^}gv1JspL1*faa5Iz#y-vbVH((VOur&3=o?J{WHw1@_L1O{}5~MA%-S zi_7^V^~bpm446aF-t6Sl8yA0ndoWh1UW%c|8p38q2U%Qcdx|n256I?V*a5y^TWC{N zlwl+J#W+8ZLHevX6IzmC3|^SL#pOI{HPq-ja88H;l()AZ!oC&W6RE4~7$KV`efz^0 za@Jm^(xxsW8d&jfdntzx#0j;@Y#Hv>-g0<3js~d+0a<%X57u+I`STdrgF-_ER=r|B zHpcpQ*2{>-+_!OD-Y|2C8os#>?;Uy(k@4D$IT+d!2HtT63yY}B%cz8e(?|y`t->Y@ ztM(m*{#)ffXpHcDA@1OT;z^V&u$KtUyv&YcBSR#FR|n*3)WHVXtfvEq{HWee$V&VB zt*~i-pdBN7r1brII3c~AmP)c#VXueUZPO3MAG6tgsPYcVzpuSdar|hJaD#aBRl(Y< zwxT;+SwY+IWpxmA=fgPbkice*`-pxg)4=~@5)8{HN^x3}JIJ(MAUwOs}e)$mtB5sn9bMPh! zhC63uvDBvVWKEr`h+*GOQKn+l?_sF*jXV`B+E`(go563^kZf*sKWrXPt=*iM;` z2=7Zpxo?3Y$VQzmiz64yvDKz&j-tOy$6P@KGbtm-KC#7%~KGhb1 zJ^zcD^2|>-Pw)0D3isvli#*$A)*XLV1TfBv^9~`3qpka!$J3Y(bmdA2B5-}e;C>oo z+Pm*tDJv=If3TgZW@L87(^DwQq#N!WzCZN^Zt~$eIv$VnvAiwl*QYn{?lo38tnoWK zp<_I28%eLy;0IK8tM!cl!%cg;I#jt@`Hc2pZp+Wllo;8;>NQI}aeM_EdT8BMfb7`y z9mttvPR%fzn43h`o;ujN;QW#6d`e>FGDv8la7Ow}|NrvE#y>X*=QE}44>rs{beqhV zAd?Sau7(J_VbtFR$SXy=+IgFwp+_~2X+v&=nQFh?hTOB-@!aC&{9F$E<3t}9!kKXzus(%%`YLL&{>4iej|19!b5V^3M+4{ zr@D#aIJ%8U?@Baj+!A_YPU!uE(!(jb&br3{+hi=EPwc{Ys#2nZ_ z4n$YTdt)MvKI2bw;n1a<&s#wbX|OltKo<^}S^1?y$q)#BYsO)hu(kmggAKVRugzE&=!vnHd*>z?75h!y_nt`@iK6P2mQVT0!7 zRmn_;w2gl@ZeZG2Cj0IzUY@DW%riUdBN^M?DuAwLe z>4x6dvt8#zO#F3vMNFj5)bDM#n&Y|^EMM|r*+)}%xV&vXMIRwv2KR1TOg#v(Wy>fp zI47<~*q?t(iCCC+EB;r#E*E?)yBRSJk|~ksA!h!{FJi>*dni3MQHZ)p<5$TZAj)>m zFFl^ky$PERf}w*joi1VTkK@ZKxla6;x0v;iBBaAmEFUzvHEtlW|1QhaZ`I5v9YlHC zmnW%5yCna*!LXjq8H7zY{W?pgkWPPJ-}O0v|7?p6-Gid~M%ERRgVoNN9=W8i`QtN9 zyqde;`B=3=D-MEd5@U7?f?-uM^!JFKR)(BnjHIex{{69jbR zQB1r%UAeW&7JM$e|7oj8!U0i4qlG5Rqb(M*=6HD#sIm$ZIN{{a$}U(dyW(pJbCu`AJ^Ie5E{CymI-u+@&mY4S+ z4M(ttKgx8MgeZO6yL%Vy<5N(;BPu0IP*~U&X+lw^sb&phP~Mgf!iFPi(|Jmic2h~3 zsO?JIajJd8ap}*V1Lw_=KiA??ikX}htBn{JS2OD1(#jl{9MMu57l{uIAaOuNKX!ed zUwr3oF&*3XgnCBM3-ZzD*0g?XKa?K}>hmTC#(iL`J1%+-lZYqR?-R2%lJYS(u`(&M zKIRIUy*z_ZW*1a_rIkHQV6mj1;-MKcuO~ zEGNw|Ze8eA+lXX{uu$uyovEuHm0TRrg_2OGTzUFjn7mYnY`X%uSEKR-n@y~epq(*AGh|- zD)+YgjXH7~bQGctM@nQULqcdcLW)8f3?)k2kdV31T*|B@q*GgHKxQG0gxX~eu~UZ7 zCboHe*S(GBJkR@ne*gXc@F~f?@B98v>sr^k)`h+ZGgxfq&FLb! zxwFOaH%}lb6j<04Ug;w-GEP$pM%p!W^Hd+8N)#y&I2N7%ZDDYF>lYN1;&Y7Ctkck2 zx6A-D8Wa|Q6`u19-sb}YRX%4+w9|z$NLE(X#ENx}q@9i5!J?_%hq<*J75{JRomg8S z82;;;BUy_u&y~`D?L|GNHIQ{HynMpupk2%HpN}WZLSDW!@YcWg5EkJD#CAVxB;*8| z{;pyXwuBn5y@U0uc^ga_w-|_3w_grHm5&x#RA~_=>%2Q>k>qYku4mNo#|(--lTj_=S3* zpgx4)@TI2gLH#i&YHu&fgAz>v;v_@kyq5X9gnX1q#Y~fNDJ$<5`uijNt!8_#&P7x_ z0?dDa(HC|}=C3@4pr3ff(@fiYe;=Y5EFo88#Hk)e)Q8=#4T`mH1|udG`L`gKr~Qse zH7ufpNgVILZq#>eLSP^IK;%JyMTTNism}+B4z2G14u`T`p2+*7TZ~qA<{}&B1&rCh zy}IyphV)Wlg>9-6WIV_|V!2@d8AbU$odrOH55jwlBFH&Oai@xhdxKmY1S-Gc(BlB7 zE)Di+`jHviHy;vhO(K<|TiPsIQtppWw57MMTd->B&0-eIwSOc1jq(p7$ecjCzmZ67 zf>Q_Z-1CG+_n%bO^h=&PxrsSQ5`}@r%*>tjdVu&RShSai)7Z2~8H?UrN_z)r)g!p8}g-9+d^!omH4XNd5rz3Q5&*Ae|d44Y_gB%E8>4L9^|Ed=> z?$Jb>`AJSpDY5Bs3ROZ}TnW)?+?m1zg?J6bO4eM9Wk7Fk8%;JO7SUki5;9@tQksyQ ztb^8hC}!8yrNUbodNOfUqEkht!+rTmMANT#CJ!Q~W~x#XNkwS&0Mp)&UqPAiUT)vx z{pNzQ?|mSiC1?n$f4)*nqy@jM?Ic}B7FxfiO{q3uhXus51uLB1!Vny@^n^R|cO)q5kvQfAf9F#T~0$8!-jSbnf?1oXKTZcKk)L^tqHZ!}E^8)$f z{Ede(c>yh`RO-z!#KNztZNM@*M$v;Nz)wP?Ph<|`pruG*c*F+Mh0Bw4n8JcM4&ptS z(uuyr=+r^!g2TE_c2SWzN>og6QUHr$nLEE;sHpW3#~&Phf*!uU96aERdZ-=4FrX4b zD4cu$Lu+W9sNSgw01_^0tu7&Ys^~s7;F9HEWr0D-!-xrX))p^d+)3fXpRyf{vny-L+o3OTq1EgU}VW zd4Hx=Ql!#;tbL0$45sDpgg(>)n}eJzh1u~?^!Q-3#M;Yg_B1n*+w!6xoqvAb!~YQo z3DK6MAF>-Xc=RI<2v|LVQSl+ieOHE^2`U)yg>2kJNlE+92Ixiqylm244xr{wQ#>j{vl=6SP^vMlb+395 z;Oo2Aev_1Ae(if45Rql8Eetc&RccyVb~6ZpnPZLmBIV=)Pio)&(!kV%&Kv1Uo%0|F z+IZDSIm*i6-TDs^@!gL`Z&Eze`kXX`gk{n*GxxKO0wmdYHVKGZt!YhZJ6Z0c+!Pr@ z<69sa;L%PJF=z783FZX61Fv82woKOYos3u4HB7+ULQy}1qoeIv{dSc$fVAx;>QeV! z&YR;-7(BR2KT3VkLJt*Iv8j}78QnTua%g<0ihy2TOA#+;H{CSeY3yfGFW4JN|8lH; zB*YLXNu?}2BBEXNU~8zHyqzY&@Oct_TbT@B5VgQd+CH`pE*_mkn;tYLKmiqaC9`tG zla#0KjAOB|=txCqKs_w%j$KxVaxml$=){TJf9#_A>jj(R4#y+Snqt`|=&=SOt`6xj zAVqN4cFOkX5ez>gqSJbqi-Us$IK4T$s{A*^rr;bzVn`KQ*}+Gf9vJYCqlk8AHvGXc z|C{+P$|vM>?`SzBpuaLKLsQjCCBqM^4;z@i_=m6^ZxJFrM>eeNrY4MXM6y4I%N4k1 z6JF-je#t}vmh!cp{@K#)QbUi7j8w3xLLoH#Co4 zXVeuzNvs`9)}f-#GnfVHbLydXadat{wbTLu49r2HuPBliNvqJ!R`nhmS)#XTy}G(L zw%d~aU^i6=GWf(xzO;rq-9aEKw@gcL;_%D1Sw>Km+t%d-8RnoZGm&P?R_q}RUD3Z%&g>yC9q6j!&!_2-CgkFtFE)$g)a zVK-bNHli^2OYWbmt+D~1TxCcXNX*kWcPY!&Jzxi!jr{(dUSoo?nZx|JY3&!WIl|m% zb^@j%b&8RbT$Yv%^N!8F59^HC^%pIfg$c?#n1|2FI}K*6L!0DSUrJ{xGJ(k=AL+etI|xraDA zK@$@(vR&CpYZ_`}OisR>YqzK!$4vK;qez`<9UxMVZZ^A=XMjy)#ff?f$f$MWtw(TCEaedX zwSdH%i(p3bkBnqjRo+;Idq}C}j`e5@L7KecoVjl=DSM+U41E+tshaMIa zOlWxV?$gp%KbaYlDRez`55}WsmxfI$C!ifd|&@PlV~y&nz1pGry2)9_MVt86;_nfpWv#o|$gUeooN7GqF{lWgJMGX2uQmLi#6yuL2i3qntl zt*FlQBm6(op5rLN{rm3S&3BGKf6`YRuLLIx!GFC`5Rz(WTp@I(Cun3NG$|o;RBO!8 zp8L4gVlxoYE5W=#H;Un=@)g8eAp{f`X7bqoHwC&@#fY#G@{)RvCDuTUnp;Ti^kdEm zJ_?J3!S!--Wj)K_R^FE+o>&(D z{C^dq2h1Gaa(91+MtyLE@loe~QqpdL=4*$UOK9Gbe@yM$qQ!{ov@;2q3t1uJI%d!D z{U7G?5X%xHyJad;aadJ+@DIz!j|p$0qHnWi)YdzaZ2mVOfFfbV&y1k#BsIS#+ zvv@kN+aBoHaE{b4nNgew_9p&~)JB@#371fgoc`Vb_Q~0GuJo<>tfXJ2*V9(-np)D2 zYlK$?fb+HJ{Bin##8AoazyBWDhbkaFrKZsBe*C>ZO1`I6nWbzWedj4}A0Rb!e|sA5 z9MWQ4=Gz)=dnCMA#W{GDj8=T1tg=-YQvQiREQk?mFzryxhHlZlgv;~0r!>ZDjfo3% zOV1+-#~*pDK;9}fRIzW1uuGe$)7*Gao8CZtr2{=>dPuatkyz^oKXbTtqtG4#ZbzVv zV@V4_^6@BAuL<5jDqANn*WyOsohB$T%5W;)lQ&Bl9k-*M$!x>W`@FT1tS{ zZ@0+8Y+XjXobUSuss}$Ku;2EBTWl9lw9b7nv>4zAW&dSEklhy;yr2q)4f2DdXwew7 z)5zJf#;Md8Y4jdcRTeCu78k?z`dwjR(4hzgn{>3c@I)Asg)|>TF@+99f9S^tzI&u1 zg96;6VD}Uyt77AYx4@eyVZ6x{3iGfK_B&o!q3-ne$!w922Bg>fS`Q9Ys8`h zJpbb-F`ukCo6nI*r^B|UttL&O4E)OE53bB5mZrF&4eQ-0w0ZcP;qOoSm>VhO(-SuH z7qgDHTf#TC+HacUw1xEM++Ckc%I+r|K2s=XXJGJUvjX#G31Sz=bjFZQD8QKXt_ddB zvWdwxp&=uBCGl-)O#Zx&WAl@*uXoMhFg6m&IbiClOgWm5<^4*CoQN&?z36hJZM@k# zP_T2#m4!r9^6e^8E#xZfrA@HND8CXdY5ow=`Dj&li0KsGa%~3S(%R<1+(ej#fRqP`?@7XEpu6?P7pWCWw*h>Sw1`f*%)gOH-pp&j ziVOo70AfZSpEAAo!uUn|dM zt}}m#&bb1!kPVo16Cw)E@~aK^-}#4P@$pJTK^$xZ{&Qgr^(^dD;=i zLb(!Z>|kqN`!JVXwxF%gh&~5xaz%FIRI#hSy1d!0y|M@-?CVikpQS;LYyG8cjnjzB z*400Znz*cDURH&Q!?x#L3X+rrLlfd!_h@Y47S3MR)L3$eJC>+F|IO5Jvm51`uf_aY zo>9SfD;_b7dpN%0iSO!n2`=rt$NFj|_r4XzpVNO37muRd(<8|QuVTI7+ke-MmwT~b zeCD^$uhKR0hbFTe9FJSsn+xu2{HeBScr#{Qj@D88+ zZ@x`}hMnwCy4ZgixOGi>sI?|7+T-%vbmk3TIr{dZcS!cx41;t{L3i1e_s=>N9RHkD z0_)y(0iF@G>WbJNFs2c)VUQpp2OABn-n+e0S#4`fxt5dl44vuTKh=_1r=M3XE4SQ3 zitZ2>Ze6Go_cw&=%Jy+*f;S6vA_wIgeL?gnE4BFW7*O%;qH*|N`?2J~cRgpD} z@Cf>V5xgbgBv~~7da_2%+SD?cQVvbpy-x1QVbSUr_B@#VU;wlbT9R*|Hx<(a*L@wS ze8S+DfA{mt;2Wq3YO0Tpjqo};8TYk0S2hcctr7P=Cn>qfbSP@uuG^=|o)$oae6Qm3 z)A6oqt3&a_9vRG85M=a4EZSB^VhE75@~Rlmrty*X2TtGf6UB5#(Cg{Ra(GO|>g5Fo zLoxU`h+HOkGp#Jgy#o%89*hqLj*hpBxFQtV$KP%gE-JdAuAFY?`DKr$z|nxPCil18 z_m9RGN%z;Qlx2y1R%G|gNvZSfgdA7*BJ!VPte6h|j1Wg0+0V zjQYUgVn`I1ABdq!YiNY+7=O68T~Wx4k?f{6o@1MTT?~@IO#JjB;0+s;OC~yza&ZN{kNe)X<03GN0r{qPC}1 zA^TC7`R*7N;dS|f#%HE3)i+>@akYIQt#_EKb*}QLbwiwsjOYBm7hy;W|5jB1YqU)4u`JT|X- zUN6Pm6)4>OA<>bRGVCeZqK?nYMmn;ET3RyX><+9%drsO0A+uAZX1PObvFiCOea#26 z5_6J^+~4tex5ZyXe{t6`uc20rHivTEDv~Ez)5Ezf=1P+bD0c5n!#~HU%Q##Bc$4M* zvA(h#vKIZY4br_|V}q^VlhG~`F)=GbYzFd|ci!%cRJumz)nA(@6J&O`ERo0Gy5Bdo z!Y>RR1}FA0jc4rD#<@Z(oXhuQWl728jXcD}c;$Yo;T11teN&P-ub`_5yVZKFZDa3S zuDg$PDU~{vYMV9&obMKsE32kx`#UvyT+Xw5($QYW+=c%-=pZ{D71LlF9=ay5FuaL>OaodH$Ibae+OKcO`sM=TR-_usE^G7j# z>!Q+U&UfN_;Q1`IW@B}a)zPEXGDT?`%6=XdrmwBpZFOI1Y%uQeJWNqqT@dDDQzLXb z>8)Dy!ND_Edsw5q(oPy?hcWKIZjEP?DYKp0GEZ?PXRI;6P{g|a_|yfpoN?-p8(7Sd zLG`AVxvE`na?12NoqH=RcIkoIteDeUSCuxgpQe5Tx>YWqsHW3rwTPJu!R@e0;j(cRuOJ{z)S9>DD zS{eN*LvO6Ds(#)0F`rXy;1*W&!ro`q#D&DZPmP{R^R3lJ$zS+ePm7o?rg7R7-w8VbW1DgK1?0Am) z7DvD9%yqpqVy=7hLi^f=zI6v4ajN!Yj$oH~o0KUbZiRaeo0i--K+@()x(w7!yC)v}Sr1M53Vp~T06_Mf@bj{1& z<`_{vJlx?)Ignz(D}8$X5IL^u10ms6;p45g1t;}v&wuJ-<=+HfJnvbX4r!3pD_ z6MKoZzu?_KeZMyc_0)+k1HG9JA&orIQBh~=-Oo4adA7~$L1ImI?*ixZZx|V)bs&?&{*Ozm773}Xsz-McyHMg0HPhV3?{;X+4=z;s%MLaW@ z!@o1VJu&)ADmeua7|pqAbRoaxZEDTXnfTbJ{d?zMzF_YzJ$R-^O=n|lw3FHfPnz|i z2d-1VF4S}P@rjce_)Oo%ILoolp}_f9UsVjT$K6!w!*q?zTPX1U=At~Ai1Qw^z|qq5 ziK!rwkh!!*ZQyXbLe=#M`PS8)+nmW0CjrQfGqf`Sr$@Td`)M@MeXTV%Vr~VZWStON z*bB2`lkicb?)BTdOw!6pp?M-U{L|1-zs^r8I?O|<>!japG9|cs0 zc&W4{oQMC9>-_&jle2(xxxKe%glpv`_uAwbS>~x#^n}2&74-zX_I%_r0fRx=Sd9*S zsLxtnLywPbmNCiv^uMC@hdDXl`f5Ax$Ts!SMmy4f+2@Uq(n0A=MGpi%FD7vG<&6ES w3A{@pk;V|dkw`Cu5K}^_0tN?vc#n9Osy%9B599m`-;uO6bpJ}&didP`0K=Y0tN;K2 literal 0 HcmV?d00001 diff --git a/docs/diagrams/groceryManagement.puml b/docs/diagrams/groceryManagement.puml new file mode 100644 index 0000000000..ca17198cf2 --- /dev/null +++ b/docs/diagrams/groceryManagement.puml @@ -0,0 +1,39 @@ +@startuml + +participant ":Parser" as p +participant "command:GroceryCommand" as g +participant "groceryList:GroceryList" as gl + + -> p : groceryManagement(commandParts) +create g +p -> g : valueOf(commandParts[0].toUpperCase()) +g --> p : command + +p -> g : ordinal() +g --> p : index +p -> g: DEL.ordinal() +g --> p : indexOfDel +p -> g: STORE.ordinal() +g --> p : indexOfStore +p -> g: LISTLOC.ordinal() +g --> p : indexOfListloc +p -> g: FIND.ordinal() +g --> p : indexOfFind +alt index <= indexOfDel + p -> p : addOrDelGrocery(command, commandParts) + ref over p : caloriesManagement +else index <= indexOfStore + p -> p : editGrocery(command, commandParts) + ref over p : editGrocery +else index <= indexOfListloc + p -> p : handleLocationCommands(command, commandParts[1]) + ref over p : handleLocationCommands +else index == indexOfFind + p -> gl : findGroceries(commandParts[1]) + ref over p, gl : findGroceries +else else + p -> p : viewListOrHelp(command) + ref over p : viewListOrHelp +end + +@enduml \ No newline at end of file diff --git a/docs/diagrams/profileManagement.puml b/docs/diagrams/profileManagement.puml index c8d4e4cfef..4473872f96 100644 --- a/docs/diagrams/profileManagement.puml +++ b/docs/diagrams/profileManagement.puml @@ -1,15 +1,15 @@ @startuml participant ":Parser" as p -participant "command:ProfileCommand" as cal +participant "command:ProfileCommand" as prof participant "ui:Ui" as ui participant "userInfo:UserInfo" as info participant ":System.out" as sys -> p : profileManagement(commandParts) -create cal -p -> cal : valueOf(commandParts[0].toUpperCase()) -cal --> p : command +create prof +p -> prof : valueOf(commandParts[0].toUpperCase()) +prof --> p : command alt command == UPDATE p -> ui : promptForName() From 59dd34c8fa476210b8a1d87eefceab350f353e3d Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 12:50:13 +0800 Subject: [PATCH 209/339] Add save and load file function for grocery mode --- data/groceryList.txt | 2 +- src/main/java/git/Git.java | 5 ++++- src/main/java/git/Parser.java | 6 ++---- src/main/java/git/Storage.java | 1 - src/main/java/grocery/Grocery.java | 2 +- src/main/java/grocery/GroceryList.java | 10 +++++++++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index 9c0e5cd3a4..17159ef6be 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1 +1 @@ -milk | 400 | 300 | 2024-09-20 | bev | 6.00 | firdge +tomato | null | null | 2024-04-23 | fruit | 5.00 | house diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 775a9e6862..8035b03600 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,6 +1,10 @@ package git; import exceptions.GitException; +import grocery.Grocery; +import grocery.GroceryList; + +import java.util.ArrayList; /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! @@ -11,7 +15,6 @@ public class Git { private boolean isRunning; private Parser parser; - // METHODS /** * Constructs Git. diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 010f389277..3730355e5c 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -45,12 +45,12 @@ public class Parser { * @param ui Ui object. */ public Parser(Ui ui) { - groceryList = new GroceryList(); + this.storage = new Storage(); + groceryList = storage.loadFile(); foodList = new FoodList(); userInfo = new UserInfo(); recipeList = new RecipeList(); this.ui = ui; - this.storage = new Storage(); isRunning = true; } @@ -87,7 +87,6 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi switch (mode) { case GROCERY: groceryManagement(commandParts); - GroceryList x = this.storage.loadFile(); break; case CALORIES: @@ -336,7 +335,6 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro Grocery grocery = new Grocery(commandParts[1]); ui.promptAddMenu(grocery); groceryList.addGrocery(grocery); - storage.saveFile(groceryList.getGroceries()); break; case DEL: diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index d256af72d0..cf6df8fa95 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -39,7 +39,6 @@ public GroceryList loadFile(){ Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String line = scanner.nextLine(); - // -------------------------------- Grocery grocery = parseGrocery(line); System.out.println(grocery); groceryList.addGrocery(grocery); diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 9b59e3d4fc..582a564773 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -269,7 +269,7 @@ public String printGrocery() { remarkString = ", remark not set"; } - return this.name + "( " + this.category + ") " + amountString + unitString + exp + price + + return this.name + " (" + this.category + ") " + amountString + unitString + exp + price + locationString + remarkString; } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 63ba5bc213..09ed5b097f 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -39,7 +39,6 @@ public class GroceryList { */ public GroceryList() { groceries = new ArrayList<>(); - //storage.loadFile(); LoggerGroceryList.setupLogger(); logger = Logger.getLogger(GroceryList.class.getName()); } @@ -54,6 +53,7 @@ public void addGrocery(Grocery grocery) { try { groceries.add(grocery); Ui.printGroceryAdded(grocery); + storage.saveFile(getGroceries()); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add grocery: the grocery is null."); @@ -174,6 +174,7 @@ public void editExpiration(String details) throws GitException { // Verification and UI feedback Ui.printExpSet(grocery); + storage.saveFile(getGroceries()); } /** @@ -189,6 +190,7 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); Ui.printCategorySet(grocery); + storage.saveFile(getGroceries()); } /** @@ -240,6 +242,7 @@ public void editAmount(String details, boolean use) throws GitException { } grocery.setAmount(amount); + storage.saveFile(getGroceries()); if (amount == 0) { Ui.printAmtDepleted(grocery); } else if (grocery.isLow()){ @@ -268,6 +271,7 @@ public void editCost(String details) throws GitException { } grocery.setCost(cost); Ui.printCostSet(grocery); + storage.saveFile(getGroceries()); } catch (NumberFormatException e) { throw new InvalidCostException(); } @@ -287,6 +291,7 @@ public void editThreshold(String details) throws GitException { grocery.setThreshold(threshold); Ui.printThresholdSet(grocery); + storage.saveFile(getGroceries()); } /** @@ -311,6 +316,7 @@ public void editLocation(String details) throws GitException { grocery.setLocation(location); location.addGrocery(grocery); Ui.printLocationSet(grocery); + storage.saveFile(getGroceries()); } /** @@ -343,6 +349,7 @@ public void editRatingAndReview(String details) throws GitException { } Grocery grocery = getGrocery(details); Ui.promptForRatingAndReview(grocery); + storage.saveFile(getGroceries()); } /** @@ -459,5 +466,6 @@ public void removeGrocery(String name) throws GitException { } Ui.printGroceryRemoved(grocery, groceries); + storage.saveFile(getGroceries()); } } From a1b3de528022d2d69c91513b17406ab374356df4 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 14:30:56 +0800 Subject: [PATCH 210/339] gradle checks --- data/groceryList.txt | 1 + src/main/java/git/Git.java | 5 ----- src/main/java/git/Parser.java | 1 - src/main/java/git/Storage.java | 5 ----- src/main/java/grocery/Grocery.java | 2 +- src/main/java/grocery/GroceryList.java | 5 ++--- 6 files changed, 4 insertions(+), 15 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index 17159ef6be..909b7a03d2 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1 +1,2 @@ tomato | null | null | 2024-04-23 | fruit | 5.00 | house +milk | null | null | null | beverage | null | null diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index f85bb14231..5385bcf538 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,11 +1,6 @@ package git; import exceptions.GitException; -import grocery.Grocery; -import grocery.GroceryList; - -import java.util.ArrayList; - /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! */ diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 3292efccb4..7ac570468e 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.List; /** * Deals with commands entered by user. diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index cf6df8fa95..3561fbaaac 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -1,7 +1,5 @@ package git; -import exceptions.PastExpirationDateException; -import exceptions.nosuch.NoSuchObjectException; import grocery.Grocery; import grocery.GroceryList; @@ -10,13 +8,10 @@ import java.io.FileWriter; import java.io.IOException; import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; import java.util.Scanner; import grocery.location.Location; -import grocery.location.LocationList; -import java.time.LocalDate; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 582a564773..f39d9c95f4 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -269,7 +269,7 @@ public String printGrocery() { remarkString = ", remark not set"; } - return this.name + " (" + this.category + ") " + amountString + unitString + exp + price + + return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + locationString + remarkString; } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index fa8dc2f657..ab2de51e59 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -464,8 +464,7 @@ public void removeGrocery(String name) throws GitException { if (location != null) { location.removeGrocery(grocery); } - - GroceryUi.printGroceryRemoved(grocery, groceries); - storage.saveFile(getGroceries()); + GroceryUi.printGroceryRemoved(grocery, groceries); + storage.saveFile(getGroceries()); } } From 7db26964460c4e4593a08ec24c94cdecf56d2f66 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 14:34:51 +0800 Subject: [PATCH 211/339] gradle check: static final change to final static --- src/main/java/git/Storage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 3561fbaaac..565f2481eb 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -22,7 +22,7 @@ public class Storage { private Grocery grocery; private List groceries; private GroceryList groceryList; - private static final String FILE_PATH = "./data/groceryList.txt"; + private final static String FILE_PATH = "./data/groceryList.txt"; /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. From 6c89239f2e9de2fe224df174677d1c2d7809727a Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 14:42:48 +0800 Subject: [PATCH 212/339] gradle check: move FILE_PATH in front --- src/main/java/git/Storage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 565f2481eb..173826e688 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -19,10 +19,10 @@ * Handles loading from and saving tasks to a file. */ public class Storage { + private final static String FILE_PATH = "./data/groceryList.txt"; private Grocery grocery; private List groceries; private GroceryList groceryList; - private final static String FILE_PATH = "./data/groceryList.txt"; /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. From a93c1ead73d4ad09990458800735ee070b86a043 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 14:50:39 +0800 Subject: [PATCH 213/339] gradle: change FILE_PATH to the path --- src/main/java/git/Storage.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 173826e688..ab8ba43656 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -19,7 +19,7 @@ * Handles loading from and saving tasks to a file. */ public class Storage { - private final static String FILE_PATH = "./data/groceryList.txt"; + //private final static String FILE_PATH = "./data/groceryList.txt"; private Grocery grocery; private List groceries; private GroceryList groceryList; @@ -30,7 +30,7 @@ public class Storage { public GroceryList loadFile(){ GroceryList groceryList = new GroceryList(); try { - File file = new File(FILE_PATH); + File file = new File("./data/groceryList.txt"); Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String line = scanner.nextLine(); @@ -75,7 +75,7 @@ public static void saveFile(List groceries) { if (!directory.exists()) { directory.mkdirs(); } - FileWriter writer = new FileWriter(FILE_PATH); + FileWriter writer = new FileWriter("./data/groceryList.txt"); for (Grocery grocery : groceries) { writer.write(grocery.toSaveFormat() + "\n"); } From 07806ed4fa0f063a312b2c5dcb67d69ae383ade8 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 16:00:03 +0800 Subject: [PATCH 214/339] gradle: changed expected.txt and removed print no saved groceries --- data/groceryList.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 data/groceryList.txt diff --git a/data/groceryList.txt b/data/groceryList.txt deleted file mode 100644 index 909b7a03d2..0000000000 --- a/data/groceryList.txt +++ /dev/null @@ -1,2 +0,0 @@ -tomato | null | null | 2024-04-23 | fruit | 5.00 | house -milk | null | null | null | beverage | null | null From 5a769006377cd6d8c892f016dc8dbe08d9a7a682 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 16:03:00 +0800 Subject: [PATCH 215/339] gradle: changed expected.txt and removed print no saved groceries --- src/main/java/git/Storage.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index ab8ba43656..7d052a81eb 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -39,8 +39,9 @@ public GroceryList loadFile(){ groceryList.addGrocery(grocery); } scanner.close(); - } catch (FileNotFoundException e) { - System.out.println("No saved groceries found.\n "); + } + catch (FileNotFoundException e) { + //System.out.println("No saved groceries found.\n "); } return groceryList; } From 173cc6d8c53c8a51dff285cb20f6c6851acfba13 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 11 Apr 2024 19:08:56 +0800 Subject: [PATCH 216/339] Add ADDMULTI command to GroceryCommand enum and implement promptAddMultipleMenu() method in GroceryUi class --- data/groceryList.txt | 0 .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/GroceryUi.java | 46 +++++++++++++++++++ src/main/java/git/Parser.java | 7 +++ src/main/java/git/Ui.java | 1 + 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 data/groceryList.txt diff --git a/data/groceryList.txt b/data/groceryList.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index a24b5ce0cd..b71d9f5a2b 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -1,7 +1,7 @@ package enumerations; public enum GroceryCommand { - ADD, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, DELLOC, + ADD, ADDMULTI, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, DELLOC, LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, REMARK, EXIT } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 20e4aa945e..d7d0c815f7 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -6,6 +6,7 @@ import exceptions.nosuch.NoSuchObjectException; import food.Food; import grocery.Grocery; +import grocery.GroceryList; import grocery.location.Location; import grocery.location.LocationList; @@ -71,6 +72,51 @@ public void promptAddMenu(Grocery grocery) { processAddMenu(grocery, addNums.toString()); } + /** + * Prompts user for grocery name. + * + * @return the name of the grocery. + */ + public Grocery[] promptAddMultipleMenu() { + System.out.println("\nHow many groceries would you like to add?"); + int num = 0; + while (true) { + try { + num = Integer.parseInt(in.nextLine().trim()); + if (num <= 0) { + System.out.println("\nPlease enter a positive number."); + } else { + break; // Break loop if input is a positive integer + } + } catch (NumberFormatException e) { + System.out.println("\nInvalid input. Please enter a number."); + } + } + Grocery[] groceries = new Grocery[num]; + + for (int i = 0; i < num; i++) { + System.out.println("\nAdding item " + (i + 1) + " of " + num); + System.out.println("\nPlease enter the name of the grocery:"); + Grocery grocery = new Grocery(in.nextLine().trim()); + + while (true) { + System.out.println("\nDo you want to include additional details for " + grocery.getName() + "? (Y/N)"); + String choice = in.nextLine().trim().toUpperCase(); + if (choice.equals("Y")) { + promptAddMenu(grocery); + break; // Exit the loop after handling + } else if (choice.equals("N")) { + System.out.println("\nNo additional details will be added for " + grocery.getName()); + break; // Exit the loop, proceed with next item + } else { + System.out.println("\nInvalid input. Please enter 'Y' for yes or 'N' for no."); + } + } + groceries[i] = grocery; + } + return groceries; + } + /** * Prints output when a location is added to LocationList. * diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7ac570468e..255e5a9318 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -344,6 +344,13 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro groceryList.addGrocery(grocery); break; + case ADDMULTI: + Grocery[] groceries = groceryUi.promptAddMultipleMenu(); + for (Grocery g : groceries) { + groceryList.addGrocery(g); + } + break; + case DEL: groceryList.removeGrocery(commandParts[1]); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index ec3253b580..311a457a3c 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -156,6 +156,7 @@ public static void displayHelpForGrocery() { System.out.println( "Here are some ways you can manage your groceries!\n" + "add GROCERY: adds the item GROCERY.\n" + + "addmulti: adds multiple items GROCERIES.\n" + "find KEYWORD: finds all groceries containing the KEYWORD.\n" + "loc LOCATION: adds a LOCATION to track.\n" + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + From 31d27a892dd3f2b4b9a4e6f432f9ccda2c5543a2 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 11 Apr 2024 19:17:41 +0800 Subject: [PATCH 217/339] Refactor GroceryList sortByExpiration method to handle groceries without expiration dates --- src/main/java/git/GroceryUi.java | 1 - src/main/java/grocery/GroceryList.java | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index d7d0c815f7..a0317b9855 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -6,7 +6,6 @@ import exceptions.nosuch.NoSuchObjectException; import food.Food; import grocery.Grocery; -import grocery.GroceryList; import grocery.location.Location; import grocery.location.LocationList; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ab2de51e59..f2d5735651 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -378,14 +378,21 @@ public void listLowStocks() { } /** - * Sorts the groceries by expiration date. + * Sorts the groceries by expiration date. Groceries without an expiration date are sorted to the end. */ public void sortByExpiration() { int size = groceries.size(); if (size == 0) { GroceryUi.printNoGrocery(); } else { - Collections.sort(groceries, (g1, g2) -> g1.getExpiration().compareTo(g2.getExpiration())); + Collections.sort(groceries, (g1, g2) -> { + LocalDate exp1 = g1.getExpiration(); + LocalDate exp2 = g2.getExpiration(); + if (exp1 == null && exp2 == null) return 0; // Both are null, considered equal + if (exp1 == null) return 1; // Null exp1 should be sorted to the end + if (exp2 == null) return -1; // Null exp2 should be sorted to the end + return exp1.compareTo(exp2); + }); GroceryUi.printGroceryList(groceries); } } From 68c94ca678ea243b9e487e2344d13162b4c3541c Mon Sep 17 00:00:00 2001 From: lsiyi Date: Thu, 11 Apr 2024 19:25:05 +0800 Subject: [PATCH 218/339] Refactor GroceryList sortByExpiration method to handle groceries without expiration dates and improve code readability --- src/main/java/grocery/GroceryList.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index f2d5735651..6c24b49d6b 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -388,9 +388,18 @@ public void sortByExpiration() { Collections.sort(groceries, (g1, g2) -> { LocalDate exp1 = g1.getExpiration(); LocalDate exp2 = g2.getExpiration(); - if (exp1 == null && exp2 == null) return 0; // Both are null, considered equal - if (exp1 == null) return 1; // Null exp1 should be sorted to the end - if (exp2 == null) return -1; // Null exp2 should be sorted to the end + if (exp1 == null && exp2 == null) { + // If both groceries have no expiration date, they are equal + return 0; + } + if (exp1 == null) { + // If only the first grocery has no expiration date, it is greater + return 1; + } + if (exp2 == null) { + // If only the second grocery has no expiration date, it is greater + return -1; + } return exp1.compareTo(exp2); }); GroceryUi.printGroceryList(groceries); From b62341a23c034740c77a9137e5be872bb4dfe6a5 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 20:42:42 +0800 Subject: [PATCH 219/339] Include grocerymanagement sequence diagram in developer guide --- docs/DeveloperGuide.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 141271aa1e..d5f52d97f3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -29,6 +29,10 @@ * if `update`, store the user data required for calories calculation. * if `view`, display user information +### 4. Grocery Management Mode +![Commands for managing grocery](./diagrams/groceryManagement.png) +* different methods in Parser will be self invoked based on the index of the command in enum class GroceryCommand. + ### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. From 79a368b7d3cc3eb1d8932fb76de0d2bc9686f5c6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 20:53:25 +0800 Subject: [PATCH 220/339] Update code such that only "exit" will terminate program --- src/main/java/git/Parser.java | 44 +++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 255e5a9318..607b773029 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -117,8 +117,12 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi break; case EXIT: - System.out.println("bye bye!"); - isRunning = false; + if (commandParts[1].isEmpty()) { + System.out.println("bye bye!"); + isRunning = false; + } else { + throw new InvalidCommandException(); + } break; default: @@ -166,8 +170,12 @@ public void caloriesManagement(String[] commandParts) throws GitException { break; case EXIT: - System.out.println("Bye bye!"); - isRunning = false; + if (commandParts[1].isEmpty()) { + System.out.println("bye bye!"); + isRunning = false; + } else { + throw new InvalidCommandException(); + } break; default: @@ -221,8 +229,12 @@ public void profileManagement(String[] commandParts) throws GitException { break; case EXIT: - System.out.println("bye bye!"); - isRunning = false; + if (commandParts[1].isEmpty()) { + System.out.println("bye bye!"); + isRunning = false; + } else { + throw new InvalidCommandException(); + } break; default: @@ -277,8 +289,12 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn break; case EXIT: - System.out.println("bye bye!"); - isRunning = false; + if (commandParts[1].isEmpty()) { + System.out.println("bye bye!"); + isRunning = false; + } else { + throw new InvalidCommandException(); + } break; case HELP: @@ -316,7 +332,7 @@ public void groceryManagement(String[] commandParts) throws GitException { } else if (index == GroceryCommand.FIND.ordinal()) { groceryList.findGroceries(commandParts[1]); } else { - viewListOrHelp(command); + viewListOrHelp(command, commandParts); } } @@ -438,7 +454,7 @@ private void handleLocationCommands(GroceryCommand command, String name) throws * @param command Command keyword of data type Enum. * @throws GitException Exception thrown depending on specific error. */ - private void viewListOrHelp(GroceryCommand command) throws GitException { + private void viewListOrHelp(GroceryCommand command, String[] commandParts) throws GitException { switch (command) { case LIST: groceryList.listGroceries(); @@ -473,8 +489,12 @@ private void viewListOrHelp(GroceryCommand command) throws GitException { break; case EXIT: - System.out.println("bye bye!"); - isRunning = false; + if (commandParts[1].isEmpty()) { + System.out.println("bye bye!"); + isRunning = false; + } else { + throw new InvalidCommandException(); + } break; default: From d501db7d1d1bad98ffb3802d285a4ffbfdd74947 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 20:53:45 +0800 Subject: [PATCH 221/339] Update code to print nothing when no food was consumed --- src/main/java/food/FoodList.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index 4d6a737d7b..40a3987d9c 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -41,10 +41,13 @@ public void addFood(Food food) throws EmptyInputException { * Prints the list of food in the list. */ public void printFoods() { - assert !foods.isEmpty() : "food list should not be empty"; - System.out.println("Here are the food you have consumed today:"); - for (Food food: foods) { - System.out.println(" - " + food.print()); + if (foods.isEmpty()) { + System.out.println("You have not consumed any food today"); + } else { + System.out.println("Here are the food you have consumed today:"); + for (Food food : foods) { + System.out.println(" - " + food.print()); + } } } } From 0be47bee77b6f1abe01c069e73070cf298b4514e Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 21:33:06 +0800 Subject: [PATCH 222/339] Add sequence diagrams --- docs/DeveloperGuide.md | 11 ++++++++ docs/diagrams/addOrDelGrocery.png | Bin 0 -> 49916 bytes docs/diagrams/addOrDelGrocery.puml | 39 ++++++++++++++++++++++++++ docs/diagrams/caloriesManagement.png | Bin 49874 -> 52280 bytes docs/diagrams/caloriesManagement.puml | 3 +- docs/diagrams/editGrocery.png | Bin 0 -> 37399 bytes docs/diagrams/editGrocery.puml | 28 ++++++++++++++++++ docs/diagrams/profileManagement.png | Bin 63445 -> 66982 bytes docs/diagrams/profileManagement.puml | 31 ++++++++++---------- docs/diagrams/viewListOrHelp.png | Bin 0 -> 48914 bytes docs/diagrams/viewListOrHelp.puml | 37 ++++++++++++++++++++++++ 11 files changed, 133 insertions(+), 16 deletions(-) create mode 100644 docs/diagrams/addOrDelGrocery.png create mode 100644 docs/diagrams/addOrDelGrocery.puml create mode 100644 docs/diagrams/editGrocery.png create mode 100644 docs/diagrams/editGrocery.puml create mode 100644 docs/diagrams/viewListOrHelp.png create mode 100644 docs/diagrams/viewListOrHelp.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d5f52d97f3..5ee647e452 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -33,6 +33,17 @@ ![Commands for managing grocery](./diagrams/groceryManagement.png) * different methods in Parser will be self invoked based on the index of the command in enum class GroceryCommand. +#### 4.1 addOrDelGrocery +![addOrDelGrocery](./diagrams/addOrDelGrocery.png) +To add a new grocery or delete an existing grocery. + +#### 4.2 editGrocery +![editDelGrocery](./diagrams/editGrocery.png) +To edit the information of an existing grocery. + +#### 4.3 viewListOrHelp +![viewListOrHelp](./diagrams/viewListOrHelp.png) + ### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. diff --git a/docs/diagrams/addOrDelGrocery.png b/docs/diagrams/addOrDelGrocery.png new file mode 100644 index 0000000000000000000000000000000000000000..da972440026f6c89f8c14808f1d0c455e305d117 GIT binary patch literal 49916 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 p : addOrDelGrocery(command, commandParts) + + alt command == ADD + opt name == null + p -> sys : println(GitException.getMessage()) + end + p -> gl : isGroceryExists(name) + gl --> p : isExist + opt isExist == true + p -> sys : println(GitException.getMessage()) + end + create g + p -> g : Grocery(commandParts[1]) + g --> p : grocery + p -> ui : promptAddMenu(grocery) + p -> gl : addGrocery(grocery) + else command == ADDMULTI + p -> ui : promptAddMultipleMenu() + ui --> p : groceries + loop all grocery g in groceries + p -> gl : addGrocery(g) + end + + else command == DEL + p -> gl : removeGrocery(commandParts[1]) + + else else + p -> sys : println(GitException.getMessage()) + end + +@enduml \ No newline at end of file diff --git a/docs/diagrams/caloriesManagement.png b/docs/diagrams/caloriesManagement.png index e4f908483a3aec35675e1300b819d495f1486d77..00c510e2f98b33065ba4f168804e4fbd82f5a1ee 100644 GIT binary patch literal 52280 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 z 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 literal 49874 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 CK&M;) diff --git a/docs/diagrams/caloriesManagement.puml b/docs/diagrams/caloriesManagement.puml index 9580c25e75..fafcc7912a 100644 --- a/docs/diagrams/caloriesManagement.puml +++ b/docs/diagrams/caloriesManagement.puml @@ -2,6 +2,7 @@ participant ":Parser" as p participant "command:CalCommand" as cal +participant "caloriesUi:CaloriesUi" as cui participant "ui:Ui" as ui participant "food:Food" as f participant "userInfo:UserInfo" as info @@ -14,7 +15,7 @@ p -> cal : valueOf(commandParts[0].toUpperCase()) cal --> p : command alt command == EAT - p -> ui : promptForCalories() + p -> cui : promptForCalories() ui --> p : calories create f p -> f : Food(commandParts[1],calories) diff --git a/docs/diagrams/editGrocery.png b/docs/diagrams/editGrocery.png new file mode 100644 index 0000000000000000000000000000000000000000..69d7301cc4676b6757057dc90968595814ce2701 GIT binary patch literal 37399 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 ihCf5g|Ht3e^GhZs{h1d3T{} p : addOrDelGrocery(command, commandParts) + + alt command == EXP + p -> gl : editExpiration(commandParts[1]) + else command == CAT + p -> gl : editCategory(commandParts[1]) + else command == AMT or command == USE + p -> gl : editAmount(commandParts[1], commandParts[0].equals("use")) + + else command == TH + p -> gl : editThreshold(commandParts[1]) + else command == COST + p -> gl : editCost(commandParts[1]) + else command == RATE + p -> gl : editRatingAndReview(commandParts[1]) + else command == STORE + p -> gl : editLocation(commandParts[1]) + else else + p -> sys : println(GitException.getMessage()) + end + +@enduml \ No newline at end of file diff --git a/docs/diagrams/profileManagement.png b/docs/diagrams/profileManagement.png index 3c0003b1db34727067d7c95a3e426f9459df766b..56a54c6ad938d8b162760731aae9cc7cb942f9e0 100644 GIT binary patch literal 66982 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�bry- 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 p : profileManagement(commandParts) @@ -12,20 +13,20 @@ p -> prof : valueOf(commandParts[0].toUpperCase()) prof --> p : command alt command == UPDATE - p -> ui : promptForName() - ui --> p : name - p -> ui : promptForWeight() - ui --> p : Weight - p -> ui : promptForHeight() - ui --> p : Height - p -> ui : promptForAge() - ui --> p : Age - p -> ui : promptForGender() - ui --> p : Gender - p -> ui : promptForActiveness() - ui --> p : Activeness - p -> ui : promptForAim() - ui --> p : Aim + p -> pui : promptForName() + pui --> p : name + p -> pui : promptForWeight() + pui --> p : Weight + p -> pui : promptForHeight() + pui --> p : Height + p -> pui : promptForAge() + pui --> p : Age + p -> pui : promptForGender() + pui --> p : Gender + p -> pui : promptForActiveness() + pui --> p : Activeness + p -> pui : promptForAim() + pui --> p : Aim p -> info : updateInfo(name, weight,height,age,gender,activeness,aim) else command == VIEW p -> info: viewProfile() diff --git a/docs/diagrams/viewListOrHelp.png b/docs/diagrams/viewListOrHelp.png new file mode 100644 index 0000000000000000000000000000000000000000..c92d521d3aceab93a2e607cdb666c72865e962ff GIT binary patch literal 48914 zcmd431yogQ*FU-e0hJOd1qnq&kxprl76BEMP`ah18w;dM=~7BiLfUQT>v`t<)m)y}WF>Hpk{(4M5I9njqBjr-)E)Sz|1c{2 zBs+?`2mVE8C8lJhZDww7tgB~*kkB>Ny{BoVt3#z_Pi0_bWp2sC#AI%)X=-I{V$7&* zW@1zSi4s2Il%ax>)%TwxP~dayqMik-nsqZ1y3g-i^vgvxiCbv8>(!ca@z7x!bdIcO z_Suhzm@-2;LuL^hYrID;WGOqaNPE(6@y%~6r)4Pg(90aYo;!rEsGww!XOxQ5!Vrhi zy7fxw^OH%Z8eePuP-jC@T8?mLu8>6j@aQ=i(|$6YUgzO2H!F|apHsXx_%S9^R8 zC^qAbX_HlUq%Ja8t%$wV@B-fRXHBu&dAllP=u&f}4Vly>=<@>}l**pICalJ1VVB&}3?2 ziLw4(_EzGG;H7XlVJWLlY_iKH+E1z(UDrcQZeT3)3+9Dyn zW+(Zm`?y+$ipc5+17Q+;1$=Gc}fKHimg{3B}2qakp{mZzfUS%Bs0r zTz52<{9T;mQUCC_e7cOU2?@MwcBWD6v>M(MULcO8k9p|*VdbS`6~m*e+I$PA0*-8n zu^GG3p2;iowA6gP`S2Br@(q0buwd^aff=Hj(FMoqtJRfi)SsNPICma_a6?Fm3M<&D z%|v6}xp}jDF9St%j*yD$^V7n_2WL(W(y&!XvQ0WyopdDIoE}BL62BN!XQUnOYZw%s z@;qcy$ zn5EbHvzhH`4gC%CGnxMR%CIXD2o+3I6-?xRxJligLvB0D?t ztGCmw$yOz<=)=`t-TWpWaeOf0qeM#6{YkjEq~XL+wYJz3bY_W(p)OlJ19y{A6ts4? z(KjEL=_UDwC>2bhN+Pl^I6gJTyNYLp$4q27mc`sB(nDre_&gfp+7S}9#td%#Ow~() z2xIxx^Ia5S6cZF0ba9SCnIj*ucsR$6v$1H8yP3e%_Mo+(^`Tuwx56{9xnn0>H5OH8 zGbD=oR;DXn$5F!pxgu_JD0O~VOcR|^nO%%gzkhKfe_WTv5IT9JC1=lLf+MAzy8c14 z2RDJ5kIBxs8Y3BMnerEng{!#^@H8;Jg$0Sz9^d5JBgar(q*AFggi=C*5t$ya-_)hJzZWhlo+>$+GTy7`fWfpavNU-E2Lo*18KWo~&(#)GDF;LF=ZCxKn=X>;6rKr5s zsHqOrUe=WDiE|{Zx{sCriqq)vhgH2a63-Z$+3qIwIs54}V|Dd`sHoXZ4Smyg3}eU4 zrq4D*S!^g2_M;hjmL#Y6RW9EfZ*XOF*_`xQUcTxaHd}Xa+d`SA62-Z85X%&Gdf%Se z+a$+wHVI4O=t~xrRaG8c>P{90oo_wLK7O1exNT+C!C}PtmGO4=%wb&IqP^XOU@n0} zE&2lj&YOX;^K@)Wk9*8YsLv+sJiX9BM4}$B+GYmJroHt*)|-OR%28BwbbG_Q0xxO! zMd;HzQJf}v1_oiFp^93=aStBE)6dMi3Pwh3vYDC9zfmpNo8Q|N?oIX;_41q)SsXr5 zyfKDN!*KJC5z&LKm6YjoRN~Fzfv;{k$91&@(Ol%Uo%?9pb2&K$xi83$P|f-3?W}YN zE`)mE?#%k}KCqqdH!~q##cu9C{ppj6uuJ#eJ6$8ah8VJA$Ih$14sItAvpm%)y@M!E zQ}zp5zhO402Z(;`O+ue#K!fWUKe6e^K zmK$7my+3{|3D%lxichw?PfW5?vbWV1s^&0j=E^J6lkUntpDgJ7;4%MNFFl<`LZP~= z^M!Q3)w9PZefBnD{WqA28J)HScSpwQ-FYi~w-Qr&445q9d9Gv*qMQpGtEoJi?0e`~ z4x?&*UCa)vDi6DhQKo@a04Hu!7>nS}XZ7Ov_$%)`SH;aX=L+^jcv}lsq^7-JaFc3H zP1%0r^zgqC+%G+!Meh18r1@vq9VgW*sS9Xc^idZi@vGRk&(%+5LYQ-j0POmW&h&tV9BiDw{Ojp z@C0`4^w;LrzMiP-XLm82;_UV=88!Dml4Sobj(HB)JFltc6*CRIX7D-}R`PW2kqItk;<=*GenZ|}9qofU4D~`{UZ>~d zV>8>CPQwomas)PXY=u8uCmSbIt!PjCJlQe7dxRi~**`r!U14Bi>n`WP#jhOM+E_ixctw4Y4Ikq|~#oZ?U%-f#s9UiDa3HnU}gcsb;xF+l`BrZxgbFp}tN_$>nx>8nLX_-`_vrv^1~0 zH*1!>u@u_89_)*A(1dbcI>IBsJGCCsRbV@xuXl9<~2djmQQ-W5sj!) zs9?_bV^ZH0a5jIQT541Z=f5su<+$p=BpsXOSX4s7hvwo<$JbDc_;D@MH+Gc157}$0iy}9gjO;rZl z&8;gdD_cABYtwr~uWSc)VxcE^HhUN^hR*(YI>&N+e8!VyBEv%!gl)}84ndDF4xauT!B-3)dI5&6K zn}jI`|3^W9!f3cWRm!~?Q9gFkAo>uA+dIJfi_#-wC@4D`Oa zk&&fF5$Xwon5=Y{hjZ6Yk&#$+C&@+&Qx5Z5>{ z>c!K=7c)Wya?xevk+6gFxLXOe33OcXqy7TC*GUgydI;=Txvw)kb0PM{ZH^IXeQ9EH zz4KGQO^-=5k660e&S`(H;q%IlOhq5EL)F!UJepcEXZvhz)!q&=%ym3ktow#3G-cLa z79Ldc{9JN@ZJfOfAIt3RZED;8uIuw$U1N_7yBVWw&biIj9m!;Nu>5%ao^j@{Fs2f{ z$a(8+PXDJQ{}tDb&$cDox|<174O80K-F}pNG5suTOX$wQ;hf`FTcDi>B5X|S!yh+A zHc8YBeZPi%Tth~(EE6d(-B;ir8rnf_d&r+sP}%8q+eBSe742zFxAo5?^6)p4W|4(v zrZxdl$hRbq%$LUlR%`)WN9odFE6j#5b>-t*Plxy{oYY{H!8Sj@(cDFl7 znCf3lyW7;5B|W2c14LPW-w<$ZDdX;PvY??VA`Cwv|3R4J^(a1GAOka~azk#nP;aOT z*A|_ZjUl(fL)Z+BvJoH@?<*)Cvt;rL*2nBab5p&vQG2NLCRH0zd9U~IXqWIBLW4wB zfDOf*NYWaeW$nc!dz(gnMCaq+*g~}5{~XYbxc7)YH2Ak$J1TrW{8GV!KMcPN7y#?S z2f2L3{r4A!h9Gi}{&uY&YxK_{-k_$up&C;oq;0?jQd405HT;O%E1}ejPx44AYBC=p z?=;Fu4|R|(VCtyWoS4PenK(zpTP#{Zd(7Ye9DM&Dh|x?Nzp3e}_}u`Tr###MmGIR= zo<8NkRvzThVknt>jAi1AftKeDZdn3hr_ujR?I_q06=DbeWYucD3 zL#DEr0Ttz;O1o@pG7aS&qq;PR@$8409PZ~yl{P-~a&0H@aW0REhPw1>4rHpzb``?hCp?j;BHG({=WXz$G@`5wF%>FD~M*ZN}Nf%a;X zu~;rQ-ffP!TVyjbN;{AE<$<_&NMl}k*Qwk7T3Ov?BeBsSB|Tj|-zsH7b7DYp9zUZm zA~rTQEbQeFJ9O#*Gsel2@+Koj>2`Fk4nrlJ)DOubCFLvRWS4 z+qGrgUG#SiFu|ug>U>B}Mh55bVY``(Dn|9GBChC&K<(BJ@ zcymnqriO-wzIaNNNb5_x3 z2W2>{+!YioxsQe!!|xcvoh%!juTyheFEljN|0G*wPfr09QcT=a8ujnqy$ht4*xcIk zC*_zLuJCqJoG;mPF-MDa`dR~5Q&v`H_yA6v4aUqsiQwteAAl-sPq(Ly6v0xe^3-dM zZY+&cIxPs3B5>3MZE+Y3jz;7u+`8rd_%TaQcZ@P_ZlBx6N{U$F##m(5yINDae{BA* z4jVI>4RG&KK13I9!J?!#Wf`{ko#MWssF-uNEp@UbIavSG(+gc)T_Ntz<#nA`+7xTl z@~sTT#oaq$X;N65$l5wO#z#k)qt9j^SIBw!tVAc^fhLC7jWx^hdY0RGSS|kH6_z74 zw6TR&lgEiF7DuYslGkZE$~_4LHz(q|yH%!S^Y3#T+L#rs+`4(QErP?Sxus>}O^n0T zg`ivP(ZG0W;i-IDt)g_j+LFZ<=eRa^JKH!VCFOY^#=v^Jy957HE!(o1*65=n1Y>oP zwqHIGv98~F-Si-ds{V1mZqo~~*1)2yY<(6?J9WdmJuzl2;hhikQ!PDV?rX6ebhck*+?zTJq3zbppBZg;hQ^ zU#s3oJ8Wxf`zEKlX5g{NmJZj8iF7+AQ67rLB4f-(o$hAXnv5Sq0QL7N>A?3{@y@lQpWyju=&?u+h5D+D~@wCG`b+!lzHIkGuexI`uOO) zzw+p4?R0vHfYrn`>9R7eO#KEuTW9)PpTa7oSdH3JZ*Hr3cWzFr?`?WB6%R6b3c~r{ z+ZouaGdARCb4<`C#-c5l7Seq$;(=Rx^3;m#bXsWd znVFdd2}k&y>FtV_@UM&HYDqRQPq@wQqt1ea7%_+ zl9s$wRD**b9)9`qWu(eKr|%*^|IT9)wYcjt;jCf@1%-30c_OBwHZX}e&Ctn-&mSbY z#_qQ&+MU!St~=A}UD9f*pFVvO_otYho`!E4(5~`hp}k3cbR7_|pmZ5iY0bIl54?Ae zt=+nI?HB<8&@S0$o>K&te&oC%PYE(Tq2TR~3+{1Groy&m?JPQpG2ma>ZkM1vmZn3m zRv4yo!CkN=I6PcRR!{!9jEqd88`OjakLZS2!Puan;gONxsHoaKO@5;h`~m5C!dZsf z*;a67SXo&wUi@ssbljC%+$T;lb*>o^NX(8txqi}jPPz7!;oYW)`Y@Jaki9Y0S76&vT|H>K z4u2txNUFxnMA8}$pMaojFC~%~Ssmi6?_(HnY^~0|TH$L#BK$$L&L-I%1@T?rvNGC;|@h*>aS2`P(rjx#7n<6jAdhE zBLcBVgV00&1>Lw&Ht;m_K*t=$LCUscX!)2~HeZ*P;^X62xa^Qih6fU2>W7jJYy=_= z;`}ki3d#%IOfz&4%LORqOXJz1`=#VEn;}f90_f#u`81NHz z0_amAO1dDssxbGl-5ag$P$85P++oMr3fGUZ#{#rS%D397-N-Lw9X5BG#v(&(aWXl! z`R(3T~gOsU|?; z$~r)qSqSWA{#fVLE;kf3Q&Th9h*ZbU&ch}TwR(rC68rKpK`Zd4x)kS#ODVty9TG55wn@+GOqV5qmf8k78m@I|>Rh5e%c<5B zd}{Ia_4VbszR13%m#<$(F>7Ad(9ke2I8PohHFdY22GCAR3)`79S|1*uk5u}`pLi#@ zK8WUsihJr3lo64%>({Syb8{Ddj^efiD0<$w%pGTxo{>@Z>Q(H+hb86YNUA0g&2zo> zP*;O376yf7+{D_i&x5hh1L8KZ8(My{dWj2YVe3O4l$|DMbW?DBiT#`ppg1?};*s+t zMEet!)5SzYTv>&Cm@qRorni?|4k!ZVzt->QkIi$g5X=537FKw4bhIiUMsaiVxBMt) z9ce{kE2lfvyB&--!vYz$LtwG|w@{fJvRv9+fTmu$(hfj>Fg$GV)3f{;+uMpc#E zY-MeYR_-R6&LemCuZ#dYid=ShGL4Lk@=WA}3=Jn=D`z^aOeIcU)&w1+_vEo-LgG+L zt*tq1dEB!KCg{(fmz0)XT3t15NvaE?kxpP~=R+Vg$dH@PTxgA6>8)En-*Tf!tm`iK zE5BN^I#ab%$M}iE=kjc3NzHJuv8{|6`JX*|rt|3WW5aw&lN9-^k>TNLAc@p#l4YF* zid<9}Pc%=ZND$CFB-BHP2&`&o@ONBhalm6fJVL>Wj;sA+;}5#cEiNuTXB^-tO{HGC zof(N=CF=iWj7~tW_Qbm`g3B|GZ?dx3bKK|ifFX#8>**yWdAEk}h(-2QcfB_vf$xJ} zBvZMGQI5b2uoOD(Kb%#ls zTjb&DS;{qgt376WeX}7JO3O;7Z-x^S69FWwtgiZbdTKUsC@LuUPzuKIckr2XXGKJi z%8;ZmSbMF$)BQYg$%l-q-X=6CDCp6nL$0o_t6}(f=7@IHN4zzc9G1^JQuTfQeDT5s zDJLGUs?G((L+0PlIV|~W^%8-zXCIwKO>e1X>Ygv&VmyKsM6x$$W7O+4krC&`MShAU zS@RA)>hCLOA&_(4f&QcKF%z_a`()~n(1pJ=8eD z16~gG&QKVPw!5cg_#Nr!V=Gdt@(m zqmF^gVyyP$;+OWc+x&cdy`&3Yzkd4snc%i>>FUDk45N-WqobokWgfxLO@RNu4Z#%`$V>SCLtl=!Gi~pJtznv!vyq-H`1I4 zSrJ&P_`Mi!XAgj8KZvLMxgbmU>#*7Mafx}KyEy?SwBaj^g`EiDg^N=s_S%C(Eug0^!}i9@az<3+CDy!l?Q zE@FAvikKP5jlaO=%j|3$z};t^!z{bA3;`*pyn01FzC78oQZQ^r=lj$z+_|P=29DCu zt2ehEyjQ?v1bJrv0amoHkRZmX;i11>m6k4=JIQI>`SN-^hzzN(Uae?4M3(UbbJn#1 zw$^15^Es3W$(Hm*MIYtrSE}0fiQRC=zQG;MW344?q3E>NEIAp5hK2^hLzpwj<^V7I z4_)>7_4|HonC|ckQ$%_JF(=p!0+N%H{r&Ow(y!XTs%+=2$wgMuo@|rb>gsYBJ1Ywd z8nUc*2#+&+i7~ys6KUb{y+i{g>^FGyfbt{-9A=%M$-JMJ5i(W!c)v-*4wrmWg2+8) z7?JAso-KI#h$-{kyLWG;sSptpCz-VgcGOa&Yi6G~NkmjJx2B+=kYzRy!_8|oQA&w1 z44_f1z(!_-(6++F@T>^i*x=wG76~Ks)&alR!$lvfP)S820mbO|Q#M=MIvqp7?_k_t znD^$5tOA=(lz?+Y7p3cVMotb_sDREBK_iliPr$-AmiP?~4Qs;#12X{fc6WD!FS9b$ z=FLqj69HEvTL0{#;<>YDnUfXPB&id%=Q`2{6xE$8j9CGBhvU@x{&_irZ5{gLf8c%8 z2d~02w5x)0HM0|iHy2!Uu3=~P(%-881;JnCvsgpr^B+r zJ-`@iof+D-7uxud50s6Kjf6?9)|geVHtd73hUx1>9`n=tNQIW+Jiso71jD0uJ{CJ~ z0l^f|tE#G+A1K)yvuXTz$#SgL9fwSk%ZLoYeBnn$D!o}=UVh3T&TOE#o3jzMrlDcJ zIZ@idfoBhc06{?g^D`>|6I0yP09X!xj&)-+Sndp|gY!<|; zV~DV4Po6w^i-GerFz|Vu%ivv~t;C$8|0<598>3@mtj|S&_S`HSczB?IT4V+j6HZXX z5$~7d`m2a2Yyy7KSOMqdhP6MIOi)ktKZ^OkAFw>Vub2M2qMDPgZg27byFw#M(;m8} zpUmR?ag%_u+>*}xSUV(eCi+p(;s4@NBoFR0B&obN&vKGx=Vo~fv*v?VJhJSX8Nr=N zxf_DUB;8}hyNxpmySH;Bd`=8u^q~<-&^5sNsjK{7X%qr7eWp~Rd2ZqjwYN_tWbxV( z6B7ftY=qWKMWs<4aM}ZpaxCr4Yeguup^U10{QMxt#o7&f4i9S;mznnEXH=V&?1b2x z_J8nyBHNFjML{ZKJ?OL#zh%|0(ZgosST;0!8B$1NOH2O9xEA zSvUiFW?N%&ijtdLG!KVX`C&@R*#08NOh*d9U&JT#=)tpu73IE&6w)(=<-69H?YPLQabY$L>aHXw>l&r|N*5>7yKpCZbwC#OCKIxkL-Me%<Yc&*3q_k0GU^&JHlmd#`dfpdKwZ^ zAHe~DUM+%=@RquILp1Ovoz~V?1w}>6WNpa;?|SIs08JrQ!D-S>ul!DwR6EZ?NH&_M zg5M`9>eSc0DaDdA1#oLR^Ie%9Ia33wKu6p{9v8e#1rVynzlv7eC~BT>XZ-qkp~a z|1q?d-29KwdLrPo$oBSjVPPR)Z%|zlCacwtgL-}TD0FZ#AWI&v-o9l9VJL0rxiRs= zN{4!;niXHTL~bULN|C_XTM=$FMy^}O9HkZ=g_P8MUDth%%CqY`fy#fe^hmP(p z>~W}afB?aXUHkOx;(KA#VMp%!xw*L?F{&H0?}rF2CGi*#AC%$mi_+?3o)(|s2{!+s zLx-MF;It&kL<+hJxGKZBr=(=cGHRL`xCR;(0RcgH^wX!J+68&!2t<@eR@|le2Z!DG zVOe#v|KS6%>MJXEfnc<=vm@b4YP~otHkM!yXuP7ba(9|HjqKhdG7!g^n3!C_^CV%s zQ_UC6Ys<*Ucy0t>7cc<*dT`7LiHKMtg~`J+T=#Z?D?%X$wGR%G@*}1uB_S~}F{rDP zsZ|t?Ghe@auC*Wf_!yJIE)I~|eBlzVe-=Nw_p=Nc02wtwG_^^I38A&1QjPyWEvc+$ z9YUDY)zsBvgM$gk$?Kv{o;=C^I5jnu!>BzWIhl>N&ihP5G;fu0F(#wT3E;8HB`*9% z5q$PvAz&s`2}lSizx|joL~larNhMv4yWS-xCAs&9x)#wCcl^^UVjG7$Gu(q_=`fX& zY-b)XAK>Tv1M4#)+^~R4eZwT-nq}_3q#SfiOzHXg5xl%MGu3l}0YaW$URtsd9bK9F zd36u->gLu0!ax?mTmpo1j+QofaiI*arypiX zgVz?u#>yJhAL;{rnxc1tFhLs&8yhH)2Ir9!-~f7P2)Cu5*MVXr*B|Ki1NS$4c!(LE z3C;-UBsz`iczAg5P#2jJz-9!ZBj%{hX?Pe?fB?cl-+}JJN}KWml=CIKW+716wK&D< zBe|G3I933ChD=eAhV|gA7c?I3G5|&9(?hc82Uf;&b8}Y}@pT%d^&S#G`XhQ?WnwV; z&JZfq#P^Mev$)+kW(`s8S$^Vcpm?3*QbQKso;>1%BU9xan&u!a??8rL~2fp zV#f)3mp)xgzqa5-bTM}vb`TB@P9JDMv#tZh&S1T*187!~7ZNIkMgIKxbCo}3gYCuQ zjs&S-FE6jVMn;Nn?t}*fltzK!Msr$h)7`z!k%I@_+t?V+{DGI@K1&&a!toos`sF&Y zjvm$0((3K&lR^oAC}$AUg$ox11O#eoYIN9=&y!X{&6u67+wp<+3{Nj$0-uuT%!-f< z4Gm4NNI-Ai-tLwm9%z~1NC>Q%!A^(G6&M((tgO5}TfRnj@gf=EoAh*G3eNuIyp>UK zrcdzMnFC9bmBroDOKrNKq@(@0w)Re;9ZO~nP;d-0R0edT6x=&Vm;d)dte<4!0?H%c zz`I42jjd)$%i7e!HUrLUEW82&E_=H>S{Kb3puTp!)kJf2@56X=#aaVxzcc*`>thNt zg~2ohtfLOgZz7U;oRl;liUZWS+9+-|4vw2W#^^@c-kzS^jY4qQ95SU}M#skoVAllG z%8jW@Oj$^!qV@d#$PHgrbadD*41U-S9m2?fS_B9Nd`6EE+FFU zhnhX8CR@^ObM@|`jEQ`&+6w4Oj}fJ>!Ln!?fLaN+DG|AY$h!K2XM8795Z(5B@x$s$}f}+9a?&X*UuFK z)lK2xuF<9CwdQ*BmVF~9PI7U4;{ij$vV0)R91NN(F!xqjzP?e=s> zy1$>_>cT=?JM0>k*5_G8W&YfLUL)FCQ(VSAfc>AQGFTmBw#9)%paV z+R4euVQsE%?kZ#=WW$)jac5>{XQ!r)hn8b2B`LYEyzKMjiPBq*54jd2=iO)U1lCJq z+|V#_f%{xDIyl(#tZ)ngG#>4NqsZ;;?F|?K4HXqq3KbSSZa^FRUAAU*klr|fMw2x% zr%}|KZ~f}nS89;4M+HId?Sj;qdNl<|ONkd8Lmb>Tevx~BA#+CZ^71wP08@8-eSK;0 zJSpA*UD@h)oDURk_OLxIr>S{56MlJnc~wIyJe$@{v|+BVKrZT%a7;kJv3^}pZGc;R zsek&E@SWiHf=G}s{b1!w*GKl3Zup;5T7FV5=1m;f1c`6pYs|CAb#{mk1v!oAvdg2* zpgn+6IxXt&=5t4IrR7)YR}f2@y&_59?4+N3mae@Un&`XfsVTcxB_)FPsiaiY?Cei} zkR{dIw?CUWqF#}f)~}0bd!@)ELvr+0dir?1n;U`^gf9^C@>*CD`o#2wg@sjAB64zU zp>c-LE1&Vr=)FV*?R%I4qeW!KwXK?VzCx-(lrb^i3?Cp$GV0SBk?xkyn_k+zmrr)3?42LN;EH*m;Ba;7CE ziMNQ|m5zQrQ@JH6x9#hx@70<)N17=JBx~$FheUAF4EfF3(21k{MjBG1?KFjnx zp6Q(um!iVL?Jto1%{4#0WCcwvH#f`&WFIRyHQWVOlQ$F;%8fCsb=;SoSEyUDHNZ5M z4x!iNBzFa~qLJrMDDYE2f>N=Qy|c5ktgNh+6}u&5Vj2m7?|@er91~L?#m?l#XFGQ) zbAuxHs3!0iJ%E<44IxnkQXc0?NJTjBZj6U#!m|lwQXlIROPIe%{`?YRm4+k}JmE*_ z`4DIj`hib$kuCUc>r2oZz_Xr%00(tJ-(^%9Iyx_ILp7+aUpVo`I12_uE+exPwZV~* zkx@}sE6eZ%ubO>`0t*QcuVyyJJ@oNJPx{6gVyL7*clI5_y}({kg5Y&+)_2vS1>+>%n#cO{1j)QblM_XG)l}ETG#B8>?BSAnLBTU2)ixF^EnWybq z9QI}kdN&lKsAm88f#PeW5B!j3H8C)lsPrW>+=BqZbmQ|f+E}NL5eHAo4Ne0xrC58e z?7q4O3Y#WF+kLD9-Sh_{MVd>WL8}W3I{}`}jpJwO!-7YpuUzr+_m{hOkF~4z!c-)j zR0l^#OTl z&TyGZpOb81I4ZR5H^_65VdP(M9h9p2t3BJmV)-3cTOA^aZd_mMv!%=&85vodA8@tg zWj=BM`bF&R^RkEZ?mU|+#rUU6QW+i236D7fJ^~_bFHH zop+g;D><%rf?)XIUzdSYu7Xcb571P08A!OH>E4fG{{yCjC4v(&8;DV zPycin48+4GCVTUi;)EZ*h>r(MZ@gWI_3M^CfZFwsMCEjJbigruPsaC0s1Et zg1+BX{Nb-=3fgYbScvz(m-TNA3JjS4x%~IvVEq5k)P5Kov4sT{!btl;Q*#JJe<-`C zsHpDPC-1EaPi*Ac6mt zgwP_52e+lAW!Gm&IzG|dc9DaYD<+sJJYAl9=Fq9ie{vxj+@nX&6uf!kmjf~L;N(;k z*2^Ly_Mu>8+)&lGF)?AtnLTozfgzg1=oW}n?5gKq7Z=Cy0>i0(31Mh3kYuX@Y)GQf z(b2&thNVD?gzt1b*~RyQK3F$EEW4I(hGuAP4suRr&8{!@2Ka@i%l>>NdIz|jgPFN8 zO?VA}a1cIt;FD+GC(1VYd3#f919vKCnU9%k@c;u+90>v>BneEp23_?2BWPA7NFRrcq22(E$v|;*e+2gh7tjQN^n#$l z=eSC5d+(vI*9@q1V5>s(@{xx}`t2OQ_g6gbnmj-z%zVRfB|&Gg1ikOTPpC))KjD+s zuMjH30R_F32I(@rjt*BC0g(JZG8f)3{MB4As_?a=FB1sU3}f||&!O=zUW5gYC6@G^>7H@HI}#1C8D=?CQ&Sj^N*of$ zEqZ)T?dS!65R7YUug*PR2ZEwRYT67*M+;i6^_Q1`+Y_MWfeBu|M?w)2T;e?a zEt;b>jd~P(hoqEGQM|UMjd8*;F)^S`0|L{j2O!_x(Ge`{x)F^RL2`l2lubmN;O5Pn zSzLO-S_>;HMdm}7B_$=HR$F$r^TTv64!RS>T6;y9V7;!0tExs{I$^qSy@?EF1-_XN z*=dfiWv)?9LfU@*GZNwZ1HlymI&qui8Y0S{U8W7PHhReE2-7PH3WNpZmp>+ga9n%g z89HfC^FqPm!h-qky;3(6@E3aH{RKYpXInS0HSm??o8wiu?(M9FU?{gd7r~rsJrUx* z76Flb{a9z4(Q14{M9yri2Ar)TrhVj(>Q@C}kmryqOM`<`F9FQI!CYp{R-%ZB)q~#O(n|IaH$MTIs#1{~>fmuWfUIyn&$1%z0?I$w1z3Ny z3(^kkg0c}YC4xQvj`3JmS+v1LnATlgS%LTiyKAevEvV+YpF^M!iHnQt>FQdP=)J5p zfUBvmtxd4i=RC=#S3Af8@!Io0LP!vc47SbQfWzysI+L=(iGJPhQY<_Uhy-@KM_SxWMI-x8>vO+?O-X^wn1RQe^_wXmZ=N=H`WJ>^&Ik+v zYz}DW+n*))8KtZ>$iA}_67^#!jZ_Dr%dGoAA%SRagv$F3-Rnah7!T6UJj>*4oJ-M6 z#p`E4)92$W1j!vz)QvEf@T--OyAIcbv41@v+Q_;mG(_9>pCl%>K^k?>^LG9Utnoqx ze4qd=_6Ys~o(}?5kZ+Ecz}u$^u*im)l)0oMG26haewyk>5e90vUMt~KP{>|J3jMHR z06PbO8X(z>|JJX(8Xdt-eRX+xqUj+aa;FCe25OFst0J=Q{7PQLY;0_hSvb){rVEIc zAMPrA4>5Sg1=iEQ)Ul0ou_HXfvv&GrFk6)%?7O7{3YpM#qW@)ERDzo@gx zod`QP>sg}T)kbgxR(^8?oPqd!{ck;iYa7Y!FJHcdBu~F?eH6E*rY2#wW*NpkViFP% z$uJHb0z=(<#0ufOhNKV$TkOZcIAW@Jo0>|;3SnF^S}u^ks||Xx(~7O3u)bKjk4ZtL z-4MgS?aa-Gkwxd@SWWnEelZpKzsE0(4-r5ldFD$9!|ifrmy%@2AoN}!1uOA!7j2#t|l*w8u1=j@a6+LEbCabVN4e*+hF9*(90sMdvK7 zfjE}r^mL|^;Moxrc+XcD0|WS(oBy$sQk0zkkLD5##5s${j}OU03OJJ8@c4y~4T5`j z2Cj%-zKojVfqn8ahBu)$JEsBv&-okByN~6*Jcv{|BO_IuTV5W{|AkGkIma1eL|i7i zzcWC#kUHlAofS6r_83=h{pZg{FpUAA1_ZPchz8D)j0nH__(x{7!oa|gcyxAlmK>5Y zF-C7*zC0o5!sqxV{3%MC2eg4(95ehRQ@zVqj+ zJ37_`_m%{qv({}7Tf}|&TvxYaJAPXapeAG)pxV=l^k4{G1fM*@=?WU)2zHYTm#$HB z<1W)Qjm*xj)7@3phfxh3E+Bu-d_ZErgrzg;W4 zKc%0W*T*;`Wj(0#J*stfoEE_-inNAiLqm`wu?rtCAzTHC%ev{4T%BvzU{(#-%K!{i znI&rcn6JOpq6-Shkt0U{PD2U-Ce5_#VRoK`gd`X_Z2iV~d1YmDWtxM7qc*Ai_3PK2 zol5T@S0?UvO6uXMzs^h~d<9{L^w_ZlI0>r7PRb=0caxeWjh1xXV>~Eb!ko!7owsaA z$t=4C1e!ktEJEI=`TFtqgCMz6*bUx?(0cIGCMMr3EN*x=0jRrOO~fOKOKtuGvl#TH z&2P`MV_lg6jhWTIGj*}EWV2ZW*`H{nLzpA`1Jzgyq?Dws2QPnLn5<+<#2c~wg{g%( zxsQeROJLhvb}!Dop{r8t#Qm%}Dk^GX!k~W>%yAgc_dLf7VuTC{oiU8cpWb)}Pj}b1 zX0#?4shzWiFsg2DFEtqDOFqBlFb%dsV02)hut!#Es@G~bcqFJWB)krqK5{-;<-Jz| zo~3Lg=PU%>pyiK32ru77aa$%auzl>6#{qG}mdS=^vn%u+897IWeX@aX30vk` zq3vaYgfg)$dq{(oOOmN7P0zdTZNVnLL%|za`A*Z_O^y$UGfPjGT@EU$oPJe$Z<{SDTBZEd?@u^v|z?_UHY*!Cgo~VXv;C;is}w8zYU_uJYYJ1{s~u?|F6j}F~@f(gDMA-z*Vp$=&tMB zDRQ`}E|7wp83xNISYVEl&n_V62J=Y;2@YFQdYpm!+DI<{sX1T>b)BmLflbn2LiDvN}o&SkTt&jHm=g#?G%3cOQc!xb2ns$-Lco0 zf^t%$JZF$|MK?2q5%w*YBwa;SmAvg-V10*{?so5304jn1c%ARw>i%|>>8dUdPaK+P zlGfuo@@vG&Yjqi|^!>g-z;91-^5h0w;r@iY+DrDwU{)hJ=WrU9jrS8eWe;5P+~AXF z7}#My`J;v4sOwzbIEC}_^*MaXtD0~11;Q9seUT=VszvOc3+muyBww7IoMb9oKy^ME z%c|>D?6f-3q`fp&w_I~OUJ|$v@)aVn_hOt^m1ROf587OZawP!gFym{{*H0I-Joahq z7;WSJ?9JAGif&*(MaS+A?-*#Q<}&FnFL@BoZg}JRb$sscS-2aXRLC8uH!;*u1*sG# zc-vmB;lV8;bsBJN&#oA3Zb}-GG=WY8FZMF)S$gIdd#-*rh2oyea+3rc%|z8eF9!&r zD!Z*SM%>JFT}kxFhv8Rs=M|#NnkWALI)0Jz8H+3XCc2?7o~6qVlIX!z{MHDD+_t{tm$QS*SEI@BwmxWuO5y993(qNVk49nmiEo;VBRdsY0+8&|3XZDy2$ zSVP=n)vudgBT=aXgL1(vZrA!SY2)jNomWi!t>NL}Ruf_S&YT?|BJG%=aNguu%+fEC zEv-5RUaz8&j@-7Q;#g(Ih&Gx>$>McPUPWYR@fUNBDLdwXea|SHAym+sA2io?kRVL) z4I?73F{d03Vt5sT?|A9?0?VVjfIE= z-*Sa4G#Pz6t5r5>}$Pvua4fDw|s>najDy74$QV_iHXP=k*_+Xo?qA6-ev0nR? zmIEyYgm#JYlm0ndIN>octAX@9K?;L_e(pg0xj!3>nlES>8Rr5eC{FhQJ3lS(hg=_! zcoNVcoF#+y%xZTASO)qI44lIIB9wDX$?bWp zr$hrmNu}jwV)CB>mo>r<1q3Xrtz^NS3tjMfh%;O8f`jaAF7PRC{xl^jj=TIi+8-wxl`JjM+!O6*!`1lzbA0AkYR9?sKg7+ES=SP9pBR%o-eEvUT+=grG z>vs1*w|zQOvi*fg2alB904h^06)jHC3{2v^qqG}DdB1j89bnBwq*Ofn^ES$QNPtf=mN)tWCjlbcS227;gM0 z)&eg4YX-)PCTcPU8MVKage^(%SL1FZUo_P*%!7Kx;DH!kU|85hyE&7Gu?;UBV{$?YJdXd z4jbJ@=^3FAbkHDAbVMtq_&FK>OSUm&0c48jA|4R^fM)x4JOXBiE5U$>F^b_dQIV1H zJ$TiCBfQP$tTQA~^b4fH=DB?N0VE+EYoB0VLQFG$+N%-gQH3~^5=q5T`{O}J` z_w}QKLNBtlQPs@&YJ4Nl-t@%U7ZGqaIWoz^^d zOy}@vY%SC?xY%b1CAaQ=X_MHy7IzL+>w3mB7eYdVS5IM}Zh>1AJ=|#u?a=#Y&4q)3!bdwJfB1+fs_>jEN5Kq5z4Dq)@7kNF?c&(2q0Bjft*C-E{^^*aLT=BOjzYwo z$V^?Tx9YWPYi{($$SEZSl7hIn|EIe50E#l*x<(rjQ5eA)1x6Gwi~&?IkQ7N~K_oRu zMnxrq2n`C7Oel(&5ERKlXtHFGpopjl0+J*Pqd=3DWRvcC38rz*f4*B^)qk%wRa57T z-Tj8=+0Wiulk1IH3g_4Ed{(0bl}N1kIL{vl8nAZwV#q@#@>Y%!@MkX zKa!eMvv-?|y8pzJhU$(^53!D))*Rk#DW63hm+Z`pENt2=9` z0rl{(fYUoylRIntPoHbXS)`)K0y6-Rf2&}#fh$G>v)j^n#8>Lhz;JQiEj-igzUNE8 zJp_|4tgIk|izk3B!p^WY*y%-BGx$x-dv$qRgesO_o>>V#9YQh-60ihw8k1})CC|^9 z&y8n+mn1JQ?^kb@P>CXH!0`Zfxr)jkOqMXmW_KRm$#MzJf5a$li}Z`lh-p~^mD(oW zL=RO=YzSU=p@%|eeSo;|P*-J(1iO5M)}!kRL0NjI-(Lhh4P9Mju}9WdJUliC3aa-3 z@V+lbcz>?SQx@3btK*d^`l#DuJ;7kiYYEwY=Px9QgpNHILITN!pLU}l!#ylqua>4w@! zMgR38F0NFg(j6iyMSZ@2E>mhPLQX?m?798ZWqPHX(k7f2w#JtF#>V^{dvFy2lIzv> z32(38867$C9tm>#PcR&|(4M@i?+8gb0Q)j_U)-)p?v8 z97ye<<_ZrFr~R>a{`tr7IKYBc*(Bi&Zj~fl00qLEo-p%~H=RD8Lv~yCV-#cwHmlDV zxU|GV$qILXmb2{_+XXbhI>^4s12tl#(~D*TAd|6*ii$0{?OozS$0c*`-oA}auN$)Z z(d7L`b7!J0|Gq@5{MvP9b!ny9^N+#Sd*c2bxM$ud!R~~%m|K6s#VvuAg~og1qJk9ls}b^>e@TNewt(E_q=lJ{Om}s59RqTQu)RP*#8;u+c;+BI{dM4At5`L zMZHroF_&rArXk;kKfaIKxpiw6F6)I>a+6vgT6!%2cHV(a@GShuQqdNhRn}@ z&90S4CKv88U^BlPWb&NSV4fRJw{>+blcX|payfpBX z{1`QSQG0pca9_(i+h><0IVT3?N{tBi{J3noiP|=Thz+-Z6u3pkXeG<_YzDgrA&Yj`&riXFSVM}6o>#8C zeEmA2&|ae8U_;gvhOblV4u<`*!*QVlJ@<*x^$)&aQx{b zj1pbs__A1&A#Rq>2R9w=ArF^X69YBdpF>qew(=-NGwW{46Ew+BZ~;1 zNAjFVHt#)Siqzc(+M^V8?XhGHyK)cuh(FF;ty-ZTR#J(QIM*URY@g@%!YlJLvBej` zK(-?WrCs@{@L5bCdsJnDOmbb0fy3L&t36GChmCjpFpvyL?`v&?ETB&;@c`nm2;f&r zQW9CL@*3WtglD^1sYfX2MS$)f9xbkMI-^f=x%4zWa2Sc2aItW*U<0*#tMmBd25$H@ zfS^oR$DG6Cs}(eREvnU`mu0Wq3l>HPXNs@=Kp9IVTcrhe?a>aitM!@bVi`#=8Ju0r zbg}9F+((md)00>7{?UQAO9!lDfp}jck3KN{^6A4O=naZeSeGPvRBAZhOhkXH{;BPf zt*8EC5;_!b8^JI*Tx_sSdsGD9m$uRFHh;NKs-k=PyRF|nk`W|asr9zn06Re5&WMA4 z;B;M@6)pQC&Q!$r%Bim(1{51sM%Wd0XD$VE7`-z17}cK$l_)1UoaHbo<}?lYaCo9Q zjwknGy1u|A?w=MU`9-sN_if|rH&WSX-gF}kz*Qg6E6y;k~{XTg7 z;gk89O$KV5e?+DKg-AeT-Q*9q7a#q?cU3Pt>=fnE)x>;iS&Zl)?|6)Erl_zmxvK&~ zUM$L5huN$YXhsKy-b#w#w??7U%0(CwFeMqzdCIx2M6V?f*3eH6)1VY#o^XRZo!n4&jhLN91?A*-dsj|t~JTVKyjc{gBFwU zods)~;>;7zc#_xc*zx0~?eJ9k&121$Evk0mXK;-N@-q@|C$Djc_?CwYlLZ{fAvt{= zI} zqYgaWvmA}i&k71^ZA+0e#x23y6+;Te(haquV^zF0SA7}m%LTaC1_}g0yOR>5w$!DJ zNZsqFQukXXp~anCyO(noD}-FPeUy)z#Htq;ROJ!OlRHgHa~$nc&({FScbG z)xuu6jed48DF~i*@f`YOnp_SXC65Rb;IDajme)2_8F>dIqX=_v5CdQPOG>O<*#fAc z!XxRy-aUKD!eNbu%JH3Tsf|3?%@b;l7cP`U)uv>y=U!r?yno8X(xz|PiWg7Qu&a!Y z3v+nn7A#{|GU}l}bgXf~HZH2xC$$3}sG_L(KP1Ck>!*|99OHXFKEp_Km6eo~4(oQt zI8LSLDjj0$XzNyJrD!Lcge_4kL4pJ8;+(O;TD;B_Ubh;;cb90#W#kVERC02AQJ+Ug z=UFdyQBYC2MZa}P&I5}lVvng|t78!@b~T4Kab*l`zOKSUed~(F{t^_tej>CPGDOw= zp<=QXU%szh#!1EV_M;^oymC8)EE)Nlk!^S3%K4$S^=$;Fklus4cTd#Pq)5J4Wi;PY zpy@?%$M{u6Ya(>S%JZ>A=TusBz2tS@^T=t;o|^_Q0uX}LLPmx;T9=gJ=Fx14@;Qf& zQ=5VkWn6{l+zg6vF$Wbh5$J|Tj`?q+n6#AyA=M){ig&>2tq%Fl9uMwP7V`~E{+RIe z;ssLYy|fYKe!}FlyF79s&q*|6D!u$UPubhUb+5iTnrtHv(Js#eywaQ}|qp z5Nh1MD*})}p+(ZesbxsZe7weCEwvZDB%_VUk?660+clTJ zU-MS~;`?p@t@J8ClgJZ{H=cjF^i#@zqMk*K>=wyJ3G?^A1J}S~hK6sQYpca{iU|}Y zpVeEs_YdsHh&+iN6D3=)4L<^R|MEe|*|mLhk+D$w(=2JgOE-qgP}+(&wGjo!FOaQ& z!`dQ*R}n7vl3~uj!!+Q}P0ifTkY~>a4EHqQ!`2^Ci+Qi>&oKWQdsC4AM=JBcnETX~ zutN*T^q0{emf3aH5ND+b8V0LZf4r-0@dd1s+GNwc%%dPE76)S>q*#z%A8Hus| z=x`sZb(~diUcD07u%RL|G%O6bTC&-@Qw@*LAoK-EEy|(OqSV^s0ZTxeUxO++$)rLc zs}SV|m?4qc5MYaR!#6-uQgZd`)myf_-B!$!Z-6ORwuz%oh3hefEh2l_FXE;zi(akyvA>GrU}6 zH<0_4MnSO7?tRL-NU1%EK#3VgCARS;hOZh>88lMrK#Tv-8sdP7+kYu|*-KBZ2BbWFVNIkMV+u)AJjwsh+(mpQM~0~hFgl;JeIuT|B8{;29`rMBfo9eS|=D%#~7 z(yavBhY76M#IC2$%|b-f_5U`jN!p(pUtgXoG+8&fLbq7jjW_2{uZTgeryN4R$Ni;+ zZ(^Tf>+5?V{ub5oPg*0$W{MS_4Hn1-;O~JkcvqV7IBPS$TxB3_&;3>i#uh-H@EDWZ zp62CY)&5eW1K;Kwq3<8P!!)_X}|v0F8MfWQ!SIf_)8=*s$_IfVIl z;f7RrxF8&af^~p=JoNdePp3?R^2(mIw}Zqh=8owTZys!Iu_g-?Gr&0S0yPiK74RYM zG^Ao-zWe#YI3Dr(W_~_6cX`j2*?z66SyEF-*Vl@j98(~xf2(LLJZ$!khGRE!Ya{g( ze~27JY6q<7*TvGy*+d||F z>nyc?+3%nXy!F7EM;u9Q8_)p=SF>>0z&65@#P z-0b<>E*Wx^h@CUVn3oO%!>nrxs`F^0w-)S<18pB?~2zC z`Quare?|b341Mgy54BH5Xxl4-24{fyx>y&IYr#~5KpS#jBO{~Rs}<;jU73*mm>|xL z!G~t;3ji$X5oJdZ_TVSgt1BR}Lr|F+SU0z%y$x^xI8xenRtIq#cbLXy*%paZmGq%h zc(_CwA`zISL_Pcq^FzSYqAUH}`%r6{Dgo6^bW+Ujb!+}qzEy}He|3k6l{3Ppm`PG? zlkn2-6UXWH(=qZLbT!(ZUSvfFP{peV!7vkJfAsU6pDFQwezs6?SRmW$<*QepG_x&A z8SaT&H7~JztPDF4SRDvB+PL9iqu`0vOuVF*pK%D`QHtKSk_D8fhIDJg`h#t1ZS@iW zvQVzU1XryEI3Uu>v98ocl|Z7bqri6od3Ap<9Jvm8(A;zc@VPZk^6o8R)cN`8=ZAYtsW{M zzl}#`G4=PfcuHGzm7u&zJ~Y`Fxn*+Ty9!RSHpzJBZgwWXv}il|nOys^(Q%aIV(<1f z{o1oT59t=75Q=GZcFuAz?FGO`lqsgM>6heg`1tt17gS&w+Fo7OMn(`8NWEuS2ujIO4zAhm1F0HS@zT) zF5nd*`$R7RLs+98lIM+m6w66Rz*~z$wh7(&;Ov3Etpa}%{S%wnV`QsHhkXFgQ3rV4 zx^>i45$%u0p_%pv&Tc0-4=lo;HvjSn_vKOWBt%gdF^o3_5HRzs1oG4;Gw|-JUb|LZ zFm%*obu`g?u{f#zFD;AELN?kcUQ~qmREGlHEs$OI9Xyyako0`pX>cpostX-44-mHs z&dxE!K|$TLWs5aT2y8}Ca~&Fb07jXUlaz>{-ed6%8x%xv+&I8EK_J|Px{hOK-uv&n zJyWe(6mDW0ATdVFM`vgkLxHpP6SyQ{oXuw^%Sm(odSXa0iqoKiV5t0bYTBF=qaq(@Apfl0(4$;0afAhaXFWIK4SSZqjSB6q!&WMyTAKlpy3 z8f5$+CsUvQ)X13HXAxhk743UzO-rOw}@tbLPwB?H{lY)eE=-^n)4t zRhF^jq)HZVWY3!8c;=uXr`DY+^mOVEK|N5DJ^o`KdZy3qdV5Eh;@OMX|9#-m7{h3x zze@W1dO#^a11<6_P}~~rJ7N}rtJ+7H_UfPPm^)M6FkvHYShJ>;KpQBE5O`sK;-8Mk z^$*#;o?G~moao)`YTFw@<}VsED|DaPdMKJCckfn2rw1M(r0k}IBQsryKW2Z-IY>Ik zHdT#~`)%4vo{X{bdMhNO9{bu5neHx7AFg47`E%f@$@A-zr{g+ zIAH&+Lc&=qw&B+Y`oAHyYZ7CZZauZD0F^n=$-5pC{e;(HW=tvHHrBz_Mt}bO(4O%t zfkA%B3?YGnuI9mleqL<5T6zv6tTm6JVP6q-k2*Bl^JV~T{?|-H(0q#Akoh?_R%0E9 zI}Ef2UT=BRc9+28Ff2_i?gX`A;r2aFRI#rRZ(5Qokd{h);3lB)u(7lERK^hQeB_WA znbIeq!XV#2aut6dn8Xr66_+a}P6%jOGh?GY-n9Qy@Pwf_RZ)%3$H^z5GoNE$@FTrFazp??~gmvfavJ; z_P5*TLQD1L^=q;Rkfs2X7BHcfckO=3hWtuuhToy(jB4vqQc`(k+j=GP$^JHF!#bdW z)U9g+H%B0UEM}`*86i{f)A{w5fCoij(}d3cPY2jLwBBBPZT@w{m6VhKp{wEcV{&J) zQ8Y!5q2-1=&MY$rO#{P~lcx|l4jHZ^oGmJ)Y^ss=D9KFFEUzJY+Ki8$VL^6n*wwxi zLfEr2s6P4J{rWRiRJABXz8X9$tI=UAZ|d&-2M&;vFLTu1Gw*!+@D1e3*q>%yxJcTF zKRmf7F**Afbh+H2F`iX_n}>8-qezA4+K;_n0ofv_x0ruLG_=1S7wR6Uz;Gg?|KTTW ze9NI?M}#8I1)d}5%OPVgX4}?jy>B^*wB2(5E?IJT9zilm*~2ZGkDMbR89sB$jg4Et zw5{-&#Poi%kC{APjxm#X)f36gAv2lW^ckX*sCWV=GkAXBqnen|pob-gWGqfcgon~n zCyW9^yZ6A*+UMf6)@9noC7!?D15yG+Guj5SvQIb;=|D)LUtI$|uM|=e5FeKByrdM( zO?ZPKB!LVK0ssx`FgMTSF75E0pAvR~v12M%Zu|L}kA=J>4Je02vbjz*Zoa;OS>B2t zX%$hazA!WGMVfBK2T-T!hv{JL@V zj|TW2#ddwLXOX|A&FMoDu@g(}q}dq+gMaCkff3gInDOUwF8^Nma&HZLCfTqYW6eTY zny~2R5pb8dU#8-{ z%@?)WD1-z?Wg~?~HWX{sE9P`DiTuUKk_G=JAWmF9Ecr9+ddB+-_*4sl&4Uxlw`55z z#61uxm6fSv$!lq8X=rEw)x^j|F^oT=?d*$+%hvK@1LbPp{{2BQhzlq+$}$PFR}d>Q zjvE@PwqWtWBn(c0a6E}=iDqc+hP`1w?RO6FC)y(ueXWHIS!I%av@ZlsErD-$giC`z z^r9SqV*Qq=KO!!=^SYzaozJCr+I5zIW4~beBLJ`*LYj~M0z>Q^@>{A+U~nr69Zde? zOBOb*Jkaw9u^27+w&#F%l}C}BC@&7(ro%lT9m(loZqna>}dF30e*hV%#3w_`&)>XS^Wctt=c4New{+NlEGvF+^VB=76}bE@D{F9 zYC{jCo%JkXzBxZK!T|+`0^x&a&Lw(cNsJYY7S^5yErG&XtB_@H%w)=JD&}FHKuJj{ zxz=k9Yin-nZy*ut7sw;{ojPJtcLF#SJaH-r-HNg>c8liYNPZqqrWi1}ZkjPi^d zQ2z9SQ^m^8j>AfMNCd(*&n039>#GiUJ;6zBo*BQX*2n{c-ZTXqk%6{k7ot)|dlG`u z3iCY~JLgB#iwrn)3M)A06j;<3p87MKi4=I`)Yr>RxN(TJL6Ahs|GKi(SkIJHowBxT zs93(dhojtdU`53e?#YlieUtOiB=H&f1rGdw6IiK1fuBf=LDOQCmy{a<54}$B&ch>; zsneX(iU|9;2q|YqbyLrOZ5^0UyBABH9e!Yc{ON^x!kxs_74`a+dV>rXl%!C4;Am?jw{;73A=2zfG}G zFJ&<23R_=YQ0~)vyVdWVViR~wwWE`R{N=4h-1A7OXakq4`d9tXM zc67gBcfEibrYB(jBu+4ul631{N~g^Y0QH&(4ws%U5J4#ZyEy=mfmH8g&=S~fg}Ka>)mJJe4VR2#yb zKu(UuTtQAwE7`=W;bLXaPeh@I6iGC=Jyn@u%onr_J+hh5wUuH&di2EnCp z`}%>;V_-7IxT*Ec7ppsr$Pk}QwwEz=_DC& zdH}2|_l}SBL>;-H@kz7m_!&o%(8=$gZ8CScWD*;UDXigWG>!zpNMGx`TBerkgM@iF zg@ao_F@Gz?CtZG;47P!69~6E2C!k9^uNBc2G)z?B?=N!g5V(8n*CeGq{{=}Y4yAm|h7`6GPH#q&jQkJg${xa+ z0_WEvd$};6rg!E82MfF(Wc%QKxm2ak7E=UNWSCZnIKggnImd^a=BG(|*d%N#Y!465 zK8KRVL?puD1(1H@0wm9Gvx(!G9D@6{@>4a)hEsdj?LI}1z4_RwVQG&a>sWeRzaD-U zn3fSHUNwBcP$BZ!h_vYF0|jdBCo%m|D;+qdd8Se-a`U$5aC%}vn_OE<%cNsJlJs(j zgQ&}O*!JbAFD&gk2BV8bZkH~xE#7=Vj#_nHFK|Y*kN{Ep5p>OCeL<0J|Dc*RtO!aJK>rS`||&ENd@%yxU`12Tx@d zJ?AkB_)@BIdRnesk?DLTgLhai6Nct+GDXk2ygE#t%h1{Is=OQb(ih}0N=-3ogW9Cp4VSdu} zNsVdhI(ev?lh?TvjyL(V*1fb=9W=M*M-FeT0y@d>BWiws>fB7Auh?7f8LU-pfprtw z^nt}pv1rUCTYlgP^45q@jOlzhjP{VSw1G)|Msi|K;%;fm91-zlOQH@#V?lK(eDR`J zSLzd3>Tc?RcPB=2CPHE$9Sj;q`m`u&#MNkHvG;<)p95*A^Q@pCu&$zH>)%q<*3}%Z z&!FUt55!eaLuz6Yw1SMU(1$FN)mwrK?7q-W<89YkWNz5Lefz3ayX&iTbab|3N)ko? zGfLKqA(qOi-VV{?$YTFzi^Gt(p<^hauo?p0T}{OAuT~=q^9%4t$W^D9`{I`J&m7}P zTdI`EgBJk>@qTNfna5LU_vJ-{NwdKPOWF>CA{9SX2F!sZiPywI<4dM5arTYk~&r z^n;_LJHZJ6xRwnSD#9m~8_0e{!+mk975R4%73!ZxDc>t zsKYi4$_pN!e#K?N!r0xPI{a(6Fidjb>Ig;RauabwI>BKOdl{)r`~;m z^{Wr~^xoZ0^IV8h%H`7Yu?(JFU(ZWw_wTH`*-64OI4qYPWyY~fXh+^U^K>gR3_$}_ z<12V5e`4NNmy;hYHecjk=%i8?SL?MI`jEp@V3x>G%$|EQ*$fWdPyhL(SNW%k`+-L37h8QkE>5~KIFO5wW1?@sx2OOaPIZKkJ+avS1af0rJ7%&u6A z6l=11v~PHSJ05)eHL|rQIxuz>wn-gbJhIC6W{$~Rd1vW6*;>jHPYf5x-xkp8@ zKBtT)D)z41BQ`UvW#PjP?4;hM35QPD9!}19&QK1X0Pb)A7X1&duZ!7=@)QJZK^8=- z{+w)qP7O-(_B)ir!es7v%X`& zq_kQkz5&PAz`SY^#wybAoG1(XdF<*ijpal|HGy%F*9P8?2F5i}(-_RgzB^(m`oWP| z9LGL;(-!Rd<(h+hg8L1!xwU~Sa_Jk2(M_S4v6@uE8gHeVp}2Cu=hio>y%6oAUAs#} z<>sQri_gHBd5Xps`5b*&H=RG=tl$|~@jmD*N6)b{)+cK1?j2a>r#2YSlM@q6RzViIK*M zYzqPhJMJM(IlcB2fH48D&j0vYiG_CC%L~xv4!(LUmySKA%-+ud+d;7Nyz<3h=ahJZ zlF2au()V_pfk>3TT-6`lk^1Jo$kpo;@Jnu==9qy>yd-@(`o->LubL`Bvb zZN~&~8@L+-%^DaJGkgD3l#qPDizH=FN-Ipp+b-JRmx-htQ^+J>I@%GZuKZ5c7t;m< zwJ}24_ew?4mE={fqzJ15C9BKtm%`z5qv6dl%)G@xYA0ak&tePBqn(_VJ!o6_)2YA9le zZ<48$gs);6vY4(ICuma|V9Gh}G?1lbV!M``hSh?*IJs58Q426L3^eZFr{hsq6vR2t z*1N}Hd)PJe7$cd9h%*SXQ-mYQ-iUsJ)`Hm`9W2Fh&KCmiXzAT6!r}4fl$4~%F-rNP z)7wALy|-6tE8A;~CgVT{-!E5RHZKEd_5tvLq%b?&+Dq0i;^#2SeS8X(l3WW^J{Idx ztpkq+l6VS^Oua|P=4JOp&j0bGnA9G!Z`UOnBSA<&F>x`zzH#L*&xR>})&MCa_#t|T z=nhp1oi_W$Ev+NTj0KN7d46W~r|<6cy7%p7@n0mt_cG)DwhYusq`BKC1N_$mj6_;+ z`e@wiuZJRWF3oVm{_%4P<})-fMoxC#?LOw1ues^y+l0{$#mf^ose2tdO9CgC%Kz#7 zn(meS4-d`a7y^IOeeSsKs$}?#_7gEuJnnS`q5sUKrt*?}o`*+%tfQ@0G85>^rM`m? z?))2{U#*`lu~FyUWZBuOZt4njeDjf~7t&aegb#r*6T^eqPURqE0xd@C7_ucNP{7A+ z6L>gDBprPJj(EmAFCHR6u(n9%TuTUr*ET#lE)U;RCSYHcZ0JXXEE5v4L@#+!9r_vn z{#ojyQV91Yi9qXS7-&I^LgNbI5@YPR;*|S6utfIaC~we z=5nDOyBM+$Sl5XVpz&zeQHkiIGq~-qE{ejrmh$wBhV{3lP`u7M8L}*i_zeAxB$M+B zszvE)9BV1s^!NhdZ@E(Qa^obHsc`jeCcesVPGJo;rUHMbW-T9FvQ{sva z3%Yp9d5QKIO03pr>bgoUnC2E07pItwJ|spY)R=ob2`>IfD3O&mREl3Vc|bdS{aaqj zS~4&<(0%ezSMJ41+!mW8)m9OOR4el=$8JSf?2kp&7`uA9yVD^f66(+`I$yP+L!SAX zc{ZXU8vSJ()+qWPz__#Ck)|Df3Oig)5}uO=E)zN9Mt*M+2}-{rM^ndRx|iy`{{|_T zkX)dWj@3>r&KSU`53Ksci8`8G(fGuV&)1F1JyhYf`+iecQJCdLQ7WWglhzNF7MlpW-JEL#R0p8X;}x*1gC< zr(3CXag3kC2zINj=X%N%*#Ty1oAl|Uhnd+;OqnGq#_GCjhjR$$D zQn^0joSXxV@06y)qv(PJ(QT0m@KK)UWkeRms2SCmKyF;{FidmrAj#3qxFg3`Ar3wU zgkVsXskRU!+HbzIlVPd^)#Pe1PZ1&10)v0@R)ue&4PDmfOn)0d+xcb5l?M5I;W$it zzkH4$)c54odCD*bF0}h9H+d3v^Lh%ntM+e=1nI4&YJAiIGrWG)iPMGLjOAQYiA`$M z8kwf)lLlG~VSl{8F9O-GVM6Tj%-*fhd=NZ*0L>i)3Y}cCygIE7hsa3n*L`*I~?lmF~u*nR;^x5t+l~` zu*SZINhS z7K>|)hHaaD^V_~Mh}}G?ZYOFw=N#kxEn6{ThAAmUGbca&bYJjwbJ-&9B_bxFcNMjn zi_#?=mR1tR!93ZcpXBRzSeL4naEn`4kau=Cs9sJOQL+gfsW47tPAdbsZS#ul*pY< zODoX;t(wZx^;1i9`seS|I(oDjkH_3Y&6yd%a`})XHV=@HlkLV885Gljg?aEEM`gFC z`5FdW6H+L2*0d!YW?x*L4c6OOJxA?6%POopIMa1u8Fm<`J4RF{o&l>G701?=!+k&2 zG1t;xk!Jrsl`oDuZZ_Ty+W>U8%8vl|$|$YDnsfL1G3Qr%j4wh@S(mPKcr4j=2(fd- zAwql@RYokgu?mcVh1RXpPB^+7cHbsHQ>7mDkVeYzKu7b!MjRkCF|9SZnv5ECJI240 z1xmX!7$yD~+-*!=^yc1{g34mvAXI>0X0I0#O0B$UW^mxZ0eFC+SBpZke|iPExNk9B zx}IPUepmEwI<$CF&hxckf~C&&Yu7+G3C$U?)Zs>7Tu?yM%){&rmR~7ryDf$5JKU+)UB{(Brx#t#S4hL!Z6L)v}Si0JwL^rEr%hHyR`*MlUjh$iFpn1qB1mr6Fy!m3)+Dvn+ zC6>K6lu;wMV~r-l?h@sT_46mqLKQ*9JdlD)NYv7+M8U=xz*I3 zs9{!Nx?=l_BXk}Bzh3}H5Y$08Ui-BxSLS7F-ZGi5=BH4GYNq0-N094_moL-D=^gNC zuo$y`L*F-9&YT!L$E2h?xed-g?WbBM6S5S`ocacCv+zb&KqVZ<50eW(BKiCfuw@0wpZ`LXGVSPW(t>@k(XPi62V=N#oANJErzyfP zyF0{#$l}y1wk;wGIYd`o%i40rYb~f zvjztp#?8^0JUza}#OY4gHw?^vS!7OQ%jmg+J-`0(smzbzd`?v~kv&egyighbocASD z$|IC>Fk^mk+x^Z{^=!e7)-!5)1#>vd82{Me0~^s9T%|K@bhDge%uBwpBWAL|pSUxw z>5WPMGYa^>GRA(*FrTT*zGp|!h5EM-RvYx+8Q)FRV$Uv{E+E7vvnlLz3+@tQJ%8y7 z@Pn()lm@5jcwOov0m<;&Gj-JzCGD$P**J_zE{sQ`qQ3A)Qu#OG{{N(^N)ecWMt}O5 z$Yhx>@7_4=>BCY!Wo^w5xm>)hQDyXECU7mVbwZnvh4iOh?TS}BGE-fA-(e=S7EJC` zvm_{qwIpEu=W`Bl4hTRH(nrU~moy5deIM<>@170pyM@%IfIFSyp zRYv0az{h7F(jJ?>)T@*@fv@%PXNJfB#F+;P40Gwfphs zV)QMvB`_M4z+-Sl7$!_+L`G6XTsD zRy<9%*QaZj|1YfCAJ*Sbu1^21VUL_GlKoi_SoS5WAF*tA6e3Hwxw%z>5N|Qlx3a$9 z%8c2rOuIuT`J>vQXd&2z-v^`X-LPWZ<4-KfwcO`-`xPN5s|IRCTP>&%uXwU_nz?m{ zr0YqdUWTyYx3Tc!Q_wg2H1w^%ds<~~tJQ?zA5t(wE3`lKxrtIpFJmz9wfs^1z&I+E zret_qY4Rr)Lpw2l`X?4m7d-QRbKD$L7(a507=P#QAKQ$DN=$H1MS53A2>DWmsn)&Q zxSG6G%|2tyQYFS{glNM^Z@4YQbI$R@2P+fbO^x9r#N%`~abFig{>@t`yjX zR1Nb1yOR$ky3=-!ojwjmAox>C9{(VW8lWBoS??>RPBysQ!qYoc_Ejhmeh5O{&<5Ir z=n5!r=ddlU26QeB6FIt4@lA34eheJ%XvoTxLK^W38HdjGrp*4gc@X0Dch%aVXcP3n z@eW(1tCufhn91q(FmJK}hZ`+()J&!Lt?G1AG^54M?+IJ5Y%Q_g8`s?4;{eS5!8VHf z9w~I@>eGx$g8@lKYKS!e_CZ@7ZS?suAsNa{UW4V*e?J;Lrs-*5ZlmH02cU%lr4eRw z2M>m8$%?>owGWd8)*|1_u;B-%ov_@V61P8m4gyxk%ETTQmS`(=bxuFc`$Q)bI*S4I z)?+b7f1zz0+A`7qP`bkHlh_|w-tNYFe2)FUGogcVsL?H*&vlN>n(is(2dyONy!=WY zb9mkNhnMQ~zp0`UwF6qx56AoNim-7K9f295aI@{e>`4tg)Brplw!l4M611hcrG*kQ zkjXc+hohR?Ptw4^01RGp4}nTE?RV!BBR=humq+{Oz6JCd$Bm66!wRL7jo)6Xv}B10 zMY7^ISw!g6v^QGeiC0viuel0LvB@e9NgGYnkI+>jDL;h@DgP&0Y##5CuM&|&O1D{v zEeNcRuc_=6_M(voP0(G~^5Y#m)j3W&hmH2qC<&1^#HCWSBUPMBNUuC$LxiRQO6c-W z#vOrM?F>Eh2us(i7`~Ytin;jiD$R{iU57Dm4b|mhtoNcWhME(WwjG&Fby1j`T`hdJ||gF5OL*e-)=8 zhs7P^97sq`+^b~NjC!D=Q8&S(-&P?&ijeAHutBQSi3&FpNngSPvNHPKmN_n3FaVk^ z#^m;d6hTPJ&rf(}uU7PrUJ}Ej!yTysN}eT=|Ks!6?7I1;mC^Iq*{j0XnJV>7?WEIg zXXm)NpU;^X>!IFUO^k#E4;zNV@Z61hKBb*kZGrvH+p;q9$`Q7BAxW#|U5?IgKz}jU zHct?RxCs-NZpp2x(X~6g_i6T85BFwJ1*&V_t^B6guiSRa9Fu2X!qFarE1(e5H?l~{ z>f<$rz`NB<7pKd!Tct)&6sJH!}?+~yMu4#qZji4W_ejREDqT*xRC>8xFn?} znC(=2`+KajK)%AL7FCa=V7$kY$119-13YO6Kf($okQ%n)*3}H=4zb05-sUta&Lh2I z#Zk!G7S*O`8JM;pB3Zzk4P%V~v$qE@B&OuFl_)hC~jB97@Oz zGiw29M}k7T#MCTFUr-S+h1GXzM^L(_%(NHG%T4MoeBMCWxB2U(}*5 zf;cPDu-kY+E&yoxUw{2&(^ccuaCWeRZ{}o6guMif@LHQjbzS#{DWX|Kh<51ke1q67 zsq5R{o+e38n=-PqsL^5LqVGDZqe^;4W;m@HQQ}%ja>+G%_h{8vEjA)CZoSSg=X(z? zCQ@$-AhINjdM&l>(6rH@ZML_kgX~;g>j>y_+Uk*?6Bd&Xs?d zoSz|C&mx`X;E+VrBlkD4`fvM6=7+#_|JWGs*(U~Hbu?4%V}OGh=Qzh{{;1daMJ2F1 ztQ}2fC!yD9XLl)(^e)WUP#W=rC0#a_9o!9;VZ=h*auPWD(wBEl>^^Eat9QkeF;BSR z-a>bZ7yhc!s_)3jaxR8&6GEQP%~B3p1k9gclnK4SrCAhq{7>OUUvub}dL3wj-O8xquuIRL!l~v#4GdaGJ4h=1yZ+;*55i#vvsQ7xUP=EYr z0OO0#52YQ&P4ABV*8JYJ0RO)Of?0dU5$O-!rcLvf4eC;xbIrhZeE8aLBs0qaNW;Mj z?*exYQ)uCg1Lo|5JY={9TxNUgmApK8_HFrti59N2mDm${ZjIzVnEbH^UoL!BT|WAI zQ;se}1;;biZM?2$(u5xDBMmGV5lm-)J&(eE8g_LN*0PTSTYmR(8+m%=hc5u>avRtG zPd;XUm=}FnD^dHN_nQ@lE^fIouW9p(-0eDZmbL0WlB{F?cp-y%dzb)4@x>}g^>!aS zR?hC!+cG-pES|~K>6)=OZJAz4)JR~ot!PG4)Lsn@1H%ye^_sWpBa|b?UkF>&{heIZ zU}MYLo7ZSFnjGa;C|u7~EU-FvO~6tN6W;OpV;=}usC0a##t!K_X|{EK96!1E*kN8l z#)#W?FX@Nhcqb~Sii<_MO}`s*LU-vVUFydo?Tu%LjSN#=B$bBd9y-rzAJ03^IcLZ% zCo7_jFc@glum9vGz5dFzYdXm$S&7!m_{QgSj-Py2==eVR=&ZUktq}#hzNv<97zFGv z9BORg>SM=G9JIEzc24_k^G0@WhVqx0GAE)tltSK1euSxCM zhq=J+(xWF^17+==6|5<7PJnHa@t03k1MqmUynNNvsl{WAMR08I#<5gO6BA35DmQch zpMzNUHd^y4)G*Ey;|n{pi@9TuxY|4B^voeksKEu&kL+1;xyzSJK`!Z6M&!k~{ zHV)L;z~*?wyuKYwI-1Y==XCJ!wb`?YP-VjaX0B!?s{UoF_Ki*FR zGykI{r`qDsoK&On(bfpR>l2-cg?wlJPVn*37(B)?EX|)XBr8c_%cW1gnexTr5+fZa z9Mh(@gL_U!0X^RFwA5I?X-0HJnrT%xT)`LVK1OQYw3EFk^yYLQ2_|bNDJOQ_$J@{_GgeSZ=G~M4h`mvWwK26stY2Ss0t#en+0F&Bl zROE?zfiY{wO7{i~55%>e9egL&KU@)aVxn#DL}W(2^F&^fi}Hst-^TUjQ3h&%T%lb% zq^B9;)>qpo^*N8PA%@?d`E7!-8ieyuWW zs%yrIg3Dwx9z!ZO(FXUUb@qoM&4NQpuS!jfuCtM;mFFTJhh5(NjNN|@hjH)W4(4NW_|;zgUe{jEq0MwaUaZVdi0gv zO~pm*J!QfGBQ5PC=#6j@jT=zU&{FWDm-N05Y5(KI*yB>?7@E|?SmU~g5A=@A66Y5* zZLW|IgZ`U41-ePchbU6mtgWYHbFe{;x|BDKiKXUTn8#`w?YvLcwRk?ugVb#GRX5v~ z_4Uo8N@*mXFla5-rSR33nsu4c)HA%DsO_BW2NDAx5ewMNlacwLio)lTom(PHjG^I< zbC!IVJF#AXC$v!e*x0?QL;4(Bhbq{e*W_1fN*`wr<`r@BrVeNo?-?3r@|r&x!{sUsq=&z{apL(XaE|Ni^$Nh(?n>Nc?|E6|s1ksderjR}HUc39&Z zr?6+nZJ|Ux;;QZTFyp4-wSwku5&Qk3O zPGfHNs#UQs)6*wfJ6kOE$7JePJ}6|$Iuy60Tybezg8jf8=Xq~qwA}{`=hF{ejLYn{ z@38ZrDd+EcRX8FMb5%R_W5ILLilIBh@}h>BA{0OEit|}&>h&Il-5QDyHI?2yZNEjT zED))B*1jSw@aU89M;iH^>-+N>mqmTz{Bm_5uW^5Z?fB<_&(#do)6blsoi$F3B|6cI zC7k6BcE2zC{tlq8%!FaWTW5n(uNSty)Z`_)1za2GmUMP5EslQfjfTaeZhYe+x{d7u z#M>Sj$h=oy^=0a=#@L-TJ|zYmFWdi+_HeJK-uNFUy6YOXdp1-^w-4tFIiaa0f5#G@ zORQD;jk`tEC2wA0=c~_|$OW~Z#%ai>E#aGS^QLl7PEOI6L(%@u<6cp*8LzbHN@in4 zww5z%E!s0WnmPQSqtWM&I`_xXeWrs3H8C+*)Vhkg*1cuAd$-J!l5VK)NShlJ zc6EVSDPPl$Jxj06=90B|zIdOi=`8J}xm*^)c{0oQE#DNqpeAiDrS!SJ`Ie8;Z7(hs zboiYy)ce%n*WuUW*3;bgG5ZYmcSBZV)Mq+frTF1vu2tuMyR{<6V6W5pU?(-l)5C7p z<}!WMS+e`?Xt$d1VVa2f8d1?~)hE$0jvbwkZ@=f z8l0}4u-z<~6#7LnVBNZah$s1~2LlW#pPHJE85xCUkDpp`v#mROuf*fvs#8yf{=B|1 z==LQyzPGEh)4$Y|mq*cPKHJ(C+fY4h?9*Ze?;X&ibvZVTUb%cX*x!FdM8vA5B{tTH z!p*!MzDAxlx3*_kf84RDu8MO*eQD|X`lytYyN$cER{ed}Yeb-7cq!%W$}{g5vE-(& zGxfe|-js8kcv%&iicO-Y_B!{tDZ~8D(sqwQ1|tmIp(^)_*ZSckN+Nf8XkGfb*>9`?(7nSEIJUH~QUfR?{>&mX+sE*i?BCd5||KY=an-8|#;C;!uhDGLO_4=2t zR!t5rYPmx$CHyTH*xGMCJ{e59bFJvsw_p3;`M|NwEu)beH46%uhI#W|o_G^*@6x#Z zr>9qDDQy;&KXrKNFz;cGg$v)<*?A71KN8K!*&rk&AJ>LEH!cXIG-*rB#u1@>%>cev}v7FN*q}K+HW7exb-|<{# z)8JJo>Fe*Lymry!op{-Lq~|C24k#zdXS literal 0 HcmV?d00001 diff --git a/docs/diagrams/viewListOrHelp.puml b/docs/diagrams/viewListOrHelp.puml new file mode 100644 index 0000000000..35ddd01153 --- /dev/null +++ b/docs/diagrams/viewListOrHelp.puml @@ -0,0 +1,37 @@ +@startuml + +participant ":Parser" as p +participant "groceryList:GroceryList" as gl +participant ":System.out" as sys +participant "ui:Ui" as ui + + -> p : viewListOrHelp(command, commandParts) + + alt command == LIST + p -> gl : listGroceries() + else command == LISTCAT + p -> gl : sortByCategory() + else command == LISTCOST + p -> gl : sortByCost() + else command == LISTEXP + p -> gl : sortByExpiration() + else command == EXPIRING + p -> gl : displayGroceriesExpiringInNext3Days() + else command == LOW + p -> gl : listLowStocks() + else command == HELP + p -> ui : displayHelpForGrocery() + else command == SWITCH + p -> ui : switchMode() + ui --> p : currentMode + else command == EXIT + alt commandParts[1].isEmpty() + p -> sys : println("bye bye") + else else + p -> sys : println(GitException.getMessage()) + end + else else + p -> sys : println(GitException.getMessage()) + end + +@enduml \ No newline at end of file From 9baa8f3237facde56f53c3e6c9aa1f55e7957774 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 22:26:51 +0800 Subject: [PATCH 223/339] Add class diagrams --- docs/DeveloperGuide.md | 9 +++++++ docs/diagrams/UserInfo.png | Bin 0 -> 41707 bytes docs/diagrams/UserInfo.puml | 33 ++++++++++++++++++++++++++ docs/diagrams/foodClassDiagram.png | Bin 0 -> 12285 bytes docs/diagrams/profileAndCalories.puml | 21 ++++++++++++++++ 5 files changed, 63 insertions(+) create mode 100644 docs/diagrams/UserInfo.png create mode 100644 docs/diagrams/UserInfo.puml create mode 100644 docs/diagrams/foodClassDiagram.png create mode 100644 docs/diagrams/profileAndCalories.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5ee647e452..4c7c061638 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -18,12 +18,20 @@ * if mode is `recipe`, execute `recipeManagement` ### 2. Calories Management Mode +This is the class diagram for Food and FoodList. + +![Class diagrams for Food and FoodList](./diagrams/foodClassDiagram.png) + +This is the sequence diagram when `caloriesManagement` is executed. ![Commands for managing calories](./diagrams/caloriesManagement.png) * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. * if `eat`, store the name and calories of the input food * if `view`, display all the foods consumed ### 3. Profile Management Mode +This is the class diagram for UserInfo +![UserInfo](./diagrams/UserInfo.png) +This is the sequence diagram when `profileManagement` is executed. ![Commands for managing profile](./diagrams/profileManagement.png) * when `profileManagement` is executed in Parser, different actions will be carried out based on the commands. * if `update`, store the user data required for calories calculation. @@ -44,6 +52,7 @@ To edit the information of an existing grocery. #### 4.3 viewListOrHelp ![viewListOrHelp](./diagrams/viewListOrHelp.png) + ### 1. View all groceries added * First create a method in "Grocery" class that prints the grocery in a preferred format.\ e.g., NAME, AMOUNT, EXPIRATION, PRICE. diff --git a/docs/diagrams/UserInfo.png b/docs/diagrams/UserInfo.png new file mode 100644 index 0000000000000000000000000000000000000000..b99af05f00c1ff81c8d5e93921711b8c4e0ca498 GIT binary patch literal 41707 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 Y|JPh4Lx~3CXAD5#>FVdQ&MBb@06Q>wegFUf literal 0 HcmV?d00001 diff --git a/docs/diagrams/UserInfo.puml b/docs/diagrams/UserInfo.puml new file mode 100644 index 0000000000..d751eec290 --- /dev/null +++ b/docs/diagrams/UserInfo.puml @@ -0,0 +1,33 @@ +@startuml +skinparam classAttributeIconSize 0 +class UserInfo { + -name: String + -weight: Double + -height: Double + -age: Integer + -gender: String + -aim: String + -activeness: String + -BMR: Double + -AMR: Double + -caloriesCap: Integer + -currentCalories: Integer + -calBMR(): Void + -calAMR(): Void + -setCaloriesCap(): Void + +UserInfo() + +setName(name: String): Void + +setWeight(weight: Double): Void + +setHeight(height: Double): Void + +setAge(age: Integer): Void + +setGender(gender: String): Void + +setAim(aim: String): Void + +setActiveness(activeness: String): Void + +getCurrentCalories(): Double + +updateInfo(name: String, weight: Double, height: Double, age: Integer, + gender: String, activeness: String, aim: String): Void + +viewProfile(): String + -consumptionOfCalories(food: Food): Void +} + +@enduml \ No newline at end of file diff --git a/docs/diagrams/foodClassDiagram.png b/docs/diagrams/foodClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..88c56b5b7a1fc78ff5fab02c578541c81b2e9275 GIT binary patch literal 12285 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/profileAndCalories.puml b/docs/diagrams/profileAndCalories.puml new file mode 100644 index 0000000000..89ce2856f9 --- /dev/null +++ b/docs/diagrams/profileAndCalories.puml @@ -0,0 +1,21 @@ +@startuml +skinparam classAttributeIconSize 0 + +class FoodList { + +FoodList() + +addFood(food: Food) : void + +printFoods() : void +} +class Food { + -name: String + -calories: Double + +Food(name: String, calories: double) + +getName(): String + +getCalories(): Double + +print(): String +} + +FoodList *--> "*" Food : contains + + +@enduml \ No newline at end of file From 18cbce1e805b8eb828eee0b0515da4c1c22ac108 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 22:31:11 +0800 Subject: [PATCH 224/339] Update the old sequence diagram --- docs/diagrams/caloriesManagement.png | Bin 52280 -> 58960 bytes docs/diagrams/profileManagement.png | Bin 66982 -> 72711 bytes docs/diagrams/profileManagement.puml | 6 +++++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/diagrams/caloriesManagement.png b/docs/diagrams/caloriesManagement.png index 00c510e2f98b33065ba4f168804e4fbd82f5a1ee..b975fc459e615f17bbd3069659269227995229ec 100644 GIT binary patch literal 58960 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 literal 52280 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 z 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 diff --git a/docs/diagrams/profileManagement.png b/docs/diagrams/profileManagement.png index 56a54c6ad938d8b162760731aae9cc7cb942f9e0..dd7c0b009cc123e3986a41cc96a3e3b7bdb68273 100644 GIT binary patch literal 72711 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 z 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 literal 66982 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�bry- zkhe@dElt-~gseUkF~75>R#d{OZ0mebS zF`5t0+=%s|r1Jwq9^satt0O0YkGDRi^Z~)v4qnm8K2#$rkLp}G{$R|0LdpJu`o_es zDT6WPiRW|L9b?{bII{&EBYr+wvHXNd%X5ergm|BjMB$mqb{(@9 z+0%H`$(fYj>r5WD^Uh#F&Mt^GU}?+2-Q0LjO36$5GbBRZ#=D}K`E9w5$Wt^aw0m%* zy_TlSN4&N_u@@tA{7tb)tz|Rc)e5T?lKcw+UTtghuSNG44&RAMAe?yzyOd69K+DH% z1L|v~n+`gq!HmVF?_+<1qM2>0`cZ*1y(68LPyHf0Xw?>H;Jh`f_cC0%&;h3@i~>r$ zd7oPV1D)#Cv`Zd_m!gpRYkvkWu~LRq4d;ZPN6z@iL~oarK?aYl4nMz=-_bm#?T zjjz@7>PQ_725yf9b)=_<5yo0u6)6QrRwQnXjow}K^&|;S2Ix^2vFJ`g`(2q_vl-+k zP4VRx1A`+zhPAT=hMOKP4$Ygr@qrgq?6kaF^Uq2eHO>${zdp4~KeY7Pq&nbhalQBV zaPAIC$B|ZpREbM^c*dP`cfNzMo-@i9KqBbDVLR(I8_*bOa>C(1AJt|~;#h8_A@r8JNueyS%5R-sn5*QLKA(`ZQCAV^n z>)v3UXo>xA4OUCzUMJyZx06*u-Xy$$0ghB5T5{BO`eyjIDckWjt6DkV3ZuCJ_3%ho z{wy+H@w(9_w{97F&2?v6kx3fr=;()>NHza{Fo0Gx^62?=i%;KE$V?7nc$u0DsNlsu zMNu;|$ay`@Dv>2e3h8$qsr~G_g@NF1n2&pakBf#!{@QDeS7*$vM;v-A)wW9r(zzBJ zTayP8f-bgPo2XAj$2|=XZ%C}qh4&O4D~>t^{sn^E)bm1UFx)O4%{-4f0tqmOOegzT z#l2Z8TKO(NXiS^{KyORn9>c#T^VUFUY_~xS;AeF!6v9vfgSG zR5&8hn|p!`p6^($gfboY{x7@>%%*JkNTqF9G6rW<-r&QO)y;FHETdv{xvE@mVW5U% zZ&!Bpw_`iLOR#yLoG;6l!V#~<_pBjkv9WzK8r5qn$mOmML78WBH)W{dXU+YMv&82a zM-en~d)==??OR@cSd6TGE#lDX#m06wxvF3I|Eq8MKeU_+t@T6)wTn+{xzU77U wZvVZdUqecee;be-7eJ$)096V ui : displayHelpForProf() else command == EXIT - p -> sys : println("bye bye") + alt commandParts[1].isEmpty() + p -> sys : println("bye bye") + else else + p -> sys : println(GitException.getMessage()) + end else else p -> sys : println(GitException.getMessage()) end From 55bb7bf14ee34886194092be3e1562f19e2d9686 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Thu, 11 Apr 2024 22:48:30 +0800 Subject: [PATCH 225/339] Update UserInfo class diagram --- docs/DeveloperGuide.md | 11 +++-------- docs/diagrams/UserInfo.png | Bin 41707 -> 64211 bytes docs/diagrams/UserInfo.puml | 17 ++++++++++++++++- docs/diagrams/caloriesManagement.puml | 6 +++++- docs/diagrams/foodClassDiagram.png | Bin 12285 -> 0 bytes 5 files changed, 24 insertions(+), 10 deletions(-) delete mode 100644 docs/diagrams/foodClassDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4c7c061638..09afa93d9b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -17,21 +17,16 @@ * if mode is `profile`, execute `profileManagement` * if mode is `recipe`, execute `recipeManagement` -### 2. Calories Management Mode -This is the class diagram for Food and FoodList. - -![Class diagrams for Food and FoodList](./diagrams/foodClassDiagram.png) +The following is a class diagram containing Food, FoodList and UserInfo +![Food, FoodList, UserInfo](./diagrams/UserInfo.png) -This is the sequence diagram when `caloriesManagement` is executed. +### 2. Calories Management Mode ![Commands for managing calories](./diagrams/caloriesManagement.png) * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. * if `eat`, store the name and calories of the input food * if `view`, display all the foods consumed ### 3. Profile Management Mode -This is the class diagram for UserInfo -![UserInfo](./diagrams/UserInfo.png) -This is the sequence diagram when `profileManagement` is executed. ![Commands for managing profile](./diagrams/profileManagement.png) * when `profileManagement` is executed in Parser, different actions will be carried out based on the commands. * if `update`, store the user data required for calories calculation. diff --git a/docs/diagrams/UserInfo.png b/docs/diagrams/UserInfo.png index b99af05f00c1ff81c8d5e93921711b8c4e0ca498..a14c1dba5f3a0941f9c30cefce66f52ab479a5e7 100644 GIT binary patch literal 64211 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 Hm%RQDuv9hb literal 41707 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 Y|JPh4Lx~3CXAD5#>FVdQ&MBb@06Q>wegFUf diff --git a/docs/diagrams/UserInfo.puml b/docs/diagrams/UserInfo.puml index d751eec290..17514a9a08 100644 --- a/docs/diagrams/UserInfo.puml +++ b/docs/diagrams/UserInfo.puml @@ -1,5 +1,20 @@ @startuml skinparam classAttributeIconSize 0 +class FoodList { + +FoodList() + +addFood(food: Food): Void + +printFoods(): Void +} +class Food { + -name: String + -calories: Double + +Food(name: String, calories: Double) + +getName(): String + +getCalories: Double + +print(): String +} +FoodList *--> "*" Food: contains > + class UserInfo { -name: String -weight: Double @@ -29,5 +44,5 @@ class UserInfo { +viewProfile(): String -consumptionOfCalories(food: Food): Void } - +UserInfo ..> Food @enduml \ No newline at end of file diff --git a/docs/diagrams/caloriesManagement.puml b/docs/diagrams/caloriesManagement.puml index fafcc7912a..7a2d12be9c 100644 --- a/docs/diagrams/caloriesManagement.puml +++ b/docs/diagrams/caloriesManagement.puml @@ -30,7 +30,11 @@ else command == switch else command == HELP p -> ui : displayHelpForCal() else command == EXIT - p -> sys : println("bye bye") + alt commandParts[1].isEmpty() + p -> sys : println("bye bye") + else else + p -> sys : println(GitException.getMessage()) + end else else p -> sys : println(GitException.getMessage()) end diff --git a/docs/diagrams/foodClassDiagram.png b/docs/diagrams/foodClassDiagram.png deleted file mode 100644 index 88c56b5b7a1fc78ff5fab02c578541c81b2e9275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12285 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 From 95697c03b514c1fa1e0910d117708390beedcbea Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 22:57:24 +0800 Subject: [PATCH 226/339] Add save and load file for recipe --- data/groceryList.txt | 4 ++ data/recipeList.txt | 2 + src/main/java/git/Parser.java | 7 ++- src/main/java/git/Storage.java | 85 ++++++++++++++++++++++---- src/main/java/grocery/GroceryList.java | 19 +++--- src/main/java/recipe/Recipe.java | 23 +++++++ src/main/java/recipe/RecipeList.java | 8 ++- 7 files changed, 124 insertions(+), 24 deletions(-) create mode 100644 data/groceryList.txt create mode 100644 data/recipeList.txt diff --git a/data/groceryList.txt b/data/groceryList.txt new file mode 100644 index 0000000000..ba53484f4a --- /dev/null +++ b/data/groceryList.txt @@ -0,0 +1,4 @@ +tomato | null | null | null | fruit | null | null +banana | 4 | 1 | 2024-04-30 | fruit | 2.00 | pantry +milk | 300 | 100 | null | beverage | null | fridge +ma | null | null | null | as | null | null diff --git a/data/recipeList.txt b/data/recipeList.txt new file mode 100644 index 0000000000..2515c70e68 --- /dev/null +++ b/data/recipeList.txt @@ -0,0 +1,2 @@ +as | as | fdds. sdfsd. sd +fr | b, b, b, b, b, b | c. c. c. c. c diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7ac570468e..139a2186a9 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -49,14 +49,17 @@ public class Parser { */ public Parser(Ui ui) { this.storage = new Storage(); - groceryList = storage.loadFile(); + groceryList = storage.loadGroceryFile(); foodList = new FoodList(); userInfo = new UserInfo(); recipeUi = new RecipeUi(); groceryUi = new GroceryUi(); profileUi = new ProfileUi(); caloriesUi = new CaloriesUi(); - recipeList = new RecipeList(); + System.out.println("beforeload"); + recipeList = storage.loadRecipeFile(); + System.out.println("afterload"); + this.ui = ui; isRunning = true; } diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 7d052a81eb..24be3efefb 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -2,12 +2,16 @@ import grocery.Grocery; import grocery.GroceryList; +import recipe.Recipe; +import recipe.RecipeList; 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.Arrays; import java.util.List; import java.util.Scanner; @@ -19,15 +23,38 @@ * Handles loading from and saving tasks to a file. */ public class Storage { - //private final static String FILE_PATH = "./data/groceryList.txt"; private Grocery grocery; private List groceries; private GroceryList groceryList; + private Recipe recipe; + ArrayList recipeArr = new ArrayList<>(); + private RecipeList recipeList; + /** + * Saves the current list of groceries to the file. + * + * @param groceries The list of groceries to save. + */ + public void saveGroceryFile(List groceries) { + try { + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdirs(); + } + FileWriter writer = new FileWriter("./data/groceryList.txt"); + for (Grocery grocery : groceries) { + writer.write(grocery.toSaveFormat() + "\n"); + } + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while saving groceries."); + e.printStackTrace(); + } + } /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. */ - public GroceryList loadFile(){ + public GroceryList loadGroceryFile(){ GroceryList groceryList = new GroceryList(); try { File file = new File("./data/groceryList.txt"); @@ -35,7 +62,6 @@ public GroceryList loadFile(){ while (scanner.hasNextLine()) { String line = scanner.nextLine(); Grocery grocery = parseGrocery(line); - System.out.println(grocery); groceryList.addGrocery(grocery); } scanner.close(); @@ -62,28 +88,63 @@ private Grocery parseGrocery(String line) { double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); return new Grocery(name, amount, threshold, expiration, category, cost, location); - //return new Grocery(name, 0, 0, null, "", 0, null); } - /** - * Saves the current list of groceries to the file. + * Saves the current list of recipes to the file. * - * @param groceries The list of groceries to save. + * @param recipeArr The list of recipes to save. */ - public static void saveFile(List groceries) { + public void saveRecipeFile(ArrayList recipeArr) { try { File directory = new File("./data"); if (!directory.exists()) { directory.mkdirs(); } - FileWriter writer = new FileWriter("./data/groceryList.txt"); - for (Grocery grocery : groceries) { - writer.write(grocery.toSaveFormat() + "\n"); + FileWriter writer = new FileWriter("./data/recipeList.txt"); + for (Recipe recipe : recipeArr) { + writer.write(recipe.toRecipeSaveFormat() + "\n"); } writer.close(); } catch (IOException e) { - System.out.println("An error occurred while saving groceries."); + System.out.println("An error occurred while saving recipes."); e.printStackTrace(); } } + /** + * Loads recipes from the file. + * @return recipeList loaded from the file. If file does not exist, returns an empty recipeList. + */ + public RecipeList loadRecipeFile(){ + RecipeList recipeList = new RecipeList(); + try { + File file = new File("./data/recipeList.txt"); + Scanner scanner = new Scanner(file); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + Recipe recipe = parseRecipe(line); + recipeList.addRecipe(recipe); + } + scanner.close(); + } + catch (FileNotFoundException e) { + //System.out.println("No saved recipes found.\n "); + } + return recipeList; + } + /** + * Parses a string from the file into a Recipe object. + * + * @param line The string to parse. + * @return The parsed recipe object. + */ + private Recipe parseRecipe(String line) { + String[] parts = line.split(" \\| "); + String title = parts[0].trim(); + String[] ingredientsArray = parts[1].equalsIgnoreCase("null") ? null : parts[1].split(", "); + ArrayList ingredientsList = new ArrayList<>(Arrays.asList(ingredientsArray)); + String[] stepsArray = parts[2].equalsIgnoreCase("null") ? null : parts[2].split(", "); + ArrayList stepsList = new ArrayList<>(Arrays.asList(stepsArray)); + + return new Recipe(title, ingredientsList, stepsList); + } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ab2de51e59..8a512873df 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -41,6 +41,7 @@ public GroceryList() { groceries = new ArrayList<>(); LoggerGroceryList.setupLogger(); logger = Logger.getLogger(GroceryList.class.getName()); + this.storage = new Storage(); } /** @@ -53,7 +54,7 @@ public void addGrocery(Grocery grocery) { try { groceries.add(grocery); GroceryUi.printGroceryAdded(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add grocery: the grocery is null."); @@ -174,7 +175,7 @@ public void editExpiration(String details) throws GitException { // Verification and UI feedback GroceryUi.printExpSet(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } /** @@ -190,7 +191,7 @@ public void editCategory(String details) throws GitException { grocery.setCategory(newCategory); GroceryUi.printCategorySet(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } /** @@ -242,7 +243,7 @@ public void editAmount(String details, boolean use) throws GitException { } grocery.setAmount(amount); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); if (amount == 0) { GroceryUi.printAmtDepleted(grocery); } else if (grocery.isLow()){ @@ -271,7 +272,7 @@ public void editCost(String details) throws GitException { } grocery.setCost(cost); GroceryUi.printCostSet(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } catch (NumberFormatException e) { throw new InvalidCostException(); } @@ -291,7 +292,7 @@ public void editThreshold(String details) throws GitException { grocery.setThreshold(threshold); GroceryUi.printThresholdSet(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } /** @@ -316,7 +317,7 @@ public void editLocation(String details) throws GitException { grocery.setLocation(location); location.addGrocery(grocery); GroceryUi.printLocationSet(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } /** @@ -349,7 +350,7 @@ public void editRatingAndReview(String details) throws GitException { } Grocery grocery = getGrocery(details); GroceryUi.promptForRatingAndReview(grocery); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } /** @@ -465,6 +466,6 @@ public void removeGrocery(String name) throws GitException { location.removeGrocery(grocery); } GroceryUi.printGroceryRemoved(grocery, groceries); - storage.saveFile(getGroceries()); + storage.saveGroceryFile(getGroceries()); } } diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index afa15f720e..c761403c5c 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -41,4 +41,27 @@ public void viewRecipe() { index += 1; } } + /** + * Returns the title, ingredients and steps of the recipe for saving. + * + * @return String representation of the Recipe. + */ + public String toRecipeSaveFormat (){ + assert !(this.title.isEmpty()) : "Recipe does not exist!!"; + + String ingredientsString; + if (this.ingredients != null) { + ingredientsString = String.join(", ", ingredients); + } else { + ingredientsString = "null"; + } + + String stepsString; + if (this.steps != null){ + stepsString = String.join(". ", steps); + } else { + stepsString = "null"; + } + return this.title + " | " + ingredientsString + " | " + stepsString; + } } diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 5a3f4ae496..6c451e362a 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -4,17 +4,22 @@ import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import git.RecipeUi; +import git.Storage; +import grocery.Grocery; import java.util.ArrayList; +import java.util.List; public class RecipeList { private ArrayList recipeArr; - + private Storage storage; /** * Constructs RecipeList with recipe as an empty ArrayList. */ public RecipeList() { recipeArr = new ArrayList<>(); + this.storage = new Storage(); + } /** @@ -26,6 +31,7 @@ public void addRecipe(Recipe recipe) { try { recipeArr.add(recipe); RecipeUi.printRecipeAdded(recipe); + storage.saveRecipeFile(recipeArr); assert recipeArr.contains(recipe) : "Grocery should be added to the list"; } catch (NullPointerException e) { System.out.println("Failed to add recipe: the recipe is null."); From 5c401a42eefde473027d8a259866d02259b7211a Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 23:01:37 +0800 Subject: [PATCH 227/339] gradle: style checks --- src/main/java/git/Storage.java | 1 - src/main/java/recipe/RecipeList.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 24be3efefb..8b9f99249e 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -27,7 +27,6 @@ public class Storage { private List groceries; private GroceryList groceryList; private Recipe recipe; - ArrayList recipeArr = new ArrayList<>(); private RecipeList recipeList; /** * Saves the current list of groceries to the file. diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 6c451e362a..025f0b635f 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -5,10 +5,8 @@ import exceptions.nosuch.NoSuchObjectException; import git.RecipeUi; import git.Storage; -import grocery.Grocery; import java.util.ArrayList; -import java.util.List; public class RecipeList { private ArrayList recipeArr; From 772b4f14ad80102915365c65bb6693f8cb27be90 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Thu, 11 Apr 2024 23:06:29 +0800 Subject: [PATCH 228/339] gradle: removed print --- src/main/java/git/Parser.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 139a2186a9..1ea580ca94 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -56,10 +56,7 @@ public Parser(Ui ui) { groceryUi = new GroceryUi(); profileUi = new ProfileUi(); caloriesUi = new CaloriesUi(); - System.out.println("beforeload"); recipeList = storage.loadRecipeFile(); - System.out.println("afterload"); - this.ui = ui; isRunning = true; } From 8100a45cee8d01d9187c2345665a1da49a5a2cfd Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Thu, 11 Apr 2024 23:47:20 +0800 Subject: [PATCH 229/339] PPP --- docs/team/sharlynlui.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 docs/team/sharlynlui.md diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md new file mode 100644 index 0000000000..0133c57ecc --- /dev/null +++ b/docs/team/sharlynlui.md @@ -0,0 +1,16 @@ +# Sharlyn's Project Portfolio Page +## Project: Grocery in Time +Grocery in Time is a desktop application used for keeping track of groceries. +The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. +## Summary of contributions +* New Feature: Added the "Find Grocery" function. + *What it does: enables users to find groceries from the list of groceries. + *Justification: This feature aids user in finding the grocery that they are looking for quicker, and allow them to view its details. + +* New Feature: Add category parameter for Grocery class + What it does: Add the category of the grocery, and automatically assigns the unit to the item by its category (e.g. beverage is assigned ml). + Justification: This feature enables user to add amount later on, based on the unit that has been assigned. + +* New Feature: Add Save and Load file feature + What it does: Saves the list, with all groceries and the details into a text file, and loads it. + Justification: This feature enables users to leave the program, and still be able to see all their groceries stored when they return. From d45c16735622daa017d68809cb3b32b994e5405c Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 00:07:15 +0800 Subject: [PATCH 230/339] Updated PPP --- docs/team/sharlynlui.md | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 0133c57ecc..26a7ab2988 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -1,16 +1,26 @@ # Sharlyn's Project Portfolio Page + ## Project: Grocery in Time Grocery in Time is a desktop application used for keeping track of groceries. The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. -## Summary of contributions -* New Feature: Added the "Find Grocery" function. - *What it does: enables users to find groceries from the list of groceries. - *Justification: This feature aids user in finding the grocery that they are looking for quicker, and allow them to view its details. -* New Feature: Add category parameter for Grocery class - What it does: Add the category of the grocery, and automatically assigns the unit to the item by its category (e.g. beverage is assigned ml). - Justification: This feature enables user to add amount later on, based on the unit that has been assigned. - -* New Feature: Add Save and Load file feature - What it does: Saves the list, with all groceries and the details into a text file, and loads it. - Justification: This feature enables users to leave the program, and still be able to see all their groceries stored when they return. +## Summary of contributions +* **New Class:** Added the Recipe class and RecipeList class. + *What it does: allow user to add recipes with title, ingredients and steps in the application. + *Justification: user will be able to record their own recipes for easy viewing. +* **New Feature:** Added View Recipe, List Recipe, Add Recipe, Delete Recipe. + Justification: allow user to use to Recipe features in the application. +* **Code Contributed:** add link here +* **Project management:** + * Manged releases v1.0-v2.1 on GitHub +* **Enhancements to existing features:** + * Extracted Calories Ui, GroceryUi, ProfileUi, RecipeUi from Ui +* **Documentation:** + * User Guide: + * Developer Guide: +* **Community:** + * PRs reviewed (ADDDD HERE GOOD PR) + * Reported bugs and suggestions for other teams in the class. (ADD IMAGE FOR PE) + * Fixed bugs on our team project. (ADD NUMBER) + * Identity bugs on our team project. (ADD NUMBER) + From 6fe68bcc5e82141e60c43466dcf6f90e39291fc2 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 16:22:01 +0800 Subject: [PATCH 231/339] Fixed Ratings accepting 0 and Added View Grocery feature --- data/groceryList.txt | 3 + docs/team/sharlynlui.md | 1 + .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/GroceryUi.java | 59 ++++++++++++++++++- src/main/java/git/Parser.java | 6 +- src/main/java/git/Ui.java | 1 + src/main/java/grocery/Grocery.java | 30 +++++----- src/main/java/grocery/GroceryList.java | 25 ++++++++ 8 files changed, 108 insertions(+), 19 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index ba53484f4a..eb4f7ffff7 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -2,3 +2,6 @@ tomato | null | null | null | fruit | null | null banana | 4 | 1 | 2024-04-30 | fruit | 2.00 | pantry milk | 300 | 100 | null | beverage | null | fridge ma | null | null | null | as | null | null +lala | null | null | null | | null | null +lol | null | null | null | | null | null +hhh | null | null | null | | null | null diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 26a7ab2988..cd4f951956 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -10,6 +10,7 @@ The user interacts with it using a CLI. It is written in Java and has about 4 kL *Justification: user will be able to record their own recipes for easy viewing. * **New Feature:** Added View Recipe, List Recipe, Add Recipe, Delete Recipe. Justification: allow user to use to Recipe features in the application. +* **New Feature:** Added View Grocery * **Code Contributed:** add link here * **Project management:** * Manged releases v1.0-v2.1 on GitHub diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index b71d9f5a2b..e99cfd076d 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -2,6 +2,6 @@ public enum GroceryCommand { ADD, ADDMULTI, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, DELLOC, - LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, REMARK, EXIT + LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, VIEW, EXIT } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index a0317b9855..f969ae4904 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -528,7 +528,7 @@ public static void promptForRatingAndReview(Grocery grocery) { String input = in.nextLine().trim(); try { rating = Integer.parseInt(input); - if (rating >= 0 && rating <= 5){ + if (rating > 0 && rating <= 5){ break; } else { rating = 0; @@ -570,6 +570,63 @@ private String convertMonthToNumber(String month) { //@@author lsiyi //@@author SharlynLui + /** + * Prints grocery details for view command. + * + * @param grocery The grocery that should be printed. + */ + public static void printViewGrocery(Grocery grocery) { + assert !(grocery.getName().isEmpty()): "grocery name should not be empty"; + System.out.println("These are the details of " + grocery.getName() + ": "); + if (grocery.getAmount() != 0) { + System.out.println("Amount: " + grocery.getAmount()); + } else if (grocery.getIsSetAmount()){ + System.out.println("Amount:" + grocery.getAmount()); + } else { + System.out.println("Amount: not set"); + } + if (grocery.getExpiration() != null) { + System.out.println("Expiry date: " + grocery.getExpiration()); + } else { + System.out.println("Expiry date: not set"); + } + if (!grocery.getCategory().isEmpty()) { + System.out.println("Category: " + grocery.getCategory()); + } else { + System.out.println("Category: not set"); + } + if (grocery.getCost() != 0) { + System.out.println("Cost: " + grocery.getCost()); + } else if (grocery.getIsSetCost()) { + System.out.println("Cost: " + grocery.getCost()); + } else { + System.out.println("Cost: not set"); + } + if (grocery.getLocation() != null) { + System.out.println("Location: " + grocery.getLocation().getName()); + } else { + System.out.println("Location: not set"); + } + if (grocery.getRating() != 0) { + System.out.println("Rating: " + grocery.getRating()); + } else { + System.out.println("Rating: not set"); + } + if (!grocery.getReview().isEmpty()) { + System.out.println("Review: " + grocery.getReview()); + } else { + System.out.println("Review: not set"); + } + } + + /** + * Inform user that Grocery does not exist. + * + */ + public static void printGroceriesNotFound() { + System.out.println("Grocery not found. Please check if the name is correct or try another name."); + } + /** * Prints output after setting the selected grocery's expiration date. * diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 6e71dcab06..9cb5b44673 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -411,7 +411,6 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G case STORE: groceryList.editLocation(commandParts[1]); break; - default: throw new InvalidCommandException(); } @@ -456,6 +455,11 @@ private void handleLocationCommands(GroceryCommand command, String name) throws */ private void viewListOrHelp(GroceryCommand command, String[] commandParts) throws GitException { switch (command) { + + case VIEW: + groceryList.viewGrocery(commandParts[1]); + break; + case LIST: groceryList.listGroceries(); break; diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 311a457a3c..f9cb22d80b 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -176,6 +176,7 @@ public static void displayHelpForGrocery() { "listloc [LOCATION]: shows all locations, or all groceries stored in [LOCATION].\n" + "expiring: shows a list of groceries that are expiring soon.\n" + "low: shows a list of groceries that are low in stock.\n" + + "view GROCERY: view all the details of GROCERY.\n" + "exit: exits the program.\n" + "switch: switches the mode.\n" + "help: view all the possible commands." diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index f39d9c95f4..5ea5436c20 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -106,6 +106,14 @@ public String getReview() { return this.review; } + public boolean getIsSetCost() { + return isSetCost; + } + + public boolean getIsSetAmount() { + return isSetAmount; + } + public void setName(String name) { this.name = name; } @@ -218,27 +226,23 @@ public void setLocation(Location location) { } /** - * Returns the name, amount, expiration date and cost of the grocery. + * Returns details that are set in the grocery. * * @return String representation of the Grocery. */ public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; - String locationString; + String locationString = ""; if (this.location != null) { locationString = ", location: " + this.location.getName(); - } else { - locationString = ", location not set"; } - String amountString; + String amountString = ""; if (amount != 0) { amountString = ", amount: " + amount + " "; } else if (isSetAmount) { amountString = ", amount: 0"; - } else { - amountString = ", amount not set"; } String unitString = ""; @@ -246,27 +250,21 @@ public String printGrocery() { unitString = unit; } - String exp; + String exp = ""; if (expiration != null) { exp = ", expiration: " + expiration.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - } else { - exp = ", expiration date not set"; } - String price; + String price = ""; if (cost != 0) { price = ", cost: $" + String.format("%.2f", cost); } else if (isSetCost) { price = ", cost: $0.00"; - } else { - price = ", cost not set"; } - String remarkString; + String remarkString = ""; if (remark != null) { remarkString = ", remark: " + remark + " "; - } else { - remarkString = ", remark not set"; } return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index de5ea2fd69..68b67636aa 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -338,6 +338,31 @@ public void findGroceries(String key) throws EmptyInputException { GroceryUi.printGroceriesFound(relevantGroceries, key); } + //@@author SharlynLui + /** + * Display all the details of the grocery. + */ + public void viewGrocery(String grocery) throws EmptyInputException { + if (grocery.isEmpty()) { + throw new EmptyInputException("grocery"); + } + + int exists = 0; + + for (Grocery item : groceries) { + if(item.getName().toLowerCase().equals(grocery.trim())) { + GroceryUi.printViewGrocery(item); + exists = 1; + break; + } + } + + if (exists == 0) { + GroceryUi.printGroceriesNotFound(); + } + } + //@@author SharlynLui + /** * Updates the rating and review of an existing grocery. * From b1450ca759ee69ae1f0c2c3e59671254afdd45fc Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 16:38:39 +0800 Subject: [PATCH 232/339] Updated test cases --- data/groceryList.txt | 8 +------- src/test/java/grocery/GroceryTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index eb4f7ffff7..2b38dca803 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1,7 +1 @@ -tomato | null | null | null | fruit | null | null -banana | 4 | 1 | 2024-04-30 | fruit | 2.00 | pantry -milk | 300 | 100 | null | beverage | null | fridge -ma | null | null | null | as | null | null -lala | null | null | null | | null | null -lol | null | null | null | | null | null -hhh | null | null | null | | null | null +fooood | null | null | null | Meat | null | Freezer diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 763fb82de3..3357db3cde 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -9,9 +9,9 @@ class GroceryTest { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { - Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0,new Location("Pantry")); - String message = "apple (fruit), amount: 0, expiration date not set, " + - "cost: $0.00, location: Pantry, remark not set"; + Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0, new Location("Pantry")); + String message = "apple (fruit), amount: 0, " + + "cost: $0.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -19,7 +19,7 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry, remark not set"; + + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -27,7 +27,7 @@ public void printGrocery_costWrongFormat_formattedCost() { public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " - + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry, remark not set"; + + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } From b4c6b0c9c64d9f2272b9134c0bd576db72bddee9 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Fri, 12 Apr 2024 16:41:08 +0800 Subject: [PATCH 233/339] Fix Location bugs and update User Guide --- .gitignore | 1 + data/groceryList.txt | 7 +- docs/AboutUs.md | 6 +- docs/UserGuide.md | 232 +++++++++++++----- docs/images/featureEg/Amt.png | Bin 0 -> 2886 bytes docs/images/featureEg/Del.png | Bin 0 -> 13336 bytes docs/images/featureEg/Delloc.png | Bin 0 -> 6085 bytes .../FindExOut.png => featureEg/Find.png} | Bin docs/images/featureEg/Listloc.png | Bin 0 -> 8022 bytes docs/images/featureEg/ListlocLOC.png | Bin 0 -> 17716 bytes docs/images/featureEg/Loc.png | Bin 0 -> 4346 bytes docs/images/featureEg/Store.png | Bin 0 -> 5355 bytes docs/images/featureEg/StoreNEW.png | Bin 0 -> 8078 bytes .../SwitchExOut.png => featureEg/Switch.png} | Bin docs/images/featureEg/Use.png | Bin 0 -> 3334 bytes docs/images/featureEg/UseALL.png | Bin 0 -> 4878 bytes .../featureExampleOutputs/ListlExOut.png | Bin 4560 -> 0 bytes .../featureExampleOutputs/ListlLocExOut.png | Bin 12812 -> 0 bytes docs/team/johndoe.md | 6 - .../java/exceptions/DuplicateException.java | 13 + .../exceptions/DuplicateGroceryException.java | 13 - .../exceptions/SameLocationException.java | 13 + src/main/java/git/Parser.java | 4 +- src/main/java/grocery/GroceryList.java | 13 +- .../java/grocery/location/LocationList.java | 20 +- 25 files changed, 225 insertions(+), 103 deletions(-) create mode 100644 docs/images/featureEg/Amt.png create mode 100644 docs/images/featureEg/Del.png create mode 100644 docs/images/featureEg/Delloc.png rename docs/images/{featureExampleOutputs/FindExOut.png => featureEg/Find.png} (100%) create mode 100644 docs/images/featureEg/Listloc.png create mode 100644 docs/images/featureEg/ListlocLOC.png create mode 100644 docs/images/featureEg/Loc.png create mode 100644 docs/images/featureEg/Store.png create mode 100644 docs/images/featureEg/StoreNEW.png rename docs/images/{featureExampleOutputs/SwitchExOut.png => featureEg/Switch.png} (100%) create mode 100644 docs/images/featureEg/Use.png create mode 100644 docs/images/featureEg/UseALL.png delete mode 100644 docs/images/featureExampleOutputs/ListlExOut.png delete mode 100644 docs/images/featureExampleOutputs/ListlLocExOut.png delete mode 100644 docs/team/johndoe.md create mode 100644 src/main/java/exceptions/DuplicateException.java delete mode 100644 src/main/java/exceptions/DuplicateGroceryException.java create mode 100644 src/main/java/exceptions/SameLocationException.java diff --git a/.gitignore b/.gitignore index b96ab7a83f..8a204f9015 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ text-ui-test/EXPECTED-UNIX.TXT GroceryList.log GroceryList.log.lck +/data \ No newline at end of file diff --git a/data/groceryList.txt b/data/groceryList.txt index ba53484f4a..36fa9bd511 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1,4 +1,3 @@ -tomato | null | null | null | fruit | null | null -banana | 4 | 1 | 2024-04-30 | fruit | 2.00 | pantry -milk | 300 | 100 | null | beverage | null | fridge -ma | null | null | null | as | null | null +milk | null | null | null | | null | null +nuts | null | null | null | | null | cubby +pasta | null | null | null | | null | cubby diff --git a/docs/AboutUs.md b/docs/AboutUs.md index aafca7a97e..0a1f32c2d4 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) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/luozihui2003.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/64-1.md) | | ![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/johndoe.md) | +| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/sharlynlui.md) | | ![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/luoyu-uwu) | [Portfolio](team/luoyu-uwu.md) | diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0cf23db593..a1b2d574e4 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,7 +8,43 @@ Grocery in Time (GiT) is a **grocery tracker app**, optimised for use via a Command Line Interface (CLI). It allows users to track and manage their groceries around their home easily. -  + +- [Quick start](#quick-start) +- [Features](#features) + - [Switching between different modes: `switch`](#switching-between-different-modes-switch) + - [Grocery management mode](#grocery-management-mode) + - [Adding a new grocery: `add`](#adding-a-new-grocery-add) + - [Deleting a grocery: `del`](#deleting-a-grocery-del) + - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) + - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) + - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) + - [Using a grocery: `use`](#using-a-grocery-use) + - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) + - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) + - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) + - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) + - [Finding groceries: `find`](#finding-groceries-find) + - [Adding a storage location: `loc`](#adding-a-storage-location-loc) + - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) + - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) + - [Listing all groceries: `list`](#listing-all-groceries-list) + - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) + - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) + - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) + - [Calories management mode](#calories-management-mode) + - [Adding eaten food: `eat`](#adding-eaten-food-eat) + - [Viewing all food and calories intake: `view`](#viewing-all-food-and-calories-intake-view) + - [Profile management mode](#profile-management-mode) + - [Updating user information: `update`](#updating-user-information-update) + - [Viewing user details: `view`](#viewing-user-details-view) + - [Recipe management mode](#recipe-management-mode) + - [Adding a new recipe: `add`](#adding-a-new-recipe-add) + - [Listing all recipes: `list`](#listing-all-recipes-list) + - [Viewing a recipe: `view`](#viewing-a-recipe-view) + - [Deleting a recipe: `delete`](#deleting-a-recipe-delete) +- [FAQ](#faq) +- [Command summary](#command-summary) + ## Quick Start 1. Ensure that you have Java 11 or above installed. 2. Down the latest version of `Grocery in Time` from [here](https://github.com/AY2324S2-CS2113-T12-2/tp/releases). @@ -16,15 +52,11 @@ It allows users to track and manage their groceries around their home easily. and use `java -jar Git.jar` to run Grocery in Time.   -## Features +## Features > #### Notes about the command format > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. -> -> -> * Features requiring the `GROCERY` input are case-insensitive. ->
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. ## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. @@ -38,17 +70,24 @@ Example of usage: `switch` -![Switch example output](images/featureExampleOutputs/SwitchExOut.png) +![Switch example output](images/featureEg/Switch.png)   ## Grocery management mode + +> #### Notes about this mode +> * Features requiring the `GROCERY` or `LOCATION` inputs are case-insensitive. +>
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. +>
e.g. `store GROCERY l/LOCATION` works the same using `freezer` or `FREEZER`. + ### Adding a new grocery: `add` Adds a grocery and any desired additional details. Format: `add GROCERY` * `GROCERY` must be a valid String. +* Duplicate groceries will not be added. * After executing `add GROCERY`, GiT will ask if the user wishes to include additional details. * If so, the user has to enter the numbers corresponding to the details they wish to add. * Multiple numbers can be entered in any order and spaces between numbers are ignored. @@ -82,12 +121,14 @@ Please enter the amount (e.g. 3): >> 5 +- - - - - Including Location Please enter the location (e.g. freezer first compartment) >> cabinet -cheese added! +- - - - - +milk added! - - - - - ``` @@ -98,10 +139,19 @@ Delete a grocery. Format: `del GROCERY` +* If the `GROCERY` was stored in a location, it would be removed from that location. + Example of usage: -`del pork` +`del milk` +``` +>> del milk + +This grocery is removed +``` + +![Delete example](images/featureEg/Del.png)   ### Setting the expiration date of a grocery: `exp` @@ -115,6 +165,18 @@ Example of usage: `exp milk d/2024-07-20` + +  +### Viewing groceries expiring in the next 3 days: `expiring` +Shows a list of groceries that are expiring in the next 3 days. + +Format: `expiring` + +Example of usage: + +`expiring` + +   ### Setting the amount of a grocery: `amt` Sets the amount of a grocery. @@ -127,6 +189,8 @@ Example of usage: `amt milk a/5` +![Amt example](/images/featureEg/Amt.png) +   ### Using a grocery: `use` Reduce the amount of a grocery after using it. @@ -139,7 +203,14 @@ Format: `use GROCERY a/AMOUNT` Example of usage: -`use meat a/4` +* `use meat a/4` + + ![Use example](/images/featureEg/Use.png) + +* `use meat a/60` - amount used is greater than what is in stock. + + ![Use all example](/images/featureEg/UseALL.png) +   ### Setting the cost of a grocery: `cost` @@ -169,7 +240,7 @@ Example of usage:   -### Viewing a list of groceries that are low in stock: `low` +### Viewing groceries that are low in stock: `low` Shows a list of groceries below the threshold amount. Format: `low` @@ -203,7 +274,7 @@ Example of usage: `find cheese` -![Find example output](images/featureExampleOutputs/FindExOut.png) +![Find example](images/featureEg/Find.png)   @@ -212,10 +283,13 @@ Add a storage location to be tracked. Format: `loc LOCATION` +* Duplicate locations will not be added. + Example of usage: `loc freezer` +![Loc example](/images/featureEg/Loc.png)   ### Storing a grocery in a storage location: `store` @@ -223,13 +297,19 @@ Store a grocery in a given storage location. Format: `store GROCERY l/LOCATION` -* `LOCATION` is case-insensitive. e.g. `freezer` matches `FREEZER`. * If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. Example of usage: `store paprika l/spice rack` +* Location exists + + ![Store example](/images/featureEg/Store.png) + +* Location does not exist + + ![Store in new location example](/images/featureEg/StoreNEW.png)   ### Removing a storage location: `delloc` @@ -241,6 +321,8 @@ Example of usage: `delloc cabinet` +![Delloc example](images/featureEg/Del.png) +   ### Listing all groceries: `list` Shows a list of all groceries you have. @@ -285,17 +367,18 @@ Example of usage: * `listloc` -![Listl example output](images/featureExampleOutputs/ListlExOut.png) + ![Listloc example](images/featureEg/Listloc.png) * `listloc cubby` -![Listl LOCATION example output](images/featureExampleOutputs/ListlLocExOut.png) + ![Listloc LOCATION example](images/featureEg/ListlocLOC.png) +   ## Calories management mode -### Add eaten food: `eat` +### Adding eaten food: `eat` Adds the food eaten and store its calories. Format: `eat FOOD` @@ -305,7 +388,7 @@ Example of usage: `eat burger`   -### View all food and calories intake: `view` +### Viewing all food and calories intake: `view` Shows all the food consumed so far and their calories. Format: `view` @@ -314,10 +397,12 @@ Example of usage: `view` + +   ## Profile management mode -### Update user information: `update` +### Updating user information: `update` Stores information needed to calculate and manage calories intake. Format: `update` @@ -327,7 +412,7 @@ Example of usage: `update`   -### View user details: `view` +### Viewing user details: `view` Shows the user profile details. Format: `view` @@ -336,42 +421,44 @@ Example of usage: `view` + +   ## Recipe management mode -### Add new recipe: `add` +### Adding a new recipe: `add` Adds new recipe, ingredient and steps. Format: `add` Example: ``` -add +>> add Please enter the title of the recipe: -Fried Egg +>> Fried Egg Please enter the ingredients for this recipe in one line: -egg, salt +>> egg, salt Please enter the steps for this recipe in one line: -Fry the egg. Add salt. Serve. +>> Fry the egg. Add salt. Serve. Fried Egg added! ```   -### List all the recipes: `list` +### Listing all recipes: `list` Shows all the recipe titles. Format: `list` Example: ``` -list +>> list Here are your recipe titles! @@ -380,32 +467,33 @@ Here are your recipe titles! ```   -### View a recipe: `view` +### Viewing a recipe: `view` Shows the recipe ingredients and steps. Format: `view` `RECIPE` Example: ``` -view +>> view Please enter the title of the recipe: -Fried Egg +>> Fried Egg ``` +   -### Delete a recipe: `delete` +### Deleting a recipe: `delete` Shows the recipe ingredients and steps. Format: `delete` `RECIPE` Example: ``` -delete +>> delete Please enter the title of the recipe: -Fried Egg +>> Fried Egg Fried Egg is removed from the recipe list. ``` @@ -414,36 +502,56 @@ Fried Egg is removed from the recipe list. **Q**: How do I transfer my data to another computer? -**A**: {your answer here} +**A**: GiT's data is automatically saved under ## Command Summary - -| Command | Format and example | -|----------------------------------------------------------------|-------------------------------------| -| Add grocery | `add GROCERY` | -| Set grocery expiration date | `exp GROCERY d/EXPIRATION_DATE` | -| Set grocery amount | `amt GROCERY a/AMOUNT` | -| Set grocery cost | `cost GROCERY $PRICE` | -| Set grocery threshold amount | `th GROCERY a/AMOUNT` | -| View groceries that are low in stock | `low` | -| Use grocery | `use GROCERY a/AMOUNT` | -| Find groceries | `find KEYWORD` | -| Add storage location | `loc LOCATION` | -| Rate and review groceries | `rate GROCERY` | -| Store grocery | `store GROCERY l/LOCATION` | -| View storage locations
View groceries in a given location | `listloc [LOCATION]` | -| Remove storage location | `delloc LOCATION` | -| List all groceries | `list` | -| List all groceries by price | `listcost` | -| List all groceries by expiration date | `listexp` | -| View all groceries expiring in the next 3 days | `expiring` | -| Switch between modes | `switch` | -| Add food consumed | `eat FOOD` | -| View consumed food and their calories | `view` | -| Update user information | `update` | -| View user details | `view` | -| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | -| List all recipes | `list` | -| View recipe details | `view` `TITLE` | -| Delete recipe | `delete` `TITLE` | \ No newline at end of file +### Switch between modes +| Command | Format | +|----------------------------------------------------------------|------------------------| +| Switch between modes | `switch` | + + +### Grocery management mode +| Command | Format | +|--------------------------------------------------------------|---------------------------------| +| Add grocery | `add GROCERY` | +| Delete grocery | `del GROCERY` | +| Set grocery expiration date | `exp GROCERY d/EXPIRATION_DATE` | +| View groceries expiring in the next 3 days | `expiring` | +| Set grocery amount | `amt GROCERY a/AMOUNT` | +| Use grocery | `use GROCERY a/AMOUNT` | +| Set grocery cost | `cost GROCERY $PRICE` | +| Set grocery threshold amount | `th GROCERY a/AMOUNT` | +| View groceries that are low in stock | `low` | +| Add grocery rating and review | `rate GROCERY` | +| Find groceries | `find KEYWORD` | +| Add storage location | `loc LOCATION` | +| Store grocery | `store GROCERY l/LOCATION` | +| Remove storage location | `delloc LOCATION` | +| List groceries | `list` | +| List groceries by price | `listcost` | +| List groceries by expiration date | `listexp` | +| List storage locations
List groceries in given location | `listloc [LOCATION]` | + + +### Calorie management mode + +| Command | Format | +|----------------------------------|------------| +| Add eaten food | `eat FOOD` | +| View food and calories intake | `view` | + +### Profile management mode +| Command | Format | +|-------------------------|----------| +| Update user information | `update` | +| View user details | `view` | + +### Recipe management mode +| Command | Format | +|--------------|-------------------------------------| +| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | +| List recipes | `list` | +| View recipe | `view` `TITLE` | +| Delete recipe | `delete` `TITLE` | \ No newline at end of file diff --git a/docs/images/featureEg/Amt.png b/docs/images/featureEg/Amt.png new file mode 100644 index 0000000000000000000000000000000000000000..3447c758f5303b66935b7f656a57153b16f0e137 GIT binary patch literal 2886 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 literal 0 HcmV?d00001 diff --git a/docs/images/featureEg/Delloc.png b/docs/images/featureEg/Delloc.png new file mode 100644 index 0000000000000000000000000000000000000000..bea91dfd8771fb4b87d85a074bf5c84e7802e968 GIT binary patch literal 6085 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 literal 0 HcmV?d00001 diff --git a/docs/images/featureExampleOutputs/FindExOut.png b/docs/images/featureEg/Find.png similarity index 100% rename from docs/images/featureExampleOutputs/FindExOut.png rename to docs/images/featureEg/Find.png diff --git a/docs/images/featureEg/Listloc.png b/docs/images/featureEg/Listloc.png new file mode 100644 index 0000000000000000000000000000000000000000..c27c26d248bab9494d2fed5d3031e2440f8d8901 GIT binary patch literal 8022 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 NRCQF!?mv6=e*n-U_YD95 literal 0 HcmV?d00001 diff --git a/docs/images/featureEg/Loc.png b/docs/images/featureEg/Loc.png new file mode 100644 index 0000000000000000000000000000000000000000..463041da708663b3b59dc41723d96bfb596cfaa2 GIT binary patch literal 4346 zcmb7IXHXN|(ngAOr3UGt2N8%;1*91SBE8p0N2MbYI*0)Y(g__z5~`vUDI%dsC{hKL zUZf?05I}?=5V-i>@B4LU?#%sj=FFU(v-|9`yXWj8O^kGz8F&~dC@7fq^&n;x6c@zK z_vUmL&(~=$RzV61mM(pWmPH6`tLT9_`(3WSV%ZFn3k+#4>69PM27E8n>rqeN1zr;Z z+W&@8zhyuR%Q%=S?sth%4xsB13NNiA+b7S~^Sp11>lx!dP(6m7z}$}f%Z-u2T)Ls$^6fTqH9+Lmb`R_cGK?Sjj?*h-n#*+Yb?Kw5L z{>}4?xDp|fpz9ZQ37I-Kh)vxmXgX87ti%j;TFyuOmDub!M1*b;#$`45TpObfdQ}_4 ztTm8EgD)|ler16Y9x?=XNZv7sQTeIMg77=xC{tc-uk8#`(6Yie(I;tQtC-d@-`p?U ziV478Z0Q-J+hMzI=%nnDoMWOmQf@o+b}95$A`d&u38PEJ*hQhxT1NcRHERCv5(mcF z>xKYrKk!TMdj9e}#ji|`nhq#9*@n+>L>aGQs$uyocEjd}TL7PL#n_#dx%aMD*A2jAYT$%!c0SWDjKje6DKU( zcRee}|Kd88G+0jccAW%F>@;KqE!0TtBnWxCSlhYRH@_d0*De=Bv=nB=qfDRel~wpDSr} zVH>jNpY68wbo!QSFkDW}OZnQ}gojF9CkJdUk#1Mi=)4r@l~kOgmhI(fgl7@q93uFb zz-Prat7^?Jmr^0736AYgM@4~(3fg9#>Z<9b-l+D*m%c!LXO%^g)pDxDrC4R(Lm{Y; z@}p)(JQt^4>-QNQCg1;s(cDOf=snev=CM&Y#8QYeR!F%VcNICD;$0*p}=uX#HWi~rT$Ub*1XQk=2 z5OvVgg4%OFB-oH;bgwou8fkaQvoGarhD)J{onj&~wjVx^uBXcVwF?9gdlDmO3s!5T z{DO6D9>h9nTh&*%-v8*5Hg5hbf07?;Yaj5ZORThb@0xt;RxBpnttDyWOyxyQ75^J; z-v>$FOV;%HG3P<;rIjUVXCypW{=06`5#;f70$Ay3|AdNX+lFfwO#Njx2RQ z%30GO?Q9yL#d0Pf0YR~)o%P1z^Q0;TZU9YXn}z6>L;Qu$%Wgs@)qj-W|Dj@+1|mq- zG#5YBu;cV~(m`u;4&B6@vnBGrH%Y;e=o2wx4=>{OukzvH2>;OnC|QxdoU66gZxkc4MQG}yF


B6*DQob82#Y=zu>7_D)e9d%)4 zhbepFtZQW9a@{SvRx|ftgdfNAj7XAdaQ0F9QkdmyC`3}eib5xzjdg`QdKFOSe?=my zQ{7p+Uud6wAapG(7tN>R?&y&fN9Lxbp&Zyv?v!|y3)#EjyVqVer<0Oc7 zN}y?&((}m!h2N{nZ>w}rrK0diWma?$+Y%=&Ocji1kEH@T*)vUfJiSw9I06x>(LpYl9~puda!xN&DwqxMF~ z*e>bQq|Ou~j2_Ti3blj?ra`<={LtnKNc)XJ&K9}#%iT1hN^ldaZ zYA#v0jo`R)DcV`Dsx`S{d!n|!XW8)-!PN~|eUUx2y4Y1OmqqGrCoz-miY*pTJyB~q zXcQ_Wu`>GcaZlRf-v`oiiji~e=DLpJnJ4Oa!8qE%h+m!THQh2C`rqK-n;rDCc=2is zz->~kH#akm>}c@Q-gcIKc9IB!p0vn%@FfEMAk72;Q^;zk-ec9&+JpmDsbIBPa0>Cdu#lryWLgi9V`@!4SsUuKngM| zEu}KHvYC6Xltz4}K~&~IJD@y1qzAnM7&j@6-Mg}Bjv9eEIu*sxr`b-vjW|~PwE-co6Wmy=Na`PxC~d!xchjZ z4w-N%t8d`BxLzu1j&c>uBjES3{e=4Q`2$@QkiqVS8#&=$Nv^mxi5|*zK_7hmakDO7 z2?kS@sr!;o&WZN$PKqJnfLJQl+twxGqhz(0OBt;`(JF&kjr>eix>R;32~|O$QeEbIRiaKQ)WeWw z(-^<{-`~dWH~Y&io`c#LJ4%#%=y>g6-{uv01jaXl3;x^~6R@EwU>P?+936B1*3A~` zS@$Q_SYnCt=kbcc$)m*tWrXTBCHbVu5>zMs0A1_t}H@?#2-*L%Nbs zYyjUI&~D#gLEX;GZj%%&y5l*9O>7|~bPE^$jMqPWiPuVeD1j8b8^+1oxjp!I`bpFAru`A|+{Lc0tK2VU`b?Jy zG6^y5k@3l^B4EDHporl-ey{6(pRcU7;CJMZSEuvGo5BtCF@`VL{nmJ4>ASJWrd7dkMV~OX+V7*ka!Pu?D$>P~(wdEX{F_rgh%rgQl z&IM#^io`WjXFLn0U{2)WP;{g0dvZW;2}g&H{vlsK&%vu5a2b3BV7=Yp;#`{dZkHQ8V@-q87Ed|AH|?aE-WJ6d zic+^kY}j9K+-GK7i3BsWT9w=9+WkpcOP?XPGVY2e)eOQHn>6O`H0|}Vri_kY+Yv?c zmTD~%i1B(J`F-`iuS0C?w2MWW97txVFfXa1RzESl^lQqx<*=abw1if_pPBEM6Gdcu zL_7-rP10*u+u3R_uIg&GET79eK^{7a$;*u^KGt)mg^)?Z`fcs0NLOtSJt=N>+!eA6n3dBT%K+$#LPa#M?eq0JJy$9wP20?#?uId7Dy zcUy)2x5oN^_|^Tlwp|A;S{V3}F`IAgrzq%i#}}sl#hO1N37HAnripQ(GXZYtsC1sQ zlqvD(4ty%mNSHxKlDfjYE%leQW*}-VoAwvU>y&O;6#aJ;0E|-lud{&vH2I8H;qaiZ UGkFYmKGUGk*D->;)pm;g7xueQCIA2c literal 0 HcmV?d00001 diff --git a/docs/images/featureEg/Store.png b/docs/images/featureEg/Store.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5694434fd0a6eaa96c98d7bad7cef62cf13648 GIT binary patch literal 5355 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 Kqg16}9r|ArfvC>_ literal 0 HcmV?d00001 diff --git a/docs/images/featureEg/StoreNEW.png b/docs/images/featureEg/StoreNEW.png new file mode 100644 index 0000000000000000000000000000000000000000..78496d5146262211090f7493a3135e67e0147b99 GIT binary patch literal 8078 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 literal 0 HcmV?d00001 diff --git a/docs/images/featureExampleOutputs/SwitchExOut.png b/docs/images/featureEg/Switch.png similarity index 100% rename from docs/images/featureExampleOutputs/SwitchExOut.png rename to docs/images/featureEg/Switch.png diff --git a/docs/images/featureEg/Use.png b/docs/images/featureEg/Use.png new file mode 100644 index 0000000000000000000000000000000000000000..01fdf2318dcbb59a1f2b2ad0a8e702288d77dda2 GIT binary patch literal 3334 zcma)9S5y;s#;ReZ70{$IPs~=400EwPx1dID~;V3o{Qh4Gj$oTnF~#Pfhp} zs4I+rGQCp)o`&XXFB}Fj!CGx*yfQZK434!R#$8aF~b2{{si^z&aihPQby3(}D=mM4=-! zS@3{}@DH!6OLBaP&EIE<8i-s0k=ambM~xt@Gly$QW+qcSVVKWcsY$==7S(})PCW9Fg}2w>+~=y4J;WvC;BR@6TwCa}Q^ckLTiw`IuNmL0D*aQVIf1FA z5cfLvr5Q|?_XwNr5B5bC3_*1wI_3AJT-fm6j`bl*YQCgu2LG*%62q7Y&lBfK+4f|iHyYrOyXX!(p`Naq5Z)@kr4MCS0xU% zYsH4^hn%_=y4?FzRzf>cvq&)a+5GXmzxwSflKmKg7+hHl1pTK zzZs405uHOlEGxfv*gvsaVlTX(D;`amAOahN7mEht)47C8idjnlp=Fdsq6;J;@&y~Z zaFaFCY-;sUO(a!A&EcRtdF8dNi84@#Qkp*sn8{i2pVR3P+tV6*J{>j0slO$|Tj+n# z-&QMfxpouJ)VRw$;c6)h--;H`qilvaOaqKHZ3k_!N^}198q<&`UFs>YS`CrewDB1@ zR9~2!U+awXy3300ji5>JxAa@o_^L(n>G)Cc|Q^*?E*3)bY zrNBQMaLHxL32p}~h=cP$$b!(_<)#ng$>DqE#V@2j#G9vZ=bK#C&wT91%KmxVQPrG` zE|k2kDW>jPCVkz2fuXx^3noX0tEzv$o*@xqp(_@Go;2Mk_B*AZRuJa`!Ex%DitG|5R=Dvz@&$vtZq(8#uRG$=Dw-3}dh4K6)&bktr590~W**mslU zMqz@x20g5H25(;Q zW~tcJalL%nj3CO)xO>d=tvp|engwZrCy$Koj z*_d>}pxmWTE4dtT+UGlr=ZGXQf{D1ipHGmNDlbD!;5>I`SCXxp7xXF zm>86VzN#4b$e_(s(TNWI3g-R4vB68Ixt#%DrM>dVTR>OT@IZ_3y@^BZr5v02+3U3ao83^wZstrD_@rjpIc4S>7F76Qu2yfj6NQ>ZOc-c=7BFOa~Ogn;114 z0S49F!Ci6tk1)+$3k1mu8}MWfjblbP2NOd{RGKvY-{RH_t70n)Dxtrc*EQ+9O=kik znm|s0k;(2lAX%mS>hgP=EPQnM#tX%3LKLiWXizlgPsh*r`A4Dg!*7bdxt;};i*22^ zGQ;=T!oX&y48Ba2BDZZ7m z6J5eVe_^?PPHA}BpsR`vrdN|cq zk-HwLYo{+OZgeEAu<6M~N7CuaDAdO~xwD=s(v?n3n5I>3CQIHnYa?~peMnAVMJnf) zR~_@J7-ggf^qW@BI!qsZt81{zxbliGv9<)|uGu%vXFzTB?Qr6vBwRx6@hNY+f8Qre+h) ztd}Zuh60YI;lF_?3w)%PpbYmD&+zczWrbx|=)u-=mdVx=6v#+r(9C__b%@Hu%%NrF zve3(dS?QT@Q-t_mdXP5pVRcTK{Zw)X4Q4KZwRoBy+V4sUuME{^Jj4CaoiME(Yq+R% zrusHqFoS^@bF?N>=4X4lv^YNz)V)C7C@u^k#8gO#q^qL2s3$xzO%xI#3jXBCdZ9w+ zdKWH*WW;q4%Mn7NG1ljd+gOB$5Q4L6U5mfk`eWn;OAYKCtZrQ+n|Msy0H;<{0;rl2 zS?Qwk{ODVX38D$-6n>ZcS2ehYtsB&p= z7q_-5EPra8PCd#lK){d(7@QhcHbpGqMYL*5N$Y$Ef# zHrZ~8DaPg^GJRmHOunU)be+jpYvx+_I0Ir)+f`*}HcUU3&qSlyQR&xee_HGPJ^_9i zy=db-3~~^TM7$F}zZB7`Ljbb3LH-Mg{_h3+|8+YObySE6#W6}ejT)bO)J}8{0#i?# zxNINihHs-*M;k1BbuPI4L5RSBgFwlSBvBT{h_Rf3Z~YGNZsAMA?Wmd25DDBB(Cz== e82)!4RV_*~-`tD;(%*ml4Gmn=09Fcp9`Y~el}Szj literal 0 HcmV?d00001 diff --git a/docs/images/featureEg/UseALL.png b/docs/images/featureEg/UseALL.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fed381d427cd9c20291fee97a06f319f25f546 GIT binary patch literal 4878 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 literal 0 HcmV?d00001 diff --git a/docs/images/featureExampleOutputs/ListlExOut.png b/docs/images/featureExampleOutputs/ListlExOut.png deleted file mode 100644 index e075d1457705c6b7a9e20ff543f161722739352d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4560 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 Date: Fri, 12 Apr 2024 16:48:23 +0800 Subject: [PATCH 234/339] Fix checkstyle issues --- .../{ => invalidinput}/InvalidAmountException.java | 4 +++- .../{ => invalidinput}/InvalidCostException.java | 6 ++++-- src/main/java/git/GroceryUi.java | 2 +- src/main/java/git/Storage.java | 6 ++---- src/main/java/grocery/GroceryList.java | 8 +++++++- 5 files changed, 17 insertions(+), 9 deletions(-) rename src/main/java/exceptions/{ => invalidinput}/InvalidAmountException.java (83%) rename src/main/java/exceptions/{ => invalidinput}/InvalidCostException.java (70%) diff --git a/src/main/java/exceptions/InvalidAmountException.java b/src/main/java/exceptions/invalidinput/InvalidAmountException.java similarity index 83% rename from src/main/java/exceptions/InvalidAmountException.java rename to src/main/java/exceptions/invalidinput/InvalidAmountException.java index 73183ad606..0274bf6ca9 100644 --- a/src/main/java/exceptions/InvalidAmountException.java +++ b/src/main/java/exceptions/invalidinput/InvalidAmountException.java @@ -1,4 +1,6 @@ -package exceptions; +package exceptions.invalidinput; + +import exceptions.GitException; /** * Represents the exception thrown when the amount inputted by the user is invalid. diff --git a/src/main/java/exceptions/InvalidCostException.java b/src/main/java/exceptions/invalidinput/InvalidCostException.java similarity index 70% rename from src/main/java/exceptions/InvalidCostException.java rename to src/main/java/exceptions/invalidinput/InvalidCostException.java index aea6762fc4..433da9a41a 100644 --- a/src/main/java/exceptions/InvalidCostException.java +++ b/src/main/java/exceptions/invalidinput/InvalidCostException.java @@ -1,9 +1,11 @@ -package exceptions; +package exceptions.invalidinput; + +import exceptions.GitException; /** * Represents the exception thrown when the cost inputted by the user is invalid. */ -public class InvalidCostException extends GitException{ +public class InvalidCostException extends GitException { /** * Constructs InvalidCostException. */ diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index a0317b9855..b1f6078120 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -1,7 +1,7 @@ package git; import exceptions.GitException; -import exceptions.InvalidCostException; +import exceptions.invalidinput.InvalidCostException; import exceptions.PastExpirationDateException; import exceptions.nosuch.NoSuchObjectException; import food.Food; diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 8b9f99249e..6219c201dc 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -64,8 +64,7 @@ public GroceryList loadGroceryFile(){ groceryList.addGrocery(grocery); } scanner.close(); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved groceries found.\n "); } return groceryList; @@ -124,8 +123,7 @@ public RecipeList loadRecipeFile(){ recipeList.addRecipe(recipe); } scanner.close(); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved recipes found.\n "); } return recipeList; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ad7ed120a0..def0b96627 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -1,7 +1,13 @@ package grocery; -import exceptions.*; +import exceptions.GitException; +import exceptions.invalidinput.InvalidAmountException; +import exceptions.LocalDateWrongFormatException; +import exceptions.PastExpirationDateException; import exceptions.emptyinput.EmptyInputException; +import exceptions.CannotUseException; +import exceptions.invalidinput.InvalidCostException; +import exceptions.SameLocationException; import git.Storage; import git.GroceryUi; import exceptions.nosuch.NoSuchObjectException; From 234b296d48b7ee3afab36aae8978cdd2fe1a93e3 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 12 Apr 2024 17:12:12 +0800 Subject: [PATCH 235/339] Add save UserInfo --- GroceryList.log.1 | 52 ++++++++++++++++++ GroceryList.log.1.lck | 0 data/groceryList.txt | 6 +- data/recipeList.txt | 2 - data/userProfile.txt | 8 +++ src/main/java/git/Git.java | 12 +++- src/main/java/git/Parser.java | 4 +- src/main/java/git/ProfileUi.java | 3 + src/main/java/git/Storage.java | 94 ++++++++++++++++++++++++++++++-- src/main/java/git/Ui.java | 48 ++++++++++++---- src/main/java/user/UserInfo.java | 38 ++++++++++++- 11 files changed, 241 insertions(+), 26 deletions(-) delete mode 100644 GroceryList.log.1.lck delete mode 100644 data/recipeList.txt create mode 100644 data/userProfile.txt diff --git a/GroceryList.log.1 b/GroceryList.log.1 index 1bb13a6649..26eadd704c 100644 --- a/GroceryList.log.1 +++ b/GroceryList.log.1 @@ -26,3 +26,55 @@ + + + + + 2024-04-12T08:14:04.754275Z + 1712909644754 + 275000 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added tomato (fruit), amount: 0, expiration date not set, cost: $0.00, location: null, remark not set + + + 2024-04-12T08:14:04.783381200Z + 1712909644783 + 381200 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added banana (fruit), amount: 4 pieces, expiration: 2024-04-30, cost: $2.00, location: pantry, remark not set + + + 2024-04-12T08:14:04.785381500Z + 1712909644785 + 381500 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk (beverage), amount: 300 ml, expiration date not set, cost: $0.00, location: fridge, remark not set + + + 2024-04-12T08:14:04.787382100Z + 1712909644787 + 382100 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added ma (as), amount: 0, expiration date not set, cost: $0.00, location: null, remark not set + + diff --git a/GroceryList.log.1.lck b/GroceryList.log.1.lck deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/data/groceryList.txt b/data/groceryList.txt index ba53484f4a..9dca7d0ddb 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1,4 +1,2 @@ -tomato | null | null | null | fruit | null | null -banana | 4 | 1 | 2024-04-30 | fruit | 2.00 | pantry -milk | 300 | 100 | null | beverage | null | fridge -ma | null | null | null | as | null | null +tomato | null | null | null | | null | fridge +ice | null | null | null | | null | freezer diff --git a/data/recipeList.txt b/data/recipeList.txt deleted file mode 100644 index 2515c70e68..0000000000 --- a/data/recipeList.txt +++ /dev/null @@ -1,2 +0,0 @@ -as | as | fdds. sdfsd. sd -fr | b, b, b, b, b, b | c. c. c. c. c diff --git a/data/userProfile.txt b/data/userProfile.txt new file mode 100644 index 0000000000..9e325b722a --- /dev/null +++ b/data/userProfile.txt @@ -0,0 +1,8 @@ +Name: zihui +Height: 0.0 +Weight: 0.0 +Age: 0 +Gender: null +Aim: null +Activeness: null +Calories: 0 diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 5385bcf538..819f7bae6b 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,6 +1,8 @@ package git; import exceptions.GitException; +import user.UserInfo; + /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! */ @@ -9,8 +11,8 @@ public class Git { private Ui ui; private GroceryUi groceryUi; private boolean isRunning; - private Parser parser; + private Storage storage; // METHODS /** * Constructs Git. @@ -20,13 +22,19 @@ public Git() { groceryUi = GroceryUi.getInstance(); parser = new Parser(ui); isRunning = true; + storage = new Storage(); } /** * Runs Git. */ private void run() { - String username = ui.printWelcome(); + String username; + if (storage.isProfileSaved()){ + username = ui.printWelcomeToExistingUser(); + } else { + username = ui.printWelcome(); + } parser.setUsername(username); String mode = null; diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 1ea580ca94..a43ad997ef 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -51,7 +51,7 @@ public Parser(Ui ui) { this.storage = new Storage(); groceryList = storage.loadGroceryFile(); foodList = new FoodList(); - userInfo = new UserInfo(); + userInfo = storage.loadProfileFile(); recipeUi = new RecipeUi(); groceryUi = new GroceryUi(); profileUi = new ProfileUi(); @@ -180,6 +180,7 @@ public void caloriesManagement(String[] commandParts) throws GitException { */ public void setUsername(String username) { userInfo.setName(username); + storage.saveProfileFile(userInfo); } /** @@ -206,6 +207,7 @@ public void profileManagement(String[] commandParts) throws GitException { String activeness = profileUi.promptForActiveness(); String aim = profileUi.promptForAim(); userInfo.updateInfo(name, weight,height,age,gender,activeness,aim); + storage.saveProfileFile(userInfo); break; case VIEW: diff --git a/src/main/java/git/ProfileUi.java b/src/main/java/git/ProfileUi.java index 4993124800..6582c0006b 100644 --- a/src/main/java/git/ProfileUi.java +++ b/src/main/java/git/ProfileUi.java @@ -1,5 +1,7 @@ package git; +import user.UserInfo; + import java.util.Scanner; public class ProfileUi { @@ -72,6 +74,7 @@ public double promptForWeight() { } } } + return weight; } diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 8b9f99249e..d0e4baf302 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -1,9 +1,11 @@ package git; +import exceptions.GitException; import grocery.Grocery; import grocery.GroceryList; import recipe.Recipe; import recipe.RecipeList; +import user.UserInfo; import java.io.File; import java.io.FileNotFoundException; @@ -28,9 +30,9 @@ public class Storage { private GroceryList groceryList; private Recipe recipe; private RecipeList recipeList; + private UserInfo userInfo; /** * Saves the current list of groceries to the file. - * * @param groceries The list of groceries to save. */ public void saveGroceryFile(List groceries) { @@ -72,7 +74,6 @@ public GroceryList loadGroceryFile(){ } /** * Parses a string from the file into a grocery object. - * * @param line The string to parse. * @return The parsed grocery object. */ @@ -90,7 +91,6 @@ private Grocery parseGrocery(String line) { } /** * Saves the current list of recipes to the file. - * * @param recipeArr The list of recipes to save. */ public void saveRecipeFile(ArrayList recipeArr) { @@ -141,9 +141,93 @@ private Recipe parseRecipe(String line) { String title = parts[0].trim(); String[] ingredientsArray = parts[1].equalsIgnoreCase("null") ? null : parts[1].split(", "); ArrayList ingredientsList = new ArrayList<>(Arrays.asList(ingredientsArray)); - String[] stepsArray = parts[2].equalsIgnoreCase("null") ? null : parts[2].split(", "); + String[] stepsArray = parts[2].equalsIgnoreCase("null") ? null : parts[2].split(". "); ArrayList stepsList = new ArrayList<>(Arrays.asList(stepsArray)); - return new Recipe(title, ingredientsList, stepsList); } + /** + * Saves the current user profile to the file. + * @param userInfo The user profile to save. + */ + public void saveProfileFile(UserInfo userInfo) { + try { + File directory = new File("./data"); + if (!directory.exists()) { + directory.mkdirs(); + } + FileWriter writer = new FileWriter("./data/userProfile.txt"); + writer.write(userInfo.toProfileSaveFormat()); + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while saving recipes."); + e.printStackTrace(); + } + } + /** + * Loads the user profile from the file. + * @return userInfo loaded from the file. If file does not exist, returns an empty userInfo. + */ + public UserInfo loadProfileFile(){ + UserInfo userInfo = new UserInfo(); + try { + File file = new File("./data/userProfile.txt"); + Scanner scanner = new Scanner(file); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + parseProfile(line, userInfo); + } + scanner.close(); + } + catch (FileNotFoundException e) { + //System.out.println("No saved recipes found.\n "); + } catch (GitException e) { + throw new RuntimeException(e); + } + return userInfo; + } + /** + * Parses a string from the file into a userInfo object. + * + * @param line The string to parse. + * @param userInfo The UserInfo object to store the parsed information. + */ + private void parseProfile(String line, UserInfo userInfo) throws GitException { + String[] parts = line.split(": "); + switch (parts[0]) { + case "Name": + userInfo.setName(parts[1]); + break; + case "Height": + userInfo.setHeight(Double.parseDouble(parts[1])); + break; + case "Weight": + userInfo.setWeight(Double.parseDouble(parts[1])); + break; + case "Age": + userInfo.setAge(Integer.parseInt(parts[1])); + break; + case "Gender": + userInfo.setGender(parts[1]); + break; + case "Aim": + userInfo.setAim(parts[1]); + break; + case "Activeness": + userInfo.setActiveness(parts[1]); + break; + case "Calories": + userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); + default: + break; + } + } + /** + * Checks if the user's profile file exists. + * + * @return True if the profile file exists, false otherwise. + */ + public boolean isProfileSaved() { + File profileFile = new File("./data/userProfile.txt"); + return profileFile.exists(); + } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index ec3253b580..a7a98a6585 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -4,6 +4,7 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import enumerations.Mode; +import user.UserInfo; /** @@ -11,6 +12,8 @@ */ public class Ui { // ATTRIBUTES + private Storage storage; + private UserInfo userInfo; public static final String DIVIDER = "- - - - -"; private static Ui singleUi = null; private static Scanner in; @@ -19,12 +22,15 @@ public class Ui { private static final double MAX_WEIGHT = 370; private static final double MAX_AGE = 160; + // METHODS /** * Constructs Ui and initialises Scanner to read input. */ private Ui() { in = new Scanner(System.in); + storage = new Storage(); + userInfo = storage.loadProfileFile(); } /** @@ -54,17 +60,39 @@ public String printWelcome() { " `._____.'[___] |_____|"; System.out.println(gitlogo + System.lineSeparator()); - System.out.println("Hello from GiT"); - userName = null; - while (userName == null) { - System.out.println("What is your name?"); - printLine(); - userName = in.nextLine(); - if (userName.isEmpty()) { - System.out.println("Invalid input. Please enter a valid name."); - userName = null; + + System.out.println("Hello from GiT"); + userName = null; + while (userName == null) { + System.out.println("What is your name?"); + printLine(); + userName = in.nextLine(); + if (userName.isEmpty()) { + System.out.println("Invalid input. Please enter a valid name."); + userName = null; + } } - } + printHello(userName); + displayHelp(); + + return userName; + } + /** + * Prints welcome message to an existing user. + */ + public String printWelcomeToExistingUser() { + final String gitlogo = + " ______ _ _________\n" + + " .' ___ | (_)| _ _ |\n" + + "/ .' \\_| __ |_/ | | \\_|\n" + + "| | ____[ | | |\n" + + "\\ `.___] || | _| |_\n" + + " `._____.'[___] |_____|"; + + System.out.println(gitlogo + System.lineSeparator()); + + System.out.println("Hello from GiT"); + userName = userInfo.getName(); printHello(userName); displayHelp(); diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index aec684a8c7..f57ebdc3f5 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -4,6 +4,7 @@ import exceptions.FailToCalculateCalories; import exceptions.InsufficientInfoException; import food.Food; +import git.Storage; public class UserInfo { private String name; @@ -17,6 +18,7 @@ public class UserInfo { private double AMR; private int caloriesCap; private int currentCalories; + private Storage storage; public UserInfo() { this.name = null; @@ -24,6 +26,7 @@ public UserInfo() { this.height = 0; this.age = 0; this.currentCalories = 0; + this.storage = new Storage(); } public void setName(String name) { @@ -102,6 +105,10 @@ public void updateInfo(String name, double weight, double height, int age, } catch (GitException e) { System.out.println(e.getMessage()); } + System.out.println("before save"); + + System.out.println("after save"); + } /** @@ -154,7 +161,7 @@ private void calAMR() throws GitException { * * @throws GitException When invalid aim was given. */ - private void setCaloriesCap() throws GitException { + public void setCaloriesCap() throws GitException { switch (this.aim) { case "lose": this.caloriesCap = (int)(this.AMR*0.8); @@ -204,5 +211,32 @@ public String viewProfile(){ String target = "Target calories intake: " + this.caloriesCap; return userName + height + weight + age + gender + target; } - + /** + * Stores user details as a string in format for saving. + * + * @return A string containing all the user's details. + */ + public String toProfileSaveFormat(){ + assert !(this.name.isEmpty()) : "User does not exist!!"; + String userName = "Name: " + this.name + "\n"; + String height = "Height: " + this.height + "\n"; + String weight = "Weight: " + this.weight + "\n"; + String age = "Age: " + this.age + "\n"; + String gender = "Gender: " + this.gender + "\n"; + String aim = "Aim: " + this.aim + "\n"; + String activeness = "Activeness: " + this.activeness + "\n"; + String caloriesCap = "Calories: " + this.caloriesCap + "\n"; + return userName + height + weight + age + gender + aim + activeness + caloriesCap; + } + /** + * Sets calories cap. + * + * @param caloriesCap Loaded from saved file. + */ + public void setCaloriesCapFromLoad(int caloriesCap){ + this.caloriesCap = caloriesCap; + } + public String getName (){ + return this.name; + } } From d4e81bfe46f50e1aaf452582cd59b468bf0dce52 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 12 Apr 2024 17:14:18 +0800 Subject: [PATCH 236/339] Add save UserInfo --- data/groceryList.txt | 2 -- data/userProfile.txt | 8 -------- src/main/java/user/UserInfo.java | 3 --- 3 files changed, 13 deletions(-) delete mode 100644 data/groceryList.txt delete mode 100644 data/userProfile.txt diff --git a/data/groceryList.txt b/data/groceryList.txt deleted file mode 100644 index 9dca7d0ddb..0000000000 --- a/data/groceryList.txt +++ /dev/null @@ -1,2 +0,0 @@ -tomato | null | null | null | | null | fridge -ice | null | null | null | | null | freezer diff --git a/data/userProfile.txt b/data/userProfile.txt deleted file mode 100644 index 9e325b722a..0000000000 --- a/data/userProfile.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name: zihui -Height: 0.0 -Weight: 0.0 -Age: 0 -Gender: null -Aim: null -Activeness: null -Calories: 0 diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index f57ebdc3f5..de13dd7a45 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -105,9 +105,6 @@ public void updateInfo(String name, double weight, double height, int age, } catch (GitException e) { System.out.println(e.getMessage()); } - System.out.println("before save"); - - System.out.println("after save"); } From 835aa142f105006d74003297a7bfe37054e8fec3 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 12 Apr 2024 17:21:05 +0800 Subject: [PATCH 237/339] Add save to delete recipe --- src/main/java/recipe/RecipeList.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 025f0b635f..9c3b75a75f 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -89,5 +89,6 @@ public void removeRecipe(String title) throws GitException { Recipe currRecipe = getRecipe(title); recipeArr.remove(currRecipe); RecipeUi.printRecipeRemoved(currRecipe); + storage.saveRecipeFile(recipeArr); } } From b293cc16185ca7816656bdd246a007419c66ab7b Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 17:36:50 +0800 Subject: [PATCH 238/339] Enable remark to be edtied. --- data/groceryList.txt | 3 +++ .../java/enumerations/GroceryCommand.java | 3 ++- src/main/java/git/GroceryUi.java | 14 +++++++++++++ src/main/java/git/Parser.java | 5 +++++ src/main/java/git/Ui.java | 1 + src/main/java/grocery/Grocery.java | 8 +++++++- src/main/java/grocery/GroceryList.java | 20 +++++++++++++++++++ 7 files changed, 52 insertions(+), 2 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index 2b38dca803..fe15d0b796 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1 +1,4 @@ fooood | null | null | null | Meat | null | Freezer +hhh | null | null | null | | null | null +new | 100 | null | null | | null | null +test2 | null | null | null | | null | null diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index e99cfd076d..c2fefbf55b 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -1,7 +1,8 @@ package enumerations; public enum GroceryCommand { - ADD, ADDMULTI, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, STORE, LOC, DELLOC, + // order of where command is placed affects the function it calls, refer to groceryManagement + ADD, ADDMULTI, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, REMARK, STORE, LOC, DELLOC, LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, VIEW, EXIT } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index f969ae4904..075063280f 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -617,6 +617,11 @@ public static void printViewGrocery(Grocery grocery) { } else { System.out.println("Review: not set"); } + if (!grocery.getRemark().isEmpty()) { + System.out.println("Remark: " + grocery.getRemark()); + } else { + System.out.println("Remark: not set"); + } } /** @@ -627,6 +632,15 @@ public static void printGroceriesNotFound() { System.out.println("Grocery not found. Please check if the name is correct or try another name."); } + /** + * Prints output after setting the selected grocery's remark. + * + */ + public static void printRemarkSet(Grocery grocery) { + assert !(grocery.getRemark().isEmpty()): "grocery remark should not be empty"; + System.out.println("remark:" + grocery.getRemark()); + } + /** * Prints output after setting the selected grocery's expiration date. * diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 9cb5b44673..aa4d713acd 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -411,6 +411,11 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G case STORE: groceryList.editLocation(commandParts[1]); break; + + case REMARK: + groceryList.editRemark(commandParts[1]); + break; + default: throw new InvalidCommandException(); } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index f9cb22d80b..de32413f27 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -167,6 +167,7 @@ public static void displayHelpForGrocery() { "cost GROCERY $PRICE: edits the price of GROCERY.\n" + "store GROCERY l/LOCATION: sets the location of GROCERY.\n" + "rate GROCERY: rates and reviews GROCERY.\n" + + "remark GROCERY r/REMARK: updates the remark of the GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + "delloc LOCATION: removes LOCATION from tracking.\n" + "list: shows list of all groceries you have.\n" + diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 5ea5436c20..6491ce9302 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -49,6 +49,7 @@ public Grocery(String name, int amount, int threshold, this.location = location; this.rating = 0; this.review = ""; + this.remark = ""; } /** @@ -67,6 +68,7 @@ public Grocery(String name) { this.location = null; this.rating = 0; this.review = ""; + this.remark = ""; } // Getters and setters @@ -106,6 +108,10 @@ public String getReview() { return this.review; } + public String getRemark() { + return remark; + } + public boolean getIsSetCost() { return isSetCost; } @@ -263,7 +269,7 @@ public String printGrocery() { } String remarkString = ""; - if (remark != null) { + if (!remark.isEmpty()) { remarkString = ", remark: " + remark + " "; } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 68b67636aa..8f99f736c2 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -15,6 +15,7 @@ import grocery.location.Location; import grocery.location.LocationList; +import java.rmi.server.RemoteObjectInvocationHandler; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -251,7 +252,26 @@ public void editAmount(String details, boolean use) throws GitException { } else { GroceryUi.printAmtSet(grocery); } + } + /** + * Updates the remark of an existing grocery. + * + * @param details A string containing grocery new remark. + * @throws GitException is input is not valid + */ + public void editRemark(String details) throws GitException { + // Assuming the format is "remark GROCERY r/REMARK" + String[] remarkParts = checkDetails(details, "remark", "r/"); + Grocery grocery = getGrocery(remarkParts[0].strip()); + String remark = remarkParts[1].strip(); + + grocery.setRemark(remark); + if (remark.isEmpty()) { + throw new EmptyInputException("remark"); + } + GroceryUi.printRemarkSet(grocery); + storage.saveGroceryFile(getGroceries()); } /** From 79e3eb1a97d154dbf8ca64aed7a55ee3ee4c9bae Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 17:57:15 +0800 Subject: [PATCH 239/339] Gradle Check --- src/main/java/git/Storage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 8b9f99249e..3c35338d2f 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -70,6 +70,7 @@ public GroceryList loadGroceryFile(){ } return groceryList; } + /** * Parses a string from the file into a grocery object. * From fb4774709b5506e60b5ead581ba25304df31243a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 18:01:14 +0800 Subject: [PATCH 240/339] no message --- src/main/java/grocery/GroceryList.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 8f99f736c2..b10c564885 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -14,8 +14,6 @@ import exceptions.commands.CommandWrongFormatException; import grocery.location.Location; import grocery.location.LocationList; - -import java.rmi.server.RemoteObjectInvocationHandler; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; From ded43368ad4810fc4afa3ae223f4f4bdf75a2fad Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 18:19:49 +0800 Subject: [PATCH 241/339] Gradle checks --- src/main/java/git/Storage.java | 50 +++++++++++++++++----------------- src/main/java/git/Ui.java | 31 ++++++++++----------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index e3d68c21a0..5e8be28952 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -193,31 +193,31 @@ public UserInfo loadProfileFile(){ private void parseProfile(String line, UserInfo userInfo) throws GitException { String[] parts = line.split(": "); switch (parts[0]) { - case "Name": - userInfo.setName(parts[1]); - break; - case "Height": - userInfo.setHeight(Double.parseDouble(parts[1])); - break; - case "Weight": - userInfo.setWeight(Double.parseDouble(parts[1])); - break; - case "Age": - userInfo.setAge(Integer.parseInt(parts[1])); - break; - case "Gender": - userInfo.setGender(parts[1]); - break; - case "Aim": - userInfo.setAim(parts[1]); - break; - case "Activeness": - userInfo.setActiveness(parts[1]); - break; - case "Calories": - userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); - default: - break; + case "Name": + userInfo.setName(parts[1]); + break; + case "Height": + userInfo.setHeight(Double.parseDouble(parts[1])); + break; + case "Weight": + userInfo.setWeight(Double.parseDouble(parts[1])); + break; + case "Age": + userInfo.setAge(Integer.parseInt(parts[1])); + break; + case "Gender": + userInfo.setGender(parts[1]); + break; + case "Aim": + userInfo.setAim(parts[1]); + break; + case "Activeness": + userInfo.setActiveness(parts[1]); + break; + case "Calories": + userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); + default: + break; } } /** diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 6f72e259be..1204f3b655 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -11,17 +11,16 @@ * Deals with interactions with the user. */ public class Ui { + private static final double MAX_HEIGHT = 280; + private static final double MAX_WEIGHT = 370; + private static final double MAX_AGE = 160; + public static final String DIVIDER = "- - - - -"; // ATTRIBUTES private Storage storage; private UserInfo userInfo; - public static final String DIVIDER = "- - - - -"; private static Ui singleUi = null; private static Scanner in; private static String userName; - private static final double MAX_HEIGHT = 280; - private static final double MAX_WEIGHT = 370; - private static final double MAX_AGE = 160; - // METHODS /** @@ -61,18 +60,18 @@ public String printWelcome() { System.out.println(gitlogo + System.lineSeparator()); - System.out.println("Hello from GiT"); - userName = null; - while (userName == null) { - System.out.println("What is your name?"); - printLine(); - userName = in.nextLine(); - if (userName.isEmpty()) { - System.out.println("Invalid input. Please enter a valid name."); - userName = null; - } + System.out.println("Hello from GiT"); + userName = null; + while (userName == null) { + System.out.println("What is your name?"); + printLine(); + userName = in.nextLine(); + if (userName.isEmpty()) { + System.out.println("Invalid input. Please enter a valid name."); + userName = null; } - printHello(userName); + } + printHello(userName); displayHelp(); return userName; From e7bedbb1c6c3340e2e2f0179d39afd178ce9711b Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 18:32:52 +0800 Subject: [PATCH 242/339] gradle check --- src/main/java/git/Git.java | 1 - src/main/java/git/ProfileUi.java | 2 -- src/main/java/git/Storage.java | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 819f7bae6b..e7f63f27c9 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,7 +1,6 @@ package git; import exceptions.GitException; -import user.UserInfo; /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! diff --git a/src/main/java/git/ProfileUi.java b/src/main/java/git/ProfileUi.java index 6582c0006b..81fe99adea 100644 --- a/src/main/java/git/ProfileUi.java +++ b/src/main/java/git/ProfileUi.java @@ -1,7 +1,5 @@ package git; -import user.UserInfo; - import java.util.Scanner; public class ProfileUi { diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 5e8be28952..c6efc34f95 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -216,6 +216,7 @@ private void parseProfile(String line, UserInfo userInfo) throws GitException { break; case "Calories": userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); + break; default: break; } From 7858e0b3bd343796c5a341cfcfb6a274ea5aab49 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 18:36:24 +0800 Subject: [PATCH 243/339] gradle checks --- src/main/java/git/Ui.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 1204f3b655..a255854ce2 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -15,12 +15,12 @@ public class Ui { private static final double MAX_WEIGHT = 370; private static final double MAX_AGE = 160; public static final String DIVIDER = "- - - - -"; - // ATTRIBUTES - private Storage storage; - private UserInfo userInfo; private static Ui singleUi = null; private static Scanner in; + // ATTRIBUTES private static String userName; + private Storage storage; + private UserInfo userInfo; // METHODS /** From ee1ec7b34b2593717dd3f2248feed1dd9524e71e Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Fri, 12 Apr 2024 18:39:05 +0800 Subject: [PATCH 244/339] gradle check --- src/main/java/git/Ui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index a255854ce2..9026c30b9e 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -11,10 +11,10 @@ * Deals with interactions with the user. */ public class Ui { + public static final String DIVIDER = "- - - - -"; private static final double MAX_HEIGHT = 280; private static final double MAX_WEIGHT = 370; private static final double MAX_AGE = 160; - public static final String DIVIDER = "- - - - -"; private static Ui singleUi = null; private static Scanner in; // ATTRIBUTES From d2f12ab5cd305fcb02a0f32d07650c4eeb89e402 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Fri, 12 Apr 2024 18:44:40 +0800 Subject: [PATCH 245/339] no changes... trying to pull --- src/main/java/git/Storage.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index d0e4baf302..5ed560a931 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -1,8 +1,10 @@ package git; import exceptions.GitException; +import exceptions.emptyinput.EmptyInputException; import grocery.Grocery; import grocery.GroceryList; +import grocery.location.LocationList; import recipe.Recipe; import recipe.RecipeList; import user.UserInfo; @@ -28,6 +30,7 @@ public class Storage { private Grocery grocery; private List groceries; private GroceryList groceryList; + private LocationList locationList; private Recipe recipe; private RecipeList recipeList; private UserInfo userInfo; @@ -69,6 +72,8 @@ public GroceryList loadGroceryFile(){ } catch (FileNotFoundException e) { //System.out.println("No saved groceries found.\n "); + } catch (EmptyInputException e) { + throw new RuntimeException(e); } return groceryList; } @@ -77,7 +82,7 @@ public GroceryList loadGroceryFile(){ * @param line The string to parse. * @return The parsed grocery object. */ - private Grocery parseGrocery(String line) { + private Grocery parseGrocery(String line) throws EmptyInputException { String[] parts = line.split(" \\| "); String name = parts[0].trim(); int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); From 23ec462e2813c50d53cf5d9449e351efdf782ab7 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 00:28:53 +0800 Subject: [PATCH 246/339] Fix exiring command and add email notification --- build.gradle | 2 + src/main/java/email/EmailNotifier.java | 61 +++++++++++ src/main/java/git/Parser.java | 4 +- src/main/java/grocery/ExpirationChecker.java | 103 +++++++++++++++++++ 4 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 src/main/java/email/EmailNotifier.java create mode 100644 src/main/java/grocery/ExpirationChecker.java diff --git a/build.gradle b/build.gradle index bbe50bad45..9f7448e92d 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,8 @@ repositories { dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' + implementation 'com.sun.mail:jakarta.mail:2.0.1' + implementation 'org.jline:jline:3.20.0' } test { diff --git a/src/main/java/email/EmailNotifier.java b/src/main/java/email/EmailNotifier.java new file mode 100644 index 0000000000..6b292fce3b --- /dev/null +++ b/src/main/java/email/EmailNotifier.java @@ -0,0 +1,61 @@ +package email; + +import jakarta.mail.Authenticator; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.AuthenticationFailedException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; +import java.util.Properties; + +/** + * Represents an email notifier that sends email notifications. + */ +public class EmailNotifier { + + // Constants + private static final String USERNAME = "liuli.shisuo.5511@gmail.com"; + private static final String APP_PASSWORD = "scwy avwe xvyy qyzw"; + + /** + * Sends an email to the recipient. + * + * @param recipient Recipient's email address. + * @param subject Subject of the email. + * @param content Content of the email. + */ + public static void sendEmail(String recipient, String subject, String content) { + Properties props = new Properties(); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.starttls.enable", "true"); + props.put("mail.smtp.host", "smtp.gmail.com"); + props.put("mail.smtp.port", "587"); + + Session session = Session.getInstance(props, new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(USERNAME, APP_PASSWORD); + } + }); + + try { + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(USERNAME)); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient)); + message.setSubject(subject); + message.setText(content); + + Transport.send(message); + System.out.println("Email sent successfully to " + recipient); + } catch (AuthenticationFailedException e) { + System.err.println("Authentication failed: Check your username and app-specific password."); + e.printStackTrace(); + } catch (MessagingException e) { + System.err.println("Failed to send email: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 607b773029..3e53725bdc 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -12,6 +12,7 @@ import exceptions.emptyinput.EmptyInputException; import food.Food; import food.FoodList; +import grocery.ExpirationChecker; import grocery.Grocery; import grocery.GroceryList; import grocery.location.Location; @@ -473,7 +474,8 @@ private void viewListOrHelp(GroceryCommand command, String[] commandParts) throw break; case EXPIRING: - groceryList.displayGroceriesExpiringInNext3Days(); + ExpirationChecker expirationChecker = new ExpirationChecker(groceryList); + expirationChecker.run(); break; case LOW: diff --git a/src/main/java/grocery/ExpirationChecker.java b/src/main/java/grocery/ExpirationChecker.java new file mode 100644 index 0000000000..5cdd159ade --- /dev/null +++ b/src/main/java/grocery/ExpirationChecker.java @@ -0,0 +1,103 @@ +package grocery; + +import email.EmailNotifier; + +import java.time.LocalDate; +import java.util.List; +import java.util.Scanner; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +/** + * Represents a checker that checks for groceries nearing expiration. + */ +public class ExpirationChecker { + private GroceryList groceryList; + + /** + * Constructs an ExpirationChecker. + * + * @param groceryList GroceryList to check for expiration. + */ + public ExpirationChecker(GroceryList groceryList) { + this.groceryList = groceryList; + } + + /** + * Runs the expiration checker. + */ + public void run() { + StringBuilder emailContent = new StringBuilder("Items nearing expiration:\n\n"); + boolean hasExpiringItems = false; + + System.out.println("Checking for groceries nearing expiration..."); + List groceries = groceryList.getGroceries(); + LocalDate today = LocalDate.now(); + for (Grocery grocery : groceries) { + LocalDate expirationDate = grocery.getExpiration(); + if (expirationDate != null && expirationDate.isBefore(today.plusDays(3))) { + System.out.println(grocery.getName() + " is nearing expiration on " + expirationDate); + emailContent.append(grocery.getName()).append(" expires on ").append(expirationDate).append("\n"); + System.out.println("Do you wish to send a notification email? (y/n)"); + Scanner scanner = new Scanner(System.in); + String response = scanner.nextLine().trim().toLowerCase(); + if (response.equals("y")) { + hasExpiringItems = true; + } else if(response.equals("n")){ + continue; + } else { + System.out.println("Invalid input. Please enter 'y' or 'n'."); + continue; + } + } + } + + if (hasExpiringItems) { + sendExpiryNotification(emailContent.toString()); + } else { + System.out.println("No items are nearing expiration within the next 3 days."); + } + } + + /** + * Sends an email notification to the user. + * + * @param content Content of the email. + */ + private void sendExpiryNotification(String content) { + Scanner scanner = new Scanner(System.in); + try { + System.out.println("Please enter your email to receive notifications:"); + String recipient = scanner.nextLine(); + + // Validate the email address + if (!isValidEmail(recipient)) { + System.out.println("The email address entered is invalid."); + return; + } + + System.out.println("Sending notification email..."); + + String subject = "Grocery Expiry Notification"; + EmailNotifier.sendEmail(recipient, subject, content); // Send the email + } catch (Exception e) { + System.err.println("An error occurred while sending the email notification: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Validates the email address. + * + * @param email Email address to validate. + * @return True if the email address is valid, false otherwise. + */ + private boolean isValidEmail(String email) { + String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$"; + Pattern pattern = Pattern.compile(emailRegex); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + + +} From 79eeca1cee598a32bf37df93a16e36da5635522c Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 00:43:39 +0800 Subject: [PATCH 247/339] Remove some developer comments in Ui --- src/main/java/git/Ui.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9026c30b9e..612eb9fe23 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -17,12 +17,10 @@ public class Ui { private static final double MAX_AGE = 160; private static Ui singleUi = null; private static Scanner in; - // ATTRIBUTES private static String userName; private Storage storage; private UserInfo userInfo; - // METHODS /** * Constructs Ui and initialises Scanner to read input. */ From 84f8aa65e6a42be3955e58321ae83bba1f706c1d Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 12:08:34 +0800 Subject: [PATCH 248/339] Updated User Guide, help list. Organised User Guide commands for Grocery Management into 3 categories. --- data/groceryList.txt | 1 + docs/UserGuide.md | 184 ++++++++++++++++++++++++++----------------- 2 files changed, 112 insertions(+), 73 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index e69de29bb2..f0ed37f554 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -0,0 +1 @@ +abc | null | null | null | | null | null diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a1b2d574e4..cf2adfdff7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -13,24 +13,28 @@ It allows users to track and manage their groceries around their home easily. - [Features](#features) - [Switching between different modes: `switch`](#switching-between-different-modes-switch) - [Grocery management mode](#grocery-management-mode) - - [Adding a new grocery: `add`](#adding-a-new-grocery-add) - - [Deleting a grocery: `del`](#deleting-a-grocery-del) - - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) - - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) - - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - - [Using a grocery: `use`](#using-a-grocery-use) - - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) - - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) - - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) - - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) - - [Finding groceries: `find`](#finding-groceries-find) - - [Adding a storage location: `loc`](#adding-a-storage-location-loc) - - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) - - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - - [Listing all groceries: `list`](#listing-all-groceries-list) - - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) - - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) - - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) + - [Add / Edit Grocery Commands](#add--edit-groceries) + - [Adding a new grocery: `add`](#adding-a-new-grocery-add) + - [Deleting a grocery: `del`](#deleting-a-grocery-del) + - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) + - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) + - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) + - [Using a grocery: `use`](#using-a-grocery-use) + - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) + - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) + - [Adding remark for a grocery: `remark`](#adding-a-remark-for-a-grocery-remark) + - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) + - [View / List / Find grocery Commands](#view--list--find-groceries) + - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) + - [Finding groceries: `find`](#finding-groceries-find) + - [Listing all groceries: `list`](#listing-all-groceries-list) + - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) + - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) + - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) + - [Add / Edit Grocery Location Commands](#add--edit-grocery-location) + - [Adding a storage location: `loc`](#adding-a-storage-location-loc) + - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) + - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - [Calories management mode](#calories-management-mode) - [Adding eaten food: `eat`](#adding-eaten-food-eat) - [Viewing all food and calories intake: `view`](#viewing-all-food-and-calories-intake-view) @@ -57,6 +61,8 @@ It allows users to track and manage their groceries around their home easily. > #### Notes about the command format > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. +> * Do not use command words / tag to name grocery / recipe etc. +>
e.g. Do not name grocery "a/". ## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. @@ -75,12 +81,13 @@ Example of usage:   ## Grocery management mode - > #### Notes about this mode > * Features requiring the `GROCERY` or `LOCATION` inputs are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. >
e.g. `store GROCERY l/LOCATION` works the same using `freezer` or `FREEZER`. +## Add / Edit Groceries Commands + ### Adding a new grocery: `add` Adds a grocery and any desired additional details. @@ -238,17 +245,15 @@ Example of usage: `th milk a/1` -   -### Viewing groceries that are low in stock: `low` -Shows a list of groceries below the threshold amount. +### Adding a remark for a grocery: `remark` +Adds a remark for existing grocery. +The remark for the grocery will be displayed in `list` and `view`. -Format: `low` +Format: `remark GROCERY r/REMARK` Example of usage: - -`low` - +`remark milk r/save some for next week`   ### Adding rating and review of a grocery: `rate` @@ -260,68 +265,52 @@ Example of usage: `rate milk` +## View / List / Find Grocery Commands   -### Finding groceries: `find` -Find groceries containing a given keyword in their name. +### Viewing a grocery: `view` +Shows all the details of the grocery. -Format: `find KEYWORD` - -* The search is case-insensitive. -* If a phrase is passed, the entire phrase is searched for. +Format: `view GROCERY` Example of usage: - -`find cheese` - -![Find example](images/featureEg/Find.png) - +``` +view apple +These are the details of fuji apple: +Amount: 5 +Expiry date: not set +Category: Fruit +Cost: not set +Location: Fridge +Rating: 4 +Review: buy the same brand next time +Remark: not set +```   -### Adding a storage location: `loc` -Add a storage location to be tracked. - -Format: `loc LOCATION` +### Viewing groceries that are low in stock: `low` +Shows a list of groceries below the threshold amount. -* Duplicate locations will not be added. +Format: `low` Example of usage: -`loc freezer` - -![Loc example](/images/featureEg/Loc.png) +`low`   -### Storing a grocery in a storage location: `store` -Store a grocery in a given storage location. - -Format: `store GROCERY l/LOCATION` - -* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. - -Example of usage: - -`store paprika l/spice rack` - -* Location exists - - ![Store example](/images/featureEg/Store.png) - -* Location does not exist - - ![Store in new location example](/images/featureEg/StoreNEW.png) +### Finding groceries: `find` +Find groceries containing a given keyword in their name. -  -### Removing a storage location: `delloc` -Remove a storage location from tracking. +Format: `find KEYWORD` -Format: `delloc LOCATION` +* The search is case-insensitive. +* If a phrase is passed, the entire phrase is searched for. Example of usage: -`delloc cabinet` +`find cheese` -![Delloc example](images/featureEg/Del.png) +![Find example](images/featureEg/Find.png)   ### Listing all groceries: `list` @@ -373,7 +362,53 @@ Example of usage: ![Listloc LOCATION example](images/featureEg/ListlocLOC.png) +## Add / Edit Grocery Location Commands + +  +### Adding a storage location: `loc` +Add a storage location to be tracked. + +Format: `loc LOCATION` + +* Duplicate locations will not be added. + +Example of usage: + +`loc freezer` +![Loc example](/images/featureEg/Loc.png) + +  +### Storing a grocery in a storage location: `store` +Store a grocery in a given storage location. + +Format: `store GROCERY l/LOCATION` + +* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. + +Example of usage: + +`store paprika l/spice rack` + +* Location exists + + ![Store example](/images/featureEg/Store.png) + +* Location does not exist + + ![Store in new location example](/images/featureEg/StoreNEW.png) + +  +### Removing a storage location: `delloc` +Remove a storage location from tracking. + +Format: `delloc LOCATION` + +Example of usage: + +`delloc cabinet` + +![Delloc example](images/featureEg/Del.png)   ## Calories management mode @@ -523,16 +558,19 @@ Fried Egg is removed from the recipe list. | Use grocery | `use GROCERY a/AMOUNT` | | Set grocery cost | `cost GROCERY $PRICE` | | Set grocery threshold amount | `th GROCERY a/AMOUNT` | -| View groceries that are low in stock | `low` | +| Add or edit remark | `remark GROCERY r/REMARK` | | Add grocery rating and review | `rate GROCERY` | +| View grocery details | `view GROCERY` | | Find groceries | `find KEYWORD` | -| Add storage location | `loc LOCATION` | -| Store grocery | `store GROCERY l/LOCATION` | -| Remove storage location | `delloc LOCATION` | +| View groceries that are low in stock | `low` | | List groceries | `list` | | List groceries by price | `listcost` | | List groceries by expiration date | `listexp` | | List storage locations
List groceries in given location | `listloc [LOCATION]` | +| Add storage location | `loc LOCATION` | +| Store grocery | `store GROCERY l/LOCATION` | +| Remove storage location | `delloc LOCATION` | + ### Calorie management mode From 6bfe1c1fa42c3d348ed52cd85cc81e77d3478fd6 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 12:21:26 +0800 Subject: [PATCH 249/339] Reorganise UG and updated UG --- docs/UserGuide.md | 184 ++++++++++++++++++++++++++++------------------ 1 file changed, 111 insertions(+), 73 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a1b2d574e4..cf2adfdff7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -13,24 +13,28 @@ It allows users to track and manage their groceries around their home easily. - [Features](#features) - [Switching between different modes: `switch`](#switching-between-different-modes-switch) - [Grocery management mode](#grocery-management-mode) - - [Adding a new grocery: `add`](#adding-a-new-grocery-add) - - [Deleting a grocery: `del`](#deleting-a-grocery-del) - - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) - - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) - - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - - [Using a grocery: `use`](#using-a-grocery-use) - - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) - - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) - - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) - - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) - - [Finding groceries: `find`](#finding-groceries-find) - - [Adding a storage location: `loc`](#adding-a-storage-location-loc) - - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) - - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - - [Listing all groceries: `list`](#listing-all-groceries-list) - - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) - - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) - - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) + - [Add / Edit Grocery Commands](#add--edit-groceries) + - [Adding a new grocery: `add`](#adding-a-new-grocery-add) + - [Deleting a grocery: `del`](#deleting-a-grocery-del) + - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) + - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) + - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) + - [Using a grocery: `use`](#using-a-grocery-use) + - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) + - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) + - [Adding remark for a grocery: `remark`](#adding-a-remark-for-a-grocery-remark) + - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) + - [View / List / Find grocery Commands](#view--list--find-groceries) + - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) + - [Finding groceries: `find`](#finding-groceries-find) + - [Listing all groceries: `list`](#listing-all-groceries-list) + - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) + - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) + - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) + - [Add / Edit Grocery Location Commands](#add--edit-grocery-location) + - [Adding a storage location: `loc`](#adding-a-storage-location-loc) + - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) + - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - [Calories management mode](#calories-management-mode) - [Adding eaten food: `eat`](#adding-eaten-food-eat) - [Viewing all food and calories intake: `view`](#viewing-all-food-and-calories-intake-view) @@ -57,6 +61,8 @@ It allows users to track and manage their groceries around their home easily. > #### Notes about the command format > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. +> * Do not use command words / tag to name grocery / recipe etc. +>
e.g. Do not name grocery "a/". ## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. @@ -75,12 +81,13 @@ Example of usage:   ## Grocery management mode - > #### Notes about this mode > * Features requiring the `GROCERY` or `LOCATION` inputs are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. >
e.g. `store GROCERY l/LOCATION` works the same using `freezer` or `FREEZER`. +## Add / Edit Groceries Commands + ### Adding a new grocery: `add` Adds a grocery and any desired additional details. @@ -238,17 +245,15 @@ Example of usage: `th milk a/1` -   -### Viewing groceries that are low in stock: `low` -Shows a list of groceries below the threshold amount. +### Adding a remark for a grocery: `remark` +Adds a remark for existing grocery. +The remark for the grocery will be displayed in `list` and `view`. -Format: `low` +Format: `remark GROCERY r/REMARK` Example of usage: - -`low` - +`remark milk r/save some for next week`   ### Adding rating and review of a grocery: `rate` @@ -260,68 +265,52 @@ Example of usage: `rate milk` +## View / List / Find Grocery Commands   -### Finding groceries: `find` -Find groceries containing a given keyword in their name. +### Viewing a grocery: `view` +Shows all the details of the grocery. -Format: `find KEYWORD` - -* The search is case-insensitive. -* If a phrase is passed, the entire phrase is searched for. +Format: `view GROCERY` Example of usage: - -`find cheese` - -![Find example](images/featureEg/Find.png) - +``` +view apple +These are the details of fuji apple: +Amount: 5 +Expiry date: not set +Category: Fruit +Cost: not set +Location: Fridge +Rating: 4 +Review: buy the same brand next time +Remark: not set +```   -### Adding a storage location: `loc` -Add a storage location to be tracked. - -Format: `loc LOCATION` +### Viewing groceries that are low in stock: `low` +Shows a list of groceries below the threshold amount. -* Duplicate locations will not be added. +Format: `low` Example of usage: -`loc freezer` - -![Loc example](/images/featureEg/Loc.png) +`low`   -### Storing a grocery in a storage location: `store` -Store a grocery in a given storage location. - -Format: `store GROCERY l/LOCATION` - -* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. - -Example of usage: - -`store paprika l/spice rack` - -* Location exists - - ![Store example](/images/featureEg/Store.png) - -* Location does not exist - - ![Store in new location example](/images/featureEg/StoreNEW.png) +### Finding groceries: `find` +Find groceries containing a given keyword in their name. -  -### Removing a storage location: `delloc` -Remove a storage location from tracking. +Format: `find KEYWORD` -Format: `delloc LOCATION` +* The search is case-insensitive. +* If a phrase is passed, the entire phrase is searched for. Example of usage: -`delloc cabinet` +`find cheese` -![Delloc example](images/featureEg/Del.png) +![Find example](images/featureEg/Find.png)   ### Listing all groceries: `list` @@ -373,7 +362,53 @@ Example of usage: ![Listloc LOCATION example](images/featureEg/ListlocLOC.png) +## Add / Edit Grocery Location Commands + +  +### Adding a storage location: `loc` +Add a storage location to be tracked. + +Format: `loc LOCATION` + +* Duplicate locations will not be added. + +Example of usage: + +`loc freezer` +![Loc example](/images/featureEg/Loc.png) + +  +### Storing a grocery in a storage location: `store` +Store a grocery in a given storage location. + +Format: `store GROCERY l/LOCATION` + +* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. + +Example of usage: + +`store paprika l/spice rack` + +* Location exists + + ![Store example](/images/featureEg/Store.png) + +* Location does not exist + + ![Store in new location example](/images/featureEg/StoreNEW.png) + +  +### Removing a storage location: `delloc` +Remove a storage location from tracking. + +Format: `delloc LOCATION` + +Example of usage: + +`delloc cabinet` + +![Delloc example](images/featureEg/Del.png)   ## Calories management mode @@ -523,16 +558,19 @@ Fried Egg is removed from the recipe list. | Use grocery | `use GROCERY a/AMOUNT` | | Set grocery cost | `cost GROCERY $PRICE` | | Set grocery threshold amount | `th GROCERY a/AMOUNT` | -| View groceries that are low in stock | `low` | +| Add or edit remark | `remark GROCERY r/REMARK` | | Add grocery rating and review | `rate GROCERY` | +| View grocery details | `view GROCERY` | | Find groceries | `find KEYWORD` | -| Add storage location | `loc LOCATION` | -| Store grocery | `store GROCERY l/LOCATION` | -| Remove storage location | `delloc LOCATION` | +| View groceries that are low in stock | `low` | | List groceries | `list` | | List groceries by price | `listcost` | | List groceries by expiration date | `listexp` | | List storage locations
List groceries in given location | `listloc [LOCATION]` | +| Add storage location | `loc LOCATION` | +| Store grocery | `store GROCERY l/LOCATION` | +| Remove storage location | `delloc LOCATION` | + ### Calorie management mode From 64658f6f36877d901005067fe09caedbf9eb8ee1 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 12:22:58 +0800 Subject: [PATCH 250/339] Add more test code --- build.gradle | 2 + .../java/exceptions/InvalidDateException.java | 8 ++ src/main/java/grocery/GroceryList.java | 2 +- src/test/java/grocery/GroceryListTest.java | 110 ++++++++++++++++-- src/test/java/grocery/GroceryTest.java | 62 ++++++++++ 5 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 src/main/java/exceptions/InvalidDateException.java diff --git a/build.gradle b/build.gradle index 9f7448e92d..95a66585d8 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,8 @@ dependencies { testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' implementation 'com.sun.mail:jakarta.mail:2.0.1' implementation 'org.jline:jline:3.20.0' + implementation 'com.beust:jcommander:1.81' + testImplementation 'org.mockito:mockito-core:3.12.4' } test { diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java new file mode 100644 index 0000000000..f204a38298 --- /dev/null +++ b/src/main/java/exceptions/InvalidDateException.java @@ -0,0 +1,8 @@ +package exceptions; + +public class InvalidDateException extends RuntimeException { + public InvalidDateException(String message) { + super(message); + } +} + diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 37bb0b21bd..1d80b61102 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -88,7 +88,7 @@ public boolean isGroceryExists(String name) { * @return The needed grocery. * @throws NoSuchObjectException If the selected grocery does not exist. */ - private Grocery getGrocery(String name) throws NoSuchObjectException { + Grocery getGrocery(String name) throws NoSuchObjectException { int index = -1; for (Grocery grocery : groceries) { if(grocery.getName().equalsIgnoreCase(name)) { diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 530fef5e61..2b67ffbcc6 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -9,13 +9,51 @@ import org.junit.jupiter.api.Test; import java.time.LocalDate; +import java.util.List; import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class GroceryListTest { + @Test + public void addGrocery_success() { + GroceryList gl = new GroceryList(); + Grocery grocery = new Grocery("Apples", 10, 5, LocalDate.of(2024, 12, 31), "Fruit", 2.99, null); + gl.addGrocery(grocery); + assertTrue(gl.getGroceries().contains(grocery), "Grocery should be added to the list."); + } + + @Test + public void addGrocery_throwNULL_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery(null)); + fail("Expected IllegalArgumentException was not thrown."); + } catch (NullPointerException e) { + assertNull(e.getMessage()); + } + } + + @Test + public void isGroceryExists_true() { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Bananas")); + assertTrue(gl.isGroceryExists("Bananas"), "Grocery should exist in the list."); + } + + @Test + public void isGroceryExists_false() { + GroceryList gl = new GroceryList(); + assertFalse(gl.isGroceryExists("Bananas"), "Grocery should not exist in the list."); + } + + + @Test public void editExpiration_success() { GroceryList gl = new GroceryList(); @@ -26,6 +64,22 @@ public void editExpiration_success() { fail("editExpiration should not throw an exception"); } } + + @Test + public void listGroceries_emptyList() { + GroceryList gl = new GroceryList(); + gl.listGroceries(); + assertTrue(gl.getGroceries().isEmpty(), "There should be no groceries to list."); + } + + @Test + public void listGroceries_containsItems() { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Potatoes", 50, 20, LocalDate.of(2024, 11, 30), "Vegetable", 0.25, null)); + gl.listGroceries(); + assertFalse(gl.getGroceries().isEmpty(), "Grocery list should contain items."); + } + @Test public void editExpiration_noSuchGrocery_exceptionThrown() { @@ -55,16 +109,14 @@ public void editExpiration_wrongFormat_exceptionThrown() { } @Test - public void addGrocery_throwNULL_exceptionThrown() { - try { - GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery(null)); - fail("Expected IllegalArgumentException was not thrown."); - } catch (NullPointerException e) { - assertNull(e.getMessage()); - } + public void editCategory_nonExistingGrocery_throwsException() { + GroceryList gl = new GroceryList(); + Exception exception = assertThrows(NoSuchObjectException.class, () -> gl.editCategory("Milk c/Beverage")); + assertTrue(exception.getMessage().contains("does not exist"), + "Expected NoSuchObjectException for non-existing grocery."); } + @Test public void removeGrocery_groceryDelete_exceptionThrown() { try { @@ -122,4 +174,46 @@ public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { } } + @Test + public void testSortByExpiration() { + // Create a grocery list instance + GroceryList gl = new GroceryList(); + + // Create and add groceries with various expiration dates + Grocery grocery1 = new Grocery("Milk", 0, 0, LocalDate.parse("2024-04-10"), "dairy", 0, null); + Grocery grocery2 = new Grocery("Bread", 0, 0, LocalDate.parse("2024-04-20"), "baked", 0, null); + Grocery grocery3 = new Grocery("Eggs"); // No expiration date set + + gl.addGrocery(grocery1); + gl.addGrocery(grocery2); + gl.addGrocery(grocery3); + + // Sort the groceries by expiration + gl.sortByExpiration(); + + // Get the sorted list of groceries + List sortedGroceries = gl.getGroceries(); + + // Assertions to check if the groceries are sorted correctly + assertEquals(grocery1, sortedGroceries.get(0), "Milk should be first as it expires first."); + assertEquals(grocery2, sortedGroceries.get(1), "Bread should be second as it expires next."); + assertEquals(grocery3, sortedGroceries.get(2), "Eggs should be last as it has no expiration date."); + } + + @Test + public void removeGrocery_success() throws GitException { + GroceryList gl = new GroceryList(); + Grocery grocery = new Grocery("Oranges", 20, 10, LocalDate.of(2024, 12, 31), "Fruit", 0.99, null); + gl.addGrocery(grocery); + gl.removeGrocery("Oranges"); + assertFalse(gl.getGroceries().contains(grocery), "Grocery should be removed from the list."); + } + + @Test + public void removeGrocery_nonExisting_throwsException() { + GroceryList gl = new GroceryList(); + assertThrows(NoSuchObjectException.class, () -> gl.removeGrocery("Oranges"), + "Should throw an exception for non-existing grocery."); + } + } diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 3357db3cde..b2e48f6f69 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -4,9 +4,71 @@ import grocery.location.Location; import org.junit.jupiter.api.Test; + +import exceptions.PastExpirationDateException; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class GroceryTest { + @Test + public void setExpiration_validDate() throws PastExpirationDateException { + Grocery grocery = new Grocery("Milk"); + grocery.setExpiration("2024-12-31"); + assertEquals(LocalDate.parse("2024-12-31"), grocery.getExpiration(), + "Expiration date should be set correctly."); + } + + @Test + public void setExpiration_pastDate_throwsException() { + Grocery grocery = new Grocery("Milk"); + // Adjust the exception type to match the actual implementation + assertThrows(PastExpirationDateException.class, () -> grocery.setExpiration("2020-01-01"), + "Should throw PastExpirationDateException for past dates."); + } + + @Test + public void setAmount_positiveAmount() { + Grocery grocery = new Grocery("Water", 0, 0, LocalDate.parse("2024-12-31"), "Beverage", 1.00, null); + grocery.setAmount(10); + assertEquals(10, grocery.getAmount(), "Amount should be set correctly."); + } + + @Test + public void setAmount_negativeAmount_throwsAssertionError() { + Grocery grocery = new Grocery("Water"); + assertThrows(AssertionError.class, () -> grocery.setAmount(-5), + "Should throw AssertionError for negative amount."); + } + + @Test + public void setCost_positiveValue() { + Grocery grocery = new Grocery("Butter", 5, 3, LocalDate.now(), "Dairy", 0, null); + grocery.setCost(3.99); + assertEquals(3.99, grocery.getCost(), "Cost should be set correctly."); + } + + @Test + public void setCost_negativeValue_throwsAssertionError() { + Grocery grocery = new Grocery("Butter"); + assertThrows(AssertionError.class, () -> grocery.setCost(-1.00), + "Should throw AssertionError for negative cost."); + } + + @Test + public void isLow_belowThreshold_true() { + Grocery grocery = new Grocery("Eggs", 1, 5, LocalDate.parse("2024-12-31"), "Poultry", 1.50, null); + assertTrue(grocery.isLow(), "Should return true as the amount is below the threshold."); + } + + @Test + public void isLow_aboveThreshold_false() { + Grocery grocery = new Grocery("Eggs", 10, 5, LocalDate.parse("2024-12-31"), "Poultry", 1.50, null); + assertFalse(grocery.isLow(), "Should return false as the amount is above the threshold."); + } + @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0, new Location("Pantry")); From b886879199f2c003e7a11b7437e91038050813de Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 12:24:58 +0800 Subject: [PATCH 251/339] Delete grocery --- data/groceryList.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index f0ed37f554..e69de29bb2 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1 +0,0 @@ -abc | null | null | null | | null | null From 76d9ad4f2648e48e5be19b881895e81fb661a002 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 13:38:08 +0800 Subject: [PATCH 252/339] Update DG and UG --- build.gradle | 17 +++++++++------- data/groceryList.txt | 5 +++++ docs/DeveloperGuide.md | 46 ++++++++++++++++++++++++++++++++++++++++-- docs/UserGuide.md | 21 +++++++++++++++++++ 4 files changed, 80 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 95a66585d8..c551dd6dc2 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,11 @@ dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' implementation 'com.sun.mail:jakarta.mail:2.0.1' - implementation 'org.jline:jline:3.20.0' - implementation 'com.beust:jcommander:1.81' - testImplementation 'org.mockito:mockito-core:3.12.4' + implementation 'org.jline:jline:3.25.0' +} + +java { + // If any Java-specific configurations are needed, they should go here. } test { @@ -23,12 +25,11 @@ test { testLogging { events "passed", "skipped", "failed" - showExceptions true exceptionFormat "full" showCauses true showStackTraces true - showStandardStreams = false + showStandardStreams false } } @@ -45,7 +46,9 @@ checkstyle { toolVersion = '10.2' } -run{ +run { standardInput = System.in - enableAssertions = true; + enableAssertions = true } + +// Ensure there are no indirect uses of deprecated APIs in custom tasks or other configurations diff --git a/data/groceryList.txt b/data/groceryList.txt index e69de29bb2..9706514403 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -0,0 +1,5 @@ +Milk | null | null | 2024-04-10 | dairy | null | null +Bread | null | null | 2024-04-20 | baked | null | null +Eggs | null | null | null | | null | null +apple | null | null | 2024-04-14 | | null | null +pear | null | null | 2024-04-15 | | null | null diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 09afa93d9b..8bbfaf3109 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -3,6 +3,45 @@ ## Acknowledgements {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +This project makes use of several open-source software and libraries. We acknowledge and are grateful to the community for these contributions: + +### Libraries + +1. **JUnit 5 (Jupiter API and Engine)** + JUnit 5 is used for writing and running repeatable tests in Java. It's a fundamental part of our testing framework, ensuring our application functions as intended. + - **Version**: 5.10.0 + - [JUnit 5 Documentation](https://junit.org/junit5/docs/current/user-guide/) + +2. **Jakarta Mail (formerly JavaMail)** + Jakarta Mail API is used for constructing and sending emails directly from our application, which is critical for notification features. + - **Version**: 2.0.1 + - [Jakarta Mail Documentation](https://eclipse-ee4j.github.io/mail/) + +3. **JLine 3** + JLine 3 is a library for handling console input, improving the user interaction experience in command-line applications by providing features like line editing, history, or tab completion. + - **Version**: 3.25.0 + - [JLine 3 GitHub Repository](https://github.com/jline/jline3) + +### Tools + +4. **Gradle Shadow Plugin** + The Gradle Shadow Plugin is used to create a single distributable JAR file containing all dependencies, simplifying deployment and execution. + - **Version**: 7.1.2 + - [Gradle Shadow Plugin Documentation](https://imperceptiblethoughts.com/shadow/) + +5. **Checkstyle** + Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. It automates the process of checking Java code, which is helpful in maintaining code quality. + - **Version**: 10.2 + - [Checkstyle Documentation](https://checkstyle.sourceforge.io/) + +### Development Environment + +6. **Gradle** + Gradle is our chosen build automation tool which simplifies compiling, testing, and packaging the code. + - [Gradle Documentation](https://gradle.org/guides/) + +We would like to thank the developers and contributors of these projects for their efforts in maintaining such useful resources. Their hard work and dedication make software development more efficient and error-free. + ## Design & implementation @@ -114,6 +153,9 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as   ### 8. Editing expiration date after it is added * In GroceryList class, modified the editExpiration method to parse String into localdate. + * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameters: + 1. details: String — User input read from `Scanner`. + * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. ## Product scope @@ -145,9 +187,9 @@ Furthermore, the app can generate a list of items that are expiring soon, remind | v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | | v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | | v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | -| v2.0 | user who replenishes groceries | set threshold amount for the groceries | know what groceries I should top up | +| v2.0 | user who replenishes groceries| set threshold amount for the groceries | know what groceries I should top up | | v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | -| v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | +| v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | ## Non-Functional Requirements diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a1b2d574e4..f00dfd0b5d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -323,6 +323,26 @@ Example of usage: ![Delloc example](images/featureEg/Del.png) +  +### Presenting all expiring groceries: `expiring` +Show all the expiring groceries and send email notification if needed. + +Foramt: `expiring` + +Example of usage: + +``` +expiring +Checking for groceries nearing expiration... +Milk is nearing expiration on 2024-04-10 +Do you wish to send a notification email? (y/n) +y +Please enter your email to receive notifications: +example@gamil.com +Sending notification email... +Email sent successfully to example@gmail.com +``` +   ### Listing all groceries: `list` Shows a list of all groceries you have. @@ -529,6 +549,7 @@ Fried Egg is removed from the recipe list. | Add storage location | `loc LOCATION` | | Store grocery | `store GROCERY l/LOCATION` | | Remove storage location | `delloc LOCATION` | +| Show all expiring groceries | `expiring` | | List groceries | `list` | | List groceries by price | `listcost` | | List groceries by expiration date | `listexp` | From 62c2233e56a2873e263fb9de1956788e22a455f9 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 13:39:59 +0800 Subject: [PATCH 253/339] Update jline library version to 3.20.0 --- build.gradle | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index c551dd6dc2..7ffe22c927 100644 --- a/build.gradle +++ b/build.gradle @@ -13,11 +13,7 @@ dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' implementation 'com.sun.mail:jakarta.mail:2.0.1' - implementation 'org.jline:jline:3.25.0' -} - -java { - // If any Java-specific configurations are needed, they should go here. + implementation 'org.jline:jline:3.20.0' } test { @@ -25,11 +21,12 @@ test { testLogging { events "passed", "skipped", "failed" + showExceptions true exceptionFormat "full" showCauses true showStackTraces true - showStandardStreams false + showStandardStreams = false } } @@ -46,9 +43,7 @@ checkstyle { toolVersion = '10.2' } -run { +run{ standardInput = System.in - enableAssertions = true -} - -// Ensure there are no indirect uses of deprecated APIs in custom tasks or other configurations + enableAssertions = true; +} \ No newline at end of file From a540b5ad9d9072adff4e57a3d56921e6f0fd6aeb Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 14:45:50 +0800 Subject: [PATCH 254/339] Update User Guide and clean up printGrocery --- data/groceryList.txt | 7 + docs/UserGuide.md | 319 ++++++++++++++++----------- docs/images/featureEg/Amt.png | Bin 2886 -> 0 bytes docs/images/featureEg/Del.png | Bin 13336 -> 0 bytes docs/images/featureEg/Delloc.png | Bin 6085 -> 0 bytes docs/images/featureEg/Find.png | Bin 14355 -> 0 bytes docs/images/featureEg/Listloc.png | Bin 8022 -> 0 bytes docs/images/featureEg/ListlocLOC.png | Bin 17716 -> 0 bytes docs/images/featureEg/Loc.png | Bin 4346 -> 0 bytes docs/images/featureEg/Store.png | Bin 5355 -> 0 bytes docs/images/featureEg/StoreNEW.png | Bin 8078 -> 0 bytes docs/images/featureEg/Switch.png | Bin 6754 -> 0 bytes docs/images/featureEg/Use.png | Bin 3334 -> 0 bytes docs/images/featureEg/UseALL.png | Bin 4878 -> 0 bytes src/main/java/grocery/Grocery.java | 12 +- 15 files changed, 212 insertions(+), 126 deletions(-) delete mode 100644 docs/images/featureEg/Amt.png delete mode 100644 docs/images/featureEg/Del.png delete mode 100644 docs/images/featureEg/Delloc.png delete mode 100644 docs/images/featureEg/Find.png delete mode 100644 docs/images/featureEg/Listloc.png delete mode 100644 docs/images/featureEg/ListlocLOC.png delete mode 100644 docs/images/featureEg/Loc.png delete mode 100644 docs/images/featureEg/Store.png delete mode 100644 docs/images/featureEg/StoreNEW.png delete mode 100644 docs/images/featureEg/Switch.png delete mode 100644 docs/images/featureEg/Use.png delete mode 100644 docs/images/featureEg/UseALL.png diff --git a/data/groceryList.txt b/data/groceryList.txt index e69de29bb2..10d252026d 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -0,0 +1,7 @@ +Milk | 3 | null | 2024-04-10 | dairy | null | null +Bread | null | null | 2024-04-20 | baked | null | null +Eggs | null | null | null | | null | null +bal | 2 | null | null | | null | 3 +cheese | 50 | null | null | | null | cubby +red cheddar cheese | 4 | 5 | null | | null | null +pasta | null | null | null | | 2.95 | cubby diff --git a/docs/UserGuide.md b/docs/UserGuide.md index cf2adfdff7..8de83faaca 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -13,27 +13,29 @@ It allows users to track and manage their groceries around their home easily. - [Features](#features) - [Switching between different modes: `switch`](#switching-between-different-modes-switch) - [Grocery management mode](#grocery-management-mode) - - [Add / Edit Grocery Commands](#add--edit-groceries) + - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) - - [Deleting a grocery: `del`](#deleting-a-grocery-del) - - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) - - [Viewing groceries expiring in the next 3 days](#viewing-groceries-expiring-in-the-next-3-days-expiring) + - [Setting the category of a grocery: `cat`](#setting-the-category-of-a-grocery-cat) - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - [Using a grocery: `use`](#using-a-grocery-use) + - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) + - [Setting the expiration date of a grocery: `exp`](#setting-the-expiration-date-of-a-grocery-exp) - [Setting the cost of a grocery: `cost`](#setting-the-cost-of-a-grocery-cost) - [Setting the threshold of a grocery: `th`](#setting-the-threshold-of-a-grocery-th) - - [Adding remark for a grocery: `remark`](#adding-a-remark-for-a-grocery-remark) + - [Adding a remark for a grocery: `remark`](#adding-a-remark-for-a-grocery-remark) - [Adding rating and review of a grocery: `rate`](#adding-rating-and-review-of-a-grocery-rate) - - [View / List / Find grocery Commands](#view--list--find-groceries) - - [View groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) + - [Deleting a grocery: `del`](#deleting-a-grocery-del) + - [Find / View / List Groceries](#find--view--list-groceries) - [Finding groceries: `find`](#finding-groceries-find) + - [Viewing a grocery: `view`](#viewing-a-grocery-view) + - [Viewing groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) + - [Viewing groceries expiring in the next 3 days: `expiring`](#viewing-groceries-expiring-in-the-next-3-days-expiring) - [Listing all groceries: `list`](#listing-all-groceries-list) - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) - - [Add / Edit Grocery Location Commands](#add--edit-grocery-location) + - [Manage Storage Locations](#manage-storage-locations) - [Adding a storage location: `loc`](#adding-a-storage-location-loc) - - [Storing a grocery in a storage location: `store`](#storing-a-grocery-in-a-storage-location-store) - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - [Calories management mode](#calories-management-mode) - [Adding eaten food: `eat`](#adding-eaten-food-eat) @@ -46,7 +48,7 @@ It allows users to track and manage their groceries around their home easily. - [Listing all recipes: `list`](#listing-all-recipes-list) - [Viewing a recipe: `view`](#viewing-a-recipe-view) - [Deleting a recipe: `delete`](#deleting-a-recipe-delete) -- [FAQ](#faq) +- [Data saving and loading](#data-saving-and-loading) - [Command summary](#command-summary) ## Quick Start @@ -55,14 +57,14 @@ It allows users to track and manage their groceries around their home easily. 3. Open a command terminal, `cd` into the folder where the JAR file is and use `java -jar Git.jar` to run Grocery in Time. -  -## Features + +# Features > #### Notes about the command format +> * **Do not use command words / tag to name grocery / recipe etc**. +>
e.g. Do not name grocery "a/". > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. -> * Do not use command words / tag to name grocery / recipe etc. ->
e.g. Do not name grocery "a/". ## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. @@ -73,10 +75,12 @@ Format: `switch` * Enter the desired mode to switch to after inputting `switch`. Example of usage: +``` +>> switch -`switch` - -![Switch example output](images/featureEg/Switch.png) +What mode would you like to enter? +Please select a mode: grocery, profile, calories or recipe: +```   ## Grocery management mode @@ -85,8 +89,9 @@ Example of usage: > * Features requiring the `GROCERY` or `LOCATION` inputs are case-insensitive. >
e.g. `amt GROCERY a/AMOUNT` will set the amount of `milk` or `MILK`. >
e.g. `store GROCERY l/LOCATION` works the same using `freezer` or `FREEZER`. +> * The actual output may differ slightly from the examples due to the addition of lines for better user readability. -## Add / Edit Groceries Commands +### Add / Edit / Delete Groceries ### Adding a new grocery: `add` Adds a grocery and any desired additional details. @@ -102,7 +107,8 @@ Format: `add GROCERY` * If `8` is entered, another menu explaining what each detail means will always be displayed first. * Invalid values are ignored. * This step can be skipped by inputting nothing. -* Any details not included here can be edited using other commands in the future. +* Apart from `category`, any details not included here can be edited using other commands. + * The only detail can cannot be included here is the rating, which is edited using [rate](#adding-rating-and-review-of-a-grocery-rate). Example of usage : ``` @@ -128,95 +134,110 @@ Please enter the amount (e.g. 3): >> 5 -- - - - - Including Location Please enter the location (e.g. freezer first compartment) >> cabinet -- - - - - milk added! -- - - - - ```   -### Deleting a grocery: `del` -Delete a grocery. +### Setting the category of a grocery: `cat` +Sets the category of a grocery. -Format: `del GROCERY` +Format: `cat GROCERY c/CATEGORY` -* If the `GROCERY` was stored in a location, it would be removed from that location. +* `CATEGORY` must be a valid String. Example of usage: - -`del milk` - ``` ->> del milk +>> cat milk c/dairy -This grocery is removed +milk is now a dairy ``` -![Delete example](images/featureEg/Del.png)   -### Setting the expiration date of a grocery: `exp` -Sets the expiration date of a grocery. +### Setting the amount of a grocery: `amt` +Sets the amount of a grocery. -Format: `exp GROCERY d/EXPIRATION_DATE` +Format: `amt GROCERY a/AMOUNT` -* `EXPIRATION_DATE` must be a in yyyy-MM-dd format. +* `AMOUNT` must be a valid integer. Example of usage: +``` +>> amt milk a/5 -`exp milk d/2024-07-20` +milk: 5 +```   -### Viewing groceries expiring in the next 3 days: `expiring` -Shows a list of groceries that are expiring in the next 3 days. +### Using a grocery: `use` +Reduce the amount of a grocery after using it. -Format: `expiring` +Format: `use GROCERY a/AMOUNT` + +* `AMOUNT` must be a valid integer. +* If `AMOUNT` is greater than what the `GROCERY` has in stock, its amount will be reduced to 0. +* If the amount of the `GROCERY` is already 0, GiT will let the user know and the amount stays at 0. Example of usage: +* Amount used is less than amount stored. +``` +>> use meat a/4 -`expiring` +meat: 56 +``` + +* Amount used is greater than amount stored. +``` +>> use meat a/60 + +meat is now out of stock! +```   -### Setting the amount of a grocery: `amt` -Sets the amount of a grocery. +### Storing a grocery in a storage location: `store` +Store a grocery in a given storage location. -Format: `amt GROCERY a/AMOUNT` +Format: `store GROCERY l/LOCATION` -* `AMOUNT` must be a valid integer. +* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. +* More information on storage locations can be found [here](#manage-storage-locations). Example of usage: +* `LOCATION` exists +``` +>> store paprika l/spice rack -`amt milk a/5` - -![Amt example](/images/featureEg/Amt.png) +paprika stored in spice rack +``` -  -### Using a grocery: `use` -Reduce the amount of a grocery after using it. +* `LOCATION` does not exist +``` +>> store onion l/cabinet -Format: `use GROCERY a/AMOUNT` +New location added: cabinet +onion stored in cabinet +``` -* `AMOUNT` must be a valid integer. -* If `AMOUNT` is greater than what the `GROCERY` has in stock, its amount will be reduced to 0. -* If the amount of the `GROCERY` is already 0, GiT will let the user know and the amount stays at 0. -Example of usage: +  +### Setting the expiration date of a grocery: `exp` +Sets the expiration date of a grocery. -* `use meat a/4` +Format: `exp GROCERY d/EXPIRATION_DATE` - ![Use example](/images/featureEg/Use.png) +* `EXPIRATION_DATE` must be in yyyy-MM-dd format. -* `use meat a/60` - amount used is greater than what is in stock. +Example of usage: - ![Use all example](/images/featureEg/UseALL.png) +`exp milk d/2024-07-20`   @@ -245,6 +266,7 @@ Example of usage: `th milk a/1` +   ### Adding a remark for a grocery: `remark` Adds a remark for existing grocery. @@ -255,6 +277,7 @@ Format: `remark GROCERY r/REMARK` Example of usage: `remark milk r/save some for next week` +   ### Adding rating and review of a grocery: `rate` Adds rating and review of an existing grocery @@ -265,7 +288,44 @@ Example of usage: `rate milk` -## View / List / Find Grocery Commands + +  +### Deleting a grocery: `del` +Delete a grocery. + +Format: `del GROCERY` + +* If the `GROCERY` was stored in a location, it would be removed from that location. + +Example of usage: +``` +>> del milk + +This grocery is removed: +milk (dairy), amount: 0, expiration: 2024-04-10, cost: $0.00, location: fridge +You now have 2 groceries left +``` + +  +## Find / View / List Groceries + +### Finding groceries: `find` +Find groceries containing a given keyword in their name. + +Format: `find KEYWORD` + +* The search is case-insensitive. +* If a phrase is passed, the entire phrase is searched for. + +Example of usage: +``` +>> find cheese + +Here are the groceries containg: cheese +- cheese (dairy), amount: 50 +- red cheddar cheese (dairy), amount: 4 +``` +   ### Viewing a grocery: `view` @@ -275,7 +335,8 @@ Format: `view GROCERY` Example of usage: ``` -view apple +>> view apple + These are the details of fuji apple: Amount: 5 Expiry date: not set @@ -287,6 +348,7 @@ Review: buy the same brand next time Remark: not set ``` +   ### Viewing groceries that are low in stock: `low` Shows a list of groceries below the threshold amount. @@ -297,20 +359,17 @@ Example of usage: `low` -  -### Finding groceries: `find` -Find groceries containing a given keyword in their name. -Format: `find KEYWORD` +  +### Viewing groceries expiring in the next 3 days: `expiring` +Shows a list of groceries that are expiring in the next 3 days. -* The search is case-insensitive. -* If a phrase is passed, the entire phrase is searched for. +Format: `expiring` Example of usage: -`find cheese` +`expiring` -![Find example](images/featureEg/Find.png)   ### Listing all groceries: `list` @@ -322,6 +381,7 @@ Example of usage: `list` +   ### Listing all groceries by price: `listcost` Shows a list of all groceries you have, sorted by price. @@ -332,6 +392,7 @@ Example of usage: `listcost` +   ### Listing all groceries by expiration date: `listexp` Shows a list of all groceries you have, sorted by expiration date. @@ -342,6 +403,7 @@ Example of usage: `listexp` +   ### Listing storage locations and their groceries: `listloc` View all storage locations being tracked, or the groceries stored in a given location @@ -349,22 +411,36 @@ View all storage locations being tracked, or the groceries stored in a given loc Format: `listloc [LOCATION]` * `LOCATION` is an optional parameter. -* Without `LOCATION`, all storage locations will be displayed. -* With `LOCATION`, all groceries in the given `LOCATION` will be displayed + * Without `LOCATION`, all storage locations will be displayed. + * With `LOCATION`, all groceries in the given `LOCATION` will be displayed. +* More information on storage locations can be found [here](#manage-storage-locations). Example of usage: -* `listloc` +* `listloc`: All storage locations are displayed. +``` +>> listloc - ![Listloc example](images/featureEg/Listloc.png) +Here's all the locations you are tracking: +- spice rack +- freezer +- cubby +``` -* `listloc cubby` +* `listloc cubby`: All groceries in `cubby` are displayed. +``` +>> listloc cubby - ![Listloc LOCATION example](images/featureEg/ListlocLOC.png) +Viewing location: cubby +Here are your groceries! +- cheese (dairy), amount: 50, location: cubby +- pasta (carbs), cost: $2.95, location: cubby +``` -## Add / Edit Grocery Location Commands   +## Manage Storage Locations + ### Adding a storage location: `loc` Add a storage location to be tracked. @@ -373,30 +449,12 @@ Format: `loc LOCATION` * Duplicate locations will not be added. Example of usage: +``` +>> loc freezer -`loc freezer` - -![Loc example](/images/featureEg/Loc.png) - -  -### Storing a grocery in a storage location: `store` -Store a grocery in a given storage location. - -Format: `store GROCERY l/LOCATION` - -* If `LOCATION` does not exist, GiT will create the storage location and store the `GROCERY` there automatically. - -Example of usage: - -`store paprika l/spice rack` - -* Location exists - - ![Store example](/images/featureEg/Store.png) - -* Location does not exist +New location added: freezer +``` - ![Store in new location example](/images/featureEg/StoreNEW.png)   ### Removing a storage location: `delloc` @@ -405,10 +463,12 @@ Remove a storage location from tracking. Format: `delloc LOCATION` Example of usage: +``` +>> delloc cabinet -`delloc cabinet` +Location: freezer has been removed from tracking! +``` -![Delloc example](images/featureEg/Del.png)   ## Calories management mode @@ -533,51 +593,64 @@ Please enter the title of the recipe: Fried Egg is removed from the recipe list. ``` -## FAQ -**Q**: How do I transfer my data to another computer? +  +## Data saving and loading + +GiT's data is automatically saved in `/data` in the same directory as `Git.jar`. +When GiT starts up, it will automatically load the data. + +### Editing data + +Data for different modes is saved in different files. +For instance, grocery data is stored in `groceryList.txt`. + +> #### CAUTION +> Any changes that invalidate the data format will corrupt the entire data file. +> In this case, GiT will **wipe** all previously stored data. +>
+> It is recommended to make a backup +> before editing. -**A**: GiT's data is automatically saved under +  ## Command Summary ### Switch between modes -| Command | Format | -|----------------------------------------------------------------|------------------------| -| Switch between modes | `switch` | - +| Command | Format | +|--------------|----------| +| Switch modes | `switch` | ### Grocery management mode | Command | Format | |--------------------------------------------------------------|---------------------------------| | Add grocery | `add GROCERY` | -| Delete grocery | `del GROCERY` | -| Set grocery expiration date | `exp GROCERY d/EXPIRATION_DATE` | -| View groceries expiring in the next 3 days | `expiring` | +| Set grocery category | `cat GROCERY c/CATEGORY` | | Set grocery amount | `amt GROCERY a/AMOUNT` | | Use grocery | `use GROCERY a/AMOUNT` | +| Store grocery | `store GROCERY l/LOCATION` | +| Set grocery expiration date | `exp GROCERY d/EXPIRATION_DATE` | | Set grocery cost | `cost GROCERY $PRICE` | | Set grocery threshold amount | `th GROCERY a/AMOUNT` | | Add or edit remark | `remark GROCERY r/REMARK` | | Add grocery rating and review | `rate GROCERY` | -| View grocery details | `view GROCERY` | +| Delete grocery | `del GROCERY` | | Find groceries | `find KEYWORD` | +| View grocery details | `view GROCERY` | | View groceries that are low in stock | `low` | +| View groceries expiring in the next 3 days | `expiring` | | List groceries | `list` | | List groceries by price | `listcost` | | List groceries by expiration date | `listexp` | | List storage locations
List groceries in given location | `listloc [LOCATION]` | | Add storage location | `loc LOCATION` | -| Store grocery | `store GROCERY l/LOCATION` | | Remove storage location | `delloc LOCATION` | - - ### Calorie management mode -| Command | Format | -|----------------------------------|------------| -| Add eaten food | `eat FOOD` | +| Command | Format | +|-------------------------------|------------| +| Add eaten food | `eat FOOD` | | View food and calories intake | `view` | ### Profile management mode @@ -587,9 +660,9 @@ Fried Egg is removed from the recipe list. | View user details | `view` | ### Recipe management mode -| Command | Format | -|--------------|-------------------------------------| -| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | -| List recipes | `list` | -| View recipe | `view` `TITLE` | +| Command | Format | +|---------------|-------------------------------------| +| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | +| List recipes | `list` | +| View recipe | `view` `TITLE` | | Delete recipe | `delete` `TITLE` | \ No newline at end of file diff --git a/docs/images/featureEg/Amt.png b/docs/images/featureEg/Amt.png deleted file mode 100644 index 3447c758f5303b66935b7f656a57153b16f0e137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2886 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 diff --git a/docs/images/featureEg/Delloc.png b/docs/images/featureEg/Delloc.png deleted file mode 100644 index bea91dfd8771fb4b87d85a074bf5c84e7802e968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6085 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 diff --git a/docs/images/featureEg/Find.png b/docs/images/featureEg/Find.png deleted file mode 100644 index 91aa504732bfcdcdfe6b90b9dfec94ff12bfa70c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14355 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 J((Cua{vYPwaEbr` diff --git a/docs/images/featureEg/Listloc.png b/docs/images/featureEg/Listloc.png deleted file mode 100644 index c27c26d248bab9494d2fed5d3031e2440f8d8901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8022 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 NRCQF!?mv6=e*n-U_YD95 diff --git a/docs/images/featureEg/Loc.png b/docs/images/featureEg/Loc.png deleted file mode 100644 index 463041da708663b3b59dc41723d96bfb596cfaa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4346 zcmb7IXHXN|(ngAOr3UGt2N8%;1*91SBE8p0N2MbYI*0)Y(g__z5~`vUDI%dsC{hKL zUZf?05I}?=5V-i>@B4LU?#%sj=FFU(v-|9`yXWj8O^kGz8F&~dC@7fq^&n;x6c@zK z_vUmL&(~=$RzV61mM(pWmPH6`tLT9_`(3WSV%ZFn3k+#4>69PM27E8n>rqeN1zr;Z z+W&@8zhyuR%Q%=S?sth%4xsB13NNiA+b7S~^Sp11>lx!dP(6m7z}$}f%Z-u2T)Ls$^6fTqH9+Lmb`R_cGK?Sjj?*h-n#*+Yb?Kw5L z{>}4?xDp|fpz9ZQ37I-Kh)vxmXgX87ti%j;TFyuOmDub!M1*b;#$`45TpObfdQ}_4 ztTm8EgD)|ler16Y9x?=XNZv7sQTeIMg77=xC{tc-uk8#`(6Yie(I;tQtC-d@-`p?U ziV478Z0Q-J+hMzI=%nnDoMWOmQf@o+b}95$A`d&u38PEJ*hQhxT1NcRHERCv5(mcF z>xKYrKk!TMdj9e}#ji|`nhq#9*@n+>L>aGQs$uyocEjd}TL7PL#n_#dx%aMD*A2jAYT$%!c0SWDjKje6DKU( zcRee}|Kd88G+0jccAW%F>@;KqE!0TtBnWxCSlhYRH@_d0*De=Bv=nB=qfDRel~wpDSr} zVH>jNpY68wbo!QSFkDW}OZnQ}gojF9CkJdUk#1Mi=)4r@l~kOgmhI(fgl7@q93uFb zz-Prat7^?Jmr^0736AYgM@4~(3fg9#>Z<9b-l+D*m%c!LXO%^g)pDxDrC4R(Lm{Y; z@}p)(JQt^4>-QNQCg1;s(cDOf=snev=CM&Y#8QYeR!F%VcNICD;$0*p}=uX#HWi~rT$Ub*1XQk=2 z5OvVgg4%OFB-oH;bgwou8fkaQvoGarhD)J{onj&~wjVx^uBXcVwF?9gdlDmO3s!5T z{DO6D9>h9nTh&*%-v8*5Hg5hbf07?;Yaj5ZORThb@0xt;RxBpnttDyWOyxyQ75^J; z-v>$FOV;%HG3P<;rIjUVXCypW{=06`5#;f70$Ay3|AdNX+lFfwO#Njx2RQ z%30GO?Q9yL#d0Pf0YR~)o%P1z^Q0;TZU9YXn}z6>L;Qu$%Wgs@)qj-W|Dj@+1|mq- zG#5YBu;cV~(m`u;4&B6@vnBGrH%Y;e=o2wx4=>{OukzvH2>;OnC|QxdoU66gZxkc4MQG}yF
B6*DQob82#Y=zu>7_D)e9d%)4 zhbepFtZQW9a@{SvRx|ftgdfNAj7XAdaQ0F9QkdmyC`3}eib5xzjdg`QdKFOSe?=my zQ{7p+Uud6wAapG(7tN>R?&y&fN9Lxbp&Zyv?v!|y3)#EjyVqVer<0Oc7 zN}y?&((}m!h2N{nZ>w}rrK0diWma?$+Y%=&Ocji1kEH@T*)vUfJiSw9I06x>(LpYl9~puda!xN&DwqxMF~ z*e>bQq|Ou~j2_Ti3blj?ra`<={LtnKNc)XJ&K9}#%iT1hN^ldaZ zYA#v0jo`R)DcV`Dsx`S{d!n|!XW8)-!PN~|eUUx2y4Y1OmqqGrCoz-miY*pTJyB~q zXcQ_Wu`>GcaZlRf-v`oiiji~e=DLpJnJ4Oa!8qE%h+m!THQh2C`rqK-n;rDCc=2is zz->~kH#akm>}c@Q-gcIKc9IB!p0vn%@FfEMAk72;Q^;zk-ec9&+JpmDsbIBPa0>Cdu#lryWLgi9V`@!4SsUuKngM| zEu}KHvYC6Xltz4}K~&~IJD@y1qzAnM7&j@6-Mg}Bjv9eEIu*sxr`b-vjW|~PwE-co6Wmy=Na`PxC~d!xchjZ z4w-N%t8d`BxLzu1j&c>uBjES3{e=4Q`2$@QkiqVS8#&=$Nv^mxi5|*zK_7hmakDO7 z2?kS@sr!;o&WZN$PKqJnfLJQl+twxGqhz(0OBt;`(JF&kjr>eix>R;32~|O$QeEbIRiaKQ)WeWw z(-^<{-`~dWH~Y&io`c#LJ4%#%=y>g6-{uv01jaXl3;x^~6R@EwU>P?+936B1*3A~` zS@$Q_SYnCt=kbcc$)m*tWrXTBCHbVu5>zMs0A1_t}H@?#2-*L%Nbs zYyjUI&~D#gLEX;GZj%%&y5l*9O>7|~bPE^$jMqPWiPuVeD1j8b8^+1oxjp!I`bpFAru`A|+{Lc0tK2VU`b?Jy zG6^y5k@3l^B4EDHporl-ey{6(pRcU7;CJMZSEuvGo5BtCF@`VL{nmJ4>ASJWrd7dkMV~OX+V7*ka!Pu?D$>P~(wdEX{F_rgh%rgQl z&IM#^io`WjXFLn0U{2)WP;{g0dvZW;2}g&H{vlsK&%vu5a2b3BV7=Yp;#`{dZkHQ8V@-q87Ed|AH|?aE-WJ6d zic+^kY}j9K+-GK7i3BsWT9w=9+WkpcOP?XPGVY2e)eOQHn>6O`H0|}Vri_kY+Yv?c zmTD~%i1B(J`F-`iuS0C?w2MWW97txVFfXa1RzESl^lQqx<*=abw1if_pPBEM6Gdcu zL_7-rP10*u+u3R_uIg&GET79eK^{7a$;*u^KGt)mg^)?Z`fcs0NLOtSJt=N>+!eA6n3dBT%K+$#LPa#M?eq0JJy$9wP20?#?uId7Dy zcUy)2x5oN^_|^Tlwp|A;S{V3}F`IAgrzq%i#}}sl#hO1N37HAnripQ(GXZYtsC1sQ zlqvD(4ty%mNSHxKlDfjYE%leQW*}-VoAwvU>y&O;6#aJ;0E|-lud{&vH2I8H;qaiZ UGkFYmKGUGk*D->;)pm;g7xueQCIA2c diff --git a/docs/images/featureEg/Store.png b/docs/images/featureEg/Store.png deleted file mode 100644 index 0b5694434fd0a6eaa96c98d7bad7cef62cf13648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5355 zcmbVQXHXN|w#848qLC&==^#Zgnn;u0dl#gGK$H@ilu)Ee51|)n5eS6dL5g(gMOq9^ zAs|&C6sZv~@c8bXcW2(6dGqGoKWEPD*+14g>zsYotY|$QRRHCEN)i$hfV!H}a}ttk zz^nZW@|#yH%UazD3CZ0$btQR2U#p#LM`JqEnaEt(D`B7(a4@3%OWjHL8-xFu6>C~@h`nrFMLeLQei z$T0IPLFU2j+dUw&CD{csrbwF(``LP?NX%Vlv)erml%l{$8(~r;Lk}n`R6E9oNxQ2E zrZ%yuNJGoE>uFKGkuRiw+#g-En=%nI-zG~X8dVt-l^G~f>EKD@0R@l~Z{|x5ZyYVD zd3mECjb!Tw5SiR4v->|XTp~Ano1CHs8;!g=B%9(OMKnV+^@sQ)8@P|ekBk!KuVSCp zaa%r<&&ba^(0{oFc){3+#Ryksl5_+>bLqmGFe7XHTsS^Fc&W2 z1HVmzp8c8HmFVX8VzE+wZcX7zxR>rTG6{Iqt-5VMEA`liYdeN)p zSXGW4#$we#ycwFfN|P{8!{H8M0(sB=9jhq6Z<=$FC9DxW&gR0I3BXOcfpU>=08$vNWI zJ9+AC8v*KB$$Z2~p4bXNU*)}Lug4U|;&i-5yg0@S9xb~UEYffv!|B&GmDRw=MB8%3 zFGqH&dc8t-)b`EvzotbStYr>%*fP#c#3d^n8w6Q;-Ffs;r(Oyw*DS5s`$g^qRlkRc z4t@06ayilOrB{A&++aB)Yhf+z3o1!#q>Hj$J{J{K%Asn)KsEnm&WE?+k1@6cR5*o5{65O7lOF-IZZLMwxLw(@c4OTjg&1 zo9@SHjON^-I_y06HH0_fw3;Z2-sitQxvdd{V=ir(Fih2^yr$`c`eUKU;q}c9!+EBM z{lT^mOZryAFk_4@acJunsHgCJJUHL70Ae~*9`HB69_DdVE>?APChTd<2FuQ%=vh#a zrodfv)yC`^(k0a>{4MyF!-lADKi7I5gQZ6FgfDpBeqf0Te!=?7D4h(jjVVjU*45rdA{mUpjITdK!UdKGfkl2(LDE zN&2NI#HetoEF+=ZF_YqLSai7=RlCNoP z`}TVk-j#RMqi6*s0gvK-^m_S&x^_VPqEphUh-A{k%8)>#5i4vD4Q+Ppa;;1~)f(ql zeCwptB&}@~eI$npG5j;QfLSb)aBdx}_k$2%NYuwyJkTRrNVxoJKfEW<=fVCDjZuxv zB2;Dn)OhoCTZ4)fRg-S>$zLp3dp%t84^JPxvnofm?*XIV-KB#MLO~5lv`T_9Gi%1f zXceohWfPT5roeG{Y5V1~s>29wznXC$D(zUNN<~umH=9OA_$RB{$Y2|lwu3W|Lj5+n z(;{F9{LpGA48qU2G?yQ(GOf5-<(Q>v$-ln}2@hxoTWlve-CHZ3ejasHp^hB)(A8#x zCP@m}G&1noNj?W64*oFTdT}M6Acdiv;K2dEDyZ0dK_{bBkj+(w^H1kA6_D6zLbd z38ZS+7T)sb-ZKUex_EDj?~S?yZx_glz!u`^Q9*MO?HxUJ0q6c*Q-2SvNpJKzr#$A1 zyy8<}sebZyq1yQ2hxPtri9e68!D#N4B%c&{&j#S2uhjX6@ncf70zdVXRTj^ zxFrI)4szlBlEE6g{8bQzic)not%QY!yf)0HGT(jrxBxL-a44(lFbspTJ@p7U&!AC$ zl3hbgZ48Y6H7o%(-wtb5s9oj$2d`K7`+s(j&O0Gq&WIOpKm3@aFGU;opf)~V-MKm! za%1fEv1u+SvkkJATWpjdWXzIvF**5-RZ@=_t`kf*6D;(l-A5o6+^7mgLm#+~p+YNV zDG+x`c2vg0iqgX(9n2^O+3C24-iUnFu<&tB&JxhSTz{0+Lfga)JwIRCETJ~=#ZLt= zHSMw>`aPKqKRLBXyjJz|znMJzF;RNr&Rjh!sW>7|%kRveA>KcSyIAZi;Wm+L;gzID z#ip8oP}d~xU0SJ?N!DZnZ41bqh}98J5Js0_VPpb_3gy&_Vk2wAaU=Y%=IOc5z4*$; z-*e1-gRc)1>kGm{k@+cWt*&|46`Dh7nyB!~mbCYIR=24EI@oo~?*{M%mh8g0OP*>e z$%1;$IS?-D%zI5u>x&{VdBeaB@o5D%$UoN-v)v(cDru9yqK@oJ*OrtSP@ZCM9$P(& z;9jyww@B9z&!O0CAFUZ9w`}P3+Ym1~LvOvCbv=@Dcq{IpR>VV-WI%G*qf@V~uDqo@ z=gT}|SsEm^QNYz#KZ)LK;Qv$MbeV^9qBCX8B*7M99fH2yI#*)M+BM`B5*vmnE#zES zz0nQ!QHb}+>!Ww8V+M9kqfxv;1JVt0&bV)nMEN*<203LFrv)Swl6boKtkldN3q<-` z2hW8S&Dni;s>Crp{TDuUxe*Lz6MqTL@^+q{Vjieq6@Q52iuJ%7l6!3I6@NKDkmtLeLj5CwB}4>)G`?@+W18fNqj2AS>8 zV~o3CGPE_0r%U0L+K()Opk0rF7>$}0)|&;=xfw#DwFOWGsMedUZkWvdt1kJVXM65o zog0uNDvBVfep!p3=xhJO9rl4@i>$G>OezL7j^NwqhyRC}{JZ^GY7q}H-oWJ3p8NXw zdQJVD&CrVf+C*mBQL@STZ;5Fm`w8UIIlDao=T_5rLH%NJKe+6DP!IpdQ?9ct&%mIj zO@AfhLy~f4H%!A9H(OHMCT}cd6i{^aU*omU7SNKlsw8O(;+Op^0^6>| z_>pi6m77>t^{x(b2mp2$z0wn{^lT&o0SOBuD=WhyP@t4_}0|efW}rGwIcZ ziF^`1VLKGW|6U;!Z!{J7UKrNSyLVUwGu)6s;d7G78ahkmvmHmrZT>VNYi4H9(4+4>p8iTRqCK?qC-=slgMxPUb;bdP+7rLOSP^1> z;cY+aL8}y+QN-Op@%j6Y^B?zy=cETiU>+o!OIwF1S}Q-*Uh}?LIWnj~xpfu3|5%Lq zw-j)!6$S*G@>iECzR(t`(t>ABhi?=dbn-x@U;1WE#_^S3+PbbjHN$V||77Y-(S7-A zKW}PfM{V+K6Ohehd0{VP6$bYK=&pDEAhxR{_!vamoj{(GyRI)Of2gWdRV1)V1xQB~ zwr4Ta;u?<*ynZvV0KOjMJ|9LrF$r40=P?TW>)0l;>z8Uj?NW`q!KJqJu?N?8buQ!H zFOnsd2P6s9N|)%txg;E+ZWLNu3d!t!Ci)9eavKq0=5iaa0u7aQ_Ejq4x=N+E%M_3D1~BPwi=FP}$Slt+Xd7gDvRZQ!gh8+jbf z$g>Qr>!OmI>jP=jh}K zYRga^CH0C}8J}+@&OLT+Dw^6wOCXf&$VZf2FWbFBaE`n`nK@mI95ilmSrTbm{0(RS zNIwv7kKQ>kZ@c_cJ#)}+FuCgMQJe1GtmdxuGQ=r&8oZFQ?wL*7im)S!O{xQI>z6Rg zj3ZXnzrbWrHbbse8fQ}7>g=$FuF!54I@`9F`W+N~^<|M4-QNX^e{Q6UymPF*!8B<6 zQdWH77GEq<;r$Tn=TzgiI%K&CvL*cP8f@x9Kw^JkEB}FBYqOnHlOAfMX*oV)X*Az> z|Aa;0ziA<=9@}V-tZNPX+CF5W;eKSB0Nd41AG-WhOgT{?MpBJ5%3Jg}KiR2w9yz$*ny( z$&Yd*b>f!MYdxL13IlF2@4XS7BAmC%yHIuhJVqPvgdFfUcX0Wf2+QU^%xfg0N8Fj* z$jKrr>?~Ezc06Tum-!KphR@K+jnedd2@0NDJ~guZ5*(;vt08sDlsCI@gEsEVX>Oh| zG8n2{x2-n+r6Z+aZthb3%t55BndEpqL+_+{AaT`~&e&#w zc1x5L#Ggh&CV@Q=O{fL|c|yL2mHiDV(Vkx@=iKfB_3wcEs&~w#W=sE=zM|Ln4wwWM=4?9ozhe@In#pmf>4dhTo$)ofjW8ve@iV1O2nc2 zbNBe`I4otpqyF4KF@jFChW+IMGXC=A9sXwFCnyC>$bFo_A?ir1p+u-M!IO!7p)KZX z2aIuT`^56DWAAXsv#4==?yp65=aO3Cp6SaQkQC2+p;K_BrP8l29U*(ljb=tn(%K+38+9U&K~SJ#Xw;iVFApXM_$d-)lCC~9bI*yX$_cPRw! z%Lyj=m^(M?5tzn1vG}~xk5EI&yB0e#8&Uf{7$hl0Qtm~VxDe`>xrm{nGLzbUtdIZM zVty=E#Afl?Q4?6EE9s6Ol`vWaaH;My{L}*@{aay#iRTGtyOO@brx^QFxrpzsU7|p! zzaC6uRMEZ$;)@|v&21ftte(zG&$nMqEH9J_VN!~ps14lG!jC)E7+Q60Yzw5NrLX>c zQP!4g91Y5|`6XT?Qwec&XM3_o;40p)(*3&X8*Zy<2q5l!yjZkS9S3kZkztd;&p>q# ziYmqCu|`)9+KW>qH8(gm-IL4sv>EkUOSY3rwd2xw44;p{od05#sb~>ZnrVY_bZ!gp z-FA%~UrH#f{8{g;CcEV4GI=&MPP*p3)WWj&}0L8gMzQDjuweY@gn=HE9Vn= z%J%;>K>tyDqPFH+Ni~P?WqKSkJZfjh-a&j}rVo;VMo?lk!dFfib7#1v9b|S7Eh$;{ z@XO#4edP#8R>go8f?$hgA}#*>U-gK;qdw5$_5U^T`wu+b@8BX_3i$SV#pqRtNusW- Kqg16}9r|ArfvC>_ diff --git a/docs/images/featureEg/StoreNEW.png b/docs/images/featureEg/StoreNEW.png deleted file mode 100644 index 78496d5146262211090f7493a3135e67e0147b99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8078 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 diff --git a/docs/images/featureEg/Switch.png b/docs/images/featureEg/Switch.png deleted file mode 100644 index 0f35032a26cbbb4cca890bbf456a6fdadcb4d2be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6754 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 diff --git a/docs/images/featureEg/Use.png b/docs/images/featureEg/Use.png deleted file mode 100644 index 01fdf2318dcbb59a1f2b2ad0a8e702288d77dda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3334 zcma)9S5y;s#;ReZ70{$IPs~=400EwPx1dID~;V3o{Qh4Gj$oTnF~#Pfhp} zs4I+rGQCp)o`&XXFB}Fj!CGx*yfQZK434!R#$8aF~b2{{si^z&aihPQby3(}D=mM4=-! zS@3{}@DH!6OLBaP&EIE<8i-s0k=ambM~xt@Gly$QW+qcSVVKWcsY$==7S(})PCW9Fg}2w>+~=y4J;WvC;BR@6TwCa}Q^ckLTiw`IuNmL0D*aQVIf1FA z5cfLvr5Q|?_XwNr5B5bC3_*1wI_3AJT-fm6j`bl*YQCgu2LG*%62q7Y&lBfK+4f|iHyYrOyXX!(p`Naq5Z)@kr4MCS0xU% zYsH4^hn%_=y4?FzRzf>cvq&)a+5GXmzxwSflKmKg7+hHl1pTK zzZs405uHOlEGxfv*gvsaVlTX(D;`amAOahN7mEht)47C8idjnlp=Fdsq6;J;@&y~Z zaFaFCY-;sUO(a!A&EcRtdF8dNi84@#Qkp*sn8{i2pVR3P+tV6*J{>j0slO$|Tj+n# z-&QMfxpouJ)VRw$;c6)h--;H`qilvaOaqKHZ3k_!N^}198q<&`UFs>YS`CrewDB1@ zR9~2!U+awXy3300ji5>JxAa@o_^L(n>G)Cc|Q^*?E*3)bY zrNBQMaLHxL32p}~h=cP$$b!(_<)#ng$>DqE#V@2j#G9vZ=bK#C&wT91%KmxVQPrG` zE|k2kDW>jPCVkz2fuXx^3noX0tEzv$o*@xqp(_@Go;2Mk_B*AZRuJa`!Ex%DitG|5R=Dvz@&$vtZq(8#uRG$=Dw-3}dh4K6)&bktr590~W**mslU zMqz@x20g5H25(;Q zW~tcJalL%nj3CO)xO>d=tvp|engwZrCy$Koj z*_d>}pxmWTE4dtT+UGlr=ZGXQf{D1ipHGmNDlbD!;5>I`SCXxp7xXF zm>86VzN#4b$e_(s(TNWI3g-R4vB68Ixt#%DrM>dVTR>OT@IZ_3y@^BZr5v02+3U3ao83^wZstrD_@rjpIc4S>7F76Qu2yfj6NQ>ZOc-c=7BFOa~Ogn;114 z0S49F!Ci6tk1)+$3k1mu8}MWfjblbP2NOd{RGKvY-{RH_t70n)Dxtrc*EQ+9O=kik znm|s0k;(2lAX%mS>hgP=EPQnM#tX%3LKLiWXizlgPsh*r`A4Dg!*7bdxt;};i*22^ zGQ;=T!oX&y48Ba2BDZZ7m z6J5eVe_^?PPHA}BpsR`vrdN|cq zk-HwLYo{+OZgeEAu<6M~N7CuaDAdO~xwD=s(v?n3n5I>3CQIHnYa?~peMnAVMJnf) zR~_@J7-ggf^qW@BI!qsZt81{zxbliGv9<)|uGu%vXFzTB?Qr6vBwRx6@hNY+f8Qre+h) ztd}Zuh60YI;lF_?3w)%PpbYmD&+zczWrbx|=)u-=mdVx=6v#+r(9C__b%@Hu%%NrF zve3(dS?QT@Q-t_mdXP5pVRcTK{Zw)X4Q4KZwRoBy+V4sUuME{^Jj4CaoiME(Yq+R% zrusHqFoS^@bF?N>=4X4lv^YNz)V)C7C@u^k#8gO#q^qL2s3$xzO%xI#3jXBCdZ9w+ zdKWH*WW;q4%Mn7NG1ljd+gOB$5Q4L6U5mfk`eWn;OAYKCtZrQ+n|Msy0H;<{0;rl2 zS?Qwk{ODVX38D$-6n>ZcS2ehYtsB&p= z7q_-5EPra8PCd#lK){d(7@QhcHbpGqMYL*5N$Y$Ef# zHrZ~8DaPg^GJRmHOunU)be+jpYvx+_I0Ir)+f`*}HcUU3&qSlyQR&xee_HGPJ^_9i zy=db-3~~^TM7$F}zZB7`Ljbb3LH-Mg{_h3+|8+YObySE6#W6}ejT)bO)J}8{0#i?# zxNINihHs-*M;k1BbuPI4L5RSBgFwlSBvBT{h_Rf3Z~YGNZsAMA?Wmd25DDBB(Cz== e82)!4RV_*~-`tD;(%*ml4Gmn=09Fcp9`Y~el}Szj diff --git a/docs/images/featureEg/UseALL.png b/docs/images/featureEg/UseALL.png deleted file mode 100644 index e6fed381d427cd9c20291fee97a06f319f25f546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4878 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 diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 6491ce9302..f0c0622152 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -239,6 +239,11 @@ public void setLocation(Location location) { public String printGrocery() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; + String categoryString = ""; + if (!category.isBlank()) { + categoryString = " (" + category + ")"; + } + String locationString = ""; if (this.location != null) { locationString = ", location: " + this.location.getName(); @@ -246,7 +251,7 @@ public String printGrocery() { String amountString = ""; if (amount != 0) { - amountString = ", amount: " + amount + " "; + amountString = ", amount: " + amount; } else if (isSetAmount) { amountString = ", amount: 0"; } @@ -270,13 +275,14 @@ public String printGrocery() { String remarkString = ""; if (!remark.isEmpty()) { - remarkString = ", remark: " + remark + " "; + remarkString = ", remark: " + remark; } - return this.name + " (" + this.category + ")" + amountString + unitString + exp + price + + return this.name + categoryString + amountString + unitString + exp + price + locationString + remarkString; } + /** * Returns the name, amount, threshold, expiration date, category, cost and location of the grocery for saving. * From d83833110a02e754929260bc266b361c6c4b061b Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 15:02:26 +0800 Subject: [PATCH 255/339] Fix tests --- data/groceryList.txt | 6 +----- src/main/java/grocery/Grocery.java | 6 +----- src/test/java/grocery/GroceryTest.java | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/data/groceryList.txt b/data/groceryList.txt index 7757c31841..f87c169183 100644 --- a/data/groceryList.txt +++ b/data/groceryList.txt @@ -1,7 +1,3 @@ -Milk | 3 | null | 2024-04-10 | dairy | null | null +Milk | null | null | 2024-04-10 | dairy | null | null Bread | null | null | 2024-04-20 | baked | null | null Eggs | null | null | null | | null | null -bal | 2 | null | null | | null | 3 -cheese | 50 | null | null | | null | cubby -red cheddar cheese | 4 | 5 | null | | null | null -pasta | null | null | null | | 2.95 | cubby \ No newline at end of file diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index f0c0622152..ad4b52f59e 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -189,10 +189,6 @@ public void setUnit(String category) { this.unit = "units"; break; } - - if (this.amount == 0) { - this.unit = ""; - } } /** @@ -258,7 +254,7 @@ public String printGrocery() { String unitString = ""; if (unit != null) { - unitString = unit; + unitString = " " + unit; } String exp = ""; diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index b2e48f6f69..35b2290364 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -72,7 +72,7 @@ public void isLow_aboveThreshold_false() { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0, new Location("Pantry")); - String message = "apple (fruit), amount: 0, " + + String message = "apple (fruit), amount: 0 pieces, " + "cost: $0.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } From 7f8d09949aea4d0e8a1910718aad55813e131dda Mon Sep 17 00:00:00 2001 From: Willson <102905979+wallywallywally@users.noreply.github.com> Date: Sat, 13 Apr 2024 15:05:35 +0800 Subject: [PATCH 256/339] Delete data directory Always changes depending on developer. --- data/groceryList.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 data/groceryList.txt diff --git a/data/groceryList.txt b/data/groceryList.txt deleted file mode 100644 index f87c169183..0000000000 --- a/data/groceryList.txt +++ /dev/null @@ -1,3 +0,0 @@ -Milk | null | null | 2024-04-10 | dairy | null | null -Bread | null | null | 2024-04-20 | baked | null | null -Eggs | null | null | null | | null | null From 8778db2f8d909c519d901954b0c8e79b0e4481f4 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 15:21:32 +0800 Subject: [PATCH 257/339] Add find recipe --- src/main/java/enumerations/RecipeCommand.java | 2 +- src/main/java/git/GroceryUi.java | 6 ++++++ src/main/java/git/Parser.java | 5 +++++ src/main/java/git/RecipeUi.java | 19 +++++++++++++++++ src/main/java/git/Ui.java | 1 + src/main/java/recipe/RecipeList.java | 21 +++++++++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/main/java/enumerations/RecipeCommand.java b/src/main/java/enumerations/RecipeCommand.java index 4c3c534d4d..f8d3b0f774 100644 --- a/src/main/java/enumerations/RecipeCommand.java +++ b/src/main/java/enumerations/RecipeCommand.java @@ -1,5 +1,5 @@ package enumerations; public enum RecipeCommand { - ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP + ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP, FIND; } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 40c73b082e..f0238ff5b6 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -160,6 +160,12 @@ public static void printLocationSet(Grocery grocery) { System.out.println(grocery.getName() + " stored in " + grocery.getLocation().getName()); } + /** + * Prints the all the grocery found containing the keyword. + * + * @param groceries The list of groceries. + * @param key The keyword to search for. + */ public static void printGroceriesFound(List groceries, String key) { if (groceries.isEmpty()) { System.out.println("No groceries contain: " + key); diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 6d52714c8c..dcf745fb0f 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -281,6 +281,11 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn recipeToView.viewRecipe(); break; + case FIND: + String recipeToFind = recipeUi.promptForTitle(); + recipeList.findRecipe(recipeToFind); + break; + case DELETE: String recipeTitle = recipeUi.promptForTitle(); recipeList.removeRecipe(recipeTitle); diff --git a/src/main/java/git/RecipeUi.java b/src/main/java/git/RecipeUi.java index fcf0d8b164..85c42f0245 100644 --- a/src/main/java/git/RecipeUi.java +++ b/src/main/java/git/RecipeUi.java @@ -1,8 +1,10 @@ package git; +import grocery.Grocery; import recipe.Recipe; import java.util.ArrayList; +import java.util.List; import java.util.Scanner; /** @@ -119,4 +121,21 @@ public static void printRecipeRemoved(Recipe recipe) { assert recipe != null : "Recipe does not exist"; System.out.println(recipe.getTitle() + " is removed from the recipe list."); } + + /** + * Prints the all the recipes found containing the keyword. + * + * @param relevantRecipe The list of recipe. + * @param key The keyword to search for. + */ + public static void printRecipesFound(List relevantRecipe, String key) { + if (relevantRecipe.isEmpty()) { + System.out.println("There is no recipe containing: " + key); + } else { + System.out.println("Here are the recipe(s) containing: " + key); + for (Recipe currRecipe: relevantRecipe) { + System.out.println(" - " + currRecipe.getTitle()); + } + } + } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 9026c30b9e..0f7c809089 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -245,6 +245,7 @@ public static void displayHelpForRecipe() { "add: add a new recipe. \n" + "list: list all your recipes. \n" + "view: view your recipes details.\n" + + "find: list the recipe(s) with given word.\n" + "delete: delete the recipe. \n" + "switch: switches the mode.\n" + "exit: exits the program.\n" + diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 9c3b75a75f..134ccd58f9 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -3,10 +3,13 @@ import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; +import git.GroceryUi; import git.RecipeUi; import git.Storage; +import grocery.Grocery; import java.util.ArrayList; +import java.util.List; public class RecipeList { private ArrayList recipeArr; @@ -91,4 +94,22 @@ public void removeRecipe(String title) throws GitException { RecipeUi.printRecipeRemoved(currRecipe); storage.saveRecipeFile(recipeArr); } + + /** + * Searches for recipes containing the given keyword. + */ + public void findRecipe(String key) throws EmptyInputException { + if (key.isEmpty()) { + throw new EmptyInputException("keyword"); + } + + List relevantRecipe = new ArrayList<>(); + for (Recipe currRecipe : recipeArr) { + if(currRecipe.getTitle().toLowerCase().contains(key.toLowerCase())) { + relevantRecipe.add(currRecipe); + } + } + + RecipeUi.printRecipesFound(relevantRecipe, key); + } } From 70ea8027db04baced51f7e0087b616c3edc8b8be Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 15:34:33 +0800 Subject: [PATCH 258/339] Disallow duplicates to be added recipe --- docs/UserGuide.md | 36 ++++++++++++++++++++++------ src/main/java/git/Parser.java | 6 +++++ src/main/java/recipe/RecipeList.java | 15 ++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 33ba04aa07..1fada93450 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -47,6 +47,7 @@ It allows users to track and manage their groceries around their home easily. - [Adding a new recipe: `add`](#adding-a-new-recipe-add) - [Listing all recipes: `list`](#listing-all-recipes-list) - [Viewing a recipe: `view`](#viewing-a-recipe-view) + - [Finding recipe(s): `find`](#finding-recipes-find) - [Deleting a recipe: `delete`](#deleting-a-recipe-delete) - [Data saving and loading](#data-saving-and-loading) - [Command summary](#command-summary) @@ -596,6 +597,25 @@ Please enter the title of the recipe: >> Fried Egg ``` +  +### Finding recipes: `find` +Find the relevant recipe(s) with given keyword + +Format: `find` `KEYWORD` + +Example: +``` +>> find + +Please enter the title of the recipe: + +>> fried egg + +Here are the recipe(s) containing: fried egg +- fried egg with chili +- fried egg with vegetable +``` +   ### Deleting a recipe: `delete` Shows the recipe ingredients and steps. @@ -636,10 +656,11 @@ For instance, grocery data is stored in `groceryList.txt`.   ## Command Summary -### Switch between modes +### For all mode | Command | Format | |--------------|----------| | Switch modes | `switch` | +| Exit | `exit` | ### Grocery management mode | Command | Format | @@ -680,9 +701,10 @@ For instance, grocery data is stored in `groceryList.txt`. | View user details | `view` | ### Recipe management mode -| Command | Format | -|---------------|-------------------------------------| -| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | -| List recipes | `list` | -| View recipe | `view` `TITLE` | -| Delete recipe | `delete` `TITLE` | \ No newline at end of file +| Command | Format | +|----------------|-------------------------------------| +| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | +| List recipes | `list` | +| View recipe | `view` `TITLE` | +| Find recipe(s) | `find` `KEYWORD` | +| Delete recipe | `delete` `TITLE` | \ No newline at end of file diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index dcf745fb0f..7b034dc5cf 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -262,6 +262,12 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn switch (command) { case ADD: String title = recipeUi.promptForTitle(); + if (title.isEmpty()) { + throw new EmptyInputException("title"); + } + if (recipeList.isRecipeExists(title)) { + throw new DuplicateException("recipe", title); + } String ingredients = recipeUi.promptForIngredients(); String[] ingredientsList = ingredients.split("[,]"); ArrayList ingredientsArr = new ArrayList(Arrays.asList(ingredientsList)); diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 134ccd58f9..ccc19fae49 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -112,4 +112,19 @@ public void findRecipe(String key) throws EmptyInputException { RecipeUi.printRecipesFound(relevantRecipe, key); } + + /** + * Checks if a recipe exists. + * + * @param title Title of the recipe + * @return True if the recipe exists, false otherwise. + */ + public boolean isRecipeExists(String title) { + for (Recipe currRecipe : recipeArr) { + if (currRecipe.getTitle().equalsIgnoreCase(title)) { + return true; + } + } + return false; + } } From 5f0d79b02d047a413b1d914d892ca168760fdad0 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 16:32:16 +0800 Subject: [PATCH 259/339] Edit Recipe --- docs/UserGuide.md | 40 +++++++++++++++---- src/main/java/enumerations/RecipeCommand.java | 2 +- src/main/java/git/Parser.java | 22 ++++++++++ src/main/java/git/RecipeUi.java | 24 +++++++++++ src/main/java/recipe/Recipe.java | 21 ++++++++++ src/main/java/recipe/RecipeList.java | 26 +++++++++++- 6 files changed, 126 insertions(+), 9 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1fada93450..3b34b53c1b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -48,6 +48,7 @@ It allows users to track and manage their groceries around their home easily. - [Listing all recipes: `list`](#listing-all-recipes-list) - [Viewing a recipe: `view`](#viewing-a-recipe-view) - [Finding recipe(s): `find`](#finding-recipes-find) + - [Editing a recipe: `edit`](#editing-a-recipe-edit) - [Deleting a recipe: `delete`](#deleting-a-recipe-delete) - [Data saving and loading](#data-saving-and-loading) - [Command summary](#command-summary) @@ -616,6 +617,30 @@ Here are the recipe(s) containing: fried egg - fried egg with vegetable ``` +  +### Editing a recipe: `edit` +Shows the recipe ingredients and steps. + +Format: `edit` `RECIPE` `TITLE/INGREDIENTS/STEPS` + +Example: +``` +>> edit + +Please enter the title of the recipe: + +>> Fried Egg + +Please enter the part of the recipe to be edited. +Only ONE part can be edited (Title / Ingredients / Steps): + +>> title + +Please enter the title of the recipe (e.g. fried egg): + +>> Fried Egg with Chilli +``` +   ### Deleting a recipe: `delete` Shows the recipe ingredients and steps. @@ -701,10 +726,11 @@ For instance, grocery data is stored in `groceryList.txt`. | View user details | `view` | ### Recipe management mode -| Command | Format | -|----------------|-------------------------------------| -| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | -| List recipes | `list` | -| View recipe | `view` `TITLE` | -| Find recipe(s) | `find` `KEYWORD` | -| Delete recipe | `delete` `TITLE` | \ No newline at end of file +| Command | Format | +|----------------|-------------------------------------------| +| Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | +| List recipes | `list` | +| View recipe | `view` `TITLE` | +| Find recipe(s) | `find` `KEYWORD` | +| Edit recipe | `edit` `RECIPE` `TITLE/INGREDIETNS/STEPS` | +| Delete recipe | `delete` `TITLE` | \ No newline at end of file diff --git a/src/main/java/enumerations/RecipeCommand.java b/src/main/java/enumerations/RecipeCommand.java index f8d3b0f774..67dfae386d 100644 --- a/src/main/java/enumerations/RecipeCommand.java +++ b/src/main/java/enumerations/RecipeCommand.java @@ -1,5 +1,5 @@ package enumerations; public enum RecipeCommand { - ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP, FIND; + ADD, LIST, VIEW, DELETE, SWITCH, EXIT, HELP, FIND, EDIT; } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 7b034dc5cf..af87cfd729 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -10,6 +10,7 @@ import exceptions.GitException; import exceptions.InvalidCommandException; import exceptions.emptyinput.EmptyInputException; +import exceptions.nosuch.NoSuchObjectException; import food.Food; import food.FoodList; import grocery.ExpirationChecker; @@ -292,6 +293,27 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn recipeList.findRecipe(recipeToFind); break; + case EDIT: + String recipeToEdit = recipeUi.promptForTitle(); + if (recipeToEdit.isEmpty()) { + throw new EmptyInputException("title"); + } + if (!recipeList.isRecipeExists(recipeToEdit)) { + throw new NoSuchObjectException("recipe"); + } + String editPart = recipeUi.promptForEdit(); + if (editPart.equalsIgnoreCase("title")) { + String editLine = recipeUi.promptForTitle(); + recipeList.editRecipe(recipeToEdit, editPart, editLine); + } else if (editPart.equalsIgnoreCase("ingredients")) { + String editLine = recipeUi.promptForIngredients(); + recipeList.editRecipe(recipeToEdit, editPart, editLine); + } else if (editPart.equalsIgnoreCase("steps")) { + String editLine = recipeUi.promptForSteps(); + recipeList.editRecipe(recipeToEdit, editPart, editLine); + } + break; + case DELETE: String recipeTitle = recipeUi.promptForTitle(); recipeList.removeRecipe(recipeTitle); diff --git a/src/main/java/git/RecipeUi.java b/src/main/java/git/RecipeUi.java index 85c42f0245..c43fad2ab6 100644 --- a/src/main/java/git/RecipeUi.java +++ b/src/main/java/git/RecipeUi.java @@ -80,6 +80,30 @@ public String promptForSteps() { return steps; } + /** + * Prompts user for which part of the recipe to edit. + * + * @return The part to be edited. + */ + public String promptForEdit() { + String part = null; + while (part == null) { + System.out.println("Please edit the part of the recipe to be edited.\nOnly ONE part can be edited" + + " (Title / Ingredients / Steps): "); + part = in.nextLine().trim(); + if (part.isEmpty()) { + System.out.println("Invalid input. Steps cannot be empty."); + part = null; + } + if (! (part.equalsIgnoreCase("title") || part.equalsIgnoreCase("ingredients") || + part.equalsIgnoreCase("steps"))) { + System.out.println("Invalid parameter. Please enter Title / Ingredients / Steps."); + part = null; + } + } + return part; + } + /** * Informs the user that the recipe has been added to the recipe list. * diff --git a/src/main/java/recipe/Recipe.java b/src/main/java/recipe/Recipe.java index c761403c5c..0294986dbb 100644 --- a/src/main/java/recipe/Recipe.java +++ b/src/main/java/recipe/Recipe.java @@ -25,6 +25,27 @@ public String getTitle() { return title; } + /** + * Edits the existing title with new title. + */ + public void editTitle(String newTitle) { + title = newTitle; + } + + /** + * Edits the existing title with new title. + */ + public void editIngredients(ArrayList newIngredients) { + ingredients = newIngredients; + } + + /** + * Edits the existing title with new title. + */ + public void editSteps(ArrayList newSteps) { + steps = newSteps; + } + /** * Prints the title, ingredients and steps of the recipe. */ diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index ccc19fae49..4b73b41d2e 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -9,6 +9,7 @@ import grocery.Grocery; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class RecipeList { @@ -39,7 +40,6 @@ public void addRecipe(Recipe recipe) { } catch (Exception e) { System.out.println("An unexpected error occurred while adding the recipe: " + e.getMessage()); } - } /** @@ -127,4 +127,28 @@ public boolean isRecipeExists(String title) { } return false; } + + /** + * Updates an existing grocery. + * + * @param title The title of the recipe to be edited. + * @throws GitException is input is not valid + */ + public void editRecipe(String title, String editPart, String editLine) throws GitException { + Recipe currRecipe = getRecipe(title); + if (editPart.equalsIgnoreCase("title")) { + currRecipe.editTitle(editLine); + } else if (editPart.equalsIgnoreCase("ingredients")) { + String[] ingredientsList = editLine.split("[,]"); + ArrayList ingredientsArr = new ArrayList(Arrays.asList(ingredientsList)); + currRecipe.editIngredients(ingredientsArr); + } else if (editPart.equalsIgnoreCase("steps")) { + String[] stepsList = editLine.split("[.]"); + ArrayList stepsArr = new ArrayList(Arrays.asList(stepsList)); + currRecipe.editSteps(stepsArr); + } + System.out.println("This is the edited recipe:"); + currRecipe.viewRecipe(); + storage.saveRecipeFile(recipeArr); + } } From 01adbfbc2b8bcc6f88356b157aea56c480a83509 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sat, 13 Apr 2024 16:35:51 +0800 Subject: [PATCH 260/339] Gradle Check --- src/main/java/git/RecipeUi.java | 1 - src/main/java/recipe/RecipeList.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/git/RecipeUi.java b/src/main/java/git/RecipeUi.java index c43fad2ab6..1e8e6eeee8 100644 --- a/src/main/java/git/RecipeUi.java +++ b/src/main/java/git/RecipeUi.java @@ -1,6 +1,5 @@ package git; -import grocery.Grocery; import recipe.Recipe; import java.util.ArrayList; diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 4b73b41d2e..96a266e8f7 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -3,10 +3,8 @@ import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; -import git.GroceryUi; import git.RecipeUi; import git.Storage; -import grocery.Grocery; import java.util.ArrayList; import java.util.Arrays; From 7bf5f582893e0a180c7313ea029593060842d816 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 20:04:39 +0800 Subject: [PATCH 261/339] Update README.md with new features and installation instructions --- README.md | 107 +++++++++++++++++++++--------------------------------- 1 file changed, 41 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 9aa6d7e017..07333b5024 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,41 @@ -# GiT - -Grocery in Time ! - -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. - -## Setting up in Intellij - -Prerequisites: JDK 11 (use the exact version), update Intellij to the most recent version. - -1. **Ensure Intellij JDK 11 is defined as an SDK**, as described [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk) -- this step is not needed if you have used JDK 11 in a previous Intellij project. -1. **Import the project _as a Gradle project_**, as described [here](https://se-education.org/guides/tutorials/intellijImportGradleProject.html). -1. **Verify the set up**: After the importing is complete, locate the `src/main/java/seedu/duke/Duke.java` file, right-click it, and choose `Run Duke.main()`. If the setup is correct, you should see something like the below: - ``` - > Task :compileJava - > Task :processResources NO-SOURCE - > Task :classes - - > Task :Duke.main() - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - - What is your name? - ``` - Type some word and press enter to let the execution proceed to the end. - -## Build automation using Gradle - -* This project uses Gradle for build automation and dependency management. It includes a basic build script as well (i.e. the `build.gradle` file). -* If you are new to Gradle, refer to the [Gradle Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/gradle.html). - -## Testing - -### I/O redirection tests - -* To run _I/O redirection_ tests (aka _Text UI tests_), navigate to the `text-ui-test` and run the `runtest(.bat/.sh)` script. - -### JUnit tests - -* A skeleton JUnit test (`src/test/java/seedu/duke/DukeTest.java`) is provided with this project template. -* If you are new to JUnit, refer to the [JUnit Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/junit.html). - -## Checkstyle - -* A sample CheckStyle rule configuration is provided in this project. -* If you are new to Checkstyle, refer to the [Checkstyle Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/checkstyle.html). - -## CI using GitHub Actions - -The project uses [GitHub actions](https://github.com/features/actions) for CI. When you push a commit to this repo or PR against it, GitHub actions will run automatically to build and verify the code as updated by the commit/PR. - -## Documentation - -`/docs` folder contains a skeleton version of the project documentation. - -Steps for publishing documentation to the public: -1. If you are using this project template for an individual project, go your fork on GitHub.
- If you are using this project template for a team project, go to the team fork on GitHub. -1. Click on the `settings` tab. -1. Scroll down to the `GitHub Pages` section. -1. Set the `source` as `master branch /docs folder`. -1. Optionally, use the `choose a theme` button to choose a theme for your documentation. +# GiT - Grocery in Time + +## Introduction +Welcome to GiT, Grocery in Time, a Java application designed for efficient grocery management. This tool helps users monitor their groceries, including tracking expiration dates, managing inventory quantities, and setting alerts for low stock or soon-to-expire items. + +## Getting Started + +### Prerequisites +- Java JDK 11: Ensure you have Java Development Kit (JDK) 11 installed on your system. It is essential for running the application. You can download it from [Oracle's JDK download page](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html). + +### Installation +1. **Download the latest release** + - Download the `GiT.jar` file from the Releases section on the project's GitHub page or from the distribution email/website. + +2. **Run the application** + - Open a terminal or command prompt. + - Navigate to the directory where `GiT.jar` is located. + - Execute the following command to run the application: + ```bash + java -jar GiT.jar + ``` + +## Features +- **Track Groceries**: Add, edit, and delete grocery items. Record details such as cost, category, expiration date, and quantity. +- **Alerts and Notifications**: Receive timely alerts for groceries that are about to expire and items that are running low on stock. +- **Search and Filter**: Use keywords to search through the inventory or filter items based on category or expiration date. +- **Reporting**: Generate reports on grocery usage, expenditure, and stock levels over time. + +## How to Use +Upon launching GiT, you will be greeted with a simple text-based user interface. Here are some commands you can use: +- `add [item]`: Adds a new item to your inventory. +- `remove [item]`: Removes an item from the inventory. +- `update [item]`: Updates the details of an existing item. +- `list`: Lists all the items in your inventory. +- `help`: Displays help information about all the commands. + +## Contributing +Interested in contributing? Great! Please fork the project and submit a pull request with your proposed changes. Detailed instructions on setting up your development environment and the contribution guidelines can be found in the CONTRIBUTING.md file. + +## License +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. From bc3e0cf7dd1b6f8d5cd0952269af2a8d1a7ca7df Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 20:09:50 +0800 Subject: [PATCH 262/339] Update README.md with new features, build automation using Gradle, testing instructions, Checkstyle, CI using GitHub Actions, and documentation --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 07333b5024..57833cfe74 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,35 @@ Upon launching GiT, you will be greeted with a simple text-based user interface. - `list`: Lists all the items in your inventory. - `help`: Displays help information about all the commands. +## Build automation using Gradle + +* This project uses Gradle for build automation and dependency management. It includes a basic build script as well (i.e. the `build.gradle` file). +* If you are new to Gradle, refer to the [Gradle Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/gradle.html). + +## Testing + +### I/O redirection tests + +* To run _I/O redirection_ tests (aka _Text UI tests_), navigate to the `text-ui-test` and run the `runtest(.bat/.sh)` script. + +### JUnit tests + +* A skeleton JUnit test (`src/test/java/seedu/duke/DukeTest.java`) is provided with this project template. +* If you are new to JUnit, refer to the [JUnit Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/junit.html). + +## Checkstyle + +* A sample CheckStyle rule configuration is provided in this project. +* If you are new to Checkstyle, refer to the [Checkstyle Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/checkstyle.html). + +## CI using GitHub Actions + +The project uses [GitHub actions](https://github.com/features/actions) for CI. When you push a commit to this repo or PR against it, GitHub actions will run automatically to build and verify the code as updated by the commit/PR. + +## Documentation + +`/docs` folder contains a skeleton version of the project documentation. + ## Contributing Interested in contributing? Great! Please fork the project and submit a pull request with your proposed changes. Detailed instructions on setting up your development environment and the contribution guidelines can be found in the CONTRIBUTING.md file. From 9bd3ad8b32f9c85cdb3a22cfdee5aff550cbc8b3 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 20:43:51 +0800 Subject: [PATCH 263/339] Update User Guide and fix minor bugs --- docs/UserGuide.md | 81 +++++++++++++++++-- src/main/java/git/Git.java | 8 +- src/main/java/git/ProfileUi.java | 11 +-- src/main/java/git/Ui.java | 2 +- src/main/java/grocery/GroceryList.java | 3 +- src/main/java/grocery/location/Location.java | 6 +- .../java/grocery/location/LocationList.java | 2 - text-ui-test/EXPECTED.TXT | 1 - 8 files changed, 94 insertions(+), 20 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3b34b53c1b..78e577bd8f 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -15,6 +15,7 @@ It allows users to track and manage their groceries around their home easily. - [Grocery management mode](#grocery-management-mode) - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) + - [Adding multiple groceries: `addmulti`](#adding-a-new-grocery-add) - [Setting the category of a grocery: `cat`](#setting-the-category-of-a-grocery-cat) - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - [Using a grocery: `use`](#using-a-grocery-use) @@ -50,6 +51,7 @@ It allows users to track and manage their groceries around their home easily. - [Finding recipe(s): `find`](#finding-recipes-find) - [Editing a recipe: `edit`](#editing-a-recipe-edit) - [Deleting a recipe: `delete`](#deleting-a-recipe-delete) + - [Exiting the program: `exit`](#exiting-the-program-exit) - [Data saving and loading](#data-saving-and-loading) - [Command summary](#command-summary) @@ -63,7 +65,7 @@ It allows users to track and manage their groceries around their home easily. # Features > #### Notes about the command format -> * **Do not use command words / tag to name grocery / recipe etc**. +> * **Do not use command words / tag to name grocery / recipe etc.** >
e.g. Do not name grocery "a/". > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. @@ -77,13 +79,20 @@ Format: `switch` * Enter the desired mode to switch to after inputting `switch`. Example of usage: + ``` >> switch What mode would you like to enter? Please select a mode: grocery, profile, calories or recipe: + +>> grocery + +Here are some ways you can maange your groceries! +... ``` +   ## Grocery management mode @@ -109,7 +118,7 @@ Format: `add GROCERY` * If `8` is entered, another menu explaining what each detail means will always be displayed first. * Invalid values are ignored. * This step can be skipped by inputting nothing. -* Apart from `category`, any details not included here can be edited using other commands. +* Any details not included here can be edited using other commands. * The only detail can cannot be included here is the rating, which is edited using [rate](#adding-rating-and-review-of-a-grocery-rate). Example of usage : @@ -145,6 +154,38 @@ milk added! ``` +  +### Adding multiple groceries: `addmulti` +Adds multiple groceries and any desired additional details. + +Format: `addmulti` + +* After executing `addmulti`, GiT will prompt for various details. + 1. Number of groceries to add + 2. If additional details are to be included + 3. The interface is the same as the one for [add](#adding-a-new-grocery-add). + +Example of usage : +``` +>> addmulti + +How many groceries would you like to add? + +>> 2 + +Adding item 1 of 2 +Please enter the name of the grocery: + +>> beans + +Do you want to include additional details for beans? (Y/N) + +>> Y + +... + +``` +   ### Setting the category of a grocery: `cat` Sets the category of a grocery. @@ -188,7 +229,9 @@ Format: `use GROCERY a/AMOUNT` * If the amount of the `GROCERY` is already 0, GiT will let the user know and the amount stays at 0. Example of usage: + * Amount used is less than amount stored. + ``` >> use meat a/4 @@ -196,6 +239,7 @@ meat: 56 ``` * Amount used is greater than amount stored. + ``` >> use meat a/60 @@ -213,7 +257,9 @@ Format: `store GROCERY l/LOCATION` * More information on storage locations can be found [here](#manage-storage-locations). Example of usage: + * `LOCATION` exists + ``` >> store paprika l/spice rack @@ -221,6 +267,7 @@ paprika stored in spice rack ``` * `LOCATION` does not exist + ``` >> store onion l/cabinet @@ -300,6 +347,7 @@ Format: `del GROCERY` * If the `GROCERY` was stored in a location, it would be removed from that location. Example of usage: + ``` >> del milk @@ -320,6 +368,7 @@ Format: `find KEYWORD` * If a phrase is passed, the entire phrase is searched for. Example of usage: + ``` >> find cheese @@ -336,6 +385,7 @@ Shows all the details of the grocery. Format: `view GROCERY` Example of usage: + ``` >> view apple @@ -377,7 +427,7 @@ Example of usage: ### Presenting all expiring groceries: `expiring` Show all the expiring groceries and send email notification if needed. -Foramt: `expiring` +Format: `expiring` Example of usage: @@ -440,6 +490,7 @@ Format: `listloc [LOCATION]` Example of usage: * `listloc`: All storage locations are displayed. + ``` >> listloc @@ -450,6 +501,7 @@ Here's all the locations you are tracking: ``` * `listloc cubby`: All groceries in `cubby` are displayed. + ``` >> listloc cubby @@ -471,6 +523,7 @@ Format: `loc LOCATION` * Duplicate locations will not be added. Example of usage: + ``` >> loc freezer @@ -485,6 +538,7 @@ Remove a storage location from tracking. Format: `delloc LOCATION` Example of usage: + ``` >> delloc cabinet @@ -658,6 +712,19 @@ Please enter the title of the recipe: Fried Egg is removed from the recipe list. ``` +## Exiting the program: `exit` +Exits GiT, regardless of which mode you are in. + +Format: `exit` + +Example of usage: + +``` +>> exit + +bye bye! +``` +   ## Data saving and loading @@ -681,13 +748,15 @@ For instance, grocery data is stored in `groceryList.txt`.   ## Command Summary -### For all mode +### For all modes + | Command | Format | |--------------|----------| | Switch modes | `switch` | -| Exit | `exit` | +| Exit | `exit` | ### Grocery management mode + | Command | Format | |--------------------------------------------------------------|---------------------------------| | Add grocery | `add GROCERY` | @@ -720,12 +789,14 @@ For instance, grocery data is stored in `groceryList.txt`. | View food and calories intake | `view` | ### Profile management mode + | Command | Format | |-------------------------|----------| | Update user information | `update` | | View user details | `view` | ### Recipe management mode + | Command | Format | |----------------|-------------------------------------------| | Add recipe | `add` `TITLE` `INGREDIENTS` `STEPS` | diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index e7f63f27c9..447dac35a2 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,5 +1,6 @@ package git; +import enumerations.Mode; import exceptions.GitException; /** @@ -49,7 +50,12 @@ private void run() { while (isRunning) { try { - String[] commandParts = parser.processCommandParts(); + String[] commandParts; + if (!mode.equals("exit")) { + commandParts = parser.processCommandParts(); + } else { + commandParts = new String[]{"exit", ""}; + } parser.executeCommand(commandParts, mode); isRunning = parser.getIsRunning(); mode = parser.getCurrentMode(); diff --git a/src/main/java/git/ProfileUi.java b/src/main/java/git/ProfileUi.java index 81fe99adea..2f6c5243e9 100644 --- a/src/main/java/git/ProfileUi.java +++ b/src/main/java/git/ProfileUi.java @@ -147,13 +147,14 @@ public int promptForAge() { * @return The entered valid gender or empty. */ public String promptForGender() { - System.out.println("Please enter your gender (e.g. F):"); + System.out.println("Please enter your gender (M / F / Others):"); String gender = ""; for (int i = 0; i < 5; i++) { String input = in.nextLine().trim(); - if (input.length() == 1 && - (input.equalsIgnoreCase("F") - || input.equalsIgnoreCase("M"))) { + if (input.equalsIgnoreCase("F") + || input.equalsIgnoreCase("M") + || input.equalsIgnoreCase("Others") + ) { gender = input; break; } else { @@ -162,7 +163,7 @@ public String promptForGender() { System.out.println("Failed to enter valid gender, " + "gender will be stored as empty"); } else { - System.out.println("Please enter your gender (e.g. F):"); + System.out.println("Please enter your gender (M / F / Others):"); } } } diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 37285e02f0..784d1ba321 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -135,7 +135,7 @@ public static void displayCommands(String selectedMode) throws GitException { break; case EXIT: - System.out.println("Enter anything again to confirm exit"); + // Do nothing break; default: diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 1d80b61102..d36f46e47d 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -112,6 +112,7 @@ Grocery getGrocery(String name) throws NoSuchObjectException { public List getGroceries(){ return groceries; } + /** * Checks whether details are valid, else throw GitException accordingly. * @@ -224,7 +225,6 @@ private int checkAmount (String amountString) throws InvalidAmountException { * @throws GitException Exception thrown depending on error. */ public void editAmount(String details, boolean use) throws GitException { - // Assuming the format is "amt GROCERY a/AMOUNT" String [] amtParts; if (use) { amtParts = checkDetails(details, "use", "a/"); @@ -235,7 +235,6 @@ public void editAmount(String details, boolean use) throws GitException { String amountString = amtParts[1].strip(); int amount = checkAmount(amountString); - // "use" is not valid if an amount was not previously set if (use && grocery.getAmount() == 0) { throw new CannotUseException(); } else if (use) { diff --git a/src/main/java/grocery/location/Location.java b/src/main/java/grocery/location/Location.java index 5f0c246231..e1b7d31ecf 100644 --- a/src/main/java/grocery/location/Location.java +++ b/src/main/java/grocery/location/Location.java @@ -10,11 +10,9 @@ * Represents a location to store groceries. */ public class Location { - // ATTRIBUTES private String name; private List groceries; - // METHODS /** * Constructs Location. */ @@ -58,8 +56,10 @@ public void clearLocation() { } } + /** + * Gets name of the location. + */ public String getName() { return name; } - } diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java index bfa3316b35..ecec2e0e3e 100644 --- a/src/main/java/grocery/location/LocationList.java +++ b/src/main/java/grocery/location/LocationList.java @@ -12,10 +12,8 @@ * Stores all the user's saved locations. */ public class LocationList { - // ATTRIBUTES private static List locations = new ArrayList<>(); - // METHODS /** * Adds a new location. * diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index d6fe97c510..3124d2de65 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -19,6 +19,5 @@ exit: exits the program. What mode would you like to enter? Please select a mode: grocery, profile, calories or recipe: -Enter anything again to confirm exit bye bye! - - - - - From 430e3f95467813c2c7daea73868fa082e137b227 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 20:51:24 +0800 Subject: [PATCH 264/339] Update docs/README --- docs/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index bbcc99c1e7..6609d2ec4e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,7 @@ -# Duke +# Grocery in Time -{Give product intro here} +Grocery in Time (GiT) is a **grocery tracker app**, optimised for use via a Command Line Interface (CLI). +It allows users to track and manage their groceries around their home easily. Useful links: * [User Guide](UserGuide.md) From e4fb583dd7ff68271f85ca0a0408f1e515046a48 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 20:55:22 +0800 Subject: [PATCH 265/339] Hide unfinished addmulti in User Guide --- docs/UserGuide.md | 63 +++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 78e577bd8f..0bfc088e10 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -15,7 +15,6 @@ It allows users to track and manage their groceries around their home easily. - [Grocery management mode](#grocery-management-mode) - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) - - [Adding multiple groceries: `addmulti`](#adding-a-new-grocery-add) - [Setting the category of a grocery: `cat`](#setting-the-category-of-a-grocery-cat) - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - [Using a grocery: `use`](#using-a-grocery-use) @@ -154,37 +153,59 @@ milk added! ``` -  -### Adding multiple groceries: `addmulti` -Adds multiple groceries and any desired additional details. +[//]: # (- [Adding multiple groceries: `addmulti`](#adding-a-new-grocery-add)) -Format: `addmulti` +[//]: # ( ) -* After executing `addmulti`, GiT will prompt for various details. - 1. Number of groceries to add - 2. If additional details are to be included - 3. The interface is the same as the one for [add](#adding-a-new-grocery-add). +[//]: # (### Adding multiple groceries: `addmulti`) -Example of usage : -``` ->> addmulti +[//]: # (Adds multiple groceries and any desired additional details.) -How many groceries would you like to add? +[//]: # () +[//]: # (Format: `addmulti`) ->> 2 +[//]: # () +[//]: # (* After executing `addmulti`, GiT will prompt for various details.) -Adding item 1 of 2 -Please enter the name of the grocery: +[//]: # ( 1. Number of groceries to add) ->> beans +[//]: # ( 2. If additional details are to be included) -Do you want to include additional details for beans? (Y/N) +[//]: # ( 3. The interface is the same as the one for [add](#adding-a-new-grocery-add).) ->> Y +[//]: # () +[//]: # (Example of usage :) -... +[//]: # (```) + +[//]: # (>> addmulti) + +[//]: # () +[//]: # (How many groceries would you like to add?) + +[//]: # () +[//]: # (>> 2) + +[//]: # () +[//]: # (Adding item 1 of 2) + +[//]: # (Please enter the name of the grocery:) + +[//]: # () +[//]: # (>> beans) + +[//]: # () +[//]: # (Do you want to include additional details for beans? (Y/N)) + +[//]: # () +[//]: # (>> Y) + +[//]: # () +[//]: # (...) + +[//]: # () +[//]: # (```) -```   ### Setting the category of a grocery: `cat` From 7b61506d112e39f95d4636eed68ddf74cadf4257 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:23:33 +0800 Subject: [PATCH 266/339] Fix issues for multiple grocery names in promptAddMultipleMenu method --- src/main/java/git/GroceryUi.java | 36 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index f0238ff5b6..1cf932b3c1 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -12,6 +12,7 @@ import java.time.DateTimeException; import java.time.LocalDate; import java.util.List; +import java.util.HashSet; import java.util.Scanner; public class GroceryUi { @@ -72,9 +73,9 @@ public void promptAddMenu(Grocery grocery) { } /** - * Prompts user for grocery name. + * Prompts user for multiple grocery names. * - * @return the name of the grocery. + * @return the list of the groceries. */ public Grocery[] promptAddMultipleMenu() { System.out.println("\nHow many groceries would you like to add?"); @@ -91,28 +92,45 @@ public Grocery[] promptAddMultipleMenu() { System.out.println("\nInvalid input. Please enter a number."); } } + Grocery[] groceries = new Grocery[num]; + HashSet existingGroceryNames = new HashSet<>(); for (int i = 0; i < num; i++) { - System.out.println("\nAdding item " + (i + 1) + " of " + num); - System.out.println("\nPlease enter the name of the grocery:"); - Grocery grocery = new Grocery(in.nextLine().trim()); - + String name; + while (true) { + System.out.println("\nAdding item " + (i + 1) + " of " + num); + System.out.println("\nPlease enter the name of the grocery:"); + name = in.nextLine().trim(); + if (name.isEmpty()) { + System.out.println("\nInvalid input. Please enter a non-empty grocery name."); + } else if (existingGroceryNames.contains(name)) { + System.out.println("\nThis grocery has already been added. Please enter a different grocery name."); + } else { + existingGroceryNames.add(name); + break; + } + } + + Grocery grocery = new Grocery(name); + while (true) { System.out.println("\nDo you want to include additional details for " + grocery.getName() + "? (Y/N)"); String choice = in.nextLine().trim().toUpperCase(); if (choice.equals("Y")) { - promptAddMenu(grocery); - break; // Exit the loop after handling + promptAddMenu(grocery); // Assuming you have this method implemented elsewhere + break; } else if (choice.equals("N")) { System.out.println("\nNo additional details will be added for " + grocery.getName()); - break; // Exit the loop, proceed with next item + break; } else { System.out.println("\nInvalid input. Please enter 'Y' for yes or 'N' for no."); } } + groceries[i] = grocery; } + return groceries; } From 91555a42677bd346f5ff49af898473cf657d5298 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:33:55 +0800 Subject: [PATCH 267/339] Add displayWelcomeMessage method to Ui class --- src/main/java/git/Storage.java | 7 +------ src/main/java/git/Ui.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index c6efc34f95..0631fabe04 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -25,12 +25,7 @@ * Handles loading from and saving tasks to a file. */ public class Storage { - private Grocery grocery; - private List groceries; - private GroceryList groceryList; - private Recipe recipe; - private RecipeList recipeList; - private UserInfo userInfo; + /** * Saves the current list of groceries to the file. * @param groceries The list of groceries to save. diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 37285e02f0..26debab26b 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -70,6 +70,7 @@ public String printWelcome() { } } printHello(userName); + displayWelcomeMessage(); displayHelp(); return userName; @@ -91,6 +92,7 @@ public String printWelcomeToExistingUser() { System.out.println("Hello from GiT"); userName = userInfo.getName(); printHello(userName); + displayWelcomeMessage(); displayHelp(); return userName; @@ -106,6 +108,18 @@ public void printHello(String userName) { printLine(); } + public static void displayWelcomeMessage() { + System.out.println("========================================================================"); + System.out.println("Welcome to GiT - Grocery in Time!"); + System.out.println("GiT is your reliable assistant for managing your grocery inventory efficiently.\n"); + System.out.println("Keep track of your grocery items, "+ + "monitor expiration dates, and never run out of your essentials again."); + System.out.println("We are here to help you manage your groceries better, save time, and reduce waste.\n"); + System.out.println("Type 'help' anytime you need assistance with commands."); + System.out.println("Thank you for choosing GiT - Your groceries organized, on time, every time!"); + System.out.println("========================================================================"); + } + public static void displayCommands(String selectedMode) throws GitException { Mode mode; try { From b0ce1ba5c1c8f4f137f704db7f070d5d16b43fa2 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:39:12 +0800 Subject: [PATCH 268/339] Update README.md with new features, build automation using Gradle, testing instructions, Checkstyle, CI using GitHub Actions, and documentation --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 57833cfe74..0f24b4d101 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # GiT - Grocery in Time +``` + ______ _ _________ + .' ___ | (_)| _ _ | +/ .' \_| __ |_/ | | \_| +| | ____[ | | | +\ `.___] || | _| |_ + `._____.'[___] |_____| + ``` + + ## Introduction Welcome to GiT, Grocery in Time, a Java application designed for efficient grocery management. This tool helps users monitor their groceries, including tracking expiration dates, managing inventory quantities, and setting alerts for low stock or soon-to-expire items. From 41ccce9fde7b0b0098ac075cf44472b080cb3c57 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:41:26 +0800 Subject: [PATCH 269/339] Fix mistakes --- src/main/java/git/Storage.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 0631fabe04..c6efc34f95 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -25,7 +25,12 @@ * Handles loading from and saving tasks to a file. */ public class Storage { - + private Grocery grocery; + private List groceries; + private GroceryList groceryList; + private Recipe recipe; + private RecipeList recipeList; + private UserInfo userInfo; /** * Saves the current list of groceries to the file. * @param groceries The list of groceries to save. From 03c2b41c3a6884ca618ee9aad271dc0e7c874ad2 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:48:27 +0800 Subject: [PATCH 270/339] Update welcome message in EXPECTED.TXT --- text-ui-test/EXPECTED.TXT | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index d6fe97c510..346c2f7bac 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -10,6 +10,16 @@ What is your name? - - - - - Hello James Gosling! - - - - - +======================================================================== +Welcome to GiT - Grocery in Time! +GiT is your reliable assistant for managing your grocery inventory efficiently. + +Keep track of your grocery items, monitor expiration dates, and never run out of your essentials again. +We are here to help you manage your groceries better, save time, and reduce waste. + +Type 'help' anytime you need assistance with commands. +Thank you for choosing GiT - Your groceries organized, on time, every time! +======================================================================== Here are some ways you can use our app! grocery: manages your groceries. calories: manages your calories intake. From 75d2d1fd05ed8f00d8d800d1026f25e4388133c5 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 21:53:12 +0800 Subject: [PATCH 271/339] Restore addmulti in User Guide --- docs/UserGuide.md | 63 +++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0bfc088e10..1580fd5a10 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -15,6 +15,7 @@ It allows users to track and manage their groceries around their home easily. - [Grocery management mode](#grocery-management-mode) - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) + - [Adding multiple groceries: `addmulti`](#adding-multiple-groceries-addmulti) - [Setting the category of a grocery: `cat`](#setting-the-category-of-a-grocery-cat) - [Setting the amount of a grocery: `amt`](#setting-the-amount-of-a-grocery-amt) - [Using a grocery: `use`](#using-a-grocery-use) @@ -153,58 +154,37 @@ milk added! ``` -[//]: # (- [Adding multiple groceries: `addmulti`](#adding-a-new-grocery-add)) - -[//]: # ( ) - -[//]: # (### Adding multiple groceries: `addmulti`) - -[//]: # (Adds multiple groceries and any desired additional details.) - -[//]: # () -[//]: # (Format: `addmulti`) - -[//]: # () -[//]: # (* After executing `addmulti`, GiT will prompt for various details.) - -[//]: # ( 1. Number of groceries to add) - -[//]: # ( 2. If additional details are to be included) - -[//]: # ( 3. The interface is the same as the one for [add](#adding-a-new-grocery-add).) - -[//]: # () -[//]: # (Example of usage :) +  +### Adding multiple groceries: `addmulti` +Adds multiple groceries and any desired additional details. -[//]: # (```) +Format: `addmulti` -[//]: # (>> addmulti) +* After executing `addmulti`, GiT will prompt for various details. + 1. Number of groceries to add + 2. Additional details to include + * The interface is the same as the one for [add](#adding-a-new-grocery-add). -[//]: # () -[//]: # (How many groceries would you like to add?) +Example of usage : -[//]: # () -[//]: # (>> 2) +``` +>> addmulti -[//]: # () -[//]: # (Adding item 1 of 2) +How many groceries would you like to add? -[//]: # (Please enter the name of the grocery:) +>> 2 -[//]: # () -[//]: # (>> beans) +Adding item 1 of 2 +Please enter the name of the grocery: -[//]: # () -[//]: # (Do you want to include additional details for beans? (Y/N)) +>> beans -[//]: # () -[//]: # (>> Y) +Do you want to include additional details for beans? (Y/N) -[//]: # () -[//]: # (...) +>> Y -[//]: # () -[//]: # (```) +... +```   @@ -781,6 +761,7 @@ For instance, grocery data is stored in `groceryList.txt`. | Command | Format | |--------------------------------------------------------------|---------------------------------| | Add grocery | `add GROCERY` | +| Add multiple groceries | `addmulti` | | Set grocery category | `cat GROCERY c/CATEGORY` | | Set grocery amount | `amt GROCERY a/AMOUNT` | | Use grocery | `use GROCERY a/AMOUNT` | From 555e67e2711224c50ef096f256d7956fee01473a Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 21:55:01 +0800 Subject: [PATCH 272/339] Fix checkstyle issues --- src/main/java/git/Git.java | 1 - src/main/java/git/ProfileUi.java | 2 +- src/main/java/git/Storage.java | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 447dac35a2..4f24c04367 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,6 +1,5 @@ package git; -import enumerations.Mode; import exceptions.GitException; /** diff --git a/src/main/java/git/ProfileUi.java b/src/main/java/git/ProfileUi.java index 2f6c5243e9..3b4faebfe0 100644 --- a/src/main/java/git/ProfileUi.java +++ b/src/main/java/git/ProfileUi.java @@ -154,7 +154,7 @@ public String promptForGender() { if (input.equalsIgnoreCase("F") || input.equalsIgnoreCase("M") || input.equalsIgnoreCase("Others") - ) { + ) { gender = input; break; } else { diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index c6efc34f95..eec3a41674 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -176,8 +176,7 @@ public UserInfo loadProfileFile(){ parseProfile(line, userInfo); } scanner.close(); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved recipes found.\n "); } catch (GitException e) { throw new RuntimeException(e); From 14ae9381d067db377a720d80aa26660557a22b03 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Sat, 13 Apr 2024 21:59:19 +0800 Subject: [PATCH 273/339] Fix issues for multiple grocery names in promptAddMultipleMenu method --- src/main/java/git/GroceryUi.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 1cf932b3c1..0b87d1c8b1 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -1,11 +1,13 @@ package git; +import exceptions.DuplicateException; import exceptions.GitException; import exceptions.invalidinput.InvalidCostException; import exceptions.PastExpirationDateException; import exceptions.nosuch.NoSuchObjectException; import food.Food; import grocery.Grocery; +import grocery.GroceryList; import grocery.location.Location; import grocery.location.LocationList; @@ -76,8 +78,9 @@ public void promptAddMenu(Grocery grocery) { * Prompts user for multiple grocery names. * * @return the list of the groceries. + * @throws DuplicateException */ - public Grocery[] promptAddMultipleMenu() { + public Grocery[] promptAddMultipleMenu() throws DuplicateException { System.out.println("\nHow many groceries would you like to add?"); int num = 0; while (true) { @@ -94,6 +97,9 @@ public Grocery[] promptAddMultipleMenu() { } Grocery[] groceries = new Grocery[num]; + Storage storage = new Storage(); + GroceryList groceryList = new GroceryList(); + groceryList = storage.loadGroceryFile(); HashSet existingGroceryNames = new HashSet<>(); for (int i = 0; i < num; i++) { @@ -102,6 +108,9 @@ public Grocery[] promptAddMultipleMenu() { System.out.println("\nAdding item " + (i + 1) + " of " + num); System.out.println("\nPlease enter the name of the grocery:"); name = in.nextLine().trim(); + if (groceryList.isGroceryExists(name)){ + throw new DuplicateException("grocery", name); + } if (name.isEmpty()) { System.out.println("\nInvalid input. Please enter a non-empty grocery name."); } else if (existingGroceryNames.contains(name)) { From 64ec3b9bb3e6c24bac728546e51ab05c822b5023 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 22:12:42 +0800 Subject: [PATCH 274/339] Update PPP --- docs/team/wallyimgs/find_eg.png | Bin 85249 -> 0 bytes docs/team/wallyimgs/listloc_eg.png | Bin 94291 -> 0 bytes docs/team/wallywallywally.md | 49 ++++++++++++++++++++++++----- 3 files changed, 41 insertions(+), 8 deletions(-) delete mode 100644 docs/team/wallyimgs/find_eg.png delete mode 100644 docs/team/wallyimgs/listloc_eg.png diff --git a/docs/team/wallyimgs/find_eg.png b/docs/team/wallyimgs/find_eg.png deleted file mode 100644 index 0e64e5395d80c5d030da50878fcdb6887abea91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85249 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

kgbTSD{>`BJ%YMuiH0duA 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 HlaT)d;pRQd diff --git a/docs/team/wallyimgs/listloc_eg.png b/docs/team/wallyimgs/listloc_eg.png deleted file mode 100644 index 0e605d6fcf87425eae01a366210379141cca3975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94291 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 literal 64211 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 Hm%RQDuv9hb diff --git a/docs/diagrams/UserInfo.puml b/docs/diagrams/UserInfo.puml index 17514a9a08..e0e95f03e9 100644 --- a/docs/diagrams/UserInfo.puml +++ b/docs/diagrams/UserInfo.puml @@ -1,5 +1,6 @@ @startuml skinparam classAttributeIconSize 0 +hide circle class FoodList { +FoodList() +addFood(food: Food): Void diff --git a/docs/diagrams/groceryManagement.png b/docs/diagrams/groceryManagement.png index 7928d6e4f382efb5bfa0138710dbe0d9ea65b767..f7d52c48bc55267533dafac929c74cd697aa1960 100644 GIT binary patch delta 46422 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 J$lkLz{tu3@!mI!Q delta 37488 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 g: LISTLOC.ordinal() g --> p : indexOfListloc p -> g: FIND.ordinal() g --> p : indexOfFind +p -> g: VIEW.ordinal() +g --> p : indexOfView alt index <= indexOfDel p -> p : addOrDelGrocery(command, commandParts) ref over p : caloriesManagement @@ -31,9 +33,12 @@ else index <= indexOfListloc else index == indexOfFind p -> gl : findGroceries(commandParts[1]) ref over p, gl : findGroceries +else index == indexOfView + p -> gl : viewGrocery(commandParts[1]) + ref over p, gl : viewGrocery else else - p -> p : viewListOrHelp(command) - ref over p : viewListOrHelp + p -> p : handleListOrHelp(command) + ref over p : handleListOrHelp end @enduml \ No newline at end of file diff --git a/docs/diagrams/handleListOrHelp.png b/docs/diagrams/handleListOrHelp.png new file mode 100644 index 0000000000000000000000000000000000000000..0c386c37f4a52379ccb6d911957269f090ae59ec GIT binary patch literal 45348 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/viewListOrHelp.puml b/docs/diagrams/handleListOrHelp.puml similarity index 73% rename from docs/diagrams/viewListOrHelp.puml rename to docs/diagrams/handleListOrHelp.puml index 35ddd01153..b3ef40357e 100644 --- a/docs/diagrams/viewListOrHelp.puml +++ b/docs/diagrams/handleListOrHelp.puml @@ -5,7 +5,10 @@ participant "groceryList:GroceryList" as gl participant ":System.out" as sys participant "ui:Ui" as ui - -> p : viewListOrHelp(command, commandParts) + -> p : handleListOrHelp(command, commandParts) + +p -> p : checkListCommand(commandParts) + alt command == LIST p -> gl : listGroceries() @@ -25,13 +28,10 @@ participant "ui:Ui" as ui p -> ui : switchMode() ui --> p : currentMode else command == EXIT - alt commandParts[1].isEmpty() - p -> sys : println("bye bye") - else else - p -> sys : println(GitException.getMessage()) - end + p -> sys : println("bye bye!") else else - p -> sys : println(GitException.getMessage()) + p -> sys : println(GitException.getMessage()) end + @enduml \ No newline at end of file diff --git a/docs/diagrams/handleLocationCommands.png b/docs/diagrams/handleLocationCommands.png new file mode 100644 index 0000000000000000000000000000000000000000..1c216a442aea00a8a11812c324515247ab0f1493 GIT binary patch literal 33364 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 p : handleLocationCommands(command, name) + +alt command == LOC + p -> ll : addLocation(name) + p -> gui : printLocationAdded(name) +else command == LISTLOC + alt LISTLOC + p -> ll : listLocations() + else LISTLOC LOCATION + p -> ll : findLocation(name) + ll -> l : Location + l -> l : listGroceries() + end +else command == DELLOC + p -> ll : removeLocation(name) +else else + p -> sys : println(GitException.getMessage()) +end + +@enduml \ No newline at end of file diff --git a/docs/diagrams/useAmt.png b/docs/diagrams/useAmt.png index 5739a75a35683200a0ff4639c12e4b0511d31ce9..b91b49834406d7d5eb74904f0b2c57a3dccfe91c 100644 GIT binary patch literal 24784 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 literal 24764 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 diff --git a/docs/diagrams/useAmt.puml b/docs/diagrams/useAmt.puml index ee2bd07858..0f70f70022 100644 --- a/docs/diagrams/useAmt.puml +++ b/docs/diagrams/useAmt.puml @@ -1,11 +1,10 @@ @startuml -actor User as user participant "groceryList:GroceryList" as gl participant ":Grocery" as g participant "ui:Ui" as ui -user -> gl : editAmount() + -> gl : editAmount() activate gl gl -> gl : checkDetails() @@ -19,22 +18,25 @@ gl -> gl : getGrocery() activate gl return Grocery +gl -> gl : checkAmount() +note right +Ensures integer is valid +end note +activate gl +return amount + gl -> g : setAmount() activate g -deactivate g +return alt finalAmount == 0 gl -> ui : printAmtDepleted() activate ui + deactivate ui else else gl -> ui : printAmtSet() activate ui + deactivate ui end -ui --> user : message -deactivate ui -deactivate ui - - - @enduml \ No newline at end of file diff --git a/docs/diagrams/viewListOrHelp.png b/docs/diagrams/viewListOrHelp.png deleted file mode 100644 index c92d521d3aceab93a2e607cdb666c72865e962ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48914 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 diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index ddb7c00545..e6b23834ae 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -34,6 +34,7 @@ public class GroceryList { private List groceries; private Logger logger; private Storage storage; + /** * Constructs GroceryList. */ From 612443e4eef3590bb3588f23a5a9a44bdfb3314f Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 01:33:31 +0800 Subject: [PATCH 309/339] Update Dev Guide and my PPP --- docs/DeveloperGuide.md | 13 +++--- docs/team/wallyimgs/editAmt_1.png | Bin 74989 -> 0 bytes docs/team/wallyimgs/editAmt_2.png | Bin 87725 -> 0 bytes docs/team/wallywallywally.md | 66 ++++++++++++++++++++++-------- 4 files changed, 56 insertions(+), 23 deletions(-) delete mode 100644 docs/team/wallyimgs/editAmt_1.png delete mode 100644 docs/team/wallyimgs/editAmt_2.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 44ea7e3f51..d7d8ddc76f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -12,12 +12,12 @@ - [4.3 handleLocationCommands](#43-handlelocationcommands) - [4.4 handleListOrHelp](#44-handlelistorhelp) - [Implementation](#_implementation_) - - [1. View all groceries add](#1-view-all-groceries-added) + - [1. View all groceries added](#1-view-all-groceries-added) - [2. List the groceries by price in descending order](#2-list-the-groceries-by-price-in-descending-order) - [3. Input category for each grocery added](#3-input-category-for-each-grocery-added) - [4. Input amount for each grocery added](#4-input-amount-for-each-grocery-added) - [5. Input the location of where each grocery is stored](#5-input-the-location-of-where-each-grocery-is-stored) - - [6. Edit grocery amount after using a grocery](#6-edit-grocery-amount-after-using-a-grocery) + - [6. Edit grocery amount](#6-edit-grocery-amount) - [7. Edit the cost of a grocery after adding](#7-edit-the-cost-of-a-grocery-after-adding) - [8. Edit the threshold amount of a grocery after adding](#8-edit-the-threshold-amount-of-a-grocery-after-adding) - [9. View a list of groceries low in stock](#9-view-a-list-of-groceries-low-in-stock) @@ -174,16 +174,17 @@ To list groceries according to different parameters, view help, switch modes, or * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. * Alternative considered: Can possibly add location as enumeration however different people might store groceries in different places thus better to set as String so that user is free to input location details however specific they want. -### 6. Edit grocery amount after using a grocery +### 6. Edit grocery amount * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. ![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmt.png) * `GroceryList+editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. - 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. - * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. -Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as illustrated by the following sequence diagram. + 2. isUse: boolean — `false` directly sets the `amount`, while `true` decreases it + * To set the `amount` of a `Grocery`, the user inputs `amt GROCERY a/AMOUNT`. + * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. + * Our app then executes `GroceryList+editAmount()` with parameter `use = false` or `true` respectively, as illustrated by the following sequence diagram. ![useAmt sequence diagram](./diagrams/useAmt.png) diff --git a/docs/team/wallyimgs/editAmt_1.png b/docs/team/wallyimgs/editAmt_1.png deleted file mode 100644 index 605890afd171ebbb57e5c0c8c753a1a922b8eb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74989 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≶y^CHLJ(wo`DtAV8y#DpV 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%0ATh!|Y}vBg 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 diff --git a/docs/team/wallywallywally.md b/docs/team/wallywallywally.md index de9a575a84..aa9e23c241 100644 --- a/docs/team/wallywallywally.md +++ b/docs/team/wallywallywally.md @@ -8,10 +8,9 @@ It allows users to track and manage their groceries around their home easily. ### Summary of Contributions -#### Code contributed: [RepoSense link of contributions](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=wallywallywally&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=true&tabType=authorship&tabAuthor=wallywallywally&tabRepo=AY2324S2-CS2113-T12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +#### Code contributed: [RepoSense link of contributions](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=wallywallywally&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) - -#### Enhancements +#### New features and enhancements 1. Ability to **edit** the amount of a grocery - `amt GROCERY a/AMOUNT`: Set amount - `use GROCERY a/AMOUNT`: Decrease amount after using @@ -33,23 +32,26 @@ It allows users to track and manage their groceries around their home easily. #### Contributions to documentation 1. #### User Guide - Documentation for various enhancements - - `add`, `addmulti`, `cat`, `amt`, `use`, `store`, `find`, `del`, `listloc`, `loc`, `delloc` + - `add`, `addmulti`, `cat`, `amt`, `use`, `store`, `del`, `find`, `listcat`, `listloc`, `loc`, `delloc` - General information - Introduction, Quick Start, Command Summary - - Enhancements to overall formatting and readability - - Table of Contents -2. #### Contributions to the Developer Guide + +2. #### Developer Guide - Design and implementation details - - For features `amt` and `use` - - Sequence diagram for `use` - - Class diagram for `GroceryList` + - For features `amt` and `use`, along with a sequence diagram + - Class diagram for `Grocery`, `GroceryList`, `Location`, `LocationList` + - Sequence diagram for `handleLocationCommands` - Product scope - Target user profile, Value proposition, User stories + - General information + - Non-functional requirements, Glossary, Instructions for manual testing #### Contributions to Team-Based Tasks - Set up GitHub organisation and repository -- General code enhancements regarding code readability, with a focus on exceptions +- General code enhancements regarding readability, exception handling +- Enhancements to overall formatting and readability for User and Developer Guides + - Table of Contents - Maintained issue tracker and milestones - Created and delegated issues - Released v2.0 @@ -64,15 +66,16 @@ As shown in the following PRs: #### Contributions beyond the project team -[Reviewed another team's Developer Guide](https://github.com/nus-cs2113-AY2324S2/tp/pull/41) +* Reviewed another team's Developer Guide: [SuperTracker](https://github.com/nus-cs2113-AY2324S2/tp/pull/41) +* Reported bugs for another team's program during the Practical Exam Dry Run: [BinBash](https://github.com/AY2324S2-CS2113T-T09-2/tp)   ## Examples of documentation contributions -[//]: # (to update) + ## 1. Extracts from the User Guide -### Listing storage locations and their groceries: `listloc` +### [Listing storage locations and their groceries: `listloc`](../UserGuide.md#listing-storage-locations-and-their-groceries-listloc) View all storage locations being tracked, or the groceries stored in a given location Format: `listloc [LOCATION]` @@ -80,7 +83,7 @@ Format: `listloc [LOCATION]` * `LOCATION` is an optional parameter. * Without `LOCATION`, all storage locations will be displayed. * With `LOCATION`, all groceries in the given `LOCATION` will be displayed. -* More information on storage locations can be found [here](#manage-storage-locations). +* More information on storage locations can be found [here](../UserGuide.md#manage-storage-locations). Example of usage: @@ -107,5 +110,34 @@ Here are your groceries! ``` ## 2. Extracts from the Developer Guide -![EditAmount example 1](wallyimgs/editAmt_1.png) -![EditAmount example 2](wallyimgs/editAmt_2.png) \ No newline at end of file + +### [Grocery Management Mode](../DeveloperGuide.md#4-grocery-management-mode) + +Below is a class diagram showing the associations between the `Grocery`, `GroceryList`, `Location`, and `LocationList` classes. + +![Grocery, GroceryList, Location, LocationList](../diagrams/Grocery.png) + + +### [handleLocationCommands](../DeveloperGuide.md#43-handlelocationcommands) +![handleLocationCommands](../diagrams/handleLocationCommands.png) + +`LOC` and `DELLOC` adds and deletes storage locations. +`LISTLOC [LOCATION]` shows all locations or groceries at a given location, depending on whether a location was passed. + + +### [Edit grocery amount](../DeveloperGuide.md#6-edit-grocery-amount) +* A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. + +![Grocery (showing amount) and GroceryList class diagram](../diagrams/GroceryAmt.png) + +* `GroceryList+editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: + 1. details: String — User input read from `Scanner`. + 2. use: boolean — `true` decreases the `amount`, while `false` directly sets it. +* To set the `amount` of a `Grocery`, the user inputs `amt GROCERY a/AMOUNT`. +* To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. +* Our app then executes `GroceryList+editAmount()` with parameter `use = false` or `true` respectively, as illustrated by the following sequence diagram. + +![useAmt sequence diagram](../diagrams/useAmt.png) + +* Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. +* Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. \ No newline at end of file From 44b8558739915961bdf30cda13310d6b5ff87682 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 13:02:00 +0800 Subject: [PATCH 310/339] Update Dev Guide with editLocation --- docs/DeveloperGuide.md | 26 ++++++++++-- docs/README.md | 2 + docs/UserGuide.md | 1 - docs/diagrams/Grocery.png | Bin 69638 -> 58237 bytes docs/diagrams/Grocery.puml | 1 - docs/diagrams/GroceryLocation.png | Bin 0 -> 13365 bytes docs/diagrams/GroceryLocation.puml | 29 +++++++++++++ docs/diagrams/editLocation.png | Bin 0 -> 48184 bytes docs/diagrams/editLocation.puml | 65 +++++++++++++++++++++++++++++ docs/diagrams/useAmt.png | Bin 24784 -> 24978 bytes docs/diagrams/useAmt.puml | 4 +- docs/team/wallywallywally.md | 4 +- 12 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 docs/diagrams/GroceryLocation.png create mode 100644 docs/diagrams/GroceryLocation.puml create mode 100644 docs/diagrams/editLocation.png create mode 100644 docs/diagrams/editLocation.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d7d8ddc76f..dea9fae5d0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -23,6 +23,7 @@ - [9. View a list of groceries low in stock](#9-view-a-list-of-groceries-low-in-stock) - [10. Input expiration date of each grocery when added](#10-input-expiration-date-of-each-grocery-when-added) - [11. Editing expiration date after it is added](#11-editing-expiration-date-after-it-is-added) + - [12. Storing a grocery in a storage location](#12-storing-a-grocery-in-a-storage-location) - [Product Scope](#product-scope) - [Target user profile](#target-user-profile) - [Target user profile](#value-proposition) @@ -177,7 +178,7 @@ To list groceries according to different parameters, view help, switch modes, or ### 6. Edit grocery amount * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. -![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmt.png) +![Class diagram for editAmount](./diagrams/GroceryAmt.png) * `GroceryList+editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. @@ -186,7 +187,7 @@ To list groceries according to different parameters, view help, switch modes, or * To edit the `amount` after using a `Grocery`, the user inputs `use GROCERY a/AMOUNT`. * Our app then executes `GroceryList+editAmount()` with parameter `use = false` or `true` respectively, as illustrated by the following sequence diagram. -![useAmt sequence diagram](./diagrams/useAmt.png) +![editAmount sequence diagram](./diagrams/useAmt.png) * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. @@ -219,7 +220,24 @@ To list groceries according to different parameters, view help, switch modes, or * In GroceryList class, modified the editExpiration method to parse String into LocalDate. * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameter: 1. details: String — User input read from `Scanner`. - * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. + * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. + +### 12. Storing a grocery in a storage location +* A `Grocery` stores its location by referencing a `Location` object. All `Locations` are stored in a `LocationList` class. + +![Class diagram for editLocation](./diagrams/GroceryLocation.png) + +* `GroceryList+editLocation()` handles the editing of a grocery's location. + 1. If the grocery is not stored anywhere, its `Location` will be set. + 2. If the grocery is to be stored in a different location, its `Location` will be changed. +* This method takes in 1 parameter: + 1. details: String — User input read from `Scanner`. +* The user enters `store GROCERY l/LOCATION` to store the grocery in the desired location. Our app then executes `GroceryList+editLocation()`, as illustrated by the following sequence diagram. + +![editLocation sequence diagram](./diagrams/editLocation.png) + +* If the target `Location` does not exist, our app automatically creates it and stores the grocery there. +* If the target `Location` is the same as the current `Location`, our app throws a `SameLocationException()`, informing the user of this error.   @@ -237,7 +255,7 @@ Users are able to edit and manage the category, amount, expiration date, and sto When groceries are running low, the app can generate a shopping list to remind users of what they need to buy. Furthermore, the app can generate a list of items that are expiring soon, reminding users to consume their groceries as soon as possible. -GiT also comes with other modes for recipe management and calorie tracking. +GiT also comes with other modes for recipe management and calorie tr acking. ## User Stories diff --git a/docs/README.md b/docs/README.md index 6609d2ec4e..bd1538f5a3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,7 @@ # Grocery in Time +![Grocery in Time logo](images/GitStartup.png) + Grocery in Time (GiT) is a **grocery tracker app**, optimised for use via a Command Line Interface (CLI). It allows users to track and manage their groceries around their home easily. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b96dbbe845..dd495279a2 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,7 +2,6 @@ ![Grocery in Time logo](images/GitStartup.png) - ## Introduction Grocery in Time (GiT) is a **grocery tracker app**, optimised for use via a Command Line Interface (CLI). diff --git a/docs/diagrams/Grocery.png b/docs/diagrams/Grocery.png index 8972ec34a45a2c243486c9d1ae765d04f8dfde8a..4191cb1144377f2abcb2f3ff67fe4c61ae2bb649 100644 GIT binary patch literal 58237 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 literal 69638 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 diff --git a/docs/diagrams/Grocery.puml b/docs/diagrams/Grocery.puml index e6d29b4b9a..17edf1cd8f 100644 --- a/docs/diagrams/Grocery.puml +++ b/docs/diagrams/Grocery.puml @@ -39,7 +39,6 @@ class Grocery { class Location { -name: String - -groceries: List +addGrocery(grocery: Grocery) +removeGrocery(grocery: Grocery) +listGroceries() diff --git a/docs/diagrams/GroceryLocation.png b/docs/diagrams/GroceryLocation.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7e92343408c155d79866e03ceefb10e4d7ce98 GIT binary patch literal 13365 zcmdUWWmuJ6*X^bRL7ELpDvC5nceACD+@wf%gLEq)As}7SNQZ!Qh)7DKgfvJ7av4j#HvN$J> zJL|d$w{1<%W_+xKG5Q+I!T$c+`Jux4Z;1uS*Y~;Ku<%{nX(XEz{EWlq@@l<%Kw!$ZP3ui>6q(B; zysu2G61Tc&GBXq}T%8pAU_y(KcJ-b)hAnHU4#QfLn9LNX+^C2IqYly=^4=TLS-QNQ zvV0Q>pUE*t^H4A0b7*Ps2H|f69kn-F(Dej1+%m@k&ELP=tN-{jY>gni=Xv;D-R7Sn z4rez~b^|^+DZ=9qg>0iuvx6^@rd01$XWi<4KVj*B>XEjbR)v@8BBNiee}8I6uv!tH zaUPD>X1|U;?bpXg!}lbWkARH9OczeBFwWDDwNyVWZuSWRVHc8-6jO84+e~w}kAZE7)GZkM(2|n>ZmP_fhkEBKVrm; zgGBP;vvLuOWBvmSY7JiT+n5QxZ)PhkEIiKKVq{F0y=RlQS0W31(rez$`ph1m9=Uq3 z+wm_T0!g0{-x2(PV6c=^gCE=|j3BV|IsTWwypPGs%Ho;za{5-R#euYwHZ`TomkY6{ zEvFVp5^&vG8+j)LiG3A8##5?Oqu9>?(Zwk4Qe1seB3KWZ!>TkJh_A$ikRUU@C)C8J zqqS=~j89dE)Z%GIr?rNP^7%vk2O)4{Fqo2}KI|^1A9UhoF-9!-EC#kd%mtYd`3EW- zRUG9%K2BS1HbBX@M5zz6byp-GxUYl4_&z47v^wi+k%mU8F5d#Bva&Lj??r_!{i@QF zB_*~z-uvwADmZoMn$bFM2|M?@zO{yKwCBPlg^4IA6v_nOq@_Krw*1Ph^8usUx^>b~ zK6djd4ibEc8h_s17z?arfg1X1(966pnM>snBV&F2yS&`o=(6%XFbg3ep%xz(m-=OV`ZA+oluqpU za-n)rz3X=Wdd|Cd+f#KhU+2Z}Dc^MyC#4@NE;i^QJ?0^Kg~8K{3=X$e8b&=l{`BI< zx9uH_zUOX%U0u>wLS#@7dYVa?oMQ7|Z#y_R7`|wHKmL$QrNzg4S^oP68>@-;G-aPK z2?U#Mr}-IFy_2JMB~oU7VD@m=KW%VPz&XWG(D@OiP%ABI(x7F44B}EZhZ=umyl+t@ z(DG}c17p4On#$);s1_eL_lNxaRi7rqLU;+oSg8R3iZ#{k%xbH7ptlPKq z-Wl(RAQO20lhfFe`Soulk(5FVXhO0nov$hGkDMKSx3e0} zcUb;%$A;oH=|Eo}*PV9_U@l^ZNOVd!zpb_uyXLhb+9A&$Q7vmA+)YhQNAeV;A}OaE zT)Zey`L_AbZ_nymB~IjRB}AB4#t!9{$$_Q!v0ygzW+%j+LiZYj!cZBqoX-a zmEmVh%2W~GtI-10?yRn+Jo%)(uKSVYwU)P0Zrob^R`Pu?Q^H-cjJM!8Yv>kU4ID;Bta z>B?fHh+dP&A?;hYg`PM@CTUNLZ(s8i$QV>b&~eCblaP$H`1;N?PZpz^VD;&)Jw1?> zq26u|4wE$Yu52U!9V7(9_e(btEWGSq*3b|^p%LVKZ#rU6PTWY};85_lFK~W4SRaeL zk$rG*z}j;0MuU>eQVk@mk&zLV=LTEyWqIxB!wQpLV$5N>j{A)w)J**h8&h?aARXfv z)CmLxZ6-PS;qvmg>^fnZ;kH#ZPtt|)>(|1(B0}%68kF@Wu#zy2RC^pxyZT-pj$xB= z50VGgv@(X@W;2{`3pDoJZaSu%xKSp$UGKI_9k;eMqR`^BqUhpsl*neJiDpwt{q9Nn z)@Z>?;k$I7H?Ff11koH+&8C`DOc^q&c$`yKFvYo@`A^;5-Hx1J%5P8eJFki+ zNFUt7p(-a6?lv_idWZc$W zj5`JLDk=o0c+jpS6%`dtrSH~v@L)^h!DV-dd9cifiBPdMm6P~9kC?n~r#~_XXuOY@ z?t|T|&)AL>1t!SrA>+|Df8Hf3kV+*gxtM(vEoVO&iHTAo!ozdAv7xJRrVkq1>{>26 z81477UH(jvbIF)TNZD+f^4BDpyJ3$Buas=YRTftBs$dr$GCEuNssQn%B14j0{aE z_?*OLIyGDUX#yL;H<+Z+NWHY&$IA^a>|heXI3{AdwXDr23m;#g+s!oAIj;?a&sAo8 zm|$1Rg1(X*Klopcy7$Wa{K&-ExO~u$L{(^T*!V8H=SxR8^R z)85`59v*%?>w66foOJ>U%-G|EU)~lz0Sfdh6m`@o*h#qU(&K`H0+3$WYsxQfV1ppb zQ%uv=)LiAn*An!i5aubmg($HW49KO~wu!sJA{Sy))>E|(rlxsb%GRG3=B+fN(ZJ+@ z12_^0XQ$|x!iZlE^f91-XAaS!ejGPrhWeiRGP2`8(BJmLhypPqh7Dxo;F>m%Zfs$@dF`g3g%g!n zqXDmUS`H-9%h#!~1>gmC|KXFjUO#%EA9@#7O$3N{!FPtyqO*@%SBWw3(J-c%5F~~G z16m;Q_O|lz8NM&q3;^He&`QZy!E_Y?Ay4A?F3*qCIn4S20qOErd@Gogl*DH_O8242 z8e3Z;A%G=>yb1krjc5p+=-h86U+R)2sUsHLR^24kh8 z<8@eQ7uar;Fd_C`jNsAp+~gu9w^*|IS{TQ>B!gDK#BS6P4k#j&h{OBr;GRTK`N_%d zVgi$vBPbNGFyd&k3Vjccv+s5-3Q~ej%U@#YRl7_zbv^H@_Nw`Jtd_N0o&Ee;^yQ}J zMQ(y#79TpJ=NB`xdQw9w*$rCO!Jz_N&R$R=WMpIv#0V`cEI|Fw=Kev^0|i_VkK(dn zyP426NintGaCI)QY$kxgU_i#?B*BljrWw@>B}asbNg@?Zk`+Qz8Z(3(_*M7h z;CYO9xnX%^R8#{zut)V4uqDybrwu{>ii-$P2H?jV(V*-kfcjJrm7~SGez3qFoK3pnEZ|lH)0M#RS25fnEfVfLwIZ zQBkczFMwvbOJZQM360`b*aaMnoZmSl4wM=Ocs5p-&z($UMnjVM2%ee5O_8gsi6aV3!ZgBXwDvJ?wQ9-Yh9SK~a92|E}RzCYV z$Ue#lZ-f3vU^Wnv!wSXvsqFao$BD6NXkPlskPM||B{iU`h;kSVZf10vU{ zoeIBCU;a`JYpE6hNKSWWGMClKHimpSrH}`xN#{qK*?QjBm&c<`E9t&(H;46*f;^Ng zI0OVd+e7f39~(;>w;FQQ-vx)Zm_l7n-6B!Blc$g}T-1nyN&t$GrcSgZK)8J6Y|C%O zcgV=j$BiN>1YE+mv+lh$g;ZH>P1XI3k}{%cqIvi*2u)q^a|8fDb`};EVPT)SR{x7d zzK9Q(XNO^-p|Ve&th7AL7}x-5Jv21L**pU2(N@B356FvmN3)0tGFp3YKG5&X)h?WP zRzU2sH6`<$LA|iuN0xRouGaAfCLiaiE~p3jMgYApio`de`uXVUJmAQ6vL8o)$_^q= zc~MZ2q0;Ib6&&Pzt>AqJh=pQN{5k@RTfYYN zcVu_n(&Z}>)mj6(=u;3jP`Qe#)E>F)uqD~Mj{y1^cZA>3DAS9RB7w+C`S@JDH|bp} zMmC{lWsSVlHULCVEkonz94)k0T?~St6eQ2QDts=gr#Ibr`3-FL?OVV@w>(c z7=-x->VFsU>q`N!+dW^tSWi~10SfAQyoJq(DGXd3(OOj{rAHunYHN8tn(XJ1i|I~U zLm`m)eqh%C0qeZCB;#=j_F5nI5gp7A(Q6G2zy(u68vUSXRGRp}7DW0z6l4b(PUNKz zgFxoc{*2O!rK!B*4@H9bk(6i6{ql}j|9>AyE4p*>6`;I3LDWPER%8Iyq9lI!y=Do% zC6++IZwBl!AOF5kkAu~FTKKS~LQ?_)f+ZzB44Sbaf`xbJ5J+=d@#+g);d}th$M+ai zB}*+kT9)T$zmZFaq*Fp5CzzGgk)4E4=;xAU>y_=Rv2|oO-(g??*FI{ z#l*q_j+Fy@<-Zm3N?*ztz?p{6ous_>`ntNh*H@QiPa8TIbb)m-Bt@0$%KWTZ*9s;m z9avmk{7@lTiANZq|F-s)sFMc-g4e&3&g{HBla_)R*JL#vd~0snbrwk1XFS&9gCOaM ziTaEHz5#O82-q6XuROrn(DR>pzPkWp00^}Qw7=`tRCj+rC5P#)qMe$SOPjNUwd>1m z-vS__OiWEx&QrK;vijY|9MO|UP#}KxK{`X|R9;Hemg=OdYhM?>*8$Nn>}&=AsO4f0 z3paE*IyLpnLkZ4Bi}CV%W%l!JXmCYYS!${*WIk0{Sxl^NMH<^*k~q`=!IFFhZ%-Ni z<}6&g!3lw&;@HA2T%EtQq}{(>1;h}5oS~7?Z%xYVKcndMkYSK9y;>=7*5^DzBcv9+ z`cnY-OuhFxH`I2zK9}qEQ0QnzgT2W+B*Fy?Zh23m3h(_5shUm*EvWmG3u@`^o(1?hL&FKc7 zI4z}v@V2%#+H|k?fP#bCB;avChXp*AYG7P&@=&LbklsQhwK(w_)io0clqpny1l&OM z=6nbL-=+C{|Ka)=8JA@{kHK%a!LSmf1S|AzuZI4?4Gb$_bl9Kl7-&W}A%M!D4>+G| zP`EKG!jlH*`|CaQVZWVf&FDVFhk#W2Wm*6E^Dns6(Zt_`@`&B_16$gb2DTe`t_gOb za7l;BULG;O-;aTjQ)509(12e<9jcUiG*gC&jDpywt>&FJEKs4oL?l9$lK>DD1wekm zZiBnK`;w?a3O5aU7IKqH66U}EbUlwo zC3X&uA9y=d+PUi`=75L*6Y2kdi@_!4PYh=GGt}Q-?CAyIu%uL8zB`EY`%BpDneVtfmE$Oh;Y9fO_ku5^jEx_# zCY*}q@gy(Y+8xaFPtFjP3!xun)eOr`J%KIzWiwE~)$}fg-6lxszc-|Y|MPcLH5?=x z!CPRcZ*Vm=HBRuh_0QKIOG&wIP96f@&Ex|NZ(t2|wzpTA4;cdT&vXKI?_l$L4S+)R zLN$v&`tvih(|F$VUNr-t+#*Q13Nn?!cdQHw}n3kOvpZnIF z3?F|H(4Fa82P0rS1mRMZZee31LQ7me)92#@^qAW(Se;sb9e!+d^u7MF(`_z`Wgigz z=ZB#MPaBSKMJ`%BycCkZdrEdV3169Tk=6**@^yIF3C&ME)*&;$WPRh+tr#t&L}Kman|l7i$*J=Lq< zP*ktSE$yt2Wf>431k^|;m9HQzEiJ~|*r=$x!5fgj(Mk?QK@ujig`Y9Oi(o6%xt~r9co7 zm*=zBrXN9#V zEup>%Yn$yr&0ECqPyAwuy2NU)A|n$dX1=_HBJpH1Oq;{@bdWFvEdw0Q?Laj>5oK+o z5MS~~r_9iBOaNLVEG`(E>;phEM1#-FEC%q15d8bZEV|P0;~CFwY%1YYw6#s36N#p( zEC^50ao;0H$H#wgSnMFKSuW)ojlQU8get@u-rZe*ERZ+<}L-WbqtMl!m%B-`)_3OP} zR+UG<98w6%7gi|Lj7qKtGKEzREgFcWB50M}_CzJELZi#Zc;=D6vXYXh9%v9rm0fHy zlq#(zahU13%?AQJAKsLfkx3GCXMbw^fsvhkxM9niy8OcBb_T=K?4kx18D~6?{F^-! z&EDrvUl2Y*&l-vdY7D0GaRYuqA&P^!-X3t^WW+pJ`_%G9%O-C|{p3W5G*BUh?dMuS zhXS#Z7PnnP;8+% z%YQ$46BLWk&4AgLe1*eYZO!X%B+)a2lQRgk8MC4yWeP6ThcsuF!<7OvdUt2cXxs8 z)lI^ON@(?xWzA=n1_t+h@0Z;rprG)+x^Qn!N=T4m_6%Kj8ejh1+Ey5gv3Y-%cST4@ zs|Y&Froib3L21U%Z_obgy>#j&(Ob9kZ!+L#R%Q+J;+X+Gq4UAI4zvM9u685AAeD2V zQE@UG8iYg96R=R>mee6hs;9-r!t&ab8<=kcLdWD~8N}_5zyk)Kc3tVG0IFN>qlRp@ z53dVYp!wk4p98M5-n3inhv_&9$EyGm z9y|dCF0{BSB42h4Twf08Gvwcqr>9kWc8haWfg_Z@5h_p6QZM)3sh)GHM=9+(4Nsph_7XwA8(WJ z1g5n(0SbZ%WdJ?=j5P`@mDBU>mK6uM`E2tgkm*`UcXfW4FhBF!g*iI1_W`B<6XtsK z%R_DNS8@mb#7`F0>jE-#TuS2~;I-8}^;+k_!m%1SU*Y)8Dif-Slh1xi8m5aag-#UK zcK0q}E`o@Dqz};wW`1i>161D)pY`to{Uo&$mtlQfn=_*&!77x ziLRR^rk2obuCueVyP33-@^lSVTbcjMEY!$wweUivkN3B5f2g3rH5=U=WMzA@U}4}^ z!*g&4!p7SsDep~|*+~yDc7}(CHMPDsS6PID^Gwqjny56(wQPkV2Gmh-t|7D?V5>dw z`idGCf`P)=GcfS1-kDxOX^8?kS2^E;4k+K>g&S<(7|!LS>pbuW*#(tFO%)!mcbEfz$xSK9{`u)m@PqFL=H@=C=%fS< z;zVt&m&1<3IWo?~2g31p%r;YInF3VAASy}BWb9^qA zQRFRAbq}p#X<7UcBh0|SK#-`qpfzGX28^BbFL{L z2S7?LE4UaN=wwi_8)Jk;Qi;5M>~fY0OAkNUmQ_f@CtER5?Zpp5C)M*&Z^8X(HK4gVHpbmZNShB z)kWc@RA2Kcr^er93j{&E*YetDubcMbX3s7`jnrKROb!dyJD_MP&$}JA&8QZFJI(OCj+r#V>p8(rKD&dJZJJIsT3jm;+~}Os~e`0JfOaR|5QU=ZSDz&lK*v_p5*sC6%Kmb z)#L_l8TVLN6jK8d3*EnX+k*{XiUsiRH3HC@ba_yUYFPs8xaY}yutg9jXngfhmxv?T zV-*g2ms7vy<#zuPNgopLbain`u&7d*3Jiu_{M4ZSe|0n3K{vzbXE-NkWk7*R0j*a| zhlk#?aJdxWLop_S>pE7i< z@^-(oQF%bLj)umLaSJ6IstF}0t_rx2ox8K+H z1q;c!iKL$rA*b~{Dp^_CtkXe`0l`YoV_S=|YVcA(VO;9N@;Zs=c)=A9QYzrSTntL! z#@$Xx{=uYKE_&f023nO`ULZgC`1qWspp5XHi~^3ymD}>nDIMl#_GhOn=|v6}BctdQ z%^x-{R=8IWzE@jy@?5@7&X~XHS!(_zkqvkRd(DP_UQ3Ud@y#QlJkh}uMb(#}*8mWr zrrqr&&Xe7AiN~+W?~ss?P*I84&xv07r*+H%js_}W?z?yU&j=Iwv%Oz`9Az)NYcmXC z*1Mz1rApO)Hu-)({d>m9JI0P*a~ep~Uw=pTMoziuhox2Lm|N&9qN#jR?tSi(Ow%x01O`VxSE)mX_RO`2d64%Nb-7EjoxA7u!^|gnNl3$WK_7@JfoE&-RV`*Om-|7EPwl+o@M&k zV>ldMY1*f$B})*)S(UY)xF26VQTkNC0<8?FkDvFvL*H=zU|V|obUMZsy|ZF$#E4#{ zC4*sF1pa`9z*0MuGb@KnzS^o#_bFyQ7dd*;Fv?8F7 z7GlH|>WsCYOc0HQhIL5Ea>L`_v_HTuS(SHZ{2-I`P}sN$aMT{($Siu*t%)Bywl++d&IxMCxwA?H745(al)aEM7ryf~O)q{_pjd3jvwpt0I$KQGP@ zwSNpO4>ac2ZI}dk9Th~yoie{q`Xomw@?Js~_BwsaLSrjWZnmTw?JF5l?V+SSxOEI^ z!Lt@&GMO5i?;RS?qd84_gc|D20$juG9NpSWadbiuad7-Gl=ni`f=59vI`nIm$w+b` z=OfoW%4Fv05-`6LTxUvQNX*HErqSEw za?>iNo_ygLP?|4z_cocwjuJ~Ynf(ViJdXMC^|cBjMCfdR%P7n+2KY$4f>j|gvCc8L zgJCY-Q|4yzn%dBkT<#;kCA}sh-O`CHduT>Hdh%+I1~wL`Fme}@|Ct7~1s}iI02~(d zQI&E;#0%4p z#>(X##ws`*EgCr-(MDtFl_Zh0(Vi#_?_t@rT^nq5Lpn_U&1LD zZP^P8;!+p-OofzR-PkBdS-~5MSyX1z2m!BS@z?7_8VH$$@t%L7biic@i~KCzt^Xzn z?wmXD9du%qqO9Yj9w@lqsx#9#9_1%D(|Zz`D}5P&fF=B$n@ng{;LH)W4=-cvvL!IB z4BN$3RkqNOsy%U}z8hfu3e|FIvR0MyndjTtAmj-?V1h0&Q|<`3UXoLr526hXN%fdK z?8B#T)Q6x(8Nj&xa`l_mXQV)0(pW=D$;iF~k1W6w*WXc6A<2;yBe8x(vx?%wublrs zawY%w_~rrbckPgLd>}b~i-0iTLlV6t`&C*t{O17?@NkaY)Bd!6e)c%MReUa$J>3WI z+wG%Of?px0C~-!DqTH_u`@ZTiH-y>a-9wnLuPmpO z!-xee@7enz>=lsw6lmw2RtqgP;70f)W$?|$Sl%NK?a14O!@Y*E1?kR`L^PPyP$|b# zbIqc0P7mVK_d%sD^Tw*U3d|`UuLE0AnmWp*62N-bpgr85$#)Vt`uJh$-GgQsKvSd% zdB&^X1?4FrIk{(YloEEnou5`7$_=MEwhI=DzaLb1u%{heML+XslYd0GM15n|0sHAl zTlXYovNrc2IhH@VM}$En3kdpWP=;kc`Vm=qK@#wRfFGZDgT1E}^hzrA z5rEPoKO$CrUz8rV@F|R}=*@Z4Ct}2D=<7sVlo*bn9fJ4z`yA3Sc1S-_J_W#F0?+SE zwaBZQH;FOE3=<(4NaCOc_jhp3^0LjZzpz}vWPg^dWlZ9?Ix7_@Y%)x0#!YQge7Mb~ zmW%#9RNe|IcgQDPl4+&QtJU!61F$g%D)8Jg#(oDfeWke2viwM1t|qrkP$Dp1upa|o znm;n}b(@bD)9bfZsTF^phDinWO`C7pAz}@1hnF~!kyfk8#ERco!fk%}lofaf6K!;nm1buOW3VoWuZUjH^6dtbOfZE)cIWAnkFjpvST{<6`)7R z2SE*^k&B;d_SWea*S~>@X4{?vTu{V6%lY`LThwZb=)6O$fAt;z`DOVUDIUlC5-G84 Q1N;pl15=bN71s~=AGE&wkN^Mx literal 0 HcmV?d00001 diff --git a/docs/diagrams/GroceryLocation.puml b/docs/diagrams/GroceryLocation.puml new file mode 100644 index 0000000000..ee39e4596a --- /dev/null +++ b/docs/diagrams/GroceryLocation.puml @@ -0,0 +1,29 @@ +@startuml +skinparam classAttributeIconSize 0 +hide circle + +class GroceryList { + +editLocation(details: String) +} + +class Grocery { + +} + +class LocationList { + +addLocation(name: String) + +removeLocation(name: String) + +findLocation(name: String) +} + +class Location { + -name: String + +addGrocery(grocery: Grocery) + +removeGrocery(grocery: Grocery) +} + +GroceryList "1" -> "*" Grocery : stores > +LocationList "1" -> "*" Location : contains > +Grocery "*" <--> "1" Location : stored in > + +@enduml \ No newline at end of file diff --git a/docs/diagrams/editLocation.png b/docs/diagrams/editLocation.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8029678d6f3cffcc337b06af39c10d1a851c1b GIT binary patch literal 48184 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%0DmmL=)8LHvXd7Z~Fdkha#+@C*6VHAO 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 eXD0=eiG_{reiY{BFS;D&+D#Zf; literal 0 HcmV?d00001 diff --git a/docs/diagrams/editLocation.puml b/docs/diagrams/editLocation.puml new file mode 100644 index 0000000000..88f207085b --- /dev/null +++ b/docs/diagrams/editLocation.puml @@ -0,0 +1,65 @@ +@startuml + +participant "groceryList:GroceryList" as gl +participant ":LocationList" as ll +participant "grocery:Grocery" as g +participant "oldLocation:Location" as ol +participant "location:Location" as nl + + -> gl : editLocation() +activate gl + +gl -> gl : checkDetails() +note right +Ensures user input is valid +end note +activate gl +return locationParts + +gl -> gl : getGrocery() +activate gl +return grocery + +alt Location exists + gl -> ll : findLocation() + activate ll + return location +else Location does not exist + gl -> ll : findLocation() + activate ll + ll -> ll : addLocation() + + note right + Creates new Location + end note + + activate ll + return Location + return location +end + +gl -> g : getLocation() +activate g +return oldLocation + +opt Target location == Old location + <- gl: throw SameLocationException() + +else Grocery previously stored + gl -> ol : removeGrocery() + activate ol + return +end + +gl -> g : setLocation() +activate g +return + +gl -> nl : addGrocery() +activate nl +return + +deactivate gl + + +@enduml \ No newline at end of file diff --git a/docs/diagrams/useAmt.png b/docs/diagrams/useAmt.png index b91b49834406d7d5eb74904f0b2c57a3dccfe91c..40e712bb97463e7391ab11bfeb4f2da30a415b3b 100644 GIT binary patch literal 24978 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 literal 24784 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 diff --git a/docs/diagrams/useAmt.puml b/docs/diagrams/useAmt.puml index 0f70f70022..3d92c37369 100644 --- a/docs/diagrams/useAmt.puml +++ b/docs/diagrams/useAmt.puml @@ -1,7 +1,7 @@ @startuml participant "groceryList:GroceryList" as gl -participant ":Grocery" as g +participant "grocery:Grocery" as g participant "ui:Ui" as ui -> gl : editAmount() @@ -16,7 +16,7 @@ return amtParts gl -> gl : getGrocery() activate gl -return Grocery +return grocery gl -> gl : checkAmount() note right diff --git a/docs/team/wallywallywally.md b/docs/team/wallywallywally.md index aa9e23c241..e999d1d052 100644 --- a/docs/team/wallywallywally.md +++ b/docs/team/wallywallywally.md @@ -38,9 +38,9 @@ It allows users to track and manage their groceries around their home easily. 2. #### Developer Guide - Design and implementation details - - For features `amt` and `use`, along with a sequence diagram + - For features `amt`/`use` and `store` - Class diagram for `Grocery`, `GroceryList`, `Location`, `LocationList` - - Sequence diagram for `handleLocationCommands` + - Sequence diagram for `handleLocationCommands`, `editAmount`, `editLocation` - Product scope - Target user profile, Value proposition, User stories - General information From 729c8444744aaf99a2c6549e36610c215c472bbe Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 13:06:22 +0800 Subject: [PATCH 311/339] Update tests --- src/test/java/grocery/GroceryTest.java | 2 +- src/test/java/grocery/location/LocationListTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index bdef931431..0b11809b44 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -98,7 +98,7 @@ public void printGrocery_correctAmtAndExpAndCost() { public void toSaveFormat_success() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); String formattedGrocery = grocery.toSaveFormat(); - String expectedFormat = "chicken | 1 | null | 2024-04-15 | meat | 1.20 | Pantry "; + String expectedFormat = "chicken | 1 | null | " + LocalDate.now().plusDays(1) + " | meat | 1.20 | Pantry "; assertEquals(expectedFormat, formattedGrocery); } diff --git a/src/test/java/grocery/location/LocationListTest.java b/src/test/java/grocery/location/LocationListTest.java index 29e1bf9d2b..5d50f36f57 100644 --- a/src/test/java/grocery/location/LocationListTest.java +++ b/src/test/java/grocery/location/LocationListTest.java @@ -32,7 +32,7 @@ public void addLocation_duplicate_exceptionThrown() { @Test public void findLocation_noSuchLocation_exceptionThrown() { - assertThrows(NoSuchObjectException.class, () -> LocationList.findLocation("cabinet")); + assertThrows(NoSuchObjectException.class, () -> LocationList.findLocation("Nuclear reactor")); } @Test From 9019023cef5e80c82e53fdfeb5e6d0d7abd17744 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 15:15:53 +0800 Subject: [PATCH 312/339] Use constants for category --- src/main/java/git/GroceryUi.java | 5 ++--- src/main/java/grocery/Grocery.java | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 5c655648c8..6763131d0e 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -259,9 +259,8 @@ public Location promptForLocation() { return location; } - //@@author wallywallywally + //@@author luozihui2003 - //@@author LuoYu-uwu /** * Prompts user for category. */ @@ -286,7 +285,7 @@ public int promptForAmount(){ return promptForAmount(); } } - + //@@author LuoYu-uwu /** * Prompts the user to enter the cost of the grocery for at most 5 times. * If invalid value is entered for the 6th time, auto set the cost to 0. diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 0f8ca564f2..4578fb6485 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -5,7 +5,6 @@ import exceptions.PastExpirationDateException; import grocery.location.Location; - /** * Represents a grocery. */ @@ -24,7 +23,11 @@ public class Grocery { private boolean isSetCost; private boolean isSetAmount; - + // Constants for categories + public static final String FRUIT = "fruit"; + public static final String VEGETABLE = "vegetable"; + public static final String MEAT = "meat"; + public static final String BEVERAGE = "beverage"; /** * Constructs a Grocery. @@ -85,7 +88,7 @@ public LocalDate getExpiration() { } public String getCategory() { - return this.category; + return category; } public double getCost() { @@ -175,22 +178,21 @@ public boolean isLow() { return this.amount < this.threshold; } } - /** * Set unit of the grocery based on its category. * * @param category Category of the grocery. */ public void setUnit(String category) { - switch (category.toLowerCase()){ - case "fruit": + switch (category){ + case FRUIT: this.unit = "pieces"; break; - case "vegetable": - case "meat": + case VEGETABLE: + case MEAT: this.unit = "grams"; break; - case "beverage": + case BEVERAGE: this.unit = "ml"; break; default: From 4c10a6afcdd2461173577b1d0cc46583c6286e40 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 15:30:46 +0800 Subject: [PATCH 313/339] Make return statement for promptforAmount more obvious, set limit to number of times user can enter amount --- GroceryList.log.1 | 64 +++++++++++++++++++++++ GroceryList.log.2 | 88 ++++++++++++++++++++++++++++++++ src/main/java/git/GroceryUi.java | 21 +++++--- 3 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 GroceryList.log.2 diff --git a/GroceryList.log.1 b/GroceryList.log.1 index 26eadd704c..615e552e92 100644 --- a/GroceryList.log.1 +++ b/GroceryList.log.1 @@ -78,3 +78,67 @@ Added ma (as), amount: 0, expiration date not set, cost: $0.00, location: null, remark not set + + + + + 2024-04-15T07:28:00.146164Z + 1713166080146 + 164000 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk (BEVERAGE) + + + 2024-04-15T07:28:00.162164300Z + 1713166080162 + 164300 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk tea (BEVERAGE) + + + 2024-04-15T07:28:00.163166800Z + 1713166080163 + 166800 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added tomato (VEGETABLE) + + + 2024-04-15T07:28:00.164165600Z + 1713166080164 + 165600 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added banana (FRUIT) + + + 2024-04-15T07:28:00.165166300Z + 1713166080165 + 166300 + 4 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added eepy (NOT SLEEPY) + + diff --git a/GroceryList.log.2 b/GroceryList.log.2 new file mode 100644 index 0000000000..8aa40c0af5 --- /dev/null +++ b/GroceryList.log.2 @@ -0,0 +1,88 @@ + + + + + 2024-04-15T07:28:00.571022100Z + 1713166080571 + 22100 + 0 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk (BEVERAGE) + + + 2024-04-15T07:28:00.582021200Z + 1713166080582 + 21200 + 1 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added milk tea (BEVERAGE) + + + 2024-04-15T07:28:00.591018600Z + 1713166080591 + 18600 + 2 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added tomato (VEGETABLE) + + + 2024-04-15T07:28:00.592019200Z + 1713166080592 + 19200 + 3 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added banana (FRUIT) + + + 2024-04-15T07:28:00.593020400Z + 1713166080593 + 20400 + 4 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added eepy (NOT SLEEPY) + + + 2024-04-15T07:29:00.741576500Z + 1713166140741 + 576500 + 5 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added beans, amount: 0 + + + 2024-04-15T07:29:39.987825200Z + 1713166179987 + 825200 + 6 + grocery.GroceryList + INFO + grocery.GroceryList + addGrocery + 1 + Added egg, amount: 5 + + diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 6763131d0e..c0143b4834 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -277,13 +277,22 @@ public String promptForCategory(){ * Prompts user for amount. */ public int promptForAmount(){ - System.out.println("Please enter the amount (e.g. 3):"); - try { - return Integer.parseInt(in.nextLine().trim()); - } catch (NumberFormatException e){ - System.out.println("Please enter a valid integer for the amount (e.g. 3)!"); - return promptForAmount(); + System.out.println("Please enter a valid integer for the amount (e.g. 3):"); + int amount = 0; + for (int i = 0; i < 5; i++){ + try { + amount = Integer.parseInt(in.nextLine().trim()); + break; + } catch (NumberFormatException e){ + System.out.println("Amount entered is invalid!"); + if (i == 4){ + System.out.println("Failed to enter valid amount. Amount will be stored as 0."); + } else { + System.out.println("Please enter a valid integer."); + } + } } + return amount; } //@@author LuoYu-uwu /** From 0cdbe3dd9a99363161778cb7ced6fda9c5dbf3d5 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 15:43:18 +0800 Subject: [PATCH 314/339] gradle: move public static --- src/main/java/grocery/Grocery.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index 4578fb6485..c1cb91a26b 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -9,6 +9,10 @@ * Represents a grocery. */ public class Grocery { + public static final String FRUIT = "fruit"; + public static final String VEGETABLE = "vegetable"; + public static final String MEAT = "meat"; + public static final String BEVERAGE = "beverage"; private String name; private int amount; private int threshold; @@ -23,12 +27,6 @@ public class Grocery { private boolean isSetCost; private boolean isSetAmount; - // Constants for categories - public static final String FRUIT = "fruit"; - public static final String VEGETABLE = "vegetable"; - public static final String MEAT = "meat"; - public static final String BEVERAGE = "beverage"; - /** * Constructs a Grocery. * From d9d497425b1442d06a0aad9983e19d4ec1e466ee Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 15:51:40 +0800 Subject: [PATCH 315/339] edit category --- src/main/java/grocery/Grocery.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index c1cb91a26b..821a38406f 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -9,10 +9,10 @@ * Represents a grocery. */ public class Grocery { - public static final String FRUIT = "fruit"; - public static final String VEGETABLE = "vegetable"; - public static final String MEAT = "meat"; - public static final String BEVERAGE = "beverage"; + public static final String FRUIT = "FRUIT"; + public static final String VEGETABLE = "VEGETABLE"; + public static final String MEAT = "MEAT"; + public static final String BEVERAGE = "BEVERAGE"; private String name; private int amount; private int threshold; @@ -273,8 +273,10 @@ public String printGrocery() { } String unitString = ""; - if (unit != null) { - unitString = " " + unit; + if (isSetAmount) { + if (unit != null) { + unitString = " " + unit; + } } String exp = ""; From 844b26a2b29a2134d4609249f660d25eccfb6480 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 16:08:54 +0800 Subject: [PATCH 316/339] gradle: remove grams from tests --- src/test/java/grocery/GroceryTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 0b11809b44..fa1c83ea70 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -73,7 +73,7 @@ public void isLow_aboveThreshold_false() { @Test public void printGrocery_noAmountNoExpiration_leaveEmpty() { Grocery grocery = new Grocery("apple", 0, 0, null, "fruit", 0, new Location("Pantry")); - String message = "apple (fruit), amount: 0 pieces, " + + String message = "apple (fruit), amount: 0 , " + "cost: $0.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -81,7 +81,7 @@ public void printGrocery_noAmountNoExpiration_leaveEmpty() { @Test public void printGrocery_costWrongFormat_formattedCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1,new Location("Pantry")); - String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + String message = "chicken (meat)" + ", amount: 1 " + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.00, location: Pantry"; assertEquals(message, grocery.printGrocery()); } @@ -89,7 +89,7 @@ public void printGrocery_costWrongFormat_formattedCost() { @Test public void printGrocery_correctAmtAndExpAndCost() { Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); - String message = "chicken (meat)" + ", amount: 1 grams" + ", expiration: " + String message = "chicken (meat)" + ", amount: 1 " + ", expiration: " + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } From 58437a88e6b4fb7e90877300fb8b8b3f55d4940e Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 16:45:34 +0800 Subject: [PATCH 317/339] Modify readme.md and add sequence diagram --- docs/diagrams/GroceryList_editExpiration.png | Bin 0 -> 64993 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/diagrams/GroceryList_editExpiration.png diff --git a/docs/diagrams/GroceryList_editExpiration.png b/docs/diagrams/GroceryList_editExpiration.png new file mode 100644 index 0000000000000000000000000000000000000000..c20e884046d3cc0f34f2d18b29d34b52ba5050bc GIT binary patch literal 64993 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 Date: Mon, 15 Apr 2024 16:45:58 +0800 Subject: [PATCH 318/339] Add new features and improvements to Grocery in Time application --- README.md | 92 +++++++++++++++++++++++++++++++++++++----- docs/DeveloperGuide.md | 2 + docs/team/64-1.md | 15 +++++-- 3 files changed, 96 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0f24b4d101..604f8c7a8d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,20 @@ ## Introduction Welcome to GiT, Grocery in Time, a Java application designed for efficient grocery management. This tool helps users monitor their groceries, including tracking expiration dates, managing inventory quantities, and setting alerts for low stock or soon-to-expire items. +## Table of Contents +- [Getting Started](#Getting-started) +- [Features](#features) + - [Common Commands](#common-commands) + - [Grocery Management](#grocery-management) + - [Calories Management](#calories-management) + - [Profile Management](#profile-management) + - [Recipe Management](#recipe-management) +- [Data Management](#data-management) +- [Command Summary](#command-summary) +- [Documentation](#documentation) +- [Contributing](#contributing) +- [License](#license) + ## Getting Started ### Prerequisites @@ -31,18 +45,76 @@ Welcome to GiT, Grocery in Time, a Java application designed for efficient groce ``` ## Features -- **Track Groceries**: Add, edit, and delete grocery items. Record details such as cost, category, expiration date, and quantity. -- **Alerts and Notifications**: Receive timely alerts for groceries that are about to expire and items that are running low on stock. -- **Search and Filter**: Use keywords to search through the inventory or filter items based on category or expiration date. -- **Reporting**: Generate reports on grocery usage, expenditure, and stock levels over time. +### Inovative Four Mode Application +- **Groceries Management**: Add, edit, and delete grocery items with detailed commands. Manage your inventory by setting categories, amounts, expiration dates, and storage locations. Examples include `add GROCERY`, `del GROCERY`, and `edit GROCERY`. +- **Calorie Management**: Track calorie intake by logging food consumption and viewing total calories. Commands like `eat FOOD` and `view` help maintain dietary goals. +- **Recipe Management**: Add, view, and manage recipes. Store detailed recipes including ingredients and cooking steps, and find recipes using keywords with commands such as `add RECIPE`, `view RECIPE`, and `find KEYWORD`. +- **Profile Management**: Customize user profiles to support calorie management based on individual dietary needs. Update personal information and view user details with commands like `update` and `view`. ## How to Use -Upon launching GiT, you will be greeted with a simple text-based user interface. Here are some commands you can use: -- `add [item]`: Adds a new item to your inventory. -- `remove [item]`: Removes an item from the inventory. -- `update [item]`: Updates the details of an existing item. -- `list`: Lists all the items in your inventory. -- `help`: Displays help information about all the commands. +Upon launching GiT, you will be greeted with a simple text-based user interface. + +### Common Commands +- **Switch Mode**: `switch` + - Switches the application between different modes (grocery, profile, calories, recipe). +- **Exit**: `exit` + - Closes the application. + +### Grocery Management +Manage your grocery items effectively using these commands: +- **Add Grocery**: `add GROCERY` +- **Edit Grocery**: Multiple commands to set category, amount, location, etc. +- **Delete Grocery**: `del GROCERY` +- **List Groceries**: Multiple listing options based on category, price, expiration, etc. +- **Find Grocery**: `find KEYWORD` +- **Grocery Details**: `view GROCERY` + +### Calories Management +Track and manage your daily calorie intake: +- **Add Food Consumption**: `eat FOOD` +- **View Calorie Intake**: `view` + + +### Profile Management +Manage user profile for personalized calorie tracking: +- **Update Profile**: `update` +- **View Profile**: `view` + + +### Recipe Management +Store and manage recipes: +- **Add Recipe**: `add` +- **View Recipes**: Multiple commands to view, list, find, and edit recipes. +- **Delete Recipe**: `delete RECIPE` + + +## Data Management +GiT automatically saves your data in the `/data` folder located in the same directory as the JAR file. The data includes separate files for groceries, calories, profile, and recipes. + +### Caution +Modifying data files manually can corrupt them. Always back up your data before making manual changes. + +## Command Summary + +| Command | Description | Format | +| --- | --- | --- | +| **Common** | | | +| Switch | Switch application mode | `switch` | +| Exit | Close the application | `exit` | +| **Grocery Management** | | | +| Add | Add a grocery item | `add GROCERY` | +| Delete | Delete a grocery item | `del GROCERY` | +| List | List groceries | Multiple formats | +| **Calories Management** | | | +| Eat | Log food consumption | `eat FOOD` | +| View | View calorie intake | `view` | +| **Profile Management** | | | +| Update | Update user profile | `update` | +| View | View user profile | `view` | +| **Recipe Management** | | | +| Add | Add a new recipe | `add RECIPE` | +| Delete | Delete a recipe | `delete RECIPE` | + ## Build automation using Gradle diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index dea9fae5d0..27f266e1d2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -222,6 +222,8 @@ To list groceries according to different parameters, view help, switch modes, or 1. details: String — User input read from `Scanner`. * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. +![editExpiration sequence diagram](./diagrams/GroceryList_editExpiration.png) + ### 12. Storing a grocery in a storage location * A `Grocery` stores its location by referencing a `Location` object. All `Locations` are stored in a `LocationList` class. diff --git a/docs/team/64-1.md b/docs/team/64-1.md index 8efe7b9eb8..ca83c66f3d 100644 --- a/docs/team/64-1.md +++ b/docs/team/64-1.md @@ -5,11 +5,18 @@ Grocery in Time is a desktop application used for keeping track of groceries. The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. ## Summary of contributions -* New Feature: Added the "Add Grocery" function. +* New Feature: Added the "Add Grocery" function. +* `add GROCEY` *What it does: enables users to add groceries directly into the grocery list. *Justification: This feature streamlines the process of managing grocery inventories, making it easier for users to keep their lists up-to-date. +* New Feature: Added the "AddMulti" function. +* `addmulti` + *What it does: enables user to add multiple groceries into the grocery list. + *Justification: This feature allows user to do less repeated work when adding multiple groceies at a time. + * Improvement: Amended the "Edit Expiry Date" function. +* `exp GROCERY d/EXPIRATION_DATE` *What it does: split into two distinct parts for enhanced usability. The first part prompts users for an expiry date when adding a grocery, while the second allows users to edit the expiry date at a later stage. *Justification: This modification improves the flexibility and accuracy of managing grocery expiry dates, ensuring users can easily update their groceries’ shelf life. @@ -22,11 +29,13 @@ The user interacts with it using a CLI. It is written in Java and has about 4 kL Justification: This feature enriches the grocery addition process by capturing detailed information from the outset, leading to better inventory management. * New Method: Added a method for sorting groceries by expiry date. +* `listexp` What it does: allows users to sort their grocery list based on the expiry dates of items, in either ascending or descending order. Justification: Enhances the user's ability to prioritize groceries based on expiry, helping to minimize waste and manage groceries more efficiently. * New Method: Added a method to display groceries expiring in 3 days. - What it does: shows users a list of groceries that are expiring within the next three days. +* `expiring` + What it does: shows users a list of groceries that are expiring within the next three days and send user email notifications. Justification: This method significantly aids in reducing waste by alerting users to consume or replace items nearing their expiry, improving overall grocery management. * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=64-1&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) @@ -35,7 +44,7 @@ The user interacts with it using a CLI. It is written in Java and has about 4 kL * User Guide: * Added documentation for the features `add`, `exp`, `rate`, `listexp`, and `expiring`. * Developer Guide: - * Added implementation details of the `add` and `expiring` feature. + * Added implementation details of the `add`, `exp`, and `expiring` feature. * Review/mentoring contributions: * [#6](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/6) , From e6081c7b16952452f3057949616cd2246dff103e Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 16:49:10 +0800 Subject: [PATCH 319/339] edit PPP --- docs/team/luozihui2003.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md index 249a7556e6..9f711a5469 100644 --- a/docs/team/luozihui2003.md +++ b/docs/team/luozihui2003.md @@ -3,16 +3,22 @@ Grocery in Time is a desktop application used for keeping track of groceries. The user interacts with it using a CLI. It is written in Java and has about 7 kLoC. ## Summary of contributions -* New Feature: Added the "Find Grocery" function. - *What it does: enables users to find groceries from the list of groceries. - *Justification: This feature aids user in finding the grocery that they are looking for quicker, and allow them to view its details. +* New Feature: Added the "Delete Grocery" function. + * What it does: enables users to delete groceries from the list of groceries. + * Justification: This feature aids user in deleting the grocery that they no longer need. * New Feature: Add category parameter for Grocery class - What it does: Add the category of the grocery, and automatically assigns the unit to the item by its category (e.g. beverage is assigned ml). - Justification: This feature enables user to add amount later on, based on the unit that has been assigned. + * What it does: Add the category of the grocery, and automatically assigns the unit to the item by its category (e.g. beverage is assigned ml). + * Justification: This feature enables clarity for the user, by adding a unit behind the amount. -* New Feature: Add Save and Load file feature - What it does: Saves the list, with all groceries and the details into a text file, and loads it. - Justification: This feature enables users to leave the program, and still be able to see all their groceries stored when they return. +* New Feature: Add Save and Load file feature for Grocery + * What it does: Saves the grocery list, with all its details into a text file, and loads it. + * Justification: This feature enables users to leave the program, and still be able to see all their groceries stored when they return. +* New Feature: Add Save and Load file feature for Recipe + * What it does: Saves the recipe list, with all its details into a text file, and loads it. + * Justification: This feature enables users to leave the program, and still be able to see all their recipes stored when they return. +* New Feature: Add Save and Load file feature for Profile + * What it does: Saves the User Profile, with all its details into a text file, and loads it. + * Justification: This feature enables users to leave the program, and be recognised as an existing user when they return. * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luozihui2003&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=false) From 6676d54473d76104feee65ecbdf01af323ac879a Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 16:51:52 +0800 Subject: [PATCH 320/339] add imporvement to ppp --- docs/team/luozihui2003.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md index 9f711a5469..e42560f481 100644 --- a/docs/team/luozihui2003.md +++ b/docs/team/luozihui2003.md @@ -20,5 +20,5 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * New Feature: Add Save and Load file feature for Profile * What it does: Saves the User Profile, with all its details into a text file, and loads it. * Justification: This feature enables users to leave the program, and be recognised as an existing user when they return. - +* Improvement: Wipes saved file if user corrupts it * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luozihui2003&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=false) From e2051c9ea92873ea3a46f53c4cf074ba00cf7c78 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 17:27:30 +0800 Subject: [PATCH 321/339] Update README --- docs/AboutUs.md | 14 +++++++------- docs/team/wallywallywally.md | 5 ++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0a1f32c2d4..aafaa70206 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) | Luo Zi Hui | [Github](https://github.com/) | [Portfolio](team/luozihui2003.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Liu Siyi | [Github](https://github.com/) | [Portfolio](team/64-1.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Sharlyn Lui | [Github](https://github.com/) | [Portfolio](team/sharlynlui.md) | -| ![](https://via.placeholder.com/100.png?text=Photo) | Luo Yu | [Github](https://github.com/luoyu-uwu) | [Portfolio](team/luoyu-uwu.md) | +| Display | Name | Github Profile | Portfolio | +|-----------------------------------------------------------------------------------------------|:------------------:|:--------------------------------------------:|:------------------------------------:| +| Zi Hui's Github avatar ) | Luo Zi Hui | [Github](https://github.com/luozihui2003) | [Portfolio](team/luozihui2003.md) | +| Siyi's Github avatar | Liu Siyi | [Github](https://github.com/64-1) | [Portfolio](team/64-1.md) | +| Willson's Github avatar | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally.md) | +| Sharlyn's Github avatar | Sharlyn Lui | [Github](https://github.com/SharlynLui) | [Portfolio](team/sharlynlui.md) | +| Luo Yu's Github avatar | Luo Yu | [Github](https://github.com/luoyu-uwu) | [Portfolio](team/luoyu-uwu.md) | \ No newline at end of file diff --git a/docs/team/wallywallywally.md b/docs/team/wallywallywally.md index e999d1d052..8b9306bf00 100644 --- a/docs/team/wallywallywally.md +++ b/docs/team/wallywallywally.md @@ -70,7 +70,8 @@ As shown in the following PRs: * Reported bugs for another team's program during the Practical Exam Dry Run: [BinBash](https://github.com/AY2324S2-CS2113T-T09-2/tp) -  +
+ ## Examples of documentation contributions ## 1. Extracts from the User Guide @@ -109,6 +110,8 @@ Here are your groceries! - pasta (carbs), cost: $2.95, location: cubby ``` +
+ ## 2. Extracts from the Developer Guide ### [Grocery Management Mode](../DeveloperGuide.md#4-grocery-management-mode) From 2ccefa7b1be903fcb590ca287231a76e0ae7cb70 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 18:14:15 +0800 Subject: [PATCH 322/339] Fix issue in AboutUs --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index aafaa70206..2dd15e111a 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -2,7 +2,7 @@ | Display | Name | Github Profile | Portfolio | |-----------------------------------------------------------------------------------------------|:------------------:|:--------------------------------------------:|:------------------------------------:| -| Zi Hui's Github avatar ) | Luo Zi Hui | [Github](https://github.com/luozihui2003) | [Portfolio](team/luozihui2003.md) | +| Zi Hui's Github avatar | Luo Zi Hui | [Github](https://github.com/luozihui2003) | [Portfolio](team/luozihui2003.md) | | Siyi's Github avatar | Liu Siyi | [Github](https://github.com/64-1) | [Portfolio](team/64-1.md) | | Willson's Github avatar | Willson Han Zhekai | [Github](https://github.com/wallywallywally) | [Portfolio](team/wallywallywally.md) | | Sharlyn's Github avatar | Sharlyn Lui | [Github](https://github.com/SharlynLui) | [Portfolio](team/sharlynlui.md) | From 1a40b79687497b540d88b07759cd28144e291fda Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 18:39:34 +0800 Subject: [PATCH 323/339] Add validation for input number in GroceryUi.java --- src/main/java/git/GroceryUi.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 5c655648c8..9e852329e6 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -88,6 +88,8 @@ public Grocery[] promptAddMultipleMenu() throws DuplicateException { num = Integer.parseInt(in.nextLine().trim()); if (num <= 0) { System.out.println("\nPlease enter a positive number."); + } else if (num > 20) { + System.out.println("\nWow, that's too many."); } else { break; // Break loop if input is a positive integer } From 818da9e4fe3ce7d4a92b83df20c485ceb4e67431 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 20:06:07 +0800 Subject: [PATCH 324/339] Add License.md --- License.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 License.md diff --git a/License.md b/License.md new file mode 100644 index 0000000000..11068a64e2 --- /dev/null +++ b/License.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [2024] [CS2113-T12-02] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From fd7c4cfc0a60eb698e2764c63498bec8e3c1de2e Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 20:09:19 +0800 Subject: [PATCH 325/339] PPP and DG --- docs/DeveloperGuide.md | 15 +++++++++++++-- docs/team/sharlynlui.md | 26 ++++++++++++++------------ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 27f266e1d2..208e738710 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -246,7 +246,9 @@ To list groceries according to different parameters, view help, switch modes, or ## Product Scope ### Target user profile -Our target user is someone who regularly goes grocery shopping, and would like to track and manage their inventory of groceries. +Our target user is someone who regularly goes grocery shopping, and would like to track and manage their inventory of groceries. +Our target user is also health-conscious and interested in keeping track of their calorie consumption. +Additionally, other than grocery shopping, our target user will likely be cooking as well, thus they will want to create and management their own recipes. ### Value proposition @@ -257,7 +259,12 @@ Users are able to edit and manage the category, amount, expiration date, and sto When groceries are running low, the app can generate a shopping list to remind users of what they need to buy. Furthermore, the app can generate a list of items that are expiring soon, reminding users to consume their groceries as soon as possible. -GiT also comes with other modes for recipe management and calorie tr acking. +GiT also comes with other modes for recipe management, profile management and calorie tracking. + +In recipe management mode, users will be able to create and record their own recipes with details such as title, ingredients and steps. +User will be able to look for recipes using a keyword, view and edit existing recipes. +In profile management mode, users can store information such as weight, height and gender to calculate and manage their calories intake according to their goals. +Lastly, in calorie tracker, users can add the food they have eaten along with the calories for the GiT to calculate user's total intake. ## User Stories @@ -278,10 +285,14 @@ GiT also comes with other modes for recipe management and calorie tr acking. | v2.0 | forgetful user | find my groceries by name | know if I have tracked that grocery | | v2.0 | user who replenishes groceries | set threshold amount for the groceries | know what groceries I should top up | | v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | +| v2.0 | user who cooks with recipes | list all my recipes | know what recipes I have created | +| v2.0 | user who cooks with recipes | view all the details of a recipe | use the recipe to recreate the dish | +| v2.0 | user who cook with recipes | delete a recipe | remove recipes I no longer want | | v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | | v2.0 | environmentally-conscious user | get a list of items that are expiring soon | prioritise using them to reduce food waste | | v2.0 | reviewer | rate and review products | know if I like them | | v2.0 | meticulous user | add remarks to my groceries | know extra information about my groceries | +| v2.1 | user who cooks with recipes | edit my old recipes | update the recipes to new preferences and methods | | v2.1 | user | store my past grocery information | access information about the groceries I am tracking | ## Non-Functional Requirements diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 9ca4020839..f9e98086ee 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -6,17 +6,17 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL ## Summary of contributions * **New Class:** Added the Recipe class and RecipeList class. - * What it does: allow user to manage recipes with title, ingredients and steps in the application. - * Justification: user will be able to record their own recipes for easy viewing. -* **New Feature:** Added View Recipe, List Recipe, Add Recipe, Edit Recipe, Delete Recipe, Find Recipe and View Recipe. - * Justification: allow user to use to manage recipes in the application. -* **New Class:** Added View Grocery. - * What it does: user can view all the details of the specific grocery. - * Justification: user might not remember what they have recorded for the recipe and might want to check the details. -* **New Class:** Added Remark and Edit Remark - * What it does: allow user to add a remark attached to the grocery to be displayed when viewed or listed. - * Justification: user can remind themselves instructions for these groceries e.g. to keep it for next week. -* **Code Contributed:** [RepoSense link]() + * What it does: allow users to manage recipes with title, ingredients and steps in the application. + * Justification: users will be able to record their own recipes for easy viewing. +* **New Feature:** Added `View` Recipe, `List` Recipe, `Add` Recipe, `Edit` Recipe, `Delete` Recipe, `Find` Recipe and `View` Recipe. + * Justification: allow users to manage recipes in the application. +* **New Feature:** Added `View` Grocery. + * What it does: users can view all the details of the specific grocery. + * Justification: users might not remember what they have recorded for the recipe and might want to check the details. +* **New Feature:** Added `Remark` and `Edit` Remark. + * What it does: allow users to add a remark attached to the grocery to be displayed when viewed or listed. + * Justification: users can remind themselves instructions for these groceries e.g. to keep it for next week. +* **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=SharlynLui&tabRepo=AY2324S2-CS2113-T12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) * **Project management:** * Manged releases v1.0-v2.1 on GitHub * **Enhancements to existing features:** @@ -25,14 +25,16 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * Updated rate grocery feature to only accept valid inputs. * Updated greetings to accept valid input as username. * Cosmetic improvement made to the display of view recipe feature. + * Improved defensiveness with test cases and assertions. * **Documentation:** * User Guide: * Added documentation for Recipe Management: `add`, `list`, `view`, `find`, `edit`, `delete` ([#85](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/85/commits), [#175](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/175)) * Added documentation for Grocery Management: `view` * Categories the commands into 3 main category. ([#179](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/179)) * Developer Guide: + * Contributed to the target user profile, value proposition and user stories. * **Community:** - * PRs reviewed (example [1](https://github.com/nus-cs2113-AY2324S2/tp/pull/24), [#2](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/24)) + * PRs reviewed (example [1](https://github.com/nus-cs2113-AY2324S2/tp/pull/24), [2](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/24)) * Reported bugs and suggestions for other teams in the class. * Fixed bugs on our team project. ([#142](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/142),[#138](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/138), [#139](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/139), [#117](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/117), [#102](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/102), [#101](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/101), [#100](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/100), [#91](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/91)) * Identity potential bugs on our team project. ([#158](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/158)) From 728120b9362fd1e3693eaea876a27f561a8cf3ce Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 20:12:43 +0800 Subject: [PATCH 326/339] Minor edit --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 208e738710..840749efc1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -264,7 +264,7 @@ GiT also comes with other modes for recipe management, profile management and ca In recipe management mode, users will be able to create and record their own recipes with details such as title, ingredients and steps. User will be able to look for recipes using a keyword, view and edit existing recipes. In profile management mode, users can store information such as weight, height and gender to calculate and manage their calories intake according to their goals. -Lastly, in calorie tracker, users can add the food they have eaten along with the calories for the GiT to calculate user's total intake. +Lastly, in calorie tracker, users can add the food they have eaten along with the calories for GiT to calculate user's total intake. ## User Stories From 3ae8988527a5a3c9d156611e3731b2f411ad7e79 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 20:15:48 +0800 Subject: [PATCH 327/339] Add CONTRICUTING.md --- CONTRIBUTING.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..c95a1c268d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,64 @@ +# Contributing to Grocery in Time + +First off, thank you for considering contributing to Grocery in Time. It’s people like you that make Grocery in Time such a great tool. + +## Where do I go from here? + +If you've noticed a bug or have a question, [search the issue tracker](https://github.com/AY2324S2-CS2113-T12-2/tp/issues) to see if someone else in the community has already created a ticket. If not, go ahead and make one! + +## Contributing Code + +If you'd like to contribute code with a new feature or a fix, please make sure to check out [our issues](https://github.com/AY2324S2-CS2113-T12-2/tp/issues). It's a good start to see what has been reported or suggested before diving in. + +### Getting Started + +* Make sure you have a [GitHub account](https://github.com/signup/free) +* Submit a ticket for your issue, assuming one does not already exist. +* Fork the repository on GitHub. + +### Making Changes + +* Create a topic branch from where you want to base your work. +* Make commits of logical units. +* Make sure your commit messages are in the proper format (see below). +* Push your changes to a topic branch in your fork of the repository. + +### Commit Messages + +Please follow these guidelines for commit messages: + +- Use the present tense ("Add feature" not "Added feature"). +- Use the imperative mood ("Move cursor to..." not "Moves cursor to..."). +- Limit the first line to 72 characters or less. +- Reference issues and pull requests liberally after the first line. + + +### Submitting Changes + +* Push your changes to a topic branch in your fork of the repository. +* Submit a pull request to [the repository](https://github.com/AY2324S2-CS2113-T12-2/tp) in the organization. +* After feedback has been given, we expect responses within two weeks. After two weeks, we may close the pull request if it isn't showing any activity. + +## Coding conventions + +Start reading our code and you'll get the hang of it. We optimize for readability: + +* We indent using four spaces (tabs) +* We ALWAYS put spaces after list items and method parameters (`[1, 2, 3]`, not `[1,2,3]`), and around operators (`x += 1`, not `x+=1`). +* This project is built with Java, so refer to our `.editorconfig` file and Checkstyle rules for more conventions. +* Write tests for new features or fixes. We are using JUnit for unit tests. + +## Reporting a bug + +* **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/AY2324S2-CS2113-T12-2/tp/issues). +* If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/AY2324S2-CS2113-T12-2/tp/issues). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. + +## Pull Request Process + +1. Ensure any install or build dependencies are removed before the end of the layer when doing a build. +2. Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations, and container parameters. +3. Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +4. The Pull Request will be merged in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. + + +Thank you for contributing! From 5b25698f878824c3bba1d3b76101b9a3a6c8420f Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 20:18:34 +0800 Subject: [PATCH 328/339] Update README.md with link to CONTRIBUTING.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 604f8c7a8d..76074b3fe7 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ The project uses [GitHub actions](https://github.com/features/actions) for CI. W `/docs` folder contains a skeleton version of the project documentation. ## Contributing -Interested in contributing? Great! Please fork the project and submit a pull request with your proposed changes. Detailed instructions on setting up your development environment and the contribution guidelines can be found in the CONTRIBUTING.md file. +Interested in contributing? Great! Please fork the project and submit a pull request with your proposed changes. Detailed instructions on setting up your development environment and the contribution guidelines can be found in the [CONTRIBUTING.md](CONTRIBUTING.md) file. ## License This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. From 9d5b73cefa03dc60a03b60dddc80d061f1f037d6 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 20:42:48 +0800 Subject: [PATCH 329/339] Edited Reposense Link --- docs/team/sharlynlui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index f9e98086ee..50245c63fb 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -16,7 +16,7 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * **New Feature:** Added `Remark` and `Edit` Remark. * What it does: allow users to add a remark attached to the grocery to be displayed when viewed or listed. * Justification: users can remind themselves instructions for these groceries e.g. to keep it for next week. -* **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=SharlynLui&tabRepo=AY2324S2-CS2113-T12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +* **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=sharlynlui&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) * **Project management:** * Manged releases v1.0-v2.1 on GitHub * **Enhancements to existing features:** From 9c365c5e86daeab91e8bd7f8124be9f6194d2a37 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 20:52:14 +0800 Subject: [PATCH 330/339] add to ppp --- docs/team/luozihui2003.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md index e42560f481..77451dfb93 100644 --- a/docs/team/luozihui2003.md +++ b/docs/team/luozihui2003.md @@ -21,4 +21,6 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * What it does: Saves the User Profile, with all its details into a text file, and loads it. * Justification: This feature enables users to leave the program, and be recognised as an existing user when they return. * Improvement: Wipes saved file if user corrupts it +* What it does: Resets the saved file to contain nothing if a user removes a line or divider. +* Justification: This feature ensures that the saved file can be parsed correctly when loading. * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luozihui2003&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=false) From 9b59ff40d19cdd28bda455eb094cbb8cfa3a03e7 Mon Sep 17 00:00:00 2001 From: lsiyi Date: Mon, 15 Apr 2024 20:54:51 +0800 Subject: [PATCH 331/339] Update review/mentoring contributions in team/64-1.md --- docs/team/64-1.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/team/64-1.md b/docs/team/64-1.md index ca83c66f3d..c99326496c 100644 --- a/docs/team/64-1.md +++ b/docs/team/64-1.md @@ -47,9 +47,8 @@ The user interacts with it using a CLI. It is written in Java and has about 4 kL * Added implementation details of the `add`, `exp`, and `expiring` feature. * Review/mentoring contributions: - * [#6](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/6) , - [#7](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/7), - [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18), - [#27](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/27), - [#44](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/44), + [#19](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/19), + [#21](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/21), + [#46](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/46), + [#49](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/49), [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73). \ No newline at end of file From 386e51eb94248355c885fb4dc736e1fa67233484 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Mon, 15 Apr 2024 20:57:24 +0800 Subject: [PATCH 332/339] edit ppp again --- docs/team/luozihui2003.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md index 77451dfb93..fb4ea9a2df 100644 --- a/docs/team/luozihui2003.md +++ b/docs/team/luozihui2003.md @@ -21,6 +21,6 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * What it does: Saves the User Profile, with all its details into a text file, and loads it. * Justification: This feature enables users to leave the program, and be recognised as an existing user when they return. * Improvement: Wipes saved file if user corrupts it -* What it does: Resets the saved file to contain nothing if a user removes a line or divider. -* Justification: This feature ensures that the saved file can be parsed correctly when loading. + * What it does: Resets the saved file to contain nothing if a user removes a line or divider. + * Justification: This feature ensures that the saved file can be parsed correctly when loading. * Code Contribution: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=luozihui2003&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code&tabOpen=false) From e045f101ade7548611b41d86ae9d0549dfbac67a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 20:58:30 +0800 Subject: [PATCH 333/339] PPP --- docs/team/sharlynlui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 50245c63fb..983872dfb2 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -12,7 +12,7 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * Justification: allow users to manage recipes in the application. * **New Feature:** Added `View` Grocery. * What it does: users can view all the details of the specific grocery. - * Justification: users might not remember what they have recorded for the recipe and might want to check the details. + * Justification: users might not remember what they have recorded for the grocery and might want to check the details. * **New Feature:** Added `Remark` and `Edit` Remark. * What it does: allow users to add a remark attached to the grocery to be displayed when viewed or listed. * Justification: users can remind themselves instructions for these groceries e.g. to keep it for next week. From 6b08faa659db6162f488b702539d6992e06f4f19 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 21:01:05 +0800 Subject: [PATCH 334/339] PPP --- docs/team/sharlynlui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 983872dfb2..a4020f2c50 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -23,7 +23,7 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * Extracted Calories Ui, GroceryUi, ProfileUi, RecipeUi from Ui. * Updated recipe feature to only add valid recipes and disallow duplicated recipes. * Updated rate grocery feature to only accept valid inputs. - * Updated greetings to accept valid input as username. + * Updated greetings to only accept valid input as username. * Cosmetic improvement made to the display of view recipe feature. * Improved defensiveness with test cases and assertions. * **Documentation:** From e1ccdf6ca47641c1d9dd338b9ec1407ea4b9b047 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 21:04:04 +0800 Subject: [PATCH 335/339] PPP --- docs/team/sharlynlui.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index a4020f2c50..6b3ef73be1 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -28,13 +28,13 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * Improved defensiveness with test cases and assertions. * **Documentation:** * User Guide: - * Added documentation for Recipe Management: `add`, `list`, `view`, `find`, `edit`, `delete` ([#85](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/85/commits), [#175](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/175)) + * Added documentation for Recipe Management: `add`, `list`, `view`, `find`, `edit`, `delete`. ([#85](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/85/commits), [#175](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/175)) * Added documentation for Grocery Management: `view` * Categories the commands into 3 main category. ([#179](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/179)) * Developer Guide: * Contributed to the target user profile, value proposition and user stories. * **Community:** - * PRs reviewed (example [1](https://github.com/nus-cs2113-AY2324S2/tp/pull/24), [2](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/24)) + * PRs reviewed (example [1](https://github.com/nus-cs2113-AY2324S2/tp/pull/24), [2](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/24)). * Reported bugs and suggestions for other teams in the class. * Fixed bugs on our team project. ([#142](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/142),[#138](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/138), [#139](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/139), [#117](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/117), [#102](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/102), [#101](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/101), [#100](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/100), [#91](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/91)) * Identity potential bugs on our team project. ([#158](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/158)) From bdf6e450551f623af06744f3c596724cb78cd1a2 Mon Sep 17 00:00:00 2001 From: 641 <64634836+64-1@users.noreply.github.com> Date: Mon, 15 Apr 2024 21:04:32 +0800 Subject: [PATCH 336/339] Update 64-1.md --- docs/team/64-1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/64-1.md b/docs/team/64-1.md index c99326496c..b2bc47398e 100644 --- a/docs/team/64-1.md +++ b/docs/team/64-1.md @@ -51,4 +51,4 @@ The user interacts with it using a CLI. It is written in Java and has about 4 kL [#21](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/21), [#46](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/46), [#49](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/49), - [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73). \ No newline at end of file + [#73](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/73). From 3e72dd8860fe18b4f761499dd4f5d7791f1385e5 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 21:12:07 +0800 Subject: [PATCH 337/339] One full stop. --- docs/team/sharlynlui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index 6b3ef73be1..19477cdccc 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -29,7 +29,7 @@ The user interacts with it using a CLI. It is written in Java and has about 7 kL * **Documentation:** * User Guide: * Added documentation for Recipe Management: `add`, `list`, `view`, `find`, `edit`, `delete`. ([#85](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/85/commits), [#175](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/175)) - * Added documentation for Grocery Management: `view` + * Added documentation for Grocery Management: `view`. * Categories the commands into 3 main category. ([#179](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/179)) * Developer Guide: * Contributed to the target user profile, value proposition and user stories. From eb728aa8ced1040ecbc6706c642bc5c567601bff Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Mon, 15 Apr 2024 22:45:14 +0800 Subject: [PATCH 338/339] UG --- META-INF/MANIFEST.MF | 3 +++ docs/UserGuide.md | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..fbfebb43e1 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: git.Git + diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a869d018b7..f36a6a3e4a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -734,6 +734,8 @@ Target calories intake: 1655 > #### Notes about this mode > * All keywords passed in are not case-sensitive. > * Duplicated recipe title with different capitalization will not be not accepted. +> * Commands with command word + something will still be processed so that users can continue to use the feature even if they typed in extra details, as long as they follow the instructions from the prompt. +> * e.g. If command word is `add`, `add something` will also be accepted. ### Adding a new recipe: `add` Adds new recipe, ingredient and steps. From 2cdab082265f0c6558e1edae7917b55f6335a42b Mon Sep 17 00:00:00 2001 From: Willson <102905979+wallywallywally@users.noreply.github.com> Date: Mon, 15 Apr 2024 22:56:34 +0800 Subject: [PATCH 339/339] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8a204f9015..30b1a9d588 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,7 @@ text-ui-test/EXPECTED-UNIX.TXT GroceryList.log GroceryList.log.lck -/data \ No newline at end of file +/data + +/.vscode +/META-INF

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 z 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 listloc + +Here's all the locations you are tracking: +- spice rack +- freezer +- cubby +``` + +* `listloc cubby`: All groceries in `cubby` are displayed. + +``` +>> listloc cubby + +Viewing location: cubby +Here are your groceries! +- cheese (dairy), amount: 50, location: cubby +- pasta (carbs), cost: $2.95, location: cubby +``` + +## 2. Extracts from the Developer Guide ![EditAmount example 1](wallyimgs/editAmt_1.png) ![EditAmount example 2](wallyimgs/editAmt_2.png) \ No newline at end of file From 89ff41d3acfeacfccef43dfc2ea697f9792b85a6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sat, 13 Apr 2024 22:17:58 +0800 Subject: [PATCH 275/339] Add sequence diagram for editCost and editThreshold --- docs/DeveloperGuide.md | 45 ++++++++++++++++++------- docs/diagrams/editCost.png | Bin 0 -> 29975 bytes docs/diagrams/editCost.puml | 37 ++++++++++++++++++++ docs/diagrams/editThreshold.png | Bin 0 -> 34804 bytes docs/diagrams/editThreshold.puml | 41 ++++++++++++++++++++++ src/main/java/grocery/GroceryList.java | 8 ++--- 6 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 docs/diagrams/editCost.png create mode 100644 docs/diagrams/editCost.puml create mode 100644 docs/diagrams/editThreshold.png create mode 100644 docs/diagrams/editThreshold.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8bbfaf3109..404a3801a2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -88,20 +88,18 @@ To edit the information of an existing grocery. ### 1. View all groceries added - * First create a method in "Grocery" class that prints the grocery in a preferred format.\ - e.g., NAME, AMOUNT, EXPIRATION, PRICE. - * Then create a method in "GroceryList" class that prints all the groceries in the list. + * When the command entered is `list`, `listGroceries()` in GroceryList will be executed. + * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. + * Else, execute `printGroceryList(groceries)` in GroceryUi.   ### 2. List the groceries by price in descending order - * First, create a field in "Grocery" class that stores the cost of a grocery. - * When adding a grocery, prompt the user to enter the cost. - * Format the cost into 2 decimal places, remove the dollar sign and store it as a string. - * Second, the grocery's cost accordingly before adding it into the list. - * When setting the cost, convert the cost from String into Double. - * Third, add method in "GroceryList" class to create a copy of the current grocery list, then sort the - new grocery list by price using lambda function. Reverse and print the new list. - + * When the command entered is `listcost`, `sortByCost()` in GroceryList will be executed. + * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. + * Else, create a new array list name `groceriesByCost` with type `Grocery`. + * Assign all the values in current grocery list `groceries` to `groceriesByCost`. + * Execute `sort` in `groceriesByCost` with a lamba function that compares the `getCost()` value of each Grocery in the list. + * Lastly, execute `printGroceryList(groceriesByCost)` in GroceryUi.   ### 3. Input category for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'category' parameter. @@ -144,14 +142,35 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`.   -### 7. Input expiration date of each grocery when added +### 7. Edit the cost of a grocery after adding. +* when the command entered is `cost`, `editCost` in GroceryList will be executed. + ![editCost sequence diagram](./diagrams/editCost.png) +* Additional checks ensure that the user only inputs a valid `positive numeric` value. +* Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. + +  +### 8. Edit the threshold amount of a grocery after adding. +* when the command entered is `th`, `editThreshold` in GroceryList will be executed. + ![editThreshold sequence diagram](./diagrams/editThreshold.png) +* Additional checks ensure that the user only inputs a valid `positive integer`. +* Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. + +  +### 9. View a list of groceries low in stock +* When the command entered is `low`, `listLowStocks` in GroceryList will be executed. +* This will create a new array list called `lowStockGroceries` with type `Grocery` +* For each grocery in the current grocery list, `groceries`, execute `grocery.isLow()`. Add the grocery into `lowStockGroceries` if the return value is true. +* Execute `printLowStocks(lowStockGroceries)` in GroceryUi to print out the list. + +  +### 10. Input expiration date of each grocery when added * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items.   -### 8. Editing expiration date after it is added +### 11. Editing expiration date after it is added * In GroceryList class, modified the editExpiration method to parse String into localdate. * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameters: 1. details: String — User input read from `Scanner`. diff --git a/docs/diagrams/editCost.png b/docs/diagrams/editCost.png new file mode 100644 index 0000000000000000000000000000000000000000..82036bac8a42dcd56e43681fd8013dbde522b9a9 GIT binary patch literal 29975 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 gl : editCost(details) +gl -> gl:checkDetails(details, "cost", "$") +activate gl +return costParts + +gl -> gl: getGrocery(costParts[0].strip()) +activate gl +return Grocery + +gl -> g : setCost(cost) +note right +Ensures the input cost is valid +end note + +gl->ui:printCostSet(grocery) + +gl -> gl : getGroceries() +activate gl +return groceries + +gl -> s :saveGroceryFile(groceries) + + + + +@enduml \ No newline at end of file diff --git a/docs/diagrams/editThreshold.png b/docs/diagrams/editThreshold.png new file mode 100644 index 0000000000000000000000000000000000000000..359f0fd7432b132205b89d64bf6687bbb6e61439 GIT binary patch literal 34804 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/editThreshold.puml b/docs/diagrams/editThreshold.puml new file mode 100644 index 0000000000..b336d4d9ed --- /dev/null +++ b/docs/diagrams/editThreshold.puml @@ -0,0 +1,41 @@ +@startuml + +participant "groceryList:GroceryList" as gl +participant "grocery:Grocery" as g +participant "groceryUi:GroceryUi" as ui +participant "storage:Storage" as s + +activate gl +activate g +activate ui +activate s +-> gl : editThreshold(details) +gl -> gl:checkDetails(details, "th", "a/") +activate gl +return amtParts + +gl -> gl: getGrocery(costParts[0].strip()) +activate gl +return Grocery + +gl -> gl: checkAmount(thresholdString) +activate gl +return threshold + +gl -> g : setThreshold(threshold) +note right +Ensures the input threshold is valid +end note + +gl->ui:printThresholdSet(grocery + +gl -> gl : getGroceries() +activate gl +return groceries + +gl -> s :saveGroceryFile(groceries) + + + + +@enduml \ No newline at end of file diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 1d80b61102..56ef2997ef 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -495,10 +495,10 @@ public void sortByCost() { if (size == 0) { GroceryUi.printNoGrocery(); } else { - List groceriesByDate = groceries; - groceriesByDate.sort((g1, g2) -> Double.compare(g1.getCost(), g2.getCost())); - Collections.reverse(groceriesByDate); - GroceryUi.printGroceryList(groceriesByDate); + List groceriesByCost = groceries; + groceriesByCost.sort((g1, g2) -> Double.compare(g1.getCost(), g2.getCost())); + Collections.reverse(groceriesByCost); + GroceryUi.printGroceryList(groceriesByCost); } } /** From 64f6c5f3764446d60804355f7fc4d8e8802eb8f4 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sat, 13 Apr 2024 22:20:59 +0800 Subject: [PATCH 276/339] Edit error --- docs/DeveloperGuide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 404a3801a2..df3e84e869 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -98,7 +98,8 @@ To edit the information of an existing grocery. * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. * Else, create a new array list name `groceriesByCost` with type `Grocery`. * Assign all the values in current grocery list `groceries` to `groceriesByCost`. - * Execute `sort` in `groceriesByCost` with a lamba function that compares the `getCost()` value of each Grocery in the list. + * Execute `sort` in `groceriesByCost` with a lambba function that compares the `getCost()` value of each Grocery in the list. + * Then execute `Collections.reverse(groceriesByCost)` to reverse the list so that the cost is sorted in descending order. * Lastly, execute `printGroceryList(groceriesByCost)` in GroceryUi.   ### 3. Input category for each grocery added From 322a1186662dbce281f89388cf8a327e2a49f04d Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 23:14:02 +0800 Subject: [PATCH 277/339] Load storage locations --- docs/UserGuide.md | 2 + src/main/java/git/GroceryUi.java | 1 + src/main/java/git/Parser.java | 3 ++ src/main/java/git/Storage.java | 34 ++++++++++++- src/main/java/grocery/GroceryList.java | 2 +- .../java/grocery/location/LocationList.java | 3 +- .../grocery/location/LocationListTest.java | 51 +++++++++++++++++++ 7 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 src/test/java/grocery/location/LocationListTest.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1580fd5a10..c42a3c835e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -160,6 +160,8 @@ Adds multiple groceries and any desired additional details. Format: `addmulti` +* The grocery name cannot be empty. +* Duplicate groceries will not be added. * After executing `addmulti`, GiT will prompt for various details. 1. Number of groceries to add 2. Additional details to include diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 0b87d1c8b1..bb262db8b6 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -250,6 +250,7 @@ public Location promptForLocation() { } catch (NoSuchObjectException e1) { try { LocationList.addLocation(name); + GroceryUi.printLocationAdded(name.strip()); location = LocationList.findLocation(name); } catch (GitException e2) { location = null; diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index af87cfd729..c019ab24e6 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -394,12 +394,14 @@ private void addOrDelGrocery(GroceryCommand command, String[] commandParts) thro Grocery grocery = new Grocery(commandParts[1]); groceryUi.promptAddMenu(grocery); groceryList.addGrocery(grocery); + GroceryUi.printGroceryAdded(grocery); break; case ADDMULTI: Grocery[] groceries = groceryUi.promptAddMultipleMenu(); for (Grocery g : groceries) { groceryList.addGrocery(g); + GroceryUi.printGroceryAdded(g); } break; @@ -468,6 +470,7 @@ private void handleLocationCommands(GroceryCommand command, String name) throws switch (command) { case LOC: LocationList.addLocation(name); + GroceryUi.printLocationAdded(name); break; case LISTLOC: diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index eec3a41674..fdda51f689 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -1,8 +1,10 @@ package git; import exceptions.GitException; +import exceptions.nosuch.NoSuchObjectException; import grocery.Grocery; import grocery.GroceryList; +import grocery.location.LocationList; import recipe.Recipe; import recipe.RecipeList; import user.UserInfo; @@ -31,6 +33,7 @@ public class Storage { private Recipe recipe; private RecipeList recipeList; private UserInfo userInfo; + /** * Saves the current list of groceries to the file. * @param groceries The list of groceries to save. @@ -51,6 +54,7 @@ public void saveGroceryFile(List groceries) { e.printStackTrace(); } } + /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. @@ -63,6 +67,12 @@ public GroceryList loadGroceryFile(){ while (scanner.hasNextLine()) { String line = scanner.nextLine(); Grocery grocery = parseGrocery(line); + + Location location = grocery.getLocation(); + if (location != null) { + location.addGrocery(grocery); + } + groceryList.addGrocery(grocery); } scanner.close(); @@ -86,9 +96,25 @@ private Grocery parseGrocery(String line) { LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); - Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); + + Location location = null; + String locString = parts[6].strip(); + if (!locString.equalsIgnoreCase("null")) { + try { + location = LocationList.findLocation(locString); + } catch (NoSuchObjectException e) { + try { + LocationList.addLocation(locString); + location = LocationList.findLocation(locString); + } catch (GitException ignore) { + assert !locString.isBlank() : "No empty strings at this point."; + } + } + } + return new Grocery(name, amount, threshold, expiration, category, cost, location); } + /** * Saves the current list of recipes to the file. * @param recipeArr The list of recipes to save. @@ -109,6 +135,7 @@ public void saveRecipeFile(ArrayList recipeArr) { e.printStackTrace(); } } + /** * Loads recipes from the file. * @return recipeList loaded from the file. If file does not exist, returns an empty recipeList. @@ -129,6 +156,7 @@ public RecipeList loadRecipeFile(){ } return recipeList; } + /** * Parses a string from the file into a Recipe object. * @@ -144,6 +172,7 @@ private Recipe parseRecipe(String line) { ArrayList stepsList = new ArrayList<>(Arrays.asList(stepsArray)); return new Recipe(title, ingredientsList, stepsList); } + /** * Saves the current user profile to the file. * @param userInfo The user profile to save. @@ -162,6 +191,7 @@ public void saveProfileFile(UserInfo userInfo) { e.printStackTrace(); } } + /** * Loads the user profile from the file. * @return userInfo loaded from the file. If file does not exist, returns an empty userInfo. @@ -183,6 +213,7 @@ public UserInfo loadProfileFile(){ } return userInfo; } + /** * Parses a string from the file into a userInfo object. * @@ -220,6 +251,7 @@ private void parseProfile(String line, UserInfo userInfo) throws GitException { break; } } + /** * Checks if the user's profile file exists. * diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index d36f46e47d..fccf2ad3e0 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -53,7 +53,6 @@ public void addGrocery(Grocery grocery) { try { groceries.add(grocery); - GroceryUi.printGroceryAdded(grocery); storage.saveGroceryFile(getGroceries()); assert groceries.contains(grocery) : "Grocery should be added to the list"; } catch (NullPointerException e) { @@ -329,6 +328,7 @@ public void editLocation(String details) throws GitException { location = LocationList.findLocation(name); } catch (NoSuchObjectException e) { LocationList.addLocation(name); + GroceryUi.printLocationAdded(name.strip()); location = LocationList.findLocation(name); } diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java index ecec2e0e3e..c7f1b6e810 100644 --- a/src/main/java/grocery/location/LocationList.java +++ b/src/main/java/grocery/location/LocationList.java @@ -1,6 +1,7 @@ package grocery.location; import exceptions.DuplicateException; +import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import git.GroceryUi; @@ -31,7 +32,7 @@ public static void addLocation(String name) throws EmptyInputException, Duplicat Location location = new Location(name.strip()); locations.add(location); - GroceryUi.printLocationAdded(name.strip()); +// GroceryUi.printLocationAdded(name.strip()); } } diff --git a/src/test/java/grocery/location/LocationListTest.java b/src/test/java/grocery/location/LocationListTest.java new file mode 100644 index 0000000000..5e61389c2b --- /dev/null +++ b/src/test/java/grocery/location/LocationListTest.java @@ -0,0 +1,51 @@ +package grocery.location; + +import exceptions.DuplicateException; +import exceptions.GitException; +import exceptions.emptyinput.EmptyInputException; +import exceptions.nosuch.NoSuchObjectException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class LocationListTest { + @Test + public void addLocation_findLocation_success() { + try { + LocationList.addLocation("freezer"); + LocationList.findLocation("freezer"); + } catch (GitException e) { + fail("findLocation should be successful."); + } + } + + @Test + public void addLocation_emptyInput_exceptionThrown() { + assertThrows(EmptyInputException.class, () -> LocationList.addLocation("")); + } + + @Test + public void addLocation_duplicate_exceptionThrown() { + assertThrows(DuplicateException.class, () -> LocationList.addLocation("FREEZER")); + } + + @Test + public void findLocation_noSuchLocation_exceptionThrown() { + assertThrows(NoSuchObjectException.class, () -> LocationList.findLocation("cabinet")); + } + + @Test + public void removeLocation_success() { + try { + LocationList.addLocation("freezer"); + LocationList.removeLocation("freezer"); + } catch (GitException e) { + fail("removeLocation should be successful."); + } + } + + @Test + public void removeLocation_noSuchLocation_exceptionThrown() { + assertThrows(NoSuchObjectException.class, () -> LocationList.removeLocation("cubby")); + } +} From ac56caf7e35f0709628a616592e2521260acc202 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 23:17:17 +0800 Subject: [PATCH 278/339] Fix checkstyle issues --- src/main/java/grocery/location/LocationList.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/grocery/location/LocationList.java b/src/main/java/grocery/location/LocationList.java index c7f1b6e810..89d6d9e77d 100644 --- a/src/main/java/grocery/location/LocationList.java +++ b/src/main/java/grocery/location/LocationList.java @@ -1,7 +1,6 @@ package grocery.location; import exceptions.DuplicateException; -import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import git.GroceryUi; @@ -32,7 +31,6 @@ public static void addLocation(String name) throws EmptyInputException, Duplicat Location location = new Location(name.strip()); locations.add(location); -// GroceryUi.printLocationAdded(name.strip()); } } From b1a7a4f578bd1a71cc745a377caf681c0fedb311 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sat, 13 Apr 2024 23:19:34 +0800 Subject: [PATCH 279/339] Fix checkstyle issues --- src/test/java/grocery/location/LocationListTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/grocery/location/LocationListTest.java b/src/test/java/grocery/location/LocationListTest.java index 5e61389c2b..78bafad30c 100644 --- a/src/test/java/grocery/location/LocationListTest.java +++ b/src/test/java/grocery/location/LocationListTest.java @@ -6,7 +6,8 @@ import exceptions.nosuch.NoSuchObjectException; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; public class LocationListTest { @Test From 1a5cd0c62afb8f5710172af0aa70f6e04224e802 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sun, 14 Apr 2024 00:11:20 +0800 Subject: [PATCH 280/339] Wipes saved file if corrupted --- src/main/java/git/Git.java | 4 +- src/main/java/git/Storage.java | 107 ++++++++++++++++++++++++------- src/main/java/user/UserInfo.java | 2 +- 3 files changed, 87 insertions(+), 26 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 819f7bae6b..13e180a7b4 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -13,6 +13,7 @@ public class Git { private boolean isRunning; private Parser parser; private Storage storage; + private UserInfo userInfo; // METHODS /** * Constructs Git. @@ -23,6 +24,7 @@ public Git() { parser = new Parser(ui); isRunning = true; storage = new Storage(); + userInfo = storage.loadProfileFile(); } /** @@ -30,7 +32,7 @@ public Git() { */ private void run() { String username; - if (storage.isProfileSaved()){ + if (storage.isProfileSaved() && userInfo.getName() != null){ username = ui.printWelcomeToExistingUser(); } else { username = ui.printWelcome(); diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 5ed560a931..96082cbc6e 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -2,6 +2,7 @@ import exceptions.GitException; import exceptions.emptyinput.EmptyInputException; +import exceptions.nosuch.NoSuchObjectException; import grocery.Grocery; import grocery.GroceryList; import grocery.location.LocationList; @@ -30,7 +31,8 @@ public class Storage { private Grocery grocery; private List groceries; private GroceryList groceryList; - private LocationList locationList; +// private LocationList locationList; +// private Location location; private Recipe recipe; private RecipeList recipeList; private UserInfo userInfo; @@ -57,6 +59,8 @@ public void saveGroceryFile(List groceries) { /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. + * If file is corrupted, wipe file. + * */ public GroceryList loadGroceryFile(){ GroceryList groceryList = new GroceryList(); @@ -65,15 +69,23 @@ public GroceryList loadGroceryFile(){ Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String line = scanner.nextLine(); - Grocery grocery = parseGrocery(line); - groceryList.addGrocery(grocery); + try { + Grocery grocery = parseGrocery(line); + if (grocery != null) { + groceryList.addGrocery(grocery); + } else { + wipeFile(file); + return new GroceryList(); + } + } catch (Exception e) { + wipeFile(file); + return new GroceryList(); + } } scanner.close(); } catch (FileNotFoundException e) { //System.out.println("No saved groceries found.\n "); - } catch (EmptyInputException e) { - throw new RuntimeException(e); } return groceryList; } @@ -81,18 +93,38 @@ public GroceryList loadGroceryFile(){ * Parses a string from the file into a grocery object. * @param line The string to parse. * @return The parsed grocery object. + * Returns null if file is corrupted. */ private Grocery parseGrocery(String line) throws EmptyInputException { String[] parts = line.split(" \\| "); - String name = parts[0].trim(); - int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); - int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); - String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); - double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); - Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); - return new Grocery(name, amount, threshold, expiration, category, cost, location); + if (parts.length != 7) { + return null; + } else { + String name = parts[0].trim(); + int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); + int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); + String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); + double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); + Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); + return new Grocery(name, amount, threshold, expiration, category, cost, location); + } + } + /** + * Wipes the contents of the specified file. + * + * @param file The file to wipe. + */ + private void wipeFile(File file) { + try { + FileWriter writer = new FileWriter(file); + writer.write(""); + writer.close(); + } catch (IOException e) { + System.out.println("An error occurred while wiping the file: " + file.getName()); + e.printStackTrace(); + } } /** * Saves the current list of recipes to the file. @@ -125,8 +157,18 @@ public RecipeList loadRecipeFile(){ Scanner scanner = new Scanner(file); while (scanner.hasNextLine()) { String line = scanner.nextLine(); - Recipe recipe = parseRecipe(line); - recipeList.addRecipe(recipe); + try { + Recipe recipe = parseRecipe(line); + if (recipe != null) { + recipeList.addRecipe(recipe); + } else { + wipeFile(file); + return new RecipeList(); + } + } catch (Exception e) { + wipeFile(file); + return new RecipeList(); + } } scanner.close(); } @@ -143,12 +185,16 @@ public RecipeList loadRecipeFile(){ */ private Recipe parseRecipe(String line) { String[] parts = line.split(" \\| "); - String title = parts[0].trim(); - String[] ingredientsArray = parts[1].equalsIgnoreCase("null") ? null : parts[1].split(", "); - ArrayList ingredientsList = new ArrayList<>(Arrays.asList(ingredientsArray)); - String[] stepsArray = parts[2].equalsIgnoreCase("null") ? null : parts[2].split(". "); - ArrayList stepsList = new ArrayList<>(Arrays.asList(stepsArray)); - return new Recipe(title, ingredientsList, stepsList); + if (parts.length != 3) { + return null; + } else { + String title = parts[0].trim(); + String[] ingredientsArray = parts[1].equalsIgnoreCase("null") ? null : parts[1].split(", "); + ArrayList ingredientsList = new ArrayList<>(Arrays.asList(ingredientsArray)); + String[] stepsArray = parts[2].equalsIgnoreCase("null") ? null : parts[2].split(". "); + ArrayList stepsList = new ArrayList<>(Arrays.asList(stepsArray)); + return new Recipe(title, ingredientsList, stepsList); + } } /** * Saves the current user profile to the file. @@ -177,11 +223,20 @@ public UserInfo loadProfileFile(){ try { File file = new File("./data/userProfile.txt"); Scanner scanner = new Scanner(file); + int lineCount = 0; while (scanner.hasNextLine()) { String line = scanner.nextLine(); - parseProfile(line, userInfo); + lineCount ++; + if (!parseProfile(line, userInfo)) { //if corrupted + wipeFile(file); + return new UserInfo(); + } } scanner.close(); + if (lineCount != 8){ + wipeFile(file); + return new UserInfo(); + } } catch (FileNotFoundException e) { //System.out.println("No saved recipes found.\n "); @@ -196,8 +251,11 @@ public UserInfo loadProfileFile(){ * @param line The string to parse. * @param userInfo The UserInfo object to store the parsed information. */ - private void parseProfile(String line, UserInfo userInfo) throws GitException { + private boolean parseProfile(String line, UserInfo userInfo) throws GitException { String[] parts = line.split(": "); + if (parts.length != 2) { + return false; // Line is corrupted + } switch (parts[0]) { case "Name": userInfo.setName(parts[1]); @@ -225,6 +283,7 @@ private void parseProfile(String line, UserInfo userInfo) throws GitException { default: break; } + return true; } /** * Checks if the user's profile file exists. diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index de13dd7a45..92973739af 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -233,7 +233,7 @@ public String toProfileSaveFormat(){ public void setCaloriesCapFromLoad(int caloriesCap){ this.caloriesCap = caloriesCap; } - public String getName (){ + public String getName(){ return this.name; } } From 919df8421b91b5f60aa6ba96384c5633ed109332 Mon Sep 17 00:00:00 2001 From: luozihui2003 Date: Sun, 14 Apr 2024 00:32:12 +0800 Subject: [PATCH 281/339] Resolve merge conflict between location edits and corrupt file --- src/main/java/git/Storage.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 96082cbc6e..cb0bdb3d40 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -71,7 +71,11 @@ public GroceryList loadGroceryFile(){ String line = scanner.nextLine(); try { Grocery grocery = parseGrocery(line); - if (grocery != null) { + Location location = grocery.getLocation(); + if (grocery != null) { //if not corrupted + if (location != null){ + location.addGrocery(grocery); + } groceryList.addGrocery(grocery); } else { wipeFile(file); @@ -107,7 +111,20 @@ private Grocery parseGrocery(String line) throws EmptyInputException { LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); - Location location = parts[6].equalsIgnoreCase("null") ? null : new Location(parts[6].trim()); + Location location = null; + String locString = parts[6].strip(); + if (!locString.equalsIgnoreCase("null")) { + try { + location = LocationList.findLocation(locString); + } catch (NoSuchObjectException e) { + try { + LocationList.addLocation(locString); + location = LocationList.findLocation(locString); + } catch (GitException ignore) { + assert !locString.isBlank() : "No empty strings at this point."; + } + } + } return new Grocery(name, amount, threshold, expiration, category, cost, location); } } From 87b21ad48ed37b7163715456839e08376d0bae86 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 00:48:06 +0800 Subject: [PATCH 282/339] Add more testing --- src/main/java/git/Git.java | 3 +- src/main/java/git/GroceryUi.java | 11 ++- src/main/java/git/Parser.java | 8 +- src/main/java/grocery/GroceryList.java | 2 +- src/test/java/grocery/GroceryListTest.java | 89 +++++++++++++++++-- src/test/java/grocery/GroceryTest.java | 1 - .../grocery/location/LocationListTest.java | 10 +-- 7 files changed, 99 insertions(+), 25 deletions(-) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index 4f24c04367..c08da53836 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -6,13 +6,12 @@ * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! */ public class Git { - // ATTRIBUTES private Ui ui; private GroceryUi groceryUi; private boolean isRunning; private Parser parser; private Storage storage; - // METHODS + /** * Constructs Git. */ diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index bb262db8b6..5431cc9e15 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -77,12 +77,12 @@ public void promptAddMenu(Grocery grocery) { /** * Prompts user for multiple grocery names. * - * @return the list of the groceries. - * @throws DuplicateException + * @return the array of the groceries. + * @throws DuplicateException Thrown when the grocery to add already exists. */ public Grocery[] promptAddMultipleMenu() throws DuplicateException { System.out.println("\nHow many groceries would you like to add?"); - int num = 0; + int num; while (true) { try { num = Integer.parseInt(in.nextLine().trim()); @@ -98,8 +98,7 @@ public Grocery[] promptAddMultipleMenu() throws DuplicateException { Grocery[] groceries = new Grocery[num]; Storage storage = new Storage(); - GroceryList groceryList = new GroceryList(); - groceryList = storage.loadGroceryFile(); + GroceryList groceryList = storage.loadGroceryFile(); HashSet existingGroceryNames = new HashSet<>(); for (int i = 0; i < num; i++) { @@ -488,7 +487,7 @@ public void processAddMenu (Grocery grocery, String addNums) { case '5': System.out.println("Including Cost"); - Double cost = singleGroceryUi.promptForCost(); + double cost = singleGroceryUi.promptForCost(); grocery.setCost(cost); break; diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index c019ab24e6..689477204d 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -88,7 +88,7 @@ public void executeCommand(String[] commandParts, String selectedMode) throws Gi this.currentMode = selectedMode; Mode mode; try { - mode = Mode.valueOf(currentMode.toUpperCase());; + mode = Mode.valueOf(currentMode.toUpperCase()); } catch (Exception e) { throw new InvalidCommandException(); } @@ -252,7 +252,7 @@ public void profileManagement(String[] commandParts) throws GitException { * @param commandParts Fragments of the command entered by the user. * @throws GitException Exception thrown depending on specific error. */ - public void recipeManagement(String[] commandParts) throws GitException, EmptyInputException { + public void recipeManagement(String[] commandParts) throws GitException { RecipeCommand command; try { command = RecipeCommand.valueOf(commandParts[0].toUpperCase()); @@ -271,10 +271,10 @@ public void recipeManagement(String[] commandParts) throws GitException, EmptyIn } String ingredients = recipeUi.promptForIngredients(); String[] ingredientsList = ingredients.split("[,]"); - ArrayList ingredientsArr = new ArrayList(Arrays.asList(ingredientsList)); + ArrayList ingredientsArr = new ArrayList<>(Arrays.asList(ingredientsList)); String steps = recipeUi.promptForSteps(); String[] stepsList = steps.split("[.]"); - ArrayList stepsArr = new ArrayList(Arrays.asList(stepsList)); + ArrayList stepsArr = new ArrayList<>(Arrays.asList(stepsList)); recipeList.addRecipe(new Recipe(title, ingredientsArr, stepsArr)); break; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index fccf2ad3e0..daac55e6d8 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -87,7 +87,7 @@ public boolean isGroceryExists(String name) { * @return The needed grocery. * @throws NoSuchObjectException If the selected grocery does not exist. */ - Grocery getGrocery(String name) throws NoSuchObjectException { + public Grocery getGrocery(String name) throws NoSuchObjectException { int index = -1; for (Grocery grocery : groceries) { if(grocery.getName().equalsIgnoreCase(name)) { diff --git a/src/test/java/grocery/GroceryListTest.java b/src/test/java/grocery/GroceryListTest.java index 2b67ffbcc6..969ba33693 100644 --- a/src/test/java/grocery/GroceryListTest.java +++ b/src/test/java/grocery/GroceryListTest.java @@ -1,11 +1,15 @@ package grocery; +import exceptions.SameLocationException; import exceptions.commands.CommandWrongFormatException; import exceptions.CannotUseException; import exceptions.GitException; +import exceptions.emptyinput.EmptyInputException; +import exceptions.invalidinput.InvalidAmountException; import exceptions.nosuch.NoSuchObjectException; import grocery.location.Location; +import grocery.location.LocationList; import org.junit.jupiter.api.Test; import java.time.LocalDate; @@ -52,8 +56,6 @@ public void isGroceryExists_false() { assertFalse(gl.isGroceryExists("Bananas"), "Grocery should not exist in the list."); } - - @Test public void editExpiration_success() { GroceryList gl = new GroceryList(); @@ -80,7 +82,6 @@ public void listGroceries_containsItems() { assertFalse(gl.getGroceries().isEmpty(), "Grocery list should contain items."); } - @Test public void editExpiration_noSuchGrocery_exceptionThrown() { try { @@ -130,11 +131,36 @@ public void removeGrocery_groceryDelete_exceptionThrown() { } } + @Test + public void editAmount_success() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, new Location("Freezer"))); + gl.editAmount("Meat a/5", false); + assertEquals(gl.getGrocery("Meat").getAmount(), 5); + } catch (GitException e) { + fail("Test should not fail."); + } + } + + @Test + public void editAmount_noSuchGrocery_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.editAmount("Meat", false); + } catch (NoSuchObjectException e) { + String expectedMessage = "The grocery (Meat) does not exist!"; + assertEquals(expectedMessage.trim(), e.getMessage().trim()); + } catch (GitException e) { + fail("Expected a NoSuchObjectException, but another GitException was thrown"); + } + } + @Test public void editAmount_wrongFormat_exceptionThrown() { try { GroceryList gl = new GroceryList(); - gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0,new Location("Freezer"))); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, new Location("Freezer"))); gl.editAmount("Meat", false); fail("Expected a WrongFormatException to be thrown"); } catch (CommandWrongFormatException e) { @@ -147,11 +173,25 @@ public void editAmount_wrongFormat_exceptionThrown() { } } + @Test + public void editAmount_negativeInteger_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, new Location("Freezer"))); + gl.editAmount("Meat a/-5", false); + } catch (InvalidAmountException e) { + String expectedMessage = "Please input a valid integer that is greater than 0!"; + assertEquals(expectedMessage.trim(), e.getMessage().trim()); + } catch (GitException e) { + fail("Expected a InvalidAmountException, but another GitException was thrown"); + } + } + @Test public void editAmountUseTrue_amountReaches0_success() { - GroceryList gl = new GroceryList(); try { - gl.addGrocery(new Grocery("Meat", 5, 0, LocalDate.now(), "Meat", 0,new Location("Freezer"))); + GroceryList gl = new GroceryList(); + gl.addGrocery(new Grocery("Meat", 5, 0, LocalDate.now(), "Meat", 0, new Location("Freezer"))); gl.editAmount("Meat a/5", true); } catch (GitException e) { fail("editAmount_useTrue should not throw an exception"); @@ -174,6 +214,37 @@ public void editAmountUseTrue_noAmountCannotUse_exceptionThrown() { } } + @Test + public void editLocation_noSuchLocation_success() { + try { + GroceryList gl = new GroceryList(); + LocationList.addLocation("Cold part"); + Location location = LocationList.findLocation("Cold part"); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, location)); + gl.editLocation("Meat l/bottom freezer"); + String finalLocation = gl.getGrocery("Meat").getLocation().getName(); + assertEquals(finalLocation, "bottom freezer"); + } catch (GitException ignore) { + fail("Location should be automatically created, so no exception thrown."); + } + } + + @Test + public void editLocation_sameLocation_exceptionThrown() { + try { + GroceryList gl = new GroceryList(); + LocationList.addLocation("Freezer"); + Location location = LocationList.findLocation("Freezer"); + gl.addGrocery(new Grocery("Meat", 0, 0, LocalDate.now(), "Meat", 0, location)); + gl.editLocation("Meat l/freezer"); + } catch (SameLocationException e) { + String expectedMessage = "Meat is already stored in Freezer."; + assertEquals(expectedMessage, e.getMessage()); + } catch (GitException ignore) { + fail("Should throw SameLocationException."); + } + } + @Test public void testSortByExpiration() { // Create a grocery list instance @@ -200,6 +271,12 @@ public void testSortByExpiration() { assertEquals(grocery3, sortedGroceries.get(2), "Eggs should be last as it has no expiration date."); } + @Test + public void findGroceries_emptyInput_exceptionThrown() { + GroceryList gl = new GroceryList(); + assertThrows(EmptyInputException.class, () -> gl.findGroceries("")); + } + @Test public void removeGrocery_success() throws GitException { GroceryList gl = new GroceryList(); diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index 35b2290364..ec345dd445 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -92,5 +92,4 @@ public void printGrocery_correctAmtAndExpAndCost() { + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } - } diff --git a/src/test/java/grocery/location/LocationListTest.java b/src/test/java/grocery/location/LocationListTest.java index 78bafad30c..29e1bf9d2b 100644 --- a/src/test/java/grocery/location/LocationListTest.java +++ b/src/test/java/grocery/location/LocationListTest.java @@ -13,8 +13,8 @@ public class LocationListTest { @Test public void addLocation_findLocation_success() { try { - LocationList.addLocation("freezer"); - LocationList.findLocation("freezer"); + LocationList.addLocation("back of freezer"); + LocationList.findLocation("back of freezer"); } catch (GitException e) { fail("findLocation should be successful."); } @@ -27,7 +27,7 @@ public void addLocation_emptyInput_exceptionThrown() { @Test public void addLocation_duplicate_exceptionThrown() { - assertThrows(DuplicateException.class, () -> LocationList.addLocation("FREEZER")); + assertThrows(DuplicateException.class, () -> LocationList.addLocation("BACK of freezer")); } @Test @@ -38,8 +38,8 @@ public void findLocation_noSuchLocation_exceptionThrown() { @Test public void removeLocation_success() { try { - LocationList.addLocation("freezer"); - LocationList.removeLocation("freezer"); + LocationList.addLocation("front of freezer"); + LocationList.removeLocation("front of freezer"); } catch (GitException e) { fail("removeLocation should be successful."); } From a8f99b7e2f2c894bb57c701e271dd13baa1db307 Mon Sep 17 00:00:00 2001 From: luozihui2003 <110605459+luozihui2003@users.noreply.github.com> Date: Sun, 14 Apr 2024 00:52:45 +0800 Subject: [PATCH 283/339] Import user.UserInfo in Git.java --- src/main/java/git/Git.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/git/Git.java b/src/main/java/git/Git.java index d7b176ef76..a17c74e3a3 100644 --- a/src/main/java/git/Git.java +++ b/src/main/java/git/Git.java @@ -1,6 +1,7 @@ package git; import exceptions.GitException; +import user.UserInfo; /** * Represents the Grocery in Time (GiT) program, allowing users to store and track their groceries! From 34ae7b51d067c42854ce075d428068d1eec19ee3 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 01:01:17 +0800 Subject: [PATCH 284/339] FIx User Guide formatting --- docs/DeveloperGuide.md | 2 +- docs/UserGuide.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8bbfaf3109..0f7f90c83c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -153,7 +153,7 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as   ### 8. Editing expiration date after it is added * In GroceryList class, modified the editExpiration method to parse String into localdate. - * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameters: + * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameter: 1. details: String — User input read from `Scanner`. * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index c42a3c835e..76f2aee324 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -61,7 +61,7 @@ It allows users to track and manage their groceries around their home easily. 3. Open a command terminal, `cd` into the folder where the JAR file is and use `java -jar Git.jar` to run Grocery in Time. - +  # Features > #### Notes about the command format @@ -70,6 +70,7 @@ It allows users to track and manage their groceries around their home easily. > * Words in `UPPERCASE` are parameters to be supplied by the user. >
e.g. In `find KEYWORD`, `KEYWORD` is a parameter to be supplied: `find cheese`. +  ## Switching between different modes: `switch` Switches between profile, calories, grocery or recipe mode. GiT comes in different modes and will prompt the user to choose their desired mode. @@ -715,6 +716,7 @@ Please enter the title of the recipe: Fried Egg is removed from the recipe list. ``` +  ## Exiting the program: `exit` Exits GiT, regardless of which mode you are in. From 47ee28dfc1b23ca3caf825cb8802725cdff360a6 Mon Sep 17 00:00:00 2001 From: luozihui2003 <110605459+luozihui2003@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:06:19 +0800 Subject: [PATCH 285/339] gradle: stylecheck storage.java --- src/main/java/git/Storage.java | 59 ++++++++++++++++------------------ 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index cb0bdb3d40..4d3861852c 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -31,8 +31,6 @@ public class Storage { private Grocery grocery; private List groceries; private GroceryList groceryList; -// private LocationList locationList; -// private Location location; private Recipe recipe; private RecipeList recipeList; private UserInfo userInfo; @@ -59,7 +57,7 @@ public void saveGroceryFile(List groceries) { /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. - * If file is corrupted, wipe file. + * If file is corrupted, wipe file. * */ public GroceryList loadGroceryFile(){ @@ -96,8 +94,7 @@ public GroceryList loadGroceryFile(){ /** * Parses a string from the file into a grocery object. * @param line The string to parse. - * @return The parsed grocery object. - * Returns null if file is corrupted. + * @return The parsed grocery object. Returns null if file is corrupted. */ private Grocery parseGrocery(String line) throws EmptyInputException { String[] parts = line.split(" \\| "); @@ -108,7 +105,7 @@ private Grocery parseGrocery(String line) throws EmptyInputException { int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - LocalDate expiration = parts[3].equalsIgnoreCase("null") ? null : LocalDate.parse(parts[3].trim(), formatter); + LocalDate expiration = parts[3].equals("null") ? null : LocalDate.parse(parts[3].trim(), formatter); String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); Location location = null; @@ -274,31 +271,31 @@ private boolean parseProfile(String line, UserInfo userInfo) throws GitException return false; // Line is corrupted } switch (parts[0]) { - case "Name": - userInfo.setName(parts[1]); - break; - case "Height": - userInfo.setHeight(Double.parseDouble(parts[1])); - break; - case "Weight": - userInfo.setWeight(Double.parseDouble(parts[1])); - break; - case "Age": - userInfo.setAge(Integer.parseInt(parts[1])); - break; - case "Gender": - userInfo.setGender(parts[1]); - break; - case "Aim": - userInfo.setAim(parts[1]); - break; - case "Activeness": - userInfo.setActiveness(parts[1]); - break; - case "Calories": - userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); - default: - break; + case "Name": + userInfo.setName(parts[1]); + break; + case "Height": + userInfo.setHeight(Double.parseDouble(parts[1])); + break; + case "Weight": + userInfo.setWeight(Double.parseDouble(parts[1])); + break; + case "Age": + userInfo.setAge(Integer.parseInt(parts[1])); + break; + case "Gender": + userInfo.setGender(parts[1]); + break; + case "Aim": + userInfo.setAim(parts[1]); + break; + case "Activeness": + userInfo.setActiveness(parts[1]); + break; + case "Calories": + userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); + default: + break; } return true; } From 241a869478d5be7eacadc65bd245edff07761114 Mon Sep 17 00:00:00 2001 From: luozihui2003 <110605459+luozihui2003@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:09:31 +0800 Subject: [PATCH 286/339] gradle: stylecheck storage again... --- src/main/java/git/Storage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 4d3861852c..1837619075 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -294,6 +294,7 @@ private boolean parseProfile(String line, UserInfo userInfo) throws GitException break; case "Calories": userInfo.setCaloriesCapFromLoad(Integer.parseInt(parts[1])); + break; default: break; } From e2b9a2eeb2af0d764631f445a3e1c9d6c15dc301 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 10:49:44 +0800 Subject: [PATCH 287/339] Fix error in calculation of calories --- src/main/java/food/Food.java | 1 + src/main/java/food/FoodList.java | 11 +++++------ src/main/java/git/CaloriesUi.java | 6 +++++- src/main/java/git/Parser.java | 5 ++++- src/main/java/user/UserInfo.java | 24 +++++++++++++++--------- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/main/java/food/Food.java b/src/main/java/food/Food.java index 4088c422f9..80ba5b74fb 100644 --- a/src/main/java/food/Food.java +++ b/src/main/java/food/Food.java @@ -28,6 +28,7 @@ public double getCalories() { * @return A string containing the food's name and calories. */ public String print() { + assert !(this.name.isEmpty()) : "Name should not be empty. Food constructed wrongly."; return this.name + ", with " + this.calories + " calories"; } } diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index 40a3987d9c..caacba0c5a 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -15,17 +15,16 @@ public FoodList() { foods = new ArrayList<>(); } + public List getFoods() { + return foods; + } + /** * Adds a new food into the list of food. * * @param food New consumed food. - * @throws EmptyInputException When food name entered is empty. */ - public void addFood(Food food) throws EmptyInputException { - if (food.getName() == null) { - throw new EmptyInputException("food"); - } - + public void addFood(Food food) { try { foods.add(food); GroceryUi.printFoodAdded(food); diff --git a/src/main/java/git/CaloriesUi.java b/src/main/java/git/CaloriesUi.java index d1d4c9e55b..e767d2730a 100644 --- a/src/main/java/git/CaloriesUi.java +++ b/src/main/java/git/CaloriesUi.java @@ -34,10 +34,14 @@ public double promptForCalories() { } else { calories = 0; System.out.println("Calories entered is invalid!"); - System.out.println("Please enter the calories of the food in kcal:"); } } catch (NumberFormatException nfe) { System.out.println("Calories entered is invalid!"); + } + if(i == 4) { + System.out.println("Failed to enter valid calories, " + + "food will not be stored"); + } else { System.out.println("Please enter the calories of the food in kcal:"); } } diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 689477204d..78bac26504 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -153,9 +153,12 @@ public void caloriesManagement(String[] commandParts) throws GitException { throw new EmptyInputException("valid food name"); } double calories = caloriesUi.promptForCalories(); + if (calories == 0) { + throw new EmptyInputException("valid calories value"); + } Food food = new Food(name, calories); foodList.addFood(food); - userInfo.consumptionOfCalories(food); + userInfo.consumptionOfCalories(foodList.getFoods()); break; case VIEW: diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index de13dd7a45..82c5778499 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -4,8 +4,11 @@ import exceptions.FailToCalculateCalories; import exceptions.InsufficientInfoException; import food.Food; +import food.FoodList; import git.Storage; +import java.util.List; + public class UserInfo { private String name; private double weight; @@ -93,9 +96,9 @@ public void updateInfo(String name, double weight, double height, int age, setWeight(weight); setHeight(height); setAge(age); - setGender(gender); - setAim(aim); - setActiveness(activeness); + setGender(gender.toLowerCase()); + setAim(aim.toLowerCase()); + setActiveness(activeness.toLowerCase()); try { calBMR(); calAMR(); @@ -118,10 +121,10 @@ private void calBMR() throws InsufficientInfoException { throw new InsufficientInfoException(); } double result; - if(gender.equals("F")) { - result = 655 + (9.56 * this.weight) + (1.85 * this.height) - (4.68 * this.height); + if(gender.equalsIgnoreCase("F")) { + result = 655 + (9.56 * this.weight) + (1.85 * this.height) - (4.68 * this.age); } else { - result = 66.47 + (13.75 * this.weight) + (5 * this.height) - (6.76 * this.height); + result = 66.47 + (13.75 * this.weight) + (5 * this.height) - (6.76 * this.age); } this.BMR = result; } @@ -178,11 +181,14 @@ public void setCaloriesCap() throws GitException { * Calculates the total calories consumed. * Only check if it has exceeded the target calories if sufficient information was given. * - * @param food Consumed food. + * @param foods The list of consumed food. * @throws GitException When insufficient information about the user was given. */ - public void consumptionOfCalories(Food food) throws GitException{ - this.currentCalories = (int)(food.getCalories() + this.currentCalories); + public void consumptionOfCalories(List foods) throws GitException{ + this.currentCalories = 0; + for (Food food : foods) { + this.currentCalories = (int)(food.getCalories() + this.currentCalories); + } if (this.weight == 0 || this.height == 0 || this.age == 0 || this.gender.isEmpty() || this.aim.isEmpty() || this.activeness.isEmpty()) { throw new InsufficientInfoException(); From 20afddee298c29394a6f8ff9d5b135dfe3834df3 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 11:02:19 +0800 Subject: [PATCH 288/339] Add some unit test and update sequence diagram --- docs/diagrams/caloriesManagement.png | Bin 58960 -> 59349 bytes docs/diagrams/caloriesManagement.puml | 2 +- src/test/java/food/FoodListTest.java | 16 ++++++++++++++++ src/test/java/food/FoodTest.java | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/test/java/food/FoodListTest.java create mode 100644 src/test/java/food/FoodTest.java diff --git a/docs/diagrams/caloriesManagement.png b/docs/diagrams/caloriesManagement.png index b975fc459e615f17bbd3069659269227995229ec..85c87aab14d11d40d3f641cf3eaa5c0fe7b7d7ca 100644 GIT binary patch delta 32866 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 A$N&HU delta 32198 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 diff --git a/docs/diagrams/caloriesManagement.puml b/docs/diagrams/caloriesManagement.puml index 7a2d12be9c..e9752371e1 100644 --- a/docs/diagrams/caloriesManagement.puml +++ b/docs/diagrams/caloriesManagement.puml @@ -21,7 +21,7 @@ alt command == EAT p -> f : Food(commandParts[1],calories) f --> p : food p -> fl : addFood(food) - p -> info : consumptionOfCalories(food) + p -> info : consumptionOfCalories(foodList.getFoods()) else command == VIEW p -> fl: printFoods() else command == switch diff --git a/src/test/java/food/FoodListTest.java b/src/test/java/food/FoodListTest.java new file mode 100644 index 0000000000..811154d0ea --- /dev/null +++ b/src/test/java/food/FoodListTest.java @@ -0,0 +1,16 @@ +package food; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class FoodListTest { + @Test + void addFood_success() { + FoodList fl= new FoodList(); + Food food = new Food("apple", 52); + fl.addFood(food); + assertTrue(fl.getFoods().contains(food), "Food should be added to the list."); + } + +} \ No newline at end of file diff --git a/src/test/java/food/FoodTest.java b/src/test/java/food/FoodTest.java new file mode 100644 index 0000000000..8b7188b3e0 --- /dev/null +++ b/src/test/java/food/FoodTest.java @@ -0,0 +1,14 @@ +package food; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class FoodTest { + + @Test + public void print_success() { + Food food = new Food("apple", 52); + assertEquals("apple, with 52.0 calories", food.print()); + } +} \ No newline at end of file From 20893f21ad9fffa45b3d127c06eb75404202ef31 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 11:11:38 +0800 Subject: [PATCH 289/339] Add test to food --- src/test/java/food/FoodListTest.java | 1 - src/test/java/food/FoodTest.java | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/java/food/FoodListTest.java b/src/test/java/food/FoodListTest.java index 811154d0ea..dd4c06edf0 100644 --- a/src/test/java/food/FoodListTest.java +++ b/src/test/java/food/FoodListTest.java @@ -12,5 +12,4 @@ void addFood_success() { fl.addFood(food); assertTrue(fl.getFoods().contains(food), "Food should be added to the list."); } - } \ No newline at end of file diff --git a/src/test/java/food/FoodTest.java b/src/test/java/food/FoodTest.java index 8b7188b3e0..306ecb86bb 100644 --- a/src/test/java/food/FoodTest.java +++ b/src/test/java/food/FoodTest.java @@ -11,4 +11,11 @@ public void print_success() { Food food = new Food("apple", 52); assertEquals("apple, with 52.0 calories", food.print()); } + + @Test + public void print_foodHasInvalidName_throwsAssertionError() { + Food food = new Food("", 52); + assertThrows(AssertionError.class, food::print, + "Should throw AssertionError for negative cost."); + } } \ No newline at end of file From 7ac453acf5f3135991e2c8eebc56c36d91cd24f6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:07:36 +0800 Subject: [PATCH 290/339] Add test for userInfo --- src/main/java/user/UserInfo.java | 22 ++- src/test/java/food/FoodListTest.java | 4 +- src/test/java/food/FoodTest.java | 5 +- src/test/java/user/UserInfoTest.java | 280 +++++++++++++++++++++++++++ 4 files changed, 299 insertions(+), 12 deletions(-) create mode 100644 src/test/java/user/UserInfoTest.java diff --git a/src/main/java/user/UserInfo.java b/src/main/java/user/UserInfo.java index 82c5778499..44508ab2a2 100644 --- a/src/main/java/user/UserInfo.java +++ b/src/main/java/user/UserInfo.java @@ -4,7 +4,6 @@ import exceptions.FailToCalculateCalories; import exceptions.InsufficientInfoException; import food.Food; -import food.FoodList; import git.Storage; import java.util.List; @@ -28,6 +27,8 @@ public UserInfo() { this.weight = 0; this.height = 0; this.age = 0; + this.BMR = 0; + this.AMR = 0; this.currentCalories = 0; this.storage = new Storage(); } @@ -42,6 +43,7 @@ public void setName(String name) { * @param weight User's weight. */ public void setWeight(double weight) { + assert weight >= 0 : "User should not be allowed to input negative weight"; this.weight = weight; } @@ -51,6 +53,7 @@ public void setWeight(double weight) { * @param height User's height. */ public void setHeight(double height) { + assert height >= 0 : "User should not be allowed to input negative height"; this.height = height; } @@ -60,6 +63,7 @@ public void setHeight(double height) { * @param age User's age. */ public void setAge(int age) { + assert age >= 0: "User should not be allowed to input negative age"; this.age = age; } @@ -116,7 +120,7 @@ public void updateInfo(String name, double weight, double height, int age, * * @throws InsufficientInfoException When there is not enough information for calculation. */ - private void calBMR() throws InsufficientInfoException { + public void calBMR() throws InsufficientInfoException { if (this.weight == 0 || this.height == 0 || this.age == 0) { throw new InsufficientInfoException(); } @@ -132,9 +136,9 @@ private void calBMR() throws InsufficientInfoException { /** * Calculate's the user's Active Metabolic Rate given the activeness. * - * @throws GitException When invalid activeness was given. + * @throws FailToCalculateCalories When invalid activeness was given. */ - private void calAMR() throws GitException { + public void calAMR() throws FailToCalculateCalories { switch (this.activeness) { case "inactive": this.AMR = this.BMR * 1.2; @@ -159,9 +163,9 @@ private void calAMR() throws GitException { /** * Calculate's the user's target calories given the aim. * - * @throws GitException When invalid aim was given. + * @throws FailToCalculateCalories When invalid aim was given. */ - public void setCaloriesCap() throws GitException { + public void setCaloriesCap() throws FailToCalculateCalories { switch (this.aim) { case "lose": this.caloriesCap = (int)(this.AMR*0.8); @@ -182,9 +186,10 @@ public void setCaloriesCap() throws GitException { * Only check if it has exceeded the target calories if sufficient information was given. * * @param foods The list of consumed food. - * @throws GitException When insufficient information about the user was given. + * @throws InsufficientInfoException When insufficient information about the user was given. */ - public void consumptionOfCalories(List foods) throws GitException{ + public void consumptionOfCalories(List foods) throws InsufficientInfoException{ + assert !(foods.isEmpty()) : "Food should be added into list before storing consumed calories"; this.currentCalories = 0; for (Food food : foods) { this.currentCalories = (int)(food.getCalories() + this.currentCalories); @@ -214,6 +219,7 @@ public String viewProfile(){ String target = "Target calories intake: " + this.caloriesCap; return userName + height + weight + age + gender + target; } + /** * Stores user details as a string in format for saving. * diff --git a/src/test/java/food/FoodListTest.java b/src/test/java/food/FoodListTest.java index dd4c06edf0..330ac60446 100644 --- a/src/test/java/food/FoodListTest.java +++ b/src/test/java/food/FoodListTest.java @@ -2,7 +2,7 @@ import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; class FoodListTest { @Test @@ -12,4 +12,4 @@ void addFood_success() { fl.addFood(food); assertTrue(fl.getFoods().contains(food), "Food should be added to the list."); } -} \ No newline at end of file +} diff --git a/src/test/java/food/FoodTest.java b/src/test/java/food/FoodTest.java index 306ecb86bb..0fa50963c8 100644 --- a/src/test/java/food/FoodTest.java +++ b/src/test/java/food/FoodTest.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; +import static org.junit.jupiter.api.Assertions.assertThrows; class FoodTest { @@ -18,4 +19,4 @@ public void print_foodHasInvalidName_throwsAssertionError() { assertThrows(AssertionError.class, food::print, "Should throw AssertionError for negative cost."); } -} \ No newline at end of file +} diff --git a/src/test/java/user/UserInfoTest.java b/src/test/java/user/UserInfoTest.java new file mode 100644 index 0000000000..e7b54dd671 --- /dev/null +++ b/src/test/java/user/UserInfoTest.java @@ -0,0 +1,280 @@ +package user; + +import exceptions.FailToCalculateCalories; +import exceptions.GitException; +import exceptions.InsufficientInfoException; +import food.Food; +import food.FoodList; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class UserInfoTest { + + @Test + void setName_success() { + UserInfo user = new UserInfo(); + user.setName("Tom"); + assertEquals(user.getName(), "Tom"); + } + + @Test + void setWeight_negativeWeight_throwsAssertionError() { + UserInfo user = new UserInfo(); + assertThrows(AssertionError.class, () ->user.setWeight(-50), + "Should throw AssertionError for negative weight."); + } + + @Test + void setHeight_negativeHeight_throwsAssertionError() { + UserInfo user = new UserInfo(); + assertThrows(AssertionError.class, () ->user.setHeight(-1), + "Should throw AssertionError for negative height."); + } + + @Test + void setAge_negativeAge_throwsAssertionError() { + UserInfo user = new UserInfo(); + assertThrows(AssertionError.class, () ->user.setAge(-1), + "Should throw AssertionError for negative age."); + } + + @Test + void calBMR_heightIsZero_exceptionThrown(){ + try { + UserInfo user = new UserInfo(); + user.setHeight(0); + user.calBMR(); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void calBMR_weightIsZero_exceptionThrown(){ + try { + UserInfo user = new UserInfo(); + user.setWeight(0); + user.calBMR(); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void calBMR_ageIsZero_exceptionThrown(){ + try { + UserInfo user = new UserInfo(); + user.setAge(0); + user.calBMR(); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void calBMR_validInput_success(){ + try { + UserInfo user = new UserInfo(); + user.setWeight(50); + user.setHeight(165); + user.setAge(21); + user.setGender("F"); + user.calBMR(); + } catch (InsufficientInfoException e) { + fail("Exception should not be thrown"); + } + } + + @Test + void calAMR_invalidActiveness_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + user.setActiveness("no"); + user.calAMR(); + fail("Expected a FailToCalculateCalories to be thrown"); + } catch (FailToCalculateCalories e) { + String expectedMessage = "Failed to calculate target calories. \n" + + "Please check if sufficient information has been given." ; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void calAMR_validActiveness_success() { + try { + UserInfo user = new UserInfo(); + user.setActiveness("active"); + user.calAMR(); + } catch (FailToCalculateCalories e) { + fail("Exception should not be thrown"); + } + } + + @Test + void setCaloriesCap_invalidAim_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + user.setAim("nil"); + user.setCaloriesCap(); + fail("Expected a FailToCalculateCalories to be thrown"); + } catch (FailToCalculateCalories e) { + String expectedMessage = "Failed to calculate target calories. \n" + + "Please check if sufficient information has been given." ; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void setCaloriesCap_validAim_success() { + try { + UserInfo user = new UserInfo(); + user.setAim("maintain"); + user.setCaloriesCap(); + } catch (FailToCalculateCalories e) { + fail("Exception should not be thrown"); + } + } + + @Test + void consumptionOfCalories_emptyFoodList_throwsAssertionError() { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + assertThrows(AssertionError.class, () ->user.consumptionOfCalories(foods), + "Should throw AssertionError for empty food list."); + } + + @Test + void consumptionOfCalories_weightIsZero_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 0, 165, 22, "f" , "active", "lose"); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_heightIsZero_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 0, 22, "f" , "active", "lose"); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_ageIsZero_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 165, 0, "f" , "active", "lose"); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_genderIsEmpty_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 165, 21, "" , "active", "lose"); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_activenessIsEmpty_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 165, 21, "f" , "", "lose"); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_aimIsEmpty_exceptionThrown() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 165, 21, "f" , "active", ""); + user.consumptionOfCalories(foods); + fail("Expected a InsufficientInfoException to be thrown"); + } catch (InsufficientInfoException e) { + String expectedMessage = "User's information is insufficient to calculate BMR," + + " please check the current information"; + assertEquals(expectedMessage, e.getMessage()); + } + } + + @Test + void consumptionOfCalories_validDetails_success() { + try { + UserInfo user = new UserInfo(); + List foods = new ArrayList<>(); + foods.add(new Food("apple", 52)); + user.updateInfo("Alice", 50, 165, 21, "f" , "active", "lose"); + user.consumptionOfCalories(foods); + } catch (InsufficientInfoException e) { + fail("Exception should not be thrown"); + } + } + + @Test + void viewProfile() { + UserInfo user = new UserInfo(); + user.updateInfo("Alice", 50, 165, 21, "f" , "active", "lose"); + String details = "Name: Alice\n" + + "Height: 165.0\n" + +"Weight: 50.0\n" + +"Age: 21\n" + +"Gender: f\n" + +"Target calories intake: 1854"; + assertEquals(user.viewProfile(), details); + } +} \ No newline at end of file From f3dffc49e838d8dd2f0f83ef69dfb572815654bd Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:13:34 +0800 Subject: [PATCH 291/339] Fix checkstyle error --- docs/UserGuide.md | 11 +++++++++++ src/main/java/food/FoodList.java | 1 - src/test/java/user/UserInfoTest.java | 8 ++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index c42a3c835e..ca0844439d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -581,6 +581,17 @@ Stores information needed to calculate and manage calories intake. Format: `update` +User will be prompt for the following details: + * `name` + * `weight`: A positive numeric value is expected + * `height`: A positive numeric value is expected + * `age`: A positive integer is expected + * `gender`: F / M / others + * Input is not case sensitive + * if `other` is entered, + * `activeness` + * `aim` + Example of usage: `update` diff --git a/src/main/java/food/FoodList.java b/src/main/java/food/FoodList.java index caacba0c5a..ab9b27b029 100644 --- a/src/main/java/food/FoodList.java +++ b/src/main/java/food/FoodList.java @@ -1,6 +1,5 @@ package food; -import exceptions.emptyinput.EmptyInputException; import git.GroceryUi; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/user/UserInfoTest.java b/src/test/java/user/UserInfoTest.java index e7b54dd671..77fc771209 100644 --- a/src/test/java/user/UserInfoTest.java +++ b/src/test/java/user/UserInfoTest.java @@ -1,16 +1,16 @@ package user; import exceptions.FailToCalculateCalories; -import exceptions.GitException; import exceptions.InsufficientInfoException; import food.Food; -import food.FoodList; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class UserInfoTest { @@ -277,4 +277,4 @@ void viewProfile() { +"Target calories intake: 1854"; assertEquals(user.viewProfile(), details); } -} \ No newline at end of file +} From 75760107d967a5ff8e20cd32ac5a19dcfbf403e6 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:35:40 +0800 Subject: [PATCH 292/339] Update user guide --- docs/UserGuide.md | 99 +++++++++++++++++++++----- src/main/java/grocery/GroceryList.java | 8 ++- 2 files changed, 86 insertions(+), 21 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ca0844439d..52f9049366 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -302,7 +302,10 @@ Format: `cost GROCERY $PRICE` Example of usage: -`cost milk $1.20` +``` +>> cost milk $1.20 +milk is now $1.20 +```   @@ -316,7 +319,10 @@ Format: `th GROCERY a/AMOUNT` Example of usage: -`th milk a/1` +``` +>> th milk a/1 +milk's threshold is now 1 +```   @@ -412,7 +418,12 @@ Format: `low` Example of usage: -`low` +``` +>> low +Time to top up these groceries! + - milk only left: 0 + - apple only left: 0 +```   @@ -454,8 +465,13 @@ Format: `list` Example of usage: -`list` - +``` +>> list +Here are your groceries! + - milk, amount: 0 units, cost: $1.20 + - apple, amount: 0 units, cost: $2.00 + - coke, cost: $1.00 +```   ### Listing all groceries by price: `listcost` @@ -465,7 +481,13 @@ Format: `listcost` Example of usage: -`listcost` +``` +>> listcost +Here are your groceries! + - apple, amount: 0 units, cost: $2.00 + - milk, amount: 0 units, cost: $1.20 + - coke, cost: $1.00 +```   @@ -558,8 +580,12 @@ Adds the food eaten and store its calories. Format: `eat FOOD` Example of usage: - -`eat burger` +``` +>> eat burger +Please enter the calories of the food in kcal: +>> 400 +burger, with 400.0 calories was consumed! +```   ### Viewing all food and calories intake: `view` @@ -569,7 +595,13 @@ Format: `view` Example of usage: -`view` +``` +>> view +Here are the food you have consumed today: + - burger, with 400.0 calories + - apple, with 52.0 calories +You have consumed 452.0 calories for today +``` @@ -582,19 +614,42 @@ Stores information needed to calculate and manage calories intake. Format: `update` User will be prompt for the following details: - * `name` + * `name`: A non-empty string is expected * `weight`: A positive numeric value is expected * `height`: A positive numeric value is expected * `age`: A positive integer is expected * `gender`: F / M / others - * Input is not case sensitive - * if `other` is entered, - * `activeness` - * `aim` + * Input is case-insensitive + * If `other` is entered, calculations done will be based on `M` + * `activeness`: inactive/light/moderate/active/very + * Input must be one of these options to be valid. + * Inactive - little or no exercise + * Light - light exercise 1-3 days per week + * Moderate - moderate exercise 3-5 days per week + * Active - hard exercise 6-7 days a week + * Very - very hard exercise 6-7 days a week + * `aim`: lose/maintain/gain + * Input must be one of these options to be valid. Example of usage: - -`update` +``` +>> update +Please enter your name +>> Alice +Please enter your weight in KG: +>> 50 +Please enter your height in cm: +>> 165 +Please enter your age in years (nearest whole number): +>> 22 +Please enter your gender (M / F / Others): +>> f +Please enter your activeness (e.g. inactive/light/moderate/active/very): +>> moderate +Please enter your weight aim (e.g. lose/maintain/gain): +>> lose +Your target calories intake a day should be 1655 +```   ### Viewing user details: `view` @@ -603,9 +658,15 @@ Shows the user profile details. Format: `view` Example of usage: - -`view` - +``` +>> view +Name: Alice +Height: 165.0 +Weight: 50.0 +Age: 22 +Gender: f +Target calories intake: 1655 +```   diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index d1e7f4e3ec..c72b9e14a1 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -305,8 +305,12 @@ public void editThreshold(String details) throws GitException { String [] amtParts = checkDetails(details, "th", "a/"); Grocery grocery = getGrocery(amtParts[0].strip()); String thresholdString = amtParts[1].strip(); - int threshold = checkAmount(thresholdString); - + int threshold; + try { + threshold = Integer.parseInt(thresholdString); + } catch (NumberFormatException e) { + throw new InvalidAmountException(); + } grocery.setThreshold(threshold); GroceryUi.printThresholdSet(grocery); storage.saveGroceryFile(getGroceries()); From b80342e048c58287d99cb9dcc281a319c37af900 Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:44:17 +0800 Subject: [PATCH 293/339] Update PPP --- docs/team/luoyu-uwu.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/team/luoyu-uwu.md b/docs/team/luoyu-uwu.md index 71397c43c8..1660017937 100644 --- a/docs/team/luoyu-uwu.md +++ b/docs/team/luoyu-uwu.md @@ -26,10 +26,11 @@ Given below are my contributions to the project. * User Guide: * Added documentation for the features `switch`, `cost`, `th`, `low`, `eat`, `view` and `update`. * Developer Guide: - * Added implementation details of the `list` and `listcost` feature. - * Added `Execute Command` sequence diagram. - * Added `Calories Management Mode` sequence diagram. - * Added `Profile Management Mode` sequence diagram. + * Added implementation details of the `list`, `listcost`, `th`, `cost` and `low` feature. + * Added `Execute Command`, `Calories Management Mode`, `Profile Management Mode` and `Grocery Management Mode` sequence diagram. + * Added `addOrDelGrocery`, `editGrocery`, and `viewListOrHelp` sequence diagram. + * Added `editCost` and `editThreshold` sequence diagram. + * Added `class diagram` for Calories and Profile Management Mode. * Review/mentoring contributions: * [#18](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/18) , From a7d8f9b4d05cb1d74d4d57a1c2587ab993d2b6cb Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:44:55 +0800 Subject: [PATCH 294/339] Update PPP --- docs/team/luoyu-uwu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/luoyu-uwu.md b/docs/team/luoyu-uwu.md index 1660017937..663d866030 100644 --- a/docs/team/luoyu-uwu.md +++ b/docs/team/luoyu-uwu.md @@ -2,7 +2,7 @@ ## Project: Grocery in Time Grocery in Time is a desktop application used for keeping track of groceries. -The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. +The user interacts with it using a CLI. It is written in Java and has nearly 7 kLoC. Given below are my contributions to the project. * New Feature: Added the ability to store grocery prices. From 8cd64960eb923f6b6f16b258a1529d05272168de Mon Sep 17 00:00:00 2001 From: LuoYu-uwu Date: Sun, 14 Apr 2024 12:46:19 +0800 Subject: [PATCH 295/339] Update PPP --- docs/team/luoyu-uwu.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/team/luoyu-uwu.md b/docs/team/luoyu-uwu.md index 663d866030..4926767aec 100644 --- a/docs/team/luoyu-uwu.md +++ b/docs/team/luoyu-uwu.md @@ -5,16 +5,16 @@ Grocery in Time is a desktop application used for keeping track of groceries. The user interacts with it using a CLI. It is written in Java and has nearly 7 kLoC. Given below are my contributions to the project. -* New Feature: Added the ability to store grocery prices. +* New Feature: Added the ability to store grocery `prices`. * What it does: allows the user to view the cost of a grocery and sort groceries by price in descending order. * Justification: This feature improves the product significantly as user can track how much they are spending. -* New Feature: Added the ability to store grocery threshold amount. +* New Feature: Added the ability to store grocery `threshold` amount. * What it does: allows the user to view low-stock groceries and receive reminders when consumption dips below set thresholds. * Justification: This feature greatly enhances the product by keeping users informed about which groceries need replenishing. -* New Feature: Added the ability to select different modes and switch between them. +* New Feature: Added the ability to select `different modes` and switch between them. * What it does: allows the users to seamlessly switch between grocery, profile, calories, and recipe management modes. * Justification: This feature enhances user experience by facilitating easy navigation between various functions. -* New Feature: Added the ability to consumed food. +* New Feature: Added the ability to consumed `food` and manage `calories intake`. * What it does: allows the user to input their details to calculate target calorie intake, track consumed calories, and receive reminders if they exceed their target intake. * Justification: From 48be00ea691f69dc541d260ea8d742be1a5848bf Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 13:29:50 +0800 Subject: [PATCH 296/339] Add recipe tests --- src/test/java/recipe/RecipeTest.java | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/test/java/recipe/RecipeTest.java diff --git a/src/test/java/recipe/RecipeTest.java b/src/test/java/recipe/RecipeTest.java new file mode 100644 index 0000000000..e46701c3e6 --- /dev/null +++ b/src/test/java/recipe/RecipeTest.java @@ -0,0 +1,39 @@ +package recipe; + +import exceptions.DuplicateException; +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.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RecipeTest { + @Test + public void getTitle_validDetails() { + String title = "Egg"; + ArrayList ingredients = new ArrayList(); + ingredients.add("egg"); + ingredients.add("salt"); + ArrayList steps = new ArrayList(); + steps.add("Fry." ); + steps.add("Serve."); + Recipe recipe = new Recipe(title, ingredients, steps); + assertEquals("Egg", recipe.getTitle()); + } + + @Test + public void editTitle_validDetails() { + String title = "Egg"; + ArrayList ingredients = new ArrayList(); + ingredients.add("egg"); + ingredients.add("salt"); + ArrayList steps = new ArrayList(); + steps.add("Fry." ); + steps.add("Serve."); + Recipe recipe = new Recipe(title, ingredients, steps); + recipe.editTitle("Not egg"); + assertEquals("Not egg", recipe.getTitle()); + } +} From d8cadce98033d0d6cb00f08be43643ac48f6047a Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 13:30:10 +0800 Subject: [PATCH 297/339] Gradle checks --- src/test/java/recipe/RecipeTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/recipe/RecipeTest.java b/src/test/java/recipe/RecipeTest.java index e46701c3e6..4feba7ba9a 100644 --- a/src/test/java/recipe/RecipeTest.java +++ b/src/test/java/recipe/RecipeTest.java @@ -1,13 +1,9 @@ package recipe; -import exceptions.DuplicateException; 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.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; public class RecipeTest { @Test From 719d557f6fbbff391af97915a19e3f0b167ad0dc Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 15:20:17 +0800 Subject: [PATCH 298/339] Update exception handing for cost, list commands --- docs/UserGuide.md | 112 ++++++++++++++---- .../java/enumerations/GroceryCommand.java | 2 +- src/main/java/git/GroceryUi.java | 8 +- src/main/java/git/Parser.java | 38 +++--- src/main/java/git/Storage.java | 2 +- src/main/java/git/Ui.java | 24 ++-- src/main/java/grocery/Grocery.java | 2 +- src/main/java/grocery/GroceryList.java | 14 ++- 8 files changed, 143 insertions(+), 59 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index bc5060c97a..4994a8c625 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -13,6 +13,7 @@ It allows users to track and manage their groceries around their home easily. - [Features](#features) - [Switching between different modes: `switch`](#switching-between-different-modes-switch) - [Grocery management mode](#grocery-management-mode) + - [Viewing help: `help`](#viewing-help-help) - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) - [Adding multiple groceries: `addmulti`](#adding-multiple-groceries-addmulti) @@ -32,6 +33,7 @@ It allows users to track and manage their groceries around their home easily. - [Viewing groceries that are low in stock: `low`](#viewing-groceries-that-are-low-in-stock-low) - [Viewing groceries expiring in the next 3 days: `expiring`](#viewing-groceries-expiring-in-the-next-3-days-expiring) - [Listing all groceries: `list`](#listing-all-groceries-list) + - [Listing all groceries by category: `listcat`](#listing-all-groceries-by-category-listcat) - [Listing all groceries by price: `listcost`](#listing-all-groceries-by-price-listcost) - [Listing all groceries by expiration date: `listexp`](#listing-all-groceries-by-expiration-date-listexp) - [Listing storage locations and their groceries: `listloc`](#listing-storage-locations-and-their-groceries-listloc) @@ -77,7 +79,7 @@ GiT comes in different modes and will prompt the user to choose their desired mo Format: `switch` -* Enter the desired mode to switch to after inputting `switch`. +* No other word is to be entered after `switch`. Instead, wait for GiT to prompt you to enter the desired mode to switch to. Example of usage: @@ -103,6 +105,23 @@ Here are some ways you can maange your groceries! >
e.g. `store GROCERY l/LOCATION` works the same using `freezer` or `FREEZER`. > * The actual output may differ slightly from the examples due to the addition of lines for better user readability. +### Viewing help: `help` +Prints all commands and a short description of what they do. + +Format: `help` + +* No other word is to be entered after `help`. + +Example of usage: + +``` +>> help + +Here are some ways you can manage your groceries! +... +``` + +  ### Add / Edit / Delete Groceries ### Adding a new grocery: `add` @@ -122,7 +141,7 @@ Format: `add GROCERY` * Any details not included here can be edited using other commands. * The only detail can cannot be included here is the rating, which is edited using [rate](#adding-rating-and-review-of-a-grocery-rate). -Example of usage : +Example of usage: ``` >> add milk @@ -168,7 +187,7 @@ Format: `addmulti` 2. Additional details to include * The interface is the same as the one for [add](#adding-a-new-grocery-add). -Example of usage : +Example of usage: ``` >> addmulti @@ -197,6 +216,7 @@ Sets the category of a grocery. Format: `cat GROCERY c/CATEGORY` * `CATEGORY` must be a valid String. +* `CATEGORY` will be stored in uppercase. Example of usage: ``` @@ -297,7 +317,7 @@ Example of usage: ### Setting the cost of a grocery: `cost` Sets the cost of a grocery. -Format: `cost GROCERY $PRICE` +Format: `cost GROCERY $PRICE` * `PRICE` must be a valid numerical value. @@ -305,6 +325,7 @@ Example of usage: ``` >> cost milk $1.20 + milk is now $1.20 ``` @@ -322,6 +343,7 @@ Example of usage: ``` >> th milk a/1 + milk's threshold is now 1 ``` @@ -417,6 +439,8 @@ Shows a list of groceries below the threshold amount. Format: `low` +* No other word is to be entered after `low`. + Example of usage: ``` @@ -429,31 +453,28 @@ Time to top up these groceries!   ### Viewing groceries expiring in the next 3 days: `expiring` -Shows a list of groceries that are expiring in the next 3 days. +Shows a list of groceries that are expiring in the next 3 days. +Sends an email notification if needed. Format: `expiring` -Example of usage: - -`expiring` - - -  -### Presenting all expiring groceries: `expiring` -Show all the expiring groceries and send email notification if needed. - -Format: `expiring` +* No other word is to be entered after `expiring`. Example of usage: ``` -expiring +>> expiring + Checking for groceries nearing expiration... Milk is nearing expiration on 2024-04-10 Do you wish to send a notification email? (y/n) -y + +>> y + Please enter your email to receive notifications: -example@gamil.com + +>> example@gamil.com + Sending notification email... Email sent successfully to example@gmail.com ``` @@ -464,26 +485,55 @@ Shows a list of all groceries you have. Format: `list` +* No other word is to be entered after `list`. + Example of usage: ``` >> list + Here are your groceries! - - milk, amount: 0 units, cost: $1.20 - - apple, amount: 0 units, cost: $2.00 - - coke, cost: $1.00 + - coke (SODA), cost: $1.00 + - milk (DAIRY), amount: 0 units, cost: $1.20 + - apple (FRUIT), amount: 0 units, cost: $2.00 ``` + +  +### Listing all groceries by category: `listcat` +Shows a list of all groceries you have, sorted by category alphabetically. + +Format: `listcat` + +* No other word is to be entered after `listcat`. +* Grocery list is sorted, causing the order shown by `list` to change. + +Example of usage: + +``` +>> listcat + +Here are your groceries! + - milk (DAIRY), amount: 0 units, cost: $1.20 + - apple (FRUIT), amount: 0 units, cost: $2.00 + - coke (SODA), cost: $1.00 +``` + +   ### Listing all groceries by price: `listcost` -Shows a list of all groceries you have, sorted by price. +Shows a list of all groceries you have, sorted by descending price. Format: `listcost` +* No other word is to be entered after `listcost`. +* Grocery list is sorted, causing the order shown by `list` to change. + Example of usage: ``` >> listcost + Here are your groceries! - apple, amount: 0 units, cost: $2.00 - milk, amount: 0 units, cost: $1.20 @@ -493,13 +543,23 @@ Here are your groceries!   ### Listing all groceries by expiration date: `listexp` -Shows a list of all groceries you have, sorted by expiration date. +Shows a list of all groceries you have, sorted by expiration date +i.e. earliest expiring item at the top. Format: `listexp` +* No other word is to be entered after `listexp`. +* Grocery list is sorted, causing the order shown by `list` to change. + Example of usage: -`listexp` +``` +>> listexp + +Here are your groceries! + - meat (MEAT), expiration: 2024-04-10 + - cheese (DAIRY), expiration: 2025-12-12 +```   @@ -794,6 +854,8 @@ Exits GiT, regardless of which mode you are in. Format: `exit` +* No other word is to be entered after `exit`. + Example of usage: ``` @@ -836,6 +898,7 @@ For instance, grocery data is stored in `groceryList.txt`. | Command | Format | |--------------------------------------------------------------|---------------------------------| +| View help | `help` | | Add grocery | `add GROCERY` | | Add multiple groceries | `addmulti` | | Set grocery category | `cat GROCERY c/CATEGORY` | @@ -853,6 +916,7 @@ For instance, grocery data is stored in `groceryList.txt`. | View groceries that are low in stock | `low` | | View groceries expiring in the next 3 days | `expiring` | | List groceries | `list` | +| List groceries by category | `listcat` | | List groceries by price | `listcost` | | List groceries by expiration date | `listexp` | | List storage locations
List groceries in given location | `listloc [LOCATION]` | diff --git a/src/main/java/enumerations/GroceryCommand.java b/src/main/java/enumerations/GroceryCommand.java index c2fefbf55b..dedf3d96b7 100644 --- a/src/main/java/enumerations/GroceryCommand.java +++ b/src/main/java/enumerations/GroceryCommand.java @@ -3,6 +3,6 @@ public enum GroceryCommand { // order of where command is placed affects the function it calls, refer to groceryManagement ADD, ADDMULTI, DEL, EXP, CAT, AMT, TH, RATE, USE, COST, REMARK, STORE, LOC, DELLOC, - LISTLOC, FIND, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, VIEW, EXIT + LISTLOC, FIND, VIEW, LIST, LISTCAT, LISTCOST, LISTEXP, EXPIRING, LOW, HELP, SWITCH, EXIT } diff --git a/src/main/java/git/GroceryUi.java b/src/main/java/git/GroceryUi.java index 5431cc9e15..5c655648c8 100644 --- a/src/main/java/git/GroceryUi.java +++ b/src/main/java/git/GroceryUi.java @@ -267,7 +267,11 @@ public Location promptForLocation() { */ public String promptForCategory(){ System.out.println("Please enter the category (e.g. fruit):"); - return in.nextLine().trim(); + String category = in.nextLine().trim(); + if (category.isBlank()) { + System.out.println("No category specified - will be left empty."); + } + return category; } /** @@ -457,7 +461,7 @@ public void processAddMenu (Grocery grocery, String addNums) { case '1': System.out.println("Including Category"); String category = singleGroceryUi.promptForCategory(); - grocery.setCategory(category); + grocery.setCategory(category.toUpperCase()); break; case '2': diff --git a/src/main/java/git/Parser.java b/src/main/java/git/Parser.java index 78bac26504..afbe9029de 100644 --- a/src/main/java/git/Parser.java +++ b/src/main/java/git/Parser.java @@ -370,8 +370,10 @@ public void groceryManagement(String[] commandParts) throws GitException { handleLocationCommands(command, commandParts[1]); } else if (index == GroceryCommand.FIND.ordinal()) { groceryList.findGroceries(commandParts[1]); + } else if (index == GroceryCommand.VIEW.ordinal()) { + groceryList.viewGrocery(commandParts[1]); } else { - viewListOrHelp(command, commandParts); + handleListOrHelp(command, commandParts); } } @@ -429,9 +431,11 @@ private void editGrocery(GroceryCommand command, String[] commandParts) throws G case EXP: groceryList.editExpiration(commandParts[1]); break; + case CAT: groceryList.editCategory(commandParts[1]); break; + case AMT: case USE: groceryList.editAmount(commandParts[1], commandParts[0].equals("use")); @@ -495,18 +499,28 @@ private void handleLocationCommands(GroceryCommand command, String name) throws } /** - * Handles commands related to viewing the grocery list, getting help, or switching modes. + * Checks if the user input for `list` commands are valid i.e. no other words. + * + * @param commandParts User inputs. + * @throws InvalidCommandException Thrown when there is another word after `list`. + */ + private void checkListCommand(String[] commandParts) throws InvalidCommandException { + if (!commandParts[1].isBlank()) { + throw new InvalidCommandException(); + } + } + + /** + * Handles commands related to listing the grocery list, getting help, or switching modes. * * @param command Command keyword of data type Enum. + * @param commandParts User inputs. * @throws GitException Exception thrown depending on specific error. */ - private void viewListOrHelp(GroceryCommand command, String[] commandParts) throws GitException { - switch (command) { - - case VIEW: - groceryList.viewGrocery(commandParts[1]); - break; + private void handleListOrHelp(GroceryCommand command, String[] commandParts) throws GitException { + checkListCommand(commandParts); + switch (command) { case LIST: groceryList.listGroceries(); break; @@ -541,12 +555,8 @@ private void viewListOrHelp(GroceryCommand command, String[] commandParts) throw break; case EXIT: - if (commandParts[1].isEmpty()) { - System.out.println("bye bye!"); - isRunning = false; - } else { - throw new InvalidCommandException(); - } + System.out.println("bye bye!"); + isRunning = false; break; default: diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 1837619075..39f09c17a2 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -106,7 +106,7 @@ private Grocery parseGrocery(String line) throws EmptyInputException { int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate expiration = parts[3].equals("null") ? null : LocalDate.parse(parts[3].trim(), formatter); - String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim(); + String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim().toUpperCase(); double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); Location location = null; String locString = parts[6].strip(); diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 35fe392c50..171dbfae79 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -196,30 +196,30 @@ public static void displayHelpForGrocery() { "Here are some ways you can manage your groceries!\n" + "add GROCERY: adds the item GROCERY.\n" + "addmulti: adds multiple items GROCERIES.\n" + - "find KEYWORD: finds all groceries containing the KEYWORD.\n" + - "loc LOCATION: adds a LOCATION to track.\n" + - "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + "cat GROCERY c/CATEGORY: edits the category for GROCERY.\n" + "amt GROCERY a/AMOUNT: sets the amount of GROCERY.\n" + "use GROCERY a/AMOUNT: updates the total amount after using a GROCERY.\n" + - "th GROCERY a/AMOUNT: edits the threshold amount of GROCERY.\n" + - "cost GROCERY $PRICE: edits the price of GROCERY.\n" + "store GROCERY l/LOCATION: sets the location of GROCERY.\n" + - "rate GROCERY: rates and reviews GROCERY.\n" + + "exp GROCERY d/EXPIRATION_DATE: edits the expiration date for GROCERY.\n" + + "cost GROCERY $PRICE: edits the price of GROCERY.\n" + + "th GROCERY a/AMOUNT: edits the threshold amount of GROCERY.\n" + "remark GROCERY r/REMARK: updates the remark of the GROCERY.\n" + + "rate GROCERY: rates and reviews GROCERY.\n" + "del GROCERY: deletes GROCERY.\n" + - "delloc LOCATION: removes LOCATION from tracking.\n" + + "find KEYWORD: finds all groceries containing the KEYWORD.\n" + + "view GROCERY: view all the details of GROCERY.\n" + + "low: shows a list of groceries that are low in stock.\n" + + "expiring: shows a list of groceries that are expiring soon.\n" + "list: shows list of all groceries you have.\n" + "listcat: shows the list sorted by category.\n" + "listcost: shows the list sorted by price.\n" + "listexp: shows the list sorted by expiration date.\n" + "listloc [LOCATION]: shows all locations, or all groceries stored in [LOCATION].\n" + - "expiring: shows a list of groceries that are expiring soon.\n" + - "low: shows a list of groceries that are low in stock.\n" + - "view GROCERY: view all the details of GROCERY.\n" + - "exit: exits the program.\n" + + "loc LOCATION: adds a LOCATION to track.\n" + + "delloc LOCATION: removes LOCATION from tracking.\n" + "switch: switches the mode.\n" + - "help: view all the possible commands." + "help: view all the possible commands.\n" + + "exit: exits the program." ); } diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index ad4b52f59e..fbb2c91b26 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -186,7 +186,7 @@ public void setUnit(String category) { this.unit = "ml"; break; default: - this.unit = "units"; + this.unit = ""; break; } } diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index c72b9e14a1..42454e37f2 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -126,10 +126,16 @@ private String[] checkDetails(String details, String command, String parameter) throw new EmptyInputException("grocery"); } + // Split the input into the grocery name and the detail part. - String[] detailParts = details.split(parameter, 2); + String[] detailParts; + if (command.equals("cost")) { + detailParts = details.split("\\$", 2); + } else { + detailParts = details.split(parameter, 2); + } - // Check if the grocery exists + // Check iin the grocery exists if (!isGroceryExists(detailParts[0].strip())) { throw new NoSuchObjectException("grocery (" + detailParts[0].strip() + ")"); } @@ -189,7 +195,7 @@ public void editCategory(String details) throws GitException { Grocery grocery = getGrocery(catParts[0].strip()); String newCategory = catParts[1].strip(); - grocery.setCategory(newCategory); + grocery.setCategory(newCategory.toUpperCase()); GroceryUi.printCategorySet(grocery); storage.saveGroceryFile(getGroceries()); } @@ -278,7 +284,7 @@ public void editRemark(String details) throws GitException { * @throws GitException If the input new cost is not numeric. */ public void editCost(String details) throws GitException { - String[] costParts = checkDetails(details, "cost", "\\$"); + String[] costParts = checkDetails(details, "cost", "$"); Grocery grocery = getGrocery(costParts[0].strip()); String price = costParts[1].strip(); From 59c2f8389385696df2f6fcac241f2d70a88ce247 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 16:15:44 +0800 Subject: [PATCH 299/339] Fix data loading issues and clean up loaded data --- docs/UserGuide.md | 2 +- docs/team/wallywallywally.md | 1 + src/main/java/git/Storage.java | 53 ++++++++++++++------------ src/main/java/grocery/Grocery.java | 42 +++++++++++++++----- src/main/java/grocery/GroceryList.java | 11 +++--- 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4994a8c625..d63108b5d9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -250,7 +250,7 @@ Format: `use GROCERY a/AMOUNT` * `AMOUNT` must be a valid integer. * If `AMOUNT` is greater than what the `GROCERY` has in stock, its amount will be reduced to 0. -* If the amount of the `GROCERY` is already 0, GiT will let the user know and the amount stays at 0. +* If the amount of the `GROCERY` is already 0 or is not set, GiT will let the user know it is out of stock. Example of usage: diff --git a/docs/team/wallywallywally.md b/docs/team/wallywallywally.md index 75be93bf66..de9a575a84 100644 --- a/docs/team/wallywallywally.md +++ b/docs/team/wallywallywally.md @@ -22,6 +22,7 @@ It allows users to track and manage their groceries around their home easily. - `listloc [LOCATION]` - Without `LOCATION`: View all tracked locations - With `LOCATION` View groceries stored in given `LOCATION` + - Loading storage location data 3. Ability to **find** groceries by name: - `find KEYWORD` 4. Improved defensiveness diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 39f09c17a2..d14f885fc2 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -1,7 +1,6 @@ package git; import exceptions.GitException; -import exceptions.emptyinput.EmptyInputException; import exceptions.nosuch.NoSuchObjectException; import grocery.Grocery; import grocery.GroceryList; @@ -14,26 +13,18 @@ import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; import grocery.location.Location; -import java.time.format.DateTimeFormatter; /** * Handles loading from and saving tasks to a file. */ public class Storage { - private Grocery grocery; - private List groceries; - private GroceryList groceryList; - private Recipe recipe; - private RecipeList recipeList; - private UserInfo userInfo; /** * Saves the current list of groceries to the file. * @param groceries The list of groceries to save. @@ -70,15 +61,10 @@ public GroceryList loadGroceryFile(){ try { Grocery grocery = parseGrocery(line); Location location = grocery.getLocation(); - if (grocery != null) { //if not corrupted - if (location != null){ - location.addGrocery(grocery); - } - groceryList.addGrocery(grocery); - } else { - wipeFile(file); - return new GroceryList(); + if (location != null){ + location.addGrocery(grocery); } + groceryList.addGrocery(grocery); } catch (Exception e) { wipeFile(file); return new GroceryList(); @@ -96,18 +82,18 @@ public GroceryList loadGroceryFile(){ * @param line The string to parse. * @return The parsed grocery object. Returns null if file is corrupted. */ - private Grocery parseGrocery(String line) throws EmptyInputException { + private Grocery parseGrocery(String line) { String[] parts = line.split(" \\| "); if (parts.length != 7) { return null; } else { String name = parts[0].trim(); - int amount = parts[1].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[1].trim()); - int threshold = parts[2].equalsIgnoreCase("null") ? 0 : Integer.parseInt(parts[2].trim()); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - LocalDate expiration = parts[3].equals("null") ? null : LocalDate.parse(parts[3].trim(), formatter); + int amount = parts[1].equalsIgnoreCase("null") ? -1 : Integer.parseInt(parts[1].trim()); + int threshold = parts[2].equalsIgnoreCase("null") ? -1 : Integer.parseInt(parts[2].trim()); + String expiration = parts[3].equals("null") ? "" : parts[3].trim(); String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim().toUpperCase(); - double cost = parts[5].equalsIgnoreCase("null") ? 0 : Double.parseDouble(parts[5].trim()); + double cost = parts[5].equalsIgnoreCase("null") ? -1 : Double.parseDouble(parts[5].trim()); + Location location = null; String locString = parts[6].strip(); if (!locString.equalsIgnoreCase("null")) { @@ -122,7 +108,26 @@ private Grocery parseGrocery(String line) throws EmptyInputException { } } } - return new Grocery(name, amount, threshold, expiration, category, cost, location); + + Grocery grocery = new Grocery(name); + if (amount != -1) { + grocery.setAmount(amount); + grocery.setIsSetAmount(true); + } + if (threshold != -1) { + grocery.setThreshold(threshold); + } + if (cost != -1) { + grocery.setCost(cost); + grocery.setIsSetCost(true); + } + if (!expiration.isBlank()) { + grocery.setExpirationOnLoad(expiration); + } + grocery.setCategory(category); + grocery.setLocation(location); + + return grocery; } } /** diff --git a/src/main/java/grocery/Grocery.java b/src/main/java/grocery/Grocery.java index fbb2c91b26..0f8ca564f2 100644 --- a/src/main/java/grocery/Grocery.java +++ b/src/main/java/grocery/Grocery.java @@ -155,6 +155,14 @@ public void setRemark(String remark) { this.remark = remark; } + public void setIsSetCost(boolean isSetCost) { + this.isSetCost = isSetCost; + } + + public void setIsSetAmount(boolean isSetAmount) { + this.isSetAmount = isSetAmount; + } + /** * Checks if the grocery is low in stock. * @@ -212,6 +220,16 @@ public void setExpiration(String expiration) throws PastExpirationDateException this.expiration = LocalDate.parse(expiration, formatter); } + /** + * Sets the expiration date when loading saved data. + * + * @param expiration The expiration date of the grocery as saved in the data. + */ + public void setExpirationOnLoad(String expiration) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + this.expiration = LocalDate.parse(expiration, formatter); + } + /** * Sets the cost of the grocery. * @@ -246,10 +264,12 @@ public String printGrocery() { } String amountString = ""; - if (amount != 0) { - amountString = ", amount: " + amount; - } else if (isSetAmount) { - amountString = ", amount: 0"; + if (isSetAmount) { + if (amount != 0) { + amountString = ", amount: " + amount; + } else { + amountString = ", amount: 0"; + } } String unitString = ""; @@ -263,10 +283,12 @@ public String printGrocery() { } String price = ""; - if (cost != 0) { - price = ", cost: $" + String.format("%.2f", cost); - } else if (isSetCost) { - price = ", cost: $0.00"; + if (isSetCost) { + if (cost != 0) { + price = ", cost: $" + String.format("%.2f", cost); + } else { + price = ", cost: $0.00"; + } } String remarkString = ""; @@ -288,7 +310,7 @@ public String toSaveFormat() { assert !(this.name.isEmpty()) : "Grocery does not exist!!"; String amountString; - if (amount != 0) { + if (isSetAmount) { amountString = "| " + amount + " "; } else { amountString = "| null "; @@ -323,7 +345,7 @@ public String toSaveFormat() { } String price; - if (cost != 0) { + if (isSetCost) { price = "| " + String.format("%.2f", cost) + " "; } else { price = "| null "; diff --git a/src/main/java/grocery/GroceryList.java b/src/main/java/grocery/GroceryList.java index 42454e37f2..ddb7c00545 100644 --- a/src/main/java/grocery/GroceryList.java +++ b/src/main/java/grocery/GroceryList.java @@ -126,7 +126,6 @@ private String[] checkDetails(String details, String command, String parameter) throw new EmptyInputException("grocery"); } - // Split the input into the grocery name and the detail part. String[] detailParts; if (command.equals("cost")) { @@ -226,12 +225,12 @@ private int checkAmount (String amountString) throws InvalidAmountException { * Sets the amount of an existing grocery. * * @param details User input. - * @param use True to reduce the amount of a grocery, false to set a new amount. + * @param isUse True to reduce the amount of a grocery, false to set a new amount. * @throws GitException Exception thrown depending on error. */ - public void editAmount(String details, boolean use) throws GitException { + public void editAmount(String details, boolean isUse) throws GitException { String [] amtParts; - if (use) { + if (isUse) { amtParts = checkDetails(details, "use", "a/"); } else { amtParts = checkDetails(details, "amt", "a/"); @@ -240,9 +239,9 @@ public void editAmount(String details, boolean use) throws GitException { String amountString = amtParts[1].strip(); int amount = checkAmount(amountString); - if (use && grocery.getAmount() == 0) { + if (isUse && grocery.getAmount() == 0) { throw new CannotUseException(); - } else if (use) { + } else if (isUse) { amount = Math.max(0, grocery.getAmount() - amount); } From ae0efeb4cc297a20b99554cd14f2c78576730078 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 16:17:35 +0800 Subject: [PATCH 300/339] Clean up checkstyle --- src/main/java/git/Storage.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index d14f885fc2..5f86bf4266 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -71,8 +71,7 @@ public GroceryList loadGroceryFile(){ } } scanner.close(); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved groceries found.\n "); } return groceryList; @@ -190,8 +189,7 @@ public RecipeList loadRecipeFile(){ } } scanner.close(); - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved recipes found.\n "); } return recipeList; @@ -256,8 +254,7 @@ public UserInfo loadProfileFile(){ wipeFile(file); return new UserInfo(); } - } - catch (FileNotFoundException e) { + } catch (FileNotFoundException e) { //System.out.println("No saved recipes found.\n "); } catch (GitException e) { throw new RuntimeException(e); From d5447990af9fe3c89edef57479e0b49371545cdd Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 17:07:23 +0800 Subject: [PATCH 301/339] Add test cases related to Storage functionalities --- src/main/java/git/Storage.java | 53 ++++++++++++++++++-------- src/test/java/git/StorageTest.java | 53 ++++++++++++++++++++++++++ src/test/java/grocery/GroceryTest.java | 31 +++++++++++++++ 3 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 src/test/java/git/StorageTest.java diff --git a/src/main/java/git/Storage.java b/src/main/java/git/Storage.java index 5f86bf4266..3b7458ab6c 100644 --- a/src/main/java/git/Storage.java +++ b/src/main/java/git/Storage.java @@ -45,6 +45,7 @@ public void saveGroceryFile(List groceries) { e.printStackTrace(); } } + /** * Loads groceries from the file. * @return groceryList loaded from the file. If file does not exist, returns an empty groceryList. @@ -76,12 +77,14 @@ public GroceryList loadGroceryFile(){ } return groceryList; } + /** * Parses a string from the file into a grocery object. + * * @param line The string to parse. * @return The parsed grocery object. Returns null if file is corrupted. */ - private Grocery parseGrocery(String line) { + public Grocery parseGrocery(String line) { String[] parts = line.split(" \\| "); if (parts.length != 7) { return null; @@ -92,21 +95,7 @@ private Grocery parseGrocery(String line) { String expiration = parts[3].equals("null") ? "" : parts[3].trim(); String category = parts[4].equalsIgnoreCase("") ? "" : parts[4].trim().toUpperCase(); double cost = parts[5].equalsIgnoreCase("null") ? -1 : Double.parseDouble(parts[5].trim()); - - Location location = null; - String locString = parts[6].strip(); - if (!locString.equalsIgnoreCase("null")) { - try { - location = LocationList.findLocation(locString); - } catch (NoSuchObjectException e) { - try { - LocationList.addLocation(locString); - location = LocationList.findLocation(locString); - } catch (GitException ignore) { - assert !locString.isBlank() : "No empty strings at this point."; - } - } - } + Location location = parseGroceryLocation(parts[6].strip()); Grocery grocery = new Grocery(name); if (amount != -1) { @@ -129,6 +118,31 @@ private Grocery parseGrocery(String line) { return grocery; } } + + /** + * Parses the String containing location information into the location, if there is one. + * + * @param locString String containing information about a location. + * @return Location object. + */ + public Location parseGroceryLocation(String locString) { + Location location = null; + if (!locString.equalsIgnoreCase("null")) { + try { + location = LocationList.findLocation(locString); + } catch (NoSuchObjectException e) { + try { + LocationList.addLocation(locString); + location = LocationList.findLocation(locString); + } catch (GitException ignore) { + assert !locString.isBlank() : "No empty strings at this point."; + } + } + } + + return location; + } + /** * Wipes the contents of the specified file. * @@ -144,6 +158,7 @@ private void wipeFile(File file) { e.printStackTrace(); } } + /** * Saves the current list of recipes to the file. * @param recipeArr The list of recipes to save. @@ -164,6 +179,7 @@ public void saveRecipeFile(ArrayList recipeArr) { e.printStackTrace(); } } + /** * Loads recipes from the file. * @return recipeList loaded from the file. If file does not exist, returns an empty recipeList. @@ -194,6 +210,7 @@ public RecipeList loadRecipeFile(){ } return recipeList; } + /** * Parses a string from the file into a Recipe object. * @@ -213,6 +230,7 @@ private Recipe parseRecipe(String line) { return new Recipe(title, ingredientsList, stepsList); } } + /** * Saves the current user profile to the file. * @param userInfo The user profile to save. @@ -231,6 +249,7 @@ public void saveProfileFile(UserInfo userInfo) { e.printStackTrace(); } } + /** * Loads the user profile from the file. * @return userInfo loaded from the file. If file does not exist, returns an empty userInfo. @@ -261,6 +280,7 @@ public UserInfo loadProfileFile(){ } return userInfo; } + /** * Parses a string from the file into a userInfo object. * @@ -302,6 +322,7 @@ private boolean parseProfile(String line, UserInfo userInfo) throws GitException } return true; } + /** * Checks if the user's profile file exists. * diff --git a/src/test/java/git/StorageTest.java b/src/test/java/git/StorageTest.java new file mode 100644 index 0000000000..d3b33ebfce --- /dev/null +++ b/src/test/java/git/StorageTest.java @@ -0,0 +1,53 @@ +package git; + +import exceptions.GitException; +import grocery.Grocery; +import grocery.location.Location; +import grocery.location.LocationList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; + +public class StorageTest { + @Test + public void parseGrocery_success() { + String groceryString = "Meat | 0 | null | 2024-04-14 | Meat | 0.00 | bottom freezer "; + Storage storage = new Storage(); + Grocery grocery = storage.parseGrocery(groceryString); + String expectedGrocery = "Meat (MEAT), amount: 0 grams, expiration: 2024-04-14, cost: $0.00, location: bottom freezer"; + assertEquals(expectedGrocery, grocery.printGrocery()); + } + + @Test + public void parseGrocery_invalidFormat_returnsNull() { + String groceryString = "Meat | 0 | null | 2024 | bottom freezer "; + Storage storage = new Storage(); + Grocery grocery = storage.parseGrocery(groceryString); + assertNull(grocery); + } + + @Test + public void parseGroceryLocation_success() { + String locString = "burger stand"; + try { + LocationList.addLocation(locString); + Location expectedLocation = LocationList.findLocation(locString); + + Storage storage = new Storage(); + Location actualLocation = storage.parseGroceryLocation(locString); + assertEquals(expectedLocation.getName(), actualLocation.getName()); + } catch (GitException ignore) { + fail("parseGroceryLocation should not fail."); + } + } + + @Test + public void parseGroceryLocation_noLocation_returnsNull() { + String locString = "null"; + Storage storage = new Storage(); + Location location = storage.parseGroceryLocation(locString); + assertNull(location); + } +} diff --git a/src/test/java/grocery/GroceryTest.java b/src/test/java/grocery/GroceryTest.java index ec345dd445..bdef931431 100644 --- a/src/test/java/grocery/GroceryTest.java +++ b/src/test/java/grocery/GroceryTest.java @@ -1,6 +1,7 @@ package grocery; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import grocery.location.Location; import org.junit.jupiter.api.Test; @@ -92,4 +93,34 @@ public void printGrocery_correctAmtAndExpAndCost() { + LocalDate.now().plusDays(1) + ", cost: $1.20, location: Pantry"; assertEquals(message, grocery.printGrocery()); } + + @Test + public void toSaveFormat_success() { + Grocery grocery = new Grocery("chicken", 1, 0, LocalDate.now().plusDays(1), "meat",1.20,new Location("Pantry")); + String formattedGrocery = grocery.toSaveFormat(); + String expectedFormat = "chicken | 1 | null | 2024-04-15 | meat | 1.20 | Pantry "; + assertEquals(expectedFormat, formattedGrocery); + } + + + @Test + public void toSaveFormat_noAmountOrCost_success() { + Grocery grocery = new Grocery("burger"); + String formattedGrocery = grocery.toSaveFormat(); + String expectedFormat = "burger | null | null | null | | null | null "; + assertEquals(expectedFormat, formattedGrocery); + } + + @Test + public void setExpirationOnLoad_success() { + Grocery grocery = new Grocery("airplane food"); + String expString = "2024-10-11"; + grocery.setExpirationOnLoad(expString); + + LocalDate actualDate = grocery.getExpiration(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String actualDateString = actualDate.format(formatter); + String expectedDateString = "2024-10-11"; + assertEquals(expectedDateString, actualDateString); + } } From 0751d8a0950c087be6366e49b242b5fc5769d8d3 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 17:10:16 +0800 Subject: [PATCH 302/339] Fix checkstyle issues --- src/test/java/git/StorageTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/git/StorageTest.java b/src/test/java/git/StorageTest.java index d3b33ebfce..2770ed3ba1 100644 --- a/src/test/java/git/StorageTest.java +++ b/src/test/java/git/StorageTest.java @@ -16,7 +16,8 @@ public void parseGrocery_success() { String groceryString = "Meat | 0 | null | 2024-04-14 | Meat | 0.00 | bottom freezer "; Storage storage = new Storage(); Grocery grocery = storage.parseGrocery(groceryString); - String expectedGrocery = "Meat (MEAT), amount: 0 grams, expiration: 2024-04-14, cost: $0.00, location: bottom freezer"; + String expectedGrocery = "Meat (MEAT), amount: 0 grams, expiration: 2024-04-14, " + + "cost: $0.00, location: bottom freezer"; assertEquals(expectedGrocery, grocery.printGrocery()); } From 879b948b9aa441b615d2b889536bcaa2b2274c2e Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 20:45:14 +0800 Subject: [PATCH 303/339] Add new test cases --- docs/UserGuide.md | 3 +- src/main/java/git/Ui.java | 2 +- src/main/java/recipe/RecipeList.java | 2 +- src/test/java/recipe/RecipeListTest.java | 38 ++++++++++++++++++++++++ src/test/java/recipe/RecipeTest.java | 1 - 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/test/java/recipe/RecipeListTest.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d63108b5d9..0e9c971af0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -732,7 +732,8 @@ Target calories intake: 1655   ## Recipe management mode - +* All keyword passed in are not case-sensitive. +* Duplicated recipe title with different capitalization will not be not accepted. ### Adding a new recipe: `add` Adds new recipe, ingredient and steps. diff --git a/src/main/java/git/Ui.java b/src/main/java/git/Ui.java index 171dbfae79..d6f848c13d 100644 --- a/src/main/java/git/Ui.java +++ b/src/main/java/git/Ui.java @@ -257,7 +257,7 @@ public static void displayHelpForRecipe() { "add: add a new recipe. \n" + "list: list all your recipes. \n" + "view: view your recipes details.\n" + - "find: list the recipe(s) with given word.\n" + + "find: list the recipe(s) with given key.\n" + "delete: delete the recipe. \n" + "switch: switches the mode.\n" + "exit: exits the program.\n" + diff --git a/src/main/java/recipe/RecipeList.java b/src/main/java/recipe/RecipeList.java index 96a266e8f7..1611e3d694 100644 --- a/src/main/java/recipe/RecipeList.java +++ b/src/main/java/recipe/RecipeList.java @@ -24,7 +24,7 @@ public RecipeList() { /** * Adds a recipe to the recipe list. - * + * Parser will not allow duplicated recipe. * @param recipe Recipe to be added. */ public void addRecipe(Recipe recipe) { diff --git a/src/test/java/recipe/RecipeListTest.java b/src/test/java/recipe/RecipeListTest.java new file mode 100644 index 0000000000..8085c714f1 --- /dev/null +++ b/src/test/java/recipe/RecipeListTest.java @@ -0,0 +1,38 @@ +package recipe; + +import exceptions.nosuch.NoSuchObjectException; +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.assertThrows; + +public class RecipeListTest { + @Test + public void addRecipe_success() throws NoSuchObjectException { + String title = "Egg"; + ArrayList ingredients = new ArrayList(); + ingredients.add("egg"); + ingredients.add("salt"); + ArrayList steps = new ArrayList(); + steps.add("Fry." ); + steps.add("Serve."); + Recipe recipe = new Recipe(title, ingredients, steps); + RecipeList recipeArr = new RecipeList(); + recipeArr.addRecipe(recipe); + assertEquals(recipe, recipeArr.getRecipe("Egg")); + } + + @Test + public void getRecipe_NoSuchObjectException(){ + String title = "Egg"; + ArrayList ingredients = new ArrayList(); + ingredients.add("egg"); + ingredients.add("salt"); + ArrayList steps = new ArrayList(); + steps.add("Fry." ); + steps.add("Serve."); + Recipe recipe = new Recipe(title, ingredients, steps); + RecipeList recipeArr = new RecipeList(); + assertThrows(NoSuchObjectException.class, () -> recipeArr.getRecipe("egg"), "No Such Recipe"); + } +} diff --git a/src/test/java/recipe/RecipeTest.java b/src/test/java/recipe/RecipeTest.java index 4feba7ba9a..6199444c67 100644 --- a/src/test/java/recipe/RecipeTest.java +++ b/src/test/java/recipe/RecipeTest.java @@ -1,7 +1,6 @@ package recipe; import org.junit.jupiter.api.Test; - import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; From 56d82a363802faf67dbcdab82d7febbb978ef370 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 20:48:54 +0800 Subject: [PATCH 304/339] Edit test case --- src/test/java/recipe/RecipeListTest.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/test/java/recipe/RecipeListTest.java b/src/test/java/recipe/RecipeListTest.java index 8085c714f1..7fd73d5a13 100644 --- a/src/test/java/recipe/RecipeListTest.java +++ b/src/test/java/recipe/RecipeListTest.java @@ -21,18 +21,4 @@ public void addRecipe_success() throws NoSuchObjectException { recipeArr.addRecipe(recipe); assertEquals(recipe, recipeArr.getRecipe("Egg")); } - - @Test - public void getRecipe_NoSuchObjectException(){ - String title = "Egg"; - ArrayList ingredients = new ArrayList(); - ingredients.add("egg"); - ingredients.add("salt"); - ArrayList steps = new ArrayList(); - steps.add("Fry." ); - steps.add("Serve."); - Recipe recipe = new Recipe(title, ingredients, steps); - RecipeList recipeArr = new RecipeList(); - assertThrows(NoSuchObjectException.class, () -> recipeArr.getRecipe("egg"), "No Such Recipe"); - } } From d147cd2dbe46df721fa94db57d372839852c8cd3 Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 20:59:51 +0800 Subject: [PATCH 305/339] Gradle Check --- src/test/java/recipe/RecipeListTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/recipe/RecipeListTest.java b/src/test/java/recipe/RecipeListTest.java index 7fd73d5a13..f82020f927 100644 --- a/src/test/java/recipe/RecipeListTest.java +++ b/src/test/java/recipe/RecipeListTest.java @@ -4,7 +4,6 @@ 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.assertThrows; public class RecipeListTest { @Test From 175289a7dd36446dd9352fa7e66aa78ef69fdba0 Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Sun, 14 Apr 2024 21:20:20 +0800 Subject: [PATCH 306/339] Update Dev Guide and add sample data for testers --- docs/DeveloperGuide.md | 111 ++++++++++++++++++++++++------------- sampleData/groceryList.txt | 12 ++++ 2 files changed, 83 insertions(+), 40 deletions(-) create mode 100644 sampleData/groceryList.txt diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index de46478564..629da6d6b4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,9 +1,20 @@ # Developer Guide +- [Acknowledgements](#acknowledgements) +- [Design & Implementation](#design--implementation) + - [Designs](#_designs_) + - [Implementation](#_implementation_) +- [Product Scope](#product-scope) + - [Target user profile](#target-user-profile) + - [Target user profile](#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} -This project makes use of several open-source software and libraries. We acknowledge and are grateful to the community for these contributions: +Grocery in Time (GiT) makes use of several open-source software and libraries. We acknowledge and are grateful to the community for these contributions: ### Libraries @@ -43,37 +54,36 @@ This project makes use of several open-source software and libraries. We acknowl We would like to thank the developers and contributors of these projects for their efforts in maintaining such useful resources. Their hard work and dedication make software development more efficient and error-free. -## Design & implementation - -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +## Design & Implementation ### _Designs_ ### 1. Execute different commands based on the modes ![Execute different commands](./diagrams/executeCommand.png) -* when 'executeCommand' is executed in Parser, different methods in Parser will be self invoked based on the selected mode. -* if mode is `grocery`, execute `groceryManagement` -* if mode is `calories`, execute `caloriesManagement` -* if mode is `profile`, execute `profileManagement` -* if mode is `recipe`, execute `recipeManagement` +* When `executeCommand` is executed in `Parser`, different methods will be self invoked based on the selected mode. + * If mode is `grocery`, execute `groceryManagement`. + * If mode is `calories`, execute `caloriesManagement`. + * If mode is `profile`, execute `profileManagement`. + * If mode is `recipe`, execute `recipeManagement`. + +The following is a class diagram containing Food, FoodList and UserInfo. -The following is a class diagram containing Food, FoodList and UserInfo ![Food, FoodList, UserInfo](./diagrams/UserInfo.png) ### 2. Calories Management Mode ![Commands for managing calories](./diagrams/caloriesManagement.png) - * when `caloriesManagement` is executed in Parser, different actions will be carried out based on the commands. - * if `eat`, store the name and calories of the input food - * if `view`, display all the foods consumed +* When `caloriesManagement` is executed in `Parser`, different actions will be carried out based on the commands. + * If `eat`, store the name and calories of the input food. + * If `view`, display all the foods consumed. ### 3. Profile Management Mode ![Commands for managing profile](./diagrams/profileManagement.png) - * when `profileManagement` is executed in Parser, different actions will be carried out based on the commands. - * if `update`, store the user data required for calories calculation. - * if `view`, display user information +* When `profileManagement` is executed in `Parser`, different actions will be carried out based on the commands. + * If `update`, store the user data required for calories calculation. + * If `view`, display user information. ### 4. Grocery Management Mode ![Commands for managing grocery](./diagrams/groceryManagement.png) -* different methods in Parser will be self invoked based on the index of the command in enum class GroceryCommand. +* Different methods in Parser will be self invoked based on the index of the command in enum class GroceryCommand. #### 4.1 addOrDelGrocery ![addOrDelGrocery](./diagrams/addOrDelGrocery.png) @@ -86,6 +96,7 @@ To edit the information of an existing grocery. #### 4.3 viewListOrHelp ![viewListOrHelp](./diagrams/viewListOrHelp.png) +### _Implementation_ ### 1. View all groceries added * When the command entered is `list`, `listGroceries()` in GroceryList will be executed. @@ -98,7 +109,7 @@ To edit the information of an existing grocery. * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. * Else, create a new array list name `groceriesByCost` with type `Grocery`. * Assign all the values in current grocery list `groceries` to `groceriesByCost`. - * Execute `sort` in `groceriesByCost` with a lambba function that compares the `getCost()` value of each Grocery in the list. + * Execute `sort` in `groceriesByCost` with a lambda function that compares the `getCost()` value of each Grocery in the list. * Then execute `Collections.reverse(groceriesByCost)` to reverse the list so that the cost is sorted in descending order. * Lastly, execute `printGroceryList(groceriesByCost)` in GroceryUi.   @@ -172,18 +183,17 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as   ### 11. Editing expiration date after it is added - * In GroceryList class, modified the editExpiration method to parse String into localdate. + * In GroceryList class, modified the editExpiration method to parse String into LocalDate. * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameter: 1. details: String — User input read from `Scanner`. * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. -## Product scope +## Product Scope ### Target user profile Our target user is someone who regularly goes grocery shopping, and would like to track and manage their inventory of groceries. - ### Value proposition Grocery in Time aims to act as an easy-to-use central database for all the user's groceries. Managing many groceries stored at different locations around the house can get confusing, @@ -193,32 +203,53 @@ Users are able to edit and manage the category, amount, expiration date, and sto When groceries are running low, the app can generate a shopping list to remind users of what they need to buy. Furthermore, the app can generate a list of items that are expiring soon, reminding users to consume their groceries as soon as possible. +GiT also comes with other modes for recipe management and calorie tracking. + ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|-------------------------------|---------------------------------------------|---------------------------------------------------------| -| v1.0 | new user | see instructions on how to use the app | refer to them when I forget how to use the application | -| v1.0 | user | add groceries to the app | manage all my groceries | -| v1.0 | user | view all my groceries | know what I have bought | -| v1.0 | user | delete groceries from the list | stop tracking those groceries | -| v1.0 | user | add the amount of a grocery | keep track of the amount of that item I have | -| v1.0 | user | add the expiration date of the grocery | keep track of when my items expire easily | -| v2.0 | financially-aware user | add the cost of the groceries | know how much I am spending | -| v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | -| v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | -| v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | -| v2.0 | user who replenishes groceries| set threshold amount for the groceries | know what groceries I should top up | -| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | -| v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | +| Version | As a ... | I want to ... | So that I can ... | +|---------|--------------------------------|-----------------------------------------------------|---------------------------------------------------------| +| v1.0 | new user | see instructions on how to use the app | refer to them when I forget how to use the application | +| v1.0 | user | add groceries to the app | manage all my groceries | +| v1.0 | user | view all my groceries | know what I have bought | +| v1.0 | user | delete groceries from the list | stop tracking those groceries | +| v1.0 | user | add the amount of a grocery | keep track of the amount of that item I have | +| v1.0 | user | add the expiration date of the grocery | keep track of when my items expire easily | +| v2.0 | user who consumes groceries | track the usage of my groceries | know how much I have left | +| v2.0 | financially-aware user | track and view the cost of my groceries | know how much I am spending | +| v2.0 | health-conscious user | categorise my groceries | know what types of groceries I have | +| v2.0 | user with many storage spaces | add the location of where an item is stored | see where I keep my groceries | +| v2.0 | user with many storage spaces | find out what groceries are stored in each location | know where to find my groceries | +| v2.0 | forgetful user | get a list of groceries that are low in stock | remind myself to buy them on my next grocery trip | +| v2.0 | forgetful user | find my groceries by name | know if I have tracked that grocery | +| v2.0 | user who replenishes groceries | set threshold amount for the groceries | know what groceries I should top up | +| v2.0 | user who cooks with recipes | create and keep my own version of recipes | refer to my own recipes when I cook | +| v2.0 | health-conscious user | store the calories of the food I consumed | track my calories intake and know how much I should eat | +| v2.0 | environmentally-conscious user | get a list of items that are expiring soon | prioritise using them to reduce food waste | +| v2.0 | reviewer | rate and review products | know if I like them | +| v2.0 | meticulous user | add remarks to my groceries | know extra information about my groceries | +| v2.1 | user | store my past grocery information | access information about the groceries I am tracking | ## Non-Functional Requirements -{Give non-functional requirements} +* GiT is able to handle large amounts of data, stored in `/data/groceryList.txt`. +* GiT should be easy for a new user to grasp, and allow experienced users to use different functionalities quickly. ## Glossary -* *glossary item* - Definition +* *Java* - Object-oriented programming language used to create Grocery in Time. +* *Command Line Interface* - Text-based user interface to allow users to interact with Grocery in Time. ## 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} +First, testers can install GiT by following these instructions: + +1. Ensure that you have Java 11 or above installed. +2. Down the latest version of `Grocery in Time` from [here](https://github.com/AY2324S2-CS2113-T12-2/tp/releases). +3. Open a command terminal, `cd` into the folder where the JAR file is + and use `java -jar Git.jar` to run Grocery in Time. + +To get you started, we have provided some sample data [here](https://github.com/AY2324S2-CS2113-T12-2/tp/tree/master/sampleData). +To load this data into GiT, simply move `groceryList.txt` into the `/data` directory that will be created in the same directory as `Git.jar` after running it at least once. + +Do check out our [User Guide](UserGuide.md) to see what functionalities GiT offers. Happy testing! \ No newline at end of file diff --git a/sampleData/groceryList.txt b/sampleData/groceryList.txt new file mode 100644 index 0000000000..0b55a012e0 --- /dev/null +++ b/sampleData/groceryList.txt @@ -0,0 +1,12 @@ +Meat | 0 | null | 2024-04-14 | MEAT | 0.00 | bottom freezer +milk | 50 | 6 | 2024-12-10 | DAIRY | 5.00 | fridge +mustard | 10 | 2 | 2024-12-10 | SAUCE | 3.75 | fridge +ketchup | 5 | 2 | 2025-11-10 | SAUCE | 3.75 | fridge +eggs | 20 | 2 | 2024-05-01 | SAUCE | 15.00 | fridge +chicken breast | 15 | 10 | 2024-05-01 | MEAT | 6.25 | bottom freezer +paprika | 100 | 20 | 2026-01-01 | SPICES | 5.49 | cabinet +star anise | 25 | 20 | 2026-01-01 | SPICES | 5.49 | cabinet +cinnamon sticks | 100 | 20 | 2026-01-01 | SPICES | 5.49 | cabinet +pasta | 500 | 200 | 2025-01-01 | CARBS | 3.35 | shelf +rice | 2000 | 500 | 2025-01-01 | CARBS | 7.57 | shelf +soup cans | 6 | 2 | 2027-01-01 | SOUP | 3.35 | shelf \ No newline at end of file From 532fa9a6edd4cc3defb1e9c917908135d4af184b Mon Sep 17 00:00:00 2001 From: SharlynLui Date: Sun, 14 Apr 2024 22:11:24 +0800 Subject: [PATCH 307/339] Updated PPP (left DG and Repolink to be added) --- docs/team/luozihui2003.md | 2 +- docs/team/sharlynlui.md | 38 +++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/docs/team/luozihui2003.md b/docs/team/luozihui2003.md index 3a6028f728..249a7556e6 100644 --- a/docs/team/luozihui2003.md +++ b/docs/team/luozihui2003.md @@ -1,7 +1,7 @@ # Zi Hui's Project Portfolio Page ## Project: Grocery in Time Grocery in Time is a desktop application used for keeping track of groceries. -The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. +The user interacts with it using a CLI. It is written in Java and has about 7 kLoC. ## Summary of contributions * New Feature: Added the "Find Grocery" function. *What it does: enables users to find groceries from the list of groceries. diff --git a/docs/team/sharlynlui.md b/docs/team/sharlynlui.md index cd4f951956..9ca4020839 100644 --- a/docs/team/sharlynlui.md +++ b/docs/team/sharlynlui.md @@ -2,26 +2,38 @@ ## Project: Grocery in Time Grocery in Time is a desktop application used for keeping track of groceries. -The user interacts with it using a CLI. It is written in Java and has about 4 kLoC. +The user interacts with it using a CLI. It is written in Java and has about 7 kLoC. ## Summary of contributions -* **New Class:** Added the Recipe class and RecipeList class. - *What it does: allow user to add recipes with title, ingredients and steps in the application. - *Justification: user will be able to record their own recipes for easy viewing. -* **New Feature:** Added View Recipe, List Recipe, Add Recipe, Delete Recipe. - Justification: allow user to use to Recipe features in the application. -* **New Feature:** Added View Grocery -* **Code Contributed:** add link here +* **New Class:** Added the Recipe class and RecipeList class. + * What it does: allow user to manage recipes with title, ingredients and steps in the application. + * Justification: user will be able to record their own recipes for easy viewing. +* **New Feature:** Added View Recipe, List Recipe, Add Recipe, Edit Recipe, Delete Recipe, Find Recipe and View Recipe. + * Justification: allow user to use to manage recipes in the application. +* **New Class:** Added View Grocery. + * What it does: user can view all the details of the specific grocery. + * Justification: user might not remember what they have recorded for the recipe and might want to check the details. +* **New Class:** Added Remark and Edit Remark + * What it does: allow user to add a remark attached to the grocery to be displayed when viewed or listed. + * Justification: user can remind themselves instructions for these groceries e.g. to keep it for next week. +* **Code Contributed:** [RepoSense link]() * **Project management:** * Manged releases v1.0-v2.1 on GitHub * **Enhancements to existing features:** - * Extracted Calories Ui, GroceryUi, ProfileUi, RecipeUi from Ui + * Extracted Calories Ui, GroceryUi, ProfileUi, RecipeUi from Ui. + * Updated recipe feature to only add valid recipes and disallow duplicated recipes. + * Updated rate grocery feature to only accept valid inputs. + * Updated greetings to accept valid input as username. + * Cosmetic improvement made to the display of view recipe feature. * **Documentation:** * User Guide: + * Added documentation for Recipe Management: `add`, `list`, `view`, `find`, `edit`, `delete` ([#85](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/85/commits), [#175](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/175)) + * Added documentation for Grocery Management: `view` + * Categories the commands into 3 main category. ([#179](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/179)) * Developer Guide: * **Community:** - * PRs reviewed (ADDDD HERE GOOD PR) - * Reported bugs and suggestions for other teams in the class. (ADD IMAGE FOR PE) - * Fixed bugs on our team project. (ADD NUMBER) - * Identity bugs on our team project. (ADD NUMBER) + * PRs reviewed (example [1](https://github.com/nus-cs2113-AY2324S2/tp/pull/24), [#2](https://github.com/AY2324S2-CS2113-T12-2/tp/pull/24)) + * Reported bugs and suggestions for other teams in the class. + * Fixed bugs on our team project. ([#142](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/142),[#138](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/138), [#139](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/139), [#117](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/117), [#102](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/102), [#101](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/101), [#100](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/100), [#91](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/91)) + * Identity potential bugs on our team project. ([#158](https://github.com/AY2324S2-CS2113-T12-2/tp/issues/158)) From 0a97f0e605be7e51e4ea7622dc366ef3a6dd6d1c Mon Sep 17 00:00:00 2001 From: wallywallywally Date: Mon, 15 Apr 2024 00:12:27 +0800 Subject: [PATCH 308/339] Update Dev Guide --- docs/DeveloperGuide.md | 73 +++++++++++++----- docs/UserGuide.md | 17 ++-- docs/diagrams/Grocery.png | Bin 0 -> 69638 bytes docs/diagrams/Grocery.puml | 60 ++++++++++++++ docs/diagrams/GroceryAmt.png | Bin 0 -> 6958 bytes docs/diagrams/GroceryAmt.puml | 14 ++++ docs/diagrams/GroceryAmtGroceryList.png | Bin 8474 -> 0 bytes docs/diagrams/GroceryAmtGroceryList.puml | 13 ---- docs/diagrams/UserInfo.png | Bin 64211 -> 58184 bytes docs/diagrams/UserInfo.puml | 1 + docs/diagrams/groceryManagement.png | Bin 58456 -> 67320 bytes docs/diagrams/groceryManagement.puml | 9 ++- docs/diagrams/handleListOrHelp.png | Bin 0 -> 45348 bytes ...wListOrHelp.puml => handleListOrHelp.puml} | 14 ++-- docs/diagrams/handleLocationCommands.png | Bin 0 -> 33364 bytes docs/diagrams/handleLocationCommands.puml | 28 +++++++ docs/diagrams/useAmt.png | Bin 24764 -> 24784 bytes docs/diagrams/useAmt.puml | 20 ++--- docs/diagrams/viewListOrHelp.png | Bin 48914 -> 0 bytes src/main/java/grocery/GroceryList.java | 1 + 20 files changed, 190 insertions(+), 60 deletions(-) create mode 100644 docs/diagrams/Grocery.png create mode 100644 docs/diagrams/Grocery.puml create mode 100644 docs/diagrams/GroceryAmt.png create mode 100644 docs/diagrams/GroceryAmt.puml delete mode 100644 docs/diagrams/GroceryAmtGroceryList.png delete mode 100644 docs/diagrams/GroceryAmtGroceryList.puml create mode 100644 docs/diagrams/handleListOrHelp.png rename docs/diagrams/{viewListOrHelp.puml => handleListOrHelp.puml} (73%) create mode 100644 docs/diagrams/handleLocationCommands.png create mode 100644 docs/diagrams/handleLocationCommands.puml delete mode 100644 docs/diagrams/viewListOrHelp.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 629da6d6b4..44ea7e3f51 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -3,7 +3,26 @@ - [Acknowledgements](#acknowledgements) - [Design & Implementation](#design--implementation) - [Designs](#_designs_) + - [1. Execute different commands based on the modes](#1-execute-different-commands-based-on-the-modes) + - [2. Calories Management Mode](#2-calories-management-mode) + - [3. Profile Management Mode](#3-profile-management-mode) + - [4. Grocery Management Mode](#4-grocery-management-mode) + - [4.1 addOrDelGrocery](#41-addordelgrocery) + - [4.2 editGrocery](#42-editgrocery) + - [4.3 handleLocationCommands](#43-handlelocationcommands) + - [4.4 handleListOrHelp](#44-handlelistorhelp) - [Implementation](#_implementation_) + - [1. View all groceries add](#1-view-all-groceries-added) + - [2. List the groceries by price in descending order](#2-list-the-groceries-by-price-in-descending-order) + - [3. Input category for each grocery added](#3-input-category-for-each-grocery-added) + - [4. Input amount for each grocery added](#4-input-amount-for-each-grocery-added) + - [5. Input the location of where each grocery is stored](#5-input-the-location-of-where-each-grocery-is-stored) + - [6. Edit grocery amount after using a grocery](#6-edit-grocery-amount-after-using-a-grocery) + - [7. Edit the cost of a grocery after adding](#7-edit-the-cost-of-a-grocery-after-adding) + - [8. Edit the threshold amount of a grocery after adding](#8-edit-the-threshold-amount-of-a-grocery-after-adding) + - [9. View a list of groceries low in stock](#9-view-a-list-of-groceries-low-in-stock) + - [10. Input expiration date of each grocery when added](#10-input-expiration-date-of-each-grocery-when-added) + - [11. Editing expiration date after it is added](#11-editing-expiration-date-after-it-is-added) - [Product Scope](#product-scope) - [Target user profile](#target-user-profile) - [Target user profile](#value-proposition) @@ -56,9 +75,10 @@ We would like to thank the developers and contributors of these projects for the ## Design & Implementation -### _Designs_ +## _Designs_ ### 1. Execute different commands based on the modes ![Execute different commands](./diagrams/executeCommand.png) + * When `executeCommand` is executed in `Parser`, different methods will be self invoked based on the selected mode. * If mode is `grocery`, execute `groceryManagement`. * If mode is `calories`, execute `caloriesManagement`. @@ -71,39 +91,59 @@ The following is a class diagram containing Food, FoodList and UserInfo. ### 2. Calories Management Mode ![Commands for managing calories](./diagrams/caloriesManagement.png) + * When `caloriesManagement` is executed in `Parser`, different actions will be carried out based on the commands. * If `eat`, store the name and calories of the input food. * If `view`, display all the foods consumed. ### 3. Profile Management Mode ![Commands for managing profile](./diagrams/profileManagement.png) + * When `profileManagement` is executed in `Parser`, different actions will be carried out based on the commands. * If `update`, store the user data required for calories calculation. * If `view`, display user information. ### 4. Grocery Management Mode + +Below is a class diagram showing the associations between the `Grocery`, `GroceryList`, `Location`, and `LocationList` classes. + +![Grocery, GroceryList, Location, LocationList](diagrams/Grocery.png) + +When `Parser` gets a user input related to the Grocery Management Mode, it executes `Parser-groceryManagement(commandPanrts)`. + ![Commands for managing grocery](./diagrams/groceryManagement.png) -* Different methods in Parser will be self invoked based on the index of the command in enum class GroceryCommand. + +Different methods in `Parser` will be self invoked based on the index of the command in enum class GroceryCommand. #### 4.1 addOrDelGrocery ![addOrDelGrocery](./diagrams/addOrDelGrocery.png) -To add a new grocery or delete an existing grocery. + +To add groceries or delete an existing grocery. #### 4.2 editGrocery ![editDelGrocery](./diagrams/editGrocery.png) + To edit the information of an existing grocery. -#### 4.3 viewListOrHelp -![viewListOrHelp](./diagrams/viewListOrHelp.png) +#### 4.3 handleLocationCommands +![handleLocationCommands](./diagrams/handleLocationCommands.png) + +`LOC` and `DELLOC` adds and deletes storage locations. +`LISTLOC [LOCATION]` shows all locations or groceries at a given location, depending on whether a location was passed. + +#### 4.4 handleListOrHelp +![handleListOrHelp](./diagrams/handleListOrHelp.png) + +To list groceries according to different parameters, view help, switch modes, or exit from GiT. -### _Implementation_ +  +## _Implementation_ ### 1. View all groceries added * When the command entered is `list`, `listGroceries()` in GroceryList will be executed. * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. * Else, execute `printGroceryList(groceries)` in GroceryUi. -  ### 2. List the groceries by price in descending order * When the command entered is `listcost`, `sortByCost()` in GroceryList will be executed. * If the current grocery list, `groceries`, is empty, execute `printNoGrocery()` in GroceryUi. @@ -112,21 +152,19 @@ To edit the information of an existing grocery. * Execute `sort` in `groceriesByCost` with a lambda function that compares the `getCost()` value of each Grocery in the list. * Then execute `Collections.reverse(groceriesByCost)` to reverse the list so that the cost is sorted in descending order. * Lastly, execute `printGroceryList(groceriesByCost)` in GroceryUi. -  + ### 3. Input category for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'category' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the category of the grocery. Passed the category as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForCategory to prompt the user for the category of the grocery. * In Grocery class, modified the printGrocery method to include the category information in the output string. -  ### 4. Input amount for each grocery added * In Grocery class, modified the Grocery constructor to accept the 'amount' parameter. * In Parser class executeCommand method, modified the add command to prompt the user for the amount of grocery. Passed the amount as a parameter when creating a new Grocery object. * In Ui class, added a new method promptForAmount to prompt the user for the amount of grocery. * In Grocery class, modified the printGrocery method to print different units of measurement for different categories. -  ### 5. Input the location of where each grocery is stored * In Grocery class, modified the Grocery class to include location (String) as an attribute. * In Grocery class, modified the Grocery constructor to accept the 'location' parameter. @@ -136,11 +174,10 @@ To edit the information of an existing grocery. * In Ui class, modified the printGrocery method to print the 'location' of the grocery alongside the grocery name. * Alternative considered: Can possibly add location as enumeration however different people might store groceries in different places thus better to set as String so that user is free to input location details however specific they want. -  ### 6. Edit grocery amount after using a grocery * A `Grocery` stores its `amount` as an attribute. All `Grocery` objects are then stored in an ArrayList in `GroceryList`, which entirely handles the editing of the `amount`. -![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmtGroceryList.png) +![Grocery (showing amount) and GroceryList class diagram](./diagrams/GroceryAmt.png) * `GroceryList+editAmount()` is used to either decrease or directly set the `amount` of a `Grocery`. It takes in 2 parameters: 1. details: String — User input read from `Scanner`. @@ -153,35 +190,30 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as * Additional checks specific to `use` ensure that the user only inputs a valid `int`, or that the `amount` must not be 0 beforehand. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. -  -### 7. Edit the cost of a grocery after adding. +### 7. Edit the cost of a grocery after adding * when the command entered is `cost`, `editCost` in GroceryList will be executed. ![editCost sequence diagram](./diagrams/editCost.png) * Additional checks ensure that the user only inputs a valid `positive numeric` value. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. -  -### 8. Edit the threshold amount of a grocery after adding. +### 8. Edit the threshold amount of a grocery after adding * when the command entered is `th`, `editThreshold` in GroceryList will be executed. ![editThreshold sequence diagram](./diagrams/editThreshold.png) * Additional checks ensure that the user only inputs a valid `positive integer`. * Any exceptions thrown come with a message to help the user remedy their specific issue, as displayed by the `Ui`. -  ### 9. View a list of groceries low in stock * When the command entered is `low`, `listLowStocks` in GroceryList will be executed. * This will create a new array list called `lowStockGroceries` with type `Grocery` * For each grocery in the current grocery list, `groceries`, execute `grocery.isLow()`. Add the grocery into `lowStockGroceries` if the return value is true. * Execute `printLowStocks(lowStockGroceries)` in GroceryUi to print out the list. -  ### 10. Input expiration date of each grocery when added * In Grocery class, the expiration field in the Grocery class was changed from a String to a LocalDate to standardize date handling. * In Grocery class, the setExpiration method was updated to accept a String input, convert it to a LocalDate using a specified format ("yyyy-MM-dd"), and then store this date. - * In UI class, the UI now includes a multi-step process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. + * In UI class, the UI now includes a multistep process to prompt the user for the year, month, and day of the grocery item's expiration date. This process ensures that the date is captured in a user-friendly manner and stored accurately. * In GroceryList class, a new method, sortByExpiration, was added to allow sorting the list of groceries by their expiration dates in ascending order. This method utilizes the Collections.sort method with a lambda expression comparing the expiration dates of Grocery items. -  ### 11. Editing expiration date after it is added * In GroceryList class, modified the editExpiration method to parse String into LocalDate. * `GroceryList+editExpiration()` is used to directly set the `exp` of a `Grocery`. It takes in 1 parameter: @@ -189,6 +221,7 @@ Our app then executes `GroceryList+editAmount()` with parameter `use = true`, as * To edit the `exp` after using a `Grocery`, the user inputs `use GROCERY d/EXPIRATION_DATE`. +  ## Product Scope ### Target user profile diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d63108b5d9..b96dbbe845 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -12,7 +12,7 @@ It allows users to track and manage their groceries around their home easily. - [Quick start](#quick-start) - [Features](#features) - [Switching between different modes: `switch`](#switching-between-different-modes-switch) - - [Grocery management mode](#grocery-management-mode) + - [A. Grocery management mode](#a-grocery-management-mode) - [Viewing help: `help`](#viewing-help-help) - [Add / Edit / Delete Groceries](#add--edit--delete-groceries) - [Adding a new grocery: `add`](#adding-a-new-grocery-add) @@ -40,13 +40,13 @@ It allows users to track and manage their groceries around their home easily. - [Manage Storage Locations](#manage-storage-locations) - [Adding a storage location: `loc`](#adding-a-storage-location-loc) - [Removing a storage location: `delloc`](#removing-a-storage-location-delloc) - - [Calories management mode](#calories-management-mode) + - [B. Calories management mode](#b-calories-management-mode) - [Adding eaten food: `eat`](#adding-eaten-food-eat) - [Viewing all food and calories intake: `view`](#viewing-all-food-and-calories-intake-view) - - [Profile management mode](#profile-management-mode) + - [C. Profile management mode](#c-profile-management-mode) - [Updating user information: `update`](#updating-user-information-update) - [Viewing user details: `view`](#viewing-user-details-view) - - [Recipe management mode](#recipe-management-mode) + - [D. Recipe management mode](#d-recipe-management-mode) - [Adding a new recipe: `add`](#adding-a-new-recipe-add) - [Listing all recipes: `list`](#listing-all-recipes-list) - [Viewing a recipe: `view`](#viewing-a-recipe-view) @@ -97,7 +97,7 @@ Here are some ways you can maange your groceries!   -## Grocery management mode +## A. Grocery management mode > #### Notes about this mode > * Features requiring the `GROCERY` or `LOCATION` inputs are case-insensitive. @@ -633,7 +633,7 @@ Location: freezer has been removed from tracking!   -## Calories management mode +## B. Calories management mode ### Adding eaten food: `eat` Adds the food eaten and store its calories. @@ -665,9 +665,8 @@ You have consumed 452.0 calories for today ``` -   -## Profile management mode +## C. Profile management mode ### Updating user information: `update` Stores information needed to calculate and manage calories intake. @@ -731,7 +730,7 @@ Target calories intake: 1655   -## Recipe management mode +## D. Recipe management mode ### Adding a new recipe: `add` Adds new recipe, ingredient and steps. diff --git a/docs/diagrams/Grocery.png b/docs/diagrams/Grocery.png new file mode 100644 index 0000000000000000000000000000000000000000..8972ec34a45a2c243486c9d1ae765d04f8dfde8a GIT binary patch literal 69638 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/Grocery.puml b/docs/diagrams/Grocery.puml new file mode 100644 index 0000000000..e6d29b4b9a --- /dev/null +++ b/docs/diagrams/Grocery.puml @@ -0,0 +1,60 @@ +@startuml +skinparam classAttributeIconSize 0 +hide circle + +class GroceryList { + +addGrocery(grocery: Grocery) + +removeGrocery(name: String) + +getGrocery(name: String) + +edit...() + +findGroceries(key: String) + +viewGrocery(grocery: String) + +listGroceries() + +listLowStocks() + +sortByCost() + +sortByCategory() + +sortByExpiration() +} +note left: Each Grocery field can be\nedited using its respective edit...() + +class Grocery { + -name: String + -amount: int + -threshold: int + -expiration: LocalDate + -category: String + -unit: String + -cost: double + -rating: int + -review: String + -remark: String + -isSetCost: boolean + -isSetAmount: boolean + + +Grocery(name: String, amount: int, threshold: int, expiration: LocalDate, category: String, cost: double, location: Location) + +isLow(): boolean + +printGrocery(): String + +toSaveFormat(): String +} + +class Location { + -name: String + -groceries: List + +addGrocery(grocery: Grocery) + +removeGrocery(grocery: Grocery) + +listGroceries() + +clearLocation() +} + +class LocationList { + +addLocation(name: String) + +removeLocation(name: String) + +findLocation(name: String) + +listLocation() +} + +GroceryList "1" --> "*" Grocery : stores > +LocationList "1" -> "*" Location : contains > +Grocery "*" <---> "1" Location : stored in > + +@enduml \ No newline at end of file diff --git a/docs/diagrams/GroceryAmt.png b/docs/diagrams/GroceryAmt.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1c26e5091557b88c0394dea4d87eb6d61b0331 GIT binary patch literal 6958 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 A%K!iX literal 0 HcmV?d00001 diff --git a/docs/diagrams/GroceryAmt.puml b/docs/diagrams/GroceryAmt.puml new file mode 100644 index 0000000000..28530b7a39 --- /dev/null +++ b/docs/diagrams/GroceryAmt.puml @@ -0,0 +1,14 @@ +@startuml +skinparam classAttributeIconSize 0 +hide circle + +class GroceryList { + +editAmount(details: String, isUse: boolean) +} + +class Grocery { + -amount: int +} + +GroceryList "1" ---> "*" Grocery : stores > +@enduml \ No newline at end of file diff --git a/docs/diagrams/GroceryAmtGroceryList.png b/docs/diagrams/GroceryAmtGroceryList.png deleted file mode 100644 index 5fa5c43f00cf2762c37d7511f11b4b8b331d2f03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8474 zcmeHNcQ{=AmmlRNh)7XhBD_I}o~ThrbiwFG7twnsh!G?aWF&ft-i;Prw29~hqj#bO zBl>8=uvfg<{q3{++kN)gKX>PO=FXk(eDAsEd%ov<&N-huq3RF?a#A`{5C}xBq$sNi z0^xB0Z^kS5z=+Qly%q4m;UTBzVeahW<6vp!0aCDZvUD@^u(bH=na^J~9v&|4qP)B= z4rWdso{kPY=FW~@ecgYHDAluD5ONv9n498Vu@wM-kvX zzM_~_*6DAnP+pdD?<9l}+(oe*Pqm@OmqwhM zvnA(@RRzRz%ScZvQlhwOZ@aLaeyd;;sv#cL7 zh`ATKLc~-;62yPtSk#F0c!ZuacxPyF39qVrqB7$a=4F4|M8@feRoL@X2*ScqCI8FTqcckRU)fIMYn)*SO8WkOHSod(0O2m*%5;>n9=PYp*&7+4Z z{j}rJtu-$ht*(dCR(`7X2Z0zJlw==kKR4M(A=B2?nd}(QzOJr8E7xnULPDCrH2Wdk ziX)n8JU-sYe8_@BG&I4eeb7vxmvgpBrK^F3F6?xnSvi(Ks*9_Y&qJ{IpgUpga* zhv46x{M@gH;jj%pdsh9aI1W%cM`wTkn4tTh^V#X~N?!^m9!UGf#KeTYzJ8L;0XDJ- zI|zCyX5N=9l4OITcv;^X^aq*103g344 zf2}RvTBbDS9i#z)usS4Sb2Ag1ncg;OoBeF>jca|n&=jMNIA1n@twg4b#`=)ghvT)5 z(M^Bm??@rVGV}BAn>~?ssrdjkQDa_CmJ|@qH{4F3F|GC8K$!fI-z)`o?`+Ia1CIoB zzWgSmue)4Hv5aBdRaBYgEitaog%a9vp!$>9werOIEWX6?))-n=;M7@ZA6X6RH8QDd z1;XAeEiZeL_&;xH4m*+9mpK+7?VU|5h7#Mcp!#1eEG%@ccJ7uQCQDXo_rEpK4mMen z=nW(w#$101v-&wxUjv;p(XE<2Mi#fUzqc94&8ZLZJBhfH%cHV}vq}5nlu}uVlALk( zUO~qijDIqdnW^)faax$4FEj7BCb3o`W1kuF#5Ig;dS+(-LSlAy?mJa@P2J(sZJ9x8 zDsFd`-SN;+RsvCM$+^7Ctvl^A{AZ6;=Wi5w=1#G(xeFOk7Q(IXn#z&$6lcVC&ngT zr=+jMw(KWq7f;Tq^>SKv_3%aEmLrHokG+51Ot%~?4@~J1aN?}yj-_WNmrcC+hWxhI z+F;HtHVA5|NWTJbQe*Y*Z;AX0aJqYgQPI)RB0UW~y;_eoOjw{*xX}Grycy!Ne5ZT`ymP+>~Mhj^>FCWHdI%%d++Z!ZeWC zL^*MGDeI%f;SmvWBF)Xs9&Ma%7V2{C1zPv!d-^<#5N`-@D(TfW8#ucWgdE&qkESke zv_HTXnGOMVVqmiHW6(SGG}c?d{xAO-MJjM`%aTJ~fn|sgPA90z8PjE#qD=x9dJV7l z+CUGlAvw9AQZnro<>mP*$HP0_X z!eda`DWs6ut~B}c=g(9LzxIv}!xelI41eIH&u!Qrm=gG^ zGFMmRr#(&(cxLb;VW~_jIu9Ki*LE-(UR!v#+aUNF35f=A+O9m9T$0zM;W=k%OnQ3y zV#j;?=9|hXY-*`28pt#3dOQ4f8aQB9NZ}cLWo1Pyh3h2H>)|Hxaa^IbWHgqwKh;Fiw<0N)}y`a>v!U}#hH!rV0 z;bCwki+P?}8UyX|T!~&`^jkO_9u`I?;amAm&z+DD^0m~sKCbSWftgQvdf)N(e9JB& z9^qy11L)Z6=N|Y&XVhAxzX>xP;@-Te&8X z)?&NmA3rodU?0*(u4geVFa`E;rHFZ#XyrxJeYLf<#TWw7SI(f0k9*hE(?do^=C=|Z zw&jjUBPXt4xVFKO`ljsr>Oj`UWYthsde}?Y4;D7I4oRx|ea@MOdHn$BQTRS{(bSAG z(ePaU`kL$(tBRtM(t!0#4t#8)mbSLQv(~rcc?&{}B}Zm5KQf9E*a9BDXmwdPe`!ZX zPSeuTvK$OkUk1Q9$S70tgM3E#7+0^zE^(pf0>AxoGHNpe?fwAtB;7PtYRqk5U?5T> zvWs7HcDl)`<%~Be`{G;vTklegE>qmg)%4pnM*pND6*-rE^)yO($b($dnW zr>CnQyD2lCTW-1s(Otn1e6f@QgN%rNpR_x!)>!o>LGeI3t&>&u&NAQ`BhZ%=JRHb{ z7DWMy|BolGx3Tk|89_Q%Qcv){KlzWz?_Wm{@i5|R^e7pg9MZ8o(!x3!M1K+pie{T5 z{flh3QT*mkc`dhLward_aJA%Ajq}zV5=j@?sp|5z&Q`ZbtTkb8rT;xGe|vv_sY#>n z9Z`?x$IJ1{X@7ECt8Sip8_Vew`{;}?uZ@*53f`9Rjke1$6^U#PCVtN#A@E6LVZ#;ViIaJg?7h4#nzS!*=Gx6I1(9U9JZ77colKjYL*W%%NA7|+s?Gbq$ z9f_NE4~88utEvcj@cNUyf5c?8AvDczQ-rkIVZv<$p)=VvtNOSVdHmyccf*Tgw?f_G ze6AoS_qH%9ZDeWbmZ5WFY+T%r#l@_q>svtRC@CpcCJV*AjDX(G#Z_`l_8skK_h?F6Q z^@*V!e>ZR_41hQlH8tM*_aAwphj*8I3b+>BSNd=p&H>83LDd<+Il6h26n_#n>Bhmr z$~veK@A||KyO!6VDxrLH@GiZG8wEnB&h5^F_W*6^|uLz&m_-J_ZAkO;&lD6n6=?6mGt`8w^lP59B|lufj5-R-Pf;Qm$JTh z3{j!-RLvK67=K_84P>?aie#@VjyK5V&yG64c7_|ThOX7j@Z=doX{VoemfkvQEL z@6BmjM@Kse4~JDs<&e+Wm>3z$eYyDsoagXEO?|I-ZmxDO(1j+3HBQC%Y@)S~mZH@h z7Wwkw;wjZ_wo_GUaVXYdgpP7dF;dyuRJ85wu47ri`I*IbF@5*yS{r`0)Dr`a))t&-ivYGz%3_$UM6p|9J9#6~F5wb)MrGEa^phvzmhg zm(nwwi2il&)YS&3ZC`3S(}9GLJ`{jZfL~-pH@+>jm$ux$w}mDh-@HC)XXl=&;wLk8 zpVL74_)_;}(^{9uF$L0eL1E=u$}V9&f?U>?$rtA5WS6*uYKu(P{>+SHLBGE-J3EVh z9GkBiSLf_GQicD}<@*;yL(}f`$H7Im)s~YdZYzV3jQQF)bHXs3IYoTbslTPj4!01cSh5+q6@sc`}%U%LynG~(>53bW|v#>)2N;?pUl>3 zFl%|E3AWobNTSNSWAd!V7*b!tr{4RAu<0xLj<%j2<(L$MAgzY4i+b~A6_7y+jYSQs z*#))%ARtzcb{6eqQN@NeTgY>hn8TkF=Ek1->1}PQG!K8BETGZ^ey}z$>$RMc7 zrx4?Km>{%9NkK*yU0U4N(^KdYJ51;qqCC9eHt87~$Z@=y^C7lm&{{5G&q>gP7kDPzr)Q@ojmu! z`IZn{cJy?>`N>>(`YUvH*^^Lrf~e)TaGFAzQGw1IuC8rr!8&%N8X6j-R4CSEKv9#Q z{zvm6d>wyV9gc-zzJjKALqkI=DJbrU%GxWAwO1ng z!RHMLIVGV(Z^YX8`S@5>5~K_jZVr+tDpxF2wm8=G*pBHCArg7iAgSU?%#rb?u;Yv1 zb-h5S((OmO&wmz04?EO(Z6Lli$c?P#J%-+iW>a$-%qD^35m7Lxh{^S3s^;tw_a=b@ znmk7eVo^*$#uw0xlJOydXRLi1=roxTn&K<|lC2bNa|AKptgU_I^Od?L+a`N{YYXYR zD8Ei>6Yb`ouhI*dBB`EQsNAsA8Foey4Q|IqFbdkN+jZg_H)vcVHwIn^Wt@~4R=D&pVHr==G3eX|Y&TsC_`%5={&heAy zx^CUefh@sL?>YbYl0e(l<@I$j*y;2A&1;`t)2Top5e$taze|LRT0wBS)-|gftC5OT z`wjwmUopPrG*zv7tJee>H5lQx2>>N9+HRji|HwsZ?3)t!%O7AcSc32fgnLea(691ZY`Vw|{74@DGwUvs8-66u35&i!WyYmLa z$Ei3=DU2IEKl3n~Hu{T3X70@BPPW$L)-{DQDyi z(0;Em#Ik4RiOPhp-gSX~fvvz%@7og@7#K9c9Aa>BcQ-fmXt6Shgf9jlLe9Ml{O}`P zfQqMs!S5X*1D}PWhDPL-!D+d0YR|R7<+&Ur6%EZ8P#>_Rz1Rhs7syCZH{eIi&W*AP z3d)iBMndbL1@CC-zy*TEJ zWm8S^0Gic+(?v#FT3X&lOqAlMVruOxm__*Td-;z*mRTb4kLTZ|fAAFKY43ON^LQ`q zoGTas19ZHV!m#gfI2V9axzEK#xm@iy73HV>*KIM6)xUzOM}kNLVGWVku9LLoxjhzZ zCMG8INa4!z@;(4lq3H-lZb-_XRI4Ac0*TwD0XSvWPNz8ZjmJ}Vk6%lHXY>1U017LS zV4DP|0+FZ7yaFCEJqWDEdp2LNTP;8XjK0z>Ho)Pw0^*}N464$l(;1zIt0Cr)-R$H@ zwi|!`nGhQ*m!;rZAxl``vNm{612+GfW~pipXj$acN1T6-mznzSkC>ig$Ao8}XF*F% zm~0HW^REN@rUOQo0_C21UuX0qk5zR=Ma2|RPsN*>a)cq|w|}gyv3EmDi~y|8c)0W> zkf4Ao2mu=_G4@*sWm_e^ASF89Gt&HCg$;9~@Z1Zn6v7dDK(dj||M5^NYwhSzpiF19 zPiN$3@W%{<-eSX^oUpO7UZa0>{Q_qmW~Hb9B`MjYktL5Y*3-LkfsP5T0D=OHK&qsF zQqwsm5B&H7=w_w;M%x{@+3fR0_ywh+qyr8cG7=#{fKl&hflVjB zdNqdV3GTkMYmy%)m9`&%gg{JhondV%DMA>)!a4uLJNjcy{(j{Vq!?9z zFELX4W90T~M^r*W0yVe6>FElXZT+H`9Eg^xBF2_koS)%_7pv?>p1`zZ)$m6cRy$&y zX6lY-UUg#~zTg4hzJ2@lD_#I;{zBhDn8oh7vjbtD4Ta0E=HHS<+!evtQEL#Z6u8}} z(KohEQrvEZ48y+!^h?Y+IMtyzu64pj!Egg0^T2+dPK0T7l}lNMKvGc)XOYLxc#4v_Tu z`L$PBH{g@g`k2_-ua5ftcIroOi}mmwLM$x^ca_}~nVFe6$I|rYH1|>L*pQ+~9z`!X znp&L4OniA=$A#c>mIBy~{UG4k355^Ko_d^)$cBtajEKeR;xzdy7?BiMrh9-FAZE|+ z5>&tVJj3yEBZRN(%Td=YOqd=X?kcd9M{9>Bn|^m^q=o2jWGgHhBAv(q0XU^-Nc9;z+ZPzyE zXPeAJ3dpp4!INyC4B5E3E7cAq{0?nAoyI?90DI~rytBPMUS=K=r*-G$FD)JRm7hT9 zqQ(2rv%$?2N&(uH-yU|E-^zvPa>6z`}Ub93cTM8 zGL;0MedV_>kV$)^v{vv@vKNMH)CqpmHjY;4k(X7-r_w~mCngrizm4UDN*;X=&Qys7 z*knQbQ7&=uWLBVu{vVR50C)|de@<3$F85eu0u-5LPn>mMvPLlAOMp|f>LU9dr$7U0 zO`;JxCnp7u^SFHU<;#)NJ5p@t5ytqHDhAbB>TFfg2I?u4AI!4@?`wViWY)rCT<5XS zN|KZe=mqrcWKR-B+0%5Jo+XAgJffloKM0A5hxUt;wFCd&DKgS)-+~Et0*Ap7gT8fc8~m=Gpk7!RYa{RSdM(MqsH}XGP|=sMhO03sD@{qf$Bgi z9T|5l-F*}jLs=y~Wyrgr@#?-k;?=8H`N3-Ft8$4%X*2*68Vh}*u8!JS?5KJgn$rig z1X1~>0XWaac6fgpxU^66w`H={GbL}#Cu!fNa4z%TzD`G*Yk7d4Qm!w*Nx`5^P*5Zp z=E7Onz0ejuV#w=O^avp5_t(d?Oaa1-juzlT(jJ-<*($X|(j+DL_%vIqL_^2N$Mf^^ z2eK6GU8#Qi7C^0B(47V%3VR&u70K47zMFxNv;9VNINKId<&^4=kz`sa#+c zjWV&=k&c&190FgH1#E8`4<8>LwYIh05pk1k?P~8}3`j273#?U648` zkL~Zx!#$z3I>_m1Bhnu$EB|(PFcU9tsh{2se6TASZ&ssMf{o>noB;xq{0TWz*xr!ouX={khYMViRVV zd={&EV!_bu%jI=t*^u$7_AMJ5ItB(FMvT}cUd3dYDis6{fApjvGyLQmsUvcnSYgKi z*JiJntb_Xe+V~H<`?pY4Mjjp>vKF#~@0N6?pw8pxY3GDT2WQ^1om~lh{&sVnSCR}J zOAnoBE`gj68yhoAHuIlRowfUtY^IljpP-@cmw=U?M)V8S@o@r|&bFF&sow{f{b-R7 zRZO|phQTkT#eb)b=HbJK03BKcEuEF2kf^jBV!e?k-|(z03}`5^SZve& zs3AaEOG-+j(=Z;sT4AHuWfrP9F8x8^cOc4oe4Wl5E6>w;?pfL12y}gY57iH(L`6#s z*|lpXwJ!5H%JF?^V6Z>dV^FEJ;8+re83NkFdn6L#;_?ynN+f8;e$NZ3n>vO7Z3zBF z$St^?U2%Rrt#r8(K$g~LfafeWsFF>jD?1`frp(?2N z!lJN^=VvDZ@7}@Tj$iz^ZU@E7Pqs4VGv zCWM|%l@EQ?9JZ)?P*JR&!qq`-_z#m~2j15;0Xc=5ni_}_fXkbxzA+V-G8@BWvMm*? z2s|pBYIpplQ!R;-xkf<1 zIsCTpq;5VWHz&sjc=`Gw+?BbGZ!VH5r>EUO^?&GIg=YOXe)vya%7-do*#IwKdGaby z`4q0=x-U`qpUw}2(Or5TuwAZ;mtHSje8FY<@)s2>EiE|!o%@_ZIunp|?&Y);e+HP_ tf{6y*?hD7gL&$;mkA45YJuEl{KT2*+tbKI@_>Tezq$CHCEs=g2^e=edE%^Wd diff --git a/docs/diagrams/GroceryAmtGroceryList.puml b/docs/diagrams/GroceryAmtGroceryList.puml deleted file mode 100644 index 0b6bc75a30..0000000000 --- a/docs/diagrams/GroceryAmtGroceryList.puml +++ /dev/null @@ -1,13 +0,0 @@ -@startuml -skinparam classAttributeIconSize 0 - -class GroceryList -GroceryList : +editAmount(details : String, use : boolean) - -class Grocery -Grocery : -amount : int - -GroceryList "1" ---> "*" Grocery : stores > - - -@enduml \ No newline at end of file diff --git a/docs/diagrams/UserInfo.png b/docs/diagrams/UserInfo.png index a14c1dba5f3a0941f9c30cefce66f52ab479a5e7..13a074e0ae231421d9aa09bc8a825dffce373db4 100644 GIT binary patch literal 58184 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%0DO} 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