diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 2ca577e9e0e6..5d6d4ae3f7b1 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -43,13 +43,43 @@ public static Index parseIndex(String oneBasedIndex) throws IllegalValueExceptio return Index.fromOneBased(Integer.parseInt(trimmedIndex)); } + /** + * Parses a {@code String name} into a {@code Name}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws IllegalValueException if the given {@code name} is invalid. + */ + public static Name parseName(String name) throws IllegalValueException { + requireNonNull(name); + String trimmedName = name.trim(); + if (!Name.isValidName(trimmedName)) { + throw new IllegalValueException(Name.MESSAGE_NAME_CONSTRAINTS); + } + return new Name(trimmedName); + } + /** * Parses a {@code Optional name} into an {@code Optional} if {@code name} is present. * See header comment of this class regarding the use of {@code Optional} parameters. */ public static Optional parseName(Optional name) throws IllegalValueException { requireNonNull(name); - return name.isPresent() ? Optional.of(new Name(name.get())) : Optional.empty(); + return name.isPresent() ? Optional.of(parseName(name.get())) : Optional.empty(); + } + + /** + * Parses a {@code String phone} into a {@code Phone}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws IllegalValueException if the given {@code phone} is invalid. + */ + public static Phone parsePhone(String phone) throws IllegalValueException { + requireNonNull(phone); + String trimmedPhone = phone.trim(); + if (!Phone.isValidPhone(trimmedPhone)) { + throw new IllegalValueException(Phone.MESSAGE_PHONE_CONSTRAINTS); + } + return new Phone(trimmedPhone); } /** @@ -58,7 +88,22 @@ public static Optional parseName(Optional name) throws IllegalValu */ public static Optional parsePhone(Optional phone) throws IllegalValueException { requireNonNull(phone); - return phone.isPresent() ? Optional.of(new Phone(phone.get())) : Optional.empty(); + return phone.isPresent() ? Optional.of(parsePhone(phone.get())) : Optional.empty(); + } + + /** + * Parses a {@code String address} into an {@code Address}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws IllegalValueException if the given {@code address} is invalid. + */ + public static Address parseAddress(String address) throws IllegalValueException { + requireNonNull(address); + String trimmedAddress = address.trim(); + if (!Address.isValidAddress(trimmedAddress)) { + throw new IllegalValueException(Address.MESSAGE_ADDRESS_CONSTRAINTS); + } + return new Address(trimmedAddress); } /** @@ -67,7 +112,22 @@ public static Optional parsePhone(Optional phone) throws IllegalV */ public static Optional
parseAddress(Optional address) throws IllegalValueException { requireNonNull(address); - return address.isPresent() ? Optional.of(new Address(address.get())) : Optional.empty(); + return address.isPresent() ? Optional.of(parseAddress(address.get())) : Optional.empty(); + } + + /** + * Parses a {@code String email} into an {@code Email}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws IllegalValueException if the given {@code email} is invalid. + */ + public static Email parseEmail(String email) throws IllegalValueException { + requireNonNull(email); + String trimmedEmail = email.trim(); + if (!Email.isValidEmail(trimmedEmail)) { + throw new IllegalValueException(Email.MESSAGE_EMAIL_CONSTRAINTS); + } + return new Email(trimmedEmail); } /** @@ -76,7 +136,22 @@ public static Optional
parseAddress(Optional address) throws Il */ public static Optional parseEmail(Optional email) throws IllegalValueException { requireNonNull(email); - return email.isPresent() ? Optional.of(new Email(email.get())) : Optional.empty(); + return email.isPresent() ? Optional.of(parseEmail(email.get())) : Optional.empty(); + } + + /** + * Parses a {@code String tag} into a {@code Tag}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws IllegalValueException if the given {@code tag} is invalid. + */ + public static Tag parseTag(String tag) throws IllegalValueException { + requireNonNull(tag); + String trimmedTag = tag.trim(); + if (!Tag.isValidTagName(trimmedTag)) { + throw new IllegalValueException(Tag.MESSAGE_TAG_CONSTRAINTS); + } + return new Tag(trimmedTag); } /** @@ -86,7 +161,7 @@ public static Set parseTags(Collection tags) throws IllegalValueExc requireNonNull(tags); final Set tagSet = new HashSet<>(); for (String tagName : tags) { - tagSet.add(new Tag(tagName)); + tagSet.add(parseTag(tagName)); } return tagSet; } diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java index a5d467960d22..5e981f07790a 100644 --- a/src/main/java/seedu/address/model/person/Address.java +++ b/src/main/java/seedu/address/model/person/Address.java @@ -1,8 +1,7 @@ package seedu.address.model.person; import static java.util.Objects.requireNonNull; - -import seedu.address.commons.exceptions.IllegalValueException; +import static seedu.address.commons.util.AppUtil.checkArgument; /** * Represents a Person's address in the address book. @@ -22,15 +21,13 @@ public class Address { public final String value; /** - * Validates given address. + * Constructs an {@code Address}. * - * @throws IllegalValueException if given address string is invalid. + * @param address A valid address. */ - public Address(String address) throws IllegalValueException { + public Address(String address) { requireNonNull(address); - if (!isValidAddress(address)) { - throw new IllegalValueException(MESSAGE_ADDRESS_CONSTRAINTS); - } + checkArgument(isValidAddress(address), MESSAGE_ADDRESS_CONSTRAINTS); this.value = address; } diff --git a/src/main/java/seedu/address/model/person/Email.java b/src/main/java/seedu/address/model/person/Email.java index 514441aa162f..d636088abb63 100644 --- a/src/main/java/seedu/address/model/person/Email.java +++ b/src/main/java/seedu/address/model/person/Email.java @@ -1,8 +1,7 @@ package seedu.address.model.person; import static java.util.Objects.requireNonNull; - -import seedu.address.commons.exceptions.IllegalValueException; +import static seedu.address.commons.util.AppUtil.checkArgument; /** * Represents a Person's phone number in the address book. @@ -17,17 +16,14 @@ public class Email { public final String value; /** - * Validates given email. + * Constructs an {@code Email}. * - * @throws IllegalValueException if given email address string is invalid. + * @param email A valid email address. */ - public Email(String email) throws IllegalValueException { + public Email(String email) { requireNonNull(email); - String trimmedEmail = email.trim(); - if (!isValidEmail(trimmedEmail)) { - throw new IllegalValueException(MESSAGE_EMAIL_CONSTRAINTS); - } - this.value = trimmedEmail; + checkArgument(isValidEmail(email), MESSAGE_EMAIL_CONSTRAINTS); + this.value = email; } /** diff --git a/src/main/java/seedu/address/model/person/Name.java b/src/main/java/seedu/address/model/person/Name.java index 5d138e8ba223..8e632943c4cf 100644 --- a/src/main/java/seedu/address/model/person/Name.java +++ b/src/main/java/seedu/address/model/person/Name.java @@ -1,8 +1,7 @@ package seedu.address.model.person; import static java.util.Objects.requireNonNull; - -import seedu.address.commons.exceptions.IllegalValueException; +import static seedu.address.commons.util.AppUtil.checkArgument; /** * Represents a Person's name in the address book. @@ -22,17 +21,14 @@ public class Name { public final String fullName; /** - * Validates given name. + * Constructs a {@code Name}. * - * @throws IllegalValueException if given name string is invalid. + * @param name A valid name. */ - public Name(String name) throws IllegalValueException { + public Name(String name) { requireNonNull(name); - String trimmedName = name.trim(); - if (!isValidName(trimmedName)) { - throw new IllegalValueException(MESSAGE_NAME_CONSTRAINTS); - } - this.fullName = trimmedName; + checkArgument(isValidName(name), MESSAGE_NAME_CONSTRAINTS); + this.fullName = name; } /** diff --git a/src/main/java/seedu/address/model/person/Phone.java b/src/main/java/seedu/address/model/person/Phone.java index 3a56110b468a..11b5435ac247 100644 --- a/src/main/java/seedu/address/model/person/Phone.java +++ b/src/main/java/seedu/address/model/person/Phone.java @@ -1,8 +1,7 @@ package seedu.address.model.person; import static java.util.Objects.requireNonNull; - -import seedu.address.commons.exceptions.IllegalValueException; +import static seedu.address.commons.util.AppUtil.checkArgument; /** * Represents a Person's phone number in the address book. @@ -17,17 +16,14 @@ public class Phone { public final String value; /** - * Validates given phone number. + * Constructs a {@code Phone}. * - * @throws IllegalValueException if given phone string is invalid. + * @param phone A valid phone number. */ - public Phone(String phone) throws IllegalValueException { + public Phone(String phone) { requireNonNull(phone); - String trimmedPhone = phone.trim(); - if (!isValidPhone(trimmedPhone)) { - throw new IllegalValueException(MESSAGE_PHONE_CONSTRAINTS); - } - this.value = trimmedPhone; + checkArgument(isValidPhone(phone), MESSAGE_PHONE_CONSTRAINTS); + this.value = phone; } /** diff --git a/src/main/java/seedu/address/model/tag/Tag.java b/src/main/java/seedu/address/model/tag/Tag.java index c217550c7e8f..65bdd769995d 100644 --- a/src/main/java/seedu/address/model/tag/Tag.java +++ b/src/main/java/seedu/address/model/tag/Tag.java @@ -1,8 +1,7 @@ package seedu.address.model.tag; import static java.util.Objects.requireNonNull; - -import seedu.address.commons.exceptions.IllegalValueException; +import static seedu.address.commons.util.AppUtil.checkArgument; /** * Represents a Tag in the address book. @@ -16,17 +15,14 @@ public class Tag { public final String tagName; /** - * Validates given tag name. + * Constructs a {@code Tag}. * - * @throws IllegalValueException if the given tag name string is invalid. + * @param tagName A valid tag name. */ - public Tag(String name) throws IllegalValueException { - requireNonNull(name); - String trimmedName = name.trim(); - if (!isValidTagName(trimmedName)) { - throw new IllegalValueException(MESSAGE_TAG_CONSTRAINTS); - } - this.tagName = trimmedName; + public Tag(String tagName) { + requireNonNull(tagName); + checkArgument(isValidTagName(tagName), MESSAGE_TAG_CONSTRAINTS); + this.tagName = tagName; } /** diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 02c4204199df..aea96bfb31f3 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -3,7 +3,6 @@ import java.util.HashSet; import java.util.Set; -import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.person.Address; @@ -19,30 +18,26 @@ */ public class SampleDataUtil { public static Person[] getSamplePersons() { - try { - return new Person[] { - 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")), - 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")), - 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")), - 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")), - 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")), - 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")) - }; - } catch (IllegalValueException e) { - throw new AssertionError("sample data cannot be invalid", e); - } + return new Person[] { + 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")), + 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")), + 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")), + 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")), + 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")), + 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")) + }; } public static ReadOnlyAddressBook getSampleAddressBook() { @@ -60,7 +55,7 @@ public static ReadOnlyAddressBook getSampleAddressBook() { /** * Returns a tag set containing the list of strings given. */ - public static Set getTagSet(String... strings) throws IllegalValueException { + public static Set getTagSet(String... strings) { HashSet tags = new HashSet<>(); for (String s : strings) { tags.add(new Tag(s)); diff --git a/src/main/java/seedu/address/storage/XmlAdaptedPerson.java b/src/main/java/seedu/address/storage/XmlAdaptedPerson.java index 3332430bffa5..5e833226e2b1 100644 --- a/src/main/java/seedu/address/storage/XmlAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/XmlAdaptedPerson.java @@ -39,6 +39,18 @@ public class XmlAdaptedPerson { */ public XmlAdaptedPerson() {} + /** + * Constructs an {@code XmlAdaptedPerson} with the given person details. + */ + public XmlAdaptedPerson(String name, String phone, String email, String address, List tagged) { + this.name = name; + this.phone = phone; + this.email = email; + this.address = address; + if (tagged != null) { + this.tagged = new ArrayList<>(tagged); + } + } /** * Converts a given Person into this class for JAXB use. @@ -66,10 +78,27 @@ public Person toModelType() throws IllegalValueException { for (XmlAdaptedTag tag : tagged) { personTags.add(tag.toModelType()); } + + if (!Name.isValidName(this.name)) { + throw new IllegalValueException(Name.MESSAGE_NAME_CONSTRAINTS); + } final Name name = new Name(this.name); + + if (!Phone.isValidPhone(this.phone)) { + throw new IllegalValueException(Phone.MESSAGE_PHONE_CONSTRAINTS); + } final Phone phone = new Phone(this.phone); + + if (!Email.isValidEmail(this.email)) { + throw new IllegalValueException(Email.MESSAGE_EMAIL_CONSTRAINTS); + } final Email email = new Email(this.email); + + if (!Address.isValidAddress(this.address)) { + throw new IllegalValueException(Address.MESSAGE_ADDRESS_CONSTRAINTS); + } final Address address = new Address(this.address); + final Set tags = new HashSet<>(personTags); return new Person(name, phone, email, address, tags); } diff --git a/src/main/java/seedu/address/storage/XmlAdaptedTag.java b/src/main/java/seedu/address/storage/XmlAdaptedTag.java index aad2d96dde3f..4e9d3648f556 100644 --- a/src/main/java/seedu/address/storage/XmlAdaptedTag.java +++ b/src/main/java/seedu/address/storage/XmlAdaptedTag.java @@ -19,6 +19,13 @@ public class XmlAdaptedTag { */ public XmlAdaptedTag() {} + /** + * Constructs a {@code XmlAdaptedTag} with the given {@code tagName}. + */ + public XmlAdaptedTag(String tagName) { + this.tagName = tagName; + } + /** * Converts a given Tag into this class for JAXB use. * @@ -34,6 +41,9 @@ public XmlAdaptedTag(Tag source) { * @throws IllegalValueException if there were any data constraints violated in the adapted person */ public Tag toModelType() throws IllegalValueException { + if (!Tag.isValidTagName(tagName)) { + throw new IllegalValueException(Tag.MESSAGE_TAG_CONSTRAINTS); + } return new Tag(tagName); } diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 03d839cf1064..54516c1c5e95 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -23,6 +23,7 @@ import seedu.address.model.person.Name; import seedu.address.model.person.Phone; import seedu.address.model.tag.Tag; +import seedu.address.testutil.Assert; public class ParserUtilTest { private static final String INVALID_NAME = "R@chel"; @@ -38,6 +39,8 @@ public class ParserUtilTest { private static final String VALID_TAG_1 = "friend"; private static final String VALID_TAG_2 = "neighbour"; + private static final String WHITESPACE = " \t\r\n"; + @Rule public final ExpectedException thrown = ExpectedException.none(); @@ -64,15 +67,15 @@ public void parseIndex_validInput_success() throws Exception { } @Test - public void parseName_null_throwsNullPointerException() throws Exception { - thrown.expect(NullPointerException.class); - ParserUtil.parseName(null); + public void parseName_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseName((String) null)); + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseName((Optional) null)); } @Test - public void parseName_invalidValue_throwsIllegalValueException() throws Exception { - thrown.expect(IllegalValueException.class); - ParserUtil.parseName(Optional.of(INVALID_NAME)); + public void parseName_invalidValue_throwsIllegalValueException() { + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseName(INVALID_NAME)); + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseName(Optional.of(INVALID_NAME))); } @Test @@ -81,23 +84,30 @@ public void parseName_optionalEmpty_returnsOptionalEmpty() throws Exception { } @Test - public void parseName_validValue_returnsName() throws Exception { + public void parseName_validValueWithoutWhitespace_returnsName() throws Exception { Name expectedName = new Name(VALID_NAME); - Optional actualName = ParserUtil.parseName(Optional.of(VALID_NAME)); + assertEquals(expectedName, ParserUtil.parseName(VALID_NAME)); + assertEquals(Optional.of(expectedName), ParserUtil.parseName(Optional.of(VALID_NAME))); + } - assertEquals(expectedName, actualName.get()); + @Test + public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Exception { + String nameWithWhitespace = WHITESPACE + VALID_NAME + WHITESPACE; + Name expectedName = new Name(VALID_NAME); + assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace)); + assertEquals(Optional.of(expectedName), ParserUtil.parseName(Optional.of(nameWithWhitespace))); } @Test - public void parsePhone_null_throwsNullPointerException() throws Exception { - thrown.expect(NullPointerException.class); - ParserUtil.parsePhone(null); + public void parsePhone_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parsePhone((String) null)); + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parsePhone((Optional) null)); } @Test - public void parsePhone_invalidValue_throwsIllegalValueException() throws Exception { - thrown.expect(IllegalValueException.class); - ParserUtil.parsePhone(Optional.of(INVALID_PHONE)); + public void parsePhone_invalidValue_throwsIllegalValueException() { + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parsePhone(INVALID_PHONE)); + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parsePhone(Optional.of(INVALID_PHONE))); } @Test @@ -106,23 +116,30 @@ public void parsePhone_optionalEmpty_returnsOptionalEmpty() throws Exception { } @Test - public void parsePhone_validValue_returnsPhone() throws Exception { + public void parsePhone_validValueWithoutWhitespace_returnsPhone() throws Exception { Phone expectedPhone = new Phone(VALID_PHONE); - Optional actualPhone = ParserUtil.parsePhone(Optional.of(VALID_PHONE)); + assertEquals(expectedPhone, ParserUtil.parsePhone(VALID_PHONE)); + assertEquals(Optional.of(expectedPhone), ParserUtil.parsePhone(Optional.of(VALID_PHONE))); + } - assertEquals(expectedPhone, actualPhone.get()); + @Test + public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exception { + String phoneWithWhitespace = WHITESPACE + VALID_PHONE + WHITESPACE; + Phone expectedPhone = new Phone(VALID_PHONE); + assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace)); + assertEquals(Optional.of(expectedPhone), ParserUtil.parsePhone(Optional.of(phoneWithWhitespace))); } @Test - public void parseAddress_null_throwsNullPointerException() throws Exception { - thrown.expect(NullPointerException.class); - ParserUtil.parseAddress(null); + public void parseAddress_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((String) null)); + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((Optional) null)); } @Test - public void parseAddress_invalidValue_throwsIllegalValueException() throws Exception { - thrown.expect(IllegalValueException.class); - ParserUtil.parseAddress(Optional.of(INVALID_ADDRESS)); + public void parseAddress_invalidValue_throwsIllegalValueException() { + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS)); + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseAddress(Optional.of(INVALID_ADDRESS))); } @Test @@ -131,23 +148,30 @@ public void parseAddress_optionalEmpty_returnsOptionalEmpty() throws Exception { } @Test - public void parseAddress_validValue_returnsAddress() throws Exception { + public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception { Address expectedAddress = new Address(VALID_ADDRESS); - Optional
actualAddress = ParserUtil.parseAddress(Optional.of(VALID_ADDRESS)); + assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS)); + assertEquals(Optional.of(expectedAddress), ParserUtil.parseAddress(Optional.of(VALID_ADDRESS))); + } - assertEquals(expectedAddress, actualAddress.get()); + @Test + public void parseAddress_validValueWithWhitespace_returnsTrimmedAddress() throws Exception { + String addressWithWhitespace = WHITESPACE + VALID_ADDRESS + WHITESPACE; + Address expectedAddress = new Address(VALID_ADDRESS); + assertEquals(expectedAddress, ParserUtil.parseAddress(addressWithWhitespace)); + assertEquals(Optional.of(expectedAddress), ParserUtil.parseAddress(Optional.of(addressWithWhitespace))); } @Test - public void parseEmail_null_throwsNullPointerException() throws Exception { - thrown.expect(NullPointerException.class); - ParserUtil.parseEmail(null); + public void parseEmail_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((String) null)); + Assert.assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((Optional) null)); } @Test - public void parseEmail_invalidValue_throwsIllegalValueException() throws Exception { - thrown.expect(IllegalValueException.class); - ParserUtil.parseEmail(Optional.of(INVALID_EMAIL)); + public void parseEmail_invalidValue_throwsIllegalValueException() { + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseEmail(INVALID_EMAIL)); + Assert.assertThrows(IllegalValueException.class, () -> ParserUtil.parseEmail(Optional.of(INVALID_EMAIL))); } @Test @@ -156,11 +180,43 @@ public void parseEmail_optionalEmpty_returnsOptionalEmpty() throws Exception { } @Test - public void parseEmail_validValue_returnsEmail() throws Exception { + public void parseEmail_validValueWithoutWhitespace_returnsEmail() throws Exception { Email expectedEmail = new Email(VALID_EMAIL); - Optional actualEmail = ParserUtil.parseEmail(Optional.of(VALID_EMAIL)); + assertEquals(expectedEmail, ParserUtil.parseEmail(VALID_EMAIL)); + assertEquals(Optional.of(expectedEmail), ParserUtil.parseEmail(Optional.of(VALID_EMAIL))); + } + + @Test + public void parseEmail_validValueWithWhitespace_returnsTrimmedEmail() throws Exception { + String emailWithWhitespace = WHITESPACE + VALID_EMAIL + WHITESPACE; + Email expectedEmail = new Email(VALID_EMAIL); + assertEquals(expectedEmail, ParserUtil.parseEmail(emailWithWhitespace)); + assertEquals(Optional.of(expectedEmail), ParserUtil.parseEmail(Optional.of(emailWithWhitespace))); + } + + @Test + public void parseTag_null_throwsNullPointerException() throws Exception { + thrown.expect(NullPointerException.class); + ParserUtil.parseTag(null); + } - assertEquals(expectedEmail, actualEmail.get()); + @Test + public void parseTag_invalidValue_throwsIllegalValueException() throws Exception { + thrown.expect(IllegalValueException.class); + ParserUtil.parseTag(INVALID_TAG); + } + + @Test + public void parseTag_validValueWithoutWhitespace_returnsTag() throws Exception { + Tag expectedTag = new Tag(VALID_TAG_1); + assertEquals(expectedTag, ParserUtil.parseTag(VALID_TAG_1)); + } + + @Test + public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Exception { + String tagWithWhitespace = WHITESPACE + VALID_TAG_1 + WHITESPACE; + Tag expectedTag = new Tag(VALID_TAG_1); + assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace)); } @Test diff --git a/src/test/java/seedu/address/model/person/AddressTest.java b/src/test/java/seedu/address/model/person/AddressTest.java index d54d9299ad5e..11974544d81d 100644 --- a/src/test/java/seedu/address/model/person/AddressTest.java +++ b/src/test/java/seedu/address/model/person/AddressTest.java @@ -5,10 +5,26 @@ import org.junit.Test; +import seedu.address.testutil.Assert; + public class AddressTest { + @Test + public void constructor_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> new Address(null)); + } + + @Test + public void constructor_invalidAddress_throwsIllegalArgumentException() { + String invalidAddress = ""; + Assert.assertThrows(IllegalArgumentException.class, () -> new Address(invalidAddress)); + } + @Test public void isValidAddress() { + // null address + Assert.assertThrows(NullPointerException.class, () -> Address.isValidAddress(null)); + // invalid addresses assertFalse(Address.isValidAddress("")); // empty string assertFalse(Address.isValidAddress(" ")); // spaces only diff --git a/src/test/java/seedu/address/model/person/EmailTest.java b/src/test/java/seedu/address/model/person/EmailTest.java index 087192632acc..c1ba86c4d61f 100644 --- a/src/test/java/seedu/address/model/person/EmailTest.java +++ b/src/test/java/seedu/address/model/person/EmailTest.java @@ -5,10 +5,26 @@ import org.junit.Test; +import seedu.address.testutil.Assert; + public class EmailTest { + @Test + public void constructor_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> new Email(null)); + } + + @Test + public void constructor_invalidEmail_throwsIllegalArgumentException() { + String invalidEmail = ""; + Assert.assertThrows(IllegalArgumentException.class, () -> new Email(invalidEmail)); + } + @Test public void isValidEmail() { + // null email + Assert.assertThrows(NullPointerException.class, () -> Email.isValidEmail(null)); + // blank email assertFalse(Email.isValidEmail("")); // empty string assertFalse(Email.isValidEmail(" ")); // spaces only diff --git a/src/test/java/seedu/address/model/person/NameTest.java b/src/test/java/seedu/address/model/person/NameTest.java index 0dcbc7f82812..b4a356b6f011 100644 --- a/src/test/java/seedu/address/model/person/NameTest.java +++ b/src/test/java/seedu/address/model/person/NameTest.java @@ -5,10 +5,26 @@ import org.junit.Test; +import seedu.address.testutil.Assert; + public class NameTest { + @Test + public void constructor_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> new Name(null)); + } + + @Test + public void constructor_invalidName_throwsIllegalArgumentException() { + String invalidName = ""; + Assert.assertThrows(IllegalArgumentException.class, () -> new Name(invalidName)); + } + @Test public void isValidName() { + // null name + Assert.assertThrows(NullPointerException.class, () -> Name.isValidName(null)); + // invalid name assertFalse(Name.isValidName("")); // empty string assertFalse(Name.isValidName(" ")); // spaces only diff --git a/src/test/java/seedu/address/model/person/PhoneTest.java b/src/test/java/seedu/address/model/person/PhoneTest.java index 8e65e7c91756..c721cbbfc048 100644 --- a/src/test/java/seedu/address/model/person/PhoneTest.java +++ b/src/test/java/seedu/address/model/person/PhoneTest.java @@ -5,10 +5,26 @@ import org.junit.Test; +import seedu.address.testutil.Assert; + public class PhoneTest { + @Test + public void constructor_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> new Phone(null)); + } + + @Test + public void constructor_invalidPhone_throwsIllegalArgumentException() { + String invalidPhone = ""; + Assert.assertThrows(IllegalArgumentException.class, () -> new Phone(invalidPhone)); + } + @Test public void isValidPhone() { + // null phone number + Assert.assertThrows(NullPointerException.class, () -> Phone.isValidPhone(null)); + // invalid phone numbers assertFalse(Phone.isValidPhone("")); // empty string assertFalse(Phone.isValidPhone(" ")); // spaces only diff --git a/src/test/java/seedu/address/model/tag/TagTest.java b/src/test/java/seedu/address/model/tag/TagTest.java new file mode 100644 index 000000000000..80bfd156d816 --- /dev/null +++ b/src/test/java/seedu/address/model/tag/TagTest.java @@ -0,0 +1,26 @@ +package seedu.address.model.tag; + +import org.junit.Test; + +import seedu.address.testutil.Assert; + +public class TagTest { + + @Test + public void constructor_null_throwsNullPointerException() { + Assert.assertThrows(NullPointerException.class, () -> new Tag(null)); + } + + @Test + public void constructor_invalidTagName_throwsIllegalArgumentException() { + String invalidTagName = ""; + Assert.assertThrows(IllegalArgumentException.class, () -> new Tag(invalidTagName)); + } + + @Test + public void isValidTagName() { + // null tag name + Assert.assertThrows(NullPointerException.class, () -> Tag.isValidTagName(null)); + } + +} diff --git a/src/test/java/seedu/address/storage/XmlAdaptedPersonTest.java b/src/test/java/seedu/address/storage/XmlAdaptedPersonTest.java new file mode 100644 index 000000000000..2b4b0af30960 --- /dev/null +++ b/src/test/java/seedu/address/storage/XmlAdaptedPersonTest.java @@ -0,0 +1,74 @@ +package seedu.address.storage; + +import static org.junit.Assert.assertEquals; +import static seedu.address.testutil.TypicalPersons.BENSON; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.testutil.Assert; + +public class XmlAdaptedPersonTest { + private static final String INVALID_NAME = "R@chel"; + private static final String INVALID_PHONE = "+651234"; + 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 VALID_NAME = BENSON.getName().toString(); + private static final String VALID_PHONE = BENSON.getPhone().toString(); + private static final String VALID_EMAIL = BENSON.getEmail().toString(); + private static final String VALID_ADDRESS = BENSON.getAddress().toString(); + + private static final List VALID_TAGS = BENSON.getTags().stream() + .map(XmlAdaptedTag::new) + .collect(Collectors.toList()); + + @Test + public void toModelType_validPersonDetails_returnsPerson() throws Exception { + XmlAdaptedPerson person = new XmlAdaptedPerson(BENSON); + assertEquals(BENSON, person.toModelType()); + } + + @Test + public void toModelType_invalidName_throwsIllegalValueException() { + XmlAdaptedPerson person = + new XmlAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + Assert.assertThrows(IllegalValueException.class, person::toModelType); + } + + @Test + public void toModelType_invalidPhone_throwsIllegalValueException() { + XmlAdaptedPerson person = + new XmlAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + Assert.assertThrows(IllegalValueException.class, person::toModelType); + } + + @Test + public void toModelType_invalidEmail_throwsIllegalValueException() { + XmlAdaptedPerson person = + new XmlAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + Assert.assertThrows(IllegalValueException.class, person::toModelType); + } + + @Test + public void toModelType_invalidAddress_throwsIllegalValueException() { + XmlAdaptedPerson person = + new XmlAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS); + Assert.assertThrows(IllegalValueException.class, person::toModelType); + } + + @Test + public void toModelType_invalidTags_throwsIllegalValueException() { + List invalidTags = new ArrayList<>(VALID_TAGS); + invalidTags.add(new XmlAdaptedTag(INVALID_TAG)); + XmlAdaptedPerson person = + new XmlAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags); + Assert.assertThrows(IllegalValueException.class, person::toModelType); + } + +} diff --git a/src/test/java/seedu/address/testutil/Assert.java b/src/test/java/seedu/address/testutil/Assert.java index a6a7a1b529cf..17a2656fafda 100644 --- a/src/test/java/seedu/address/testutil/Assert.java +++ b/src/test/java/seedu/address/testutil/Assert.java @@ -8,11 +8,11 @@ public class Assert { /** - * Asserts that the {@code executable} throws the {@code expected} Exception. + * Asserts that the {@code callable} throws the {@code expected} Exception. */ - public static void assertThrows(Class expected, Runnable executable) { + public static void assertThrows(Class expected, VoidCallable callable) { try { - executable.run(); + callable.call(); } catch (Throwable actualException) { if (actualException.getClass().isAssignableFrom(expected)) { return; @@ -24,4 +24,13 @@ public static void assertThrows(Class expected, Runnable ex throw new AssertionFailedError( String.format("Expected %s to be thrown, but nothing was thrown.", expected.getName())); } + + /** + * Represents a function which does not return anything and may throw an exception. + */ + @FunctionalInterface + public interface VoidCallable { + void call() throws Exception; + } + } diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java index 800d20bb56fe..4a2095046b88 100644 --- a/src/test/java/seedu/address/testutil/PersonBuilder.java +++ b/src/test/java/seedu/address/testutil/PersonBuilder.java @@ -2,7 +2,6 @@ import java.util.Set; -import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; @@ -26,16 +25,12 @@ public class PersonBuilder { private Person person; public PersonBuilder() { - try { - Name defaultName = new Name(DEFAULT_NAME); - Phone defaultPhone = new Phone(DEFAULT_PHONE); - Email defaultEmail = new Email(DEFAULT_EMAIL); - Address defaultAddress = new Address(DEFAULT_ADDRESS); - Set defaultTags = SampleDataUtil.getTagSet(DEFAULT_TAGS); - this.person = new Person(defaultName, defaultPhone, defaultEmail, defaultAddress, defaultTags); - } catch (IllegalValueException ive) { - throw new AssertionError("Default person's values are invalid."); - } + Name defaultName = new Name(DEFAULT_NAME); + Phone defaultPhone = new Phone(DEFAULT_PHONE); + Email defaultEmail = new Email(DEFAULT_EMAIL); + Address defaultAddress = new Address(DEFAULT_ADDRESS); + Set defaultTags = SampleDataUtil.getTagSet(DEFAULT_TAGS); + this.person = new Person(defaultName, defaultPhone, defaultEmail, defaultAddress, defaultTags); } /** @@ -49,11 +44,7 @@ public PersonBuilder(ReadOnlyPerson personToCopy) { * Sets the {@code Name} of the {@code Person} that we are building. */ public PersonBuilder withName(String name) { - try { - this.person.setName(new Name(name)); - } catch (IllegalValueException ive) { - throw new IllegalArgumentException("name is expected to be unique."); - } + this.person.setName(new Name(name)); return this; } @@ -61,11 +52,7 @@ public PersonBuilder withName(String name) { * Parses the {@code tags} into a {@code Set} and set it to the {@code Person} that we are building. */ public PersonBuilder withTags(String ... tags) { - try { - this.person.setTags(SampleDataUtil.getTagSet(tags)); - } catch (IllegalValueException ive) { - throw new IllegalArgumentException("tags are expected to be unique."); - } + this.person.setTags(SampleDataUtil.getTagSet(tags)); return this; } @@ -73,11 +60,7 @@ public PersonBuilder withTags(String ... tags) { * Sets the {@code Address} of the {@code Person} that we are building. */ public PersonBuilder withAddress(String address) { - try { - this.person.setAddress(new Address(address)); - } catch (IllegalValueException ive) { - throw new IllegalArgumentException("address is expected to be unique."); - } + this.person.setAddress(new Address(address)); return this; } @@ -85,11 +68,7 @@ public PersonBuilder withAddress(String address) { * Sets the {@code Phone} of the {@code Person} that we are building. */ public PersonBuilder withPhone(String phone) { - try { - this.person.setPhone(new Phone(phone)); - } catch (IllegalValueException ive) { - throw new IllegalArgumentException("phone is expected to be unique."); - } + this.person.setPhone(new Phone(phone)); return this; } @@ -97,11 +76,7 @@ public PersonBuilder withPhone(String phone) { * Sets the {@code Email} of the {@code Person} that we are building. */ public PersonBuilder withEmail(String email) { - try { - this.person.setEmail(new Email(email)); - } catch (IllegalValueException ive) { - throw new IllegalArgumentException("email is expected to be unique."); - } + this.person.setEmail(new Email(email)); return this; }