From e43f36ee30925772a78c68ecbcf9e414235972e2 Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 00:38:30 +0800 Subject: [PATCH 1/7] Add implementation of stats to DG --- docs/DeveloperGuide.md | 44 +++++++++-- docs/diagrams/CompStatsAcitivityDiagram.png | Bin 0 -> 14893 bytes docs/diagrams/CompStatsAcitivityDiagram.puml | 17 ++++ .../CompStatsCommandSequenceDiagram.png | Bin 0 -> 40944 bytes .../CompStatsCommandSequenceDiagram.puml | 73 ++++++++++++++++++ docs/diagrams/SortScoreAcitivityDiagram.png | Bin 16597 -> 19458 bytes docs/diagrams/SortScoreAcitivityDiagram.puml | 3 +- 7 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 docs/diagrams/CompStatsAcitivityDiagram.png create mode 100644 docs/diagrams/CompStatsAcitivityDiagram.puml create mode 100644 docs/diagrams/CompStatsCommandSequenceDiagram.png create mode 100644 docs/diagrams/CompStatsCommandSequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8ba5ee576c5..9e02861b0b7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -187,13 +187,13 @@ This section describes some noteworthy details on how certain features are imple ### Sort Commands -The Sort related feature allows NUS professors to sort the currently displayed students or student scores. When successfully executed, the sorted students or student scores will be shown on the Graphical User Interface.
+The Sort related features allows NUS professors to sort the currently displayed students or student scores. When successfully executed, the sorted students or student scores will be shown on the Graphical User Interface.
-We will discuss the implementation of sortScore (Sort Student Scores) command here and omit the discussion of the implementation of sortStu command since it is very similar to sortScore command and simpler. +We will discuss the implementation of `sortScore` (Sort Student Scores) command here and omit the discussion of the implementation of `sortStu` command since it is very similar to `sortScore` command and simpler. #### Implementation -The `sortScoreCommand` (Sort Student Scores) mechanism is facilitated by GradedComponentBook, StudentBook and StudentScoreBook. It implements the following operations: +The `sortScore` mechanism is facilitated by GradedComponentBook, StudentBook and StudentScoreBook. It implements the following operations: * `GradedComponentBook#hasGc(GcName gcName)` - Returns true if a graded component is already created and in the graded component list. * `studentScoreBook.sortStudentScore(Boolean isReverse)` - Filters the student scores with the given graded component and sort them according to the given reverse order. @@ -217,8 +217,42 @@ The following sequence diagram shows how the sort student scores operation works -The following activity diagram summarizes what happens when a user executes a new sortScore command:
- +The following activity diagram summarizes what happens when a user executes a new `sortScore` command:
+ + +### Stats Commands + +The Stats related features allows NUS professors to calculate the statistics of student scores effectively. When successfully executed, the relevant statistics will be shown in the result display box of Graphical User Interface.
+ +We will discuss the implementation of `compStats` (calculate the statistics for a specific graded component) command here and omit the discussion of the implementation of `stats` command since it is very similar to `compStats` command and simpler. + +#### Implementation + +The `compStats` mechanism is facilitated by GradedComponentBook, StudentBook and StudentScoreBook. It implements the following operations: + +* `GradedComponentBook#hasGc(GcName gcName)` - Returns true if a graded component is already created and in the graded component list. +* `studentBook.getStudentList()` - Returns the stored list of students. +* `compStatsCommand.generateOverallStatsSummary(List students)` - Returns a string represented all the relevant statistics. +* `statsCalculator` - A class that helps calculate different types of statistical measures. + +Given below is an example usage scenario and how the `compStats` mechanism behaves at each step. + +Step 1. The user executes `compStats c/Midterm` command to calculate the statistics of student scores of Midterm. The `compStats` command calls CompStatsCommandParser#parse() which parses the string keyed into the command line of the GUI. + +Step 2. `CompStatsCommandParser#parse()` invokes the creation of a `CompStatsCommand` object. +> **Note**: If a command fails its execution due to incorrect command format, it will not create a `CompStatsCommand` object, an error message will be displayed and user will retype their command. + +Step 4. Upon creation and execution of `CompStatsCommand` object, `GradedComponentBook#hasGc(GcName gcName)`, `studentBook.getStudentList()` and `compStatsCommand.generateOverallStatsSummary(List students)` methods are called. +> **Note**: If upon invoking `GradedComponentBook#hasGc(GcName gcName)` method and return value is false, it will throw an error and will not call the remaining two methods, so statistics will not be calculated and displayed. + +Step 5. After successfully calculating the statistics, a `CommandResult` object will be created to show the calculated statistics. + +The following sequence diagram shows how the `compStats` operation works:
+ + + +The following activity diagram summarizes what happens when a user executes a new `compStats` command:
+ ### Auto-grading diff --git a/docs/diagrams/CompStatsAcitivityDiagram.png b/docs/diagrams/CompStatsAcitivityDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..dc36742a3c76aa3fe33a41732f0cced2cd6dc68b GIT binary patch literal 14893 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/CompStatsAcitivityDiagram.puml b/docs/diagrams/CompStatsAcitivityDiagram.puml new file mode 100644 index 00000000000..0fbe6e9db1b --- /dev/null +++ b/docs/diagrams/CompStatsAcitivityDiagram.puml @@ -0,0 +1,17 @@ +@startuml +'https://plantuml.com/activity-diagram-beta + +start +:User executes compStats command; +if () then ([given graded component exists\nand there is at least a valid score]) + :all relevant statistics calculated; + :a summary of all statistics displayed; +else ([else]) + :a error message shows up; +endif + +:Execution completed; + +stop + +@enduml diff --git a/docs/diagrams/CompStatsCommandSequenceDiagram.png b/docs/diagrams/CompStatsCommandSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1daf7204d5433727bf6822ea34ff1520bdd668 GIT binary patch literal 40944 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 literal 0 HcmV?d00001 diff --git a/docs/diagrams/CompStatsCommandSequenceDiagram.puml b/docs/diagrams/CompStatsCommandSequenceDiagram.puml new file mode 100644 index 00000000000..6cec05e91c2 --- /dev/null +++ b/docs/diagrams/CompStatsCommandSequenceDiagram.puml @@ -0,0 +1,73 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ModuLightParser" as ModuLightParser LOGIC_COLOR +participant ":CompStatsCommandParser" as CompStatsCommandParser LOGIC_COLOR +participant "a:CompStatsCommand" as CompStatsCommand LOGIC_COLOR +participant ":StatsCalculator" as StatsCalculator LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box +[-> LogicManager : execute(compStats c/Midterm) +activate LogicManager + +LogicManager -> ModuLightParser : parseCommand(compStats c/Midterm) +activate ModuLightParser + +create CompStatsCommandParser +ModuLightParser -> CompStatsCommandParser :CompStatsCommandParser() +activate CompStatsCommandParser + +CompStatsCommandParser --> ModuLightParser +deactivate CompStatsCommandParser + +ModuLightParser -> CompStatsCommandParser : parse(" c/Midterm") +activate CompStatsCommandParser + +create CompStatsCommand +CompStatsCommandParser -> CompStatsCommand +activate CompStatsCommand + +CompStatsCommand --> CompStatsCommandParser : c +deactivate CompStatsCommand + +CompStatsCommandParser --> ModuLightParser : c +deactivate CompStatsCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +CompStatsCommandParser -[hidden]-> ModuLightParser +destroy CompStatsCommandParser + +ModuLightParser --> LogicManager : c +deactivate ModuLightParser + +LogicManager -> CompStatsCommand : execute() +activate CompStatsCommand + +CompStatsCommand -> Model : getStudentList() +activate Model + +Model --> CompStatsCommand +deactivate Model + +create StatsCalculator +CompStatsCommand ->StatsCalculator : generateOverallStatsSummary(List students) +activate StatsCalculator + + +StatsCalculator --> CompStatsCommand +deactivate StatsCalculator +StatsCalculator -[hidden]-> CompStatsCommand +destroy StatsCalculator + +CompStatsCommand --> LogicManager : result +deactivate CompStatsCommand +CompStatsCommand -[hidden]-> LogicManager : result +destroy CompStatsCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/SortScoreAcitivityDiagram.png b/docs/diagrams/SortScoreAcitivityDiagram.png index 94fecbb7d4edf5ab0d97ea2b547802f8f49f1c03..17a81a0e981982f0d4dc8d2cb0288ae314b74d5f 100644 GIT binary patch literal 19458 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 MN>Q>z+{o|$00bYlTL1t6 literal 16597 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 O9>}Z7y}N4~^nU>8hDoph diff --git a/docs/diagrams/SortScoreAcitivityDiagram.puml b/docs/diagrams/SortScoreAcitivityDiagram.puml index 72c56442ae3..dbf70e7441b 100644 --- a/docs/diagrams/SortScoreAcitivityDiagram.puml +++ b/docs/diagrams/SortScoreAcitivityDiagram.puml @@ -6,12 +6,13 @@ start if () then ([given graded component exists]) :student scores filtered and sorted; :students sorted accordingly; + :Updated students and student scores list saved to ModuLight; else ([else]) :a error message shows up; :user retypes the command; endif -:Updated students and student scores list saved to ModuLight; +: execution completed; stop From 0cf88f738fce8fff9086b541d6598261ed097d20 Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 00:50:27 +0800 Subject: [PATCH 2/7] Update UG --- docs/UserGuide.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4569e729018..0f1fc90d354 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -344,9 +344,16 @@ Sorts students' data by the given criteria. Format: `sortStu [o/SORTING_ORDER] [r/REVERSE_ORDER]` -* The sorting order keyword must be one of the acceptable description given below:
"n", - "name", "s", "studentId", "studentID", "e", "email", "g", "tutorial", "tut", - "tutGroup", "ts", "totalScore", "totalscore", "score". +* The sorting order keyword must be one of the acceptable description given below:
+ +| Accepted keywords | Field to be sorted | Description | +|------------------------------------|--------------------|-----------------------------------------------------| +| `n`, `name` | `n/` | Name of the student by alphabetical order | +| `s`, `studentId`, `studentID` | `s/` | Student ID of the student by alphabetical order | +| `e`, `email` | `e/` | Email of the student by alphabetical order | +| `g`, `tutorial`, `tut`, `tutGroup` | `g/` | Tutorial group of the student by alphabetical order | +| `ts`, `totalScore`, `score` | NIL | Total score of the student by numerical value | + * The reverse order keyword must be one of the acceptable description given below:
"decreasing", "0", "false", "f" (These 4 keywords have the same effect), "increasing", "1", "true", "t" (These 4 keywords have the same effect). From 0b48a65ac6dc6697cda00a6ddf28238032dc1193 Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 00:53:23 +0800 Subject: [PATCH 3/7] Update UG --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0f1fc90d354..0665c5d5406 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -428,7 +428,7 @@ Format: `stats [st/STATS] [g/TUTORIAL_GRP]` * It is allowed to omit `[st/STATS]`. In this case, it will return a summary of all statistics that are currently supported. * For stats keywords, it must be currently supported. Here is an exhaustive list of currently supported statistical -measures: mean, standardDeviation, upperQuartile, lowerQuartile, max, min, skewness. +measures: `mean`, `standardDeviation`, `upperQuartile`, `lowerQuartile`, `max`, `min`, `skewness`. * For the calculation of upper and lower quartile, we use Method 4 introduced in [Wikipedia](https://en.wikipedia.org/wiki/Quartile). * If there is only valid score matching the criteria, skewness will be displayed as `NaN` because skewness for one data is meaningless. @@ -448,7 +448,7 @@ Format: `compStats c/COMP_NAME [st/STATS] [g/TUTORIAL_GRP]` * It is allowed to omit `[st/STATS]`. In this case, it will return a summary of all statistics that are currently supported. * For stats keywords, it must be currently supported. Here is an exhaustive list of currently supported statistical - measures: mean, standardDeviation, upperQuartile, lowerQuartile, max, min, skewness. + measures: `mean`, `standardDeviation`, `upperQuartile`, `lowerQuartile`, `max`, `min`, `skewness`. * For the calculation of upper and lower quartile, we use Method 4 introduced in [Wikipedia](https://en.wikipedia.org/wiki/Quartile). * If there is only valid score matching the criteria, skewness will be displayed as `NaN` because skewness for one data From be6a7e4c97cef817b66e5b69feb167f8f0ed10fc Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 01:02:02 +0800 Subject: [PATCH 4/7] Update UG --- docs/UserGuide.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0665c5d5406..640b545c5df 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -109,16 +109,16 @@ The following section gives an overview of the parameters used for the commands -> **Note**: Graded Component and Student Score parameters for score calculation -> -> * The maximum marks of a graded component and marks of a student score are both **absolute values** and are used together to + **Note**: Graded Component and Student Score parameters for score calculation + + * The maximum marks of a graded component and marks of a student score are both **absolute values** and are used together to determine the relative performance of a student for a component.
For instance, if the maximum marks for a component Midterms is 50, and the marks for the student is 35, then the student scored 35/50 =70% on this graded component. -> * The weightage of a graded component is used to determine its contribution to a student’s overall score, and is calculated + * The weightage of a graded component is used to determine its contribution to a student’s overall score, and is calculated **relative to the sum of all other component weightages**.
For instance, if there are only 2 components in the system currently, and component A has weightage 30, and component B weightage 20, then component A currently represents 20/(20+30) = 60% of the student’s overall score. This is modified as components are added and removed.
Note that the **total weightage of all graded components should be less than or equal to 100**. -> * If a graded component has a maximum mark of 0, the relative score for any associated student scores will be 0. -> * If a student or graded component has no associated student scores, the average mark will be listed as 0. + * If a graded component has a maximum mark of 0, the relative score for any associated student scores will be 0. + * If a student or graded component has no associated student scores, the average mark will be listed as 0.
From 6d7effdb354244ea15a233bfb5c9fb8cfc449a3e Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 01:12:52 +0800 Subject: [PATCH 5/7] Update PPP --- docs/team/siqirua.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/team/siqirua.md b/docs/team/siqirua.md index 06e20f17a51..ecaf02af179 100644 --- a/docs/team/siqirua.md +++ b/docs/team/siqirua.md @@ -10,20 +10,20 @@ The user interacts with it using a CLI, and it has a GUI created with JavaFX. It Given below are my contributions to the project. -* **New Feature**: `calculate statistics` - Added command to calculate the statistics. +* **New Feature**: `calculate statistics` - Added command to calculate the statistics [76](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/76), [#86](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/86). * What it does: Generates a statistics summary of the overall grades of all students or a selected tutorial group * Justification: As a professor or teaching assistant, our target users may be interested in the overall performance of all students in terms of various statistical measures, such as max, min, quartile and standard deviation. This command allows the user to easily view a summary of statistics with one single command. In addition, I also implemented the command to calculate the statistics of a specific graded component instead of the overall score. -* **New Feature**: `sort students` - Added command to sort the students. +* **New Feature**: `sort students` - Added command to sort the students [#69](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/69). * What it does: Sorts the students based on a given sorting order. * Justification: When the number of student grows, it will be hard for our users to find the top performing students. Thus, we implement this command to allow our users to quickly identify the top students. In addition, this command is also necessary to make the displayed data more neat. -* **New Feature**: `sort scores` - Added command to sort the student scores. +* **New Feature**: `sort scores` - Added command to sort the student scores [#88](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/88). * What it does: Sorts the students scores of a given graded component and display the associated students in the corresponding order. * Justification: Similar to the previous feature, when the number of student scores grows, it will be hard for our @@ -32,19 +32,19 @@ Given below are my contributions to the project. corresponding order. In addition, this command is also necessary to make the displayed data more neat. * **Enhancements to existing features**: -* Did cosmetic tweaks to the existing `help` features +* Did cosmetic tweaks to the existing `help` features [#142](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/142) * **Code contributed**: * Please refer to this [RepoSense Link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=siqirua&breakdown=true) * **Documentation**: * User Guide: - * Added documentation for the features `findStu`, `stats`, `compStats`, `sortStu`, `sortScore` - * Added documentation for the parameters `o/`, `r/`, `st/` + * Added documentation for the features `findStu`, `stats`, `compStats`, `sortStu`, `sortScore` [#11](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/11), [#90](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/90) + * Added documentation for the parameters `o/`, `r/`, `st/` [#163](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/163) * Developer Guide: - * Added use cases, non-functional requirements and glossary sections. - * Created UML diagrams for most parts - * Did cosmetic tweaks to the proposed `Redo`/`Undo` features + * Added use cases, non-functional requirements and glossary sections [#10](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/10). + * Created UML diagrams for most parts [#162](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/162) + * Did cosmetic tweaks to the proposed `Redo`/`Undo` features [#169](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/169) * **Contributions to team-based tasks**: * Renamed the package, method name and class name from address book related to modulight related From 74c5b970a9e2cb813c4ae3101212f29a1a765096 Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 01:15:08 +0800 Subject: [PATCH 6/7] Update PPP --- docs/team/siqirua.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/team/siqirua.md b/docs/team/siqirua.md index ecaf02af179..cdc86deb149 100644 --- a/docs/team/siqirua.md +++ b/docs/team/siqirua.md @@ -45,6 +45,7 @@ Given below are my contributions to the project. * Added use cases, non-functional requirements and glossary sections [#10](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/10). * Created UML diagrams for most parts [#162](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/162) * Did cosmetic tweaks to the proposed `Redo`/`Undo` features [#169](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/169) + * Add Implementations of sort related commands and stats related command [#188](https://github.com/AY2324S1-CS2103T-W08-2/tp/pull/188) * **Contributions to team-based tasks**: * Renamed the package, method name and class name from address book related to modulight related From a82e9cbf7574b1788e39972ee4e46d93bcb8a6d0 Mon Sep 17 00:00:00 2001 From: Li Siqi Date: Tue, 14 Nov 2023 01:35:56 +0800 Subject: [PATCH 7/7] Add some manual testing information --- docs/DeveloperGuide.md | 64 +++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c6f11f11e84..4a6279e253e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -718,28 +718,60 @@ testers are expected to do more *exploratory* testing. 1. Prerequisites: List all students using the `listAll` command. Multiple students in the list. - 1. Test case: `deleteStu 1`
- Expected: First student is deleted from the student list. All related scores are deleted from the score list. Details of the deleted student shown in the status message. Timestamp in the status bar is updated. + 1. Test case: `deleteStu 1`
+ Expected: First student is deleted from the student list. All related scores are deleted from the score list. Details of the deleted student shown in the status message. Timestamp in the status bar is updated. - 1. Test case: `deleteStu 0`
- Expected: No student is deleted. Error details shown in the status message. Status bar remains the same. + 1. Test case: `deleteStu 0`
+ Expected: No student is deleted. Error details shown in the status message. Status bar remains the same. - 1. Other incorrect delete commands to try: `deleteStu`, `deleteStu x`, `...` (where x is larger than the list size)
- Expected: Similar to previous. - -1. _{ more test cases …​ }_ + 1. Other incorrect delete commands to try: `deleteStu`, `deleteStu x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous. ### Finding a student 1. Find a student in ModuLight 1. Prerequisite: student list is not empty. - 1. Test case: `findStu g/T00` - Expected: All students from tutorial group `T00` will be displayed. All graded components and all scores related to the displayed students should be displayed. - 1. Test case: `findStu` - Expected: Since there is no search words given, all students, student scores and graded components will be displayed. - 2. Test case: `findStu n/John n/Amy` - Expected: All students whose name contains `John` or `Amy` (case-insensitive) will be displayed. All graded components and all scores related to the displayed students should be displayed. - 3. Test case: `findStu n/John g/T00` - Expected: All students whose name contains `John` (case-insensitive) and is from `T00` will be displayed. All graded components and all scores related to the displayed students should be displayed. + 1. Test case: `findStu g/T00` + Expected: All students from tutorial group `T00` will be displayed. All graded components and all scores related to the displayed students should be displayed. + 1. Test case: `findStu` + Expected: Since there is no search words given, all students, student scores and graded components will be displayed. + 2. Test case: `findStu n/John n/Amy` + Expected: All students whose name contains `John` or `Amy` (case-insensitive) will be displayed. All graded components and all scores related to the displayed students should be displayed. + 3. Test case: `findStu n/John g/T00` + Expected: All students whose name contains `John` (case-insensitive) and is from `T00` will be displayed. All graded components and all scores related to the displayed students should be displayed. + +### Sorting Students +1. Sort students in ModuLight + 1. Prerequisite: displayed student list is not empty. + 2. Test case: `sortStu` + Expected: The displayed students are sorted by their total scores. + 3. Test case: `sortStu o/n r/t` + Expected: The displayed students are sorted by their names in the reverse alphabetical order. + 4. Test case: `sortStu o/wrongInput` + Expected: An error message that states "Invalid command format!" and the correct usage is shown. + +### Sorting Student Scores +1. Sort student scores in ModuLight + 1. Prerequisite: displayed student list and student score list are not empty and a graded component with name "Midterm" is created. + 2. Test case: `sortScore c/Midterm` + Expected: Only Midterm student scores are shown and they are sorted in the ascending order. + 3. Test case: `sortScore c/Final` (Assuming there is no such graded component with name "Final") + Expected: An error message that states "This graded component is not created. Please check if the information is correct" is shown. + + +### Calculating Statistics +1. Calculate overall statistics of students' total scores + 1. Prerequisite: student list and student score list are not empty and there is at least a valid score in Tut `T01`. + 1. Test case: `stats` + Expected: A message that states all relevant statistical measures (The exhausitive list can be found in [UG](https://ay2324s1-cs2103t-w08-2.github.io/tp/UserGuide.html#calculating-overall-statistics-stats)) are shown. + 2. Test case: `stats st/max st/min` + Expected: A message that states the max and min is shown. + 3. Test case: `stats g/T01` + Expected: A message that states all relevant statistical measures of Tut `T01` is shown. + 4. Test case: `stats st/wrongInput` + Expected: An error message that states "Some statistic measures are not supported yet." and all supported statistical measures are shown. + 2. Prerequisite: student score list is empty + 1. Test case: `stats` + Expected: An error message that state "Please have at least one score fulfilling the condition." is shown. ### Saving data