From 5331e48f3b1078664193de31c6328204b506da58 Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 13:26:07 +0800 Subject: [PATCH 1/6] add module tag functionality with testing --- .../address/logic/commands/AddCommand.java | 4 ++ .../address/logic/commands/EditCommand.java | 30 +++++++++-- .../logic/parser/AddCommandParser.java | 7 ++- .../seedu/address/logic/parser/CliSyntax.java | 1 + .../logic/parser/EditCommandParser.java | 21 +++++++- .../address/logic/parser/ParserUtil.java | 30 ++++++++++- .../seedu/address/model/person/Person.java | 26 +++++++-- .../java/seedu/address/model/tag/Module.java | 28 ++++++++++ .../java/seedu/address/model/tag/Tag.java | 11 ++++ .../address/model/util/SampleDataUtil.java | 21 +++++--- .../address/storage/JsonAdaptedModule.java | 47 ++++++++++++++++ .../address/storage/JsonAdaptedPerson.java | 19 ++++++- .../java/seedu/address/ui/PersonCard.java | 3 ++ .../typicalPersonsAddressBook.json | 6 ++- .../seedu/address/logic/LogicManagerTest.java | 2 +- .../logic/commands/CommandTestUtil.java | 10 +++- .../logic/commands/EditCommandTest.java | 6 ++- .../commands/EditPersonDescriptorTest.java | 5 +- .../logic/parser/AddCommandParserTest.java | 54 +++++++++++++------ .../logic/parser/EditCommandParserTest.java | 47 +++++++++++++--- .../address/logic/parser/ParserUtilTest.java | 51 ++++++++++++++++++ .../seedu/address/model/AddressBookTest.java | 6 ++- .../address/model/person/PersonTest.java | 8 ++- .../model/person/UniquePersonListTest.java | 6 ++- .../seedu/address/model/tag/ModuleTest.java | 26 +++++++++ .../storage/JsonAdaptedPersonTest.java | 33 ++++++++---- .../testutil/EditPersonDescriptorBuilder.java | 12 +++++ .../seedu/address/testutil/PersonBuilder.java | 15 +++++- .../seedu/address/testutil/PersonUtil.java | 13 +++++ .../address/testutil/TypicalPersons.java | 13 +++-- 30 files changed, 494 insertions(+), 67 deletions(-) create mode 100644 src/main/java/seedu/address/model/tag/Module.java create mode 100644 src/main/java/seedu/address/storage/JsonAdaptedModule.java create mode 100644 src/test/java/seedu/address/model/tag/ModuleTest.java diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 6ac1b4a9e50..1b41ea6c5b1 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_TAG; @@ -26,6 +27,7 @@ public class AddCommand extends Command { + PREFIX_EMAIL + "EMAIL " + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_BIRTHDAY + "BIRTHDAY] " + + "[" + PREFIX_MODULE + "MODULE]... " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " @@ -33,6 +35,8 @@ public class AddCommand extends Command { + PREFIX_EMAIL + "johnd@example.com " + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 " + 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 d69253bac0d..c11950714be 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_TAG; @@ -26,6 +27,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; /** @@ -44,6 +46,7 @@ public class EditCommand extends Command { + "[" + PREFIX_EMAIL + "EMAIL] " + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_BIRTHDAY + "BIRTHDAY] " + + "[" + PREFIX_MODULE + "MODULE] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " @@ -101,8 +104,9 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail()); Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); + Set updatedModules = editPersonDescriptor.getModules().orElse(personToEdit.getModules()); - Person p = new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags); + Person p = new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags, updatedModules); if (editPersonDescriptor.getBirthday().isPresent()) { p.setBirthday(editPersonDescriptor.getBirthday().get()); @@ -144,8 +148,8 @@ public static class EditPersonDescriptor { private Email email; private Address address; private Set tags; - private Birthday birthday; + private Set modules; public EditPersonDescriptor() { } @@ -160,6 +164,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setEmail(toCopy.email); setAddress(toCopy.address); setTags(toCopy.tags); + setModules(toCopy.modules); setBirthday(toCopy.birthday); } @@ -168,7 +173,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { * Returns true if at least one field is edited. */ public boolean isAnyFieldEdited() { - return CollectionUtil.isAnyNonNull(name, phone, email, address, tags, birthday); + return CollectionUtil.isAnyNonNull(name, phone, email, address, tags, birthday, modules); } public void setName(Name name) { @@ -229,6 +234,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 66e7f88bedf..60524ac4b32 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_TAG; @@ -19,6 +20,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; /** @@ -34,7 +36,7 @@ public class AddCommandParser implements Parser { */ public AddCommand parse(String args) throws ParseException { ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, - PREFIX_ADDRESS, PREFIX_BIRTHDAY, PREFIX_TAG); + PREFIX_ADDRESS, PREFIX_BIRTHDAY, PREFIX_TAG, PREFIX_MODULE); if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) || !argMultimap.getPreamble().isEmpty()) { @@ -46,8 +48,9 @@ public AddCommand parse(String args) throws ParseException { Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()); Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()); Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); + Set moduleList = ParserUtil.parseModules(argMultimap.getAllValues(PREFIX_MODULE)); - Person person = new Person(name, phone, email, address, tagList); + Person person = new Person(name, phone, email, address, tagList, moduleList); if (argMultimap.getValue(PREFIX_BIRTHDAY).isPresent()) { Birthday birthday = ParserUtil.parseBirthday(argMultimap.getValue(PREFIX_BIRTHDAY).get()); diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index d773b3652ba..88ecbc03ff6 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -13,5 +13,6 @@ 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/"); } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index aa1d8b501ef..08e369bf509 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_TAG; @@ -18,6 +19,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; /** @@ -35,7 +37,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_ADDRESS, PREFIX_TAG, PREFIX_BIRTHDAY); + PREFIX_ADDRESS, PREFIX_TAG, PREFIX_BIRTHDAY, PREFIX_MODULE); Index index; @@ -62,6 +64,7 @@ public EditCommand parse(String args) throws ParseException { editPersonDescriptor.setBirthday(ParserUtil.parseBirthday(argMultimap.getValue(PREFIX_BIRTHDAY).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); @@ -87,4 +90,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 44293d5cf10..22dde5a4c43 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -14,6 +14,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; /** @@ -122,11 +123,26 @@ public static Tag parseTag(String tag) throws ParseException { requireNonNull(tag); String trimmedTag = tag.trim(); if (!Tag.isValidTagName(trimmedTag)) { - throw new ParseException(Tag.MESSAGE_CONSTRAINTS); + throw new ParseException(Tag.MESSAGE_CONSTRAINTS + tag); } 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}. */ @@ -138,4 +154,16 @@ 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; + } } diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index 261d171183e..3738b99fa29 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -8,6 +8,7 @@ import java.util.Optional; import java.util.Set; +import seedu.address.model.tag.Module; import seedu.address.model.tag.Tag; /** @@ -25,19 +26,21 @@ public class Person { // Data fields private final Address address; private final Set tags = new HashSet<>(); + private final Set modules = new HashSet<>(); private Optional birthday; /** * Every field must be present and not null. */ - public Person(Name name, Phone phone, Email email, Address address, Set tags) { - requireAllNonNull(name, phone, email, address, tags); + public Person(Name name, Phone phone, Email email, Address address, Set tags, Set modules) { + requireAllNonNull(name, phone, email, address, tags, modules); this.name = name; this.phone = phone; this.email = email; this.address = address; this.tags.addAll(tags); this.birthday = Optional.empty(); + this.modules.addAll(modules); } public void setBirthday(Birthday birthday) { @@ -73,6 +76,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. @@ -105,13 +117,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 @@ -132,6 +145,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..c3244c2b69d --- /dev/null +++ b/src/main/java/seedu/address/model/tag/Module.java @@ -0,0 +1,28 @@ +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; + } + + /** + * {@inheritDoc} + */ + 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 886bd5b1293..8a217f6f4dd 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -12,6 +12,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; /** @@ -21,25 +22,25 @@ public class SampleDataUtil { public static Person[] getSamplePersons() { Person p1 = new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), new Address("Blk 30 Geylang Street 29, #06-40"), - getTagSet("friends")); + getTagSet("friends"), getModuleSet("CS2107")); p1.setBirthday(new Birthday("01/01/1990")); return new Person[] { p1, new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"), new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), - getTagSet("colleagues", "friends")), + getTagSet("colleagues", "friends"), getModuleSet("CS2105")), new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"), new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), - getTagSet("neighbours")), + getTagSet("neighbours"), getModuleSet("CS2105", "ES2660")), new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), - getTagSet("family")), + getTagSet("family"), getModuleSet()), new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), new Address("Blk 47 Tampines Street 20, #17-35"), - getTagSet("classmates")), + getTagSet("classmates"), getModuleSet("CS1101S")), new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"), new Address("Blk 45 Aljunied Street 85, #11-31"), - getTagSet("colleagues")) + getTagSet("colleagues"), getModuleSet("CS1101S")) }; } @@ -60,4 +61,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..d0bd455e58d --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonAdaptedModule.java @@ -0,0 +1,47 @@ +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 2629845ecad..15e900fb1be 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -17,6 +17,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; /** @@ -31,6 +32,7 @@ class JsonAdaptedPerson { private final String email; private final String address; private final List tagged = new ArrayList<>(); + private final List modules = new ArrayList<>(); private JsonAdaptedBirthday birthday = new JsonAdaptedBirthday(); /** @@ -40,6 +42,7 @@ class JsonAdaptedPerson { public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone, @JsonProperty("email") String email, @JsonProperty("address") String address, @JsonProperty("tagged") List tagged, + @JsonProperty("modules") List modules, @JsonProperty("birthday") JsonAdaptedBirthday birthday) { this.name = name; this.phone = phone; @@ -48,6 +51,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; } @@ -65,6 +71,10 @@ public JsonAdaptedPerson(Person source) { .map(JsonAdaptedTag::new) .collect(Collectors.toList())); + modules.addAll(source.getModules().stream() + .map(JsonAdaptedModule::new) + .collect(Collectors.toList())); + if (source.getBirthday().isPresent()) { birthday = new JsonAdaptedBirthday(source.getBirthday().get()); } @@ -83,6 +93,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())); } @@ -116,7 +131,9 @@ public Person toModelType() throws IllegalValueException { final Address modelAddress = new Address(address); final Set modelTags = new HashSet<>(personTags); - Person p = new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags); + final Set modelModules = new HashSet<>(personModules); + + Person p = new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags, modelModules); if (birthday != null) { Optional modelBirthday = birthday.toModelType(); diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 587bfa383e6..69e04fe5518 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -61,6 +61,9 @@ 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()); 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..eccabd19f7a 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -4,6 +4,8 @@ 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_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; @@ -55,10 +57,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 5cf487d7ebb..23dd96a626a 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -7,6 +7,7 @@ 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; @@ -16,10 +17,14 @@ import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY; import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; +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.TAG_DESC_FRIEND; 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)); } @@ -111,23 +125,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, @@ -135,7 +159,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..db2d36827b2 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,12 @@ 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 +125,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 +181,24 @@ 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 +232,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..2f968d6cb3a 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,53 @@ 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..805c6f1aa2f 100644 --- a/src/test/java/seedu/address/model/AddressBookTest.java +++ b/src/test/java/seedu/address/model/AddressBookTest.java @@ -4,6 +4,8 @@ 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_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; @@ -47,7 +49,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 +76,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..cf210f7fcba 100644 --- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java +++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java @@ -4,6 +4,8 @@ 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_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 +45,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 +88,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 50c47c695d1..4280298c166 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -23,6 +23,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(); @@ -33,6 +34,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 { @@ -43,7 +47,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_TAGS, VALID_BIRTHDAY); + VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Name.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -51,7 +55,7 @@ public void toModelType_invalidName_throwsIllegalValueException() { @Test public void toModelType_nullName_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS, - VALID_BIRTHDAY); + VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -59,7 +63,7 @@ public void toModelType_nullName_throwsIllegalValueException() { @Test public void toModelType_invalidPhone_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_TAGS, VALID_BIRTHDAY); + VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Phone.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -67,7 +71,7 @@ public void toModelType_invalidPhone_throwsIllegalValueException() { @Test public void toModelType_nullPhone_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS, - VALID_BIRTHDAY); + VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -75,7 +79,7 @@ public void toModelType_nullPhone_throwsIllegalValueException() { @Test public void toModelType_invalidEmail_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, - VALID_TAGS, VALID_BIRTHDAY); + VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Email.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -83,7 +87,7 @@ public void toModelType_invalidEmail_throwsIllegalValueException() { @Test public void toModelType_nullEmail_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS, - VALID_BIRTHDAY); + VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -91,7 +95,7 @@ public void toModelType_nullEmail_throwsIllegalValueException() { @Test public void toModelType_invalidAddress_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, - VALID_TAGS, VALID_BIRTHDAY); + VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = Address.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -99,7 +103,7 @@ public void toModelType_invalidAddress_throwsIllegalValueException() { @Test public void toModelType_nullAddress_throwsIllegalValueException() { JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS, - VALID_BIRTHDAY); + VALID_MODULES, VALID_BIRTHDAY); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -109,7 +113,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, - invalidTags, VALID_BIRTHDAY); + invalidTags, VALID_MODULES, VALID_BIRTHDAY); assertThrows(IllegalValueException.class, person::toModelType); } @@ -117,9 +121,18 @@ 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_TAGS, invalidBirthday); + 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_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 4584bd5044e..7b33a265e22 100644 --- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java @@ -10,6 +10,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; /** @@ -37,6 +38,7 @@ public EditPersonDescriptorBuilder(Person person) { descriptor.setEmail(person.getEmail()); descriptor.setAddress(person.getAddress()); descriptor.setTags(person.getTags()); + descriptor.setModules(person.getModules()); } /** @@ -81,6 +83,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 f4cf757cd3c..1895929ec52 100644 --- a/src/test/java/seedu/address/testutil/PersonBuilder.java +++ b/src/test/java/seedu/address/testutil/PersonBuilder.java @@ -9,6 +9,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.model.util.SampleDataUtil; @@ -27,6 +28,7 @@ public class PersonBuilder { private Email email; private Address address; private Set tags; + private Set modules; private Birthday birthday; /** @@ -38,6 +40,7 @@ public PersonBuilder() { email = new Email(DEFAULT_EMAIL); address = new Address(DEFAULT_ADDRESS); tags = new HashSet<>(); + modules = new HashSet<>(); } /** @@ -49,6 +52,7 @@ public PersonBuilder(Person personToCopy) { email = personToCopy.getEmail(); address = personToCopy.getAddress(); tags = new HashSet<>(personToCopy.getTags()); + modules = new HashSet<>(personToCopy.getModules()); } /** @@ -68,6 +72,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. */ @@ -108,7 +121,7 @@ public PersonBuilder withBirthday(String birthday) { * @return a person with the given details. */ public Person build() { - Person p = new Person(name, phone, email, address, tags); + Person p = new Person(name, phone, email, address, tags, modules); if (birthday != null) { p.setBirthday(birthday); diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java index 90849945183..a7c2a189c80 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; /** @@ -37,6 +39,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(); } @@ -57,6 +62,14 @@ public static String getEditPersonDescriptorDetails(EditPersonDescriptor descrip 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); + } 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 935a2efc3d4..62a6f28c971 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") @@ -50,10 +54,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 From 42293024d46f4d45e93bda64a4685ceafa0de630 Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 13:28:59 +0800 Subject: [PATCH 2/6] remove a small bug --- src/main/java/seedu/address/logic/parser/ParserUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 22dde5a4c43..e25d75f6bbb 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -123,7 +123,7 @@ public static Tag parseTag(String tag) throws ParseException { requireNonNull(tag); String trimmedTag = tag.trim(); if (!Tag.isValidTagName(trimmedTag)) { - throw new ParseException(Tag.MESSAGE_CONSTRAINTS + tag); + throw new ParseException(Tag.MESSAGE_CONSTRAINTS); } return new Tag(trimmedTag); } From 502721bb545d9260f8a287c311ef8f0748da6dff Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 14:56:21 +0800 Subject: [PATCH 3/6] fix misspelled argument --- src/main/java/seedu/address/logic/commands/EditCommand.java | 2 +- src/main/java/seedu/address/model/tag/Module.java | 3 +-- src/main/java/seedu/address/storage/JsonAdaptedModule.java | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 2ceb798823f..dc2fa119bb3 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -103,7 +103,7 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); Set updatedModules = editPersonDescriptor.getModules().orElse(personToEdit.getModules()); - Person p = new Person(updatedName, updatedTags, updatesModules); + Person p = new Person(updatedName, updatedTags, updatedModules); if (editPersonDescriptor.getPhone().isPresent()) { p.setPhone(editPersonDescriptor.getPhone().get()); diff --git a/src/main/java/seedu/address/model/tag/Module.java b/src/main/java/seedu/address/model/tag/Module.java index c3244c2b69d..362fe82cb35 100644 --- a/src/main/java/seedu/address/model/tag/Module.java +++ b/src/main/java/seedu/address/model/tag/Module.java @@ -18,9 +18,8 @@ public Module(String moduleName) { super(moduleName, MESSAGE_CONSTRAINTS); this.moduleName = moduleName; } - /** - * {@inheritDoc} + * 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/storage/JsonAdaptedModule.java b/src/main/java/seedu/address/storage/JsonAdaptedModule.java index d0bd455e58d..2103a94249a 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedModule.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedModule.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; + import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.tag.Module; From 592ffd2ced89819789fb06e1be9727d8b64d614e Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 15:09:11 +0800 Subject: [PATCH 4/6] fix bug --- .../java/seedu/address/storage/JsonAdaptedPersonTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java index 620d0080134..497a532ea33 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -62,13 +62,6 @@ public void toModelType_nullName_throwsIllegalValueException() { @Test public void toModelType_invalidPhone_throwsIllegalValueException() { - - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, - VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); - String expectedMessage = Phone.MESSAGE_CONSTRAINTS; - assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); - } - JsonAdaptedPhone invalidPhone = new JsonAdaptedPhone(INVALID_PHONE); JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, invalidPhone, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS, VALID_MODULES, VALID_BIRTHDAY); From 0afb44b359312130b1590b64a4152cf5496e170a Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 15:28:47 +0800 Subject: [PATCH 5/6] edit code to comform with style guide --- .../seedu/address/model/util/SampleDataUtil.java | 3 ++- .../seedu/address/storage/JsonAdaptedPerson.java | 2 -- src/main/java/seedu/address/ui/PersonCard.java | 1 - .../address/logic/commands/EditCommandTest.java | 1 - .../address/logic/parser/AddCommandParserTest.java | 4 ++-- .../logic/parser/EditCommandParserTest.java | 14 +++++++++----- .../seedu/address/logic/parser/ParserUtilTest.java | 6 ++++-- .../java/seedu/address/model/AddressBookTest.java | 1 - .../address/model/person/UniquePersonListTest.java | 1 - .../address/storage/JsonAdaptedPersonTest.java | 2 -- 10 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index f2e63307824..80f398cb8cb 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -35,7 +35,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"), getModuleSet("CS2105", "ES2660")); + 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")); diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index 6bd80bd6ad4..ae777f8b9d3 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -77,7 +77,6 @@ public JsonAdaptedPerson(Person source) { modules.addAll(source.getModules().stream() .map(JsonAdaptedModule::new) .collect(Collectors.toList())); - if (source.getPhone().isPresent()) { phone = new JsonAdaptedPhone(source.getPhone().get()); } @@ -138,7 +137,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 9e32b58ed84..d5e86356c4b 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -87,7 +87,6 @@ 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))); diff --git a/src/test/java/seedu/address/logic/commands/EditCommandTest.java b/src/test/java/seedu/address/logic/commands/EditCommandTest.java index eccabd19f7a..e6813ca79f5 100644 --- a/src/test/java/seedu/address/logic/commands/EditCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/EditCommandTest.java @@ -5,7 +5,6 @@ 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_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; diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index 8ba50176712..adb51d4920f 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -11,14 +11,14 @@ 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; import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY; import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE; -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.TAG_DESC_FRIEND; import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND; import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB; diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index db2d36827b2..e21eebde190 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -113,9 +113,12 @@ public void parse_invalidValue_failure() { // 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); + 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, @@ -193,8 +196,9 @@ public void parse_oneFieldSpecified_success() { 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 + 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; + + 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) diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 2f968d6cb3a..cda440fd140 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -231,7 +231,8 @@ public void parseModules_null_throwsNullPointerException() { @Test public void parseModules_collectionWithInvalidTags_throwsParseException() { - assertThrows(ParseException.class, () -> ParserUtil.parseModules(Arrays.asList(VALID_MODULE_1, INVALID_MODULE))); + assertThrows(ParseException.class, () -> ParserUtil.parseModules(Arrays.asList(VALID_MODULE_1, + INVALID_MODULE))); } @Test @@ -242,7 +243,8 @@ public void parseModules_emptyCollection_returnsEmptySet() throws Exception { @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))); + Set expectedModuleSet = new HashSet<>(Arrays.asList(new Module(VALID_MODULE_1), + new Module(VALID_MODULE_2))); assertEquals(expectedModuleSet, actualModuleSet); } diff --git a/src/test/java/seedu/address/model/AddressBookTest.java b/src/test/java/seedu/address/model/AddressBookTest.java index 805c6f1aa2f..51de1846eee 100644 --- a/src/test/java/seedu/address/model/AddressBookTest.java +++ b/src/test/java/seedu/address/model/AddressBookTest.java @@ -5,7 +5,6 @@ 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_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; diff --git a/src/test/java/seedu/address/model/person/UniquePersonListTest.java b/src/test/java/seedu/address/model/person/UniquePersonListTest.java index cf210f7fcba..e8c91217bb9 100644 --- a/src/test/java/seedu/address/model/person/UniquePersonListTest.java +++ b/src/test/java/seedu/address/model/person/UniquePersonListTest.java @@ -4,7 +4,6 @@ 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_MODULE_CS2103T; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_HUSBAND; import static seedu.address.testutil.Assert.assertThrows; diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java index 497a532ea33..53248274d77 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -77,7 +77,6 @@ public void toModelType_invalidEmail_throwsIllegalValueException() { String expectedMessage = Email.MESSAGE_CONSTRAINTS; assertThrows(IllegalArgumentException.class, expectedMessage, person::toModelType); } - @Test public void toModelType_invalidAddress_throwsIllegalValueException() { JsonAdaptedAddress invalidAddress = new JsonAdaptedAddress(INVALID_ADDRESS); @@ -112,5 +111,4 @@ public void toModelType_invalidModules_throwsIllegalValueException() { VALID_TAGS, invalidModules, VALID_BIRTHDAY); assertThrows(IllegalValueException.class, person::toModelType); } - } From 57487f01dadc12513db6e3711cfc67fad2391c85 Mon Sep 17 00:00:00 2001 From: Lavanya Mishra Date: Wed, 15 Mar 2023 16:15:46 +0800 Subject: [PATCH 6/6] fix bug in tests --- src/test/java/seedu/address/testutil/PersonUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java index d5a5a0aa7a4..ed28923e701 100644 --- a/src/test/java/seedu/address/testutil/PersonUtil.java +++ b/src/test/java/seedu/address/testutil/PersonUtil.java @@ -64,7 +64,7 @@ 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(" ")); } @@ -72,7 +72,7 @@ public static String getEditPersonDescriptorDetails(EditPersonDescriptor descrip if (descriptor.getModules().isPresent()) { Set modules = descriptor.getModules().get(); if (modules.isEmpty()) { - sb.append(PREFIX_MODULE); + sb.append(PREFIX_MODULE).append(" "); } else { modules.forEach(s -> sb.append(PREFIX_MODULE).append(s.moduleName).append(" ")); }