diff --git a/src/main/java/staffconnect/model/person/Faculty.java b/src/main/java/staffconnect/model/person/Faculty.java new file mode 100644 index 00000000000..2e10dc3f6c4 --- /dev/null +++ b/src/main/java/staffconnect/model/person/Faculty.java @@ -0,0 +1,113 @@ +package staffconnect.model.person; + +import static java.util.Objects.requireNonNull; +import static staffconnect.commons.util.AppUtil.checkArgument; + +import java.util.Arrays; + +/** + * Represents a Person's faculty in the staff book. + * Guarantees: immutable; is valid as declared in + * {@link #isValidFaculty(String)} + */ +public class Faculty { + public static final String MESSAGE_CONSTRAINTS = + "The content should be a String representing a real faculty of NUS"; + + /** + * For this version, a valid faculty value should match exactly the full name of the facult, + * or the value is invalid + */ + public enum FacultyEnum { + ARTS_AND_SOCIAL_SCIENCES("Arts and Social Sciences"), + BUSINESS("Business"), + COMPUTING("Computing"), + CONTINUING_AND_LIFELONG_EDUCATION("Continuing and Lifelong Education"), + DENTISTRY("Dentistry"), + DESIGN_AND_ENVIRONMENT("Design and Environment"), + DUKE_NUS_MEDICAL_SCHOOL("Duke-NUS Medical School"), + ENGINEERING("Engineering"), + INTEGRATIVE_SCIENCES_AND_ENGINEERING("Integrative Sciences and Engineering"), + LAW("Law"), + MEDICINE("Medicine"), + MUSIC("Music"), + PUBLIC_HEALTH("Public Health"), + PUBLIC_POLICY("Public Policy"), + SCIENCE("Science"), + UNIVERSITY_SCHOLARS_PROGRAMME("University Scholars Programme"), + YALE_NUS_COLLEGE("Yale-NUS College"); + + private final String facultyName; + + FacultyEnum(String facultyName) { + this.facultyName = facultyName; + } + + /** + * Links enum member to its name. + * + * @return name of the faculty + */ + public String getFacultyName() { + return facultyName; + } + } + public final String value; + + /** + * Constructs a {@code Faculty}. + * + * @param faculty A valid faculty. + */ + public Faculty(String faculty) { + requireNonNull(faculty); + checkArgument(isValidFaculty(faculty), MESSAGE_CONSTRAINTS); + value = fromString(faculty).getFacultyName(); // can be extended + } + + /** + * Verifies if a faculty name is valid. + * + * @param test string representing the faculty name + * @return True if the input matches any faculty name. + */ + public static boolean isValidFaculty(String test) { + requireNonNull(test, "faculty cannot be null"); + + return Arrays.stream(FacultyEnum.values()) + .anyMatch(faculty -> faculty.getFacultyName().equalsIgnoreCase(test)); + } + + private static FacultyEnum fromString(String name) { + for (FacultyEnum faculty : FacultyEnum.values()) { + if (faculty.getFacultyName().equalsIgnoreCase(name)) { + return faculty; + } + } + throw new IllegalArgumentException("No enum constant matches the provided name: " + name); + } + + @Override + public String toString() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + + if (!(obj instanceof Faculty)) { + return false; + } + + Faculty otherFaculty = (Faculty) obj; + return this.value.equals(otherFaculty.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } +} diff --git a/src/test/java/staffconnect/model/person/FacultyTest.java b/src/test/java/staffconnect/model/person/FacultyTest.java new file mode 100644 index 00000000000..c8d63aeccf4 --- /dev/null +++ b/src/test/java/staffconnect/model/person/FacultyTest.java @@ -0,0 +1,57 @@ +package staffconnect.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 staffconnect.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class FacultyTest { + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new Faculty(null)); + } + + @Test + public void constructor_invalidFaculty_throwsIllegalArgumentException() { + String invalidFaculty = ""; + assertThrows(IllegalArgumentException.class, () -> new Faculty(invalidFaculty)); + } + + @Test + public void isValidFaculty() { + // null Faculty + assertThrows(NullPointerException.class, () -> Faculty.isValidFaculty(null)); + + // invalid faculties + assertFalse(Faculty.isValidFaculty("")); // empty string + assertFalse(Faculty.isValidFaculty(" ")); // spaces only + + // valid Faculties + assertTrue(Faculty.isValidFaculty("science")); // ignore capitals + assertTrue(Faculty.isValidFaculty("Computing")); + assertTrue(Faculty.isValidFaculty("Arts and Social Sciences")); // long faculty + } + + @Test + public void equals() { + Faculty faculty = new Faculty("Computing"); + + // same values -> returns true + assertEquals(faculty, new Faculty("Computing")); + + // same object -> returns true + assertEquals(faculty, faculty); + + // null -> returns false + assertNotEquals(null, faculty); + + // different types -> returns false + assertFalse(faculty.equals(5.0f)); + + // different values -> returns false + assertNotEquals(faculty, new Faculty("Science")); + } +}