From 48b56ad4c4e81c987177afd1d744cac57dde8efe Mon Sep 17 00:00:00 2001 From: choonx99 Date: Sat, 28 Sep 2019 04:13:09 +0800 Subject: [PATCH 1/4] safe delete Address class --- .../address/logic/commands/AddCommand.java | 3 - .../address/logic/commands/EditCommand.java | 19 +------ .../logic/parser/AddCommandParser.java | 9 +-- .../seedu/address/logic/parser/CliSyntax.java | 1 - .../logic/parser/EditCommandParser.java | 6 +- .../address/logic/parser/ParserUtil.java | 16 ------ .../seedu/address/model/person/Address.java | 57 ------------------- .../seedu/address/model/person/Person.java | 15 +---- .../address/model/util/SampleDataUtil.java | 7 --- .../address/storage/JsonAdaptedPerson.java | 17 ++---- .../java/seedu/address/ui/PersonCard.java | 1 - .../invalidAndValidPersonAddressBook.json | 2 - .../invalidPersonAddressBook.json | 1 - .../duplicatePersonAddressBook.json | 2 - .../invalidPersonAddressBook.json | 3 +- .../typicalPersonsAddressBook.json | 7 --- .../logic/commands/CommandTestUtil.java | 8 +-- .../logic/parser/AddCommandParserTest.java | 5 -- .../logic/parser/EditCommandParserTest.java | 3 - .../address/logic/parser/ParserUtilTest.java | 24 -------- .../address/model/person/AddressTest.java | 36 ------------ .../storage/JsonAdaptedPersonTest.java | 32 +++-------- .../testutil/EditPersonDescriptorBuilder.java | 10 ---- .../seedu/address/testutil/PersonBuilder.java | 14 +---- .../seedu/address/testutil/PersonUtil.java | 1 - 25 files changed, 24 insertions(+), 275 deletions(-) delete mode 100644 src/main/java/seedu/address/model/person/Address.java delete mode 100644 src/test/java/seedu/address/model/person/AddressTest.java diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 71656d7c5c8..a6cff3044b6 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -1,7 +1,6 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; -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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -23,13 +22,11 @@ public class AddCommand extends Command { + PREFIX_NAME + "NAME " + PREFIX_PHONE + "PHONE " + PREFIX_EMAIL + "EMAIL " - + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " + PREFIX_PHONE + "98765432 " + PREFIX_EMAIL + "johnd@example.com " - + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 " + 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 7e36114902f..71e7d5e98bc 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -1,7 +1,6 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; -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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -19,7 +18,6 @@ import seedu.address.commons.util.CollectionUtil; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -40,7 +38,6 @@ public class EditCommand extends Command { + "[" + PREFIX_NAME + "NAME] " + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " - + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " @@ -96,10 +93,9 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName()); Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone()); Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail()); - Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); - return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags); + return new Person(updatedName, updatedPhone, updatedEmail, updatedTags); } @Override @@ -128,7 +124,6 @@ public static class EditPersonDescriptor { private Name name; private Phone phone; private Email email; - private Address address; private Set tags; public EditPersonDescriptor() {} @@ -141,7 +136,6 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setName(toCopy.name); setPhone(toCopy.phone); setEmail(toCopy.email); - setAddress(toCopy.address); setTags(toCopy.tags); } @@ -149,7 +143,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); + return CollectionUtil.isAnyNonNull(name, phone, email, tags); } public void setName(Name name) { @@ -176,14 +170,6 @@ public Optional getEmail() { return Optional.ofNullable(email); } - public void setAddress(Address address) { - this.address = address; - } - - public Optional
getAddress() { - return Optional.ofNullable(address); - } - /** * Sets {@code tags} to this object's {@code tags}. * A defensive copy of {@code tags} is used internally. @@ -219,7 +205,6 @@ public boolean equals(Object other) { return getName().equals(e.getName()) && getPhone().equals(e.getPhone()) && getEmail().equals(e.getEmail()) - && getAddress().equals(e.getAddress()) && getTags().equals(e.getTags()); } } diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index 3b8bfa035e8..c39a41a3935 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -1,7 +1,6 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -12,7 +11,6 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -31,9 +29,9 @@ 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_TAG); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG); - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) + if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL) || !argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } @@ -41,10 +39,9 @@ public AddCommand parse(String args) throws ParseException { Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()); Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()); 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)); - Person person = new Person(name, phone, email, address, tagList); + Person person = new Person(name, phone, email, tagList); return new AddCommand(person); } diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 75b1a9bf119..9dd7deff4da 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -9,7 +9,6 @@ public class CliSyntax { public static final Prefix PREFIX_NAME = new Prefix("n/"); public static final Prefix PREFIX_PHONE = new Prefix("p/"); public static final Prefix PREFIX_EMAIL = new Prefix("e/"); - public static final Prefix PREFIX_ADDRESS = new Prefix("a/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 845644b7dea..bdfe5ad1978 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -2,7 +2,6 @@ import static java.util.Objects.requireNonNull; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -32,7 +31,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); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG); Index index; @@ -52,9 +51,6 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get())); } - if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { - editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); - } parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags); if (!editPersonDescriptor.isAnyFieldEdited()) { diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index b117acb9c55..9ab53095f44 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -9,7 +9,6 @@ import seedu.address.commons.core.index.Index; import seedu.address.commons.util.StringUtil; import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -65,21 +64,6 @@ public static Phone parsePhone(String phone) throws ParseException { return new Phone(trimmedPhone); } - /** - * Parses a {@code String address} into an {@code Address}. - * Leading and trailing whitespaces will be trimmed. - * - * @throws ParseException if the given {@code address} is invalid. - */ - public static Address parseAddress(String address) throws ParseException { - requireNonNull(address); - String trimmedAddress = address.trim(); - if (!Address.isValidAddress(trimmedAddress)) { - throw new ParseException(Address.MESSAGE_CONSTRAINTS); - } - return new Address(trimmedAddress); - } - /** * Parses a {@code String email} into an {@code Email}. * Leading and trailing whitespaces will be trimmed. diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java deleted file mode 100644 index 60472ca22a0..00000000000 --- a/src/main/java/seedu/address/model/person/Address.java +++ /dev/null @@ -1,57 +0,0 @@ -package seedu.address.model.person; - -import static java.util.Objects.requireNonNull; -import static seedu.address.commons.util.AppUtil.checkArgument; - -/** - * Represents a Person's address in the address book. - * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)} - */ -public class Address { - - public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank"; - - /* - * The first character of the address must not be a whitespace, - * otherwise " " (a blank string) becomes a valid input. - */ - public static final String VALIDATION_REGEX = "[^\\s].*"; - - public final String value; - - /** - * Constructs an {@code Address}. - * - * @param address A valid address. - */ - public Address(String address) { - requireNonNull(address); - checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS); - value = address; - } - - /** - * Returns true if a given string is a valid email. - */ - public static boolean isValidAddress(String test) { - return test.matches(VALIDATION_REGEX); - } - - @Override - public String toString() { - return value; - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same object - || (other instanceof Address // instanceof handles nulls - && value.equals(((Address) other).value)); // state check - } - - @Override - public int hashCode() { - return value.hashCode(); - } - -} diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index 557a7a60cd5..f43cae3f1a1 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -21,18 +21,16 @@ public class Person { private final Email email; // Data fields - private final Address address; private final Set tags = new HashSet<>(); /** * 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, Set tags) { + requireAllNonNull(name, phone, email, tags); this.name = name; this.phone = phone; this.email = email; - this.address = address; this.tags.addAll(tags); } @@ -48,10 +46,6 @@ public Email getEmail() { return email; } - public Address getAddress() { - return address; - } - /** * Returns an immutable tag set, which throws {@code UnsupportedOperationException} * if modification is attempted. @@ -92,14 +86,13 @@ public boolean equals(Object other) { return otherPerson.getName().equals(getName()) && otherPerson.getPhone().equals(getPhone()) && otherPerson.getEmail().equals(getEmail()) - && otherPerson.getAddress().equals(getAddress()) && otherPerson.getTags().equals(getTags()); } @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, tags); } @Override @@ -110,8 +103,6 @@ public String toString() { .append(getPhone()) .append(" Email: ") .append(getEmail()) - .append(" Address: ") - .append(getAddress()) .append(" Tags: "); getTags().forEach(builder::append); return builder.toString(); diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 1806da4facf..c8ca69d0cbc 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -6,7 +6,6 @@ import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -20,22 +19,16 @@ public class SampleDataUtil { public static Person[] getSamplePersons() { 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")) }; } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index a6321cec2ea..76a9bc76b0a 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import seedu.address.commons.exceptions.IllegalValueException; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -27,7 +26,6 @@ class JsonAdaptedPerson { private final String name; private final String phone; private final String email; - private final String address; private final List tagged = new ArrayList<>(); /** @@ -35,12 +33,11 @@ class JsonAdaptedPerson { */ @JsonCreator public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone, - @JsonProperty("email") String email, @JsonProperty("address") String address, + @JsonProperty("email") String email, @JsonProperty("tagged") List tagged) { this.name = name; this.phone = phone; this.email = email; - this.address = address; if (tagged != null) { this.tagged.addAll(tagged); } @@ -53,7 +50,6 @@ public JsonAdaptedPerson(Person source) { name = source.getName().fullName; phone = source.getPhone().value; email = source.getEmail().value; - address = source.getAddress().value; tagged.addAll(source.getTags().stream() .map(JsonAdaptedTag::new) .collect(Collectors.toList())); @@ -94,16 +90,11 @@ public Person toModelType() throws IllegalValueException { } final Email modelEmail = new Email(email); - if (address == null) { - throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName())); - } - if (!Address.isValidAddress(address)) { - throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS); - } - final Address modelAddress = new Address(address); + + final Set modelTags = new HashSet<>(personTags); - return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags); + return new Person(modelName, modelPhone, modelEmail, modelTags); } } diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 0684b088868..85142fe6048 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -47,7 +47,6 @@ public PersonCard(Person person, int displayedIndex) { id.setText(displayedIndex + ". "); name.setText(person.getName().fullName); phone.setText(person.getPhone().value); - address.setText(person.getAddress().value); email.setText(person.getEmail().value); person.getTags().stream() .sorted(Comparator.comparing(tag -> tag.tagName)) diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json index 6a4d2b7181c..15047decade 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json @@ -3,11 +3,9 @@ "name": "Valid Person", "phone": "9482424", "email": "hans@example.com", - "address": "4th street" }, { "name": "Person With Invalid Phone Field", "phone": "948asdf2424", "email": "hans@example.com", - "address": "4th street" } ] } diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json index ccd21f7d1a9..c89c9c85f0f 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json @@ -3,6 +3,5 @@ "name": "Person with invalid name field: Ha!ns Mu@ster", "phone": "9482424", "email": "hans@example.com", - "address": "4th street" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json index 48831cc7674..26cb38712ee 100644 --- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json @@ -3,12 +3,10 @@ "name": "Alice Pauline", "phone": "94351253", "email": "alice@example.com", - "address": "123, Jurong West Ave 6, #08-111", "tagged": [ "friends" ] }, { "name": "Alice Pauline", "phone": "94351253", "email": "pauline@example.com", - "address": "4th street" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json index ad3f135ae42..671f3da654c 100644 --- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json @@ -2,7 +2,6 @@ "persons": [ { "name": "Hans Muster", "phone": "9482424", - "email": "invalid@email!3e", - "address": "4th street" + "email": "invalid@email!3e" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json index f10eddee12e..51a5ce525a3 100644 --- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json @@ -4,43 +4,36 @@ "name" : "Alice Pauline", "phone" : "94351253", "email" : "alice@example.com", - "address" : "123, Jurong West Ave 6, #08-111", "tagged" : [ "friends" ] }, { "name" : "Benson Meier", "phone" : "98765432", "email" : "johnd@example.com", - "address" : "311, Clementi Ave 2, #02-25", "tagged" : [ "owesMoney", "friends" ] }, { "name" : "Carl Kurz", "phone" : "95352563", "email" : "heinz@example.com", - "address" : "wall street", "tagged" : [ ] }, { "name" : "Daniel Meier", "phone" : "87652533", "email" : "cornelia@example.com", - "address" : "10th street", "tagged" : [ "friends" ] }, { "name" : "Elle Meyer", "phone" : "9482224", "email" : "werner@example.com", - "address" : "michegan ave", "tagged" : [ ] }, { "name" : "Fiona Kunz", "phone" : "9482427", "email" : "lydia@example.com", - "address" : "little tokyo", "tagged" : [ ] }, { "name" : "George Best", "phone" : "9482442", "email" : "anna@example.com", - "address" : "4th street", "tagged" : [ ] } ] } diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 643a1d08069..08a7a433a8e 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; 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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -43,15 +42,12 @@ public class CommandTestUtil { public static final String PHONE_DESC_BOB = " " + PREFIX_PHONE + VALID_PHONE_BOB; public static final String EMAIL_DESC_AMY = " " + PREFIX_EMAIL + VALID_EMAIL_AMY; public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB; - public static final String ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY; - 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 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 PREAMBLE_WHITESPACE = "\t \r \n"; @@ -62,10 +58,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) + .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY) .withTags(VALID_TAG_FRIEND).build(); DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB) - .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) + .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB) .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); } diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index 5cf487d7ebb..eaec6fea31a 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -32,7 +32,6 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.commands.AddCommand; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -121,10 +120,6 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, 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); - // 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); diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index 2ff31522486..b549285035b 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -5,7 +5,6 @@ import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; 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_NAME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; @@ -36,7 +35,6 @@ import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -84,7 +82,6 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone 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 // invalid phone followed by valid email diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 4256788b1a7..2f0027be91f 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -14,7 +14,6 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -102,29 +101,6 @@ public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exc assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace)); } - @Test - public void parseAddress_null_throwsNullPointerException() { - assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((String) null)); - } - - @Test - public void parseAddress_invalidValue_throwsParseException() { - assertThrows(ParseException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS)); - } - - @Test - public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception { - Address expectedAddress = new Address(VALID_ADDRESS); - assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS)); - } - - @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)); - } - @Test public void parseEmail_null_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((String) null)); diff --git a/src/test/java/seedu/address/model/person/AddressTest.java b/src/test/java/seedu/address/model/person/AddressTest.java deleted file mode 100644 index dcd3be87b3a..00000000000 --- a/src/test/java/seedu/address/model/person/AddressTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package seedu.address.model.person; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static seedu.address.testutil.Assert.assertThrows; - -import org.junit.jupiter.api.Test; - -public class AddressTest { - - @Test - public void constructor_null_throwsNullPointerException() { - assertThrows(NullPointerException.class, () -> new Address(null)); - } - - @Test - public void constructor_invalidAddress_throwsIllegalArgumentException() { - String invalidAddress = ""; - assertThrows(IllegalArgumentException.class, () -> new Address(invalidAddress)); - } - - @Test - public void isValidAddress() { - // null address - assertThrows(NullPointerException.class, () -> Address.isValidAddress(null)); - - // invalid addresses - assertFalse(Address.isValidAddress("")); // empty string - assertFalse(Address.isValidAddress(" ")); // spaces only - - // valid addresses - assertTrue(Address.isValidAddress("Blk 456, Den Road, #01-355")); - assertTrue(Address.isValidAddress("-")); // one character - assertTrue(Address.isValidAddress("Leng Inc; 1234 Market St; San Francisco CA 2349879; USA")); // long address - } -} diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java index 83b11331cdb..cd3e64e7bba 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -12,7 +12,6 @@ import org.junit.jupiter.api.Test; import seedu.address.commons.exceptions.IllegalValueException; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -20,14 +19,12 @@ public class JsonAdaptedPersonTest { 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(JsonAdaptedTag::new) .collect(Collectors.toList()); @@ -41,14 +38,14 @@ 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); + new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAGS); String expectedMessage = Name.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullName_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -56,14 +53,14 @@ 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); + new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_TAGS); String expectedMessage = Phone.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullPhone_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -71,39 +68,24 @@ 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); + new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_TAGS); String expectedMessage = Email.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullEmail_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } - @Test - public void toModelType_invalidAddress_throwsIllegalValueException() { - JsonAdaptedPerson person = - new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS); - String expectedMessage = Address.MESSAGE_CONSTRAINTS; - assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); - } - - @Test - public void toModelType_nullAddress_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS); - String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()); - assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); - } - @Test 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); + new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, invalidTags); 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..60f8b888d12 100644 --- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java @@ -5,7 +5,6 @@ import java.util.stream.Stream; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -35,7 +34,6 @@ public EditPersonDescriptorBuilder(Person person) { descriptor.setName(person.getName()); descriptor.setPhone(person.getPhone()); descriptor.setEmail(person.getEmail()); - descriptor.setAddress(person.getAddress()); descriptor.setTags(person.getTags()); } @@ -63,14 +61,6 @@ public EditPersonDescriptorBuilder withEmail(String email) { return this; } - /** - * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building. - */ - public EditPersonDescriptorBuilder withAddress(String address) { - descriptor.setAddress(new Address(address)); - return this; - } - /** * Parses the {@code tags} into a {@code Set} and set it to the {@code EditPersonDescriptor} * that we are building. diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java index 5eff412178b..1f99937b467 100644 --- a/src/test/java/seedu/address/testutil/PersonBuilder.java +++ b/src/test/java/seedu/address/testutil/PersonBuilder.java @@ -3,7 +3,6 @@ import java.util.HashSet; import java.util.Set; -import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -24,14 +23,12 @@ public class PersonBuilder { private Name name; private Phone phone; private Email email; - private Address address; private Set tags; public PersonBuilder() { name = new Name(DEFAULT_NAME); phone = new Phone(DEFAULT_PHONE); email = new Email(DEFAULT_EMAIL); - address = new Address(DEFAULT_ADDRESS); tags = new HashSet<>(); } @@ -42,7 +39,6 @@ public PersonBuilder(Person personToCopy) { name = personToCopy.getName(); phone = personToCopy.getPhone(); email = personToCopy.getEmail(); - address = personToCopy.getAddress(); tags = new HashSet<>(personToCopy.getTags()); } @@ -62,14 +58,6 @@ public PersonBuilder withTags(String ... tags) { return this; } - /** - * Sets the {@code Address} of the {@code Person} that we are building. - */ - public PersonBuilder withAddress(String address) { - this.address = new Address(address); - return this; - } - /** * Sets the {@code Phone} of the {@code Person} that we are building. */ @@ -87,7 +75,7 @@ public PersonBuilder withEmail(String email) { } public Person build() { - return new Person(name, phone, email, address, tags); + return new Person(name, phone, email, tags); } } diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java index 90849945183..9867b40ef9a 100644 --- a/src/test/java/seedu/address/testutil/PersonUtil.java +++ b/src/test/java/seedu/address/testutil/PersonUtil.java @@ -1,6 +1,5 @@ package seedu.address.testutil; -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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; From da8dc7c922d269d592098876f59ad89f1c2b16bd Mon Sep 17 00:00:00 2001 From: choonx99 Date: Wed, 2 Oct 2019 20:16:20 +0800 Subject: [PATCH 2/4] Remove trailing white space from contactus doc --- docs/ContactUs.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ContactUs.adoc b/docs/ContactUs.adoc index 2fcbfb7561d..bf2f1fb9719 100644 --- a/docs/ContactUs.adoc +++ b/docs/ContactUs.adoc @@ -4,7 +4,7 @@ * *Bug reports, Suggestions* : Post in our https://github.com/se-edu/addressbook-level3/issues[issue tracker] if you noticed bugs or have suggestions on how to improve. * *Contributing* : We welcome pull requests. Follow the process described https://github.com/oss-generic/process[here] -* *Email us* : You can also reach us at +* *Email us* : You can also reach us at Ng Choon Wah : e0310972@u.nus.edu Xiu Ziheng : e0140856@u.nus.edu From 76ee55e0028a6e2c02f4b16c6e70af5e02eb04ff Mon Sep 17 00:00:00 2001 From: choonx99 Date: Wed, 9 Oct 2019 22:16:14 +0800 Subject: [PATCH 3/4] revert removeAddr merge --- .../address/logic/commands/AddCommand.java | 3 + .../address/logic/commands/EditCommand.java | 19 ++++++- .../logic/parser/AddCommandParser.java | 9 ++- .../seedu/address/logic/parser/CliSyntax.java | 1 + .../logic/parser/EditCommandParser.java | 6 +- .../address/logic/parser/ParserUtil.java | 16 ++++++ .../seedu/address/model/person/Address.java | 57 +++++++++++++++++++ .../seedu/address/model/person/Person.java | 15 ++++- .../address/model/util/SampleDataUtil.java | 7 +++ .../address/storage/JsonAdaptedPerson.java | 17 ++++-- .../java/seedu/address/ui/PersonCard.java | 1 + .../invalidAndValidPersonAddressBook.json | 2 + .../invalidPersonAddressBook.json | 1 + .../duplicatePersonAddressBook.json | 2 + .../invalidPersonAddressBook.json | 3 +- .../typicalPersonsAddressBook.json | 7 +++ .../logic/commands/CommandTestUtil.java | 8 ++- .../logic/parser/AddCommandParserTest.java | 5 ++ .../logic/parser/EditCommandParserTest.java | 3 + .../address/logic/parser/ParserUtilTest.java | 24 ++++++++ .../address/model/person/AddressTest.java | 36 ++++++++++++ .../storage/JsonAdaptedPersonTest.java | 32 ++++++++--- .../testutil/EditPersonDescriptorBuilder.java | 10 ++++ .../seedu/address/testutil/PersonBuilder.java | 14 ++++- .../seedu/address/testutil/PersonUtil.java | 1 + 25 files changed, 275 insertions(+), 24 deletions(-) create mode 100644 src/main/java/seedu/address/model/person/Address.java create mode 100644 src/test/java/seedu/address/model/person/AddressTest.java diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index a6cff3044b6..71656d7c5c8 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -1,6 +1,7 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; +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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -22,11 +23,13 @@ public class AddCommand extends Command { + PREFIX_NAME + "NAME " + PREFIX_PHONE + "PHONE " + PREFIX_EMAIL + "EMAIL " + + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " + PREFIX_PHONE + "98765432 " + PREFIX_EMAIL + "johnd@example.com " + + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 " + 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 71e7d5e98bc..7e36114902f 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -1,6 +1,7 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; +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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -18,6 +19,7 @@ import seedu.address.commons.util.CollectionUtil; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -38,6 +40,7 @@ public class EditCommand extends Command { + "[" + PREFIX_NAME + "NAME] " + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " @@ -93,9 +96,10 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName()); Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone()); Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail()); + Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); - return new Person(updatedName, updatedPhone, updatedEmail, updatedTags); + return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags); } @Override @@ -124,6 +128,7 @@ public static class EditPersonDescriptor { private Name name; private Phone phone; private Email email; + private Address address; private Set tags; public EditPersonDescriptor() {} @@ -136,6 +141,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setName(toCopy.name); setPhone(toCopy.phone); setEmail(toCopy.email); + setAddress(toCopy.address); setTags(toCopy.tags); } @@ -143,7 +149,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { * Returns true if at least one field is edited. */ public boolean isAnyFieldEdited() { - return CollectionUtil.isAnyNonNull(name, phone, email, tags); + return CollectionUtil.isAnyNonNull(name, phone, email, address, tags); } public void setName(Name name) { @@ -170,6 +176,14 @@ public Optional getEmail() { return Optional.ofNullable(email); } + public void setAddress(Address address) { + this.address = address; + } + + public Optional
getAddress() { + return Optional.ofNullable(address); + } + /** * Sets {@code tags} to this object's {@code tags}. * A defensive copy of {@code tags} is used internally. @@ -205,6 +219,7 @@ public boolean equals(Object other) { return getName().equals(e.getName()) && getPhone().equals(e.getPhone()) && getEmail().equals(e.getEmail()) + && getAddress().equals(e.getAddress()) && getTags().equals(e.getTags()); } } diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index c39a41a3935..3b8bfa035e8 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -1,6 +1,7 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -11,6 +12,7 @@ import seedu.address.logic.commands.AddCommand; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -29,9 +31,9 @@ public class AddCommandParser implements Parser { */ public AddCommand parse(String args) throws ParseException { ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_TAG); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL) + if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) || !argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } @@ -39,9 +41,10 @@ public AddCommand parse(String args) throws ParseException { Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()); Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()); 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)); - Person person = new Person(name, phone, email, tagList); + Person person = new Person(name, phone, email, address, tagList); return new AddCommand(person); } diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 9dd7deff4da..75b1a9bf119 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -9,6 +9,7 @@ public class CliSyntax { public static final Prefix PREFIX_NAME = new Prefix("n/"); public static final Prefix PREFIX_PHONE = new Prefix("p/"); public static final Prefix PREFIX_EMAIL = new Prefix("e/"); + public static final Prefix PREFIX_ADDRESS = new Prefix("a/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index bdfe5ad1978..845644b7dea 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -2,6 +2,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -31,7 +32,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_TAG); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); Index index; @@ -51,6 +52,9 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get())); } + if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { + editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); + } parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags); if (!editPersonDescriptor.isAnyFieldEdited()) { diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 9ab53095f44..b117acb9c55 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -9,6 +9,7 @@ import seedu.address.commons.core.index.Index; import seedu.address.commons.util.StringUtil; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -64,6 +65,21 @@ public static Phone parsePhone(String phone) throws ParseException { return new Phone(trimmedPhone); } + /** + * Parses a {@code String address} into an {@code Address}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code address} is invalid. + */ + public static Address parseAddress(String address) throws ParseException { + requireNonNull(address); + String trimmedAddress = address.trim(); + if (!Address.isValidAddress(trimmedAddress)) { + throw new ParseException(Address.MESSAGE_CONSTRAINTS); + } + return new Address(trimmedAddress); + } + /** * Parses a {@code String email} into an {@code Email}. * Leading and trailing whitespaces will be trimmed. diff --git a/src/main/java/seedu/address/model/person/Address.java b/src/main/java/seedu/address/model/person/Address.java new file mode 100644 index 00000000000..60472ca22a0 --- /dev/null +++ b/src/main/java/seedu/address/model/person/Address.java @@ -0,0 +1,57 @@ +package seedu.address.model.person; + +import static java.util.Objects.requireNonNull; +import static seedu.address.commons.util.AppUtil.checkArgument; + +/** + * Represents a Person's address in the address book. + * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)} + */ +public class Address { + + public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank"; + + /* + * The first character of the address must not be a whitespace, + * otherwise " " (a blank string) becomes a valid input. + */ + public static final String VALIDATION_REGEX = "[^\\s].*"; + + public final String value; + + /** + * Constructs an {@code Address}. + * + * @param address A valid address. + */ + public Address(String address) { + requireNonNull(address); + checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS); + value = address; + } + + /** + * Returns true if a given string is a valid email. + */ + public static boolean isValidAddress(String test) { + return test.matches(VALIDATION_REGEX); + } + + @Override + public String toString() { + return value; + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof Address // instanceof handles nulls + && value.equals(((Address) other).value)); // state check + } + + @Override + public int hashCode() { + return value.hashCode(); + } + +} diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index f43cae3f1a1..557a7a60cd5 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -21,16 +21,18 @@ public class Person { private final Email email; // Data fields + private final Address address; private final Set tags = new HashSet<>(); /** * Every field must be present and not null. */ - public Person(Name name, Phone phone, Email email, Set tags) { - requireAllNonNull(name, phone, email, tags); + public Person(Name name, Phone phone, Email email, Address address, Set tags) { + requireAllNonNull(name, phone, email, address, tags); this.name = name; this.phone = phone; this.email = email; + this.address = address; this.tags.addAll(tags); } @@ -46,6 +48,10 @@ public Email getEmail() { return email; } + public Address getAddress() { + return address; + } + /** * Returns an immutable tag set, which throws {@code UnsupportedOperationException} * if modification is attempted. @@ -86,13 +92,14 @@ public boolean equals(Object other) { return otherPerson.getName().equals(getName()) && otherPerson.getPhone().equals(getPhone()) && otherPerson.getEmail().equals(getEmail()) + && otherPerson.getAddress().equals(getAddress()) && otherPerson.getTags().equals(getTags()); } @Override public int hashCode() { // use this method for custom fields hashing instead of implementing your own - return Objects.hash(name, phone, email, tags); + return Objects.hash(name, phone, email, address, tags); } @Override @@ -103,6 +110,8 @@ public String toString() { .append(getPhone()) .append(" Email: ") .append(getEmail()) + .append(" Address: ") + .append(getAddress()) .append(" Tags: "); getTags().forEach(builder::append); return builder.toString(); diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index c8ca69d0cbc..1806da4facf 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -6,6 +6,7 @@ import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -19,16 +20,22 @@ public class SampleDataUtil { public static Person[] getSamplePersons() { 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")) }; } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index 76a9bc76b0a..a6321cec2ea 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -26,6 +27,7 @@ class JsonAdaptedPerson { private final String name; private final String phone; private final String email; + private final String address; private final List tagged = new ArrayList<>(); /** @@ -33,11 +35,12 @@ class JsonAdaptedPerson { */ @JsonCreator public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone, - @JsonProperty("email") String email, + @JsonProperty("email") String email, @JsonProperty("address") String address, @JsonProperty("tagged") List tagged) { this.name = name; this.phone = phone; this.email = email; + this.address = address; if (tagged != null) { this.tagged.addAll(tagged); } @@ -50,6 +53,7 @@ public JsonAdaptedPerson(Person source) { name = source.getName().fullName; phone = source.getPhone().value; email = source.getEmail().value; + address = source.getAddress().value; tagged.addAll(source.getTags().stream() .map(JsonAdaptedTag::new) .collect(Collectors.toList())); @@ -90,11 +94,16 @@ public Person toModelType() throws IllegalValueException { } final Email modelEmail = new Email(email); - - + if (address == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName())); + } + if (!Address.isValidAddress(address)) { + throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS); + } + final Address modelAddress = new Address(address); final Set modelTags = new HashSet<>(personTags); - return new Person(modelName, modelPhone, modelEmail, modelTags); + return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags); } } diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 85142fe6048..0684b088868 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -47,6 +47,7 @@ public PersonCard(Person person, int displayedIndex) { id.setText(displayedIndex + ". "); name.setText(person.getName().fullName); phone.setText(person.getPhone().value); + address.setText(person.getAddress().value); email.setText(person.getEmail().value); person.getTags().stream() .sorted(Comparator.comparing(tag -> tag.tagName)) diff --git a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json index 15047decade..6a4d2b7181c 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidAndValidPersonAddressBook.json @@ -3,9 +3,11 @@ "name": "Valid Person", "phone": "9482424", "email": "hans@example.com", + "address": "4th street" }, { "name": "Person With Invalid Phone Field", "phone": "948asdf2424", "email": "hans@example.com", + "address": "4th street" } ] } diff --git a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json index c89c9c85f0f..ccd21f7d1a9 100644 --- a/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonAddressBookStorageTest/invalidPersonAddressBook.json @@ -3,5 +3,6 @@ "name": "Person with invalid name field: Ha!ns Mu@ster", "phone": "9482424", "email": "hans@example.com", + "address": "4th street" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json index 26cb38712ee..48831cc7674 100644 --- a/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/duplicatePersonAddressBook.json @@ -3,10 +3,12 @@ "name": "Alice Pauline", "phone": "94351253", "email": "alice@example.com", + "address": "123, Jurong West Ave 6, #08-111", "tagged": [ "friends" ] }, { "name": "Alice Pauline", "phone": "94351253", "email": "pauline@example.com", + "address": "4th street" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json index 671f3da654c..ad3f135ae42 100644 --- a/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/invalidPersonAddressBook.json @@ -2,6 +2,7 @@ "persons": [ { "name": "Hans Muster", "phone": "9482424", - "email": "invalid@email!3e" + "email": "invalid@email!3e", + "address": "4th street" } ] } diff --git a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json index 51a5ce525a3..f10eddee12e 100644 --- a/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json +++ b/src/test/data/JsonSerializableAddressBookTest/typicalPersonsAddressBook.json @@ -4,36 +4,43 @@ "name" : "Alice Pauline", "phone" : "94351253", "email" : "alice@example.com", + "address" : "123, Jurong West Ave 6, #08-111", "tagged" : [ "friends" ] }, { "name" : "Benson Meier", "phone" : "98765432", "email" : "johnd@example.com", + "address" : "311, Clementi Ave 2, #02-25", "tagged" : [ "owesMoney", "friends" ] }, { "name" : "Carl Kurz", "phone" : "95352563", "email" : "heinz@example.com", + "address" : "wall street", "tagged" : [ ] }, { "name" : "Daniel Meier", "phone" : "87652533", "email" : "cornelia@example.com", + "address" : "10th street", "tagged" : [ "friends" ] }, { "name" : "Elle Meyer", "phone" : "9482224", "email" : "werner@example.com", + "address" : "michegan ave", "tagged" : [ ] }, { "name" : "Fiona Kunz", "phone" : "9482427", "email" : "lydia@example.com", + "address" : "little tokyo", "tagged" : [ ] }, { "name" : "George Best", "phone" : "9482442", "email" : "anna@example.com", + "address" : "4th street", "tagged" : [ ] } ] } diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 08a7a433a8e..643a1d08069 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; 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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -42,12 +43,15 @@ public class CommandTestUtil { public static final String PHONE_DESC_BOB = " " + PREFIX_PHONE + VALID_PHONE_BOB; public static final String EMAIL_DESC_AMY = " " + PREFIX_EMAIL + VALID_EMAIL_AMY; public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB; + public static final String ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY; + 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 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 PREAMBLE_WHITESPACE = "\t \r \n"; @@ -58,10 +62,10 @@ public class CommandTestUtil { static { DESC_AMY = new EditPersonDescriptorBuilder().withName(VALID_NAME_AMY) - .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY) + .withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY) .withTags(VALID_TAG_FRIEND).build(); DESC_BOB = new EditPersonDescriptorBuilder().withName(VALID_NAME_BOB) - .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB) + .withPhone(VALID_PHONE_BOB).withEmail(VALID_EMAIL_BOB).withAddress(VALID_ADDRESS_BOB) .withTags(VALID_TAG_HUSBAND, VALID_TAG_FRIEND).build(); } diff --git a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java index eaec6fea31a..5cf487d7ebb 100644 --- a/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddCommandParserTest.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.commands.AddCommand; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -120,6 +121,10 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND, 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); + // 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); diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index b549285035b..2ff31522486 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -5,6 +5,7 @@ import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB; import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY; 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_NAME_DESC; import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC; @@ -35,6 +36,7 @@ import seedu.address.commons.core.index.Index; import seedu.address.logic.commands.EditCommand; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -82,6 +84,7 @@ public void parse_invalidValue_failure() { assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone 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 // invalid phone followed by valid email diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 2f0027be91f..4256788b1a7 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -101,6 +102,29 @@ public void parsePhone_validValueWithWhitespace_returnsTrimmedPhone() throws Exc assertEquals(expectedPhone, ParserUtil.parsePhone(phoneWithWhitespace)); } + @Test + public void parseAddress_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> ParserUtil.parseAddress((String) null)); + } + + @Test + public void parseAddress_invalidValue_throwsParseException() { + assertThrows(ParseException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS)); + } + + @Test + public void parseAddress_validValueWithoutWhitespace_returnsAddress() throws Exception { + Address expectedAddress = new Address(VALID_ADDRESS); + assertEquals(expectedAddress, ParserUtil.parseAddress(VALID_ADDRESS)); + } + + @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)); + } + @Test public void parseEmail_null_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> ParserUtil.parseEmail((String) null)); diff --git a/src/test/java/seedu/address/model/person/AddressTest.java b/src/test/java/seedu/address/model/person/AddressTest.java new file mode 100644 index 00000000000..dcd3be87b3a --- /dev/null +++ b/src/test/java/seedu/address/model/person/AddressTest.java @@ -0,0 +1,36 @@ +package seedu.address.model.person; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static seedu.address.testutil.Assert.assertThrows; + +import org.junit.jupiter.api.Test; + +public class AddressTest { + + @Test + public void constructor_null_throwsNullPointerException() { + assertThrows(NullPointerException.class, () -> new Address(null)); + } + + @Test + public void constructor_invalidAddress_throwsIllegalArgumentException() { + String invalidAddress = ""; + assertThrows(IllegalArgumentException.class, () -> new Address(invalidAddress)); + } + + @Test + public void isValidAddress() { + // null address + assertThrows(NullPointerException.class, () -> Address.isValidAddress(null)); + + // invalid addresses + assertFalse(Address.isValidAddress("")); // empty string + assertFalse(Address.isValidAddress(" ")); // spaces only + + // valid addresses + assertTrue(Address.isValidAddress("Blk 456, Den Road, #01-355")); + assertTrue(Address.isValidAddress("-")); // one character + assertTrue(Address.isValidAddress("Leng Inc; 1234 Market St; San Francisco CA 2349879; USA")); // long address + } +} diff --git a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java index cd3e64e7bba..83b11331cdb 100644 --- a/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java +++ b/src/test/java/seedu/address/storage/JsonAdaptedPersonTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; @@ -19,12 +20,14 @@ public class JsonAdaptedPersonTest { 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(JsonAdaptedTag::new) .collect(Collectors.toList()); @@ -38,14 +41,14 @@ public void toModelType_validPersonDetails_returnsPerson() throws Exception { @Test public void toModelType_invalidName_throwsIllegalValueException() { JsonAdaptedPerson person = - new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_TAGS); + new JsonAdaptedPerson(INVALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); String expectedMessage = Name.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullName_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(null, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -53,14 +56,14 @@ public void toModelType_nullName_throwsIllegalValueException() { @Test public void toModelType_invalidPhone_throwsIllegalValueException() { JsonAdaptedPerson person = - new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_TAGS); + new JsonAdaptedPerson(VALID_NAME, INVALID_PHONE, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); String expectedMessage = Phone.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullPhone_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, null, VALID_EMAIL, VALID_ADDRESS, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @@ -68,24 +71,39 @@ public void toModelType_nullPhone_throwsIllegalValueException() { @Test public void toModelType_invalidEmail_throwsIllegalValueException() { JsonAdaptedPerson person = - new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_TAGS); + new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, INVALID_EMAIL, VALID_ADDRESS, VALID_TAGS); String expectedMessage = Email.MESSAGE_CONSTRAINTS; assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } @Test public void toModelType_nullEmail_throwsIllegalValueException() { - JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_TAGS); + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, null, VALID_ADDRESS, VALID_TAGS); String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Email.class.getSimpleName()); assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); } + @Test + public void toModelType_invalidAddress_throwsIllegalValueException() { + JsonAdaptedPerson person = + new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, INVALID_ADDRESS, VALID_TAGS); + String expectedMessage = Address.MESSAGE_CONSTRAINTS; + assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); + } + + @Test + public void toModelType_nullAddress_throwsIllegalValueException() { + JsonAdaptedPerson person = new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, null, VALID_TAGS); + String expectedMessage = String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()); + assertThrows(IllegalValueException.class, expectedMessage, person::toModelType); + } + @Test 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, invalidTags); + new JsonAdaptedPerson(VALID_NAME, VALID_PHONE, VALID_EMAIL, VALID_ADDRESS, invalidTags); 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 60f8b888d12..4584bd5044e 100644 --- a/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java +++ b/src/test/java/seedu/address/testutil/EditPersonDescriptorBuilder.java @@ -5,6 +5,7 @@ import java.util.stream.Stream; import seedu.address.logic.commands.EditCommand.EditPersonDescriptor; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -34,6 +35,7 @@ public EditPersonDescriptorBuilder(Person person) { descriptor.setName(person.getName()); descriptor.setPhone(person.getPhone()); descriptor.setEmail(person.getEmail()); + descriptor.setAddress(person.getAddress()); descriptor.setTags(person.getTags()); } @@ -61,6 +63,14 @@ public EditPersonDescriptorBuilder withEmail(String email) { return this; } + /** + * Sets the {@code Address} of the {@code EditPersonDescriptor} that we are building. + */ + public EditPersonDescriptorBuilder withAddress(String address) { + descriptor.setAddress(new Address(address)); + return this; + } + /** * Parses the {@code tags} into a {@code Set} and set it to the {@code EditPersonDescriptor} * that we are building. diff --git a/src/test/java/seedu/address/testutil/PersonBuilder.java b/src/test/java/seedu/address/testutil/PersonBuilder.java index 1f99937b467..5eff412178b 100644 --- a/src/test/java/seedu/address/testutil/PersonBuilder.java +++ b/src/test/java/seedu/address/testutil/PersonBuilder.java @@ -3,6 +3,7 @@ import java.util.HashSet; import java.util.Set; +import seedu.address.model.person.Address; import seedu.address.model.person.Email; import seedu.address.model.person.Name; import seedu.address.model.person.Person; @@ -23,12 +24,14 @@ public class PersonBuilder { private Name name; private Phone phone; private Email email; + private Address address; private Set tags; public PersonBuilder() { name = new Name(DEFAULT_NAME); phone = new Phone(DEFAULT_PHONE); email = new Email(DEFAULT_EMAIL); + address = new Address(DEFAULT_ADDRESS); tags = new HashSet<>(); } @@ -39,6 +42,7 @@ public PersonBuilder(Person personToCopy) { name = personToCopy.getName(); phone = personToCopy.getPhone(); email = personToCopy.getEmail(); + address = personToCopy.getAddress(); tags = new HashSet<>(personToCopy.getTags()); } @@ -58,6 +62,14 @@ public PersonBuilder withTags(String ... tags) { return this; } + /** + * Sets the {@code Address} of the {@code Person} that we are building. + */ + public PersonBuilder withAddress(String address) { + this.address = new Address(address); + return this; + } + /** * Sets the {@code Phone} of the {@code Person} that we are building. */ @@ -75,7 +87,7 @@ public PersonBuilder withEmail(String email) { } public Person build() { - return new Person(name, phone, email, tags); + return new Person(name, phone, email, address, tags); } } diff --git a/src/test/java/seedu/address/testutil/PersonUtil.java b/src/test/java/seedu/address/testutil/PersonUtil.java index 9867b40ef9a..90849945183 100644 --- a/src/test/java/seedu/address/testutil/PersonUtil.java +++ b/src/test/java/seedu/address/testutil/PersonUtil.java @@ -1,5 +1,6 @@ package seedu.address.testutil; +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_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; From bf44018f5fe4ba76b522b5813c5c3d4ff01c6824 Mon Sep 17 00:00:00 2001 From: choonx99 Date: Wed, 16 Oct 2019 16:39:52 +0800 Subject: [PATCH 4/4] update app name, icon and userguide link --- .../java/seedu/address/ui/HelpWindow.java | 2 +- src/main/resources/images/expense_list_32.png | Bin 4214 -> 29712 bytes src/main/resources/view/MainWindow.fxml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/address/ui/HelpWindow.java b/src/main/java/seedu/address/ui/HelpWindow.java index 9a665915949..f835f94426b 100644 --- a/src/main/java/seedu/address/ui/HelpWindow.java +++ b/src/main/java/seedu/address/ui/HelpWindow.java @@ -15,7 +15,7 @@ */ public class HelpWindow extends UiPart { - public static final String USERGUIDE_URL = "https://se-education.org/addressbook-level3/UserGuide.html"; + public static final String USERGUIDE_URL = "https://ay1920s1-cs2103-t14-4.github.io/main/UserGuide.html"; public static final String HELP_MESSAGE = "Refer to the user guide: " + USERGUIDE_URL; private static final Logger logger = LogsCenter.getLogger(HelpWindow.class); diff --git a/src/main/resources/images/expense_list_32.png b/src/main/resources/images/expense_list_32.png index 29810cf1fd938e8568946ad28ee0c678564804b2..043840c833e8faacdd4a7416a5687da98cfc7d2b 100644 GIT binary patch literal 29712 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 diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 2740e2c2e97..3df886fa07b 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -12,7 +12,7 @@ + title="MYMorise" minWidth="450" minHeight="600" onCloseRequest="#handleExit">