From 3a0278cdb1a431cc5181892415da3f51a7c77d37 Mon Sep 17 00:00:00 2001 From: Lim Jun Hup Date: Sat, 26 Oct 2019 18:13:08 +0800 Subject: [PATCH 01/11] Testcases for undo/redo --- .../address/logic/commands/RedoCommand.java | 4 +-- .../address/logic/commands/UndoCommand.java | 4 +-- .../logic/commands/RedoCommandTest.java | 29 +++++++++++++++++++ .../logic/commands/UndoCommandTest.java | 29 +++++++++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/test/java/seedu/address/logic/commands/RedoCommandTest.java create mode 100644 src/test/java/seedu/address/logic/commands/UndoCommandTest.java diff --git a/src/main/java/seedu/address/logic/commands/RedoCommand.java b/src/main/java/seedu/address/logic/commands/RedoCommand.java index 9b4a8a80e2c..595329d32c7 100644 --- a/src/main/java/seedu/address/logic/commands/RedoCommand.java +++ b/src/main/java/seedu/address/logic/commands/RedoCommand.java @@ -9,8 +9,8 @@ */ public class RedoCommand extends Command { public static final String COMMAND_WORD = "redo"; - private static final String MESSAGE_SUCCESS = "Redo Command Success"; - private static final String MESSAGE_FAILURE = "Redo Command Failure: You have not " + public static final String MESSAGE_SUCCESS = "Redo Command Success"; + public static final String MESSAGE_FAILURE = "Redo Command Failure: You have not " + "undone any commands. As such, you are unable to redo any commands."; @Override public CommandResult execute(Model model) throws CommandException { diff --git a/src/main/java/seedu/address/logic/commands/UndoCommand.java b/src/main/java/seedu/address/logic/commands/UndoCommand.java index 32df534b962..6b9a9349276 100644 --- a/src/main/java/seedu/address/logic/commands/UndoCommand.java +++ b/src/main/java/seedu/address/logic/commands/UndoCommand.java @@ -9,8 +9,8 @@ */ public class UndoCommand extends Command { public static final String COMMAND_WORD = "undo"; - private static final String MESSAGE_SUCCESS = "Undo Command Success"; - private static final String MESSAGE_FAILURE = "Undo Command Failure:" + public static final String MESSAGE_SUCCESS = "Undo Command Success"; + public static final String MESSAGE_FAILURE = "Undo Command Failure:" + " No available commands to be undone. " + " Commands that can be undone is as follows: add, delete, edit, clear and training."; @Override diff --git a/src/test/java/seedu/address/logic/commands/RedoCommandTest.java b/src/test/java/seedu/address/logic/commands/RedoCommandTest.java new file mode 100644 index 00000000000..03a851dd676 --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/RedoCommandTest.java @@ -0,0 +1,29 @@ +package seedu.address.logic.commands; + +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import seedu.address.model.Attendance; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; + +/** + * Contains integration tests (interaction with the Model) and unit tests for RedoCommand. + */ +public class RedoCommandTest { + private Model model; + private Model expectedModel; + @BeforeEach + public void setUp() { + model = new ModelManager(getTypicalAddressBook(), new Attendance(), new UserPrefs()); + expectedModel = new ModelManager(model.getAddressBook(), model.getAttendance(), new UserPrefs()); + } + @Test + public void execute_undoneCommandsStackIsEmpty_showsFailureMessage() { + assertCommandSuccess(new UndoCommand(), model, RedoCommand.MESSAGE_FAILURE, expectedModel); + } +} diff --git a/src/test/java/seedu/address/logic/commands/UndoCommandTest.java b/src/test/java/seedu/address/logic/commands/UndoCommandTest.java new file mode 100644 index 00000000000..ca819ee7545 --- /dev/null +++ b/src/test/java/seedu/address/logic/commands/UndoCommandTest.java @@ -0,0 +1,29 @@ +package seedu.address.logic.commands; + +import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import seedu.address.model.Attendance; +import seedu.address.model.Model; +import seedu.address.model.ModelManager; +import seedu.address.model.UserPrefs; + +/** + * Contains integration tests (interaction with the Model) and unit tests for UndoCommand. + */ +public class UndoCommandTest { + private Model model; + private Model expectedModel; + @BeforeEach + public void setUp() { + model = new ModelManager(getTypicalAddressBook(), new Attendance(), new UserPrefs()); + expectedModel = new ModelManager(model.getAddressBook(), model.getAttendance(), new UserPrefs()); + } + @Test + public void execute_commandsStackIsEmpty_showsFailureMessage() { + assertCommandSuccess(new UndoCommand(), model, UndoCommand.MESSAGE_FAILURE, expectedModel); + } +} From 322d3f1e500aee439be1c50d95089e295c0ec3fd Mon Sep 17 00:00:00 2001 From: Lim Jun Hup Date: Sat, 26 Oct 2019 18:22:20 +0800 Subject: [PATCH 02/11] testcases --- .../java/seedu/address/logic/commands/RedoCommandTest.java | 4 ++-- .../java/seedu/address/logic/commands/UndoCommandTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/RedoCommandTest.java b/src/test/java/seedu/address/logic/commands/RedoCommandTest.java index 03a851dd676..28aa8fe9908 100644 --- a/src/test/java/seedu/address/logic/commands/RedoCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/RedoCommandTest.java @@ -1,6 +1,6 @@ package seedu.address.logic.commands; -import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.jupiter.api.BeforeEach; @@ -24,6 +24,6 @@ public void setUp() { } @Test public void execute_undoneCommandsStackIsEmpty_showsFailureMessage() { - assertCommandSuccess(new UndoCommand(), model, RedoCommand.MESSAGE_FAILURE, expectedModel); + assertCommandFailure(new UndoCommand(), model, RedoCommand.MESSAGE_FAILURE); } } diff --git a/src/test/java/seedu/address/logic/commands/UndoCommandTest.java b/src/test/java/seedu/address/logic/commands/UndoCommandTest.java index ca819ee7545..c195e42e1ec 100644 --- a/src/test/java/seedu/address/logic/commands/UndoCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/UndoCommandTest.java @@ -1,6 +1,6 @@ package seedu.address.logic.commands; -import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess; +import static seedu.address.logic.commands.CommandTestUtil.assertCommandFailure; import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook; import org.junit.jupiter.api.BeforeEach; @@ -24,6 +24,6 @@ public void setUp() { } @Test public void execute_commandsStackIsEmpty_showsFailureMessage() { - assertCommandSuccess(new UndoCommand(), model, UndoCommand.MESSAGE_FAILURE, expectedModel); + assertCommandFailure(new UndoCommand(), model, UndoCommand.MESSAGE_FAILURE); } } From e6a83039743dab8e9d6d73833e554c1f2a15c894 Mon Sep 17 00:00:00 2001 From: Lim Jun Hup Date: Tue, 29 Oct 2019 01:57:21 +0800 Subject: [PATCH 03/11] docs --- src/main/java/seedu/address/logic/commands/Command.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/Command.java b/src/main/java/seedu/address/logic/commands/Command.java index fedd76e618e..6212f712661 100644 --- a/src/main/java/seedu/address/logic/commands/Command.java +++ b/src/main/java/seedu/address/logic/commands/Command.java @@ -16,6 +16,10 @@ public abstract class Command { * @throws CommandException If an error occurs during command execution. */ public abstract CommandResult execute(Model model) throws CommandException; - + + /** + * An undoable command is a command that can be undone + * @return a boolean value of whether the command is undoable + */ public abstract boolean isUndoable(); } From 52b025cb64a906a2b8b6bf03975d3c209d20cb99 Mon Sep 17 00:00:00 2001 From: Lim Jun Hup Date: Tue, 29 Oct 2019 10:41:29 +0800 Subject: [PATCH 04/11] add gender attribute to athletes --- .../address/logic/commands/AddCommand.java | 2 + .../seedu/address/logic/commands/Command.java | 1 - .../address/logic/commands/EditCommand.java | 19 +++++++- .../logic/parser/AddCommandParser.java | 11 +++-- .../seedu/address/logic/parser/CliSyntax.java | 1 + .../logic/parser/EditCommandParser.java | 8 +++- .../address/logic/parser/ParserUtil.java | 15 ++++++ .../seedu/address/model/person/Gender.java | 46 +++++++++++++++++++ .../seedu/address/model/person/Person.java | 12 ++++- .../address/model/util/SampleDataUtil.java | 14 +++--- .../address/storage/JsonAdaptedPerson.java | 16 ++++++- .../seedu/address/ui/InformationDisplay.java | 3 ++ .../java/seedu/address/ui/PersonCard.java | 3 ++ src/main/resources/view/PersonListCard.fxml | 1 + .../logic/commands/RedoCommandTest.java | 29 ------------ .../logic/commands/UndoCommandTest.java | 29 ------------ .../seedu/address/testutil/PersonBuilder.java | 2 +- 17 files changed, 134 insertions(+), 78 deletions(-) create mode 100644 src/main/java/seedu/address/model/person/Gender.java delete mode 100644 src/test/java/seedu/address/logic/commands/RedoCommandTest.java delete mode 100644 src/test/java/seedu/address/logic/commands/UndoCommandTest.java diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index a04912db2bf..08c277ebfc8 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -3,6 +3,7 @@ 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_GENDER; import static seedu.address.logic.parser.CliSyntax.PREFIX_IMAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -25,6 +26,7 @@ public class AddCommand extends Command { + PREFIX_NAME + "NAME " + PREFIX_PHONE + "PHONE " + PREFIX_EMAIL + "EMAIL " + + PREFIX_GENDER + "GENDER" + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_TAG + "TAG]..." + "[" + PREFIX_IMAGE + "IMAGE]\n" diff --git a/src/main/java/seedu/address/logic/commands/Command.java b/src/main/java/seedu/address/logic/commands/Command.java index 6212f712661..c16aa43335c 100644 --- a/src/main/java/seedu/address/logic/commands/Command.java +++ b/src/main/java/seedu/address/logic/commands/Command.java @@ -16,7 +16,6 @@ public abstract class Command { * @throws CommandException If an error occurs during command execution. */ public abstract CommandResult execute(Model model) throws CommandException; - /** * An undoable command is a command that can be undone * @return a boolean value of whether the command is undoable diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index b7ae8224dc9..fdf798d4ace 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -3,10 +3,12 @@ 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_GENDER; import static seedu.address.logic.parser.CliSyntax.PREFIX_IMAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; + import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; import java.util.Collections; @@ -22,6 +24,7 @@ import seedu.address.model.Model; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.Gender; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -42,6 +45,7 @@ public class EditCommand extends Command { + "[" + PREFIX_NAME + "NAME] " + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + + "[" + PREFIX_GENDER + "GENDER] " + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_TAG + "TAG]... " + "[" + PREFIX_IMAGE + "IMAGE]\n" @@ -101,11 +105,13 @@ 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()); + Gender updatedGender = editPersonDescriptor.getGender().orElse(personToEdit.getGender()); Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); Photo updatedPhoto = editPersonDescriptor.getPhoto().orElse(personToEdit.getPhoto()); - return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags, updatedPhoto); + return new Person(updatedName, updatedPhone, updatedEmail, updatedGender, updatedAddress, updatedTags, + updatedPhoto); } @Override @@ -134,6 +140,7 @@ public static class EditPersonDescriptor { private Name name; private Phone phone; private Email email; + private Gender gender; private Address address; private Set tags; private Photo photo; @@ -148,6 +155,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setName(toCopy.name); setPhone(toCopy.phone); setEmail(toCopy.email); + setGender(toCopy.gender); setAddress(toCopy.address); setTags(toCopy.tags); setPhoto(toCopy.photo); @@ -157,7 +165,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, photo); + return CollectionUtil.isAnyNonNull(name, phone, email, gender, address, tags, photo); } public void setName(Name name) { @@ -183,6 +191,12 @@ public void setEmail(Email email) { public Optional getEmail() { return Optional.ofNullable(email); } + public void setGender(Gender gender) { + this.gender = gender; + } + public Optional getGender() { + return Optional.ofNullable(gender); + } public void setAddress(Address address) { this.address = address; @@ -235,6 +249,7 @@ public boolean equals(Object other) { return getName().equals(e.getName()) && getPhone().equals(e.getPhone()) && getEmail().equals(e.getEmail()) + && getGender().equals(e.getGender()) && 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 698b272ef00..eef66a424b1 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -3,6 +3,7 @@ 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_GENDER; import static seedu.address.logic.parser.CliSyntax.PREFIX_IMAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -15,6 +16,7 @@ import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.Gender; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -33,10 +35,10 @@ 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, - PREFIX_IMAGE); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_GENDER, PREFIX_ADDRESS, + PREFIX_TAG, PREFIX_IMAGE); - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) + if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_GENDER) || !argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } @@ -44,6 +46,7 @@ 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()); + Gender gender = ParserUtil.parseGender(argMultimap.getValue(PREFIX_GENDER).get()); Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()); Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); Photo photo; @@ -53,7 +56,7 @@ public AddCommand parse(String args) throws ParseException { photo = ParserUtil.parsePhoto(argMultimap.getValue(PREFIX_IMAGE).get()); } - Person person = new Person(name, phone, email, address, tagList, photo); + Person person = new Person(name, phone, email, gender, address, tagList, photo); 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 c4a6e7373bc..13cef89cfab 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_GENDER = new Prefix("g/"); public static final Prefix PREFIX_ADDRESS = new Prefix("a/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); public static final Prefix PREFIX_IMAGE = new Prefix("i/"); diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index a8a756f52dc..48d616c9a95 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -4,6 +4,7 @@ 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_GENDER; import static seedu.address.logic.parser.CliSyntax.PREFIX_IMAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; @@ -33,8 +34,8 @@ public class EditCommandParser implements Parser { public EditCommand parse(String args) throws ParseException { requireNonNull(args); ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG, - PREFIX_IMAGE); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_GENDER, PREFIX_ADDRESS, + PREFIX_TAG, PREFIX_IMAGE); Index index; @@ -54,6 +55,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_GENDER).isPresent()) { + editPersonDescriptor.setGender(ParserUtil.parseGender(argMultimap.getValue(PREFIX_GENDER).get())); + } if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); } diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index 0214590f993..a61be64e8d4 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -15,6 +15,7 @@ import seedu.address.model.feature.Feature; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.Gender; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; import seedu.address.model.person.Photo; @@ -155,6 +156,20 @@ public static Email parseEmail(String email) throws ParseException { } return new Email(trimmedEmail); } + /** + * Parses a {@code String gender} into an {@code Gender}. + * Leading and trailing whitespaces will be trimmed. + * + * @throws ParseException if the given {@code gender} is invalid. + */ + public static Gender parseGender(String gender) throws ParseException { + requireNonNull(gender); + String trimmedGender = gender.trim(); + if (!Gender.isValidGender(trimmedGender)) { + throw new ParseException(Gender.MESSAGE_CONSTRAINTS); + } + return new Gender(trimmedGender); + } /** * Parses a {@code String tag} into a {@code Tag}. diff --git a/src/main/java/seedu/address/model/person/Gender.java b/src/main/java/seedu/address/model/person/Gender.java new file mode 100644 index 00000000000..a6355d58d8c --- /dev/null +++ b/src/main/java/seedu/address/model/person/Gender.java @@ -0,0 +1,46 @@ +package seedu.address.model.person; + +import static java.util.Objects.requireNonNull; +import static seedu.address.commons.util.AppUtil.checkArgument; + +/** + * Represents a Person's gender in the address book. + * Guarantees: immutable; is valid as declared in {@link #isValidGender(String)} + */ + +public class Gender { + public static final String MESSAGE_CONSTRAINTS = "Gender can only be Male, Female or Others, and it should not be" + + "blank"; + public final String genderOfPerson; + /** + * Constructs an {@code Gender}. + * + * @param gender A valid gender. + */ + public Gender(String gender) { + requireNonNull(gender); + checkArgument(isValidGender(gender), MESSAGE_CONSTRAINTS); + genderOfPerson = gender; + } + /** + * Returns if a given string is a valid email. + */ + public static boolean isValidGender(String test) { + return (test.toLowerCase().equals("male") || test.toLowerCase().equals("female") || test.toLowerCase().equals( + "others")); + } + @Override + public String toString() { + return genderOfPerson; + } + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof Gender // instanceof handles nulls + && genderOfPerson.equals(((Gender) other).genderOfPerson)); // state check + } + @Override + public int hashCode() { + return genderOfPerson.hashCode(); + } +} diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index 9a6d7ec31ad..a418c73a566 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -19,6 +19,7 @@ public class Person { private final Name name; private final Phone phone; private final Email email; + private final Gender gender; // Data fields private final Address address; @@ -28,7 +29,8 @@ public class Person { /** * Every field must be present and not null. */ - public Person(Name name, Phone phone, Email email, Address address, Set tags, Photo photo) { + public Person(Name name, Phone phone, Email email, Gender gender, Address address, Set tags, Photo photo) { + this.gender = gender; requireAllNonNull(name, phone, email, address, tags); this.name = name; this.phone = phone; @@ -49,6 +51,9 @@ public Phone getPhone() { public Email getEmail() { return email; } + public Gender getGender() { + return gender; + } public Address getAddress() { return address; @@ -102,6 +107,7 @@ public boolean equals(Object other) { return otherPerson.getName().equals(getName()) && otherPerson.getPhone().equals(getPhone()) && otherPerson.getEmail().equals(getEmail()) + && otherPerson.getGender().equals(getGender()) && otherPerson.getAddress().equals(getAddress()) && otherPerson.getTags().equals(getTags()); } @@ -109,7 +115,7 @@ public boolean equals(Object other) { @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, gender, address, tags); } @Override @@ -120,6 +126,8 @@ public String toString() { .append(getPhone()) .append(" Email: ") .append(getEmail()) + .append(" Gender: ") + .append(getGender()) .append(" Address: ") .append(getAddress()) .append(" Tags: "); diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 36873aeb97f..deaa18fcae7 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -11,6 +11,7 @@ import seedu.address.model.performance.Event; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.Gender; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -40,23 +41,24 @@ public static ReadOnlyPerformance getSamplePerformance() { public static Person[] getSamplePersons() { return new Person[] { - new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), + new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), new Gender( + "Male"), new Address("Blk 30 Geylang Street 29, #06-40"), getTagSet("friends"), new Photo("default.png")), new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"), - new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), + new Gender("Female"), new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), getTagSet("colleagues", "friends"), new Photo("default.png")), 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"), + new Gender("Female"), new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), getTagSet("neighbours"), new Photo("default.png")), new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"), - new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), + new Gender("Male"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), getTagSet("family"), new Photo("default.png")), new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), - new Address("Blk 47 Tampines Street 20, #17-35"), + new Gender("Male"), new Address("Blk 47 Tampines Street 20, #17-35"), getTagSet("classmates"), new Photo("default.png")), new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"), - new Address("Blk 45 Aljunied Street 85, #11-31"), + new Gender("Others"), new Address("Blk 45 Aljunied Street 85, #11-31"), getTagSet("colleagues"), new Photo("default.png")) }; } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index 9b46f1d54ca..27ee5f2262e 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -12,6 +12,7 @@ import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.Gender; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -28,6 +29,7 @@ class JsonAdaptedPerson { private final String name; private final String phone; private final String email; + private final String gender; private final String address; private final List tagged = new ArrayList<>(); private final String photo; @@ -37,11 +39,13 @@ 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("gender") String gender, + @JsonProperty("address") String address, @JsonProperty("tagged") List tagged, @JsonProperty("photo") String photo) { this.name = name; this.phone = phone; this.email = email; + this.gender = gender; this.address = address; if (tagged != null) { this.tagged.addAll(tagged); @@ -56,6 +60,7 @@ public JsonAdaptedPerson(Person source) { name = source.getName().fullName; phone = source.getPhone().value; email = source.getEmail().value; + gender = source.getGender().genderOfPerson; address = source.getAddress().value; tagged.addAll(source.getTags().stream() .map(JsonAdaptedTag::new) @@ -97,6 +102,13 @@ public Person toModelType() throws IllegalValueException { throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS); } final Email modelEmail = new Email(email); + if (gender == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Gender.class.getSimpleName())); + } + if (!Gender.isValidGender(gender)) { + throw new IllegalValueException(Gender.MESSAGE_CONSTRAINTS); + } + final Gender modelGender = new Gender(gender); if (address == null) { throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName())); @@ -115,7 +127,7 @@ public Person toModelType() throws IllegalValueException { final Photo modelPhoto = new Photo(photo); final Set modelTags = new HashSet<>(personTags); - return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags, modelPhoto); + return new Person(modelName, modelPhone, modelEmail, modelGender, modelAddress, modelTags, modelPhoto); } } diff --git a/src/main/java/seedu/address/ui/InformationDisplay.java b/src/main/java/seedu/address/ui/InformationDisplay.java index 5ab1c504da3..b783f207960 100644 --- a/src/main/java/seedu/address/ui/InformationDisplay.java +++ b/src/main/java/seedu/address/ui/InformationDisplay.java @@ -36,6 +36,8 @@ public class InformationDisplay extends UiPart { @FXML private Label email; @FXML + private Label gender; + @FXML private Label attendanceRate; @FXML private Label performance; @@ -56,6 +58,7 @@ public InformationDisplay(Person selectedPerson, String attendance) { address.setText(this.person.getAddress().value); address.setPrefWidth(150); address.setWrapText(true); + gender.setText(this.person.getGender().genderOfPerson); email.setText(this.person.getEmail().value); photo.setImage(this.person.getPhoto().photo); photo.setPreserveRatio(true); diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 716992ea949..2b107dedaa3 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -39,6 +39,8 @@ public class PersonCard extends UiPart { @FXML private Label email; @FXML + private Label gender; + @FXML private FlowPane tags; public PersonCard(Person person, int displayedIndex) { @@ -49,6 +51,7 @@ public PersonCard(Person person, int displayedIndex) { phone.setText(person.getPhone().value); address.setText(person.getAddress().value); email.setText(person.getEmail().value); + gender.setText(person.getGender().genderOfPerson); person.getTags().stream() .sorted(Comparator.comparing(tag -> tag.tagName)) .forEach(tag -> tags.getChildren().add((new TagLayout(tag.tagName)).getRoot())); diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml index 2251e26c6a7..15bbcf2c674 100644 --- a/src/main/resources/view/PersonListCard.fxml +++ b/src/main/resources/view/PersonListCard.fxml @@ -28,6 +28,7 @@