Developer Guide
Introduction
Thank you for your interest in the development of Notor! This is an open-source project aimed at helping mentors take quick, efficient notes to facilitate effective and efficient mentoring of many mentees. The design principles scaffolding Notor are as follows.
-
Efficient UX for the User:
- You shouldn’t have to wait for Notor; it should simply run – quickly and without hassle.
- Look for how you can make the process faster, more streamlined, or more effective for our clients: mentors.
-
CLI-first
- We target fast-typers who are comfortable taking notes on their computer.
In particular, we tackle the needs of mentor professors, who tend to be busy and are assigned mentees they are unlikely to personally know or run into often. A personal CRM like Notor is a useful tool to help maintain the mentor-mentee relationship. Key features of Notor which scaffold this are:
- Powerful Organisation which is up to the user to manage many mentees
- Group mentees, and place groups into subgroups for greater control
- Add tags to mentees and sort by tags to easily identify meta-data
- Archive contacts you’re no longer speaking to
- A clean note-taking system
- Designed so that they can take notes concurrently with meeting the mentee so no information is forgotten
Acknowledgements
This project is a further iteration of the AddressBook-Level 3 ( AB-3) project. All features we have are in addition to those already present in AB-3. Removed features may or may not be listed as well.
Table of Contents
- Introduction
- Setting up, getting started
- Glossary
- Design
- Implementation
- Documentation, logging, testing, configuration, dev-ops
- Appendix: Requirements
-
Appendix: Instructions for manual testing
- Launch and shutdown
- List Commands
- Finding a person
- Finding a group
- Finding a subgroup in a group
- Deleting a person
- Adding a group
- Deleting a group
- Adding a person to a group
- Removing a person from a group
- Adding a subgroup to a group
- Removing a subgroup from a group
- Adding general note.
- Clearing general note.
- Adding note to a person
- Adding note to a group
- Adding note to a subgroup in a group
- Clearing note of a person
- Clearing note of a group
- Clearing note of a subgroup in a group
- Tagging a person
- Saving data
- Appendix: Effort
Setting up, getting started
Refer to the guide Setting up and getting started.
Glossary
- Command structure: The order in which parameters and command words must be written in order for the command to be correctly parsed
- Dummy data: Sample data used in testing or example data present on first launch of application
-
Group: A container containing
Personobjects with shared traits that is created by the user - Key power features: Essential features that will be used often when running the software application
- Mainstream OS: Windows, Linux, Unix, MacOS
-
Metadata: Personal data about a
Personobject -
Note: A general description of each
Personto record their activities, with last edit timestamp attached -
Supergroup: SuperGroup is a group that can have many subgroups. We often use it interchangeably with
GroupasSupergroupis more of an implementation detail. -
Subgroup: A child of a
Supergroupused to store multiple persons based on a more specific category thanSupergroup. ASubgroupcan be created by specifying the parent group of theSubgroup. A person can be in theSubgrouponly if the person is already in the parentSupergroup. -
Tag: A string descriptor attached to
Groupobjects orPersonobjects -
Ungrouped: Used to describe a
Personobject with no grouping
Design
Architecture
The Architecture of our iteration is built upon AB-3. Please refer to the AB-3 Architecture section for the general Architectural design of the app. Only changes will be listed here.
Logic Changes
Command Changes

Due to the addition of many new commands and refactoring of the command structure, we have amended the classes related to managing commands.
-
Parsernow takes in genericT extends Commandsince we have multiple types of commands, each with their own unique parser -
Executorinstances are created by eachCommandclass, which then handle the actual execution of commands and returning ofCommandResult - Commands now come in 3 general types,
PersonCommand,GroupCommandandCommand-
PersonCommandoperates onPersonobjects -
GroupCommandoperates onGroupobjects -
Commandoperates without either aPersonorGroupobject
-
-
ParserandExecutorclasses come in the same 3 categories asCommandclasses -
NotorParsernow parses both thecommandWordandsubCommandWordfor user commands-
commandWordrefers to eitherPerson,Groupor one of the object agnostic commands -
subCommandWordrefers to an operation that can be carried out on aPersonorGroup, such asfindortag
-
New Workflow for Adding Commands:
- Create a
XYZCommandclass that extends eitherPersonCommand,GroupCommandor simplyimplements Command. - Create a
XYZCommandParserclass that extends the same type ofParseras theCommandabove is. - Add the new
XYZCommandParserto theparse()method inNotorParser. - Create a
XYZCommandExecutorclass that extends the same type ofExecutoras theCommandfrom step 1. - Implement all required methods and ensure all fields used by the methods are present.
In-depth example of Command workflow, using the Find Command
Notor allows you to search for groups and people, and both searches have slightly different requirements.
Let’s break down what happens when you call a command, like the find command. The following is a low-level sequence diagram to show in detail how the method is called.

- The common logic for all commands is shared in
LogicManagerandNotorParser, which uses the Command design pattern. Making use of polymorphism, we know we will have aCommandreturned which can be executed by theLogicManager, while different classes hold the functionality. - Each specific command parser (
FindCommandParserin the diagram) is responsible for checking that the correct parameters have been passed, and forming them into the appropriate parameters. The parser creates an appropriate command (FindPersonCommand), which extends theCommandinterface. Hence, we know theFindPersonCommandwill definitely implementexecute. - In the constructor for the
FindPersonCommand, theFindPersonExecutoris initialised. As mentioned earlier, executors hold all the execution functionality. In the case of find, this means in its initialisation it is passed the predicate initialised in theFindCommandParserwhich is used to filter the list of persons in the model later - After the initialisation of the
FindPersonCommandis done, the Command is returned all the way toLogicManager. -
LogicManageruses the Command API to call execute() on the command, which calls the execute method on the executor. - The executor updates the model and returns the command result, which is passed back to the
LogicManager.
In-depth example of Command Workflow, using the Person Note Command.
Notor allows you to add notes to itself, a person or group.
The following sequence diagram shows the detail when PersonNoteCommand is executed to add note for a person.

-
PersonNoteCommandhasMentorwhich is the actor involved in the sequence diagram. -
Mentorcan save and quit note on thePersonNoteWindowobject via shortcut keys mentioned in User Guide or Gui buttons inPersonNoteWindow. - By saving,
PersonNoteWindowcallexecutesaveNote()inLogic Managerwhich will result in updating ofModel. - By quiting, the instance of
PersonNoteWindowis destroyed.
UI Changes
API : Ui.java

-
MainWindowdoes not contain PersonListPanel anymore. Now it containsListPanelwhich can be aPersonListPanel,GroupListPanelorSubgroupListPanel. -
MainWindowcontainsGeneralNotewhich displays the general note. -
MainWindowhas dependency withPersonNoteWindow,GroupNoteWindowandGeneralNoteWindow, each of which implementsNoteWindowinterface.
Model Changes
API : Model.java

-
Persondoes not contain theAddressfield anymore. -
Personcontains a newNotefield. -
PersoncontainsHashSet<String>containingSuperGroupandSubGroupnames for display purposes.- These are just
Stringobjects, and are not actual references toGroupobjects.
- These are just
-
Namemust start with an alphabet character.- This is due to the fact that our parser will be unable to differentiate between indexes and names when parsing commands.
-
Namemay contain-and.characters.- This is to account for people with these special characters in their names.
Here is the better class structure to be implemented:

API : Trie.java
- Allows grouping and autocompletion of
TagandCommandobjects.- Supports addition and deletion of items.
- Supports finding of first item.
- Supports finding of first item that starts with specified keyword.
- Design considerations
- Storing
Stringobjects in aTriein Notor allows all tags to only get created once instead of once per object. - Storing tags as
Stringobjects in a trie is simpler than a dedicatedTagclass.
- Storing
- This feature is planned to be incorporated in a future update, as the
Triedata structure has already been implemented.- It was delayed as short form commands were judged sufficiently user friendly.
Storage component
API: Storage.java

The Storage component,
- now includes a new
ArchiveStorage component -
Archiveallows users to temporarily removePersons from Notor
Implementation
This section describes some noteworthy details on how certain features are implemented.
Execution of person command
The diagram below shows how a person command is executed.

Command History
CommandHistory allows user to access past successfully executed commands by using Up and Down Arrow keys. Since, our
implementation of CommandHistory only tracks past successfully executed commands pertaining to a single instance of
Notor, CommandHistory does not have dependency to Model and Storage.
The class diagram of CommandHistory is as follows.

To illustrate how does CommandHistory works, activity diagram
for CommandHistory when using up arrow key is as follows.

[Proposed] Last Contact Feature
Most CLI systems boast specific tools to help manage the frequency of meeting with the contacts. This feature was deferred, but here are some thoughts on implementation.

Each Person would have one LastContactDate and NextContactDate. These two can have specialised functions inside to determine if the NextContactDate is soon enough, and ability to sort the Person List by these two dates can also be implemented.
Potential Commands
- Commands to set the Last Contact Day
- Might have a default of the current date, or takes a parameter to set the last contact date to the last edited date of the note.
- Alternatively takes a date for manual inputs.
- Commands to set the Next Contact Day
Design considerations
- For ease of use, utility classes to parse different kinds of date strings might be useful. For example, parsing 7d as 7 days from today, then 1m means 1 month from the day, 1y meaning 1 year… etc.
- User commands to update the last contact date to the next contact date before you change the next contact date might serve users well
- It may be useful to set a new LastContactDate or NextContactDate for whole groups at once
- With regards to UI, these dates might be observed by person card using the Observation design pattern. This would allow the UI to update these dates with colours depending on how soon the NextContactDate is or how far away the LastContactDay is.
[Proposed] View Pane
- Future implementations would include
ViewPane, a pane to view data of a specificPerson,Group, andSubgroupin detail, as well as to view the general note. In addition, aViewcommand would be implemented forPerson,Group,Subgroup, andNoteto change the view of theViewPaneaccordingly. - Changes on the implementation would include replacing the current
GeneralNoteclass withViewPaneclass, which can contain aPersonViewCard,GroupViewCard,SubgroupViewCard, orGeneralNote, all of which implementsViewCardinterface. - The proposed class diagram for the
ViewPaneUI is as follows.
The following diagram only illustrates the UI of the ViewPane. Further details on the View
Breakdown of ViewPane
Here are the breakdowns of the proposed implementations for PersonViewCard, GroupViewCard, and SubgroupViewCard:
-
PersonViewCardwould contain the following:- Name, phone, and Email of the
Person, - Tags of the
Person, and - Note of the
Person, - The groups and subgroups that the
Personis currently in.
- Name, phone, and Email of the
-
GroupViewCardwould contain the following:-
SuperGroupname, - A truncated list of people inside the
SuperGroup, - A truncated list of subgroups inside the
SuperGroup, - The number of people and the number of subgroup inside the
SuperGroup, and - Note of the
SuperGroup.
-
-
SubgroupViewCardwould contain the following:-
SubGroupname, - A truncated list of people inside the
SubGroup, - The parent group of the
SubGroup, - The number of people inside the
SubGroup, - Note of the
SubGroup, and - Note of the parent group of the
SubGroup.
-
Breakdown of View Command
The intended functionalities of ViewCommand is as follows:
-
ViewCommandwould be implemented byPersonViewCommand,GroupViewCommand,SubgroupViewCommand, andGeneralNote. -
PersonViewCommandwould modify theViewPaneto containPersonViewCardof aPerson. -
GroupViewCommandwould modify theViewPaneto containGroupViewCardof aSuperGroup. -
SubgroupViewCommandwould modify theViewPaneto containSubgroupViewCardof aSubGroup. -
GeneralNotewould modify theViewPaneto show the general notes.
Example of View Command Workflow, using the Person View Command
To illustrate how the View command works, the activity diagram for PersonViewCommand is as follows.

Documentation, logging, testing, configuration, dev-ops
Appendix: Requirements
Product scope
Target user profile: mentor professors
- has a need to manage a significant number of contacts
- prefer desktop apps over other types
- can type fast
- prefers typing to mouse interactions
- is reasonably comfortable using CLI apps
- has groups of contacts that have different needs
Value proposition: manage contacts faster than a typical mouse/GUI driven app
User stories
Priorities:
- High - must have
- Medium - nice to have
- Low - unlikely to have
- Default - already implemented
| As a … | I want to … | So that I can … | Priority | Status | When? |
|---|---|---|---|---|---|
| on the go user | add notes without wifi or internet access | use the app anywhere | Default | Iteration 1.2 | |
| new user | have dummy data | see what my entries look like | Default | Iteration 1.2 | |
| new user | remove all dummy entries easily | start doing work quickly | Medium | Iteration 1.2 | |
| general user, mentor professor, module professor | take notes with timestamps | see my notes chronologically | High | Iteration 1.2 | |
| general user, mentor professor, module professor | edit the groups or tags of a student | High | Iteration 1.2 | ||
| mentor professor | group the students based on the mentoring subjects | tag or comment on each group separately | High | Iteration 1.2 | |
| general user, mentor professor, module professor | have easy-to-remember commands for inputting information | High | Iteration 1.2 | ||
| general user | delete groups/subgroups | High | Not started | Iteration 1.2 | |
| experienced user, general user | add tags cumulatively | not retype my old tags | High | Not started | Iteration 1.2 |
| new user | see clear error messages that explains how to enter the correct command | learn the right syntax from my errors | High | Not started | Iteration 1.2b |
| experienced user, general user, mentor professor, module professor | edit previous notes I have taken | High | Iteration 1.2b | ||
| mentor professor, module professor, new user | have an easily accessible help page | High | Iteration 1.2b | ||
| experienced user, general user, mentor professor, module professor, new user, on the go user | search by tag/category | find students based on tag/category | High | Not started | Iteration 1.2b |
| general user, mentor professor, module professor | have notes attached to categories | save notes relevant to a whole group | Medium | Iteration 1.2b | |
| general user | create general notes | take down any thoughts I have on the fly | Medium | Not started | Iteration 1.2b |
| new user | see a confirmation message if I choose to delete something | avoid accidental deletions | Medium | Iteration 1.2b | |
| general user | display all of the user information in an easy to reference format | read large amounts of information at once easily | Medium | Iteration 1.3 | |
| mentor professor | see the last time I contacted a student | know if I need to check up on them | Medium | Iteration 1.3 | |
| experienced user | see personal metadata such as number of high-priority students & number of contacts | determine my own usage | Low | Iteration 1.3b | |
| general user, mentor professor, module professor, on the go user | export the data to PDF & CSV / Excel | reference the information in another format | Low | Iteration 1.3b | |
| general user, mentor professor, module professor, on the go user | archive students that are not as relevant in my current contacts | keep my mentee list short and easy to read | Low | Iteration 1.3b | |
| experienced user, module professor | set my own command aliases | use my own commands when I am used to them | Low | Delay | |
| experienced user, mentor professor, module professor | use shorter commands | save time | Medium | Delay |
Use cases
(For all use cases below, Notor is the System and the Actor is the user, unless specified otherwise)
Navigation
Use case 1: Display a desired list
MSS
- User requests to view list of persons/groups/archived persons.
- Notor shows the list selected.
Extensions
- 2a. The list is empty. Use case ends.
Use case 2: Display a subset of a list
MSS
- User requests for Notor to return the persons/groups which fit a certain criteria.
-
Notor returns a list filtered by said criteria.
Use case ends.
General Use Cases
Use case: Export Data
MSS
- User requests to export data.
-
Notor exports the data in CSV format to the directory where Notor belongs.
Use case ends.
UC-CommandError : User enters the wrong command
Precondition: User passes the wrong parameters, command, or data
- Notor detects an error in the entered data, and displays an error message.
- User corrects their command to not have any errors. Steps 1 and 2 are repeated until the data entered are correct. Command is executed from where the use case is interrupted.
Basic Person Use Cases
Use case: Add a person to Notor
MSS
- User requests to add a person to Notor, specifying their name and optional parameters for their personal details.
-
Notor adds said person to the storage, and displays a success message.
Use case ends.
Extensions
- 1a. User commands Notor to display the list of groups (UC1).
- 1a1. User requests to add a person to Notor, specifying their name and optional parameters for their personal details, as well as the group they want to add them to
- Resume usecase at 2.
- 1b. User enters the wrong parameters for their request to add person, resulting in (UC-CommandError).
- Resume usecase at 2.
Use case: Edit Person, Tag Person, or Add/Remove person to a group
MSS
- User commands Notor to display the list of persons (UC1).
- User specifies a person they want to change, and informs Notor of which fields they want changed and to what values.
- Notor changes the fields, displaying the correct fields and a success message.
Extensions
- 2a. User tries to add person to a group that does not exist.
- Notor informs the user that the group does not exist.
- User decides to create the group first (UC).
- Resume use case from step 1..
- Notor informs the user that the group does not exist.
Use case: Add a note to a person
MSS
- User commands Notor to display the list of persons (UC1).
- User requests to add a note to a specific person in the list.
- Notor opens up a pop up window for the user to type the note for the person.
- User types in their notes.
- User requests to save and close the note.
-
Notor closes the note window and displays a success message that note has been saved.
Use case ends.
Extensions
- 2a. User makes a mistake in their request, such as specifying a person that doesn't exist (UC-CommandError).
- Resume use case from step 2.
- 6a. User requests to save the note to the person
- 6a1. Notor displays a message that the note has been saved. Use case resumes at step 5 or 6.
- 6b. User requests to close the note (without saving).
- 6b1. Notor shows a warning window.
- 6b2.1 : User cancels the request to close the note. Use case resumes at step 5 or 6.
- 6b2.2 : User accepts to close the note without saving. Notor closes the note window. Not shown that note is saved.
- 6b1. Notor shows a warning window.
Use Case: Clear tags or notes
MSS
Precondition: The person or group whose tags or notes you want to clear is visible and able to be selected.
- User requests to clear all tags or notes.
- Notor displays a confirmation window.
- User confirms their wish to clear all tags or notes.
-
Notor clears tags or notes, then displays a success message.
Use case ends.
Extensions
- 3a. User cancels their request.
-
3a1. Notor displays a confirmation of the cancelling of the request
Use case ends.
-
Basic Group Commands
Use case: Add a note to a Group
MSS
- Similar to Add a note to a person except Notor shows a list of groups in step 1.
Use case: Add a note to a Subgroup
MSS
- Similar to Add a note to a person except Notor shows a list of subgroups in step 1.
Use case : Create Group
MSS
- User informs Notor to create a group, specifying its name.
-
Notor creates the group and displays a success message.
Use case ends.
Extensions
- 1a. Group already exists.
- 1a1. Resume use case from step 1.
- 1b. Group name is invalid.
- 1b1. Resume use case from step 1.
Use case : Create Subgroup
MSS
- User informs Notor to create a subgroup, specifying its name and the name of the group that the subgroup will be in.
-
Notor creates the group and displays a success message.
Use case ends.
Extensions
- 1a. Group already exists.
- 1a1. Resume use case from step 1.
- 1b. Group name is invalid.
- 1b1. Resume use case from step 1.
Use case: User exits from Notor
MSS
- User requests to exit.
-
Notor exits.
Use case ends.
Extensions
- 1a. User has unsaved Note Window opened.
- 1a1.1 Notor displays a confirmation window.
- 1a2.1 User confirms exit without saving Note. Use case resumes from step 2.
- 1a2.2 User cancels exit via confirmation window. Use case ends.
- 1a1.1 Notor displays a confirmation window.
Proposed Extended Use Cases ( Not Implemented )
Use case: User types a command
MSS
- User starts typing a command in Notor.
- Notor shows possible commands starting with what user has typed.
- User presses tab to select the right command.
- User presses enter to execute the selected command.
-
Notor runs command (UC1).
Use case ends.
Non-Functional Requirements
- Should work on any mainstream OS as long as it has Java
11or above installed. - Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
- 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.
- Installing a new update shall not in any way, modify or erase existing data and value from the previous version, and the new update should be compatible with the data produced earlier within the system.
- Should be able to store notes in English language. Note that support for other languages is not in scope.
- The system should be able to handle notes with at most 1000 lines without any noticeable decrease in performance, so that users can keep extensive notes on their mentees.
- The user should not lose any data if exit command is triggered by the user.
- The system should be able to reply to the prompt or command from the user within 3 seconds.
- The system should be logical to use for a mentor professor.
- Should ensure personal data privacy and security of data access.
- While the software should be accessible for colour-blind or vision impaired mentors, this goal is out of scope for Notor 1.4 due to time constraints.
Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
Launch and shutdown
-
Initial launch
-
Download the jar file and copy into an empty folder
-
Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
-
-
Saving window preferences
-
Resize the window to an optimum size. Move the window to a different location. Close the window.
-
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-
-
{ more test cases … }
List Commands
- Test case:
person /list
Expected: View list of all persons in Notor who are not archived - Test case:
person /list CSENfeisvnldifosjeri
Expected: Same as above – following string is ignored. - Test case:
group /list
Expected: List all groups in your Notor. -
Incorrect test cases to try:
grop /list(or other typos)
Expected: Display error message. - Prerequisite: List all groups using the
person /listcommand or already in person list.-
person (INDEX) /list
Expected: Display error message.
-
- Test case:
person /lar
Prerequisite: List the archived persons
Prerequisites: Be in a list of groups. They can be subgroups or supergroups. Must have at least one group in the list.
- Test case:
person 3 /list
Expected: View list of all persons in the third group who are not archived - Test case:
group 2 /list
Expected: View list of all subgroups in group 2 who are not archived - Test case:
person 0 /list
Expected: No change in list display. Error details shown in the status message.
Finding a person
Prerequisites: List all persons using the person /list command or already in person list.
Must have at least one person in the list.
- Test case:
person /find n:John t:AI
Expected: Display all people who’s names include ‘John’ tagged with the specific tag ‘AI’. - Test case:
person /find
Expected: Display an error message as no parameters were provided.
Finding a group
Prerequisites: List all groups using the group /list command or already in group list.
- Test case:
Group /find n:Orbital
Expected: Display all groups that have names that include ‘Orbital’. - Test case:
Group /find
Expected: Display an error message as no parameters were provided.
Finding a subgroup in a group
Prerequisites: List all subgroups in a group using the group x /list command, where x is the index of a group.
- Similar to Finding a group except that all subgroups in a group is listed.
Deleting a person
Prerequisites: List all persons using the person /list command or already in person list.
Have at least one person in the list.
-
Test case:
person 1 /delete
Expected: First contact is deleted from the list. Details of the deleted person shown in the status message. -
Test case:
person 0 /delete
Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. -
Other incorrect delete commands to try:
p /delete,p x /delete,...(where x is larger than the list size)
Expected: Similar to previous.
Adding a group
-
Test case:
group Test /create
Expected: Group is created. If you switch to group list, you will be able to see the new group created. -
Test case:
group 123 /create
Expected: No group is created. Error details shown in the status message. -
Other incorrect delete commands to try:
group /create,group group_1 /create,...(where x is larger than the list size)
Expected: Similar to previous.
Deleting a group
Prerequisites: List all groups using the group /list command or already in group list.
At least one group in the list.
-
Test case:
group 1 /delete
Expected: A confirmation window popped. Upon confirmation, first group is deleted from the list. -
Test case:
group 0 /delete
Expected: No group is deleted. Error details shown in the status message. -
Other incorrect delete commands to try:
group /delete,group x /delete,...(where x is larger than the list size)
Expected: Similar to previous.
Adding a person to a group
Prerequisites: List all persons using the person /list command or already in person list.
At least one person in the list.
-
Test case:
person 1 /add g:Orbital
Expected: Person is added to the group. Person is updated with a new group in the UI. -
Test case:
person 0 /add g:Orbital
Expected: No person is added to a group. Error details shown in the status message. -
Other incorrect delete commands to try:
person /add,person 1 /add g:NonExistent,...(where x is larger than the list size)
Expected: Similar to previous.
Removing a person from a group
Prerequisites: List all persons using the person /list command or already in person list.
At least one person in the list.
-
Test case:
person 1 /remove g:Orbital
Expected: Person is removed to the group. Person is updated with group removed in the UI.- Test case:
person 0 /remove g:Orbital
Expected: No person is removed from group. Error details shown in the status message.
- Test case:
-
Other incorrect delete commands to try:
person /remove,person 1 /remove g:NonExistent,...(where x is larger than the list size)
Expected: Similar to previous.
Adding a subgroup to a group
Prerequisites: List all groups using the group /list command or already in group list.
At least one group in the list.
-
Test case:
group 1 /create n:Artemis
Expected: Artemis is added to the first group. Group is updated with a new subgroup in the UI. -
Test case:
group 0 /create n:Artemis
Expected: No group is created. Error details shown in the status message. -
Other incorrect delete commands to try:
group /create,...(where x is larger than the list size)
Expected: Similar to previous.
Removing a subgroup from a group
Prerequisites: List all groups using the group 1 /list command.
First group contains subgroup Artemis.
-
Test case:
group 1 /delete n:Artemis
Expected: Confirmation window pops up. Upon confirmation, Artemis is removed from the first group. Group is updated with a subgroup removed in the UI. -
Test case:
group 0 /delete n:Artemis
Expected: No subgroup is removed. Error details shown in the status message. -
Other incorrect delete commands to try:
group /delete,group 1 /delete n:NonExistent,...(where x is larger than the list size)
Expected: Similar to previous.
Adding general note.
- Test case:
note
Expected: Note window opened with title of note window named asGeneral Noteto add note to. Within the note window, user can make use of keyboard shortcuts in User Guide for saving and quiting of note. Upon saving of note, general note is added and displayed in left pane of Notor.
Clearing general note.
- Test case:
clearnote
Expected: Warning Window opened to prompt whether to proceed with clearing of general note. General note is cleared in Notor upon confirmation to continue with clearing of note. General note is not cleared upon confirmation to cancel clear note.
Adding note to a person
Prerequisites: List all persons using the person /list command or already in person list.
Must have at least one person in the list.
-
Test case:
person 1 /note
Expected: Note window opened with title of note window named as the person to add note to. Within the note window, user can make use of keyboard shortcuts in User Guide for saving and quiting of note. Upon saving of note, first three lines of note excluding empty line is shown for the first person in the list. -
Test case:
person 0 /note
Expected: No note window is opened. Error details shown in the status message. -
Other incorrect delete commands to try:
p /note,p x /note,...(where x is larger than the list size)
Expected: Similar to previous.
Adding note to a group
Prerequisites: List all groups using the group /list command or already in group list.
Must have at least one group in the list.
- Similar to Adding note to a person except that group is listed, and group note command is used.
Adding note to a subgroup in a group
Prerequisites: List all subgroups in a group using the group x /list command, where x is the index of a group.
Must have at least one subgroup in the list.
- Similar to Adding note to a person except that all subgroups in a group is listed, and group note command is used.
Clearing note of a person
Prerequisites: List all persons using the person /list command or already in person list.
Must have at least one person in the list.
-
Test case:
person 1 /clearnote
Expected: Warning Window opened to prompt user whether to proceed with clearing of note for the person. Note of first person is cleared in the list upon confirmation to clear note. Note of first person in the list remains upon confirmation to cancel clear note. -
Test case:
person 0 /clearnote
Expected: No warning window is opened. Error details shown in the status message. -
Other incorrect delete commands to try:
p /clearnote,p x /clearnote,...(where x is larger than the list size)
Expected: Similar to previous.
Clearing note of a group
Prerequisites: List all groups using the group /list command or already in group list.
Must have at least one group in the list.
- Similar to Clearing note of a person except that group is listed, and group clear note command is used.
Clearing note of a subgroup in a group
Prerequisites: List all subgroups in a group using the group x /list command, where x is the index of a group.
Must have at least one subgroup in the list.
- Similar to Clearing note of a person except that all subgroups in a group is listed, and group note command is used.
Tagging a person
Prerequisites: Have persons in the list panel.
-
Test case:
person 1 /tag t:tag1, tag2
Expected: Tags with those names are added to person 1, unless person 1 already has both tags, in which case an error message is displayed. If Person1 already has a tag, it is not added twice. - Test case:
person 1 /untag t:tag1, tag2
Expected: Tags with those names are removed from person 1, unless person 1 has neither tag, in which case an error message is displayed - Test case:
person 1 /ct t:tag1, tag2
Expected: Similar to Clearing note of a person, a warning window will be displayed. The extra parameters do nothing.
Saving data
-
Dealing with missing/corrupted data files
- Find the file
notor.json, which should be located in data directory near Notor. Corrupt the file
Expected: Corrupted file cannot be read, and Notor will begin again empty - Delete the file
notor.json
Expected: A new blank notor will be created
- Find the file
Appendix: Effort
Tagging
AB3 supports tagging, but the tags are too restrictive as you cannot add tags cumulative. We thought that users should be able to add tags without removing the existing tags. So we had to change most of the implementation of tags, and add in new commands to support adding of tags of cumulatively.
Note taking for Person, Group and Subgroup
Notor is designed to allow mentors to be able to take note easily. AB3 does not have this feature, so we had to implement this feature from scratch. It was challenging to design a note window that is responsive to change. Moreover, having a separate note window makes it more GUI based. To optimize for mentors who type fast, we implemented keyboard shortcuts to ensure that mentors will be able to take note quickly.
List Views
We decided to have groups and subgroups so that users can organize people in the list. AB3 only has support listing of people. Our team needed to create new UI elements to support that. Even when the new UI elements are created, it was still tough to create commands to support the operation of switching between views and updating the list view when a change has been made.
GUI Test (Implemented but scrapped due to CI failure)
We have initially decided to implement GUI Testing because many of our functionalities
such as clearing notes, tags and Notor, and adding notes uses a pop up window.
The difficulty level of GUI Testing is moderate because there is very limited
guides available on TestFX Library. Despite our best efforts to try to fix CI failure and the GUI testcases passing locally,
all efforts are of no avail.