From 1890e645cb58a84576322f42951c0cdfc8034184 Mon Sep 17 00:00:00 2001 From: ALZT Date: Sun, 14 Apr 2024 19:39:06 +0800 Subject: [PATCH 1/4] Minor fix --- docs/DeveloperGuide.md | 6 +++--- docs/UserGuide.md | 17 ++++++++++------- .../diagrams/FilterSequenceDiagram-Logic.puml | 1 - docs/images/FilterSequenceDiagram-Logic.png | Bin 22601 -> 22504 bytes 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index ee14e5317b1..5204f399e65 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -191,7 +191,7 @@ The following sequence diagram shows how a filter operation goes through the `Lo ![FilterSequenceDiagram-Logic](images/FilterSequenceDiagram-Logic.png) -
:information_source: **Note:** The lifeline for `FilterCommand` and `GradeSubjectFilterPredicate` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
:information_source: **Note:** The lifeline for `FilterCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
@@ -208,8 +208,8 @@ The following activity diagram summarizes what happens when a tutor executes a f * Alternative 1: Filtered address book result can be saved, since in practice, there will only be a few combinations of filters. * Pros: Operation will be fast as the number of students increases. * Cons: More memory usage. -* Alternative 2: Introduce command history to avoid typing long commands. - * Pros: Useful for the entire application, and would use less memory (e.g. storing the first 10 commands). +* Alternative 2 (Implemented): Introduce command history to avoid typing long commands. + * Pros: Useful for the entire application, and would use less memory compared to alternative 1. (e.g. storing the first 10 commands). * Cons: Harder to implement. ### Payment Command diff --git a/docs/UserGuide.md b/docs/UserGuide.md index c79598ebb2b..72d6d52d189 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -5,17 +5,18 @@ title: User Guide TutorsGo is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, TutorsGo can get your contact management tasks done faster than traditional GUI apps. -## Why TutorsGo? - -* Calendar Integration: Seamlessly plan tutoring sessions with an integrated calendar view, enabling easy lookup of upcoming lessons and schedules. -* Comprehensive Student Profiles: Access student grades, subjects, notes and more at your fingertips, allowing for easy lookup of everything you need to know about your student. -* Payment Tracking Made Simple: Keep tabs on payments effortlessly, ensuring financial matters are organized and up-to-date. * Table of Contents {:toc} -------------------------------------------------------------------------------------------------------------------- +## Why TutorsGo? + +* Calendar Integration: Seamlessly plan tutoring sessions with an integrated calendar view, enabling easy lookup of upcoming lessons and schedules. +* Comprehensive Student Profiles: Access student grades, subjects, notes and more at your fingertips, allowing for easy lookup of everything you need to know about your student. +* Payment Tracking Made Simple: Keep tabs on payments effortlessly, ensuring financial matters are organized and up-to-date. + ## Quick start 1. Ensure you have Java `11` or above installed in your Computer. @@ -70,6 +71,8 @@ TutorsGo is a **desktop app for managing contacts, optimized for use via a Comma * `GRADE` and `SUBJECT` are currently both independent fields, i.e. `GRADE` can be assigned despite not having a `SUBJECT`. +* At most 1 `GRADE` and 1 `SUBJECT` can be assigned per student. + * `PAYMENT` should either be `Paid` or `Not Paid` * `ATTENDANCE` should either be `Present` or `Absent` @@ -167,7 +170,7 @@ Format: `filter [g/GRADE] [s/SUBJECT]` Examples: * `filter g/A` return students with grade: `A` -![filter Grade A](images/filterGradeA.png) +![filter Grade A](images/FilterGradeA.png) * `filter g/B+ s/Maths` returns students with grade: `B+` and subject: `Maths` ![filter Grade A](images/filterGradeBPlusSubjectMaths.png) @@ -232,7 +235,7 @@ Examples: * `history` returns a command history list. ![history](images/commandHistory.png) -* `history 1` runs the `list` command and returns the student list. It also outputs the success message of `list`. +* Upon running `history 1` from the result above, it runs the `list` command and returns the student list. It also outputs the success message of `list`. ![history 1](images/commandHistory1.png) diff --git a/docs/diagrams/FilterSequenceDiagram-Logic.puml b/docs/diagrams/FilterSequenceDiagram-Logic.puml index 7ebbe87b080..e05f6fcee06 100644 --- a/docs/diagrams/FilterSequenceDiagram-Logic.puml +++ b/docs/diagrams/FilterSequenceDiagram-Logic.puml @@ -48,7 +48,6 @@ FilterCommand --> LogicManager : commandResult deactivate FilterCommand FilterCommand -[hidden]-> LogicManager : commandResult destroy FilterCommand -destroy GradeSubjectFilterPredicate [<--LogicManager deactivate LogicManager diff --git a/docs/images/FilterSequenceDiagram-Logic.png b/docs/images/FilterSequenceDiagram-Logic.png index 41fa75e4121a6e0bb51ef5176044ac63143f3b15..728c45a124990dab4dc8fb6e3542e091200a4039 100644 GIT binary patch literal 22504 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 literal 22601 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 Date: Sun, 14 Apr 2024 21:14:24 +0800 Subject: [PATCH 2/4] Update appendix: Instructions for Manual Testing --- docs/DeveloperGuide.md | 75 ++++++++++++++++++++++++++++++++++-------- docs/UserGuide.md | 8 +++-- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5204f399e65..d69707f25f3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -365,11 +365,11 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -**Use case: Adding a person** +**Use case: Adding a student** **MSS** -1. Tutor adds a person +1. Tutor adds a student. 2. TutorsGo shows a success message. Use case ends. @@ -437,7 +437,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli ### Non-Functional Requirements 1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. -2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. +2. Should be able to hold up to 1000 students without a noticeable sluggishness in performance for typical usage. 3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. 4. Should handle errors without crashing 5. Should be able to function in offline environments @@ -480,29 +480,76 @@ testers are expected to do more *exploratory* testing. 1. Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained. -1. _{ more test cases …​ }_ +### Adding a student -### Deleting a person +1. Deleting a student while all students are being shown -1. Deleting a person while all persons are being shown + 1. Prerequisites: None. - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. + 1. Test case: `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/B+ s/Mathematics d/2024-02-03 1800`
+ Expected: Contact is added at the bottom of the list. Details of the newly added contact shown in the status message. + +### Editing a student + +1. Deleting a student while all students are being shown + + 1. Prerequisites: List all students using the `list` command. Multiple students in the list. + + 1. Test case: `edit 1 p/91234567 e/johndoe@example.com`
+ Expected: First contact's phone number and email address changed accordingly. Details of the edited contact shown in the status message. + +### Deleting a student + +1. Deleting a student while all students are being shown + + 1. Prerequisites: List all students using the `list` command. Multiple students in the list. 1. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated. + Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. + Expected: No student is deleted. Error details shown in the status message. Status bar remains the same. 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
Expected: Similar to previous. -1. _{ more test cases …​ }_ -### Saving data +### Filtering a student by grade/subject + +1. Filtering a student in the address book. + + 1. Prerequisites: Multiple students in the list, with `GRADE` = `B+` and `SUBJECT` = `Mathematics` manually assigned to at least one student. + + 1. Test case: `filter g/B+`
+ Expected: One or more students are returned from the list. Details of the filter and number of students returned shown in status message. + + 1. Test case: `filter g/B+ s/Mathematics`
+ Expected: Similar to previous. + + 1. Test case: `filter g/A`
+ Expected: No student returned from the list. Details of the filter and number of students returned shown in status message. + + 1. Other incorrect filter commands to try: `filter g/x s/y` (where x and y are invalid inputs described in User Guide)
+ Expected: Nothing happens to the current list. Error details shown in the status message. + + +### Check command history + +1. Checking command history on current instance of address book. + + 1. Prerequisites: At least one successful command ran besides `history` command itself. + + 1. Test case: `history`
+ Expected: returns a new list of at least one successful command. Success message shown on status bar. + +### Re-run command from command history + +1. Re-run command history on current instance of address book. -1. Dealing with missing/corrupted data files + 1. Prerequisites: At least one successful command ran besides `history` command itself. - 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_ + 1. Test case: `history 1`
+ Expected: The first successful command on the command history list will run again. Status message dependent on the first command. -1. _{ more test cases …​ }_ + 1. Other incorrect history commands to try: `history x` (where x is larger than the list size)
+ Expected: Nothing happens to the current list. Error details shown in the status message. \ No newline at end of file diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 72d6d52d189..7561f250236 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -105,7 +105,7 @@ A student can have any number of tags and datetimes (including 0) Examples: * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/B+ s/Mathematics d/2024-02-03 1800` -* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567` +* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Betsy Avenue p/91234567` ### Listing all students : `list` @@ -155,7 +155,7 @@ Filters and shows a list of students who has the specified grade and/or subject. Entering [list](#listing-all-students--list) will bring back the full address book. -
:bulb: **Note:** +
:information_source: **Note:** Filtering will always occur with the whole address book, regardless of what the user sees on the student list.
@@ -217,6 +217,10 @@ Enter [list](#listing-all-students--list) to return back to the student list. Format syntax and more information below. +
:information_source: **Note:** +Commands that are saved are not persistent. (i.e. The commands that are saved in one instance will be lost after closing the app.) +
+ Format: `history [INDEX]` * Upon entering `history` (i.e. leaving whitespace / not entering any index): From b0c3d30a89ea109348345689f88ffd0a104deb40 Mon Sep 17 00:00:00 2001 From: ALZT Date: Sun, 14 Apr 2024 21:21:14 +0800 Subject: [PATCH 3/4] Test --- docs/DeveloperGuide.md | 12 ++++++------ docs/UserGuide.md | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d69707f25f3..2c3f63a52b0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -359,9 +359,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Extensions** * 1a. Parameters given are invalid. - + * 1a1. TutorsGo shows an error message. - + Use case ends. @@ -397,7 +397,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli * 1a. Tutor enters the command he/she wants to run. * 1a1. TutorsGo shows output of command. - + Use case ends. @@ -525,14 +525,14 @@ testers are expected to do more *exploratory* testing. 1. Test case: `filter g/B+ s/Mathematics`
Expected: Similar to previous. - + 1. Test case: `filter g/A`
Expected: No student returned from the list. Details of the filter and number of students returned shown in status message. 1. Other incorrect filter commands to try: `filter g/x s/y` (where x and y are invalid inputs described in User Guide)
Expected: Nothing happens to the current list. Error details shown in the status message. - + ### Check command history 1. Checking command history on current instance of address book. @@ -552,4 +552,4 @@ testers are expected to do more *exploratory* testing. Expected: The first successful command on the command history list will run again. Status message dependent on the first command. 1. Other incorrect history commands to try: `history x` (where x is larger than the list size)
- Expected: Nothing happens to the current list. Error details shown in the status message. \ No newline at end of file + Expected: Nothing happens to the current list. Error details shown in the status message. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 7561f250236..c092c208635 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -69,7 +69,7 @@ TutorsGo is a **desktop app for managing contacts, optimized for use via a Comma * `GRADE` parameter input (i.e. `g/GRADE`) follows the NUS grading system. (i.e. [A+, A, A-, B+, B, B-, C+, C, D+, D, F]) -* `GRADE` and `SUBJECT` are currently both independent fields, i.e. `GRADE` can be assigned despite not having a `SUBJECT`. +* `GRADE` and `SUBJECT` are currently both independent fields, i.e. `GRADE` can be assigned despite not having a `SUBJECT`. * At most 1 `GRADE` and 1 `SUBJECT` can be assigned per student. @@ -229,7 +229,7 @@ Format: `history [INDEX]` * Lists at most 10 successful commands. * Upon entering `history [INDEX]`: - * It will re-run the command that was specified by the index. + * It will re-run the command that was specified by the index. * The index here refers to the index number shown in the command history list. * The index **must be a positive integer**, and should be within the list's boundaries. * The output message is determined by the re-run command. (i.e. `history [INDEX]` itself does not have any success message.) @@ -299,7 +299,7 @@ Team size: 4 ## Command summary -Action | Format, Examples +Action | Format, Examples --------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------- **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` **Clear** | `clear` From 846fd0863a8b75e25a1118f42301a024d9e9e188 Mon Sep 17 00:00:00 2001 From: ALZT Date: Sun, 14 Apr 2024 21:23:24 +0800 Subject: [PATCH 4/4] Fix --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2c3f63a52b0..e0d124e448d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -482,7 +482,7 @@ testers are expected to do more *exploratory* testing. ### Adding a student -1. Deleting a student while all students are being shown +1. Adding a student to the address book. 1. Prerequisites: None. @@ -491,7 +491,7 @@ testers are expected to do more *exploratory* testing. ### Editing a student -1. Deleting a student while all students are being shown +1. Editing a student while all students are being shown 1. Prerequisites: List all students using the `list` command. Multiple students in the list.