diff --git a/build.gradle b/build.gradle index ffdf33f5827..a08791b8b5a 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,7 @@ dependencies { } shadowJar { - archiveName = 'addressbook.jar' + archiveName = 'PH.jar' } defaultTasks 'clean', 'test' diff --git a/docs/AboutUs.md b/docs/AboutUs.md index bf49a3b2894..3c0af951f52 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,5 +1,6 @@ --- -layout: page title: About Us +layout: page +title: About Us --- We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg). diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 45b45215783..c84f1fe8d3d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -5,7 +5,7 @@ title: Developer Guide ## **Table of Contents** -* Table of Contents +* Table of Contents {:toc} -------------------------------------------------------------------------------------------------------------------- @@ -63,7 +63,7 @@ The rest of the App consists of four components. **How the architecture components interact with each other** The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues -the command `delete 1`. +the command `delete sid/123`. @@ -123,7 +123,7 @@ How the `Logic` component works: 1. The command can communicate with the `Model` when it is executed (e.g. to add a person). 1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. -The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete 1")` API +The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete sid/123")` API call. ![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png) @@ -368,7 +368,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Extensions** -* 3a. User does not confirm to clearing entries. +* 2a. User does not confirm to clearing entries. Use case ends. @@ -386,7 +386,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Extensions** -* 2a. Error occurs when saving new contact list +* 1a. Error occurs when saving new contact list * 2a1. **PH** reverts to old contact list before the execution of the command. @@ -394,13 +394,13 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -#### UC3: Searching for a guest/staff +#### UC3: Searching for a guest **MSS** -1. User keys in command to search for a specified guest or staff. +1. User keys in command to search for a specified guest. -2. **PH** shows the specified guest/staff that matches the user's query. +2. **PH** shows the specified guest that matches the user's query. Use case ends. @@ -410,19 +410,45 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -* 2a. No guest/staff found that matches user's query. +* 1b. No guest found that matches user's query. - * 2a1. **PH** shows message indicating no such guest/staff exists in the list. + * 1b1. **PH** shows message indicating no such guest exists in the list. Use case ends. -#### UC4: Editing fields of guests/staff +#### UC4: Searching for a staff + +Same as UC3 except that guest is replaced with staff. + +#### UC4: Searching for a staff + +**MSS** + +1. User keys in command to search for a specified guest. + +2. **PH** shows the specified guest that matches the user's query. + + Use case ends. + +**Extensions** + +* 1a. Contact list is empty. + + Use case ends. + +* 1b. No guest found that matches user's query. + + * 1b1. **PH** shows message indicating no such guest exists in the list. + + Use case ends. + +#### UC5: Editing fields of guest **MSS** -1. User keys in command to edit a particular field of a specified guest/ staff. +1. User keys in command to edit a particular field of a specified guest. -2. **PH** shows a success message to user which displays the new details of the guest/ staff. +2. **PH** shows a success message to user which displays the new details of the guest. Use case ends. @@ -432,9 +458,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -* 1b. No guest/staff found that matches user's query. +* 1b. No guest found that matches user's query. - * 1b1. **PH** shows message indicating no such guest/staff exists in the list. + * 1b1. **PH** shows message indicating no such guest exists in the list. Use case ends. @@ -444,13 +470,17 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -#### UC5: Adding guests/staff +#### UC6: Editing fields of staff + +Same as UC5 except that guest is replaced with staff. + +#### UC7: Adding guests **MSS** -1. User keys in command to add a guest or staff with unique passport numbers or staff IDs. +1. User keys in command to add a guest. -2. **PH** shows a success message to user which displays the added guest/staff in the list. +2. **PH** shows a success message to user which displays the added guest in the list. Use case ends. @@ -475,24 +505,33 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -#### UC6: Deleting guests/ staff +#### UC8: Adding staff + +Same as UC7 except that guest is replaced with staff. + +#### UC9: Deleting guest **MSS** -1. User asks **PH** to delete a guest/ staff +1. User asks **PH** to delete a guest -2. **PH** informs user that guest/ staff is deleted +2. **PH** informs user that guest is deleted Use case ends. **Extensions** -* 2a. No guest/staff found that matches user's query +* 2a. No guest found that matches user's query - * 2a1. **PH** informs user that the guest/ staff does not exist + * 2a1. **PH** informs user that the guest does not exist Use case ends. +#### UC10: Deleting staff + +Same as UC9 except that guest is replaced with staff. + + *{More to be added}* ### Non-Functional Requirements diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a1b044c2ae5..c1c6b3cf3bc 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,5 +1,6 @@ --- -layout: page title: User Guide +layout: page +title: User Guide ---

Welcome to the Pocket Hotel User Guide!

@@ -19,7 +20,7 @@ fully to integrate it within your hotel management system. ## **Table of Contents** -* Table of Contents +* Table of Contents {:toc} -------------------------------------------------------------------------------------------------------------------- @@ -46,16 +47,16 @@ The **GUI** similar to the below should appear in a few seconds. Note how the ap * **`list`** : Lists all contacts. - * **`add`**`n/John Doe pn/X12345678F r/123 e/johnd@example.com a/John street, block 123, #01-01` : Adds a guest + * **`add`**`n/John Doe pn/X12345678F r/123 e/johnd@example.com t/Senior Citizen` : Adds a guest named `John Doe` to the Address Book. * **`delete`**`pn/X12345678F` : Deletes the guest with passport number X12345678F. - * **`clear`** : Clears all contacts. + * **`clear`** : Clears all contacts. * **`exit`** : Exits the app. - -You may refer to the [Features](#features) below for details of each command and to get familiarized with the syntax of + +You may refer to the [features](#features) below for details of each command and to get familiarized with the syntax of the commands. -------------------------------------------------------------------------------------------------------------------- @@ -68,7 +69,7 @@ correctly. A quick overview of all the commands can be found in the [command summary.](#command-summary) -Certain commands require parameters, which may have certain constraints. A quick overview of all the underlying +Certain commands require parameters, which may have constraints. A quick overview of all the underlying constraints can be found in the [parameter constraints.](#parameter-constraints-summary)
@@ -81,7 +82,7 @@ constraints can be found in the [parameter constraints.](#parameter-constraints- * Parameter prefixes such as `n/` and `pn/` are special keywords that indicate a start of a parameter. * Fields with square brackets are optional.
- e.g `n/NAME [p/PHONE_NUMBER]` can be used as `n/Bing Cheng p/99999999` or as `n/Bing Cheng`. + e.g `n/NAME [t/TAG]` can be used as `n/Bing Cheng t/VIP` or as `n/Bing Cheng`. * Parameters can be in any order.
e.g. if the command specifies `n/NAME pn/PASSPORT_NUMBER`, `pn/PASSPORT_NUMBER n/NAME` is also acceptable. @@ -93,9 +94,17 @@ constraints can be found in the [parameter constraints.](#parameter-constraints- * Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit`) will be ignored.
e.g. if the command specifies `help 123`, it will be interpreted as `help`. +* Only one unique identifier can be used in a command. The unique identifier is used to identify if the contact is a staff or guest.
+### Contacts in Pocket Hotel +There are 2 types of contacts in _PH_, guests and staff. Guests represent guests of the hotel, and staff represent staff in the hotel. Guest are identified by their `PASSPORT_NUMBER` +and Staff are identified by their `STAFF_ID`. These fields are their unique identifier, and no two contacts can have the same unique identifier. + +It is possible for guests and staff ot have the same unique identifier for example, STAFF_ID of a guest is 111 and PASSPORT_NUMBER for a guest is 111, as they represent 2 different entities. + +Guests and staff have different parameters, which can be found in the [parameter constraints table.](#parameter-constraints-summary) ### Adding guests/staff : `add` Adds a new **guest** or **staff** and their contact details into **PH**. Each entity has their own unique fields. @@ -121,15 +130,15 @@ Example 2 (Add staff): ### Editing fields of guests/staff: `edit` -Edit a **guest** or **staff’s** contact details by their unique identifier (Guest are identified by their `PASSPORT_NUMBER` -and Staff are identified by their `STAFF_ID`). Only edits the fields that have been passed in as parameters. +Edit a **guest** or **staff’s** contact details by their _unique identifier_. Only edits the fields that have been passed in as parameters. Format:
Guest: `edit pn/ /`
Staff: `edit sid/ /` * Existing values will be updated to the input values. -* Note that when changing a guest of staff unique identifier, it is important that there is no pre-existing staff or +* You can edit more than one field at a time (See example below). +* Note that when changing a guest of staff unique identifier, it is important that there is no pre-existing staff or guest with that unique identifer already. Example 1 (Edit guest): @@ -139,14 +148,14 @@ Example 1 (Edit guest): Example 2 (Edit staff): -* `edit sid/123 p/99999999` locates the staff Jeremy, by his staff ID, 123 and overwrites the phone number - field with the new phone number provided. +* `edit sid/123 p/99999999 e/j@mailer.com` locates the staff Jeremy, by his staff ID, 123 and overwrites the phone number + field with the new phone number provided, and the email field with the new email provided. [Back to Table of Contents](#table-of-contents) ### Deleting guests/staff: `delete` -Deletes an existing **guest** or **staff** using their unique identifier (`PASSPORT_NUMBER` and `STAFF_ID` respectively). +Deletes an existing **guest** or **staff** using their _unique identifier_. Format:
Guest: `delete pn/` @@ -155,7 +164,7 @@ Format: Example 1 (Delete guest):
![GuestDeleteDiagram](images/GuestDeleteDiagram.png) -* `delete pn/XNOO19390 (PASSPORT_NUMBER)`, The guest, Jonny Jonny who has passport number XNOO19390, is deleted from ** +* `delete pn/XNOO19390`, The guest, Jonny Jonny who has passport number XNOO19390, is deleted from ** PH**. Example 2 (Delete staff): @@ -178,7 +187,7 @@ Format: `list` ### Viewing a particular guest/guest: `view` -Views the **staff** or **guest** by their unique identifier, `STAFF_ID` or `PASSPORT_NUMBER`. All the details associated with +Views the **staff** or **guest** by their _unique identifier_. All the details associated with the staff/guest will be shown in the **GUI**. Format: @@ -264,20 +273,20 @@ Action | Format, Examples Parameter | Prefix | Constraints, Examples ----------|--------|----------------------- -**PASSPORT_NUMBER** | `pn/` | Blank inputs are not allowed
Example: `pn/X12345678A` -**NAME** | `n/` | Blank inputs are not allowed, and should only contain alphabetical characters.
Example: `n/Bing Cheng` -**EMAIL** | `e/` | Blanks inputs are not allowed, a valid email address should be used. Example: `e/BingCheng@email.com` -**ROOM_NUMBER** | `r/` | Blank inputs are not allowed, only numbers greater than 0 are valid. Example: `r/500` -**TAG** | `t/` | Optional field. Example: `t/Vaccinated` +**PASSPORT_NUMBER** | `pn/` | *Unique Identifier*
Blank inputs are not allowed
Example: `pn/X12345678A` +**NAME** | `n/` | Blank inputs are not allowed, and should only contain alphabetical characters.
Example: `n/Bing Cheng` +**EMAIL** | `e/` | Blanks inputs are not allowed, a valid email address should be used.
Example: `e/BingCheng@email.com` +**ROOM_NUMBER** | `r/` | Blank inputs are not allowed, only numbers greater than 0 are valid.
Example: `r/500` +**TAG** | `t/` | Optional field.
Example: `t/Vaccinated` ## **Staff Parameter Constraints Summary** Parameter | Prefix | Constraints, Examples ----------|--------|----------------------- -**STAFF_ID** | `sid/` | Blank inputs are not allowed, not allowed to be used with `pn/` e.g., `sid/2131` -**NAME** | `n/` | Blank inputs are not allowed, and should only contain alphabetical characters.
e.g., `n/Bing Cheng` -**EMAIL** | `e/` | Blanks inputs are not allowed, a valid email address should be used. e.g., `e/BingCheng@email.com` -**PHONE_NUMBER** | `p/` | Local phone numbers are 8 digits long, and should start with 8 or 9.
e.g., `p/99999999` +**STAFF_ID** | `sid/` | *Unique Identifier*
Blank inputs are not allowed, not allowed to be used with `pn/`
Example: `sid/2131` +**NAME** | `n/` | Blank inputs are not allowed, and should only contain alphabetical characters.
Example: `n/Bing Cheng` +**EMAIL** | `e/` | Blanks inputs are not allowed, a valid email address should be used.
Example: `e/BingCheng@email.com` +**PHONE_NUMBER** | `p/` | Local phone numbers are 8 digits long, and should start with 8 or 9.
Example: `p/99999999` **ADDRESS** | `a/` | Blank inputs are not allowed. **TAG** | `t/` | Optional field. @@ -292,6 +301,7 @@ Parameter | Prefix | Constraints, Examples * **GUI**: Graphical user interface * **Guest**: A guest at the hotel * **Staff**: An employee of the hotel +* **Unique Identifier**: An attribute that uniquely identifies a contact in the address book and the type of fields it has i.e if a contact is a staff or guest [Back to Table of Contents](#table-of-contents) diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 1dc2311b245..2895e841a66 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -13,10 +13,10 @@ box Model MODEL_COLOR_T1 participant ":Model" as Model MODEL_COLOR end box -[-> LogicManager : execute("delete 1") +[-> LogicManager : execute("delete sid/123") activate LogicManager -LogicManager -> AddressBookParser : parseCommand("delete 1") +LogicManager -> AddressBookParser : parseCommand("delete sid/123") activate AddressBookParser create DeleteCommandParser @@ -26,7 +26,7 @@ activate DeleteCommandParser DeleteCommandParser --> AddressBookParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +AddressBookParser -> DeleteCommandParser : parse("sid/123") activate DeleteCommandParser create DeleteCommand @@ -48,7 +48,7 @@ deactivate AddressBookParser LogicManager -> DeleteCommand : execute() activate DeleteCommand -DeleteCommand -> Model : deletePerson(1) +DeleteCommand -> Model : delete staff with sid = 123 activate Model Model --> DeleteCommand diff --git a/docs/images/DeleteSequenceDiagram.png b/docs/images/DeleteSequenceDiagram.png index fa327b39618..efee807bc8c 100644 Binary files a/docs/images/DeleteSequenceDiagram.png and b/docs/images/DeleteSequenceDiagram.png differ diff --git a/docs/images/JsonSnippet.png b/docs/images/JsonSnippet.png index 3f5ca2491c3..4156a8630c0 100644 Binary files a/docs/images/JsonSnippet.png and b/docs/images/JsonSnippet.png differ diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java index f4b8d595e0a..64c1d419403 100644 --- a/src/main/java/seedu/address/MainApp.java +++ b/src/main/java/seedu/address/MainApp.java @@ -36,7 +36,7 @@ */ public class MainApp extends Application { - public static final Version VERSION = new Version(0, 2, 0, true); + public static final Version VERSION = new Version(1, 2, 1, true); private static final Logger logger = LogsCenter.getLogger(MainApp.class); diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java index 6baf2e5ee3d..75876d4a62a 100644 --- a/src/main/java/seedu/address/commons/core/Messages.java +++ b/src/main/java/seedu/address/commons/core/Messages.java @@ -9,6 +9,10 @@ public class Messages { public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s"; public static final String MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER = "The unique identifier of the person is invalid!"; + public static final String MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER = + "Only one unique identifier should be provided!"; public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!"; - + public static final String MESSAGE_MISSING_ARGUMENTS = + "You are missing arguments in your command. Please follow the command format!"; + public static final String MESSAGE_TOO_MANY_ARGUMENTS = "Please only specify one argument"; } diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 2d0f4e08e2a..668fc41a4d9 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -10,13 +10,9 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; -import java.util.HashSet; -import java.util.Set; - import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; import seedu.address.model.person.Person; -import seedu.address.model.tag.Tag; /** * Adds a person to the address book. @@ -75,36 +71,10 @@ public CommandResult execute(Model model) throws CommandException { throw new CommandException(MESSAGE_DUPLICATE_PERSON); } - modifyTags(model); model.addPerson(toAdd); return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd)); } - /** - * Modifies the tag list accordingly. - * - * @param model The model containing the tag list. - */ - public void modifyTags(Model model) { - Set tags = toAdd.getTags(); - Set newTags = new HashSet<>(); - - for (Tag tag : tags) { - if (!model.hasTag(tag)) { - model.addTag(tag); - newTags.add(tag); - } else { - newTags.add(model.getTag(tag)); - } - } - - toAdd.setTags(newTags); - - for (Tag tag : newTags) { - tag.addPerson(toAdd); - } - } - @Override public boolean equals(Object other) { return other == this // short circuit if same object diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 2868e6b8b76..bd4276fb1d5 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -4,7 +4,10 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PASSPORT_NUMBER; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_ROOM_NUMBER; +import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; @@ -14,6 +17,7 @@ import java.util.Optional; import java.util.Set; +import seedu.address.commons.core.Messages; import seedu.address.commons.util.CollectionUtil; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; @@ -38,17 +42,30 @@ public class EditCommand extends Command { public static final String COMMAND_WORD = "edit"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the details of the person identified " - + "by the index number used in the displayed person list. " + + "by the unique identifier of the person. " + "Existing values will be overwritten by the input values.\n" - + "Parameters: INDEX (must be a positive integer) " + + "Format for Staff: " + + "Parameters: " + + "[" + PREFIX_STAFF_ID + "STAFF_ID" + "[" + PREFIX_NAME + "NAME] " - + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_TAG + "TAG]...\n" - + "Example: " + COMMAND_WORD + " 1 " + + "Example: " + COMMAND_WORD + " sid/123 " + + PREFIX_EMAIL + "johndoe@example.com" + PREFIX_PHONE + "91234567 " - + PREFIX_EMAIL + "johndoe@example.com"; + + "Format for Guest: " + + "Parameters: " + + "[" + PREFIX_PASSPORT_NUMBER + "PASSPORT_NUMBER" + + "[" + PREFIX_NAME + "NAME] " + + "[" + PREFIX_EMAIL + "EMAIL] " + + "[" + PREFIX_ROOM_NUMBER + "ROOM_NUMBER] " + + "[" + PREFIX_TAG + "TAG]...\n" + + "Example: " + COMMAND_WORD + " pn/A12345678 " + + PREFIX_EMAIL + "johndoe@example.com" + + PREFIX_ROOM_NUMBER + "1233" + + PREFIX_TAG + "VIP"; public static final String MESSAGE_EDIT_PERSON_SUCCESS = "Edited Person: %1$s"; public static final String MESSAGE_NOT_EDITED = "At least one field to edit must be provided."; @@ -100,54 +117,21 @@ public CommandResult execute(Model model) throws CommandException { .orElse(null); } + if (personToEdit == null) { + throw new CommandException(Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + Person editedPerson = createEditedPerson(personToEdit, editPersonDescriptor); if (!personToEdit.isSamePerson(editedPerson) && model.hasPerson(editedPerson)) { throw new CommandException(MESSAGE_DUPLICATE_PERSON); } - modifyTags(model, editedPerson, personToEdit); model.setPerson(personToEdit, editedPerson); model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson)); } - /** - * Modifies the tag list accordingly - * - * @param model The model containing the tag list and person list. - * @param editedPerson The person being edited. - * @param personToEdit The person being replaced by the editedPerson. - */ - public void modifyTags(Model model, Person editedPerson, Person personToEdit) { - Set tags = editedPerson.getTags(); - Set newTags = new HashSet<>(); - - for (Tag tag : tags) { - if (!model.hasTag(tag)) { - model.addTag(tag); - newTags.add(tag); - } else { - newTags.add(model.getTag(tag)); - } - } - - for (Tag tag : newTags) { - tag.addPerson(editedPerson); - } - - editedPerson.setTags(newTags); - - Set deletedTags = personToEdit.getTags(); - - for (Tag tag : deletedTags) { - tag.removePerson(personToEdit); - if (tag.noTaggedPerson()) { - model.deleteTag(tag); - } - } - } - /** * Creates and returns a {@code Person} with the details of {@code personToEdit} * edited with {@code editPersonDescriptor}. diff --git a/src/main/java/seedu/address/logic/commands/FilterCommand.java b/src/main/java/seedu/address/logic/commands/FilterCommand.java new file mode 100644 index 00000000000..91423101715 --- /dev/null +++ b/src/main/java/seedu/address/logic/commands/FilterCommand.java @@ -0,0 +1,54 @@ +package seedu.address.logic.commands; + +import static java.util.Objects.requireNonNull; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; + +import java.util.function.Predicate; + +import seedu.address.commons.core.Messages; +import seedu.address.model.Model; +import seedu.address.model.person.TagContainsKeywordsPredicate; +import seedu.address.model.tag.Tag; + +/** + * Finds and lists all persons in address book whose name contains any of the argument keywords. + * Keyword matching is case insensitive. + */ +public class FilterCommand extends Command { + + public static final String COMMAND_WORD = "filter"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Filters the list by tags: " + + PREFIX_TAG + "TAG" + "...\n" + + "Example: " + COMMAND_WORD + " " + + PREFIX_TAG + "Staff " + + PREFIX_TAG + "Vaccinated " + + "\n This filters the list by those that are vaccinated and are Staff.\n"; + + private final TagContainsKeywordsPredicate predicate; + + public FilterCommand(TagContainsKeywordsPredicate predicate) { + this.predicate = predicate; + } + + @Override + public CommandResult execute(Model model) { + requireNonNull(model); + model.updateFilteredPersonList(predicate); + model.updateFilteredTagList(getTagPredicate(predicate)); + return new CommandResult( + String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size())); + } + + private Predicate getTagPredicate(TagContainsKeywordsPredicate predicate) { + return tag -> predicate.getTags().contains(tag); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof FilterCommand // instanceof handles nulls + && predicate.equals(((FilterCommand) other).predicate)); // state check + } + +} diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java index 84be6ad2596..8d23361f345 100644 --- a/src/main/java/seedu/address/logic/commands/ListCommand.java +++ b/src/main/java/seedu/address/logic/commands/ListCommand.java @@ -2,6 +2,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; +import static seedu.address.model.Model.PREDICATE_SHOW_ALL_TAGS; import seedu.address.model.Model; @@ -12,13 +13,14 @@ public class ListCommand extends Command { public static final String COMMAND_WORD = "list"; - public static final String MESSAGE_SUCCESS = "Listed all persons"; + public static final String MESSAGE_SUCCESS = "Listed all persons and tags"; @Override public CommandResult execute(Model model) { requireNonNull(model); model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); + model.updateFilteredTagList(PREDICATE_SHOW_ALL_TAGS); return new CommandResult(MESSAGE_SUCCESS); } } diff --git a/src/main/java/seedu/address/logic/commands/ViewCommand.java b/src/main/java/seedu/address/logic/commands/ViewCommand.java index 5d5e4638a95..45e3e7b84de 100644 --- a/src/main/java/seedu/address/logic/commands/ViewCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewCommand.java @@ -1,6 +1,8 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PASSPORT_NUMBER; +import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import seedu.address.commons.core.Messages; import seedu.address.model.Model; @@ -15,9 +17,10 @@ public class ViewCommand extends Command { public static final String COMMAND_WORD = "view"; public static final String MESSAGE_USAGE = COMMAND_WORD + ": Finds the staff or guest by" - + "the specified staff ID or passport number (case-insensitive) and displays them as a list.\n" - + "Parameters: KEYWORD [MORE_KEYWORDS]...\n" - + "Example: " + COMMAND_WORD + " 101"; + + "the specified staff ID or passport number (case-insensitive) and displays them.\n" + + "Parameters: " + PREFIX_PASSPORT_NUMBER + "PASSPORT NUMBER " + "or" + PREFIX_STAFF_ID + "STAFF ID" + + "...\n" + + "Example: " + COMMAND_WORD + PREFIX_STAFF_ID + " 101"; private final IdentifierContainsKeywordsPredicate predicate; diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java index 516df812f4b..2e5cbaf1860 100644 --- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java +++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java @@ -12,6 +12,7 @@ import seedu.address.logic.commands.DeleteCommand; import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.ExitCommand; +import seedu.address.logic.commands.FilterCommand; import seedu.address.logic.commands.HelpCommand; import seedu.address.logic.commands.ListCommand; import seedu.address.logic.commands.ViewCommand; @@ -68,6 +69,9 @@ public Command parseCommand(String userInput) throws ParseException { case HelpCommand.COMMAND_WORD: return new HelpCommand(); + case FilterCommand.COMMAND_WORD: + return new FilterCommandParser().parse(arguments); + default: throw new ParseException(MESSAGE_UNKNOWN_COMMAND); } diff --git a/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java index c25f262444b..870194f2811 100644 --- a/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/DeleteCommandParser.java @@ -2,6 +2,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER; import static seedu.address.logic.parser.CliSyntax.PREFIX_PASSPORT_NUMBER; import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; @@ -27,13 +28,17 @@ public DeleteCommand parse(String args) throws ParseException { UniqueIdentifier uniqueIdentifier; try { // Identify staff or guest - if (argMultimap.getValue(PREFIX_STAFF_ID).isPresent()) { + if (argMultimap.getValue(PREFIX_STAFF_ID).isPresent() + && argMultimap.getValue(PREFIX_PASSPORT_NUMBER).isPresent()) { + throw new ParseException(MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER); + } else if (argMultimap.getValue(PREFIX_STAFF_ID).isPresent()) { uniqueIdentifier = ParserUtil.parseStaffId(argMultimap.getValue(PREFIX_STAFF_ID).get()); } else if (argMultimap.getValue(PREFIX_PASSPORT_NUMBER).isPresent()) { uniqueIdentifier = ParserUtil.parsePassportNumber( argMultimap.getValue(PREFIX_PASSPORT_NUMBER).get()); } else { - throw new ParseException("Invalid unique identifier"); + // Message left blank as the catch statements message is already sufficient + throw new ParseException(""); } return new DeleteCommand(uniqueIdentifier); diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 2c0096a09f5..e9244eef9c6 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -1,6 +1,7 @@ package seedu.address.logic.parser; import static java.util.Objects.requireNonNull; +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; @@ -101,7 +102,7 @@ public EditCommand parse(String args) throws ParseException { uniqueIdentifier = passportNumber; return new EditCommand(uniqueIdentifier, editGuestDescriptor); } else { - throw new ParseException("Invalid unique identifier"); + throw new ParseException(MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); } } diff --git a/src/main/java/seedu/address/logic/parser/FilterCommandParser.java b/src/main/java/seedu/address/logic/parser/FilterCommandParser.java new file mode 100644 index 00000000000..8319c9007a5 --- /dev/null +++ b/src/main/java/seedu/address/logic/parser/FilterCommandParser.java @@ -0,0 +1,52 @@ +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_MISSING_ARGUMENTS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; + +import java.util.List; +import java.util.stream.Collectors; + +import seedu.address.logic.commands.FilterCommand; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.TagContainsKeywordsPredicate; +import seedu.address.model.tag.Tag; + +/** + * Parses input arguments and creates a new FindCommand object + */ +public class FilterCommandParser implements Parser { + + /** + * Parses the given {@code String} of arguments in the context of the FindCommand + * and returns a FindCommand object for execution. + * + * @throws ParseException if the user input does not conform the expected format + */ + public FilterCommand parse(String args) throws ParseException { + String trimmedArgs = args.trim(); + + if (trimmedArgs.isEmpty()) { + throw new ParseException( + String.format(MESSAGE_MISSING_ARGUMENTS, FilterCommand.MESSAGE_USAGE)); + } + + if (!trimmedArgs.contains(PREFIX_TAG.getPrefix())) { + throw new ParseException( + String.format(MESSAGE_INVALID_COMMAND_FORMAT, FilterCommand.MESSAGE_USAGE)); + } + + String[] splitArguments = trimmedArgs.split(PREFIX_TAG.getPrefix()); + List culledArguments = + List.of(splitArguments).stream().filter(x -> !x.isEmpty()).map(String::trim).map(Tag::new).collect( + Collectors.toList()); + + if (culledArguments.isEmpty()) { + throw new ParseException( + String.format(MESSAGE_MISSING_ARGUMENTS, FilterCommand.MESSAGE_USAGE)); + } + + return new FilterCommand(new TagContainsKeywordsPredicate(culledArguments)); + } + +} diff --git a/src/main/java/seedu/address/logic/parser/ViewCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewCommandParser.java index b69b72b6de1..3cecfc31df0 100644 --- a/src/main/java/seedu/address/logic/parser/ViewCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ViewCommandParser.java @@ -1,8 +1,12 @@ package seedu.address.logic.parser; -import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_MISSING_ARGUMENTS; +import static seedu.address.commons.core.Messages.MESSAGE_TOO_MANY_ARGUMENTS; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PASSPORT_NUMBER; +import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import java.util.Arrays; +import java.util.stream.Stream; import seedu.address.logic.commands.ViewCommand; import seedu.address.logic.parser.exceptions.ParseException; @@ -16,18 +20,44 @@ public class ViewCommandParser implements Parser { /** * Parses the given {@code String} of arguments in the context of the FindCommand * and returns a FindCommand object for execution. + * * @throws ParseException if the user input does not conform the expected format */ public ViewCommand parse(String args) throws ParseException { String trimmedArgs = args.trim(); + if (trimmedArgs.isEmpty()) { throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewCommand.MESSAGE_USAGE)); + String.format(MESSAGE_MISSING_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); } - String[] nameKeywords = trimmedArgs.split("\\s+"); + String[] splitArguments = trimmedArgs.split(String.format("%s|%s", PREFIX_STAFF_ID, PREFIX_PASSPORT_NUMBER)); + + if (splitArguments.length > 2) { // Need to fix empty string inside String[] + throw new ParseException( + String.format(MESSAGE_TOO_MANY_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); + } + + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_STAFF_ID, PREFIX_PASSPORT_NUMBER); + + if (arePrefixesPresent(argMultimap, PREFIX_STAFF_ID)) { + trimmedArgs = argMultimap.getValue(PREFIX_STAFF_ID).get(); + } - return new ViewCommand(new IdentifierContainsKeywordsPredicate(Arrays.asList(nameKeywords))); + if (arePrefixesPresent(argMultimap, PREFIX_PASSPORT_NUMBER)) { + trimmedArgs = argMultimap.getValue(PREFIX_PASSPORT_NUMBER).get(); + } + + return new ViewCommand(new IdentifierContainsKeywordsPredicate(Arrays.asList(trimmedArgs))); + } + + /** + * Returns true if none of the prefixes contains empty {@code Optional} values in the given + * {@code ArgumentMultimap}. + */ + private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { + return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent()); } } diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index 8cded378efe..9f1e0de8f1d 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -4,6 +4,7 @@ import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; import java.nio.file.Path; +import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; import java.util.logging.Logger; @@ -117,16 +118,67 @@ private void deleteTagAssociatedToPerson(Person target) { @Override public void addPerson(Person person) { + addTagAssociatedToPerson(person); addressBook.addPerson(person); updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); } + private void addTagAssociatedToPerson(Person toAdd) { + Set tags = toAdd.getTags(); + Set newTags = new HashSet<>(); + + for (Tag tag : tags) { + if (!addressBook.hasTag(tag)) { + addressBook.addTag(tag); + newTags.add(tag); + } else { + newTags.add(addressBook.getTag(tag)); + } + } + + toAdd.setTags(newTags); + + for (Tag tag : newTags) { + tag.addPerson(toAdd); + } + } + @Override public void setPerson(Person target, Person editedPerson) { requireAllNonNull(target, editedPerson); + setTagsAssociatedToPerson(target, editedPerson); addressBook.setPerson(target, editedPerson); } + private void setTagsAssociatedToPerson(Person personToEdit, Person editedPerson) { + Set tags = editedPerson.getTags(); + Set newTags = new HashSet<>(); + + for (Tag tag : tags) { + if (!addressBook.hasTag(tag)) { + addressBook.addTag(tag); + newTags.add(tag); + } else { + newTags.add(addressBook.getTag(tag)); + } + } + + for (Tag tag : newTags) { + tag.addPerson(editedPerson); + } + + editedPerson.setTags(newTags); + + Set deletedTags = personToEdit.getTags(); + + for (Tag tag : deletedTags) { + tag.removePerson(personToEdit); + if (tag.noTaggedPerson()) { + addressBook.removeTag(tag); + } + } + } + @Override public boolean hasTag(Tag tag) { requireNonNull(tag); @@ -197,6 +249,7 @@ public boolean equals(Object obj) { // state check ModelManager other = (ModelManager) obj; + return addressBook.equals(other.addressBook) && userPrefs.equals(other.userPrefs) && filteredPersons.equals(other.filteredPersons) diff --git a/src/main/java/seedu/address/model/person/StaffId.java b/src/main/java/seedu/address/model/person/StaffId.java index b6fb5a47467..23d24cb88a6 100644 --- a/src/main/java/seedu/address/model/person/StaffId.java +++ b/src/main/java/seedu/address/model/person/StaffId.java @@ -5,8 +5,8 @@ public class StaffId extends UniqueIdentifier { - public static final String MESSAGE_CONSTRAINTS = "StaffID must be alphanumeric."; - public static final String VALIDATION_REGEX = "^[\\w]+$"; + public static final String MESSAGE_CONSTRAINTS = "StaffID must be alphanumeric and non-empty."; + public static final String VALIDATION_REGEX = "^[a-zA-Z0-9_][a-zA-Z0-9_ ]+$"; public final String value; diff --git a/src/main/java/seedu/address/model/person/TagContainsKeywordsPredicate.java b/src/main/java/seedu/address/model/person/TagContainsKeywordsPredicate.java new file mode 100644 index 00000000000..ad4af8eba00 --- /dev/null +++ b/src/main/java/seedu/address/model/person/TagContainsKeywordsPredicate.java @@ -0,0 +1,47 @@ +package seedu.address.model.person; + +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import seedu.address.model.tag.Tag; + +/** + * Tests that a {@code Person}'s {@code Identifier} matches any of the keywords given. + */ +public class TagContainsKeywordsPredicate implements Predicate { + private final List tags; + + public TagContainsKeywordsPredicate(List tags) { + this.tags = tags; + } + + @Override + public boolean test(Person person) { + if (tags.isEmpty()) { + return false; + } + + if (person instanceof Staff) { + Staff staff = (Staff) person; + return tags.stream() + .filter(tag -> staff.getTags().contains(tag)).collect(Collectors.toList()).size() == tags.size(); + } else { + Guest guest = (Guest) person; + return tags.stream() + .filter(tag -> guest.getTags().contains(tag)).collect(Collectors.toList()).size() == tags.size(); + } + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof TagContainsKeywordsPredicate // instanceof handles nulls + && tags.equals(((TagContainsKeywordsPredicate) other).tags)); // state check + } + + public List getTags() { + return tags; + } + +} diff --git a/src/main/java/seedu/address/model/person/UniquePersonList.java b/src/main/java/seedu/address/model/person/UniquePersonList.java index 0fee4fe57e6..c742473809e 100644 --- a/src/main/java/seedu/address/model/person/UniquePersonList.java +++ b/src/main/java/seedu/address/model/person/UniquePersonList.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; +import java.util.Objects; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -17,7 +18,7 @@ * persons uses Person#isSamePerson(Person) for equality so as to ensure that the person being added or updated is * unique in terms of identity in the UniquePersonList. However, the removal of a person uses Person#equals(Object) so * as to ensure that the person with exactly the same fields will be removed. - * + *

* Supports a minimal set of list operations. * * @see Person#isSamePerson(Person) @@ -113,12 +114,12 @@ public Iterator iterator() { public boolean equals(Object other) { return other == this // short circuit if same object || (other instanceof UniquePersonList // instanceof handles nulls - && internalList.equals(((UniquePersonList) other).internalList)); + && internalList.equals(((UniquePersonList) other).internalList)); } @Override public int hashCode() { - return internalList.hashCode(); + return Objects.hash(internalList, internalUnmodifiableList); } /** diff --git a/src/main/java/seedu/address/model/tag/Tag.java b/src/main/java/seedu/address/model/tag/Tag.java index 11ca11e5461..40021410c30 100644 --- a/src/main/java/seedu/address/model/tag/Tag.java +++ b/src/main/java/seedu/address/model/tag/Tag.java @@ -13,6 +13,7 @@ * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)} */ public class Tag { + public static final String MESSAGE_CONSTRAINTS = "Tags names should be alphanumeric"; public static final String VALIDATION_REGEX = "^[\\w\\-\\s]+$"; diff --git a/src/main/java/seedu/address/model/tag/UniqueTagList.java b/src/main/java/seedu/address/model/tag/UniqueTagList.java index 35f6f0e9288..d2b5e6c9ac0 100644 --- a/src/main/java/seedu/address/model/tag/UniqueTagList.java +++ b/src/main/java/seedu/address/model/tag/UniqueTagList.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; +import java.util.Objects; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -111,7 +112,7 @@ public boolean equals(Object other) { @Override public int hashCode() { - return internalList.hashCode(); + return Objects.hash(internalList, internalUnmodifiableList); } /** diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index 8625f6a4cee..7ceaa976e8c 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -1,68 +1,68 @@ -package seedu.address.storage; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -import seedu.address.commons.exceptions.IllegalValueException; -import seedu.address.model.person.Person; - -/** - * Jackson-friendly version of {@link Person}. - */ -abstract class JsonAdaptedPerson { - - public static final String MISSING_FIELD_MESSAGE_FORMAT = "Person's %s field is missing!"; - - private final String name; - private final String email; - private final List tagged = new ArrayList<>(); - - /** - * Constructs a {@code JsonAdaptedPerson} with the given person details. - */ - @JsonCreator - public JsonAdaptedPerson(@JsonProperty("name") String name, - @JsonProperty("email") String email, - @JsonProperty("tagged") List tagged) { - this.name = name; - this.email = email; - if (tagged != null) { - this.tagged.addAll(tagged); - } - } - - /** - * Converts a given {@code Person} into this class for Jackson use. - */ - public JsonAdaptedPerson(Person source) { - name = source.getName().fullName; - email = source.getEmail().value; - tagged.addAll(source.getTags().stream() - .map(JsonAdaptedTag::new) - .collect(Collectors.toList())); - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public List getTags() { - return tagged; - } - - /** - * Converts this Jackson-friendly adapted person object into the model's {@code Person} object. - * - * @throws IllegalValueException if there were any data constraints violated in the adapted person. - */ - public abstract Person toModelType() throws IllegalValueException; - -} +//package seedu.address.storage; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.stream.Collectors; +// +//import com.fasterxml.jackson.annotation.JsonCreator; +//import com.fasterxml.jackson.annotation.JsonProperty; +// +//import seedu.address.commons.exceptions.IllegalValueException; +//import seedu.address.model.person.Person; +// +///** +// * Jackson-friendly version of {@link Person}. +// */ +//abstract class JsonAdaptedPerson { +// +// public static final String MISSING_FIELD_MESSAGE_FORMAT = "Person's %s field is missing!"; +// +// private final String name; +// private final String email; +// private final List tagged = new ArrayList<>(); +// +// /** +// * Constructs a {@code JsonAdaptedPerson} with the given person details. +// */ +// @JsonCreator +// public JsonAdaptedPerson(@JsonProperty("name") String name, +// @JsonProperty("email") String email, +// @JsonProperty("tagged") List tagged) { +// this.name = name; +// this.email = email; +// if (tagged != null) { +// this.tagged.addAll(tagged); +// } +// } +// +// /** +// * Converts a given {@code Person} into this class for Jackson use. +// */ +// public JsonAdaptedPerson(Person source) { +// name = source.getName().fullName; +// email = source.getEmail().value; +// tagged.addAll(source.getTags().stream() +// .map(JsonAdaptedTag::new) +// .collect(Collectors.toList())); +// } +// +// public String getName() { +// return name; +// } +// +// public String getEmail() { +// return email; +// } +// +// public List getTags() { +// return tagged; +// } +// +// /** +// * Converts this Jackson-friendly adapted person object into the model's {@code Person} object. +// * +// * @throws IllegalValueException if there were any data constraints violated in the adapted person. +// */ +// public abstract Person toModelType() throws IllegalValueException; +// +//} diff --git a/src/main/java/seedu/address/storage/JsonAdaptedTag.java b/src/main/java/seedu/address/storage/JsonAdaptedTag.java index 0df22bdb754..a958d3347e1 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedTag.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedTag.java @@ -1,5 +1,7 @@ package seedu.address.storage; +import java.util.Objects; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; @@ -33,6 +35,18 @@ public String getTagName() { return tagName; } + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof JsonAdaptedTag // instanceof handles nulls + && tagName.equals(((JsonAdaptedTag) other).getTagName())); // state check + } + + @Override + public int hashCode() { + return Objects.hash(tagName); + } + /** * Converts this Jackson-friendly adapted tag object into the model's {@code Tag} object. * diff --git a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java b/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java index 710bd967764..cf63f30704e 100644 --- a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java +++ b/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java @@ -3,8 +3,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonCreator; @@ -42,13 +44,14 @@ class JsonSerializableAddressBook { public JsonSerializableAddressBook(@JsonProperty("persons") List>> persons) { @SuppressWarnings("unchecked") List jsonStaff = (List) persons.get(0).get("staff"); - // this.staffs.addAll(jsonStaff); @SuppressWarnings("unchecked") List jsonGuest = (List) persons.get(0).get("guest"); - // this.guests.addAll(jsonGuest); + @SuppressWarnings("unchecked") + List jsonTags = (List) persons.get(0).get("tags"); Map> jsonMap = new HashMap<>(); jsonMap.put("staff", jsonStaff); jsonMap.put("guest", jsonGuest); + jsonMap.put("tags", jsonTags); this.persons.add(jsonMap); } @@ -66,8 +69,12 @@ public JsonSerializableAddressBook(ReadOnlyAddressBook source) { staffs.addAll(source.getPersonList().stream().filter(x -> x.getTags().contains(new Tag("Staff"))).map( JsonAdaptedStaff::new).collect(Collectors.toList())); Map> jsonMap = new HashMap<>(); + Set tags = new HashSet<>(); + guests.forEach(x -> tags.addAll(x.getTags())); + staffs.forEach(x -> tags.addAll(x.getTags())); jsonMap.put("staff", staffs); jsonMap.put("guest", guests); + jsonMap.put("tags", new ArrayList<>(tags)); persons.add(jsonMap); } @@ -79,7 +86,7 @@ public JsonSerializableAddressBook(ReadOnlyAddressBook source) { */ public AddressBook toModelType() throws IllegalValueException { AddressBook addressBook = new AddressBook(); - + Set tagSet = new HashSet<>(); try { List guests = jsonArrayToObjectList(toJsonString(persons.get(0).get("guest")), JsonAdaptedGuest.class); @@ -91,6 +98,7 @@ public AddressBook toModelType() throws IllegalValueException { if (addressBook.hasPerson(person)) { throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON); } + tagSet.addAll(person.getTags()); addressBook.addPerson(person); } @@ -99,8 +107,10 @@ public AddressBook toModelType() throws IllegalValueException { if (addressBook.hasPerson(person)) { throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON); } + tagSet.addAll(person.getTags()); addressBook.addPerson(person); } + addressBook.setTags(new ArrayList<>(tagSet)); return addressBook; } catch (Exception e) { System.out.println("error"); diff --git a/src/main/resources/view/StaffCard.fxml b/src/main/resources/view/StaffCard.fxml index 9ce880b1e0c..5d41dde18e1 100644 --- a/src/main/resources/view/StaffCard.fxml +++ b/src/main/resources/view/StaffCard.fxml @@ -11,7 +11,7 @@ - + diff --git a/src/main/resources/view/TagListCard.fxml b/src/main/resources/view/TagListCard.fxml index 3604415d527..cb1be105545 100644 --- a/src/main/resources/view/TagListCard.fxml +++ b/src/main/resources/view/TagListCard.fxml @@ -5,7 +5,6 @@ - diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java index 1b61357001e..960a6a7af91 100644 --- a/src/test/java/seedu/address/logic/LogicManagerTest.java +++ b/src/test/java/seedu/address/logic/LogicManagerTest.java @@ -1,175 +1,179 @@ -//package seedu.address.logic; -// -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static seedu.address.commons.core.Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER; -//import static seedu.address.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; -//import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.ROOM_NUMBER_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_ALICE; -//import static seedu.address.testutil.Assert.assertThrows; -//import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; -// -//import java.io.IOException; -//import java.nio.file.Path; -// -//import org.junit.jupiter.api.BeforeEach; -//import org.junit.jupiter.api.Test; -//import org.junit.jupiter.api.io.TempDir; -// -//import seedu.address.logic.commands.AddCommand; -//import seedu.address.logic.commands.CommandResult; -//import seedu.address.logic.commands.ListCommand; -//import seedu.address.logic.commands.exceptions.CommandException; -//import seedu.address.logic.parser.exceptions.ParseException; -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.ReadOnlyAddressBook; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.Person; -//import seedu.address.storage.JsonAddressBookStorage; -//import seedu.address.storage.JsonUserPrefsStorage; -//import seedu.address.storage.StorageManager; -//import seedu.address.testutil.GuestBuilder; -// -//public class LogicManagerTest { -// private static final IOException DUMMY_IO_EXCEPTION = new IOException("dummy exception"); -// -// @TempDir -// public Path temporaryFolder; -// -// private Model model = new ModelManager(); -// private Logic logic; -// -// @BeforeEach -// public void setUp() { -// JsonAddressBookStorage addressBookStorage = -// new JsonAddressBookStorage(temporaryFolder.resolve("addressBook.json")); -// JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("userPrefs.json")); -// StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); -// logic = new LogicManager(model, storage); -// } -// -// @Test -// public void execute_invalidCommandFormat_throwsParseException() { -// String invalidCommand = "uicfhmowqewca"; -// assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND); -// } -// -// @Test -// public void execute_staffIdCommandExecutionError_throwsCommandException() { -// String deleteCommand = "delete sid/1"; -// assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// @Test -// public void execute_passportNumberCommandExecutionError_throwsCommandException() { -// String deleteCommand = "delete pn/1"; -// assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// @Test -// public void execute_validCommand_success() throws Exception { -// String listCommand = ListCommand.COMMAND_WORD; -// assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model); -// } -// -// @Test -// public void execute_storageThrowsIoException_throwsCommandException() { -// // Setup LogicManager with JsonAddressBookIoExceptionThrowingStub -// JsonAddressBookStorage addressBookStorage = -// new JsonAddressBookIoExceptionThrowingStub(temporaryFolder.resolve("ioExceptionAddressBook.json")); -// JsonUserPrefsStorage userPrefsStorage = -// new JsonUserPrefsStorage(temporaryFolder.resolve("ioExceptionUserPrefs.json")); -// StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); -// logic = new LogicManager(model, storage); -// -// // Execute add command -// String addCommand = -// AddCommand.COMMAND_WORD + PASSPORT_NUMBER_DESC_ALICE + NAME_DESC_ALICE + ROOM_NUMBER_DESC_ALICE -// + EMAIL_DESC_ALICE + TAG_DESC_ALICE; -// Person expectedPerson = new GuestBuilder(ALICE_GUEST).build(); -// ModelManager expectedModel = new ModelManager(); -// expectedModel.addPerson(expectedPerson); -// String expectedMessage = LogicManager.FILE_OPS_ERROR_MESSAGE + DUMMY_IO_EXCEPTION; -// assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel); -// } -// -// @Test -// public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() { -// assertThrows(UnsupportedOperationException.class, () -> logic.getFilteredPersonList().remove(0)); -// } -// -// /** -// * Executes the command and confirms that -// * - no exceptions are thrown
-// * - the feedback message is equal to {@code expectedMessage}
-// * - the internal model manager state is the same as that in {@code expectedModel}
-// * -// * @see #assertCommandFailure(String, Class, String, Model) -// */ -// private void assertCommandSuccess(String inputCommand, String expectedMessage, -// Model expectedModel) throws CommandException, ParseException { -// CommandResult result = logic.execute(inputCommand); -// assertEquals(expectedMessage, result.getFeedbackToUser()); -// assertEquals(expectedModel, model); -// } -// -// /** -// * Executes the command, confirms that a ParseException is thrown and that the result message is correct. -// * -// * @see #assertCommandFailure(String, Class, String, Model) -// */ -// private void assertParseException(String inputCommand, String expectedMessage) { -// assertCommandFailure(inputCommand, ParseException.class, expectedMessage); -// } -// -// /** -// * Executes the command, confirms that a CommandException is thrown and that the result message is correct. -// * -// * @see #assertCommandFailure(String, Class, String, Model) -// */ -// private void assertCommandException(String inputCommand, String expectedMessage) { -// assertCommandFailure(inputCommand, CommandException.class, expectedMessage); -// } -// -// /** -// * Executes the command, confirms that the exception is thrown and that the result message is correct. -// * -// * @see #assertCommandFailure(String, Class, String, Model) -// */ -// private void assertCommandFailure(String inputCommand, Class expectedException, -// String expectedMessage) { -// Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); -// assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel); -// } -// -// /** -// * Executes the command and confirms that -// * - the {@code expectedException} is thrown
-// * - the resulting error message is equal to {@code expectedMessage}
-// * - the internal model manager state is the same as that in {@code expectedModel}
-// * -// * @see #assertCommandSuccess(String, String, Model) -// */ -// private void assertCommandFailure(String inputCommand, Class expectedException, -// String expectedMessage, Model expectedModel) { -// assertThrows(expectedException, expectedMessage, () -> logic.execute(inputCommand)); -// assertEquals(expectedModel, model); -// } -// -// /** -// * A stub class to throw an {@code IOException} when the save method is called. -// */ -// private static class JsonAddressBookIoExceptionThrowingStub extends JsonAddressBookStorage { -// private JsonAddressBookIoExceptionThrowingStub(Path filePath) { -// super(filePath); -// } -// -// @Override -// public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException { -// throw DUMMY_IO_EXCEPTION; -// } -// } -//} +package seedu.address.logic; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER; +import static seedu.address.commons.core.Messages.MESSAGE_UNKNOWN_COMMAND; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.ROOM_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_ALICE; +import static seedu.address.testutil.Assert.assertThrows; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_UNUSED; +import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_UNUSED; + +import java.io.IOException; +import java.nio.file.Path; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import seedu.address.logic.commands.AddCommand; +import seedu.address.logic.commands.CommandResult; +import seedu.address.logic.commands.ListCommand; +import seedu.address.logic.commands.exceptions.CommandException; +import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.ReadOnlyAddressBook; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.Person; +import seedu.address.storage.JsonAddressBookStorage; +import seedu.address.storage.JsonUserPrefsStorage; +import seedu.address.storage.StorageManager; +import seedu.address.testutil.GuestBuilder; + +public class LogicManagerTest { + private static final IOException DUMMY_IO_EXCEPTION = new IOException("dummy exception"); + + @TempDir + public Path temporaryFolder; + + private Model model = new ModelManager(); + private Logic logic; + + @BeforeEach + public void setUp() { + JsonAddressBookStorage addressBookStorage = + new JsonAddressBookStorage(temporaryFolder.resolve("addressBook.json")); + JsonUserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(temporaryFolder.resolve("userPrefs.json")); + StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); + logic = new LogicManager(model, storage); + } + + @Test + public void execute_invalidCommandFormat_throwsParseException() { + String invalidCommand = "uicfhmowqewca"; + assertParseException(invalidCommand, MESSAGE_UNKNOWN_COMMAND); + } + + @Test + public void execute_staffIdCommandExecutionError_throwsCommandException() { + // checks if deleting an unused staff id is possible + String deleteCommand = "delete sid/" + STAFF_ID_UNUSED.toString(); + assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + @Test + public void execute_passportNumberCommandExecutionError_throwsCommandException() { + // checks if deleting an unused passport number is possible + String deleteCommand = "delete pn/" + PASSPORT_NUMBER_UNUSED.toString(); + assertCommandException(deleteCommand, MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + @Test + public void execute_validCommand_success() throws Exception { + String listCommand = ListCommand.COMMAND_WORD; + assertCommandSuccess(listCommand, ListCommand.MESSAGE_SUCCESS, model); + } + + @Test + public void execute_storageThrowsIoException_throwsCommandException() { + // Setup LogicManager with JsonAddressBookIoExceptionThrowingStub + JsonAddressBookStorage addressBookStorage = + new JsonAddressBookIoExceptionThrowingStub(temporaryFolder.resolve("ioExceptionAddressBook.json")); + JsonUserPrefsStorage userPrefsStorage = + new JsonUserPrefsStorage(temporaryFolder.resolve("ioExceptionUserPrefs.json")); + StorageManager storage = new StorageManager(addressBookStorage, userPrefsStorage); + logic = new LogicManager(model, storage); + + // Execute add command + String addCommand = + AddCommand.COMMAND_WORD + PASSPORT_NUMBER_DESC_ALICE + NAME_DESC_ALICE + ROOM_NUMBER_DESC_ALICE + + EMAIL_DESC_ALICE + TAG_DESC_ALICE; + Person expectedPerson = new GuestBuilder(ALICE_GUEST).build(); + ModelManager expectedModel = new ModelManager(); + expectedModel.addPerson(expectedPerson); + String expectedMessage = LogicManager.FILE_OPS_ERROR_MESSAGE + DUMMY_IO_EXCEPTION; + assertCommandFailure(addCommand, CommandException.class, expectedMessage, expectedModel); + } + + @Test + public void getFilteredPersonList_modifyList_throwsUnsupportedOperationException() { + assertThrows(UnsupportedOperationException.class, () -> logic.getFilteredPersonList().remove(0)); + } + + /** + * Executes the command and confirms that + * - no exceptions are thrown
+ * - the feedback message is equal to {@code expectedMessage}
+ * - the internal model manager state is the same as that in {@code expectedModel}
+ * + * @see #assertCommandFailure(String, Class, String, Model) + */ + private void assertCommandSuccess(String inputCommand, String expectedMessage, + Model expectedModel) throws CommandException, ParseException { + CommandResult result = logic.execute(inputCommand); + assertEquals(expectedMessage, result.getFeedbackToUser()); + assertEquals(expectedModel, model); + } + + /** + * Executes the command, confirms that a ParseException is thrown and that the result message is correct. + * + * @see #assertCommandFailure(String, Class, String, Model) + */ + private void assertParseException(String inputCommand, String expectedMessage) { + assertCommandFailure(inputCommand, ParseException.class, expectedMessage); + } + + /** + * Executes the command, confirms that a CommandException is thrown and that the result message is correct. + * + * @see #assertCommandFailure(String, Class, String, Model) + */ + private void assertCommandException(String inputCommand, String expectedMessage) { + assertCommandFailure(inputCommand, CommandException.class, expectedMessage); + } + + /** + * Executes the command, confirms that the exception is thrown and that the result message is correct. + * + * @see #assertCommandFailure(String, Class, String, Model) + */ + private void assertCommandFailure(String inputCommand, Class expectedException, + String expectedMessage) { + Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + assertCommandFailure(inputCommand, expectedException, expectedMessage, expectedModel); + } + + /** + * Executes the command and confirms that + * - the {@code expectedException} is thrown
+ * - the resulting error message is equal to {@code expectedMessage}
+ * - the internal model manager state is the same as that in {@code expectedModel}
+ * + * @see #assertCommandSuccess(String, String, Model) + */ + private void assertCommandFailure(String inputCommand, Class expectedException, + String expectedMessage, Model expectedModel) { + assertThrows(expectedException, expectedMessage, () -> logic.execute(inputCommand)); + assertEquals(expectedModel, model); + } + + /** + * A stub class to throw an {@code IOException} when the save method is called. + */ + private static class JsonAddressBookIoExceptionThrowingStub extends JsonAddressBookStorage { + private JsonAddressBookIoExceptionThrowingStub(Path filePath) { + super(filePath); + } + + @Override + public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException { + throw DUMMY_IO_EXCEPTION; + } + } +} diff --git a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java b/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java index 5f47329210f..57d1c6e5ddd 100644 --- a/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java +++ b/src/test/java/seedu/address/logic/commands/AddCommandIntegrationTest.java @@ -28,10 +28,8 @@ public void setUp() { @Test public void execute_newPerson_success() { Person validPerson = new StaffBuilder().build(); - Model expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); expectedModel.addPerson(validPerson); - assertCommandSuccess(new AddCommand(validPerson), model, String.format(AddCommand.MESSAGE_SUCCESS, validPerson), expectedModel); } diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index df6a47bf97a..2128f3489bc 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -11,6 +11,13 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; import static seedu.address.testutil.Assert.assertThrows; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_THIRD_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FOURTH_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_THIRD_PERSON; import java.util.ArrayList; import java.util.Arrays; @@ -32,73 +39,124 @@ */ public class CommandTestUtil { + // Guests public static final String VALID_NAME_ALICE = "Alice Pauline"; public static final String VALID_EMAIL_ALICE = "alice@example.com"; public static final String VALID_TAG_ALICE = "VIP"; public static final String VALID_ROOM_NUMBER_ALICE = "20202"; - public static final String VALID_PASSPORT_NUMBER_ALICE = "A123456789"; + public static final String VALID_PASSPORT_NUMBER_ALICE = PASSPORT_NUMBER_FIRST_PERSON.toString(); public static final String NAME_DESC_ALICE = " " + PREFIX_NAME + VALID_NAME_ALICE; public static final String ROOM_NUMBER_DESC_ALICE = " " + PREFIX_ROOM_NUMBER + VALID_ROOM_NUMBER_ALICE; public static final String EMAIL_DESC_ALICE = " " + PREFIX_EMAIL + VALID_EMAIL_ALICE; public static final String PASSPORT_NUMBER_DESC_ALICE = " " + PREFIX_PASSPORT_NUMBER + VALID_PASSPORT_NUMBER_ALICE; public static final String TAG_DESC_ALICE = " " + PREFIX_TAG + VALID_TAG_ALICE; + public static final String VALID_NAME_BENSON = "Benson Meier"; + public static final String VALID_EMAIL_BENSON = "benson@example.com"; + public static final String VALID_TAG_BENSON = "NORMALROOM"; + public static final String VALID_ROOM_NUMBER_BENSON = "20201"; + public static final String VALID_PASSPORT_NUMBER_BENSON = PASSPORT_NUMBER_SECOND_PERSON.toString(); + public static final String NAME_DESC_BENSON = " " + PREFIX_NAME + VALID_NAME_BENSON; + public static final String ROOM_NUMBER_DESC_BENSON = " " + PREFIX_ROOM_NUMBER + VALID_ROOM_NUMBER_BENSON; + public static final String EMAIL_DESC_BENSON = " " + PREFIX_EMAIL + VALID_EMAIL_BENSON; + public static final String PASSPORT_NUMBER_DESC_BENSON = " " + PREFIX_PASSPORT_NUMBER + + VALID_PASSPORT_NUMBER_BENSON; + public static final String TAG_DESC_BENSON = " " + PREFIX_TAG + VALID_TAG_BENSON; + + public static final String VALID_NAME_CARL = "Carl Kurz"; + public static final String VALID_EMAIL_CARL = "carl@example.com"; + public static final String VALID_TAG_CARL = "DELUXESUITE"; + public static final String VALID_ROOM_NUMBER_CARL = "12321"; + public static final String VALID_PASSPORT_NUMBER_CARL = PASSPORT_NUMBER_THIRD_PERSON.toString(); + public static final String NAME_DESC_CARL = " " + PREFIX_NAME + VALID_NAME_CARL; + public static final String ROOM_NUMBER_DESC_CARL = " " + PREFIX_ROOM_NUMBER + VALID_ROOM_NUMBER_CARL; + public static final String EMAIL_DESC_CARL = " " + PREFIX_EMAIL + VALID_EMAIL_CARL; + public static final String PASSPORT_NUMBER_DESC_CARL = " " + PREFIX_PASSPORT_NUMBER + VALID_PASSPORT_NUMBER_CARL; + public static final String TAG_DESC_CARL = " " + PREFIX_TAG + VALID_TAG_CARL; + + // Staff + public static final String VALID_STAFF_TAG = "Staff"; public static final String VALID_NAME_DANIEL = "Daniel Meier"; public static final String VALID_EMAIL_DANIEL = "cornelia@example.com"; public static final String VALID_TAG_DANIEL = "COUNTER STAFF"; public static final String VALID_ADDRESS_DANIEL = "10th street"; public static final String VALID_PHONE_DANIEL = "87652533"; - public static final String VALID_STAFF_ID_DANIEL = "201"; + public static final String VALID_STAFF_ID_DANIEL = STAFF_ID_FIRST_PERSON.toString(); public static final String NAME_DESC_DANIEL = " " + PREFIX_NAME + VALID_NAME_DANIEL; public static final String EMAIL_DESC_DANIEL = " " + PREFIX_EMAIL + VALID_EMAIL_DANIEL; public static final String ADDRESS_DESC_DANIEL = " " + PREFIX_ADDRESS + VALID_ADDRESS_DANIEL; + public static final String TAG_DESC_DANIEL = " " + PREFIX_TAG + VALID_TAG_DANIEL; public static final String PHONE_DESC_DANIEL = " " + PREFIX_PHONE + VALID_PHONE_DANIEL; public static final String STAFF_ID_DESC_DANIEL = " " + PREFIX_STAFF_ID + VALID_STAFF_ID_DANIEL; + public static final String TAG_DESC_DANIEL_TWO = " " + PREFIX_TAG + VALID_TAG_DANIEL + PREFIX_TAG + VALID_STAFF_TAG; - public static final String VALID_NAME_BOB = "Bob Choo"; - public static final String VALID_NAME_CHARLIE = "Charlie Choo"; - - public static final String VALID_EMAIL_BOB = "bob@example.com"; - public static final String VALID_EMAIL_CHARLIE = "charlie@example.com"; - - public static final String VALID_TAG_HUSBAND = "husband"; - public static final String VALID_TAG_FRIEND = "friend"; - - public static final String VALID_PHONE_BOB = "77777777"; - public static final String VALID_PHONE_CHARLIE = "11111111"; - - public static final String VALID_ADDRESS_BOB = "Block 999, Bobby Street 3"; - public static final String VALID_ADDRESS_CHARLIE = "Block 312, charlie Street 1"; + public static final String VALID_NAME_ELLE = "Elle Meyer"; + public static final String VALID_EMAIL_ELLE = "elle@example.com"; + public static final String VALID_TAG_ELLE = "MANAGER"; + public static final String VALID_ADDRESS_ELLE = "michegan ave"; + public static final String VALID_PHONE_ELLE = "9482224"; + public static final String VALID_STAFF_ID_ELLE = STAFF_ID_SECOND_PERSON.toString(); + public static final String NAME_DESC_ELLE = " " + PREFIX_NAME + VALID_NAME_ELLE; + public static final String EMAIL_DESC_ELLE = " " + PREFIX_EMAIL + VALID_EMAIL_ELLE; + public static final String ADDRESS_DESC_ELLE = " " + PREFIX_ADDRESS + VALID_ADDRESS_ELLE; + public static final String PHONE_DESC_ELLE = " " + PREFIX_PHONE + VALID_PHONE_ELLE; + public static final String STAFF_ID_DESC_ELLE = " " + PREFIX_STAFF_ID + VALID_STAFF_ID_ELLE; - public static final String VALID_SID_BOB = "123"; - public static final String VALID_PASSPORT_NUMBER_BOB = "A987654321"; + public static final String VALID_NAME_FIONA = "Fiona Kunz"; + public static final String VALID_EMAIL_FIONA = "fiona@example.com"; + public static final String VALID_TAG_FIONA = "Waitress"; + public static final String VALID_ADDRESS_FIONA = "little tokyo"; + public static final String VALID_PHONE_FIONA = "9482427"; + public static final String VALID_STAFF_ID_FIONA = STAFF_ID_THIRD_PERSON.toString(); + public static final String NAME_DESC_FIONA = " " + PREFIX_NAME + VALID_NAME_FIONA; + public static final String EMAIL_DESC_FIONA = " " + PREFIX_EMAIL + VALID_EMAIL_FIONA; + public static final String ADDRESS_DESC_FIONA = " " + PREFIX_ADDRESS + VALID_ADDRESS_FIONA; + public static final String PHONE_DESC_FIONA = " " + PREFIX_PHONE + VALID_PHONE_FIONA; + public static final String STAFF_ID_DESC_FIONA = " " + PREFIX_STAFF_ID + VALID_STAFF_ID_FIONA; - public static final String VALID_ROOM_NUMBER_BOB = "555"; + public static final String VALID_NAME_GEORGE = "George Best"; + public static final String VALID_EMAIL_GEORGE = "george@example.com"; + public static final String VALID_TAG_GEORGE = "Head of Staff"; + public static final String VALID_ADDRESS_GEORGE = "4th street"; + public static final String VALID_PHONE_GEORGE = "9482442"; + public static final String VALID_STAFF_ID_GEORGE = STAFF_ID_FOURTH_PERSON.toString(); + public static final String NAME_DESC_GEORGE = " " + PREFIX_NAME + VALID_NAME_GEORGE; + public static final String EMAIL_DESC_GEORGE = " " + PREFIX_EMAIL + VALID_EMAIL_GEORGE; + public static final String ADDRESS_DESC_GEORGE = " " + PREFIX_ADDRESS + VALID_ADDRESS_GEORGE; + public static final String PHONE_DESC_GEORGE = " " + PREFIX_PHONE + VALID_PHONE_GEORGE; + public static final String STAFF_ID_DESC_GEORGE = " " + PREFIX_STAFF_ID + VALID_STAFF_ID_GEORGE; - public static final String VALID_STAFF_ID_CHARLIE = "S12345"; + // Guest Tags + public static final String VALID_TAG_VIP = "VIP"; + public static final String VALID_TAG_DELUXE_ROOM = "Deluxe Room"; + public static final String TAG_DESC_VIP = " " + PREFIX_TAG + VALID_TAG_VIP; + public static final String TAG_DESC_DELUXE_ROOM = " " + PREFIX_TAG + VALID_TAG_DELUXE_ROOM; - public static final String NAME_DESC_BOB = " " + PREFIX_NAME + VALID_NAME_BOB; - public static final String PHONE_DESC_BOB = " " + PREFIX_PHONE + VALID_PHONE_BOB; - public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB; - public static final String ADDRESS_DESC_BOB = " " + PREFIX_ADDRESS + VALID_ADDRESS_BOB; - public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND; - public static final String TAG_DESC_HUSBAND = " " + PREFIX_TAG + VALID_TAG_HUSBAND; - public static final String STAFF_ID_DESC_BOB = " " + PREFIX_STAFF_ID + VALID_SID_BOB; + // Staff Tags + public static final String VALID_TAG_SENIOR_STAFF = "Senior Staff"; + public static final String VALID_TAG_CHEF = "Chef"; + public static final String TAG_DESC_SENIOR_STAFF = " " + PREFIX_TAG + VALID_TAG_SENIOR_STAFF; + public static final String TAG_DESC_CHEF = " " + PREFIX_TAG + VALID_TAG_CHEF; + // Invalid fields public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&"; // '&' not allowed in names public static final String INVALID_PHONE_DESC = " " + PREFIX_PHONE + "911a"; // 'a' not allowed in phones public static final String INVALID_EMAIL_DESC = " " + PREFIX_EMAIL + "bob!yahoo"; // missing '@' symbol public static final String INVALID_ADDRESS_DESC = " " + PREFIX_ADDRESS; // empty string not allowed for addresses public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags - public static final String INVALID_STAFF_ID = " " + PREFIX_STAFF_ID + "1#2"; //'@' not allowed in staff id + public static final String INVALID_STAFF_ID_DESC = " " + PREFIX_STAFF_ID + "1#2"; //'#' not allowed in staff id + public static final String INVALID_ROOM_NUMBER_DESC = " " + PREFIX_ROOM_NUMBER + "-1"; + //' room numbers must be a number greater than 0. + public static final String INVALID_PASSPORT_NUMBER_DESC = " " + PREFIX_PASSPORT_NUMBER + "@3333"; + // passport numbers should be alphanumeric public static final String PREAMBLE_WHITESPACE = "\t \r \n"; public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble"; public static final EditCommand.EditGuestDescriptor DESC_ALICE; - public static final EditCommand.EditGuestDescriptor DESC_BOB; - public static final EditCommand.EditStaffDescriptor DESC_CHARLIE; + public static final EditCommand.EditGuestDescriptor DESC_BENSON; public static final EditCommand.EditStaffDescriptor DESC_DANIEL; + public static final EditCommand.EditStaffDescriptor DESC_ELLE; static { DESC_ALICE = new EditGuestDescriptorBuilder() @@ -108,21 +166,15 @@ public class CommandTestUtil { .withRoomNumber(VALID_ROOM_NUMBER_ALICE) .withPassportNumber(VALID_PASSPORT_NUMBER_ALICE) .build(); - DESC_BOB = new EditGuestDescriptorBuilder() - .withName(VALID_NAME_BOB) - .withEmail(VALID_EMAIL_BOB) - .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND) - .withRoomNumber(VALID_ROOM_NUMBER_BOB) - .withPassportNumber(VALID_PASSPORT_NUMBER_BOB) - .build(); - DESC_CHARLIE = new EditStaffDescriptorBuilder() - .withName(VALID_NAME_CHARLIE) - .withEmail(VALID_EMAIL_CHARLIE) - .withTags(VALID_TAG_HUSBAND) - .withAddress(VALID_ADDRESS_CHARLIE) - .withPhone(VALID_PHONE_CHARLIE) - .withStaffId(VALID_STAFF_ID_CHARLIE) + + DESC_BENSON = new EditGuestDescriptorBuilder() + .withName(VALID_NAME_BENSON) + .withEmail(VALID_EMAIL_BENSON) + .withTags(VALID_TAG_VIP, VALID_TAG_DELUXE_ROOM) + .withRoomNumber(VALID_ROOM_NUMBER_BENSON) + .withPassportNumber(VALID_PASSPORT_NUMBER_BENSON) .build(); + DESC_DANIEL = new EditStaffDescriptorBuilder() .withName(VALID_NAME_DANIEL) .withEmail(VALID_EMAIL_DANIEL) @@ -131,6 +183,15 @@ public class CommandTestUtil { .withPhone(VALID_PHONE_DANIEL) .withStaffId(VALID_STAFF_ID_DANIEL) .build(); + + DESC_ELLE = new EditStaffDescriptorBuilder() + .withName(VALID_NAME_ELLE) + .withEmail(VALID_EMAIL_ELLE) + .withTags(VALID_TAG_SENIOR_STAFF) + .withAddress(VALID_ADDRESS_ELLE) + .withPhone(VALID_PHONE_ELLE) + .withStaffId(VALID_STAFF_ID_ELLE) + .build(); } /** diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandGuestTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandGuestTest.java index 683ec3dd933..f2a2aa1648b 100644 --- a/src/test/java/seedu/address/logic/commands/DeleteCommandGuestTest.java +++ b/src/test/java/seedu/address/logic/commands/DeleteCommandGuestTest.java @@ -1,83 +1,83 @@ -//package seedu.address.logic.commands; -// -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static org.junit.jupiter.api.Assertions.assertTrue; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_UNUSED; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.commons.core.Messages; -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.Guest; -// -///** -// * Contains integration tests (interaction with the Model) and unit tests for -// * {@code DeleteCommand}. -// */ -//public class DeleteCommandGuestTest { -// -// private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// -// @Test -// public void execute_validPassportNumber_success() { -// Guest guestToDelete = (Guest) model.getFilteredPersonList() -// .stream() -// .filter(g -> g instanceof Guest -// && ((Guest) g).getPassportNumber().equals(PASSPORT_NUMBER_FIRST_PERSON)) -// .findAny() -// .orElse(null); -// DeleteCommand deleteCommand = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); -// -// String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, guestToDelete); -// -// ModelManager expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); -// expectedModel.deletePerson(guestToDelete); -// -// assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_invalidPassportNumber_throwsCommandException() { -// DeleteCommand deleteCommand = new DeleteCommand(PASSPORT_NUMBER_UNUSED); -// -// assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// @Test -// public void equals() { -// DeleteCommand deleteFirstCommand = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); -// DeleteCommand deleteSecondCommand = new DeleteCommand(PASSPORT_NUMBER_SECOND_PERSON); -// -// // same object -> returns true -// assertTrue(deleteFirstCommand.equals(deleteFirstCommand)); -// -// // same values -> returns true -// DeleteCommand deleteFirstCommandCopy = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); -// assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy)); -// -// // different types -> returns false -// assertFalse(deleteFirstCommand.equals(1)); -// -// // null -> returns false -// assertFalse(deleteFirstCommand.equals(null)); -// -// // different person -> returns false -// assertFalse(deleteFirstCommand.equals(deleteSecondCommand)); -// } -// -// /** -// * Updates {@code model}'s filtered list to show no one. -// */ -// private void showNoPerson(Model model) { -// model.updateFilteredPersonList(p -> false); -// -// assertTrue(model.getFilteredPersonList().isEmpty()); -// } -//} +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_UNUSED; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.Messages; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.Guest; + +/** + * Contains integration tests (interaction with the Model) and unit tests for + * {@code DeleteCommand}. + */ +public class DeleteCommandGuestTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void execute_validPassportNumber_success() { + Guest guestToDelete = (Guest) model.getFilteredPersonList() + .stream() + .filter(g -> g instanceof Guest + && ((Guest) g).getPassportNumber().equals(PASSPORT_NUMBER_FIRST_PERSON)) + .findAny() + .orElse(null); + DeleteCommand deleteCommand = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); + + String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, guestToDelete); + + ModelManager expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + expectedModel.deletePerson(guestToDelete); + + assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_invalidPassportNumber_throwsCommandException() { + DeleteCommand deleteCommand = new DeleteCommand(PASSPORT_NUMBER_UNUSED); + + assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + @Test + public void equals() { + DeleteCommand deleteFirstCommand = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); + DeleteCommand deleteSecondCommand = new DeleteCommand(PASSPORT_NUMBER_SECOND_PERSON); + + // same object -> returns true + assertTrue(deleteFirstCommand.equals(deleteFirstCommand)); + + // same values -> returns true + DeleteCommand deleteFirstCommandCopy = new DeleteCommand(PASSPORT_NUMBER_FIRST_PERSON); + assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy)); + + // different types -> returns false + assertFalse(deleteFirstCommand.equals(1)); + + // null -> returns false + assertFalse(deleteFirstCommand.equals(null)); + + // different person -> returns false + assertFalse(deleteFirstCommand.equals(deleteSecondCommand)); + } + + /** + * Updates {@code model}'s filtered list to show no one. + */ + private void showNoPerson(Model model) { + model.updateFilteredPersonList(p -> false); + + assertTrue(model.getFilteredPersonList().isEmpty()); + } +} diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandStaffTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandStaffTest.java index eaa4de3e715..40b31a8fd31 100644 --- a/src/test/java/seedu/address/logic/commands/DeleteCommandStaffTest.java +++ b/src/test/java/seedu/address/logic/commands/DeleteCommandStaffTest.java @@ -1,82 +1,82 @@ -//package seedu.address.logic.commands; -// -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static org.junit.jupiter.api.Assertions.assertTrue; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_UNUSED; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.commons.core.Messages; -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.Staff; -// -///** -// * Contains integration tests (interaction with the Model) and unit tests for -// * {@code DeleteCommand}. -// */ -//public class DeleteCommandStaffTest { -// -// private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// -// @Test -// public void execute_validStaffId_success() { -// Staff staffToDelete = (Staff) model.getFilteredPersonList() -// .stream() -// .filter(p -> p instanceof Staff && ((Staff) p).getStaffId().equals(STAFF_ID_FIRST_PERSON)) -// .findAny() -// .orElse(null); -// DeleteCommand deleteCommand = new DeleteCommand(STAFF_ID_FIRST_PERSON); -// -// String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, staffToDelete); -// -// ModelManager expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); -// expectedModel.deletePerson(staffToDelete); -// -// assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_invalidStaffId_throwsCommandException() { -// DeleteCommand deleteCommand = new DeleteCommand(STAFF_ID_UNUSED); -// -// assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// @Test -// public void equals() { -// DeleteCommand deleteFirstCommand = new DeleteCommand(STAFF_ID_FIRST_PERSON); -// DeleteCommand deleteSecondCommand = new DeleteCommand(STAFF_ID_SECOND_PERSON); -// -// // same object -> returns true -// assertTrue(deleteFirstCommand.equals(deleteFirstCommand)); -// -// // same values -> returns true -// DeleteCommand deleteFirstCommandCopy = new DeleteCommand(STAFF_ID_FIRST_PERSON); -// assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy)); -// -// // different types -> returns false -// assertFalse(deleteFirstCommand.equals(1)); -// -// // null -> returns false -// assertFalse(deleteFirstCommand.equals(null)); -// -// // different person -> returns false -// assertFalse(deleteFirstCommand.equals(deleteSecondCommand)); -// } -// -// /** -// * Updates {@code model}'s filtered list to show no one. -// */ -// private void showNoPerson(Model model) { -// model.updateFilteredPersonList(p -> false); -// -// assertTrue(model.getFilteredPersonList().isEmpty()); -// } -//} +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_UNUSED; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.Messages; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.Staff; + +/** + * Contains integration tests (interaction with the Model) and unit tests for + * {@code DeleteCommand}. + */ +public class DeleteCommandStaffTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void execute_validStaffId_success() { + Staff staffToDelete = (Staff) model.getFilteredPersonList() + .stream() + .filter(p -> p instanceof Staff && ((Staff) p).getStaffId().equals(STAFF_ID_FIRST_PERSON)) + .findAny() + .orElse(null); + DeleteCommand deleteCommand = new DeleteCommand(STAFF_ID_FIRST_PERSON); + + String expectedMessage = String.format(DeleteCommand.MESSAGE_DELETE_PERSON_SUCCESS, staffToDelete); + + ModelManager expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs()); + expectedModel.deletePerson(staffToDelete); + + assertCommandSuccess(deleteCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_invalidStaffId_throwsCommandException() { + DeleteCommand deleteCommand = new DeleteCommand(STAFF_ID_UNUSED); + + assertCommandFailure(deleteCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + @Test + public void equals() { + DeleteCommand deleteFirstCommand = new DeleteCommand(STAFF_ID_FIRST_PERSON); + DeleteCommand deleteSecondCommand = new DeleteCommand(STAFF_ID_SECOND_PERSON); + + // same object -> returns true + assertTrue(deleteFirstCommand.equals(deleteFirstCommand)); + + // same values -> returns true + DeleteCommand deleteFirstCommandCopy = new DeleteCommand(STAFF_ID_FIRST_PERSON); + assertTrue(deleteFirstCommand.equals(deleteFirstCommandCopy)); + + // different types -> returns false + assertFalse(deleteFirstCommand.equals(1)); + + // null -> returns false + assertFalse(deleteFirstCommand.equals(null)); + + // different person -> returns false + assertFalse(deleteFirstCommand.equals(deleteSecondCommand)); + } + + /** + * Updates {@code model}'s filtered list to show no one. + */ + private void showNoPerson(Model model) { + model.updateFilteredPersonList(p -> false); + + assertTrue(model.getFilteredPersonList().isEmpty()); + } +} diff --git a/src/test/java/seedu/address/logic/commands/EditCommandGuestTest.java b/src/test/java/seedu/address/logic/commands/EditCommandGuestTest.java index c8be3f1cd6f..3c2fef954f6 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandGuestTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandGuestTest.java @@ -1,180 +1,180 @@ -//package seedu.address.logic.commands; -// -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static org.junit.jupiter.api.Assertions.assertTrue; -//import static seedu.address.logic.commands.CommandTestUtil.DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -//import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; -//import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; -//import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_UNUSED; -//import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; -//import static seedu.address.testutil.TypicalPersons.BENSON_GUEST; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.commons.core.Messages; -//import seedu.address.logic.commands.EditCommand.EditGuestDescriptor; -//import seedu.address.model.AddressBook; -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.Guest; -//import seedu.address.model.person.Person; -//import seedu.address.testutil.EditGuestDescriptorBuilder; -//import seedu.address.testutil.GuestBuilder; -// -///** -// * Contains integration tests (interaction with the Model) and unit tests for EditCommand. -// */ -//public class EditCommandGuestTest { -// -// private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// -// @Test -// public void execute_allFieldsSpecifiedUnfilteredList_success() { -// Guest guest = ALICE_GUEST; -// Guest editedGuest = new GuestBuilder().build(); -// EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder(editedGuest).build(); -// EditCommand editCommand = new EditCommand(guest.getPassportNumber(), descriptor); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(guest, editedGuest); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_someFieldsSpecifiedUnfilteredList_success() { -// Guest guest = ALICE_GUEST; -// -// GuestBuilder guestBuilder = new GuestBuilder(guest); -// Person editedGuest = guestBuilder -// .withName(VALID_NAME_BOB) -// .withEmail(VALID_EMAIL_BOB) -// .build(); -// -// EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() -// .withName(VALID_NAME_BOB) -// .withEmail(VALID_EMAIL_BOB) -// .build(); -// -// EditCommand editCommand = new EditCommand(guest.getPassportNumber(), descriptor); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(guest, editedGuest); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_noFieldSpecifiedUnfilteredList_success() { -// // no fields are changed, so the edited guest stays exactly the same -// Guest editedGuest = ALICE_GUEST; -// -// EditCommand editCommand = new EditCommand(editedGuest.getPassportNumber(), new EditGuestDescriptor()); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_filteredList_success() { -// showPersonAtIndex(model, INDEX_FIRST_PERSON); -// -// Guest personInFilteredList = ALICE_GUEST; -// Person editedGuest = new GuestBuilder(personInFilteredList) -// .withName(VALID_NAME_BOB) -// .build(); -// EditCommand editCommand = new EditCommand( -// personInFilteredList.getPassportNumber(), -// new EditGuestDescriptorBuilder().withName(VALID_NAME_BOB).build() -// ); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(model.getFilteredPersonList().get(0), editedGuest); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_duplicateGuestUnfilteredList_failure() { -// Guest guest = ALICE_GUEST; -// EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder(guest).build(); -// EditCommand editCommand = new EditCommand(BENSON_GUEST.getPassportNumber(), descriptor); -// -// assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); -// } -// -// @Test -// public void execute_duplicateGuestFilteredList_failure() { -// showPersonAtIndex(model, INDEX_FIRST_PERSON); -// -// Guest personInList = BENSON_GUEST; -// EditCommand editCommand = new EditCommand(ALICE_GUEST.getPassportNumber(), -// new EditGuestDescriptorBuilder(personInList).build()); -// -// assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); -// } -// -// @Test -// public void execute_invalidPassportNumberUnfilteredList_failure() { -// EditCommand editCommand = new EditCommand(PASSPORT_NUMBER_UNUSED, new EditGuestDescriptor()); -// -// assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// // @Test -// // public void execute_invalidPassportNumberFilteredList_failure() { -// // showPersonAtIndex(model, INDEX_FIRST_PERSON); -// // Index outOfBoundIndex = INDEX_SECOND_PERSON; -// // // ensures that outOfBoundIndex is still in bounds of address book list -// // assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size()); -// // -// // EditCommand editCommand = new EditCommand(outOfBoundIndex, -// // new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build()); -// // -// // assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); -// // } -// -// @Test -// public void equals() { -// final EditCommand standardCommand = new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, DESC_ALICE); -// -// // same values -> returns true -// EditGuestDescriptor copyDescriptor = new EditGuestDescriptor(DESC_ALICE); -// EditCommand commandWithSameValues = new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, copyDescriptor); -// assertTrue(standardCommand.equals(commandWithSameValues)); -// -// // same object -> returns true -// assertTrue(standardCommand.equals(standardCommand)); -// -// // null -> returns false -// assertFalse(standardCommand.equals(null)); -// -// // different types -> returns false -// assertFalse(standardCommand.equals(new ClearCommand())); -// -// // different passport number -> returns false -// assertFalse(standardCommand.equals(new EditCommand(PASSPORT_NUMBER_SECOND_PERSON, DESC_ALICE))); -// -// // different descriptor -> returns false -// assertFalse(standardCommand.equals(new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, DESC_BOB))); -// } -// -//} +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; +import static seedu.address.testutil.TypicalIndexes.INDEX_FIRST_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_UNUSED; +import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; +import static seedu.address.testutil.TypicalPersons.BENSON_GUEST; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.Messages; +import seedu.address.logic.commands.EditCommand.EditGuestDescriptor; +import seedu.address.model.AddressBook; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.Guest; +import seedu.address.model.person.Person; +import seedu.address.testutil.EditGuestDescriptorBuilder; +import seedu.address.testutil.GuestBuilder; + +/** + * Contains integration tests (interaction with the Model) and unit tests for EditCommand. + */ +public class EditCommandGuestTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void execute_allFieldsSpecifiedUnfilteredList_success() { + Guest guest = ALICE_GUEST; + Guest editedGuest = new GuestBuilder().build(); + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder(editedGuest).build(); + EditCommand editCommand = new EditCommand(guest.getPassportNumber(), descriptor); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(guest, editedGuest); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_someFieldsSpecifiedUnfilteredList_success() { + Guest guest = ALICE_GUEST; + + GuestBuilder guestBuilder = new GuestBuilder(guest); + Person editedGuest = guestBuilder + .withName(VALID_NAME_BENSON) + .withEmail(VALID_EMAIL_BENSON) + .build(); + + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() + .withName(VALID_NAME_BENSON) + .withEmail(VALID_EMAIL_BENSON) + .build(); + + EditCommand editCommand = new EditCommand(guest.getPassportNumber(), descriptor); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(guest, editedGuest); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_noFieldSpecifiedUnfilteredList_success() { + // no fields are changed, so the edited guest stays exactly the same + Guest editedGuest = ALICE_GUEST; + + EditCommand editCommand = new EditCommand(editedGuest.getPassportNumber(), new EditGuestDescriptor()); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_filteredList_success() { + showPersonAtIndex(model, INDEX_FIRST_PERSON); + + Guest personInFilteredList = ALICE_GUEST; + Person editedGuest = new GuestBuilder(personInFilteredList) + .withName(VALID_NAME_BENSON) + .build(); + EditCommand editCommand = new EditCommand( + personInFilteredList.getPassportNumber(), + new EditGuestDescriptorBuilder().withName(VALID_NAME_BENSON).build() + ); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedGuest); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(model.getFilteredPersonList().get(0), editedGuest); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_duplicateGuestUnfilteredList_failure() { + Guest guest = ALICE_GUEST; + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder(guest).build(); + EditCommand editCommand = new EditCommand(BENSON_GUEST.getPassportNumber(), descriptor); + + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + } + + @Test + public void execute_duplicateGuestFilteredList_failure() { + showPersonAtIndex(model, INDEX_FIRST_PERSON); + + Guest personInList = BENSON_GUEST; + EditCommand editCommand = new EditCommand(ALICE_GUEST.getPassportNumber(), + new EditGuestDescriptorBuilder(personInList).build()); + + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + } + + @Test + public void execute_invalidPassportNumberUnfilteredList_failure() { + EditCommand editCommand = new EditCommand(PASSPORT_NUMBER_UNUSED, new EditGuestDescriptor()); + + assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + // @Test + // public void execute_invalidPassportNumberFilteredList_failure() { + // showPersonAtIndex(model, INDEX_FIRST_PERSON); + // Index outOfBoundIndex = INDEX_SECOND_PERSON; + // // ensures that outOfBoundIndex is still in bounds of address book list + // assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size()); + // + // EditCommand editCommand = new EditCommand(outOfBoundIndex, + // new EditPersonDescriptorBuilder().withName(VALID_NAME_BENSON).build()); + // + // assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); + // } + + @Test + public void equals() { + final EditCommand standardCommand = new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, DESC_ALICE); + + // same values -> returns true + EditGuestDescriptor copyDescriptor = new EditGuestDescriptor(DESC_ALICE); + EditCommand commandWithSameValues = new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, copyDescriptor); + assertTrue(standardCommand.equals(commandWithSameValues)); + + // same object -> returns true + assertTrue(standardCommand.equals(standardCommand)); + + // null -> returns false + assertFalse(standardCommand.equals(null)); + + // different types -> returns false + assertFalse(standardCommand.equals(new ClearCommand())); + + // different passport number -> returns false + assertFalse(standardCommand.equals(new EditCommand(PASSPORT_NUMBER_SECOND_PERSON, DESC_ALICE))); + + // different descriptor -> returns false + assertFalse(standardCommand.equals(new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, DESC_BENSON))); + } + +} diff --git a/src/test/java/seedu/address/logic/commands/EditCommandStaffTest.java b/src/test/java/seedu/address/logic/commands/EditCommandStaffTest.java index 145565efe00..4258f1d731e 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandStaffTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandStaffTest.java @@ -1,183 +1,186 @@ -//package seedu.address.logic.commands; -// -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static org.junit.jupiter.api.Assertions.assertTrue; -//import static seedu.address.logic.commands.CommandTestUtil.DESC_CHARLIE; -//import static seedu.address.logic.commands.CommandTestUtil.DESC_DANIEL; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -//import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; -//import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; -//import static seedu.address.testutil.TypicalPersons.ELLE_STAFF; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; -//import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_UNUSED; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.commons.core.Messages; -//import seedu.address.commons.core.index.Index; -//import seedu.address.logic.commands.EditCommand.EditStaffDescriptor; -//import seedu.address.model.AddressBook; -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.Person; -//import seedu.address.model.person.Staff; -//import seedu.address.testutil.EditStaffDescriptorBuilder; -//import seedu.address.testutil.StaffBuilder; -// -///** -// * Contains integration tests (interaction with the Model) and unit tests for EditCommand. -// */ -//public class EditCommandStaffTest { -// -// private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// -// @Test -// public void execute_allFieldsSpecifiedUnfilteredList_success() { -// Staff staff = DANIEL_STAFF; -// Staff editedStaff = new StaffBuilder().build(); -// EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder(editedStaff).build(); -// EditCommand editCommand = new EditCommand(staff.getStaffId(), descriptor); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(staff, editedStaff); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_someFieldsSpecifiedUnfilteredList_success() { -// Staff staff = DANIEL_STAFF; -// -// StaffBuilder staffBuilder = new StaffBuilder(staff); -// Person editedStaff = staffBuilder -// .withName(VALID_NAME_BOB) -// .withEmail(VALID_EMAIL_BOB) -// .build(); -// -// EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder() -// .withName(VALID_NAME_BOB) -// .withEmail(VALID_EMAIL_BOB) -// .build(); -// -// EditCommand editCommand = new EditCommand(staff.getStaffId(), descriptor); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(staff, editedStaff); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_noFieldSpecifiedUnfilteredList_success() { -// // no fields are changed, so the edited staff stays exactly the same -// Staff staff = DANIEL_STAFF; -// -// EditCommand editCommand = new EditCommand(staff.getStaffId(), new EditStaffDescriptor()); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, staff); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_filteredList_success() { -// // Hard-coded to show first Staff in TypicalPersons list -// showPersonAtIndex(model, Index.fromZeroBased(3)); -// -// Staff personInFilteredList = DANIEL_STAFF; -// Person editedStaff = new StaffBuilder(personInFilteredList) -// .withName(VALID_NAME_BOB) -// .build(); -// EditCommand editCommand = new EditCommand( -// personInFilteredList.getStaffId(), -// new EditStaffDescriptorBuilder().withName(VALID_NAME_BOB).build() -// ); -// -// String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); -// -// Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); -// expectedModel.setPerson(personInFilteredList, editedStaff); -// -// assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); -// } -// -// @Test -// public void execute_duplicateStaffUnfilteredList_failure() { -// Staff staff = DANIEL_STAFF; -// EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder(staff).build(); -// EditCommand editCommand = new EditCommand(ELLE_STAFF.getStaffId(), descriptor); -// -// assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); -// } -// -// @Test -// public void execute_duplicateStaffFilteredList_failure() { -// // Hard-coded to show first Staff in TypicalPersons list -// showPersonAtIndex(model, Index.fromZeroBased(3)); -// -// Staff personInList = ELLE_STAFF; -// EditCommand editCommand = new EditCommand(DANIEL_STAFF.getStaffId(), -// new EditStaffDescriptorBuilder(personInList).build()); -// -// assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); -// } -// -// @Test -// public void execute_invalidStaffIdUnfilteredList_failure() { -// EditCommand editCommand = new EditCommand(STAFF_ID_UNUSED, new EditStaffDescriptor()); -// -// assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); -// } -// -// // @Test -// // public void execute_invalidPassportNumberFilteredList_failure() { -// // showPersonAtIndex(model, INDEX_FIRST_PERSON); -// // Index outOfBoundIndex = INDEX_SECOND_PERSON; -// // // ensures that outOfBoundIndex is still in bounds of address book list -// // assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size()); -// // -// // EditCommand editCommand = new EditCommand(outOfBoundIndex, -// // new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB).build()); -// // -// // assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); -// // } -// -// @Test -// public void equals() { -// // Something needs to be done about DESC_CHARLIE?? Change to something else?? -// final EditCommand standardCommand = new EditCommand(STAFF_ID_FIRST_PERSON, DESC_CHARLIE); -// -// // same values -> returns true -// EditStaffDescriptor copyDescriptor = new EditStaffDescriptor(DESC_CHARLIE); -// EditCommand commandWithSameValues = new EditCommand(STAFF_ID_FIRST_PERSON, copyDescriptor); -// assertTrue(standardCommand.equals(commandWithSameValues)); -// -// // same object -> returns true -// assertTrue(standardCommand.equals(standardCommand)); -// -// // null -> returns false -// assertFalse(standardCommand.equals(null)); -// -// // different types -> returns false -// assertFalse(standardCommand.equals(new ClearCommand())); -// -// // different staff id -> returns false -// assertFalse(standardCommand.equals(new EditCommand(STAFF_ID_SECOND_PERSON, DESC_CHARLIE))); -// -// // different descriptor -> returns false -// assertFalse(standardCommand.equals(new EditCommand(STAFF_ID_FIRST_PERSON, DESC_DANIEL))); -// } -// -//} +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.logic.commands.CommandTestUtil.showPersonAtIndex; +import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; +import static seedu.address.testutil.TypicalPersons.ELLE_STAFF; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_UNUSED; + +import org.junit.jupiter.api.Test; + +import seedu.address.commons.core.Messages; +import seedu.address.commons.core.index.Index; +import seedu.address.logic.commands.EditCommand.EditStaffDescriptor; +import seedu.address.model.AddressBook; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.Person; +import seedu.address.model.person.Staff; +import seedu.address.model.person.StaffId; +import seedu.address.model.person.UniqueIdentifier; +import seedu.address.testutil.EditStaffDescriptorBuilder; +import seedu.address.testutil.StaffBuilder; + +/** + * Contains integration tests (interaction with the Model) and unit tests for EditCommand. + */ +public class EditCommandStaffTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void execute_allFieldsSpecifiedUnfilteredList_success() { + Staff staff = DANIEL_STAFF; + Staff editedStaff = new StaffBuilder().build(); + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder(editedStaff).build(); + EditCommand editCommand = new EditCommand(staff.getStaffId(), descriptor); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(staff, editedStaff); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_someFieldsSpecifiedUnfilteredList_success() { + Staff staff = DANIEL_STAFF; + + StaffBuilder staffBuilder = new StaffBuilder(staff); + Person editedStaff = staffBuilder + .withName(VALID_NAME_DANIEL) + .withEmail(VALID_EMAIL_DANIEL) + .build(); + + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder() + .withName(VALID_NAME_DANIEL) + .withEmail(VALID_EMAIL_DANIEL) + .build(); + + EditCommand editCommand = new EditCommand(staff.getStaffId(), descriptor); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(staff, editedStaff); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_noFieldSpecifiedUnfilteredList_success() { + // no fields are changed, so the edited staff stays exactly the same + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + EditStaffDescriptor editStaffDescriptor = + new EditStaffDescriptorBuilder().withStaffId(VALID_STAFF_ID_DANIEL).build(); + EditCommand editCommand = new EditCommand(targetIdentifier, editStaffDescriptor); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, DANIEL_STAFF); + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_filteredList_success() { + // Hard-coded to show first Staff in TypicalPersons list + showPersonAtIndex(model, Index.fromZeroBased(3)); + + Staff personInFilteredList = DANIEL_STAFF; + Person editedStaff = new StaffBuilder(personInFilteredList) + .withName(VALID_NAME_DANIEL) + .build(); + EditCommand editCommand = new EditCommand( + personInFilteredList.getStaffId(), + new EditStaffDescriptorBuilder().withName(VALID_NAME_DANIEL).build() + ); + + String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedStaff); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.setPerson(personInFilteredList, editedStaff); + + assertCommandSuccess(editCommand, model, expectedMessage, expectedModel); + } + + @Test + public void execute_duplicateStaffUnfilteredList_failure() { + Staff staff = DANIEL_STAFF; + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder(staff).build(); + EditCommand editCommand = new EditCommand(ELLE_STAFF.getStaffId(), descriptor); + + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + } + + @Test + public void execute_duplicateStaffFilteredList_failure() { + // Hard-coded to show first Staff in TypicalPersons list + showPersonAtIndex(model, Index.fromZeroBased(3)); + + Staff personInList = ELLE_STAFF; + EditCommand editCommand = new EditCommand(DANIEL_STAFF.getStaffId(), + new EditStaffDescriptorBuilder(personInList).build()); + + assertCommandFailure(editCommand, model, EditCommand.MESSAGE_DUPLICATE_PERSON); + } + + @Test + public void execute_invalidStaffIdUnfilteredList_failure() { + EditCommand editCommand = new EditCommand(STAFF_ID_UNUSED, new EditStaffDescriptor()); + + assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_UNIQUE_IDENTIFIER); + } + + // @Test + // public void execute_invalidPassportNumberFilteredList_failure() { + // showPersonAtIndex(model, INDEX_FIRST_PERSON); + // Index outOfBoundIndex = INDEX_SECOND_PERSON; + // // ensures that outOfBoundIndex is still in bounds of address book list + // assertTrue(outOfBoundIndex.getZeroBased() < model.getAddressBook().getPersonList().size()); + // + // EditCommand editCommand = new EditCommand(outOfBoundIndex, + // new EditPersonDescriptorBuilder().withName(VALID_NAME_DANIEL).build()); + // + // assertCommandFailure(editCommand, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); + // } + + @Test + public void equals() { + // Something needs to be done about DESC_ELLE?? Change to something else?? + final EditCommand standardCommand = new EditCommand(STAFF_ID_FIRST_PERSON, DESC_ELLE); + + // same values -> returns true + EditStaffDescriptor copyDescriptor = new EditStaffDescriptor(DESC_ELLE); + EditCommand commandWithSameValues = new EditCommand(STAFF_ID_FIRST_PERSON, copyDescriptor); + assertTrue(standardCommand.equals(commandWithSameValues)); + + // same object -> returns true + assertTrue(standardCommand.equals(standardCommand)); + + // null -> returns false + assertFalse(standardCommand.equals(null)); + + // different types -> returns false + assertFalse(standardCommand.equals(new ClearCommand())); + + // different staff id -> returns false + assertFalse(standardCommand.equals(new EditCommand(STAFF_ID_SECOND_PERSON, DESC_ELLE))); + + // different descriptor -> returns false + assertFalse(standardCommand.equals(new EditCommand(STAFF_ID_FIRST_PERSON, DESC_DANIEL))); + } + +} diff --git a/src/test/java/seedu/address/logic/commands/EditGuestDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditGuestDescriptorTest.java index 2d1ba6cfb5a..2f1c39ffc39 100644 --- a/src/test/java/seedu/address/logic/commands/EditGuestDescriptorTest.java +++ b/src/test/java/seedu/address/logic/commands/EditGuestDescriptorTest.java @@ -3,12 +3,12 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.DESC_ALICE; -import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BENSON; import org.junit.jupiter.api.Test; @@ -33,26 +33,26 @@ public void equals() { assertFalse(DESC_ALICE.equals(5)); // different values -> returns false - assertFalse(DESC_ALICE.equals(DESC_BOB)); + assertFalse(DESC_ALICE.equals(DESC_BENSON)); // different name -> returns false - EditGuestDescriptor editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withName(VALID_NAME_BOB).build(); + EditGuestDescriptor editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withName(VALID_NAME_BENSON).build(); assertFalse(DESC_ALICE.equals(editedAmy)); // different email -> returns false - editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withEmail(VALID_EMAIL_BOB).build(); + editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withEmail(VALID_EMAIL_BENSON).build(); assertFalse(DESC_ALICE.equals(editedAmy)); // different tags -> returns false - editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withTags(VALID_TAG_HUSBAND).build(); + editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withTags(VALID_TAG_BENSON).build(); assertFalse(DESC_ALICE.equals(editedAmy)); // different passport number -> returns false - editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withPassportNumber(VALID_PASSPORT_NUMBER_BOB).build(); + editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withPassportNumber(VALID_PASSPORT_NUMBER_BENSON).build(); assertFalse(DESC_ALICE.equals(editedAmy)); // different room number -> returns false - editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withRoomNumber(VALID_ROOM_NUMBER_BOB).build(); + editedAmy = new EditGuestDescriptorBuilder(DESC_ALICE).withRoomNumber(VALID_ROOM_NUMBER_BENSON).build(); assertFalse(DESC_ALICE.equals(editedAmy)); } } diff --git a/src/test/java/seedu/address/logic/commands/EditStaffDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditStaffDescriptorTest.java index ea18cb2ba01..a4fd9363d99 100644 --- a/src/test/java/seedu/address/logic/commands/EditStaffDescriptorTest.java +++ b/src/test/java/seedu/address/logic/commands/EditStaffDescriptorTest.java @@ -2,14 +2,14 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static seedu.address.logic.commands.CommandTestUtil.DESC_CHARLIE; import static seedu.address.logic.commands.CommandTestUtil.DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.DESC_ELLE; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_DANIEL; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_DANIEL; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DANIEL; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_DANIEL; import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_DANIEL; import org.junit.jupiter.api.Test; @@ -21,46 +21,46 @@ public class EditStaffDescriptorTest { @Test public void equals() { // same values -> returns true - EditStaffDescriptor descriptorWithSameValues = new EditStaffDescriptor(DESC_CHARLIE); - assertTrue(DESC_CHARLIE.equals(descriptorWithSameValues)); + EditStaffDescriptor descriptorWithSameValues = new EditStaffDescriptor(DESC_ELLE); + assertTrue(DESC_ELLE.equals(descriptorWithSameValues)); // same object -> returns true - assertTrue(DESC_CHARLIE.equals(DESC_CHARLIE)); + assertTrue(DESC_ELLE.equals(DESC_ELLE)); // null -> returns false - assertFalse(DESC_CHARLIE.equals(null)); + assertFalse(DESC_ELLE.equals(null)); // different types -> returns false - assertFalse(DESC_CHARLIE.equals(5)); + assertFalse(DESC_ELLE.equals(5)); // different values -> returns false - assertFalse(DESC_CHARLIE.equals(DESC_DANIEL)); + assertFalse(DESC_ELLE.equals(DESC_DANIEL)); // different name -> returns false - EditStaffDescriptor editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE) + EditStaffDescriptor editedElle = new EditStaffDescriptorBuilder(DESC_ELLE) .withName(VALID_NAME_DANIEL) .build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + assertFalse(DESC_ELLE.equals(editedElle)); // different email -> returns false - editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE).withEmail(VALID_EMAIL_DANIEL).build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + editedElle = new EditStaffDescriptorBuilder(DESC_ELLE).withEmail(VALID_EMAIL_DANIEL).build(); + assertFalse(DESC_ELLE.equals(editedElle)); // different tags -> returns false - editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE).withTags(VALID_TAG_FRIEND).build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + editedElle = new EditStaffDescriptorBuilder(DESC_ELLE).withTags(VALID_TAG_DANIEL).build(); + assertFalse(DESC_ELLE.equals(editedElle)); // different address -> returns false - editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE).withAddress(VALID_ADDRESS_DANIEL).build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + editedElle = new EditStaffDescriptorBuilder(DESC_ELLE).withAddress(VALID_ADDRESS_DANIEL).build(); + assertFalse(DESC_ELLE.equals(editedElle)); // different phone -> returns false - editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE).withPhone(VALID_PHONE_DANIEL).build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + editedElle = new EditStaffDescriptorBuilder(DESC_ELLE).withPhone(VALID_PHONE_DANIEL).build(); + assertFalse(DESC_ELLE.equals(editedElle)); // different staff id -> returns false - editedCharlie = new EditStaffDescriptorBuilder(DESC_CHARLIE).withStaffId(VALID_STAFF_ID_DANIEL).build(); - assertFalse(DESC_CHARLIE.equals(editedCharlie)); + editedElle = new EditStaffDescriptorBuilder(DESC_ELLE).withStaffId(VALID_STAFF_ID_DANIEL).build(); + assertFalse(DESC_ELLE.equals(editedElle)); } } diff --git a/src/test/java/seedu/address/logic/commands/FilterCommandTest.java b/src/test/java/seedu/address/logic/commands/FilterCommandTest.java new file mode 100644 index 00000000000..2eaa298e2cf --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/FilterCommandTest.java @@ -0,0 +1,78 @@ +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.commons.core.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import java.util.Arrays; +import java.util.Collections; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.TagContainsKeywordsPredicate; +import seedu.address.model.tag.Tag; + +public class FilterCommandTest { + + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + private Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void equals() { + TagContainsKeywordsPredicate firstPredicate = + new TagContainsKeywordsPredicate(Collections.singletonList(new Tag("123"))); + TagContainsKeywordsPredicate secondPredicate = + new TagContainsKeywordsPredicate(Collections.singletonList(new Tag("123456121D"))); + + FilterCommand filterFirstCommand = new FilterCommand(firstPredicate); + FilterCommand filterSecondCommand = new FilterCommand(secondPredicate); + + // same object -> returns true + assertTrue(filterFirstCommand.equals(filterFirstCommand)); + + // same values -> returns true + FilterCommand findFirstCommandCopy = new FilterCommand(firstPredicate); + assertTrue(filterFirstCommand.equals(findFirstCommandCopy)); + + // different types -> returns false + assertFalse(filterFirstCommand.equals(1)); + + // null -> returns false + assertFalse(filterFirstCommand.equals(null)); + + // different person -> returns false + assertFalse(filterFirstCommand.equals(filterSecondCommand)); + } + + @Test + public void execute_noTags_noPersonFiltered() { + String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0); + TagContainsKeywordsPredicate predicate = preparePredicate(" "); + FilterCommand command = new FilterCommand(predicate); + expectedModel.updateFilteredPersonList(predicate); + expectedModel.updateFilteredTagList(prepareTagPredicate(predicate)); + assertCommandSuccess(command, model, expectedMessage, expectedModel); + assertEquals(Collections.emptyList(), model.getFilteredPersonList()); + } + + /** + * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}. + */ + private TagContainsKeywordsPredicate preparePredicate(String userInput) { + return new TagContainsKeywordsPredicate(Arrays.asList(userInput.split("\\s+")).stream().map(Tag::new).collect( + Collectors.toList())); + } + + private Predicate prepareTagPredicate(TagContainsKeywordsPredicate predicate) { + return tag -> predicate.getTags().contains(tag); + } + +} diff --git a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java index 2d23541bb7b..b3618d354fe 100644 --- a/src/test/java/seedu/address/logic/commands/ViewCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/ViewCommandTest.java @@ -1,83 +1,70 @@ -//package seedu.address.logic.commands; -// -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static org.junit.jupiter.api.Assertions.assertTrue; -//import static seedu.address.commons.core.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW; -//import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -//import static seedu.address.testutil.TypicalPersons.CARL_GUEST; -//import static seedu.address.testutil.TypicalPersons.ELLE_STAFF; -//import static seedu.address.testutil.TypicalPersons.FIONA_STAFF; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -// -//import java.util.Arrays; -//import java.util.Collections; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.model.Model; -//import seedu.address.model.ModelManager; -//import seedu.address.model.UserPrefs; -//import seedu.address.model.person.IdentifierContainsKeywordsPredicate; -// -///** -// * Contains integration tests (interaction with the Model) for {@code FindCommand}. -// */ -//public class ViewCommandTest { -// private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// private Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs()); -// -// @Test -// public void equals() { -// IdentifierContainsKeywordsPredicate firstPredicate = -// new IdentifierContainsKeywordsPredicate(Collections.singletonList("first")); -// IdentifierContainsKeywordsPredicate secondPredicate = -// new IdentifierContainsKeywordsPredicate(Collections.singletonList("second")); -// -// ViewCommand findFirstCommand = new ViewCommand(firstPredicate); -// ViewCommand findSecondCommand = new ViewCommand(secondPredicate); -// -// // same object -> returns true -// assertTrue(findFirstCommand.equals(findFirstCommand)); -// -// // same values -> returns true -// ViewCommand findFirstCommandCopy = new ViewCommand(firstPredicate); -// assertTrue(findFirstCommand.equals(findFirstCommandCopy)); -// -// // different types -> returns false -// assertFalse(findFirstCommand.equals(1)); -// -// // null -> returns false -// assertFalse(findFirstCommand.equals(null)); -// -// // different person -> returns false -// assertFalse(findFirstCommand.equals(findSecondCommand)); -// } -// -// @Test -// public void execute_zeroKeywords_noPersonFound() { -// String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0); -// IdentifierContainsKeywordsPredicate predicate = preparePredicate(" "); -// ViewCommand command = new ViewCommand(predicate); -// expectedModel.updateFilteredPersonList(predicate); -// assertCommandSuccess(command, model, expectedMessage, expectedModel); -// assertEquals(Collections.emptyList(), model.getFilteredPersonList()); -// } -// -// @Test -// public void execute_multipleKeywords_multiplePersonsFound() { -// String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 3); -// IdentifierContainsKeywordsPredicate predicate = preparePredicate("Kurz Elle Kunz"); -// ViewCommand command = new ViewCommand(predicate); -// expectedModel.updateFilteredPersonList(predicate); -// assertCommandSuccess(command, model, expectedMessage, expectedModel); -// assertEquals(Arrays.asList(CARL_GUEST, ELLE_STAFF, FIONA_STAFF), model.getFilteredPersonList()); -// } -// -// /** -// * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}. -// */ -// private IdentifierContainsKeywordsPredicate preparePredicate(String userInput) { -// return new IdentifierContainsKeywordsPredicate(Arrays.asList(userInput.split("\\s+"))); -// } -//} +package seedu.address.logic.commands; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.commons.core.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import java.util.Arrays; +import java.util.Collections; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; +import seedu.address.model.person.IdentifierContainsKeywordsPredicate; + +/** + * Contains integration tests (interaction with the Model) for {@code ViewCommand}. + */ +public class ViewCommandTest { + private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + private Model expectedModel = new ModelManager(getTypicalAddressBook(), new UserPrefs()); + + @Test + public void equals() { + IdentifierContainsKeywordsPredicate firstPredicate = + new IdentifierContainsKeywordsPredicate(Collections.singletonList("123")); + IdentifierContainsKeywordsPredicate secondPredicate = + new IdentifierContainsKeywordsPredicate(Collections.singletonList("123456121D")); + + ViewCommand findFirstCommand = new ViewCommand(firstPredicate); + ViewCommand findSecondCommand = new ViewCommand(secondPredicate); + + // same object -> returns true + assertTrue(findFirstCommand.equals(findFirstCommand)); + + // same values -> returns true + ViewCommand findFirstCommandCopy = new ViewCommand(firstPredicate); + assertTrue(findFirstCommand.equals(findFirstCommandCopy)); + + // different types -> returns false + assertFalse(findFirstCommand.equals(1)); + + // null -> returns false + assertFalse(findFirstCommand.equals(null)); + + // different person -> returns false + assertFalse(findFirstCommand.equals(findSecondCommand)); + } + + @Test + public void execute_noIdentifier_noPersonFound() { + String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0); + IdentifierContainsKeywordsPredicate predicate = preparePredicate(" "); + ViewCommand command = new ViewCommand(predicate); + expectedModel.updateFilteredPersonList(predicate); + assertCommandSuccess(command, model, expectedMessage, expectedModel); + assertEquals(Collections.emptyList(), model.getFilteredPersonList()); + } + + /** + * Parses {@code userInput} into a {@code NameContainsKeywordsPredicate}. + */ + private IdentifierContainsKeywordsPredicate preparePredicate(String userInput) { + return new IdentifierContainsKeywordsPredicate(Arrays.asList(userInput.split("\\s+"))); + } +} diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index bbf5af36b91..fd3ce3124a8 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -1,152 +1,160 @@ -//package seedu.address.logic.parser; -// -//import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -//import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_DANIEL; -//import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_DANIEL; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_STAFF_ID; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_DANIEL; -//import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_DANIEL; -//import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY; -//import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; -//import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND; -//import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; -//import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; -//import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; -//import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.logic.commands.AddCommand; -//import seedu.address.model.person.Address; -//import seedu.address.model.person.Email; -//import seedu.address.model.person.Name; -//import seedu.address.model.person.Person; -//import seedu.address.model.person.Phone; -//import seedu.address.model.tag.Tag; -//import seedu.address.testutil.StaffBuilder; -// -//public class AddCommandParserTest { -// private AddCommandParser parser = new AddCommandParser(); -// -// @Test -// public void parse_allFieldsPresent_success() { -// -// Person expectedPerson = new StaffBuilder(DANIEL_STAFF).withTags(VALID_TAG_FRIEND).build(); -// -// // whitespace only preamble -// assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL -// + ADDRESS_DESC_DANIEL + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); -// -// // multiple names - last name accepted -// assertParseSuccess(parser, NAME_DESC_BOB + NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL -// + ADDRESS_DESC_DANIEL + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); -// -// // multiple phones - last phone accepted -// assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_BOB + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL -// + ADDRESS_DESC_DANIEL + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); -// -// // multiple emails - last email accepted -// assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_BOB + EMAIL_DESC_DANIEL -// + ADDRESS_DESC_DANIEL + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); -// -// // multiple addresses - last address accepted -// assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + ADDRESS_DESC_BOB -// + ADDRESS_DESC_DANIEL + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); -// -// // multiple tags - all accepted -// Person expectedPersonMultipleTags = new StaffBuilder(DANIEL_STAFF). -// withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND).build(); -// -// assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + ADDRESS_DESC_DANIEL -// + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, new AddCommand(expectedPersonMultipleTags)); -// } -// -// @Test -// public void parse_optionalFieldsMissing_success() { -// // zero tags -// Person expectedPerson = new StaffBuilder(DANIEL_STAFF).withTags().build(); -// assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + ADDRESS_DESC_DANIEL, -// new AddCommand(expectedPerson)); -// } -// -// @Test -// public void parse_compulsoryFieldMissing_failure() { -// String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE); -// -// // missing name prefix -// assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + STAFF_ID_DESC_BOB, expectedMessage); -// -// // missing phone prefix -// assertParseFailure(parser, NAME_DESC_BOB + VALID_PHONE_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + STAFF_ID_DESC_BOB, expectedMessage); -// -// // missing email prefix -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + VALID_EMAIL_BOB + ADDRESS_DESC_BOB -// + STAFF_ID_DESC_BOB, expectedMessage); -// -// // missing address prefix -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB -// + STAFF_ID_DESC_BOB, expectedMessage); -// -// // missing staff id prefix -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB -// + STAFF_ID_DESC_BOB, expectedMessage); -// -// // all prefixes missing -// assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB, -// expectedMessage); -// } -// -// @Test -// public void parse_invalidValue_failure() { -// // invalid name -// assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + STAFF_ID_DESC_BOB, Name.MESSAGE_CONSTRAINTS); -// -// // invalid phone -// assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + STAFF_ID_DESC_BOB, Phone.MESSAGE_CONSTRAINTS); -// -// // invalid email -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB -// + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + STAFF_ID_DESC_BOB, Email.MESSAGE_CONSTRAINTS); -// -// // invalid address -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC -// + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + STAFF_ID_DESC_BOB, Address.MESSAGE_CONSTRAINTS); -// -// // invalid tag -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + INVALID_TAG_DESC + VALID_TAG_FRIEND + STAFF_ID_DESC_BOB, Tag.MESSAGE_CONSTRAINTS); -// -// // invalid staff id -// assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB -// + TAG_DESC_HUSBAND + VALID_TAG_FRIEND + INVALID_STAFF_ID, Tag.MESSAGE_CONSTRAINTS); -// -// // two invalid values, only first invalid value reported -// assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC -// + STAFF_ID_DESC_BOB, Name.MESSAGE_CONSTRAINTS); -// -// // non-empty preamble -// assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB -// + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + STAFF_ID_DESC_BOB, -// String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); -// } -//} +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_STAFF_ID_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY; +import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_CHEF; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_SENIOR_STAFF; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_TAG; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_CHEF; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; + +import org.junit.jupiter.api.Test; + +import seedu.address.logic.commands.AddCommand; +import seedu.address.model.person.Address; +import seedu.address.model.person.Email; +import seedu.address.model.person.Name; +import seedu.address.model.person.Person; +import seedu.address.model.person.Phone; +import seedu.address.model.person.StaffId; +import seedu.address.model.tag.Tag; +import seedu.address.testutil.StaffBuilder; + +public class AddCommandParserTest { + private AddCommandParser parser = new AddCommandParser(); + + @Test + public void parse_allFieldsPresent_success() { + + Person expectedPerson = new StaffBuilder(DANIEL_STAFF).withTags(VALID_TAG_CHEF, VALID_STAFF_TAG).build(); + + // whitespace only preamble + assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, new AddCommand(expectedPerson)); + + // multiple names - last name accepted + assertParseSuccess(parser, NAME_DESC_ELLE + NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, new AddCommand(expectedPerson)); + + // multiple phones - last phone accepted + assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_ELLE + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, new AddCommand(expectedPerson)); + + // multiple emails - last email accepted + assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_ELLE + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, new AddCommand(expectedPerson)); + + // multiple addresses - last address accepted + + assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + ADDRESS_DESC_ELLE + + ADDRESS_DESC_DANIEL + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, new AddCommand(expectedPerson)); + + // multiple tags - all accepted + Person expectedPersonMultipleTags = new StaffBuilder(DANIEL_STAFF).withTags(VALID_TAG_CHEF, + VALID_TAG_SENIOR_STAFF, VALID_STAFF_TAG).build(); + + assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + ADDRESS_DESC_DANIEL + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_DANIEL, + new AddCommand(expectedPersonMultipleTags)); + + } + + @Test + public void parse_optionalFieldsMissing_success() { + // zero tags + + Person expectedPerson = new StaffBuilder(DANIEL_STAFF).withTags(VALID_STAFF_TAG).build(); + assertParseSuccess(parser, NAME_DESC_DANIEL + PHONE_DESC_DANIEL + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + STAFF_ID_DESC_DANIEL, + new AddCommand(expectedPerson)); + } + + @Test + public void parse_compulsoryFieldMissing_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE); + + // missing name prefix + assertParseFailure(parser, VALID_NAME_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + STAFF_ID_DESC_ELLE, expectedMessage); + + // missing phone prefix + assertParseFailure(parser, NAME_DESC_ELLE + VALID_PHONE_ELLE + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + STAFF_ID_DESC_ELLE, expectedMessage); + + // missing email prefix + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + VALID_EMAIL_ELLE + ADDRESS_DESC_ELLE + + STAFF_ID_DESC_ELLE, expectedMessage); + + // missing address prefix + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + VALID_ADDRESS_ELLE + + STAFF_ID_DESC_ELLE, expectedMessage); + + // missing staff id prefix + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + VALID_ADDRESS_ELLE + + STAFF_ID_DESC_ELLE, expectedMessage); + + // all prefixes missing + assertParseFailure(parser, VALID_NAME_ELLE + VALID_PHONE_ELLE + VALID_EMAIL_ELLE + VALID_ADDRESS_ELLE, + expectedMessage); + } + + @Test + public void parse_invalidValue_failure() { + // invalid name + assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, Name.MESSAGE_CONSTRAINTS); + + // invalid phone + assertParseFailure(parser, NAME_DESC_ELLE + INVALID_PHONE_DESC + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, Phone.MESSAGE_CONSTRAINTS); + + // invalid email + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + INVALID_EMAIL_DESC + ADDRESS_DESC_ELLE + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, Email.MESSAGE_CONSTRAINTS); + + // invalid address + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + INVALID_ADDRESS_DESC + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, Address.MESSAGE_CONSTRAINTS); + + // invalid tag + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + INVALID_TAG_DESC + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, Tag.MESSAGE_CONSTRAINTS); + + // invalid staff id + assertParseFailure(parser, NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + ADDRESS_DESC_ELLE + + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + INVALID_STAFF_ID_DESC, StaffId.MESSAGE_CONSTRAINTS); + + // two invalid values, only first invalid value reported + assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + INVALID_ADDRESS_DESC + + STAFF_ID_DESC_ELLE, Name.MESSAGE_CONSTRAINTS); + + // non-empty preamble + assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_ELLE + PHONE_DESC_ELLE + EMAIL_DESC_ELLE + + ADDRESS_DESC_ELLE + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + STAFF_ID_DESC_ELLE, + String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); + } +} diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java index 5c9e641f906..78416f91324 100644 --- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java @@ -12,9 +12,7 @@ import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_DEFAULT; import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.Test; @@ -104,11 +102,12 @@ public void parseCommand_exit() throws Exception { } @Test - public void parseCommand_find() throws Exception { - List keywords = Arrays.asList("foo", "bar", "baz"); + public void parseCommand_view() throws Exception { ViewCommand command = (ViewCommand) parser.parseCommand( - ViewCommand.COMMAND_WORD + " " + keywords.stream().collect(Collectors.joining(" "))); - assertEquals(new ViewCommand(new IdentifierContainsKeywordsPredicate(keywords)), command); + ViewCommand.COMMAND_WORD + " " + PREFIX_STAFF_ID + STAFF_ID_FIRST_PERSON.toString()); + assertEquals( + new ViewCommand(new IdentifierContainsKeywordsPredicate(List.of(STAFF_ID_FIRST_PERSON.toString()))), + command); } @Test diff --git a/src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java b/src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java index 98da07e6dc9..64c5183bc7f 100644 --- a/src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/DeleteCommandParserTest.java @@ -1,6 +1,7 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; @@ -9,6 +10,7 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.commands.DeleteCommand; +import seedu.address.model.person.StaffId; /** * As we are only doing white-box testing, our test cases do not cover path variations @@ -34,12 +36,31 @@ public void parse_validStaffIdArgs_returnsDeleteCommand() { @Test public void parse_invalidPassportNumberArgs_throwsParseException() { assertParseFailure(parser, "delete pn/", - String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE)); + String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE, + StaffId.MESSAGE_CONSTRAINTS)); } @Test public void parse_invalidStaffIdArgs_throwsParseException() { assertParseFailure(parser, "delete sid/", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE, + StaffId.MESSAGE_CONSTRAINTS)); + } + + @Test + public void parse_invalidDeleteCommand_throwsParseException() { + assertParseFailure(parser, "delete", String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE)); } + + @Test + public void parse_multipleUniqueIdentifiers_throwsParseException() { + assertParseFailure(parser, "delete pn/E0123122G sid/123", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE, + MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER)); + + assertParseFailure(parser, "delete sid/123 pn/E0123122G", + String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteCommand.MESSAGE_USAGE, + MESSAGE_INVALID_MULTIPLE_UNIQUE_IDENTIFIER)); + } } diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index 1f55acd8441..62f2c1d1ddd 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -1,198 +1,372 @@ -//package seedu.address.logic.parser; -// -//import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -//import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; -//import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND; -//import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_ALICE; -//import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; -//import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; -//import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; -// -//import org.junit.jupiter.api.Test; -// -//import seedu.address.logic.commands.EditCommand; -//import seedu.address.model.person.Address; -//import seedu.address.model.person.Email; -//import seedu.address.model.person.Name; -//import seedu.address.model.person.Phone; -//import seedu.address.model.tag.Tag; -// -//public class EditCommandParserTest { -// -// private static final String TAG_EMPTY = " " + PREFIX_TAG; -// -// private static final String MESSAGE_INVALID_FORMAT = -// String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE); -// -// private EditCommandParser parser = new EditCommandParser(); -// -// @Test -// public void parse_missingParts_failure() { -// // no index specified -// assertParseFailure(parser, VALID_NAME_ALICE, MESSAGE_INVALID_FORMAT); -// -// // no field specified -// assertParseFailure(parser, "1", EditCommand.MESSAGE_NOT_EDITED); -// -// // no index and no field specified -// assertParseFailure(parser, "", MESSAGE_INVALID_FORMAT); -// } -// -// @Test -// public void parse_invalidPreamble_failure() { -// // negative index -// assertParseFailure(parser, "-5" + NAME_DESC_ALICE, MESSAGE_INVALID_FORMAT); -// -// // zero index -// assertParseFailure(parser, "0" + NAME_DESC_ALICE, MESSAGE_INVALID_FORMAT); -// -// // invalid arguments being parsed as preamble -// assertParseFailure(parser, "1 some random string", MESSAGE_INVALID_FORMAT); -// -// // invalid prefix being parsed as preamble -// assertParseFailure(parser, "1 i/ string", MESSAGE_INVALID_FORMAT); -// } -// -// @Test -// public void parse_invalidValue_failure() { -// assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name -// assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone -// assertParseFailure(parser, "1" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email -// assertParseFailure(parser, "1" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address -// assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag -// -// // invalid phone followed by valid email -// assertParseFailure(parser, "1" + INVALID_PHONE_DESC + EMAIL_DESC_ALICE, Phone.MESSAGE_CONSTRAINTS); -// -// // valid phone followed by invalid phone. The test case for invalid phone followed by valid phone -// // is tested at {@code parse_invalidValueFollowedByValidValue_success()} -// assertParseFailure(parser, "1" + PHONE_DESC_BOB + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); -// -// // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited, -// // parsing it together with a valid tag results in error -// assertParseFailure(parser, "1" + TAG_DESC_FRIEND + TAG_DESC_HUSBAND + TAG_EMPTY, Tag.MESSAGE_CONSTRAINTS); -// assertParseFailure(parser, "1" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS); -// assertParseFailure(parser, "1" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS); -// -// // multiple invalid values, but only the first invalid value is captured -// assertParseFailure(parser, "1" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_BOB + VALID_PHONE_BOB, -// Name.MESSAGE_CONSTRAINTS); -// } -// -// // // Edit Command Parser Tests for Guests -// // @Test -// // public void parse_allFieldsSpecified_success() { -// // UniqueIdentifier targetIdentifier = STAFF_ID_FIRST_PERSON; -// // String userInput = targetIdentifier + PHONE_DESC_BOB + TAG_DESC_HUSBAND -// // + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND; -// // -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder() -// // .withStaffId("123").withName(VALID_NAME_AMY) -// // .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) -// // .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// // -// // @Test -// // public void parse_someFieldsSpecified_success() { -// // UniqueIdentifier targetIdentifier = STAFF_ID_FIRST_PERSON; -// // String userInput = targetIdentifier + PHONE_DESC_BOB + EMAIL_DESC_AMY; -// // -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB) -// // .withEmail(VALID_EMAIL_AMY).build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// // -// // @Test -// // public void parse_oneFieldSpecified_success() { -// // // name -// // UniqueIdentifier targetIdentifier = STAFF_ID_SECOND_PERSON; -// // String userInput = targetIdentifier + NAME_DESC_AMY; -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY).build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // -// // // phone -// // userInput = targetIdentifier + PHONE_DESC_AMY; -// // descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_AMY).build(); -// // expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // -// // // email -// // userInput = targetIdentifier + EMAIL_DESC_AMY; -// // descriptor = new EditPersonDescriptorBuilder().withEmail(VALID_EMAIL_AMY).build(); -// // expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // -// // // address -// // userInput = targetIdentifier + ADDRESS_DESC_AMY; -// // descriptor = new EditPersonDescriptorBuilder().withAddress(VALID_ADDRESS_AMY).build(); -// // expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // -// // // tags -// // userInput = targetIdentifier + TAG_DESC_FRIEND; -// // descriptor = new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build(); -// // expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// // -// // @Test -// // public void parse_multipleRepeatedFields_acceptsLast() { -// // UniqueIdentifier targetIdentifier = STAFF_ID_FIRST_PERSON; -// // String userInput = targetIdentifier + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY -// // + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND -// // + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND; -// // -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB) -// // .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) -// // .withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND).build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// // -// // @Test -// // public void parse_invalidValueFollowedByValidValue_success() { -// // // no other valid values specified -// // UniqueIdentifier targetIdentifier = STAFF_ID_FIRST_PERSON; -// // String userInput = targetIdentifier + INVALID_PHONE_DESC + PHONE_DESC_BOB; -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB).build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // -// // // other valid values specified -// // userInput = targetIdentifier + EMAIL_DESC_BOB + INVALID_PHONE_DESC + ADDRESS_DESC_BOB -// // + PHONE_DESC_BOB; -// // descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB) -// // .withAddress(VALID_ADDRESS_BOB).build(); -// // expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// // -// // @Test -// // public void parse_resetTags_success() { -// // UniqueIdentifier targetIdentifier = STAFF_ID_SECOND_PERSON; -// // String userInput = targetIdentifier + TAG_EMPTY; -// // -// // EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withTags().build(); -// // EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); -// // -// // assertParseSuccess(parser, userInput, expectedCommand); -// // } -// -// // Edit Command Parser Tests for Staff -//} +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_PASSPORT_NUMBER_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_ROOM_NUMBER_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.ROOM_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.ROOM_NUMBER_DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_CHEF; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_DELUXE_ROOM; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_SENIOR_STAFF; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_VIP; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_CHEF; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_DELUXE_ROOM; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_VIP; +import static seedu.address.logic.parser.CliSyntax.PREFIX_PASSPORT_NUMBER; +import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FIRST_PERSON; +import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_FIRST_PERSON; + +import org.junit.jupiter.api.Test; + +import seedu.address.logic.commands.EditCommand; +import seedu.address.logic.commands.EditCommand.EditGuestDescriptor; +import seedu.address.logic.commands.EditCommand.EditStaffDescriptor; +import seedu.address.model.person.Address; +import seedu.address.model.person.Email; +import seedu.address.model.person.Name; +import seedu.address.model.person.PassportNumber; +import seedu.address.model.person.Phone; +import seedu.address.model.person.RoomNumber; +import seedu.address.model.person.StaffId; +import seedu.address.model.person.UniqueIdentifier; +import seedu.address.model.tag.Tag; +import seedu.address.testutil.EditGuestDescriptorBuilder; +import seedu.address.testutil.EditStaffDescriptorBuilder; + +public class EditCommandParserTest { + + private static final String TAG_EMPTY = " " + PREFIX_TAG; + + private static final String MESSAGE_INVALID_FORMAT = + String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE); + + private EditCommandParser parser = new EditCommandParser(); + + @Test + public void parse_validPassportNumberArgs_returnsEditCommand() { + EditGuestDescriptor editGuestDescriptor = new EditGuestDescriptor(); + editGuestDescriptor.setPassportNumber(new PassportNumber("E0123122G")); + assertParseSuccess(parser, + EditCommand.COMMAND_WORD + + " " + + PREFIX_PASSPORT_NUMBER + + PASSPORT_NUMBER_FIRST_PERSON, + new EditCommand(PASSPORT_NUMBER_FIRST_PERSON, editGuestDescriptor)); + } + + @Test + public void parse_validStaffIdArgs_returnsEditCommand() { + // why did this make a difference? + EditStaffDescriptor editStaffDescriptor = new EditStaffDescriptor(); + editStaffDescriptor.setStaffId(new StaffId("123")); + assertParseSuccess(parser, + EditCommand.COMMAND_WORD + + " " + + PREFIX_STAFF_ID + + STAFF_ID_FIRST_PERSON, + new EditCommand(STAFF_ID_FIRST_PERSON, editStaffDescriptor)); + } + + @Test + public void parse_invalidValueForStaff_failure() { + String partialUserInput = EditCommand.COMMAND_WORD + + " " + + PREFIX_STAFF_ID + + STAFF_ID_FIRST_PERSON; + + assertParseFailure(parser, "edit sid/", StaffId.MESSAGE_CONSTRAINTS); // invalid staff id + assertParseFailure(parser, partialUserInput + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name + assertParseFailure(parser, partialUserInput + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone + assertParseFailure(parser, partialUserInput + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email + assertParseFailure(parser, partialUserInput + INVALID_ADDRESS_DESC, + Address.MESSAGE_CONSTRAINTS); // invalid address + assertParseFailure(parser, partialUserInput + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag + + // invalid phone followed by valid email + assertParseFailure(parser, partialUserInput + INVALID_PHONE_DESC + EMAIL_DESC_ALICE, Phone.MESSAGE_CONSTRAINTS); + + // valid phone followed by invalid phone. The test case for invalid phone followed by valid phone + // is tested at {@code parse_invalidValueFollowedByValidValue_success()} + assertParseFailure(parser, partialUserInput + PHONE_DESC_DANIEL + INVALID_PHONE_DESC, + Phone.MESSAGE_CONSTRAINTS); + + // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} being edited, + // parsing it together with a valid tag results in error + assertParseFailure(parser, partialUserInput + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF + TAG_EMPTY, + Tag.MESSAGE_CONSTRAINTS); + assertParseFailure(parser, partialUserInput + TAG_DESC_SENIOR_STAFF + TAG_EMPTY + TAG_DESC_CHEF, + Tag.MESSAGE_CONSTRAINTS); + assertParseFailure(parser, partialUserInput + TAG_EMPTY + TAG_DESC_SENIOR_STAFF + TAG_DESC_CHEF, + Tag.MESSAGE_CONSTRAINTS); + + // multiple invalid values, but only the first invalid value is captured + assertParseFailure(parser, + partialUserInput + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_DANIEL + VALID_PHONE_DANIEL, + Name.MESSAGE_CONSTRAINTS); + } + + @Test + public void parse_invalidValueForGuest_failure() { + String partialUserInput = EditCommand.COMMAND_WORD + + " " + + PREFIX_PASSPORT_NUMBER + + PASSPORT_NUMBER_FIRST_PERSON; + + assertParseFailure(parser, "edit pn/", PassportNumber.MESSAGE_CONSTRAINTS); // invalid passport number + assertParseFailure(parser, partialUserInput + INVALID_PASSPORT_NUMBER_DESC, + PassportNumber.MESSAGE_CONSTRAINTS); // invalid room number + assertParseFailure(parser, partialUserInput + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name + assertParseFailure(parser, partialUserInput + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email + assertParseFailure(parser, partialUserInput + INVALID_ROOM_NUMBER_DESC, + RoomNumber.MESSAGE_CONSTRAINTS); // invalid room number + assertParseFailure(parser, partialUserInput + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag + + // invalid room number followed by valid email + assertParseFailure(parser, partialUserInput + INVALID_ROOM_NUMBER_DESC + EMAIL_DESC_ALICE, + RoomNumber.MESSAGE_CONSTRAINTS); + + // valid room number followed by invalid room number. The test case for invalid room number followed + // by valid room number + // is tested at {@code parse_invalidValueFollowedByValidValue_success()} + assertParseFailure(parser, partialUserInput + VALID_ROOM_NUMBER_ALICE + INVALID_ROOM_NUMBER_DESC, + RoomNumber.MESSAGE_CONSTRAINTS); + + + // is this still relevant for us ? + // // while parsing {@code PREFIX_TAG} alone will reset the tags of the {@code Person} + // being edited, + // // parsing it together with a valid tag results in error + // assertParseFailure(parser, partialUserInput + VALID_TAG_VIP + VALID_TAG_DELUXE_ROOM + // + TAG_EMPTY, + // Tag.MESSAGE_CONSTRAINTS); + // assertParseFailure(parser, partialUserInput + VALID_TAG_VIP + TAG_EMPTY + VALID_TAG_DELUXE_ROOM, + // Tag.MESSAGE_CONSTRAINTS); + // assertParseFailure(parser, partialUserInput + TAG_EMPTY + VALID_TAG_VIP + VALID_TAG_DELUXE_ROOM, + // Tag.MESSAGE_CONSTRAINTS); + + // multiple invalid values, but only the first invalid value is captured + assertParseFailure(parser, partialUserInput + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ROOM_NUMBER_ALICE + + VALID_PASSPORT_NUMBER_ALICE, + Name.MESSAGE_CONSTRAINTS); + } + + @Test + public void parse_allFieldsSpecifiedForStaff_success() { + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + String userInput = EditCommand.COMMAND_WORD + + STAFF_ID_DESC_DANIEL + + PHONE_DESC_DANIEL + + TAG_DESC_CHEF + + EMAIL_DESC_DANIEL + + ADDRESS_DESC_DANIEL + + NAME_DESC_DANIEL + + TAG_DESC_SENIOR_STAFF; + + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder() + .withStaffId(VALID_STAFF_ID_DANIEL) + .withName(VALID_NAME_DANIEL) + .withPhone(VALID_PHONE_DANIEL) + .withEmail(VALID_EMAIL_DANIEL) + .withAddress(VALID_ADDRESS_DANIEL) + .withTags(VALID_TAG_CHEF, VALID_TAG_SENIOR_STAFF).build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_allFieldsSpecifiedForGuest_success() { + UniqueIdentifier targetIdentifier = new PassportNumber(VALID_PASSPORT_NUMBER_ALICE); + String userInput = EditCommand.COMMAND_WORD + + PASSPORT_NUMBER_DESC_ALICE + + TAG_DESC_DELUXE_ROOM + + NAME_DESC_ALICE + + EMAIL_DESC_ALICE + + TAG_DESC_VIP + + ROOM_NUMBER_DESC_ALICE; + + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() + .withPassportNumber(VALID_PASSPORT_NUMBER_ALICE) + .withName(VALID_NAME_ALICE) + .withEmail(VALID_EMAIL_ALICE) + .withRoomNumber(VALID_ROOM_NUMBER_ALICE) + .withTags(VALID_TAG_VIP, VALID_TAG_DELUXE_ROOM) + .build(); + + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_someFieldsSpecifiedForStaff_success() { + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + String userInput = EditCommand.COMMAND_WORD + + STAFF_ID_DESC_DANIEL + + ADDRESS_DESC_DANIEL; + + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder() + .withStaffId(VALID_STAFF_ID_DANIEL) + .withAddress(VALID_ADDRESS_DANIEL) + .build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_someFieldsSpecifiedForGuest_success() { + UniqueIdentifier targetIdentifier = new PassportNumber(VALID_PASSPORT_NUMBER_ALICE); + String userInput = EditCommand.COMMAND_WORD + + PASSPORT_NUMBER_DESC_ALICE + + ROOM_NUMBER_DESC_ALICE; + + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() + .withPassportNumber(VALID_PASSPORT_NUMBER_ALICE) + .withRoomNumber(VALID_ROOM_NUMBER_ALICE) + .build(); + + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_multipleRepeatedFieldsForStaff_acceptsLast() { + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + String userInput = EditCommand.COMMAND_WORD + + STAFF_ID_DESC_DANIEL + PHONE_DESC_DANIEL + ADDRESS_DESC_DANIEL + EMAIL_DESC_DANIEL + + TAG_DESC_SENIOR_STAFF + PHONE_DESC_ELLE + ADDRESS_DESC_ELLE + EMAIL_DESC_ELLE + TAG_DESC_SENIOR_STAFF + + PHONE_DESC_DANIEL + ADDRESS_DESC_DANIEL + EMAIL_DESC_DANIEL + TAG_DESC_CHEF; + + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder().withStaffId(VALID_STAFF_ID_DANIEL) + .withPhone(VALID_PHONE_DANIEL).withEmail(VALID_EMAIL_DANIEL).withAddress(VALID_ADDRESS_DANIEL) + .withTags(VALID_TAG_SENIOR_STAFF, VALID_TAG_CHEF).build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_multipleRepeatedFieldsForGuest_acceptsLast() { + UniqueIdentifier targetIdentifier = new PassportNumber(VALID_PASSPORT_NUMBER_ALICE); + String userInput = EditCommand.COMMAND_WORD + + PASSPORT_NUMBER_DESC_BENSON + + NAME_DESC_BENSON + + ROOM_NUMBER_DESC_BENSON + + PASSPORT_NUMBER_DESC_ALICE + + TAG_DESC_DELUXE_ROOM + + NAME_DESC_ALICE + + EMAIL_DESC_ALICE + + TAG_DESC_VIP + + ROOM_NUMBER_DESC_ALICE; + + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() + .withPassportNumber(VALID_PASSPORT_NUMBER_ALICE) + .withName(VALID_NAME_ALICE) + .withEmail(VALID_EMAIL_ALICE) + .withRoomNumber(VALID_ROOM_NUMBER_ALICE) + .withTags(VALID_TAG_VIP, VALID_TAG_DELUXE_ROOM) + .build(); + + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_invalidValueFollowedByValidValueForStaff_success() { + // no other valid values specified + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + String userInput = EditCommand.COMMAND_WORD + STAFF_ID_DESC_DANIEL + INVALID_PHONE_DESC + PHONE_DESC_DANIEL; + EditStaffDescriptor descriptor = new EditStaffDescriptorBuilder() + .withStaffId(VALID_STAFF_ID_DANIEL) + .withPhone(VALID_PHONE_DANIEL) + .build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + assertParseSuccess(parser, userInput, expectedCommand); + + // other valid values specified + userInput = EditCommand.COMMAND_WORD + STAFF_ID_DESC_DANIEL + EMAIL_DESC_DANIEL + INVALID_PHONE_DESC + + ADDRESS_DESC_DANIEL + PHONE_DESC_DANIEL; + descriptor = new EditStaffDescriptorBuilder() + .withStaffId(VALID_STAFF_ID_DANIEL) + .withPhone(VALID_PHONE_DANIEL) + .withEmail(VALID_EMAIL_DANIEL) + .withAddress(VALID_ADDRESS_DANIEL) + .build(); + expectedCommand = new EditCommand(targetIdentifier, descriptor); + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_invalidValueFollowedByValidValueForGuest_success() { + UniqueIdentifier targetIdentifier = new PassportNumber(VALID_PASSPORT_NUMBER_ALICE); + String userInput = + EditCommand.COMMAND_WORD + PASSPORT_NUMBER_DESC_ALICE + INVALID_EMAIL_DESC + ROOM_NUMBER_DESC_ALICE + + EMAIL_DESC_ALICE; + EditGuestDescriptor descriptor = new EditGuestDescriptorBuilder() + .withPassportNumber(VALID_PASSPORT_NUMBER_ALICE) + .withRoomNumber(VALID_ROOM_NUMBER_ALICE) + .withEmail(VALID_EMAIL_ALICE) + .build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_resetTagsForStaff_success() { + UniqueIdentifier targetIdentifier = new StaffId(VALID_STAFF_ID_DANIEL); + String userInput = EditCommand.COMMAND_WORD + STAFF_ID_DESC_DANIEL + TAG_EMPTY; + + EditStaffDescriptor descriptor = + new EditStaffDescriptorBuilder().withStaffId(VALID_STAFF_ID_DANIEL).withTags().build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } + + @Test + public void parse_resetTagsForGuest_success() { + UniqueIdentifier targetIdentifier = new PassportNumber(VALID_PASSPORT_NUMBER_ALICE); + String userInput = EditCommand.COMMAND_WORD + PASSPORT_NUMBER_DESC_ALICE + TAG_EMPTY; + + EditGuestDescriptor descriptor = + new EditGuestDescriptorBuilder().withPassportNumber(VALID_PASSPORT_NUMBER_ALICE).withTags().build(); + EditCommand expectedCommand = new EditCommand(targetIdentifier, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } +} diff --git a/src/test/java/seedu/address/logic/parser/FilterCommandParserTest.java b/src/test/java/seedu/address/logic/parser/FilterCommandParserTest.java new file mode 100644 index 00000000000..9db05568a8d --- /dev/null +++ b/src/test/java/seedu/address/logic/parser/FilterCommandParserTest.java @@ -0,0 +1,62 @@ +package seedu.address.logic.parser; + +import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_MISSING_ARGUMENTS; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_CARL; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_ALICE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; +import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import seedu.address.logic.commands.FilterCommand; +import seedu.address.model.person.TagContainsKeywordsPredicate; +import seedu.address.model.tag.Tag; + +public class FilterCommandParserTest { + + private FilterCommandParser parser = new FilterCommandParser(); + + @Test + public void parse_emptyArg_throwsParseException() { + assertParseFailure(parser, " ", String.format(MESSAGE_MISSING_ARGUMENTS, FilterCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_wrongArguments_throwsParseException() { + assertParseFailure(parser, FilterCommand.COMMAND_WORD + " " + STAFF_ID_DESC_DANIEL + " " + STAFF_ID_DESC_ELLE, + String.format(MESSAGE_INVALID_COMMAND_FORMAT, FilterCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_moreWrongArguments_throwsParseException() { + assertParseFailure(parser, + FilterCommand.COMMAND_WORD + " " + PASSPORT_NUMBER_DESC_ALICE + " " + PASSPORT_NUMBER_DESC_CARL, + String.format(MESSAGE_INVALID_COMMAND_FORMAT, FilterCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_prefixButNoArg_throwsParseException() { + assertParseFailure(parser, + " " + PREFIX_TAG, + String.format(MESSAGE_MISSING_ARGUMENTS, FilterCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_validArgs_returnsFilterCommand() { + // no leading and trailing whitespaces + FilterCommand expectedFilterCommand = + new FilterCommand(new TagContainsKeywordsPredicate(List.of(new Tag(VALID_TAG_ALICE)))); + assertParseSuccess(parser, TAG_DESC_ALICE, expectedFilterCommand); + + // whitespaces between keywords + assertParseSuccess(parser, " " + PREFIX_TAG + " " + VALID_TAG_ALICE, expectedFilterCommand); + } +} diff --git a/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java index ac06728bbd3..76c4910c480 100644 --- a/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/ViewCommandParserTest.java @@ -1,10 +1,18 @@ package seedu.address.logic.parser; -import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.commons.core.Messages.MESSAGE_MISSING_ARGUMENTS; +import static seedu.address.commons.core.Messages.MESSAGE_TOO_MANY_ARGUMENTS; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.PASSPORT_NUMBER_DESC_CARL; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.STAFF_ID_DESC_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_STAFF_ID; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; -import java.util.Arrays; +import java.util.List; import org.junit.jupiter.api.Test; @@ -17,18 +25,38 @@ public class ViewCommandParserTest { @Test public void parse_emptyArg_throwsParseException() { - assertParseFailure(parser, " ", String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewCommand.MESSAGE_USAGE)); + assertParseFailure(parser, " ", String.format(MESSAGE_MISSING_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); } @Test - public void parse_validArgs_returnsFindCommand() { + public void parse_twoSid_throwsParseException() { + assertParseFailure(parser, ViewCommand.COMMAND_WORD + " " + STAFF_ID_DESC_DANIEL + " " + STAFF_ID_DESC_ELLE, + String.format(MESSAGE_TOO_MANY_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_twoPassport_throwsParseException() { + assertParseFailure(parser, + ViewCommand.COMMAND_WORD + " " + PASSPORT_NUMBER_DESC_ALICE + " " + PASSPORT_NUMBER_DESC_CARL, + String.format(MESSAGE_TOO_MANY_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_oneSidOnePassport_throwsParseException() { + assertParseFailure(parser, + ViewCommand.COMMAND_WORD + " " + STAFF_ID_DESC_DANIEL + " " + PASSPORT_NUMBER_DESC_BENSON, + String.format(MESSAGE_TOO_MANY_ARGUMENTS, ViewCommand.MESSAGE_USAGE)); + } + + @Test + public void parse_validArgs_returnsViewCommand() { // no leading and trailing whitespaces ViewCommand expectedViewCommand = - new ViewCommand(new IdentifierContainsKeywordsPredicate(Arrays.asList("Alice", "Bob"))); - assertParseSuccess(parser, "Alice Bob", expectedViewCommand); + new ViewCommand(new IdentifierContainsKeywordsPredicate(List.of(VALID_STAFF_ID_DANIEL))); + assertParseSuccess(parser, STAFF_ID_DESC_DANIEL, expectedViewCommand); - // multiple whitespaces between keywords - assertParseSuccess(parser, " \n Alice \n \t Bob \t", expectedViewCommand); + // whitespaces between keywords + assertParseSuccess(parser, " " + PREFIX_STAFF_ID + " " + VALID_STAFF_ID_DANIEL, expectedViewCommand); } } diff --git a/src/test/java/seedu/address/model/AddressBookTest.java b/src/test/java/seedu/address/model/AddressBookTest.java index c632a4b6923..02dd95d5875 100644 --- a/src/test/java/seedu/address/model/AddressBookTest.java +++ b/src/test/java/seedu/address/model/AddressBookTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; @@ -47,8 +47,9 @@ public void resetData_withValidReadOnlyAddressBook_replacesData() { @Test public void resetData_withDuplicatePersons_throwsDuplicatePersonException() { // Two persons with the same identity fields - Person editedDaniel = new StaffBuilder(DANIEL_STAFF).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + Person editedDaniel = + new StaffBuilder(DANIEL_STAFF).withAddress(VALID_ADDRESS_ELLE).withTags(VALID_TAG_SENIOR_STAFF) + .build(); List newPersons = Arrays.asList(DANIEL_STAFF, editedDaniel); AddressBookStub newData = new AddressBookStub(newPersons); @@ -74,8 +75,9 @@ public void hasPerson_personInAddressBook_returnsTrue() { @Test public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() { addressBook.addPerson(DANIEL_STAFF); - Person editedAlice = new StaffBuilder(DANIEL_STAFF).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + Person editedAlice = + new StaffBuilder(DANIEL_STAFF).withAddress(VALID_ADDRESS_ELLE).withTags(VALID_TAG_SENIOR_STAFF) + .build(); assertTrue(addressBook.hasPerson(editedAlice)); } diff --git a/src/test/java/seedu/address/model/person/GuestTest.java b/src/test/java/seedu/address/model/person/GuestTest.java new file mode 100644 index 00000000000..88ac481bffc --- /dev/null +++ b/src/test/java/seedu/address/model/person/GuestTest.java @@ -0,0 +1,90 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; +import static seedu.address.testutil.Assert.assertThrows; +import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; +import static seedu.address.testutil.TypicalPersons.BENSON_GUEST; + +import org.junit.jupiter.api.Test; + +import seedu.address.testutil.GuestBuilder; + +public class GuestTest { + + @Test + public void asObservableList_modifyList_throwsUnsupportedOperationException() { + Person person = new GuestBuilder().build(); + assertThrows(UnsupportedOperationException.class, () -> person.getTags().remove(0)); + } + + @Test + public void isSamePerson() { + // same object -> returns true + assertTrue(ALICE_GUEST.isSamePerson(ALICE_GUEST)); + + // null -> returns false + assertFalse(ALICE_GUEST.isSamePerson(null)); + + // same passport number, all other attributes different -> returns true + Person editedFiona = new GuestBuilder(ALICE_GUEST) + .withName(VALID_NAME_BENSON) + .withEmail(VALID_EMAIL_BENSON) + .withRoomNumber(VALID_ROOM_NUMBER_BENSON) + .withTags(VALID_TAG_SENIOR_STAFF) + .build(); + + assertTrue(ALICE_GUEST.isSamePerson(editedFiona)); + + // different passport number, all other attributes same -> returns false + Person editedAlice = new GuestBuilder(ALICE_GUEST).withPassportNumber(VALID_PASSPORT_NUMBER_BENSON).build(); + assertFalse(ALICE_GUEST.isSamePerson(editedAlice)); + + // Passport number has trailing spaces, all other attributes same -> returns false + String passportWithTrailingSpaces = VALID_PASSPORT_NUMBER_BENSON + " "; + editedAlice = new GuestBuilder(ALICE_GUEST).withPassportNumber(passportWithTrailingSpaces).build(); + assertFalse(ALICE_GUEST.isSamePerson(editedAlice)); + } + + @Test + public void equals() { + // same values -> returns true + Person aliceCopy = new GuestBuilder(ALICE_GUEST).build(); + assertTrue(ALICE_GUEST.equals(aliceCopy)); + + // same object -> returns true + assertTrue(ALICE_GUEST.equals(ALICE_GUEST)); + + // null -> returns false + assertFalse(ALICE_GUEST.equals(null)); + + // different type -> returns false + assertFalse(ALICE_GUEST.equals(5)); + + // different person -> returns false + assertFalse(ALICE_GUEST.equals(BENSON_GUEST)); + + // different passport number -> returns false + Person editedFiona = new GuestBuilder(ALICE_GUEST).withPassportNumber(VALID_PASSPORT_NUMBER_BENSON).build(); + assertFalse(ALICE_GUEST.equals(editedFiona)); + + // different room number -> returns false + editedFiona = new GuestBuilder(ALICE_GUEST).withRoomNumber(VALID_ROOM_NUMBER_BENSON).build(); + assertFalse(ALICE_GUEST.equals(editedFiona)); + + // different email -> returns false + editedFiona = new GuestBuilder(ALICE_GUEST).withEmail(VALID_EMAIL_BENSON).build(); + assertFalse(ALICE_GUEST.equals(editedFiona)); + + // different tags -> returns false + editedFiona = new GuestBuilder(ALICE_GUEST).withTags(VALID_TAG_SENIOR_STAFF).build(); + assertFalse(ALICE_GUEST.equals(editedFiona)); + } + + +} diff --git a/src/test/java/seedu/address/model/person/PassportNumberTest.java b/src/test/java/seedu/address/model/person/PassportNumberTest.java new file mode 100644 index 00000000000..45f3844a187 --- /dev/null +++ b/src/test/java/seedu/address/model/person/PassportNumberTest.java @@ -0,0 +1,41 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class PassportNumberTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new PassportNumber(null)); + } + + @Test + public void constructor_invalidPassportNumber_throwsIllegalArgumentException() { + String invalidPassportNumber = ""; + assertThrows(IllegalArgumentException.class, () -> new PassportNumber(invalidPassportNumber)); + } + + @Test + public void isValidPassportNumber() { + // null passport number + assertThrows(NullPointerException.class, () -> PassportNumber.isValidPassportNumber(null)); + + // invalid passport numbers + assertFalse(PassportNumber.isValidPassportNumber("")); // empty string + assertFalse(PassportNumber.isValidPassportNumber(" ")); // spaces only + assertFalse(PassportNumber.isValidPassportNumber("^")); // only non-alphanumeric characters + assertFalse(PassportNumber.isValidPassportNumber("peter*")); // contains non-alphanumeric characters + + // valid passport numbers + assertTrue(PassportNumber.isValidPassportNumber("fdsfsdafs")); // alphabets only + assertTrue(PassportNumber.isValidPassportNumber("12345312312")); // numbers only + assertTrue(PassportNumber.isValidPassportNumber("fsdaf2312")); // alphanumeric characters + assertTrue(PassportNumber.isValidPassportNumber("AFSRESDFDS")); // with capital letters + assertTrue(PassportNumber.isValidPassportNumber("32131211D")); + } + +} diff --git a/src/test/java/seedu/address/model/person/RoomNumberTest.java b/src/test/java/seedu/address/model/person/RoomNumberTest.java new file mode 100644 index 00000000000..47b3e3107c7 --- /dev/null +++ b/src/test/java/seedu/address/model/person/RoomNumberTest.java @@ -0,0 +1,40 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class RoomNumberTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new RoomNumber(null)); + } + + @Test + public void constructor_invalidRoomNumber_throwsIllegalArgumentException() { + String invalidRoomNumber = ""; + assertThrows(IllegalArgumentException.class, () -> new RoomNumber(invalidRoomNumber)); + } + + @Test + public void isValidRoomNumber() { + // null room number + assertThrows(NullPointerException.class, () -> RoomNumber.isValidRoomNumber(null)); + + // invalid room number + assertFalse(RoomNumber.isValidRoomNumber("")); // empty string + assertFalse(RoomNumber.isValidRoomNumber(" ")); // spaces only + assertFalse(RoomNumber.isValidRoomNumber("^")); // only non-alphanumeric characters + assertFalse(RoomNumber.isValidRoomNumber("peter*")); // contains non-alphanumeric characters + assertFalse(RoomNumber.isValidRoomNumber("-32131")); // negative numbers + assertFalse(RoomNumber.isValidRoomNumber("2312D")); // contains letter + assertFalse(RoomNumber.isValidRoomNumber("000")); // 0 + + // valid room number + assertTrue(RoomNumber.isValidRoomNumber("2312312312")); // number greater than 0 + } + +} diff --git a/src/test/java/seedu/address/model/person/StaffIdTest.java b/src/test/java/seedu/address/model/person/StaffIdTest.java new file mode 100644 index 00000000000..00916fcd8e4 --- /dev/null +++ b/src/test/java/seedu/address/model/person/StaffIdTest.java @@ -0,0 +1,43 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class StaffIdTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new StaffId(null)); + } + + @Test + public void constructor_invalidStaffId_throwsIllegalArgumentException() { + String invalidStaffId = ""; + assertThrows(IllegalArgumentException.class, () -> new StaffId(invalidStaffId)); + } + + @Test + public void isValidStaffId() { + // null staff id + assertThrows(NullPointerException.class, () -> StaffId.isValidStaffId(null)); + + // invalid staff id + assertFalse(StaffId.isValidStaffId("")); // empty string + assertFalse(StaffId.isValidStaffId("^")); // only non-alphanumeric characters + assertFalse(StaffId.isValidStaffId("peter*")); // contains non-alphanumeric characters + assertFalse(StaffId.isValidStaffId(" ")); // spaces only + + // valid staff id + assertTrue(StaffId.isValidStaffId("peter jack")); // alphabets only + assertTrue(StaffId.isValidStaffId("12345")); // numbers only + assertTrue(StaffId.isValidStaffId("peter the 2nd")); // alphanumeric characters + assertTrue(StaffId.isValidStaffId("Capital Tan")); // with capital letters + assertTrue(StaffId.isValidStaffId("David Roger Jackson Ray Jr 2nd")); // long staff id + + } + + +} diff --git a/src/test/java/seedu/address/model/person/PersonTest.java b/src/test/java/seedu/address/model/person/StaffTest.java similarity index 74% rename from src/test/java/seedu/address/model/person/PersonTest.java rename to src/test/java/seedu/address/model/person/StaffTest.java index d05e9cb3757..f411820dde2 100644 --- a/src/test/java/seedu/address/model/person/PersonTest.java +++ b/src/test/java/seedu/address/model/person/StaffTest.java @@ -2,12 +2,12 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_SID_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; import static seedu.address.testutil.TypicalPersons.FIONA_STAFF; @@ -16,7 +16,7 @@ import seedu.address.testutil.StaffBuilder; -public class PersonTest { +public class StaffTest { @Test public void asObservableList_modifyList_throwsUnsupportedOperationException() { @@ -34,27 +34,23 @@ public void isSamePerson() { // same SID, all other attributes different -> returns true Person editedFiona = new StaffBuilder(FIONA_STAFF) - .withName(VALID_NAME_BOB) - .withPhone(VALID_PHONE_BOB) - .withEmail(VALID_EMAIL_BOB) - .withAddress(VALID_ADDRESS_BOB) - .withTags(VALID_TAG_HUSBAND) + .withName(VALID_NAME_DANIEL) + .withPhone(VALID_PHONE_DANIEL) + .withEmail(VALID_EMAIL_DANIEL) + .withAddress(VALID_ADDRESS_DANIEL) + .withTags(VALID_TAG_SENIOR_STAFF) .build(); assertTrue(FIONA_STAFF.isSamePerson(editedFiona)); // different SID, all other attributes same -> returns false - editedFiona = new StaffBuilder(FIONA_STAFF).withStaffId(VALID_SID_BOB).build(); + editedFiona = new StaffBuilder(FIONA_STAFF).withStaffId(VALID_STAFF_ID_DANIEL).build(); assertFalse(FIONA_STAFF.isSamePerson(editedFiona)); - // // name differs in case, all other attributes same -> returns false - // Person editedBob = new StaffBuilder(FIONA_STAFF).withStaffId(VALID_NAME_BOB.toLowerCase()).build(); - // assertFalse(BOB.isSamePerson(editedBob)); - // - // // name has trailing spaces, all other attributes same -> returns false - // String nameWithTrailingSpaces = VALID_NAME_BOB + " "; - // editedBob = new PersonBuilder(BOB).withName(nameWithTrailingSpaces).build(); - // assertFalse(BOB.isSamePerson(editedBob)); + // SID has trailing spaces, all other attributes same -> returns false + String idWithTrailingSpaces = VALID_STAFF_ID_DANIEL + " "; + Person editedDaniel = new StaffBuilder(DANIEL_STAFF).withStaffId(idWithTrailingSpaces).build(); + assertFalse(DANIEL_STAFF.isSamePerson(editedDaniel)); } @Test @@ -76,23 +72,23 @@ public void equals() { assertFalse(FIONA_STAFF.equals(DANIEL_STAFF)); // different name -> returns false - Person editedFiona = new StaffBuilder(FIONA_STAFF).withStaffId(VALID_SID_BOB).build(); + Person editedFiona = new StaffBuilder(FIONA_STAFF).withStaffId(VALID_STAFF_ID_DANIEL).build(); assertFalse(FIONA_STAFF.equals(editedFiona)); // different phone -> returns false - editedFiona = new StaffBuilder(FIONA_STAFF).withPhone(VALID_PHONE_BOB).build(); + editedFiona = new StaffBuilder(FIONA_STAFF).withPhone(VALID_PHONE_DANIEL).build(); assertFalse(FIONA_STAFF.equals(editedFiona)); // different email -> returns false - editedFiona = new StaffBuilder(FIONA_STAFF).withEmail(VALID_EMAIL_BOB).build(); + editedFiona = new StaffBuilder(FIONA_STAFF).withEmail(VALID_EMAIL_DANIEL).build(); assertFalse(FIONA_STAFF.equals(editedFiona)); // different address -> returns false - editedFiona = new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_BOB).build(); + editedFiona = new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_DANIEL).build(); assertFalse(FIONA_STAFF.equals(editedFiona)); // different tags -> returns false - editedFiona = new StaffBuilder(FIONA_STAFF).withTags(VALID_TAG_HUSBAND).build(); + editedFiona = new StaffBuilder(FIONA_STAFF).withTags(VALID_TAG_SENIOR_STAFF).build(); assertFalse(FIONA_STAFF.equals(editedFiona)); } } diff --git a/src/test/java/seedu/address/model/person/TagContainsKeywordsPredicateTest.java b/src/test/java/seedu/address/model/person/TagContainsKeywordsPredicateTest.java new file mode 100644 index 00000000000..1edc3931a00 --- /dev/null +++ b/src/test/java/seedu/address/model/person/TagContainsKeywordsPredicateTest.java @@ -0,0 +1,97 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_ELLE; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.tag.Tag; +import seedu.address.testutil.GuestBuilder; +import seedu.address.testutil.StaffBuilder; + +public class TagContainsKeywordsPredicateTest { + + @Test + public void equals() { + List firstPredicateKeywordList = Collections.singletonList(new Tag("first")); + List secondPredicateKeywordList = Arrays.asList(new Tag("first"), new Tag("second")); + + TagContainsKeywordsPredicate firstPredicate = + new TagContainsKeywordsPredicate(firstPredicateKeywordList); + TagContainsKeywordsPredicate secondPredicate = + new TagContainsKeywordsPredicate(secondPredicateKeywordList); + + // same object -> returns true + assertTrue(firstPredicate.equals(firstPredicate)); + + // same values -> returns true + TagContainsKeywordsPredicate firstPredicateCopy = + new TagContainsKeywordsPredicate(firstPredicateKeywordList); + assertTrue(firstPredicate.equals(firstPredicateCopy)); + + // different types -> returns false + assertFalse(firstPredicate.equals(1)); + + // null -> returns false + assertFalse(firstPredicate.equals(null)); + + // different person -> returns false + assertFalse(firstPredicate.equals(secondPredicate)); + } + + @Test + public void test_tagsContainsKeywords_returnsTrue() { + // Test for Guest + TagContainsKeywordsPredicate predicate = new TagContainsKeywordsPredicate( + Collections.singletonList(new Tag(VALID_TAG_ALICE))); + assertTrue(predicate.test( + new GuestBuilder().withTags(VALID_TAG_ALICE).build())); + + predicate = new TagContainsKeywordsPredicate( + Collections.singletonList(new Tag(VALID_TAG_BENSON))); + assertTrue(predicate.test( + new GuestBuilder().withTags(VALID_TAG_BENSON).build())); + + // Test for Staff + predicate = new TagContainsKeywordsPredicate( + Collections.singletonList(new Tag(VALID_TAG_DANIEL))); + assertTrue(predicate.test( + new StaffBuilder().withTags(VALID_TAG_DANIEL).build())); + + predicate = new TagContainsKeywordsPredicate( + Collections.singletonList(new Tag(VALID_TAG_ELLE))); + assertTrue(predicate.test( + new StaffBuilder().withTags(VALID_TAG_ELLE).build())); + } + + @Test + public void test_tagsDoesNotContainKeywords_returnsFalse() { + // Zero keywords (Empty tag t/) + TagContainsKeywordsPredicate predicate = + new TagContainsKeywordsPredicate(Collections.emptyList()); + assertFalse(predicate.test(new StaffBuilder().withTags(VALID_TAG_DANIEL).build())); + + predicate = new TagContainsKeywordsPredicate(Collections.emptyList()); + assertFalse(predicate.test( + new GuestBuilder().withTags(VALID_TAG_ALICE).build())); + + // Non-matching keyword + predicate = + new TagContainsKeywordsPredicate(Arrays.asList(new Tag(VALID_TAG_DANIEL))); + assertFalse(predicate.test(new StaffBuilder().withTags(VALID_TAG_ELLE).build())); + + predicate = new TagContainsKeywordsPredicate( + Collections.singletonList(new Tag(VALID_TAG_ALICE))); + assertFalse(predicate.test(new GuestBuilder().withTags( + VALID_TAG_BENSON).build())); + } + +} diff --git a/src/test/java/seedu/address/model/person/UniquePersonListTest.java b/src/test/java/seedu/address/model/person/UniquePersonListTest.java index 3453c1db2bc..3e4d0ba2ba7 100644 --- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java +++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_SENIOR_STAFF; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.DANIEL_STAFF; import static seedu.address.testutil.TypicalPersons.FIONA_STAFF; @@ -42,8 +42,9 @@ public void contains_personInList_returnsTrue() { @Test public void contains_personWithSameIdentityFieldsInList_returnsTrue() { uniquePersonList.add(FIONA_STAFF); - Person editedFiona = new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + Person editedFiona = + new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_DANIEL).withTags(VALID_TAG_SENIOR_STAFF) + .build(); assertTrue(uniquePersonList.contains(editedFiona)); } @@ -85,8 +86,9 @@ public void setPerson_editedPersonIsSamePerson_success() { @Test public void setPerson_editedPersonHasSameIdentity_success() { uniquePersonList.add(FIONA_STAFF); - Person editedAlice = new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + Person editedAlice = + new StaffBuilder(FIONA_STAFF).withAddress(VALID_ADDRESS_DANIEL).withTags(VALID_TAG_SENIOR_STAFF) + .build(); uniquePersonList.setPerson(FIONA_STAFF, editedAlice); UniquePersonList expectedUniquePersonList = new UniquePersonList(); expectedUniquePersonList.add(editedAlice); diff --git a/src/test/java/seedu/address/model/tag/UniqueTagListTest.java b/src/test/java/seedu/address/model/tag/UniqueTagListTest.java new file mode 100644 index 00000000000..dbe3c91733d --- /dev/null +++ b/src/test/java/seedu/address/model/tag/UniqueTagListTest.java @@ -0,0 +1,46 @@ +package seedu.address.model.tag; + +import static seedu.address.testutil.Assert.assertThrows; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.tag.exceptions.DuplicateTagException; +import seedu.address.model.tag.exceptions.TagNotFoundException; + +public class UniqueTagListTest { + + @Test + public void add_duplicateTag_throwsDuplicateTagException() { + UniqueTagList tagList = new UniqueTagList(); + tagList.add(new Tag("Tag")); + assertThrows(DuplicateTagException.class, () -> tagList.add(new Tag("Tag"))); + } + + @Test + public void setTags_duplicateTags_throwsDuplicateTagException() { + UniqueTagList tagList = new UniqueTagList(); + assertThrows(DuplicateTagException.class, () -> tagList.setTags(List.of(new Tag("Tag"), new Tag("Tag")))); + } + + @Test + public void remove_nonExistingTag_throwsTagNotFoundException() { + UniqueTagList tagList = new UniqueTagList(); + assertThrows(TagNotFoundException.class, () -> tagList.remove(new Tag("Tag"))); + } + + @Test + public void setTag() { + UniqueTagList tagList = new UniqueTagList(); + Tag tag = new Tag("Tag"); + Tag secondTag = new Tag("Tag2"); + tagList.add(tag); + tagList.add(secondTag); + + assertThrows(TagNotFoundException.class, () -> tagList.setTag(new Tag("newTag"), tag)); + assertThrows(DuplicateTagException.class, () -> tagList.setTag(tag, secondTag)); + + } + +} diff --git a/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java b/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java index 47b56593f52..e204f060ab5 100644 --- a/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java +++ b/src/test/java/seedu/address/storage/JsonAddressBookStorageTest.java @@ -1,109 +1,107 @@ -//package seedu.address.storage; -// -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static org.junit.jupiter.api.Assertions.assertFalse; -//import static seedu.address.testutil.Assert.assertThrows; -//import static seedu.address.testutil.TypicalPersons.ALICE_GUEST; -//import static seedu.address.testutil.TypicalPersons.BENSON_GUEST; -//import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; -// -//import java.io.IOException; -//import java.nio.file.Path; -//import java.nio.file.Paths; -// -//import org.junit.jupiter.api.Test; -//import org.junit.jupiter.api.io.TempDir; -// -//import seedu.address.commons.exceptions.DataConversionException; -//import seedu.address.model.AddressBook; -//import seedu.address.model.ReadOnlyAddressBook; -// -//public class JsonAddressBookStorageTest { -// private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonAddressBookStorageTest"); -// -// @TempDir -// public Path testFolder; -// -// @Test -// public void readAddressBook_nullFilePath_throwsNullPointerException() { -// assertThrows(NullPointerException.class, () -> readAddressBook(null)); -// } -// -// private java.util.Optional readAddressBook(String filePath) throws Exception { -// return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath)); -// } -// -// private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) { -// return prefsFileInTestDataFolder != null -// ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder) -// : null; -// } -// -// @Test -// public void read_missingFile_emptyResult() throws Exception { -// assertFalse(readAddressBook("NonExistentFile.json").isPresent()); -// } -// -// @Test -// public void read_notJsonFormat_exceptionThrown() { -// assertThrows(DataConversionException.class, () -> readAddressBook("notJsonFormatAddressBook.json")); -// } -// -// @Test -// public void readAddressBook_invalidPersonAddressBook_throwDataConversionException() { -// assertThrows(DataConversionException.class, () -> readAddressBook("invalidPersonAddressBook.json")); -// } -// -// @Test -// public void readAddressBook_invalidAndValidPersonAddressBook_throwDataConversionException() { -// assertThrows(DataConversionException.class, () -> readAddressBook("invalidAndValidPersonAddressBook.json")); -// } -// -// @Test -// public void readAndSaveAddressBook_allInOrder_success() throws Exception { -// Path filePath = testFolder.resolve("TempAddressBook.json"); -// AddressBook original = getTypicalAddressBook(); -// JsonAddressBookStorage jsonAddressBookStorage = new JsonAddressBookStorage(filePath); -// -// // Save in new file and read back -// jsonAddressBookStorage.saveAddressBook(original, filePath); -// ReadOnlyAddressBook readBack = jsonAddressBookStorage.readAddressBook(filePath).get(); -// assertEquals(original, new AddressBook(readBack)); -// -// // Modify data, overwrite exiting file, and read back -// original.addPerson(ALICE_GUEST); -// original.removePerson(ALICE_GUEST); -// jsonAddressBookStorage.saveAddressBook(original, filePath); -// readBack = jsonAddressBookStorage.readAddressBook(filePath).get(); -// assertEquals(original, new AddressBook(readBack)); -// -// // Save and read without specifying file path -// original.addPerson(BENSON_GUEST); -// jsonAddressBookStorage.saveAddressBook(original); // file path not specified -// readBack = jsonAddressBookStorage.readAddressBook().get(); // file path not specified -// assertEquals(original, new AddressBook(readBack)); -// -// } -// -// @Test -// public void saveAddressBook_nullAddressBook_throwsNullPointerException() { -// assertThrows(NullPointerException.class, () -> saveAddressBook(null, "SomeFile.json")); -// } -// -// /** -// * Saves {@code addressBook} at the specified {@code filePath}. -// */ -// private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) { -// try { -// new JsonAddressBookStorage(Paths.get(filePath)) -// .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath)); -// } catch (IOException ioe) { -// throw new AssertionError("There should not be an error writing to the file.", ioe); -// } -// } -// -// @Test -// public void saveAddressBook_nullFilePath_throwsNullPointerException() { -// assertThrows(NullPointerException.class, () -> saveAddressBook(new AddressBook(), null)); -// } -//} +package seedu.address.storage; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static seedu.address.testutil.Assert.assertThrows; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import seedu.address.commons.exceptions.DataConversionException; +import seedu.address.model.AddressBook; +import seedu.address.model.ReadOnlyAddressBook; + +public class JsonAddressBookStorageTest { + private static final Path TEST_DATA_FOLDER = Paths.get("src", "test", "data", "JsonAddressBookStorageTest"); + + @TempDir + public Path testFolder; + + @Test + public void readAddressBook_nullFilePath_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> readAddressBook(null)); + } + + private java.util.Optional readAddressBook(String filePath) throws Exception { + return new JsonAddressBookStorage(Paths.get(filePath)).readAddressBook(addToTestDataPathIfNotNull(filePath)); + } + + private Path addToTestDataPathIfNotNull(String prefsFileInTestDataFolder) { + return prefsFileInTestDataFolder != null + ? TEST_DATA_FOLDER.resolve(prefsFileInTestDataFolder) + : null; + } + + @Test + public void read_missingFile_emptyResult() throws Exception { + assertFalse(readAddressBook("NonExistentFile.json").isPresent()); + } + + @Test + public void read_notJsonFormat_exceptionThrown() { + assertThrows(DataConversionException.class, () -> readAddressBook("notJsonFormatAddressBook.json")); + } + + @Test + public void readAddressBook_invalidPersonAddressBook_throwDataConversionException() { + assertThrows(DataConversionException.class, () -> readAddressBook("invalidPersonAddressBook.json")); + } + + @Test + public void readAddressBook_invalidAndValidPersonAddressBook_throwDataConversionException() { + assertThrows(DataConversionException.class, () -> readAddressBook("invalidAndValidPersonAddressBook.json")); + } + + // @Test + // public void readAndSaveAddressBook_allInOrder_success() throws Exception { + // Path filePath = testFolder.resolve("TempAddressBook.json"); + // AddressBook original = getTypicalAddressBook(); + // JsonAddressBookStorage jsonAddressBookStorage = new JsonAddressBookStorage(filePath); + // + // // Save in new file and read back + // jsonAddressBookStorage.saveAddressBook(original, filePath); + // ReadOnlyAddressBook readBack = jsonAddressBookStorage.readAddressBook(filePath).get(); + // assertEquals(original, new AddressBook(readBack)); + // + // // Modify data, overwrite exiting file, and read back + // original.addPerson(JEONGYEON_GUEST); + // original.removePerson(JEONGYEON_GUEST); + // jsonAddressBookStorage.saveAddressBook(original, filePath); + // readBack = jsonAddressBookStorage.readAddressBook(filePath).get(); + // assertEquals(original, new AddressBook(readBack)); + // + // // Save and read without specifying file path + // original.addPerson(JEONGYEON_GUEST); + // jsonAddressBookStorage.saveAddressBook(original); // file path not specified + // readBack = jsonAddressBookStorage.readAddressBook().get(); // file path not specified + // System.out.println("Original hash" + original.hashCode()); + // System.out.println("new hash" + readBack.hashCode()); + // System.out.println(original.equals(readBack)); + // assertEquals(original, new AddressBook(readBack)); + // } + + @Test + public void saveAddressBook_nullAddressBook_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> saveAddressBook(null, "SomeFile.json")); + } + + /** + * Saves {@code addressBook} at the specified {@code filePath}. + */ + private void saveAddressBook(ReadOnlyAddressBook addressBook, String filePath) { + try { + new JsonAddressBookStorage(Paths.get(filePath)) + .saveAddressBook(addressBook, addToTestDataPathIfNotNull(filePath)); + } catch (IOException ioe) { + throw new AssertionError("There should not be an error writing to the file.", ioe); + } + } + + @Test + public void saveAddressBook_nullFilePath_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> saveAddressBook(new AddressBook(), null)); + } +} diff --git a/src/test/java/seedu/address/testutil/EditGuestDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditGuestDescriptorBuilder.java index 67faa585e51..4dd47ff411e 100644 --- a/src/test/java/seedu/address/testutil/EditGuestDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditGuestDescriptorBuilder.java @@ -17,7 +17,7 @@ */ public class EditGuestDescriptorBuilder { - private EditGuestDescriptor descriptor; + private final EditGuestDescriptor descriptor; public EditGuestDescriptorBuilder() { descriptor = new EditGuestDescriptor(); diff --git a/src/test/java/seedu/address/testutil/EditStaffDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditStaffDescriptorBuilder.java index b04b1a79d13..6413dbe81cf 100644 --- a/src/test/java/seedu/address/testutil/EditStaffDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditStaffDescriptorBuilder.java @@ -18,7 +18,7 @@ */ public class EditStaffDescriptorBuilder { - private EditStaffDescriptor descriptor; + private final EditStaffDescriptor descriptor; public EditStaffDescriptorBuilder() { descriptor = new EditStaffDescriptor(); diff --git a/src/test/java/seedu/address/testutil/GuestBuilder.java b/src/test/java/seedu/address/testutil/GuestBuilder.java index 923a8cca308..b96f3496816 100644 --- a/src/test/java/seedu/address/testutil/GuestBuilder.java +++ b/src/test/java/seedu/address/testutil/GuestBuilder.java @@ -2,6 +2,8 @@ import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_DEFAULT; +import java.util.Set; + import seedu.address.model.person.Email; import seedu.address.model.person.Guest; import seedu.address.model.person.Name; @@ -49,7 +51,9 @@ public GuestBuilder withName(String name) { * Parses the {@code tags} into a {@code Set} and set it to the {@code Guest} that we are building. */ public GuestBuilder withTags(String... tags) { - setTags(SampleDataUtil.getTagSet(tags)); + Set guestTag = SampleDataUtil.getTagSet(tags); + guestTag.add(new Tag("Guest")); + setTags(guestTag); return this; } diff --git a/src/test/java/seedu/address/testutil/StaffBuilder.java b/src/test/java/seedu/address/testutil/StaffBuilder.java index a7615cb24c6..b59d029712b 100644 --- a/src/test/java/seedu/address/testutil/StaffBuilder.java +++ b/src/test/java/seedu/address/testutil/StaffBuilder.java @@ -2,6 +2,8 @@ import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_DEFAULT; +import java.util.Set; + import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; @@ -54,7 +56,9 @@ public StaffBuilder withName(String name) { * Parses the {@code tags} into a {@code Set} and set it to the {@code Staff} that we are building. */ public StaffBuilder withTags(String... tags) { - setTags(SampleDataUtil.getTagSet(tags)); + Set staffTag = SampleDataUtil.getTagSet(tags); + staffTag.add(new Tag("Staff")); + setTags(staffTag); return this; } diff --git a/src/test/java/seedu/address/testutil/TypicalPassportNumbers.java b/src/test/java/seedu/address/testutil/TypicalPassportNumbers.java index 4e60109ab91..88b2f4aad3e 100644 --- a/src/test/java/seedu/address/testutil/TypicalPassportNumbers.java +++ b/src/test/java/seedu/address/testutil/TypicalPassportNumbers.java @@ -6,6 +6,7 @@ public class TypicalPassportNumbers { public static final PassportNumber PASSPORT_NUMBER_FIRST_PERSON = new PassportNumber("E0123122G"); public static final PassportNumber PASSPORT_NUMBER_SECOND_PERSON = new PassportNumber("T12312311A"); public static final PassportNumber PASSPORT_NUMBER_THIRD_PERSON = new PassportNumber("M123123124D"); + public static final PassportNumber PASSPORT_NUMBER_FOURTH_PERSON_NOT_ADDED = new PassportNumber("M999123124D"); public static final PassportNumber PASSPORT_NUMBER_UNUSED = new PassportNumber("L21312314H"); // Default passport number used in builders public static final PassportNumber PASSPORT_NUMBER_DEFAULT = new PassportNumber("A163812686D"); diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java index c227e251282..915972e459c 100644 --- a/src/test/java/seedu/address/testutil/TypicalPersons.java +++ b/src/test/java/seedu/address/testutil/TypicalPersons.java @@ -1,32 +1,56 @@ package seedu.address.testutil; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_GEORGE; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_CARL; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_GEORGE; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_CARL; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_GEORGE; import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PASSPORT_NUMBER_CARL; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_GEORGE; import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ROOM_NUMBER_CARL; import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_DANIEL; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_STAFF_ID_GEORGE; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_ALICE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BENSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_CARL; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_DANIEL; -import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_SECOND_PERSON; -import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_THIRD_PERSON; -import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_SECOND_PERSON; -import static seedu.address.testutil.TypicalStaffIds.STAFF_ID_THIRD_PERSON; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_ELLE; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FIONA; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_GEORGE; +import static seedu.address.testutil.TypicalPassportNumbers.PASSPORT_NUMBER_FOURTH_PERSON_NOT_ADDED; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import seedu.address.model.AddressBook; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; import seedu.address.model.person.Guest; import seedu.address.model.person.Person; import seedu.address.model.person.Staff; -import seedu.address.model.tag.Tag; /** * A utility class containing a list of {@code Person} objects to be used in tests. @@ -41,18 +65,26 @@ public class TypicalPersons { .build(); public static final Guest BENSON_GUEST = new GuestBuilder() - .withName("Benson Meier") - .withEmail("johnd@example.com") - .withTags("NORMALROOM", "OUTSTANDINGPAYMENT") - .withRoomNumber("20201") - .withPassportNumber(PASSPORT_NUMBER_SECOND_PERSON.toString()) + .withName(VALID_NAME_BENSON) + .withEmail(VALID_EMAIL_BENSON) + .withTags(VALID_TAG_BENSON) + .withRoomNumber(VALID_ROOM_NUMBER_BENSON) + .withPassportNumber(VALID_PASSPORT_NUMBER_BENSON) .build(); public static final Guest CARL_GUEST = new GuestBuilder() - .withName("Carl Kurz") - .withEmail("heinz@example.com") - .withRoomNumber("12321") - .withPassportNumber(PASSPORT_NUMBER_THIRD_PERSON.toString()) + .withName(VALID_NAME_CARL) + .withEmail(VALID_EMAIL_CARL) + .withTags(VALID_TAG_CARL) + .withRoomNumber(VALID_ROOM_NUMBER_CARL) + .withPassportNumber(VALID_PASSPORT_NUMBER_CARL) + .build(); + + public static final Guest JEONGYEON_GUEST = new GuestBuilder() + .withName("Jeong Yeon") + .withEmail("jy@example.com") + .withRoomNumber("22233") + .withPassportNumber(PASSPORT_NUMBER_FOURTH_PERSON_NOT_ADDED.toString()) .build(); public static final Staff DANIEL_STAFF = new StaffBuilder() @@ -65,31 +97,32 @@ public class TypicalPersons { .build(); public static final Staff ELLE_STAFF = new StaffBuilder() - .withName("Elle Meyer") - .withEmail("werner@example.com") - .withTags("MANAGER") - .withAddress("michegan ave") - .withPhone("9482224") - .withStaffId(STAFF_ID_SECOND_PERSON.toString()) + .withName(VALID_NAME_ELLE) + .withEmail(VALID_EMAIL_ELLE) + .withTags(VALID_TAG_ELLE) + .withAddress(VALID_ADDRESS_ELLE) + .withPhone(VALID_PHONE_ELLE) + .withStaffId(VALID_STAFF_ID_ELLE) .build(); public static final Staff FIONA_STAFF = new StaffBuilder() - .withName("Fiona Kunz") - .withEmail("lydia@example.com") - .withAddress("little tokyo") - .withPhone("9482427") - .withStaffId(STAFF_ID_THIRD_PERSON.toString()) + .withName(VALID_NAME_FIONA) + .withEmail(VALID_EMAIL_FIONA) + .withTags(VALID_TAG_FIONA) + .withAddress(VALID_ADDRESS_FIONA) + .withPhone(VALID_PHONE_FIONA) + .withStaffId(VALID_STAFF_ID_FIONA) .build(); public static final Staff GEORGE_STAFF = new StaffBuilder() - .withName("George Best") - .withEmail("anna@example.com") - .withAddress("4th street") - .withPhone("9482442") - .withStaffId("101") + .withName(VALID_NAME_GEORGE) + .withEmail(VALID_EMAIL_GEORGE) + .withTags(VALID_TAG_GEORGE) + .withAddress(VALID_ADDRESS_GEORGE) + .withPhone(VALID_PHONE_GEORGE) + .withStaffId(VALID_STAFF_ID_GEORGE) .build(); - public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER private TypicalPersons() { @@ -99,19 +132,11 @@ private TypicalPersons() { * Returns an {@code AddressBook} with all the typical persons. */ public static AddressBook getTypicalAddressBook() { - AddressBook ab = new AddressBook(); - Set tagSet = new HashSet<>(); + ModelManager modelManager = new ModelManager(new AddressBook(), new UserPrefs()); for (Person person : getTypicalPersons()) { - ab.addPerson(person); - for (Tag tag : person.getTags()) { - tagSet.add(tag); - } - } - - for (Tag typicalTag : tagSet) { - ab.addTag(typicalTag); + modelManager.addPerson(person); } - return ab; + return (AddressBook) modelManager.getAddressBook(); } public static List getTypicalPersons() {