diff --git a/src/main/java/seedu/address/logic/parser/AddGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/AddGroupCommandParser.java index 9440bfd2588..5551b6c7bc6 100644 --- a/src/main/java/seedu/address/logic/parser/AddGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddGroupCommandParser.java @@ -30,7 +30,7 @@ public AddGroupCommand parse(String args) throws ParseException { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddGroupCommand.MESSAGE_USAGE)); } - GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + GroupNumber groupNumber = ParserUtil.parseGroupNumber(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); diff --git a/src/main/java/seedu/address/logic/parser/AddStudentToGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/AddStudentToGroupCommandParser.java index 1819e13e5b5..59c8517ed85 100644 --- a/src/main/java/seedu/address/logic/parser/AddStudentToGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddStudentToGroupCommandParser.java @@ -42,7 +42,7 @@ public AddStudentToGroupCommand parse(String args) throws ParseException { MESSAGE_INVALID_COMMAND_FORMAT, AddStudentToGroupCommand.MESSAGE_USAGE)); } - GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + GroupNumber groupNumber = ParserUtil.parseGroupNumber(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); diff --git a/src/main/java/seedu/address/logic/parser/DeleteGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteGroupCommandParser.java index d50b7b6b722..986227e16cd 100644 --- a/src/main/java/seedu/address/logic/parser/DeleteGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/DeleteGroupCommandParser.java @@ -29,7 +29,7 @@ public DeleteGroupCommand parse(String args) throws ParseException { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteGroupCommand.MESSAGE_USAGE)); } - GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + GroupNumber groupNumber = ParserUtil.parseGroupNumber(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); diff --git a/src/main/java/seedu/address/logic/parser/DeleteStudentFromGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteStudentFromGroupCommandParser.java index 18d5d6bc6ac..9a1806eac27 100644 --- a/src/main/java/seedu/address/logic/parser/DeleteStudentFromGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/DeleteStudentFromGroupCommandParser.java @@ -42,7 +42,7 @@ public DeleteStudentFromGroupCommand parse(String args) throws ParseException { MESSAGE_INVALID_COMMAND_FORMAT, DeleteStudentFromGroupCommand.MESSAGE_USAGE)); } - GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + GroupNumber groupNumber = ParserUtil.parseGroupNumber(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index e2cf7a3f4e1..dbade79dc74 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -154,13 +154,13 @@ public static Schedule parseSchedule(String schedule) throws ParseException { * Leading and trailing whitespaces will be trimmed. * @throws ParseException if the given {@code schedule} is invalid. */ - public static GroupNumber parseGroupName(String groupName) throws ParseException { - requireNonNull(groupName); - String trimmedGroupName = groupName.trim(); - if (!GroupNumber.isValidGroupNumber(groupName)) { + public static GroupNumber parseGroupNumber(String groupNumber) throws ParseException { + requireNonNull(groupNumber); + String trimmedGroupNumber = groupNumber.trim(); + if (!GroupNumber.isValidGroupNumber(trimmedGroupNumber)) { throw new ParseException(GroupNumber.MESSAGE_CONSTRAINTS); } - return new GroupNumber(trimmedGroupName); + return new GroupNumber(trimmedGroupNumber); } /** @@ -170,10 +170,11 @@ public static GroupNumber parseGroupName(String groupName) throws ParseException */ public static GroupType parseGroupType(String groupType) throws ParseException { requireNonNull(groupType); - if (!GroupType.isValidGroupType(groupType)) { + String trimmedGroupType = groupType.trim(); + if (!GroupType.isValidGroupType(trimmedGroupType)) { throw new ParseException(GroupType.MESSAGE_CONSTRAINTS); } - return new GroupType(groupType.toUpperCase()); + return new GroupType(trimmedGroupType.toUpperCase()); } /** diff --git a/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java index 261e22f8f76..bec11eba2ae 100644 --- a/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java @@ -34,7 +34,7 @@ public ViewGroupCommand parse(String args) throws ParseException { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddGroupCommand.MESSAGE_USAGE)); } - GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + GroupNumber groupNumber = ParserUtil.parseGroupNumber(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); diff --git a/src/main/java/seedu/address/model/Classmate.java b/src/main/java/seedu/address/model/Classmate.java index 8a8e83c5b63..a21a3e19dc8 100644 --- a/src/main/java/seedu/address/model/Classmate.java +++ b/src/main/java/seedu/address/model/Classmate.java @@ -11,7 +11,6 @@ import seedu.address.model.tutorialclass.TutorialClass; import seedu.address.model.tutorialclass.UniqueTutorialClassList; import seedu.address.model.tutorialgroup.TutorialGroup; -import seedu.address.model.tutorialgroup.UniqueTutorialGroupList; /** * Wraps all data at the address-book level diff --git a/src/main/java/seedu/address/model/tutorialclass/TutorialClass.java b/src/main/java/seedu/address/model/tutorialclass/TutorialClass.java index 75d6c549a14..865c764ba87 100644 --- a/src/main/java/seedu/address/model/tutorialclass/TutorialClass.java +++ b/src/main/java/seedu/address/model/tutorialclass/TutorialClass.java @@ -9,6 +9,8 @@ import java.util.Objects; import java.util.Set; +import javafx.beans.Observable; +import javafx.collections.ObservableList; import seedu.address.model.student.ClassCode; import seedu.address.model.tag.Tag; import seedu.address.model.tutorialgroup.TutorialGroup; @@ -84,9 +86,8 @@ public UniqueTutorialGroupList getTutorialGroups() { * * @return List of tutorial groups */ - public List getTutorialGroupsAsList() { - ArrayList result = new ArrayList<>(tutorialGroups.getInternalList()); - return result; + public ObservableList getTutorialGroupsAsList() { + return tutorialGroups.asUnmodifiableObservableList(); } public Set getTags() { diff --git a/src/main/java/seedu/address/model/tutorialgroup/GroupType.java b/src/main/java/seedu/address/model/tutorialgroup/GroupType.java index b2056a7c0fb..6b3f9d01834 100644 --- a/src/main/java/seedu/address/model/tutorialgroup/GroupType.java +++ b/src/main/java/seedu/address/model/tutorialgroup/GroupType.java @@ -28,7 +28,8 @@ public static boolean isValidGroupType(String test) { return test.matches(VALIDATION_REGEX); } - private Integer parseGroupType(String groupType) { + public static Integer parseGroupType(String groupType) { + assert groupType.length() == 3; return parseInt(groupType.substring(2)); } diff --git a/src/main/java/seedu/address/model/tutorialgroup/exceptions/DuplicateGroupException.java b/src/main/java/seedu/address/model/tutorialgroup/exceptions/DuplicateGroupException.java deleted file mode 100644 index 572622079c8..00000000000 --- a/src/main/java/seedu/address/model/tutorialgroup/exceptions/DuplicateGroupException.java +++ /dev/null @@ -1,7 +0,0 @@ -package seedu.address.model.tutorialgroup.exceptions; - -public class DuplicateGroupException extends RuntimeException { - public DuplicateGroupException() { - super("Operation would result in duplicate groups"); - } -} diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 25c52a702cf..1734f83c3f5 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -19,6 +19,8 @@ import seedu.address.model.student.Name; import seedu.address.model.student.Phone; import seedu.address.model.tag.Tag; +import seedu.address.model.tutorialgroup.GroupNumber; +import seedu.address.model.tutorialgroup.GroupType; public class ParserUtilTest { private static final String INVALID_NAME = "R@chel"; @@ -26,6 +28,8 @@ public class ParserUtilTest { private static final String INVALID_ADDRESS = " "; private static final String INVALID_EMAIL = "example.com"; private static final String INVALID_TAG = "#friend"; + private static final String INVALID_GROUP_NUMBER = "a"; + private static final String INVALID_GROUP_TYPE = "OP3"; private static final String VALID_NAME = "Rachel Walker"; private static final String VALID_PHONE = "123456"; @@ -33,6 +37,8 @@ public class ParserUtilTest { private static final String VALID_EMAIL = "rachel@example.com"; private static final String VALID_TAG_1 = "friend"; private static final String VALID_TAG_2 = "neighbour"; + private static final String VALID_GROUP_NUMBER = "1"; + private static final String VALID_GROUP_TYPE = "OP1"; private static final String WHITESPACE = " \t\r\n"; @@ -193,4 +199,50 @@ public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception { assertEquals(expectedTagSet, actualTagSet); } + + @Test + public void parseGroupNumber_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseGroupNumber((String) null)); + } + + @Test + public void parseGroupNumber_invalidValue_throwsParseException() { + assertThrows(ParseException.class, () -> ParserUtil.parseGroupNumber(INVALID_GROUP_NUMBER)); + } + + @Test + public void parseGroupNumber_validValueWithoutWhitespace_returnsGroupNumber() throws Exception { + GroupNumber expectedGroupNumber = new GroupNumber(VALID_GROUP_NUMBER); + assertEquals(expectedGroupNumber, ParserUtil.parseGroupNumber(VALID_GROUP_NUMBER)); + } + + @Test + public void parseGroupNumber_validValueWithWhitespace_returnsTrimmedGroupNumber() throws Exception { + String groupNumberWithWhitespace = WHITESPACE + VALID_GROUP_NUMBER + WHITESPACE; + GroupNumber expectedGroupNumber = new GroupNumber(VALID_GROUP_NUMBER); + assertEquals(expectedGroupNumber, ParserUtil.parseGroupNumber(groupNumberWithWhitespace)); + } + + @Test + public void parseGroupType_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseGroupType((String) null)); + } + + @Test + public void parseGroupType_invalidValue_throwsParseException() { + assertThrows(ParseException.class, () -> ParserUtil.parseGroupType(INVALID_GROUP_TYPE)); + } + + @Test + public void parseGroupType_validValueWithoutWhitespace_returnsGroupType() throws Exception { + GroupType expectedGroupType = new GroupType(VALID_GROUP_TYPE); + assertEquals(expectedGroupType, ParserUtil.parseGroupType(VALID_GROUP_TYPE)); + } + + @Test + public void parseGroupType_validValueWithWhitespace_returnsTrimmedGroupType() throws Exception { + String groupTypeWithWhitespace = WHITESPACE + VALID_GROUP_TYPE + WHITESPACE; + GroupType expectedGroupType = new GroupType(VALID_GROUP_TYPE); + assertEquals(expectedGroupType, ParserUtil.parseGroupType(groupTypeWithWhitespace)); + } } diff --git a/src/test/java/seedu/address/model/ClassmateTest.java b/src/test/java/seedu/address/model/ClassmateTest.java index 7fa5d0692e0..408eb8ce945 100644 --- a/src/test/java/seedu/address/model/ClassmateTest.java +++ b/src/test/java/seedu/address/model/ClassmateTest.java @@ -4,10 +4,14 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_CLASSCODE_G02; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalStudents.ALICE; import static seedu.address.testutil.TypicalStudents.getTypicalClassmate; +import static seedu.address.testutil.TypicalTutorialClasses.G01; +import static seedu.address.testutil.TypicalTutorialClasses.G02; +import static seedu.address.testutil.TypicalTutorialGroups.TUT_01; import java.util.ArrayList; import java.util.Arrays; @@ -24,6 +28,7 @@ import seedu.address.model.tutorialclass.TutorialClass; import seedu.address.model.tutorialgroup.TutorialGroup; import seedu.address.testutil.StudentBuilder; +import seedu.address.testutil.TutorialGroupBuilder; public class ClassmateTest { @@ -52,7 +57,7 @@ public void resetData_withDuplicateStudents_throwsDuplicateStudentException() { //TODO: Add sample tutorialClasses to tests. Replace new ArrayList in newData constructor line. Student alice = new StudentBuilder(ALICE).build(); List newStudents = Arrays.asList(ALICE, alice); - ClassmateStub newData = new ClassmateStub(newStudents, new ArrayList<>(), new ArrayList<>()); + ClassmateStub newData = new ClassmateStub(newStudents, new ArrayList<>()); assertThrows(DuplicateStudentException.class, () -> classmate.resetData(newData)); } @@ -86,19 +91,42 @@ public void getStudentList_modifyList_throwsUnsupportedOperationException() { assertThrows(UnsupportedOperationException.class, () -> classmate.getStudentList().remove(0)); } + @Test + public void hasTutorialGroup_nullTutorialGroup_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> classmate.hasTutorialGroup(null)); + } + + @Test + public void hasTutorialGroup_tutorialGroupNotInClassmate_returnsFalse() { + classmate.addTutorialClass(G01); + assertFalse(classmate.hasTutorialGroup(TUT_01)); + } + + @Test + public void hasTutorialGroup_tutorialGroupInClassmate_returnsTrue() { + classmate.addTutorialClass(G01); + classmate.addTutorialGroup(TUT_01); + assertTrue(classmate.hasTutorialGroup(TUT_01)); + } + + @Test + public void hasTutorialGroup_studentWithDifferentClassCodeInClassmate_returnsFalse() { + classmate.addTutorialClass(G01); + classmate.addTutorialClass(G02); + TutorialGroup editedTUT_01 = new TutorialGroupBuilder(TUT_01).withClassCode(VALID_CLASSCODE_G02).build(); + assertFalse(classmate.hasTutorialGroup(editedTUT_01)); + } + /** * A stub ReadOnlyClassmate whose students list can violate interface constraints. */ private static class ClassmateStub implements ReadOnlyClassmate { private final ObservableList students = FXCollections.observableArrayList(); private final ObservableList tutorialClasses = FXCollections.observableArrayList(); - private final ObservableList tutorialGroups = FXCollections.observableArrayList(); - ClassmateStub(Collection students, Collection tutorialClasses, - Collection tutorialGroups) { + ClassmateStub(Collection students, Collection tutorialClasses) { this.students.setAll(students); this.tutorialClasses.setAll(tutorialClasses); - this.tutorialGroups.setAll(tutorialGroups); } @Override diff --git a/src/test/java/seedu/address/model/tutorialgroup/GroupTypeTest.java b/src/test/java/seedu/address/model/tutorialgroup/GroupTypeTest.java index 97aadfd4195..1a5c2434f9a 100644 --- a/src/test/java/seedu/address/model/tutorialgroup/GroupTypeTest.java +++ b/src/test/java/seedu/address/model/tutorialgroup/GroupTypeTest.java @@ -1,5 +1,6 @@ package seedu.address.model.tutorialgroup; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.testutil.Assert.assertThrows; @@ -20,7 +21,13 @@ public void constructor_invalidName_throwsIllegalArgumentException() { } @Test - public void isValidName() { + public void parseGroupType() { + assertEquals(1, GroupType.parseGroupType("OP1")); + assertEquals(2, GroupType.parseGroupType("OP2")); + } + + @Test + public void isValidGroupType() { // null group name assertThrows(NullPointerException.class, () -> GroupType.isValidGroupType(null)); diff --git a/src/test/java/seedu/address/model/tutorialgroup/UniqueTutorialGroupListTest.java b/src/test/java/seedu/address/model/tutorialgroup/UniqueTutorialGroupListTest.java new file mode 100644 index 00000000000..07595a6040a --- /dev/null +++ b/src/test/java/seedu/address/model/tutorialgroup/UniqueTutorialGroupListTest.java @@ -0,0 +1,90 @@ +package seedu.address.model.tutorialgroup; + +import static org.junit.jupiter.api.Assertions.*; +import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_CLASSCODE_G02; +import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.testutil.Assert.assertThrows; +import static seedu.address.testutil.TypicalStudents.ALICE; +import static seedu.address.testutil.TypicalStudents.BOB; +import static seedu.address.testutil.TypicalTutorialGroups.TUT_01; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import seedu.address.model.student.Student; +import seedu.address.model.student.UniqueStudentList; +import seedu.address.model.student.exceptions.DuplicateStudentException; +import seedu.address.model.student.exceptions.StudentNotFoundException; +import seedu.address.model.tutorialgroup.exceptions.DuplicateTutorialGroupException; +import seedu.address.model.tutorialgroup.exceptions.TutorialGroupNotFoundException; +import seedu.address.testutil.StudentBuilder; +import seedu.address.testutil.TutorialGroupBuilder; + +public class UniqueTutorialGroupListTest { + + private final UniqueTutorialGroupList uniqueTutorialGroupList = new UniqueTutorialGroupList(); + + @Test + public void contains_nullTutorialGroup_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> uniqueTutorialGroupList.contains(null)); + } + + @Test + public void contains_tutorialGroupNotInList_returnsFalse() { + assertFalse(uniqueTutorialGroupList.contains(TUT_01)); + } + + @Test + public void contains_tutorialGroupInList_returnsTrue() { + uniqueTutorialGroupList.add(TUT_01); + assertTrue(uniqueTutorialGroupList.contains(TUT_01)); + } + + @Test + public void contains_tutorialGroupWithDifferentClassCode_returnsFalse() { + uniqueTutorialGroupList.add(TUT_01); + TutorialGroup editedTUT_01 = new TutorialGroupBuilder(TUT_01).withClassCode(VALID_CLASSCODE_G02) + .build(); + assertFalse(uniqueTutorialGroupList.contains(editedTUT_01)); + } + + @Test + public void add_nullTutorialGroup_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> uniqueTutorialGroupList.add(null)); + } + + @Test + public void add_duplicateTutorialGroup_throwsDuplicateTutorialGroupException() { + uniqueTutorialGroupList.add(TUT_01); + assertThrows(DuplicateTutorialGroupException.class, () -> uniqueTutorialGroupList.add(TUT_01)); + } + + @Test + public void remove_nullTutorialGroup_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> uniqueTutorialGroupList.remove(null)); + } + + @Test + public void remove_tutorialGroupDoesNotExist_throwsTutorialGroupNotFoundException() { + assertThrows(TutorialGroupNotFoundException.class, () -> uniqueTutorialGroupList.remove(TUT_01)); + } + + @Test + public void remove_existingTutorialGroup_removesTutorialGroup() { + uniqueTutorialGroupList.add(TUT_01); + uniqueTutorialGroupList.remove(TUT_01); + UniqueTutorialGroupList expectedUniqueTutorialGroupList = new UniqueTutorialGroupList(); + assertEquals(expectedUniqueTutorialGroupList, uniqueTutorialGroupList); + } + + @Test + public void asUnmodifiableObservableList_modifyList_throwsUnsupportedOperationException() { + assertThrows(UnsupportedOperationException.class, () + -> uniqueTutorialGroupList.asUnmodifiableObservableList().remove(0)); + } + +} \ No newline at end of file