diff --git a/build.gradle b/build.gradle
index 30aece18c7e..431a38c4019 100644
--- a/build.gradle
+++ b/build.gradle
@@ -70,7 +70,7 @@ dependencies {
}
shadowJar {
- archiveFileName = 'addressbook.jar'
+ archiveFileName = 'studentmanagerpro.jar'
}
defaultTasks 'clean', 'test'
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index e05a619989f..01f4f154514 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -121,6 +121,7 @@ Format: `filter [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [c/CLASS] [s/SEX
* The search is case-insensitive. e.g `hans` will match `Hans`
* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`
+* Only the name is searched.
* Only full words will be matched e.g. `Han` will not match `Hans`
* Persons matching at least one keyword will be returned (i.e. `OR` search).
e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`
@@ -267,6 +268,25 @@ Examples:
* `addSubmissionStatus 1 sm/Assignment 1 ss/T`
* `addSubmissionStatus 1 sm/Tutorial 2 ss/NIL`
+### Sorting the list : `sort`
+
+Sorts the list of students based on the students attributes.
+
+Format: `sort [ATTRIBUTE]`
+
+
+
+**Tip:** Students attributes include: name, phone, email, address, sex, register number, student class, emergency contact name, emergency contact number.
+
+
+* Sorts the list based on the ATTRIBUTE
+* Unsort the list when the attribute is `none`
+
+Examples:
+* `sort name` to sort the list based on student's names
+* `sort register number` to sort the list based on student's register numbers
+* `sort none` to unsort the list
+
### Clearing all entries : `clear`
Clears all entries from the address book.
@@ -332,3 +352,4 @@ _Details coming soon ..._
| **Add Attendance** | `addAttendance INDEX aa/[DATE] ar/[REASON]`
e.g., `addAttendance 1 aa/[24-09-2024] ar/[Sick]` |
| **AddSubmission** | `addSubmission sm/SUBMISSION_NAME`
e.g., `addSubmission sm/Assignment 1` |
| **AddSubmissionStatus** | `addSubmissionStatus INDEX sm/SUBMISSION_NAME ss/SUBMISSION_STATUS`
e.g., `addSubmissionStatus 1 sm/Assignment 1 ss/T` |
+| **Sort** | `sort [ATTRIBUTE]`
e.g., `sort student class`
diff --git a/src/main/java/seedu/address/logic/commands/FilterCommand.java b/src/main/java/seedu/address/logic/commands/FilterCommand.java
index 607c7ab00f6..24bd052ed5c 100644
--- a/src/main/java/seedu/address/logic/commands/FilterCommand.java
+++ b/src/main/java/seedu/address/logic/commands/FilterCommand.java
@@ -36,7 +36,7 @@ public class FilterCommand extends Command {
+ "[" + PREFIX_ECNAME + "EMERGENCY CONTACT NAME] "
+ "[" + PREFIX_ECNUMBER + "EMERGENCY CONTACT NUMBER] "
+ "[" + PREFIX_TAG + "TAG]...\n"
- + "Example: " + COMMAND_WORD + PREFIX_NAME + "Bob "
+ + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "Bob "
+ PREFIX_PHONE + "90123445";
private final PersonPredicate predicate;
diff --git a/src/main/java/seedu/address/logic/commands/SortCommand.java b/src/main/java/seedu/address/logic/commands/SortCommand.java
new file mode 100644
index 00000000000..1edf49912b2
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/SortCommand.java
@@ -0,0 +1,116 @@
+package seedu.address.logic.commands;
+
+import static java.util.Objects.isNull;
+import static java.util.Objects.requireNonNull;
+
+import java.util.Comparator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import seedu.address.commons.core.LogsCenter;
+import seedu.address.logic.parser.ParserUtil.SortAttribute;
+import seedu.address.model.Model;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.comparator.AddressCompare;
+import seedu.address.model.person.comparator.EcNameCompare;
+import seedu.address.model.person.comparator.EcNumberCompare;
+import seedu.address.model.person.comparator.EmailCompare;
+import seedu.address.model.person.comparator.NameCompare;
+import seedu.address.model.person.comparator.PhoneCompare;
+import seedu.address.model.person.comparator.RegisterNumberCompare;
+import seedu.address.model.person.comparator.SexCompare;
+import seedu.address.model.person.comparator.StudentClassCompare;
+
+/**
+ * Sorts the list of contacts based on the attribute
+ */
+public class SortCommand extends Command {
+
+ public static final String COMMAND_WORD = "sort";
+
+ public static final String MESSAGE_USAGE = COMMAND_WORD + ": Sorts the list based on the attribute\n"
+ + "Attributes: name, phone, email, address, register number, sex, \n"
+ + "student class, emergency contact name, emergency contact number";
+
+ public static final String MESSAGE_SORTED_SUCCESS = "Sorted the list based on %1$s";
+ public static final String MESSAGE_UNSORTED_SUCCESS = "Your list is now unsorted and back to the original!";
+ private static final Logger logger = LogsCenter.getLogger(SortCommand.class);
+ private final SortAttribute sortAttribute;
+ private Comparator comparator;
+
+
+ /**
+ * @param sortAttribute attribute to sort the persons in the list
+ */
+ public SortCommand(SortAttribute sortAttribute) {
+ requireNonNull(sortAttribute);
+ this.sortAttribute = sortAttribute;
+ }
+
+ @Override
+ public CommandResult execute(Model model) {
+ requireNonNull(model);
+ this.comparator = this.getComparator();
+ model.sortFilteredPersonList(this.comparator);
+ logger.log(Level.INFO, "SortCommand has been executed");
+ return new CommandResult(this.generateSuccessMessage());
+ }
+
+
+ public String generateSuccessMessage() {
+ return isNull(comparator) ? MESSAGE_UNSORTED_SUCCESS : String.format(MESSAGE_SORTED_SUCCESS, sortAttribute);
+ }
+ /**
+ * Retrieves the comparator needed to sort the list.
+ * Returns null to unsort.
+ */
+ public Comparator getComparator() {
+ assert sortAttribute != null;
+ switch (sortAttribute) {
+
+ case NAME:
+ return new NameCompare();
+
+ case PHONE:
+ return new PhoneCompare();
+
+ case EMAIL:
+ return new EmailCompare();
+
+ case ADDRESS:
+ return new AddressCompare();
+
+ case REGISTERNUMBER:
+ return new RegisterNumberCompare();
+
+ case SEX:
+ return new SexCompare();
+
+ case STUDENTCLASS:
+ return new StudentClassCompare();
+
+ case EMERGENCYCONTACTNAME:
+ return new EcNameCompare();
+
+ case EMERGENCYCONTACTNUMBER:
+ return new EcNumberCompare();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ if (!(other instanceof SortCommand)) {
+ return false;
+ }
+
+ SortCommand s = (SortCommand) other;
+ return sortAttribute.equals(s.sortAttribute);
+ }
+}
diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
index 44279689e79..575bc11fdaa 100644
--- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
@@ -24,6 +24,7 @@
import seedu.address.logic.commands.FilterCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.commands.SortCommand;
import seedu.address.logic.parser.exceptions.ParseException;
/**
@@ -105,6 +106,9 @@ public Command parseCommand(String userInput) throws ParseException {
case AddExamScoreCommand.COMMAND_WORD:
return new AddExamScoreCommandParser().parse(arguments);
+ case SortCommand.COMMAND_WORD:
+ return new SortCommandParser().parse(arguments);
+
default:
logger.finer("This user input caused a ParseException: " + userInput);
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java
index 53705c9b3e5..e2ced65a5fc 100644
--- a/src/main/java/seedu/address/logic/parser/ParserUtil.java
+++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java
@@ -296,4 +296,51 @@ public static AbsentReason parseAbsentReason(String absentReason) throws ParseEx
return new AbsentReason(trimmedAbsentReason);
}
+
+ /**
+ * Parse {@code String attribute} into a {@code SortAttribute}.
+ * All whitespaces will be trimmed
+ *
+ * @throws ParseException if the given {@code SortAttribute} is invalid.
+ */
+ public static SortAttribute parseSortAttribute(String attribute) throws ParseException {
+ requireNonNull(attribute);
+ String trimmedAttribute = attribute.replaceAll("\\s+", "");
+ String upperCaseAttribute = trimmedAttribute.toUpperCase();
+ SortAttribute sortAttribute;
+ try {
+ sortAttribute = SortAttribute.valueOf(upperCaseAttribute);
+ } catch (IllegalArgumentException e) {
+ throw new ParseException(SortAttribute.MESSAGE_CONSTRAINTS);
+ }
+ return sortAttribute;
+ }
+
+ /**
+ * Enum to encapsulate all the possible attributes to sort the list by.
+ */
+ public enum SortAttribute {
+ NAME("name"),
+ PHONE("phone"),
+ EMAIL("email"),
+ ADDRESS("address"),
+ REGISTERNUMBER("register number"),
+ SEX("sex"),
+ STUDENTCLASS("student class"),
+ EMERGENCYCONTACTNAME("emergency contact name"),
+ EMERGENCYCONTACTNUMBER("emergency contact number"),
+ NONE("none");
+
+ public static final String MESSAGE_CONSTRAINTS = "Sorting Attribute is invalid";
+
+ private final String attribute;
+ SortAttribute(String attribute) {
+ this.attribute = attribute;
+ }
+
+ @Override
+ public String toString() {
+ return this.attribute;
+ }
+ }
}
diff --git a/src/main/java/seedu/address/logic/parser/SortCommandParser.java b/src/main/java/seedu/address/logic/parser/SortCommandParser.java
new file mode 100644
index 00000000000..23b1910d48a
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/SortCommandParser.java
@@ -0,0 +1,40 @@
+package seedu.address.logic.parser;
+
+import static java.util.Objects.requireNonNull;
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import seedu.address.commons.core.LogsCenter;
+import seedu.address.commons.exceptions.IllegalValueException;
+import seedu.address.logic.commands.SortCommand;
+import seedu.address.logic.parser.ParserUtil.SortAttribute;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parses input arguments and creates a new SortCommand object
+ */
+public class SortCommandParser implements Parser {
+
+ private static final Logger logger = LogsCenter.getLogger(SortCommandParser.class);
+
+ /**
+ * Parses the given {@code String} of arguments in the context of the SortCommand
+ * and returns a SortCommand object for execution.
+ * @throws ParseException if the user input does not conform the expected format.
+ */
+ public SortCommand parse(String args) throws ParseException {
+ requireNonNull(args);
+ SortAttribute sortAttribute;
+ try {
+ sortAttribute = ParserUtil.parseSortAttribute(args);
+ } catch (IllegalValueException ive) {
+ throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,
+ SortCommand.MESSAGE_USAGE), ive);
+ }
+ assert sortAttribute != null;
+ logger.log(Level.INFO, "parsed sort command without exception");
+ return new SortCommand(sortAttribute);
+ }
+}
diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java
index d54df471c1f..4a786a9ccaa 100644
--- a/src/main/java/seedu/address/model/Model.java
+++ b/src/main/java/seedu/address/model/Model.java
@@ -1,6 +1,7 @@
package seedu.address.model;
import java.nio.file.Path;
+import java.util.Comparator;
import java.util.function.Predicate;
import javafx.collections.ObservableList;
@@ -84,4 +85,10 @@ public interface Model {
* @throws NullPointerException if {@code predicate} is null.
*/
void updateFilteredPersonList(Predicate predicate);
+
+ /**
+ * Sorts the filteredPersonList using the comparator.
+ * @param comparator to sort the list.
+ */
+ void sortFilteredPersonList(Comparator comparator);
}
diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java
index 57bc563fde6..412d2fd7c82 100644
--- a/src/main/java/seedu/address/model/ModelManager.java
+++ b/src/main/java/seedu/address/model/ModelManager.java
@@ -4,11 +4,13 @@
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
import java.nio.file.Path;
+import java.util.Comparator;
import java.util.function.Predicate;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
+import javafx.collections.transformation.SortedList;
import seedu.address.commons.core.GuiSettings;
import seedu.address.commons.core.LogsCenter;
import seedu.address.model.person.Person;
@@ -22,6 +24,7 @@ public class ModelManager implements Model {
private final AddressBook addressBook;
private final UserPrefs userPrefs;
private final FilteredList filteredPersons;
+ private final SortedList sortedAndFilteredPersons;
/**
* Initializes a ModelManager with the given addressBook and userPrefs.
@@ -34,6 +37,7 @@ public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs
this.addressBook = new AddressBook(addressBook);
this.userPrefs = new UserPrefs(userPrefs);
filteredPersons = new FilteredList<>(this.addressBook.getPersonList());
+ sortedAndFilteredPersons = new SortedList<>(filteredPersons);
}
public ModelManager() {
@@ -119,13 +123,20 @@ public void setPerson(Person target, Person editedPerson) {
*/
@Override
public ObservableList getFilteredPersonList() {
- return filteredPersons;
+ return sortedAndFilteredPersons;
}
@Override
public void updateFilteredPersonList(Predicate predicate) {
requireNonNull(predicate);
filteredPersons.setPredicate(predicate);
+ logger.fine("Person list is filtered");
+ }
+
+ @Override
+ public void sortFilteredPersonList(Comparator comparator) {
+ sortedAndFilteredPersons.setComparator(comparator);
+ logger.fine("Person list is sorted");
}
@Override
diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java
index d0dcc690ada..d1dd072d38a 100644
--- a/src/main/java/seedu/address/model/person/Address.java
+++ b/src/main/java/seedu/address/model/person/Address.java
@@ -7,7 +7,7 @@
* Represents a Person's address in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}
*/
-public class Address {
+public class Address implements Comparable {
public static final String MESSAGE_GUI = "Address: %1$s";
public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank";
@@ -63,4 +63,9 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(Address a) {
+ return this.toString().compareTo(a.toString());
+ }
+
}
diff --git a/src/main/java/seedu/address/model/person/EcName.java b/src/main/java/seedu/address/model/person/EcName.java
index 03b108bbccf..d8188339df0 100644
--- a/src/main/java/seedu/address/model/person/EcName.java
+++ b/src/main/java/seedu/address/model/person/EcName.java
@@ -7,7 +7,7 @@
* Represents a person's emergency contact name in the address book
* The name can be empty or contain only alphanumeric characters and spaces.
*/
-public class EcName {
+public class EcName implements Comparable {
public static final String MESSAGE_GUI = "Emergency Contact Name: %1$s";
public static final String MESSAGE_CONSTRAINTS =
@@ -65,4 +65,8 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(EcName e) {
+ return this.toString().compareTo(e.toString());
+ }
}
diff --git a/src/main/java/seedu/address/model/person/EcNumber.java b/src/main/java/seedu/address/model/person/EcNumber.java
index 2b2fce29f65..1894873076c 100644
--- a/src/main/java/seedu/address/model/person/EcNumber.java
+++ b/src/main/java/seedu/address/model/person/EcNumber.java
@@ -7,7 +7,7 @@
* Represents a Person's emergency phone number in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidEcNumber(String)}
*/
-public class EcNumber {
+public class EcNumber implements Comparable {
public static final String MESSAGE_GUI = "Emergency Contact Number: %1$s";
public static final String MESSAGE_CONSTRAINTS =
@@ -34,6 +34,17 @@ public static boolean isValidEcNumber(String number) {
return number != null && (number.matches(VALIDATION_REGEX) || number.isEmpty());
}
+ /**
+ * Returns the integer representation of EcNumber
+ */
+ public Integer toInt() {
+ if (value.isEmpty()) {
+ // max value when empty so that it goes to the bottom when sorted
+ return Integer.MAX_VALUE;
+ }
+ return Integer.valueOf(this.value);
+ }
+
@Override
public String toString() {
return value;
@@ -59,4 +70,9 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(EcNumber e) {
+ return this.toInt().compareTo(e.toInt());
+ }
+
}
diff --git a/src/main/java/seedu/address/model/person/Email.java b/src/main/java/seedu/address/model/person/Email.java
index ab53c2dfea4..ce9eb1e7293 100644
--- a/src/main/java/seedu/address/model/person/Email.java
+++ b/src/main/java/seedu/address/model/person/Email.java
@@ -7,7 +7,7 @@
* Represents a Person's email in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}
*/
-public class Email {
+public class Email implements Comparable {
public static final String MESSAGE_GUI = "Email: %1$s";
private static final String SPECIAL_CHARACTERS = "+_.-";
@@ -77,4 +77,8 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(Email email) {
+ return this.toString().compareTo(email.toString());
+ }
}
diff --git a/src/main/java/seedu/address/model/person/Name.java b/src/main/java/seedu/address/model/person/Name.java
index bc9cc9f96ce..38a176d2275 100644
--- a/src/main/java/seedu/address/model/person/Name.java
+++ b/src/main/java/seedu/address/model/person/Name.java
@@ -7,7 +7,7 @@
* Represents a Person's name in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidName(String)}
*/
-public class Name {
+public class Name implements Comparable {
public static final String MESSAGE_GUI = "%1$s";
public static final String MESSAGE_CONSTRAINTS =
@@ -65,4 +65,8 @@ public int hashCode() {
return fullName.hashCode();
}
+ @Override
+ public int compareTo(Name name) {
+ return this.toString().compareTo(name.toString());
+ }
}
diff --git a/src/main/java/seedu/address/model/person/Phone.java b/src/main/java/seedu/address/model/person/Phone.java
index 826eefa16c8..fac4557b888 100644
--- a/src/main/java/seedu/address/model/person/Phone.java
+++ b/src/main/java/seedu/address/model/person/Phone.java
@@ -7,7 +7,7 @@
* Represents a Person's phone number in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidPhone(String)}
*/
-public class Phone {
+public class Phone implements Comparable {
public static final String MESSAGE_GUI = "Phone: %1$s";
public static final String MESSAGE_CONSTRAINTS =
@@ -33,6 +33,13 @@ public static boolean isValidPhone(String test) {
return test.matches(VALIDATION_REGEX);
}
+ /**
+ * Returns the integer representation of Phone
+ */
+ public Integer toInt() {
+ return Integer.valueOf(this.value);
+ }
+
@Override
public String toString() {
return value;
@@ -58,4 +65,9 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(Phone phone) {
+ return this.toInt().compareTo(phone.toInt());
+ }
+
}
diff --git a/src/main/java/seedu/address/model/person/RegisterNumber.java b/src/main/java/seedu/address/model/person/RegisterNumber.java
index 1367e104015..91dca21bbf6 100644
--- a/src/main/java/seedu/address/model/person/RegisterNumber.java
+++ b/src/main/java/seedu/address/model/person/RegisterNumber.java
@@ -7,7 +7,7 @@
* Represents a Person's register value in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidRegisterNumber(String)}
*/
-public class RegisterNumber {
+public class RegisterNumber implements Comparable {
public static final String MESSAGE_GUI = "Register Number: %1$s";
public static final String MESSAGE_CONSTRAINTS =
@@ -34,6 +34,12 @@ public static boolean isValidRegisterNumber(String test) {
return test.matches(VALIDATION_REGEX);
}
+ /**
+ * Returns the integer representation of RegisterNumber
+ */
+ public Integer toInt() {
+ return Integer.valueOf(this.value);
+ }
@Override
public String toString() {
@@ -60,4 +66,9 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(RegisterNumber r) {
+ return this.toInt().compareTo(r.toInt());
+ }
+
}
diff --git a/src/main/java/seedu/address/model/person/Sex.java b/src/main/java/seedu/address/model/person/Sex.java
index 813a95a7a15..e85a58ee4f6 100644
--- a/src/main/java/seedu/address/model/person/Sex.java
+++ b/src/main/java/seedu/address/model/person/Sex.java
@@ -7,7 +7,7 @@
* Represents a Person's sex in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidSex(String)}
*/
-public class Sex {
+public class Sex implements Comparable {
public static final String MESSAGE_GUI = "Sex: %1$s";
public static final String MESSAGE_CONSTRAINTS = "Sex can only take \"M\" or \"F\"";
@@ -62,4 +62,9 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(Sex s) {
+ return this.toString().compareTo(s.toString());
+ }
+
}
diff --git a/src/main/java/seedu/address/model/person/StudentClass.java b/src/main/java/seedu/address/model/person/StudentClass.java
index d869d6a3445..ee334e7dfba 100644
--- a/src/main/java/seedu/address/model/person/StudentClass.java
+++ b/src/main/java/seedu/address/model/person/StudentClass.java
@@ -7,7 +7,7 @@
* Represents a Person's class in the address book.
* Guarantees: immutable; is valid as declared in {@link #isValidStudentClass(String)}
*/
-public class StudentClass {
+public class StudentClass implements Comparable {
public static final String MESSAGE_GUI = "Student Class: %1$s";
public static final String MESSAGE_CONSTRAINTS = "Classes should a non-zero digit followed by an alphabet";
@@ -62,4 +62,8 @@ public int hashCode() {
return value.hashCode();
}
+ @Override
+ public int compareTo(StudentClass s) {
+ return this.toString().compareTo(s.toString());
+ }
}
diff --git a/src/main/java/seedu/address/model/person/comparator/AddressCompare.java b/src/main/java/seedu/address/model/person/comparator/AddressCompare.java
new file mode 100644
index 00000000000..fc78e9d7643
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/AddressCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects with their Address
+ */
+public class AddressCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getAddress().compareTo(p2.getAddress());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/EcNameCompare.java b/src/main/java/seedu/address/model/person/comparator/EcNameCompare.java
new file mode 100644
index 00000000000..2f1015c74f3
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/EcNameCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects based on their EcName
+ */
+public class EcNameCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getEcName().compareTo(p2.getEcName());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/EcNumberCompare.java b/src/main/java/seedu/address/model/person/comparator/EcNumberCompare.java
new file mode 100644
index 00000000000..16e5c88e37b
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/EcNumberCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects based on their EcNumber
+ */
+public class EcNumberCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getEcNumber().compareTo(p2.getEcNumber());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/EmailCompare.java b/src/main/java/seedu/address/model/person/comparator/EmailCompare.java
new file mode 100644
index 00000000000..60549b56b07
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/EmailCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects based on Email
+ */
+public class EmailCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getEmail().compareTo(p2.getEmail());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/NameCompare.java b/src/main/java/seedu/address/model/person/comparator/NameCompare.java
new file mode 100644
index 00000000000..41496242717
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/NameCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects based on Name
+ */
+public class NameCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getName().compareTo(p2.getName());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/PersonCompare.java b/src/main/java/seedu/address/model/person/comparator/PersonCompare.java
new file mode 100644
index 00000000000..40568842ecd
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/PersonCompare.java
@@ -0,0 +1,12 @@
+package seedu.address.model.person.comparator;
+
+import java.util.Comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * Represents a class to compare two Person objects based on the specific attribute
+ */
+public abstract class PersonCompare implements Comparator {
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/PhoneCompare.java b/src/main/java/seedu/address/model/person/comparator/PhoneCompare.java
new file mode 100644
index 00000000000..7bb09a476d8
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/PhoneCompare.java
@@ -0,0 +1,14 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects based on their Phone
+ */
+public class PhoneCompare extends PersonCompare {
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getPhone().compareTo(p2.getPhone());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/RegisterNumberCompare.java b/src/main/java/seedu/address/model/person/comparator/RegisterNumberCompare.java
new file mode 100644
index 00000000000..86ab06bae50
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/RegisterNumberCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects using RegisterNumber
+ */
+public class RegisterNumberCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getRegisterNumber().compareTo(p2.getRegisterNumber());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/SexCompare.java b/src/main/java/seedu/address/model/person/comparator/SexCompare.java
new file mode 100644
index 00000000000..1bbe9edc993
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/SexCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects with their Sex
+ */
+public class SexCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getSex().compareTo(p2.getSex());
+ }
+
+}
diff --git a/src/main/java/seedu/address/model/person/comparator/StudentClassCompare.java b/src/main/java/seedu/address/model/person/comparator/StudentClassCompare.java
new file mode 100644
index 00000000000..5dd7c74c497
--- /dev/null
+++ b/src/main/java/seedu/address/model/person/comparator/StudentClassCompare.java
@@ -0,0 +1,15 @@
+package seedu.address.model.person.comparator;
+
+import seedu.address.model.person.Person;
+
+/**
+ * A class to compare two Person objects with their StudentClass
+ */
+public class StudentClassCompare extends PersonCompare {
+
+ @Override
+ public int compare(Person p1, Person p2) {
+ return p1.getStudentClass().compareTo(p2.getStudentClass());
+ }
+
+}
diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml
index 7778f666a0a..bb6ba42a746 100644
--- a/src/main/resources/view/MainWindow.fxml
+++ b/src/main/resources/view/MainWindow.fxml
@@ -12,7 +12,7 @@
+ title="StudentManagerPro" minWidth="450" minHeight="600" onCloseRequest="#handleExit">
diff --git a/src/test/java/seedu/address/logic/commands/AddCommandTest.java b/src/test/java/seedu/address/logic/commands/AddCommandTest.java
index 90e8253f48e..3a1e05f8274 100644
--- a/src/test/java/seedu/address/logic/commands/AddCommandTest.java
+++ b/src/test/java/seedu/address/logic/commands/AddCommandTest.java
@@ -10,6 +10,7 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Comparator;
import java.util.function.Predicate;
import org.junit.jupiter.api.Test;
@@ -157,6 +158,11 @@ public ObservableList getFilteredPersonList() {
public void updateFilteredPersonList(Predicate predicate) {
throw new AssertionError("This method should not be called.");
}
+
+ @Override
+ public void sortFilteredPersonList(Comparator comparator) {
+ throw new AssertionError("This method should not be called");
+ }
}
/**
diff --git a/src/test/java/seedu/address/logic/commands/SortCommandTest.java b/src/test/java/seedu/address/logic/commands/SortCommandTest.java
new file mode 100644
index 00000000000..056ca63e196
--- /dev/null
+++ b/src/test/java/seedu/address/logic/commands/SortCommandTest.java
@@ -0,0 +1,154 @@
+package seedu.address.logic.commands;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;
+import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;
+
+import java.util.Comparator;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.logic.parser.ParserUtil;
+import seedu.address.model.AddressBook;
+import seedu.address.model.Model;
+import seedu.address.model.ModelManager;
+import seedu.address.model.UserPrefs;
+import seedu.address.model.person.Person;
+import seedu.address.model.person.comparator.AddressCompare;
+import seedu.address.model.person.comparator.EcNameCompare;
+import seedu.address.model.person.comparator.EcNumberCompare;
+import seedu.address.model.person.comparator.EmailCompare;
+import seedu.address.model.person.comparator.NameCompare;
+import seedu.address.model.person.comparator.PhoneCompare;
+import seedu.address.model.person.comparator.RegisterNumberCompare;
+import seedu.address.model.person.comparator.SexCompare;
+import seedu.address.model.person.comparator.StudentClassCompare;
+
+/**
+ * Contains integration tests (interaction with the Model) and unit tests for SortCommand.
+ */
+public class SortCommandTest {
+
+ private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());
+
+ @Test
+ public void execute_validSortAttribute_success() {
+ Comparator comparator;
+ SortCommand command;
+ Model expectedModel;
+ String expectedMessage;
+ ParserUtil.SortAttribute sortAttribute;
+
+ // compare name
+ sortAttribute = ParserUtil.SortAttribute.NAME;
+ command = new SortCommand(sortAttribute);
+ comparator = new NameCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare phone
+ sortAttribute = ParserUtil.SortAttribute.PHONE;
+ command = new SortCommand(sortAttribute);
+ comparator = new PhoneCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare address
+ sortAttribute = ParserUtil.SortAttribute.ADDRESS;
+ command = new SortCommand(sortAttribute);
+ comparator = new AddressCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare EcName
+ sortAttribute = ParserUtil.SortAttribute.EMERGENCYCONTACTNAME;
+ command = new SortCommand(sortAttribute);
+ comparator = new EcNameCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare EcNumber
+ sortAttribute = ParserUtil.SortAttribute.EMERGENCYCONTACTNUMBER;
+ command = new SortCommand(sortAttribute);
+ comparator = new EcNumberCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare email
+ sortAttribute = ParserUtil.SortAttribute.EMAIL;
+ command = new SortCommand(sortAttribute);
+ comparator = new EmailCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare register number
+ sortAttribute = ParserUtil.SortAttribute.REGISTERNUMBER;
+ command = new SortCommand(sortAttribute);
+ comparator = new RegisterNumberCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare sex
+ sortAttribute = ParserUtil.SortAttribute.SEX;
+ command = new SortCommand(sortAttribute);
+ comparator = new SexCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // compare student class
+ sortAttribute = ParserUtil.SortAttribute.STUDENTCLASS;
+ command = new SortCommand(sortAttribute);
+ comparator = new StudentClassCompare();
+ expectedMessage = String.format(SortCommand.MESSAGE_SORTED_SUCCESS, sortAttribute);
+ expectedModel = new ModelManager(new AddressBook(model.getAddressBook()), new UserPrefs());
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+
+ // unsorting success
+ sortAttribute = ParserUtil.SortAttribute.NONE;
+ command = new SortCommand(sortAttribute);
+ comparator = null;
+ expectedMessage = SortCommand.MESSAGE_UNSORTED_SUCCESS;
+ expectedModel.sortFilteredPersonList(comparator);
+ assertCommandSuccess(command, model, expectedMessage, expectedModel);
+ }
+
+
+ @Test
+ public void equals() {
+ final SortCommand standardCommand = new SortCommand(ParserUtil.SortAttribute.NAME);
+
+ // same values -> returns true
+ SortCommand commandWithSameValues = new SortCommand(ParserUtil.SortAttribute.NAME);
+ assertTrue(standardCommand.equals(commandWithSameValues));
+
+ // same object -> returns true
+ assertTrue(standardCommand.equals(standardCommand));
+
+ // null -> returns false
+ assertFalse(standardCommand.equals(null));
+
+ // different types -> returns false
+ assertFalse(standardCommand.equals(new ClearCommand()));
+
+ // different SortAttribute -> returns false
+ assertFalse(standardCommand.equals(new SortCommand(ParserUtil.SortAttribute.PHONE)));
+ }
+}
diff --git a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
index a80ed632711..88361be3131 100644
--- a/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
+++ b/src/test/java/seedu/address/logic/parser/AddressBookParserTest.java
@@ -33,6 +33,7 @@
import seedu.address.logic.commands.FilterCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
+import seedu.address.logic.commands.SortCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.exam.Exam;
import seedu.address.model.person.AbsentDate;
@@ -192,6 +193,14 @@ public void parseCommand_addExamScore() throws Exception {
assertEquals(expected, command);
}
+ @Test
+ public void parseCommand_sort() throws Exception {
+ SortCommand expected = new SortCommand(ParserUtil.SortAttribute.REGISTERNUMBER);
+ SortCommand command = (SortCommand) parser.parseCommand(
+ SortCommand.COMMAND_WORD + " register number");
+ assertEquals(expected, command);
+ }
+
@Test
public void parseCommand_unrecognisedInput_throwsParseException() {
assertThrows(ParseException.class, String.format(MESSAGE_INVALID_COMMAND_FORMAT, HelpCommand.MESSAGE_USAGE), ()
diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
index f74e3343395..65d01b24e39 100644
--- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
+++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java
@@ -39,10 +39,11 @@ public class ParserUtilTest {
private static final String INVALID_SEX = "H";
private static final String INVALID_STUDENT_CLASS = "A1";
private static final String INVALID_EMERGENCY_CONTACT_NAME = "--";
- private static final String INVALID_EMERGENCY_PHONE = "1234";
+ private static final String INVALID_EMERGENCY_CONTACT_NUMBER = "1234";
private static final String INVALID_TAG = "#friend";
private static final String INVALID_ABSENT_DATE = "2024-10-32"; // Invalid date
private static final String INVALID_ABSENT_REASON = "";
+ private static final String INVALID_SORT_ATTRIBUTE = "names";
private static final String VALID_NAME = "Rachel Walker";
private static final String VALID_PHONE = "123456";
@@ -52,11 +53,12 @@ public class ParserUtilTest {
private static final String VALID_SEX = "F";
private static final String VALID_STUDENT_CLASS = "1A";
private static final String VALID_EMERGENCY_CONTACT_NAME = "Joe Walker";
- private static final String VALID_EMERGENCY_PHONE = "91234567";
+ private static final String VALID_EMERGENCY_CONTACT_NUMBER = "91234567";
private static final String VALID_TAG_1 = "friend";
private static final String VALID_TAG_2 = "neighbour";
private static final String VALID_ABSENT_DATE = "20-10-2024";
private static final String VALID_ABSENT_REASON = "Sick";
+ private static final String VALID_SORT_ATTRIBUTE = "register number";
private static final String WHITESPACE = " \t\r\n";
@@ -271,21 +273,20 @@ public void parseEcNumber_null_throwsNullPointerException() {
@Test
public void parseEcNumber_invalidValue_throwsParseException() {
- assertThrows(ParseException.class, () -> ParserUtil.parseEcNumber(INVALID_EMERGENCY_PHONE));
+ assertThrows(ParseException.class, () -> ParserUtil.parseEcNumber(INVALID_EMERGENCY_CONTACT_NUMBER));
}
@Test
- public void parseEcNumber_validValueWithoutWhitespace_returnsStudentClass() throws Exception {
- EcNumber expectedEcNumber = new EcNumber(VALID_EMERGENCY_PHONE);
- assertEquals(expectedEcNumber, ParserUtil.parseEcNumber(VALID_EMERGENCY_PHONE));
+ public void parseEcNumber_validValueWithoutWhitespace_returnsEcNumber() throws Exception {
+ EcNumber expectedEcNumber = new EcNumber(VALID_EMERGENCY_CONTACT_NUMBER);
+ assertEquals(expectedEcNumber, ParserUtil.parseEcNumber(VALID_EMERGENCY_CONTACT_NUMBER));
}
@Test
- public void parseEcNumber_validValueWithWhitespace_returnsTrimmedStudentClass() throws Exception {
- String ecNumberWithWhitespace = WHITESPACE + VALID_EMERGENCY_PHONE + WHITESPACE;
- EcNumber expectedEcNumber = new EcNumber(VALID_EMERGENCY_PHONE);
+ public void parseEcNumber_validValueWithWhitespace_returnsTrimmedEcNumber() throws Exception {
+ String ecNumberWithWhitespace = WHITESPACE + VALID_EMERGENCY_CONTACT_NUMBER + WHITESPACE;
+ EcNumber expectedEcNumber = new EcNumber(VALID_EMERGENCY_CONTACT_NUMBER);
assertEquals(expectedEcNumber, ParserUtil.parseEcNumber(ecNumberWithWhitespace));
-
}
@Test
@@ -379,4 +380,27 @@ public void parseAttendance_invalidAbsentReason_throwsParseException() {
+ PREFIX_ABSENT_REASON + INVALID_ABSENT_REASON
));
}
+
+ @Test
+ public void parseSortAttribute_null_throwsNullPointerException() {
+ assertThrows(NullPointerException.class, () -> ParserUtil.parseSortAttribute((String) null));
+ }
+
+ @Test
+ public void parseSortAttribute_invalidValue_throwsParseException() {
+ assertThrows(ParseException.class, () -> ParserUtil.parseSortAttribute(INVALID_SORT_ATTRIBUTE));
+ }
+
+ @Test
+ public void parseSortAttribute_validValueWithoutWhitespace_returnsSortAttribute() throws Exception {
+ ParserUtil.SortAttribute expectedSortAttribute = ParserUtil.SortAttribute.REGISTERNUMBER;
+ assertEquals(expectedSortAttribute, ParserUtil.parseSortAttribute(VALID_SORT_ATTRIBUTE));
+ }
+
+ @Test
+ public void parseSortAttribute_validValueWithWhitespace_returnsTrimmedSortAttribute() throws Exception {
+ String sortAttributeWithWhiteSpace = WHITESPACE + VALID_SORT_ATTRIBUTE + WHITESPACE;
+ ParserUtil.SortAttribute expectedSortAttribute = ParserUtil.SortAttribute.REGISTERNUMBER;
+ assertEquals(expectedSortAttribute, ParserUtil.parseSortAttribute(sortAttributeWithWhiteSpace));
+ }
}
diff --git a/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java
new file mode 100644
index 00000000000..45e0d1b2f0d
--- /dev/null
+++ b/src/test/java/seedu/address/logic/parser/SortCommandParserTest.java
@@ -0,0 +1,38 @@
+package seedu.address.logic.parser;
+
+import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;
+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.logic.commands.SortCommand;
+
+public class SortCommandParserTest {
+
+ private static final String MESSAGE_INVALID_FORMAT =
+ String.format(MESSAGE_INVALID_COMMAND_FORMAT, SortCommand.MESSAGE_USAGE);
+
+ private SortCommandParser parser = new SortCommandParser();
+
+ @Test
+ public void parse_emptyArg_throwsParseException() {
+ assertParseFailure(parser, " ", MESSAGE_INVALID_FORMAT);
+ }
+
+ @Test
+ public void parse_invalidArgs_throwsParseException() {
+ assertParseFailure(parser, "name and number", MESSAGE_INVALID_FORMAT);
+ }
+ @Test
+ public void parse_validArgs_returnsSortCommand() {
+ SortCommand expectedSortCommand = new SortCommand(ParserUtil.SortAttribute.REGISTERNUMBER);
+
+ // multiple white spaces
+ assertParseSuccess(parser, " register number ", expectedSortCommand);
+
+ // no white spaces
+ expectedSortCommand = new SortCommand(ParserUtil.SortAttribute.ADDRESS);
+ assertParseSuccess(parser, "address", expectedSortCommand);
+ }
+}
diff --git a/src/test/java/seedu/address/model/person/EcNumberTest.java b/src/test/java/seedu/address/model/person/EcNumberTest.java
index b8cea53843b..68fb960a806 100644
--- a/src/test/java/seedu/address/model/person/EcNumberTest.java
+++ b/src/test/java/seedu/address/model/person/EcNumberTest.java
@@ -1,6 +1,8 @@
package seedu.address.model.person;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static seedu.address.testutil.Assert.assertThrows;
@@ -36,6 +38,19 @@ public void isValidEcNumber() {
assertTrue(EcNumber.isValidEcNumber("93121534")); // exactly 8 numbers
}
+ @Test
+ public void toInt() {
+ EcNumber ecNumber = new EcNumber("91234567");
+
+ assertEquals(ecNumber.toInt(), 91234567);
+ assertNotEquals(ecNumber.toInt(), 98765432);
+
+ // empty ecNumber
+ ecNumber = new EcNumber("");
+ assertEquals(ecNumber.toInt(), Integer.MAX_VALUE);
+ assertNotEquals(ecNumber.toInt(), 0);
+ }
+
@Test
public void equals() {
EcNumber ecNumber = new EcNumber("91234567");
diff --git a/src/test/java/seedu/address/model/person/PhoneTest.java b/src/test/java/seedu/address/model/person/PhoneTest.java
index deaaa5ba190..3043c38f134 100644
--- a/src/test/java/seedu/address/model/person/PhoneTest.java
+++ b/src/test/java/seedu/address/model/person/PhoneTest.java
@@ -1,6 +1,8 @@
package seedu.address.model.person;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static seedu.address.testutil.Assert.assertThrows;
@@ -38,6 +40,14 @@ public void isValidPhone() {
assertTrue(Phone.isValidPhone("124293842033123")); // long phone numbers
}
+ @Test
+ public void toInt() {
+ Phone phone = new Phone("999");
+
+ assertEquals(phone.toInt(), 999);
+ assertNotEquals(phone.toInt(), 000);
+ }
+
@Test
public void equals() {
Phone phone = new Phone("999");
diff --git a/src/test/java/seedu/address/model/person/RegisterNumberTest.java b/src/test/java/seedu/address/model/person/RegisterNumberTest.java
index b00aa2b79e5..adbd84235c0 100644
--- a/src/test/java/seedu/address/model/person/RegisterNumberTest.java
+++ b/src/test/java/seedu/address/model/person/RegisterNumberTest.java
@@ -1,6 +1,8 @@
package seedu.address.model.person;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static seedu.address.testutil.Assert.assertThrows;
@@ -37,6 +39,14 @@ public void isValidRegisterNumber() {
assertTrue(RegisterNumber.isValidRegisterNumber("32")); // double digit
}
+ @Test
+ public void toInt() {
+ RegisterNumber registerNumber = new RegisterNumber("1");
+
+ assertEquals(registerNumber.toInt(), 1);
+ assertNotEquals(registerNumber.toInt(), 2);
+ }
+
@Test
public void equals() {
RegisterNumber registerNumber = new RegisterNumber("1");
diff --git a/src/test/java/seedu/address/model/person/comparator/AddressCompareTest.java b/src/test/java/seedu/address/model/person/comparator/AddressCompareTest.java
new file mode 100644
index 00000000000..894736b66c9
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/AddressCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class AddressCompareTest {
+
+ private final AddressCompare comparator = new AddressCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/EcNameCompareTest.java b/src/test/java/seedu/address/model/person/comparator/EcNameCompareTest.java
new file mode 100644
index 00000000000..aae1162b471
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/EcNameCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class EcNameCompareTest {
+
+ private final EcNameCompare comparator = new EcNameCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/EcNumberCompareTest.java b/src/test/java/seedu/address/model/person/comparator/EcNumberCompareTest.java
new file mode 100644
index 00000000000..c162ff50567
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/EcNumberCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class EcNumberCompareTest {
+
+ private final EcNumberCompare comparator = new EcNumberCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/EmailCompareTest.java b/src/test/java/seedu/address/model/person/comparator/EmailCompareTest.java
new file mode 100644
index 00000000000..4bf175c17de
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/EmailCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class EmailCompareTest {
+
+ private final EmailCompare comparator = new EmailCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/NameCompareTest.java b/src/test/java/seedu/address/model/person/comparator/NameCompareTest.java
new file mode 100644
index 00000000000..44d21083aa3
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/NameCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class NameCompareTest {
+
+ private final NameCompare comparator = new NameCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/PhoneCompareTest.java b/src/test/java/seedu/address/model/person/comparator/PhoneCompareTest.java
new file mode 100644
index 00000000000..305eb72eca7
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/PhoneCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class PhoneCompareTest {
+
+ private final PhoneCompare comparator = new PhoneCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p2, p1) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p1, p2) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/RegisterNumberCompareTest.java b/src/test/java/seedu/address/model/person/comparator/RegisterNumberCompareTest.java
new file mode 100644
index 00000000000..fb861b5b5e5
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/RegisterNumberCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class RegisterNumberCompareTest {
+
+ private final RegisterNumberCompare comparator = new RegisterNumberCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p2, p1) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p1, p2) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/SexCompareTest.java b/src/test/java/seedu/address/model/person/comparator/SexCompareTest.java
new file mode 100644
index 00000000000..6a595efc699
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/SexCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class SexCompareTest {
+
+ private final SexCompare comparator = new SexCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/model/person/comparator/StudentClassCompareTest.java b/src/test/java/seedu/address/model/person/comparator/StudentClassCompareTest.java
new file mode 100644
index 00000000000..ca234275077
--- /dev/null
+++ b/src/test/java/seedu/address/model/person/comparator/StudentClassCompareTest.java
@@ -0,0 +1,33 @@
+package seedu.address.model.person.comparator;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static seedu.address.testutil.TypicalPersons.ALICE;
+import static seedu.address.testutil.TypicalPersons.BOB;
+
+import org.junit.jupiter.api.Test;
+
+import seedu.address.model.person.Person;
+
+public class StudentClassCompareTest {
+
+ private final StudentClassCompare comparator = new StudentClassCompare();
+ private final Person p1 = ALICE;
+ private final Person p2 = BOB;
+
+ @Test
+ public void compare_equal() {
+ assertTrue(comparator.compare(p1, p1) == 0);
+ assertTrue(comparator.compare(p2, p2) == 0);
+ }
+
+ @Test
+ public void compare_lessThan() {
+ assertTrue(comparator.compare(p1, p2) <= -1);
+ }
+
+ @Test
+ public void compare_greaterThan() {
+ assertTrue(comparator.compare(p2, p1) >= 1);
+ }
+
+}
diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java
index 11b57618831..f573de20cac 100644
--- a/src/test/java/seedu/address/testutil/TypicalPersons.java
+++ b/src/test/java/seedu/address/testutil/TypicalPersons.java
@@ -6,6 +6,8 @@
import static seedu.address.logic.commands.CommandTestUtil.VALID_ATTENDANCE_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_ECNAME_AMY;
import static seedu.address.logic.commands.CommandTestUtil.VALID_ECNAME_BOB;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_ECNUMBER_AMY;
+import static seedu.address.logic.commands.CommandTestUtil.VALID_ECNUMBER_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_AMY;
import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_EXAM_MIDTERM;
@@ -88,14 +90,16 @@ public class TypicalPersons {
// Manually added - Person's details found in {@code CommandTestUtil}
public static final Person AMY = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)
.withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withRegisterNumber(VALID_REGISTER_NUMBER_AMY)
- .withSex(VALID_SEX_AMY).withStudentClass(VALID_STUDENT_CLASS_AMY).withEcName(VALID_ECNAME_AMY)
+ .withSex(VALID_SEX_AMY).withStudentClass(VALID_STUDENT_CLASS_AMY)
+ .withEcName(VALID_ECNAME_AMY).withEcNumber(VALID_ECNUMBER_AMY)
.withExams(VALID_EXAM_MIDTERM).withExamScore(VALID_EXAM_MIDTERM, VALID_EXAM_SCORE_AMY)
.withTags(VALID_TAG_FRIEND).withAttendance(VALID_ATTENDANCE_AMY)
.withSubmissions(VALID_SUBMISSION_ASSIGNMENT_1)
.withSubmissionStatus(VALID_SUBMISSION_ASSIGNMENT_1, VALID_SUBMISSION_STATUS_AMY).build();
public static final Person BOB = new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB)
.withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withRegisterNumber(VALID_REGISTER_NUMBER_BOB)
- .withSex(VALID_SEX_BOB).withStudentClass(VALID_STUDENT_CLASS_BOB).withEcName(VALID_ECNAME_BOB)
+ .withSex(VALID_SEX_BOB).withStudentClass(VALID_STUDENT_CLASS_BOB)
+ .withEcName(VALID_ECNAME_BOB).withEcNumber(VALID_ECNUMBER_BOB)
.withExams(VALID_EXAM_MIDTERM).withExamScore(VALID_EXAM_MIDTERM, VALID_EXAM_SCORE_BOB)
.withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).withAttendance(VALID_ATTENDANCE_BOB)
.withSubmissions(VALID_SUBMISSION_ASSIGNMENT_1)