From 4596ad53e6d4912e27811dd23f48b304721d205e Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Tue, 2 Apr 2024 18:38:06 +0800 Subject: [PATCH 01/10] Update UserGuide.md --- docs/UserGuide.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a1fe3d2878d..5636443f381 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -33,17 +33,21 @@ details in a centralised storage. Our target audience is specifically only TAs o A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
![Ui](images/Ui.png) -1. Type the command in the command box and press Enter to execute it. e.g. typing **`list_student`** and pressing Enter will display a list of students.
+1. Type the command in the command box and press Enter to execute it. e.g. typing **`/list_student`** and pressing Enter will display a list of students.
Some example commands you can try: - - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T class/T09` : Adds a new student contact with all the details that have been specified to the relevant module and tutorial class. +Commands on students: - - `/delete_student id/A0259209B | /delete_student email/johndoe@gmail.com` : Deletes a student contact with email `johndoe@gmail.com` or id `A0259209B`. + - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with all the details that have been specified to the relevant module and tutorial class. - - `/search_student id/A0123456A` : Searches for a student with id `A0123456A`. + - `/delete_student id/A0259209B or /delete_student email/johndoe@gmail.com` : Deletes a student contact with email `johndoe@gmail.com` or id `A0259209B`. + + - `/search_student id/A0123456A or /search_student email/johndoe@gmail.com` : Searches for a student with id `A0123456A` or email `johndoe@gmail.com`. - `/list_student` : View the list of all students available. +Commands on modules: + - `/add_class module/CS2103T class/T09` : Adds a new tutorial class `T09` under the module `2103T`. - `/delete_class module/CS2103T class/T09` : Deletes a tutorial class `T09` under the module `2103T`. From 783e8d1fe6f6266b9823dca25f44c4b979d8ec92 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Tue, 2 Apr 2024 21:28:21 +0800 Subject: [PATCH 02/10] Update Quick Start section of UserGuide.md --- docs/UserGuide.md | 55 ++++++++++++++++++++++++++--------- docs/images/cmdguidewin.png | Bin 0 -> 25037 bytes docs/images/cmdguidewin2.png | Bin 0 -> 28979 bytes 3 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 docs/images/cmdguidewin.png create mode 100644 docs/images/cmdguidewin2.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5636443f381..937b1c91e7e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -23,22 +23,47 @@ details in a centralised storage. Our target audience is specifically only TAs o ## Quick start -1. Ensure you have Java `11` or above installed in your Computer. - -1. Download the latest `tahelper.jar` from [here](https://github.com/AY2324S2-CS2103T-T09-4/tp/releases). - -1. Copy the file to the folder you want to use as the _home folder_ for your TAHelper. - -1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar tahelper.jar` command to run the application.
- A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png) - -1. Type the command in the command box and press Enter to execute it. e.g. typing **`/list_student`** and pressing Enter will display a list of students.
- Some example commands you can try: +1. Ensuring the correct version of Java installed: + - Ensure you have Java `11` or above installed in your Computer. + +2. Download TAHelper from [here](https://github.com/AY2324S2-CS2103T-T09-4/tp/releases) + - Download the latest `tahelper.jar`. + +3. Set up your application environment + - Copy the file `tahelper.jar` to the folder you want to use as the _home folder_ for your TAHelper. + - Tip: name that folder `TAHelper` to facilitate organisation and easy access. + +4. Using the Terminal to run the application + - Windows OS: + - Press the windows button and type `cmd` into the search bar. + - It should look something like this: + - ![cmd](images/cmdguidewin.png) + + - Mac OS: + - Search for Terminal in "Utilities" under "Applications". + - It should look something like this: + - + +5. Launching TAHelper + - `cd` into the folder you put the jar file in + - Type `java -jar tahelper.jar` command and hit Enter to run TAHelper.
+ - It should look something like this (in this case my jar file is in a folder called tahelper): + - ![cmd](images/cmdguidewin2.png) + + - A GUI similar to the below should appear in a few seconds.
+ - ![Ui](images/Ui.png) (to update!!). + +6. Here are some commands to try out to get a feel of a TAHelper! type them in the Command box + - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with the name, email and ID specified. + - A new student entry should appear on the UI with the details reflected clearly. + + - `/delete_student id/A0123456A or /delete_student email/johndoe@gmail.com`: Deletes the student that you have add with the previous command. + - The student entry with the ID `A0123456A` or email `johndoe@gmail.com` will be deleted. + - This deletion will be reflected on User Interface of TAHelper as well. Commands on students: - - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with all the details that have been specified to the relevant module and tutorial class. + - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with all the details. - `/delete_student id/A0259209B or /delete_student email/johndoe@gmail.com` : Deletes a student contact with email `johndoe@gmail.com` or id `A0259209B`. @@ -46,6 +71,10 @@ Commands on students: - `/list_student` : View the list of all students available. + - `/allocate_teams id/A1234567Z module/CS2101 tutorial/T01 name/team1` : Allocate a student to the specified team `team1` in the tutorial class `T01` of module `CS2101`. + + - `/add_student_to_class id/A1234567Z module/CS2101 tutorial/T01` : Add a student the tutorial class `T01` of module `CS2101`. + Commands on modules: - `/add_class module/CS2103T class/T09` : Adds a new tutorial class `T09` under the module `2103T`. diff --git a/docs/images/cmdguidewin.png b/docs/images/cmdguidewin.png new file mode 100644 index 0000000000000000000000000000000000000000..76e3fec73872dbf9bcd0b1477d17502e9d94cc81 GIT binary patch literal 25037 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�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 BrA`0< literal 0 HcmV?d00001 From b5c45d8f00f1dd62849d47f7e7178bdc79e63224 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Tue, 2 Apr 2024 22:09:40 +0800 Subject: [PATCH 03/10] Update Glossary of UserGuide.md * Glossary has not been fully updated and more terms can be added to fully encompasses the unfamiliar terms used in this User Guide. --- docs/UserGuide.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 937b1c91e7e..05c8a9c8b20 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,9 +8,10 @@ TAHelper is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TAHelper can get your students' contact management tasks done faster than traditional GUI apps. +- For some uncommon or unfamiliar terms used in this User Guide, ![click here](link to glossary) for the definition and explanation of some. + - --- ## Target Audience @@ -26,13 +27,16 @@ details in a centralised storage. Our target audience is specifically only TAs o 1. Ensuring the correct version of Java installed: - Ensure you have Java `11` or above installed in your Computer. + 2. Download TAHelper from [here](https://github.com/AY2324S2-CS2103T-T09-4/tp/releases) - Download the latest `tahelper.jar`. + 3. Set up your application environment - Copy the file `tahelper.jar` to the folder you want to use as the _home folder_ for your TAHelper. - Tip: name that folder `TAHelper` to facilitate organisation and easy access. + 4. Using the Terminal to run the application - Windows OS: - Press the windows button and type `cmd` into the search bar. @@ -44,6 +48,7 @@ details in a centralised storage. Our target audience is specifically only TAs o - It should look something like this: - + 5. Launching TAHelper - `cd` into the folder you put the jar file in - Type `java -jar tahelper.jar` command and hit Enter to run TAHelper.
@@ -53,6 +58,7 @@ details in a centralised storage. Our target audience is specifically only TAs o - A GUI similar to the below should appear in a few seconds.
- ![Ui](images/Ui.png) (to update!!). + 6. Here are some commands to try out to get a feel of a TAHelper! type them in the Command box - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with the name, email and ID specified. - A new student entry should appear on the UI with the details reflected clearly. @@ -61,6 +67,10 @@ details in a centralised storage. Our target audience is specifically only TAs o - The student entry with the ID `A0123456A` or email `johndoe@gmail.com` will be deleted. - This deletion will be reflected on User Interface of TAHelper as well. + - For more Commands that will improve your experience, ![click here] + + + Commands on students: - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with all the details. @@ -260,7 +270,6 @@ Examples: - With team size: `/add_team module/CS2103T class/T10 name/Team 1 size/3` --- - ## FAQ **Q**: How do I transfer my data to another Computer?
@@ -274,6 +283,18 @@ Examples: --- +### Glossary + +| Term | Definition and/or Explanation | +|------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **OS** | Refers to Operating System. Modern Operating System include Windows, Macs and Linux. | +| **TA (Teaching Assistant)** | An individual who is responsible for teaching a tutorial class of University students. | +| **TAHelper** | A contact management application to help TAs keep track of students in classes they teach. | +| **Graphical User Interface (GUI)** | is a type of interface that allows users to interact with electronic devices through graphical icons and visual indicators,
as opposed to text-based interfaces, typed command labels, or text navigation. | +| **Command Line Interface (CLI)** | is a text-based user interface used to interact with software, through the use of key words command such as 'cd'. | + +--- + ## Command summary | Action | Format, Examples | From e37b6169033fb9ecdd2d4cf72be366be3eb6b175 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Wed, 3 Apr 2024 00:18:20 +0800 Subject: [PATCH 04/10] Update Add and Allocate student and Random team command in UserGuide.md * Update add_student, allocate_team and random_teams commands of the feature section in the user guide. --- docs/UserGuide.md | 83 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 8 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 05c8a9c8b20..e8f9abe406d 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -120,29 +120,29 @@ Commands on modules: ### Adding new students : `add_student` -Adds a new student contact with all the details that have been specified by the user to the relevant module and tutorial class +Adds a new student contact with all the details that have been specified by the user. -Format: `/add_student name/NAME email/EMAIL id/STUDENT_ID module/MODULE_CODE tutorial/TUTORIAL_CLASS` +Format: `/add_student name/NAME email/EMAIL id/STUDENT_ID` - The following parameters to add a student contact are supported: - 1. Name + 1. Name 2. Email 3. Student ID - 4. Module Code - 5. Tutorial class +- All fields must be specified - Leading/trailing spaces are removed - The parameter is case-insensitive - If none of the parameters or an invalid parameter is specified, the command will return an error message indicating that a valid parameter must be provided. -- For V1.2, we will only be adding students to their respective tutorial group. Instead, what happens is that we will add all the students to the respective module headers. Expected output: Upon a successful add, the command will return a confirmation messaging stating that the specified student contact has been added. -Examples: +Example: + +- `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A` -- `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T tutorial/T09` +Explanation: This adds a student with name `Dohn Joe`, email `johndoe@gmail.com` and ID `A0123456A` into the TAHelper system. ### Deleting students : `delete_student` @@ -191,6 +191,49 @@ Format: `/list_student` Expected output: The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently. + +### Allocating students to tutorial teams : `allocate_team` + +Allocates a student to an existing tutorial team within a tutorial class. + +List of acceptable formats:
+ 1. `/allocate_team id/ID module/MODULE tutorial/TUTORIAL team/TEAMNAME`
+ 2. `/allocate_team email/EMAIL module/MODULE tutorial/TUTORIAL team/TEAMNAME`
+ 3. `/allocate_team index/INDEX module/MODULE tutorial/TUTORIAL team/TEAMNAME`
+ +- All fields from any acceptable formats have to be specified. +- Leading/trailing spaces are removed. +- A student cannot be added to the same tutorial team, under the same module and tutorial class, more than once. +- The index specified is with respect to the index of the student in the tutorial class. + +Pre-conditions: +1. The student you want to add has to already exist in the TAHelper system. +2. The tutorial class has to be associated and exist in the module specified. +3. The student you want to add has to already exist in the tutorial class specified. +4. The team you want to allocate the student into has to already exist within the specified tutorial class. + +Important note: +- Specifying more than one way to allocate student such as `/allocate_team id/ID email/EMAIL module/MODULE tutorial/TUTORIAL team/TEAMNAME` is not advised.
+This is because TAHelper will prioritise looking for the student that matches the ID specified rather than the email specified. This prioritisation is a feature of the system. + +Expected output: +Upon a successful allocation, the command will return a confirmation message stating that the specified student contact has been allocated to the tutorial team. + +Examples: +1. `/allocate_team id/A1234567Z module/CS2101 tutorial/T01 team/team1`
+ +Explanation: This allocates a student with ID matching `A1234567Z` in the tutorial class `T01` to a tutorial team `team1` of the tutorial class `T01` under the module `CS2101`. + +2. `/allocate_team email/johndoe@gmail.com module/CS2101 tutorial/T01 team/team2`
+ +Explanation: This allocates a student with email matching `johndoe@gmail.com` in the tutorial class `T01` to a tutorial team `team1` of the tutorial class `T01` under the module `CS2101`. + +3. `/allocate_team index/1 module/CS2101 tutorial/T01 team/team1`
+ +Explanation: This allocates a student with index position `1` in the tutorial class `T01` to a tutorial team `team1` of the tutorial class `T01` under the module `CS2101`. + + + ### Adding new tutorial class : `add_class` Adds a tutorial class with the specified module code and name. @@ -269,6 +312,30 @@ Examples: - Without team size:`/add_team module/CS2103T class/T10 name/Team 1` - With team size: `/add_team module/CS2103T class/T10 name/Team 1 size/3` + +### Randomly allocate into teams all students in a tutorial class : `random_teams` + +Randomly allocates all students in a tutorial class into different teams in the tutorial class. + +Format: `/random_teams module/MODULE tutorial/TUTORIAL teams/NUMBEROFTEAMS` + +- All fields from any acceptable formats have to be specified. +- Leading/trailing spaces are removed. + +Important Note: +- The number of teams cannot be more than the number of students in the tutorial class. +- The tutorial class have to be associated with the module specified. +- The number of teams must be a non-negative integer value. + +Expected output: +Upon a successful randomisation, the command will return a confirmation message stating that the students in the specified tutorial class has been randomly distributed into different teams in the tutorial class. + +Example: +- `/random_teams module/CS2101 tutorial/T01 teams/2` + +Explanation: This randomly allocates all the students in the tutorial class `T01` of module `CS2101` into 2 teams. + + --- ## FAQ From 8ee0c27944447715d8a2aae81dc08e127330a101 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Thu, 4 Apr 2024 12:10:58 +0800 Subject: [PATCH 05/10] Update Purpose and Navigation of User Guide --- docs/UserGuide.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e8f9abe406d..5bdf4f4dcb1 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -8,19 +8,34 @@ TAHelper is a **desktop app for managing contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TAHelper can get your students' contact management tasks done faster than traditional GUI apps. -- For some uncommon or unfamiliar terms used in this User Guide, ![click here](link to glossary) for the definition and explanation of some. +- For some uncommon or unfamiliar terms used in this User Guide, [click here](#glossary) for the definition and explanation of some. +## Why choose TAHelper? + +## Table of contents --- ## Target Audience -TAHelper is specifically designed to assist and help Teaching Assistants (TA) of NUS Computer Science Modules, +- TAHelper is specifically designed to assist and help Teaching Assistants (TA) of NUS Computer Science Modules, which caters to their need to store information in a way that is easy to track and visualise, as well as keep student's details in a centralised storage. Our target audience is specifically only TAs of NUS Computer Science Modules. ## Purpose of User Guide +- The purpose of the User Guide (UG) for TAHelper is to provide our target users, TAs of NUS Computer Science modules, with a comprehensive resource that +helps user effectively use and understand our application. In the User Guide, we display clear instructions, a quick start guide, and explanations to help users use TAHelper seamlessly +and effectively. This help users learn the new system in an extremely short timeframe, while allowing them to understand this application deeply, optimise their workflows and improve their +student contact management in the classes they teach. + +## Navigating the User Guide +Welcome to the TAHelper User Guide! Our goal is to assist and provide you the luxury of information, knowledge and utmost +confidence to make full use of TAHelper's features. + +- Effortless Navigation: [Refer here](#table-of-contents) for the table of contents to aid your navigation. +- Quick start guide for New Users: If you're a new user, visit our [Quick Start](#quick-start) section to set up and launch the application! +- Features: Want to leverage the capabilities of TAHelper? Visit our [Features](#features) section to fully utilise the features we offer! ## Quick start @@ -69,6 +84,10 @@ details in a centralised storage. Our target audience is specifically only TAs o - For more Commands that will improve your experience, ![click here] +## Navigating the GUI + +GUI Components + Commands on students: @@ -102,6 +121,10 @@ Commands on modules: **Notes about the command format:**
+### Command Format +Here are the main components of the commands: + +Here are symbols used in the commands: - Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. in `add name/NAME`, `NAME` is a parameter which can be used as `add name/John Doe`. From 70d72e8ef01a2487996f40ebcd7534e8c72bf056 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Thu, 4 Apr 2024 15:14:56 +0800 Subject: [PATCH 06/10] Update the command format and parameters for User Guide --- docs/UserGuide.md | 73 ++++++++++++++++++++++++++++------- docs/images/cmdguidewin.png | Bin 25037 -> 0 bytes docs/images/cmdguidewin2.png | Bin 28979 -> 0 bytes docs/images/cmdwinguide.png | Bin 0 -> 30539 bytes docs/images/cmdwinguide2.png | Bin 0 -> 31287 bytes 5 files changed, 58 insertions(+), 15 deletions(-) delete mode 100644 docs/images/cmdguidewin.png delete mode 100644 docs/images/cmdguidewin2.png create mode 100644 docs/images/cmdwinguide.png create mode 100644 docs/images/cmdwinguide2.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 5bdf4f4dcb1..e7da37cf472 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -14,7 +14,6 @@ TAHelper is a **desktop app for managing contacts, optimized for use via a Line ## Table of contents - --- ## Target Audience @@ -23,12 +22,16 @@ TAHelper is a **desktop app for managing contacts, optimized for use via a Line which caters to their need to store information in a way that is easy to track and visualise, as well as keep student's details in a centralised storage. Our target audience is specifically only TAs of NUS Computer Science Modules. +[Back to table of contents](#table-of-contents) + ## Purpose of User Guide - The purpose of the User Guide (UG) for TAHelper is to provide our target users, TAs of NUS Computer Science modules, with a comprehensive resource that helps user effectively use and understand our application. In the User Guide, we display clear instructions, a quick start guide, and explanations to help users use TAHelper seamlessly and effectively. This help users learn the new system in an extremely short timeframe, while allowing them to understand this application deeply, optimise their workflows and improve their student contact management in the classes they teach. - + +[Back to table of contents](#table-of-contents) + ## Navigating the User Guide Welcome to the TAHelper User Guide! Our goal is to assist and provide you the luxury of information, knowledge and utmost confidence to make full use of TAHelper's features. @@ -37,6 +40,8 @@ confidence to make full use of TAHelper's features. - Quick start guide for New Users: If you're a new user, visit our [Quick Start](#quick-start) section to set up and launch the application! - Features: Want to leverage the capabilities of TAHelper? Visit our [Features](#features) section to fully utilise the features we offer! +[Back to table of contents](#table-of-contents) + ## Quick start 1. Ensuring the correct version of Java installed: @@ -51,12 +56,12 @@ confidence to make full use of TAHelper's features. - Copy the file `tahelper.jar` to the folder you want to use as the _home folder_ for your TAHelper. - Tip: name that folder `TAHelper` to facilitate organisation and easy access. - -4. Using the Terminal to run the application +5. Using the Terminal to run the application - Windows OS: - Press the windows button and type `cmd` into the search bar. + - Then `cd` into the folder you put the jar file in. - It should look something like this: - - ![cmd](images/cmdguidewin.png) + - ![cmd](images/cmdwinguide.png) - Mac OS: - Search for Terminal in "Utilities" under "Applications". @@ -64,17 +69,16 @@ confidence to make full use of TAHelper's features. - -5. Launching TAHelper - - `cd` into the folder you put the jar file in +6. Launching TAHelper - Type `java -jar tahelper.jar` command and hit Enter to run TAHelper.
- It should look something like this (in this case my jar file is in a folder called tahelper): - - ![cmd](images/cmdguidewin2.png) + - ![cmd](images/cmdwinguide2.png) - A GUI similar to the below should appear in a few seconds.
- ![Ui](images/Ui.png) (to update!!). -6. Here are some commands to try out to get a feel of a TAHelper! type them in the Command box +7. Here are some commands to try out to get a feel of a TAHelper! type them in the Command box - `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A`: Adds a new student contact with the name, email and ID specified. - A new student entry should appear on the UI with the details reflected clearly. @@ -84,6 +88,8 @@ confidence to make full use of TAHelper's features. - For more Commands that will improve your experience, ![click here] +[Back to table of contents](#table-of-contents) + ## Navigating the GUI GUI Components @@ -114,8 +120,8 @@ Commands on modules: 1. Refer to the [Features](#features) below for details of each command. ---- +--- ## Features @@ -124,7 +130,34 @@ Commands on modules: ### Command Format Here are the main components of the commands: -Here are symbols used in the commands: +| Component | Example | Description | +|--------------|:-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| +| Command Word | /add, /search, /delete | The type of command to be executed by the system. | +| Prefix | name/, email/, id/ | The attributes of the quantity observed. | +| Parameters | NAME, EMAIL, STUDENTID | The value of the attribute that the user have to provide after the prefix. | +| Index | 1, 3 | The position of the student in the list it is referencing. Eg. Index 1 of tutorial class `T01` refers to the 1st student in the `T01` class list. | + +Here are symbols used in the commands: (TODO) + +| Symbol | Example | Description | +|--------|:----------------|--------------------------------------------------------------------------------------| +| `[ ]` | `[email/EMAIL]` | The parameter `email` is optional and specifying it may not yield additional results | +| NONE | `id/STUDENTID` | The parameter `id` needs to be specified. It is compulsory. | + +Parameters: + +| Field | Prefix | Description/Constraints | +|-------------|:-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| NAME | name/ | Alphanumeric characters | +| EMAIL | email/ | need to follow the format `example@mail.com` | +| STUDENTID | id/ | Follows the format of NUS Student ID that starts with A. Format must be `A`, followed 7 numeric digits, and end off with a alphabetical letter. | +| MODULE | module/ | Follows the format of NUS CS modules, which starts with either 2 or 3 alphabetical letters, followed by 4 numeric integer between 0-9, and an optional alphabetical letter. | +| TUTORIAL | tutorial/ | Follows the format of NUS tutorial class naming, which starts with 1 alphabetical letter and 2 numeric integers from 0-9. | +| TEAMNAME | team/ | Alphanumeric characters | +| TAG | tag/ | tag associated with the student. Alphanumeric characters | +| SIZE | size/ | The size of the team. A single numeric integer value that is more than 0. | +| DESCRIPTION | description/ | The description of the module. | +| BY | by/ | The parameter you want to search by, Alphanumeric characters | - Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. in `add name/NAME`, `NAME` is a parameter which can be used as `add name/John Doe`. @@ -141,6 +174,7 @@ Here are symbols used in the commands: - If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
+--- ### Adding new students : `add_student` Adds a new student contact with all the details that have been specified by the user. @@ -167,6 +201,7 @@ Example: Explanation: This adds a student with name `Dohn Joe`, email `johndoe@gmail.com` and ID `A0123456A` into the TAHelper system. +--- ### Deleting students : `delete_student` Delete a student contact based on the parameter specified by the user. @@ -189,6 +224,7 @@ Examples: - Delete by email: `/delete_student email/e0123456@u.nus.edu` - Delete by index: `/delete_student index/1` +--- ### Searching for students : `search` Search for a student's contact based on specified query. @@ -205,6 +241,7 @@ Examples: - `/search_student id/A012345A` Returns student with corresponding id - `/search_student email/@GMAIL` Returns all students who have `@gmail` in their email +--- ### Listing all students : `list_student` View the list of all students available @@ -214,7 +251,7 @@ Format: `/list_student` Expected output: The command will display the list of all students along with their student information. If there are no existing students, the command will return a message indicating that there are no students currently. - +--- ### Allocating students to tutorial teams : `allocate_team` Allocates a student to an existing tutorial team within a tutorial class. @@ -256,7 +293,7 @@ Explanation: This allocates a student with email matching `johndoe@gmail.com` in Explanation: This allocates a student with index position `1` in the tutorial class `T01` to a tutorial team `team1` of the tutorial class `T01` under the module `CS2101`. - +--- ### Adding new tutorial class : `add_class` Adds a tutorial class with the specified module code and name. @@ -270,6 +307,7 @@ Examples: - `/add_class module/CS2103T class/T10` - `/add_class module/CS2109S class/T01` +--- ### Deleting tutorial class : `delete_class` Deletes a specified tutorial class from the list of classes. @@ -285,6 +323,7 @@ Examples: - `/delete_class module/CS2103T class/T10` - `/delete_class module/CS2109S class/T01` +--- ### Listing all classes: `list_class` Shows a list of all classes in the address book. @@ -293,6 +332,7 @@ Format: `list_class` Expected output: The command will display the list of all classes. If there are no existing classes, the command will return a message indicating that there are no classes currently. +--- ### Adding student to tutorial class : `add_student_to_class` Adds a specified student based on the provided parameter to a specified tutorial class. @@ -314,6 +354,7 @@ Examples: - Add student by email: `/add_student_to_class email/test@gmail.com module/CS2103T class/T10` - Add student by index: `/add_student_to_class index/1 module/CS2103T class/T10` +--- ### Adding new tutorial team : `add_team` Adds a new team with the specified team name to the specified tutorial class. @@ -335,7 +376,7 @@ Examples: - Without team size:`/add_team module/CS2103T class/T10 name/Team 1` - With team size: `/add_team module/CS2103T class/T10 name/Team 1 size/3` - +--- ### Randomly allocate into teams all students in a tutorial class : `random_teams` Randomly allocates all students in a tutorial class into different teams in the tutorial class. @@ -382,13 +423,15 @@ Explanation: This randomly allocates all the students in the tutorial class `T01 | **TAHelper** | A contact management application to help TAs keep track of students in classes they teach. | | **Graphical User Interface (GUI)** | is a type of interface that allows users to interact with electronic devices through graphical icons and visual indicators,
as opposed to text-based interfaces, typed command labels, or text navigation. | | **Command Line Interface (CLI)** | is a text-based user interface used to interact with software, through the use of key words command such as 'cd'. | +| **CS** | Refers to Computer Science. | +| **NUS** | Refers to National University Of Singapore, which is located at Central Singapore. | --- ## Command summary | Action | Format, Examples | -| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Add New Students** | `add_student name/ email/ id/ module/ tutorial/ `
e.g., `/add_student name/Dohn Joe email/johndoe@gmail.com id/A0123456A module/CS2103T tutorial/T09` | | **Delete students** | `delete_student `
e.g., `delete_student id/A0259209B` or `/delete_student email/johndoe@gmail.com` | | **Search for students** | `search_student `
e.g.,`search_student id/A0123456A` | diff --git a/docs/images/cmdguidewin.png b/docs/images/cmdguidewin.png deleted file mode 100644 index 76e3fec73872dbf9bcd0b1477d17502e9d94cc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25037 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�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 BrA`0< diff --git a/docs/images/cmdwinguide.png b/docs/images/cmdwinguide.png new file mode 100644 index 0000000000000000000000000000000000000000..997c44722721eb83e2bff2dc28b6da863d7b5b2f GIT binary patch literal 30539 zcmd?RXH-+$yDyAx3pNy$Dn(_BNEMadEEJ_mkt!gdfYPKBS}Z7?=$4{%f;4F&p@n7v zqO{P1KwwJ@Awq~DKnNk>&V~PT&X;$b@qW3VE@N0&tb~=h=6vR_JuCjEsllQB!uz?n zxDMU8u4}=?wFkw;_17!zJ>UpOjo=FY*%4@AaFwg7UxW<4+2wJ?~6+_3ojHy2mPzc+NRScN$);`gEM-HJNPas2C+mHE?N`rr8ncRYvFmO8e7pHcx%>OP$`nOUZjxp14vZr279+j>Fa6b}$Ig#Mf{7MRb+S5n=wY`Elp^Y!lYb^LPn zsTjrM4|YI5U#QLft8#u?+TOiPbNB0TTF&Ms9qV`A@vyw@`;%tS86Te)m0Xs&TH(3x zh~w=YH)A^!1xoJqq%#Y)U;lpk*SUcNelCT!byqs~Bm0(>A)}pg(ChBBjs_m6EHcVa zMsSttZI0i$Mh-aw{b2lelE#2^`zFG-lB?8+={sh406J_dZldw;qrbXtv4p_S$R#@L zvi+8ix_e(MN>D!Z$lu>sA;avQ<-lcOGi2@lAwjQsuiVPQQ%yZ`Vea;g4_#{Ay%p!! zOj2GR=Z83_z^*pBX?4tD_}XEuRPD_lhgH0~LcX2Jc&oKGE+HE5^;BQx^s0y_`{!Am z`(s=;U*SV0|1&}U3L+${6x%q#&S?Gq_*Y+M4F$}(`)iBe$tuwVl}x3D4DOOOeCSLN zwUv<~Gx95#^^zOKHFoUJ2N$dm-~4wkxp{`|yYWhg`O3X-oU^R3bwM({B5y(TI3X0f9FcPGLK$yrKIX$ps@@_gG@oBJdl9m=}AJv4ia@|8Z+ ze13Q3xt)u}&Pr#EmG>*;z<#4zg9E7N2&AlW&sL9hrTymTL^8>Y<2t$$q`v;BmA)x} z&`ITNVmX1C%9Y;S?|&TigznkLJNr=jDi)qf^XFxZ4fBK7c@2ssQdBh$9jcrdeRrSu z?p!*7?W%nV^{dsUA~Q3%x)M&IEfag7r4ZnpR^7JoAbQ59VMdWngzNaVR<-OFtS;k0 z)r0X{X@IjD$n%8=-?4+a+t>c++usAi4jy53%AYIFpL;y!C&FApeVbAP3k{_DrMc#Q7H88i!)LbW)w}IKzExZQ_v!F%f!i-kRe!{+jJqL} zyqYKPm*foDv~P_1`)F`mihAaR&Bl|D<*j$vv#-ew?1ZLMgm3HWSle@+a3(Qh_*AUO zkfwb*H>#^7#x_wv!SsNDyhzw@XdKHgI!Fa1HtPR-e$$H21Q%gjHea8_q0SLt^GLMK-lA2hsjc&swZC z%SCE@f^U?-4MS(5Le=M9yA9#m*6LP5;fzqG0LOCls?5%`p2q_x!Ig!iX z$U{a7Cb-*yCbj9SH};i(1`~A&x7(V?go=x(e+O^hM4j1z?KLbYD~IaxVBarLs(fS3 zOmk+YO?lJ0WvY8C1FjyAn{D4>Y~_-8UG>I!-P}8mpR!IW;47Gz_^kq`t9)@8_=y4rCJ+8h`QM zvikIrk`BR7SEll)g%%i2^6xK)%_e;s9K*L*GkMXQ1o4tsv2ZE&N{LS2C)}`^PEIbI z!<>r3bw=af!Lzy%n_9xpI15#{!@nHSjP9F^Bqdh^uC)BX#4$aGd76c zr{Xu(;-o1sxe1+|sRUifWfjW#a@5xZ<^*@0q{6@hb>*ad={>Qm%9)Kyk-MNyM8PyO z;T#gY|I=tYD|AbKucKnr#&F(}`XPH%=^Kqu-|(d-Qb4F3ftR3*_s57fv07e3RhqTW zr(uMf$n*?8j?KW(CdQSgNssr62}UEls$1(}#0P_NZkhu4Q(ea=I|yMWK|TV6@H#|c ziyvOA*qBGl%HByfDpKYalWGICFl*lYZ@5ekx=B z^_aslnB%iilWupO(NYRVr{$lZN_Om2`8n{kG=CsJnIB-Qcp@1z-IpC%3Tq^ zU4=D{p6v`>tV;tSj?zpNR%T$NG5;SmSFOf2Y%#BlbjGii_ck}Z`S%l+b$|(yf}wq2+2KlO{!7FnEw#& zuF-paln|z;2a8e5a0E0%OwAvBrCZ?@a!EYO{z3i#@?Qcgk{KE^?MLVreEC zJrnX(W%_dYu4|Ob6{6DVgoBho(QerNyoH;ezlCtC3$5Q2qO`Lc+|LzlZRTwS)}rQ=bJ`fK)I&Be4C0Qn z4%;|K1?R^4y1}1$zC2!FY&FnjV)OZpZ=Q;DP~uv&p;uC93qcgdVN>Dor8%%Jn#1sqw-=zXWj398Rn@y zZA%fcObqX2xJ2e*LLDL*+_lh6o|hE9sH@5+SJkD_xkf{;j*3Mr4qB@6O+w$rL&$-- zOeE7V;$|||6`o@wXV9|;@J~ujHI^FPat(TrrbUzQhA8;!6LKmWKAq-k&TDG_c&hO^ z7Ni}KL66Fu>b1oPsq1(!H;c;K>cgl`x(A9qck@}I(miAKd~&F)^oEuqyKpwsOUKs_ z*B6F$8Kh)xZIX2S(#Hpap4*-3&b#S_ALOZvv4gHQ=-6uH;E;6q8DZ-2NzB5SO{_@3 zb*x+^ScG_8fHKlpmqctZ&n*ei?m_1cL-sTcrgBN3zbzamRL2Z0m+Wb0M6_p+1_RDr zEu3F_zblL_SosVew)4}KMu7J-i$)8sI|^Uz7XAKO;c&gD!yU=Gn*A1TZPK9`?MO&s9K^BLIXL zielh1`ZejjQ$y#ZKS&s#BN($kiEmyJdnFw`3J2wB?xDnVp_crZl}sASKk1%GrB4H1 zxq87MX^YRrV%I(Ylv#H4T5TTjk=F(Gx4g|8OKSj|9`0o+V0aO3Q4!f6uEaBvKgzE0 z;k2sYjm){Mz$Pif@sJI22`O-z=aVgi^8O2t8cOV3ue4z)A7Sr-AL9EqdApAuX5qD?}(F+Y@o-dW9wl=D_ zGOHSA6Hw&hthoiTPq%K<-4I&!-(BnGr)yG^xeW@l493KHopK+3-q%++*vURhEG(wR z)REI2e824wgGTpb{vV#8gdXiqlcA3YttDYT#foHd$W`LS&YQ00weIIR^8l5}GxOj% z#by~jHEX&u<=n-{MU3j*o8{ag1lGeSj_K|9cdq1~XyAd~Q(5-aQBO)eON{KZw@t!F z)5EmZJ!rVt#OR{CvDw99>~$H}_8yzJY2?*d<_c1e>@c%A1BQo+_KDDw8Lup7<3RE&G=Mu=iu4w zhgUOo;B8~u3yJHz-v2+o`u}lOm#F8VLx+k0J5vIjs}Epydg$tg_qTt}z#uRRKBm@g zdkDV+rZ&+Ly0Rg*O$fM76#MVCm$9kpO?wM*-Yg}q5qI)X5wlsnt#+H`jh%JdV{fjA zcI`|6{7zvXic7jaj5fOh7V}T4cflW`tNo^aCYqHzu5)X1NT*m(W1GCDz2zG5n(KXY zKg*~78y(PIV%aO&k&-d}6Fwud+wVn)k>)3hv!x(!q8XINWu@ zFWbHM^GSgYsJi9(L(0xm;#*H17iYqZUkdcStm1 zv4$B@6j@)>hD+qe5uCmQy0%Qfh(*XkXqXW0qazszr^2ui%ZyJ;&D31w?{{CdR4poW z(;#Gy3;x9j_913=td9FOQ^(t$>=`S`+lkLZ5nvy=@zmi9og(+l_fY;M?TEPx&aO>qQ(LuGd1 zTEu(!hr=c+N=Ak7vm%kdKLIGwFcTe7i(0au>Gp_ev~di+rA~hP>iM-~S^_mE%yD1F zRat}e^Fxe5UE?v%>5j(VpAQV5)nR_yY^aWrDp;gGIUw&j)>1r!3r_F~00eRlD?Gy> z(nHc4#+|cYjXQhWT+KSdN(rVBUaj*Qmc-v?IITuxA5+VtIr;M(*4g}B#Y$v|Ecnfa zRc|X(PgM#odo|!gywWW=X+a8AO>>!=2rhR=zZ}KU6zz?9P59g!k0BwC?3Y-N&2G)& zm;F9g)?LTbo_c-hQE1O56@Bo#bY>-d`P*4~%L(vtk5rzX6@E6@cFgb|EcN?dv9Oa0 z)jeYk%ilS^?O=mm4i-iXn`+3}EXR62K3Zw*n!w45X%8lp$$icYFr8o}mStx=oQ*%LY*bBV zY~SDPugs)&1W`nP-DwTSGm8K?rwT3*(Yjs04>~zNwzd-1(=%lWOqs(()0&E|-j_8e zpTHmNtj@*^j~>PA;e3c0a}84gMoOd)8HBiQOpTPnLdyKIOcK9m8VQ+Iz4~dxTAP5@ zy?i8(yfSQN26*#rdhdKR8wc0IN_fUCjUW%yzn<0Vo_P)=rAyeoE*BUABneIzwC0R3 z;_yiHJTh?^vBwo&Lp{pTwF&WIw^gk#dgy3uiVDF)b=GPSM67@#R~IX2&u3a2Z;S50 z(6qBLg+4^#EdKeFU>585lrJ}2xcVL&Id}03E0H*qsqp#Tyy<((Y8*6;AAMSAem3^y zuue8fF-0$ka4hXIm_}yH>XKOb=EWh|qLqPbhn0*htML=kR~s%M#*Qkc1^ZB(iM2}` zOQG#qBwEfur9*AwT9GT0!=hpXe;qw_W!J9OI4{Sl1;9o!NIoi453l7KG{v=_IHvTS zm6(6QeqFaA2%q|}9?!lz&j>zs_4V?Xm)s9eUluZZcy!0YbvLK9r8_+>m3a%=ylfGV zc2X_=m$bG=iE6r_k<4NvAqD2N5+MrJLBWc)zbYYp3?}Bdm0AZSNbI>y zRZhmlYOfS%`gTD$?+4B?YIU@!Jg@)Z+dyYUYpXa$oU=>DDlHl>Jykd>GhNu~vnVqb zypT{DM^FWvpU#=U*cGde`EKBy6_8gOqGa`g@mq}5suZGNB{1}JlL9=f%L|iHRZ}uyzoA^Q6UY! zMLmu2uNT?R2JL6ke65?wjNm~FY2EU|mpikabeZ9-$(h^?iPvSLwwUi&rY!zk%2+~6 zj7N^kc>bSt%q9b|G;PfMh822Of^X>9^U|C01ow_=O5%EObkZl@zdj<4C&iRzCm1e- zAwn1-v}li<;4$H}uQei6fdZq5$#I*CL=yUzx`AGxrU2ndheFdN#?HI`yL;b|S2*5T z7Sq;^0+sm^_HD~lw0yBIMqLOQ86=GnCKij}z;;I0)ZCaa>>KLnY*ViemBpZa)3$g$ zbwmAgCJl(h;w;~Z3RtUCwR3~>YJ<$A(K@I(lSG(jUQc5&JGJ(kwf)18g|UjrX0Y3H@3XPCC8FMPWcx-{iZt_u*$D~inJK4myy*VUI5_icK{ z*6_|yC2`nOKio0(M?g-Y#`pExyy5!4g)MiXct0a-yjevGQRgyf+$^M?MY3dgwnPs0 z<>z04?cGsX3m6y+% z8qH{?2S~9Je6DG3Jw6iBAnH3$VsCQz7e%!J5=Zhj^#Ya)RJrt5_0_DqL`1%*6l%lx6Aut^` zPo|!fkvy_pygxVLV%AP9ipxLUeOE0{(bUMlR}pi`s9aA___2OmjU8vjZ0l0S zODUO}nU`Jl``D=&7rKnp6wJR*H&t16XRPYA6TLsAVP|+25{?F>RehS6AdH}T+;6vY zpPjAUf|x>d+v~6FX)1HEA##nywpg*KI_u!!d3?v@EgQ$Q5{n-?xi?)}BqQL3@vOR- zQ>{U*8WRf>_;2#|C{I=HWQtotgv`}-sl5{M^qcl#UG<8R*52Z7`lEMmV$>#>vV_N- z>}k1230q_H?nnMppVVMD*UntJzxAs*X0M{c4?8PijH*ygURbrQd|JPG{OEVX zw~qV7F&0j^T=iy~tgoDKzDm9cj73MVXEil4`n2I!J9~=`1(H$GY_?k9a?38UqBDAf zX0ZDaU`HJ?(AgOLK^G#RbnozX*GW&f%#*YkO+Wa}{STVE=SHo4-)yvO$5m%P4RAt! z&>GVV8}$u7+Fh@wL-dwLH9tx`QXKdD{jTdplS8Nb&9lpo{IJSqEx(!FNb~no$9e$% zI?sq)v((<}-_H0m#6dq_8YmmxUk^MybeHOPiSp?0&;2xEN-*X8dZk~K7soe_>tb=^ z98u$njjxM!WrTcdl6C-oMP7N1rDhpk;`6f&=wto+<$8N@eo&fd4fYEO|u<(sPw z)P8~ZTy(#V3ea(N1aT6GuZ=f9`Bf#MC! zrj4AtiVu^wm)4i*Tu(_{k}FK?_N`1U?mn3kSV0#;7#Z~)*X}6KcYtr z+x2jJ#Po1B=8yULh{39W+zRk}fj(bhQ83Ao_%C&*ZS=^^BY3e;wt??)tZv&WgU9Oo8PQ9a>eY^C}fxOhA^{Q8M$M}MIlY$~X; zBFBj>x?lMgj2irjEkV{5RYt@`2u#pJyjqTWrtSZ?Y_3f-JETee%AL)D0=8Q$x8IjA zw5LeVU23)EKJ(KDlaHLa`qH;DPGgmh9<=vceV5eC&r+DtQ4*&5uZ3$DM(QTM=k9Y& z_1P%JKfo{RneJ2z2&j@#Ip*yz zNwiK<_lMHIxBlI$^IE36@EB6mOa$-BR zFQZizif(;`YW0s*^D8IPYF%ivov`V$i~!|ZNa8hKM`oQ4t`6svMe?Bp9?t^~!J=}q z)sLy_Z>o6vBRS?vtkiv7(`I7GMthK6WgLuYV{v z(^GeXtjcQT$w4}N8B+Qc+RnmjDo7I4p__AF`_^82^ZSl_ZX9)NX&f)=f`1HF%tLND=JbzI8)HtigDb4|vX z+5J!@Z1A0*<|#v+YA=L26YQb+cHt&19`^^o8-itu@ZDsv{7YK{;W{owp zDTxO5Dt=+@-=?2|HI(THY7S1$9wpTf7r)B;4h0W(>_Bt(%{I3gSy+-lthIuHrQ_4;LyMs{EJq zkFh4)vwWNyX2RN4rv(Wm02xnU*47CK(r?K<0|;ysU{@sA;>9Uo{eHn{zg#{_JuyM7 zmLjU$4ks7E#N7L{)grU^iU!?`-cp@zR0jU$*#MXfL8HzYM_o;Hlfeivh9H%PZPjmt z(vM>#c8^xW*$c2{WL|(WH?d8OGEJ3ylHa)3qxbbotVs*TF%+K$DGct3xDMJ9&Obi10ZBa`e= zXZEcP=#4fTUw;jrFP@=-zzY|bMW(XfbW4Fd%-GzVFU`dK({aA%c-`H%P(krD1=kmx zBWZUBb8un7oC)nc{)l{+OB5W+!8+&|RmCFXp81d9PrC&UZq1^Huj7T2>##>0-*<+I z`mmR(J@Y09wQWjDkINELf&%-LaBmak(WS7FcCZ8NZwH=2)V5CIK)48BbQ3=zmUs6w zv1qZ{k&|E%eNEw>Y)akclXiOWQz?Z(bbjP?z*dYe!ww)jWVe5E2sPAFI&ZQ|y2K4n z&B^nt2)r=C*-*4IRt0-C0MBBx zaIh%MMlKJHJ>q-o_+z6awsIydQX$zL74e`2+-U;f)*|FOny3hac%Aq*Z{hqu(d|YM z*(`18`E*)3AGuRbI!7JO7CCjp>Y(1U;gh=0tgZ6(^lYt)`D$itag|5UOV7;;&f2PX zMs)aNXrTv$HoniC1Pquqjqks&xwK{{`3^5S43vc_*-GWnrxXLB#Qopal;VhjMrA=c z<0kDmg>EAn@P<^3s)ONz(aW#$00uUBn{ARN<&lHYu%5SHVtB#^E4_KTt+KIY=$W&_ zW6H=BVO3Ltj*+5j}BShzjY+7FNe_4LCCy% z>5*_Yz=&T6y8JX%`*6J%CEE(*Wxug_e*4R!$kWPCD%VErTn>Ev_4^&26@cIc=p_rS+T^z4s#dN36Ihgrnu4;wQgAq`)Xu1V zHarh(D%Iud)2@kf@3?D`t{UCCR{aebLdyezIPM3 zU${A{fNkd6?-LQg**9reepM2qTiwhGG1)5~`7js5l)A?(EllaAn}$yLV}3_5 zA${q8F0A6ug}pu)wcCD>?PT@OGXO1oD^cCTCW{w!y&kKkUr9`ugjDPGi_f`H6KQC- z`0hSIztf*nzG>?$yz)GB6sI;7&?7gR(}RfoDFNfmCMwJwk=cp!G_n0$?|Dm*Fr#~< zLSxFTc8p7_>(L%@F283lv0ONHhNXkiUr~v%1*cff(Y2c z-KH__gF8#C<}bj2<(uJt?iMaw0!@>4ak%d?)CaO+)gQ8ghk#|AMPkgr;oA~f#-wA- zwqatNzU?(UNXJk>ZS76V9CSSw{bo9GUh=miHQa`i1}7KGq5nzbI@fgyS_I4JnvTYk zgW)IbjrC++Ur`0Cj;?y0maACR1J-Gl15VZveF^dOxZFczdFQxa1tK3QRZWqM{-l%c z)Ne#;>sE_nsDkLvb4*LTwY$x2f4!xlayfKf!g=?+s5PN!<+WhQDdgWP@l0XR{#VQ~ z)31cC4y%;fxTQ7ZGmDaFhQR5YvQ!}w{Ov$#D?TiVl$lgCwRcc`0nBFS+K|m~ErnxE zOHdKW#i#)X?33^$CQ1a0(QbazOGx^yy3~BSpK{Dh^W{=2W4gtM)Fv5@KN~Q!W?6+n z^UQ3{sRSNq7e-a^-80_au#h#v%ZF^blTOYyG2Yj&j$ZWwxCq7pn2W>=)7wo1A<0ac>l10$ z&0&F1z$lAcYp7-N8-lcuxyN}%}aFMxUb8MX}zqAVe!NSv`gES@?d)!Z75J^VSJlhRp( z3Ds+{DT&r`ZfAL&ppp_VYj!B(r!Usa+?!*~Y(?h^u*FE%i5H)=E{8%xm%rztdtc@% z*&R0Z-!K|7pkTKPX>ran2G0!RoDX0W`rB#Aem@zuHLiLS08bCSbGvcTy;l$yAqMiX zO%|%s9}E9+Kf+& zSIaivT;05|>E+C_N7K4a&^@LAre0=l0)RJ)3qB)MEyL%lf)BFP?hkWhwkYZuWwMr< z75pq$(CwwV2t!mOzhWmz#P&&)!w0>(a9oEkMrjk2ox(yu|yZntdP7_FYewF1|N*?iU;un{uI z@r66(8p40?g}=}-u*%F>7R3nSE@_j}3Q+?I;yY5k1}QCww==j^*VDw>yyc_!>XYgO zDxFTNrm%H|lJkF1{NNGOX7iB<3n%2}3{dXLV5Gx*?;T^10Ts`4#>p!jYZc!B>kXq@ z^#uyBtpI0VQK3P{Vafn(75Ilov`gFF*o)OOSOKiTfvVqNcW;qLsna@+(Y>ystl*n8 z3_W0;q>7Qw8>D!OI17%zy&z1pQeMq(uV?i!$-wHQ-c4TQ=bupcaad2lG1WoS5k^c? z`xs}4ehndrpOgnTrCG?Mo)xrOq|wK9&3oY-CMnB9e~bz{$9jM`7Yxeg9K{G1Ls=pi z?sn=e?6irq763j`^lYoEn)KW?D*(n5njwLrY1X!TVZyS)Yg_okOVuHY;uZ!VLDg!W z(E^cy)0cew#OW9NRV5nq4^rfdif2_ds@&j7o%XTv|QrD;Mv{;Akw(Z8RH|AbiunXTmJNCTV=R9A?i1Dh|8HAQ;f zoSw)?h|+(gm_9C9FNg2!Z0mXLPFcP%$STOAGNV@`M3GaSt$dK_))J*w--wvikO*qt z+F(WkssN34C;V{Cc$?+E+S%q7{2{k?j9T3CJ}|Q9?SP_}Y=bIJNSHt37M*I?R9~tq zY^C=-Kec;uplU=k^-6ArZ{@`4?6|U|RX&!CZ{v^W?qns3wLY|2*P`sLa-Xf&g#?)$ z$KS4#3Ex)snASkq3sDKHf%N_HXvd2$7Y6QY;#w<%JVyD6RWS`T8IG$o;-YTP=pgVFnf(dNWGD;6}pzrbwU$Q(UjhI*;6JC%`Hp7AMP7^z>aK-U#uPu>#-BkklWc9 zvVI(6zq7KR@r$9l*IXN#R+2q2J1Yg9A7~od*q=fVort**VqKPRe*(E&Z>3zB{O{ct zq$0M=@0Tcs0KPH!f%r9#GtNmpyd*U0MZEvzD)g^+L12d`CVUDha!`E9t~}6PJ&%bH zKmJrxfzY%>pn>H)2WzgwSc!PV*g_%HssSiVA9&#LYh=Z!YZUN`Q7ds{LT9XGErr_O zC&@Kx3ywrx%AD`63SmcL4-bV^eF3Qix@L-E+gY@U1eruPxeL$fa_Fz}3Enr(lVUU= zf?OD_j~64MZ*G60jr}NObH&Z8MNS7FJfba^&ssF0tIDJPUFBw^=y2Aj*e*dht0x`Y zmyxc&f#en-cG&xx1^PtdhsLTs0!s1cK{mGEzR;-BQ|XB1zQb=s2A`biU^`yzypZ0DIG~M{B#)1{wCM=F^3=wj9Y)kI=N<3 zJ9OyY=4noH7t(8=QmT?B+yW1V!`bt78Xui>8*UOe z^v=wOU8^k9RG>Js1kBCt?SH0Pd$@c+)W$qebT{%?c*<=TUZY$cafrBq8aC}2o_IK4 z5IYA$Igzb}#4PWBUrq^ak-%!yVF#~I1`PwOZf(zN&{OX#r^W!Z21M1~d}W^>V{G2_ znz0;21|lonFdLCir)R=C71LO2DaDmmOzC185VAP?CO(JgTZ~@CMmA3c?>R^5DP9 zO2)$Eog7vIoshS5LDCt5f-pQ%FL4NLyy-XvrxsN?0As8D5`%d&JN-L7#^GD+zyq(w zZLF@QIl~PE{QjepohVk-p_8!U91%smBLXg_BJjq|<(^oXACe#1Pp|Q^4mE&qxG>50 zQcbl_{r9^0=NCREp|4$9$9cXxs;>x*kC7vkXUq@tMx zF;i{kPfc-Q;cmIOS+NwXIL5zUjdalFZZyTqx#zLP>qSD+!co>6t%wkwcZBuXMkLW1 zH6Fe)Xh5g?!_x`Wk)B{Gqm9C7i3t#$m=V`wa`r(KEjRQSV-^4?PNZ+>G>r5kKuHP$ zp?NwsNxMUUign2gcbs$|%vckEi>^CwZQ!!%s^bH#IQrgoqt;Az_bP&#v@S*tQD6W} zyyBqEl2f?o(J#W`(U{MFx*TF2U3f5R_E_Fm5Ex|D($Qw9mX!dVnCLbVYm^!s$JTE` zEDPjO;v`bO_E6kX+>#k&Ss740qZukMsSC&{4-kJc0{siUEJV5keyImcoQh?kEiH>K zQf4<5G-q)=I{zn>6kvu_G9>R=%=D_dA>bHf?j+U+Bjses80#Nv=ZKp`wEs6RUj~Yf zvDLb+UQkfrSRW)CY#Pn2wH3}vqZNd!`?2E-Fd?spjIj2XXzc{U?}CExw@arBCyT&V z>z2Hf_}P|q5W-*^y&l@bn)a15Y(7e$#suk?RhOG^*#e4|{+$+gL5L4o7(C3MmOR*c zYY+>2^EFtZI@#Y2sbt;YmP}Ibq1_epK(%PDj#z>SRRUXgfS=(pNa0Y4XtSSfIrC8? zl<^*hnII(speTjg5|>Vpo8O7knxMkp5(z4Qu+P4u6FBM5UA_dSZleH0Po*#_6x;*a zuLg*hbVQ`Ah>9~DVO4*|d_zlhtZ5$}4ErE8SV~``q+rtD^e254-5wv^b_7QSs=bd` zWxaBLk7so}_3`q|ZOhfxU0`@`u8b1z#3l5XqPWeOVQb$#NZkX2y7%r_Wux}GDIn`^ zwai?1Ozey>*zHti8^50rZ|yzidYV*ZWBy5uk79mBnDjo5-35H~-!vnN>hqyiCx;dT zkx&tMgW<>MH5G2fb$Cl?L!dCCIVwH6v-PI7ThrNuahs&j0DLe`$;&$H9sQ`|e*N7c z5qUKttVL@(oi`XENAEh!hkZ49jn8ZHXs;_4v~S@QZu@ugF#|g;S@d*8>&XndqLz*p zTC~Jj$K!R?5 z^Mj}^zj02$R`4;$LtU?36#2!W_dow(U$7cCSCahI@_NC&7rL^NPRevWJ?_5!x^dKh z2MX=~#3#9KDn0&B81dGz|Hlv2{YNly$vN-kNx0xC%k=$`O3E%2Gl{;Xc&m8xw)Y0B?yot6)!SwLOU<;`CO5j z3`qsQqbk$jy3)$?OK_q)?A@rD3i>P?x5YpVOFH;u`=Tk&Mb`8d-V=wNeClmgvca2> zfj{8qq`mn5%W|Y+AZRioG4IAy0YlAZC~JD9cy7=Ou*jAb!1$VBPzB<;dxMra?$G~BnVUD;v8D1Y?CpT+PIU0A*A^plGDHhF2RhD;3M zzeLX`BH<<-e;w9*0kv8Xi9j(>$C90^Nf*(7Y0eYfh6@y;&Qn;w3hrZV4jVQrOzKct zBJ)s`W&9AoOug9wYu}e&@>Wmv?yuhTid-^T4oLdG`aI2{NWy6Yzamr3v3F`HNcerW zxRHSqfPe^3wJUlq(<`%X`v#7bl8&FY*U16$Fif`i$c}FU?dzSl&xuq%d;IS+0jJj>6bB^N?GNy%t^l;-0*;Wb zRefx6|Ffln@R}m>mcTG~@B+<`1-E%UUnKh(;tv1Wx9F%*#QIZ?} z01atug4W$8*C%!`F$?Efb7^u%IP{B^po(8(=83 z9tjdXsn4W(Bz8|zSj)g}wCIVB^L(ErZKJZ{N2`VT2|@cl5u(7$K}d z;;64AD`HzLz7sV764)jxj#|+-t?JD>;?L&3mZ7?B{EpR`st^TRH;7gOFL%J+XZJC_ zNrBrBuc$-D#)0Dg7gGOG7m@#{I|=Y%i=L?IdLF0p{phg8h!$9RACrropz>bP+x3V- zOWe@vcdei^efz0O@&h1hc{T*jF z^v{okKrkh$zQ;h;K+tjtD=d4v@x7hBoVIi7Fw_@1b08; zD(K8un-9ZiEaCDBuJ<8eLPfM8kU^!@9#o!wiF&{ z`7qceh`9Lj)&B|`P7=DPkB6f|fMj@WIl$^jXyCT*9TP}lY>bp>E8RXNa!L<%ya}j# z!<7xw>Y92+ul{Iwkv|SNU-ye7{PNvEjt&zuoO2tZpk5kq-&JlGz=7gF=kpnKzGrPW zc7DROZ!RMD-qe9wxmGviolR*&zfQFP*|9-CWGeE4;b8QB`rDP8fDc=tLI2>k` z1%$Mh)YvdKpiJi@eY)Aar)~;;k+%sf;AC?ts~Rn9tr9xzC;WvTU>y5(S>$uwLykaKkO$9nPit=nyE&D|c={3ZXn zYu;ME-_N|;Ra4-xWsCr?F;wEJH5f&F7BP4AQ2o-UY#Ra~f#y)d_#4lRr#X9qsSVAi zlk(rOnODD?WoLL2N5+=ItJzG+@U3TS%B?|aP+_tN@pQEFSLx}6!spw!_Wu3j%G-jmg z?Gi~vc252BMSH>U{QR#Dq)QL{;Jc$=rSe#-3dUq}FO3-ty!O`1s zimB*l7bNPsvL1kTXTf8Z&2>ZDDp{+OLf*X>4CiVnOaWvEf2|%;lC@2zRpfu)2A~0r z>W%}wbvg0_xK30Uw}E(65O5`u{EoSp@8TI0mh38P`t`0n06bS91)c175oBRC5jb6$ zc;DeLEs(|O8=BvM20s^DaIQzAygqW`1Nc?EQu;l)je7<^NTHJt@M?D|#V?5_4&mM7 zn*9WJjJco`* zan^qAI6%aHgTjC_{ji#5_&^6IK zNx#p3{y5;9y!r+kS?tyDr~r?4uWns?kls}tq-9$UYQG}fKvym4rb4&-t_a28ltd+N zOW0QO+g)iCuIetrHs-RmSxL3M9YLx4;mYsRO$7tBJ6n1%ASE5Tq^u z4T=ZcHE@T-*FWwB8dNlJHdKrx5)2m2TMKnHDS>~3&@!JR zdQ76o+0+?tp|~<6TpsrxIb{H8U5)72gHS6%E++Vwbr-1PkgOzR7Fu|wH{Sof`n6Wy z9dzA8vmDls!|-ts{|Aaxp`Gv~XcQlpZIxUTcbj}R^iFAH`9F7CK2yD3_pba$We!*{ooPG_kk&A&YBndr|0M^77qfMw9_%G_k z7|?EuxMe54_Z&q22y6mvXptbmN>VkrFvOhl^dziw5n050PV{m8!*4r>^ZIclsKYye zDY_sMIstrldN5+)cx8(#41~1$7YOR0)4;C}_p^S|*URbUa$UTa7&77uKuXeDpzx_3 zVRf9-K-EaT=2t0ytYyMvAQNp6O>r^9t zOWOPD{T6r}sJR6!yg7njUh^w6Z8dD6alKAN9M-7|Jh-MUEJ}yr>@ej)6dQj~Ub#$5 zW1U|r3#(r9>hb3RJ$zt-_^k(a)Tx42>E~bGaVJWQ9{_fqZrdN+HYPAU2cAMRB8zYU z&C`a{^VZ&fn*)lR92^MtM;=7=u>uQ}H~E&xHFBG*^ta}^UGdgOBt+eSQl3B(Ong^~ zN8kT@@bp=9>Ov6ExDFu-M@&cyT@yBtbb&DWsoG2q(I!>hev#rd!K$;HVSkx28vcje zy4x0?bj#^#kPc3H!VB5_CE$>Tvx>PJ-VA!4#CG>fKvE~aTLR$Izx6&I`()z(pQbY% zg^U2alZ|eigAHmeN1_7R$1^r>B zq4;2%Ohq?+--08RLJ8a-T$A!0{92X#a3(0Jxc$qZ;jsv`%eQw|o(SioI@(+5-V5-M zsSd-cb_vdSf@isi`8FNJFd%Tkh8|}Cp0cq~(oz*S#y6Pb;O%U$%4g0iUTK2t9G>A& zW|V=xCzpjBHAaE(+NFDWr`A}Y58pMJAX}-af0XpzA@QGhF%K1dKWPA!21ts*;oA>r z-KZjR5n17F&i`reN~4;*)-|U`k3DTcabPA+EiFT^DU%3<7R3QXw91q~P!LGOfHDdM z(26)QR1{>8q>L$tAp#-D6r3P3gpfpn%twY`M4%*0Aq39;K5W;z_pZBE*S+hWA9wMO z;mbGdZ|`@%@AE#-lUScR`X!bFuh4>HUul|=!8>W!hQn|#np`fYMENZUaxZ;Z09xdP zhukgK{ORZK1o4^H!zNJQb6^SS{^VQQUH_HFmG0HnzBCp0>j60?Jo$F7MqrMyYDsE5 za&`wYKDWu$yg6tHa**gi*4x<^gTU71_<3n=w~WSLXk3*q_u_M$aM-egadrb3`~b+g zMVdp4haq;5;0XeF1s#3cb3Xdx{^YoHA;;-1&ugzR?xBc^iUG)sWpiL;hYCG7A&W!6E-;hB+1ZoE-=|AkjVHa)2(`}OtI&2qQGPi zv>_>6uRalO{%Z8ibgHLgASUdr1pi`AOjqTbnMr??+)~Ui+yrl2I^72b#&+Ew;U>oP z8xY?h2H%zW!bz$^`f&^%Wf;YbJh_zWvYCJ&y5h+5ZL_}}4ySJNm3vo0j#mocs85j1 zK8G_i24}=5Lfu%MnZLmEAi*b+u#`eS-zyP`)U6$@2i_ea^w1w>`N7w`+M?5$`}K6B zw3^3g3-?EqTBM!8rr^jcUWiTlg)W6i2cXc5=$ieJj5}8Dj`*AgU+EW}Pmqy}$vYl= zL0h;(7VQnwO_G`8v?^3$+Z*ve7zg9?d?){TXrgG0pH^UNgm4IUF?_Y#Deg4w!C5__ zu5jPDvr}=m?e_)gu(t1Mt=%t8n97#c8xd%vgQrPT<9EpgA_Cs21=~Q6bcj2r&l4LP z6Me`u*SSDEW_k6_c7NwGOp-Z#Gmp@5UK=0Ry1Sc4 zu+N0ecYvJPnfOZ;#J{r#2pX}XMMtzWL313Z#KuUzkh@}muD{iR|2!32XjYObCN((| zraFHT_Jnrd<*QIxW=jttY>by8;^e0muOPGL?Ia~|lUYIGe$jgsj2|UB45~o+MjXrg zP&?8WDbIWd@1gXbR$|bVx%eGeD$?acx+$VJKO#(C4PZA%Ht9<%^O3Jb+{7slYU?=Y zF+Cc;ugr`d)Au|U7|GAdJVG-EzC^t0M){;r8J=7TL$khvmH3<>pg0w_PW)=H@AO9+ z-nO|eT8s&&8t8gMT6L+TV>4GcQG-S#%e}fBmfxF`vr*_5S!oT(=zlh?K8Tqt7~wN% z%aOg8rDV-B={pLk>d>mCRyT;VL|2{oPO-5LxFL=d&ejx~X*8hjn9i%K0*FQf&HuJ? zGNc&|0Sw;b`(HzBEgtlbdJ;(4#?9pu@S?t-BLH2VjtvRl3rHh8~P4bQ7CNV0&}%e$_XI#wG2CX>oYmTU#t-?L5k?j=*6=* z>u(BDo#;Q^jy6IykU6Cfr&AbM<`Ky)Mt0hCc0j`-xxPOTKK~DNd`S~X_U_fGB#3fu zA}$EvDfInnq!Jx1zLz{Iy}OT@ez3$5Fk>MWW_xNkB)MLCcf>lAB{CmLFycYd>FVrT zSBAEx$mauB!^r$b9A|u9Kh7=Bjl}tGEcmb6o{jw{G|9Cu5|k%cI{x-nyU!B>I;>Zh zuf@4FDVp{FJkCw=ft{mfX%8jpNV-~&KtJplV5Vbn&S*2Oz=$?14`N=GfwbRJi828v z^N+(EvdjVpPXgjTK6T5En%|jcjBr>T@8*}C`jBHj{s@o*Tyux_Kc~MN{uXm1Q3rGK z0a3}KME1t9V4?xP6CC6() zHX2-=kiFaUOdN1`u%*x5RteyWN7B8M)MJtX>F{e0&;y}aILZ-zYSYr?rvhqzVoZgb zLxlR9RL{2evBr57KvXWkh!UY>pgKEclGLViU7eq!#;xd{o|zpQSPf$F2;ur%^R zIg4l3C}sEaDzb2Gp;(#Z@ZFAkHoxU+`CY67`CzxUpXE;E4|N$OvVBu^*0M@#%^2pb zNuXh8D0BA0OF=$SbVC3%lbPc{vVDoXFacU6?QiXm?_BxqW>!^R-Bj&_c=?y>N|@r( z-MOEv08#i+Kx4cTaG9^Z^#ZLp4)C68eEVx8Hl2`Dxt&2cdicn2n5%z-|5j05oZ3ZY*WM zk0c=f-m5MIGti0y+3)mk&G9@nqq#%y7HIBH)q)Tv7UL0sPt>n>v1_JK-N-kgb`|hc ztsomd;Kx%@XD%JRFR^@HGanWG{xn6S>`7AVdptJ?^5FxSUg(uODyW5laL>WQ#pkNb zp9dG4&4gq4f?z=38Yg;Qd3%Enut3F4n}HsPIH+R@8Gx~@S1tnu8`S5(=VEghj> z>d@rTee!O)2fEhyEZy{UuX;~HSP7->z~o^`Nz5x9STAKhXL&mDdAAb?p1Vo7!QoSOYP%7UrtW2Dh1k9mtAd63w-I4`s-#{;i@^ zhQvfP)o2$xtu-pVCv-bCbT_* z+u!MSc-7Ql$e@h;*PJ(nR-y5SxLZdSVpkU=Vv}z7`#>bgQ4G|amV=Jy*hml1tVv{P zD%z-IV(wQ?=7Ya(Ne)GFj(fd- zEnNa`IgE~)1n7O{=u(X?V*0s z8WejQykjURiAjKK*(PaG+0n~=zDFy1mK%Y_qm&%uY?bX^zOg{*bU;F10E1O%0lBlP z-&B811cFurWK?x0M&@9*fV>F^6k8xo$y#Yt2bTbCD>3m>m^;HIvqnS*rhCFK*jW$6 z>bnKd{?YatA~U0b>3~qTO#X{vh5KeZddg>$sItQ075zO&lTZ!A%d96DZt1xz09BAQ zs3BY7P?7$G{7ETDU(g)DIg*jFe^s;-G5zl%8Lv`Xu7?4vBOkaaqLcT%o+2CQb?)82 zB!1ZV2=Yv-56}Z*Sk?hb))&a**s?dMeaYGruYDR<9|te7ISnS-%hafRS@lxD5-YJW zV=7agE$o@e0DT%dS2J@{-mUNTOW0!da{_4pVTF8lnZ0-a?V>n#N%YKsYR*iTi)Z%r z(d$YFzM&-xTv6l!7J9zCpLmW?4)5|$U(RjE4}eAiXt3bvyG(QaO z6bm@_p-&x#Gml)_dYZ1JK`%1s-g_HWW@GU*3sA9uduk9~E63;7ga^huT4+RR@qvf^ z>NDWcS_>=`Z?fWUKR&-FM*u3pG-?b9;>k$f4eB>#1pb zIqCc%Eeyj9=OEc+skMGq!9Aj}aj~059VyI+9AIgmzHQ`eXuQtAPkpyF4%Mvucc@kK z4Iak$c$1uJ0{7ORj{aBN$|pD^`hSO8W&a1TYbCrC^io&z)Ns@ha3|^pk ze@pd>pUgb!b9%1_ru&HF#=aviHwD}ICndOK0>UBlKkl#WY6&ufQ}XR3d3++fx;*X>Dx zQrdd=R{JOq<+u0N%LY@X1i=N^i)?{ zx?Ey|xD5ixAxA&2?F#6=xuFEGT_f`)#-Enl&F2VbHd2$Z>dN=|QZx}0!I zIuKy13}k2Ii7zU1cN`^=d8J<14Sxe!+bE()jMnQJkuEMzM#p!swxPHqAACn8J;8%5 zdfurVulyj5;mb0OBjG8ND4xy5)2));@3=wQ*W5P*PZCFhZPg7&#G!W#H;#l(ax~gz zviZpN&+dn=!e#8Y(lsQf;!8bNUU7xm!8v?yHnp>O`+S#6 zBIudmlK2)C1fU*<0Mf$PT6l7$)@hxejC#>p%DZRpcmaV*!3s$xR#qe9?7d3`Z9l-1 zthVP{*-h{McxSnHNLyip0qm};aJA~_=g8*Sse-Sm8}+O42rlFNQm|-~rYE3-tep7> z^Qakv;)T!gLw6bw(+f=`doZO9fVdEe7i5ce3UPm&>Nq%+55;Bkv8aZ~lMv+e?y&WV za1Ij%z=JiTSB0m&I-Oqq3=bx@_u`l-L9(NdnnB2e;2VhP(u>E3RW@DF=ihPSw*vg7 z=^q8IxO=`OkxeBz<^I1y;#7uD;_ULr|mW918}#oe;57in9y8J z^8w3uB{=fjl7t|d{YunCxa-1pap2?dWSC^7aA9|+SN2xqb79G&hXBoRHDNo#DAQ}9 zel^jH-nH8JLTol3VW#{fI=mwl!oC6p@Es|bY{Qoi-VRV4niog$I@%Tpf_h(W0;M1} zV=h^wYJ~9rcw7~9TraVQR#;shbVc$_fy^&@pA|~-jDCKp@*{!ftjDfD=u`i5ul7H5 zkbh1sxqcL8?M?nkb?N$et&bNxVgBrQC#wHUiTUhAP_J#?&x4rm0{_uBPcVSQJC zW5N1TSYHb3OJRK}fDu^Fkk>Qh^$Zyf1^<^z;pyrSSsUWa@A{%5_JaS1s~X_v{J*d9 ziWGQpa7#r&fnc-d0(R9n=VN@%{D{u&a`?y*`&kG61`7p+quV~dxAoJkkInkLSziom g9LN9Pfnp0o8>?ukIj7W=48`nYwkHmi*_{39U$pkq1poj5 literal 0 HcmV?d00001 diff --git a/docs/images/cmdwinguide2.png b/docs/images/cmdwinguide2.png new file mode 100644 index 0000000000000000000000000000000000000000..113fa209917f2616e23917e3e19d4260082324ba GIT binary patch literal 31287 zcmc$`cTkgC|1ZjRTd<25niPc%(h-r~HVC5h-U$lQq)8`~V8KF-g`%_wNRtxj9V`?D zArv9>C@}76DdJw#_(3GD5{`o7&Tu+;&qMvsG{IK6c%Selbr4n^?`{n`g^Wi(! z?1ETWIE10Ue_c2K=Qj%r;_G!CEz5BD()7_9VXNp1JJHRV%Lg<35QkS!ow}$dc#uu^ z+_7^!Is z{@wrA!*i#e+VH%&hn$Yt4aK!NMQ>#>l;~@%&HgbOw$|AysJ9lirG6NudL$*6k3JTu zRA9B6S@u`d{uRL&U!rJzHz@Ze7^iKuYy`wf7WG>k;|8V3fdaUD}y`sF%*2ylOZqBmr>vsyK55{(XYWFYUsug`t9lf^@ik`_4LMxXP_})sYo*Ri z@p8w;OUI8Nm&dZa)98o}8!fZ*Vvy@i9DFJtGNhr8TqGoUCzi6l%}X75VWRO$!rUrn zUs+55CMj~6-9+tKPULc9lngWvSzdnWI#!W4bh+t36m8t&fHlkTx#iXs!aXjFi_2f2 zH?YW!6o0U?eA>44tF$rl-(1-HwTNFOMXO2=KJE?YjY1yzhIqe{ynl10uO`&}G4xI1JZ zBadP!?(CImmu%SkockLy2S+KpsyB%J|4Pm39XM+cb`Sc*`>q1-J66aq0@G%HnWhK& zkN$!d8OuwrM<O(kl(S@?=j!-4?X_WIV>7q z#+`_sj&W`x7E%;ZEDC=2_nr}#e(kWZlKk6M_f-9?yh?5${s(S%DK;{<$Hc1FPhRWD{uZ((;Ez58Nk0lg#Ex-px8h$q@|!baDulWllE4W{5~ zirzReu#{cGCeS^wsHbwua0$#GdVImA4O+7Qsva`{xX&g3#@KB+RxehC~tt72! z?vi%DwvVAJIBeLmQlu+f9Co*{yIJW%w-P$S)15-UpcbU}75_%>49Dm@@2sX%0~LuO zD9xR4jf!XADGh{Vp+#u&wzTA`>}(K*uV2Vck#5_V4JM}AD0siRt}hCMRuG2WFqMQ3 zpN$Lt`Akp28>cC?H;6ah)im&+k7GJVOy$Z~Gut;a8ykN>cjqu3tF+P?!|>mg!U~ne zn+kQ+#EX4=%S90XSiSzkf0yR3r(N1B-7M)_KOMSIk6f%@J=5FHoNUiVyWZ*7+})0f z5-N^=eL?4LNEf%qPvY^Bm`#~oVLs%>kA+%Hv~TsJS0eY{vX*Ik^p-9hDd$4B(q~kC zD?2&*@@Hn{R~~afkC@9T(y%nFjhc<%N4YXz8;+Z-=Z{z&&d-UajR$wI>Am3#9XsDj ziKZB6ZhkQtdT>(XC2}Rf`RComg(9>uR&zIMIn;X~FHgCSduPsnM}*0U*`-heGb`Fg zF`ln1?WrY_?pFq+T29-KP!gQCU3MNcu8%q>dXK`eo!&dpoBMd6>v)|R>S<+f+Zi?R zV`S@aMMnQ2p{Ma$6G(bkjN&0{`b?xhzsy{bCe!Og@y>et4o-O>exVx8^uc)zeBs7UHbZsXb!-OJPaV-9tvHsUmM1u0yh5f&8yB;pjV|<(Eco#I`fsS6KPUj?)OpZOWAg>LZV9U=F^o~q_EVbnX zvyf2FU+yJuAbFw=l99oi!$i}8F|_YA2D2KB{WKF2I9X9 zc5H<^)$mAsxVqoX!ME0GC(*PE5wAaNev{|s^%jj80hg(ATAenDG=pT2gM&LyLiDlmgI~-3rXQ>hE970G#j+cFj)roUdka2&GLX-Av2)AQm+dcO)iu%c zMm3isyH#hNr5n6FGclQ%rXhRKmX}a$d)y5#csVYhE>BxcJ2OG1O-U1v^koE1x;Aty z3bBgopBkPC9mmp0we=Ps-<-avdw}`n0$Odgk$lm=1)TNn#0MKyHAx2dM7K%`VMt>% zH})y{oo`k5I~=k`lK_=xkL(a@xb)=NMWu^!Dc+j)_PRDj=k0GA>4n3He&Y8_;j}c-TKqb9U@D(V&(%PP;`ML{&M6%py*@IYl2xIt=S zQmkBJW`|Z!+B}K;{h;>aJ0%XbV@5i$Rsm%${6EZmnjI4AH>PNn$)i$4F1^>I*8F-2 zMd419w~}wptC3c?EAi*0RTMPH1LFI>^~++4ZKh5Vko@$z20Cjw^o-|4c%*b#VN%6i zs-263Xt@!vNhs%@5{GkQQ1o?gP)t{ey~D03^)%};+rhFDgWz1wrUS;=p)&}Q8Y)dY zTR+UApt%V?Atk%zn`&0)TsLk|6B{r6Ro@mi{Ui0ATN(3MHoiJ)cc>HY5Jl6`NqFNq za>k+t>G@dOHyh2EQ*3Xvv!`#=3e-E}`od8+2gzBxtLg1NX=7u-kF3x4pnu=~GTi!5I2%f=po~rByK-xwX(pG`FJGUc zpK~Q~BN3cpxZJX!dCFngGA zOZ*D6rfCnP&*M`L+AxZQhT4sG5w|9SMlu#orGAYh*V>#YP>DeZpxW2V{pC^S{0U+Q ztrOPStaS~txOV4%m16o~BMBbb- z1Mxb!)Vu?Bn|_17u1k7fh5p^1#xtjD?Oz`6(cGnK7VV(~0H8Ko^!|mBwgF=ChF97L z_uBScjeR|+E+nTHn{pxRjyBaZIG|N$vv?uroyK%HAxXJ-kAHE!$^H9;(v57k66*@b zS4I7%9%?5v*50iVRFNsj_0pmYc`@Ht@XVQ<L4g1S)>ZHf2dH}?O{2U>E%Q6;zOs!!e8l^t$ za55?~qkW;UFC!&wT2@A?)eA}WbjpmGCtmhXPqFR@O~+i57*=Uc$wB@qSh3Gg?;otV_~FcFZpd#EF;DC4$0N%M(7u6@P2MjSGxerZ-|OG$ z-1?`%<;wa0Fsi(Da{~7db3?OSl`zkp;#{k-P@=IA>|JZ&>MQ61Sy;XrE;5U@dLO41 zcF%2>A-+x9Vn10bL(rMS!6&zNkD#y^J`h`Q{S~L2AEvzVbLnv=kSL%(3f2~<9o1Dx zMGMP~iVCPvF8Dg$m)f2Rf4S~cy+=0znH?GU>k#k7DM^%VW1w3OAWwr1`bOXCBtnfR zWn!*SMGMgWtAv_cqqB2tEQDIdax*INFC_~p$A*ho=kOm7)eb>ta&HqWUx|vK$qcJg z{diyfS-LDNXXNNbThQ+TuQvT3LZ9n>M_x@W3-FIowSBJ@deddF^k1(eyXr2r?cI)# zW5hulgLG+M{=ZB!8}zVi-}j*R*hU$;EA{~bFd4kHP*enw;yxacMOOia zZG~tv*rBc#N>nrml527BJ_!ZKVLP}>GcjCSaoGbJLzYDoEQgJmEF*{BQiMnuQYK}+ zXk$!M=7{sBNlVq({@x!M-WAtLIgx%~<&m8QV-^gY_0ye^2za4pfb=I;J!C%c z<0kSQV1#=b5k_J%A#fW2V^T==R&M`{FUDpRCVgJuTGxgQ z7C>>oz6&t!0CghkD}tie&KRexBvLr(#fq&9MvFc&$Sl(xBe{&YtjEUeo0F_yeBSdA z`~ueZ%C!DMxqq~G^<@okp{~^_Lw?QVQOQA6ag9{2mF1M~sZ(0khLuxBmN}hgC{6#Ufa%>_C1rs2+{&By1ab%4Z@CxGF%(f_e|0>61g6rwY1YGJJk&Zf7r|r-GAbp0sE|H@1wx+RPc(EI0 zN{{q-19WiYPLJeu#efzPv{>(c;0e0}?Iwx_V!OW(f)y>RJ!+`eZdd$$Wv7#s=U%GC z%)Rm$0u(+C<*|KRtq|U=ATI10um67iN2(3{3)Q>?01iL(l@4~qOwwxA%_r6;0+K&^ z(qqlV_}yqb3<|dQY}G4kjY&GKdAUgfU9_S^OtA=bLq6dU9y}skxRH2@{-Ah6Af;pq zUNa=7Ir@aaMpC<67R zo`A!UNKsvLwVl)|z+5KXO7_@}mh8T$O{;1R{f^vT=?-HyD-BYissH{)61Sr+(bRIR zCgvGm>Nhhl2l3>t)2Ypa>ZaSb5o%8V3_1ljS|gQ_gd|1lAju0=0%l*7IEZea*qlNh z4&E@%fjQi{@}xZgELn%G?}s#BN;iDJzfHIc?y)&mZSa7TLpw!6V|Npani3*VmM;KW zz0J&9Y}?4{|E{Q^xG#;>a$+)}B-*jb3C+x*BiEYIOn$8Ab*mlgt7Gep*l537k(G}2 zBwbP1G)rj4JOaAc8}GVCW`E^A=I^0$c?dS)<9c$?yW1oLpM?iNegKP1COOPTnJuFmh6u%`L~VI##qg2(&0L#^OnqoA20xPx_Mai>!N&TPie9wb4(Xb#htZ(i)@f)J=oUd)M~Mv!x_nI2U)W z7WdM!;4JQv|01cy)BYk zH_)*9hBEF*%~gV_#ici$95b)>nCx|#D8CY|iVc(OZi43pR#DdpCBJh%Zzfzahg)bg zNBim9`C%5-t}@fAO9B_m>ys^6!p@T3s<&Cy>#xGQ<=TSk7jvu24A&wkq;Q&p#wVQ~ z12Z_zq%lXF95n4aRTUcMQ&3v}<>fE(!$JGu)Mc~g1$y-0s+f*M9$c$WM`tr)a&jgu zUFdGfh%I9ryCOM#E_qbECH7W!F77pUue`Asn<>*Z?+-Po2@-Z zW)?@2y?XUn$BYEaVY9=q)ZrCwvfsiiwO@&lSSz03s;nXNF?DZ@q;nRn8+l6VZ-4RNu0fcV|}nnWUYnwa|SP9<>dHb_RoUSZgF zDU*w`jB1Ajs~y5_5gDPS|MHW=yTX8)mZ0~s6)qCkYO=nP<%w9hJQ%2+3ikGDcP}Gl z6ve#FB=)%QfFxnUsLRsdUs9NBVf4Az<<=Qaw}vdz{6U2_o7haYcU@<+d}7H27={U0 zR#tC#Y{cNl;;S#FvGDF{8_^MKd#l>xTWZjf89)adusJVYl%ID&yhx7$3wm;|SLm+z zaCi)v52iDH@D3_Ky2nH30InI&TyEj*shh1mpA!QX3))$LVBUc#%1_lsRH*0Z25VW0 zm*g!rjTuK-FLX)gBveYPFf(JQ{;M7ji+v<0-X;Z$Z|maxD8Lx`d{h6G%ehU#v`K8| z8O%w|twGf2M7m(|^~h)v^?~WW(qhl#ATHPw@{K~z$12RUbisXbqA!TyT}tAemEHW4 zlI0w^9{V}ZcNuRE10v&iHLt8AG%`t@eM?Nn?O0l%W1e|ykW)#N%whtvcid6}-_F+q z6aFgh6j58-{md)9Pbr2?yCZD(h34jq?I_t-i>-LVxc}x7eaGDJjiX6z{~gi$HJBLY zB0?O-ARIo~<^8r^F{1%)FfaQ|I!G_lx%uoEv^s-LH)~%g=6)B~(H*c&4Pnzyxi{b%v9n3a z^oU5%FaDHqZ(YcABVThXzxJRD>V}B;9oO47cT#<8yQ5S9N24wpC=Knv!VVvHfooS4 z^CkyKx~Q($RXU2N=U2V09?@&AQl}NPVAMlG6BJ&NjVx<4JShfjq}gE^Go9$Bfln56pWd#O#5~qe{nl6mP=3gew=B))!+&B-C3C(mp2bBmae3{ z0s@_a=JGenrbPE^-t=NiR0x}St;4g})rmZGpaS27Q@!q(xz07)`*}mto^0Ks$yQHJ zi6=*I8VBt3G+fT^uEsB_uSKdc#Ly2KW-gdl6xn+y1%ETslQ;1C8F_LD%;d}DbN^`f zt?-be$pdsLe}qAsqK+xIMHV#>n@E{x>zc@u?6j}cx{#74JE(G@DLdgvedqy%BGX4kytEhD{cR^T zOtK!GAO_c**6)2XA1EchU+8CI{Fl0Zzig33+N8gK+UUGI?Rp6d>SFGGK3_<#t*)s< z_8P>V%#C)Oec4edHto3nYxylSXtPRb(Y`j@X#sJ0RrS@XU&2}!oe=!k)TeLDozf=D z&oyyl*ZB)q!;Rt;ZR}Ru1mFp!0N)%si*j~PI3n=idg*#jh+au@)HDp&S~?jxaZUMd`9V7OC;NFIsWvt^z-)%!=nvX z6u(#XN_*$nF&`xRZK?n7(JKy5j?Z{Gs`syXlhIM&D}+^lLx*}N!Y3vpe>~*OD3G6E z4A?dDO&`(~4&U!PNOrVr&`q~8Gvk2GPTQLrx<{V9-|yFyCs^flo(o@6-HZX-SRUh-R5{(gK3ZtF4s4OKD&S7b};Xz)63e?V^$zw&aP;qtY}c!jRGFX!T@k`LR2 zPU$DlavS8Wp=I|v4uF-yQ65pDDJajI+}+ZJtc`g`v5>}xu%Zae8q)r3iR}T0Y%IKb zrRsgsew|6RSut2DzL=n2IrLnpi4uQg1p@Z!-2*R6CUOldB_9DEm}q(A>d}@L{u+0_Gk_2;ePCrSEa?|=oZM!Eb9Jh(jJD{M}`Yuj;FHcqJ|U$W~Nd`ZpR zlEV61+hv?3FZLC(wZ7fCzT(6r0j9qF`%|C!Zec{EZ&6mDz6xWhx|=WU3_HTP{zk>{ zEr+r+Mj$zY?9oojwFuU;ZMw|dp|_(+ot9a9AgRmR=ng37Zr`c%(w@;aU3%fBHHWrj zdSt3TN!3pcNv?CiJk8F}EYFsyD_~#O<4~cBeh;jhIufi;7MNeW|8li8U$y2m$MGf? zgrL5n%iyJA2TotW1)zocC8u3Ux|v+(AWbl{?jhASm&J2vxpJ3g8KsY5hN{HxlRlkL zm6Xvt5LDkoq{+r}oEaW*n%Ppxk$0plS}>4&KU|7dvkCG6QF`q6bPV%f0cgYOEYtG) zc%x7)i&sP#wm zIt+o*s#;ZkXKhfAM4GJy55@#e|7KxAzC(2Mb!YGdVhPsj@rp8vEbl-E@tGH!oJz>bNTae|i>;Hblf> zkCRtzQdZAGhNIfapt-Ny<5;eDni`rk#r{5Eh%GqI^lTWA>Fbd@F8Cf~S8Ywy=4zCB zD&chb(OGKV>Ge$fwmZ^k&_wxcY@ib=lpMx>&&2UTwFkDpTSSA9th#(naVFfA8ZYk> z6E^Oa?r5Cn!;kp+4AIDRBB*wSOlgpqa7r$E4=2>O#3FmvZ>6}}7mndX(*t%05n_v~ zDBq~`vGj1?n)?&M!$v{B&pK75vM5!o_frNqNI#<~k&Xw!_) zw>S#B=CLQZZVx@g&dJ>$ns4wMN%+s0xIh|kJf&m+qoCKtWwj$|)p!DTPwm-m8T+5Q z2Bl-jCphN1^KQr%WLgPuzED0ny%s40sZ(QP$3YO~MuQ#P!19`Ifw|>Bx}7%^&Dda4 zHZD=|T#}kPZnnXnuj>a?=9#l;*sl@3LEFh= zgCX{bMT4UhT0E_ij~p2i-_w3c`kJB*9O2gV{r=GmJ*Kxndhu8!B@&;RF4Oq)d2JgN z;(*Uqu83H`duS6xj3`mj@J(W8TblFFur~iwL}B}*DHMka^Z;39u|CVldK@!Y!SvG? z4w|$j2A3_iQW;4hhF2%yn%zN{h(T3Ew>)B#GeKE8cd}A_cblrG-C*oGjn!r_31a>h zwXJbkbmZ<%NDjVodHDRY3E5hkt*m3rC!ZS|?R7cd$%3Gs^M_eu=w0ec6}@oc8#Hym zpq&oVTR^&Wl6N}5VK#UM=4RITZPR;>^-A78QSr2c=fx}X@+8Gu@`lQukh_}vQlriO z;$)m+42fw7(Nt;e4lf6=w1elHUMFCeLk$T5^^{9?WWN+BS>WzfyTHGu(PL|=R)^J+ z?6%b_==}uhaf}%}9t3IH?CghqZ*FX2V`e1F6<$HxZdS-L#rDVT#+iI!-TEqJ(cu8K zqQwZbK7>tAv`yk=(g+M)7PV1&^HNpss&ZV3jlpnT$;^!9uMl)Hh#}mIsekuRjyK*_ zJF2~*Q2$hWThF*oGRczSQFG>~nTE?*Grw7`E_II@@>(Q6gsHf)a-=HmCRun1pGxh? zCNy*qGCp3q%aetednH6r;#g6#_tU*m)Cozc?>DS)vqy@rSTA{~t=0$No%W z{`6MbghY1m&~>lJe4*DMC_nu7NwudMD{&^5vBv!%^z(9Nqf4>SBL^X}w`D>OF<>}h znI3z3E(k-3oNjZSIg&;J;ky>m#>DTPLHP)?>#t$5xV4(Rb zdcR6k$~nXrJYY{ezpqcOUr7ig=$L&x^XSF8nCaz_A6Y^D-0R&3nQfSZi_I+^C*?oN z;~Zb~tJ9}ij#-p2{aZer)KtSl=P&%!(0oLV`c+O({4zg~0wIG~EPDQm0FSLFY_@t< zj!-Rh>L?^_Rea;EDSjOn|M3ze8TQGEwG#L!wu_D7WKT$4A-M*DUH^|>YQF^|F@yv* zKdZo|0HHL30YUGE-m5428==Z^-B2+`=4>_k;X=L$rzfV6fS#IXXJ874hX2OxM2UuY z(+m6F+?n*PCz_r|2JGyqkq^$GxzT**t$iePdNbFZ%r^c{8sgB9xX!;kum!eToo9Nd zb#9!oXbFo>@P#D3#(m9lwh7(c0x?l4loo2Njm3>B(sW339iX&LF;aq}$syB@Aa5mv z17Q>Rco`p%k4m-3L^pBD1Ly+ZX(UNBY`s6E@su=Z4bcf5Y5Feq7@m|r7b=kgO^=#gp z%OrKPm0ewYfBJ2z^?k#nFF9d2^27;^jqhqGf?3aM^UQjM8YLK#KOECfYHZx74)uW^ zZ*6*dNz+MaF2CPWaK8hap3`-+Z2+-3oPk8?V28q$?JZ53+d$rZ8mMqQo5|F-Q4+*QgBE zsgwuMBePzL;4UbpV z?7!(KaY)_P@09wlHWpGYo5v^zH_9P2odrT9;ZkeD1hUL;Ffwin?A?RHqGD*{Cs}XhEWh%JHJo*eje9_c}Ndk>^e;d)$zXT`4_C* z{@@QN;Xydl>Cx370q{$xpHwx-YpEHV)fC4`pLT7o)Yuo7*HWLkp}S)%0w8p~RkBu8 z7lckOi5S)JK$}^hjic|NuVt(>xHigXpmo*bk&%8{0}{95Mol1#j~^#oScTRNe!(e~ ztg_zRdg{Z?&96#3tsiq~i(Rg2q+60il_#UtAkh<ETh% ziuJ9AWWwf{yP`!Sn(cIVh)qXjG|*Lt!D4;kJlRzLLs84X}z$Q`D9W!X4071<}WB>p>e?i4nzuX6)YX{Iaae(HS<%_HzKLOKb=I` z!4C!qEYUSI%|JoU#jSJF<3-V}I~B*aD7F~#I)ho!FdM)9;K|@lwEP4<2Z=JMU)`j~ z?9vgc#K=UeF6fbr7Rfp|`htWaVy8y}^K&y?SNA7KQe;VJPo(OaT@QldBb8NMlk0ep zGfXE@NmwjZD?$HF@tOF53VodIV*Y7)Lt29l(ZRB-(<4Q{=oC5(ic`gx38oRKd4g}5 z6Jyq838V>(OrG}T9M#z;LVy^B)H)bbPjnd#+o;6wMJs*X6GdgoA zU?GIx#mUkK_x)X=yticoXF(aTMrIHi>}x@MM&BSk6I1C&QmvCqYrq-mBH|)%r%cDq zkPh86jp=s56X0ydzPwSeHd?15S3{tLdT3UP{y z)9%=8ReE(_pbeA}nuu5|AD#}wXLs}Qpf=V6EVE)a*8R8dZ#&?(talP&64r0BLnp+_ zC;T$hBWVp9R7lWDZ8sa_OO<_a2Q02RER>%O3XAoRVN6mnY4u|+32Q(m{24-Q);q8a zGQU$Tazy&}&kLH@6{mwOa^}9ideLsd<-5D3EbZoCqP}hkC8Dn8pw^*m%hpHEwx{lW z8L1NWvyH4=V0Y}_o`LLcEMBZbrnMbdW^WcNnx$j9f%UH;fW>c>FaJ=oifO0*v{F`1Zv=Tdbo54 zh6K#Up<0?;A@XD4p5mX=UFnE@;96ftMU1a6f9 z2Q?syau^gBr!7!IUZoce3+((5n4_?z5(=WaHM*3OD2Po_sS3d*8B*S40Hpv=H|n_6 zuu)%cMuEiE}Z9+<3 z@P`AOKRFB`JMn~g-X-ZmZ1i%_W{A9KYJ}Oi+~|h&V5)Nz`Vs_E`{Y{JBOQC{CR{c6 zKyGbwy};l@XuW?yp7h+{eF+_jcvkqH-p333eO|myB_`Dg8ON7uS1Ch`CX0>M8o5WZ z!=?pl=><=y191H2cJMsCVJ&iIQjpiTU1P2&JJjCKiEF}1%cvU}n$z9DKO1fKjAzzf zQp^A467+BiSK#$8q;QZNxU5jtBGbf|6u&m$w|>!SRyB<&iodY^`?2O%YVknMlDw)D z*wz?gG881eIkO;TXHPCPXxJzlbKehhjl*?#8z}l$k}u8KHn$kkBIZdNcnlJIC8fEc z?jxw-ubiD}QWg0P9ML6Mnl0;JJKNqPQy8RqrDngVlXjiMqouk@zrLY0u8x3(Q2s8)mAfUUqzta?&menC zir4nGes`io*yLdMGgGiD@zS%}v01|JJkOde7HHMn;XxsnsShsaP)&QBQu=wi9+= z=9P`O6s9kl+WYBvC!FR_D@l~G?b^vad@zJBNu=p@sgovsQ;P?S81t#_TUDdUF0)S; z!nZb&FUH|TD{0lG_D-9%f6ty4eLR1u*0+k$cs|7hx+B6KDsp^yn%}77^}#La_S4d- z#b=u)4*iQdMR_2wePg-qVw0Wty_@^_%>LR)#Y73CaJ8~x)3LgCQ>K5%XXtoBVc)V5 zn03v*Cnd45hDn~!PS0*h|G4=|zgYgoeF^K#1^VW3B12bVY^;4?S^C}7+57|H^`mCc zWRe?y`N67wlsn&RwTjDiuE$DU$_ z;7g6!Q_K$BI1HPi=FrR56V|nSFzyA6&l?XJ-5RvY7Bzl({`AvXb${oT%wU1YDJ#%B z_Sgiu`l2zhQ^`~ovc0|F@=W)L#$*=R{!g~E@`L*lR>Wee751|?Vohpk@-T+Ay>3`$ zL~TmWXZqO=+ExIlNk0+WsuHvdNZ!E{6)Hxdnu>2$4};tA$pQ@4Z7bwpMqRl)Pq>sOz?|3XGuPMS3$d)O=>nP|$SVc|f%CFKtFEq{ zB}-lNx!b60*?IE1Yu@yRkxnqlvftSbmR=7sDYx(=PxS)GNIHnKOb!Rhv*|cY* zPXaSvD-FAjaE1W&OZBkjDXc=TlRDUi7sgyseXim@0QYz&br19c6(Xzqk=^=uqd|`C z42UkQZp{b&g6xEyubKXBjR-w|h#NyCKIlMy%no+9(M}Zs^>55zxNrryu=t+*G1`@r z>X)l9X5;Lstt;w1XQYZlL7snm8??_fjs~sFgw=FMo8URG$-S%D|;#vsBi7W-gH!~)=D(Q zLmU_E`gKzh*o~FWKjwD3$OPc9our-x6=)3*baL3=DbI`7q!EB8z*F*WyGyZ6_7c}F zVE9?-WBn}%YT!9O1}6h1Rhf5SR0yR8wB*I=rI;c}9l=b3gNc%IqjyDnm=_?HhL|yO zOaPJ%W3_VHE#2vA&&ccT<`_CY&70krh59OaM%eOZz5qrwG@3JFZhC8s+d4j>ShNm)V0 z6l-a_Ck|br_c2p^X=eAl^a2P-I+RZ4UK~~Uw2pH|YtS39@+fO?p}LH*WLm3A z>dNzo5QM_aB~^Yik^I@9n&pu^bJ?Z>aex6|C{u{7vVQtC6~F306Nra$P7gCNEd>Ht zR8QZ^Y}RkHTaryqyX?x87ma=wBKbll>4Ce4^QRAiMuhF!kCkxxTVw})3nbNY_QbUc zDOGKTqi*q-Z%a1o%52lTdrf3mJLN0}*-N_BV-V$ziHvd#BR2L^HO5yj4Klvlc8dfz zW9j*Ls%c`V;gx!3)>nGwJWYhb)Xr+J#%eSpY9_Xnr1M)ZEdNc!I}V5JElpO}P#9O9 zww(9{ZOcnJKoe>l3c75zzzO?@tTmY6sSZQqN)6s^EEN|^z(mbt)y9u}wKtq=FtoIM zqxUevGPX-r(xn-M7ThAYS5;`a!3j7HG#i7DfiJJZpvlLzk9`zCPm^DE5&ZB4&H+*> z6x)h8!8#b>nInjC_hpO}E;i`c+%+?so^hA#R%o{BF(D$a;%v#4?%F;V`fvJps1^Qd zF~Myf1-&kIJN&Ziw@bz_p6hmrqkT6mk(`4)?=nR_*b-~7SC)btg{Hga#Xu0JZ+0S{ zqs+DRtI}LxQBx! z7pZMfxa|~(q=*N5hn#|40j)F}@5So{PbFx5%1^amgNZLzyKuQ@4BGp#3}4WG~d#hm=?TV*h|L zKZFxl-gPxNIEKVmguA@nrA^?Q!3PLf9>+tN6LX$+)NF9i}6_(dc zh_{k`{m*j8h}*-HMvn7B$M7lJI#F>~<#5G~t&~Mf=Dgs=uC@5eRp?iDm%FB|&aqr< zVlA3*$?D=dd1+rM7skwUFWs0Ajt#vDNOhh8d$0Vz(n$G#-GTZ4=La8gNZNu}>!-x3 zFTb}hhmBm8*i}?Dx$@}>VrP4)$XcqXCd$)}dV6oUZZv@y?>XJ=n(>~8Ue!OWhI^!j zR&xuynqkcq5iRF@n{G4bK4Gp0JyP_7PfxN3@f(`-AultdUZ`fu?;YTMFq@-Ux$>u= zVfRlCKkwWgPIY+G_n5QbfQ0jlI@?Ao`Dm*VwO*|&Qs?l&|1A;kNlTln7tyT>WdaZ{3gZcD8c=Pklnt2Y2@~(28 z9{vbd7UetPI=-{;IX$L*(bha@NW|+$kM9soV&-Y61Fg_%80p0zHj{Auu>;~hwW}ds z_<}>ANfY{Wx8x!a40H8@RXNL5RU9Nc2msV+0FN5+;sge2Aq|EUSfXpPvIus;xxHKN zesO+U)IZG8Qi{*0PYcbKmZml{+9k4Y;iU*q_~;U3&6StBG_CeXWY+GT;hX!n@8b4y z5E%X9D*TXDyA8<8#2&nXbmKqjAY_7IzD}{W7}OW7>-%ZA7T&f#g1>&KEW?(NWPqQL z^i>mln(TE-O3XU|$ewf3f4T03>i+kke-Q+B!*kj}5>>fu>#K*x3+eXlRmV-n2nH!1 zJ%Oc>4rfNB9W&h=xm6E~(#KZ^eTx4`G1EyZVq#=iLMp^Dy_Z)$nrYd6j{y= z=;B6f0`S!16q+P_{~l{!p7%#jqI`zuVGDQ=G@B4bLvHYz6A7=&r9M7}U>F&+9U#P~ z1vy%2=bOwD?)U@m-w1Lbs7;XD0QLDcs&@8Yl)0bGb)oD@n(3g6l>KjB;C>3B13*l% z0CX|4BqqlghYxAa96!Kr5zjk zkzLfmeYKe-Z4jjcm191lu3-W+xlq-_M=lUL*iF8suE|EP=@JVsTOZ=ZT?S4PU z=|J*m>x@ozV2>CA2?=nU;VIJ9d6SjJO3NebxLZv}Bp36|5iL#yx{HthMD>Ag?nqLt zrC+co1&8jAA~m!Vp>{k(<9r>4x#Uq)nM{Hk0Qo&=!Cw*O$@nt0D>JQ0-v!Mruw0km zL!909qHeM|2{**F<5^#W#6?X=amTgBjvo12qPqQM`Y6KMv;~igDkyY z=;`g4cGEicZee?=+S=x?-ZAZ8;4!((jJROf7&*chji;?E^Zj?~z4oxV_ux!w9sA*O zZEiUc@mLhd=(nhWybEvMy8iwHZ0Azaj9Ob3ohTraeYYvPC{%c3Ph$$fm9N`b4t0O4 zNL=>NR80y|OF!N^Avx$}Y(HI9VsW?(vI;RUd);wS=xYE9x`Z*f4# zN(}fW6}2$ZeN~}s*4dzupm9m>XsM^z84F&t*4dxyilQcJD>^y#-LEr}8GBy} z^4@Sjt^rD5Qq}B{hBYDB*C~~eE{5o#?1^*JKqqKCS~1@xshvGkB_{q_=v;h7TV8L~ zfVV zz27_*KsMOfI|L7NNa+ajg4C8q%HMhB3;a&+Yc=zyM;uz}g2zXEdAygh;xaxXL**t` zqQIi=JDsg?Jt!zWhVAs#dCrOQQiz0xko#q79D4tR!!}Z-|Mm`O#cZ6jjPO&RLm~3Zdu!_bqu1a%N33j;5=Yo`Ki~RTYGJG_Y{CR4dfPM7 zAfH2G=J3KZJ$|n=bCo@xQGRB3hYmU{pail{T13JT66=!*Cq!-cYtW$QkWrB0kYQ-! zT~kS`P6ui6t_J&OX<${Ig|9omytepOP&+P=j}J7L5Pprys?n!{5d5SP2kuD_Ld+~! z_fVUTO&bvDD*1Jc(sba<3;8FD6p&0a11|3*euw7n<#UKX{02x^`Dk|K94$z_T};&2 z0}t($0rt4C*#rkosky-*vNR{_3K=+%{4w`xB+t8Q3i zy2IR|>>?v@%`>UaoKm;iwuv$%q9BbtaOI>C_?i}7Wb`Y+8&BT(jZ}WYG=n`}uZfg^ z@Nor=69!;!i-x{WgBr+?n{5q9bipUE#?3a4bt`fFC@IR}QBF(XlZt5;4Jf-LDnCig-nVl#bka8+*Nuqk zb(ndM{jz6E2@!+XNoqRvvC#G#0p+oNuP>OysI<2y=36%1M^05IP|!3PQk8BvBxu zVhAA=A+%8M`wzNj?}s~c?#wxN=FY$uKEQ4}H)!AG~v#Mq0cyF(o=R z1@7~B7RK)HxQGc)_F4){0sC|jGapWh+_7_K5%9zL0(h)em4&G|qw{pjA5u;HkRWH0 zJL&Q$y@1*_1YDYV064y#eNcQ9L-U?9qL*oqeMo9}NH0VPW^qIYzzC;+)RATrq*rnq zxx5F4%)g=566fJrjTk#@^Ip&L>ch97^S|qtRL4XQSq;RIS$)p$ugq6uf%R;qhZhDn zlo$T7uS8RY;mWMySSlwkDIr3)c6-|mxJ||SY$K_Sqlc~}25Q;^1rPHE|M52@MTAWP zr_UJmQ1rA3@5$GHYCP=P1Hs=B1JxM6D<qbyl*t!stDHn7QmwML6rpfTk^WI}Ip)XH!JHiojhd%JBz zBi>3T|D~o)vL1gSl)B)5NHsHNWAB)cgABYplyZa*RB%j|-4LCp<_FYWP{ z!P{ES^?rGlJ~~HbLIiH4FTO@*3dT6_^05yL3#>>vv%s?^O8`bX2Nqhd`Wiu}{At}r zQ`#ZqR8{j#-~GBk3dyWi%t@o0h-_syS$@19WZk&dYTAEC12U=dv2i{UWo3Iyo%cX( z9?wnXk_^i!NG7twI{%Lg3AxQ*XVr5SItiuL`M}C5$^E70Yl$B$F2V9om4gdfb(Kqv zMb?R5Nd#Mm*(K|~EL>k;99{h;IaU!XahBYH_^5(-9Ow=i?tm@JTLFfB32ur^t`kx1 zK9v>HsKCl_iT(C2`-hG8Qbhlw8?uEhJ+mGaufABD7BO5k`!u*_Yry#D{md`2rzyH} zymEGe2~S%KV!I8`bsY(QQa?hwbGx_QW&6h4)Y^)*YTZFvILk+z!DSf)+GZf0r0B{9 z)CjGY=HRR>%BdQ0>tsXS=8_!i%v9Wx@9VB-?tN%yCCSi+vGsN5dEAVvwwkTzb?(b4 zr0`mz0%z|f7XgH!S7U4_BEZ*>+!?9i-RMuk%MmhDcf#zIVWgkBF(*%L-%f64FZ#|6 z=UJ?4yMC<|blRN_$Nrl9l87{kd-KSpB#>Qk@X=Bf zT$>oW5#6Pr{z6!DqS0#|zYYdn3F8i@0Ex4~J#kNZ7dvwE^pB~q*G z%K~=fsfc|%h)c$<<<~b_MkA5Rur_uTN{mj*b5bc|*44aLYqbgoD@3G z1BsG!&A}`s4frahM~XXqW6m+#J`m4p=PX3^;9OS?LF!aMGy|8ZV$4PuJ8SudRA_Wc ze$)Wi)V}i-Jy&gN$B3UbOm#g|E!Wq_H~|&8Z>FqI%<6=NQVf~&JW)#+F+FuVp~q`u zKc=7KwfuUO`Ot7}zqd-mbL)z#G#40fUc_8-59|_B>}@}Js`Fe{sa-mQH6W`iUjXV@ zwFhzSFySO#74}QBF8{=eyocWx|jQO(rs?Y_8ccIoa1Zs zHv$JjB=7xBMig9AZTa)}^Pphiq8y;&h_h`psL(?hhm4Y1i{Qt@J-^%1(`77pExGDG z5YTns2gDyhmSealld6}@pvWSra%SWBmBh|_Tn-K}(*<###-J1+;J?^8GXt#4>5N(5 z{MLZ8&Gms^m5$MPPCFIE5&`pTlZwTG0Z=ei%L(%+Fq6Y^k6=1oP$LyF?j-3+QP`X0 zy53$nre!8chvI4>?tps<5;RM;`HuTiP<5q}L= z+){EN!RNIP5ZKcN`=J>G1w>0l$>^_AoR4i^RdYJ@+9A~Nd6}3}P2BkuWgnum=h;lW}I zgdawV3oke<^`!aJp$wIK5v!#ltXB1{%aV&td^6c= ziHwk{n|mp9nZiI-@PM3X#`^%uwp#*s{vakJyCw=6V~r(OKJf)OYuz6XIU#tA3jShK z3)U5=|Ah2O_jU=-D+UIDVzuKCUgk?$3y@GYQjy_w=Os908tp&d+_{@3XIC3ofzO<& zoepJZ4P~2XalWD;pQqnUb})D~o@;ZiZZB^9+}t^1lb>?h{QVivl0~{N@#Az-@DoUH zDxVuju^wKUyK276z)i$n@Qf_3TQ5FlCX*{HJ(Y6&V}76&ueZ0^)`*u|rN8X(&%F*=-h+W^rPT{Fsk>&lo;$}_#ZU=59E*uU|*qv?^-rNK}r@>2fN^?dDkeF z8MFWn5@?1?wC1B*ed=h*I@%1vgEm#4Zh|MAFv$eQRHlMOYe4w|EB0#c`)^Z%_mu@n z(C%-#GVA4638s({4!~p{Fjm!p03zVc?q0~<;xaLc1p$W|+F+8Sc(QI6{{uig>>dFF z@w>KNsN1LWG|z?!q+FhEEas6B);u7SG+Y6B5)>Csy(|hb#(#B-I%6(p&?P!>6fBJ+ zepu~fnD1RNg0+1T**t};A5WQVQG6Soy$+$eX=TMV;>LE(59zY0PWI;JLHqP-C%?l^ zQrBYJ$4oAUu0kT>P;D&`J66cT5w$GCqUSzrE6HU814T6>6rJX?yn9G`UJYzL?Kf=4 zaylmH=3=B^t%IrZLM)SLY80J;#Dd}HTH?TXZ2%*(${I-mvqL5W%7*i??!p!G#BM9P z3OM;9Xx5QW9sxp266|k?30p|tRy;5So_P;I6hYQed12Ol6ZKUi?MVsN zruTQo{|>u){2Td0b44$bw8KNf+pa2vwt}Cfl0dkLcbPwHwzt-EeGJ_|4*-56&O13OLqv-!%k z{f)LY-(K^;5&bM3t>lMHxSl3tBzNA|KF(Z#VAN=!*l0H{_~y}%g7xKl6tzX4m` z`O8_wHDi5q7wQM{VuOUOC;t;ky0)X`Sq{MNXh;fm(CcN!;k9 zqzZ9AOf0MtFu)-s*MUdar^R>V?Dh2Z+4SFNp(zt6mI{_;VZI!e;Z?h1f@<`H|G5wK zG;gJVp25#v^@FCZb5z4|CzLKC$#pbvrw6NAJOQ`@fCFUEBYz-Np2i!r{FabVNr=>Q z6S@2%#F#Pt>rFZNVdY{nDz|u8s~Zd@q8~h6(*-0Fjh?QK^Y9f&~3UTca$ zG)Fkfbk6!iZITxnKxfmkEZ+p7K0~Cr7JSjd-|QPz$Ml+~RzR8-$>wR3n+nBXuAMnyF(^G&XKIx4_stB)ph5G|W(C2;6yPuH#H0)-33&qM-uWwD{;IBAHJVrsmjC zJL)nn2uk@`{)V>9j!@s|rw|yF6Fp-M0CuXneZFy^T70-QK4|aMNo%E5b^qM=s%leE zSumn1RmPluyNhU*<8t90aY#t|8 z<`Pg6rZDW8g)bOJX2E2OOfD^;l;>e3x0^?)kdYrCdr*`e+|bFhdWVeT zvSOj_(NgVZlwB07B+vqWUvtXOG=?I2ppIXT#@iA+S~Yah{%v9Z?UmI*X$oRFBER>_ z8ciuRBa#M~0xti304AU%EMEv>w4WMoU;0K{%kRkpf5#q=s_p%P#oJVs=4sS{N;{#CT z14^yGu1H>Un^<>5ZF*u+<;Dc?ZtMo`MRqLKg1XH>5aR#&Y!+Lh4n(IW| zi>k7A*8yOh$R!y)=(9rBT)o^M%6Q1GO<*s+f!wrlG{!DTiZ2W{Ba6 z{wdh98c>Tt7U8>705M1r&vo~@L@MnV`e zCtVK2SA$@uqmo5#v3;dpI~>D%y(7fQZG$*zQiNl3y(ubloEZMnNEYgcc?1u;TIHMzEDSuJ)hx2R7i5LSmmgn2 zcY6C9EKN781C+uCGh>}#VS)n#3RjO!-=iekVm@}HE;?>oe{q8xwss^F1-kPQ`tQho zR$TD~*i^hvxw(Pc(yLY zu8s)_YlB|&71M$vl5%Aljb5Ku(Pa#`rH@Aj^=jp`ibojb^wNd{Bmf34R)Q8Gw7bW& zP6VKVVGXBz+d78&V5XtbsLBo!U}35q#D-+suU0Fj>Y%2Dr#z#mR!QL|)$OAS7Sy3f zDU<_wnmbGtW7raO411Lz^SG!adwVIN{a9UWAStUxYo~}qWf!OS&G;5-V#9SfTWY7(^&E;8;VQldQYTadj zU>PSz=x|p{MT-mI;XPt6?62Dz=O>T-}fK41E~ho7+Hc(Q)H2>qv5r|Q?7zI+MsQERa8AMe-9RL0Zb3l!AUU?tyc z$;25oMJ2-F*WCt^51|g#PJjUB1FW(Zx#eBhl?&qJ#QV#)z87Yd;!kmN!x*NL~tO1{r2c@7K?A;9n`CKc8#&?*!&HUu*NBaS!yr>T&-6h(2#_^36@Yxyhjw_)kZ!Zl1KwleT%% zHcuKr{Qt$wl+AwPhjC?dB{o-rdv|UY>CL0Cc@#E}0$73nhgEcKeSSP0dU%)btX{Nr z;(G`F3*H}|%o`gY|G~5WwA}`3c4zIF_L-)-N5JcP4uujmu~zQ0k_s& literal 0 HcmV?d00001 From b4c9bc623755ab1ab47725c07f4386e55235ce19 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Thu, 4 Apr 2024 15:18:13 +0800 Subject: [PATCH 07/10] Update User Guide --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e7da37cf472..bba175e7d81 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -137,7 +137,7 @@ Here are the main components of the commands: | Parameters | NAME, EMAIL, STUDENTID | The value of the attribute that the user have to provide after the prefix. | | Index | 1, 3 | The position of the student in the list it is referencing. Eg. Index 1 of tutorial class `T01` refers to the 1st student in the `T01` class list. | -Here are symbols used in the commands: (TODO) +Here are symbols used in the commands: | Symbol | Example | Description | |--------|:----------------|--------------------------------------------------------------------------------------| From ff3bf81c2fcef5081a85132d2107e671431d37ea Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Fri, 5 Apr 2024 00:58:12 +0800 Subject: [PATCH 08/10] Update Test cases for Commands --- docs/UserGuide.md | 4 +- .../logic/commands/AddStudentCommandTest.java | 2 +- .../AllocateStudentToTeamCommandTest.java | 102 +++++++++++------- .../logic/commands/CommandTestUtil.java | 6 +- ...llocateStudentToTeamCommandParserTest.java | 102 ++++++++++++++---- ...RandomTeamAllocationCommandParserTest.java | 23 ++-- 6 files changed, 164 insertions(+), 75 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 42c0c26db42..2d7e29f355a 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -71,9 +71,7 @@ confidence to make full use of TAHelper's features. 5. Launching TAHelper - Type `java -jar tahelper.jar` command and hit Enter to run TAHelper.
- It should look something like this (in this case my jar file is in a folder called tahelper): - - ![cmd](images/cmdwinguide2.png) - - + - ![cmd](images/cmdwinguide2.png) - A GUI similar to the below should appear in a few seconds.
- ![Ui](images/Ui.png) (to update!!). diff --git a/src/test/java/seedu/address/logic/commands/AddStudentCommandTest.java b/src/test/java/seedu/address/logic/commands/AddStudentCommandTest.java index 02e0ded86b8..61edbdc5152 100644 --- a/src/test/java/seedu/address/logic/commands/AddStudentCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AddStudentCommandTest.java @@ -39,7 +39,7 @@ public class AddStudentCommandTest { @Test - public void constructor_nullPerson_throwsNullPointerException() { + public void execute_addNullPerson_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> new AddStudentCommand(null)); } diff --git a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java index a9d435a2a3a..6bd8759401a 100644 --- a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; @@ -29,48 +30,39 @@ import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand; import seedu.address.logic.messages.TeamMessages; import seedu.address.logic.messages.TutorialClassMessages; -import seedu.address.model.Model; -import seedu.address.model.ModelManager; -import seedu.address.model.UserPrefs; +import seedu.address.model.*; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; import seedu.address.model.person.Email; import seedu.address.model.person.Person; import seedu.address.model.person.StudentId; -import seedu.address.testutil.PersonBuilder; +import seedu.address.testutil.*; public class AllocateStudentToTeamCommandTest { private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs()); - private TutorialClass tutorialClass; - private Person validPerson; - private Person validOtherPerson; private ModuleCode newModule; private TutorialTeam newTeam; private TutorialTeam tutTeam; @BeforeEach public void setUp() { - validPerson = new PersonBuilder(AMY).build(); - validOtherPerson = new PersonBuilder(ALICE) - .withStudentId(VALID_STUDENT_ID_BOB).withEmail(VALID_EMAIL_BOB).build(); - newModule = new ModuleCode(VALID_MODULE_AMY); + // create a new test module and add it to model + newModule = new ModuleBuilder().build(); model.addModule(newModule); - model.addPerson(validPerson); - model.addPerson(validOtherPerson); - TutorialClass newTutorialClass = new TutorialClass(VALID_TUTORIAL_AMY); - newModule.addTutorialClass(newTutorialClass); - tutorialClass = newTutorialClass; - newTeam = new TutorialTeam(VALID_TEAM_NAME, 1); - tutTeam = new TutorialTeam(VALID_TEAM_NAME_BOB, 3); - tutorialClass.addTeam(tutTeam); - tutorialClass.addTeam(newTeam); + int newTeamSizeTest = 1; + int tutTeamSizeTest = 3; + newTeam = new TutorialTeam(VALID_TEAM_NAME, newTeamSizeTest); + tutTeam = new TutorialTeam(VALID_TEAM_NAME_BOB, tutTeamSizeTest); + newModule.getTutorialClasses().get(0).addTeam(tutTeam); + newModule.getTutorialClasses().get(0).addTeam(newTeam); } @Test public void invalidAllocationToTeam_indexNotInSystem_failure() { - Index index = Index.fromOneBased(1000); + Index index = Index.fromOneBased(10); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); AllocateStudentToTeamByIndexCommand allocateStudentToTeamByIndexCommand = new AllocateStudentToTeamByIndexCommand(index, newModule, tutorialClass, newTeam); @@ -81,13 +73,16 @@ public void invalidAllocationToTeam_indexNotInSystem_failure() { @Test public void invalidAllocationToTeam_teamSizeExceeded_failure() { + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); + Person validPerson = model.getAddressBook().getPersonList().get(0); + Person otherValidPerson = model.getAddressBook().getPersonList().get(1); tutorialClass.addStudent(validPerson); + tutorialClass.addStudent(otherValidPerson); newTeam.addStudent(validPerson); - tutorialClass.addStudent(validOtherPerson); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new - AllocateStudentToTeamByStuIdCommand(validOtherPerson.getStudentId(), newModule, tutorialClass, newTeam); + AllocateStudentToTeamByStuIdCommand(otherValidPerson.getStudentId(), newModule, tutorialClass, newTeam); AllocateStudentToTeamByEmailCommand allocateStudentToTeamByEmailCommand = new - AllocateStudentToTeamByEmailCommand(validOtherPerson.getEmail(), newModule, tutorialClass, newTeam); + AllocateStudentToTeamByEmailCommand(otherValidPerson.getEmail(), newModule, tutorialClass, newTeam); assertCommandFailure(allocateStudentToTeamByStuIdCommand, model, String.format(TeamMessages.MESSAGE_TEAM_SIZE_EXCEEDED, newTeam.getTeamSize())); assertCommandFailure(allocateStudentToTeamByEmailCommand, model, @@ -95,7 +90,8 @@ public void invalidAllocationToTeam_teamSizeExceeded_failure() { } @Test - public void invalidAllocationToTeam_studentNull_failure() { + public void invalidAllocationToTeam_studentDoesNotExist_failure() { + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(new StudentId(VALID_STUDENT_ID), newModule, tutorialClass, newTeam); AllocateStudentToTeamByEmailCommand allocateStudentToTeamByEmailCommand = new @@ -109,6 +105,8 @@ public void invalidAllocationToTeam_studentNull_failure() { @Test public void invalidAllocationToTeam_tutorialTeamNotExist_failure() { TutorialTeam team = new TutorialTeam(VALID_TEAM_NAME_NEW); + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(validPerson.getStudentId(), newModule, tutorialClass, @@ -124,8 +122,12 @@ public void invalidAllocationToTeam_tutorialTeamNotExist_failure() { @Test public void invalidAllocationToTeam_studentAlreadyInTeam_failure() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); tutorialClass.addStudent(validPerson); newTeam.addStudent(validPerson); + + // try to allocate again but duplicate entry to team. AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(validPerson.getStudentId(), newModule, tutorialClass, tutTeam); @@ -141,37 +143,58 @@ public void invalidAllocationToTeam_studentAlreadyInTeam_failure() { @Test - public void validAllocationToTeam_byEmailOrStudentId_success() { + public void validAllocationToTeam_byEmail_success() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); tutorialClass.addStudent(validPerson); - tutorialClass.addStudent(validOtherPerson); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(validPerson.getStudentId(), newModule, tutorialClass, tutTeam); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.addModule(newModule); + + assertCommandSuccess(allocateStudentToTeamByStuIdCommand, model, + String.format(AllocateStudentToTeamByIndexCommand.MESSAGE_SUCCESS, tutTeam), expectedModel); + } + + @Test + public void validAllocationToTeam_byStudentId_success() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); + tutorialClass.addStudent(validPerson); AllocateStudentToTeamByEmailCommand allocateStudentToTeamByEmailCommand = new - AllocateStudentToTeamByEmailCommand(validOtherPerson.getEmail(), + AllocateStudentToTeamByEmailCommand(validPerson.getEmail(), newModule, tutorialClass, tutTeam); - assertCommandSuccess(allocateStudentToTeamByStuIdCommand, model, - String.format(AllocateStudentToTeamByIndexCommand.MESSAGE_SUCCESS, tutTeam), model); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.addModule(newModule); assertCommandSuccess(allocateStudentToTeamByEmailCommand, model, - String.format(AllocateStudentToTeamByEmailCommand.MESSAGE_SUCCESS, tutTeam), model); + String.format(AllocateStudentToTeamByEmailCommand.MESSAGE_SUCCESS, tutTeam), expectedModel); } @Test public void validAllocationToTeam_indexInSystem_success() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); tutorialClass.addStudent(validPerson); - tutorialClass.addStudent(validOtherPerson); - Index index = Index.fromZeroBased(1); + Index index = Index.fromZeroBased(0); AllocateStudentToTeamByIndexCommand allocateStudentToTeamByIndexCommand = new AllocateStudentToTeamByIndexCommand(index, newModule, tutorialClass, newTeam); + + Model expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs()); + expectedModel.addModule(newModule); assertCommandSuccess(allocateStudentToTeamByIndexCommand, model, - String.format(AllocateStudentToTeamByIndexCommand.MESSAGE_SUCCESS, newTeam), model); + String.format(AllocateStudentToTeamByIndexCommand.MESSAGE_SUCCESS, newTeam), expectedModel); } @Test public void invalidAllocationToTeam_studentNotInTutorialClass_failure() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(validPerson.getStudentId(), newModule, tutorialClass, newTeam); AllocateStudentToTeamByEmailCommand allocateStudentToTeamByEmailCommand = new @@ -184,11 +207,13 @@ public void invalidAllocationToTeam_studentNotInTutorialClass_failure() { @Test public void toString_test() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); tutorialClass.addStudent(validPerson); AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = new AllocateStudentToTeamByStuIdCommand(validPerson.getStudentId(), newModule, tutorialClass, newTeam); AllocateStudentToTeamByEmailCommand allocateOtherStudentToTeamByEmailCommand = - new AllocateStudentToTeamByEmailCommand(validOtherPerson.getEmail(), + new AllocateStudentToTeamByEmailCommand(validPerson.getEmail(), newModule, tutorialClass, newTeam); AllocateStudentToTeamByIndexCommand allocateStudentToTeamByIndexCommand = new AllocateStudentToTeamByIndexCommand(Index.fromZeroBased(0), @@ -199,11 +224,16 @@ public void toString_test() { allocateStudentToTeamByStuIdCommand.toString()); assertEquals(allocateStudentToTeamByIndexCommand.toString(), allocateStudentToTeamByIndexCommand.toString()); - + assertNotEquals(allocateStudentToTeamByIndexCommand.toString(), allocateStudentToTeamByStuIdCommand.toString()); + assertNotEquals(allocateStudentToTeamByIndexCommand.toString(), + allocateOtherStudentToTeamByEmailCommand.toString()); } @Test public void equals() { + Person validPerson = model.getAddressBook().getPersonList().get(0); + Person validOtherPerson = model.getAddressBook().getPersonList().get(1); + TutorialClass tutorialClass = newModule.getTutorialClasses().get(0); tutorialClass.addStudent(validPerson); tutorialClass.addStudent(validOtherPerson); // creation of 2 allocation command based on 2 different student ID adding to the same team under diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 4b5128c2ae1..970b37a2a5d 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -9,6 +9,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_NUM_OF_TEAMS; import static seedu.address.logic.parser.CliSyntax.PREFIX_STUDENTID; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAM_SIZE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TUTORIALCLASS; import static seedu.address.testutil.Assert.assertThrows; @@ -78,9 +79,10 @@ public class CommandTestUtil { public static final String VALID_TEAM_NAME_NEW = "Team 3"; public static final int VALID_TEAM_SIZE = 5; public static final String TEAM_NAME_DESC_AMY = " " + PREFIX_NAME + VALID_TEAM_NAME_AMY; - public static final String TEAM_SIZE_DESC = " " + PREFIX_TEAM_SIZE + VALID_TEAM_SIZE; + public static final String TEAM_DESC_AMY = " " + PREFIX_TEAMNAME + VALID_TEAM_NAME_AMY; public static final String INVALID_TEAM_NAME = "Team 1!"; - public static final int INVALID_TEAM_SIZE = -1; + public static final String INVALID_TEAM_DESC_AMY = " " + PREFIX_TEAMNAME + INVALID_TEAM_NAME; + public static final String TEAM_SIZE_DESC = " " + PREFIX_TEAM_SIZE + VALID_TEAM_SIZE; // '&' not allowed in names public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&"; diff --git a/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java index e660d6c6a74..9883f052d65 100644 --- a/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java @@ -1,7 +1,22 @@ package seedu.address.logic.parser; import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_MODULE_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_TEAM_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_TUTORIAL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; +import static seedu.address.logic.commands.CommandTestUtil.TEAM_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.TEAM_NAME_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.TUTORIAL_DESC_AMY; +import static seedu.address.logic.commands.CommandTestUtil.TUTORIAL_DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME_AMY; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TUTORIAL_AMY; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULECODE; import static seedu.address.logic.parser.CliSyntax.PREFIX_STUDENTID; @@ -11,6 +26,7 @@ import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; import static seedu.address.model.module.ModuleCodeTest.VALID_MODULE_CODE; import static seedu.address.model.module.ModuleCodeTest.VALID_TUTORIAL_1; +import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.AMY; import org.junit.jupiter.api.Test; @@ -18,41 +34,85 @@ import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamByEmailCommand; import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamByStuIdCommand; import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand; +import seedu.address.logic.parser.exceptions.*; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; -import seedu.address.model.person.Person; -import seedu.address.testutil.PersonBuilder; +import seedu.address.model.person.*; +import seedu.address.testutil.*; public class AllocateStudentToTeamCommandParserTest { private AllocateStudentToTeamCommandParser parser = new AllocateStudentToTeamCommandParser(); @Test - public void parse_validArgs_returnsAllocateStudentToTeamCommand() { - Person person = new PersonBuilder(AMY).build(); - ModuleCode moduleCode = new ModuleCode(VALID_MODULE_CODE); - TutorialClass tutorialClass = new TutorialClass(VALID_TUTORIAL_1); - TutorialTeam tutorialTeam = new TutorialTeam(VALID_TEAM_NAME); - moduleCode.addTutorialClass(tutorialClass); - tutorialClass.addTeam(tutorialTeam); - AllocateStudentToTeamByStuIdCommand allocateStudentToTeamByStuIdCommand = - new AllocateStudentToTeamByStuIdCommand(person.getStudentId(), moduleCode, tutorialClass, tutorialTeam); - AllocateStudentToTeamByEmailCommand allocateStudentToTeamByEmailCommand = - new AllocateStudentToTeamByEmailCommand(person.getEmail(), moduleCode, tutorialClass, tutorialTeam); - String userInput = " " + PREFIX_MODULECODE + moduleCode.moduleCode - + " " + PREFIX_TUTORIALCLASS + tutorialClass.tutorialName - + " " + PREFIX_TEAMNAME + tutorialTeam.getTeamName(); - assertParseSuccess(parser, " " + PREFIX_STUDENTID + person.getStudentId().value + userInput, - allocateStudentToTeamByStuIdCommand); - assertParseSuccess(parser, " " + PREFIX_EMAIL + person.getEmail().value + userInput, - allocateStudentToTeamByEmailCommand); + public void parse_allFieldPresent_success() { + assertParseSuccess(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + + TEAM_DESC_AMY, + new AllocateStudentToTeamByEmailCommand(new Email(VALID_EMAIL_AMY), new ModuleCode(VALID_MODULE_AMY), + new TutorialClass(VALID_TUTORIAL_AMY), new TutorialTeam(VALID_TEAM_NAME_AMY))); } @Test public void parse_invalidArgs_throwsParseException() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AllocateStudentToTeamCommand.MESSAGE_USAGE); - assertParseFailure(parser, "a", expectedMessage); + String invalidUserInput = "a"; + assertParseFailure(parser, invalidUserInput, expectedMessage); } + @Test + public void parse_emailMissing_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, + AllocateStudentToTeamCommand.MESSAGE_USAGE); + assertParseFailure(parser, PREAMBLE_WHITESPACE + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + + TEAM_DESC_AMY, expectedMessage); + } + + @Test + public void parse_moduleMissing_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, + AllocateStudentToTeamCommand.MESSAGE_USAGE); + assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + TUTORIAL_DESC_AMY + + TEAM_DESC_AMY, expectedMessage); + } + + @Test + public void parse_tutorialMissing_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, + AllocateStudentToTeamCommand.MESSAGE_USAGE); + assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + + TEAM_DESC_AMY, expectedMessage); + } + + @Test + public void parse_invalidInput_failure() { + // invalid email + String invalidEmailInput = PREAMBLE_WHITESPACE + INVALID_EMAIL_DESC + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + + TEAM_DESC_AMY; + assertThrows(ParseException.class, () -> parser.parse(invalidEmailInput)); + + // invalid module + String invalidModuleInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + INVALID_MODULE_DESC + TUTORIAL_DESC_AMY + + TEAM_DESC_AMY; + assertThrows(ParseException.class, () -> parser.parse(invalidModuleInput)); + + // invalid tutorial + String invalidTutorialInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + + INVALID_TUTORIAL_DESC + TEAM_DESC_AMY; + assertThrows(ParseException.class, () -> parser.parse(invalidTutorialInput)); + + // invalid team + String invalidTeamInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + + TUTORIAL_DESC_AMY + INVALID_TEAM_DESC_AMY; + assertThrows(ParseException.class, () -> parser.parse(invalidTeamInput)); + } + + @Test + public void parse_prefixRepeat_failure() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, + AllocateStudentToTeamCommand.MESSAGE_USAGE); + assertParseFailure(parser, PREAMBLE_WHITESPACE + + PREFIX_MODULECODE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, + expectedMessage); + } } diff --git a/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java b/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java index 9c5aaae127b..3cb85cf5bbf 100644 --- a/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java @@ -26,6 +26,7 @@ import seedu.address.logic.Messages; import seedu.address.logic.commands.RandomTeamAllocationCommand; +import seedu.address.logic.commands.allocatestudenttoteamcommands.*; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; @@ -36,14 +37,12 @@ public class RandomTeamAllocationCommandParserTest { @Test public void parse_allFieldsPresent_success() { - ModuleCode expectedModuleCode = new ModuleBuilder().withModuleCode(VALID_MODULE_AMY) - .withTutorialClasses(VALID_TUTORIAL_AMY).build(); int expectedNumOfTeams = VALID_NUM_OF_TEAMS; // whitespace only preamble assertParseSuccess(parser, PREAMBLE_WHITESPACE + MODULE_DESC_AMY + TUTORIAL_DESC_AMY - + VALID_NUM_OF_TEAMS_DESC, new RandomTeamAllocationCommand(expectedModuleCode.getModule(), - expectedModuleCode.getTutorialClasses().get(0), expectedNumOfTeams)); + + VALID_NUM_OF_TEAMS_DESC, new RandomTeamAllocationCommand(new ModuleCode(VALID_MODULE_AMY), + new TutorialClass(VALID_TUTORIAL_AMY), expectedNumOfTeams)); } @Test @@ -57,14 +56,6 @@ public void parse_repeatedPrefixes_failure() { // multiple tutorial class assertParseFailure(parser, TUTORIAL_DESC_BOB + validExpectedAllocatorString, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_TUTORIALCLASS)); - - // invalid moduleCode - assertParseFailure(parser, INVALID_MODULE_DESC + validExpectedAllocatorString, - Messages.getErrorMessageForDuplicatePrefixes(PREFIX_MODULECODE)); - - // invalid tutorialClass - assertParseFailure(parser, INVALID_TUTORIAL_DESC + validExpectedAllocatorString, - Messages.getErrorMessageForDuplicatePrefixes(PREFIX_TUTORIALCLASS)); } @Test @@ -99,4 +90,12 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, MODULE_DESC_BOB + TUTORIAL_DESC_BOB + INVALID_NUM_OF_TEAMS_DESC, TutorialTeam.MESSAGE_NUMBER_CONSTRAINTS); } + + @Test + public void parse_invalidArgs_throwsParseException() { + String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, + AllocateStudentToTeamCommand.MESSAGE_USAGE); + String invalidUserInput = "a"; + assertParseFailure(parser, invalidUserInput, expectedMessage); + } } From 14975cbeeb1ee5f5ecaeacae58c679b341fdc1f3 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Fri, 5 Apr 2024 01:28:49 +0800 Subject: [PATCH 09/10] Update checkstyle --- .../AllocateStudentToTeamCommandTest.java | 13 +++--- ...llocateStudentToTeamCommandParserTest.java | 40 +++++++------------ ...RandomTeamAllocationCommandParserTest.java | 8 ++-- 3 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java index 6bd8759401a..1dd29d5ed8d 100644 --- a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java @@ -5,19 +5,13 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL; -import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; -import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_STUDENT_ID; -import static seedu.address.logic.commands.CommandTestUtil.VALID_STUDENT_ID_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME; import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME_NEW; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TUTORIAL_AMY; import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; import static seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand.MESSAGE_STUDENT_DOES_NOT_EXIST; -import static seedu.address.testutil.TypicalPersons.ALICE; -import static seedu.address.testutil.TypicalPersons.AMY; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.jupiter.api.BeforeEach; @@ -30,14 +24,17 @@ import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand; import seedu.address.logic.messages.TeamMessages; import seedu.address.logic.messages.TutorialClassMessages; -import seedu.address.model.*; +import seedu.address.model.AddressBook; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; import seedu.address.model.person.Email; import seedu.address.model.person.Person; import seedu.address.model.person.StudentId; -import seedu.address.testutil.*; +import seedu.address.testutil.ModuleBuilder; public class AllocateStudentToTeamCommandTest { diff --git a/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java index 9883f052d65..1bca2820d2a 100644 --- a/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AllocateStudentToTeamCommandParserTest.java @@ -9,44 +9,32 @@ import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; import static seedu.address.logic.commands.CommandTestUtil.TEAM_DESC_AMY; -import static seedu.address.logic.commands.CommandTestUtil.TEAM_NAME_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.TUTORIAL_DESC_AMY; -import static seedu.address.logic.commands.CommandTestUtil.TUTORIAL_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_AMY; -import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME; import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_TUTORIAL_AMY; -import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULECODE; -import static seedu.address.logic.parser.CliSyntax.PREFIX_STUDENTID; -import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME; -import static seedu.address.logic.parser.CliSyntax.PREFIX_TUTORIALCLASS; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; -import static seedu.address.model.module.ModuleCodeTest.VALID_MODULE_CODE; -import static seedu.address.model.module.ModuleCodeTest.VALID_TUTORIAL_1; import static seedu.address.testutil.Assert.assertThrows; -import static seedu.address.testutil.TypicalPersons.AMY; import org.junit.jupiter.api.Test; import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamByEmailCommand; -import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamByStuIdCommand; import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand; -import seedu.address.logic.parser.exceptions.*; +import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; -import seedu.address.model.person.*; -import seedu.address.testutil.*; +import seedu.address.model.person.Email; public class AllocateStudentToTeamCommandParserTest { private AllocateStudentToTeamCommandParser parser = new AllocateStudentToTeamCommandParser(); @Test public void parse_allFieldPresent_success() { - assertParseSuccess(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + assertParseSuccess(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, new AllocateStudentToTeamByEmailCommand(new Email(VALID_EMAIL_AMY), new ModuleCode(VALID_MODULE_AMY), new TutorialClass(VALID_TUTORIAL_AMY), new TutorialTeam(VALID_TEAM_NAME_AMY))); @@ -64,7 +52,7 @@ public void parse_invalidArgs_throwsParseException() { public void parse_emailMissing_failure() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AllocateStudentToTeamCommand.MESSAGE_USAGE); - assertParseFailure(parser, PREAMBLE_WHITESPACE + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + assertParseFailure(parser, PREAMBLE_WHITESPACE + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, expectedMessage); } @@ -72,7 +60,7 @@ public void parse_emailMissing_failure() { public void parse_moduleMissing_failure() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AllocateStudentToTeamCommand.MESSAGE_USAGE); - assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + TUTORIAL_DESC_AMY + assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, expectedMessage); } @@ -80,30 +68,30 @@ public void parse_moduleMissing_failure() { public void parse_tutorialMissing_failure() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AllocateStudentToTeamCommand.MESSAGE_USAGE); - assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + assertParseFailure(parser, PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TEAM_DESC_AMY, expectedMessage); } @Test public void parse_invalidInput_failure() { // invalid email - String invalidEmailInput = PREAMBLE_WHITESPACE + INVALID_EMAIL_DESC + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + String invalidEmailInput = PREAMBLE_WHITESPACE + INVALID_EMAIL_DESC + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY; assertThrows(ParseException.class, () -> parser.parse(invalidEmailInput)); // invalid module - String invalidModuleInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + INVALID_MODULE_DESC + TUTORIAL_DESC_AMY + String invalidModuleInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + INVALID_MODULE_DESC + TUTORIAL_DESC_AMY + TEAM_DESC_AMY; assertThrows(ParseException.class, () -> parser.parse(invalidModuleInput)); // invalid tutorial - String invalidTutorialInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + - INVALID_TUTORIAL_DESC + TEAM_DESC_AMY; + String invalidTutorialInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + + INVALID_TUTORIAL_DESC + TEAM_DESC_AMY; assertThrows(ParseException.class, () -> parser.parse(invalidTutorialInput)); // invalid team - String invalidTeamInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + - TUTORIAL_DESC_AMY + INVALID_TEAM_DESC_AMY; + String invalidTeamInput = PREAMBLE_WHITESPACE + EMAIL_DESC_AMY + MODULE_DESC_AMY + + TUTORIAL_DESC_AMY + INVALID_TEAM_DESC_AMY; assertThrows(ParseException.class, () -> parser.parse(invalidTeamInput)); } @@ -111,8 +99,8 @@ public void parse_invalidInput_failure() { public void parse_prefixRepeat_failure() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, AllocateStudentToTeamCommand.MESSAGE_USAGE); - assertParseFailure(parser, PREAMBLE_WHITESPACE + - PREFIX_MODULECODE + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, + assertParseFailure(parser, PREAMBLE_WHITESPACE + PREFIX_MODULECODE + + EMAIL_DESC_AMY + MODULE_DESC_AMY + TUTORIAL_DESC_AMY + TEAM_DESC_AMY, expectedMessage); } } diff --git a/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java b/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java index 3cb85cf5bbf..5a647b7cf2a 100644 --- a/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/RandomTeamAllocationCommandParserTest.java @@ -26,11 +26,9 @@ import seedu.address.logic.Messages; import seedu.address.logic.commands.RandomTeamAllocationCommand; -import seedu.address.logic.commands.allocatestudenttoteamcommands.*; import seedu.address.model.module.ModuleCode; import seedu.address.model.module.TutorialClass; import seedu.address.model.module.TutorialTeam; -import seedu.address.testutil.ModuleBuilder; public class RandomTeamAllocationCommandParserTest { private RandomTeamAllocationCommandParser parser = new RandomTeamAllocationCommandParser(); @@ -41,8 +39,8 @@ public void parse_allFieldsPresent_success() { // whitespace only preamble assertParseSuccess(parser, PREAMBLE_WHITESPACE + MODULE_DESC_AMY + TUTORIAL_DESC_AMY - + VALID_NUM_OF_TEAMS_DESC, new RandomTeamAllocationCommand(new ModuleCode(VALID_MODULE_AMY), - new TutorialClass(VALID_TUTORIAL_AMY), expectedNumOfTeams)); + + VALID_NUM_OF_TEAMS_DESC, new RandomTeamAllocationCommand( + new ModuleCode(VALID_MODULE_AMY), new TutorialClass(VALID_TUTORIAL_AMY), expectedNumOfTeams)); } @Test @@ -94,7 +92,7 @@ public void parse_invalidValue_failure() { @Test public void parse_invalidArgs_throwsParseException() { String expectedMessage = String.format(MESSAGE_INVALID_COMMAND_FORMAT, - AllocateStudentToTeamCommand.MESSAGE_USAGE); + RandomTeamAllocationCommand.MESSAGE_USAGE); String invalidUserInput = "a"; assertParseFailure(parser, invalidUserInput, expectedMessage); } From 5938b1563978be16c9c108008f4bad69b26d3668 Mon Sep 17 00:00:00 2001 From: Zack-Tay Date: Fri, 5 Apr 2024 01:43:05 +0800 Subject: [PATCH 10/10] Update checkstyle --- .../logic/commands/AllocateStudentToTeamCommandTest.java | 2 +- .../java/seedu/address/logic/commands/CommandTestUtil.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java index 7d7f543fa15..871ab453346 100644 --- a/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/AllocateStudentToTeamCommandTest.java @@ -11,7 +11,6 @@ import static seedu.address.logic.commands.CommandTestUtil.VALID_TEAM_NAME_NEW; import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; -import static seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand.MESSAGE_STUDENT_DOES_NOT_EXIST; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.jupiter.api.BeforeEach; @@ -25,6 +24,7 @@ import seedu.address.logic.commands.allocatestudenttoteamcommands.AllocateStudentToTeamCommand; import seedu.address.logic.messages.PersonMessages; import seedu.address.logic.messages.TutorialClassMessages; +import seedu.address.logic.messages.TutorialTeamMessages; import seedu.address.model.AddressBook; import seedu.address.model.Model; import seedu.address.model.ModelManager; diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 6bd4f3c796f..1801bc96563 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -11,7 +11,6 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_STUDENTID; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME; -import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAM_SIZE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TUTORIALCLASS; import static seedu.address.testutil.Assert.assertThrows; @@ -86,7 +85,7 @@ public class CommandTestUtil { public static final String TEAM_DESC_AMY = " " + PREFIX_TEAMNAME + VALID_TEAM_NAME_AMY; public static final String INVALID_TEAM_NAME = "Team 1!"; public static final String INVALID_TEAM_DESC_AMY = " " + PREFIX_TEAMNAME + INVALID_TEAM_NAME; - public static final String TEAM_SIZE_DESC = " " + PREFIX_TEAM_SIZE + VALID_TEAM_SIZE; + public static final String TEAM_SIZE_DESC = " " + PREFIX_SIZE + VALID_TEAM_SIZE; // '&' not allowed in names public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&";