Developer Guide
- Acknowledgements
- Setting up, getting started
- Design
- Implementation
- Documentation, logging, testing, configuration, dev-ops
- Appendix: Requirements
-
Appendix: Instructions for manual testing
- Launch and shutdown
- Saving the data
- Adding a module
- Editing a module
- Deleting a module
- Adding a student
- Editing a student
- Deleting a student
- Finding a student
- Going to the homepage
- Adding a task
- Editing a task
- Deleting a task
- Marking a task as done
- Marking a task as undone
- Clearing all information
- Exiting the application
- Appendix: Effort
Acknowledgements
- This project is evolved from the AddressBook Level 3 (AB3), a desktop app for managing contacts, optimized for use via a Command Line Interface (CLI).
Setting up, getting started
Refer to the guide Setting up and getting started.
Design
.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.
Architecture
The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
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.
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 module m/CS2103
.
Each of the four main components (also shown in the diagram above),
- defines its API in an
interface
with the same name as the Component. - implements its functionality using a concrete
{Component Name}Manager
class (which follows the corresponding APIinterface
mentioned in the previous point.
For example, the Logic
component defines its API in the Logic.java
interface and implements its functionality using the LogicManager.java
class which follows the Logic
interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component’s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
The sections below give more details of each component.
UI component
The API of this component is specified in Ui.java
The UI consists of a MainWindow
that is made up of parts e.g.CommandBox
, ResultDisplay
, ModuleListPanel
, StatusBarFooter
etc. All these, including the MainWindow
, inherit from the abstract UiPart
class which captures the commonalities between classes that represent parts of the visible GUI.
The UI
component uses the 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
Logic
component. - listens for changes to
Model
data so that the UI can be updated with the modified data. - keeps a reference to the
Logic
component, because theUI
relies on theLogic
to execute commands. - depends on some classes in the
Model
component, as it displaysModule
object residing in theModel
.
Logic component
API : Logic.java
Here’s a (partial) class diagram of the Logic
component:
How the Logic
component works:
- When the
Logic
is called upon to executedelete module m/CS2103
, it uses theTeachingAssistantBuddyParser
class to parse the user command. - The
TeachingAssistantBuddyParser
parses the first command worddelete
, and pass the rest of the input to aDeleteCommandParser
. - The
DeleteCommandParser
then figures out the type of object to delete, in this case aModule
object as indicated bymodule
. - The
DeleteModuleCommandParser
will wrap the module name in aModuleName
object and pass it into aDeleteModuleCommand
. - This results in a
DeleteModuleCommand
object (which is a subclass ofDeleteCommand
), which is executed by theLogic Manager
.
- The
DeleteModuleCommand
communicates with theModel
when it is executed. - The
Model
will look for aModule
with the specifiedModuleName
and delete it. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Here are the other classes in Logic
(omitted from the class diagram above) that are used for parsing a user command:
How the parsing works:
- When called upon to parse a user command, the
TeachingAssistantBuddyParser
class creates anXYZTypeCommandParser
(XYZ
is a placeholder for the specific command name e.g.,Add
,Edit
.Type
is a placeholer for the type of object to be operated on e.g.,Module
,Student
orTask
) which uses the other classes shown above to parse the user command and create aXYZTypeCommand
object (e.g.,AddModuleCommand
) which theTeachingAssistantBuddyParser
returns back as aCommand
object. - All
XYZTypeCommandParser
classes (e.g.,AddModuleCommandParser
,DeleteModuleCommandParser
, …) inherit from theParser
interface so that they can be treated similarly where possible e.g, during testing.
Model component
API : Model.java
The Model
component,
- stores the Teaching Assistant Buddy data i.e., all
Module
objects (which are contained in aUniqueModuleList
object). - stores the currently ‘selected’
Module
objects which is exposed to outsiders as an unmodifiableObservableList<Module>
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.Module
also stores a unique student list and a filtered student list (used for example, when searching for a specificStudent
). EachStudent
has a unique task list. - stores a
UserPref
object that represents the user’s preferences. This is exposed to the outside as aReadOnlyUserPref
objects. - does not depend on any of the other three components (as the
Model
represents data entities of the domain, they should make sense on their own without depending on other components)
Storage component
API : Storage.java
The Storage
component,
- can save both teaching assistant buddy data and user preference data in json format, and read them back into corresponding objects.
- inherits from both
TeachingAssistantBuddy
andUserPrefStorage
, which means it can be treated as either one (if only the functionality of only one is needed). - depends on some classes in the
Model
component (because theStorage
component’s job is to save/retrieve objects that belong to theModel
)
Common classes
Classes used by multiple components are in the seedu.address.commons
package.
Implementation
This section describes some noteworthy details on how certain features are implemented.
Add Module
- When the
Logic
is called upon to executeadd module m/CS2103
, it uses theTeachingAssistantBuddyParser
class to parse the user command. - The
TeachingAssistantBuddyParser
parses the first command wordadd
, and pass the rest of the input to aAddCommandParser
. - The
AddCommandParser
then figures out the type of object to add, in this case aModule
object as indicated bymodule
. - The
AddModuleCommandParser
will wrap the module name in aModuleName
object and pass it into aAddModuleCommand
. - This results in a
AddModuleCommand
object (which is a subclass ofAddCommand
), which is executed by theLogic Manager
. - The
AddModuleCommand
communicates with theModel
when it is executed. - The
Model
will add a newModule
with the newModuleName
. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Edit Module
- When the
Logic
is called upon to executeedit module m/CS2103 mn/CS2105
, it uses theTeachingAssistantBuddyParser
class to parse the user command. - The
TeachingAssistantBuddyParser
parses the first command wordedit
, and pass the rest of the input to aEditCommandParser
. - The
EditCommandParser
then figures out the type of object to edit, in this case aModule
object as indicated bymodule
. - The
EditModuleCommandParser
will parse the tokensm/<old module name>
andmn/<new module name>
. -
EditModuleCommandParser
will also create aEditModuleCommand
and the module to edit, which is executed by theLogicManager
- The
EditModuleCommand
communicates with theModel
when it is executed. - The
EditModuleCommand
will look for aModule
with the specified name and edit the name after getting a list of modules fromModel
. - The
Model
will then cahnge the old module to the newly edited module. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Add Student
- When the
Logic
is called upon to executeadd student m/CS2103 i/A1234567A n/Amy bee t/@amybee e/amybee@gmail.com
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Add Module) - The
TeachingAssistantBuddyParser
parses the first command wordadd
, and pass the rest of the input to aAddCommandParser
. - The
AddCommandParser
then figures out the type of object to add, in this case aStudent
object as indicated bystudent
. - The
AddStudentCommandParser
will wrap the module name in aModuleName
object and the student’s information in aStudent
object and pass it into aAddStudentCommand
. - This results in a
AddStudentCommand
object (which is a subclass ofAddCommand
), which is executed by theLogic Manager
. - The
AddStudentCommand
communicates with theModel
when it is executed. - The
Model
will look for aModule
with the specifiedModuleName
. - The
Module
with the specifiedModuleName
will then add the newStudent
object to its student list. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Delete Student
- When the
Logic
is called upon to executedelete student m/CS2103 i/A1234567A
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Delete Module under Design > Logic component) - The
TeachingAssistantBuddyParser
parses the first command worddelete
, and pass the rest of the input to aDeleteCommandParser
. - The
DeleteCommandParser
then figures out the type of object to delete, in this case aStudent
object as indicated bystudent
. - The
DeleteStudentCommandParser
will wrap the module name in aModuleName
object and the student ID in aStudentId
object and pass them into aDeleteStudentCommand
. - This results in a
DeleteStudentCommand
object (which is a subclass ofDeleteCommand
), which is executed by theLogic Manager
. - The
DeleteStudentCommand
communicates with theModel
when it is executed. - The
Model
will look for aModule
with the specifiedModuleName
. - The
Module
with the specifiedModuleName
will then look for the student with the specifiedStudentId
and delete the student. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Edit Student
- When
Logic
is called upon to execute the user inputedit student m/CS2103 i/A1234567A n/Amy Lee
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Edit Module) -
TeachingAssistantBuddyParser
parses the first command wordedit
, and pass the rest of the input toEditCommandParser
. - The
EditCommandParser
then figures out the type of object to edit, in this case aStudent
object as indicated bystudent
. - The
EditStudentCommandParser
will then parse the tokens,m/CS2103
,i/A1234567A
andn/Amy Lee
in this case, to determine the moduleName (CS2103
in this case), and to create anEditStudentDescriptor
with the student IDA1234567A
and the nameAmy Lee
, and pass theseModuleName
andEditStudentDescriptor
objects into anEditStudentCommand
. - This results in a
EditStudentCommand
object (which is a subclass ofEditCommand
), which is executed by theLogic Manager
. - The
EditStudentCommand
communicates with theModel
when it is executed. - The
Model
will look for theStudent
with the specified student id,A1234567A
in this case, inside theModule
specified by the module name,CS2103
in this case, and then replacing the old editable fields (such as student name, tele handle and email) of thatStudent
using any optionally provided new fields. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Find Student
- When the
Logic
is called upon to executefind m/CS2103 i/A1234567A
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram under Design > Logic component) - The
TeachingAssistantBuddyParser
parses the first command wordfind
, and pass the rest of the input to aFindStudentCommandParser
. - The
FindStudentCommandParser
will wrap the module name in aModuleName
object and the student’s ID in aStudentId
object and pass it into aFindStudentCommand
. - This results in a
FindStudentCommand
object, which is executed by theLogic Manager
. - The
FindStudentCommand
communicates with theModel
when it is executed. - The
Model
will look for aModule
with the specifiedModuleName
. - The
Module
with the specifiedModuleName
will then look for theStudent
with the specifiedStudentId
and update the module’s filtered student’s list to only contain this specific student. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Add Task
- When
Logic
is called upon to execute the user inputadd task m/CS2103 ti/T1 a/assignment1 d/2021-10-20
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Add Module) -
TeachingAssistantBuddyParser
parses the first command wordadd
, and pass the rest of the input toAddCommandParser
. -
AddCommandParser
then figures out the type of object to add, in this case atask
object as indicated by the keywordtask
, and pass the rest of the arguments toAddTaskCommandParser
. -
AddTaskCommandParser
will create amoduleName
object, ataskName
object, and ataskDeadline
object based on the input arguments. They are then passed toAddTaskCommand
. - This results in a
AddTaskCommand
object (which is a subclass ofAddCommand
), which is executed by theLogic Manager
. - The
AddTaskCommand
communicates with theModel
when it is executed. - The
Model
will add a newTask
with the newtaskName
under theModule
with thatmoduleName
. TheTask
will also be added to all theStudent
s under the specifiedModule
. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Edit Task
- When
Logic
is called upon to execute the user inputedit task m/CS2103 ti/T1 a/final exam
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Edit Module) -
TeachingAssistantBuddyParser
parses the first command wordedit
, and pass the rest of the input toEditCommandParser
. - The
EditCommandParser
then figures out the type of object to edit, in this case aTask
object as indicated bytask
. - The
EditTaskCommandParser
will then parse the tokens,m/CS2103
andti/T1
in this case, to determine the module (CS2103
in this case), and the taskId (T1
in this case) of the task that is being edited, and pass the rest of the tokens toEditTaskCommand
. - The
EditTaskCommand
create anEditTaskDescriptor
object (defined in EditTaskCommand), using the givenmoduleName
object,taskId
object, and any other tokens passed fromEditTaskCommandParser
representing the newly updated fields of the task object. - This results in a
EditTaskCommand
object (which is a subclass ofEditCommand
), which is executed by theLogic Manager
. - The
EditTaskCommand
communicates with theModel
when it is executed. - The
EditTaskCommand
will get a list of modules fromModel
and look for the specifiedModule
. - The
EditTaskCommand
will look for theTask
with the specified task id,T1
in this case, for everyStudent
in the student list underModule
specified by the module name,CS2103
in this case, and replacing the old editable fields of (such as task name, task deadline) of thatTask
using any optionally provided new fields. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Delete Task
- When the
Logic
is called upon to executedelete task m/CS2103 ti/T1
, it uses theTeachingAssistantBuddyParser
class to parse the user command. (refer to the diagram for Delete Module under Design > Logic component) - The
TeachingAssistantBuddyParser
parses the first command worddelete
, and pass the rest of the input to aDeleteCommandParser
. - The
DeleteTaskCommandParser
then figures out the type of object to delete, in this case aTask
object as indicated bytask
. - The
DeleteStudentCommandParser
will wrap the module name in aModuleName
object and the task ID in aTaskId
object and pass them into aDeleteTaskCommand
. - This results in a
DeleteTaskCommand
object (which is a subclass ofDeleteCommand
), which is executed by theLogic Manager
. - The
DeleteTaskCommand
communicates with theModel
when it is executed. - The
DeleteTaskCommand
will get the current list of modules fromModel
, and look for the specifiedModule
. - The
Module
with the specifiedModuleName
will then look for the task with the specifiedTaskId
and delete the task. - The
Module
will also iterate through itsStudent
list and delete the specifiedTask
from all the students. - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
Documentation, logging, testing, configuration, dev-ops
Appendix: Requirements
Product scope
Target user profile:
- is a tutor overseeing students for an academic module or subject
- has a need to manage a moderate to large number of students
- prefer desktop apps over other types
- can type fast
- prefers typing to mouse interactions
- is reasonably comfortable using CLI apps
Value proposition: manage students’ academic progress faster than a typical mouse/GUI driven app
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 | add a student to a module | |
* * * |
new user | delete a student from a module | remove data that I no longer need |
* * * |
new user | edit a student’s information | change and update the student’s information easily |
* * * |
new user | get a student’s information | find and check a student’s progress easily |
* * * |
new user | create a new module | |
* * * |
new user | delete a module | remove data that I no longer need |
* * * |
new user | edit a module’s name | change and update the module’s name easily |
* * * |
new user | add task to a module | |
* * * |
new user | delete task from a module | remove data that I no longer need |
* * * |
new user | edit a task’s information | change and update information about the task easily |
* * * |
new user | mark a task as done | track my students’ progress |
* * * |
new user | mark a task as undone | track my students’ progress |
Use cases
(For all use cases below, the System is Teaching Assistant’s Buddy
and the Actor is the user
, unless specified otherwise)
Use case: Add a student to a module
MSS
- User requests to add a student to a module by listing down the module’s and student’s information
- System finds the module
-
System adds the student into the module’s student’s list
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student’s ID is already in the module student’s list.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Delete a student from a module
MSS
- User requests to delete a specific student from a module in system
- System finds the module
-
System deletes the student from the module
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student’s ID is not found in the module’s student’s list.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Edit a student’s information
MSS
- User requests to edit a specific student’s information in a module
- System finds the module
- System finds the student with the specified student ID
-
System edits the student’s information
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student’s ID is not found in the module’s student’s list.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Get a student’s information
MSS
- User requests to find a student in a module and get his/her information
- System finds the module
-
System finds the student and shows his/her information
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student is not found.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Create a new module
MSS
- User requests to create a new module in System
-
System creates the module
Use case ends.
Extensions
- 1a. Module is already in System.
-
1a1. System shows an error message.
Use case ends.
-
Use case: Delete a module
MSS
- User requests to delete a module in System
-
System deletes the module
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
Use case: Edit a module’s name
MSS
- User requests to edit a module’s name
- System finds the module
-
System edits the module’s name
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
Use case: Add task to a module
MSS
- User requests to add a task to a module in System
-
System adds the task to the module and its students
Use case ends.
Extensions
- 1a. Task is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Module is not found.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Delete task from a module
MSS
- User requests to delete a task from a module in System
-
System deletes the task from the module and its students
Use case ends.
Extensions
- 1a. Task is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Module is not found.
-
1b1. System shows an error message.
Use case ends.
-
Use case: Mark task as done
MSS
- User requests to mark a task of a student in a module as done
-
System marks the task as done
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student is not found.
-
1b1. System shows an error message.
Use case ends.
-
- 1c. Task is not found.
-
1c1. System shows an error message.
Use case ends.
-
Use case: Mark task as not done
MSS
- User requests to mark a task of a student in a module as not done
-
System marks the task as not done
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Student is not found.
-
1b1. System shows an error message.
Use case ends.
-
- 1c. Task is not found.
-
1c1. System shows an error message.
Use case ends.
-
Use case: Edit a task’s information
MSS
- User requests to edit a task’s information
- System finds the module and students that have the specified task
-
System edits the task’s information
Use case ends.
Extensions
- 1a. Module is not found.
-
1a1. System shows an error message.
Use case ends.
-
- 1b. Task is not found.
-
1b1. System shows an error message.
Use case ends.
-
Non-Functional Requirements
- Should work on any mainstream OS as long as it has Java
11
or above installed. - Should be able to respond to a user command within 2 seconds.
- 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.
- Should be able to handle up to 100 students without significant lag in response time.
Glossary
- Mainstream OS: Windows, Linux, Unix, OS-X
- Private contact detail: A contact detail that is not meant to be shared with others
- Module: An academic module or subject that is frequently found in universities and institutes of higher learning
Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
Launch and shutdown
-
Initial launch of the TAB application.
-
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 optimal.
-
-
Shutting down the TAB application.
- Close the application using the close button in the application window, or using the exit command as listed in a section below.
-
Dealing with missing/corrupted data files.
- When the data file is missing or not in the correct format, the application will be starting with an empty TeachingAssistantBuddy.
Saving the data
- TAB data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
Adding a module
-
Adding a module while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. TAB can be empty. -
Test case:
add module m/CS2105
Expected: TheModule
with the nameCS2105
is added to the list of modules. -
Test case:
add module m/ALREADY_EXISTING_MODULE
Expected: NoModule
is added. Error details shown in the status message. -
Other incorrect add module commands to try:
add module
,add subject
,...
Expected: Similar to previous.
-
Editing a module
-
Editing a module while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB. -
Test case:
edit module m/CS2100 mn/CS2106
Expected: TheModule
with the nameCS2100
is edited to have the nameCS2106
. -
Test case:
edit module m/NON_EXISTENT_MODULE mn/NEW_MODULE_NAME
Expected: NoModule
is deleted. Error details shown in the status message. -
Other incorrect edit module commands to try:
edit module
,edit lesson
,...
Expected: Similar to previous.
-
Deleting a module
-
Deleting a module while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB. -
Test case:
delete module m/CS2103
Expected: TheModule
with the nameCS2103
is deleted from the list of modules. -
Test case:
delete module m/NON_EXISTENT_MODULE
Expected: NoModule
is deleted. Error details shown in the status message. -
Other incorrect delete module commands to try:
delete module
,delete tutor
,...
Expected: Similar to previous.
-
Adding a student
-
Adding a student to a module while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB. -
Test case:
add student m/CS2103 i/A0123456A n/John Doe t/@johndoe e/john.doe@u.nus.edu
Expected: TheStudent
with the student idA0123456A
is added to theModule
CS2103
. -
Test case:
add student m/NON_EXISTENT_MODULE i/A0123456A n/John Doe t/@johndoe e/john.doe@u.nus.edu
Expected: NoStudent
is added. Error details shown in the status message. -
Other incorrect add student commands to try:
add student i/A0123456A n/John Doe
,add tutee m/CS2103 i/A0123456A
,...
Expected: Similar to previous.
-
Editing a student
-
Editing a student while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB and thatModule
has at least 1Student
. -
Test case:
edit student m/CS2103 i/A0123456A n/John Wick
Expected: TheStudent
inModule
CS2103
with the student idA0123456A
is edited to have the nameJohn Wick
. -
Test case:
edit student m/CS2103 i/NON_EXISTENT_STUDENT_ID n/Johnny English
Expected: NoStudent
is deleted. Error details shown in the status message. -
Other incorrect edit student commands to try:
edit student
,edit agent
,...
Expected: Similar to previous.
-
Deleting a student
-
Deleting a student while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB and thatModule
has at least 1Student
. -
Test case:
delete student m/CS2103 i/A0123456A
Expected: TheStudent
with the student idA0123456A
is deleted from theModule
CS2103
. -
Test case:
delete student m/NON_EXISTENT_STUDENT_ID
Expected: NoStudent
is deleted. Error details shown in the status message. -
Other incorrect delete student commands to try:
delete student
,delete person i/A0123456A
,...
Expected: Similar to previous.
-
Finding a student
-
Finding the information of a specific student in a specific module.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the list and thatModule
contains at least 1Student
. -
Test case:
find m/CS2103 i/A1234567A
Expected: TheStudent
with student idA1234567A
in theModule
CS2103
will be chosen and displayed in TAB. -
Test case:
find m/CS2103 i/NON_EXISTING_STUDENT_ID
Expected: NoStudent
will be chosen and displayed in TAB. Error details shown in the status message. -
Other incorrect find commands to try:
lookup
,search
,...
Expected: Similar to previous.
-
Going to the homepage
-
Going to the homepage of TAB from anywhere in the application.
-
Prerequisites: The TAB application is running.
-
Test case:
home
Expected: The home page of TAB will be shown, along with all the data currently in TAB. -
Other incorrect home commands to try:
list
,back
,...
Expected: Similar to previous.
-
Adding a task
-
Adding a task to a module (and all its students) while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB. The task will still be added if there are noStudent
s in theModule
, but the change will only be visible after aStudent
has been added. -
Test case:
add task m/CS2103 ti/T10 a/assignment1 d/2021-10-12
Expected: TheTask
with the task idT10
, nameassignment1
and the deadlineTue, Oct 12 2021
is added to theModule
CS2103
and all theStudents
in that module. -
Test case:
add task m/NON_EXISTENT_MODULE ti/T10 a/assignment1 d/2021-10-12
Expected: NoTask
is added. Error details shown in the status message. -
Other incorrect add task commands to try:
add task m/CS2103 a/task with no id
,add assignment
,...
Expected: Similar to previous.
-
Editing a task
-
Editing a task of a module (and all its students) while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB and thatModule
has at least 1Task
. The task will still be edited if there are noStudent
s in theModule
, but the change will only be visible after aStudent
has been added. -
Test case:
edit task m/CS2103 ti/T10 a/Final exam d/2021-11-23
Expected: TheTask
inModule
CS2103
with the task idT10
is edited to have the nameFinal exam
and deadlineTue, Nov 23 2021
. -
Test case:
edit task m/CS2103 ti/NON_EXISTENT_TASK_ID a/Practical exam
Expected: NoTask
is deleted. Error details shown in the status message. -
Other incorrect edit task commands to try:
edit exam
,edit task m/NON_EXISTENT_MODULE
,...
Expected: Similar to previous.
-
Deleting a task
-
Deleting a task from a module (and from all its students) while all modules are being shown.
-
Prerequisites: List all modules using the
home
command. At least 1Module
is in the TAB and thatModule
has at lest 1Task
. The task will still be deleted if there are noStudent
s in theModule
, but the change will only be visible after aStudent
has been added. -
Test case:
delete task m/CS2103 ti/T1
Expected: TheTask
with the task idT1
is deleted from theModule
CS2103
. -
Test case:
delete task m/NON_EXISTENT_MODULE
Expected: NoTask
is deleted. Error details shown in the status message. -
Other incorrect delete task commands to try:
delete assignment
,delete task m/CS2103 i/NON_EXISTENT_TASK_ID
,...
Expected: Similar to previous.
-
Marking a task as done
-
Marking a task from a student in a particular module as done (
Completed
).-
Prerequisites: List all modules using the
home
command. TheTask
being marked done must belong to aStudent
in aModule
in TAB and theTask
must beIncomplete
. -
Test case:
mark done m/CS2103 i/A1234567A ti/T1
Expected: TheTask
with the task idT1
is marked asCompleted
forStudent
with student idA1234567A
ofModule
CS2103
. -
Test case:
mark done m/CS2103 i/A1234567A ti/T1
(again, after the task is already marked asCompleted
)
Expected: NoTask
is marked asCompleted
. Error details shown in the status message. -
Other incorrect mark done commands to try:
mark finished
,mark done m/NON_EXISTENT_MODULE i/NON_EXISTENT_STUDENT_ID ti/NON_EXISTENT_TASK_ID
,...
Expected: Similar to previous.
-
Marking a task as undone
-
Marking a task from a student in a particular module as undone (
Incomplete
).-
Prerequisites: List all modules using the
home
command. TheTask
being marked undone must belong to aStudent
in aModule
in TAB and theTask
must beCompleted
. -
Test case:
mark undone m/CS2103 i/A1234567A ti/T1
Expected: TheTask
with the task idT1
is marked asIncomplete
forStudent
with student idA1234567A
ofModule
CS2103
. -
Test case:
mark undone m/CS2103 i/A1234567A ti/T1
(again, after the task is already marked asIncomplete
)
Expected: NoTask
is marked asCompleted
. Error details shown in the status message. -
Other incorrect mark undone commands to try:
mark unfinished
,mark undone m/NON_EXISTENT_MODULE i/NON_EXISTENT_STUDENT_ID ti/NON_EXISTENT_TASK_ID
,...
Expected: Similar to previous.
-
Clearing all information
-
Clearing all information from TAB using the
clear
command.-
Prerequisites: The TAB application is running.
-
Test case:
clear
Expected: All information in TAB will be cleared. If TAB has no information, the successful status message will still be shown. -
Other incorrect clear commands to try:
reset
,refresh
,...
Expected: Similar to previous.
-
Exiting the application
-
Exiting the application using the
exit
command.-
Prerequisites: The TAB application is running.
-
Test case:
exit
Expected: The TAB application will exit. -
Other incorrect exit commands to try:
bye
,quit
,logout
,...
Expected: The TAB application will not exit. Error details shown in ths status message
-
Appendix: Effort
With AB3 as the baseline of comparison, our project is much more demanding. AB3, as an address book application that manages contact details, has only one model which is a Person. For our project which is building a helper for teaching assistants, there are three models, namely, Modules, Students, and Tasks.
This created some problems when we were designing the UI, including how to arrange these three types of objects, and what their relationship would be. A meeting was held, during which we used Miro to come up with wireframes and prototypes and conducted discussions to finalise our design. Although it was harder to manage more than one type of object, we all embraced this challenge and successfully rendered a working product.
Another challenge we faced was more specific. When we added in students and tasks to TAB, tasks under some students were not shown. And this bug was inconsistent - sometimes we could not reproduce it even when following the exact steps. We initially considered it as a UI bug and wasn’t sure how to go about solving it. But we did not give up and leave it unattended. After much effort, one of us discovered that these missing tasks were not added to their corresponding students in time. Following this lead, another team member located to code that was causing this issue and fixed it. With hard work and perseverance, we managed to solve something previously thought of as unsolvable.
Other challenges we had included dealing with testing and storage. For many of us, this was the first time handling these aspects of coding. It was not easy, especially for those members who volunteered as trailblazers and set the standard for writing test cases and storage-related logic. Kudos to them!
Overall, this project posed many difficulties and challenges that we had to overcome. To many of us, this was the first collaborative software engineering project that involved facets that were once unfamiliar, such as testing, UI and storage. It would be an understatement to say that it was not easy. Nevertheless, we, together as a team, rose above all these obstacles and passed this trial of diligence, determination, resourcefulness, and teamwork.