Developer Guide
Projact - Developer Guide
Projact is a project and contact management app that helps NUS computing students to organise their fellow computing students’ contacts and their teams’ meeting links and tasks.
This developer guide provides information that helps you to get started as a contributor to Projact.
Table of Contents
- Setting up
- Design
- Implementation
- Documentation, logging, testing, configuration, dev-ops
- Appendix
Setting up, getting started
Refer to the guide Setting up and getting started.
Design
Architecture

The Architecture Diagram given above explains the high-level design of the App. Given below is a quick overview of each component.
.puml files used to create diagrams in this document can be found in the diagrams folder. Refer to the PlantUML Tutorial at se-edu/guides to learn how to create and edit diagrams.
Main has two classes called Main and MainApp. It is responsible for,
- At app launch: Initializes the components in the correct sequence, and connects them up with each other.
- At shut down: Shuts down the components and invokes cleanup methods where necessary.
Commons represents a collection of classes used by multiple other components.
The rest of the App consists of four components.
-
UI: The UI of the App. -
Logic: The command executor. -
Model: Holds the data of the App in memory. -
Storage: Reads data from, and writes data to, the hard disk.
Each of the four components,
- defines its API in an
interfacewith the same name as the Component. - exposes its functionality using a concrete
{Component Name}Managerclass (which implements the corresponding APIinterfacementioned in the previous point.
For example, the Logic component (see the class diagram given below) defines its API in the Logic.java interface and exposes its functionality using the LogicManager.java class which implements the Logic interface.

How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete 1.

The sections below give more details of each component.
UI component

API :
Ui.java
The UI consists of a MainWindow that is made up of parts e.g.CommandBox, ResultDisplay, PersonListPanel, StatusBarFooter etc. All these, including the MainWindow, inherit from the abstract UiPart class.
The UI component uses JavaFx UI framework. The layout of these UI parts are defined in matching .fxml files that are in the src/main/resources/view folder. For example, the layout of the MainWindow is specified in MainWindow.fxml
The UI component,
- Executes user commands using the
Logiccomponent. - Listens for changes to
Modeldata so that the UI can be updated with the modified data.
Logic component

API :
Logic.java
-
Logicuses theProjactParserclass to parse the user command. - This results in a
Commandobject which is executed by theLogicManager. - The command execution can affect the
Model(e.g. adding a person). - The result of the command execution is encapsulated as a
CommandResultobject which is passed back to theUi. - In addition, the
CommandResultobject can also instruct theUito perform certain actions, such as displaying help to the user.
Given below is the Sequence Diagram for interactions within the Logic component for the execute("delete 1") API call.

DeleteCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
Model component

API : Model.java
The Model,
- stores a
UserPrefobject that represents the user’s preferences. - stores the projact data.
- exposes unmodifiable
ObservableList<Person>andObservableList<Tag>that can be ‘observed’ e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. - does not depend on any of the other three components.
Tag list in the Projact, and its TagName is referenced by Person. This allows Projact to only require one Tag object per unique Tag, instead of each Person needing their own Tag object.
Storage component

API : Storage.java
The Storage component,
- can save
UserPrefobjects in json format and read it back. - can save projact data in json format and read it back.
Common classes
Classes used by multiple components are in the seedu.addressbook.commons package.
Implementation
Contact features
Sort command
The sort command allows a user to sort the current person list in alphanumerical order.
- How is SortContactCommand executed
- The command is passed into
LogicManager -
LogicManagercalls parseCommand method ofProjactParser. -
ProjactParseridentifies and returnsSortCommand. -
LogicManagerexecutesSortCommand, which updates the sorted person list by comparing the personNames usingPersonNameComparatorinModel.
- The command is passed into
The diagram below shows a sample interaction of SortCommand.

- Why is it implemented that way?
- The overall implementation flow of the
sortcommand is similar to thefindcommand in the original AB3 but instead of using Filtered List and Predicate, Sorted List and Comparator are used to sort the list.
- The overall implementation flow of the
Tag features
TagAdd command
The tagadd command allows a user to add a new tag to the tag list. The tag added will not have any contacts under it initially.
- How is TagAddCommand executed
- The command is passed into
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘tagadd’ and the arguments. -
ProjactParsercalls the parse method ofTagAddCommandParser, which parses the argument, creates a newTagobject, and returns a newTagAddCommandwith the newTagobject used as an argument. - The
LogicManagerthen calls the execute method of theTagAddCommand, which calls the addTag method ofModel.
- The command is passed into
The diagram below shows a sample interaction of TagAddCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the TagAddCommand will also be largely similar to classes implemented in AB3.
TagEdit command
The tagedit command allows a user to edit the tag name of a tag in the list.
- How is TagEditCommand executed
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘tagedit’ and the arguments. -
ProjactParsercalls the parse method ofTagEditCommandParser, which parses the argument, creates a newIndexobject and a newEditTagDescriptorobject, and returns a newTagEditCommandwith those objects used as arguments. - The
LogicManagerthen calls the execute method of theTagEditCommand, which create a newTagobject with the edited field and replaces the currentTagobject at the specified index inFilteredTagList. -
FilteredTagListis updated with the editedTagobject and will reflect the changes in theModel.
- The command is passed in to
The diagram below shows a sample interaction of TagEditCommand.

- Why is it implemented that way:
- The implementation of the TagEdit command is very similar to the Edit command so that we can reuse the previous code.
- For example, by making the commandWord ‘tagedit’ instead of ‘tag edit’, we are able to make use of
ProjectParserinstead of creating a different parser just to identify tag commands.
TagList command
The taglist command allows a user to display all the tags in the tag list currently.
- How is TagListCommand executed
- The command is passed into
LogicManager. -
LogicManagercalls parseCommand method ofProjactParser. -
ProjactParseridentifies and returnsTagListCommand. -
LogicManagerexecutesTagListCommand, which sets isTagList parameter inCommandResultto true. -
MainWindowdetectsCommandResultisTagList() returns true and hence invokes the showTagList() method.
- The command is passed into
The diagram below shows a sample interaction of TagListCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TagListCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TagFind command
The tagfind command allows a user to display all tags which contains at least one of the specified keywords.
- How is TagFindCommand executed
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘tagfind’ and the arguments. -
ProjactParsercalls the parse method ofTagFindCommandParser, which parses the argument, creates a newTagNameContainsKeywordsPredicateobject with the keywords, and returns a newTagFindCommandwith the newTagNameContainsKeywordsPredicateobject used as an argument. - The
LogicManagerthen calls the execute method of theTagFindCommand, which calls the updateFilteredTagList method ofModel. This method takes in aPredicate<Tag>and filters theTagListby the supplied predicate.
- The command is passed in to
The diagram below shows a sample interaction of TagFindCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TagFindCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TagSort command
The tagsort command allows a user to sort the tag list in alphanumerical order.
The implementation and interaction of the TagSortCommand is similar to SortContactCommand but it uses TagNameComaparator instead of PersonNameComparator.
- Why is it implemented that way:
- The TagSort and SortContact commands share similar functions with the former sorting the tag list and the latter sorting the person list. Hence, a similar set of methods are for this feature to ensure the application can work smoothly.
TagDelete command
The tagdelete command allows a user to delete a tag permanently. This feature will result in the removal of the tag from the tag list and from any contact with said tag.
- How is TagDeleteCommand executed
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘tagdelete’ and the arguments. -
ProjactParsercalls the parse method ofTagDeleteCommandParser, which parses the argument, creates a newIndexobject with the parsed user input, and returns a newTagDeleteCommandwith the newIndexobject used as an argument. - The
LogicManagerthen calls the execute method of theTagDeleteCommand, which retrieves the most updated tag list from theModelManager. From this list, the tag to be deleted is retrieved by its index. Then, theModelManagerwill go on to remove all instances of the tag.
- The command is passed in to
The diagram below shows a sample interaction of TagDeleteCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TagDeleteCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
Link Features
LinkAdd command
The linkadd command allows a user to add a meeting link to a specified tag.
- How is LinkAddCommand executed
- The command is passed into
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘linkadd’ and the arguments. -
ProjactParsercalls the parse method ofLinkAddCommandParser, which parses the argument, creates newOptional<MeetingLink>andIndexobjects, and returns a newLinkAddCommandwith the newOptional<MeetingLink>andIndexobjects used as arguments. - The
LogicManagerthen calls the execute method of theLinkAddCommand, which creates a newTagobject with theOptional<MeetingLink>object, and replaces the currentTagobject at the specified index inFilteredTagList. -
FilteredTagListis updated with the editedTagobject and will reflect the changes in theModel.
- The command is passed into
The diagram below shows a sample interaction of LinkAddCommand.

- Why is it implemented this way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
LinkAddCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
LinkDelete command
The linkdelete command allows a user to delete the meeting link from a tag permanently.
- How is LinkDeleteCommand executed:
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the command word, which in this case is ‘linkdelete’ and the arguments. -
ProjactParsercalls the parse method ofLinkDeleteCommandParser, which parses the argument, creates a newIndexobject with the parsed user input, and returns a newLinkDeleteCommandwith the newIndexobject used as an argument. - The
LogicManagerthen calls the execute method of theLinkDeleteCommand, which retrieves the most updated tag list from theModelManager. From this list, the tag that will has its meeting link being removed will be retrieved. A new tag will be created with an empty meeting link using Optional class and replaced the old tag retrieved. - Then, the
ModelManagerwill update the tag list.
- The command is passed in to
The diagram below shows a sample interaction of LinkDeleteCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
LinkDeleteCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
Task Features
TaskAdd command
The taskadd command allows the user to add a task to a tag.
- How is TaskAddCommand executed:
- The command is passed into
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case is ‘taskadd’ and the arguments. -
ProjactParsercalls the parse method ofTaskAddCommandParser, which parses the argument, creates a neweditTagDescriptorobject, and returns a newTaskAddCommandwith the neweditTagDescriptorobject used as an argument. - The
LogicManagerthen calls the execute method of theTaskAddCommand, which calls the setTag method ofModel.
- The command is passed into
The diagram below shows a sample interaction of TaskAddCommand.

- Why is it implemented that way:
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TaskAddCommandwill also be largely similar to classes implemented in AB3.
- The command is implemented to be as similar as possible to the current command classes, so that there will be minimal changes to the overall design of the product. Most new classes added to accommodate the
TaskDone command
The taskdone command allows the user to mark a task under a tag as done.
- How is TaskDoneCommand executed:
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the command word, which in this case is ‘taskdone’ and the arguments. -
ProjactParsercalls the parse method ofTaskDoneCommandParser, which parses the arguments, creates twoIndexobjects, the first one to be the tag Index and the second one is the task Index and returns a newTaskDoneCommandwith twoIndexobjects pass in as parameters. - The
LogicManagerthen calls the execute method of theTaskDoneCommand, which retrieves the tag from the taglist based on the tag Index. From the tag, the task list will be retrieved to get the targeted task using the task Index. The targeted task will be marked done and a new tag with the modified task list will be created and replaced the old Tag. - Then, the
ModelManagerwill update the tag list.
- The command is passed in to
The diagram below shows a sample interaction of TaskDoneCommand.

- Why is it implemented that way:
- The command is implemented such that there is no need for any prefixes. This helps to shorten the command and reduces the time required to mark a task as done.
- The second index uses an alphabetical index instead of a numerical one. This avoids confusion between the index of the tag and the index of the task.
TaskDelete command
The taskdelete command allows the user to delete a task from a tag.
- How is TaskDeleteCommand executed:
- The command is passed into
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the commandWord, which in this case istaskdoneand the arguments. -
ProjactParsercalls the parse method ofTaskDeleteCommandParser, which parses the argument, cand returns a newTaskDeleteCommand. - The
LogicManagerthen calls the execute method of theTaskDeleteCommand, which calls the setTag method ofModel.
- The command is passed into
- Why is it implemented that way:
- The design consideration on the indices for the
TaskDeleteCommandis similar toTaskDoneCommand.
- The design consideration on the indices for the
The diagram below shows a sample interaction of TaskDeleteCommand.

TaskClear command
The taskclear command allows the user to clear all completed tasks under a tag.
- How is TaskClearCommand executed:
- The command is passed in to
LogicManager. -
LogicManagercalls the parseCommand method ofProjactParser. -
ProjactParseridentifies the command word, which in this case is ‘taskclear’ and the arguments. -
ProjactParsercalls the parse method ofTaskClearCommandParser, which parses the argument, creates a newIndexobject and returns a newTaskClearCommandwith the newIndexobject as an argument. - The
LogicManagerthen calls the execute method of theTaskClearCommand, which retrieves theTagobject at the specified index inFilteredTagList. From theTag, a list of its uncompleted tasks,List<TagTask>, is obtained. - A new
Tagobject is created with the newList<TagTask>and replaces the currentTagobject at the specified index inFilteredTagList. -
FilteredTagListis then updated to reflect the changes inModel.
- The command is passed in to
The diagram below shows a sample interaction of TaskDoneCommand.

- Why is it implemented that way:
- The command is implemented to be similar to the current command classes, so that there will be minimal changes to the overall design of the product.
- An alternative implementation would be for
TaskClearCommandto not take in an index and just delete all completed tasks from every tag.- However, the user may want to keep certain tags with completed tasks for tracking purposes.
- Furthermore, this implementation will result in a significantly long execution time for the
TaskClearCommandas the number of tags and tasks increase.
Documentation, logging, testing, configuration, dev-ops
Appendix
A: Product Scope
Target user profile: Computing Student
- has a need to manage a significant number of computing student contacts
- prefer desktop apps over other types
- can type fast
- is reasonably comfortable using CLI apps
- wants to group contacts based on the different modules
- has a need to store different url links for each module in a single accessible location
- wants to keep track of tasks
Value propositions:
- Manages contacts faster than a typical mouse/GUI driven app.
- Sorts contacts based on the different modules.
- Allows convenient search for project mates / friends taking the same module.
- Allows convenient search for the link for team meeting.
- Has a to-do list to keep track of task progress.
B: User Stories
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * |
new user | see usage instructions | refer to instructions when I forget how to use the application. |
* * * |
new user | see sample contacts and tags | have a brief idea on what the app will look like when it is being used |
* * * |
user | add a new contact | |
* * * |
user | delete a contact | remove contacts that I no longer need |
* * * |
user | find a contact by name | locate details of persons without having to go through the entire list |
* * * |
user | save a telegram handle to its respective contact | find the telegram chat with that person quickly |
* * * |
user | create a tag | find or sort the contacts based on tags later on. |
* * * |
user | delete a tag | remove tags that are accidentally added or no longer required |
* * * |
user | find a tag by name | locate details of the tag without having to go through the entire list |
* * * |
user | list all tags | quickly browse through all the tags that I have added |
* * * |
student | add tasks for each tag | remind myself of all the tasks that are under those tags. |
* * * |
student | delete tasks for each tag | remove the tasks that are no longer required for that module |
* * * |
student with many project groups | add the meeting platform links to each tag | conveniently contact the team or initiate a team meeting |
* * * |
student with many project groups | delete the meeting platform link for each tag | remove the link if it has been added wrongly |
* * |
student | clear all completed tasks under each tag | remove the tasks that are no longer required |
* * |
user | update a tag (name) | correct the misspelled tag name |
* * |
user | sort the tags by its tag name | view tags in alphabetical order |
* * |
user with many contacts | sort the contacts by name | view contacts in alphabetical order |
* * |
student | mark the status of a particular task as done | keep track of the different task progress under that tag. |
* * |
student with many project groups | add remarks on the tag | find module-related information from the tag |
* * |
student with many project groups | delete the comments on the tag | |
* |
long-time user | archive old tags | keep my contacts up to date |
* |
long-time user | unarchive old tags | conveniently use the same old tag containing the same contact |
* |
power user | create shortcuts for existing commands | type faster in my preferred way for certain commands |
* |
power user | import and export person list to another device | save time compiling the person list |
C: Use Cases
(For all use cases below, the System is the Projact and the Actor is the user, unless specified otherwise)
Use case: UC01 - Delete a person
MSS
- User requests to list persons
- Projact shows a list of persons
- User requests to delete a specific person in the list
-
Projact deletes the person
Use case ends.
Extensions
-
2a. The list containing all the persons is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. Projact shows an error message.
Use case resumes at step 2.
-
Use case: UC02 - List all tags
MSS
- User requests to list tags
-
Projact shows a list of tags
Use case ends.
Extensions
-
2a. The list containing all the tags is empty.
Use case ends.
Use case: UC03 - Create a Tag
MSS
- User requests to create a tag
-
Projact adds the tag.
Use case ends.
Extensions
-
2a. The tag already exists.
- 2a1. Projact shows an error message.
Use case ends.
Use case: UC04 - Delete a tag
MSS
- User requests to list tags
- Projact shows a list of tags
- User requests to delete a specific tag in the list
-
Projact deletes the tag
Use case ends.
Extensions
-
2a. The list containing all the tags is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. Projact shows an error message.
Use case resumes at step 2.
-
Use case: UC05 - Find a tag
MSS
- User searches for tag(s) by keyword(s)
-
Projact displays a list of matching tags
Use case ends.
Extensions
-
2a. The list containing all the tags is empty.
Use case ends.
-
2b. There are no tags that match the keyword(s)
Use case ends.
-
2c. User did not specify any keywords.
-
2c1. Projact shows an error message.
Use case resumes at step 1.
-
Use case: UC06 - Edit tag
MSS
- User requests to list tags (UC02)
- User requests to edit a specific tag in the list
-
Projact edits the tag
Use case ends.
Extensions
-
1a. The list containing all the tags is empty.
Use case ends.
-
2a. The given index is invalid.
-
2a1. Projact shows an error message.
Use case resumes at step 2.
-
-
2b. The new tag name is missing.
-
2b1. Projact shows an error message.
Use case resumes at step 2.
-
Use case: UC07 - Add a link to a tag
MSS
- User requests to list tags (UC02)
- User requests to add a link to a tag in the list.
-
Projact adds the link to the tag.
Use case ends.
Extensions
-
1a. The list containing all the tags is empty.
Use case ends.
-
2a. The given index is invalid.
-
2a1. Projact shows an error message.
Use case resumes at step 2.
-
-
2b. The tag already has a link.
-
2b1. Projact shows an error message.
Use case resumes at step 2.
-
-
2c. The input link is not valid.
-
2b1. Projact shows an error message.
Use case resumes at step 2.
-
Use case: UC08 - Mark a task as done
MSS
- User requests to list tags (UC02)
- User requests to mark a particular task from a tag in the list as done.
-
Projact changes the status of the task to ‘done’.
Use case ends.
Extensions
-
1a. The list containing all the tags is empty.
Use case ends.
-
2a. The given index is invalid.
-
2a1. Projact shows an error message.
Use case resumes at step 2.
-
-
2b. The targeted task has been completed.
-
2b1. Projact shows an error message.
Use case resumes at step 2.
-
Use case: UC09 - Clear completed tasks
MSS
- User requests to list tags (UC02)
- User requests to delete all completed tasks from a tag in the list
-
Projact deletes all completed tasks from the tag
Use case ends.
Extensions
-
1a. The list is empty.
Use case ends.
-
2a. The given index is invalid.
-
2a1. Projact shows an error message.
Use case resumes at step 2.
-
-
2b. The tag has no completed tasks.
-
2b1. Projact shows an error message.
Use case resumes at step 2.
-
D: 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.
- The system should work on both 32-bit and 64-bit environments.
- The software should work without requiring an installer.
- The software should not depend on any of the team member’s own remote server.
- The product should not use images that would result in copyright infringement.
- The team should give credit for any reused code.
- The software should not depend on any third-party frameworks/libraries that are not approved by the CS2103T teaching team.
- The software should obey Java checkstyle rules.
- The system should respond within two seconds.
- The product is not required to handle the communication between the user and those in the user’s projact.
- The product should be customised to target NUS Computing students.
- The system should be usable by a novice who has never used a command line interface before.
- The product should be targeting users who can type fast and prefer typing over other means of input.
- The product should be for a single user i.e. (not a multi-user product).
- The data should be stored locally and should be in a human editable text file.
- The data should not be stored using a Database Management System (DBMS).
- The data should be updated as the product is being used (update with every command).
- The user’s data should not be accessible to anyone who does not have access to the user’s local files.
- The user’s data should not be accessible by developers of the product.
E: Glossary
- Contact: A person’s information, which includes the name, phone number, email address and Telegram handle of the person
- Tag: A label to group and/or distinguish different contacts. Examples: Relationship with person (friend, family, etc), common module taken (MA1101R, CS2101, etc)
- Mainstream OS: Windows, Linux, Unix, OS-X
F: 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.
-
Contact Commands
Adds a person
-
Adding a person while all persons are being shown
-
Prerequisites: List all persons using the
listcommand. Multiple persons in the list. -
Test case:
add n/Jane p/98765432 e/jane@gmail.com ta/jane_tan t/cs2103
Expected: A new contact is added to the end of the persons list with the contact details set to the respective user inputs. Contact details are shown in the status message. -
Test case:
add n/Jane p/98765432 e/jane@gmail.com
Expected: No person is added. Invalid command format error shown in the status message due to missingta/TELEGRAM_ADDRESSfield. -
Test case:
add n/Jane p/98881999 e/janelim@gmail.com ta/jane_lim t/cs2103
Expected: No person is added. Duplicate person error shown in the status message due to existing contact having the exact same name.
-
Edits a person
-
Editing a person while all persons are being shown
-
Prerequisites: List all persons using the
listcommand. Multiple persons in the list. -
Test case:
edit 1 n/James Lee e/jameslee@example.com
Expected: Contact details of the first contact in the list is set to the respective user inputs. Updated contact details are shown in the status message. -
Test case:
edit 0 n/James Lee
Expected: No person is edited. Invalid command format error shown in the status message due to non-positive index indicated. -
Test case:
edit 1
Expected: No person is edited. Error message stating that there should be at least one field provided in shown in the status message. -
Test case:
edit x(where x is larger than the list size)
Expected: No person is edited. Error message stating that index is invalid is shown in the status message.
-
Deletes a person
-
Deleting a person while all persons are being shown
-
Prerequisites: List all persons using the
listcommand. Multiple persons in the list. -
Test case:
delete 1
Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. -
Test case:
delete 0
Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. -
Other incorrect delete commands to try:
delete,delete x,...(where x is larger than the list size)
Expected: Similar to previous.
-
Finds a person
-
Finding a person while all persons are being shown
-
Prerequisites: List all persons using the
listcommand. Multiple persons in the list. For the following test cases, assume that the list contains the contacts: Jane, John, JanE. -
Test case:
find john
Expected: The contact John and his contact details is listed. The number of contacts listed is shown in the status message. -
Test case:
find jane
Expected: The contacts Jane and JanE are listed. The number of contacts listed is shown in the status message. -
Test case:
find james
Expected: No contacts are listed. The number of contacts listed is shown in the status message. -
Test case:
find
Expected: Invalid command format error is shown in the status message due to missingKEYWORDfield.
-
Tag Commands
The manual testing of tag commands such as tagadd, tagedit, tagdelete, tagfind can be done in a similar to the contact commands. However, instead of using list to list all tags,
taglist should be used instead.
Link Commands
Adds a link
-
Adding a link to a tag while all tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. For step 2, assume the first tag in the list has no pre-existing link. -
Test case:
linkadd 1 l/http://zoom.com/
Expected: The link is added to the first tag in the tag list. The link is shown in the status message. -
Test case:
linkadd 1 l/http://google.com/
Expected: No link is added. Error message stating there is already a link is shown in the status message. -
Test case:
linkadd 2
Expected: No link is added. Error message stating that there should be a link is shown in the status message. -
Test case:
linkadd 2 l/http
Expected: No link is added. Error message stating the correct link format is shown in the status message.
-
Deletes a link
-
Deleting a link from a tag while all the tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. For the following test cases, assume that only the first tag has a link. -
Test case:
linkdelete 1
Expected: Link is deleted from the first tag in the list. Details of deleted link is shown in the status message. -
Test case:
linkdelete 2
Expected: No link is deleted. Error message stating that the tag does not have a link is shown in the status message. -
Test case:
linkdelete 0
Expected: No link is deleted. Invalid command format error is shown in the status message due to non-positive index.
-
Task Commands
Adds a task
-
Adding a task to a tag while all tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. -
Test case:
taskadd 1 task/submit reflection
Expected: Task is added to the first tag in the list, with a cross beside it to indicate that the task is incomplete. Task details are shown in the status message. -
Test case:
taskadd 1
Expected: No task is added. Invalid command format error shown in the status message due to missingtask/TASK_NAMEfield. -
Test case:
taskadd 5 task/peer review
Expected: No task is added. Error message stating that index is invalid is shown in the status message.
-
Marks a task as done
-
Marking a task as done while all tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. For the following test cases, assume that the first tag has 1 task, while the other tags have none. -
Test case:
taskdone 1 a
Expected: The first task in the first tag in the list is marked as done. Cross changes to a tick to indicate that the task is completed. Task details are shown in the status message. -
Test case:
taskdone 1 a(repeating the same command)
Expected: Message stating that the task has already been completed is shown in the status message. -
Test case:
taskdone 1 b
Expected: No task is marked as done. Error message stating that the task index is invalid is shown in the status message. -
Test case:
taskdone 2 a
Expected: No task is marked as done. Error message stating that there are no tasks under the indicated tag is shown in the status message.
-
Deletes a task
-
Deleting a task from a tag while all the tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. For the following test cases, assume that the first tag has 1 task, while the other tags have none. -
Test case:
taskdelete 1 a
Expected: The first task in the first tag in the list is deleted. Details of deleted task is shown in the status message. -
Test case:
taskdelete 1 a(repeating the same command)
Expected: No task is deleted. Error message stating that there are no tasks under the indicated tag is shown in the status message. -
Test case:
taskdelete 2 a
Expected: No task is deleted. Error message stating that there are no tasks under the indicated tag is shown in the status message.
-
Clears completed tasks
-
Clearing the completed tasks from a tag while all the tags are being shown
-
Prerequisites: List all tags using the
taglistcommand. For the following test cases, assume that the first tag has 2 completed tasks, while the other tags have none. -
Test case:
taskclear 1
Expected: All the completed tasks in the first tag in the list are deleted. Success message is shown in the status message. -
Test case:
taskclear 1(repeating the same command)
Expected: Error message stating that there are no completed tasks under the indicated tag is shown in the status message. -
Test case:
taskdelete 2 a
Expected: Error message stating that there are no completed tasks under the indicated tag is shown in the status message.
-
Saves data
-
Dealing with missing/corrupted data files
-
If the data file is missing, the application will launch a window that is populated with the sample data. User can use the
clearcommand to get an empty projact window. Expected: Window with sample data -
If the data file is corrupted, users should delete the
projact.jsonfile in data folder. Relaunch the jar file again. Expected: Window with sample data
-