diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 2380d62811c..7becce63b68 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -4,6 +4,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_SOCMED_INSTAGRAM; @@ -32,6 +33,7 @@ public class AddCommand extends Command { + "[" + PREFIX_SOCMED_TELEGRAM + "TELEGRAM] " + "[" + PREFIX_SOCMED_WHATSAPP + "WHATSAPP] " + "[" + PREFIX_BIRTHDAY + "BIRTHDAY] " + + "[" + PREFIX_MODULE + "MODULE]... " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " @@ -42,6 +44,8 @@ public class AddCommand extends Command { + PREFIX_SOCMED_INSTAGRAM + "john.doe " + PREFIX_SOCMED_WHATSAPP + "98765432 " + PREFIX_BIRTHDAY + "01/01/1990 " + + PREFIX_MODULE + "CS2103T " + + PREFIX_MODULE + "CS2101 " + PREFIX_TAG + "friends " + PREFIX_TAG + "owesMoney"; diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 035135a200d..bae8cceea2c 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -4,6 +4,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_SOCMED_INSTAGRAM; @@ -30,6 +31,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -47,10 +49,11 @@ public class EditCommand extends Command { + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + "[" + PREFIX_ADDRESS + "ADDRESS] " - + "[" + PREFIX_SOCMED_INSTAGRAM + "INSTAGRAM] " - + "[" + PREFIX_SOCMED_TELEGRAM + "TELEGRAM] " - + "[" + PREFIX_SOCMED_WHATSAPP + "WHATSAPP] " - + "[" + PREFIX_BIRTHDAY + "BIRTHDAY] " + + "[" + PREFIX_SOCMED_INSTAGRAM + "INSTAGRAM] " + + "[" + PREFIX_SOCMED_TELEGRAM + "TELEGRAM] " + + "[" + PREFIX_SOCMED_WHATSAPP + "WHATSAPP] " + + "[" + PREFIX_BIRTHDAY + "BIRTHDAY] " + + "[" + PREFIX_MODULE + "MODULE]... " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " @@ -105,8 +108,9 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); + Set updatedModules = editPersonDescriptor.getModules().orElse(personToEdit.getModules()); - Person p = new Person(updatedName, updatedTags); + Person p = new Person(updatedName, updatedTags, updatedModules); if (editPersonDescriptor.getPhone().isPresent()) { p.setPhone(editPersonDescriptor.getPhone().get()); @@ -182,8 +186,8 @@ public static class EditPersonDescriptor { private Address address; private SocialMedia socialMedia; private Set tags; - private Birthday birthday; + private Set modules; public EditPersonDescriptor() { } @@ -199,6 +203,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setAddress(toCopy.address); setSocialMedia(toCopy.socialMedia); setTags(toCopy.tags); + setModules(toCopy.modules); setBirthday(toCopy.birthday); } @@ -207,7 +212,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { * Returns true if at least one field is edited. */ public boolean isAnyFieldEdited() { - return CollectionUtil.isAnyNonNull(name, phone, email, address, socialMedia, tags, birthday); + return CollectionUtil.isAnyNonNull(name, phone, email, address, socialMedia, tags, birthday, modules); } public void setName(Name name) { @@ -278,6 +283,25 @@ public Optional> getTags() { return (tags != null) ? Optional.of(Collections.unmodifiableSet(tags)) : Optional.empty(); } + + /** + * Sets {@code modules} to this object's {@code modules}. + * A defensive copy of {@code modules} is used internally. + */ + public void setModules(Set modules) { + this.modules = (modules != null) ? new HashSet<>(modules) : null; + } + + /** + * Returns an unmodifiable modules set, which throws + * {@code UnsupportedOperationException} + * if modification is attempted. + * Returns {@code Optional#empty()} if {@code modules} is null. + */ + public Optional> getModules() { + return (modules != null) ? Optional.of(Collections.unmodifiableSet(modules)) : Optional.empty(); + } + @Override public boolean equals(Object other) { // short circuit if same object diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index af246df6f7e..1f113670f6c 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -4,6 +4,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_SOCMED; @@ -21,6 +22,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -35,9 +37,8 @@ public class AddCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public AddCommand parse(String args) throws ParseException { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, - PREFIX_BIRTHDAY, PREFIX_SOCMED, PREFIX_TAG); + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, + PREFIX_ADDRESS, PREFIX_BIRTHDAY, PREFIX_SOCMED, PREFIX_TAG, PREFIX_MODULE); if (!arePrefixesPresent(argMultimap, PREFIX_NAME) || !argMultimap.getPreamble().isEmpty()) { @@ -46,8 +47,9 @@ public AddCommand parse(String args) throws ParseException { Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()); Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); + Set moduleList = ParserUtil.parseModules(argMultimap.getAllValues(PREFIX_MODULE)); - Person person = new Person(name, tagList); + Person person = new Person(name, tagList, moduleList); if (argMultimap.getValue(PREFIX_PHONE).isPresent()) { Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()); diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 9bbea432e9a..a4d45d0b5b3 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -13,9 +13,9 @@ public class CliSyntax { public static final Prefix PREFIX_ADDRESS = new Prefix("a/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); public static final Prefix PREFIX_BIRTHDAY = new Prefix("b/"); + public static final Prefix PREFIX_MODULE = new Prefix("mod/"); public static final Prefix PREFIX_SOCMED = new Prefix("sm/"); public static final Prefix PREFIX_SOCMED_INSTAGRAM = new Prefix("ig/"); public static final Prefix PREFIX_SOCMED_TELEGRAM = new Prefix("tg/"); public static final Prefix PREFIX_SOCMED_WHATSAPP = new Prefix("wa/"); - } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 204487ad186..e5c6b05d11b 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -5,6 +5,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_BIRTHDAY; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_SOCMED; @@ -19,6 +20,7 @@ import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -36,7 +38,7 @@ public class EditCommandParser implements Parser { public EditCommand parse(String args) throws ParseException { requireNonNull(args); ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, - PREFIX_SOCMED, PREFIX_ADDRESS, PREFIX_TAG, PREFIX_BIRTHDAY); + PREFIX_ADDRESS, PREFIX_SOCMED, PREFIX_TAG, PREFIX_BIRTHDAY, PREFIX_MODULE); Index index; @@ -66,6 +68,7 @@ public EditCommand parse(String args) throws ParseException { editPersonDescriptor.setSocialMedia(ParserUtil.parseSocialMedia(argMultimap.getValue(PREFIX_SOCMED).get())); } parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags); + parseModulesForEdit(argMultimap.getAllValues(PREFIX_MODULE)).ifPresent(editPersonDescriptor::setModules); if (!editPersonDescriptor.isAnyFieldEdited()) { throw new ParseException(EditCommand.MESSAGE_NOT_EDITED); @@ -91,4 +94,20 @@ private Optional> parseTagsForEdit(Collection tags) throws Pars return Optional.of(ParserUtil.parseTags(tagSet)); } + /** + * Parses {@code Collection modules} into a {@code Set} if + * {@code modules} is non-empty. + * If {@code modules} contain only one element which is an empty string, it will be + * parsed into a + * {@code Set} containing zero modules. + */ + private Optional> parseModulesForEdit(Collection modules) throws ParseException { + assert modules != null; + + if (modules.isEmpty()) { + return Optional.empty(); + } + Collection moduleSet = modules.size() == 1 && modules.contains("") ? Collections.emptySet() : modules; + return Optional.of(ParserUtil.parseModules(moduleSet)); + } } diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 6dc168cffb0..57d036c8dc8 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -21,6 +21,7 @@ import seedu.address.model.socialmedia.SocialMedia; import seedu.address.model.socialmedia.Telegram; import seedu.address.model.socialmedia.WhatsApp; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -135,6 +136,21 @@ public static Tag parseTag(String tag) throws ParseException { return new Tag(trimmedTag); } + /** + * Parses a {@code String module} into a {@code module}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code module} is invalid. + */ + public static Module parseModule(String module) throws ParseException { + requireNonNull(module); + String trimmedModule = module.trim(); + if (!Module.isValidTagName(trimmedModule)) { + throw new ParseException(Module.MESSAGE_CONSTRAINTS); + } + return new Module(trimmedModule); + } + /** * Parses {@code Collection tags} into a {@code Set}. */ @@ -147,6 +163,18 @@ public static Set parseTags(Collection tags) throws ParseException return tagSet; } + /** + * Parses {@code Collection modules} into a {@code Set}. + */ + public static Set parseModules(Collection modules) throws ParseException { + requireNonNull(modules); + final Set moduleSet = new HashSet<>(); + for (String moduleName : modules) { + moduleSet.add(parseModule(moduleName)); + } + return moduleSet; + } + private static Instagram parseInstagram(String instagram) { if (instagram == null || instagram.isEmpty()) { return null; diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index a850bc618a9..75574295a19 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -9,6 +9,7 @@ import java.util.Set; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -26,6 +27,7 @@ public class Person { // Data fields private Optional
address; private final Set tags = new HashSet<>(); + private final Set modules = new HashSet<>(); private Optional birthday; // Social media fields @@ -34,8 +36,8 @@ public class Person { /** * Every field must be present and not null. */ - public Person(Name name, Set tags) { - requireAllNonNull(name, tags); + public Person(Name name, Set tags, Set modules) { + requireAllNonNull(name, tags, modules); this.name = name; this.phone = Optional.empty(); this.email = Optional.empty(); @@ -43,6 +45,7 @@ public Person(Name name, Set tags) { this.socialMedia = Optional.empty(); this.tags.addAll(tags); this.birthday = Optional.empty(); + this.modules.addAll(modules); } public void setPhone(Phone phone) { @@ -98,6 +101,15 @@ public Set getTags() { return Collections.unmodifiableSet(tags); } + /** + * Returns an immutable module set, which throws + * {@code UnsupportedOperationException} + * if modification is attempted. + */ + public Set getModules() { + return Collections.unmodifiableSet(modules); + } + /** * Returns true if both persons have the same name. * This defines a weaker notion of equality between two persons. @@ -130,13 +142,14 @@ public boolean equals(Object other) { && otherPerson.getPhone().equals(getPhone()) && otherPerson.getEmail().equals(getEmail()) && otherPerson.getAddress().equals(getAddress()) - && otherPerson.getTags().equals(getTags()); + && otherPerson.getTags().equals(getTags()) + && otherPerson.getModules().equals(getModules()); } @Override public int hashCode() { // use this method for custom fields hashing instead of implementing your own - return Objects.hash(name, phone, email, address, tags); + return Objects.hash(name, phone, email, address, tags, modules); } @Override @@ -159,6 +172,11 @@ public String toString() { builder.append("; Tags: "); tags.forEach(builder::append); } + Set modules = getModules(); + if (!modules.isEmpty()) { + builder.append("; Modules: "); + modules.forEach(builder::append); + } return builder.toString(); } diff --git a/src/main/java/seedu/address/model/tag/Module.java b/src/main/java/seedu/address/model/tag/Module.java new file mode 100644 index 00000000000..362fe82cb35 --- /dev/null +++ b/src/main/java/seedu/address/model/tag/Module.java @@ -0,0 +1,27 @@ +package seedu.address.model.tag; + +/** + * Represents a Module in the address book. + * Guarantees: immutable; name is valid as declared in {@link #isValidTagName(String)} + */ +public class Module extends Tag { + + public static final String MESSAGE_CONSTRAINTS = "Module names should be alphanumeric"; + public final String moduleName; + + /** + * Constructs a {@code Module}. + * + * @param moduleName A valid module name. + */ + public Module(String moduleName) { + super(moduleName, MESSAGE_CONSTRAINTS); + this.moduleName = moduleName; + } + /** + * Returns true if a given string is a valid module name. + */ + public static boolean isValidModuleName(String test) { + return isValidTagName(test); + } +} diff --git a/src/main/java/seedu/address/model/tag/Tag.java b/src/main/java/seedu/address/model/tag/Tag.java index b0ea7e7dad7..3c44265111a 100644 --- a/src/main/java/seedu/address/model/tag/Tag.java +++ b/src/main/java/seedu/address/model/tag/Tag.java @@ -25,6 +25,17 @@ public Tag(String tagName) { this.tagName = tagName; } + /** + * Constructs a {@code Tag}. + * + * @param tagName A valid tag name. + */ + public Tag(String tagName, String message) { + requireNonNull(tagName); + checkArgument(isValidTagName(tagName), message); + this.tagName = tagName; + } + /** * Returns true if a given string is a valid tag name. */ diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 4b3dea44bc1..9d01936ad55 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -16,6 +16,7 @@ import seedu.address.model.socialmedia.SocialMedia; import seedu.address.model.socialmedia.Telegram; import seedu.address.model.socialmedia.WhatsApp; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -23,9 +24,8 @@ */ public class SampleDataUtil { public static Person[] getSamplePersons() { - // Sample person 1 - Person p1 = new Person(new Name("Alex Yeoh"), getTagSet("friends")); + Person p1 = new Person(new Name("Alex Yeoh"), getTagSet("friends"), getModuleSet("CS2107")); p1.setPhone(new Phone("87438807")); p1.setEmail(new Email("alexyeoh@example.com")); p1.setAddress(new Address("Blk 30 Geylang Street 29, #06-40")); @@ -33,7 +33,7 @@ public static Person[] getSamplePersons() { p1.setBirthday(new Birthday("01/01/1990")); // Sample person 2 - Person p2 = new Person(new Name("Bernice Yu"), getTagSet("colleagues", "friends")); + Person p2 = new Person(new Name("Bernice Yu"), getTagSet("colleagues", "friends"), getModuleSet("CS2105")); p2.setPhone(new Phone("99272758")); p2.setEmail(new Email("berniceyu@example.com")); p2.setAddress(new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18")); @@ -42,7 +42,8 @@ public static Person[] getSamplePersons() { p2.setBirthday(new Birthday("31/05/2000")); // Sample person 3 - Person p3 = new Person(new Name("Charlotte Oliveiro"), getTagSet("neighbours")); + Person p3 = new Person(new Name("Charlotte Oliveiro"), getTagSet("neighbours"), + getModuleSet("CS2105", "ES2660")); p3.setPhone(new Phone("93210283")); p3.setEmail(new Email("charlotte@example.com")); p3.setAddress(new Address("Blk 11 Ang Mo Kio Street 74, #11-04")); @@ -51,7 +52,7 @@ public static Person[] getSamplePersons() { p3.setBirthday(new Birthday("07/07/1993")); // Sample person 4 - Person p4 = new Person(new Name("David Li"), getTagSet("family")); + Person p4 = new Person(new Name("David Li"), getTagSet("family"), getModuleSet()); p4.setPhone(new Phone("91031282")); p4.setEmail(new Email("lidavid@example.com")); p4.setAddress(new Address("Blk 436 Serangoon Gardens Street 26, #16-43")); @@ -59,7 +60,7 @@ public static Person[] getSamplePersons() { p4.setBirthday(new Birthday("18/06/1999")); // Sample person 5 - Person p5 = new Person(new Name("Irfan Ibrahim"), getTagSet("classmates")); + Person p5 = new Person(new Name("Irfan Ibrahim"), getTagSet("classmates"), getModuleSet("CS1101S")); p5.setPhone(new Phone("92492021")); p5.setEmail(new Email("irfan@example.com")); p5.setAddress(new Address("Blk 47 Tampines Street 20, #17-35")); @@ -68,7 +69,7 @@ public static Person[] getSamplePersons() { p5.setBirthday(new Birthday("29/02/2004")); // Sample person 6 - Person p6 = new Person(new Name("Roy Balakrishnan"), getTagSet("colleagues")); + Person p6 = new Person(new Name("Roy Balakrishnan"), getTagSet("colleagues"), getModuleSet("CS1101S")); p6.setPhone(new Phone("92624417")); p6.setEmail(new Email("royb@example.com")); p6.setAddress(new Address("Blk 45 Aljunied Street 85, #11-31")); @@ -98,4 +99,12 @@ public static Set getTagSet(String... strings) { .collect(Collectors.toSet()); } + /** + * Returns a module set containing the list of strings given. + */ + public static Set getModuleSet(String... strings) { + return Arrays.stream(strings) + .map(Module::new) + .collect(Collectors.toSet()); + } } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedModule.java b/src/main/java/seedu/address/storage/JsonAdaptedModule.java new file mode 100644 index 00000000000..2103a94249a --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonAdaptedModule.java @@ -0,0 +1,48 @@ +package seedu.address.storage; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.tag.Module; + +/** + * Jackson-friendly version of {@link Module}. + */ +class JsonAdaptedModule { + + private final String moduleName; + + /** + * Constructs a {@code JsonAdaptedModule} with the given {@code moduleName}. + */ + @JsonCreator + public JsonAdaptedModule(String moduleName) { + this.moduleName = moduleName; + } + + /** + * Converts a given {@code Module} into this class for Jackson use. + */ + public JsonAdaptedModule(Module source) { + this.moduleName = source.moduleName; + } + + @JsonValue + public String getModuleName() { + return moduleName; + } + + /** + * Converts this Jackson-friendly adapted module object into the model's {@code Module} object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted module. + */ + public Module toModelType() throws IllegalValueException { + if (!Module.isValidModuleName(moduleName)) { + throw new IllegalValueException(Module.MESSAGE_CONSTRAINTS); + } + return new Module(moduleName); + } + +} diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index a579a0a3310..af8cc364ec8 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -18,6 +18,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -33,6 +34,7 @@ class JsonAdaptedPerson { private JsonAdaptedAddress address = new JsonAdaptedAddress(); private JsonAdaptedSocialMedia socialMedia = new JsonAdaptedSocialMedia(); private final List tagged = new ArrayList<>(); + private final List modules = new ArrayList<>(); private JsonAdaptedBirthday birthday = new JsonAdaptedBirthday(); /** @@ -43,6 +45,7 @@ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone @JsonProperty("email") JsonAdaptedEmail email, @JsonProperty("address") JsonAdaptedAddress address, @JsonProperty("socialMedia") JsonAdaptedSocialMedia socialMedia, @JsonProperty("tagged") List tagged, + @JsonProperty("modules") List modules, @JsonProperty("birthday") JsonAdaptedBirthday birthday) { this.name = name; if (phone != null) { @@ -60,6 +63,9 @@ public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone if (tagged != null) { this.tagged.addAll(tagged); } + if (modules != null) { + this.modules.addAll(modules); + } if (birthday != null) { this.birthday = birthday; } @@ -74,6 +80,9 @@ public JsonAdaptedPerson(Person source) { .map(JsonAdaptedTag::new) .collect(Collectors.toList())); + modules.addAll(source.getModules().stream() + .map(JsonAdaptedModule::new) + .collect(Collectors.toList())); if (source.getPhone().isPresent()) { phone = new JsonAdaptedPhone(source.getPhone().get()); } @@ -108,6 +117,11 @@ public Person toModelType() throws IllegalValueException { personTags.add(tag.toModelType()); } + final List personModules = new ArrayList<>(); + for (JsonAdaptedModule module : modules) { + personModules.add(module.toModelType()); + } + if (name == null) { throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName())); } @@ -117,7 +131,8 @@ public Person toModelType() throws IllegalValueException { final Name modelName = new Name(name); final Set modelTags = new HashSet<>(personTags); - Person p = new Person(modelName, modelTags); + final Set modelModules = new HashSet<>(personModules); + Person p = new Person(modelName, modelTags, modelModules); if (phone != null) { Optional modelPhone = phone.toModelType(); @@ -132,7 +147,6 @@ public Person toModelType() throws IllegalValueException { p.setEmail(modelEmail.get()); } } - if (address != null) { Optional
modelAddress = address.toModelType(); if (modelAddress.isPresent()) { diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index a9ccbd95ecd..4ea578bc4cc 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -97,6 +97,10 @@ public PersonCard(Person person, int displayedIndex) { person.getTags().stream() .sorted(Comparator.comparing(tag -> tag.tagName)) .forEach(tag -> tags.getChildren().add(new Label(tag.tagName))); + person.getModules().stream() + .sorted(Comparator.comparing(module -> module.tagName)) + .forEach(module -> tags.getChildren().add(new Label(module.tagName))); + if (person.getBirthday().isPresent()) { birthday.setText(person.getBirthday().get().toString()); } else { diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json index f10eddee12e..fc2ede0bf07 100644 --- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json @@ -5,13 +5,15 @@ "phone" : "94351253", "email" : "alice@example.com", "address" : "123, Jurong West Ave 6, #08-111", - "tagged" : [ "friends" ] + "tagged" : [ "friends" ], + "modules" : ["CS2101"] }, { "name" : "Benson Meier", "phone" : "98765432", "email" : "johnd@example.com", "address" : "311, Clementi Ave 2, #02-25", - "tagged" : [ "owesMoney", "friends" ] + "tagged" : [ "owesMoney", "friends" ], + "modules" : ["CS2103T"] }, { "name" : "Carl Kurz", "phone" : "95352563", diff --git a/src/test/java/seedu/address/logic/LogicManagerTest.java b/src/test/java/seedu/address/logic/LogicManagerTest.java index ad923ac249a..e0bb50b74d6 100644 --- a/src/test/java/seedu/address/logic/LogicManagerTest.java +++ b/src/test/java/seedu/address/logic/LogicManagerTest.java @@ -81,7 +81,7 @@ public void execute_storageThrowsIoException_throwsCommandException() { // Execute add command String addCommand = AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY; - Person expectedPerson = new PersonBuilder(AMY).withTags().build(); + Person expectedPerson = new PersonBuilder(AMY).withTags().withModules().build(); ModelManager expectedModel = new ModelManager(); expectedModel.addPerson(expectedPerson); String expectedMessage = LogicManager.FILE_OPS_ERROR_MESSAGE + DUMMY_IO_EXCEPTION; diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 643a1d08069..0fa282eda00 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -36,6 +37,8 @@ public class CommandTestUtil { public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3"; public static final String VALID_TAG_HUSBAND = "husband"; public static final String VALID_TAG_FRIEND = "friend"; + public static final String VALID_MODULE_CS2103T = "CS2103T"; + public static final String VALID_MODULE_CS2101 = "CS2101"; public static final String NAME_DESC_AMY = " " + PREFIX_NAME + VALID_NAME_AMY; public static final String NAME_DESC_BOB = " " + PREFIX_NAME + VALID_NAME_BOB; @@ -47,12 +50,15 @@ public class CommandTestUtil { public static final String ADDRESS_DESC_BOB = " " + PREFIX_ADDRESS + VALID_ADDRESS_BOB; public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND; public static final String TAG_DESC_HUSBAND = " " + PREFIX_TAG + VALID_TAG_HUSBAND; + public static final String MODULE_DESC_CS2103T = " " + PREFIX_MODULE + VALID_MODULE_CS2103T; + public static final String MODULE_DESC_CS2101 = " " + PREFIX_MODULE + VALID_MODULE_CS2101; public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&"; // '&' not allowed in names public static final String INVALID_PHONE_DESC = " " + PREFIX_PHONE + "911a"; // 'a' not allowed in phones public static final String INVALID_EMAIL_DESC = " " + PREFIX_EMAIL + "bob!yahoo"; // missing '@' symbol public static final String INVALID_ADDRESS_DESC = " " + PREFIX_ADDRESS; // empty string not allowed for addresses public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags + public static final String INVALID_MODULE_DESC = " " + PREFIX_MODULE + "CS2!03T"; //! not allowed in modules public static final String PREAMBLE_WHITESPACE = "\t \r \n"; public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble"; @@ -63,10 +69,10 @@ public class CommandTestUtil { static { DESC_AMY = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) - .withTags(VALID_TAG_FRIEND).build(); + .withTags(VALID_TAG_FRIEND).withModules(VALID_MODULE_CS2101).build(); DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB) .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) - .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); + .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).withModules(VALID_MODULE_CS2103T).build(); } /** diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java index 214c6c2507b..e6813ca79f5 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static seedu.address.logic.commands.CommandTestUtil.DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2101; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; @@ -55,10 +56,10 @@ public void execute_someFieldsSpecifiedUnfilteredList_success() { PersonBuilder personInList = new PersonBuilder(lastPerson); Person editedPerson = personInList.withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB) - .withTags(VALID_TAG_HUSBAND).build(); + .withTags(VALID_TAG_HUSBAND).withModules(VALID_MODULE_CS2101).build(); EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB) - .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).build(); + .withPhone(VALID_PHONE_BOB).withTags(VALID_TAG_HUSBAND).withModules(VALID_MODULE_CS2101).build(); EditCommand editCommand = new EditCommand(indexLastPerson, descriptor); String expectedMessage = String.format(EditCommand.MESSAGE_EDIT_PERSON_SUCCESS, editedPerson); diff --git a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java index e0288792e72..6d686da97ed 100644 --- a/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java +++ b/src/test/java/seedu/address/logic/commands/EditPersonDescriptorTest.java @@ -6,6 +6,8 @@ import static seedu.address.logic.commands.CommandTestUtil.DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; @@ -52,7 +54,8 @@ public void equals() { assertFalse(DESC_AMY.equals(editedAmy)); // different tags -> returns false - editedAmy = new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND).build(); + editedAmy = new EditPersonDescriptorBuilder(DESC_AMY).withTags(VALID_TAG_HUSBAND) + .withModules(VALID_MODULE_CS2103T, VALID_MODULE_CS2101).build(); assertFalse(DESC_AMY.equals(editedAmy)); } } diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index caf10d5fd3c..adb51d4920f 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -7,9 +7,12 @@ import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_MODULE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY; @@ -20,6 +23,8 @@ import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; @@ -37,6 +42,7 @@ import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; import seedu.address.testutil.PersonBuilder; @@ -45,39 +51,47 @@ public class AddCommandParserTest { @Test public void parse_allFieldsPresent_success() { - Person expectedPerson = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND).build(); + Person expectedPerson = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND) + .withModules(VALID_MODULE_CS2101).build(); // whitespace only preamble assertParseSuccess(parser, PREAMBLE_WHITESPACE + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); + + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPerson)); // multiple names - last name accepted assertParseSuccess(parser, NAME_DESC_AMY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); + + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPerson)); // multiple phones - last phone accepted assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_AMY + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); + + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPerson)); // multiple emails - last email accepted assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_AMY + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); + + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPerson)); // multiple addresses - last address accepted assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_AMY - + ADDRESS_DESC_BOB + TAG_DESC_FRIEND, new AddCommand(expectedPerson)); + + ADDRESS_DESC_BOB + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPerson)); // multiple tags - all accepted Person expectedPersonMultipleTags = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2101).build(); assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB - + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, new AddCommand(expectedPersonMultipleTags)); + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2101, new AddCommand(expectedPersonMultipleTags)); + + // multiple modules - all accepted + Person expectedPersonMultipleModules = new PersonBuilder(BOB).withTags(VALID_TAG_FRIEND) + .withModules(VALID_MODULE_CS2103T, VALID_MODULE_CS2101).build(); + assertParseSuccess(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + new AddCommand(expectedPersonMultipleModules)); } @Test public void parse_optionalFieldsMissing_success() { // zero tags - Person expectedPerson = new PersonBuilder(AMY).withTags().build(); + Person expectedPerson = new PersonBuilder(AMY).withTags().withModules().build(); assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY, new AddCommand(expectedPerson)); } @@ -99,23 +113,33 @@ public void parse_compulsoryFieldMissing_failure() { public void parse_invalidValue_failure() { // invalid name assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB - + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Name.MESSAGE_CONSTRAINTS); + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Name.MESSAGE_CONSTRAINTS); // invalid phone assertParseFailure(parser, NAME_DESC_BOB + INVALID_PHONE_DESC + EMAIL_DESC_BOB + ADDRESS_DESC_BOB - + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Phone.MESSAGE_CONSTRAINTS); + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Phone.MESSAGE_CONSTRAINTS); // invalid email assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB - + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS); + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Email.MESSAGE_CONSTRAINTS); // invalid address assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC - + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS); + + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Address.MESSAGE_CONSTRAINTS); // invalid tag assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB - + INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS); + + INVALID_TAG_DESC + VALID_TAG_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Tag.MESSAGE_CONSTRAINTS); + + // invalid module + assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB + + TAG_DESC_HUSBAND + VALID_TAG_FRIEND + INVALID_MODULE_DESC + MODULE_DESC_CS2101, + Module.MESSAGE_CONSTRAINTS); // two invalid values, only first invalid value reported assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC, @@ -123,7 +147,7 @@ public void parse_invalidValue_failure() { // non-empty preamble assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB - + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, + + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } } diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index 2ff31522486..e21eebde190 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -7,9 +7,12 @@ import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC; +import static seedu.address.logic.commands.CommandTestUtil.INVALID_MODULE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC; +import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.MODULE_DESC_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY; import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; @@ -19,11 +22,14 @@ import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_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_MODULE_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_FRIEND; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; @@ -40,6 +46,7 @@ import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; import seedu.address.testutil.EditPersonDescriptorBuilder; @@ -47,6 +54,8 @@ public class EditCommandParserTest { private static final String TAG_EMPTY = " " + PREFIX_TAG; + private static final String MODULE_EMPTY = " " + PREFIX_MODULE; + private static final String MESSAGE_INVALID_FORMAT = String.format(MESSAGE_INVALID_COMMAND_FORMAT, EditCommand.MESSAGE_USAGE); @@ -86,6 +95,8 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email assertParseFailure(parser, "1" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag + assertParseFailure(parser, "1" + INVALID_MODULE_DESC, Module.MESSAGE_CONSTRAINTS); // invalid tag + // invalid phone followed by valid email assertParseFailure(parser, "1" + INVALID_PHONE_DESC + EMAIL_DESC_AMY, Phone.MESSAGE_CONSTRAINTS); @@ -100,6 +111,15 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + TAG_DESC_FRIEND + TAG_EMPTY + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS); assertParseFailure(parser, "1" + TAG_EMPTY + TAG_DESC_FRIEND + TAG_DESC_HUSBAND, Tag.MESSAGE_CONSTRAINTS); + // while parsing {@code PREFIX_MODULE} alone will reset the tags of the {@code Person} being edited, + // parsing it together with a valid tag results in error + assertParseFailure(parser, "1" + MODULE_DESC_CS2101 + MODULE_DESC_CS2103T + MODULE_EMPTY, + Module.MESSAGE_CONSTRAINTS); + assertParseFailure(parser, "1" + MODULE_DESC_CS2103T + MODULE_EMPTY + MODULE_DESC_CS2101, + Module.MESSAGE_CONSTRAINTS); + assertParseFailure(parser, "1" + MODULE_EMPTY + MODULE_DESC_CS2103T + MODULE_DESC_CS2101, + Module.MESSAGE_CONSTRAINTS); + // multiple invalid values, but only the first invalid value is captured assertParseFailure(parser, "1" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY, Name.MESSAGE_CONSTRAINTS); @@ -108,12 +128,13 @@ public void parse_invalidValue_failure() { @Test public void parse_allFieldsSpecified_success() { Index targetIndex = INDEX_SECOND_PERSON; - String userInput = targetIndex.getOneBased() + PHONE_DESC_BOB + TAG_DESC_HUSBAND - + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND; + String userInput = targetIndex.getOneBased() + PHONE_DESC_BOB + MODULE_DESC_CS2103T + TAG_DESC_HUSBAND + + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + NAME_DESC_AMY + TAG_DESC_FRIEND + MODULE_DESC_CS2101; EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) - .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); + .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).withModules(VALID_MODULE_CS2103T, VALID_MODULE_CS2101) + .build(); EditCommand expectedCommand = new EditCommand(targetIndex, descriptor); assertParseSuccess(parser, userInput, expectedCommand); @@ -163,18 +184,25 @@ public void parse_oneFieldSpecified_success() { descriptor = new EditPersonDescriptorBuilder().withTags(VALID_TAG_FRIEND).build(); expectedCommand = new EditCommand(targetIndex, descriptor); assertParseSuccess(parser, userInput, expectedCommand); + + //modules + userInput = targetIndex.getOneBased() + MODULE_DESC_CS2103T; + descriptor = new EditPersonDescriptorBuilder().withModules(VALID_MODULE_CS2103T).build(); + expectedCommand = new EditCommand(targetIndex, descriptor); + assertParseSuccess(parser, userInput, expectedCommand); } @Test public void parse_multipleRepeatedFields_acceptsLast() { Index targetIndex = INDEX_FIRST_PERSON; String userInput = targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY - + TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND - + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND; + + TAG_DESC_FRIEND + PHONE_DESC_AMY + MODULE_DESC_CS2103T + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + + TAG_DESC_FRIEND + MODULE_DESC_CS2101 + PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + + TAG_DESC_HUSBAND + MODULE_DESC_CS2103T; EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withPhone(VALID_PHONE_BOB) .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_FRIEND, VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2101, VALID_MODULE_CS2103T).build(); EditCommand expectedCommand = new EditCommand(targetIndex, descriptor); assertParseSuccess(parser, userInput, expectedCommand); @@ -208,4 +236,15 @@ public void parse_resetTags_success() { assertParseSuccess(parser, userInput, expectedCommand); } + + @Test + public void parse_resetModules_success() { + Index targetIndex = INDEX_THIRD_PERSON; + String userInput = targetIndex.getOneBased() + MODULE_EMPTY; + + EditPersonDescriptor descriptor = new EditPersonDescriptorBuilder().withModules().build(); + EditCommand expectedCommand = new EditCommand(targetIndex, descriptor); + + assertParseSuccess(parser, userInput, expectedCommand); + } } diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 5e60b668e3f..cda440fd140 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -18,6 +18,7 @@ import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; public class ParserUtilTest { @@ -26,6 +27,7 @@ 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_MODULE = "CS2!03T"; private static final String INVALID_BIRTHDAY = "Hello/01/2000"; private static final String VALID_NAME = "Rachel Walker"; @@ -34,6 +36,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_MODULE_1 = "CS2103T"; + private static final String VALID_MODULE_2 = "CS2101"; private static final String VALID_BIRTHDAY = "01/01/2000"; private static final String WHITESPACE = " \t\r\n"; @@ -196,6 +200,55 @@ public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception { assertEquals(expectedTagSet, actualTagSet); } + + @Test + public void parseModule_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseModule(null)); + } + + @Test + public void parseModule_invalidValue_throwsParseException() { + assertThrows(ParseException.class, () -> ParserUtil.parseModule(INVALID_MODULE)); + } + + @Test + public void parseModule_validValueWithoutWhitespace_returnsModule() throws Exception { + Module expectedModule = new Module(VALID_MODULE_1); + assertEquals(expectedModule, ParserUtil.parseModule(VALID_MODULE_1)); + } + + @Test + public void parseModule_validValueWithWhitespace_returnsTrimmedModule() throws Exception { + String moduleWithWhitespace = WHITESPACE + VALID_MODULE_1 + WHITESPACE; + Module expectedModule = new Module(VALID_MODULE_1); + assertEquals(expectedModule, ParserUtil.parseModule(moduleWithWhitespace)); + } + + @Test + public void parseModules_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseModules(null)); + } + + @Test + public void parseModules_collectionWithInvalidTags_throwsParseException() { + assertThrows(ParseException.class, () -> ParserUtil.parseModules(Arrays.asList(VALID_MODULE_1, + INVALID_MODULE))); + } + + @Test + public void parseModules_emptyCollection_returnsEmptySet() throws Exception { + assertTrue(ParserUtil.parseModules(Collections.emptyList()).isEmpty()); + } + + @Test + public void parseModules_collectionWithValidModules_returnsModuleSet() throws Exception { + Set actualModuleSet = ParserUtil.parseModules(Arrays.asList(VALID_MODULE_1, VALID_MODULE_2)); + Set expectedModuleSet = new HashSet<>(Arrays.asList(new Module(VALID_MODULE_1), + new Module(VALID_MODULE_2))); + + assertEquals(expectedModuleSet, actualModuleSet); + } + @Test public void parseBirthday_null_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> ParserUtil.parseBirthday((String) null)); diff --git a/src/test/java/seedu/address/model/AddressBookTest.java b/src/test/java/seedu/address/model/AddressBookTest.java index 87782528ecd..51de1846eee 100644 --- a/src/test/java/seedu/address/model/AddressBookTest.java +++ b/src/test/java/seedu/address/model/AddressBookTest.java @@ -4,6 +4,7 @@ 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_MODULE_CS2101; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.ALICE; @@ -47,7 +48,7 @@ public void resetData_withValidReadOnlyAddressBook_replacesData() { public void resetData_withDuplicatePersons_throwsDuplicatePersonException() { // Two persons with the same identity fields Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2101).build(); List newPersons = Arrays.asList(ALICE, editedAlice); AddressBookStub newData = new AddressBookStub(newPersons); @@ -74,7 +75,7 @@ public void hasPerson_personInAddressBook_returnsTrue() { public void hasPerson_personWithSameIdentityFieldsInAddressBook_returnsTrue() { addressBook.addPerson(ALICE); Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2101).build(); assertTrue(addressBook.hasPerson(editedAlice)); } diff --git a/src/test/java/seedu/address/model/person/PersonTest.java b/src/test/java/seedu/address/model/person/PersonTest.java index b29c097cfd4..3292967fe51 100644 --- a/src/test/java/seedu/address/model/person/PersonTest.java +++ b/src/test/java/seedu/address/model/person/PersonTest.java @@ -4,6 +4,8 @@ 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_EMAIL_BOB; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; @@ -33,7 +35,7 @@ public void isSamePerson() { // same name, all other attributes different -> returns true Person editedAlice = new PersonBuilder(ALICE).withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB) - .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).build(); + .withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND).withModules(VALID_MODULE_CS2101).build(); assertTrue(ALICE.isSamePerson(editedAlice)); // different name, all other attributes same -> returns false @@ -87,5 +89,9 @@ public void equals() { // different tags -> returns false editedAlice = new PersonBuilder(ALICE).withTags(VALID_TAG_HUSBAND).build(); assertFalse(ALICE.equals(editedAlice)); + + // different modules -> returns false + editedAlice = new PersonBuilder(ALICE).withTags(VALID_MODULE_CS2103T).build(); + assertFalse(ALICE.equals(editedAlice)); } } diff --git a/src/test/java/seedu/address/model/person/UniquePersonListTest.java b/src/test/java/seedu/address/model/person/UniquePersonListTest.java index 1cc5fe9e0fe..e8c91217bb9 100644 --- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java +++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java @@ -4,6 +4,7 @@ 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_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.testutil.Assert.assertThrows; import static seedu.address.testutil.TypicalPersons.ALICE; @@ -43,7 +44,7 @@ public void contains_personInList_returnsTrue() { public void contains_personWithSameIdentityFieldsInList_returnsTrue() { uniquePersonList.add(ALICE); Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2103T).build(); assertTrue(uniquePersonList.contains(editedAlice)); } @@ -86,7 +87,7 @@ public void setPerson_editedPersonIsSamePerson_success() { public void setPerson_editedPersonHasSameIdentity_success() { uniquePersonList.add(ALICE); Person editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND) - .build(); + .withModules(VALID_MODULE_CS2103T).build(); uniquePersonList.setPerson(ALICE, editedAlice); UniquePersonList expectedUniquePersonList = new UniquePersonList(); expectedUniquePersonList.add(editedAlice); diff --git a/src/test/java/seedu/address/model/tag/ModuleTest.java b/src/test/java/seedu/address/model/tag/ModuleTest.java new file mode 100644 index 00000000000..179d8c43f24 --- /dev/null +++ b/src/test/java/seedu/address/model/tag/ModuleTest.java @@ -0,0 +1,26 @@ +package seedu.address.model.tag; + +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class ModuleTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new Module(null)); + } + + @Test + public void constructor_invalidModuleName_throwsIllegalArgumentException() { + String invalidModuleName = ""; + assertThrows(IllegalArgumentException.class, () -> new Module(invalidModuleName)); + } + + @Test + public void isValidModuleName() { + // null module name + assertThrows(NullPointerException.class, () -> Module.isValidModuleName(null)); + } + +} diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java index a791e6bd819..7cc306c82f4 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -24,6 +24,7 @@ public class JsonAdaptedPersonTest { 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_MODULE = "CS2!03T"; private static final String INVALID_BIRTHDAY = "01/01-2000"; private static final String VALID_NAME = BENSON.getName().toString(); @@ -36,6 +37,9 @@ public class JsonAdaptedPersonTest { private static final List VALID_TAGS = BENSON.getTags().stream() .map(JsonAdaptedTag::new) .collect(Collectors.toList()); + private static final List VALID_MODULES = BENSON.getModules().stream() + .map(JsonAdaptedModule::new) + .collect(Collectors.toList()); @Test public void toModelType_validPersonDetails_returnsPerson() throws Exception { @@ -46,7 +50,7 @@ public void toModelType_validPersonDetails_returnsPerson() throws Exception { @Test public void toModelType_invalidName_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_SOCIALMEDIA, VALID_TAGS, VALID_BIRTHDAY); + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Name.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -54,7 +58,7 @@ public void toModelType_invalidName_throwsIllegalValueException() { @Test public void toModelType_nullName_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_SOCIALMEDIA, VALID_TAGS, VALID_BIRTHDAY); + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -62,8 +66,8 @@ public void toModelType_nullName_throwsIllegalValueException() { @Test public void toModelType_invalidPhone_throwsIllegalValueException() { JsonAdaptedPhone invalidPhone = new JsonAdaptedPhone(INVALID_PHONE); - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, invalidPhone, VALID_EMAIL, - VALID_ADDRESS, VALID_SOCIALMEDIA, VALID_TAGS, VALID_BIRTHDAY); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, invalidPhone, VALID_EMAIL, VALID_ADDRESS, + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Phone.MESSAGE_CONSTRAINTS; assertThrows(IllegalArgumentException.class, expectedMessage, person::toModelType); } @@ -71,17 +75,16 @@ public void toModelType_invalidPhone_throwsIllegalValueException() { @Test public void toModelType_invalidEmail_throwsIllegalValueException() { JsonAdaptedEmail invalidEmail = new JsonAdaptedEmail(INVALID_EMAIL); - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, invalidEmail, - VALID_ADDRESS, VALID_SOCIALMEDIA, VALID_TAGS, VALID_BIRTHDAY); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, invalidEmail, VALID_ADDRESS, + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Email.MESSAGE_CONSTRAINTS; assertThrows(IllegalArgumentException.class, expectedMessage, person::toModelType); } - @Test public void toModelType_invalidAddress_throwsIllegalValueException() { JsonAdaptedAddress invalidAddress = new JsonAdaptedAddress(INVALID_ADDRESS); JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, invalidAddress, - VALID_SOCIALMEDIA, VALID_TAGS, VALID_BIRTHDAY); + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Address.MESSAGE_CONSTRAINTS; assertThrows(IllegalArgumentException.class, expectedMessage, person::toModelType); } @@ -91,7 +94,7 @@ public void toModelType_invalidTags_throwsIllegalValueException() { List invalidTags = new ArrayList<>(VALID_TAGS); invalidTags.add(new JsonAdaptedTag(INVALID_TAG)); JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_SOCIALMEDIA, invalidTags, VALID_BIRTHDAY); + VALID_SOCIALMEDIA, invalidTags, VALID_MODULES, VALID_BIRTHDAY); assertThrows(IllegalValueException.class, person::toModelType); } @@ -99,8 +102,16 @@ public void toModelType_invalidTags_throwsIllegalValueException() { public void toModelType_invalidBirthday_throwsIllegalValueException() { JsonAdaptedBirthday invalidBirthday = new JsonAdaptedBirthday(INVALID_BIRTHDAY); JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_SOCIALMEDIA, VALID_TAGS, invalidBirthday); + VALID_SOCIALMEDIA, VALID_TAGS, VALID_MODULES, invalidBirthday); assertThrows(IllegalArgumentException.class, person::toModelType); } + @Test + public void toModelType_invalidModules_throwsIllegalValueException() { + List invalidModules = new ArrayList<>(VALID_MODULES); + invalidModules.add(new JsonAdaptedModule(INVALID_MODULE)); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, + VALID_SOCIALMEDIA, VALID_TAGS, invalidModules, VALID_BIRTHDAY); + assertThrows(IllegalValueException.class, person::toModelType); + } } diff --git a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java index da97191c38f..1305ba62999 100644 --- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java @@ -11,6 +11,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -40,6 +41,7 @@ public EditPersonDescriptorBuilder(Person person) { descriptor.setAddress(person.getAddress().get()); descriptor.setSocialMedia(person.getSocialMedia().orElse(SocialMedia.create())); descriptor.setTags(person.getTags()); + descriptor.setModules(person.getModules()); } /** @@ -84,6 +86,16 @@ public EditPersonDescriptorBuilder withTags(String... tags) { return this; } + /** + * Parses the {@code modules} into a {@code Set} and set it to the {@code EditPersonDescriptor} + * that we are building. + */ + public EditPersonDescriptorBuilder withModules(String... modules) { + Set moduleSet = Stream.of(modules).map(Module::new).collect(Collectors.toSet()); + descriptor.setModules(moduleSet); + return this; + } + public EditPersonDescriptor build() { return descriptor; } diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java index 9310ac106f4..347300b47f2 100644 --- a/src/test/java/seedu/address/testutil/PersonBuilder.java +++ b/src/test/java/seedu/address/testutil/PersonBuilder.java @@ -10,6 +10,7 @@ import seedu.address.model.person.Person; import seedu.address.model.person.Phone; import seedu.address.model.socialmedia.SocialMedia; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; import seedu.address.model.util.SampleDataUtil; @@ -29,6 +30,7 @@ public class PersonBuilder { private Address address; private SocialMedia socialMedia; private Set tags; + private Set modules; private Birthday birthday; /** @@ -41,6 +43,7 @@ public PersonBuilder() { address = new Address(DEFAULT_ADDRESS); socialMedia = SocialMedia.create(); tags = new HashSet<>(); + modules = new HashSet<>(); } /** @@ -53,6 +56,7 @@ public PersonBuilder(Person personToCopy) { address = personToCopy.getAddress().get(); socialMedia = personToCopy.getSocialMedia().orElse(SocialMedia.create()); tags = new HashSet<>(personToCopy.getTags()); + modules = new HashSet<>(personToCopy.getModules()); } /** @@ -72,6 +76,15 @@ public PersonBuilder withTags(String... tags) { return this; } + /** + * Parses the {@code modules} into a {@code Set} and set it to the + * {@code Person} that we are building. + */ + public PersonBuilder withModules(String... modules) { + this.modules = SampleDataUtil.getModuleSet(modules); + return this; + } + /** * Sets the {@code Address} of the {@code Person} that we are building. */ @@ -122,7 +135,7 @@ public PersonBuilder withSocialMedia(SocialMedia socialMedia) { * @return a person with the given details. */ public Person build() { - Person p = new Person(name, tags); + Person p = new Person(name, tags, modules); if (phone != null) { p.setPhone(phone); diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java index 40b72d6b788..ed28923e701 100644 --- a/src/test/java/seedu/address/testutil/PersonUtil.java +++ b/src/test/java/seedu/address/testutil/PersonUtil.java @@ -2,6 +2,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_MODULE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -11,6 +12,7 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; import seedu.address.model.person.Person; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -44,6 +46,9 @@ public static String getPersonDetails(Person person) { person.getTags().stream().forEach( s -> sb.append(PREFIX_TAG + s.tagName + " ") ); + person.getModules().stream().forEach( + s -> sb.append(PREFIX_MODULE + s.moduleName + " ") + ); return sb.toString(); } @@ -59,11 +64,19 @@ public static String getEditPersonDescriptorDetails(EditPersonDescriptor descrip if (descriptor.getTags().isPresent()) { Set tags = descriptor.getTags().get(); if (tags.isEmpty()) { - sb.append(PREFIX_TAG); + sb.append(PREFIX_TAG).append(" "); } else { tags.forEach(s -> sb.append(PREFIX_TAG).append(s.tagName).append(" ")); } } + if (descriptor.getModules().isPresent()) { + Set modules = descriptor.getModules().get(); + if (modules.isEmpty()) { + sb.append(PREFIX_MODULE).append(" "); + } else { + modules.forEach(s -> sb.append(PREFIX_MODULE).append(s.moduleName).append(" ")); + } + } return sb.toString(); } } diff --git a/src/test/java/seedu/address/testutil/TypicalPersons.java b/src/test/java/seedu/address/testutil/TypicalPersons.java index 89b18cb9c3e..d81c96208d1 100644 --- a/src/test/java/seedu/address/testutil/TypicalPersons.java +++ b/src/test/java/seedu/address/testutil/TypicalPersons.java @@ -4,6 +4,8 @@ import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_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_MODULE_CS2101; +import static seedu.address.logic.commands.CommandTestUtil.VALID_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_AMY; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB; import static seedu.address.logic.commands.CommandTestUtil.VALID_PHONE_AMY; @@ -26,11 +28,13 @@ public class TypicalPersons { public static final Person ALICE = new PersonBuilder().withName("Alice Pauline") .withAddress("123, Jurong West Ave 6, #08-111").withEmail("alice@example.com") .withPhone("94351253") - .withTags("friends").build(); + .withTags("friends") + .withModules("CS2101").build(); public static final Person BENSON = new PersonBuilder().withName("Benson Meier") .withAddress("311, Clementi Ave 2, #02-25") .withEmail("johnd@example.com").withPhone("98765432") - .withTags("owesMoney", "friends").withBirthday("30/04/2004").build(); + .withTags("owesMoney", "friends").withBirthday("30/04/2004") + .withModules("CS2103T").build(); public static final Person CARL = new PersonBuilder().withName("Carl Kurz").withPhone("95352563") .withEmail("heinz@example.com").withAddress("wall street").build(); public static final Person DANIEL = new PersonBuilder().withName("Daniel Meier").withPhone("87652533") @@ -64,10 +68,11 @@ 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).withTags(VALID_TAG_FRIEND).build(); + .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withTags(VALID_TAG_FRIEND) + .withModules(VALID_MODULE_CS2101).build(); public static final Person BOB = new PersonBuilder().withName(VALID_NAME_BOB).withPhone(VALID_PHONE_BOB) .withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB).withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND) - .build(); + .withModules(VALID_MODULE_CS2103T).build(); public static final String KEYWORD_MATCHING_MEIER = "Meier"; // A keyword that matches MEIER