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)