Skip to content

Commit 785ef8d

Browse files
committed
Merge branch 'master' of https://github.com/KhoonSun47/tp
* 'master' of https://github.com/KhoonSun47/tp: Fix ParserUtil.java Error Issue #42: Add Postal Code Add tests for parsing Block inputs Update ParserUtil to parse Block inputs Fix block validation input Fix checkstyle errors Add prefix for block field Add test cases for Block class Add new Block class Issue #42: Add Postal Code Issue #42: Add Postal Code for House
2 parents 2981bda + 13bf292 commit 785ef8d

26 files changed

+545
-53
lines changed

src/main/java/seedu/address/logic/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public static String format(Person person) {
4343
.append(person.getEmail())
4444
.append("; Address: ")
4545
.append(person.getAddress())
46+
.append("; Postal Code: ")
47+
.append(person.getPostalCode())
4648
.append("; Tags: ");
4749
person.getTags().forEach(builder::append);
4850
return builder.toString();

src/main/java/seedu/address/logic/commands/AddCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
66
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
77
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
8+
import static seedu.address.logic.parser.CliSyntax.PREFIX_POSTALCODE;
89
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
910

1011
import seedu.address.commons.util.ToStringBuilder;
@@ -26,12 +27,14 @@ public class AddCommand extends Command {
2627
+ PREFIX_PHONE + "PHONE "
2728
+ PREFIX_EMAIL + "EMAIL "
2829
+ PREFIX_ADDRESS + "ADDRESS "
30+
+ PREFIX_POSTALCODE + "POSTAL CODE "
2931
+ "[" + PREFIX_TAG + "TAG]...\n"
3032
+ "Example: " + COMMAND_WORD + " "
3133
+ PREFIX_NAME + "John Doe "
3234
+ PREFIX_PHONE + "98765432 "
3335
+ PREFIX_EMAIL + "johnd@example.com "
3436
+ PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 "
37+
+ PREFIX_POSTALCODE + "578578 "
3538
+ PREFIX_TAG + "friends "
3639
+ PREFIX_TAG + "owesMoney";
3740

src/main/java/seedu/address/logic/commands/EditCommand.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class EditCommand extends Command {
5656
private final EditPersonDescriptor editPersonDescriptor;
5757

5858
/**
59-
* @param index of the person in the filtered person list to edit
59+
* @param index of the person in the filtered person list to edit
6060
* @param editPersonDescriptor details to edit the person with
6161
*/
6262
public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) {
@@ -101,7 +101,8 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript
101101
Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress());
102102
Set<Tag> updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags());
103103

104-
return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags);
104+
return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress,
105+
personToEdit.getPostalCode(), updatedTags);
105106
}
106107

107108
@Override
@@ -139,7 +140,8 @@ public static class EditPersonDescriptor {
139140
private Address address;
140141
private Set<Tag> tags;
141142

142-
public EditPersonDescriptor() {}
143+
public EditPersonDescriptor() {
144+
}
143145

144146
/**
145147
* Copy constructor.

src/main/java/seedu/address/logic/parser/AddCommandParser.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
66
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
77
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
8+
import static seedu.address.logic.parser.CliSyntax.PREFIX_POSTALCODE;
89
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
910

1011
import java.util.Set;
1112
import java.util.stream.Stream;
1213

1314
import seedu.address.logic.commands.AddCommand;
1415
import seedu.address.logic.parser.exceptions.ParseException;
16+
import seedu.address.model.house.PostalCode;
1517
import seedu.address.model.person.Address;
1618
import seedu.address.model.person.Email;
1719
import seedu.address.model.person.Name;
@@ -31,21 +33,24 @@ public class AddCommandParser implements Parser<AddCommand> {
3133
*/
3234
public AddCommand parse(String args) throws ParseException {
3335
ArgumentMultimap argMultimap =
34-
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);
36+
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS,
37+
PREFIX_POSTALCODE, PREFIX_TAG);
3538

36-
if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL)
39+
if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_POSTALCODE)
3740
|| !argMultimap.getPreamble().isEmpty()) {
3841
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
3942
}
4043

41-
argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
44+
argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL,
45+
PREFIX_ADDRESS, PREFIX_POSTALCODE);
4246
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
4347
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get());
4448
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get());
4549
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
50+
PostalCode postalCode = ParserUtil.parsePostalCode(argMultimap.getValue(PREFIX_POSTALCODE).get());
4651
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
4752

48-
Person person = new Person(name, phone, email, address, tagList);
53+
Person person = new Person(name, phone, email, address, postalCode, tagList);
4954

5055
return new AddCommand(person);
5156
}

src/main/java/seedu/address/logic/parser/CliSyntax.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ public class CliSyntax {
1111
public static final Prefix PREFIX_EMAIL = new Prefix("e/");
1212
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
1313
public static final Prefix PREFIX_TAG = new Prefix("t/");
14-
14+
public static final Prefix PREFIX_BLOCK = new Prefix("blk/");
15+
public static final Prefix PREFIX_POSTALCODE = new Prefix("postal/");
1516
}

src/main/java/seedu/address/logic/parser/ParserUtil.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import seedu.address.commons.core.index.Index;
1010
import seedu.address.commons.util.StringUtil;
1111
import seedu.address.logic.parser.exceptions.ParseException;
12+
import seedu.address.model.house.Block;
13+
import seedu.address.model.house.PostalCode;
1214
import seedu.address.model.person.Address;
1315
import seedu.address.model.person.Email;
1416
import seedu.address.model.person.Name;
@@ -25,6 +27,7 @@ public class ParserUtil {
2527
/**
2628
* Parses {@code oneBasedIndex} into an {@code Index} and returns it. Leading and trailing whitespaces will be
2729
* trimmed.
30+
*
2831
* @throws ParseException if the specified index is invalid (not non-zero unsigned integer).
2932
*/
3033
public static Index parseIndex(String oneBasedIndex) throws ParseException {
@@ -121,4 +124,33 @@ public static Set<Tag> parseTags(Collection<String> tags) throws ParseException
121124
}
122125
return tagSet;
123126
}
127+
128+
/**
129+
* Parses a {@code String block} into an {@code Block}.
130+
* Leading and trailing whitespaces will be trimmed.
131+
*
132+
* @throws ParseException if the given {@code block} is invalid.
133+
*/
134+
public static Block parseBlock(String block) throws ParseException {
135+
requireNonNull(block);
136+
String trimmedBlock = block.trim();
137+
if (!Block.isValidBlock(trimmedBlock)) {
138+
throw new ParseException(Block.MESSAGE_CONSTRAINTS);
139+
}
140+
return new Block(trimmedBlock);
141+
}
142+
/**
143+
* Parses a {@code String postalCode} into a {@code postalCode}.
144+
* Leading and trailing whitespaces will be trimmed.
145+
*
146+
* @throws ParseException if the given {@code postalCode} is invalid.
147+
*/
148+
public static PostalCode parsePostalCode(String postalCode) throws ParseException {
149+
requireNonNull(postalCode);
150+
String trimmedPostalCode = postalCode.trim();
151+
if (!PostalCode.isValidPostalCode(trimmedPostalCode)) {
152+
throw new ParseException(PostalCode.MESSAGE_CONSTRAINTS);
153+
}
154+
return new PostalCode(trimmedPostalCode);
155+
}
124156
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package seedu.address.model.house;
2+
3+
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.commons.util.AppUtil.checkArgument;
5+
6+
/**
7+
* Represents a House's block number.
8+
* Guarantees: immutable; is valid as declared in {@link #isValidBlock(String)}
9+
*/
10+
public class Block {
11+
public static final String MESSAGE_CONSTRAINTS =
12+
"Block numbers should only contain numbers, with or without a letter as the end. "
13+
+ "There can only be at most 3 digits long.";
14+
public static final String VALIDATION_REGEX = "^\\d{1,3}[a-zA-Z]?$";
15+
public static final String ZERO_REGEX = "^0+$";
16+
public static final String ZERO_AND_ALPHABET_REGEX = "^0*[a-zA-Z]$";
17+
public final String value;
18+
19+
/**
20+
* Constructs a {@code Block}.
21+
*
22+
* @param block A valid block number.
23+
*/
24+
public Block(String block) {
25+
requireNonNull(block);
26+
checkArgument(isValidBlock(block), MESSAGE_CONSTRAINTS);
27+
value = block;
28+
}
29+
30+
/**
31+
* Returns true if a given string is a valid block number.
32+
*/
33+
public static boolean isValidBlock(String test) {
34+
return test.matches(VALIDATION_REGEX) && !test.matches(ZERO_REGEX) && !test.matches(ZERO_AND_ALPHABET_REGEX);
35+
}
36+
37+
@Override
38+
public String toString() {
39+
return value;
40+
}
41+
42+
@Override
43+
public boolean equals(Object other) {
44+
if (other == this) {
45+
return true;
46+
}
47+
48+
// instanceof handles nulls
49+
if (!(other instanceof Block)) {
50+
return false;
51+
}
52+
53+
Block otherBlock = (Block) other;
54+
return value.equals(otherBlock.value);
55+
}
56+
57+
@Override
58+
public int hashCode() {
59+
return value.hashCode();
60+
}
61+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package seedu.address.model.house;
2+
3+
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.commons.util.AppUtil.checkArgument;
5+
6+
/**
7+
* Represents a House's postal code in the address book.
8+
* Guarantees: immutable; is valid as declared in {@link #isValidPostalCode(String)}
9+
*/
10+
public class PostalCode {
11+
12+
public static final String MESSAGE_CONSTRAINTS =
13+
"The postal code should only contain numbers, and it should be only 6 digits long";
14+
public static final String VALIDATION_REGEX = "\\d{6}";
15+
public final String value;
16+
17+
/**
18+
* Constructs a {@code PostalCode}.
19+
*
20+
* @param postalCode A valid postal code.
21+
*/
22+
public PostalCode(String postalCode) {
23+
requireNonNull(postalCode);
24+
checkArgument(isValidPostalCode(postalCode), MESSAGE_CONSTRAINTS);
25+
value = postalCode;
26+
}
27+
28+
/**
29+
* Returns true if a given string is a valid postal code.
30+
*/
31+
public static boolean isValidPostalCode(String test) {
32+
return test.matches(VALIDATION_REGEX);
33+
}
34+
35+
@Override
36+
public String toString() {
37+
return value;
38+
}
39+
40+
@Override
41+
public boolean equals(Object other) {
42+
if (other == this) {
43+
return true;
44+
}
45+
46+
if (!(other instanceof PostalCode)) {
47+
return false;
48+
}
49+
50+
PostalCode otherPostalCode = (PostalCode) other;
51+
return value.equals(otherPostalCode.value);
52+
}
53+
54+
@Override
55+
public int hashCode() {
56+
return value.hashCode();
57+
}
58+
59+
}

src/main/java/seedu/address/model/person/Person.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Set;
99

1010
import seedu.address.commons.util.ToStringBuilder;
11+
import seedu.address.model.house.PostalCode;
1112
import seedu.address.model.tag.Tag;
1213

1314
/**
@@ -23,17 +24,19 @@ public class Person {
2324

2425
// Data fields
2526
private final Address address;
27+
private final PostalCode postalCode;
2628
private final Set<Tag> tags = new HashSet<>();
2729

2830
/**
2931
* Every field must be present and not null.
3032
*/
31-
public Person(Name name, Phone phone, Email email, Address address, Set<Tag> tags) {
33+
public Person(Name name, Phone phone, Email email, Address address, PostalCode postalCode, Set<Tag> tags) {
3234
requireAllNonNull(name, phone, email, address, tags);
3335
this.name = name;
3436
this.phone = phone;
3537
this.email = email;
3638
this.address = address;
39+
this.postalCode = postalCode;
3740
this.tags.addAll(tags);
3841
}
3942

@@ -53,6 +56,10 @@ public Address getAddress() {
5356
return address;
5457
}
5558

59+
public PostalCode getPostalCode() {
60+
return postalCode;
61+
}
62+
5663
/**
5764
* Returns an immutable tag set, which throws {@code UnsupportedOperationException}
5865
* if modification is attempted.
@@ -94,13 +101,14 @@ public boolean equals(Object other) {
94101
&& phone.equals(otherPerson.phone)
95102
&& email.equals(otherPerson.email)
96103
&& address.equals(otherPerson.address)
104+
&& postalCode.equals(otherPerson.postalCode)
97105
&& tags.equals(otherPerson.tags);
98106
}
99107

100108
@Override
101109
public int hashCode() {
102110
// use this method for custom fields hashing instead of implementing your own
103-
return Objects.hash(name, phone, email, address, tags);
111+
return Objects.hash(name, phone, email, address, postalCode, tags);
104112
}
105113

106114
@Override
@@ -110,6 +118,7 @@ public String toString() {
110118
.add("phone", phone)
111119
.add("email", email)
112120
.add("address", address)
121+
.add("postal code", postalCode)
113122
.add("tags", tags)
114123
.toString();
115124
}

src/main/java/seedu/address/model/util/SampleDataUtil.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import seedu.address.model.AddressBook;
88
import seedu.address.model.ReadOnlyAddressBook;
9+
import seedu.address.model.house.PostalCode;
910
import seedu.address.model.person.Address;
1011
import seedu.address.model.person.Email;
1112
import seedu.address.model.person.Name;
@@ -20,22 +21,22 @@ public class SampleDataUtil {
2021
public static Person[] getSamplePersons() {
2122
return new Person[] {
2223
new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"),
23-
new Address("Blk 30 Geylang Street 29, #06-40"),
24+
new Address("Blk 30 Geylang Street 29, #06-40"), new PostalCode("123456"),
2425
getTagSet("friends")),
2526
new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"),
26-
new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"),
27+
new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), new PostalCode("123567"),
2728
getTagSet("colleagues", "friends")),
2829
new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"),
29-
new Address("Blk 11 Ang Mo Kio Street 74, #11-04"),
30+
new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), new PostalCode("123890"),
3031
getTagSet("neighbours")),
3132
new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"),
32-
new Address("Blk 436 Serangoon Gardens Street 26, #16-43"),
33+
new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), new PostalCode("123123"),
3334
getTagSet("family")),
3435
new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"),
35-
new Address("Blk 47 Tampines Street 20, #17-35"),
36+
new Address("Blk 47 Tampines Street 20, #17-35"), new PostalCode("123010"),
3637
getTagSet("classmates")),
3738
new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"),
38-
new Address("Blk 45 Aljunied Street 85, #11-31"),
39+
new Address("Blk 45 Aljunied Street 85, #11-31"), new PostalCode("123787"),
3940
getTagSet("colleagues"))
4041
};
4142
}

0 commit comments

Comments
 (0)